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!
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
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. –
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. –