Im vorherigen Artikel haben wir einige der grundlegendsten Konzepte und Grundlagen für die Entwicklung von Photoshop-Filter-Plug-Ins vorgestellt. Ps: Um die Anwendungsanforderungen des Plug-Ins zu erfüllen, werden auch zahlreiche Rückruffunktionen (oder Dienste) für das Plug-In bereitgestellt. Beispielsweise kann ein Filter die vom letzten Benutzer nach einem Anruf eingestellten Parameter speichern und beim nächsten Aufruf oder der nächsten Anzeige der Benutzeroberfläche anwenden. Dies geschieht über die Callback-Funktion von Ps. In diesem Artikel erklären wir einige der wichtigsten PS-Callback-Funktionen. Nachdem wir diesen Artikel verstanden haben, werden wir in der Lage sein, Rückruffunktionen zu verwenden, um die notwendigen Arbeiten abzuschließen, wie zum Beispiel das Speichern unserer Filterparameter. Dieser Artikel wird viel komplexer und ausführlicher sein als der erste, aber gleichzeitig können wir durch diesen Artikel auch einen Einblick in die internen Geheimnisse von PS erhalten: sorgfältiges Systemdesign, perfekte Benutzeroberfläche und komplexe Arbeitsmechanismen.
(1) Klassifizierung von Rückruffunktionen:
Ps-Rückruffunktionen können entsprechend ihrer Position in zwei Typen unterteilt werden:
(1) Direkter Rückruf: (kann Direkt aufgerufen werden Rückruffunktionen)
Diese Rückruffunktionen sind direkte Mitglieder von FilterRecord und können direkt aus den FilterRecord-Parametern abgerufen werden. In diese Kategorie fallen beispielsweise AdvanceStateProc (Daten aktualisieren), TestAbortProc (Testbenutzerabbruch) usw.
(2) Callback Suite: (Callback-Funktionssatz)
Der Callback-Funktionssatz, der durch die Klassifizierung von Callback-Funktionen nach ihren Funktionen bereitgestellt wird, ist ein Satz von Callback-Funktionen. Es handelt sich um einen Zeiger, der auf einen Satz von Callback-Funktionen zeigt. Mit der Struktur (Struktur) der Rückruffunktion können wir einen bestimmten Rückruffunktionssatz von FilterRecord abrufen und dann die darin enthaltene Funktion aufrufen.
Die wichtigsten derzeit bereitgestellten Callback-Funktionssätze sind:
Buffer Suite: Cache-Speicherverwaltung (Anwendung und Freigabe von Cache-Speicherplatz).
UI Hook Suite: Eine Reihe von Funktionen im Zusammenhang mit UI-Operationen.
Channel Ports Suite: Lesen und Schreiben von Channel-Ports, zum Lesen und Schreiben der echten Auswahldaten in PS! Anstelle einer Kopiekopie.
. Color Space Suite: Farbraumdienst (Farbkonvertierung usw.).
Handle Suite: Handle-Verwaltung (PS-gekapselte Handle- und Speicherverwaltung, ähnlich der Buffer Suite).
Error Suite: Fehlermeldungen empfangen und den Benutzern anzeigen (empfängt verschiedene Arten von Fehlermeldungszeichenfolgen).
GetFileList Suite: Rufen Sie eine Dateiliste ab (Dateien abrufen, Browser aufrufen, um im Internet zu surfen usw.).
GetPath Suite: Holen Sie sich den Pfad.
ZString Suite: Kapselt die String-Verarbeitung.
Beispielsweise bietet die UI Hook Suite eine Reihe von Rückruffunktionen im Zusammenhang mit der Benutzeroberfläche. Die erste Version wurde wie folgt definiert:
UI Hooks Suite Version1
#define kPSUIHooksSuiteVersion1 1 1 // Suite-Version
typedef struct
{
ProcessEventProc processEvent;
DisplayPixelsProc displayPixels;
ProgressProc progressBar;
TestAbort Proc testAbort;
MainAppWindowProc MainAppWindow;
HostSetCursorProc SetCursor;
HostTickCountProc TickCount;
PluginNameProc GetPluginName;
} PSUIHooksSuite1;
Bitte beachten Sie, dass einige Rückruffunktionen direkte Rückrufe sind und in einer Suite gespeichert sind. wie testAbout und displayPixels. Ich vermute, dass diese Funktionszeiger in den frühen Tagen zu FilterRecord hinzugefügt wurden, aber mit dem Upgrade wurden immer mehr Rückruffunktionen hinzugefügt, was dazu führte, dass FilterRecord kontinuierlich aktualisiert und Mitglieder hinzugefügt wurde, was die Wartung erschwerte, sodass Adobe begann, Rückruffunktionen hinzuzufügen Die Klassifizierung ist in mehrere Suiten unterteilt, und nur die Suite wird in FilterRecord platziert. Auf diese Weise müssen Sie beim Hinzufügen einer Funktion diese nur der entsprechenden Suite hinzufügen und die Suite aktualisieren, ohne dass sich dies auf FilterRecord auswirkt. Auf diese Weise befinden sich einige frühe Rückruffunktionen gleichzeitig an zwei Orten: FilterRecord und der Suite, zu der sie gehören, sodass sie direkt oder über die entsprechende Suite aufgerufen werden können.
(2) Suite PEA (Plug-in-Funktionssatz-Verwaltungsmodul (Ebene), der von mir übersetzte Name unterliegt der Diskussion)
Suite PEA ist ein verwendetes Plug-in-System von einigen Programmen der Adobe-Serie bereitgestellt. Es bietet eine gemeinsame Plug-In-Verwaltungskernschicht für das Host-Programm und eine Standardschnittstelle für Plug-Ins.
Der kleine Unterschied zum Direktaufruf besteht darin, dass der Funktionssatz vor der Verwendung erworben (Acquired) und die Suite nach der Verwendung freigegeben (Release) werden sollte.
Ein erhaltener Funktionssatz ist im Wesentlichen ein Strukturzeiger, der auf eine Struktur zeigt, die einen Satz von Funktionszeigern enthält. Wenn wir also eine Funktion aufrufen, sieht die Form wie folgt aus:
sSuite->function( );
Daher erfolgt der Aufruf einer Funktion im Callback-Funktionssatz wie folgt:
Suite的获取和释放
ADMBasicSuite *sADMBasic;
//获取ADMBasic Suite:
filterParamBlock->sSPBasic->AcquireSuite(
kADMBasicSuite,
kADMBasicSuiteVersion,
&sADMBasic );
//调用
sADMBasic->Beep( );
//释放
filterParamBlock->sSPBasic->ReleaseSuite(
kADMBasicSuite,
kADMBasicSuiteVersion );
(3) Einführung in einige der wichtigeren Rückruffunktionen
Als Nächstes stellen wir einige Rückruffunktionen vor, die meiner Meinung nach wichtiger sind Filter-Plugins. Stellen Sie kurz den Speicherort und die Verwendung dieser Rückruffunktionen vor.
3.1 DisplayPixelsProc( )
Funktion: Pixeldaten ausgeben (ein Bild zeichnen) an der angegebenen Position auf dem angegebenen DC. (Natürlich können wir diese Funktion tatsächlich selbst ausführen.)
Ort: Direct Callback, UI Hook Suite;
Definition:
OSErr (*DisplayPixelsProc) (const PSPixelMap *source ,
const VRect *srcRect, int32 dstRow, int32 dstCol,
unsigned32 platformContext); Zeiger, der wie folgt definiert ist:
PSPixelMap Struct Define
Code-Hervorhebung erstellt mit Actipro CodeHighlighter (Freeware)
http:// m.sbmmt.com/
typedef
structPSPixelMap{ int32 version;
/ /
Versionsnummer VRect-Grenzen; >
int32 imageMode; /Scan-Linienbreite int32 colBytes; 🎜>
int32 planeBytes ; >void*baseAddr >//
----------- ---------// Weggelassen ..
} PSPixelMap; srcRect: Quellrechteck (Kopierbereich des Quellbilds)
dstRow, dstCol: Zielstartpunktkoordinaten (obere linke Ecke), da es nicht gestreckt und gezeichnet wird, sodass nur die Koordinaten der oberen linken Ecke ausreichen.
platformContext: Unter Windows-System, also Gerätekontext (DC);
3.2 Deskriptor-Suite (Deskriptor-Funktionssatz)
Der Deskriptorsatz wird hauptsächlich für das Skriptsystem von PS verwendet. Er dient zum Aufzeichnen (Aufzeichnen) der Informationen und Parameter, die während einer Reihe von Aktionen in PS erforderlich sind, und kann abgespielt werden. Es ist in zwei Unterfunktionssätze unterteilt: „Lesen“ und „Schreiben“. Mit diesem Funktionssatz können wir dafür sorgen, dass das Skriptsystem von PS unsere Filter „kennt“ und sie in einer Aktionssequenz aufzeichnet.
Der Weg, es zu erhalten, besteht darin, zuerst PIDescriptorParameters über FilterRecord abzurufen:
PIDescriptorParameters Struct Define
typedef struct PIDescriptorParameters
{
int16 descriptorParametersVersion Aktionswiedergabe-Flag: 0-Dialogfeld optional; 2-kein Dialogfeld erforderlich; recordInfo; //Aktionsaufzeichnungsflag: 0 – das Dialogfeld wird nicht angezeigt; 2 – das Dialogfeld ist stumm; >
PIDescriptorHandle descriptor; //Der Handle des Deskriptors ist sehr wichtig, wir werden ihn zum Lesen und Schreiben von Daten verwenden!
WriteDescriptorProcs* writeDescriptorProcs; //
"write" sub- function Set ReadDescriptorProcs*
readDescriptorProcs; //"read" Unterfunktionssatz} PIDescriptorParameters;Dann können wir den Unterfunktionssatz „Lesen“ oder „Schreiben“ erhalten:
Get the „read“ and „write“ sub-suite
//Rufen Sie die Deskriptorparameterstruktur ab :
PIDescriptorParameters* descParams = gFilterRecord- >descriptorParameters;
if (descParams == NULL) return err;
//Holen Sie sich den Unterfunktionssatz „Lesen“:
ReadDescriptorProcs* readProcs = gFilterRecord-> descriptorParameters ->readDescriptorProcs;
if (readProcs == NULL) return err;
//Holen Sie sich den Unterfunktionssatz „Schreiben“:
WriteDescriptorProcs* writeProcs = gFilterRecord-> descriptorParameters->writeDescriptorProcs;
if (writeProcs == NULL) return err;
Nachdem wir zwei Unterfunktionssätze erhalten haben, können wir die Funktionen unter den entsprechenden Unterfunktionssätzen aufrufen, um unsere Parameter zu „lesen“ und „zu schreiben“. Die Verwendung der beiden Unterfunktionssätze ähnelt der Registrierungsoperation. Vor dem Lesen und Schreiben müssen wir zunächst den entsprechenden Deskriptor öffnen. Deshalb stellen wir zunächst die öffnenden und schließenden Deskriptoroperationen vor.
, wir werden es verwenden, um Daten in nachfolgenden Vorgängen zu lesen und zu schreiben, ähnlich dem Schlüssel der Registrierung. DescriptorKeyIDArray: uint32-Array, das die Schlüsselsammlung speichert, die abgefragt werden muss. Die zugehörige Definition lautet: orKeyIDArray[];
Die Elemente im Array sind die Schlüsselnamen, die Sie benötigen, also die Parameternamen, die Sie abfragen möchten, also welche Schlüssel Sie abfragen möchten. Beachten Sie, dass jeder Schlüssel einen ASCII-Code enthalten kann, der durch 4 Zeichen dargestellt wird, da es sich um einen int32-Typ handelt. Wenn er weniger als 4 Bytes lang ist, kann er mit Leerzeichen gefüllt werden. Durch Festlegen dieser Parameterzuweisung kann beispielsweise {'Pam1','Pam2',NULL} festgelegt werden, was bedeutet, dass Sie zwei Parameter abfragen müssen, 'Pam1' und 'Pam2'. Im Skriptsystem lautet der Schlüssel des Gaußschen Weichzeichnungsfilters (
GaussianBlur
) beispielsweise „
GsnB“.
Jeder Schlüsselwert wird durch den Aufruf von GetKeyProc() abgerufen. Jedes Mal, wenn ein Wert zurückgegeben wird, wird der entsprechende Schlüssel in diesem String-Array auf leer gesetzt ('.Diese Funktion schließt einen Schreibdeskriptor und erstellt ein neues Deskriptorhandle. Sie müssen den neuen Deskriptor auf PIDescriptorParameteres setzen, um ihn an das Hostprogramm zurückzugeben. Das Verhalten der Funktion ähnelt hier in gewisser Weise dem von SelectObject in GDI-Vorgängen. Wenn Sie bei einem GDI-Vorgang neue Eigenschaften für den Gerätekontext festlegen, werden die vorhandenen Eigenschaften an Sie zurückgegeben und es wird erwartet, dass Sie eine Sicherung erstellen.
Ich werde sie einzeln erläutern. Hier stelle ich nur die allgemeine Form vor und erkläre sie bei Bedarf separat. Die meisten von ihnen haben relativ standardisierte Eigenschaften (einige Funktionen haben Ausnahmeformen, die wir später separat vorstellen werden), dh das Lesen beginnt mit Get und das Schreiben beginnt mit Put. Der erste Parameter ist der entsprechende Deskriptor und der zweite Parameter ist der entsprechende Datenzeigertyp, der zum Empfangen von Abfrageergebnissen (oder zum Speichern geschriebener Daten) verwendet wird. Angenommen, der Datentyp, den wir abfragen müssen, ist TypeName, dann lautet er wie folgt: 🎜>TypeName *
dest); //Read
OSErr (*
Put
TypeNameProc) (PIWriteDescriptor descriptor, DescriptorKeyID, TypeName *dest); //Write: >DescriptorKeyID ,
TypeName *dest h): Deskriptor-Untersuite lesen Code-Hervorhebung erstellt mit Actipro CodeHighlighter (Freeware)
http:// m.sbmmt.com/
-->//Unterfunktionssatz lesen Mitglieder
//Unterfunktionssatzmitglieder schreiben, das Formular ähnelt der vorherigen Funktion, es muss jedoch zusätzlich ein Schlüssel bereitgestellt werden
typedef struct WriteDescriptorProcs
{
int16 writeDescriptorProcsVersion;
int16 numWriteDescriptorProcs;
OpenWriteDescriptorProc openWriteDe orProc;
CloseWriteDescriptorProc closeWriteDescriptorProc;
PutIntegerProc putIntegerProc;
PutFloatProc putFloatProc;
PutUnitFloatProc putUnitFloatProc;
PutBooleanProc putBooleanProc;
PutTextProc putT extProc;
PutAliasProc putAliasProc;
PutEnumeratedProc putEnumeratedProc;
PutClassProc putClassProc;
PutSimpleReferenceProc putSimpleReferenceProc;
PutObjectProc putObjectProc;
PutStringProc putStringProc;
/* Verwendung durch Plug-Ins in Photoshop 4.0 */ PutScopedClassProc putScopedClassProc;
PutScopedObjectProc putScopedObjectProc;
} WriteDescriptorProcs;
Beispiel für das Lesen und Schreiben von Parametern:
Parameter aus dem Skriptsystem lesen: Angenommen, der Schlüssel unseres Parameters ist „Pam1“, wir verwenden eine temporäre Variable param1, um ihn zu empfangen:
Einen Parameter-Democode lesen
PIReadDescriptor token = NULL; //Read-Operator
DescriptorKeyID key = NULL; //uint32, das heißt, char*, Schlüsselname
DescriptorTypeID type = NULL; // Deskriptortyp
int32 flags = 0// Identifikation
DescriptorKeyIDArray Array = { 'Pam1', NULL }; //Der abzufragende Schlüsselsatz
double param1; //Der Parameter, den wir lesen möchten
// Deskriptorparameterstruktur abrufen
PIDescriptorParameters* descParams = gFilterRecord->descriptorParameters;
NULL) Rückgabeähm; //Holen Sie sich die „Lesen“-Unterfunktion im Descriptor Suite Set
ReadDescriptorProcs* readProcs
= gFilterRecord->descriptorParameters->readDescriptorProcs; 🎜>== NULL) return err;
if (descParams->descriptor != NULL)
{
//Offener „Lesen“-Deskriptor
Token = readProcs->openReadDescriptorProc(descParams->descriptor, array);
if (token != NULL)
während
(readProcs->getKeyProc(token, &key, &Typ, &Flags) && !err) 🎜> 🎜>':
/ /
Lesen Sie unsere Parameter
>getFloatProc(token, & param1); break; >Standard: 🎜>Pause ;
} } }//Lesendeskriptor schließen err = readProcs->closeReadDescriptorProc(token);
//释放描述符
gFilterRecord->handleProcs- >disposeProc(descParams->descriptor);
descParams->descriptor = NULL;
}
}
Parameter in das Skriptsystem schreiben: Wie im obigen Beispiel:
Deskriptor-Democode schreiben
OSErr err = noErr;
PIWriteDescriptor-Token = NULL;
PIDescriptorHandle h;
const double param1 = 1.05;
PIDescriptorParameters* descParams = gFilterRecord -> >return
err; WriteDescriptorProcs* writeProcs = gFilterRecord->
descriptorParameters->writeDescriptorProcs; 🎜>== NULL) return err; token =
writeProcs-> openWriteDescriptorProc(); if (token !=
NULL) { //Parameter schreiben~ writeProcs->putFloatProc(token,'Pam1',
¶m1); //Release-Deskriptor gFilterRecord->
handleProcs
->disposeProc(descParams ->descriptor); //Schließe den „Lese“-Deskriptor
writeProcs->
closeWriteDescriptorProc( token, &h); //Den neuen Deskriptor an Photoshop zurückgeben descParams->descriptor
=
h; }
3.3 DescriptorRegistry suite: (Deskriptorregistrierungsfunktionssatz)
Der Deskriptorregistrierungsfunktionssatz wird hauptsächlich für die Registrierung und Erfassung von Deskriptoren verwendet. Dadurch kann ps damit beauftragt werden, unsere Parameter zu speichern, während der Filter mehrmals aufgerufen wird. Es enthält mehrere Schlüsselfunktionen zur Registrierung, Entfernung und Schlüsselbeschaffung.
Register()
Beschreibung: Einen Schlüssel registrieren.
Definition:
OSErr (*Register) (
/* IN */ const char* key, // Eindeutige Zeichenfolge oder ID
/* IN */ PIActionDescriptor Descriptor, // Beschreibung Satzhandle
/ * in */Boolean Ispersisistent // Ob die PS-Wartung mit der Speicherung und Wiederherstellung betraut werden soll
);
Erase ()
Beschreibung: Einen Schlüssel entfernen Definition:
OSErr (*Erase)
(
/* IN */ const char* key // Eindeutige Zeichenfolge oder ID
🎜>Get()
Beschreibung: Gibt einen Schlüssel zurück. Der zurückgegebene Deskriptor ist eine Kopie, daher müssen Sie ihn nach der Verwendung aktiv freigeben. Definition:
OSErr (*Get) (
/* IN */ const char* key, // Eindeutige Zeichenfolge oder ID
/ Ihn nach Gebrauch freigeben
);
3.4 ActionDescriptor-Suite: (Aktionsdeskriptor-Funktionssatz)
Aktionsdeskriptor-Funktionssatz, wird zum Speichern von Schlüsseln verwendet ( oder Objekte) in Deskriptoren umwandeln, aus Deskriptoren lesen und andere Deskriptoren verwalten. Dieser Funktionssatz enthält sowohl Lese- als auch Schreibfunktionen und die Verwendungsmethode ähnelt dem Deskriptor im vorherigen Abschnitt. Es ist wie folgt definiert:
PSActionDescriptorProcs StructCode-Hervorhebung erzeugt durch Actipro CodeHighlighter (Freeware)
http:/ / m.sbmmt.com/
typedef
struct PSActionDescriptorProcs {
//
ALLOCATES: descriptor SPAPI OSErr (
*Make)(PIActionDescriptor * descriptor); SPAPI OSErr (*
Free)(PIActionDescriptor descriptor); SPAPI OSerr (*GetType)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorTypeID *type);
// Index ist null basiert
SPAPI OSerr (*GetKey)(PIActionDescriptor descriptor, uint32 index, DescriptorKeyID *key);
SPAPI OSerr (*HasKey)(PIActionDescriptor descriptor, DescriptorKeyID key, Boolean *hasKey);
SPAPI OSerr (*GetCount)(PIActionDescriptor descriptor, uint32 *count);
SPAPI OSerr (*IsEqual)(PIActionDescriptor descriptor, PIActionDescriptor other, Boolean *isEqual );
SPAPI OSerr (*Erase)(PIActionDescriptor descriptor, DescriptorKeyID key);
SPAPI OSerr (* Clear)(PIActionDescriptor descriptor);
/*存入数据*/
SPAPI OSerr (*PutInteger)(PIActionDescriptor descriptor, DescriptorKeyID key, int32 value);
SPAPI OSerr (*PutFloat)(PIActionDescriptor descriptor, DescriptorKeyID key, double value);
SPAPI OSerr (*PutUnitFloat)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorUnitID unit, double value);
SPAPI OSerr (*PutString)(PIActionDescriptor descriptor, DescriptorKeyID key, char *cstrValue);
SPAPI OSerr (*PutBoolean)(PIActionDescriptor descriptor, DescriptorKeyID key, Boolescher Wert);
SPAPI OSerr (*PutList) (PIActionDescriptor descriptor, DescriptorKeyID key, PIActionList value);
SPAPI OSerr (*PutObject)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorClassID type, PIActionDescriptor value);
SPAPI OSErr (*PutGlobalObject)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorClassID type, PIActionDescriptor value);
SPAPI OSerr (* PutEnumerated)(PIActionDescriptor-Deskriptor, Referenzwert);
SPAPI OSErr (*PutClass)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorClassID value);
SPAPI OSerr (*PutGlobalClass) (PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorClassID value);
SPAPI OSerr (*PutAlias)(PIActionDescriptor descriptor, DescriptorKeyID key, Handle-value);
/*获取数据*/
SPAPI OSerr (*GetInteger)(PIActionDescriptor descriptor, DescriptorKeyID key, int32* value);
SPAPI OSErr (*GetFloat)(PIActionDescriptor descriptor, DescriptorKeyID key, double* value);
SPAPI OSerr (*GetUnitFloat)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorUnitID* unit, double* value);
SPAPI OSerr (*GetStringLength)(PIActionDescriptor descriptor, DescriptorKeyID key, uint32 *stringLength);
SPAPI OSerr (*GetString)(PIActionDescriptor descriptor, DescriptorKeyID key, char *cstrValue, uint32 maxLength);
SPAPI OSerr (*GetBoolean)(PIActionDescriptor descriptor, DescriptorKeyID key, Boolean* value);
SPAPI OSerr (*GetList)(PIActionDescriptor descriptor, DescriptorKeyID key, PIActionList * value);
SPAPI OSerr (*GetObject)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorClassID* type, PIActionDescriptor* value);
SPAPI OSerr (*GetGlobalObject)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorClassID * type, PIActionDescriptor* value);
SPAPI OSerr (*GetEnumerated)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorEnumTypeID* type, DescriptorEnumID* value);
SPAPI OSerr (*GetReference)(PIActionDescriptor descriptor, DescriptorKeyID key, PIActionReference* value);
SPAPI OSerr (*GetClass)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorClassID* value);
SPAPI OSerr (*GetGlobalClass)(PIActionDescriptor descriptor, DescriptorKeyID key, DescriptorClassID* value);
SPAPI OSerr (* GetAlias)(PIActionDescriptor descriptor, DescriptorKeyID key, Handle* value);
/*数组形式*/
SPAPI OSerr ( *HasKeys)(PIActionDescriptor descriptor, DescriptorKeyIDArray requiredKeys, Boolean *hasKeys);
SPAPI OSerr (*PutIntegers)(PIActionDescriptor descriptor, DescriptorKeyID key, uint32 count, int32* value);
SPAPI OSerr (* GetIntegers)(PIActionDescriptor descriptor, DescriptorKeyID key, uint32 count, int32* value);
SPAPI OSerr (*AsHandle)(PIActionDescriptor descriptor, PIDescriptorHandle *value); /*转换为句柄*/
SPAPI OSerr (*HandleToDescriptor)(PIDescriptorHandle value, PIActionDescriptor *descriptor); /*句柄转换为描述符*/
SPAPI OSerr (*PutZString)(PIActionDescriptor descriptor, DescriptorKeyID key, ASZString zstring);
SPAPI OSerr ( *GetZString)(PIActionDescriptor descriptor, DescriptorKeyID key, ASZString *zstring);
SPAPI OSerr (*PutData)(PIActionDescriptor descriptor, DescriptorKeyID key, int32 length, void *value);
SPAPI OSErr (*GetDataLength)(PIActionDescriptor descriptor, DescriptorKeyID key, int32* value);
SPAPI OSerr ( *GetData)(PIActionDescriptor descriptor, DescriptorKeyID key, void* value);
} PSActionDescriptorProcs;
Beispiel für das Schreiben unserer Parameter in den Deskriptor und dessen Registrierung: Zuvor müssen wir eine eindeutige ID für die Parameter unseres Plug-Ins angeben, um den zu uns gehörenden Deskriptor zu registrieren und zu extrahieren, zum Beispiel:
define plugInUniqueID "d9543b0c-3c91-11d4-97bc-00b0d0204936"
Schreiben Sie unsere Parameter
//Parameter schreiben und registrieren
SPErr WriteRegistryParameters(void)
{
SPErr err = noErr;
//Holen Sie sich SPBasicSuite, die die Grundlage für den Erwerb anderer Suiten bildet
SPBasicSuite* basicSuite = gFilterRecord->sSPBasic;
// Deskriptorregistrierungsfunktionssatzzeiger
PSDescriptorRegistryProcs* RegistryProcs = NULL;
//Deskriptorfunktionssatzzeiger
PSActionDescriptorProcs* descriptorProcs = NULL;
PIActionDescriptor descriptor = NULL;
//Unsere Parameter
double param1
=0,1; //Deskriptor-Registrierungsfunktion festlegen
err = basicSuite
->AcquireSuite(kPSDescriptorRegistrySuite, ( const void
**)®istryProcs) ;//Aktionsdeskriptor-Funktionssatz abrufen
err = basicSuite ->AcquireSuite(kPSActionDescriptorSuite,
nichtig **)&descriptorProcs); 🎜>= descriptorProcs
->
Make(&descriptor); //Write us Parameters err =
descriptorProcs
->PutFloat(descriptor, 'Pam1 ',param1); //Registrieren Sie den Deskriptor der angegebenen ID err = RegistryProcs- >Register(plugInUniqueID, descriptor, true);
//
Release-Beschreibung
wenn (descriptor
!= NULL) descriptorProcs->Free (descriptor);
//Funktionssatz freigeben
if (registryProcs
!= NULL)basicSuite->ReleaseSuite(kPSDescriptorRegistrySuite, kPSDescriptorRegistrySuiteVersion);
wenn (descriptorProcs
!=
NULL) basicSuite->ReleaseSuite(kPSActionDescriptorSuite, kPSActionDescriptorSuiteVersion);
ZurückErr;}
Beispiel für das Lesen unserer Parameter:
Lesen registrierter Parameter
//Registrierte Parameter lesen
SPErr ReadRegistryParameters(void)
{
SPErr err = noErr;
/ /Holen Sie sich den Grundfunktionssatz SPBasicSuite, über den Sie weitere Funktionssätze erhalten können
SPBasicSuite*basicSuite = gFilterRecord->sSPBasic;
PSDescriptorRegistryProcs* RegistryProcs=NULL;
PSActionDescriptorProcs* descriptorProcs = NULL;
PIActionDescriptor descriptor =NULL;
double param1;
//Deskriptor-Registrierungsfunktion festlegen
err = basicSuite- AcquireSuite(kPSDescriptorRegistrySuite,
(
const void **)®istryProcs);
//Aktionsdeskriptor-Funktionssatz abrufen
err = basicSuite->AcquireSuite(kPSActionDescriptorSuite , kPSActionDescriptorSuiteVersion,
(
const void ** )& descriptorProcs);
//Den Deskriptor der angegebenen ID abrufen
err = RegistryProcs->Get(plugInUniqueID, &descriptor);
//Registrierte Parameter lesen
err = descriptorProcs->GetFloat(descriptor, ' Pam1',¶m1);
//Release-Deskriptor
if (Deskriptor != NULL )
descriptorProcs->Free(descriptor);
//Release-Deskriptor-Registrierungsfunktionssatz
if (registryProcs != NULL)
basicSuite->ReleaseSuite(kPSDescriptorRegistrySuite,
🎜>
Release Action Descriptor Function Set
if (descriptorProcs != NULL) basicSuite->
ReleaseSuite(kPSActionDescriptorSuite, ähm;}
<.>
In zwei Hauptkategorien unterteilt, ist eine direkt in der Plug-in-Parameterstruktur enthalten und wird als direkte Rückruffunktion bezeichnet. Die andere ist eine Rückruffunktion im Callback-Funktionssatz enthalten. Für direkte Rückruffunktionen erklärt der Text nur, dass DisplayPixelsProc zum Zuordnen von Bildern auf dem Geräte-DC verwendet werden kann. Einschließlich der im ersten Artikel erwähnten AdvanceStateProc, TestAbortProc und UpdateProgressProc handelt es sich bei allen um direkte Rückrufe, und einige direkte Rückruffunktionen gehören zu einer bestimmten Suite. Für den Callback-Funktionssatz (Callback Suite) haben wir uns dann auf das Lesen, Schreiben, Registrieren und andere Vorgänge in der Descriptor Suite im Callback-Funktionssatz konzentriert. Dieser Funktionssatz ermöglicht es PS, unsere Filterparameter in der Aktionssequenz aufzuzeichnen , oder es kann unsere Filterparameter registrieren, um sie über mehrere Aufrufe hinweg zu speichern und zu lesen. Andere Callback-Funktionssätze wie Speicherverwaltung, Farbraumdienste und andere Funktionssätze wurden aus Platzgründen noch nicht abgedeckt. (--Von Hoodlum1980)
Weitere Einführungen in die Photoshop-Filterentwicklung – Artikel zu Photoshop-Rückruffunktionen finden Sie auf der chinesischen PHP-Website!