2013-08-14 3 views
2

Je suis en train d'écrire simple générateur de polices bitmap à l'aide CoreGraphics et CoreText. Je suis en train de récupérer la table de crénage d'une police avec:OSX: CGGlyph à UNICHAR

CFDataRef kernTable = CTFontCopyTable(m_ctFontRef, kCTFontTableKern, kCTFontTableOptionNoOptions); 

puis l'analyse syntaxique qui fonctionne très bien. Les paires de crénage me donnent les indices de glyphe (à savoir CGGlyph) pour les paires de crénage, et je dois les traduire en unicode (à savoir UNICHAR), qui ne semble malheureusement pas super facile. Le plus proche je suis arrivé utilisait:

CGFontCopyGlyphNameForGlyph 

pour récupérer le nom de glyphe du CGGlyph, mais je ne sais pas comment convertir le nom unicode, car ils sont vraiment seulement des chaînes telles que quoteleft. Une autre chose que je pensais à propos de moi-même a été l'analyse kCTFontTableCmap faire manuellement la mise en correspondance du glyphe à l'ID unicode, mais qui semble être une tonne de travail supplémentaire pour la tâche. Y a-t-il un moyen simple de le faire?

Merci!

Répondre

4

Je ne sais pas une méthode directe pour obtenir l'Unicode pour un glyphe donné, mais vous pouvez construire une cartographie de la manière suivante:

  • Obtenir tous les caractères de la police avec CTFontCopyCharacterSet().
  • tous ces caractères Map Unicode à leur glyphe avec CTFontGetGlyphsForCharacters().
  • Pour chaque caractère Unicode et son glyphe, stocker la cartographie glyph -> Unicode dans un dictionnaire.
+0

J'ai upvoted vous répondez comme cela semble être une façon de s'y prendre qui est certainement plus simple que l'analyse kCTFontTableCmap. Je vais accepter cela comme la réponse, si rien ne se passe mieux! Merci beaucoup! – moka

+1

C'est probablement la bonne direction. Le problème principal est que le caractère glyph-> n'est pas une conversion 1: 1. Par exemple, il peut y avoir un seul glyphe pour une ligature comme "fi". Il n'y a pas de tel personnage, alors à quoi le mapperiez-vous? L'approche de Martin est raisonnable en ce sens qu'elle vous donne le sous-ensemble de glyphes qui ont en réalité une correspondance de 1: 1. –

+1

N'oubliez pas qu'il est légal pour un personnage de ne pas correspondre à un glyphe (vous pouvez obtenir 0 dans le tableau retourné). Et il est légal pour plusieurs personnages de correspondre au même glyphe (bien que je n'ai pas vu cela se produire personnellement). Les polices peuvent avoir des règles spéciales pour combiner des caractères. Il est légal de représenter å (U + 00E5, lettre minuscule latine A avec anneau ci-dessus) comme un glyphe ou deux. Il se peut donc que vous n'obteniez pas toujours exactement ce que vous attendez lors de la mise en correspondance entre les caractères et les glyphes. –