static cairo_int_status_t _cairo_xml_surface_mask (void *abstract_surface, cairo_operator_t op, const cairo_pattern_t *source, const cairo_pattern_t *mask, const cairo_clip_t *clip) { cairo_xml_surface_t *surface = abstract_surface; cairo_xml_t *xml = to_xml (surface); cairo_status_t status; _cairo_xml_printf (xml, "<mask>"); _cairo_xml_indent (xml, 2); _cairo_xml_emit_string (xml, "operator", _operator_to_string (op)); status = _cairo_xml_surface_emit_clip (surface, clip); if (unlikely (status)) return status; status = _cairo_xml_emit_pattern (xml, "source", source); if (unlikely (status)) return status; status = _cairo_xml_emit_pattern (xml, "mask", mask); if (unlikely (status)) return status; _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</mask>"); return CAIRO_STATUS_SUCCESS; }
static cairo_status_t _cairo_xml_surface_emit_clip_boxes (cairo_xml_surface_t *surface, const cairo_clip_t *clip) { cairo_box_t *box; cairo_xml_t *xml; int n; if (clip->num_boxes == 0) return CAIRO_STATUS_SUCCESS; /* skip the trivial clip covering the surface extents */ if (surface->width >= 0 && surface->height >= 0 && clip->num_boxes == 1) { box = &clip->boxes[0]; if (box->p1.x <= 0 && box->p1.y <= 0 && box->p2.x - box->p1.x >= _cairo_fixed_from_double (surface->width) && box->p2.y - box->p1.y >= _cairo_fixed_from_double (surface->height)) { return CAIRO_STATUS_SUCCESS; } } xml = to_xml (surface); _cairo_xml_printf (xml, "<clip>"); _cairo_xml_indent (xml, 2); _cairo_xml_printf (xml, "<path>"); _cairo_xml_indent (xml, 2); for (n = 0; n < clip->num_boxes; n++) { box = &clip->boxes[n]; _cairo_xml_printf_start (xml, "%f %f m", _cairo_fixed_to_double (box->p1.x), _cairo_fixed_to_double (box->p1.y)); _cairo_xml_printf_continue (xml, " %f %f l", _cairo_fixed_to_double (box->p2.x), _cairo_fixed_to_double (box->p1.y)); _cairo_xml_printf_continue (xml, " %f %f l", _cairo_fixed_to_double (box->p2.x), _cairo_fixed_to_double (box->p2.y)); _cairo_xml_printf_continue (xml, " %f %f l", _cairo_fixed_to_double (box->p1.x), _cairo_fixed_to_double (box->p2.y)); _cairo_xml_printf_end (xml, " h"); } _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</path>"); _cairo_xml_emit_double (xml, "tolerance", 1.0); _cairo_xml_emit_string (xml, "antialias", _antialias_to_string (CAIRO_ANTIALIAS_NONE)); _cairo_xml_emit_string (xml, "fill-rule", _fill_rule_to_string (CAIRO_FILL_RULE_WINDING)); _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</clip>"); return CAIRO_STATUS_SUCCESS; }
static cairo_int_status_t _cairo_xml_surface_stroke (void *abstract_surface, cairo_operator_t op, const cairo_pattern_t *source, const cairo_path_fixed_t *path, const cairo_stroke_style_t *style, const cairo_matrix_t *ctm, const cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias, const cairo_clip_t *clip) { cairo_xml_surface_t *surface = abstract_surface; cairo_xml_t *xml = to_xml (surface); cairo_status_t status; _cairo_xml_printf (xml, "<stroke>"); _cairo_xml_indent (xml, 2); _cairo_xml_emit_string (xml, "operator", _operator_to_string (op)); _cairo_xml_emit_double (xml, "line-width", style->line_width); _cairo_xml_emit_double (xml, "miter-limit", style->miter_limit); _cairo_xml_emit_string (xml, "line-cap", _line_cap_to_string (style->line_cap)); _cairo_xml_emit_string (xml, "line-join", _line_join_to_string (style->line_join)); status = _cairo_xml_surface_emit_clip (surface, clip); if (unlikely (status)) return status; status = _cairo_xml_emit_pattern (xml, "source", source); if (unlikely (status)) return status; if (style->num_dashes) { unsigned int i; _cairo_xml_printf_start (xml, "<dash offset='%f'>", style->dash_offset); for (i = 0; i < style->num_dashes; i++) _cairo_xml_printf_continue (xml, "%f ", style->dash[i]); _cairo_xml_printf_end (xml, "</dash>"); } _cairo_xml_emit_path (xml, path); _cairo_xml_emit_double (xml, "tolerance", tolerance); _cairo_xml_emit_string (xml, "antialias", _antialias_to_string (antialias)); _cairo_xml_emit_matrix (xml, ctm); _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</stroke>"); return CAIRO_STATUS_SUCCESS; }
cairo_status_t cairo_xml_for_recording_surface (cairo_device_t *device, cairo_surface_t *recording_surface) { cairo_box_t bbox; cairo_rectangle_int_t extents; cairo_surface_t *surface; cairo_xml_t *xml; cairo_status_t status; if (unlikely (device->status)) return device->status; if (unlikely (recording_surface->status)) return recording_surface->status; if (unlikely (device->backend->type != CAIRO_DEVICE_TYPE_XML)) return _cairo_error (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); if (unlikely (! _cairo_surface_is_recording (recording_surface))) return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); status = _cairo_recording_surface_get_bbox ((cairo_recording_surface_t *) recording_surface, &bbox, NULL); if (unlikely (status)) return status; _cairo_box_round_to_rectangle (&bbox, &extents); surface = _cairo_xml_surface_create_internal (device, recording_surface->content, extents.width, extents.height); if (unlikely (surface->status)) return surface->status; xml = (cairo_xml_t *) device; _cairo_xml_printf (xml, "<surface content='%s' width='%d' height='%d'>", _content_to_string (recording_surface->content), extents.width, extents.height); _cairo_xml_indent (xml, 2); cairo_surface_set_device_offset (surface, -extents.x, -extents.y); status = _cairo_recording_surface_replay (recording_surface, surface); cairo_surface_destroy (surface); _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</surface>"); return status; }
static cairo_status_t _cairo_xml_emit_radial (cairo_xml_t *xml, const cairo_radial_pattern_t *radial) { _cairo_xml_printf (xml, "<radial x1='%f' y1='%f' r1='%f' x2='%f' y2='%f' r2='%f'>", radial->cd1.center.x, radial->cd1.center.y, radial->cd1.radius, radial->cd2.center.x, radial->cd2.center.y, radial->cd2.radius); _cairo_xml_indent (xml, 2); _cairo_xml_emit_gradient (xml, &radial->base); _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</radial>"); return CAIRO_STATUS_SUCCESS; }
static cairo_status_t _cairo_xml_emit_linear (cairo_xml_t *xml, const cairo_linear_pattern_t *linear) { _cairo_xml_printf (xml, "<linear x1='%f' y1='%f' x2='%f' y2='%f'>", linear->pd1.x, linear->pd1.y, linear->pd2.x, linear->pd2.y); _cairo_xml_indent (xml, 2); _cairo_xml_emit_gradient (xml, &linear->base); _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</linear>"); return CAIRO_STATUS_SUCCESS; }
static cairo_int_status_t _cairo_xml_surface_glyphs (void *abstract_surface, cairo_operator_t op, const cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font, cairo_clip_t *clip, int *remaining_glyphs) { cairo_xml_surface_t *surface = abstract_surface; cairo_xml_t *xml = to_xml (surface); cairo_status_t status; int i; _cairo_xml_printf (xml, "<glyphs>"); _cairo_xml_indent (xml, 2); _cairo_xml_emit_string (xml, "operator", _operator_to_string (op)); status = _cairo_xml_surface_emit_clip (surface, clip); if (unlikely (status)) return status; status = _cairo_xml_emit_pattern (xml, "source", source); if (unlikely (status)) return status; status = _cairo_xml_emit_scaled_font (xml, scaled_font, glyphs, num_glyphs); if (unlikely (status)) return status; for (i = 0; i < num_glyphs; i++) { _cairo_xml_printf (xml, "<glyph index='%lu'>%f %f</glyph>", glyphs[i].index, glyphs[i].x, glyphs[i].y); } _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</glyphs>"); *remaining_glyphs = 0; return CAIRO_STATUS_SUCCESS; }
static cairo_status_t _cairo_xml_emit_radial (cairo_xml_t *xml, const cairo_radial_pattern_t *radial) { _cairo_xml_printf (xml, "<radial x1='%f' y1='%f' r1='%f' x2='%f' y2='%f' r2='%f'>", _cairo_fixed_to_double (radial->c1.x), _cairo_fixed_to_double (radial->c1.y), _cairo_fixed_to_double (radial->r1), _cairo_fixed_to_double (radial->c2.x), _cairo_fixed_to_double (radial->c2.y), _cairo_fixed_to_double (radial->r2)); _cairo_xml_indent (xml, 2); _cairo_xml_emit_gradient (xml, &radial->base); _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</radial>"); return CAIRO_STATUS_SUCCESS; }
static cairo_status_t _cairo_xml_emit_pattern (cairo_xml_t *xml, const char *source_or_mask, const cairo_pattern_t *pattern) { cairo_status_t status; _cairo_xml_printf (xml, "<%s-pattern>", source_or_mask); _cairo_xml_indent (xml, 2); switch (pattern->type) { case CAIRO_PATTERN_TYPE_SOLID: status = _cairo_xml_emit_solid (xml, (cairo_solid_pattern_t *) pattern); break; case CAIRO_PATTERN_TYPE_LINEAR: status = _cairo_xml_emit_linear (xml, (cairo_linear_pattern_t *) pattern); break; case CAIRO_PATTERN_TYPE_RADIAL: status = _cairo_xml_emit_radial (xml, (cairo_radial_pattern_t *) pattern); break; case CAIRO_PATTERN_TYPE_SURFACE: status = _cairo_xml_emit_surface (xml, (cairo_surface_pattern_t *) pattern); break; default: ASSERT_NOT_REACHED; status = CAIRO_INT_STATUS_UNSUPPORTED; break; } if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) { _cairo_xml_emit_matrix (xml, &pattern->matrix); _cairo_xml_printf (xml, "<extend>%s</extend>", _extend_to_string (pattern->extend)); _cairo_xml_printf (xml, "<filter>%s</filter>", _filter_to_string (pattern->filter)); } _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</%s-pattern>", source_or_mask); return status; }
static cairo_status_t _cairo_xml_surface_emit_clip_path (cairo_xml_surface_t *surface, const cairo_clip_path_t *clip_path) { cairo_box_t box; cairo_status_t status; cairo_xml_t *xml; if (clip_path == NULL) return CAIRO_STATUS_SUCCESS; status = _cairo_xml_surface_emit_clip_path (surface, clip_path->prev); if (unlikely (status)) return status; /* skip the trivial clip covering the surface extents */ if (surface->width >= 0 && surface->height >= 0 && _cairo_path_fixed_is_box (&clip_path->path, &box)) { if (box.p1.x <= 0 && box.p1.y <= 0 && box.p2.x - box.p1.x >= _cairo_fixed_from_double (surface->width) && box.p2.y - box.p1.y >= _cairo_fixed_from_double (surface->height)) { return CAIRO_STATUS_SUCCESS; } } xml = to_xml (surface); _cairo_xml_printf_start (xml, "<clip>"); _cairo_xml_indent (xml, 2); _cairo_xml_emit_path (xml, &clip_path->path); _cairo_xml_emit_double (xml, "tolerance", clip_path->tolerance); _cairo_xml_emit_string (xml, "antialias", _antialias_to_string (clip_path->antialias)); _cairo_xml_emit_string (xml, "fill-rule", _fill_rule_to_string (clip_path->fill_rule)); _cairo_xml_indent (xml, -2); _cairo_xml_printf_end (xml, "</clip>"); return CAIRO_STATUS_SUCCESS; }
static cairo_status_t _cairo_xml_emit_scaled_font (cairo_xml_t *xml, cairo_scaled_font_t *scaled_font, cairo_glyph_t *glyphs, int num_glyphs) { cairo_int_status_t status; _cairo_xml_printf (xml, "<scaled-font>"); _cairo_xml_indent (xml, 2); status = _cairo_xml_emit_type42_font (xml, scaled_font); if (status == CAIRO_INT_STATUS_UNSUPPORTED) { status = _cairo_xml_emit_type3_font (xml, scaled_font, glyphs, num_glyphs); } _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "<scaled-font>"); return status; }
static cairo_int_status_t _cairo_xml_surface_fill (void *abstract_surface, cairo_operator_t op, const cairo_pattern_t *source, const cairo_path_fixed_t*path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias, const cairo_clip_t *clip) { cairo_xml_surface_t *surface = abstract_surface; cairo_xml_t *xml = to_xml (surface); cairo_status_t status; _cairo_xml_printf (xml, "<fill>"); _cairo_xml_indent (xml, 2); _cairo_xml_emit_string (xml, "operator", _operator_to_string (op)); status = _cairo_xml_surface_emit_clip (surface, clip); if (unlikely (status)) return status; status = _cairo_xml_emit_pattern (xml, "source", source); if (unlikely (status)) return status; _cairo_xml_emit_path (xml, path); _cairo_xml_emit_double (xml, "tolerance", tolerance); _cairo_xml_emit_string (xml, "antialias", _antialias_to_string (antialias)); _cairo_xml_emit_string (xml, "fill-rule", _fill_rule_to_string (fill_rule)); _cairo_xml_indent (xml, -2); _cairo_xml_printf (xml, "</fill>"); return CAIRO_STATUS_SUCCESS; }