Rework support in the surface backend for the five basic drawing operations (paint, mask, stroke, fill, and show_glyphs). Now, all 5 operations have backend functions, and all use a consistent convention for argument naming and ordering. The old fill_path has been replaced with a new fill. The old show_glyphs function was recently renamed to old_show_glyphs and has not yet been ported to the new show_glyphs, (so all backends have a NULL show_glyphs function). In fact, of the 5 new backend functions, fill is the only one that has an implementation in any backend. As part of this cleanup a new cairo_stroke_style_t object is introduced to capture the many settings unique to the stroke operation, (line_width, line_cap, line_join, miter_limit, dash, num_dashes, and dash_offset).

Track changes in surface backend from fill_path to fill.
Track the new canonical argument naming and ordering for the 5 drawing operations.
Move various stroke style settings into new cairo_stroke_style_t.
Drop NULL fill_path backend function which no longer exists.
This commit is contained in:
Carl Worth 2005-11-04 11:16:38 +00:00
parent 719334c52c
commit 39eca22bfe
14 changed files with 497 additions and 481 deletions

View file

@ -1,3 +1,60 @@
2005-11-04 Carl Worth <cworth@cworth.org>
* src/cairoint.h: Rework support in the surface backend for the
five basic drawing operations (paint, mask, stroke, fill, and
show_glyphs). Now, all 5 operations have backend functions, and
all use a consistent convention for argument naming and
ordering. The old fill_path has been replaced with a new fill. The
old show_glyphs function was recently renamed to old_show_glyphs
and has not yet been ported to the new show_glyphs, (so all
backends have a NULL show_glyphs function). In fact, of the 5 new
backend functions, fill is the only one that has an implementation
in any backend. As part of this cleanup a new cairo_stroke_style_t
object is introduced to capture the many settings unique to the
stroke operation, (line_width, line_cap, line_join, miter_limit,
dash, num_dashes, and dash_offset).
* src/cairo-meta-surface-private.h:
* src/cairo-meta-surface.c: (_cairo_meta_surface_finish),
(_cairo_meta_surface_fill), (_cairo_meta_surface_replay):
* src/cairo-ps-surface.c: (_cairo_ps_surface_fill),
(_ps_output_fill):
* src/cairo-pdf-surface.c: (_cairo_pdf_surface_fill):
Track changes in surface backend from fill_path to fill.
* src/cairo-surface.c: (_fallback_paint), (_cairo_surface_paint),
(_fallback_mask), (_cairo_surface_mask), (_fallback_stroke),
(_cairo_surface_stroke), (_fallback_fill), (_cairo_surface_fill),
(_fallback_show_glyphs), (_cairo_surface_show_glyphs):
* src/cairo-gstate.c: (_cairo_gstate_init),
(_cairo_gstate_paint),
(_cairo_gstate_mask), (_cairo_gstate_stroke),
(_cairo_gstate_fill),
(_cairo_gstate_show_glyphs): Track the new canonical argument
naming and ordering for the 5 drawing operations.
* src/cairo-gstate-private.h:
* src/cairo-gstate.c: (_cairo_gstate_init),
(_cairo_gstate_init_copy), (_cairo_gstate_fini),
(_cairo_gstate_set_line_width), (_cairo_gstate_get_line_width),
(_cairo_gstate_set_line_cap), (_cairo_gstate_get_line_cap),
(_cairo_gstate_set_line_join), (_cairo_gstate_get_line_join),
(_cairo_gstate_set_dash), (_cairo_gstate_set_miter_limit),
(_cairo_gstate_get_miter_limit), (_cairo_gstate_stroke),
(_cairo_gstate_in_stroke), (_cairo_gstate_stroke_extents):
* src/cairo-path-stroke.c: (_cairo_stroker_start_dash),
(_cairo_stroker_step_dash), (_cairo_stroker_init),
(_cairo_stroker_join), (_cairo_stroker_add_cap), (_compute_face),
(_cairo_stroker_curve_to_dashed),
(_cairo_path_fixed_stroke_to_traps):
Move various stroke style settings into new cairo_stroke_style_t.
* src/cairo-glitz-surface.c:
* src/cairo-win32-surface.c:
* src/cairo-xcb-surface.c:
* src/cairo-xlib-surface.c:
Drop NULL fill_path backend function which no longer exists.
2005-11-01 Carl Worth <cworth@cworth.org>
Reviewed by: keithp

View file

@ -2128,7 +2128,6 @@ static const cairo_surface_backend_t cairo_glitz_surface_backend = {
NULL, /* intersect_clip_path */
_cairo_glitz_surface_get_extents,
_cairo_glitz_surface_old_show_glyphs,
NULL, /* fill_path */
NULL, /* get_font_options */
NULL, /* flush */
NULL, /* mark_dirty_rectangle */

View file

@ -44,18 +44,10 @@ struct _cairo_gstate {
double tolerance;
cairo_antialias_t antialias;
/* stroke style */
double line_width;
cairo_line_cap_t line_cap;
cairo_line_join_t line_join;
double miter_limit;
cairo_stroke_style_t stroke_style;
cairo_fill_rule_t fill_rule;
double *dash;
int num_dashes;
double dash_offset;
cairo_font_face_t *font_face;
cairo_scaled_font_t *scaled_font; /* Specific to the current CTM */
cairo_matrix_t font_matrix;

View file

@ -90,17 +90,16 @@ _cairo_gstate_init (cairo_gstate_t *gstate,
gstate->tolerance = CAIRO_GSTATE_TOLERANCE_DEFAULT;
gstate->antialias = CAIRO_ANTIALIAS_DEFAULT;
gstate->line_width = CAIRO_GSTATE_LINE_WIDTH_DEFAULT;
gstate->line_cap = CAIRO_GSTATE_LINE_CAP_DEFAULT;
gstate->line_join = CAIRO_GSTATE_LINE_JOIN_DEFAULT;
gstate->miter_limit = CAIRO_GSTATE_MITER_LIMIT_DEFAULT;
gstate->stroke_style.line_width = CAIRO_GSTATE_LINE_WIDTH_DEFAULT;
gstate->stroke_style.line_cap = CAIRO_GSTATE_LINE_CAP_DEFAULT;
gstate->stroke_style.line_join = CAIRO_GSTATE_LINE_JOIN_DEFAULT;
gstate->stroke_style.miter_limit = CAIRO_GSTATE_MITER_LIMIT_DEFAULT;
gstate->stroke_style.dash = NULL;
gstate->stroke_style.num_dashes = 0;
gstate->stroke_style.dash_offset = 0.0;
gstate->fill_rule = CAIRO_GSTATE_FILL_RULE_DEFAULT;
gstate->dash = NULL;
gstate->num_dashes = 0;
gstate->dash_offset = 0.0;
gstate->font_face = NULL;
gstate->scaled_font = NULL;
@ -137,11 +136,12 @@ _cairo_gstate_init_copy (cairo_gstate_t *gstate, cairo_gstate_t *other)
gstate->next = next;
/* Now fix up pointer data that needs to be cloned/referenced */
if (other->dash) {
gstate->dash = malloc (other->num_dashes * sizeof (double));
if (gstate->dash == NULL)
if (other->stroke_style.dash) {
gstate->stroke_style.dash = malloc (other->stroke_style.num_dashes * sizeof (double));
if (gstate->stroke_style.dash == NULL)
return CAIRO_STATUS_NO_MEMORY;
memcpy (gstate->dash, other->dash, other->num_dashes * sizeof (double));
memcpy (gstate->stroke_style.dash, other->stroke_style.dash,
other->stroke_style.num_dashes * sizeof (double));
}
_cairo_clip_init_copy (&gstate->clip, &other->clip);
@ -177,9 +177,9 @@ _cairo_gstate_fini (cairo_gstate_t *gstate)
cairo_pattern_destroy (gstate->source);
if (gstate->dash) {
free (gstate->dash);
gstate->dash = NULL;
if (gstate->stroke_style.dash) {
free (gstate->stroke_style.dash);
gstate->stroke_style.dash = NULL;
}
}
@ -366,7 +366,7 @@ _cairo_gstate_get_fill_rule (cairo_gstate_t *gstate)
cairo_status_t
_cairo_gstate_set_line_width (cairo_gstate_t *gstate, double width)
{
gstate->line_width = width;
gstate->stroke_style.line_width = width;
return CAIRO_STATUS_SUCCESS;
}
@ -374,13 +374,13 @@ _cairo_gstate_set_line_width (cairo_gstate_t *gstate, double width)
double
_cairo_gstate_get_line_width (cairo_gstate_t *gstate)
{
return gstate->line_width;
return gstate->stroke_style.line_width;
}
cairo_status_t
_cairo_gstate_set_line_cap (cairo_gstate_t *gstate, cairo_line_cap_t line_cap)
{
gstate->line_cap = line_cap;
gstate->stroke_style.line_cap = line_cap;
return CAIRO_STATUS_SUCCESS;
}
@ -388,13 +388,13 @@ _cairo_gstate_set_line_cap (cairo_gstate_t *gstate, cairo_line_cap_t line_cap)
cairo_line_cap_t
_cairo_gstate_get_line_cap (cairo_gstate_t *gstate)
{
return gstate->line_cap;
return gstate->stroke_style.line_cap;
}
cairo_status_t
_cairo_gstate_set_line_join (cairo_gstate_t *gstate, cairo_line_join_t line_join)
{
gstate->line_join = line_join;
gstate->stroke_style.line_join = line_join;
return CAIRO_STATUS_SUCCESS;
}
@ -402,7 +402,7 @@ _cairo_gstate_set_line_join (cairo_gstate_t *gstate, cairo_line_join_t line_join
cairo_line_join_t
_cairo_gstate_get_line_join (cairo_gstate_t *gstate)
{
return gstate->line_join;
return gstate->stroke_style.line_join;
}
cairo_status_t
@ -411,30 +411,30 @@ _cairo_gstate_set_dash (cairo_gstate_t *gstate, double *dash, int num_dashes, do
int i;
double dash_total;
if (gstate->dash)
free (gstate->dash);
if (gstate->stroke_style.dash)
free (gstate->stroke_style.dash);
gstate->num_dashes = num_dashes;
gstate->stroke_style.num_dashes = num_dashes;
if (gstate->num_dashes == 0) {
gstate->dash = NULL;
gstate->dash_offset = 0.0;
if (gstate->stroke_style.num_dashes == 0) {
gstate->stroke_style.dash = NULL;
gstate->stroke_style.dash_offset = 0.0;
return CAIRO_STATUS_SUCCESS;
}
gstate->dash = malloc (gstate->num_dashes * sizeof (double));
if (gstate->dash == NULL) {
gstate->num_dashes = 0;
gstate->stroke_style.dash = malloc (gstate->stroke_style.num_dashes * sizeof (double));
if (gstate->stroke_style.dash == NULL) {
gstate->stroke_style.num_dashes = 0;
return CAIRO_STATUS_NO_MEMORY;
}
memcpy (gstate->dash, dash, gstate->num_dashes * sizeof (double));
memcpy (gstate->stroke_style.dash, dash, gstate->stroke_style.num_dashes * sizeof (double));
dash_total = 0.0;
for (i = 0; i < gstate->num_dashes; i++) {
if (gstate->dash[i] < 0)
for (i = 0; i < gstate->stroke_style.num_dashes; i++) {
if (gstate->stroke_style.dash[i] < 0)
return CAIRO_STATUS_INVALID_DASH;
dash_total += gstate->dash[i];
dash_total += gstate->stroke_style.dash[i];
}
if (dash_total == 0.0)
@ -442,7 +442,7 @@ _cairo_gstate_set_dash (cairo_gstate_t *gstate, double *dash, int num_dashes, do
/* A single dash value indicate symmetric repeating, so the total
* is twice as long. */
if (gstate->num_dashes == 1)
if (gstate->stroke_style.num_dashes == 1)
dash_total *= 2;
/* The dashing code doesn't like a negative offset, so we compute
@ -450,7 +450,7 @@ _cairo_gstate_set_dash (cairo_gstate_t *gstate, double *dash, int num_dashes, do
if (offset < 0)
offset += ceil (-offset / dash_total + 0.5) * dash_total;
gstate->dash_offset = offset;
gstate->stroke_style.dash_offset = offset;
return CAIRO_STATUS_SUCCESS;
}
@ -458,7 +458,7 @@ _cairo_gstate_set_dash (cairo_gstate_t *gstate, double *dash, int num_dashes, do
cairo_status_t
_cairo_gstate_set_miter_limit (cairo_gstate_t *gstate, double limit)
{
gstate->miter_limit = limit;
gstate->stroke_style.miter_limit = limit;
return CAIRO_STATUS_SUCCESS;
}
@ -466,7 +466,7 @@ _cairo_gstate_set_miter_limit (cairo_gstate_t *gstate, double limit)
double
_cairo_gstate_get_miter_limit (cairo_gstate_t *gstate)
{
return gstate->miter_limit;
return gstate->stroke_style.miter_limit;
}
static void
@ -718,9 +718,9 @@ _cairo_gstate_paint (cairo_gstate_t *gstate)
_cairo_gstate_copy_transformed_source (gstate, &pattern.base);
status = _cairo_surface_paint (gstate->operator,
&pattern.base,
gstate->target);
status = _cairo_surface_paint (gstate->target,
gstate->operator,
&pattern.base);
_cairo_pattern_fini (&pattern.base);
@ -1120,10 +1120,10 @@ _cairo_gstate_mask (cairo_gstate_t *gstate,
_cairo_gstate_copy_transformed_source (gstate, &source_pattern.base);
_cairo_gstate_copy_transformed_mask (gstate, &mask_pattern.base, mask);
status = _cairo_surface_mask (gstate->operator,
status = _cairo_surface_mask (gstate->target,
gstate->operator,
&source_pattern.base,
&mask_pattern.base,
gstate->target);
&mask_pattern.base);
_cairo_pattern_fini (&source_pattern.base);
_cairo_pattern_fini (&mask_pattern.base);
@ -1140,7 +1140,7 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
if (gstate->source->status)
return gstate->source->status;
if (gstate->line_width <= 0.0)
if (gstate->stroke_style.line_width <= 0.0)
return CAIRO_STATUS_SUCCESS;
status = _cairo_surface_set_clip (gstate->target, &gstate->clip);
@ -1149,23 +1149,15 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
_cairo_gstate_copy_transformed_source (gstate, &source_pattern.base);
status = _cairo_surface_stroke (gstate->operator,
status = _cairo_surface_stroke (gstate->target,
gstate->operator,
&source_pattern.base,
gstate->target,
path,
gstate->tolerance,
&gstate->stroke_style,
&gstate->ctm,
&gstate->ctm_inverse,
gstate->antialias,
gstate->line_width,
gstate->line_cap,
gstate->line_join,
gstate->miter_limit,
gstate->dash,
gstate->num_dashes,
gstate->dash_offset);
gstate->tolerance,
gstate->antialias);
return status;
@ -1185,19 +1177,12 @@ _cairo_gstate_in_stroke (cairo_gstate_t *gstate,
_cairo_traps_init (&traps);
status = _cairo_path_fixed_stroke_to_traps (path, &traps,
gstate->tolerance,
status = _cairo_path_fixed_stroke_to_traps (path,
&gstate->stroke_style,
&gstate->ctm,
&gstate->ctm_inverse,
gstate->line_width,
gstate->line_cap,
gstate->line_join,
gstate->miter_limit,
gstate->dash,
gstate->num_dashes,
gstate->dash_offset);
gstate->tolerance,
&traps);
if (status)
goto BAIL;
@ -1508,14 +1493,13 @@ _cairo_gstate_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
_cairo_gstate_copy_transformed_source (gstate, &pattern.base);
status = _cairo_surface_fill_path (gstate->operator,
&pattern.base,
gstate->target,
path,
gstate->fill_rule,
gstate->tolerance,
&gstate->clip,
gstate->antialias);
status = _cairo_surface_fill (gstate->target,
gstate->operator,
&pattern.base,
path,
gstate->fill_rule,
gstate->tolerance,
gstate->antialias);
return status;
}
@ -1573,19 +1557,12 @@ _cairo_gstate_stroke_extents (cairo_gstate_t *gstate,
_cairo_traps_init (&traps);
status = _cairo_path_fixed_stroke_to_traps (path, &traps,
gstate->tolerance,
status = _cairo_path_fixed_stroke_to_traps (path,
&gstate->stroke_style,
&gstate->ctm,
&gstate->ctm_inverse,
gstate->line_width,
gstate->line_cap,
gstate->line_join,
gstate->miter_limit,
gstate->dash,
gstate->num_dashes,
gstate->dash_offset);
gstate->tolerance,
&traps);
if (status)
goto BAIL;
@ -1971,12 +1948,12 @@ _cairo_gstate_show_glyphs (cairo_gstate_t *gstate,
_cairo_gstate_copy_transformed_source (gstate, &source_pattern.base);
status = _cairo_surface_show_glyphs (gstate->operator,
status = _cairo_surface_show_glyphs (gstate->target,
gstate->operator,
&source_pattern.base,
gstate->target,
gstate->scaled_font,
transformed_glyphs,
num_glyphs);
num_glyphs,
gstate->scaled_font);
_cairo_pattern_fini (&source_pattern.base);
free (transformed_glyphs);

View file

@ -46,7 +46,7 @@ typedef enum {
CAIRO_COMMAND_SET_CLIP_REGION,
CAIRO_COMMAND_INTERSECT_CLIP_PATH,
CAIRO_COMMAND_SHOW_GLYPHS,
CAIRO_COMMAND_FILL_PATH
CAIRO_COMMAND_FILL
} cairo_command_type_t;
typedef struct _cairo_command_composite {
@ -118,7 +118,7 @@ typedef struct _cairo_command_show_glyphs {
int num_glyphs;
} cairo_command_show_glyphs_t;
typedef struct _cairo_command_fill_path {
typedef struct _cairo_command_fill {
cairo_command_type_t type;
cairo_operator_t operator;
cairo_pattern_union_t pattern;
@ -126,7 +126,7 @@ typedef struct _cairo_command_fill_path {
cairo_fill_rule_t fill_rule;
double tolerance;
cairo_antialias_t antialias;
} cairo_command_fill_path_t;
} cairo_command_fill_t;
typedef union _cairo_command {
cairo_command_type_t type;
@ -136,7 +136,7 @@ typedef union _cairo_command {
cairo_command_set_clip_region_t set_clip_region;
cairo_command_intersect_clip_path_t intersect_clip_path;
cairo_command_show_glyphs_t show_glyphs;
cairo_command_fill_path_t fill_path;
cairo_command_fill_t fill;
} cairo_command_t;
typedef struct _cairo_meta_surface {

View file

@ -111,9 +111,9 @@ _cairo_meta_surface_finish (void *abstract_surface)
free (command);
break;
case CAIRO_COMMAND_FILL_PATH:
_cairo_pattern_fini (&command->fill_path.pattern.base);
_cairo_path_fixed_fini (&command->fill_path.path);
case CAIRO_COMMAND_FILL:
_cairo_pattern_fini (&command->fill.pattern.base);
_cairo_path_fixed_fini (&command->fill.path);
free (command);
break;
@ -401,23 +401,23 @@ _cairo_meta_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font,
}
static cairo_int_status_t
_cairo_meta_surface_fill_path (cairo_operator_t operator,
cairo_pattern_t *pattern,
void *abstract_surface,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
_cairo_meta_surface_fill (void *abstract_surface,
cairo_operator_t operator,
cairo_pattern_t *pattern,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
{
cairo_meta_surface_t *meta = abstract_surface;
cairo_command_fill_path_t *command;
cairo_command_fill_t *command;
cairo_status_t status;
command = malloc (sizeof (cairo_command_fill_path_t));
command = malloc (sizeof (cairo_command_fill_t));
if (command == NULL)
return CAIRO_STATUS_NO_MEMORY;
command->type = CAIRO_COMMAND_FILL_PATH;
command->type = CAIRO_COMMAND_FILL;
command->operator = operator;
_init_pattern_with_snapshot (&command->pattern.base, pattern);
status = _cairo_path_fixed_init_copy (&command->path, path);
@ -471,7 +471,21 @@ static const cairo_surface_backend_t cairo_meta_surface_backend = {
_cairo_meta_surface_intersect_clip_path,
_cairo_meta_surface_get_extents,
_cairo_meta_surface_old_show_glyphs,
_cairo_meta_surface_fill_path,
NULL, /* get_font_options */
NULL, /* flush */
NULL, /* mark_dirty_rectangle */
NULL, /* scaled_font_fini */
NULL, /* scaled_glyph_fini */
/* Here are the drawing functions, (which are in some sense the
* only things that cairo_meta_surface should need to
* implement). */
NULL, /* paint */
NULL, /* mask */
NULL, /* stroke */
_cairo_meta_surface_fill,
NULL /* show_glyphs */
};
cairo_int_status_t
@ -599,39 +613,38 @@ _cairo_meta_surface_replay (cairo_surface_t *surface,
break;
case CAIRO_COMMAND_FILL_PATH:
case CAIRO_COMMAND_FILL:
status = _cairo_surface_set_clip (target, &clip);
if (status)
break;
status = _cairo_surface_fill_path (command->fill_path.operator,
&command->fill_path.pattern.base,
target,
&command->fill_path.path,
command->fill_path.fill_rule,
command->fill_path.tolerance,
&clip,
command->fill_path.antialias);
status = _cairo_surface_fill (target,
command->fill.operator,
&command->fill.pattern.base,
&command->fill.path,
command->fill.fill_rule,
command->fill.tolerance,
command->fill.antialias);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
break;
_cairo_traps_init (&traps);
status = _cairo_path_fixed_fill_to_traps (&command->fill_path.path,
command->fill_path.fill_rule,
command->fill_path.tolerance,
status = _cairo_path_fixed_fill_to_traps (&command->fill.path,
command->fill.fill_rule,
command->fill.tolerance,
&traps);
if (status) {
_cairo_traps_fini (&traps);
break;
}
status = _cairo_surface_clip_and_composite_trapezoids (&command->fill_path.pattern.base,
command->fill_path.operator,
status = _cairo_surface_clip_and_composite_trapezoids (&command->fill.pattern.base,
command->fill.operator,
target,
&traps,
&clip,
command->fill_path.antialias);
command->fill.antialias);
_cairo_traps_fini (&traps);
break;

View file

@ -37,24 +37,15 @@
#include "cairoint.h"
typedef struct cairo_stroker {
cairo_traps_t *traps;
cairo_pen_t pen;
cairo_stroke_style_t *style;
cairo_matrix_t *ctm;
cairo_matrix_t *ctm_inverse;
double tolerance;
/* stroke style */
double line_width;
cairo_line_cap_t line_cap;
cairo_line_join_t line_join;
double miter_limit;
/* dash style */
double *dash;
int num_dashes;
double dash_offset;
cairo_traps_t *traps;
cairo_pen_t pen;
cairo_bool_t has_current_point;
cairo_point_t current_point;
@ -74,21 +65,12 @@ typedef struct cairo_stroker {
/* private functions */
static void
_cairo_stroker_init (cairo_stroker_t *stroker,
cairo_traps_t *traps,
double tolerance,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double line_width,
cairo_line_cap_t line_cap,
cairo_line_join_t line_join,
double miter_limit,
double *dash,
int num_dashes,
double dash_offset);
_cairo_stroker_init (cairo_stroker_t *stroker,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double tolerance,
cairo_traps_t *traps);
static void
_cairo_stroker_fini (cairo_stroker_t *stroker);
@ -133,17 +115,17 @@ _cairo_stroker_start_dash (cairo_stroker_t *stroker)
int on = 1;
int i = 0;
offset = stroker->dash_offset;
while (offset >= stroker->dash[i]) {
offset -= stroker->dash[i];
offset = stroker->style->dash_offset;
while (offset >= stroker->style->dash[i]) {
offset -= stroker->style->dash[i];
on = 1-on;
if (++i == stroker->num_dashes)
if (++i == stroker->style->num_dashes)
i = 0;
}
stroker->dashed = TRUE;
stroker->dash_index = i;
stroker->dash_on = on;
stroker->dash_remain = stroker->dash[i] - offset;
stroker->dash_remain = stroker->style->dash[i] - offset;
}
static void
@ -152,52 +134,36 @@ _cairo_stroker_step_dash (cairo_stroker_t *stroker, double step)
stroker->dash_remain -= step;
if (stroker->dash_remain <= 0) {
stroker->dash_index++;
if (stroker->dash_index == stroker->num_dashes)
if (stroker->dash_index == stroker->style->num_dashes)
stroker->dash_index = 0;
stroker->dash_on = 1-stroker->dash_on;
stroker->dash_remain = stroker->dash[stroker->dash_index];
stroker->dash_remain = stroker->style->dash[stroker->dash_index];
}
}
static void
_cairo_stroker_init (cairo_stroker_t *stroker,
cairo_traps_t *traps,
double tolerance,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double line_width,
cairo_line_cap_t line_cap,
cairo_line_join_t line_join,
double miter_limit,
double *dash,
int num_dashes,
double dash_offset)
_cairo_stroker_init (cairo_stroker_t *stroker,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double tolerance,
cairo_traps_t *traps)
{
stroker->traps = traps;
_cairo_pen_init (&stroker->pen, line_width / 2.0, tolerance, ctm);
stroker->tolerance = tolerance;
stroker->style = stroke_style;
stroker->ctm = ctm;
stroker->ctm_inverse = ctm_inverse;
stroker->tolerance = tolerance;
stroker->traps = traps;
stroker->line_width = line_width;
stroker->line_cap = line_cap;
stroker->line_join = line_join;
stroker->miter_limit = miter_limit;
stroker->dash = dash;
stroker->num_dashes = num_dashes;
stroker->dash_offset = dash_offset;
_cairo_pen_init (&stroker->pen,
stroke_style->line_width / 2.0,
tolerance, ctm);
stroker->has_current_point = FALSE;
stroker->has_current_face = FALSE;
stroker->has_first_face = FALSE;
if (stroker->dash)
if (stroker->style->dash)
_cairo_stroker_start_dash (stroker);
else
stroker->dashed = FALSE;
@ -249,7 +215,7 @@ _cairo_stroker_join (cairo_stroker_t *stroker, cairo_stroke_face_t *in, cairo_st
outpt = &out->cw;
}
switch (stroker->line_join) {
switch (stroker->style->line_join) {
case CAIRO_LINE_JOIN_ROUND: {
int i;
int start, step, stop;
@ -290,7 +256,7 @@ _cairo_stroker_join (cairo_stroker_t *stroker, cairo_stroke_face_t *in, cairo_st
/* dot product of incoming slope vector with outgoing slope vector */
double in_dot_out = ((-in->usr_vector.x * out->usr_vector.x)+
(-in->usr_vector.y * out->usr_vector.y));
double ml = stroker->miter_limit;
double ml = stroker->style->miter_limit;
/*
* Check the miter limit -- lines meeting at an acute angle
@ -398,10 +364,10 @@ _cairo_stroker_add_cap (cairo_stroker_t *stroker, cairo_stroke_face_t *f)
{
cairo_status_t status;
if (stroker->line_cap == CAIRO_LINE_CAP_BUTT)
if (stroker->style->line_cap == CAIRO_LINE_CAP_BUTT)
return CAIRO_STATUS_SUCCESS;
switch (stroker->line_cap) {
switch (stroker->style->line_cap) {
case CAIRO_LINE_CAP_ROUND: {
int i;
int start, stop;
@ -435,8 +401,8 @@ _cairo_stroker_add_cap (cairo_stroker_t *stroker, cairo_stroke_face_t *f)
dx = f->usr_vector.x;
dy = f->usr_vector.y;
dx *= stroker->line_width / 2.0;
dy *= stroker->line_width / 2.0;
dx *= stroker->style->line_width / 2.0;
dy *= stroker->style->line_width / 2.0;
cairo_matrix_transform_distance (stroker->ctm, &dx, &dy);
fvector.dx = _cairo_fixed_from_double (dx);
fvector.dy = _cairo_fixed_from_double (dy);
@ -549,13 +515,13 @@ _compute_face (cairo_point_t *point, cairo_slope_t *slope, cairo_stroker_t *stro
_cairo_matrix_compute_determinant (stroker->ctm, &det);
if (det >= 0)
{
face_dx = - line_dy * (stroker->line_width / 2.0);
face_dy = line_dx * (stroker->line_width / 2.0);
face_dx = - line_dy * (stroker->style->line_width / 2.0);
face_dy = line_dx * (stroker->style->line_width / 2.0);
}
else
{
face_dx = line_dy * (stroker->line_width / 2.0);
face_dy = - line_dx * (stroker->line_width / 2.0);
face_dx = line_dy * (stroker->style->line_width / 2.0);
face_dy = - line_dx * (stroker->style->line_width / 2.0);
}
/* back to device space */
@ -917,8 +883,8 @@ _cairo_stroker_curve_to_dashed (void *closure,
/* Temporarily modify the stroker to use round joins to guarantee
* smooth stroked curves. */
line_join_save = stroker->line_join;
stroker->line_join = CAIRO_LINE_JOIN_ROUND;
line_join_save = stroker->style->line_join;
stroker->style->line_join = CAIRO_LINE_JOIN_ROUND;
status = _cairo_spline_decompose (&spline, stroker->tolerance);
if (status)
@ -934,7 +900,7 @@ _cairo_stroker_curve_to_dashed (void *closure,
}
CLEANUP_GSTATE:
stroker->line_join = line_join_save;
stroker->style->line_join = line_join_save;
CLEANUP_SPLINE:
_cairo_spline_fini (&spline);
@ -972,28 +938,20 @@ _cairo_stroker_close_path (void *closure)
cairo_status_t
_cairo_path_fixed_stroke_to_traps (cairo_path_fixed_t *path,
cairo_traps_t *traps,
double tolerance,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double line_width,
cairo_line_cap_t line_cap,
cairo_line_join_t line_join,
double miter_limit,
double *dash,
int num_dashes,
double dash_offset)
double tolerance,
cairo_traps_t *traps)
{
cairo_status_t status = CAIRO_STATUS_SUCCESS;
cairo_stroker_t stroker;
_cairo_stroker_init (&stroker, traps, tolerance, ctm, ctm_inverse,
line_width, line_cap, line_join, miter_limit,
dash, num_dashes, dash_offset);
_cairo_stroker_init (&stroker, stroke_style,
ctm, ctm_inverse, tolerance,
traps);
if (stroker.dash)
if (stroker.style->dash)
status = _cairo_path_fixed_interpret (path,
CAIRO_DIRECTION_FORWARD,
_cairo_stroker_move_to,

View file

@ -1240,15 +1240,15 @@ _cairo_pdf_path_close_path (void *closure)
}
static cairo_int_status_t
_cairo_pdf_surface_fill_path (cairo_operator_t operator,
cairo_pattern_t *pattern,
void *abstract_dst,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
_cairo_pdf_surface_fill (void *abstract_surface,
cairo_operator_t operator,
cairo_pattern_t *pattern,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
{
cairo_pdf_surface_t *surface = abstract_dst;
cairo_pdf_surface_t *surface = abstract_surface;
cairo_pdf_document_t *document = surface->document;
const char *pdf_operator;
cairo_status_t status;
@ -1574,8 +1574,19 @@ static const cairo_surface_backend_t cairo_pdf_surface_backend = {
_cairo_pdf_surface_intersect_clip_path,
_cairo_pdf_surface_get_extents,
_cairo_pdf_surface_old_show_glyphs,
_cairo_pdf_surface_fill_path,
_cairo_pdf_surface_get_font_options
_cairo_pdf_surface_get_font_options,
NULL, /* flush */
NULL, /* mark_dirty_rectangle */
NULL, /* scaled_font_fini */
NULL, /* scaled_glyph_fini */
/* Here are the drawing functions */
NULL, /* paint */
NULL, /* mask */
NULL, /* stroke */
_cairo_pdf_surface_fill,
NULL /* show_glyphs */
};
static cairo_pdf_document_t *

View file

@ -463,36 +463,25 @@ _cairo_ps_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font,
}
static cairo_int_status_t
_cairo_ps_surface_fill_path (cairo_operator_t operator,
cairo_pattern_t *pattern,
void *abstract_dst,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
_cairo_ps_surface_fill (void *abstract_surface,
cairo_operator_t operator,
cairo_pattern_t *pattern,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
{
cairo_ps_surface_t *surface = abstract_dst;
cairo_ps_surface_t *surface = abstract_surface;
/* XXX: This is rather fragile here. We want to call back up into
* cairo-surface in order for it to farm things out to the
* appropriate backend fill_path function. But that requires
* having a clip parameter. We take advantage of the fact that we
* "know" that the clip is only used for fallbacks and we "know"
* that the meta surface backend never uses a fallback for
* fill_path.
*
* Clearly there's an organizational problem here.
*/
assert (_cairo_surface_is_meta (surface->current_page));
return _cairo_surface_fill_path (operator,
pattern,
surface->current_page,
path,
fill_rule,
tolerance,
NULL, /* See comment above. */
antialias);
return _cairo_surface_fill (surface->current_page,
operator,
pattern,
path,
fill_rule,
tolerance,
antialias);
}
static const cairo_surface_backend_t cairo_ps_surface_backend = {
@ -512,7 +501,19 @@ static const cairo_surface_backend_t cairo_ps_surface_backend = {
_cairo_ps_surface_intersect_clip_path,
_cairo_ps_surface_get_extents,
_cairo_ps_surface_old_show_glyphs,
_cairo_ps_surface_fill_path
NULL, /* get_font_options */
NULL, /* flush */
NULL, /* mark_dirty_rectangle */
NULL, /* scaled_font_fini */
NULL, /* scaled_glyph_fini */
/* Here are the drawing functions */
NULL, /* paint */
NULL, /* mask */
NULL, /* stroke */
_cairo_ps_surface_fill,
NULL /* show_glyphs */
};
static cairo_int_status_t
@ -1374,15 +1375,15 @@ _ps_output_old_show_glyphs (cairo_scaled_font_t *scaled_font,
}
static cairo_int_status_t
_ps_output_fill_path (cairo_operator_t operator,
cairo_pattern_t *pattern,
void *abstract_dst,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
_ps_output_fill (void *abstract_surface,
cairo_operator_t operator,
cairo_pattern_t *pattern,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
{
ps_output_surface_t *surface = abstract_dst;
ps_output_surface_t *surface = abstract_surface;
cairo_output_stream_t *stream = surface->parent->stream;
cairo_int_status_t status;
ps_output_path_info_t info;
@ -1394,7 +1395,7 @@ _ps_output_fill_path (cairo_operator_t operator,
surface->parent->width,
surface->parent->height);
_cairo_output_stream_printf (stream,
"%% _ps_output_fill_path\n");
"%% _ps_output_fill\n");
emit_pattern (surface->parent, pattern);
@ -1443,7 +1444,19 @@ static const cairo_surface_backend_t ps_output_backend = {
_ps_output_intersect_clip_path,
NULL, /* get_extents */
_ps_output_old_show_glyphs,
_ps_output_fill_path
NULL, /* get_font_options */
NULL, /* flush */
NULL, /* mark_dirty_rectangle */
NULL, /* scaled_font_fini */
NULL, /* scaled_glyph_fini */
/* Here are the drawing functions */
NULL, /* paint */
NULL, /* mask */
NULL, /* stroke */
_ps_output_fill,
NULL /* show_glyphs */
};
static cairo_int_status_t

View file

@ -1144,29 +1144,29 @@ _cairo_surface_fill_rectangles (cairo_surface_t *surface,
}
static cairo_status_t
_fallback_paint (cairo_operator_t operator,
cairo_pattern_t *source_pattern,
cairo_surface_t *dst)
_fallback_paint (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source)
{
cairo_status_t status;
cairo_rectangle_t extents;
cairo_box_t box;
cairo_traps_t traps;
status = _cairo_surface_get_extents (dst, &extents);
status = _cairo_surface_get_extents (surface, &extents);
if (status)
return status;
if (_cairo_operator_bounded_by_source (operator)) {
cairo_rectangle_t source_extents;
status = _cairo_pattern_get_extents (source_pattern, &source_extents);
status = _cairo_pattern_get_extents (source, &source_extents);
if (status)
return status;
_cairo_rectangle_intersect (&extents, &source_extents);
}
status = _cairo_clip_intersect_to_rectangle (dst->clip, &extents);
status = _cairo_clip_intersect_to_rectangle (surface->clip, &extents);
if (status)
return status;
@ -1179,11 +1179,11 @@ _fallback_paint (cairo_operator_t operator,
if (status)
return status;
_cairo_surface_clip_and_composite_trapezoids (source_pattern,
_cairo_surface_clip_and_composite_trapezoids (source,
operator,
dst,
surface,
&traps,
dst->clip,
surface->clip,
CAIRO_ANTIALIAS_NONE);
_cairo_traps_fini (&traps);
@ -1192,23 +1192,21 @@ _fallback_paint (cairo_operator_t operator,
}
cairo_status_t
_cairo_surface_paint (cairo_operator_t operator,
cairo_pattern_t *pattern,
cairo_surface_t *dst)
_cairo_surface_paint (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source)
{
/* cairo_status_t status; */
cairo_status_t status;
assert (! dst->is_snapshot);
assert (! surface->is_snapshot);
/* XXX: Need to add this to the backend.
if (dst->backend->paint) {
status = dst->backend->paint (operator, pattern, dst);
if (surface->backend->paint) {
status = surface->backend->paint (surface, operator, source);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
}
*/
return _fallback_paint (operator, pattern, dst);
return _fallback_paint (surface, operator, source);
}
static cairo_status_t
@ -1239,20 +1237,20 @@ _cairo_surface_mask_draw_func (void *closure,
}
static cairo_status_t
_fallback_mask (cairo_operator_t operator,
cairo_pattern_t *source_pattern,
cairo_pattern_t *mask_pattern,
cairo_surface_t *dst)
_fallback_mask (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_pattern_t *mask)
{
cairo_status_t status;
cairo_rectangle_t extents, source_extents, mask_extents;
status = _cairo_surface_get_extents (dst, &extents);
status = _cairo_surface_get_extents (surface, &extents);
if (status)
return status;
if (_cairo_operator_bounded_by_source (operator)) {
status = _cairo_pattern_get_extents (source_pattern, &source_extents);
status = _cairo_pattern_get_extents (source, &source_extents);
if (status)
return status;
@ -1260,89 +1258,77 @@ _fallback_mask (cairo_operator_t operator,
}
if (_cairo_operator_bounded_by_mask (operator)) {
status = _cairo_pattern_get_extents (mask_pattern, &mask_extents);
status = _cairo_pattern_get_extents (mask, &mask_extents);
if (status)
return status;
_cairo_rectangle_intersect (&extents, &mask_extents);
}
status = _cairo_clip_intersect_to_rectangle (dst->clip, &extents);
status = _cairo_clip_intersect_to_rectangle (surface->clip, &extents);
if (status)
return status;
status = _cairo_gstate_clip_and_composite (dst->clip, operator,
source_pattern,
status = _cairo_gstate_clip_and_composite (surface->clip, operator,
source,
_cairo_surface_mask_draw_func,
mask_pattern,
dst,
mask,
surface,
&extents);
return status;
}
cairo_status_t
_cairo_surface_mask (cairo_operator_t operator,
cairo_pattern_t *source_pattern,
cairo_pattern_t *mask_pattern,
cairo_surface_t *dst)
_cairo_surface_mask (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_pattern_t *mask)
{
/* cairo_status_t status; */
cairo_status_t status;
assert (! dst->is_snapshot);
assert (! surface->is_snapshot);
/* XXX: Need to add this to the backend.
if (dst->backend->mask) {
status = dst->backend->mask (operator, pattern, dst);
if (surface->backend->mask) {
status = surface->backend->mask (surface, operator, source, mask);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
}
*/
return _fallback_mask (operator, source_pattern, mask_pattern, dst);
return _fallback_mask (surface, operator, source, mask);
}
static cairo_status_t
_fallback_stroke (cairo_operator_t operator,
cairo_pattern_t *source_pattern,
cairo_surface_t *dst,
_fallback_stroke (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
double tolerance,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
cairo_antialias_t antialias,
double line_width,
cairo_line_cap_t line_cap,
cairo_line_join_t line_join,
double miter_limit,
double *dash,
int num_dashes,
double dash_offset)
double tolerance,
cairo_antialias_t antialias)
{
cairo_status_t status;
cairo_traps_t traps;
_cairo_traps_init (&traps);
status = _cairo_path_fixed_stroke_to_traps (path, &traps, tolerance,
status = _cairo_path_fixed_stroke_to_traps (path,
stroke_style,
ctm, ctm_inverse,
line_width, line_cap,
line_join, miter_limit,
dash, num_dashes,
dash_offset);
tolerance,
&traps);
if (status) {
_cairo_traps_fini (&traps);
return status;
}
_cairo_surface_clip_and_composite_trapezoids (source_pattern,
_cairo_surface_clip_and_composite_trapezoids (source,
operator,
dst,
surface,
&traps,
dst->clip,
surface->clip,
antialias);
_cairo_traps_fini (&traps);
@ -1351,54 +1337,42 @@ _fallback_stroke (cairo_operator_t operator,
}
cairo_status_t
_cairo_surface_stroke (cairo_operator_t operator,
cairo_pattern_t *source_pattern,
cairo_surface_t *dst,
cairo_path_fixed_t *path,
double tolerance,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
cairo_antialias_t antialias,
double line_width,
cairo_line_cap_t line_cap,
cairo_line_join_t line_join,
double miter_limit,
double *dash,
int num_dashes,
double dash_offset)
_cairo_surface_stroke (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double tolerance,
cairo_antialias_t antialias)
{
assert (! dst->is_snapshot);
assert (! surface->is_snapshot);
/* XXX: Need to add this to the backend.
if (dst->backend->stroke) {
if (surface->backend->stroke) {
cairo_status_t status;
status = dst->backend->stroke (operator, source_pattern, dst, path,
tolerance, ctm, ctm_inverse, antialias,
line_width, line_cap,
line_join, miter_limit,
dash, num_dashes, dash_offset);
status = surface->backend->stroke (surface, operator, source,
path, stroke_style,
ctm, ctm_inverse,
tolerance, antialias);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
}
*/
return _fallback_stroke (operator, source_pattern, dst, path,
tolerance, ctm, ctm_inverse, antialias,
line_width, line_cap, line_join, miter_limit,
dash, num_dashes, dash_offset);
return _fallback_stroke (surface, operator, source,
path, stroke_style,
ctm, ctm_inverse,
tolerance, antialias);
}
static cairo_status_t
_fallback_fill_path (cairo_operator_t operator,
cairo_pattern_t *pattern,
cairo_surface_t *dst,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_clip_t *clip,
cairo_antialias_t antialias)
_fallback_fill (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
{
cairo_status_t status;
cairo_traps_t traps;
@ -1414,11 +1388,11 @@ _fallback_fill_path (cairo_operator_t operator,
return status;
}
status = _cairo_surface_clip_and_composite_trapezoids (pattern,
status = _cairo_surface_clip_and_composite_trapezoids (source,
operator,
dst,
surface,
&traps,
clip,
surface->clip,
antialias);
_cairo_traps_fini (&traps);
@ -1427,28 +1401,29 @@ _fallback_fill_path (cairo_operator_t operator,
}
cairo_status_t
_cairo_surface_fill_path (cairo_operator_t operator,
cairo_pattern_t *pattern,
cairo_surface_t *dst,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_clip_t *clip,
cairo_antialias_t antialias)
_cairo_surface_fill (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
{
cairo_status_t status;
assert (! dst->is_snapshot);
assert (! surface->is_snapshot);
if (dst->backend->fill_path) {
status = dst->backend->fill_path (operator, pattern, dst, path,
fill_rule, tolerance, antialias);
if (surface->backend->fill) {
status = surface->backend->fill (surface, operator, source,
path, fill_rule,
tolerance, antialias);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
}
return _fallback_fill_path (operator, pattern, dst, path,
fill_rule, tolerance, clip, antialias);
return _fallback_fill (surface, operator, source,
path, fill_rule,
tolerance, antialias);
}
static cairo_status_t
@ -1915,18 +1890,18 @@ _cairo_surface_old_show_glyphs_draw_func (void *closure,
}
static cairo_status_t
_fallback_show_glyphs (cairo_operator_t operator,
cairo_pattern_t *source_pattern,
cairo_surface_t *dst,
cairo_scaled_font_t *scaled_font,
_fallback_show_glyphs (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs)
int num_glyphs,
cairo_scaled_font_t *scaled_font)
{
cairo_status_t status;
cairo_rectangle_t extents, glyph_extents;
cairo_show_glyphs_info_t glyph_info;
status = _cairo_surface_get_extents (dst, &extents);
status = _cairo_surface_get_extents (surface, &extents);
if (status)
return status;
@ -1941,7 +1916,7 @@ _fallback_show_glyphs (cairo_operator_t operator,
_cairo_rectangle_intersect (&extents, &glyph_extents);
}
status = _cairo_clip_intersect_to_rectangle (dst->clip, &extents);
status = _cairo_clip_intersect_to_rectangle (surface->clip, &extents);
if (status)
return status;
@ -1949,42 +1924,40 @@ _fallback_show_glyphs (cairo_operator_t operator,
glyph_info.glyphs = glyphs;
glyph_info.num_glyphs = num_glyphs;
status = _cairo_gstate_clip_and_composite (dst->clip,
status = _cairo_gstate_clip_and_composite (surface->clip,
operator,
source_pattern,
source,
_cairo_surface_old_show_glyphs_draw_func,
&glyph_info,
dst,
surface,
&extents);
return status;
}
cairo_status_t
_cairo_surface_show_glyphs (cairo_operator_t operator,
cairo_pattern_t *source_pattern,
cairo_surface_t *dst,
cairo_scaled_font_t *scaled_font,
_cairo_surface_show_glyphs (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs)
int num_glyphs,
cairo_scaled_font_t *scaled_font)
{
/* cairo_status_t status; */
cairo_status_t status;
assert (! dst->is_snapshot);
assert (! surface->is_snapshot);
/* XXX: Need to add this to the backend.
if (dst->backend->show_glyphs) {
status = dst->backend->show_glyphs (operator, source_pattern, dst,
scaled_font,
glyphs, num_glyphs);
if (surface->backend->show_glyphs) {
status = surface->backend->show_glyphs (surface, operator, source,
glyphs, num_glyphs,
scaled_font);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
}
*/
return _fallback_show_glyphs (operator, source_pattern, dst,
scaled_font,
glyphs, num_glyphs);
return _fallback_show_glyphs (surface, operator, source,
glyphs, num_glyphs,
scaled_font);
}
/* XXX: Previously, we had a function named _cairo_surface_show_glyphs

View file

@ -1046,7 +1046,6 @@ static const cairo_surface_backend_t cairo_win32_surface_backend = {
NULL, /* intersect_clip_path */
_cairo_win32_surface_get_extents,
NULL, /* old_show_glyphs */
NULL, /* fill_path */
NULL, /* get_font_options */
_cairo_win32_surface_flush,
NULL /* mark_dirty_rectangle */

View file

@ -1041,7 +1041,6 @@ static const cairo_surface_backend_t cairo_xcb_surface_backend = {
NULL, /* intersect_clip_path */
_cairo_xcb_surface_get_extents,
NULL, /* old_show_glyphs */
NULL, /* fill_path */
NULL, /* get_font_options */
NULL, /* flush */
NULL, /* mark_dirty_rectangle */

View file

@ -1691,7 +1691,6 @@ static const cairo_surface_backend_t cairo_xlib_surface_backend = {
NULL, /* intersect_clip_path */
_cairo_xlib_surface_get_extents,
_cairo_xlib_surface_old_show_glyphs,
NULL, /* fill_path */
_cairo_xlib_surface_get_font_options,
NULL, /* flush */
NULL, /* mark_dirty_rectangle */

View file

@ -556,6 +556,16 @@ extern const cairo_private struct _cairo_scaled_font_backend cairo_atsui_scaled_
#endif
typedef struct _cairo_stroke_style {
double line_width;
cairo_line_cap_t line_cap;
cairo_line_join_t line_join;
double miter_limit;
double *dash;
int num_dashes;
double dash_offset;
} cairo_stroke_style_t;
struct _cairo_surface_backend {
cairo_surface_t *
(*create_similar) (void *surface,
@ -709,15 +719,6 @@ struct _cairo_surface_backend {
const cairo_glyph_t *glyphs,
int num_glyphs);
cairo_int_status_t
(*fill_path) (cairo_operator_t operator,
cairo_pattern_t *pattern,
void *dst,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias);
void
(*get_font_options) (void *surface,
cairo_font_options_t *options);
@ -738,6 +739,48 @@ struct _cairo_surface_backend {
void
(*scaled_glyph_fini) (cairo_scaled_glyph_t *scaled_glyph,
cairo_scaled_font_t *scaled_font);
/* OK, I'm starting over somewhat by defining the 5 top-level
* drawing operators for the surface backend here with consistent
* naming and argument-order convensions. */
cairo_int_status_t
(*paint) (void *surface,
cairo_operator_t operator,
cairo_pattern_t *source);
cairo_int_status_t
(*mask) (void *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_pattern_t *mask);
cairo_int_status_t
(*stroke) (void *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double tolerance,
cairo_antialias_t antialias);
cairo_int_status_t
(*fill) (void *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias);
cairo_int_status_t
(*show_glyphs) (void *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font);
};
typedef struct _cairo_format_masks {
@ -1420,19 +1463,11 @@ _cairo_path_fixed_fill_to_traps (cairo_path_fixed_t *path,
/* cairo_path_stroke.c */
cairo_private cairo_status_t
_cairo_path_fixed_stroke_to_traps (cairo_path_fixed_t *path,
cairo_traps_t *traps,
double tolerance,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double line_width,
cairo_line_cap_t line_cap,
cairo_line_join_t line_join,
double miter_limit,
double *dash,
int num_dashes,
double dash_offset);
double tolerance,
cairo_traps_t *traps);
/* cairo-scaled-font.c */
@ -1582,52 +1617,43 @@ _cairo_surface_fill_rectangles (cairo_surface_t *surface,
int num_rects);
cairo_private cairo_status_t
_cairo_surface_paint (cairo_operator_t operator,
cairo_pattern_t *pattern,
cairo_surface_t *dst);
_cairo_surface_paint (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source);
cairo_private cairo_status_t
_cairo_surface_mask (cairo_operator_t operator,
cairo_pattern_t *source_pattern,
cairo_pattern_t *mask_pattern,
cairo_surface_t *dst);
_cairo_surface_mask (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_pattern_t *mask);
cairo_private cairo_status_t
_cairo_surface_stroke (cairo_operator_t operator,
cairo_pattern_t *source_pattern,
cairo_surface_t *dst,
cairo_path_fixed_t *path,
double tolerance,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
cairo_antialias_t antialias,
double line_width,
cairo_line_cap_t line_cap,
cairo_line_join_t line_join,
double miter_limit,
double *dash,
int num_dashes,
double dash_offset);
_cairo_surface_stroke (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double tolerance,
cairo_antialias_t antialias);
cairo_private cairo_status_t
_cairo_surface_fill_path (cairo_operator_t operator,
cairo_pattern_t *pattern,
cairo_surface_t *dst,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_clip_t *clip,
cairo_antialias_t antialias);
_cairo_surface_fill (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias);
cairo_status_t
_cairo_surface_show_glyphs (cairo_operator_t operator,
cairo_pattern_t *source_pattern,
cairo_surface_t *dst,
cairo_scaled_font_t *scaled_font,
cairo_private cairo_status_t
_cairo_surface_show_glyphs (cairo_surface_t *surface,
cairo_operator_t operator,
cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs);
int num_glyphs,
cairo_scaled_font_t *scaled_font);
cairo_private cairo_status_t
_cairo_surface_composite_trapezoids (cairo_operator_t operator,