|  |  |  |  | 
      The basic version of hb_shape() determines
      its shaping strategy based on examining the capabilities of the
      font file. OpenType font tables cause HarfBuzz to try the
      ot shaper, while AAT font tables cause HarfBuzz to try the
      aat shaper. 
    
      In the real world, however, a font might include some unusual
      mix of tables, or one of the tables might simply be broken for
      the script you need to shape. So, sometimes, you might not
      want to rely on HarfBuzz's process for deciding what to do, and
      just tell hb_shape() what you want it to try.
    
      hb_shape_full() is an alternate shaping
      function that lets you supply a list of shapers for HarfBuzz to
      try, in order, when shaping your buffer. For example, if you
      have determined that HarfBuzz's attempts to work around broken
      tables gives you better results than the AAT shaper itself does,
      you might move the AAT shaper to the end of your list of
      preferences and call hb_shape_full()
    
      char *shaperprefs[3] = {"ot", "default", "aat"};
      ...
      hb_shape_full(font, buf, userfeatures, num_features, shaperprefs);
    
to get results you are happier with.
      You may also want to call
      hb_shape_list_shapers() to get a list of
      the shapers that were built at compile time in your copy of HarfBuzz.