<?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="buffers-language-script-and-direction">
  <title>Buffers, language, script and direction</title>
  <para>
    The input to the HarfBuzz shaper is a series of Unicode characters, stored in a
    buffer. In this chapter, we'll look at how to set up a buffer with
    the text that we want and how to customize the properties of the
    buffer. We'll also look at a piece of lower-level machinery that
    you will need to understand before proceeding: the functions that
    HarfBuzz uses to retrieve Unicode information.
  </para>
  <para>
    After shaping is complete, HarfBuzz puts its output back
    into the buffer. But getting that output requires setting up a
    face and a font first, so we will look at that in the next chapter
    instead of here.
  </para>
  <section id="creating-and-destroying-buffers">
    <title>Creating and destroying buffers</title>
    <para>
      As we saw in our <emphasis>Getting Started</emphasis> example, a
      buffer is created and 
      initialized with <function>hb_buffer_create()</function>. This
      produces a new, empty buffer object, instantiated with some
      default values and ready to accept your Unicode strings.
    </para>
    <para>
      HarfBuzz manages the memory of objects (such as buffers) that it
      creates, so you don't have to. When you have finished working on 
      a buffer, you can call <function>hb_buffer_destroy()</function>:
    </para>
<programlisting language="C">
hb_buffer_t *buf = hb_buffer_create();
...
hb_buffer_destroy(buf);
</programlisting>
    <para>
      This will destroy the object and free its associated memory -
      unless some other part of the program holds a reference to this
      buffer. If you acquire a HarfBuzz buffer from another subsystem
      and want to ensure that it is not garbage collected by someone
      else destroying it, you should increase its reference count:
    </para>
<programlisting language="C">
void somefunc(hb_buffer_t *buf) {
  buf = hb_buffer_reference(buf);
  ...
</programlisting>
    <para>
      And then decrease it once you're done with it:
    </para>
<programlisting language="C">
  hb_buffer_destroy(buf);
}
</programlisting>
    <para>
      While we are on the subject of reference-counting buffers, it is
      worth noting that an individual buffer can only meaningfully be
      used by one thread at a time.
    </para>
    <para>
      To throw away all the data in your buffer and start from scratch,
      call <function>hb_buffer_reset(buf)</function>. If you want to
      throw away the string in the buffer but keep the options, you can
      instead call <function>hb_buffer_clear_contents(buf)</function>.
    </para>
  </section>
  
  <section id="adding-text-to-the-buffer">
    <title>Adding text to the buffer</title>
    <para>
      Now we have a brand new HarfBuzz buffer. Let's start filling it
      with text! From HarfBuzz's perspective, a buffer is just a stream
      of Unicode code points, but your input string is probably in one of
      the standard Unicode character encodings (UTF-8, UTF-16, or
      UTF-32). HarfBuzz provides convenience functions that accept
      each of these encodings:
      <function>hb_buffer_add_utf8()</function>,
      <function>hb_buffer_add_utf16()</function>, and
      <function>hb_buffer_add_utf32()</function>. Other than the
      character encoding they accept, they function identically.
    </para>
    <para>
      You can add UTF-8 text to a buffer by passing in the text array,
      the array's length, an offset into the array for the first
      character to add, and the length of the segment to add:
    </para>
<programlisting language="C">
hb_buffer_add_utf8 (hb_buffer_t *buf,
                const char *text,
                int text_length,
                unsigned int item_offset,
                int item_length)
</programlisting>
    <para>
      So, in practice, you can say:
    </para>
<programlisting language="C">
hb_buffer_add_utf8(buf, text, strlen(text), 0, strlen(text));
</programlisting>
    <para>
      This will append your new characters to
      <parameter>buf</parameter>, not replace its existing
      contents. Also, note that you can use <literal>-1</literal> in
      place of the first instance of <function>strlen(text)</function>
      if your text array is NULL-terminated. Similarly, you can also use
      <literal>-1</literal> as the final argument want to add its full
      contents.
    </para>
    <para>
      Whatever start <parameter>item_offset</parameter> and
      <parameter>item_length</parameter> you provide, HarfBuzz will also
      attempt to grab the five characters <emphasis>before</emphasis>
      the offset point and the five characters
      <emphasis>after</emphasis> the designated end. These are the
      before and after "context" segments, which are used internally
      for HarfBuzz to make shaping decisions. They will not be part of
      the final output, but they ensure that HarfBuzz's
      script-specific shaping operations are correct. If there are
      fewer than five characters available for the before or after
      contexts, HarfBuzz will just grab what is there.
    </para>
    <para>
      For longer text runs, such as full paragraphs, it might be
      tempting to only add smaller sub-segments to a buffer and
      shape them in piecemeal fashion. Generally, this is not a good
      idea, however, because a lot of shaping decisions are
      dependent on this context information. For example, in Arabic
      and other connected scripts, HarfBuzz needs to know the code
      points before and after each character in order to correctly
      determine which glyph to return.
    </para>
    <para>
      The safest approach is to add all of the text available (even
      if your text contains a mix of scripts, directions, languages
      and fonts), then use <parameter>item_offset</parameter> and
      <parameter>item_length</parameter> to indicate which characters you
      want shaped (which must all have the same script, direction,
      language and font), so that HarfBuzz has access to any context.
    </para>
    <para>
      You can also add Unicode code points directly with
      <function>hb_buffer_add_codepoints()</function>. The arguments
      to this function are the same as those for the UTF
      encodings. But it is particularly important to note that
      HarfBuzz does not do validity checking on the text that is added
      to a buffer. Invalid code points will be replaced, but it is up
      to you to do any deep-sanity checking necessary.
    </para>
    
  </section>
  
  <section id="setting-buffer-properties">
    <title>Setting buffer properties</title>
    <para>
      Buffers containing input characters still need several
      properties set before HarfBuzz can shape their text correctly.
    </para>
    <para>
      Initially, all buffers are set to the
      <literal>HB_BUFFER_CONTENT_TYPE_INVALID</literal> content
      type. After adding text, the buffer should be set to
      <literal>HB_BUFFER_CONTENT_TYPE_UNICODE</literal> instead, which
      indicates that it contains un-shaped input
      characters. After shaping, the buffer will have the
      <literal>HB_BUFFER_CONTENT_TYPE_GLYPHS</literal> content type.
    </para>
    <para>
      <function>hb_buffer_add_utf8()</function> and the
      other UTF functions set the content type of their buffer
      automatically. But if you are reusing a buffer you may want to
      check its state with
      <function>hb_buffer_get_content_type(buffer)</function>. If
      necessary you can set the content type with
    </para>
<programlisting language="C">
hb_buffer_set_content_type(buf, HB_BUFFER_CONTENT_TYPE_UNICODE);
</programlisting>
    <para>
      to prepare for shaping.
    </para>
    <para>
      Buffers also need to carry information about the script,
      language, and text direction of their contents. You can set
      these properties individually:
    </para>
<programlisting language="C">
hb_buffer_set_direction(buf, HB_DIRECTION_LTR);
hb_buffer_set_script(buf, HB_SCRIPT_LATIN);
hb_buffer_set_language(buf, hb_language_from_string("en", -1));
</programlisting>
    <para>
      However, since these properties are often repeated for
      multiple text runs, you can also save them in a
      <literal>hb_segment_properties_t</literal> for reuse:
    </para>
<programlisting language="C">
hb_segment_properties_t *savedprops;
hb_buffer_get_segment_properties (buf, savedprops);
...
hb_buffer_set_segment_properties (buf2, savedprops);
</programlisting>
    <para>
      HarfBuzz also provides getter functions to retrieve a buffer's
      direction, script, and language properties individually.
    </para>
    <para>
      HarfBuzz recognizes four text directions in
      <type>hb_direction_t</type>: left-to-right
      (<literal>HB_DIRECTION_LTR</literal>), right-to-left (<literal>HB_DIRECTION_RTL</literal>),
      top-to-bottom (<literal>HB_DIRECTION_TTB</literal>), and
      bottom-to-top (<literal>HB_DIRECTION_BTT</literal>).  For the
      script property, HarfBuzz uses identifiers based on the
      <ulink
      url="https://unicode.org/iso15924/">ISO 15924
      standard</ulink>. For languages, HarfBuzz uses tags based on the
      <ulink url="https://tools.ietf.org/html/bcp47">IETF BCP 47</ulink> standard.
    </para>
    <para>
      Helper functions are provided to convert character strings into
      the necessary script and language tag types.
    </para>
    <para>
      Two additional buffer properties to be aware of are the
      "invisible glyph" and the replacement code point. The
      replacement code point is inserted into buffer output in place of
      any invalid code points encountered in the input. By default, it
      is the Unicode <literal>REPLACEMENT CHARACTER</literal> code
      point, <literal>U+FFFD</literal> "&#xFFFD;". You can change this with
    </para>
<programlisting language="C">
hb_buffer_set_replacement_codepoint(buf, replacement);
</programlisting>
    <para>
      passing in the replacement Unicode code point as the
      <parameter>replacement</parameter> parameter.
    </para>
    <para>
      The invisible glyph is used to replace all output glyphs that
      are invisible. By default, the standard space character
      <literal>U+0020</literal> is used; you can replace this (for
      example, when using a font that provides script-specific
      spaces) with 
    </para>
<programlisting language="C">
hb_buffer_set_invisible_glyph(buf, replacement_glyph);
</programlisting>
    <para>
      Do note that in the <parameter>replacement_glyph</parameter>
      parameter, you must provide the glyph ID of the replacement you
      wish to use, not the Unicode code point.
    </para>
    <para>
      HarfBuzz supports a few additional flags you might want to set
      on your buffer under certain circumstances. The
      <literal>HB_BUFFER_FLAG_BOT</literal> and
      <literal>HB_BUFFER_FLAG_EOT</literal> flags tell HarfBuzz
      that the buffer represents the beginning or end (respectively)
      of a text element (such as a paragraph or other block). Knowing
      this allows HarfBuzz to apply certain contextual font features
      when shaping, such as initial or final variants in connected
      scripts.
    </para>
    <para>
      <literal>HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES</literal>
      tells HarfBuzz not to hide glyphs with the
      <literal>Default_Ignorable</literal> property in Unicode. This 
      property designates control characters and other non-printing
      code points, such as joiners and variation selectors. Normally
      HarfBuzz replaces them in the output buffer with zero-width
      space glyphs (using the "invisible glyph" property discussed
      above); setting this flag causes them to be printed, which can
      be helpful for troubleshooting.
    </para>
    <para>
      Conversely, setting the
      <literal>HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES</literal> flag
      tells HarfBuzz to remove <literal>Default_Ignorable</literal>
      glyphs from the output buffer entirely. Finally, setting the
      <literal>HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE</literal>
      flag tells HarfBuzz not to insert the dotted-circle glyph
      (<literal>U+25CC</literal>, "&#x25CC;"), which is normally
      inserted into buffer output when broken character sequences are
      encountered (such as combining marks that are not attached to a
      base character).
    </para>
  </section>
  
  <section id="customizing-unicode-functions">
    <title>Customizing Unicode functions</title>
    <para>
      HarfBuzz requires some simple functions for accessing
      information from the Unicode Character Database (such as the
      <literal>General_Category</literal> (gc) and
      <literal>Script</literal> (sc) properties) that is useful
      for shaping, as well as some useful operations like composing and
      decomposing code points.
    </para>
    <para>
      HarfBuzz includes its own internal, lightweight set of Unicode
      functions. At build time, it is also possible to compile support
      for some other options, such as the Unicode functions provided
      by GLib or the International Components for Unicode (ICU)
      library. Generally, this option is only of interest for client
      programs that have specific integration requirements or that do
      a significant amount of customization.
    </para>
    <para>
      If your program has access to other Unicode functions, however,
      such as through a system library or application framework, you
      might prefer to use those instead of the built-in
      options. HarfBuzz supports this by implementing its Unicode
      functions as a set of virtual methods that you can replace —
      without otherwise affecting HarfBuzz's functionality.
    </para>
    <para>
      The Unicode functions are specified in a structure called
      <literal>unicode_funcs</literal> which is attached to each
      buffer. But even though <literal>unicode_funcs</literal> is
      associated with a <type>hb_buffer_t</type>, the functions
      themselves are called by other HarfBuzz APIs that access
      buffers, so it would be unwise for you to hook different
      functions into different buffers.
    </para>
    <para>
      In addition, you can mark your <literal>unicode_funcs</literal>
      as immutable by calling
      <function>hb_unicode_funcs_make_immutable (ufuncs)</function>.
      This is especially useful if your code is a
      library or framework that will have its own client programs. By
      marking your Unicode function choices as immutable, you prevent
      your own client programs from changing the
      <literal>unicode_funcs</literal> configuration and introducing
      inconsistencies and errors downstream.
    </para>
    <para>
      You can retrieve the Unicode-functions configuration for
      your buffer by calling <function>hb_buffer_get_unicode_funcs()</function>:
    </para>
<programlisting language="C">
hb_unicode_funcs_t *ufunctions;
ufunctions = hb_buffer_get_unicode_funcs(buf);
</programlisting>
    <para>
      The current version of <literal>unicode_funcs</literal> uses six functions:
    </para>
    <itemizedlist>
      <listitem>
	<para>
	  <function>hb_unicode_combining_class_func_t</function>:
	  returns the Canonical Combining Class of a code point.
      	</para>
      </listitem>
      <listitem>
	<para>
	  <function>hb_unicode_general_category_func_t</function>:
	  returns the General Category (gc) of a code point.
      	</para>
      </listitem>
      <listitem>
	<para>
	  <function>hb_unicode_mirroring_func_t</function>: returns
	  the Mirroring Glyph code point (for bi-directional
	  replacement) of a code point.
      	</para>
      </listitem>
      <listitem>
	<para>
	  <function>hb_unicode_script_func_t</function>: returns the
	  Script (sc) property of a code point.
      	</para>
      </listitem>
      <listitem>
	<para>
	  <function>hb_unicode_compose_func_t</function>: returns the
	  canonical composition of a sequence of two code points.
	</para>
      </listitem>
      <listitem>
	<para>
	  <function>hb_unicode_decompose_func_t</function>: returns
	  the canonical decomposition of a code point.
	</para>
      </listitem>
    </itemizedlist>
    <para>
      Note, however, that future HarfBuzz releases may alter this set.
    </para>
    <para>
      Each Unicode function has a corresponding setter, with which you
      can assign a callback to your replacement function. For example,
      to replace
      <function>hb_unicode_general_category_func_t</function>, you can call
    </para>
<programlisting language="C">
hb_unicode_funcs_set_general_category_func (*ufuncs, func, *user_data, destroy)	    
</programlisting>
    <para>
      Virtualizing this set of Unicode functions is primarily intended
      to improve portability. There is no need for every client
      program to make the effort to replace the default options, so if
      you are unsure, do not feel any pressure to customize
      <literal>unicode_funcs</literal>. 
    </para>
  </section>
  
</chapter>
