ThreeDMetafile.h

/*
    File:       ThreeDMetafile.h
 
    Contains:   3D viewer support for SimpleText
 
    Version:    GX 1.2 or later
 
** Copyright 1994-1996 Apple Computer. All rights reserved.
**
**  You may incorporate this sample code into your applications without
**  restriction, though the sample code has been provided "AS IS" and the
**  responsibility for its operation is 100% yours.  However, what you are
**  not permitted to do is to redistribute the source as "DSC Sample Code"
**  after having made changes. If you're going to re-distribute the source,
**  we require that you make it clear in the source that the code was
**  descended from Apple Sample Code, but that you've made changes.
 
*/
 
 
#include "SimpleText.h"
 
 
#define kThreeDWindowID kThreeDBaseID
 
 
#ifndef REZ
    typedef long ViewerObject;
 
    struct ThreeDDataRecord
        {
        WindowDataRecord        w;
        
        ViewerObject            viewerObject;
        };
    typedef struct ThreeDDataRecord ThreeDDataRecord, *ThreeDDataPtr;   
 
    enum {
        kQ3ViewerShowBadge          = 1<<0,
        kQ3ViewerActive             = 1<<1,
        kQ3ViewerControllerVisible  = 1<<2,
        kQ3ViewerDrawFrame          = 1<<3,
        kQ3ViewerDraggingOff        = 1<<4,
        
        kQ3ViewerButtonCamera       = 1<<5,
        kQ3ViewerButtonTruck        = 1<<6,
        kQ3ViewerButtonOrbit        = 1<<7,
        kQ3ViewerButtonZoom         = 1<<8,
        kQ3ViewerButtonDolly        = 1<<9,
        
    
        kQ3ViewerDefault = (
                    kQ3ViewerActive        | kQ3ViewerControllerVisible | 
                    kQ3ViewerButtonCamera  | kQ3ViewerButtonTruck       | 
                    kQ3ViewerButtonOrbit   | kQ3ViewerButtonDolly )
    };
 
    enum {
        uppViewerLibNewProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(Ptr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(CGrafPtr)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(Rect*)))
             | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long))),
        uppViewerLibDisposeProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(Ptr))),
 
        uppViewerLibUseFileProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long))),
        uppViewerLibUseDataProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(void*)))
             | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long))),
 
        uppViewerLibWriteFileProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long))),
        uppViewerLibWriteDataProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(unsigned long)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(void**))),
 
        uppViewerLibDrawProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject))),
 
        uppViewerLibGetPictProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(PicHandle)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject))),
        uppViewerLibGetButtonRectProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(unsigned long)))
             | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(Rect*))),
 
        uppViewerLibGetDimensionProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long*)))
             | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long*))),
 
        uppViewerLibSetFlagsProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(unsigned long))),
        uppViewerLibGetFlagsProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(unsigned long)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject))),
 
        uppViewerLibSetBoundsProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(Rect*))),
        uppViewerLibGetBoundsProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(Rect*))),
 
        uppViewerLibSetPortProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(CGrafPtr))),
        uppViewerLibGetPortProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(CGrafPtr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject))),
 
        uppViewerLibEventProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(Boolean)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(EventRecord*))),
        uppViewerLibAdjustCursorProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(Boolean)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
             | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(Point*))),
 
        uppViewerLibGetStateProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(unsigned long)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject))),
 
        uppViewerLibClearProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject))),
        uppViewerLibCutProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject))),
        uppViewerLibCopyProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject))),
        uppViewerLibPasteProcInfo = kCStackBased
             | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
             | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ViewerObject)))
 
        };
        
    // Proc pointer typedefs
    typedef ViewerObject (*ViewerLib_NewType) (CGrafPtr port,  Rect *rect,  unsigned long flags);
    typedef OSErr (*ViewerLib_DisposeType) (ViewerObject theViewer);
 
    typedef OSErr (*ViewerLib_UseFileType) (ViewerObject theViewer, long refNum);
    typedef OSErr (*ViewerLib_UseDataType)  (ViewerObject theViewer, void *data, long size);
 
    typedef OSErr (*ViewerLib_WriteFileType) (ViewerObject theViewer, long refNum);
    typedef unsigned long (*ViewerLib_WriteDataType)  (ViewerObject theViewer, void **data);
 
    typedef OSErr (*ViewerLib_DrawType) (ViewerObject theViewer);
 
    typedef PicHandle (*ViewerLib_GetPictType) (ViewerObject theViewer);
    typedef OSErr     (*ViewerLib_GetButtonRectType) (ViewerObject theViewer, unsigned long button, Rect *rect);
 
    typedef OSErr (*ViewerLib_GetDimensionType) (ViewerObject theViewer, long *width, long* height);
    
    typedef OSErr (*ViewerLib_SetFlagsType) (ViewerObject theViewer, unsigned long flags);
    typedef unsigned long (*ViewerLib_GetFlagsType) (ViewerObject theViewer);
 
    typedef OSErr (*ViewerLib_SetBoundsType) (ViewerObject theViewer, Rect *bounds);
    typedef OSErr (*ViewerLib_GetBoundsType) (ViewerObject theViewer, Rect *bounds);
 
    typedef OSErr (*ViewerLib_SetPortType) (ViewerObject theViewer, CGrafPtr port);
    typedef CGrafPtr (*ViewerLib_GetPortType) (ViewerObject theViewer);
 
    typedef Boolean (*ViewerLib_EventType) (ViewerObject theViewer, EventRecord *evt);
    typedef Boolean (*ViewerLib_AdjustCursorType) (ViewerObject theViewer, Point *pt);
 
    typedef unsigned long (*ViewerLib_GetStateType) (ViewerObject theViewer);
 
    typedef OSErr (*ViewerLib_ClearType) (ViewerObject theViewer);
    typedef OSErr (*ViewerLib_CutType) (ViewerObject theViewer);
    typedef OSErr (*ViewerLib_CopyType) (ViewerObject theViewer);
    typedef OSErr (*ViewerLib_PasteType) (ViewerObject theViewer);
 
 
    typedef struct
        {
        ProcInfoType        info;
        void                *entry;
        } GlobalEntry;
        
    // Macro calls
    #define ViewerLib_New(A,B,C) (*(ViewerLib_NewType)(gProcPointers[0].entry)) (A, B, C)
    #define ViewerLib_Dispose(A) (*(ViewerLib_DisposeType)(gProcPointers[1].entry)) (A)
    
    #define ViewerLib_UseFile(A,B) (*(ViewerLib_UseFileType)(gProcPointers[2].entry)) (A, B)
    #define ViewerLib_UseData(A,B,C) (*(ViewerLib_UseDataType)(gProcPointers[3].entry)) (A, B, C)
 
    #define ViewerLib_WriteFile(A,B) (*(ViewerLib_WriteFileType)(gProcPointers[4].entry)) (A, B)
    #define ViewerLib_WriteData(A,B) (*(ViewerLib_WriteDataType)(gProcPointers[5].entry)) (A, B)
    
    #define ViewerLib_Draw(A) (*(ViewerLib_DrawType)(gProcPointers[6].entry)) (A)
 
    #define ViewerLib_GetPict(A) (*(ViewerLib_GetPictType)(gProcPointers[7].entry)) (A)
    #define ViewerLib_GetButtonRect(A,B,C) (*(ViewerLib_GetButtonRectType)(gProcPointers[8].entry)) (A,B,C)
 
    #define ViewerLib_GetDimension(A,B,C) (*(ViewerLib_GetDimensionType)(gProcPointers[9].entry)) (A,B,C)
    
    #define ViewerLib_SetFlags(A,B) (*(ViewerLib_SetFlagsType)(gProcPointers[10].entry)) (A, B)
    #define ViewerLib_GetFlags(A) (*(ViewerLib_GetFlagsType)(gProcPointers[11].entry)) (A)
 
    #define ViewerLib_SetBounds(A,B) (*(ViewerLib_SetBoundsType)(gProcPointers[12].entry)) (A, B)
    #define ViewerLib_GetBounds(A,B) (*(ViewerLib_GetBoundsType)(gProcPointers[13].entry)) (A, B)
 
    #define ViewerLib_SetPort(A,B) (*(ViewerLib_SetPortType)(gProcPointers[14].entry)) (A, B)
    #define ViewerLib_GetPort(A) (*(ViewerLib_GetPortType)(gProcPointers[15].entry)) (A)
 
    #define ViewerLib_Event(A,B) (*(ViewerLib_EventType)(gProcPointers[16].entry)) (A, B)
    #define ViewerLib_AdjustCursor(A,B) (*(ViewerLib_AdjustCursorType)(gProcPointers[17].entry)) (A, B)
 
    #define ViewerLib_GetState(A) (*(ViewerLib_GetStateType)(gProcPointers[18].entry)) (A)
 
    #define ViewerLib_Clear(A) (*(ViewerLib_ClearType)(gProcPointers[19].entry)) (A)
    #define ViewerLib_Cut(A) (*(ViewerLib_CutType)(gProcPointers[20].entry)) (A)
    #define ViewerLib_Copy(A) (*(ViewerLib_CopyType)(gProcPointers[21].entry)) (A)
    #define ViewerLib_Paste(A) (*(ViewerLib_PasteType)(gProcPointers[22].entry)) (A)
 
#endif