Better glyph offset support
This commit is contained in:
parent
d691ba3f40
commit
5f1a896100
|
@ -689,15 +689,15 @@ _hb_directwrite_shape(hb_shape_plan_t *shape_plan,
|
|||
|
||||
bool backward = HB_DIRECTION_IS_BACKWARD(buffer->props.direction);
|
||||
|
||||
wchar_t lang[4] = {0};
|
||||
const wchar_t lang[4] = {0};
|
||||
if (buffer->props.language != NULL) {
|
||||
mbstowcs(lang, hb_language_to_string(buffer->props.language), 4);
|
||||
mbstowcs((wchar_t*) lang, hb_language_to_string (buffer->props.language), 4);
|
||||
}
|
||||
|
||||
hr = analyzer->GetGlyphs(pchars, length,
|
||||
fontFace, FALSE,
|
||||
buffer->props.direction,
|
||||
&runHead->mScript, (const wchar_t*)lang, NULL, NULL, NULL, 0,
|
||||
backward,
|
||||
&runHead->mScript, lang, NULL, NULL, NULL, 0,
|
||||
maxGlyphs, clusters, textProperties,
|
||||
glyphs, glyphProperties, &actualGlyphs);
|
||||
|
||||
|
@ -716,8 +716,8 @@ _hb_directwrite_shape(hb_shape_plan_t *shape_plan,
|
|||
|
||||
hr = analyzer->GetGlyphs(pchars, length,
|
||||
fontFace, FALSE,
|
||||
buffer->props.direction,
|
||||
&runHead->mScript, (const wchar_t*)lang, NULL, NULL, NULL, 0,
|
||||
backward,
|
||||
&runHead->mScript, lang, NULL, NULL, NULL, 0,
|
||||
maxGlyphs, clusters, textProperties,
|
||||
glyphs, glyphProperties, &actualGlyphs);
|
||||
}
|
||||
|
@ -745,7 +745,11 @@ _hb_directwrite_shape(hb_shape_plan_t *shape_plan,
|
|||
int font_size = font->face->get_upem();
|
||||
if (font_size < 0)
|
||||
font_size = -font_size;
|
||||
int x_mult = (double)font->x_scale / font_size;
|
||||
|
||||
if (font_size < 0)
|
||||
font_size = -font_size;
|
||||
double x_mult = (double) font->x_scale / font_size;
|
||||
double y_mult = (double) font->y_scale / font_size;
|
||||
|
||||
hr = analyzer->GetGlyphPlacements(pchars,
|
||||
clusters,
|
||||
|
@ -755,11 +759,11 @@ _hb_directwrite_shape(hb_shape_plan_t *shape_plan,
|
|||
glyphProperties,
|
||||
actualGlyphs,
|
||||
fontFace,
|
||||
font_size * x_mult,
|
||||
FALSE,
|
||||
font_size,
|
||||
FALSE,
|
||||
backward,
|
||||
&runHead->mScript,
|
||||
NULL,
|
||||
lang,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
|
@ -805,15 +809,10 @@ _hb_directwrite_shape(hb_shape_plan_t *shape_plan,
|
|||
|
||||
/* The rest is crap. Let's store position info there for now. */
|
||||
info->mask = advances[i];
|
||||
info->var1.u32 = offsets[i].ascenderOffset;
|
||||
info->var2.u32 = -offsets[i].advanceOffset;
|
||||
info->var1.i32 = offsets[i].advanceOffset;
|
||||
info->var2.i32 = offsets[i].ascenderOffset;
|
||||
}
|
||||
|
||||
free(clusters);
|
||||
free(glyphs);
|
||||
free(textProperties);
|
||||
free(glyphProperties);
|
||||
|
||||
/* Set glyph positions */
|
||||
buffer->clear_positions ();
|
||||
for (unsigned int i = 0; i < glyphs_len; i++)
|
||||
|
@ -822,14 +821,19 @@ _hb_directwrite_shape(hb_shape_plan_t *shape_plan,
|
|||
hb_glyph_position_t *pos = &buffer->pos[i];
|
||||
|
||||
/* TODO vertical */
|
||||
pos->x_advance = info->mask;
|
||||
pos->x_offset = backward ? -info->var1.u32 : info->var1.u32;
|
||||
pos->y_offset = info->var2.u32;
|
||||
pos->x_advance = x_mult * (int32_t) info->mask;
|
||||
pos->x_offset = x_mult * (backward ? -info->var1.i32 : info->var1.i32);
|
||||
pos->y_offset = y_mult * info->var2.i32;
|
||||
}
|
||||
|
||||
if (backward)
|
||||
hb_buffer_reverse (buffer);
|
||||
|
||||
free(clusters);
|
||||
free(glyphs);
|
||||
free(textProperties);
|
||||
free(glyphProperties);
|
||||
|
||||
/* Wow, done! */
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue