Blame docs/html/hello-harfbuzz.html

Packit Service 5bcba8
Packit Service 5bcba8
<html>
Packit Service 5bcba8
<head>
Packit Service 5bcba8
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Packit Service 5bcba8
<title>Hello, Harfbuzz: HarfBuzz Manual</title>
Packit Service 5bcba8
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
Packit Service 5bcba8
<link rel="home" href="index.html" title="HarfBuzz Manual">
Packit Service 5bcba8
<link rel="up" href="pt01.html" title="Part I. User's manual">
Packit Service 5bcba8
<link rel="prev" href="building.html" title="Building">
Packit Service 5bcba8
<link rel="next" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
Packit Service 5bcba8
<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
Packit Service 5bcba8
<link rel="stylesheet" href="style.css" type="text/css">
Packit Service 5bcba8
</head>
Packit Service 5bcba8
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
Home
Packit Service 5bcba8
Up
Packit Service 5bcba8
Prev
Packit Service 5bcba8
Next
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8

Packit Service 5bcba8
Hello, Harfbuzz
Packit Service 5bcba8
Packit Service 5bcba8

Packit Service 5bcba8
    Here's the simplest Harfbuzz that can possibly work. We will improve
Packit Service 5bcba8
    it later.
Packit Service 5bcba8
  

Packit Service 5bcba8
Packit Service 5bcba8
        Create a buffer and put your text in it.
Packit Service 5bcba8
      

Packit Service 5bcba8
Packit Service 5bcba8
  #include <hb.h>
Packit Service 5bcba8
  hb_buffer_t *buf;
Packit Service 5bcba8
  buf = hb_buffer_create();
Packit Service 5bcba8
  hb_buffer_add_utf8(buf, text, strlen(text), 0, strlen(text));
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
        Guess the script, language and direction of the buffer.
Packit Service 5bcba8
      

Packit Service 5bcba8
Packit Service 5bcba8
  hb_buffer_guess_segment_properties(buf);
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
        Create a face and a font, using FreeType for now.
Packit Service 5bcba8
      

Packit Service 5bcba8
Packit Service 5bcba8
  #include <hb-ft.h>
Packit Service 5bcba8
  FT_New_Face(ft_library, font_path, index, &face)
Packit Service 5bcba8
  hb_font_t *font = hb_ft_font_create(face);
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
        Shape!
Packit Service 5bcba8
      

Packit Service 5bcba8
Packit Service 5bcba8
  hb_shape(font, buf, NULL, 0);
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
        Get the glyph and position information.
Packit Service 5bcba8
      

Packit Service 5bcba8
Packit Service 5bcba8
  hb_glyph_info_t *glyph_info    = hb_buffer_get_glyph_infos(buf, &glyph_count);
Packit Service 5bcba8
  hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &glyph_count);
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
        Iterate over each glyph.
Packit Service 5bcba8
      

Packit Service 5bcba8
Packit Service 5bcba8
  for (i = 0; i < glyph_count; ++i) {
Packit Service 5bcba8
    glyphid = glyph_info[i].codepoint;
Packit Service 5bcba8
    x_offset = glyph_pos[i].x_offset / 64.0;
Packit Service 5bcba8
    y_offset = glyph_pos[i].y_offset / 64.0;
Packit Service 5bcba8
    x_advance = glyph_pos[i].x_advance / 64.0;
Packit Service 5bcba8
    y_advance = glyph_pos[i].y_advance / 64.0;
Packit Service 5bcba8
    draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset);
Packit Service 5bcba8
    cursor_x += x_advance;
Packit Service 5bcba8
    cursor_y += y_advance;
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
        Tidy up.
Packit Service 5bcba8
      

Packit Service 5bcba8
Packit Service 5bcba8
  hb_buffer_destroy(buf);
Packit Service 5bcba8
  hb_font_destroy(hb_ft_font);
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8

Packit Service 5bcba8
What Harfbuzz doesn't do
Packit Service 5bcba8

Packit Service 5bcba8
      The code above will take a UTF8 string, shape it, and give you the
Packit Service 5bcba8
      information required to lay it out correctly on a single
Packit Service 5bcba8
      horizontal (or vertical) line using the font provided. That is the
Packit Service 5bcba8
      extent of Harfbuzz's responsibility.
Packit Service 5bcba8
    

Packit Service 5bcba8

Packit Service 5bcba8
      If you are implementing a text layout engine you may have other
Packit Service 5bcba8
      responsibilities, that Harfbuzz will not help you with:
Packit Service 5bcba8
    

Packit Service 5bcba8
    Packit Service 5bcba8
  • Packit Service 5bcba8

    Packit Service 5bcba8
              Harfbuzz won't help you with bidirectionality. If you want to
    Packit Service 5bcba8
              lay out text with mixed Hebrew and English, you will need to
    Packit Service 5bcba8
              ensure that the buffer provided to Harfbuzz has those
    Packit Service 5bcba8
              characters in the correct layout order. This will be different
    Packit Service 5bcba8
              from the logical order in which the Unicode text is stored. In
    Packit Service 5bcba8
              other words, the user will hit the keys in the following
    Packit Service 5bcba8
              sequence:
    Packit Service 5bcba8
            

    Packit Service 5bcba8
    Packit Service 5bcba8
    A B C [space] ג ב א [space] D E F
    Packit Service 5bcba8
            
    Packit Service 5bcba8

    Packit Service 5bcba8
              but will expect to see in the output:
    Packit Service 5bcba8
            

    Packit Service 5bcba8
    Packit Service 5bcba8
    ABC אבג DEF
    Packit Service 5bcba8
            
    Packit Service 5bcba8

    Packit Service 5bcba8
              This reordering is called bidi processing
    Packit Service 5bcba8
              ("bidi" is short for bidirectional), and there's an
    Packit Service 5bcba8
              algorithm as an annex to the Unicode Standard which tells you how
    Packit Service 5bcba8
              to reorder a string from logical order into presentation order.
    Packit Service 5bcba8
              Before sending your string to Harfbuzz, you may need to apply the
    Packit Service 5bcba8
              bidi algorithm to it. Libraries such as ICU and fribidi can do
    Packit Service 5bcba8
              this for you.
    Packit Service 5bcba8
            

    Packit Service 5bcba8
    Packit Service 5bcba8
  • Packit Service 5bcba8
              Harfbuzz won't help you with text that contains different font
    Packit Service 5bcba8
              properties. For instance, if you have the string "a
    Packit Service 5bcba8
              huge breakfast", and you expect
    Packit Service 5bcba8
              "huge" to be italic, you will need to send three
    Packit Service 5bcba8
              strings to Harfbuzz: a, in your Roman font;
    Packit Service 5bcba8
              huge using your italic font; and
    Packit Service 5bcba8
              breakfast using your Roman font again.
    Packit Service 5bcba8
              Similarly if you change font, font size, script, language or
    Packit Service 5bcba8
              direction within your string, you will need to shape each run
    Packit Service 5bcba8
              independently and then output them independently. Harfbuzz
    Packit Service 5bcba8
              expects to shape a run of characters sharing the same
    Packit Service 5bcba8
              properties.
    Packit Service 5bcba8
            

    Packit Service 5bcba8
  • Packit Service 5bcba8

    Packit Service 5bcba8
              Harfbuzz won't help you with line breaking, hyphenation or
    Packit Service 5bcba8
              justification. As mentioned above, it lays out the string
    Packit Service 5bcba8
              along a single line of, notionally,
    Packit Service 5bcba8
              infinite length. If you want to find out where the potential
    Packit Service 5bcba8
              word, sentence and line break points are in your text, you
    Packit Service 5bcba8
              could use the ICU library's break iterator functions.
    Packit Service 5bcba8
            

    Packit Service 5bcba8

    Packit Service 5bcba8
              Harfbuzz can tell you how wide a shaped piece of text is, which is
    Packit Service 5bcba8
              useful input to a justification algorithm, but it knows nothing
    Packit Service 5bcba8
              about paragraphs, lines or line lengths. Nor will it adjust the
    Packit Service 5bcba8
              space between words to fit them proportionally into a line. If you
    Packit Service 5bcba8
              want to layout text in paragraphs, you will probably want to send
    Packit Service 5bcba8
              each word of your text to Harfbuzz to determine its shaped width
    Packit Service 5bcba8
              after glyph substitutions, then work out how many words will fit
    Packit Service 5bcba8
              on a line, and then finally output each word of the line separated
    Packit Service 5bcba8
              by a space of the correct size to fully justify the paragraph.
    Packit Service 5bcba8
            

    Packit Service 5bcba8
    Packit Service 5bcba8
    Packit Service 5bcba8

    Packit Service 5bcba8
          As a layout engine implementor, Harfbuzz will help you with the
    Packit Service 5bcba8
          interface between your text and your font, and that's something
    Packit Service 5bcba8
          that you'll need - what you then do with the glyphs that your font
    Packit Service 5bcba8
          returns is up to you. The example we saw above enough to get us
    Packit Service 5bcba8
          started using Harfbuzz. Now we are going to use the remainder of
    Packit Service 5bcba8
          Harfbuzz's API to refine that example and improve our text shaping
    Packit Service 5bcba8
          capabilities.
    Packit Service 5bcba8
        

    Packit Service 5bcba8
    Packit Service 5bcba8
    Packit Service 5bcba8
    Packit Service 5bcba8

    Generated by GTK-Doc V1.25.1
    Packit Service 5bcba8
    </body>
    Packit Service 5bcba8
    </html>