[paint] Resolve colors

We don't need to pass the index/alpha pairs to
client callbacks, and can just resolve the colors
internally.

Update test results.
This commit is contained in:
Matthias Clasen 2022-12-21 16:18:46 -05:00 committed by Behdad Esfahbod
parent bd1389bedf
commit 71bd5a0dfc
21 changed files with 156 additions and 127 deletions

View File

@ -344,7 +344,7 @@ struct glyf_accelerator_t
funcs->push_root_transform (data, &ctx); funcs->push_root_transform (data, &ctx);
funcs->push_clip_glyph (data, gid, &ctx); funcs->push_clip_glyph (data, gid, &ctx);
funcs->color (data, 0xffff, 1., &ctx); funcs->color (data, hb_paint_get_color (&ctx, 0xffff, 1.), &ctx);
funcs->pop_clip (data, &ctx); funcs->pop_clip (data, &ctx);
funcs->pop_root_transform (data, &ctx); funcs->pop_root_transform (data, &ctx);

View File

@ -560,10 +560,11 @@ bool OT::cff1::accelerator_t::paint_glyph (hb_font_t *font, hb_codepoint_t glyph
ctx.font = font; ctx.font = font;
ctx.palette = 0; ctx.palette = 0;
ctx.foreground = foreground; ctx.foreground = foreground;
funcs->push_root_transform (data, &ctx); funcs->push_root_transform (data, &ctx);
funcs->push_clip_glyph (data, glyph, &ctx); funcs->push_clip_glyph (data, glyph, &ctx);
funcs->color (data, 0xffff, 1., &ctx); funcs->color (data, hb_paint_get_color (&ctx, 0xffff, 1.), &ctx);
funcs->pop_clip (data, &ctx); funcs->pop_clip (data, &ctx);
funcs->pop_root_transform (data, &ctx); funcs->pop_root_transform (data, &ctx);

View File

@ -154,7 +154,7 @@ bool OT::cff2::accelerator_t::paint_glyph (hb_font_t *font, hb_codepoint_t glyph
funcs->push_root_transform (data, &ctx); funcs->push_root_transform (data, &ctx);
funcs->push_clip_glyph (data, glyph, &ctx); funcs->push_clip_glyph (data, glyph, &ctx);
funcs->color (data, 0xffff, 1., &ctx); funcs->color (data, hb_paint_get_color (&ctx, 0xffff, 1.), &ctx);
funcs->pop_clip (data, &ctx); funcs->pop_clip (data, &ctx);
funcs->pop_root_transform (data, &ctx); funcs->pop_root_transform (data, &ctx);

View File

@ -51,9 +51,9 @@ hb_color_line_get_color_stops (hb_color_line_t *color_line,
hb_color_stop_t *color_stops) hb_color_stop_t *color_stops)
{ {
if (color_line->is_variable) if (color_line->is_variable)
return reinterpret_cast<const OT::ColorLine<OT::Variable> *>(color_line->base)->get_color_stops (start, count, color_stops, color_line->c->instancer); return reinterpret_cast<const OT::ColorLine<OT::Variable> *>(color_line->base)->get_color_stops (&color_line->c->ctx, start, count, color_stops, color_line->c->instancer);
else else
return reinterpret_cast<const OT::ColorLine<OT::NoVariable> *>(color_line->base)->get_color_stops (start, count, color_stops, color_line->c->instancer); return reinterpret_cast<const OT::ColorLine<OT::NoVariable> *>(color_line->base)->get_color_stops (&color_line->c->ctx, start, count, color_stops, color_line->c->instancer);
} }
/** /**

View File

@ -241,10 +241,11 @@ struct Variable
value.paint_glyph (c, varIdxBase); value.paint_glyph (c, varIdxBase);
} }
void get_color_stop (hb_color_stop_t *c, void get_color_stop (hb_paint_context_t *ctx,
hb_color_stop_t *c,
const VarStoreInstancer &instancer) const const VarStoreInstancer &instancer) const
{ {
value.get_color_stop (c, varIdxBase, instancer); value.get_color_stop (ctx, c, varIdxBase, instancer);
} }
hb_paint_extend_t get_extend () const hb_paint_extend_t get_extend () const
@ -293,10 +294,11 @@ struct NoVariable
value.paint_glyph (c, varIdxBase); value.paint_glyph (c, varIdxBase);
} }
void get_color_stop (hb_color_stop_t *c, void get_color_stop (hb_paint_context_t *ctx,
hb_color_stop_t *c,
const VarStoreInstancer &instancer) const const VarStoreInstancer &instancer) const
{ {
value.get_color_stop (c, VarIdx::NO_VARIATION, instancer); value.get_color_stop (ctx, c, VarIdx::NO_VARIATION, instancer);
} }
hb_paint_extend_t get_extend () const hb_paint_extend_t get_extend () const
@ -331,13 +333,15 @@ struct ColorStop
return_trace (c->check_struct (this)); return_trace (c->check_struct (this));
} }
void get_color_stop (hb_color_stop_t *out, void get_color_stop (hb_paint_context_t *ctx,
hb_color_stop_t *out,
uint32_t varIdx, uint32_t varIdx,
const VarStoreInstancer &instancer) const const VarStoreInstancer &instancer) const
{ {
out->offset = stopOffset.to_float(instancer (varIdx, 0)); out->offset = stopOffset.to_float(instancer (varIdx, 0));
out->color_index = paletteIndex; out->color = hb_paint_get_color (ctx,
out->alpha = alpha.to_float(instancer (varIdx, 1)); paletteIndex,
alpha.to_float (instancer (varIdx, 1)));
} }
F2DOT14 stopOffset; F2DOT14 stopOffset;
@ -393,7 +397,8 @@ struct ColorLine
/* get up to count stops from start */ /* get up to count stops from start */
unsigned int unsigned int
get_color_stops (unsigned int start, get_color_stops (hb_paint_context_t *ctx,
unsigned int start,
unsigned int *count, unsigned int *count,
hb_color_stop_t *color_stops, hb_color_stop_t *color_stops,
const VarStoreInstancer &instancer) const const VarStoreInstancer &instancer) const
@ -404,8 +409,7 @@ struct ColorLine
{ {
unsigned int i; unsigned int i;
for (i = 0; i < *count && start + i < len; i++) for (i = 0; i < *count && start + i < len; i++)
stops[start + i].get_color_stop (&color_stops[i], stops[start + i].get_color_stop (ctx, &color_stops[i], instancer);
instancer);
*count = i; *count = i;
} }
@ -555,8 +559,9 @@ struct PaintSolid
void paint_glyph (hb_ot_paint_context_t *c, uint32_t varIdxBase) const void paint_glyph (hb_ot_paint_context_t *c, uint32_t varIdxBase) const
{ {
c->funcs->color (c->data, c->funcs->color (c->data,
hb_paint_get_color (&c->ctx,
paletteIndex, paletteIndex,
alpha.to_float (c->instancer (varIdxBase, 0)), alpha.to_float (c->instancer (varIdxBase, 0))),
&c->ctx); &c->ctx);
} }
@ -1992,7 +1997,7 @@ struct COLR
.sub_array (record->firstLayerIdx, record->numLayers)) .sub_array (record->firstLayerIdx, record->numLayers))
{ {
c.funcs->push_clip_glyph (c.data, r.glyphId, &c.ctx); c.funcs->push_clip_glyph (c.data, r.glyphId, &c.ctx);
c.funcs->color (c.data, r.colorIdx, 1., &c.ctx); c.funcs->color (c.data, hb_paint_get_color (&c.ctx, r.colorIdx, 1.), &c.ctx);
c.funcs->pop_clip (c.data, &c.ctx); c.funcs->pop_clip (c.data, &c.ctx);
} }

View File

@ -74,8 +74,7 @@ hb_paint_pop_clip_nil (hb_paint_funcs_t *funcs, void *paint_data,
static void static void
hb_paint_color_nil (hb_paint_funcs_t *funcs, void *paint_data, hb_paint_color_nil (hb_paint_funcs_t *funcs, void *paint_data,
unsigned int color_index, hb_color_t color,
float alpha,
const hb_paint_context_t *ctx, const hb_paint_context_t *ctx,
void *user_data) {} void *user_data) {}
@ -489,8 +488,7 @@ hb_paint_pop_clip (hb_paint_funcs_t *funcs, void *paint_data,
* hb_paint_color: * hb_paint_color:
* @funcs: paint functions * @funcs: paint functions
* @paint_data: associated data passed by the caller * @paint_data: associated data passed by the caller
* @color_index: Index of a color in the color palette * @color: The color to use
* @alpha: Alpha to apply in addition
* @ctx: the paint context * @ctx: the paint context
* *
* Perform a "color" paint operation. * Perform a "color" paint operation.
@ -499,11 +497,10 @@ hb_paint_pop_clip (hb_paint_funcs_t *funcs, void *paint_data,
*/ */
void void
hb_paint_color (hb_paint_funcs_t *funcs, void *paint_data, hb_paint_color (hb_paint_funcs_t *funcs, void *paint_data,
unsigned int color_index, hb_color_t color,
float alpha,
const hb_paint_context_t *ctx) const hb_paint_context_t *ctx)
{ {
funcs->color (paint_data, color_index, alpha, ctx); funcs->color (paint_data, color, ctx);
} }
/** /**

View File

@ -46,7 +46,7 @@ HB_BEGIN_DECLS
* *
* The callbacks also assume that the caller uses * The callbacks also assume that the caller uses
* hb_ot_color_palette_get_colors() to obtain colors * hb_ot_color_palette_get_colors() to obtain colors
* from one of the fonts color palettes. If the font does * from the color palette that is selected. If the font does
* not have color palettes, the color index will always * not have color palettes, the color index will always
* be 0xFFFF, indicating the use of the foreground color. * be 0xFFFF, indicating the use of the foreground color.
* *
@ -240,27 +240,18 @@ typedef void (*hb_paint_pop_clip_func_t) (hb_paint_funcs_t *funcs,
* hb_paint_color_func_t: * hb_paint_color_func_t:
* @funcs: paint functions object * @funcs: paint functions object
* @paint_data: The data accompanying the paint functions in hb_font_paint_glyph() * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
* @color_index: Index of a color in the fonts selected color palette * @color: The color to use
* @alpha: alpha to apply in addition * @ctx: The paint context
* @ctx: the paint context
* @user_data: User data pointer passed to hb_paint_funcs_set_color_func() * @user_data: User data pointer passed to hb_paint_funcs_set_color_func()
* *
* A virtual method for the #hb_paint_funcs_t to paint a * A virtual method for the #hb_paint_funcs_t to paint a
* color everywhere within the current clip. * color everywhere within the current clip.
* *
* The @color_index can be either an index into one of the fonts
* color palettes, or the special value 0xFFFF, which indicates that
* the foreground color should be used.
*
* In either case, the @alpha value should be applied in addition
* (i.e. multiplied with) the alpha value found in the color.
*
* Since: REPLACEME * Since: REPLACEME
*/ */
typedef void (*hb_paint_color_func_t) (hb_paint_funcs_t *funcs, typedef void (*hb_paint_color_func_t) (hb_paint_funcs_t *funcs,
void *paint_data, void *paint_data,
unsigned int color_index, hb_color_t color,
float alpha,
const hb_paint_context_t *ctx, const hb_paint_context_t *ctx,
void *user_data); void *user_data);
@ -321,27 +312,18 @@ typedef struct hb_color_line_t hb_color_line_t;
/** /**
* hb_color_stop_t: * hb_color_stop_t:
* @offset: the offset of the color stop * @offset: the offset of the color stop
* @color_index: either a color palette index or the special value 0xFFFF * @color: the color
* @alpha: alpha to apply
* *
* Information about a color stop on a color line. * Information about a color stop on a color line.
* *
* Color lines typically have offsets ranging between 0 and 1, * Color lines typically have offsets ranging between 0 and 1,
* but that is not required. * but that is not required.
* *
* The @color_index can be either an index into one of the fonts
* color palettes, or the special value 0xFFFF, which indicates that
* the foreground color should be used.
*
* in either case, the @alpha value should be applied in addition
* (i.e. multiplied with) the alpha value found in the color.
*
* Since: REPLACEME * Since: REPLACEME
*/ */
typedef struct { typedef struct {
float offset; float offset;
unsigned int color_index; hb_color_t color;
float alpha;
} hb_color_stop_t; } hb_color_stop_t;
HB_EXTERN unsigned int HB_EXTERN unsigned int
@ -789,8 +771,7 @@ hb_paint_pop_clip (hb_paint_funcs_t *funcs, void *paint_data,
HB_EXTERN void HB_EXTERN void
hb_paint_color (hb_paint_funcs_t *funcs, void *paint_data, hb_paint_color (hb_paint_funcs_t *funcs, void *paint_data,
unsigned int color_index, hb_color_t color,
float alpha,
const hb_paint_context_t *ctx); const hb_paint_context_t *ctx);
HB_EXTERN void HB_EXTERN void

View File

@ -98,11 +98,10 @@ struct hb_paint_funcs_t
{ func.pop_clip (this, paint_data, ctx, { func.pop_clip (this, paint_data, ctx,
!user_data ? nullptr : user_data->pop_clip); } !user_data ? nullptr : user_data->pop_clip); }
void color (void *paint_data, void color (void *paint_data,
unsigned int color_index, hb_color_t color,
float alpha,
const hb_paint_context_t *ctx) const hb_paint_context_t *ctx)
{ func.color (this, paint_data, { func.color (this, paint_data,
color_index, alpha, color,
ctx, ctx,
!user_data ? nullptr : user_data->color); } !user_data ? nullptr : user_data->color); }
void image (void *paint_data, void image (void *paint_data,
@ -197,4 +196,26 @@ struct hb_paint_funcs_t
}; };
DECLARE_NULL_INSTANCE (hb_paint_funcs_t); DECLARE_NULL_INSTANCE (hb_paint_funcs_t);
static inline hb_color_t
hb_paint_get_color (const hb_paint_context_t *ctx,
unsigned int color_index,
float alpha)
{
hb_color_t color = ctx->foreground;
if (color_index != 0xffff)
{
unsigned int clen = 1;
hb_face_t *face = hb_font_get_face (ctx->font);
hb_ot_color_palette_get_colors (face, ctx->palette, color_index, &clen, &color);
}
return HB_COLOR (hb_color_get_blue (color),
hb_color_get_green (color),
hb_color_get_red (color),
hb_color_get_alpha (color) * alpha);
}
#endif /* HB_PAINT_HH */ #endif /* HB_PAINT_HH */

View File

@ -7,10 +7,10 @@ start transform 0.019531 0.000000 0.000000 0.019531 0.000000 0.000000
p0 280.000000 440.000000 radius 0.000000 p0 280.000000 440.000000 radius 0.000000
p1 280.000000 440.000000 radius 467.000000 p1 280.000000 440.000000 radius 467.000000
colors colors
0.000000 16 1.000000 0.000000 186 141 104 255
0.448792 15 1.000000 0.448792 183 138 103 255
0.808594 14 1.000000 0.808594 173 130 100 255
1.000000 12 1.000000 1.000000 164 123 98 255
end transform end transform
end clip end clip
end transform end transform
@ -23,29 +23,29 @@ start transform 0.019531 0.000000 0.000000 0.019531 0.000000 0.000000
p1 1019.000000 -27.000000 p1 1019.000000 -27.000000
p2 231.000000 -815.000000 p2 231.000000 -815.000000
colors colors
0.000000 12 1.000000 0.000000 164 123 98 255
1.000000 12 1.000000 1.000000 164 123 98 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
push group push group
start transform 51.200001 0.000000 -0.000000 51.200001 0.000000 0.000000 start transform 51.200001 0.000000 -0.000000 51.200001 0.000000 0.000000
start clip glyph 15 start clip glyph 15
solid 9 1.000000 solid 145 103 77 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
push group push group
start transform 51.200001 0.000000 -0.000000 51.200001 0.000000 0.000000 start transform 51.200001 0.000000 -0.000000 51.200001 0.000000 0.000000
start clip glyph 16 start clip glyph 16
solid 0 1.000000 solid 30 136 229 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
push group push group
start transform 51.200001 0.000000 -0.000000 51.200001 0.000000 0.000000 start transform 51.200001 0.000000 -0.000000 51.200001 0.000000 0.000000
start clip glyph 21 start clip glyph 21
solid 9 1.000000 solid 145 103 77 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
@ -58,15 +58,15 @@ start transform 0.019531 0.000000 0.000000 0.019531 0.000000 0.000000
p1 180.000000 -106.000000 p1 180.000000 -106.000000
p2 -212.000000 1265.000000 p2 -212.000000 1265.000000
colors colors
0.000000 5 1.000000 0.000000 100 181 246 255
1.000000 1 1.000000 1.000000 33 150 243 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
push group push group
start transform 51.200001 0.000000 -0.000000 51.200001 0.000000 0.000000 start transform 51.200001 0.000000 -0.000000 51.200001 0.000000 0.000000
start clip glyph 18 start clip glyph 18
solid 2 0.200012 solid 66 66 66 51
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
@ -79,10 +79,10 @@ start transform 0.019531 0.000000 0.000000 0.019531 0.000000 0.000000
p0 588.000000 198.000000 radius 0.000000 p0 588.000000 198.000000 radius 0.000000
p1 588.000000 198.000000 radius 342.000000 p1 588.000000 198.000000 radius 342.000000
colors colors
0.000000 16 1.000000 0.000000 186 141 104 255
0.448792 15 1.000000 0.448792 183 138 103 255
0.808594 14 1.000000 0.808594 173 130 100 255
1.000000 12 1.000000 1.000000 164 123 98 255
end transform end transform
end clip end clip
end transform end transform
@ -90,7 +90,7 @@ start transform 0.019531 0.000000 0.000000 0.019531 0.000000 0.000000
push group push group
start transform 51.200001 0.000000 -0.000000 51.200001 0.000000 0.000000 start transform 51.200001 0.000000 -0.000000 51.200001 0.000000 0.000000
start clip glyph 20 start clip glyph 20
solid 9 1.000000 solid 145 103 77 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3

View File

@ -7,10 +7,10 @@ start transform 0.019531 0.000000 0.003906 0.019531 0.000000 0.000000
p0 280.000000 440.000000 radius 0.000000 p0 280.000000 440.000000 radius 0.000000
p1 280.000000 440.000000 radius 467.000000 p1 280.000000 440.000000 radius 467.000000
colors colors
0.000000 16 1.000000 0.000000 186 141 104 255
0.448792 15 1.000000 0.448792 183 138 103 255
0.808594 14 1.000000 0.808594 173 130 100 255
1.000000 12 1.000000 1.000000 164 123 98 255
end transform end transform
end clip end clip
end transform end transform
@ -23,29 +23,29 @@ start transform 0.019531 0.000000 0.003906 0.019531 0.000000 0.000000
p1 1019.000000 -27.000000 p1 1019.000000 -27.000000
p2 231.000000 -815.000000 p2 231.000000 -815.000000
colors colors
0.000000 12 1.000000 0.000000 164 123 98 255
1.000000 12 1.000000 1.000000 164 123 98 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
push group push group
start transform 51.200001 0.000000 -10.240000 51.200001 0.000000 0.000000 start transform 51.200001 0.000000 -10.240000 51.200001 0.000000 0.000000
start clip glyph 15 start clip glyph 15
solid 9 1.000000 solid 145 103 77 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
push group push group
start transform 51.200001 0.000000 -10.240000 51.200001 0.000000 0.000000 start transform 51.200001 0.000000 -10.240000 51.200001 0.000000 0.000000
start clip glyph 16 start clip glyph 16
solid 0 1.000000 solid 30 136 229 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
push group push group
start transform 51.200001 0.000000 -10.240000 51.200001 0.000000 0.000000 start transform 51.200001 0.000000 -10.240000 51.200001 0.000000 0.000000
start clip glyph 21 start clip glyph 21
solid 9 1.000000 solid 145 103 77 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
@ -58,15 +58,15 @@ start transform 0.019531 0.000000 0.003906 0.019531 0.000000 0.000000
p1 180.000000 -106.000000 p1 180.000000 -106.000000
p2 -212.000000 1265.000000 p2 -212.000000 1265.000000
colors colors
0.000000 5 1.000000 0.000000 100 181 246 255
1.000000 1 1.000000 1.000000 33 150 243 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
push group push group
start transform 51.200001 0.000000 -10.240000 51.200001 0.000000 0.000000 start transform 51.200001 0.000000 -10.240000 51.200001 0.000000 0.000000
start clip glyph 18 start clip glyph 18
solid 2 0.200012 solid 66 66 66 51
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
@ -79,10 +79,10 @@ start transform 0.019531 0.000000 0.003906 0.019531 0.000000 0.000000
p0 588.000000 198.000000 radius 0.000000 p0 588.000000 198.000000 radius 0.000000
p1 588.000000 198.000000 radius 342.000000 p1 588.000000 198.000000 radius 342.000000
colors colors
0.000000 16 1.000000 0.000000 186 141 104 255
0.448792 15 1.000000 0.448792 183 138 103 255
0.808594 14 1.000000 0.808594 173 130 100 255
1.000000 12 1.000000 1.000000 164 123 98 255
end transform end transform
end clip end clip
end transform end transform
@ -90,7 +90,7 @@ start transform 0.019531 0.000000 0.003906 0.019531 0.000000 0.000000
push group push group
start transform 51.200001 0.000000 -10.240000 51.200001 0.000000 0.000000 start transform 51.200001 0.000000 -10.240000 51.200001 0.000000 0.000000
start clip glyph 20 start clip glyph 20
solid 9 1.000000 solid 145 103 77 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3

View File

@ -5,10 +5,10 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
center 500.000000 600.000000 center 500.000000 600.000000
angles 0.000000 6.283185 angles 0.000000 6.283185
colors colors
0.250000 7 1.000000 0.250000 250 240 230 255
0.416687 4 1.000000 0.416687 0 0 255 255
0.583313 0 1.000000 0.583313 255 0 0 255
0.750000 8 1.000000 0.750000 47 79 79 255
end clip end clip
end transform end transform
end transform end transform

View File

@ -2,7 +2,7 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
push group push group
start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000 start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000
start clip glyph 3 start clip glyph 3
solid 4 0.500000 solid 0 0 255 127
end clip end clip
end transform end transform
push group push group
@ -11,7 +11,7 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
start transform 0.000000 0.000000 0.000000 0.000000 -1000.000000 -1000.000000 start transform 0.000000 0.000000 0.000000 0.000000 -1000.000000 -1000.000000
start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000 start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000
start clip glyph 3 start clip glyph 3
solid 1 0.700012 solid 255 165 0 178
end clip end clip
end transform end transform
end transform end transform

View File

@ -2,14 +2,14 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
push group push group
start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000 start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000
start clip glyph 3 start clip glyph 3
solid 4 0.500000 solid 0 0 255 127
end clip end clip
end transform end transform
push group push group
start transform 1.000000 0.000000 0.000000 1.000000 200.000000 200.000000 start transform 1.000000 0.000000 0.000000 1.000000 200.000000 200.000000
start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000 start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000
start clip glyph 3 start clip glyph 3
solid 1 0.700012 solid 255 165 0 178
end clip end clip
end transform end transform
end transform end transform

View File

@ -2,7 +2,7 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
push group push group
start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000 start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000
start clip glyph 3 start clip glyph 3
solid 10 1.000000 solid 0 0 0 255
end clip end clip
end transform end transform
pop group mode 3 pop group mode 3
@ -13,7 +13,7 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
start transform 0.000000 0.000000 0.000000 0.000000 -333.000000 -667.000000 start transform 0.000000 0.000000 0.000000 0.000000 -333.000000 -667.000000
start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000 start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000
start clip glyph 2 start clip glyph 2
solid 12 1.000000 solid 255 220 1 255
end clip end clip
end transform end transform
end transform end transform
@ -25,7 +25,7 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
start transform 0.000000 0.000000 0.000000 0.000000 -667.000000 -333.000000 start transform 0.000000 0.000000 0.000000 0.000000 -667.000000 -333.000000
start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000 start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000
start clip glyph 2 start clip glyph 2
solid 11 1.000000 solid 104 199 232 255
end clip end clip
end transform end transform
end transform end transform

View File

@ -6,9 +6,9 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
p1 2300.000000 950.000000 p1 2300.000000 950.000000
p2 -1000.000000 250.000000 p2 -1000.000000 250.000000
colors colors
0.000000 0 1.000000 0.000000 255 0 0 255
0.500000 4 1.000000 0.500000 0 0 255 255
1.000000 2 1.000000 1.000000 255 255 0 255
end clip end clip
end transform end transform
end transform end transform

View File

@ -3,7 +3,7 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
start transform 1.000000 0.000000 0.000000 1.000000 150.000000 0.000000 start transform 1.000000 0.000000 0.000000 1.000000 150.000000 0.000000
start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000 start transform 50.000000 0.000000 -0.000000 50.000000 0.000000 0.000000
start clip glyph 174 start clip glyph 174
solid 3 1.000000 solid 0 128 0 255
end clip end clip
end transform end transform
end transform end transform
@ -17,8 +17,8 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
p1 500.000000 950.000000 p1 500.000000 950.000000
p2 600.000000 250.000000 p2 600.000000 250.000000
colors colors
0.000000 0 1.000000 0.000000 255 0 0 255
1.000000 4 1.000000 1.000000 0 0 255 255
end clip end clip
end transform end transform
end transform end transform

View File

@ -6,8 +6,8 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
p1 900.000000 250.000000 p1 900.000000 250.000000
p2 100.000000 300.000000 p2 100.000000 300.000000
colors colors
0.000000 0 1.000000 0.000000 255 0 0 255
1.000000 4 1.000000 1.000000 0 0 255 255
end clip end clip
end transform end transform
end transform end transform

View File

@ -5,9 +5,9 @@ start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000
p0 166.000000 768.000000 radius 0.000000 p0 166.000000 768.000000 radius 0.000000
p1 166.000000 768.000000 radius 256.000000 p1 166.000000 768.000000 radius 256.000000
colors colors
0.000000 3 1.000000 0.000000 0 128 0 255
0.500000 9 1.000000 0.500000 255 255 255 255
1.000000 0 1.000000 1.000000 255 0 0 255
end clip end clip
end transform end transform
end transform end transform

View File

@ -546,14 +546,17 @@ pop_clip (hb_paint_funcs_t *funcs,
static void static void
paint_color (hb_paint_funcs_t *funcs, paint_color (hb_paint_funcs_t *funcs,
void *paint_data, void *paint_data,
unsigned int color_index, hb_color_t color,
float alpha,
const hb_paint_context_t *ctx, const hb_paint_context_t *ctx,
void *user_data) void *user_data)
{ {
paint_data_t *data = user_data; paint_data_t *data = user_data;
print (data, "solid %u %f", color_index, alpha); print (data, "solid %d %d %d %d",
hb_color_get_red (color),
hb_color_get_green (color),
hb_color_get_blue (color),
hb_color_get_alpha (color));
} }
static void static void
@ -587,7 +590,12 @@ print_color_line (paint_data_t *data,
print (data, "colors"); print (data, "colors");
data->level += 1; data->level += 1;
for (unsigned int i = 0; i < len; i++) for (unsigned int i = 0; i < len; i++)
print (data, "%f %u %f", stops[i].offset, stops[i].color_index, stops[i].alpha); print (data, "%f %d %d %d %d",
stops[i].offset,
hb_color_get_red (stops[i].color),
hb_color_get_green (stops[i].color),
hb_color_get_blue (stops[i].color),
hb_color_get_alpha (stops[i].color));
data->level -= 1; data->level -= 1;
} }
@ -746,7 +754,7 @@ test_hb_ot_color_colr_v1 (gconstpointer d)
*/ */
if (getenv ("GENERATE_DATA")) if (getenv ("GENERATE_DATA"))
{ {
g_print ("%s\n", data.string->str); g_print ("%s", data.string->str);
exit (0); exit (0);
} }

View File

@ -259,8 +259,11 @@ hb_cairo_paint_linear_gradient (cairo_t *cr,
cairo_pattern_set_extend (pattern, cairo_extend (hb_color_line_get_extend (color_line))); cairo_pattern_set_extend (pattern, cairo_extend (hb_color_line_get_extend (color_line)));
for (unsigned int i = 0; i < len; i++) for (unsigned int i = 0; i < len; i++)
{ {
float r, g, b, a; double r, g, b, a;
hb_cairo_get_font_color (ctx, stops[i].color_index, stops[i].alpha, &r, &g, &b, &a); r = hb_color_get_red (stops[i].color) / 255.;
g = hb_color_get_green (stops[i].color) / 255.;
b = hb_color_get_blue (stops[i].color) / 255.;
a = hb_color_get_alpha (stops[i].color) / 255.;
cairo_pattern_add_color_stop_rgba (pattern, stops[i].offset, r, g, b, a); cairo_pattern_add_color_stop_rgba (pattern, stops[i].offset, r, g, b, a);
} }
@ -307,8 +310,11 @@ hb_cairo_paint_radial_gradient (cairo_t *cr,
for (unsigned int i = 0; i < len; i++) for (unsigned int i = 0; i < len; i++)
{ {
float r, g, b, a; double r, g, b, a;
hb_cairo_get_font_color (ctx, stops[i].color_index, stops[i].alpha, &r, &g, &b, &a); r = hb_color_get_red (stops[i].color) / 255.;
g = hb_color_get_green (stops[i].color) / 255.;
b = hb_color_get_blue (stops[i].color) / 255.;
a = hb_color_get_alpha (stops[i].color) / 255.;
cairo_pattern_add_color_stop_rgba (pattern, stops[i].offset, r, g, b, a); cairo_pattern_add_color_stop_rgba (pattern, stops[i].offset, r, g, b, a);
} }
@ -486,7 +492,10 @@ add_sweep_gradient_patches (const hb_paint_context_t *ctx,
color_t c; color_t c;
if (start_angle > 0) if (start_angle > 0)
{ {
hb_cairo_get_font_color (ctx, stops[0].color_index, stops[0].alpha, &c.r, &c.g, &c.b, &c.a); c.r = hb_color_get_red (stops[0].color) / 255.;
c.g = hb_color_get_green (stops[0].color) / 255.;
c.b = hb_color_get_blue (stops[0].color) / 255.;
c.a = hb_color_get_alpha (stops[0].color) / 255.;
add_sweep_gradient_patches1 (cx, cy, radius, add_sweep_gradient_patches1 (cx, cy, radius,
0., &c, 0., &c,
start_angle, &c, start_angle, &c,
@ -494,7 +503,10 @@ add_sweep_gradient_patches (const hb_paint_context_t *ctx,
} }
if (end_angle < 2 * M_PI) if (end_angle < 2 * M_PI)
{ {
hb_cairo_get_font_color (ctx, stops[n_stops-1].color_index, stops[n_stops-1].alpha, &c.r, &c.g, &c.b, &c.a); c.r = hb_color_get_red (stops[n_stops - 1].color) / 255.;
c.g = hb_color_get_green (stops[n_stops - 1].color) / 255.;
c.b = hb_color_get_blue (stops[n_stops - 1].color) / 255.;
c.a = hb_color_get_alpha (stops[n_stops - 1].color) / 255.;
add_sweep_gradient_patches1 (cx, cy, radius, add_sweep_gradient_patches1 (cx, cy, radius,
end_angle, &c, end_angle, &c,
2 * M_PI, &c, 2 * M_PI, &c,
@ -530,7 +542,10 @@ add_sweep_gradient_patches (const hb_paint_context_t *ctx,
for (unsigned i = 0; i < n_stops; i++) for (unsigned i = 0; i < n_stops; i++)
{ {
angles[i] = start_angle + stops[i].offset * (end_angle - start_angle); angles[i] = start_angle + stops[i].offset * (end_angle - start_angle);
hb_cairo_get_font_color (ctx, stops[i].color_index, stops[i].alpha, &colors[i].r, &colors[i].g, &colors[i].b, &colors[i].a); colors[i].r = hb_color_get_red (stops[i].color) / 255.;
colors[i].g = hb_color_get_green (stops[i].color) / 255.;
colors[i].b = hb_color_get_blue (stops[i].color) / 255.;
colors[i].a = hb_color_get_alpha (stops[i].color) / 255.;
} }
if (extend == CAIRO_EXTEND_PAD) if (extend == CAIRO_EXTEND_PAD)

View File

@ -209,16 +209,17 @@ pop_group (hb_paint_funcs_t *funcs,
static void static void
paint_color (hb_paint_funcs_t *funcs, paint_color (hb_paint_funcs_t *funcs,
void *paint_data, void *paint_data,
unsigned int color_index, hb_color_t color,
float alpha,
const hb_paint_context_t *ctx, const hb_paint_context_t *ctx,
void *user_data) void *user_data)
{ {
cairo_t *cr = (cairo_t *)paint_data; cairo_t *cr = (cairo_t *)paint_data;
float r, g, b, a;
hb_cairo_get_font_color (ctx, color_index, alpha, &r, &g, &b, &a); cairo_set_source_rgba (cr,
cairo_set_source_rgba (cr, (double)r, (double)g, (double)b, (double)a); hb_color_get_red (color) / 255.,
hb_color_get_green (color) / 255.,
hb_color_get_blue (color) / 255.,
hb_color_get_alpha (color) / 255.);
cairo_paint (cr); cairo_paint (cr);
} }