From 9876e30c6ee8fc53ae4d26692b9482e6011d04a5 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 17 Dec 2022 02:46:37 -0500 Subject: [PATCH] test: Support png images via paint_image --- util/hb-test.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/util/hb-test.c b/util/hb-test.c index ebf01e5b2..666a350dc 100644 --- a/util/hb-test.c +++ b/util/hb-test.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -294,6 +295,63 @@ paint_color (hb_paint_funcs_t *funcs, cairo_paint (data->cr); } +typedef struct +{ + hb_blob_t *blob; + unsigned int offset; +} read_blob_data_t; + +cairo_status_t +read_blob (void *closure, + unsigned char *data, + unsigned int length) +{ + read_blob_data_t *r = closure; + const char *d; + unsigned int size; + + d = hb_blob_get_data (r->blob, &size); + + if (r->offset + length > size) + return CAIRO_STATUS_READ_ERROR; + + memcpy (data, d + r->offset, length); + r->offset += length; + + return CAIRO_STATUS_SUCCESS; +} + +static void +paint_image (hb_paint_funcs_t *funcs, + void *paint_data, + hb_codepoint_t glyph, + void *user_data) +{ + paint_data_t *data = user_data; + read_blob_data_t r; + cairo_surface_t *surface; + cairo_pattern_t *pattern; + cairo_matrix_t m; + hb_glyph_extents_t extents; + + hb_font_get_glyph_extents (data->font, glyph, &extents); + r.blob = hb_ot_color_glyph_reference_png (data->font, glyph); + r.offset = 0; + surface = cairo_image_surface_create_from_png_stream (read_blob, &r); + hb_blob_destroy (r.blob); + + pattern = cairo_pattern_create_for_surface (surface); + cairo_matrix_init_scale (&m, 1, -1); + cairo_matrix_translate (&m, extents.x_bearing, - extents.y_bearing); + cairo_pattern_set_matrix (pattern, &m); + cairo_set_source (data->cr, pattern); + + cairo_paint (data->cr); + + cairo_pattern_destroy (pattern); + cairo_surface_destroy (surface); +} + static void reduce_anchors (float x0, float y0, float x1, float y1, @@ -1008,6 +1066,7 @@ int main (int argc, char *argv[]) hb_paint_funcs_set_push_group_func (funcs, push_group, &data, NULL); hb_paint_funcs_set_pop_group_func (funcs, pop_group, &data, NULL); hb_paint_funcs_set_color_func (funcs, paint_color, &data, NULL); + hb_paint_funcs_set_image_func (funcs, paint_image, &data, NULL); hb_paint_funcs_set_linear_gradient_func (funcs, paint_linear_gradient, &data, NULL); hb_paint_funcs_set_radial_gradient_func (funcs, paint_radial_gradient, &data, NULL); hb_paint_funcs_set_sweep_gradient_func (funcs, paint_sweep_gradient, &data, NULL);