1,7 → 1,7 |
/* |
This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop |
Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.com.au |
Copyright (C) 2018-2021 Daniel Marschall, ViaThinkSoft |
Copyright (C) 2018-2022 Daniel Marschall, ViaThinkSoft |
|
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
21,15 → 21,274 |
#include "ff.h" |
|
#include "PIBufferSuite.h" |
#include "PIHandleSuite.h" |
|
// TODO: Also implement the handleSuite like this |
void newHandle(FFHandle* hdl, size_t nBytes) { |
PSHandleSuite1* pSHandleSuite1 = NULL; |
PSHandleSuite2* pSHandleSuite2 = NULL; |
|
FFBuffer newBuffer(size_t nBytes) { |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion2, (const void**)&pSHandleSuite2) == noErr) && |
(pSHandleSuite2 != NULL) && |
(pSHandleSuite2 != (PSHandleSuite2*)gpb->handleProcs /*PS7 doesn't have the bug like in BufferSuite2, but we just want to be sure...*/) |
) |
{ |
// PICA Handle Suite 2.0 |
hdl->signature = HDLVERSION_SUITE2; |
gdata->lastKnownHandleVersion = hdl->signature; |
hdl->handle = pSHandleSuite2->New(nBytes); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion2); |
} |
else if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion1, (const void**)&pSHandleSuite1) == noErr) && |
(pSHandleSuite1 != NULL) |
) |
{ |
// PICA Handle Suite 1.0 |
hdl->signature = HDLVERSION_SUITE1; |
gdata->lastKnownHandleVersion = hdl->signature; |
hdl->handle = pSHandleSuite1->New(nBytes); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion1); |
} |
else { |
// Standard Handle Suite (deprecated) |
hdl->signature = HDLVERSION_STANDARD; |
gdata->lastKnownHandleVersion = hdl->signature; |
hdl->handle = gpb->handleProcs->newProc(nBytes); |
} |
} |
|
void disposeHandle(FFHandle* hdl) { |
if (hdl->signature == HDLVERSION_SUITE2) { |
PSHandleSuite2* pSHandleSuite2 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion2, (const void**)&pSHandleSuite2) == noErr) && |
(pSHandleSuite2 != NULL) && |
(pSHandleSuite2 != (PSHandleSuite2*)gpb->handleProcs /*PS7 doesn't have the bug like in BufferSuite2, but we just want to be sure...*/) |
) |
{ |
// PICA Handle Suite 2.0 |
pSHandleSuite2->Dispose(hdl->handle); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion2); |
} |
} |
else if (hdl->signature == HDLVERSION_SUITE1) { |
PSHandleSuite1* pSHandleSuite1 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion1, (const void**)&pSHandleSuite1) == noErr) && |
(pSHandleSuite1 != NULL) |
) |
{ |
// PICA Handle Suite 1.0 |
pSHandleSuite1->Dispose(hdl->handle); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion1); |
} |
} |
else if (hdl->signature == HDLVERSION_STANDARD) { |
// Standard Handle Suite (deprecated) |
gpb->handleProcs->disposeProc(hdl->handle); |
} |
hdl->signature = HDLVERSION_NULL; |
} |
|
size_t getHandleSize(FFHandle* hdl) { |
if (hdl->signature == HDLVERSION_SUITE2) { |
PSHandleSuite2* pSHandleSuite2 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion2, (const void**)&pSHandleSuite2) == noErr) && |
(pSHandleSuite2 != NULL) && |
(pSHandleSuite2 != (PSHandleSuite2*)gpb->handleProcs /*PS7 doesn't have the bug like in BufferSuite2, but we just want to be sure...*/) |
) |
{ |
// PICA Handle Suite 2.0 |
int32 size = pSHandleSuite2->GetSize(hdl->handle); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion2); |
return (size_t)size; |
} |
} |
else if (hdl->signature == HDLVERSION_SUITE1) { |
PSHandleSuite1* pSHandleSuite1 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion1, (const void**)&pSHandleSuite1) == noErr) && |
(pSHandleSuite1 != NULL) |
) |
{ |
// PICA Handle Suite 1.0 |
int32 size = pSHandleSuite1->GetSize(hdl->handle); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion1); |
return (size_t)size; |
} |
} |
else if (hdl->signature == HDLVERSION_STANDARD) { |
// Standard Handle Suite (deprecated) |
return gpb->handleProcs->getSizeProc(hdl->handle); |
} |
return 0; |
} |
|
OSErr setHandleSize(FFHandle* hdl, size_t nBytes) { |
if (hdl->signature == HDLVERSION_SUITE2) { |
PSHandleSuite2* pSHandleSuite2 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion2, (const void**)&pSHandleSuite2) == noErr) && |
(pSHandleSuite2 != NULL) && |
(pSHandleSuite2 != (PSHandleSuite2*)gpb->handleProcs /*PS7 doesn't have the bug like in BufferSuite2, but we just want to be sure...*/) |
) |
{ |
// PICA Handle Suite 2.0 |
OSErr ret = pSHandleSuite2->SetSize(hdl->handle, nBytes); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion2); |
return ret; |
} |
} |
else if (hdl->signature == HDLVERSION_SUITE1) { |
PSHandleSuite1* pSHandleSuite1 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion1, (const void**)&pSHandleSuite1) == noErr) && |
(pSHandleSuite1 != NULL) |
) |
{ |
// PICA Handle Suite 1.0 |
OSErr ret = pSHandleSuite1->SetSize(hdl->handle, nBytes); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion1); |
return ret; |
} |
} |
else if (hdl->signature == HDLVERSION_STANDARD) { |
// Standard Handle Suite (deprecated) |
return gpb->handleProcs->setSizeProc(hdl->handle, nBytes); |
} |
return errMissingParameter; |
} |
|
Ptr lockHandle(FFHandle* hdl) { |
if (hdl->signature == HDLVERSION_SUITE2) { |
PSHandleSuite2* pSHandleSuite2 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion2, (const void**)&pSHandleSuite2) == noErr) && |
(pSHandleSuite2 != NULL) && |
(pSHandleSuite2 != (PSHandleSuite2*)gpb->handleProcs /*PS7 doesn't have the bug like in BufferSuite2, but we just want to be sure...*/) |
) |
{ |
// PICA Handle Suite 2.0 |
Ptr address; |
Boolean oldLock; |
pSHandleSuite2->SetLock(hdl->handle, true, &address, &oldLock); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion2); |
return address; |
} |
} |
else if (hdl->signature == HDLVERSION_SUITE1) { |
PSHandleSuite1* pSHandleSuite1 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion1, (const void**)&pSHandleSuite1) == noErr) && |
(pSHandleSuite1 != NULL) |
) |
{ |
// PICA Handle Suite 1.0 |
Ptr address; |
Boolean oldLock; |
pSHandleSuite1->SetLock(hdl->handle, true, &address, &oldLock); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion1); |
return address; |
} |
} |
else if (hdl->signature == HDLVERSION_STANDARD) { |
// Standard Handle Suite (deprecated) |
return gpb->handleProcs->lockProc(hdl->handle, true); |
} |
return NULL; |
} |
|
void unlockHandle(FFHandle* hdl) { |
if (hdl->signature == HDLVERSION_SUITE2) { |
PSHandleSuite2* pSHandleSuite2 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion2, (const void**)&pSHandleSuite2) == noErr) && |
(pSHandleSuite2 != NULL) && |
(pSHandleSuite2 != (PSHandleSuite2*)gpb->handleProcs /*PS7 doesn't have the bug like in BufferSuite2, but we just want to be sure...*/) |
) |
{ |
// PICA Handle Suite 2.0 |
Ptr address; |
Boolean oldLock; |
pSHandleSuite2->SetLock(hdl->handle, false, &address, &oldLock); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion2); |
} |
} |
else if (hdl->signature == HDLVERSION_SUITE1) { |
PSHandleSuite1* pSHandleSuite1 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPIHandleSuite, kPSHandleSuiteVersion1, (const void**)&pSHandleSuite1) == noErr) && |
(pSHandleSuite1 != NULL) |
) |
{ |
// PICA Handle Suite 1.0 |
Ptr address; |
Boolean oldLock; |
pSHandleSuite1->SetLock(hdl->handle, false, &address, &oldLock); |
gpb->sSPBasic->ReleaseSuite(kPIHandleSuite, kPSHandleSuiteVersion1); |
} |
} |
else if (hdl->signature == HDLVERSION_STANDARD) { |
// Standard Handle Suite (deprecated) |
gpb->handleProcs->unlockProc(hdl->handle); |
} |
} |
|
// ----------------------------------------------------------------------------------- |
// These functions are for code backwards compatibility: |
|
Handle PINEWHANDLE(int32 size) { |
FFHandle fh; |
newHandle(&fh, size); |
// Note: newHandle() set gdata->lastKnownHandleVersion, so that |
// the other functions like PILOCKHANDLE can use it. This is safe, |
// as we can assume that the version is always the same for all handles from this host. |
return fh.handle; |
} |
|
void PIDISPOSEHANDLE(Handle h) { |
FFHandle fh; |
fh.signature = gdata->lastKnownHandleVersion; |
fh.handle = h; |
disposeHandle(&fh); |
} |
|
int32 PIGETHANDLESIZE(Handle h) { |
FFHandle fh; |
fh.signature = gdata->lastKnownHandleVersion; |
fh.handle = h; |
return getHandleSize(&fh); |
} |
|
OSErr PISETHANDLESIZE(Handle h, int32 newSize) { |
FFHandle fh; |
fh.signature = gdata->lastKnownHandleVersion; |
fh.handle = h; |
return setHandleSize(&fh, newSize); |
} |
|
Ptr PILOCKHANDLE(Handle h, Boolean moveHigh) { |
FFHandle fh; |
fh.signature = gdata->lastKnownHandleVersion; |
fh.handle = h; |
return lockHandle(&fh); |
} |
|
void PIUNLOCKHANDLE(Handle h) { |
FFHandle fh; |
fh.signature = gdata->lastKnownHandleVersion; |
fh.handle = h; |
unlockHandle(&fh); |
} |
|
// ----------------------------------------------------------------------------------- |
|
void newBuffer(FFBuffer* buf, 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) && |
51,11 → 310,12 |
// 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); |
buf->signature = BUFVERSION_SUITE64; |
gdata->lastKnownBufferVersion = buf->signature; |
buf->suite = (Ptr)pSBufferSuite64->New(&siz, siz); |
if (siz < nBytes) { |
ret.signature = BUFVERSION_NULL; |
ret.suite64 = NULL; |
buf->signature = BUFVERSION_NULL; |
buf->suite = NULL; |
} |
gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion2); |
} |
65,11 → 325,12 |
{ |
// PICA Buffer Suite 1.0 (32 bit) |
unsigned32 siz = nBytes; |
ret.signature = BUFVERSION_SUITE32; |
ret.suite32 = (Ptr)pSBufferSuite32->New(&siz, siz); |
buf->signature = BUFVERSION_SUITE32; |
gdata->lastKnownBufferVersion = buf->signature; |
buf->suite = (Ptr)pSBufferSuite32->New(&siz, siz); |
if (siz < nBytes) { |
ret.signature = BUFVERSION_NULL; |
ret.suite32 = NULL; |
buf->signature = BUFVERSION_NULL; |
buf->suite = NULL; |
} |
gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion1); |
} |
76,37 → 337,37 |
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; |
buf->signature = BUFVERSION_STD64; |
gdata->lastKnownBufferVersion = buf->signature; |
if (gpb->bufferProcs->allocateProc64(nBytes, &buf->standard) != noErr) { |
buf->signature = BUFVERSION_NULL; |
buf->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; |
buf->signature = BUFVERSION_STD32; |
gdata->lastKnownBufferVersion = buf->signature; |
if (gpb->bufferProcs->allocateProc(nBytes, &buf->standard) != noErr) { |
buf->signature = BUFVERSION_NULL; |
buf->standard = NULL; |
} |
} |
|
return ret; |
} |
|
Ptr lockBuffer(FFBuffer bid) { |
if (bid.signature == BUFVERSION_SUITE64) { |
return bid.suite64; |
Ptr lockBuffer(FFBuffer* buf) { |
if (buf->signature == BUFVERSION_SUITE64) { |
return buf->suite; |
} |
else if (bid.signature == BUFVERSION_SUITE32) { |
return bid.suite32; |
else if (buf->signature == BUFVERSION_SUITE32) { |
return buf->suite; |
} |
else if (bid.signature == BUFVERSION_STD64) { |
return gpb->bufferProcs->lockProc(bid.standard, true); |
else if (buf->signature == BUFVERSION_STD64) { |
return gpb->bufferProcs->lockProc(buf->standard, true); |
} |
else if (bid.signature == BUFVERSION_STD32) { |
return gpb->bufferProcs->lockProc(bid.standard, true); |
else if (buf->signature == BUFVERSION_STD32) { |
return gpb->bufferProcs->lockProc(buf->standard, true); |
} |
else { |
return NULL; |
113,28 → 374,30 |
} |
} |
|
void unlockBuffer(FFBuffer bid) { |
if (bid.signature == BUFVERSION_STD64) { |
gpb->bufferProcs->unlockProc(bid.standard); |
void unlockBuffer(FFBuffer* buf) { |
if (buf->signature == BUFVERSION_STD64) { |
gpb->bufferProcs->unlockProc(buf->standard); |
} |
else if (bid.signature == BUFVERSION_STD32) { |
gpb->bufferProcs->unlockProc(bid.standard); |
else if (buf->signature == BUFVERSION_STD32) { |
gpb->bufferProcs->unlockProc(buf->standard); |
} |
} |
|
void disposeBuffer(FFBuffer* bid) { |
if ((*bid).signature == BUFVERSION_SUITE64) { |
void disposeBuffer(FFBuffer* buf) { |
if (buf->signature == BUFVERSION_SUITE64) { |
PSBufferSuite2* pSBufferSuite64 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPSBufferSuite, kPSBufferSuiteVersion2, (const void**)&pSBufferSuite64) == noErr) && |
(pSBufferSuite64 != NULL)) |
(pSBufferSuite64 != NULL) && |
(pSBufferSuite64 != (PSBufferSuite2*)gpb->bufferProcs /*Implementation mistake in old Photoshop versions! (see note below)*/) |
) |
{ |
// PICA Buffer Suite 2.0 (64 bit) |
pSBufferSuite64->Dispose(&((*bid).suite64)); |
pSBufferSuite64->Dispose(&buf->suite); |
gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion2); |
} |
} |
else if ((*bid).signature == BUFVERSION_SUITE32) { |
else if (buf->signature == BUFVERSION_SUITE32) { |
PSBufferSuite1* pSBufferSuite32 = NULL; |
if ((gpb->sSPBasic != 0) && |
(gpb->sSPBasic->AcquireSuite(kPSBufferSuite, kPSBufferSuiteVersion1, (const void**)&pSBufferSuite32) == noErr) && |
141,15 → 404,15 |
(pSBufferSuite32 != NULL)) |
{ |
// PICA Buffer Suite 1.0 (32 bit) |
pSBufferSuite32->Dispose(&((*bid).suite32)); |
pSBufferSuite32->Dispose(&buf->suite); |
gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion1); |
} |
} |
else if ((*bid).signature == BUFVERSION_STD64) { |
gpb->bufferProcs->freeProc((*bid).standard); |
else if (buf->signature == BUFVERSION_STD64) { |
gpb->bufferProcs->freeProc(buf->standard); |
} |
else if ((*bid).signature == BUFVERSION_STD32) { |
gpb->bufferProcs->freeProc((*bid).standard); |
else if (buf->signature == BUFVERSION_STD32) { |
gpb->bufferProcs->freeProc(buf->standard); |
} |
(*bid).signature = BUFVERSION_NULL; |
buf->signature = BUFVERSION_NULL; |
} |