diff options
Diffstat (limited to 'src/AGL_DSp.cpp')
-rw-r--r-- | src/AGL_DSp.cpp | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/src/AGL_DSp.cpp b/src/AGL_DSp.cpp new file mode 100644 index 0000000..eace870 --- /dev/null +++ b/src/AGL_DSp.cpp @@ -0,0 +1,242 @@ +/**> HEADER FILES <**/ +#include "AGL_DSp.h" +#include "Alerts.h" + + +/**> GLOBAL VARIABLES <**/ +DSpContextAttributes gDSpContextAttributes; // Global DrawSprocket context attributes +DSpContextReference gDSpContext; // The global DrawSprocket context +AGLContext gOpenGLContext; // The global OpenGL (AGL) context + + +/********************> ToolboxInit() <*****/ +void ToolboxInit( void ) +{ + + MaxApplZone(); + + InitGraf( &qd.thePort ); + InitFonts(); + InitWindows(); + InitMenus(); + TEInit(); + InitDialogs( 0L ); + InitCursor(); + +} + +/********************> HasAppearance() <*****/ +Boolean HasAppearance( void ) +{ + + OSErr error; + SInt32 response; + Boolean appearancePresent = false; + Boolean appearance101present = false; + Boolean appearance110present = false; + Boolean inCompatibilityMode = false; + + error = Gestalt( gestaltAppearanceAttr, &response ); + + // If Gestalt returns no error and the bit in response represented by the constant + // gestaltAppearanceExists is set, proceed, otherwise exit with an error message. + + if ( error == noErr && ( BitTst( &response, 31 - gestaltAppearanceExists ) ) ) + { + // At least Version 1.0 is present. Set a flag. + appearancePresent = true; + + // If the bit in response represented by the constant gestaltAppearanceCompatMode + // is set, system-wide Appearance is off. The result of this check will be + // relevant only where Versions 1.0 through 1.0.3 are present. + if( BitTst( &response, 31 - gestaltAppearanceCompatMode ) ) + inCompatibilityMode = true; + + // Call Gestalt again with the gestaltAppearanceVersion selector. + Gestalt( gestaltAppearanceVersion, &response ); + + // If the low order word in response is 0x0101, Version 1.0.1, 1.0.2, or 1.0.3 is + // present. If the low order word in response is 0x0110, Version 1.1 is available. + if( response == 0x00000101 ) + appearance101present = true; + else if( response == 0x00000110 ) + appearance110present = true; + } + /*else + { + StopAlert( kNoAppearanceAlert, nil ); + ExitToShell(); + }*/ + + // Register this app as an Appearance Client + //RegisterAppearanceClient(); + + return appearancePresent; + +} + +/********************> SetupScreen() <*****/ +CGrafPtr SetupScreen( int width, int height ) +{ + + OSStatus theError; + CGrafPtr theFrontBuffer; + + // Start DrawSprocket + theError = DSpStartup(); + if( theError ) + FatalErrorAlert( kErr_DSpStartupFailed, theError ); + + // Set the Context Attributes + gDSpContextAttributes.displayWidth = width; + gDSpContextAttributes.displayHeight = height; + gDSpContextAttributes.colorNeeds = kDSpColorNeeds_Require; + gDSpContextAttributes.displayDepthMask = kDSpDepthMask_32; + gDSpContextAttributes.backBufferDepthMask = kDSpDepthMask_32; + gDSpContextAttributes.displayBestDepth = 32; + gDSpContextAttributes.backBufferBestDepth = 32; + gDSpContextAttributes.pageCount = 1; + + // Find the best context for our attributes + theError = DSpFindBestContext( &gDSpContextAttributes, &gDSpContext ); + if( theError != noErr ) + FatalErrorAlert( kErr_DSpFindBestContextFailed, theError ); // This function is in my Alerts.cpp + + // Reserve that context + theError = DSpContext_Reserve( gDSpContext, &gDSpContextAttributes ); + if( theError != noErr ) + FatalErrorAlert( kErr_DSpContext_ReserveFailed, theError ); + + // Fade out + theError = DSpContext_FadeGammaOut( NULL, NULL ); + if( theError != noErr ) + FatalErrorAlert( kErr_DSpFadeFailed, theError ); + + // Activate the context + theError = DSpContext_SetState( gDSpContext, kDSpContextState_Active ); + if( theError != noErr ) + { + // Fade back in the display before dying + theError = DSpContext_FadeGammaIn( NULL, NULL ); + + // Now do the fatal error alert + FatalErrorAlert( kErr_ActivateContextFailed, theError ); + } + + // Fade in + theError = DSpContext_FadeGammaIn( NULL, NULL ); + if( theError != noErr ) + FatalErrorAlert( kErr_DSpFadeFailed, theError ); + + // Create a window to draw in + CreateWindow( theFrontBuffer, width, height ); + + return theFrontBuffer; + +} + +/********************> CreateWindow() <*****/ +void CreateWindow( CGrafPtr &theFrontBuffer, int width, int height ) +{ + + Rect rect; + AuxWinHandle awh; + CTabHandle theColorTable; + OSErr error; + RGBColor backColor = { 0xFFFF, 0xFFFF, 0xFFFF }; + RGBColor foreColor = { 0x0000, 0x0000, 0x0000 }; + + // Set the window rect + rect.top = rect.left = 0; + DSpContext_LocalToGlobal( gDSpContext, ( Point* )&rect ); + rect.right = rect.left + width; + rect.bottom = rect.top + height; + + // Create a new color window + theFrontBuffer = ( CGrafPtr )NewCWindow( NULL, &rect, "\p", 0, plainDBox, kMoveToFront, 0, 0 ); + + // set the content color of the window to black to avoid a white flash when the window appears. + if ( GetAuxWin( ( WindowPtr )theFrontBuffer, &awh ) ) + { + theColorTable = ( **awh ).awCTable; + error = HandToHand( ( Handle* )&theColorTable ); + if ( error ) + DebugStr( "\pOut of memory!" ); + + ( **theColorTable ).ctTable[wContentColor].rgb.red = 0; + ( **theColorTable ).ctTable[wContentColor].rgb.green = 0; + ( **theColorTable ).ctTable[wContentColor].rgb.blue = 0; + + CTabChanged( theColorTable ); + + // the color table will be disposed by the window manager when the window is disposed + SetWinColor( ( WindowPtr )theFrontBuffer, ( WCTabHandle )theColorTable ); + } + + // Show the window + ShowWindow( ( GrafPtr )theFrontBuffer ); + SetPort( ( GrafPtr )theFrontBuffer ); + + // Set current pen colors + RGBForeColor( &foreColor ); + RGBBackColor( &backColor ); + +} + +/********************> ShutdownScreen() <*****/ +void ShutdownScreen( CGrafPtr theFrontBuffer ) +{ + + DSpContext_FadeGammaOut( NULL, NULL ); + DisposeWindow( ( WindowPtr )theFrontBuffer ); + DSpContext_SetState( gDSpContext, kDSpContextState_Inactive ); + DSpContext_FadeGammaIn( NULL, NULL ); + DSpContext_Release( gDSpContext ); + DSpShutdown(); + +} + +/********************> SetupAGL() <*****/ +AGLContext SetupAGL( AGLDrawable window ) +{ + GLint attrib[] = { AGL_RGBA, AGL_DEPTH_SIZE, 24, AGL_DOUBLEBUFFER, AGL_NONE }; + AGLPixelFormat format; + AGLContext context; + GLboolean ok; + + // Choose an rgb pixel format + format = aglChoosePixelFormat( NULL, 0, attrib ); + if ( format == NULL ) + return NULL; + + // Create an AGL context + context = aglCreateContext( format, NULL ); + if ( context == NULL ) + return NULL; + + // Attach the window to the context + ok = aglSetDrawable( context, window ); + if ( !ok ) + return NULL; + + // Make the context the current context + ok = aglSetCurrentContext( context ); + if ( !ok ) + return NULL; + + // The pixel format is no longer needed so get rid of it + aglDestroyPixelFormat( format ); + + return context; + +} + +/********************> CleanupAGL() <*****/ +void CleanupAGL( AGLContext context ) +{ + + aglSetCurrentContext( NULL ); + aglSetDrawable( context, NULL ); + aglDestroyContext( context ); + +} |