aboutsummaryrefslogtreecommitdiff
path: root/Source/AGL_DSp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/AGL_DSp.cpp')
-rw-r--r--Source/AGL_DSp.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/Source/AGL_DSp.cpp b/Source/AGL_DSp.cpp
new file mode 100644
index 0000000..eace870
--- /dev/null
+++ b/Source/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 );
+
+}