diff --git a/src/hb-paint.cc b/src/hb-paint.cc index 5b8ab2c4f..0da27af3d 100644 --- a/src/hb-paint.cc +++ b/src/hb-paint.cc @@ -68,6 +68,11 @@ hb_paint_color_nil (hb_paint_funcs_t *funcs, void *paint_data, float alpha, void *user_data) {} +static void +hb_paint_image_nil (hb_paint_funcs_t *funcs, void *paint_data, + hb_codepoint_t glyph, + void *user_data) {} + static void hb_paint_linear_gradient_nil (hb_paint_funcs_t *funcs, void *paint_data, hb_color_line_t *color_line, @@ -337,6 +342,13 @@ hb_paint_color (hb_paint_funcs_t *funcs, void *paint_data, funcs->color (paint_data, color_index, alpha); } +void +hb_paint_image (hb_paint_funcs_t *funcs, void *paint_data, + hb_codepoint_t glyph) +{ + funcs->image (paint_data, glyph); +} + void hb_paint_linear_gradient (hb_paint_funcs_t *funcs, void *paint_data, hb_color_line_t *color_line, diff --git a/src/hb-paint.h b/src/hb-paint.h index 0f674a3c3..d2aee3b35 100644 --- a/src/hb-paint.h +++ b/src/hb-paint.h @@ -56,6 +56,9 @@ HB_BEGIN_DECLS * For rendering COLRv0 or non-color outline glyphs, the * gradient and composite callbacks are not needed. * + * The paint-image callback is only needed for glyphs + * with blobs in the CBDT, sbix or SVG tables. + * * Since: REPLACEME **/ typedef struct hb_paint_funcs_t hb_paint_funcs_t; @@ -218,6 +221,25 @@ typedef void (*hb_paint_color_func_t) (hb_paint_funcs_t *funcs, float alpha, void *user_data); +/** + * hb_paint_image_func_t: + * @funcs: paint functions object + * @paint_data: The data accompanying the paint functions + * @glyph: the glyph ID + * @user_data: user data passed to the hb_font_paint_glyph() call + * + * A virtual method for the #hb_paint_funcs_t to paint the + * glyph image. + * + * This method is intended for glyphs with image blobs in the CBDT, + * sbix or SVG tables. + * + * Since: REPLACEME + */ +typedef void (*hb_paint_image_func_t) (hb_paint_funcs_t *funcs, + void *paint_data, + hb_codepoint_t glyph, + void *user_data); /** * hb_color_line_t: @@ -532,6 +554,23 @@ hb_paint_funcs_set_color_func (hb_paint_funcs_t *funcs, void *user_data, hb_destroy_func_t destroy); +/** + * hb_paint_funcs_set_image_func: + * @funcs: A paint functions struct + * @func: (closure user_data) (destroy destroy) (scope notified): The paint-image callback + * @user_data: Data to pass to @func + * @destroy: (nullable): Function to call when @user_data is no longer needed + * + * Sets the paint-image callback on the paint functions struct. + * + * Since: REPLACEME + */ +HB_EXTERN void +hb_paint_funcs_set_image_func (hb_paint_funcs_t *funcs, + hb_paint_image_func_t func, + void *user_data, + hb_destroy_func_t destroy); + /** * hb_paint_funcs_set_linear_gradient_func: * @funcs: A paint functions struct @@ -643,6 +682,10 @@ hb_paint_color (hb_paint_funcs_t *funcs, void *paint_data, unsigned int color_index, float alpha); +HB_EXTERN void +hb_paint_image (hb_paint_funcs_t *funcs, void *paint_data, + hb_codepoint_t glyph); + HB_EXTERN void hb_paint_linear_gradient (hb_paint_funcs_t *funcs, void *paint_data, hb_color_line_t *color_line, diff --git a/src/hb-paint.hh b/src/hb-paint.hh index 58d0da7fd..adf4c8696 100644 --- a/src/hb-paint.hh +++ b/src/hb-paint.hh @@ -34,6 +34,7 @@ HB_PAINT_FUNC_IMPLEMENT (push_clip_rect) \ HB_PAINT_FUNC_IMPLEMENT (pop_clip) \ HB_PAINT_FUNC_IMPLEMENT (color) \ + HB_PAINT_FUNC_IMPLEMENT (image) \ HB_PAINT_FUNC_IMPLEMENT (linear_gradient) \ HB_PAINT_FUNC_IMPLEMENT (radial_gradient) \ HB_PAINT_FUNC_IMPLEMENT (sweep_gradient) \ @@ -92,6 +93,11 @@ struct hb_paint_funcs_t { func.color (this, paint_data, color_index, alpha, !user_data ? nullptr : user_data->color); } + void image (void *paint_data, + hb_codepoint_t glyph) + { func.image (this, paint_data, + glyph, + !user_data ? nullptr : user_data->image); } void linear_gradient (void *paint_data, hb_color_line_t *color_line, float x0, float y0,