home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks96 / troz.cgi.sit / troz.cgi / otherprocs.c < prev    next >
Text File  |  1996-06-22  |  6KB  |  256 lines

  1. //other procs
  2. #include "MemoryUtil.h"
  3.  
  4. #include "otherprocs.h"
  5.  
  6.  
  7. OSErr
  8. SaveJPEGFromQuickCam ( FSSpec theFileSpec, short digitizerDepth )
  9. {
  10.     OSErr                    theErr;
  11.     PicHandle                thePict;
  12.     ComponentDescription    theQuickCamDesc;
  13.     Component                theQuickCam;
  14.     ComponentInstance        theQuickCamInstance;
  15.     Rect                    maxSrcRect;
  16.     CGrafPtr                theWorld;
  17.     CTabHandle                cTable;
  18.     PixMapHandle            thePMH;
  19.     short                    videoInputSource;
  20.     GWorldPtr                origGWorld;
  21.     GDHandle                origGDevice;
  22.     long                    imageDataSize;
  23.     SInt16                    theRefNum;
  24.     
  25.     long                    maxCompressedSize;
  26.     ImageDescriptionHandle    compressedImageDesc;
  27.     Ptr                        compressedImageData;
  28.  
  29.     thePict = (PicHandle)NewHandle( 0 );
  30.     if ( !thePict || MemError( ) )
  31.         return nil;
  32.  
  33.     //look for a color QuickCam
  34.     theQuickCamDesc.componentType                =    sgVideoDigitizerType;
  35.     theQuickCamDesc.componentSubType            =    'CQCm';
  36.     theQuickCamDesc.componentManufacturer        =    'Ctx7';
  37.     theQuickCamDesc.componentFlags                =    0;
  38.     theQuickCamDesc.componentFlagsMask            =    0;
  39.  
  40.     theQuickCam    =    FindNextComponent( 0, &theQuickCamDesc );
  41.     if ( !theQuickCam )    //look for the B&W
  42.     {
  43.         theQuickCamDesc.componentType                =    sgVideoDigitizerType;
  44.         theQuickCamDesc.componentSubType            =    'CtxV';
  45.         theQuickCamDesc.componentManufacturer        =    'Ctx6';
  46.         theQuickCamDesc.componentFlags                =    0;
  47.         theQuickCamDesc.componentFlagsMask            =    0;
  48.     }
  49.     if ( !theQuickCam )
  50.         return nil;
  51.  
  52.     theQuickCamInstance = OpenComponent( theQuickCam );
  53.     if ( !theQuickCamInstance )
  54.         return nil;
  55.  
  56.     theErr = VDGetInput( theQuickCamInstance, &videoInputSource );
  57.     if ( theErr )
  58.         return nil;
  59.  
  60.     theErr = VDGetMaxSrcRect( theQuickCamInstance, videoInputSource, &maxSrcRect );
  61.     if ( theErr )
  62.         return nil;
  63.  
  64.     theErr = VDSetDigitizerRect( theQuickCamInstance, &maxSrcRect );
  65.     if ( theErr )
  66.         return nil;
  67.  
  68.     cTable = digitizerDepth != 32 && digitizerDepth != 16 ? GetCTable( digitizerDepth ) : nil;
  69.     theErr = NewGWorld( &theWorld, digitizerDepth, &maxSrcRect, cTable, nil, keepLocal );
  70.     if ( cTable )
  71.         DisposeCTable( cTable );
  72.     if ( theErr )
  73.         return nil;
  74.  
  75.     thePMH = GetGWorldPixMap( theWorld );
  76.     LockPixels( thePMH );
  77.  
  78.     theErr = VDSetPlayThruDestination( theQuickCamInstance, thePMH, &maxSrcRect, nil, nil );
  79.     if ( theErr )
  80.         return nil;
  81.  
  82.     theErr = VDGrabOneFrame( theQuickCamInstance );
  83.     if ( theErr )
  84.         return nil;
  85.  
  86.     GetGWorld( &origGWorld, &origGDevice );
  87.     SetGWorld( theWorld, nil);        //get the pictures to save at the proper coordinates
  88.  
  89. //    thePict = OpenPicture( &maxSrcRect );
  90. //    HLock( (Handle)thePMH );
  91. //    CopyBits( (BitMapPtr)*thePMH, (BitMapPtr)*thePMH, &maxSrcRect, &maxSrcRect, srcCopy, nil );
  92. //    HUnlock( (Handle)thePMH );
  93. //    ClosePicture( );
  94.     
  95.     //•••••••••••••••••••••••••••••••••••••
  96.     
  97.     theErr = GetMaxCompressionSize ( thePMH, &maxSrcRect, 32, codecMinQuality, 'jpeg', anyCodec, &maxCompressedSize );
  98.     if ( theErr == noErr )
  99.     {
  100.         compressedImageData = MemoryNewPtr ( maxCompressedSize, &theErr );
  101.         if ( compressedImageData != NULL )
  102.         {
  103.             compressedImageDesc    = (ImageDescriptionHandle) MemoryNewHandle ( sizeof(ImageDescription), &theErr );
  104.             if ( compressedImageDesc != NULL )
  105.             {
  106.                 theErr = CompressImage ( thePMH, &maxSrcRect, codecMinQuality, 'jpeg', compressedImageDesc, compressedImageData );
  107.                 
  108.                 if ( theErr == noErr )
  109.                 {
  110.                     theErr = FSpDelete ( &theFileSpec );
  111.                     theErr = FSpCreate ( &theFileSpec, 'JVWR', 'JPEG', smSystemScript );
  112.                 }
  113.                 
  114.                 if ( theErr == noErr )
  115.                 {
  116.                     theErr = FSpOpenDF ( &theFileSpec, fsWrPerm, &theRefNum );
  117.                     if ( theErr == noErr )
  118.                     {
  119.                         imageDataSize = (*compressedImageDesc)->dataSize;
  120.                         theErr = FSWrite ( theRefNum, &imageDataSize, compressedImageData );
  121.                         
  122.                         FSClose ( theRefNum );
  123.                     }
  124.                 }
  125.             }
  126.         }
  127.     }
  128.     
  129.     //clean up
  130.     DisposeHandle    ( (Handle)compressedImageDesc );
  131.     DisposePtr        ( compressedImageData );
  132.     
  133.     
  134.     //•••••••••••
  135.     if ( theWorld )
  136.         DisposeGWorld( theWorld );
  137.  
  138.     SetGWorld( origGWorld, origGDevice );
  139.  
  140.     return theErr;
  141. }
  142.  
  143.  
  144.  
  145.  
  146. #if 0
  147.  
  148. /*  this is modded from whatson */
  149.  
  150. void
  151. SavePictAsJPEG ( PicHandle thePict )
  152. {
  153.     LayerPtr     rootLayer;
  154.     WindowPtr     frontmostWindow;
  155.     Rect        frontmostRect;
  156.     short        theRefNum;
  157.     short        vRefNum;
  158.     Str255        fileName;
  159.     long        startTime;
  160.     OSErr         err;
  161.     Ptr                        compressedResultPtr;
  162.     PixMapHandle            frontmostPixMap;
  163.     ImageDescriptionHandle    imageDescriptionHandle;
  164.     
  165.     startTime = TickCount();
  166.     
  167.     /* 4000000 is a totally arbitrary 'very big' value */
  168.     compressedResultPtr = NewPtr ( 4000000 );
  169.     err = MemError ();
  170.     if ( err != noErr )
  171.     {
  172.         *width = nil;
  173.         *height = nil;
  174.         return;
  175.     }
  176.     
  177.     imageDescriptionHandle    = (ImageDescriptionHandle) NewHandle ( sizeof(ImageDescription) );
  178.     err = MemError ();
  179.     if ( err != noErr )
  180.     {
  181.         *width    = nil;
  182.         *height    = nil;
  183.         return;
  184.     }
  185.     
  186.     err = CompressImage ( frontmostPixMap, &frontmostRect, codecNormalQuality, 'jpeg', imageDescriptionHandle, compressedResultPtr );
  187.     if ( err != noErr )
  188.     {
  189.         *width    = nil;
  190.         *height    = nil;
  191.         return;
  192.     }
  193.  
  194. //    SetPort(thePort);
  195.  
  196.     /* "they're running out of ideas, for sure"
  197.         -- Grant Neufeld, on Hollywood, for opening logo sequences */
  198.  
  199. //Create a file and stuff it full of the jpeg data
  200.  
  201.     GetVol    ( fileName, &vRefNum );
  202.     strcpy    ( (char*)fileName, (char*)"\pfrontwindow.jpg" );
  203.     
  204.     err = FSDelete ( fileName, vRefNum );
  205.     if ( err != noErr )
  206.     {
  207.         *width    = nil;
  208.         *height    = nil;
  209.         return;
  210.     }
  211.     
  212.     err = Create ( fileName, vRefNum, 'JVWR', 'JPEG' );
  213.     if ( err != noErr )
  214.     {
  215.         *width    = nil;
  216.         *height    = nil;
  217.         return;
  218.     }
  219.     
  220.     err = FSOpen ( fileName, vRefNum, &theRefNum );
  221.     if ( err != noErr )
  222.     {
  223.         *width    = nil;
  224.         *height    = nil;
  225.         return;
  226.     }
  227.     
  228.     {
  229.         long    count;
  230.         
  231.         count    = (*imageDescriptionHandle)->dataSize;
  232.         err        = FSWrite ( theRefNum, &count, compressedResultPtr );
  233.         if ( err != noErr )
  234.         {
  235.             *width    = nil;
  236.             *height    = nil;
  237.             return;
  238.         }
  239.     }
  240.     err = FSClose ( theRefNum );
  241.     if ( err != noErr )
  242.     {
  243.         *width    = nil;
  244.         *height    = nil;
  245.         return;
  246.     }
  247.     
  248. //clean up
  249.     DisposeHandle    ( (Handle)imageDescriptionHandle );
  250.     DisposePtr        ( compressedResultPtr );
  251. }
  252.  
  253. #endif /* 0 */
  254.  
  255.  
  256.