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 ();
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];
#include "hb-ot-shape-normalize-private.hh"
#include "hb-font-private.hh"
+#include "hb-set-private.hh"
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));
+}
#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