⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_macwm.c

📁 SDL库 在进行视频显示程序spcaview安装时必须的库文件
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    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 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -