From 32727b822fab3628d93928a4eafe0d70b25d898b Mon Sep 17 00:00:00 2001 From: Michael Buckley Date: Sun, 10 Nov 2019 19:54:00 -0800 Subject: [PATCH] Mac: Fix Freeze/Restore Screen --- macosx/ReClassicfication/EndianStuff.h | 28 + macosx/ReClassicfication/FakeHandles.c | 269 ++++++ macosx/ReClassicfication/FakeHandles.h | 114 +++ macosx/ReClassicfication/FakeResources.c | 1127 ++++++++++++++++++++++ macosx/ReClassicfication/FakeResources.h | 84 ++ macosx/logo_defrost.png | Bin 29426 -> 52343 bytes macosx/logo_freeze.png | Bin 20720 -> 40180 bytes macosx/mac-file.mm | 8 +- macosx/mac-os.mm | 176 +++- macosx/mac-screenshot.mm | 81 +- macosx/snes9x.xcodeproj/project.pbxproj | 28 + 11 files changed, 1848 insertions(+), 67 deletions(-) create mode 100755 macosx/ReClassicfication/EndianStuff.h create mode 100755 macosx/ReClassicfication/FakeHandles.c create mode 100755 macosx/ReClassicfication/FakeHandles.h create mode 100755 macosx/ReClassicfication/FakeResources.c create mode 100755 macosx/ReClassicfication/FakeResources.h diff --git a/macosx/ReClassicfication/EndianStuff.h b/macosx/ReClassicfication/EndianStuff.h new file mode 100755 index 00000000..1e6d3d4d --- /dev/null +++ b/macosx/ReClassicfication/EndianStuff.h @@ -0,0 +1,28 @@ +/* + * EndianStuff.h + * stackimport + * + * Created by Mr. Z. on 10/06/06. + * Copyright 2006 Mr Z. All rights reserved. + * + */ + +#pragma once + +#include + + +#if RECLASSIFICATION_BUILD_BIG_ENDIAN +#define BIG_ENDIAN_16(value) (value) +#define BIG_ENDIAN_32(value) (value) +#else +#define BIG_ENDIAN_16(value) \ + (((((uint16_t)(value))<<8) & 0xFF00) | \ + ((((uint16_t)(value))>>8) & 0x00FF)) + +#define BIG_ENDIAN_32(value) \ + (((((uint32_t)(value))<<24) & 0xFF000000) | \ + ((((uint32_t)(value))<< 8) & 0x00FF0000) | \ + ((((uint32_t)(value))>> 8) & 0x0000FF00) | \ + ((((uint32_t)(value))>>24) & 0x000000FF)) +#endif diff --git a/macosx/ReClassicfication/FakeHandles.c b/macosx/ReClassicfication/FakeHandles.c new file mode 100755 index 00000000..e2315cc4 --- /dev/null +++ b/macosx/ReClassicfication/FakeHandles.c @@ -0,0 +1,269 @@ +/* =========================================================================== + + PROJECT: FakeHandles + + FILE: FakeHandles.c + + PURPOSE: Simulate Handles on machines which only have ANSI-C to easily + port some of the more simple Macintosh code fragments to other + platforms. + + (C) Copyright 1998 by Uli Kusterer, all rights reserved. + + ======================================================================== */ + +#pragma mark [Headers] + + +// ----------------------------------------------------------------------------- +// Headers: +// ----------------------------------------------------------------------------- + +#include "FakeHandles.h" + + +// ----------------------------------------------------------------------------- +// Globals: +// ----------------------------------------------------------------------------- + +/* The last entry in the master pointer array is mis-used to hold a pointer + to another master pointer array. Thus, we have a linked list of master + pointer arrays in RAM, and we don't run out of master pointers as easily. */ +MasterPointer gMasterPointers[MASTERPOINTER_CHUNK_SIZE]; +long gFakeHandleError = noErr; + + +/* ----------------------------------------------------------------------------- + FakeInitHandles: + Call this to initialize the fake memory Manager at the start of your + program. Only call this once or you'll lose all your Handles and will have + stale memory lying around. Pass the global gMasterPointers in + masterPtrArray. + + REVISIONS: + 98-08-30 UK Created. + ----------------------------------------------------------------------------- */ + +void FakeInitHandles( MasterPointer* masterPtrArray ) +{ + long x; + + for( x = 0; x < MASTERPOINTER_CHUNK_SIZE; x++ ) + { + masterPtrArray[x].actualPointer = NULL; + masterPtrArray[x].used = false; + masterPtrArray[x].memoryFlags = 0; + masterPtrArray[x].size = 0; + } + + gFakeHandleError = noErr; +} + + +/* ----------------------------------------------------------------------------- + FakeMoreMasters: + Call this if you need more master pointers Called internally by + FakeNewHandle() when it runs out of master pointers. + + REVISIONS: + 98-08-30 UK Created. + ----------------------------------------------------------------------------- */ + +void FakeMoreMasters() +{ + long x; + MasterPointer* vMPtrBlock; + MasterPointer* vCurrBlock; + + // Make a new master pointer block: + vMPtrBlock = malloc( MASTERPOINTER_CHUNK_SIZE *sizeof(MasterPointer) ); + if( vMPtrBlock == NULL ) + { + gFakeHandleError = memFulErr; + return; + } + + // Clear it: + for( x = 0; x < MASTERPOINTER_CHUNK_SIZE; x++ ) + { + vMPtrBlock[x].actualPointer = NULL; + vMPtrBlock[x].used = false; + vMPtrBlock[x].memoryFlags = 0; + vMPtrBlock[x].size = 0; + } + + // Find last master pointer in last master pointer block: + vCurrBlock = gMasterPointers; + while( vCurrBlock[MASTERPOINTER_CHUNK_SIZE -1].used == true ) + vCurrBlock = (MasterPointer*) vCurrBlock[MASTERPOINTER_CHUNK_SIZE-1].actualPointer; + + // Make this last master pointer point to our new block: + vCurrBlock[MASTERPOINTER_CHUNK_SIZE-1].actualPointer = (char*) vMPtrBlock; + vCurrBlock[MASTERPOINTER_CHUNK_SIZE-1].used = true; + vMPtrBlock[MASTERPOINTER_CHUNK_SIZE-1].size = MASTERPOINTER_CHUNK_SIZE *sizeof(MasterPointer); + + gFakeHandleError = noErr; +} + + +Handle FakeNewEmptyHandle() +{ + Handle theHandle = NULL; + long x; + MasterPointer* vCurrBlock = gMasterPointers; + bool notFound = true; + + gFakeHandleError = noErr; + + while( notFound ) + { + for( x = 0; x < (MASTERPOINTER_CHUNK_SIZE-1); x++ ) + { + if( !(vCurrBlock[x].used) ) + { + vCurrBlock[x].used = true; + vCurrBlock[x].memoryFlags = 0; + vCurrBlock[x].size = 0; + + theHandle = (Handle) &(vCurrBlock[x]); + notFound = false; + break; + } + } + + if( !vCurrBlock[MASTERPOINTER_CHUNK_SIZE-1].used ) // Last is unused? We need a new master pointer block! + { + FakeMoreMasters(); + if( !vCurrBlock[MASTERPOINTER_CHUNK_SIZE-1].used ) // No new block added?! + notFound = false; // Terminate, it's very likely an error occurred. + } + vCurrBlock = (MasterPointer*) vCurrBlock[MASTERPOINTER_CHUNK_SIZE-1].actualPointer; // Go next master pointer block. + } + + return theHandle; +} + + +/* ----------------------------------------------------------------------------- + NewHandle: + Create a new Handle. This creates a new entry in the Master Ptr array and + allocates memory of the specified size for it. Then it returns a Ptr to + this entry. + + Returns NULL if not successful. If MemError() is noErr upon a NULL return + value, we are out of master pointers. + + REVISIONS: + 2001-02-16 UK Added support for error codes. + 1998-08-30 UK Created. + ----------------------------------------------------------------------------- */ + +Handle FakeNewHandle( long theSize ) +{ + MasterPointer * theHandle = (MasterPointer*) FakeNewEmptyHandle(); + + theHandle->actualPointer = malloc( theSize ); + if( theHandle->actualPointer == NULL ) + { + FakeDisposeHandle( (Handle) theHandle ); + gFakeHandleError = memFulErr; + } + else + theHandle->size = theSize; + + return (Handle)theHandle; +} + + +/* ----------------------------------------------------------------------------- + DisposeHandle: + Dispose an existing Handle. Only call this once or you might kill valid + memory or worse. + + This frees the memory we use and marks the entry for the specified Handle + as unused. + + REVISIONS: + 1998-08-30 UK Created. + ----------------------------------------------------------------------------- */ + +void FakeDisposeHandle( Handle theHand ) +{ + MasterPointer* theEntry = (MasterPointer*) theHand; + + if( theEntry->actualPointer ) + free( theEntry->actualPointer ); + theEntry->used = false; + theEntry->actualPointer = NULL; + theEntry->memoryFlags = 0; + theEntry->size = 0; +} + + +void FakeEmptyHandle( Handle theHand ) +{ + MasterPointer* theEntry = (MasterPointer*) theHand; + + if( theEntry->actualPointer ) + free( theEntry->actualPointer ); + theEntry->actualPointer = NULL; +} + + +/* ----------------------------------------------------------------------------- + GetHandleSize: + Return the size of an existing Handle. This simply examines the "size" + field of the Handle's entry. + + REVISIONS: + 1998-08-30 UK Created. + ----------------------------------------------------------------------------- */ + +long FakeGetHandleSize( Handle theHand ) +{ + MasterPointer* theEntry = (MasterPointer*) theHand; + + gFakeHandleError = noErr; + + return( theEntry->size ); +} + + +/* ----------------------------------------------------------------------------- + SetHandleSize: + Change the size of an existing Handle. This reallocates the Handle (keeping + its data) and updates the size field of the Handle's entry accordingly. + + REVISIONS: + 1998-08-30 UK Created. + ----------------------------------------------------------------------------- */ + +void FakeSetHandleSize( Handle theHand, long theSize ) +{ + MasterPointer* theEntry = (MasterPointer*) theHand; + char* thePtr; + + thePtr = theEntry->actualPointer; + thePtr = realloc( thePtr, theSize ); + + if( thePtr ) + { + theEntry->actualPointer = thePtr; + theEntry->size = theSize; + gFakeHandleError = noErr; + } + else + gFakeHandleError = memFulErr; +} + + + + + + + + + + + + diff --git a/macosx/ReClassicfication/FakeHandles.h b/macosx/ReClassicfication/FakeHandles.h new file mode 100755 index 00000000..35c0014f --- /dev/null +++ b/macosx/ReClassicfication/FakeHandles.h @@ -0,0 +1,114 @@ +/* =========================================================================== + + PROJECT: FakeHandles + + FILE: FakeHandles.h + + PURPOSE: Simulate Handles on machines which only have ANSI-C to easily + port some of the more simple Macintosh code fragments to other + platforms. + + (C) Copyright 1998 by Uli Kusterer, all rights reserved. + + DIRECTIONS: + A Handle is a memory block that remembers its size automatically. + To the user, a Handle is simply a pointer to a pointer to the actual + data. Dereference it twice to get at the actual data. Before you + pass a once-dereferenced Handle to any other functions, you need to + call HLock() on it to avoid that it moves. Call HUnlock() when you + are finished with that. + To create a Handle, use NewHandle(). To free a Handle, call + DisposeHandle(). To resize use SetHandleSize() (the Handle itself + will not change, but the pointer to the actual data may change), + GetHandleSize() returns the actual size of the Handle. + Before making any of these calls, you *must have* called + InitHandles(). + + ======================================================================== */ + +#ifndef FAKEHANDLES_H +#define FAKEHANDLES_H + +#pragma mark [Headers] + + +// ----------------------------------------------------------------------------- +// Headers: +// ----------------------------------------------------------------------------- + +#include +#include +#include + + +// ----------------------------------------------------------------------------- +// Constants: +// ----------------------------------------------------------------------------- + +#ifndef NULL + #define NULL 0L +#endif + +#define MASTERPOINTER_CHUNK_SIZE 1024 // Size of blocks of master pointers we allocate in one go. + + +// Error codes MemError() may return after Handle calls: +enum +{ +#ifndef __MACTYPES__ + noErr = 0, // No error, success. +#endif /* __MACTYPES__ */ + memFulErr = -108 // Out of memory error. +}; + + +// ----------------------------------------------------------------------------- +// Data Types: +// ----------------------------------------------------------------------------- + +// Data types special to Mac: + +typedef char** Handle; +#ifndef __MACTYPES__ +typedef unsigned char Boolean; +#endif /* __MACTYPES__ */ + + +// Private data structure used internally to keep track of Handles: +typedef struct MasterPointer +{ + char* actualPointer; // The actual Pointer we're pointing to. + Boolean used; // Is this master Ptr being used? + long memoryFlags; // Some flags for this Handle. + long size; // The size of this Handle. +} MasterPointer; + +// ----------------------------------------------------------------------------- +// Globals: +// ----------------------------------------------------------------------------- + +extern MasterPointer gMasterPointers[MASTERPOINTER_CHUNK_SIZE]; +extern long gFakeHandleError; + + +// ----------------------------------------------------------------------------- +// Prototypes: +// ----------------------------------------------------------------------------- + +extern void FakeInitHandles( MasterPointer* masterPtrArray ); +extern Handle FakeNewHandle( long theSize ); +extern void FakeDisposeHandle( Handle theHand ); +extern long FakeGetHandleSize( Handle theHand ); +extern void FakeSetHandleSize( Handle theHand, long theSize ); +extern void FakeMoreMasters( void ); +extern Handle FakeNewEmptyHandle(); +extern void FakeEmptyHandle( Handle theHand ); + + + + + + + + +#endif /*FAKEHANDLES_H*/ diff --git a/macosx/ReClassicfication/FakeResources.c b/macosx/ReClassicfication/FakeResources.c new file mode 100755 index 00000000..0006fb91 --- /dev/null +++ b/macosx/ReClassicfication/FakeResources.c @@ -0,0 +1,1127 @@ +// +// FakeResources.c +// ReClassicfication +// +// Created by Uli Kusterer on 20.02.13. +// Copyright (c) 2013 Uli Kusterer. All rights reserved. +// + +#include +#include // for memmove(). +#include +#include "FakeResources.h" +#include "EndianStuff.h" + + +// Turn this on if you want to read actual Mac resource forks on a Mac or Darwin +// but using the ANSI file APIs (uses Apple's "/..namedfork/rsrc" trick). +#define READ_REAL_RESOURCE_FORKS 1 + + +/* + resource data offset 4 bytes + resource map offset 4 bytes + resource data length 4 bytes + resource map length 4 bytes + Reserved for system use 112 bytes + Application data 128 bytes + resource data ... + resource map ... + + + Resource data is 4-byte-long-counted, followed by actual data. + + + Resource map: + + copy of resource header in RAM 16 bytes + next resource map in RAM 4 bytes + file reference number in RAM 2 bytes + Resource file attributes 2 bytes + type list offset (resource map-relative) 2 bytes + name list offset (resource map-relative) 2 bytes +*/ + +struct FakeResourceMap +{ + struct FakeResourceMap* nextResourceMap; + bool dirty; // per-file tracking of whether FakeUpdateResFile() needs to write + FILE* fileDescriptor; + int16_t fileRefNum; + uint16_t resFileAttributes; + uint16_t numTypes; + struct FakeTypeListEntry* typeList; +}; + +/* + Type list: + + number of types (-1) 2 bytes + resource type 4 bytes + number of resources (-1) 2 bytes + offset to reference list (type list relative) 2 bytes +*/ + +struct FakeTypeListEntry +{ + uint32_t resourceType; + uint16_t numberOfResourcesOfType; // -1 + struct FakeReferenceListEntry* resourceList; +}; + +/* + Reference list: + + resource ID 2 bytes + resource name offset (relative to resource name list) 2 bytes + resource attributes 1 byte + resource data offset (resource data relative) 3 bytes + handle to resource in RAM 4 bytes +*/ + +struct FakeReferenceListEntry +{ + int16_t resourceID; + uint8_t resourceAttributes; + Handle resourceHandle; + char resourceName[257]; // 257 = 1 Pascal length byte, 255 characters for actual string, 1 byte for C terminator \0. +}; + +/* + Resource names are stored as byte-counted strings. (I.e. packed P-Strings) + Look-up by name is case-insensitive but case-preserving and diacritic-sensitive. +*/ + + +struct FakeResourceMap * gResourceMap = NULL; // Linked list. +struct FakeResourceMap * gCurrResourceMap = NULL; // Start search of map here. +int16_t gFileRefNumSeed = 0; +int16_t gFakeResError = noErr; +struct FakeTypeCountEntry* gLoadedTypes = NULL; +int16_t gNumLoadedTypes = 0; + + +struct FakeTypeCountEntry +{ + uint32_t type; + int16_t retainCount; +}; + + +size_t FakeFWriteUInt32BE( uint32_t inInt, FILE* theFile ) +{ + inInt = BIG_ENDIAN_32(inInt); + return fwrite( &inInt, sizeof(inInt), 1, theFile ); +} + + +size_t FakeFWriteInt16BE( int16_t inInt, FILE* theFile ) +{ + inInt = BIG_ENDIAN_16(inInt); + return fwrite( &inInt, sizeof(inInt), 1, theFile ); +} + + +size_t FakeFWriteUInt16BE( uint16_t inInt, FILE* theFile ) +{ + inInt = BIG_ENDIAN_16(inInt); + return fwrite( &inInt, sizeof(inInt), 1, theFile ); +} + + +void FakeFSeek( FILE* inFile, long inOffset, int inMode ) +{ + int theResult = fseek( inFile, inOffset, inMode ); + if( theResult != 0 ) + printf( "Seek to %ld result %d\n", inOffset, theResult ); +} + + +int16_t FakeResError() +{ + return gFakeResError; +} + + +// To be able to iterate types across files without duplicates, we build a list +// of all types in open files and keep track of how many files contain each type +// by "retaining" each type and "releasing" it when a file closes. +void FakeRetainType( uint32_t resType ) +{ + if( gLoadedTypes == NULL ) + { + gLoadedTypes = malloc( sizeof(struct FakeTypeCountEntry) ); + gLoadedTypes[0].type = resType; + gLoadedTypes[0].retainCount = 1; + } + + for( int x = 0; x < gNumLoadedTypes; x++ ) + { + if( gLoadedTypes[x].type == resType ) + { + gLoadedTypes[x].retainCount++; + return; + } + } + + gNumLoadedTypes++; + gLoadedTypes = realloc( gLoadedTypes, gNumLoadedTypes * sizeof(struct FakeTypeCountEntry) ); + gLoadedTypes[gNumLoadedTypes -1].type = resType; + gLoadedTypes[gNumLoadedTypes -1].retainCount = 1; +} + + +// The converse of FakeRetainType (see for more info): +void FakeReleaseType( uint32_t resType ) +{ + for( int x = 0; x < gNumLoadedTypes; x++ ) + { + if( gLoadedTypes[x].type == resType ) + { + gLoadedTypes[x].retainCount--; + if( gLoadedTypes[x].retainCount == 0 ) + { + gNumLoadedTypes--; + if( gNumLoadedTypes > 0 ) + gLoadedTypes[x] = gLoadedTypes[gNumLoadedTypes]; + } + break; + } + } +} + + +struct FakeResourceMap* FakeFindResourceMap( int16_t inFileRefNum, struct FakeResourceMap*** outPrevMapPtr ) +{ + struct FakeResourceMap* currMap = gResourceMap; + if( outPrevMapPtr ) + *outPrevMapPtr = &gResourceMap; + + while( currMap != NULL && currMap->fileRefNum != inFileRefNum ) + { + if( outPrevMapPtr ) + *outPrevMapPtr = &currMap->nextResourceMap; + currMap = currMap->nextResourceMap; + } + return currMap; +} + + +struct FakeResourceMap* FakeResFileOpen( const char* inPath, const char* inMode ) +{ + FILE * theFile = fopen( inPath, inMode ); + if( !theFile ) + { + gFakeResError = fnfErr; + return NULL; + } + + uint32_t resourceDataOffset = 0; + uint32_t resourceMapOffset = 0; + uint32_t lengthOfResourceData = 0; + uint32_t lengthOfResourceMap = 0; + + struct FakeResourceMap * newMap = calloc( 1, sizeof(struct FakeResourceMap) ); + newMap->fileDescriptor = theFile; + newMap->fileRefNum = gFileRefNumSeed++; + + if( fread( &resourceDataOffset, 1, sizeof(resourceDataOffset), theFile ) != sizeof(resourceDataOffset) ) + { + gFakeResError = eofErr; + free( newMap ); + newMap = NULL; + return NULL; + } + resourceDataOffset = BIG_ENDIAN_32(resourceDataOffset); + printf("resourceDataOffset %d\n", resourceDataOffset); + + if( fread( &resourceMapOffset, 1, sizeof(resourceMapOffset), theFile ) != sizeof(resourceMapOffset) ) + { + gFakeResError = eofErr; + free( newMap ); + newMap = NULL; + return NULL; + } + resourceMapOffset = BIG_ENDIAN_32(resourceMapOffset); + printf("resourceMapOffset %d\n", resourceMapOffset); + + if( fread( &lengthOfResourceData, 1, sizeof(lengthOfResourceData), theFile ) != sizeof(lengthOfResourceData) ) + { + gFakeResError = eofErr; + free( newMap ); + newMap = NULL; + return NULL; + } + lengthOfResourceData = BIG_ENDIAN_32(lengthOfResourceData); + + if( fread( &lengthOfResourceMap, 1, sizeof(lengthOfResourceMap), theFile ) != sizeof(lengthOfResourceMap) ) + { + gFakeResError = eofErr; + free( newMap ); + newMap = NULL; + return NULL; + } + lengthOfResourceMap = BIG_ENDIAN_32(lengthOfResourceMap); + + FakeFSeek( theFile, 112, SEEK_CUR ); // Skip system data. + FakeFSeek( theFile, 128, SEEK_CUR ); // Skip application data. + + FakeFSeek( theFile, resourceMapOffset, SEEK_SET ); + FakeFSeek( theFile, 16, SEEK_CUR ); // Skip resource file header copy. + FakeFSeek( theFile, 4, SEEK_CUR ); // Skip next resource map placeholder. + FakeFSeek( theFile, 2, SEEK_CUR ); // Skip file ref num placeholder. + fread( &newMap->resFileAttributes, 1, sizeof(uint16_t), theFile ); // Read file attributes. + newMap->resFileAttributes = BIG_ENDIAN_16(newMap->resFileAttributes); + printf("resFileAttributes %d\n", newMap->resFileAttributes); + + uint16_t typeListOffset = 0; + uint16_t nameListOffset = 0; + + fread( &typeListOffset, 1, sizeof(typeListOffset), theFile ); + typeListOffset = BIG_ENDIAN_16(typeListOffset); + fread( &nameListOffset, 1, sizeof(nameListOffset), theFile ); + nameListOffset = BIG_ENDIAN_16(nameListOffset); + + long typeListSeekPos = resourceMapOffset +(long)typeListOffset; + printf("typeListSeekPos %ld\n", typeListSeekPos); + FakeFSeek( theFile, typeListSeekPos, SEEK_SET ); + + uint16_t numTypes = 0; + fread( &numTypes, 1, sizeof(numTypes), theFile ); + numTypes = BIG_ENDIAN_16(numTypes) +1; + printf("numTypes %d\n", numTypes); + + newMap->typeList = calloc( ((int)numTypes), sizeof(struct FakeTypeListEntry) ); + newMap->numTypes = numTypes; + for( int x = 0; x < ((int)numTypes); x++ ) + { + uint32_t currType = 0; + fread( &currType, 1, sizeof(uint32_t), theFile ); // Read type code (4CC). + char typeStr[5] = {0}; + memmove( typeStr, &currType, 4 ); + printf( "currType '%s'\n", typeStr ); + currType = BIG_ENDIAN_32( currType ); + newMap->typeList[x].resourceType = currType; + + FakeRetainType( currType ); + + uint16_t numResources = 0; + fread( &numResources, 1, sizeof(numResources), theFile ); + numResources = BIG_ENDIAN_16(numResources); + printf("\tnumResources %d\n", numResources +1); + + uint16_t refListOffset = 0; + fread( &refListOffset, 1, sizeof(refListOffset), theFile ); + refListOffset = BIG_ENDIAN_16(refListOffset); + + long oldOffset = ftell(theFile); + + long refListSeekPos = typeListSeekPos +(long)refListOffset; + printf("\trefListSeekPos %ld\n", refListSeekPos); + FakeFSeek( theFile, refListSeekPos, SEEK_SET ); + + newMap->typeList[x].resourceList = calloc( ((int)numResources) +1, sizeof(struct FakeReferenceListEntry) ); + newMap->typeList[x].numberOfResourcesOfType = ((int)numResources) +1; + for( int y = 0; y < ((int)numResources) +1; y++ ) + { + fread( &newMap->typeList[x].resourceList[y].resourceID, 1, sizeof(uint16_t), theFile ); + newMap->typeList[x].resourceList[y].resourceID = BIG_ENDIAN_16(newMap->typeList[x].resourceList[y].resourceID); + + uint16_t nameOffset = 0; + fread( &nameOffset, 1, sizeof(nameOffset), theFile ); + nameOffset = BIG_ENDIAN_16(nameOffset); + + unsigned char attributesAndDataOffset[4]; + uint32_t dataOffset = 0; + fread( &attributesAndDataOffset, 1, sizeof(attributesAndDataOffset), theFile ); + newMap->typeList[x].resourceList[y].resourceAttributes = attributesAndDataOffset[0]; + memmove( ((char*)&dataOffset) +1, attributesAndDataOffset +1, 3 ); + dataOffset = BIG_ENDIAN_32(dataOffset); + FakeFSeek( theFile, 4, SEEK_CUR ); // Skip resource Handle placeholder. + + long innerOldOffset = ftell(theFile); + long dataSeekPos = resourceDataOffset +(long)dataOffset; + FakeFSeek( theFile, dataSeekPos, SEEK_SET ); + uint32_t dataLength = 0; + fread( &dataLength, 1, sizeof(dataLength), theFile ); + dataLength = BIG_ENDIAN_32(dataLength); + newMap->typeList[x].resourceList[y].resourceHandle = FakeNewHandle(dataLength); + fread( (*newMap->typeList[x].resourceList[y].resourceHandle), 1, dataLength, theFile ); + + if( -1 != (long)nameOffset ) + { + long nameSeekPos = resourceMapOffset +(long)nameListOffset +(long)nameOffset; + FakeFSeek( theFile, nameSeekPos, SEEK_SET ); + uint8_t nameLength = 0; + fread( &nameLength, 1, sizeof(nameLength), theFile ); + newMap->typeList[x].resourceList[y].resourceName[0] = nameLength; + if( nameLength > 0 ) + fread( newMap->typeList[x].resourceList[y].resourceName +1, 1, nameLength, theFile ); + } + + printf( "\t%d: \"%s\"\n", newMap->typeList[x].resourceList[y].resourceID, newMap->typeList[x].resourceList[y].resourceName +1 ); + + FakeFSeek( theFile, innerOldOffset, SEEK_SET ); + } + + FakeFSeek( theFile, oldOffset, SEEK_SET ); + } + + newMap->nextResourceMap = gResourceMap; + gResourceMap = newMap; + gFakeResError = noErr; + + gCurrResourceMap = gResourceMap; + + return newMap; +} + + +int16_t FakeOpenResFile( const unsigned char* inPath ) +{ +#if READ_REAL_RESOURCE_FORKS + const char* resForkSuffix = "/..namedfork/rsrc"; +#endif // READ_REAL_RESOURCE_FORKS + char thePath[256 +17] = {0}; + memmove(thePath,inPath +1,inPath[0]); +#if READ_REAL_RESOURCE_FORKS + memmove(thePath +inPath[0],resForkSuffix,17); +#endif // READ_REAL_RESOURCE_FORKS + struct FakeResourceMap* theMap = FakeResFileOpen( thePath, "r+" ); + if( !theMap ) + theMap = FakeResFileOpen( thePath, "r" ); + if( theMap ) + return theMap->fileRefNum; + else + return gFakeResError; +} + + +static bool FakeFindResourceHandleInMap( Handle theResource, struct FakeTypeListEntry** outTypeEntry, struct FakeReferenceListEntry** outRefEntry, struct FakeResourceMap* inMap ) +{ + if( (theResource != NULL) && (inMap != NULL) ) + { + for( int x = 0; x < inMap->numTypes; x++ ) + { + for( int y = 0; y < inMap->typeList[x].numberOfResourcesOfType; y++ ) + { + if( inMap->typeList[x].resourceList[y].resourceHandle == theResource ) + { + if (outTypeEntry) + { + *outTypeEntry = &inMap->typeList[x]; + } + + if (outRefEntry) + { + *outRefEntry = &inMap->typeList[x].resourceList[y]; + } + + return true; + } + } + } + } + + if (outTypeEntry) + { + *outTypeEntry = NULL; + } + + if (outRefEntry) + { + *outRefEntry = NULL; + } + + return false; +} + + +static bool FakeFindResourceHandle( Handle theResource, struct FakeResourceMap** outMap, struct FakeTypeListEntry** outTypeEntry, struct FakeReferenceListEntry** outRefEntry ) +{ + struct FakeResourceMap* currMap = gResourceMap; + while( currMap != NULL ) + { + if( FakeFindResourceHandleInMap(theResource, outTypeEntry, outRefEntry, currMap) ) + { + if( outMap ) + { + *outMap = currMap; + } + return true; + } + + currMap = currMap->nextResourceMap; + } + + if ( outMap ) + { + *outMap = NULL; + } + + if (outTypeEntry) + { + *outTypeEntry = NULL; + } + + if (outRefEntry) + { + *outRefEntry = NULL; + } + + return false; +} + + +static struct FakeTypeListEntry* FakeFindTypeListEntry(struct FakeResourceMap* inMap, uint32_t theType) +{ + if( inMap != NULL ) + { + for( int x = 0; x < inMap->numTypes; x++ ) + { + if( inMap->typeList[x].resourceType == theType ) + { + return &inMap->typeList[x]; + } + } + } + + return NULL; +} + +int16_t FakeHomeResFile( Handle theResource ) +{ + struct FakeResourceMap* currMap = NULL; + + if( FakeFindResourceHandle( theResource, &currMap, NULL, NULL) ) + { + gFakeResError = noErr; + return currMap->fileRefNum; + } + + gFakeResError = resNotFound; + return -1; +} + + +void FakeUpdateResFile( int16_t inFileRefNum ) +{ + const long kResourceHeaderLength = 16; + const long kResourceHeaderMapOffsetPos = 4; + const long kResourceHeaderMapLengthPos = 4 + 4 + 4; + const long kResourceHeaderReservedLength = 112; + const long kResourceHeaderAppReservedLength = 128; + const long kReservedHeaderLength = kResourceHeaderReservedLength + kResourceHeaderAppReservedLength; + const long kResourceDataSizeLength = 4; + const long kResourceMapNextHandleLength = 4; + const long kResourceMapFileRefLength = 2; + const long kResourceMapTypeListOffsetLength = 2; + const long kResourceMapNameListOffsetLength = 2; + const long kResourceMapNumTypesLength = 2; + const long kResourceRefLength = 2 + 2 + 1 + 3 + 4; + const long kResourceTypeLength = 4 + 2 + 2; + + struct FakeResourceMap* currMap = FakeFindResourceMap( inFileRefNum, NULL ); + long headerLength = kResourceHeaderLength + kReservedHeaderLength; + uint32_t resMapOffset = 0; + long refListSize = 0; + + if (!currMap->dirty) + return; + + // Write header: + FakeFSeek( currMap->fileDescriptor, 0, SEEK_SET ); + uint32_t resDataOffset = (uint32_t)headerLength; + FakeFWriteUInt32BE( resDataOffset, currMap->fileDescriptor ); + FakeFWriteUInt32BE( 0, currMap->fileDescriptor ); // placeholder offset to resource map + FakeFWriteUInt32BE( 0, currMap->fileDescriptor ); // placeholder resource data length + FakeFWriteUInt32BE( 0, currMap->fileDescriptor ); // placeholder resource map length + + // reserved + for( int x = 0; x < (kResourceHeaderReservedLength / sizeof(uint32_t)); x++ ) + FakeFWriteUInt32BE( 0, currMap->fileDescriptor ); + for( int x = 0; x < (kResourceHeaderAppReservedLength / sizeof(uint32_t)); x++ ) + FakeFWriteUInt32BE( 0, currMap->fileDescriptor ); + + resMapOffset = (uint32_t)headerLength; + + // Write out data for each resource and calculate space needed: + for( int x = 0; x < currMap->numTypes; x++ ) + { + for( int y = 0; y < currMap->typeList[x].numberOfResourcesOfType; y++ ) + { + uint32_t theSize = (uint32_t)FakeGetHandleSize( currMap->typeList[x].resourceList[y].resourceHandle ); + FakeFWriteUInt32BE( theSize, currMap->fileDescriptor ); + resMapOffset += sizeof(theSize); + fwrite( *currMap->typeList[x].resourceList[y].resourceHandle, 1, theSize, currMap->fileDescriptor ); + resMapOffset += theSize; + } + + refListSize += currMap->typeList[x].numberOfResourcesOfType * kResourceRefLength; + } + + // Write out what we know into the header now: + FakeFSeek( currMap->fileDescriptor, kResourceHeaderMapOffsetPos, SEEK_SET ); + FakeFWriteUInt32BE( resMapOffset, currMap->fileDescriptor ); + uint32_t resDataLength = resMapOffset -(uint32_t)headerLength; + FakeFWriteUInt32BE( resDataLength, currMap->fileDescriptor ); + + // Start writing resource map after data: + uint32_t resMapLength = 0; + FakeFSeek( currMap->fileDescriptor, resMapOffset, SEEK_SET ); + + // Copy what we know from the resource header + FakeFWriteUInt32BE( resDataOffset, currMap->fileDescriptor ); + FakeFWriteUInt32BE( resMapOffset, currMap->fileDescriptor ); + FakeFWriteUInt32BE( resDataLength, currMap->fileDescriptor ); + FakeFWriteUInt32BE( 0, currMap->fileDescriptor ); // Placeholder + + // Fake a next handle + FakeFWriteUInt32BE( 0, currMap->fileDescriptor ); + + resMapLength += kResourceHeaderLength + kResourceMapNextHandleLength + kResourceMapFileRefLength; // reserved: copy of resource header, next resource handle, file ref + FakeFWriteInt16BE( inFileRefNum, currMap->fileDescriptor ); + FakeFWriteUInt16BE( currMap->resFileAttributes, currMap->fileDescriptor ); + resMapLength += sizeof(uint16_t); + + uint16_t typeListOffset = ftell(currMap->fileDescriptor) + +kResourceMapTypeListOffsetLength +kResourceMapNameListOffsetLength -resMapOffset; + FakeFWriteUInt16BE( typeListOffset, currMap->fileDescriptor ); // Res map relative, points to the type count + long refListStartPosition = typeListOffset + kResourceMapNumTypesLength + currMap->numTypes * kResourceTypeLength; // Calc where we'll start to put resource lists (right after types). + + uint16_t nameListOffset = refListStartPosition +refListSize; // Calc where we'll start to put name lists (right after resource lists). + FakeFWriteUInt16BE( nameListOffset, currMap->fileDescriptor ); // Res map relative. + + // Now write type list and ref lists: + uint32_t nameListStartOffset = 0; + FakeFWriteUInt16BE( currMap->numTypes -1, currMap->fileDescriptor ); + uint32_t resDataCurrOffset = 0; // Keep track of where we wrote the associated data for each resource, relative to the start of resource data + + refListStartPosition = kResourceMapNumTypesLength + currMap->numTypes * kResourceTypeLength; // relative to beginning of resource type list + + for( int x = 0; x < currMap->numTypes; x++ ) + { + // Write entry for this type: + uint32_t currType = currMap->typeList[x].resourceType; + FakeFWriteUInt32BE( currType, currMap->fileDescriptor ); + + uint16_t numResources = currMap->typeList[x].numberOfResourcesOfType -1; + FakeFWriteUInt16BE( numResources, currMap->fileDescriptor ); + + uint16_t refListOffset = refListStartPosition; + FakeFWriteUInt16BE( refListOffset, currMap->fileDescriptor ); + + // Jump to ref list location and write ref list out: + long oldOffsetAfterPrevType = ftell(currMap->fileDescriptor); + + FakeFSeek( currMap->fileDescriptor, resMapOffset + typeListOffset + refListStartPosition, SEEK_SET ); + + for( int y = 0; y < currMap->typeList[x].numberOfResourcesOfType; y++ ) + { + FakeFWriteInt16BE( currMap->typeList[x].resourceList[y].resourceID, currMap->fileDescriptor ); + + // Write name to name table: + if( currMap->typeList[x].resourceList[y].resourceName[0] == 0 ) + FakeFWriteInt16BE( -1, currMap->fileDescriptor ); // Don't have a name, mark as -1. + else + { + FakeFWriteUInt16BE( nameListStartOffset, currMap->fileDescriptor ); // Associate name in name table with this. + + long oldOffsetAfterNameOffset = ftell( currMap->fileDescriptor ); + FakeFSeek( currMap->fileDescriptor, resMapOffset +nameListOffset +nameListStartOffset, SEEK_SET ); + fwrite( currMap->typeList[x].resourceList[y].resourceName, currMap->typeList[x].resourceList[y].resourceName[0] +1, sizeof(uint8_t), currMap->fileDescriptor ); + + long currMapLen = (ftell(currMap->fileDescriptor) -resMapOffset); + if( currMapLen > resMapLength ) + resMapLength = (uint32_t)currMapLen; + + FakeFSeek( currMap->fileDescriptor, oldOffsetAfterNameOffset, SEEK_SET ); + nameListStartOffset += currMap->typeList[x].resourceList[y].resourceName[0] +1; // Make sure we write next name *after* this one. + } + + fwrite( &currMap->typeList[x].resourceList[y].resourceAttributes, 1, sizeof(uint8_t), currMap->fileDescriptor ); + uint32_t resDataCurrOffsetBE = BIG_ENDIAN_32(resDataCurrOffset); + fwrite( ((uint8_t*)&resDataCurrOffsetBE) +1, 1, 3, currMap->fileDescriptor ); + resDataCurrOffset += kResourceDataSizeLength + FakeGetHandleSize(currMap->typeList[x].resourceList[y].resourceHandle); + FakeFWriteUInt32BE( 0, currMap->fileDescriptor ); // Handle placeholder. + + long currMapLen = (ftell(currMap->fileDescriptor) -resMapOffset); + if( currMapLen > resMapLength ) + resMapLength = (uint32_t)currMapLen; + } + + refListStartPosition += currMap->typeList[x].numberOfResourcesOfType * kResourceRefLength; + + // Jump back to after our type entry so we can write the next one: + FakeFSeek( currMap->fileDescriptor, oldOffsetAfterPrevType, SEEK_SET ); + } + + // Write res map length: + FakeFSeek( currMap->fileDescriptor, kResourceHeaderMapLengthPos, SEEK_SET ); + FakeFWriteUInt32BE( resMapLength, currMap->fileDescriptor ); + FakeFSeek( currMap->fileDescriptor, resMapOffset + kResourceHeaderMapLengthPos, SEEK_SET ); + FakeFWriteUInt32BE( resMapLength, currMap->fileDescriptor ); + + ftruncate(fileno(currMap->fileDescriptor), resMapOffset + resMapLength); + + currMap->dirty = false; +} + + +void FakeRedirectResFileToPath( int16_t inFileRefNum, const char* cPath ) +{ + struct FakeResourceMap** prevMapPtr = NULL; + struct FakeResourceMap* currMap = FakeFindResourceMap( inFileRefNum, &prevMapPtr ); + if( currMap ) + { + fclose( currMap->fileDescriptor ); + currMap->fileDescriptor = fopen( cPath, "w" ); + currMap->dirty = true; + } +} + + +void FakeCloseResFile( int16_t inFileRefNum ) +{ + struct FakeResourceMap** prevMapPtr = NULL; + struct FakeResourceMap* currMap = FakeFindResourceMap( inFileRefNum, &prevMapPtr ); + if( currMap ) + { + FakeUpdateResFile(inFileRefNum); + + *prevMapPtr = currMap->nextResourceMap; // Remove this from the linked list. + if( gCurrResourceMap == currMap ) + gCurrResourceMap = currMap->nextResourceMap; + + for( int x = 0; x < currMap->numTypes; x++ ) + { + FakeReleaseType( currMap->typeList[x].resourceType ); + + for( int y = 0; y < currMap->typeList[x].numberOfResourcesOfType; y++ ) + { + FakeDisposeHandle( currMap->typeList[x].resourceList[y].resourceHandle ); + } + free( currMap->typeList[x].resourceList ); + } + free( currMap->typeList ); + + fclose( currMap->fileDescriptor ); + free( currMap ); + } +} + + +Handle FakeGet1ResourceFromMap( uint32_t resType, int16_t resID, struct FakeResourceMap* inMap ) +{ + gFakeResError = noErr; + + if( inMap != NULL ) + { + for( int x = 0; x < inMap->numTypes; x++ ) + { + uint32_t currType = inMap->typeList[x].resourceType; + if( currType == resType ) + { + for( int y = 0; y < inMap->typeList[x].numberOfResourcesOfType; y++ ) + { + if( inMap->typeList[x].resourceList[y].resourceID == resID ) + { + return inMap->typeList[x].resourceList[y].resourceHandle; + } + } + break; + } + } + } + + gFakeResError = resNotFound; + + return NULL; +} + + +Handle FakeGet1Resource( uint32_t resType, int16_t resID ) +{ + return FakeGet1ResourceFromMap( resType, resID, gCurrResourceMap ); +} + + +Handle FakeGetResource( uint32_t resType, int16_t resID ) +{ + struct FakeResourceMap * currMap = gCurrResourceMap; + Handle theRes = NULL; + + while( theRes == NULL && currMap != NULL ) + { + theRes = FakeGet1ResourceFromMap( resType, resID, currMap ); + if( theRes != NULL ) + { + gFakeResError = noErr; + return theRes; + } + + currMap = currMap->nextResourceMap; + } + + gFakeResError = resNotFound; + + return NULL; +} + + +int16_t FakeCount1ResourcesInMap( uint32_t resType, struct FakeResourceMap* inMap ) +{ + gFakeResError = noErr; + + if( inMap != NULL ) + { + for( int x = 0; x < inMap->numTypes; x++ ) + { + uint32_t currType = inMap->typeList[x].resourceType; + if( currType == resType ) + return inMap->typeList[x].numberOfResourcesOfType; + } + } + + return 0; +} + + +int16_t FakeCount1TypesInMap( struct FakeResourceMap* inMap ) +{ + if( inMap == NULL ) + return 0; + + return inMap->numTypes; +} + + +int16_t FakeCount1Types() +{ + return FakeCount1TypesInMap( gCurrResourceMap ); +} + + +int16_t FakeCount1Resources( uint32_t resType ) +{ + return FakeCount1ResourcesInMap( resType, gCurrResourceMap ); +} + + +int16_t FakeCountResources( uint32_t resType ) +{ + int16_t numRes = 0; + struct FakeResourceMap* theMap = gCurrResourceMap; + + while( theMap ) + { + numRes += FakeCount1ResourcesInMap( resType, theMap ); + + theMap = theMap->nextResourceMap; + } + + return numRes; +} + + +int16_t FakeCountTypes() +{ + return gNumLoadedTypes; +} + + +int16_t FakeCurResFile() +{ + struct FakeResourceMap* currMap = gCurrResourceMap; + + if( !currMap ) + return 0; + + return currMap->fileRefNum; +} + +void FakeUseResFile( int16_t resRefNum ) +{ + struct FakeResourceMap* currMap = FakeFindResourceMap( resRefNum, NULL ); + if( !currMap ) + currMap = gResourceMap; + + gCurrResourceMap = currMap; +} + + +void FakeGet1IndType( uint32_t * resType, int16_t index ) +{ + if( resType == NULL ) + return; + + *resType = 0; + + struct FakeResourceMap* currMap = gCurrResourceMap; + if( (index <= 0) || (index > FakeCount1Types()) || !currMap ) + { + gFakeResError = resNotFound; + return; + } + + *resType = currMap->typeList[index-1].resourceType; + + gFakeResError = noErr; +} + +Handle FakeGet1IndResource( uint32_t resType, int16_t index ) +{ + struct FakeResourceMap* currMap = gCurrResourceMap; + + if( !currMap || (index <= 0) || (index > FakeCount1Resources(resType))) + { + gFakeResError = resNotFound; + } + + for( int x = 0; x < currMap->numTypes; x++ ) + { + uint32_t currType = currMap->typeList[x].resourceType; + if( currType == resType ) + { + gFakeResError = noErr; + return currMap->typeList[x].resourceList[index-1].resourceHandle; + } + } + + gFakeResError = resNotFound; + + return NULL; +} + +void FakeGetResInfo( Handle theResource, int16_t * theID, uint32_t * theType, FakeStr255 * name ) +{ + struct FakeTypeListEntry* typeEntry = NULL; + struct FakeReferenceListEntry* refEntry = NULL; + + + if( FakeFindResourceHandle(theResource, NULL, &typeEntry, &refEntry) ) + { + gFakeResError = noErr; + if( theID ) + { + *theID = refEntry->resourceID; + } + + if( theType ) + { + *theType = typeEntry->resourceType; + } + + if( name ) + { + memcpy(name, refEntry->resourceName, sizeof(FakeStr255)); + } + return; + } + + gFakeResError = resNotFound; +} + + +void FakeSetResInfo( Handle theResource, int16_t theID, FakeStr255 name ) +{ + struct FakeReferenceListEntry* refEntry = NULL; + + if( !theResource || !FakeFindResourceHandle( theResource, NULL, NULL, &refEntry) ) + { + gFakeResError = resNotFound; + return; + } + + if( (refEntry->resourceAttributes & resProtected) != 0 ) + { + gFakeResError = resAttrErr; + return; + } + + refEntry->resourceID = theID; + memcpy(refEntry->resourceName, name, sizeof(FakeStr255)); + + gFakeResError = noErr; +} + + +void FakeAddResource( Handle theData, uint32_t theType, int16_t theID, FakeStr255 name ) +{ + struct FakeResourceMap* currMap = gCurrResourceMap; + struct FakeTypeListEntry* typeEntry = NULL; + struct FakeReferenceListEntry* resourceEntry = NULL; + + // AddResource() only ensures that the handle is not a resource, but doesn't check whether the type/ID are already in use + if( !theData || FakeFindResourceHandleInMap( theData, &typeEntry, &resourceEntry, currMap ) ) + { + gFakeResError = addResFailed; + return; + } + + typeEntry = FakeFindTypeListEntry( currMap, theType ); + if( !typeEntry ) + { + currMap->numTypes++; + currMap->typeList = realloc(currMap->typeList, currMap->numTypes * sizeof(struct FakeTypeListEntry)); + + typeEntry = currMap->typeList + (currMap->numTypes - 1); + typeEntry->resourceType = theType; + typeEntry->numberOfResourcesOfType = 0; + typeEntry->resourceList = NULL; + + FakeRetainType(theType); + } + + typeEntry->numberOfResourcesOfType++; + + if( typeEntry->resourceList ) + { + typeEntry->resourceList = realloc( typeEntry->resourceList, typeEntry->numberOfResourcesOfType * sizeof(struct FakeReferenceListEntry) ); + } + else + { + typeEntry->resourceList = calloc(typeEntry->numberOfResourcesOfType, sizeof(struct FakeReferenceListEntry)); + } + + resourceEntry = typeEntry->resourceList + ( typeEntry->numberOfResourcesOfType - 1 ); + resourceEntry->resourceAttributes = 0; + resourceEntry->resourceID = theID; + memcpy(resourceEntry->resourceName, name, sizeof(FakeStr255)); + resourceEntry->resourceHandle = theData; + + currMap->dirty = true; + + gFakeResError = noErr; +} + +void FakeChangedResource( Handle theResource ) +{ + struct FakeResourceMap* theMap = NULL; + struct FakeReferenceListEntry* theEntry = NULL; + if( !FakeFindResourceHandle( theResource, &theMap, NULL, &theEntry ) ) + { + gFakeResError = resNotFound; + return; + } + + if( (theEntry->resourceAttributes & resProtected) == 0 ) + { + theMap->dirty = true; + gFakeResError = noErr; + } + else + { + gFakeResError = resAttrErr; + } +} + +// NOTE: you must call DisposeHandle(theResource) manually to release the memory. Normally, +// the Resource Manager will dispose the handle on update or file close, but this implementation +// does not track removed resource handles for later disposal. +void FakeRemoveResource( Handle theResource ) +{ + struct FakeResourceMap* currMap = gCurrResourceMap; + struct FakeTypeListEntry* typeEntry = NULL; + struct FakeReferenceListEntry* resEntry = NULL; + if( !currMap || !FakeFindResourceHandleInMap( theResource, &typeEntry, &resEntry, currMap ) || ((resEntry->resourceAttributes & resProtected) != 0) ) + { + gFakeResError = rmvResFailed; + return; + } + + struct FakeReferenceListEntry* nextResEntry = resEntry + 1; + int resourcesListSize = typeEntry->numberOfResourcesOfType * sizeof(struct FakeReferenceListEntry); + long nextResEntryOffset = (void*)nextResEntry - (void*)typeEntry->resourceList; + + typeEntry->numberOfResourcesOfType--; + + if( typeEntry->numberOfResourcesOfType > 0 ) + { + memcpy( resEntry, nextResEntry, resourcesListSize - nextResEntryOffset ); + typeEntry->resourceList = realloc( typeEntry->resourceList, resourcesListSize - sizeof(struct FakeReferenceListEntry) ); + } + else + { + // got rid of the last resource reference, release the memory + free(typeEntry->resourceList); + typeEntry->resourceList = NULL; + + // now remove the type entry + struct FakeTypeListEntry* nextTypeEntry = typeEntry + 1; + int typeListSize = currMap->numTypes * sizeof(struct FakeTypeListEntry); + long nextTypeEntryOffset = (void*)nextTypeEntry - (void*)currMap->typeList; + + currMap->numTypes--; + FakeReleaseType(typeEntry->resourceType); + + if( currMap->numTypes > 0 ) + { + memcpy( typeEntry, nextTypeEntry, typeListSize - nextTypeEntryOffset ); + currMap->typeList = realloc( currMap->typeList, typeListSize - sizeof(struct FakeTypeListEntry) ); + } + else + { + // got rid of the last type entry + free(currMap->typeList); + currMap->typeList = NULL; + } + } + + + currMap->dirty = true; + gFakeResError = noErr; +} + + +// NOTE: effectively a no-op since we don't have a way to write a resource without writing the whole map +void FakeWriteResource( Handle theResource ) +{ + struct FakeReferenceListEntry* resEntry = NULL; + if( !theResource || !FakeFindResourceHandle( theResource, NULL, NULL, &resEntry )) + { + gFakeResError = resNotFound; + } + else + { + gFakeResError = noErr; + } +} + +// NOTE: effectively a no-op since we don't have a way to load an individual resource from disk right now. +// All resources are already loaded at file open time. +void FakeLoadResource( Handle theResource ) +{ + struct FakeReferenceListEntry* resEntry = NULL; + if( !theResource || !FakeFindResourceHandle( theResource, NULL, NULL, &resEntry )) + { + gFakeResError = resNotFound; + } + else + { + gFakeResError = noErr; + } +} + +// NOTE: effectively a no-op since we don't have a way to reload a released resource from disk right now +void FakeReleaseResource( Handle theResource ) +{ + struct FakeReferenceListEntry* resEntry = NULL; + if( !theResource || !FakeFindResourceHandle( theResource, NULL, NULL, &resEntry )) + { + gFakeResError = resNotFound; + } + else + { + gFakeResError = noErr; + } +} + + +void FakeSetResLoad(bool load) +{ + // NOTE: a no-op since resources are always loaded at file open time +} + + + diff --git a/macosx/ReClassicfication/FakeResources.h b/macosx/ReClassicfication/FakeResources.h new file mode 100755 index 00000000..0792d503 --- /dev/null +++ b/macosx/ReClassicfication/FakeResources.h @@ -0,0 +1,84 @@ +// +// FakeResources.h +// ReClassicfication +// +// Created by Uli Kusterer on 21.02.13. +// Copyright (c) 2013 Uli Kusterer. All rights reserved. +// + +#ifndef ReClassicfication_FakeResources_h +#define ReClassicfication_FakeResources_h + + +#include "FakeHandles.h" + + +// Possible return values of FakeResError(): +#ifndef __MACERRORS__ +enum +{ + resNotFound = -192, + resFNotFound = -193, + addResFailed = -194, + rmvResFailed = -196, + resAttrErr = -198, + eofErr = -39, + fnfErr = -43 +}; +#endif /* __MACERRORS__ */ + + +#ifndef __RESOURCES__ +// Resource attribute bit flags: +enum +{ + resReserved = (1 << 0), // Apparently not yet used. + resChanged = (1 << 1), + resPreload = (1 << 2), + resProtected = (1 << 3), + resLocked = (1 << 4), + resPurgeable = (1 << 5), + resSysHeap = (1 << 6), + resReserved2 = (1 << 7) // Apparently not yet used. +}; +#endif + +typedef unsigned char FakeStr255[256]; + + +int16_t FakeOpenResFile( const unsigned char* inPath ); +void FakeCloseResFile( int16_t resRefNum ); +Handle FakeGet1Resource( uint32_t resType, int16_t resID ); +Handle FakeGetResource( uint32_t resType, int16_t resID ); +int16_t FakeCurResFile(); +void FakeUseResFile( int16_t resRefNum ); +void FakeUpdateResFile( int16_t inFileRefNum ); +int16_t FakeHomeResFile( Handle theResource ); +int16_t FakeCount1Types(); +int16_t FakeCount1Resources( uint32_t resType ); +int16_t FakeCountTypes(); +int16_t FakeCountResources( uint32_t resType ); + +void FakeGet1IndType( uint32_t * resType, int16_t index ); +Handle FakeGet1IndResource( uint32_t resType, int16_t index ); +void FakeGetResInfo( Handle theResource, int16_t * theID, uint32_t * theType, FakeStr255 * name ); +void FakeSetResInfo( Handle theResource, int16_t theID, FakeStr255 name ); +void FakeAddResource( Handle theData, uint32_t theType, int16_t theID, FakeStr255 name ); +void FakeChangedResource( Handle theResource ); +void FakeRemoveResource( Handle theResource ); +void FakeWriteResource( Handle theResource ); +void FakeLoadResource( Handle theResource ); +void FakeReleaseResource( Handle theResource ); +void FakeSetResLoad(bool load); + +int16_t FakeResError(); + + +// Private calls for internal use/tests: +void FakeRedirectResFileToPath( int16_t inFileRefNum, const char* cPath ); +struct FakeResourceMap* FakeResFileOpen( const char* inPath, const char* inMode ); +struct FakeResourceMap* FakeFindResourceMap( int16_t inFileRefNum, struct FakeResourceMap*** outPrevMapPtr ); +int16_t FakeCount1ResourcesInMap( uint32_t resType, struct FakeResourceMap* inMap ); +int16_t FakeCount1TypesInMap( struct FakeResourceMap* inMap ); + +#endif diff --git a/macosx/logo_defrost.png b/macosx/logo_defrost.png index 208704dd19196aa8290e5c668bc8853196cc572e..7bb36dfdc2e2529f7a1f8037b6d127128d160c5d 100644 GIT binary patch literal 52343 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

CLHhcQfOq?rH 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

2qk#ZfSy# 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 JPDHLkV1g7!V`cyV diff --git a/macosx/logo_freeze.png b/macosx/logo_freeze.png index 8d6eaa0bc981c268d3763ff669473c5cd0f7b2f2..7e3411237f722e0ef0502d7172c371db6d9ca243 100644 GIT binary patch literal 40180 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 literal 20720 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 11) current_selection -= 12; UpdateFreezeDefrostScreen(current_selection, image, draw, ctx); - while (KeyIsPressed(keys, gamepadButtons, 0, kRight) && (mach_absolute_time() < (startTime + repeatDelay))) - CopyPressedKeys(keys, gamepadButtons); + usleep(repeatDelay); + CopyPressedKeys(keys, gamepadButtons); } while (KeyIsPressed(keys, gamepadButtons, 0, kLeft)) @@ -1960,8 +2044,8 @@ int PromptFreezeDefrost (Boolean freezing) if (current_selection < 0) current_selection += 12; UpdateFreezeDefrostScreen(current_selection, image, draw, ctx); - while (KeyIsPressed(keys, gamepadButtons, 0, kLeft) && (mach_absolute_time() < (startTime + repeatDelay))) - CopyPressedKeys(keys, gamepadButtons); + usleep(repeatDelay); + CopyPressedKeys(keys, gamepadButtons); } while (KeyIsPressed(keys, gamepadButtons, 0, kDown)) @@ -1971,8 +2055,8 @@ int PromptFreezeDefrost (Boolean freezing) if (current_selection > 11) current_selection -= 12; UpdateFreezeDefrostScreen(current_selection, image, draw, ctx); - while (KeyIsPressed(keys, gamepadButtons, 0, kDown) && (mach_absolute_time() < (startTime + repeatDelay))) - CopyPressedKeys(keys, gamepadButtons); + usleep(repeatDelay); + CopyPressedKeys(keys, gamepadButtons); } while (KeyIsPressed(keys, gamepadButtons, 0, kUp)) @@ -1982,33 +2066,15 @@ int PromptFreezeDefrost (Boolean freezing) if (current_selection < 0) current_selection += 12; UpdateFreezeDefrostScreen(current_selection, image, draw, ctx); - while (KeyIsPressed(keys, gamepadButtons, 0, kUp) && (mach_absolute_time() < (startTime + repeatDelay))) - CopyPressedKeys(keys, gamepadButtons); + usleep(repeatDelay); + CopyPressedKeys(keys, gamepadButtons); } - while (KeyIsPressed(keys, gamepadButtons, 1, kA ) || - KeyIsPressed(keys, gamepadButtons, 2, kA ) || - KeyIsPressed(keys, gamepadButtons, 1, kB ) || - KeyIsPressed(keys, gamepadButtons, 2, kB ) || - KeyIsPressed(keys, gamepadButtons, 1, kX ) || - KeyIsPressed(keys, gamepadButtons, 2, kX ) || - KeyIsPressed(keys, gamepadButtons, 1, kY ) || - KeyIsPressed(keys, gamepadButtons, 2, kY ) || - KeyIsPressed(keys, gamepadButtons, 1, kStart ) || - KeyIsPressed(keys, gamepadButtons, 2, kStart ) || - KeyIsPressed(keys, gamepadButtons, 1, kSelect) || - KeyIsPressed(keys, gamepadButtons, 2, kSelect)) + while (ISpKeyIsPressed(keys, gamepadButtons, kISpEsc)) { - CopyPressedKeys(keys, gamepadButtons); - result = current_selection; - } - - while (ISpKeyIsPressed(keys, gamepadButtons, kISpEsc) || - KeyIsPressed(keys, gamepadButtons, 0, kStart) || - KeyIsPressed(keys, gamepadButtons, 1, kStart)) - { - CopyPressedKeys(keys, gamepadButtons); result = -1; + usleep(repeatDelay); + CopyPressedKeys(keys, gamepadButtons); } while (KeyIsPressed(keys, gamepadButtons, 0, kA) || @@ -2019,7 +2085,11 @@ int PromptFreezeDefrost (Boolean freezing) KeyIsPressed(keys, gamepadButtons, 1, kX) || KeyIsPressed(keys, gamepadButtons, 0, kY) || KeyIsPressed(keys, gamepadButtons, 1, kY)) + { result = current_selection; + usleep(repeatDelay); + CopyPressedKeys(keys, gamepadButtons); + } } usleep(30000); @@ -2051,14 +2121,14 @@ static void UpdateFreezeDefrostScreen (int newIndex, CGImageRef image, uint8 *dr if (newIndex >= 0 && newIndex < 12) { CGRect rct; - const int w = SNES_WIDTH << 1, h = kMacWindowHeight; + const int w = SNES_WIDTH << 1, h = SNES_HEIGHT << 1; CGContextSetLineWidth(ctx, 1.0f); rct = CGRectMake(0.0f, 0.0f, (float) w, (float) h); CGContextDrawImage(ctx, rct, image); - rct = CGRectMake(0.0f, (float) h - 238.0f, 128.0f, 120.0f); + rct = CGRectMake(0.0f, (float) h - 208.0f, 128.0f, 120.0f); rct = CGRectOffset(rct, (float) (128 * (newIndex % 4)), (float) (-120 * (newIndex / 4))); rct.size.width -= 1.0f; rct.size.height -= 1.0f; @@ -2545,7 +2615,7 @@ static void Initialize (void) Settings.Stereo = true; Settings.SoundPlaybackRate = 32000; Settings.SoundInputRate = 31950; - Settings.SupportHiRes = true; + Settings.SupportHiRes = false; Settings.Transparency = true; Settings.AutoDisplayMessages = true; Settings.InitialInfoStringTimeout = 120; @@ -2882,6 +2952,8 @@ void QuitWithFatalError ( NSString *message) } } + pressedRawKeyboardButtons[event.keyCode] = true; + os_unfair_lock_unlock(&keyLock); } @@ -2904,6 +2976,8 @@ void QuitWithFatalError ( NSString *message) } } + pressedRawKeyboardButtons[event.keyCode] = false; + os_unfair_lock_unlock(&keyLock); } diff --git a/macosx/mac-screenshot.mm b/macosx/mac-screenshot.mm index 02a6eea6..ae349979 100644 --- a/macosx/mac-screenshot.mm +++ b/macosx/mac-screenshot.mm @@ -31,6 +31,10 @@ #include "mac-render.h" #include "mac-screenshot.h" +extern "C" { +#include "FakeResources.h" +} + const char *extendedAttributeName = "com.snes9x.preview"; unsigned char *CGImageToPNGData (CGImageRef image, CFIndex *outLength); @@ -199,26 +203,79 @@ void DrawThumbnailFromExtendedAttribute (const char *path, CGContextRef ctx, CGR unsigned char *buffer = (unsigned char *)malloc(size); if (buffer != NULL) { - CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, buffer, size, NULL); + getxattr(path, extendedAttributeName, buffer, size, 0, 0); + NSData *data = [NSData dataWithBytes:buffer length:size]; if (data) { - CGImageSourceRef source = CGImageSourceCreateWithData(data, NULL); - if (source) - { - CGImageRef image = CGImageSourceCreateImageAtIndex(source, 0, NULL); - if (image) - { - CGContextDrawImage(ctx, bounds, image); - CGImageRelease(image); - } - } + NSImage *image = [[NSImage alloc] initWithData:data]; - CFRelease(data); + if (image) + { + CGContextDrawImage(ctx, bounds, [image CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil]); + } } free(buffer); } } + else + { + struct FakeResourceMap *resourceMap = FakeResFileOpen(std::string(std::string(path) + "/..namedfork/rsrc").c_str(), "r"); + if (resourceMap != NULL) + { + int16 fileNum = FakeCurResFile(); + Handle pict = FakeGet1Resource('PICT', 128); + if (pict) + { + Size size = FakeGetHandleSize(pict); + NSData *imageData = [NSData dataWithBytes:*pict length:size]; + + if (imageData) + { + NSImage *image = [[NSImage alloc] initWithData:imageData]; + + if (image) + { + CGContextDrawImage(ctx, bounds, [image CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil]); + } + } + } + else + { + pict = FakeGet1Resource('Thum', 128); + Size size = FakeGetHandleSize(pict); + NSData *imageData = [NSData dataWithBytes:*pict length:size]; + + if (imageData) + { + CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, (__bridge CFDataRef)imageData, size, NULL); + + if (provider) + { + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + + if (colorSpace) + { + CGImageRef image = CGImageCreate(128, 120, 5, 16, 256, colorSpace, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder16Big, provider, NULL, 0, kCGRenderingIntentDefault); + + if (image) + { + CGContextDrawImage(ctx, bounds, image); + CGImageRelease(image); + } + + CGColorSpaceRelease(colorSpace); + } + + CFRelease(provider); + } + } + } + + FakeCloseResFile(fileNum); + } + + } CGContextRestoreGState(ctx); } diff --git a/macosx/snes9x.xcodeproj/project.pbxproj b/macosx/snes9x.xcodeproj/project.pbxproj index e098095f..3fa6d545 100755 --- a/macosx/snes9x.xcodeproj/project.pbxproj +++ b/macosx/snes9x.xcodeproj/project.pbxproj @@ -54,6 +54,11 @@ 307C863322D29E29001B879E /* mac-stringtools.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB68804AC7FCE00A80003 /* mac-stringtools.mm */; }; 308092F72320B041006A2860 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 308092F62320B041006A2860 /* CoreGraphics.framework */; }; 308092F92320B06F006A2860 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 308092F82320B06F006A2860 /* Quartz.framework */; }; + 3082C4232378BCE80081CA7C /* FakeHandles.h in Headers */ = {isa = PBXBuildFile; fileRef = 3082C41E2378BCE80081CA7C /* FakeHandles.h */; }; + 3082C4242378BCE80081CA7C /* EndianStuff.h in Headers */ = {isa = PBXBuildFile; fileRef = 3082C41F2378BCE80081CA7C /* EndianStuff.h */; }; + 3082C4252378BCE80081CA7C /* FakeHandles.c in Sources */ = {isa = PBXBuildFile; fileRef = 3082C4202378BCE80081CA7C /* FakeHandles.c */; }; + 3082C4262378BCE80081CA7C /* FakeResources.c in Sources */ = {isa = PBXBuildFile; fileRef = 3082C4212378BCE80081CA7C /* FakeResources.c */; }; + 3082C4272378BCE80081CA7C /* FakeResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 3082C4222378BCE80081CA7C /* FakeResources.h */; }; 30D15CF322CE6B5A005BC352 /* snes9x_framework.h in Headers */ = {isa = PBXBuildFile; fileRef = 30D15CF122CE6B5A005BC352 /* snes9x_framework.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30D15CFC22CE6B74005BC352 /* sha256.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 85FEF90A20DDB18D00C038E9 /* sha256.cpp */; }; 30D15CFE22CE6B74005BC352 /* bml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 85FEF90620DDB15B00C038E9 /* bml.cpp */; }; @@ -257,6 +262,11 @@ 307C861C22D29DD2001B879E /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = System/Library/Frameworks/GLUT.framework; sourceTree = SDKROOT; }; 308092F62320B041006A2860 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 308092F82320B06F006A2860 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; + 3082C41E2378BCE80081CA7C /* FakeHandles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FakeHandles.h; sourceTree = ""; }; + 3082C41F2378BCE80081CA7C /* EndianStuff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EndianStuff.h; sourceTree = ""; }; + 3082C4202378BCE80081CA7C /* FakeHandles.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = FakeHandles.c; sourceTree = ""; }; + 3082C4212378BCE80081CA7C /* FakeResources.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = FakeResources.c; sourceTree = ""; }; + 3082C4222378BCE80081CA7C /* FakeResources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FakeResources.h; sourceTree = ""; }; 30AD1D1E22FBB2EA000EE989 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 30AD1D1F22FBB2EA000EE989 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 30AD1D2022FBB2EA000EE989 /* en */ = {isa = PBXFileReference; lastKnownFileType = folder; name = en; path = "en.lproj/Snes9x Help"; sourceTree = ""; }; @@ -549,6 +559,7 @@ 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */, 30D15CF022CE6B5A005BC352 /* snes9x framework */, 30714716230E379500917F82 /* Snes9x */, + 3082C41D2378BC280081CA7C /* ReClassicfication */, 195DF8C9FE9D4F0611CA2CBB /* Products */, 3045A1EB22D03C420092B97D /* Frameworks */, ); @@ -624,6 +635,18 @@ path = Snes9x; sourceTree = ""; }; + 3082C41D2378BC280081CA7C /* ReClassicfication */ = { + isa = PBXGroup; + children = ( + 3082C41F2378BCE80081CA7C /* EndianStuff.h */, + 3082C4202378BCE80081CA7C /* FakeHandles.c */, + 3082C41E2378BCE80081CA7C /* FakeHandles.h */, + 3082C4212378BCE80081CA7C /* FakeResources.c */, + 3082C4222378BCE80081CA7C /* FakeResources.h */, + ); + path = ReClassicfication; + sourceTree = ""; + }; 30D15CF022CE6B5A005BC352 /* snes9x framework */ = { isa = PBXGroup; children = ( @@ -966,6 +989,7 @@ 30D15DA122CE6BC9005BC352 /* debug.h in Headers */, 30D15DA222CE6BC9005BC352 /* display.h in Headers */, 30D15DA322CE6BC9005BC352 /* dma.h in Headers */, + 3082C4242378BCE80081CA7C /* EndianStuff.h in Headers */, 30D15DA422CE6BC9005BC352 /* dsp.h in Headers */, 30D15DA522CE6BC9005BC352 /* font.h in Headers */, 30D15DA622CE6BC9005BC352 /* fxemu.h in Headers */, @@ -977,6 +1001,7 @@ 30D15DAC22CE6BC9005BC352 /* memmap.h in Headers */, 30D15DAD22CE6BC9005BC352 /* messages.h in Headers */, 30D15DAE22CE6BC9005BC352 /* missing.h in Headers */, + 3082C4272378BCE80081CA7C /* FakeResources.h in Headers */, 30D15DAF22CE6BC9005BC352 /* movie.h in Headers */, 30D15DB022CE6BC9005BC352 /* msu1.h in Headers */, 30D15DB122CE6BC9005BC352 /* obc1.h in Headers */, @@ -996,6 +1021,7 @@ 30D15DC322CE6BC9005BC352 /* tile.h in Headers */, 30D15DC422CE6BC9005BC352 /* apu.h in Headers */, 30D15DC522CE6BC9005BC352 /* blargg_common.h in Headers */, + 3082C4232378BCE80081CA7C /* FakeHandles.h in Headers */, 30D15DC622CE6BC9005BC352 /* blargg_config.h in Headers */, 30D15DC722CE6BC9005BC352 /* blargg_endian.h in Headers */, 30D15DC822CE6BC9005BC352 /* blargg_source.h in Headers */, @@ -1197,6 +1223,7 @@ 30D15D3122CE6B74005BC352 /* cheats2.cpp in Sources */, 30D15D3222CE6B74005BC352 /* clip.cpp in Sources */, 30D15D3322CE6B74005BC352 /* controls.cpp in Sources */, + 3082C4262378BCE80081CA7C /* FakeResources.c in Sources */, 30D15D3422CE6B74005BC352 /* cpu.cpp in Sources */, 30D15D3522CE6B74005BC352 /* cpuexec.cpp in Sources */, 30D15D3622CE6B74005BC352 /* cpuops.cpp in Sources */, @@ -1205,6 +1232,7 @@ 30D15D3922CE6B74005BC352 /* dma.cpp in Sources */, 307C861222D27C53001B879E /* tileimpl-n1x1.cpp in Sources */, 30D15D3A22CE6B74005BC352 /* dsp.cpp in Sources */, + 3082C4252378BCE80081CA7C /* FakeHandles.c in Sources */, 30D15D3B22CE6B74005BC352 /* dsp1.cpp in Sources */, 307C861622D27C53001B879E /* tileimpl-n2x1.cpp in Sources */, 30D15D3C22CE6B74005BC352 /* dsp2.cpp in Sources */,