From 16b0ca518e57cbd8bd1def4f65e068768deaee75 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Tue, 14 Feb 2017 21:18:56 -0500 Subject: [PATCH] Synced opentype.c to AAT and more TODOs. --- common/opentype.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++- ui_attrstr.h | 25 +++++++++++++------- 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/common/opentype.c b/common/opentype.c index 12d14699..f561eeab 100644 --- a/common/opentype.c +++ b/common/opentype.c @@ -2,7 +2,8 @@ #include "../ui.h" #include "uipriv.h" -// note: each tag should only appear in quotes once; this allows automated tools to determine what we cover and don't cover +// Notes: +// - Each tag should only appear in quotes once; this allows automated tools to determine what we cover and don't cover typedef void (*specToOpenTypeEnumFunc)(const char *featureTag, uint32_t param, void *data); @@ -15,6 +16,15 @@ static void boolspec(uiAttributeSpec *spec, const char *featureTag, specToOpenTy (*f)(featureTag, 0, data); } +static void boolspecnot(uiAttributeSpec *spec, const char *featureTag, specToOpenTypeEnumFunc f, void *data) +{ + if (spec->Value == 0) { + (*f)(featureTag, 1, data); + return; + } + (*f)(featureTag, 0, data); +} + void specToOpenType(uiAttributeSpec *spec, specToOpenTypeEnumFunc f, void *data) { switch (spec->Type) { @@ -32,11 +42,25 @@ void specToOpenType(uiAttributeSpec *spec, specToOpenTypeEnumFunc f, void *data) return; case uiAttributeHistoricalLigatures: boolspec(spec, "hlig", f, data); + // This technically isn't what is meant by "historical ligatures", but Core Text's internal AAT-to-OpenType mapping says to include it, so we include it too + boolspec(spec, "hist", f, data); return; case uiAttributeUnicase: boolspec(spec, "unic", f, data); return; // TODO is this correct or should we explicitly switch the rest off too? + case uiAttributeNumberSpacings: + // TODO does Core Text set both? do we? + switch (spec->Value) { + case uiAttributeNumberSpacingProportional: + (*f)("pnum", 1, data); + break; + case uiAttributeNumberSpacingTitling: + (*f)("tnum", 1, data); + break; + } + return; + // TODO is this correct or should we explicitly switch the rest off too? case uiAttributeSuperscripts: switch (spec->Value) { case uiAttributeSuperscriptSuperscript: @@ -73,6 +97,9 @@ void specToOpenType(uiAttributeSpec *spec, specToOpenTypeEnumFunc f, void *data) case uiAttributeOrnamentalForms: (*f)("ornm", (uint32_t) (spec->Value), data); return; + case uiAttributeSpecificCharacterForm: + (*f)("aalt", (uint32_t) (spec->Value), data); + return; case uiAttributeTitlingCapitalForms: boolspec(spec, "titl", data); return; @@ -113,6 +140,12 @@ void specToOpenType(uiAttributeSpec *spec, specToOpenTypeEnumFunc f, void *data) return; case uiAttributeLowercaseNumbers: boolspec(spec, "onum", data); + // Core Text's internal AAT-to-OpenType mapping says to include this, so we include it too + // TODO is it always set? + boolspecnot(spec, "lnum", data); + return; + case uiAttributeHanjaToHangul: + boolspec(spec, "hngl", data); return; case uiAttributeGlyphAnnotations: (*f)("nalt", (uint32_t) (spec->Value), data); @@ -225,3 +258,26 @@ void specToOpenType(uiAttributeSpec *spec, specToOpenTypeEnumFunc f, void *data) return; } } + +// TODO missing that AAT uses directly: +// - pkna, pwid, fwid, hwid, twid, qwid, palt, valt, vpal, halt, vhal, kern, vkrn (CJK width control) +// - ruby +// missing that AAT knows about: +// - abvf, abvm, abvs, blwf, blwm, blws (baselines) +// - akhn, dist, half, haln, nukt, rkrf, rphf, vatu (Devanagari support) +// - ccmp (compositions) +// - cjct, pres, pstf, psts (Indic script support) +// - curs (cursive positioning) +// - dnom, numr (fraction parts) +// - falt, fina, init, isol, jalt, medi, mset (Arabic support) +// - rclt (required contextual alternates) +// - fin2, fin3, med2 (Syriac script support) +// - lfbd, opbd, rtbd (optical bounds support) +// - ljmo, tjmo, vjmo (Hangul Jamo support) +// - locl (Cyrillic support) +// - ltra, ltrm, rtla, rtlm (bidi support) +// - mark, mkmk (mark positioning) +// - pref (Khmer support) +// - rand (random glyph selection candidates) +// - salt (stylistic alternatives) +// - size (sizing info) diff --git a/ui_attrstr.h b/ui_attrstr.h index 3da40fe1..c33e3fb6 100644 --- a/ui_attrstr.h +++ b/ui_attrstr.h @@ -76,11 +76,8 @@ _UI_ENUM(uiAttribute) { // TODO uiAttributeLinguisticRearrangement, // 0 = off, 1 = on - // AAT: if off, "monospaced number spacing"; if on, "proportional number spacing" - // OpenType: non-proportional numbers are called "tabular" - // TODO uiAttributeProportionalNumbers, // 0 = off, 1 = on - // TODO kNumberSpacingType 0 or 1 - // TODO really? + // TODO rename this + uiAttributeNumberSpacings, // enum uiAttributeNumberSpacing // TODO kSmartSwashType @@ -106,7 +103,13 @@ _UI_ENUM(uiAttribute) { uiAttributeOrnamentalForms, // an integer from 0 to a font-specified upper bound // TODO provide a function to get the upper bound? - // TODO kCharacterAlternativesType + // AAT calls this "character alternatives" and defines the + // following values: + // 0 = none + // OpenType calls this "access all alternates". + // TODO doesn't OpenType do the same about 0? + uiAttributeSpecificCharacterForm, // an integer from 0 to a font-specified upper bound + // TODO provide a function to get the upper bound? uiAttributeTitlingCapitalForms, // 0 = off, 1 = on @@ -119,7 +122,7 @@ _UI_ENUM(uiAttribute) { // TODO kTextSpacingType // see kKanaSpacingType below - // TODO kTransliterationType + uiAttributeHanjaToHangul, // 0 = off, 1 = on // AAT defines the following values: // 0 = none @@ -139,7 +142,7 @@ _UI_ENUM(uiAttribute) { // TODO kKanaSpacingType // TODO kIdeographicSpacingType - // should these be provided? CAN they be provided? + // can they be provided independently of kTextSpacingType? Core Text doesn't seem to // TODO kUnicodeDecompositionType @@ -211,6 +214,12 @@ _UI_ENUM(uiDrawUnderlineColor) { uiDrawUnderlineColorAuxiliary, // for instance, the color used by smart replacements on OS X }; +_UI_ENUM(uiAttributeNumberSpacing) { + uiAttributeNumberSpacingProportional, + // AAT calls this "monospaced" + uiAttributeNumberSpacingTabular, +}; + _UI_ENUM(uiAttributeSuperscript) { uiAttributeSuperscriptNone, uiAttributeSuperscriptSuperscript, // AAT: "superior"