Subversion Repositories filter_foundry

Rev

Rev 484 | Rev 486 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.     This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
  3.     Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.com.au
  4.     Copyright (C) 2018-2021 Daniel Marschall, ViaThinkSoft
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19. */
  20.  
  21. #include "ff.h"
  22.  
  23. #include "PIBufferSuite.h"
  24.  
  25. // TODO: Also implement the handleSuite like this
  26.  
  27. FFBuffer newBuffer(size_t nBytes) {
  28.         PSBufferSuite1* pSBufferSuite32 = NULL;
  29.         PSBufferSuite2* pSBufferSuite64 = NULL;
  30.  
  31.         FFBuffer ret;
  32.  
  33.         if ((gpb->sSPBasic != 0) &&
  34.                 (gpb->sSPBasic->AcquireSuite(kPSBufferSuite, kPSBufferSuiteVersion2, (const void**)&pSBufferSuite64) == noErr) &&
  35.                 (pSBufferSuite64 != NULL) &&
  36.                 (pSBufferSuite64 != (PSBufferSuite2*)gpb->bufferProcs /*Implementation mistake in old Photoshop versions! (see note below)*/)
  37.                 )
  38.         {
  39.                 // PICA Buffer Suite 2.0 (64 bit)
  40.                 //
  41.                 // Note: Windows Photoshop 7 and CS 2 (Other Photoshop versions were not tested) accept
  42.                 // kPSBufferSuiteVersion2, but dont't correctly implement it:
  43.                 // Instead of returning a pointer to a PSBufferSuite2 structure,
  44.                 // they return the pointer RecordPtr->bufferProcs (structure BufferProcs)!
  45.                 //
  46.                 // 64-bit support for Windows was established in Photoshop CS 4,
  47.                 // and PSBufferSuite2 was first documented in SDK CS 6.
  48.                 //
  49.                 // So, kPSBufferSuiteVersion2 probably was partially implemented as hidden "Work in progress" version
  50.                 // before it was publicly documented.
  51.                 // Side note:  pb->bufferSpace64/pb->maxSpace64 was documented in SDK CC 2017.
  52.                 //             pb->bufferProcs->allocateProc64/spaceProc64 was documented in SDK CS 6.
  53.                 unsigned32 siz = nBytes;
  54.                 ret.signature = BUFVERSION_SUITE64;
  55.                 ret.suite64 = (Ptr)pSBufferSuite64->New(&siz, siz);
  56.                 if (siz < nBytes) {
  57.                         ret.signature = BUFVERSION_NULL;
  58.                         ret.suite64 = NULL;
  59.                 }
  60.                 gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion2);
  61.         }
  62.         else if ((gpb->sSPBasic != 0) &&
  63.                 (gpb->sSPBasic->AcquireSuite(kPSBufferSuite, kPSBufferSuiteVersion1, (const void**)&pSBufferSuite32) == noErr) &&
  64.                 (pSBufferSuite32 != NULL))
  65.         {
  66.                 // PICA Buffer Suite 1.0 (32 bit)
  67.                 unsigned32 siz = nBytes;
  68.                 ret.signature = BUFVERSION_SUITE32;
  69.                 ret.suite32 = (Ptr)pSBufferSuite32->New(&siz, siz);
  70.                 if (siz < nBytes) {
  71.                         ret.signature = BUFVERSION_NULL;
  72.                         ret.suite32 = NULL;
  73.                 }
  74.                 gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion1);
  75.         }
  76.         else if (gpb->bufferProcs->numBufferProcs >= 8)
  77.         {
  78.                 // Standard Buffer Suite 64 bit (deprecated)
  79.                 ret.signature = BUFVERSION_STD64;
  80.                 if ((/* *result = */ gpb->bufferProcs->allocateProc64(nBytes, &ret.standard))) {
  81.                         ret.signature = BUFVERSION_NULL;
  82.                         ret.standard = NULL;
  83.                 }
  84.         }
  85.         else
  86.         {
  87.                 // Standard Buffer Suite 32 bit (deprecated)
  88.                 ret.signature = BUFVERSION_STD32;
  89.                 if ((/* *result = */ gpb->bufferProcs->allocateProc(nBytes, &ret.standard))) {
  90.                         ret.signature = BUFVERSION_NULL;
  91.                         ret.standard = NULL;
  92.                 }
  93.         }
  94.  
  95.         return ret;
  96. }
  97.  
  98. Ptr lockBuffer(FFBuffer bid) {
  99.         if (bid.signature == BUFVERSION_SUITE64) {
  100.                 return bid.suite64;
  101.         }
  102.         else if (bid.signature == BUFVERSION_SUITE32) {
  103.                 return bid.suite32;
  104.         }
  105.         else if (bid.signature == BUFVERSION_STD64) {
  106.                 return gpb->bufferProcs->lockProc(bid.standard, true);
  107.         }
  108.         else if (bid.signature == BUFVERSION_STD32) {
  109.                 return gpb->bufferProcs->lockProc(bid.standard, true);
  110.         }
  111.         else {
  112.                 return NULL;
  113.         }
  114. }
  115.  
  116. void unlockBuffer(FFBuffer bid) {
  117.         if (bid.signature == BUFVERSION_STD64) {
  118.                 gpb->bufferProcs->unlockProc(bid.standard);
  119.         }
  120.         else if (bid.signature == BUFVERSION_STD32) {
  121.                 gpb->bufferProcs->unlockProc(bid.standard);
  122.         }
  123. }
  124.  
  125. void disposeBuffer(FFBuffer* bid) {
  126.         if ((*bid).signature == BUFVERSION_SUITE64) {
  127.                 PSBufferSuite2* pSBufferSuite64 = NULL;
  128.                 if ((gpb->sSPBasic != 0) &&
  129.                         (gpb->sSPBasic->AcquireSuite(kPSBufferSuite, kPSBufferSuiteVersion2, (const void**)&pSBufferSuite64) == noErr) &&
  130.                         (pSBufferSuite64 != NULL))
  131.                 {
  132.                         // PICA Buffer Suite 2.0 (64 bit)
  133.                         pSBufferSuite64->Dispose(&((*bid).suite64));
  134.                         gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion2);
  135.                 }
  136.         }
  137.         else if ((*bid).signature == BUFVERSION_SUITE32) {
  138.                 PSBufferSuite1* pSBufferSuite32 = NULL;
  139.                 if ((gpb->sSPBasic != 0) &&
  140.                         (gpb->sSPBasic->AcquireSuite(kPSBufferSuite, kPSBufferSuiteVersion1, (const void**)&pSBufferSuite32) == noErr) &&
  141.                         (pSBufferSuite32 != NULL))
  142.                 {
  143.                         // PICA Buffer Suite 1.0 (32 bit)
  144.                         pSBufferSuite32->Dispose(&((*bid).suite32));
  145.                         gpb->sSPBasic->ReleaseSuite(kPSBufferSuite, kPSBufferSuiteVersion1);
  146.                 }
  147.         }
  148.         else if ((*bid).signature == BUFVERSION_STD64) {
  149.                 gpb->bufferProcs->freeProc((*bid).standard);
  150.         }
  151.         else if ((*bid).signature == BUFVERSION_STD32) {
  152.                 gpb->bufferProcs->freeProc((*bid).standard);
  153.         }
  154.         (*bid).signature = BUFVERSION_NULL;
  155. }
  156.