diff options
Diffstat (limited to 'libfonts.h')
-rw-r--r-- | libfonts.h | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/libfonts.h b/libfonts.h new file mode 100644 index 0000000..c4cb229 --- /dev/null +++ b/libfonts.h @@ -0,0 +1,318 @@ +/* See LICENSE file for copyright and license details. */ +#ifndef LIBFONTS_H +#define LIBFONTS_H + + +enum libfonts_antialiasing { + LIBFONTS_ANTIALIASING_NONE, + LIBFONTS_ANTIALIASING_GREYSCALE, + LIBFONTS_ANTIALIASING_SUBPIXEL, + LIBFONTS_ANTIALIASING_SUBPIXEL_FORCED +}; + +enum libfonts_subpixel_order { + LIBFONTS_SUBPIXEL_ORDER_UNKNOWN, + LIBFONTS_SUBPIXEL_ORDER_NONRGB, + LIBFONTS_SUBPIXEL_ORDER_NONLINEAR, + LIBFONTS_SUBPIXEL_ORDER_OTHER, + + /* For any value V, a rotation of 90⋅R degrees, R integer, + * clockwise, of the physical output, will yeild a subpixel + * order represented with the value (V + R) Mod 4 + ⌊V / 4⌋, + * if V ≥ 4, otherwise V asis. A rotation that is not + * divisible by 90 degrees, will yeild the subpixel order + * LIBFONTS_SUBPIXEL_ORDER_NONLINEAR if V is greater or equal + * to LIBFONTS_SUBPIXEL_ORDER_NONLINEAR, otherwise V as is */ + + /* The reason the subpixel order RG_GB, and similar orders + * are excluded from the list is that the green segment of + * the pixel is disjoint and therefore not suitable for + * subpixel rendering; instead NONLINEAR should is used. */ + + LIBFONTS_SUBPIXEL_ORDER_RGB, + LIBFONTS_SUBPIXEL_ORDER_R_G_B, /* vertically stacked horizontal stripes */ + LIBFONTS_SUBPIXEL_ORDER_BGR, + LIBFONTS_SUBPIXEL_ORDER_B_G_R, + + LIBFONTS_SUBPIXEL_ORDER_GBR, + LIBFONTS_SUBPIXEL_ORDER_G_B_R, + LIBFONTS_SUBPIXEL_ORDER_RBG, + LIBFONTS_SUBPIXEL_ORDER_R_B_G, + + LIBFONTS_SUBPIXEL_ORDER_BRG, + LIBFONTS_SUBPIXEL_ORDER_B_R_G, + LIBFONTS_SUBPIXEL_ORDER_GRB, + LIBFONTS_SUBPIXEL_ORDER_G_R_B, + + LIBFONTS_SUBPIXEL_ORDER_RR_GB, + LIBFONTS_SUBPIXEL_ORDER_GR_BR, + LIBFONTS_SUBPIXEL_ORDER_BG_RR, + LIBFONTS_SUBPIXEL_ORDER_RB_RG, + + LIBFONTS_SUBPIXEL_ORDER_RR_BG, + LIBFONTS_SUBPIXEL_ORDER_BR_GR, + LIBFONTS_SUBPIXEL_ORDER_GB_RR, + LIBFONTS_SUBPIXEL_ORDER_RG_RB, + + LIBFONTS_SUBPIXEL_ORDER_GG_RB, + LIBFONTS_SUBPIXEL_ORDER_RG_BG, + LIBFONTS_SUBPIXEL_ORDER_BR_GG, + LIBFONTS_SUBPIXEL_ORDER_GB_GR, + + LIBFONTS_SUBPIXEL_ORDER_GG_BR, + LIBFONTS_SUBPIXEL_ORDER_BG_RG, + LIBFONTS_SUBPIXEL_ORDER_RB_GG, + LIBFONTS_SUBPIXEL_ORDER_GR_GB, + + LIBFONTS_SUBPIXEL_ORDER_BB_RG, + LIBFONTS_SUBPIXEL_ORDER_RB_GB, + LIBFONTS_SUBPIXEL_ORDER_GR_BB, + LIBFONTS_SUBPIXEL_ORDER_BG_BR, + + LIBFONTS_SUBPIXEL_ORDER_BB_GR, + LIBFONTS_SUBPIXEL_ORDER_GB_RB, + LIBFONTS_SUBPIXEL_ORDER_RG_BB, + LIBFONTS_SUBPIXEL_ORDER_BR_BG +}; + +enum libfonts_orientation { + LIBFONTS_ORIENTATION_UNKNOWN, + LIBFONTS_ORIENTATION_0_DEGREES_CLOCKWISE, + LIBFONTS_ORIENTATION_90_DEGREES_CLOCKWISE, + LIBFONTS_ORIENTATION_180_DEGREES_CLOCKWISE, + LIBFONTS_ORIENTATION_270_DEGREES_CLOCKWISE, + LIBFONTS_ORIENTATION_OTHER +}; + +struct libfonts_rendering_settings { + uint16_t deci_dpi_x; + uint16_t deci_dpi_y; + enum libfonts_antialiasing horizontal_grey_text_antialiasing; + enum libfonts_antialiasing vertical_grey_text_antialiasing; + enum libfonts_antialiasing diagonal_grey_text_antialiasing; + enum libfonts_antialiasing horizontal_colour_text_antialiasing; + enum libfonts_antialiasing vertical_colour_text_antialiasing; + enum libfonts_antialiasing diagonal_colour_text_antialiasing; + enum libfonts_subpixel_order unrotated_subpixel_order; + enum libfonts_orientation default_physical_screen_orientation; +}; + +struct libfonts_output { + int32_t output_x; + int32_t output_y; + uint32_t output_width; + uint32_t output_height; + int output_screen; + enum libfonts_orientation physical_screen_orientation; + enum libfonts_subpixel_order unrotated_subpixel_order; + uint16_t deci_dpi_x; + uint16_t deci_dpi_y; + struct libfonts_rendering_settings *rendering_settings; +}; + + +struct libfonts_font_description { + /** + * The font name unless the foundry is registered with X, + * in which case, all following fields will be NULL. + * This field is normally NULL. + * + * This field will also be used to to store the font name + * (including the initial "-") if it is malformated. + */ + const char *private_font_name; + + /** + * Version if the XLFD used, NULL if not included in the font name + * (this is normally the case) + */ + const char *xlfd_version; + + /** + * X-registered foundry name (name of digitaliser, not designer) + */ + const char *foundry; + + /** + * Human-readable, non-translated, hyphen-free name of the font + */ + const char *family_name; + + /** + * The nominal blackness of the font, according the the foundry's + * judgement. Human-readable and suitable for presentation to the + * user. "0" if the font is polymorphic. + * + * Should not be used for font matching or substitution. + */ + const char *weight_name; + + /** + * Overall posture + * + * "R" = Roman + * "I" = Italic + * "O" = Oblique + * "RI" = Reverse italic + * "RO" = Reverse oblique + * "OT" = Other + * numeric = Polymorphic + */ + const char *slant; + + /** + * The nominal width per horizontal unit of the font, according to the + * foundry's judgment. "0" if the font is polymorphic. + * + * Should not be used for font matching or substitution. + * + * Example values: + * "Normal" + * "Condensed" + * "Narrow" + * "Double Wide" + */ + const char *setwidth_name; + + /** + * Additional style information. Includes the "[" character if the + * font is polymorphic + * + * Example values: + * "" + * "Serif" + * "Sans Serif" + * "Informal" + * "Decorated" + */ + const char *add_style_name; + + /** + * The body size of the font at a particular point size and Y-resolution. + * Either an integer-string or (if using matrix transformation) a string + * beginning with "[". "0" if the font is scalable. + */ + const char *pixel_size; + + /** + * The body size the font was designed for. Either an integer-string or + * (if using matrix transformation) a string beginning with "[". If the + * value is an integer, the body size is expressed in decipoints (72.27 + * points equal 1 inch). "0" if the font is scalable. + */ + const char *point_size; + + /** + * Horizontal resolution (unsigned integer), measured in pixels or dots + * per inch (DPI), for which the font was designed. "0" if the font is + * scalable. + */ + const char *resolution_x; + + /** + * Vertical resolution (unsigned integer), measured in pixels or dots + * per inch (DPI), for which the font was designed. "0" if the font is + * scalable. + */ + const char *resolution_y; + + /** + * Escapement class of the font + * + * "P" = Proportional + * Logical character widths vary for each glyph + * + * "M" = Monospace + * Logical character widths are constant + * + * "C" = Character cell + * Monospaced font where no glyph have "ink" outside of + * the character cell, and there is no kerning and + * vertical extents of the font do not exceed the vertical + * spacing. The cell height = font-descent + font-ascent, + * and the cell width = the average width. + */ + const char *spacing; + + /** + * Unweighted arithmetic mean of the absolute value of the width of each + * glyph, measured in decipixels, and encoded as an integer. Multiplied + * by −1 if the dominant writing direction for the font is right-to-left. + * "0" if the font is scalable. + * + * Negative values are encoding with a leading "~", which will be + * converted to "-" when parsed. + */ + const char *average_width; + + /** + * X-registered authority the character set encoding is + * standardised by + */ + const char *charset_registry; + + /** + * The character set encoding + * + * Unicode shall be represented with the combnation of "iso10646" + * (any case) in `.charset_registry` and `1` in `.charset_encoding` + */ + const char *charset_encoding; + + /** + * Character subset hint, or NULL if none + * + * Will be a sorted, in ascending order, <space>-separated list of + * inclusive ranges included the subset. A range will either be a + * decimal integer, or an two decimal integers separated by a "-" + * (the left-hand side will be strictly less than the right-hand side). + * All ranges will be disjunction, and have a non-zero distance. + * + * The library will take care of converting hexadecimal numbers (prefixed + * with "0x") to decimal, removing leading zeroes, converting "_" to "-", + * and sorting the range, reducing singleton ranges to single numbers, + * and merge mergable ranges. Ranges including negative values and values + * 0x80000000 (1 exceeded the maximum value of an unsigned 31-bit integer, + * which is less than the smallest number (0xE8D4A51000 = 1000000000000) + * whose prefixed hexadecimal representation is shorter than it's decimal + * representation) or greater, will be rejected. + * + * This information is encoded in the character set encoding field, + * but the libraries separates out this information to its own + * field in this `struct`. + */ + const char *charset_subset; + + /** + * "-"-separated list of unrecognised fields, NULL if none. + * Note that the empty string indicates that there was one + * unrecognised fields, containing the empty string. + * + * These fields will not be parsed in any way, meaning + * for example that negative values encoded will a leading + * "~" will retain the "~" uncoverted. + */ + const char *unrecognised_fields; + + /** + * For internal use only. + * + * Store the strings in the struct. Limited to 256 + * bytes because a font name may only included up + * to 255 bytes; add one for NUL-termination. + */ + char _buf[256]; +}; + + +int libfonts_encode_font_description(const struct libfonts_font_description *, char[static 256]); +int libfonts_decode_font_description(struct libfonts_font_description *, const char *); + +int libfonts_get_default_rendering_settings(struct libfonts_rendering_settings *); +int libfonts_get_output_rendering_settings(struct libfonts_rendering_settings *, const char *); +int libfonts_get_output_dpi(struct libfonts_output *, const char *); + +enum libfonts_subpixel_order libfonts_calculate_subpixel_order(enum libfonts_subpixel_order, enum libfonts_orientation); + + +#endif |