Apply root transform
This commit applies scale, slant is still missing.
This commit is contained in:
parent
5afca91ff2
commit
5c6329555e
|
@ -1954,9 +1954,20 @@ struct COLR
|
||||||
|
|
||||||
if (paint)
|
if (paint)
|
||||||
{
|
{
|
||||||
// TODO root transform
|
int xscale, yscale;
|
||||||
// TODO apply clipbox clip
|
unsigned int upem;
|
||||||
|
|
||||||
|
hb_font_get_scale (font, &xscale, &yscale);
|
||||||
|
upem = hb_face_get_upem (hb_font_get_face (font));
|
||||||
|
|
||||||
|
// FIXME handle slant
|
||||||
|
funcs->push_transform (data, xscale/(float)upem, 0,
|
||||||
|
0, yscale/(float)upem,
|
||||||
|
0, 0);
|
||||||
|
|
||||||
paint_glyph_dispatch (paint, &c);
|
paint_glyph_dispatch (paint, &c);
|
||||||
|
|
||||||
|
funcs->pop_transform (data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,6 +25,7 @@ typedef struct {
|
||||||
int level;
|
int level;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
hb_font_t *font;
|
hb_font_t *font;
|
||||||
|
hb_font_t *unscaled_font;
|
||||||
hb_color_t *colors;
|
hb_color_t *colors;
|
||||||
unsigned int num_colors;
|
unsigned int num_colors;
|
||||||
hb_color_t foreground_color;
|
hb_color_t foreground_color;
|
||||||
|
@ -223,8 +224,10 @@ push_clip_glyph (hb_paint_funcs_t *funcs,
|
||||||
hb_draw_funcs_set_close_path_func (dfuncs, close_path, data, NULL);
|
hb_draw_funcs_set_close_path_func (dfuncs, close_path, data, NULL);
|
||||||
|
|
||||||
cairo_new_path (data->cr);
|
cairo_new_path (data->cr);
|
||||||
|
/* Note: we need to use a upem-scaled, unslanted copy of the font here,
|
||||||
hb_font_get_glyph_shape (data->font, glyph, dfuncs, data);
|
* since hb has already applied the root transform.
|
||||||
|
*/
|
||||||
|
hb_font_get_glyph_shape (data->unscaled_font, glyph, dfuncs, data);
|
||||||
cairo_close_path (data->cr);
|
cairo_close_path (data->cr);
|
||||||
|
|
||||||
cairo_clip (data->cr);
|
cairo_clip (data->cr);
|
||||||
|
@ -929,6 +932,7 @@ int main (int argc, char *argv[])
|
||||||
hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
|
hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
|
||||||
hb_face_t *face = hb_face_create (blob, 0);
|
hb_face_t *face = hb_face_create (blob, 0);
|
||||||
hb_font_t *font = hb_font_create (face);
|
hb_font_t *font = hb_font_create (face);
|
||||||
|
hb_font_t *unscaled_font;
|
||||||
hb_font_set_scale (font, 20, 20);
|
hb_font_set_scale (font, 20, 20);
|
||||||
hb_codepoint_t gid = atoi (argv[2]);
|
hb_codepoint_t gid = atoi (argv[2]);
|
||||||
hb_glyph_extents_t extents;
|
hb_glyph_extents_t extents;
|
||||||
|
@ -936,13 +940,17 @@ int main (int argc, char *argv[])
|
||||||
cairo_pattern_t *pattern;
|
cairo_pattern_t *pattern;
|
||||||
cairo_matrix_t m;
|
cairo_matrix_t m;
|
||||||
float xmin, ymin, xmax, ymax;
|
float xmin, ymin, xmax, ymax;
|
||||||
|
unsigned int upem;
|
||||||
|
|
||||||
float size = 120.;
|
float size = 120.;
|
||||||
int upem = hb_face_get_upem (hb_font_get_face (font));
|
|
||||||
|
|
||||||
hb_font_set_scale (font, size, size);
|
hb_font_set_scale (font, size, size);
|
||||||
hb_font_get_glyph_extents (font, gid, &extents);
|
hb_font_get_glyph_extents (font, gid, &extents);
|
||||||
hb_font_set_scale (font, upem, upem);
|
|
||||||
|
unscaled_font = hb_font_create (face);
|
||||||
|
upem = hb_face_get_upem (face);
|
||||||
|
hb_font_set_scale (unscaled_font, upem, upem);
|
||||||
|
hb_font_set_synthetic_slant (unscaled_font, 0.);
|
||||||
|
|
||||||
xmin = extents.x_bearing;
|
xmin = extents.x_bearing;
|
||||||
xmax = xmin + extents.width;
|
xmax = xmin + extents.width;
|
||||||
|
@ -962,6 +970,7 @@ int main (int argc, char *argv[])
|
||||||
cairo_push_group (data.cr);
|
cairo_push_group (data.cr);
|
||||||
|
|
||||||
data.font = font;
|
data.font = font;
|
||||||
|
data.unscaled_font = unscaled_font;
|
||||||
data.foreground_color = HB_COLOR (0, 0, 0, 255);
|
data.foreground_color = HB_COLOR (0, 0, 0, 255);
|
||||||
|
|
||||||
data.num_colors = hb_ot_color_palette_get_colors (hb_font_get_face (font),
|
data.num_colors = hb_ot_color_palette_get_colors (hb_font_get_face (font),
|
||||||
|
@ -983,13 +992,8 @@ int main (int argc, char *argv[])
|
||||||
hb_paint_funcs_set_radial_gradient_func (funcs, radial_gradient, &data, NULL);
|
hb_paint_funcs_set_radial_gradient_func (funcs, radial_gradient, &data, NULL);
|
||||||
hb_paint_funcs_set_sweep_gradient_func (funcs, sweep_gradient, &data, NULL);
|
hb_paint_funcs_set_sweep_gradient_func (funcs, sweep_gradient, &data, NULL);
|
||||||
|
|
||||||
cairo_save (data.cr);
|
|
||||||
cairo_scale (data.cr, size/upem, size/upem); // root transform
|
|
||||||
|
|
||||||
hb_font_paint_glyph (font, gid, funcs, NULL);
|
hb_font_paint_glyph (font, gid, funcs, NULL);
|
||||||
|
|
||||||
cairo_restore (data.cr);
|
|
||||||
|
|
||||||
pattern = cairo_pop_group (data.cr);
|
pattern = cairo_pop_group (data.cr);
|
||||||
|
|
||||||
cairo_matrix_init_scale (&m, 1, -1);
|
cairo_matrix_init_scale (&m, 1, -1);
|
||||||
|
|
Loading…
Reference in New Issue