/*
 	File:		GXEnvironment.h
 
 	Contains:	QuickDraw GX environment constants and interfaces
 
 	Version:	Technology:	Quickdraw GX 1.1
 				Release:	QuickTime 4.1
 
 	Copyright:	(c) 1994-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 __GXENVIRONMENT__
#define __GXENVIRONMENT__

#ifndef __CONDITIONALMACROS__
	#include <ConditionalMacros.h>
#endif

#ifndef __MIXEDMODE__
	#include <MixedMode.h>
#endif

#ifndef __QUICKDRAW__
	#include <Quickdraw.h>
#endif

#ifndef __GXTYPES__
	#include <GXTypes.h>
#endif

#ifndef __CMAPPLICATION__
	#include <CMApplication.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

#if defined(__MWERKS__) && TARGET_CPU_68K
	#pragma push
	#pragma pointers_in_D0
#endif
 
/* old header = graphics macintosh */
 
enum {
	defaultPollingHandlerFlags	= 0x00,
	okToSwitchDuringPollFlag	= 0x00,
	dontSwitchDuringPollFlag	= 0x01
};

typedef long 							gxPollingHandlerFlags;
typedef CALLBACK_API_C( void , gxPollingHandlerProcPtr )(long reference, gxPollingHandlerFlags flags);
typedef STACK_UPP_TYPE(gxPollingHandlerProcPtr) 				gxPollingHandlerUPP;
#if OPAQUE_UPP_TYPES
	EXTERN_API(gxPollingHandlerUPP)
	NewgxPollingHandlerUPP		   (gxPollingHandlerProcPtr	userRoutine);

	EXTERN_API(void)
	DisposegxPollingHandlerUPP	   (gxPollingHandlerUPP		userUPP);

	EXTERN_API(void)
	InvokegxPollingHandlerUPP	   (long					reference,
									gxPollingHandlerFlags	flags,
									gxPollingHandlerUPP		userUPP);

#else
	enum { uppgxPollingHandlerProcInfo = 0x000003C1 }; 				/* no_return_value Func(4_bytes, 4_bytes) */
	#define NewgxPollingHandlerUPP(userRoutine) 					(gxPollingHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppgxPollingHandlerProcInfo, GetCurrentArchitecture())
	#define DisposegxPollingHandlerUPP(userUPP) 					DisposeRoutineDescriptor(userUPP)
	#define InvokegxPollingHandlerUPP(reference, flags, userUPP) 	CALL_TWO_PARAMETER_UPP((userUPP), uppgxPollingHandlerProcInfo, (reference), (flags))
#endif
/* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
#define NewgxPollingHandlerProc(userRoutine) 					NewgxPollingHandlerUPP(userRoutine)
#define CallgxPollingHandlerProc(userRoutine, reference, flags)	InvokegxPollingHandlerUPP(reference, flags, userRoutine)
EXTERN_API_C( gxPollingHandlerUPP )
GXGetGraphicsPollingHandler		(long *					reference)							THREEWORDINLINE(0x303C, 0x0245, 0xA832);

EXTERN_API_C( void )
GXSetGraphicsPollingHandler		(gxPollingHandlerUPP 	handler,
								 long 					reference)							THREEWORDINLINE(0x303C, 0x0246, 0xA832);

/* old header = graphics toolbox */
 

/* QD to QD GX Translator typedefs */
enum {
	gxDefaultOptionsTranslation	= 0x0000,
	gxOptimizedTranslation		= 0x0001,
	gxReplaceLineWidthTranslation = 0x0002,
	gxSimpleScalingTranslation	= 0x0004,
	gxSimpleGeometryTranslation	= 0x0008,						/* implies simple scaling */
	gxSimpleLinesTranslation	= 0x000C,						/* implies simple geometry & scaling */
	gxLayoutTextTranslation		= 0x0010,						/* turn on gxLine layout (normally off) */
	gxRasterTargetTranslation	= 0x0020,
	gxPostScriptTargetTranslation = 0x0040,
	gxVectorTargetTranslation	= 0x0080,
	gxPDDTargetTranslation		= 0x0100,
	gxDontConvertPatternsTranslation = 0x1000,
	gxDontSplitBitmapsTranslation = 0x2000
};

typedef long 							gxTranslationOption;
enum {
	gxContainsFormsBegin		= 0x0001,
	gxContainsFormsEnd			= 0x0002,
	gxContainsPostScript		= 0x0004,
	gxContainsEmptyPostScript	= 0x0008
};

typedef long 							gxTranslationStatistic;
enum {
	gxQuickDrawPictTag			= FOUR_CHAR_CODE('pict')
};


struct gxQuickDrawPict {
																/* translator inputs */
	gxTranslationOption 			options;
	Rect 							srcRect;
	Point 							styleStretch;

																/* size of quickdraw picture data */
	unsigned long 					dataLength;

																/* file alias */
	gxBitmapDataSourceAlias 		alias;
};
typedef struct gxQuickDrawPict			gxQuickDrawPict;
/* WindowRecord utilities */
EXTERN_API_C( gxViewPort )
GXNewWindowViewPort				(WindowPtr 				qdWindow)							THREEWORDINLINE(0x303C, 0x0236, 0xA832);

EXTERN_API_C( gxViewPort )
GXGetWindowViewPort				(WindowPtr 				qdWindow)							THREEWORDINLINE(0x303C, 0x0237, 0xA832);

EXTERN_API_C( WindowPtr )
GXGetViewPortWindow				(gxViewPort 			portOrder)							THREEWORDINLINE(0x303C, 0x0238, 0xA832);

/* GDevice utilities */
EXTERN_API_C( GDHandle )
GXGetViewDeviceGDevice			(gxViewDevice 			theDevice)							THREEWORDINLINE(0x303C, 0x0239, 0xA832);

EXTERN_API_C( gxViewDevice )
GXGetGDeviceViewDevice			(GDHandle 				qdGDevice)							THREEWORDINLINE(0x303C, 0x023A, 0xA832);

/* gxPoint utilities */
EXTERN_API_C( void )
GXConvertQDPoint				(const Point *			shortPt,
								 gxViewPort 			portOrder,
								 gxPoint *				fixedPt)							THREEWORDINLINE(0x303C, 0x023B, 0xA832);

typedef CALLBACK_API_C( OSErr , gxShapeSpoolProcPtr )(gxShape toSpool, long refCon);
/* printing utilities typedef */
typedef CALLBACK_API_C( void , gxUserViewPortFilterProcPtr )(gxShape toFilter, gxViewPort portOrder, long refCon);
typedef CALLBACK_API_C( long , gxConvertQDFontProcPtr )(gxStyle dst, long txFont, long txFace);
typedef STACK_UPP_TYPE(gxShapeSpoolProcPtr) 					gxShapeSpoolUPP;
typedef STACK_UPP_TYPE(gxUserViewPortFilterProcPtr) 			gxUserViewPortFilterUPP;
typedef STACK_UPP_TYPE(gxConvertQDFontProcPtr) 					gxConvertQDFontUPP;
#if OPAQUE_UPP_TYPES
	EXTERN_API(gxShapeSpoolUPP)
	NewgxShapeSpoolUPP			   (gxShapeSpoolProcPtr		userRoutine);

	EXTERN_API(gxUserViewPortFilterUPP)
	NewgxUserViewPortFilterUPP	   (gxUserViewPortFilterProcPtr userRoutine);

	EXTERN_API(gxConvertQDFontUPP)
	NewgxConvertQDFontUPP		   (gxConvertQDFontProcPtr	userRoutine);

	EXTERN_API(void)
	DisposegxShapeSpoolUPP		   (gxShapeSpoolUPP			userUPP);

	EXTERN_API(void)
	DisposegxUserViewPortFilterUPP    (gxUserViewPortFilterUPP userUPP);

	EXTERN_API(void)
	DisposegxConvertQDFontUPP	   (gxConvertQDFontUPP		userUPP);

	EXTERN_API(OSErr)
	InvokegxShapeSpoolUPP		   (gxShape					toSpool,
									long					refCon,
									gxShapeSpoolUPP			userUPP);

	EXTERN_API(void)
	InvokegxUserViewPortFilterUPP    (gxShape				toFilter,
									gxViewPort				portOrder,
									long					refCon,
									gxUserViewPortFilterUPP	userUPP);

	EXTERN_API(long)
	InvokegxConvertQDFontUPP	   (gxStyle					dst,
									long					txFont,
									long					txFace,
									gxConvertQDFontUPP		userUPP);

#else
	enum { uppgxShapeSpoolProcInfo = 0x000003E1 }; 					/* 2_bytes Func(4_bytes, 4_bytes) */
	enum { uppgxUserViewPortFilterProcInfo = 0x00000FC1 }; 			/* no_return_value Func(4_bytes, 4_bytes, 4_bytes) */
	enum { uppgxConvertQDFontProcInfo = 0x00000FF1 }; 				/* 4_bytes Func(4_bytes, 4_bytes, 4_bytes) */
	#define NewgxShapeSpoolUPP(userRoutine) 						(gxShapeSpoolUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppgxShapeSpoolProcInfo, GetCurrentArchitecture())
	#define NewgxUserViewPortFilterUPP(userRoutine) 				(gxUserViewPortFilterUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppgxUserViewPortFilterProcInfo, GetCurrentArchitecture())
	#define NewgxConvertQDFontUPP(userRoutine) 						(gxConvertQDFontUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppgxConvertQDFontProcInfo, GetCurrentArchitecture())
	#define DisposegxShapeSpoolUPP(userUPP) 						DisposeRoutineDescriptor(userUPP)
	#define DisposegxUserViewPortFilterUPP(userUPP) 				DisposeRoutineDescriptor(userUPP)
	#define DisposegxConvertQDFontUPP(userUPP) 						DisposeRoutineDescriptor(userUPP)
	#define InvokegxShapeSpoolUPP(toSpool, refCon, userUPP) 		(OSErr)CALL_TWO_PARAMETER_UPP((userUPP), uppgxShapeSpoolProcInfo, (toSpool), (refCon))
	#define InvokegxUserViewPortFilterUPP(toFilter, portOrder, refCon, userUPP)  CALL_THREE_PARAMETER_UPP((userUPP), uppgxUserViewPortFilterProcInfo, (toFilter), (portOrder), (refCon))
	#define InvokegxConvertQDFontUPP(dst, txFont, txFace, userUPP) 	(long)CALL_THREE_PARAMETER_UPP((userUPP), uppgxConvertQDFontProcInfo, (dst), (txFont), (txFace))
#endif
/* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
#define NewgxShapeSpoolProc(userRoutine) 						NewgxShapeSpoolUPP(userRoutine)
#define NewgxUserViewPortFilterProc(userRoutine) 				NewgxUserViewPortFilterUPP(userRoutine)
#define NewgxConvertQDFontProc(userRoutine) 					NewgxConvertQDFontUPP(userRoutine)
#define CallgxShapeSpoolProc(userRoutine, toSpool, refCon)		InvokegxShapeSpoolUPP(toSpool, refCon, userRoutine)
#define CallgxUserViewPortFilterProc(userRoutine, toFilter, portOrder, refCon) InvokegxUserViewPortFilterUPP(toFilter, portOrder, refCon, userRoutine)
#define CallgxConvertQDFontProc(userRoutine, dst, txFont, txFace) InvokegxConvertQDFontUPP(dst, txFont, txFace, userRoutine)

typedef gxShapeSpoolProcPtr 			gxShapeSpoolFunction;
typedef gxUserViewPortFilterProcPtr 	gxUserViewPortFilter;
typedef gxConvertQDFontProcPtr 			gxConvertQDFontFunction;
/* mouse utilities */
/* return mouse location in fixed-gxPoint global space */
EXTERN_API_C( void )
GXGetGlobalMouse				(gxPoint *				globalPt)							THREEWORDINLINE(0x303C, 0x023C, 0xA832);

/* return fixed-gxPoint local mouse (gxViewPort == 0 --> default) */
EXTERN_API_C( void )
GXGetViewPortMouse				(gxViewPort 			portOrder,
								 gxPoint *				localPt)							THREEWORDINLINE(0x303C, 0x023D, 0xA832);

/* printing utilities */
EXTERN_API_C( gxUserViewPortFilterUPP )
GXGetViewPortFilter				(gxViewPort 			portOrder,
								 long *					refCon)								THREEWORDINLINE(0x303C, 0x025E, 0xA832);

EXTERN_API_C( void )
GXSetViewPortFilter				(gxViewPort 			portOrder,
								 gxUserViewPortFilterUPP  filter,
								 long 					refCon)								THREEWORDINLINE(0x303C, 0x023E, 0xA832);

/* QD to QD GX Translator functions */
EXTERN_API_C( void )
GXInstallQDTranslator			(GrafPtr 				port,
								 gxTranslationOption 	options,
								 const Rect *			srcRect,
								 const Rect *			dstRect,
								 Point 					styleStrech,
								 gxShapeSpoolUPP 		userFunction,
								 void *					reference)							THREEWORDINLINE(0x303C, 0x023F, 0xA832);

EXTERN_API_C( gxTranslationStatistic )
GXRemoveQDTranslator			(GrafPtr 				port,
								 gxTranslationStatistic * statistic)						THREEWORDINLINE(0x303C, 0x0240, 0xA832);

EXTERN_API_C( gxShape )
GXConvertPICTToShape			(PicHandle 				pict,
								 gxTranslationOption 	options,
								 const Rect *			srcRect,
								 const Rect *			dstRect,
								 Point 					styleStretch,
								 gxShape 				destination,
								 gxTranslationStatistic * stats)							THREEWORDINLINE(0x303C, 0x0241, 0xA832);

/* Find the best GX style given a QD font and face. Called by the QD->GX translator */
EXTERN_API_C( long )
GXConvertQDFont					(gxStyle 				theStyle,
								 long 					txFont,
								 long 					txFace)								THREEWORDINLINE(0x303C, 0x0242, 0xA832);

EXTERN_API_C( gxConvertQDFontUPP )
GXGetConvertQDFont				(void)														THREEWORDINLINE(0x303C, 0x0243, 0xA832);

EXTERN_API_C( void )
GXSetConvertQDFont				(gxConvertQDFontUPP 	userFunction)						THREEWORDINLINE(0x303C, 0x0244, 0xA832);

typedef unsigned long 					gxProfilePoolAttributes;

struct gxFlatProfileListItem {
	gxProfilePoolAttributes 		attributes;					/* information about this particular profile's source*/
	CMProfileRef 					profileRef;					/* reference to profile, only valid before shape is disposed*/
	CMProfileIdentifier 			identifier;					/* information on how to find the profile upon unflattening*/
};
typedef struct gxFlatProfileListItem	gxFlatProfileListItem;

 
#if defined(__MWERKS__) && TARGET_CPU_68K
	#pragma pop
#endif

#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 /* __GXENVIRONMENT__ */

