Remplacement de CMNewProfileSearch par un code 64 bits non obsolète
-
03-07-2019 - |
Question
J'ai un code existant qui utilise CMNewProfileSearch
pour rechercher, puis parcourir les profils de couleur sur le système, en obtenant leurs noms et leurs chemins d'accès complets. Malheureusement, CMNewProfileSearch
est obsolète dans Mac OS X 10.5 et n'est également pas disponible lors de la compilation d'une application 64 bits.
Lors de la lecture de la référence ColorSync Manager 2.5, il semble que la nouvelle méthode d'itération sur les profils de couleur installés consiste à utiliser la fonction CMIterateColorSyncFolder
.
- Est-ce vrai?
- Existe-t-il un moyen Cocoa de faire ce que je veux à la place?
- Quelqu'un a-t-il un exemple de code?
Merci.
La solution
-
Oui. Comme vous l'avez indiqué, le ColorSync Manager Reference suivant:
La fonction CMNewProfileSearch ne tire pas pleinement parti du profil optimisé. recherche disponible à partir de ColorSync version 2.5. Utiliser CMIterateColorSyncFolder au lieu de cela.
-
CMIterateColorSyncFolder
est la manière officielle de le faire. En outre, c’est aussi la méthode optimisée .
EDIT: j'ai modifié l'exemple de code pour supprimer NewCMProfileIterateUPP
et DisposeCMProfileIterateUPP
.
// Callback routine with a description of a profile that is
// called during an iteration through the available profiles.
//
static OSErr profileIterate (CMProfileIterateData *info, void *refCon)
{
NSMutableArray* array = (NSMutableArray*) refCon;
Profile* prof = [Profile profileWithIterateData:info];
if (prof)
[array addObject:prof];
return noErr;
}
// return an array of all profiles
//
+ (NSArray*) arrayOfAllProfiles
{
NSMutableArray* profs=[[NSMutableArray arrayWithCapacity:0] retain];
CMIterateColorSyncFolder(profileIterate, NULL, 0L, profs);
return (NSArray*)profs;
}
Il s'avère qu'il n'est pas nécessaire que NewCMProfileIterateUPP
et DisposeCMProfileIterateUPP
soient remplacés par rien, pour autant que je sache. Au lieu de cela, vous pouvez définir la fonction de rappel avec une signature qui correspond à profileIterate
, ci-dessus. Vous pouvez ensuite simplement passer la fonction de rappel directement à CMIterateColorSyncFolder
.
J'ai testé mes modifications dans ImageApp sous Mac OS X 10.5. cela fonctionne comme prévu.