From 17a83b748ef0ab029c63734d0407867c9f0cede9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Feb 2025 14:40:02 -0700 Subject: [PATCH] [COLRv1] Optimize PaintColrLayers instead of PaintComposite See https://github.com/googlefonts/colr-gradients-spec/issues/369#issuecomment-1816913943 and onwards. --- src/OT/Color/COLR/COLR.hh | 4 ++-- src/hb-ft-colr.hh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OT/Color/COLR/COLR.hh b/src/OT/Color/COLR/COLR.hh index cf10e894a..f9062682c 100644 --- a/src/OT/Color/COLR/COLR.hh +++ b/src/OT/Color/COLR/COLR.hh @@ -1511,10 +1511,12 @@ struct PaintComposite void paint_glyph (hb_paint_context_t *c) const { TRACE_PAINT (this); + c->funcs->push_group (c->data); c->recurse (this+backdrop); c->funcs->push_group (c->data); c->recurse (this+src); c->funcs->pop_group (c->data, (hb_paint_composite_mode_t) (int) mode); + c->funcs->pop_group (c->data, HB_PAINT_COMPOSITE_MODE_SRC_OVER); } HBUINT8 format; /* format = 32 */ @@ -2714,9 +2716,7 @@ void PaintColrLayers::paint_glyph (hb_paint_context_t *c) const return; const Paint &paint = paint_offset_lists.get_paint (i); - c->funcs->push_group (c->data); c->recurse (paint); - c->funcs->pop_group (c->data, HB_PAINT_COMPOSITE_MODE_SRC_OVER); } } diff --git a/src/hb-ft-colr.hh b/src/hb-ft-colr.hh index c96698369..4151f7200 100644 --- a/src/hb-ft-colr.hh +++ b/src/hb-ft-colr.hh @@ -229,9 +229,7 @@ _hb_ft_paint (hb_ft_paint_context_t *c, if (unlikely (!node.visit ((uintptr_t) other_paint.p))) continue; - c->funcs->push_group (c->data); c->recurse (other_paint); - c->funcs->pop_group (c->data, HB_PAINT_COMPOSITE_MODE_SRC_OVER); } } break; @@ -451,10 +449,12 @@ _hb_ft_paint (hb_ft_paint_context_t *c, break; case FT_COLR_PAINTFORMAT_COMPOSITE: { + c->funcs->push_group (c->data); c->recurse (paint.u.composite.backdrop_paint); c->funcs->push_group (c->data); c->recurse (paint.u.composite.source_paint); c->funcs->pop_group (c->data, _hb_ft_paint_composite_mode (paint.u.composite.composite_mode)); + c->funcs->pop_group (c->data, HB_PAINT_COMPOSITE_MODE_SRC_OVER); } break;