Buffers, language, script and direction
The input to HarfBuzz 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 then customize the properties of the
buffer.
Creating and destroying buffers
As we saw in our initial example, a buffer is created and
initialized with hb_buffer_create(). This
produces a new, empty buffer object, instantiated with some
default values and ready to accept your Unicode strings.
HarfBuzz manages the memory of objects that it creates (such as
buffers), so you don't have to. When you have finished working on
a buffer, you can call hb_buffer_destroy():
hb_buffer_t *buffer = hb_buffer_create();
...
hb_buffer_destroy(buffer);
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:
void somefunc(hb_buffer_t *buffer) {
buffer = hb_buffer_reference(buffer);
...
And then decrease it once you're done with it:
hb_buffer_destroy(buffer);
}
To throw away all the data in your buffer and start from scratch,
call hb_buffer_reset(buffer). If you want to
throw away the string in the buffer but keep the options, you can
instead call hb_buffer_clear_contents(buffer).
Adding text to the buffer
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 codepoints, but your input string is probably in one of
the standard Unicode character encodings (UTF-8, UTF-16, UTF-32)
Setting buffer properties
What about the other scripts?
Customizing Unicode functions