1 bericht aan het bekijken (van in totaal 1)
  • Q:

    Bijdrager
    ridesmet

    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 main 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 main functie de functie toe om de lijst van CMM’s op te vragen. Hiervoor gebruik ik de functie CMIterateCMMInfo.

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

    Aan de CMIterateCMMInfo 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 CMMInfo data structuur en een void pointer. Volgens de documentatie zal de functie CMIterateCMMInfo deze functie oproepen voor elke CMM module die beschikbaar is. Als return type moet een OSErr teruggegeven worden.

    In bovenstaand voorbeeld heb ik die functie MyCMMIterateProc 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 main 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 dealloc doen van de CMMInfo 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

1 bericht aan het bekijken (van in totaal 1)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.