/*
 	File:		PictUtils.h
 
 	Contains:	Picture Utilities Interfaces.
 
 	Version:	Technology:	Mac OS 8.5
 				Release:	QuickTime 4.1
 
 	Copyright:	(c) 1990-1999 by Apple Computer, Inc., all rights reserved
 
 	Bugs?:		For bug reports, consult the following page on
 				the World Wide Web:
 
 					http://developer.apple.com/bugreporter/
 
*/
#ifndef __PICTUTILS__
#define __PICTUTILS__

#ifndef __MACTYPES__
	#include <MacTypes.h>
#endif

#ifndef __PALETTES__
	#include <Palettes.h>
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
	#pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
	#pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
	#pragma pack(2)
#endif

/* verbs for the GetPictInfo, GetPixMapInfo, and NewPictInfo calls */
enum {
	returnColorTable			= 0x0001,
	returnPalette				= 0x0002,
	recordComments				= 0x0004,
	recordFontInfo				= 0x0008,
	suppressBlackAndWhite		= 0x0010
};

enum {
																/* color pick methods */
	systemMethod				= 0,							/* system color pick method */
	popularMethod				= 1,							/* method that chooses the most popular set of colors */
	medianMethod				= 2								/* method that chooses a good average mix of colors */
};

enum {
																/* color bank types */
	ColorBankIsCustom			= -1,
	ColorBankIsExactAnd555		= 0,
	ColorBankIs555				= 1
};

typedef long 							PictInfoID;

struct CommentSpec {
	short 							count;						/* number of occurrances of this comment ID */
	short 							ID;							/* ID for the comment in the picture */
};
typedef struct CommentSpec				CommentSpec;
typedef CommentSpec *					CommentSpecPtr;
typedef CommentSpecPtr *				CommentSpecHandle;

struct FontSpec {
	short 							pictFontID;					/* ID of the font in the picture */
	short 							sysFontID;					/* ID of the same font in the current system file */
	long 							size[4];					/* bit array of all the sizes found (1..127) (bit 0 means > 127) */
	short 							style;						/* combined style of all occurrances of the font */
	long 							nameOffset;					/* offset into the fontNamesHdl handle for the font's name */
};
typedef struct FontSpec					FontSpec;
typedef FontSpec *						FontSpecPtr;
typedef FontSpecPtr *					FontSpecHandle;

struct PictInfo {
	short 							version;					/* this is always zero, for now */
	long 							uniqueColors;				/* the number of actual colors in the picture(s)/pixmap(s) */
	PaletteHandle 					thePalette;					/* handle to the palette information */
	CTabHandle 						theColorTable;				/* handle to the color table */
	Fixed 							hRes;						/* maximum horizontal resolution for all the pixmaps */
	Fixed 							vRes;						/* maximum vertical resolution for all the pixmaps */
	short 							depth;						/* maximum depth for all the pixmaps (in the picture) */
	Rect 							sourceRect;					/* the picture frame rectangle (this contains the entire picture) */
	long 							textCount;					/* total number of text strings in the picture */
	long 							lineCount;					/* total number of lines in the picture */
	long 							rectCount;					/* total number of rectangles in the picture */
	long 							rRectCount;					/* total number of round rectangles in the picture */
	long 							ovalCount;					/* total number of ovals in the picture */
	long 							arcCount;					/* total number of arcs in the picture */
	long 							polyCount;					/* total number of polygons in the picture */
	long 							regionCount;				/* total number of regions in the picture */
	long 							bitMapCount;				/* total number of bitmaps in the picture */
	long 							pixMapCount;				/* total number of pixmaps in the picture */
	long 							commentCount;				/* total number of comments in the picture */
	long 							uniqueComments;				/* the number of unique comments in the picture */
	CommentSpecHandle 				commentHandle;				/* handle to all the comment information */
	long 							uniqueFonts;				/* the number of unique fonts in the picture */
	FontSpecHandle 					fontHandle;					/* handle to the FontSpec information */
	Handle 							fontNamesHandle;			/* handle to the font names */
	long 							reserved1;
	long 							reserved2;
};
typedef struct PictInfo					PictInfo;
typedef PictInfo *						PictInfoPtr;
typedef PictInfoPtr *					PictInfoHandle;
typedef CALLBACK_API( OSErr , InitPickMethodProcPtr )(SInt16 colorsRequested, UInt32 *dataRef, SInt16 *colorBankType);
typedef CALLBACK_API( OSErr , RecordColorsProcPtr )(UInt32 dataRef, RGBColor *colorsArray, SInt32 colorCount, SInt32 *uniqueColors);
typedef CALLBACK_API( OSErr , CalcColorTableProcPtr )(UInt32 dataRef, SInt16 colorsRequested, void *colorBankPtr, CSpecArray resultPtr);
typedef CALLBACK_API( OSErr , DisposeColorPickMethodProcPtr )(UInt32 dataRef);
typedef STACK_UPP_TYPE(InitPickMethodProcPtr) 					InitPickMethodUPP;
typedef STACK_UPP_TYPE(RecordColorsProcPtr) 					RecordColorsUPP;
typedef STACK_UPP_TYPE(CalcColorTableProcPtr) 					CalcColorTableUPP;
typedef STACK_UPP_TYPE(DisposeColorPickMethodProcPtr) 			DisposeColorPickMethodUPP;
#if OPAQUE_UPP_TYPES
	EXTERN_API(InitPickMethodUPP)
	NewInitPickMethodUPP		   (InitPickMethodProcPtr	userRoutine);

	EXTERN_API(RecordColorsUPP)
	NewRecordColorsUPP			   (RecordColorsProcPtr		userRoutine);

	EXTERN_API(CalcColorTableUPP)
	NewCalcColorTableUPP		   (CalcColorTableProcPtr	userRoutine);

	EXTERN_API(DisposeColorPickMethodUPP)
	NewDisposeColorPickMethodUPP    (DisposeColorPickMethodProcPtr userRoutine);

	EXTERN_API(void)
	DisposeInitPickMethodUPP	   (InitPickMethodUPP		userUPP);

	EXTERN_API(void)
	DisposeRecordColorsUPP		   (RecordColorsUPP			userUPP);

	EXTERN_API(void)
	DisposeCalcColorTableUPP	   (CalcColorTableUPP		userUPP);

	EXTERN_API(void)
	DisposeDisposeColorPickMethodUPP    (DisposeColorPickMethodUPP userUPP);

	EXTERN_API(OSErr)
	InvokeInitPickMethodUPP		   (SInt16					colorsRequested,
									UInt32 *				dataRef,
									SInt16 *				colorBankType,
									InitPickMethodUPP		userUPP);

	EXTERN_API(OSErr)
	InvokeRecordColorsUPP		   (UInt32					dataRef,
									RGBColor *				colorsArray,
									SInt32					colorCount,
									SInt32 *				uniqueColors,
									RecordColorsUPP			userUPP);

	EXTERN_API(OSErr)
	InvokeCalcColorTableUPP		   (UInt32					dataRef,
									SInt16					colorsRequested,
									void *					colorBankPtr,
									CSpecArray				resultPtr,
									CalcColorTableUPP		userUPP);

	EXTERN_API(OSErr)
	InvokeDisposeColorPickMethodUPP    (UInt32				dataRef,
									DisposeColorPickMethodUPP userUPP);

#else
	enum { uppInitPickMethodProcInfo = 0x00000FA0 }; 				/* pascal 2_bytes Func(2_bytes, 4_bytes, 4_bytes) */
	enum { uppRecordColorsProcInfo = 0x00003FE0 }; 					/* pascal 2_bytes Func(4_bytes, 4_bytes, 4_bytes, 4_bytes) */
	enum { uppCalcColorTableProcInfo = 0x00003EE0 }; 				/* pascal 2_bytes Func(4_bytes, 2_bytes, 4_bytes, 4_bytes) */
	enum { uppDisposeColorPickMethodProcInfo = 0x000000E0 }; 		/* pascal 2_bytes Func(4_bytes) */
	#define NewInitPickMethodUPP(userRoutine) 						(InitPickMethodUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppInitPickMethodProcInfo, GetCurrentArchitecture())
	#define NewRecordColorsUPP(userRoutine) 						(RecordColorsUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppRecordColorsProcInfo, GetCurrentArchitecture())
	#define NewCalcColorTableUPP(userRoutine) 						(CalcColorTableUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppCalcColorTableProcInfo, GetCurrentArchitecture())
	#define NewDisposeColorPickMethodUPP(userRoutine) 				(DisposeColorPickMethodUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppDisposeColorPickMethodProcInfo, GetCurrentArchitecture())
	#define DisposeInitPickMethodUPP(userUPP) 						DisposeRoutineDescriptor(userUPP)
	#define DisposeRecordColorsUPP(userUPP) 						DisposeRoutineDescriptor(userUPP)
	#define DisposeCalcColorTableUPP(userUPP) 						DisposeRoutineDescriptor(userUPP)
	#define DisposeDisposeColorPickMethodUPP(userUPP) 				DisposeRoutineDescriptor(userUPP)
	#define InvokeInitPickMethodUPP(colorsRequested, dataRef, colorBankType, userUPP)  (OSErr)CALL_THREE_PARAMETER_UPP((userUPP), uppInitPickMethodProcInfo, (colorsRequested), (dataRef), (colorBankType))
	#define InvokeRecordColorsUPP(dataRef, colorsArray, colorCount, uniqueColors, userUPP)  (OSErr)CALL_FOUR_PARAMETER_UPP((userUPP), uppRecordColorsProcInfo, (dataRef), (colorsArray), (colorCount), (uniqueColors))
	#define InvokeCalcColorTableUPP(dataRef, colorsRequested, colorBankPtr, resultPtr, userUPP)  (OSErr)CALL_FOUR_PARAMETER_UPP((userUPP), uppCalcColorTableProcInfo, (dataRef), (colorsRequested), (colorBankPtr), (resultPtr))
	#define InvokeDisposeColorPickMethodUPP(dataRef, userUPP) 		(OSErr)CALL_ONE_PARAMETER_UPP((userUPP), uppDisposeColorPickMethodProcInfo, (dataRef))
#endif
/* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
#define NewInitPickMethodProc(userRoutine) 						NewInitPickMethodUPP(userRoutine)
#define NewRecordColorsProc(userRoutine) 						NewRecordColorsUPP(userRoutine)
#define NewCalcColorTableProc(userRoutine) 						NewCalcColorTableUPP(userRoutine)
#define NewDisposeColorPickMethodProc(userRoutine) 				NewDisposeColorPickMethodUPP(userRoutine)
#define CallInitPickMethodProc(userRoutine, colorsRequested, dataRef, colorBankType) InvokeInitPickMethodUPP(colorsRequested, dataRef, colorBankType, userRoutine)
#define CallRecordColorsProc(userRoutine, dataRef, colorsArray, colorCount, uniqueColors) InvokeRecordColorsUPP(dataRef, colorsArray, colorCount, uniqueColors, userRoutine)
#define CallCalcColorTableProc(userRoutine, dataRef, colorsRequested, colorBankPtr, resultPtr) InvokeCalcColorTableUPP(dataRef, colorsRequested, colorBankPtr, resultPtr, userRoutine)
#define CallDisposeColorPickMethodProc(userRoutine, dataRef)	InvokeDisposeColorPickMethodUPP(dataRef, userRoutine)
EXTERN_API( OSErr )
GetPictInfo						(PicHandle 				thePictHandle,
								 PictInfo *				thePictInfo,
								 short 					verb,
								 short 					colorsRequested,
								 short 					colorPickMethod,
								 short 					version)							THREEWORDINLINE(0x303C, 0x0800, 0xA831);

EXTERN_API( OSErr )
GetPixMapInfo					(PixMapHandle 			thePixMapHandle,
								 PictInfo *				thePictInfo,
								 short 					verb,
								 short 					colorsRequested,
								 short 					colorPickMethod,
								 short 					version)							THREEWORDINLINE(0x303C, 0x0801, 0xA831);

EXTERN_API( OSErr )
NewPictInfo						(PictInfoID *			thePictInfoID,
								 short 					verb,
								 short 					colorsRequested,
								 short 					colorPickMethod,
								 short 					version)							THREEWORDINLINE(0x303C, 0x0602, 0xA831);

EXTERN_API( OSErr )
RecordPictInfo					(PictInfoID 			thePictInfoID,
								 PicHandle 				thePictHandle)						THREEWORDINLINE(0x303C, 0x0403, 0xA831);

EXTERN_API( OSErr )
RecordPixMapInfo				(PictInfoID 			thePictInfoID,
								 PixMapHandle 			thePixMapHandle)					THREEWORDINLINE(0x303C, 0x0404, 0xA831);

EXTERN_API( OSErr )
RetrievePictInfo				(PictInfoID 			thePictInfoID,
								 PictInfo *				thePictInfo,
								 short 					colorsRequested)					THREEWORDINLINE(0x303C, 0x0505, 0xA831);

EXTERN_API( OSErr )
DisposePictInfo					(PictInfoID 			thePictInfoID)						THREEWORDINLINE(0x303C, 0x0206, 0xA831);

#if OLDROUTINENAMES
#define DisposPictInfo(thePictInfoID) DisposePictInfo(thePictInfoID)
#endif  /* OLDROUTINENAMES */





#if PRAGMA_STRUCT_ALIGN
	#pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
	#pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
	#pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __PICTUTILS__ */

