Subversion Repositories filter_foundry

Compare Revisions

Regard whitespace Rev 484 → Rev 485

/trunk/ff_misc.c
20,29 → 20,136
 
#include "ff.h"
 
BufferID newBuffer(size_t size) {
// TODO: If available, use new Buffer Suite ?
BufferID bid;
if (gpb->bufferProcs->numBufferProcs >= 8) {
gpb->bufferProcs->allocateProc64(size, &bid);
#include "PIBufferSuite.h"
 
// TODO: Also implement the handleSuite like this
 
FFBuffer newBuffer(size_t nBytes) {
PSBufferSuite1* pSBufferSuite32 = NULL;
PSBufferSuite2* pSBufferSuite64 = NULL;
 
FFBuffer ret;
 
if ((gpb->sSPBasic != 0) &&
(gpb->sSPBasic->AcquireSuite(kPSBufferSuite, kPSBufferSuiteVersion2, (const void**)&pSBufferSuite64) == noErr) &&
(pSBufferSuite64 != NULL) &&
(pSBufferSuite64 != (PSBufferSuite2*)gpb->bufferProcs /*Implementation mistake in old Photoshop versions! (see note below)*/)
)
{
// PICA Buffer Suite 2.0 (64 bit)
//
// Note: Windows Photoshop 7 and CS 2 (Other Photoshop versions were not tested) accept
// kPSBufferSuiteVersion2, but dont't correctly implement it:
// Instead of returning a pointer to a PSBufferSuite2 structure,
// they return the pointer RecordPtr->bufferProcs (structure BufferProcs)!
//
// 64-bit support for Windows was established in Photoshop CS 4,
// and PSBufferSuite2 was first documented in SDK CS 6.
//
// So, kPSBufferSuiteVersion2 probably was partially implemented as hidden "Work in progress" version
// before it was publicly documented.
// Side note: pb->bufferSpace64/pb->maxSpace64 was documented in SDK CC 2017.
// pb->bufferProcs->allocateProc64/spaceProc64 was documented in SDK CS 6.
unsigned32 siz = nBytes;
ret.signature = BUFVERSION_SUITE64;
ret.suite64 = (Ptr)pSBufferSuite64->New(&siz, siz);
if (siz < nBytes) {
ret.signature = BUFVERSION_NULL;
ret.suite64 = NULL;
}
else {
gpb->bufferProcs->allocateProc(size, &bid);
gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion2);
}
return bid;
else if ((gpb->sSPBasic != 0) &&
(gpb->sSPBasic->AcquireSuite(kPSBufferSuite, kPSBufferSuiteVersion1, (const void**)&pSBufferSuite32) == noErr) &&
(pSBufferSuite32 != NULL))
{
// PICA Buffer Suite 1.0 (32 bit)
unsigned32 siz = nBytes;
ret.signature = BUFVERSION_SUITE32;
ret.suite32 = (Ptr)pSBufferSuite32->New(&siz, siz);
if (siz < nBytes) {
ret.signature = BUFVERSION_NULL;
ret.suite32 = NULL;
}
gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion1);
}
else if (gpb->bufferProcs->numBufferProcs >= 8)
{
// Standard Buffer Suite 64 bit (deprecated)
ret.signature = BUFVERSION_STD64;
if ((/* *result = */ gpb->bufferProcs->allocateProc64(nBytes, &ret.standard))) {
ret.signature = BUFVERSION_NULL;
ret.standard = NULL;
}
}
else
{
// Standard Buffer Suite 32 bit (deprecated)
ret.signature = BUFVERSION_STD32;
if ((/* *result = */ gpb->bufferProcs->allocateProc(nBytes, &ret.standard))) {
ret.signature = BUFVERSION_NULL;
ret.standard = NULL;
}
}
 
Ptr lockBuffer(BufferID bid) {
// TODO: If available, use new Buffer Suite ?
return gpb->bufferProcs->lockProc(bid, true);
return ret;
}
 
void unlockBuffer(BufferID bid) {
// TODO: If available, use new Buffer Suite ?
gpb->bufferProcs->unlockProc(bid);
Ptr lockBuffer(FFBuffer bid) {
if (bid.signature == BUFVERSION_SUITE64) {
return bid.suite64;
}
else if (bid.signature == BUFVERSION_SUITE32) {
return bid.suite32;
}
else if (bid.signature == BUFVERSION_STD64) {
return gpb->bufferProcs->lockProc(bid.standard, true);
}
else if (bid.signature == BUFVERSION_STD32) {
return gpb->bufferProcs->lockProc(bid.standard, true);
}
else {
return NULL;
}
}
 
void disposeBuffer(BufferID bid) {
// TODO: If available, use new Buffer Suite ?
gpb->bufferProcs->freeProc(bid);
void unlockBuffer(FFBuffer bid) {
if (bid.signature == BUFVERSION_STD64) {
gpb->bufferProcs->unlockProc(bid.standard);
}
else if (bid.signature == BUFVERSION_STD32) {
gpb->bufferProcs->unlockProc(bid.standard);
}
}
 
void disposeBuffer(FFBuffer* bid) {
if ((*bid).signature == BUFVERSION_SUITE64) {
PSBufferSuite2* pSBufferSuite64 = NULL;
if ((gpb->sSPBasic != 0) &&
(gpb->sSPBasic->AcquireSuite(kPSBufferSuite, kPSBufferSuiteVersion2, (const void**)&pSBufferSuite64) == noErr) &&
(pSBufferSuite64 != NULL))
{
// PICA Buffer Suite 2.0 (64 bit)
pSBufferSuite64->Dispose(&((*bid).suite64));
gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion2);
}
}
else if ((*bid).signature == BUFVERSION_SUITE32) {
PSBufferSuite1* pSBufferSuite32 = NULL;
if ((gpb->sSPBasic != 0) &&
(gpb->sSPBasic->AcquireSuite(kPSBufferSuite, kPSBufferSuiteVersion1, (const void**)&pSBufferSuite32) == noErr) &&
(pSBufferSuite32 != NULL))
{
// PICA Buffer Suite 1.0 (32 bit)
pSBufferSuite32->Dispose(&((*bid).suite32));
gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion1);
}
}
else if ((*bid).signature == BUFVERSION_STD64) {
gpb->bufferProcs->freeProc((*bid).standard);
}
else if ((*bid).signature == BUFVERSION_STD32) {
gpb->bufferProcs->freeProc((*bid).standard);
}
(*bid).signature = BUFVERSION_NULL;
}