ColorSync 2: Welke CMM's beschikbaar?

Hallo,

Een beetje kenner van ColorSync weet dat de ColorSync API maar een abstractie laag is naar de blokken die het echte werk doen: de Color Management Modules ofte CMM. Het zijn deze modules die het echte rekenwerk doen tussen kleurenruimtes. Er kunnen meerdere van deze modules geinstalleerd zijn op MacOS en het is natuurlijk handig te weten welke er beschikbaar zijn. Ik heb het programmaatje uit het eerste artikel uitgebreid.

Eerst en vooral heb ik de inhoud van de [i:3228604744]main[/i:3228604744] functie losgetrokken tot een aparte C functie. Dit is het resultaat:

[code:1:3228604744]#include <Carbon/Carbon.h>

#define kColorSync30 0x00000300

void printColorSyncVersion()
{
UInt32 version;
CMError error = CMGetColorSyncVersion(&version);
printf("ColorSync version: 0x%Xn", version);
if(version > kColorSync30) {
printf("ColorSync 3.0 or greater installed!n");
}
}

int main(int argv, char** argc)
{
printColorSyncVersion();
return 0;
}[/code:1:3228604744]

Nu voeg ik voor de [i:3228604744]main[/i:3228604744] functie de functie toe om de lijst van CMM’s op te vragen. Hiervoor gebruik ik de functie [i:3228604744]CMIterateCMMInfo[/i:3228604744].

[code:1:3228604744]void printAvailableColorManagementModules()
{
UInt32 nrOfAvailableModules;
CMIterateCMMInfo(MyCMMIterateProc, &nrOfAvailableModules, nil);
printf("Available ColorManagement Modules: %dn", nrOfAvailableModules);
}[/code:1:3228604744]

Aan de [i:3228604744]CMIterateCMMInfo[/i:3228604744] functie geef ik twee pointers door. De tweede pointer wijst naar een numeriek data type waarin de functie het aantal modules zal wegschrijven. De eerste pointer wijst naar een functie met een bepaalde signatuur:

[code:1:3228604744]typedef OSErr (*CMMIterateProcPtr) (
CMMInfo * iterateData,
void * refCon
);[/code:1:3228604744]

Dit wil zeggen dat we nog een functie moeten maken die voldoet aan de omschrijving dat het twee argumenten accepteert: een pointer naar een [i:3228604744]CMMInfo[/i:3228604744] data structuur en een void pointer. Volgens de documentatie zal de functie [i:3228604744]CMIterateCMMInfo[/i:3228604744] deze functie oproepen voor elke CMM module die beschikbaar is. Als return type moet een [i:3228604744]OSErr[/i:3228604744] teruggegeven worden.

In bovenstaand voorbeeld heb ik die functie [i:3228604744]MyCMMIterateProc[/i:3228604744] genoemd met de volgende implementatie:

[code:1:3228604744]OSErr MyCMMIterateProc (
CMMInfo * iterateData,
void * refCon
)
{
printf("Module name: %sn", iterateData->ASCIIName);
printf("Description: %sn", iterateData->ASCIIDesc);
return noErr;
}[/code:1:3228604744]

Ook nog even de [i:3228604744]main[/i:3228604744] functie aanpassen:

[code:1:3228604744]int main(int argv, char** argc)
{
printColorSyncVersion();
printAvailableColorManagementModules();
return 0;
}[/code:1:3228604744]

Als we nu het volledige programma compileren en uitvoeren, dan krijgen we het volgende op het scherm te zien:

[code:1:3228604744]ColorSync version: 0x420
ColorSync 3.0 or greater installed!
Module name: Apple CMM
Description: #Copyright 2003 Apple Computer, Inc.
Available ColorManagement Modules: 1[/code:1:3228604744]

Ik heb dus 1 CMM module beschikbaar die door Apple meegeleverd wordt met het besturingssysteem.

Zelf heb ik nog een vraag voor de meer ervaren gebruikers: wie moet er een [i:3228604744]dealloc[/i:3228604744] doen van de [i:3228604744]CMMInfo[/i:3228604744] data structuren? Ik ben reeds iets te lang bezig met Java en zijn garbage collector dat ik niet goed weet hoe het zit met ownership van geheugen in C/C++.

Ringo