More normalization kick

This commit is contained in:
Behdad Esfahbod 2011-07-22 11:07:05 -04:00
parent 63c0ef4a07
commit 45412523dc
3 changed files with 48 additions and 31 deletions

View File

@ -63,12 +63,34 @@ HB_BEGIN_DECLS
* matra for the Indic shaper.
*/
static bool
get_glyph (hb_ot_shape_context_t *c, unsigned int i)
{
hb_codepoint_t glyph;
return hb_font_get_glyph (c->font, c->buffer->info[i].codepoint, 0, &glyph);
static bool
decompose (hb_ot_shape_context_t *c,
bool recompose,
hb_codepoint_t ab)
{
hb_codepoint_t a, b, glyph;
bool has_this = hb_font_get_glyph (c->font, ab, 0, &glyph);
/* If recomposing and the single char is supported by the font, we're good. */
if (recompose && has_this)
return TRUE;
if (hb_unicode_decompose (c->buffer->unicode, ab, &a, &b) &&
hb_font_get_glyph (c->font, b, 0, &glyph) &&
decompose (c, recompose, a))
{
/* Successfully decomposed. */
if (recompose) {
/* Try composing b with base if not blocked */
}
return TRUE;
}
return has_this;
}
static bool
@ -76,23 +98,23 @@ decompose_single_char_cluster (hb_ot_shape_context_t *c,
bool recompose,
unsigned int i)
{
// c->buffer->copy ();
// bool ret = decompose (c, recompose, c->buffer->info[i].codepoint);
// c->buffer->skip ();
// return ret;
return FALSE;
}
static bool
static void
handle_single_char_cluster (hb_ot_shape_context_t *c,
bool recompose,
unsigned int i)
{
/* If recomposing and the single char is supported by the font, we're good. */
if (recompose && get_glyph (c, i))
return FALSE;
/* Decompose */
return decompose_single_char_cluster (c, recompose, i);
decompose_single_char_cluster (c, recompose, i);
}
static bool
static void
handle_multi_char_cluster (hb_ot_shape_context_t *c,
bool recompose,
unsigned int start,
@ -101,16 +123,14 @@ handle_multi_char_cluster (hb_ot_shape_context_t *c,
/* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
for (unsigned int i = start; i < end; i++)
if (unlikely (is_variation_selector (c->buffer->info[i].codepoint)))
return FALSE;
return;
return FALSE;
}
bool
void
_hb_ot_shape_normalize (hb_ot_shape_context_t *c)
{
hb_buffer_t *buffer = c->buffer;
bool changed = FALSE;
bool recompose = !hb_ot_shape_complex_prefer_decomposed (c->plan->shaper);
buffer->clear_output ();
@ -125,16 +145,14 @@ _hb_ot_shape_normalize (hb_ot_shape_context_t *c)
break;
if (buffer->i + 1 == end)
changed |= handle_single_char_cluster (c, recompose, buffer->i);
handle_single_char_cluster (c, recompose, buffer->i);
else
changed |= handle_multi_char_cluster (c, recompose, buffer->i, end);
handle_multi_char_cluster (c, recompose, buffer->i, end);
while (buffer->i < end)
c->buffer->next_glyph ();
}
buffer->swap ();
return changed;
}
HB_END_DECLS

View File

@ -99,8 +99,14 @@ is_variation_selector (hb_codepoint_t unicode)
(unicode >= 0xE0100 && unicode <= 0xE01EF)); /* VARIATION SELECTOR-17..256 */
}
static inline void
hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unicode)
{
info->general_category() = hb_unicode_general_category (unicode, info->codepoint);
info->combining_class() = hb_unicode_combining_class (unicode, info->codepoint);
}
HB_INTERNAL bool _hb_ot_shape_normalize (hb_ot_shape_context_t *c);
HB_INTERNAL void _hb_ot_shape_normalize (hb_ot_shape_context_t *c);
HB_END_DECLS

View File

@ -179,14 +179,9 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
static void
hb_set_unicode_props (hb_buffer_t *buffer)
{
hb_unicode_funcs_t *unicode = buffer->unicode;
hb_glyph_info_t *info = buffer->info;
unsigned int count = buffer->len;
for (unsigned int i = 1; i < count; i++) {
info[i].general_category() = hb_unicode_general_category (unicode, info[i].codepoint);
info[i].combining_class() = hb_unicode_combining_class (unicode, info[i].codepoint);
}
for (unsigned int i = 1; i < count; i++)
hb_glyph_info_set_unicode_props (&buffer->info[i], buffer->unicode);
}
static void
@ -365,9 +360,7 @@ hb_ot_shape_execute_internal (hb_ot_shape_context_t *c)
hb_ensure_native_direction (c->buffer);
if (_hb_ot_shape_normalize (c))
/* Buffer contents changed, reset unicode_props */
hb_set_unicode_props (c->buffer); /* BUFFER: Set general_category and combining_class in var1 */
_hb_ot_shape_normalize (c);
hb_ot_shape_setup_masks (c); /* BUFFER: Clobbers var2 */