Add hb_ot_shape_glyphs_closure()

Experimental API for now.
This commit is contained in:
Behdad Esfahbod 2012-04-24 16:56:37 -04:00
parent bb09f0ec10
commit 1827dc208c
4 changed files with 50 additions and 3 deletions

View File

@ -69,6 +69,10 @@ struct hb_ot_map_t
inline void position (hb_font_t *font, hb_buffer_t *buffer) const
{ apply (1, (hb_ot_map_t::apply_lookup_func_t) hb_ot_layout_position_lookup, font, buffer); }
HB_INTERNAL void substitute_closure (hb_face_t *face,
hb_set_t *glyphs) const;
inline void finish (void) {
features.finish ();
lookups[0].finish ();
@ -125,9 +129,6 @@ struct hb_ot_map_t
void *face_or_font,
hb_buffer_t *buffer) const;
HB_INTERNAL void substitute_closure (hb_face_t *face,
hb_set_t *glyphs) const;
hb_mask_t global_mask;
hb_tag_t chosen_script[2];

View File

@ -30,6 +30,7 @@
#include "hb-ot-shape-normalize-private.hh"
#include "hb-font-private.hh"
#include "hb-set-private.hh"
@ -478,3 +479,37 @@ _hb_ot_shape (hb_font_t *font,
return TRUE;
}
void
hb_ot_shape_glyphs_closure (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features,
hb_set_t *glyphs)
{
hb_ot_shape_plan_t plan;
buffer->guess_properties ();
hb_ot_shape_plan_internal (&plan, font->face, &buffer->props, features, num_features);
/* TODO: normalization? have shapers do closure()? */
/* TODO: Deal with mirrored chars? */
hb_map_glyphs (font, buffer);
/* Seed it. It's user's responsibility to have cleard glyphs
* if that's what they desire. */
unsigned int count = buffer->len;
for (unsigned int i = 0; i < count; i++)
hb_set_add (glyphs, buffer->info[i].codepoint);
/* And find transitive closure. */
hb_set_t copy;
copy.init ();
do {
copy.set (glyphs);
plan.map.substitute_closure (font->face, glyphs);
} while (!copy.equal (glyphs));
}

View File

@ -34,6 +34,14 @@
#include "hb-ot-tag.h"
HB_BEGIN_DECLS
void
hb_ot_shape_glyphs_closure (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features,
hb_set_t *glyphs);
HB_END_DECLS
#undef HB_OT_H_IN

View File

@ -35,6 +35,9 @@
struct _hb_set_t
{
inline void init (void) {
clear ();
}
inline void clear (void) {
memset (elts, 0, sizeof elts);
}