aboutsummaryrefslogtreecommitdiffstats
path: root/distrib/sdl-1.2.12/src/video/maccommon/SDL_macwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'distrib/sdl-1.2.12/src/video/maccommon/SDL_macwm.c')
-rw-r--r--distrib/sdl-1.2.12/src/video/maccommon/SDL_macwm.c442
1 files changed, 0 insertions, 442 deletions
diff --git a/distrib/sdl-1.2.12/src/video/maccommon/SDL_macwm.c b/distrib/sdl-1.2.12/src/video/maccommon/SDL_macwm.c
deleted file mode 100644
index 66828bf..0000000
--- a/distrib/sdl-1.2.12/src/video/maccommon/SDL_macwm.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- SDL - Simple DirectMedia Layer
- Copyright (C) 1997-2006 Sam Lantinga
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
- Sam Lantinga
- slouken@libsdl.org
-*/
-#include "SDL_config.h"
-
-#if defined(__APPLE__) && defined(__MACH__)
-#include <Carbon/Carbon.h>
-#elif TARGET_API_MAC_CARBON && (UNIVERSAL_INTERFACES_VERSION > 0x0335)
-#include <Carbon.h>
-#else
-#include <Windows.h>
-#include <Strings.h>
-#endif
-
-#if SDL_MACCLASSIC_GAMMA_SUPPORT
-#include <Devices.h>
-#include <Files.h>
-#include <MacTypes.h>
-#include <QDOffscreen.h>
-#include <Quickdraw.h>
-#include <Video.h>
-#endif
-
-#include "SDL_stdinc.h"
-#include "SDL_macwm_c.h"
-
-void Mac_SetCaption(_THIS, const char *title, const char *icon)
-{
- /* Don't convert C to P string in place, because it may be read-only */
- Str255 ptitle; /* MJS */
- ptitle[0] = strlen (title);
- SDL_memcpy(ptitle+1, title, ptitle[0]); /* MJS */
- if (SDL_Window)
- SetWTitle(SDL_Window, ptitle); /* MJS */
-}
-
-#if SDL_MACCLASSIC_GAMMA_SUPPORT
-/*
- * ADC Gamma Ramp support...
- *
- * Mac Gamma Ramp code was originally from sample code provided by
- * Apple Developer Connection, and not written specifically for SDL:
- * "Contains: Functions to enable Mac OS device gamma adjustments using 3 channel 256 element 8 bit gamma ramps
- * Written by: Geoff Stahl (ggs)
- * Copyright: Copyright (c) 1999 Apple Computer, Inc., All Rights Reserved
- * Disclaimer: 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."
- * (The sample code has been integrated into this file, and thus is modified from the original Apple sources.)
- */
-
-typedef struct recDeviceGamma /* storage for device handle and gamma table */
-{
- GDHandle hGD; /* handle to device */
- GammaTblPtr pDeviceGamma; /* pointer to device gamma table */
-} recDeviceGamma;
-typedef recDeviceGamma * precDeviceGamma;
-
-typedef struct recSystemGamma /* storage for system devices and gamma tables */
-{
- short numDevices; /* number of devices */
- precDeviceGamma * devGamma; /* array of pointers to device gamma records */
-} recSystemGamma;
-typedef recSystemGamma * precSystemGamma;
-
-static Ptr CopyGammaTable (GammaTblPtr pTableGammaIn)
-{
- GammaTblPtr pTableGammaOut = NULL;
- short tableSize, dataWidth;
-
- if (pTableGammaIn) /* if there is a table to copy */
- {
- dataWidth = (pTableGammaIn->gDataWidth + 7) / 8; /* number of bytes per entry */
- tableSize = sizeof (GammaTbl) + pTableGammaIn->gFormulaSize +
- (pTableGammaIn->gChanCnt * pTableGammaIn->gDataCnt * dataWidth);
- pTableGammaOut = (GammaTblPtr) NewPtr (tableSize); /* allocate new table */
- if (pTableGammaOut)
- BlockMove( (Ptr)pTableGammaIn, (Ptr)pTableGammaOut, tableSize); /* move everything */
- }
- return (Ptr)pTableGammaOut; /* return whatever we allocated, could be NULL */
-}
-
-static OSErr GetGammaTable (GDHandle hGD, GammaTblPtr * ppTableGammaOut)
-{
- VDGammaRecord DeviceGammaRec;
- CntrlParam cParam;
- OSErr err;
-
- cParam.ioCompletion = NULL; /* set up control params */
- cParam.ioNamePtr = NULL;
- cParam.ioVRefNum = 0;
- cParam.ioCRefNum = (**hGD).gdRefNum;
- cParam.csCode = cscGetGamma; /* Get Gamma commnd to device */
- *(Ptr *)cParam.csParam = (Ptr) &DeviceGammaRec; /* record for gamma */
-
- err = PBStatusSync( (ParmBlkPtr)&cParam ); /* get gamma */
-
- *ppTableGammaOut = (GammaTblPtr)(DeviceGammaRec.csGTable); /* pull table out of record */
-
- return err;
-}
-
-static Ptr GetDeviceGamma (GDHandle hGD)
-{
- GammaTblPtr pTableGammaDevice = NULL;
- GammaTblPtr pTableGammaReturn = NULL;
- OSErr err;
-
- err = GetGammaTable (hGD, &pTableGammaDevice); /* get a pointer to the devices table */
- if ((noErr == err) && pTableGammaDevice) /* if succesful */
- pTableGammaReturn = (GammaTblPtr) CopyGammaTable (pTableGammaDevice); /* copy to global */
-
- return (Ptr) pTableGammaReturn;
-}
-
-static void DisposeGammaTable (Ptr pGamma)
-{
- if (pGamma)
- DisposePtr((Ptr) pGamma); /* get rid of it */
-}
-
-static void DisposeSystemGammas (Ptr* ppSystemGammas)
-{
- precSystemGamma pSysGammaIn;
- if (ppSystemGammas)
- {
- pSysGammaIn = (precSystemGamma) *ppSystemGammas;
- if (pSysGammaIn)
- {
- short i;
- for (i = 0; i < pSysGammaIn->numDevices; i++) /* for all devices */
- if (pSysGammaIn->devGamma [i]) /* if pointer is valid */
- {
- DisposeGammaTable ((Ptr) pSysGammaIn->devGamma [i]->pDeviceGamma); /* dump gamma table */
- DisposePtr ((Ptr) pSysGammaIn->devGamma [i]); /* dump device info */
- }
- DisposePtr ((Ptr) pSysGammaIn->devGamma); /* dump device pointer array */
- DisposePtr ((Ptr) pSysGammaIn); /* dump system structure */
- *ppSystemGammas = NULL;
- }
- }
-}
-
-static Boolean GetDeviceGammaRampGD (GDHandle hGD, Ptr pRamp)
-{
- GammaTblPtr pTableGammaTemp = NULL;
- long indexChan, indexEntry;
- OSErr err;
-
- if (pRamp) /* ensure pRamp is allocated */
- {
- err = GetGammaTable (hGD, &pTableGammaTemp); /* get a pointer to the current gamma */
- if ((noErr == err) && pTableGammaTemp) /* if successful */
- {
- /* fill ramp */
- unsigned char * pEntry = (unsigned char *) &pTableGammaTemp->gFormulaData + pTableGammaTemp->gFormulaSize; /* base of table */
- short bytesPerEntry = (pTableGammaTemp->gDataWidth + 7) / 8; /* size, in bytes, of the device table entries */
- short shiftRightValue = pTableGammaTemp->gDataWidth - 8; /* number of right shifts device -> ramp */
- short channels = pTableGammaTemp->gChanCnt;
- short entries = pTableGammaTemp->gDataCnt;
- if (3 == channels) /* RGB format */
- { /* note, this will create runs of entries if dest. is bigger (not linear interpolate) */
- for (indexChan = 0; indexChan < channels; indexChan++)
- for (indexEntry = 0; indexEntry < 256; indexEntry++)
- *((unsigned char *) pRamp + (indexChan * 256) + indexEntry) =
- *(pEntry + indexChan * entries * bytesPerEntry + indexEntry * entries * bytesPerEntry / 256) >> shiftRightValue;
- }
- else /* single channel format */
- {
- for (indexChan = 0; indexChan < 768; indexChan += 256) /* repeat for all 3 channels (step by ramp size) */
- for (indexEntry = 0; indexEntry < 256; indexEntry++) /* for all entries set vramp value */
- *((unsigned char *) pRamp + indexChan + indexEntry) =
- *(pEntry + indexEntry * entries * bytesPerEntry / 256) >> shiftRightValue;
- }
- return true;
- }
- }
- return false;
-}
-
-static Ptr GetSystemGammas (void)
-{
- precSystemGamma pSysGammaOut; /* return pointer to system device gamma info */
- short devCount = 0; /* number of devices attached */
- Boolean fail = false;
- GDHandle hGDevice;
-
- pSysGammaOut = (precSystemGamma) NewPtr (sizeof (recSystemGamma)); /* allocate for structure */
-
- hGDevice = GetDeviceList (); /* top of device list */
- do /* iterate */
- {
- devCount++; /* count devices */
- hGDevice = GetNextDevice (hGDevice); /* next device */
- } while (hGDevice);
-
- pSysGammaOut->devGamma = (precDeviceGamma *) NewPtr (sizeof (precDeviceGamma) * devCount); /* allocate for array of pointers to device records */
- if (pSysGammaOut)
- {
- pSysGammaOut->numDevices = devCount; /* stuff count */
-
- devCount = 0; /* reset iteration */
- hGDevice = GetDeviceList ();
- do
- {
- pSysGammaOut->devGamma [devCount] = (precDeviceGamma) NewPtr (sizeof (recDeviceGamma)); /* new device record */
- if (pSysGammaOut->devGamma [devCount]) /* if we actually allocated memory */
- {
- pSysGammaOut->devGamma [devCount]->hGD = hGDevice; /* stuff handle */
- pSysGammaOut->devGamma [devCount]->pDeviceGamma = (GammaTblPtr)GetDeviceGamma (hGDevice); /* copy gamma table */
- }
- else /* otherwise dump record on exit */
- fail = true;
- devCount++; /* next device */
- hGDevice = GetNextDevice (hGDevice);
- } while (hGDevice);
- }
- if (!fail) /* if we did not fail */
- return (Ptr) pSysGammaOut; /* return pointer to structure */
- else
- {
- DisposeSystemGammas ((Ptr *) &pSysGammaOut); /* otherwise dump the current structures (dispose does error checking) */
- return NULL; /* could not complete */
- }
-}
-
-static void RestoreDeviceGamma (GDHandle hGD, Ptr pGammaTable)
-{
- VDSetEntryRecord setEntriesRec;
- VDGammaRecord gameRecRestore;
- CTabHandle hCTabDeviceColors;
- Ptr csPtr;
- OSErr err = noErr;
-
- if (pGammaTable) /* if we have a table to restore */
- {
- gameRecRestore.csGTable = pGammaTable; /* setup restore record */
- csPtr = (Ptr) &gameRecRestore;
- err = Control((**hGD).gdRefNum, cscSetGamma, (Ptr) &csPtr); /* restore gamma */
-
- if ((noErr == err) && (8 == (**(**hGD).gdPMap).pixelSize)) /* if successful and on an 8 bit device */
- {
- hCTabDeviceColors = (**(**hGD).gdPMap).pmTable; /* do SetEntries to force CLUT update */
- setEntriesRec.csTable = (ColorSpec *) &(**hCTabDeviceColors).ctTable;
- setEntriesRec.csStart = 0;
- setEntriesRec.csCount = (**hCTabDeviceColors).ctSize;
- csPtr = (Ptr) &setEntriesRec;
-
- err = Control((**hGD).gdRefNum, cscSetEntries, (Ptr) &csPtr); /* SetEntries in CLUT */
- }
- }
-}
-
-static void RestoreSystemGammas (Ptr pSystemGammas)
-{
- short i;
- precSystemGamma pSysGammaIn = (precSystemGamma) pSystemGammas;
- if (pSysGammaIn)
- for (i = 0; i < pSysGammaIn->numDevices; i++) /* for all devices */
- RestoreDeviceGamma (pSysGammaIn->devGamma [i]->hGD, (Ptr) pSysGammaIn->devGamma [i]->pDeviceGamma); /* restore gamma */
-}
-
-static Ptr CreateEmptyGammaTable (short channels, short entries, short bits)
-{
- GammaTblPtr pTableGammaOut = NULL;
- short tableSize, dataWidth;
-
- dataWidth = (bits + 7) / 8; /* number of bytes per entry */
- tableSize = sizeof (GammaTbl) + (channels * entries * dataWidth);
- pTableGammaOut = (GammaTblPtr) NewPtrClear (tableSize); /* allocate new tabel */
-
- if (pTableGammaOut) /* if we successfully allocated */
- {
- pTableGammaOut->gVersion = 0; /* set parameters based on input */
- pTableGammaOut->gType = 0;
- pTableGammaOut->gFormulaSize = 0;
- pTableGammaOut->gChanCnt = channels;
- pTableGammaOut->gDataCnt = entries;
- pTableGammaOut->gDataWidth = bits;
- }
- return (Ptr)pTableGammaOut; /* return whatever we allocated */
-}
-
-static Boolean SetDeviceGammaRampGD (GDHandle hGD, Ptr pRamp)
-{
- VDSetEntryRecord setEntriesRec;
- VDGammaRecord gameRecRestore;
- GammaTblPtr pTableGammaNew;
- GammaTblPtr pTableGammaCurrent = NULL;
- CTabHandle hCTabDeviceColors;
- Ptr csPtr;
- OSErr err;
- short dataBits, entries, channels = 3; /* force three channels in the gamma table */
-
- if (pRamp) /* ensure pRamp is allocated */
- {
- err= GetGammaTable (hGD, &pTableGammaCurrent); /* get pointer to current table */
- if ((noErr == err) && pTableGammaCurrent)
- {
- dataBits = pTableGammaCurrent->gDataWidth; /* table must have same data width */
- entries = pTableGammaCurrent->gDataCnt; /* table must be same size */
- pTableGammaNew = (GammaTblPtr) CreateEmptyGammaTable (channels, entries, dataBits); /* our new table */
- if (pTableGammaNew) /* if successful fill table */
- {
- unsigned char * pGammaBase = (unsigned char *) &pTableGammaNew->gFormulaData + pTableGammaNew->gFormulaSize; /* base of table */
- if ((256 == entries) && (8 == dataBits)) /* simple case: direct mapping */
- BlockMove ((Ptr)pRamp, (Ptr)pGammaBase, channels * entries); /* move everything */
- else /* tough case handle entry, channel and data size disparities */
- {
- short indexChan, indexEntry;
- short bytesPerEntry = (dataBits + 7) / 8; /* size, in bytes, of the device table entries */
- short shiftRightValue = 8 - dataBits; /* number of right shifts ramp -> device */
- shiftRightValue += ((bytesPerEntry - 1) * 8); /* multibyte entries and the need to map a byte at a time most sig. to least sig. */
- for (indexChan = 0; indexChan < channels; indexChan++) /* for all the channels */
- for (indexEntry = 0; indexEntry < entries; indexEntry++) /* for all the entries */
- {
- short currentShift = shiftRightValue; /* reset current bit shift */
- long temp = *((unsigned char *)pRamp + (indexChan << 8) + (indexEntry << 8) / entries); /* get data from ramp */
- short indexByte;
- for (indexByte = 0; indexByte < bytesPerEntry; indexByte++) /* for all bytes */
- {
- if (currentShift < 0) /* shift data correctly for current byte */
- *(pGammaBase++) = temp << -currentShift;
- else
- *(pGammaBase++) = temp >> currentShift;
- currentShift -= 8; /* increment shift to align to next less sig. byte */
- }
- }
- }
-
- /* set gamma */
- gameRecRestore.csGTable = (Ptr) pTableGammaNew; /* setup restore record */
- csPtr = (Ptr) &gameRecRestore;
- err = Control((**hGD).gdRefNum, cscSetGamma, (Ptr) &csPtr); /* restore gamma (note, display drivers may delay returning from this until VBL) */
-
- if ((8 == (**(**hGD).gdPMap).pixelSize) && (noErr == err)) /* if successful and on an 8 bit device */
- {
- hCTabDeviceColors = (**(**hGD).gdPMap).pmTable; /* do SetEntries to force CLUT update */
- setEntriesRec.csTable = (ColorSpec *) &(**hCTabDeviceColors).ctTable;
- setEntriesRec.csStart = 0;
- setEntriesRec.csCount = (**hCTabDeviceColors).ctSize;
- csPtr = (Ptr) &setEntriesRec;
- err = Control((**hGD).gdRefNum, cscSetEntries, (Ptr) &csPtr); /* SetEntries in CLUT */
- }
- DisposeGammaTable ((Ptr) pTableGammaNew); /* dump table */
- if (noErr == err)
- return true;
- }
- }
- }
- else /* set NULL gamma -> results in linear map */
- {
- gameRecRestore.csGTable = (Ptr) NULL; /* setup restore record */
- csPtr = (Ptr) &gameRecRestore;
- err = Control((**hGD).gdRefNum, cscSetGamma, (Ptr) &csPtr); /* restore gamma */
-
- if ((8 == (**(**hGD).gdPMap).pixelSize) && (noErr == err)) /* if successful and on an 8 bit device */
- {
- hCTabDeviceColors = (**(**hGD).gdPMap).pmTable; /* do SetEntries to force CLUT update */
- setEntriesRec.csTable = (ColorSpec *) &(**hCTabDeviceColors).ctTable;
- setEntriesRec.csStart = 0;
- setEntriesRec.csCount = (**hCTabDeviceColors).ctSize;
- csPtr = (Ptr) &setEntriesRec;
- err = Control((**hGD).gdRefNum, cscSetEntries, (Ptr) &csPtr); /* SetEntries in CLUT */
- }
- if (noErr == err)
- return true;
- }
- return false; /* memory allocation or device control failed if we get here */
-}
-
-/* end of ADC Gamma Ramp support code... */
-
-static Ptr systemGammaPtr;
-
-void Mac_QuitGamma(_THIS)
-{
- if (systemGammaPtr)
- {
- RestoreSystemGammas(systemGammaPtr);
- DisposeSystemGammas(&systemGammaPtr);
- }
-}
-
-static unsigned char shiftedRamp[3 * 256];
-
-int Mac_SetGammaRamp(_THIS, Uint16 *ramp)
-{
- int i;
- if (!systemGammaPtr)
- systemGammaPtr = GetSystemGammas();
- for (i = 0; i < 3 * 256; i++)
- {
- shiftedRamp[i] = ramp[i] >> 8;
- }
-
- if (SetDeviceGammaRampGD(GetMainDevice(), (Ptr) shiftedRamp))
- return 0;
- else
- return -1;
-}
-
-int Mac_GetGammaRamp(_THIS, Uint16 *ramp)
-{
- if (GetDeviceGammaRampGD(GetMainDevice(), (Ptr) shiftedRamp))
- {
- int i;
- for (i = 0; i < 3 * 256; i++)
- {
- ramp[i] = shiftedRamp[i] << 8;
- }
- return 0;
- }
- else
- return -1;
-}
-
-#endif /* SDL_MACCLASSIC_GAMMA_SUPPORT */
-
-