Add hb_ot_shape_glyphs_closure()
Experimental API for now.
This commit is contained in:
parent
bb09f0ec10
commit
1827dc208c
|
@ -69,6 +69,10 @@ struct hb_ot_map_t
|
||||||
inline void position (hb_font_t *font, hb_buffer_t *buffer) const
|
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); }
|
{ 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) {
|
inline void finish (void) {
|
||||||
features.finish ();
|
features.finish ();
|
||||||
lookups[0].finish ();
|
lookups[0].finish ();
|
||||||
|
@ -125,9 +129,6 @@ struct hb_ot_map_t
|
||||||
void *face_or_font,
|
void *face_or_font,
|
||||||
hb_buffer_t *buffer) const;
|
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_mask_t global_mask;
|
||||||
|
|
||||||
hb_tag_t chosen_script[2];
|
hb_tag_t chosen_script[2];
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "hb-ot-shape-normalize-private.hh"
|
#include "hb-ot-shape-normalize-private.hh"
|
||||||
|
|
||||||
#include "hb-font-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;
|
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));
|
||||||
|
}
|
||||||
|
|
|
@ -34,6 +34,14 @@
|
||||||
#include "hb-ot-tag.h"
|
#include "hb-ot-tag.h"
|
||||||
|
|
||||||
HB_BEGIN_DECLS
|
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
|
HB_END_DECLS
|
||||||
|
|
||||||
#undef HB_OT_H_IN
|
#undef HB_OT_H_IN
|
||||||
|
|
|
@ -35,6 +35,9 @@
|
||||||
|
|
||||||
struct _hb_set_t
|
struct _hb_set_t
|
||||||
{
|
{
|
||||||
|
inline void init (void) {
|
||||||
|
clear ();
|
||||||
|
}
|
||||||
inline void clear (void) {
|
inline void clear (void) {
|
||||||
memset (elts, 0, sizeof elts);
|
memset (elts, 0, sizeof elts);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue