_UI_ENUM(uiAttribute) { uiAttributeFamily, uiAttributeSize, // use Double uiAttributeWeight, uiAttributeItalic, uiAttributeStretch, uiAttributeColor, // use R, G, B, A uiAttributeBackground, // use R, G, B, A // TODO kerning amount // OS X: kCTKernAttributeName // > 0: farther (TODO from advance or standard kerning?) // == 0: no kerning // < 0: closer (TODO same) // undefined: standard kerning // Pango: pango_attr_letter_spacing_new() // parameter meaning unspecified // Windows: requires Platform Update, SetLetterSpacing() // parameter meaning unspecified uiAttributeUnderline, // enum uiDrawUnderlineStyle // TODO what is the color in the case we don't specify it, black or the text color? uiAttributeUnderlineColor, // enum uiDrawUnderlineColor // TODO kCTSuperscriptAttributeName vs below // all it does is set the below attribute so // TODO kCTBaselineClassAttributeName, kCTBaselineInfoAttributeName, kCTBaselineReferenceInfoAttributeName // TODO strikethroughs? (pango yes, directwrite yes, os x no) // TODO baseline offsets? (pango yes) // TODO size scales? (pango yes) // TODO fallbacks (pango: enable or disable) // TODO document that this will also enable language-specific font features (TODO on DirectWrite too?) // TODO document that this should be strict BCP 47 form (A-Z, a-z, 0-9, and -) for maximum compatibility uiAttributeLanguage, // BCP 47 string // These attributes represent typographic features. Each feature // is a separate attribute, to make composition easier. The // availability of for each attribute are defined by the font; the // default values are defined by the font and/or by the OS. // // A note about features whose parameter is an enumeration: // OS X defines typographic features using the AAT specification // and converts to OpenType internally when needed, whereas // other platforms use OpenType directly. OpenType is less // precise about what each enumeration value means than AAT // is, so enumeration values do not necessarily represent what // OS X expects with all fonts. In cases where they do, libui // provides an enumeration type to use. Otherwise, the AAT // enumeration values are provided in comments for // documentation purposes. // TODO kAllTypographicFeaturesType // AAT calls these "common ligatures" uiAttributeStandardLigatures, // 0 = off, 1 = on uiAttributeRequiredLigatures, // 0 = off, 1 = on // AAT calls these "rare ligatures" uiAttributeDiscretionaryLigatures, // 0 = off, 1 = on uiAttributeContextualLigatures, // 0 = off, 1 = on uiAttributeHistoricalLigatures, // 0 = off, 1 = on // TODO uiAttributeCursiveConnection, // 0 = none, 1 = some, 2 = all uiAttributeUnicase, // 0 = off, 1 = on // TODO uiAttributeLinguisticRearrangement, // 0 = off, 1 = on // TODO rename this uiAttributeNumberSpacings, // enum uiAttributeNumberSpacing // TODO kSmartSwashType, falt and jalt // TODO kDiacriticsType uiAttributeSuperscripts, // enum uiAttributeSuperscript uiAttributeFractionForms, // enum uiAttributeFractionForm uiAttributeSlashedZero, // 0 = off, 1 = on uiAttributeMathematicalGreek, // 0 = off, 1 = on // AAT defines the following values: // 0 = none // 1 = dingbats // 2 = pi characters // 3 = fleurons // 4 = decorative borders // 5 = international symbols // 6 = mathematical symbols // OpenType says alphanumeric characters must(? TODO) have one form each and the bullet character U+2022 (•) can have many uiAttributeOrnamentalForms, // an integer from 0 to a font-specified upper bound // TODO provide a function to get the upper bound? // 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 // AAT calls these "character shapes" uiAttributeHanCharacterForms, // enum uiAttributeHanCharacterForm // OpenType calls these "old-style" uiAttributeLowercaseNumbers, // 0 = off, 1 = on // TODO kTextSpacingType // see kKanaSpacingType below uiAttributeHanjaToHangul, // 0 = off, 1 = on // AAT defines the following values: // 0 = none // 1 = box // 2 = rounded box // 3 = circle // 4 = inverted circle // 5 = parentheses // 6 = period // 7 = roman numeral // 8 = diamond // 9 = inverted box // 10 = inverted rounded box // TODO rename to AnnotatedForms? uiAttributeAnnotatedGlyphForms, // an integer from 0 to a font-specified upper bound // TODO provide a function to get the upper bound? // TODO kKanaSpacingType // TODO kIdeographicSpacingType // can they be provided independently of kTextSpacingType? Core Text doesn't seem to // TODO kUnicodeDecompositionType uiAttributeRubyKanaForms, // 0 = off, 1 = on // TODO kCJKVerticalRomanPlacementType // this is 'valt' in OpenType but I don't know if I want to make it selectable or not uiAttributeCJKRomansToItalics, // 0 = off, 1 = on // AAT calls this "case-sensitive layout" uiAttributeCaseSensitiveForms, // 0 = off, 1 = on // AAT: this is called "case-sensitive spacing" uiAttributeCapitalSpacing, // 0 = off, 1 = on uiAttributeAlternateHorizontalKana, // 0 = off, 1 = on uiAttributeAlternateVerticalKana, // 0 = off, 1 = on // TODO "Alternate"? unify all this // TODO document that these are guaranteed to be consecutive uiAttributeStylisticAlternate1, // 0 = off, 1 = on uiAttributeStylisticAlternate2, // 0 = off, 1 = on uiAttributeStylisticAlternate3, // 0 = off, 1 = on uiAttributeStylisticAlternate4, // 0 = off, 1 = on uiAttributeStylisticAlternate5, // 0 = off, 1 = on uiAttributeStylisticAlternate6, // 0 = off, 1 = on uiAttributeStylisticAlternate7, // 0 = off, 1 = on uiAttributeStylisticAlternate8, // 0 = off, 1 = on uiAttributeStylisticAlternate9, // 0 = off, 1 = on uiAttributeStylisticAlternate10, // 0 = off, 1 = on uiAttributeStylisticAlternate11, // 0 = off, 1 = on uiAttributeStylisticAlternate12, // 0 = off, 1 = on uiAttributeStylisticAlternate13, // 0 = off, 1 = on uiAttributeStylisticAlternate14, // 0 = off, 1 = on uiAttributeStylisticAlternate15, // 0 = off, 1 = on uiAttributeStylisticAlternate16, // 0 = off, 1 = on uiAttributeStylisticAlternate17, // 0 = off, 1 = on uiAttributeStylisticAlternate18, // 0 = off, 1 = on uiAttributeStylisticAlternate19, // 0 = off, 1 = on uiAttributeStylisticAlternate20, // 0 = off, 1 = on uiAttributeContextualAlternates, // 0 = off, 1 = on uiAttributeSwashes, // 0 = off, 1 = on uiAttributeContextualSwashes, // 0 = off, 1 = on uiAttributeLowercaseCapForms, // enum uiAttributeCapForm uiAttributeUppercaseCapForms, // enum uiAttributeCapForm // TODO kCJKRomanSpacingType // TODO uiAttributeSystem, (this might not be doable with DirectWrite) // TODO uiAttributeCustom, };