From 60f5d4c93ebaf00b1ceb99b545cb890dffed2de2 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 8 Sep 2024 12:41:48 -0400 Subject: [PATCH] gpu: Add a variant of gsk_gpu_colorize_op This variant takes the color_states, instead of computing it anew from the ccs and the color state of the color. This will be used to pull this work out of the loop in add_glyph_node. --- gsk/gpu/gskgpucolorizeop.c | 43 ++++++++++++++++++++++--------- gsk/gpu/gskgpucolorizeopprivate.h | 8 ++++++ 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/gsk/gpu/gskgpucolorizeop.c b/gsk/gpu/gskgpucolorizeop.c index 766845c071..cef2a1b507 100644 --- a/gsk/gpu/gskgpucolorizeop.c +++ b/gsk/gpu/gskgpucolorizeop.c @@ -50,22 +50,19 @@ static const GskGpuShaderOpClass GSK_GPU_COLORIZE_OP_CLASS = { }; void -gsk_gpu_colorize_op (GskGpuFrame *frame, - GskGpuShaderClip clip, - GdkColorState *ccs, - float opacity, - const graphene_point_t *offset, - const GskGpuShaderImage *image, - const GdkColor *color) +gsk_gpu_colorize_op2 (GskGpuFrame *frame, + GskGpuShaderClip clip, + GskGpuColorStates color_states, + float opacity, + const graphene_point_t *offset, + const GskGpuShaderImage *image, + const GdkColor *color) { GskGpuColorizeInstance *instance; - GdkColorState *alt; - - alt = gsk_gpu_color_states_find (ccs, color); gsk_gpu_shader_op_alloc (frame, &GSK_GPU_COLORIZE_OP_CLASS, - gsk_gpu_color_states_create (ccs, TRUE, alt, FALSE), + color_states, 0, clip, (GskGpuImage *[1]) { image->image }, @@ -74,5 +71,27 @@ gsk_gpu_colorize_op (GskGpuFrame *frame, gsk_gpu_rect_to_float (image->coverage ? image->coverage : image->bounds, offset, instance->rect); gsk_gpu_rect_to_float (image->bounds, offset, instance->tex_rect); - gsk_gpu_color_to_float (color, alt, opacity, instance->color); + gsk_gpu_color_to_float (color, gsk_gpu_color_states_get_alt (color_states), opacity, instance->color); +} + +void +gsk_gpu_colorize_op (GskGpuFrame *frame, + GskGpuShaderClip clip, + GdkColorState *ccs, + float opacity, + const graphene_point_t *offset, + const GskGpuShaderImage *image, + const GdkColor *color) +{ + GdkColorState *alt; + GskGpuColorStates color_states; + GdkColor color2; + + alt = gsk_gpu_color_states_find (ccs, color); + color_states = gsk_gpu_color_states_create (ccs, TRUE, alt, FALSE); + gdk_color_convert (&color2, alt, color); + + gsk_gpu_colorize_op2 (frame, clip, color_states, opacity, offset, image, &color2); + + gdk_color_finish (&color2); } diff --git a/gsk/gpu/gskgpucolorizeopprivate.h b/gsk/gpu/gskgpucolorizeopprivate.h index 6e01db57c6..e6ee91876b 100644 --- a/gsk/gpu/gskgpucolorizeopprivate.h +++ b/gsk/gpu/gskgpucolorizeopprivate.h @@ -14,6 +14,14 @@ void gsk_gpu_colorize_op (GskGpuF const GskGpuShaderImage *image, const GdkColor *color); +void gsk_gpu_colorize_op2 (GskGpuFrame *frame, + GskGpuShaderClip clip, + GskGpuColorStates color_states, + float opacity, + const graphene_point_t *offset, + const GskGpuShaderImage *image, + const GdkColor *color); + G_END_DECLS