Decided what to do about attributes.

This commit is contained in:
Pietro Gagliardi 2017-12-09 23:47:50 -05:00
parent bad2325323
commit 4b7ca92ce7
2 changed files with 78 additions and 31 deletions

View File

@ -7,3 +7,6 @@ overlapping attributes of the same type but different values do split
empty string is allowed empty string is allowed
empty string cannot have attributes empty string cannot have attributes
font family names are case-insensitive both in attributes and in descriptors font family names are case-insensitive both in attributes and in descriptors
attributes are unique throughout a Unicode codepoint, not just to UTF-8 bytes
define what "it is an error" means in the case of uiFreeAttribute() and all uiAttributeValue() functions
does uiAttributeFamily() return a normalized string

View File

@ -1,37 +1,81 @@
// uiAttribute stores information about an attribute in a
// uiAttributedString.
//
// You do not create uiAttributes directly; instead, you create a
// uiAttribute of a given type using the specialized constructor
// functions. For every Unicode codepoint in the uiAttributedString,
// at most one value of each attribute type can be applied.
//
// uiAttributes are immutable and the uiAttributedString takes
// ownership of the uiAttribute object once assigned, copying its
// contents as necessary.
typedef struct uiAttribute uiAttribute;
// uiFreeAttribute() frees a uiAttribute. You generally do not need to
// call this yourself, as uiAttributedString does this for you. In fact,
// it is an error to call this function on a uiAttribute that has been
// given to a uiAttributedString. You can call this, however, if you
// created a uiAttribute that you aren't going to use later.
_UI_EXTERN void uiFreeAttribute(uiAttribute *a);
// uiAttributeType holds the possible uiAttribute types that may be
// returned by uiAttributeGetType(). Refer to the documentation for
// each type's constructor function for details on each type.
_UI_ENUM(uiAttributeType) {
uiAttributeTypeFamily,
uiAttributeTypeSize,
uiAttributeTypeWeight,
uiAttributeTypeItalic,
uiAttributeTypeStretch,
uiAttributeTypeColor,
uiAttributeTypeBackground,
uiAttributeTypeUnderline,
uiAttributeTypeUnderlineColor,
uiAttributeTypeFeatures,
};
// uiAttributeGetType() returns the type of a.
// TODO I don't like this name
_UI_EXTERN uiAttributeType uiAttributeGetType(const uiAttribute *a);
// uiNewFamilyAttribute() creates a new uiAttribute that changes the
// font family of the text it is applied to. Font family names are
// case-insensitive.
_UI_EXTERN uiAttribute *uiNewFamilyAttribute(const char *family);
// uiAttributeFamily() returns the font family stored in a. The
// returned string is owned by a. It is an error to call this on a
// uiAttribute that does not hold a font family.
_UI_EXTERN const char *uiAttributeFamily(const uiAttribute *a);
// uiNewSizeAttribute() creates a new uiAttribute that changes the
// size of the text it is applied to, in typographical points.
_UI_EXTERN uiAttribute *uiNewFamilyAttribute(double size);
// uiAttributeSize() returns the font size stored in a. It is an error to
// call this on a uiAttribute that does not hold a font size.
_UI_EXTERN double uiAttributeSize(const uiAttribute *a);
// uiAttribute specifies the types of possible attributes that can be
// applied to a uiAttributedString. For every Unicode codepoint in the
// uiAttributedString, at most one value of each attribute type can
// be applied.
// TODO just make a separate field in uiAttributeSpec for everything? or make attribute objects opaque instead?
_UI_ENUM(uiAttribute) {
// uiAttributeFamily changes the font family of the text it is
// applied to. Font family names are case-insensitive. Use the
// Family field of uiAttributeSpec.
uiAttributeFamily,
// uiAttributeSize changes the size of the text it is applied to,
// in typographical points. Use the Size field of uiAttributeSpec.
uiAttributeSize,
// uiAttributeWeight changes the weight of the text it is applied // uiAttributeWeight changes the weight of the text it is applied
// to. Use the Weight field of uiAttributeSpec. // to. Use the Weight field of uiAttributeSpec.
uiAttributeWeight, uiAttributeTypeWeight,
// uiAttributeItalic changes the italicness of the text it is applied // uiAttributeItalic changes the italicness of the text it is applied
// to. Use the Italic field of uiAttributeSpec. // to. Use the Italic field of uiAttributeSpec.
uiAttributeItalic, uiAttributeTypeItalic,
// uiAttributeStretch changes the stretch of the text it is applied // uiAttributeStretch changes the stretch of the text it is applied
// to. Use the Stretch field of uiAttributeSpec. // to. Use the Stretch field of uiAttributeSpec.
uiAttributeStretch, uiAttributeTypeStretch,
// uiAttributeColor changes the color of the text it is applied to. // uiAttributeColor changes the color of the text it is applied to.
// Use the R, G, B, and A fields of uiAttributeSpec. // Use the R, G, B, and A fields of uiAttributeSpec.
uiAttributeColor, uiAttributeTypeColor,
// uiAttributeBackground changes the color of the text it is // uiAttributeBackground changes the color of the text it is
// applied to. Use the R, G, B, and A fields of uiAttributeSpec. // applied to. Use the R, G, B, and A fields of uiAttributeSpec.
uiAttributeBackground, uiAttributeTypeBackground,
// uiAttributeUnderline changes the underline style of the text // uiAttributeUnderline changes the underline style of the text
// it is applied to. Use the UnderlineStyle field of // it is applied to. Use the UnderlineStyle field of
// uiAttributeSpec. // uiAttributeSpec.
uiAttributeUnderline, uiAttributeTypeUnderline,
// uiAttributeUnderlineColor changes the color of any underline // uiAttributeUnderlineColor changes the color of any underline
// on the text it is applied to, regardless of the style. Use the // on the text it is applied to, regardless of the style. Use the
// UnderlineColor field of uiAttributeSpec, and also the R, G, B, // UnderlineColor field of uiAttributeSpec, and also the R, G, B,
@ -41,25 +85,25 @@ _UI_ENUM(uiAttribute) {
// specified, the text color is used instead. If an underline color // specified, the text color is used instead. If an underline color
// is specified without an underline style, the underline color // is specified without an underline style, the underline color
// attribute is ignored, but not elided. // attribute is ignored, but not elided.
uiAttributeUnderlineColor, uiAttributeTypeUnderlineColor,
// uiAttributeFeatures changes the OpenType features of the // uiAttributeFeatures changes the OpenType features of the
// text it is applied to. Use the Features field of uiAttributeSpec. // text it is applied to. Use the Features field of uiAttributeSpec.
uiAttributeFeatures, uiAttributeTypeFeatures,
}; };
_UI_ENUM(uiDrawUnderlineStyle) { _UI_ENUM(uiUnderlineStyle) {
uiDrawUnderlineStyleNone, uiUnderlineStyleNone,
uiDrawUnderlineStyleSingle, uiUnderlineStyleSingle,
uiDrawUnderlineStyleDouble, uiUnderlineStyleDouble,
uiDrawUnderlineStyleSuggestion, // wavy or dotted underlines used for spelling/grammar checkers uiUnderlineStyleSuggestion, // wavy or dotted underlines used for spelling/grammar checkers
}; };
_UI_ENUM(uiDrawUnderlineColor) { _UI_ENUM(uiUnderlineColor) {
uiDrawUnderlineColorCustom, // also use R/G/B/A fields uiUnderlineColorCustom,
uiDrawUnderlineColorSpelling, uiUnderlineColorSpelling,
uiDrawUnderlineColorGrammar, uiUnderlineColorGrammar,
uiDrawUnderlineColorAuxiliary, // for instance, the color used by smart replacements on OS X uiUnderlineColorAuxiliary, // for instance, the color used by smart replacements on OS X
}; };
// uiOpenTypeFeatures represents a set of OpenType feature // uiOpenTypeFeatures represents a set of OpenType feature