utils: Some cairo helper tweaks
This commit is contained in:
parent
97224f3b63
commit
b1500babaa
|
@ -45,6 +45,11 @@
|
|||
#define MAX(x,y) ((x) > (y) ? (x) : (y))
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
#define PREALLOCATED_COLOR_STOPS 16
|
||||
|
||||
typedef struct {
|
||||
|
@ -65,37 +70,35 @@ cairo_extend (hb_paint_extend_t extend)
|
|||
return CAIRO_EXTEND_PAD;
|
||||
}
|
||||
|
||||
void
|
||||
hb_face_get_color (hb_face_t *face,
|
||||
unsigned int palette_index,
|
||||
unsigned int color_index,
|
||||
float alpha,
|
||||
float *r, float *g, float *b, float *a)
|
||||
hb_bool_t
|
||||
hb_cairo_get_font_color (hb_font_t *font,
|
||||
unsigned int palette_index,
|
||||
unsigned int color_index,
|
||||
float alpha,
|
||||
float *r, float *g, float *b, float *a)
|
||||
{
|
||||
if (color_index == 0xffff)
|
||||
{
|
||||
/* foreground color */
|
||||
*r = *g = *b = 0;
|
||||
*a = alpha;
|
||||
}
|
||||
else
|
||||
if (color_index != 0xffff)
|
||||
{
|
||||
hb_color_t color;
|
||||
unsigned int clen = 1;
|
||||
hb_face_t *face = hb_font_get_face (font);
|
||||
|
||||
if (hb_ot_color_palette_get_colors (face, palette_index, color_index, &clen, &color))
|
||||
{
|
||||
*r = hb_color_get_red (color) / 255.f;
|
||||
*g = hb_color_get_green (color) / 255.f;
|
||||
*b = hb_color_get_blue (color) / 255.f;
|
||||
*a = (hb_color_get_alpha (color) / 255.f) * alpha;
|
||||
}
|
||||
else
|
||||
{
|
||||
*r = *g = *b = 0;
|
||||
*a = alpha;
|
||||
}
|
||||
{
|
||||
*r = hb_color_get_red (color) / 255.f;
|
||||
*g = hb_color_get_green (color) / 255.f;
|
||||
*b = hb_color_get_blue (color) / 255.f;
|
||||
*a = (hb_color_get_alpha (color) / 255.f) * alpha;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* foreground color */
|
||||
*r = *g = *b = 0;
|
||||
*a = alpha;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
|
@ -240,7 +243,6 @@ hb_cairo_paint_linear_gradient (cairo_t *cr,
|
|||
float x1, float y1,
|
||||
float x2, float y2)
|
||||
{
|
||||
hb_face_t *face = hb_font_get_face (font);
|
||||
hb_color_stop_t stops_[PREALLOCATED_COLOR_STOPS];
|
||||
hb_color_stop_t *stops = stops_;
|
||||
unsigned int len;
|
||||
|
@ -267,7 +269,7 @@ hb_cairo_paint_linear_gradient (cairo_t *cr,
|
|||
for (unsigned int i = 0; i < len; i++)
|
||||
{
|
||||
float r, g, b, a;
|
||||
hb_face_get_color (face, 0, stops[i].color_index, stops[i].alpha, &r, &g, &b, &a);
|
||||
hb_cairo_get_font_color (font, 0, stops[i].color_index, stops[i].alpha, &r, &g, &b, &a);
|
||||
cairo_pattern_add_color_stop_rgba (pattern, stops[i].offset, r, g, b, a);
|
||||
}
|
||||
|
||||
|
@ -287,7 +289,6 @@ hb_cairo_paint_radial_gradient (cairo_t *cr,
|
|||
float x0, float y0, float r0,
|
||||
float x1, float y1, float r1)
|
||||
{
|
||||
hb_face_t *face = hb_font_get_face (font);
|
||||
hb_color_stop_t stops_[PREALLOCATED_COLOR_STOPS];
|
||||
hb_color_stop_t *stops = stops_;
|
||||
unsigned int len;
|
||||
|
@ -316,7 +317,7 @@ hb_cairo_paint_radial_gradient (cairo_t *cr,
|
|||
for (unsigned int i = 0; i < len; i++)
|
||||
{
|
||||
float r, g, b, a;
|
||||
hb_face_get_color (face, 0, stops[i].color_index, stops[i].alpha, &r, &g, &b, &a);
|
||||
hb_cairo_get_font_color (font, 0, stops[i].color_index, stops[i].alpha, &r, &g, &b, &a);
|
||||
cairo_pattern_add_color_stop_rgba (pattern, stops[i].offset, r, g, b, a);
|
||||
}
|
||||
|
||||
|
@ -481,7 +482,6 @@ add_sweep_gradient_patches (hb_font_t *font,
|
|||
float end_angle,
|
||||
cairo_pattern_t *pattern)
|
||||
{
|
||||
hb_face_t *face = hb_font_get_face (font);
|
||||
float angles_[PREALLOCATED_COLOR_STOPS];
|
||||
float *angles = angles_;
|
||||
color_t colors_[PREALLOCATED_COLOR_STOPS];
|
||||
|
@ -495,7 +495,7 @@ add_sweep_gradient_patches (hb_font_t *font,
|
|||
color_t c;
|
||||
if (start_angle > 0)
|
||||
{
|
||||
hb_face_get_color (face, 0, stops[0].color_index, stops[0].alpha, &c.r, &c.g, &c.b, &c.a);
|
||||
hb_cairo_get_font_color (font, 0, stops[0].color_index, stops[0].alpha, &c.r, &c.g, &c.b, &c.a);
|
||||
add_sweep_gradient_patches1 (cx, cy, radius,
|
||||
0., &c,
|
||||
start_angle, &c,
|
||||
|
@ -503,7 +503,7 @@ add_sweep_gradient_patches (hb_font_t *font,
|
|||
}
|
||||
if (end_angle < 2 * M_PI)
|
||||
{
|
||||
hb_face_get_color (face, 0, stops[n_stops-1].color_index, stops[n_stops-1].alpha, &c.r, &c.g, &c.b, &c.a);
|
||||
hb_cairo_get_font_color (font, 0, stops[n_stops-1].color_index, stops[n_stops-1].alpha, &c.r, &c.g, &c.b, &c.a);
|
||||
add_sweep_gradient_patches1 (cx, cy, radius,
|
||||
end_angle, &c,
|
||||
2 * M_PI, &c,
|
||||
|
@ -539,7 +539,7 @@ add_sweep_gradient_patches (hb_font_t *font,
|
|||
for (unsigned i = 0; i < n_stops; i++)
|
||||
{
|
||||
angles[i] = start_angle + stops[i].offset * (end_angle - start_angle);
|
||||
hb_face_get_color (face, 0, stops[i].color_index, stops[i].alpha, &colors[i].r, &colors[i].g, &colors[i].b, &colors[i].a);
|
||||
hb_cairo_get_font_color (font, 0, stops[i].color_index, stops[i].alpha, &colors[i].r, &colors[i].g, &colors[i].b, &colors[i].a);
|
||||
}
|
||||
|
||||
if (extend == CAIRO_EXTEND_PAD)
|
||||
|
|
|
@ -70,11 +70,11 @@ hb_paint_composite_mode_to_cairo (hb_paint_composite_mode_t mode)
|
|||
return CAIRO_OPERATOR_SOURCE;
|
||||
}
|
||||
|
||||
void hb_face_get_color (hb_face_t *face,
|
||||
unsigned int palette_index,
|
||||
unsigned int color_index,
|
||||
float alpha,
|
||||
float *r, float *g, float *b, float *a);
|
||||
hb_bool_t hb_cairo_get_font_color (hb_font_t *font,
|
||||
unsigned int palette_index,
|
||||
unsigned int color_index,
|
||||
float alpha,
|
||||
float *r, float *g, float *b, float *a);
|
||||
|
||||
void hb_cairo_paint_glyph_image (cairo_t *cr,
|
||||
hb_font_t *font,
|
||||
|
|
|
@ -118,7 +118,9 @@ push_transform (hb_paint_funcs_t *funcs,
|
|||
cairo_matrix_t m;
|
||||
|
||||
cairo_save (cr);
|
||||
cairo_matrix_init (&m, xx, yx, xy, yy, dx, dy);
|
||||
cairo_matrix_init (&m, (double)xx, (double)yx,
|
||||
(double)xy, (double)yy,
|
||||
(double)dx, (double)dy);
|
||||
cairo_transform (cr, &m);
|
||||
}
|
||||
|
||||
|
@ -144,7 +146,7 @@ push_clip_glyph (hb_paint_funcs_t *funcs,
|
|||
|
||||
cairo_save (cr);
|
||||
cairo_new_path (cr);
|
||||
hb_font_get_glyph_shape (font, glyph, get_cairo_draw_funcs (), cr);
|
||||
hb_font_draw_glyph (font, glyph, get_cairo_draw_funcs (), cr);
|
||||
cairo_close_path (cr);
|
||||
cairo_clip (cr);
|
||||
}
|
||||
|
@ -159,7 +161,9 @@ push_clip_rectangle (hb_paint_funcs_t *funcs,
|
|||
cairo_t *cr = (cairo_t *)paint_data;
|
||||
|
||||
cairo_save (cr);
|
||||
cairo_rectangle (cr, xmin, ymin, xmax - xmin, ymax - ymin);
|
||||
cairo_rectangle (cr,
|
||||
(double)xmin, (double)ymin,
|
||||
(double)(xmax - xmin), (double)(ymax - ymin));
|
||||
cairo_clip (cr);
|
||||
}
|
||||
|
||||
|
@ -211,11 +215,10 @@ paint_color (hb_paint_funcs_t *funcs,
|
|||
void *user_data)
|
||||
{
|
||||
cairo_t *cr = (cairo_t *)paint_data;
|
||||
hb_face_t *face = hb_font_get_face (font);
|
||||
float r, g, b, a;
|
||||
|
||||
hb_face_get_color (face, 0, color_index, alpha, &r, &g, &b, &a);
|
||||
cairo_set_source_rgba (cr, r, g, b, a);
|
||||
hb_cairo_get_font_color (font, 0, color_index, alpha, &r, &g, &b, &a);
|
||||
cairo_set_source_rgba (cr, (double)r, (double)g, (double)b, (double)a);
|
||||
cairo_paint (cr);
|
||||
}
|
||||
|
||||
|
@ -277,7 +280,7 @@ paint_sweep_gradient (hb_paint_funcs_t *funcs,
|
|||
}
|
||||
|
||||
static hb_paint_funcs_t *
|
||||
get_cairo_paint_funcs (void)
|
||||
get_cairo_paint_funcs ()
|
||||
{
|
||||
static hb_paint_funcs_t *funcs;
|
||||
|
||||
|
@ -331,7 +334,7 @@ render_glyph (cairo_scaled_font_t *scaled_font,
|
|||
hb_font_get_scale (font, &x_scale, &y_scale);
|
||||
cairo_scale (cr, +1./x_scale, -1./y_scale);
|
||||
|
||||
hb_font_get_glyph_shape (font, glyph, get_cairo_draw_funcs (), cr);
|
||||
hb_font_draw_glyph (font, glyph, get_cairo_draw_funcs (), cr);
|
||||
cairo_fill (cr);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
|
|
Loading…
Reference in New Issue