QTReadWriteJPEG.h

//////////
//
//  File:       QTReadWriteJPEG.h
//
//  Contains:   Sample code for compressing and decompressing JPEG images.
//
//  Written by: Michael Marinkovich and Guillermo Ortiz
//  Revised by: Tim Monroe
//              Based heavily on the existing "JPEG Sample" code.
//
//  Copyright:  © 1996-1998 by Apple Computer, Inc., all rights reserved.
//
//  Change History (most recent first):
//
//     <1>      04/27/98    rtm     first file
//     
//////////
 
//////////
//
// header files
//
//////////
 
#include <FixMath.h>
#include <ImageCompression.h>
#include <Movies.h>
#include <QuickTimeComponents.h>
#include <StandardFile.h>
 
 
//////////
//
// constants
//
//////////
 
#define kImageFileCreator       FOUR_CHAR_CODE('ogle')
#define kBufferSize             codecMinimumDataSize        // data unload buffer size
 
#define kSaveImagePrompt        "Save compressed image as:"
#define kSaveImageFileName      "Untitled.jpg"
#define kWindowTitle            "Photo - JPEG"
 
// JFIF (JPEG) markers
enum {
    kSOFMarker                  = 0xC0,                     // start Of Frame N
    kSOFMarker2                 = 0xC2,
    kDHTMarker                  = 0xC4,                     // DHT Marker
    kDACMarker                  = 0xCC,                     // DAC
 
    kRSTOMarker                 = 0xD0,                     // RSTO marker
    kSOIMarker                  = 0xD8,                     // image start marker
    kEOIMarker                  = 0xD9,                     // image end marker
    kSOSMarker                  = 0xDA,                     // SOS marker
    kDQTMarker                  = 0xDB,                     // DQT marker
 
    kAPPOMarker                 = 0xE0,                     // APPO marker
    kCommentMarker              = 0xFE,                     // comment marker
 
    kStartMarker                = 0xFF                      // marker loacted after this byte
};
 
 
//////////
//
// data types
//
//////////
 
// a record to hold info about the JPEG data while we're loading it from disk
struct DLDataRec
{   
    long                        fRefNum;                    // ref number of current file
    long                        fFileLength;            
    Ptr                         fOrigPtr;                   // address of start of buffer
    Ptr                         fEndPtr;                    // address of end of buffer
};
typedef struct DLDataRec DLDataRec;
typedef DLDataRec *DLDataPtr, **DLDataHnd;
 
 
//////////
//
// function prototypes
//
//////////
 
void                            QTJPEG_PromptUserForJPEGFileAndDisplay (void);
OSErr                           QTJPEG_ReadJPEG (FSSpec theFSSpec, CGrafPtr *theGWorld);
OSErr                           QTJPEG_ConvertJPEG (Handle image, CGrafPtr *newWorld);
OSErr                           QTJPEG_ReadJPEGHeader (short theRefNum, ImageDescriptionHandle theDesc, Rect *theRect);
UInt8                           QTJPEG_FindNextMarker (long theRefNum);
OSErr                           QTJPEG_HandleAPPOMarker (UInt8 theMarker, long theRefNum, ImageDescriptionHandle theDesc, Boolean *readingExtension);
OSErr                           QTJPEG_HandleSOFMarker (long theRefNum, ImageDescriptionHandle theDesc, Boolean readingExtension);
void                            QTJPEG_HandleSOSMarker (long theRefNum);
UInt8                           QTJPEG_ReadByte (short theRefNum);
UInt16                          QTJPEG_ReadWord (short theRefNum);
void                            QTJPEG_SkipLength (long theRefNum);
OSErr                           QTJPEG_NewJPEGWorld (GWorldPtr *theWorld, short theDepth, Rect theRect);
OSErr                           QTJPEG_SaveJPEG (GWorldPtr theWorld);
PASCAL_RTN OSErr                QTJPEG_DataUnloadProc (Ptr theData, long theBytesNeeded, long theRefCon);
PASCAL_RTN OSErr                QTJPEG_DataLoadingProc (Ptr *theData, long theBytesNeeded, long theRefCon);