Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/thirdparty/harfbuzz/docs/usermanual-fonts-and-faces.xml @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mupdf-source/thirdparty/harfbuzz/docs/usermanual-fonts-and-faces.xml Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,467 @@ +<?xml version="1.0"?> +<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" + "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [ + <!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'"> + <!ENTITY version SYSTEM "version.xml"> +]> +<chapter id="fonts-and-faces"> + <title>Fonts, faces, and output</title> + <para> + In the previous chapter, we saw how to set up a buffer and fill + it with text as Unicode code points. In order to shape this + buffer text with HarfBuzz, you will need also need a font + object. + </para> + <para> + HarfBuzz provides abstractions to help you cache and reuse the + heavier parts of working with binary fonts, so we will look at + how to do that. We will also look at how to work with the + FreeType font-rendering library and at how you can customize + HarfBuzz to work with other libraries. + </para> + <para> + Finally, we will look at how to work with OpenType variable + fonts, the latest update to the OpenType font format, and at + some other recent additions to OpenType. + </para> + + <section id="fonts-and-faces-objects"> + <title>Font and face objects</title> + <para> + The outcome of shaping a run of text depends on the contents of + a specific font file (such as the substitutions and positioning + moves in the 'GSUB' and 'GPOS' tables), so HarfBuzz makes + accessing those internals fast. + </para> + <para> + An <type>hb_face_t</type> represents a <emphasis>face</emphasis> + in HarfBuzz. This data type is a wrapper around an + <type>hb_blob_t</type> blob that holds the contents of a binary + font file. Since HarfBuzz supports TrueType Collections and + OpenType Collections (each of which can include multiple + typefaces), a HarfBuzz face also requires an index number + specifying which typeface in the file you want to use. Most of + the font files you will encounter in the wild include just a + single face, however, so most of the time you would pass in + <literal>0</literal> as the index when you create a face: + </para> + <programlisting language="C"> + hb_blob_t* blob = hb_blob_create_from_file(file); + ... + hb_face_t* face = hb_face_create(blob, 0); + </programlisting> + <para> + On its own, a face object is not quite ready to use for + shaping. The typeface must be set to a specific point size in + order for some details (such as hinting) to work. In addition, + if the font file in question is an OpenType Variable Font, then + you may need to specify one or variation-axis settings (or a + named instance) in order to get the output you need. + </para> + <para> + In HarfBuzz, you do this by creating a <emphasis>font</emphasis> + object from your face. + </para> + <para> + Font objects also have the advantage of being considerably + lighter-weight than face objects (remember that a face contains + the contents of a binary font file mapped into memory). As a + result, you can cache and reuse a font object, but you could + also create a new one for each additional size you needed. + Creating new fonts incurs some additional overhead, of course, + but whether or not it is excessive is your call in the end. In + contrast, face objects are substantially larger, and you really + should cache them and reuse them whenever possible. + </para> + <para> + You can create a font object from a face object: + </para> + <programlisting language="C"> + hb_font_t* hb_font = hb_font_create(hb_face); + </programlisting> + <para> + After creating a font, there are a few properties you should + set. Many fonts enable and disable hints based on the size it + is used at, so setting this is important for font + objects. <function>hb_font_set_ppem(font, x_ppem, + y_ppem)</function> sets the pixels-per-EM value of the font. You + can also set the point size of the font with + <function>hb_font_set_ptem(font, ptem)</function>. HarfBuzz uses the + industry standard 72 points per inch. + </para> + <para> + HarfBuzz lets you specify the degree subpixel precision you want + through a scaling factor. You can set horizontal and + vertical scaling factors on the + font by calling <function>hb_font_set_scale(font, x_scale, + y_scale)</function>. + </para> + <para> + There may be times when you are handed a font object and need to + access the face object that it comes from. For that, you can call + </para> + <programlisting language="C"> + hb_face = hb_font_get_face(hb_font); + </programlisting> + <para> + You can also create a font object from an existing font object + using the <function>hb_font_create_sub_font()</function> + function. This creates a child font object that is initiated + with the same attributes as its parent; it can be used to + quickly set up a new font for the purpose of overriding a specific + font-functions method. + </para> + <para> + All face objects and font objects are lifecycle-managed by + HarfBuzz. After creating a face, you increase its reference + count with <function>hb_face_reference(face)</function> and + decrease it with + <function>hb_face_destroy(face)</function>. Likewise, you + increase the reference count on a font with + <function>hb_font_reference(font)</function> and decrease it + with <function>hb_font_destroy(font)</function>. + </para> + <para> + You can also attach user data to face objects and font objects. + </para> + </section> + + <section id="fonts-and-faces-custom-functions"> + <title>Customizing font functions</title> + <para> + During shaping, HarfBuzz frequently needs to query font objects + to get at the contents and parameters of the glyphs in a font + file. It includes a built-in set of functions that is tailored + to working with OpenType fonts. However, as was the case with + Unicode functions in the buffers chapter, HarfBuzz also wants to + make it easy for you to assign a substitute set of font + functions if you are developing a program to work with a library + or platform that provides its own font functions. + </para> + <para> + Therefore, the HarfBuzz API defines a set of virtual + methods for accessing font-object properties, and you can + replace the defaults with your own selections without + interfering with the shaping process. Each font object in + HarfBuzz includes a structure called + <literal>font_funcs</literal> that serves as a vtable for the + font object. The virtual methods in + <literal>font_funcs</literal> are: + </para> + <itemizedlist> + <listitem> + <para> + <function>hb_font_get_font_h_extents_func_t</function>: returns + the extents of the font for horizontal text. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_font_v_extents_func_t</function>: returns + the extents of the font for vertical text. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_nominal_glyph_func_t</function>: returns + the font's nominal glyph for a given code point. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_variation_glyph_func_t</function>: returns + the font's glyph for a given code point when it is followed by a + given Variation Selector. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_nominal_glyphs_func_t</function>: returns + the font's nominal glyphs for a series of code points. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_advance_func_t</function>: returns + the advance for a glyph. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_h_advance_func_t</function>: returns + the advance for a glyph for horizontal text. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_v_advance_func_t</function>:returns + the advance for a glyph for vertical text. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_advances_func_t</function>: returns + the advances for a series of glyphs. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_h_advances_func_t</function>: returns + the advances for a series of glyphs for horizontal text . + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_v_advances_func_t</function>: returns + the advances for a series of glyphs for vertical text. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_origin_func_t</function>: returns + the origin coordinates of a glyph. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_h_origin_func_t</function>: returns + the origin coordinates of a glyph for horizontal text. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_v_origin_func_t</function>: returns + the origin coordinates of a glyph for vertical text. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_extents_func_t</function>: returns + the extents for a glyph. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_contour_point_func_t</function>: + returns the coordinates of a specific contour point from a glyph. + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_name_func_t</function>: returns the + name of a glyph (from its glyph index). + </para> + </listitem> + <listitem> + <para> + <function>hb_font_get_glyph_from_name_func_t</function>: returns + the glyph index that corresponds to a given glyph name. + </para> + </listitem> + </itemizedlist> + <para> + You can create new font-functions by calling + <function>hb_font_funcs_create()</function>: + </para> + <programlisting language="C"> + hb_font_funcs_t *ffunctions = hb_font_funcs_create (); + hb_font_set_funcs (font, ffunctions, font_data, destroy); + </programlisting> + <para> + The individual methods can each be set with their own setter + function, such as + <function>hb_font_funcs_set_nominal_glyph_func(ffunctions, + func, user_data, destroy)</function>. + </para> + <para> + Font-functions structures can be reused for multiple font + objects, and can be reference counted with + <function>hb_font_funcs_reference()</function> and + <function>hb_font_funcs_destroy()</function>. Just like other + objects in HarfBuzz, you can set user-data for each + font-functions structure and assign a destroy callback for + it. + </para> + <para> + You can also mark a font-functions structure as immutable, + with <function>hb_font_funcs_make_immutable()</function>. This + is especially useful if your code is a library or framework that + will have its own client programs. By marking your + font-functions structures as immutable, you prevent your client + programs from changing the configuration and introducing + inconsistencies and errors downstream. + </para> + <para> + To override only some functions while using the default implementation + for the others, you will need to create a sub-font. By default, the + sub-font uses the font functions of its parent except for the functions + that were explicitly set. The following code will override only the + <function>hb_font_get_nominal_glyph_func_t</function> for the sub-font: + </para> + <programlisting language="C"> + hb_font_t *subfont = hb_font_create_sub_font (font) + hb_font_funcs_t *ffunctions = hb_font_funcs_create (); + hb_font_funcs_set_nominal_glyph_func (ffunctions, func, user_data, destroy); + hb_font_set_funcs (subfont, ffunctions, font_data, destroy); + hb_font_funcs_destroy (ffunctions); + </programlisting> + </section> + + <section id="fonts-and-faces-native-opentype"> + <title>Font objects and HarfBuzz's native OpenType implementation</title> + <para> + By default, whenever HarfBuzz creates a font object, it will + configure the font to use a built-in set of font functions that + supports contemporary OpenType font internals. If you want to + work with OpenType or TrueType fonts, you should be able to use + these functions without difficulty. + </para> + <para> + Many of the methods in the font-functions structure deal with + the fundamental properties of glyphs that are required for + shaping text: extents (the maximums and minimums on each axis), + origins (the <literal>(0,0)</literal> coordinate point which + glyphs are drawn in reference to), and advances (the amount that + the cursor needs to be moved after drawing each glyph, including + any empty space for the glyph's side bearings). + </para> + <para> + As you can see in the list of functions, there are separate "horizontal" + and "vertical" variants depending on whether the text is set in + the horizontal or vertical direction. For some scripts, fonts + that are designed to support text set horizontally or vertically (for + example, in Japanese) may include metrics for both text + directions. When fonts don't include this information, HarfBuzz + does its best to transform what the font provides. + </para> + <para> + In addition to the direction-specific functions, HarfBuzz + provides some higher-level functions for fetching information + like extents and advances for a glyph. If you call + </para> + <programlisting language="C"> + hb_font_get_glyph_advance_for_direction(font, direction, extents); + </programlisting> + <para> + then you can provide any <type>hb_direction_t</type> as the + <parameter>direction</parameter> parameter, and HarfBuzz will + use the correct function variant for the text direction. There + are similar higher-level versions of the functions for fetching + extents, origin coordinates, and contour-point + coordinates. There are also addition and subtraction functions + for moving points with respect to the origin. + </para> + <para> + There are also methods for fetching the glyph ID that + corresponds to a Unicode code point (possibly when followed by a + variation-selector code point), fetching the glyph name from the + font, and fetching the glyph ID that corresponds to a glyph name + you already have. + </para> + <para> + HarfBuzz also provides functions for converting between glyph + names and string + variables. <function>hb_font_glyph_to_string(font, glyph, s, + size)</function> retrieves the name for the glyph ID + <parameter>glyph</parameter> from the font object. It generates a + generic name of the form <literal>gidDDD</literal> (where DDD is + the glyph index) if there is no name for the glyph in the + font. The <function>hb_font_glyph_from_string(font, s, len, + glyph)</function> takes an input string <parameter>s</parameter> + and looks for a glyph with that name in the font, returning its + glyph ID in the <parameter>glyph</parameter> + output parameter. It automatically parses + <literal>gidDDD</literal> and <literal>uniUUUU</literal> strings. + </para> + </section> + + + <!-- Commenting out FreeType integration section-holder for now. May move + to the full-blown Integration Chapter. --> + + <!-- <section id="fonts-and-faces-freetype"> + <title>Using FreeType</title> + <para> + + </para> + <para> + + </para> + </section> --> + + <section id="fonts-and-faces-variable"> + <title>Working with OpenType Variable Fonts</title> + <para> + If you are working with OpenType Variable Fonts, there are a few + additional functions you should use to specify the + variation-axis settings of your font object. Without doing so, + your variable font's font object can still be used, but only at + the default setting for every axis (which, of course, is + sometimes what you want, but does not cover general usage). + </para> + <para> + HarfBuzz manages variation settings in the + <type>hb_variation_t</type> data type, which holds a <property>tag</property> for the + variation-axis identifier tag and a <property>value</property> for its + setting. You can retrieve the list of variation axes in a font + binary from the face object (not from a font object, notably) by + calling <function>hb_ot_var_get_axis_count(face)</function> to + find the number of axes, then using + <function>hb_ot_var_get_axis_infos()</function> to collect the + axis structures: + </para> + <programlisting language="C"> + axes = hb_ot_var_get_axis_count(face); + ... + hb_ot_var_get_axis_infos(face, 0, axes, axes_array); + </programlisting> + <para> + For each axis returned in the array, you can can access the + identifier in its <property>tag</property>. HarfBuzz also has + tag definitions predefined for the five standard axes specified + in OpenType (<literal>ital</literal> for italic, + <literal>opsz</literal> for optical size, + <literal>slnt</literal> for slant, <literal>wdth</literal> for + width, and <literal>wght</literal> for weight). Each axis also + has a <property>min_value</property>, a + <property>default_value</property>, and a <property>max_value</property>. + </para> + <para> + To set your font object's variation settings, you call the + <function>hb_font_set_variations()</function> function with an + array of <type>hb_variation_t</type> variation settings. Let's + say our font has weight and width axes. We need to specify each + of the axes by tag and assign a value on the axis: + </para> + <programlisting language="C"> + unsigned int variation_count = 2; + hb_variation_t variation_data[variation_count]; + variation_data[0].tag = HB_OT_TAG_VAR_AXIS_WIDTH; + variation_data[1].tag = HB_OT_TAG_VAR_AXIS_WEIGHT; + variation_data[0].value = 80; + variation_data[1].value = 750; + ... + hb_font_set_variations(font, variation_data, variation_count); + </programlisting> + <para> + That should give us a slightly condensed font ("normal" on the + <literal>wdth</literal> axis is 100) at a noticeably bolder + weight ("regular" is 400 on the <literal>wght</literal> axis). + </para> + <para> + In practice, though, you should always check that the value you + want to set on the axis is within the + [<property>min_value</property>,<property>max_value</property>] + range actually implemented in the font's variation axis. After + all, a font might only provide lighter-than-regular weights, and + setting a heavier value on the <literal>wght</literal> axis will + not change that. + </para> + <para> + Once your variation settings are specified on your font object, + however, shaping with a variable font is just like shaping a + static font. + </para> + </section> + + </chapter>
