summaryrefslogtreecommitdiff
path: root/Build/source/libs/cairo/cairo-1.14.2/src/cairo.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/cairo/cairo-1.14.2/src/cairo.c')
-rw-r--r--Build/source/libs/cairo/cairo-1.14.2/src/cairo.c4031
1 files changed, 0 insertions, 4031 deletions
diff --git a/Build/source/libs/cairo/cairo-1.14.2/src/cairo.c b/Build/source/libs/cairo/cairo-1.14.2/src/cairo.c
deleted file mode 100644
index e3acf4d46c7..00000000000
--- a/Build/source/libs/cairo/cairo-1.14.2/src/cairo.c
+++ /dev/null
@@ -1,4031 +0,0 @@
-/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */
-/* cairo - a vector graphics library with display and print output
- *
- * Copyright © 2002 University of Southern California
- * Copyright © 2005 Red Hat, Inc.
- * Copyright © 2011 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it either under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation
- * (the "LGPL") or, at your option, under the terms of the Mozilla
- * Public License Version 1.1 (the "MPL"). If you do not alter this
- * notice, a recipient may use your version of this file under either
- * the MPL or the LGPL.
- *
- * You should have received a copy of the LGPL along with this library
- * in the file COPYING-LGPL-2.1; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
- * You should have received a copy of the MPL along with this library
- * in the file COPYING-MPL-1.1
- *
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
- * OF ANY KIND, either express or implied. See the LGPL or the MPL for
- * the specific language governing rights and limitations.
- *
- * The Original Code is the cairo graphics library.
- *
- * The Initial Developer of the Original Code is University of Southern
- * California.
- *
- * Contributor(s):
- * Carl D. Worth <cworth@cworth.org>
- * Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairoint.h"
-#include "cairo-private.h"
-
-#include "cairo-backend-private.h"
-#include "cairo-error-private.h"
-#include "cairo-path-private.h"
-#include "cairo-pattern-private.h"
-#include "cairo-surface-private.h"
-#include "cairo-surface-backend-private.h"
-
-#include <assert.h>
-
-/**
- * SECTION:cairo
- * @Title: cairo_t
- * @Short_Description: The cairo drawing context
- * @See_Also: #cairo_surface_t
- *
- * #cairo_t is the main object used when drawing with cairo. To
- * draw with cairo, you create a #cairo_t, set the target surface,
- * and drawing options for the #cairo_t, create shapes with
- * functions like cairo_move_to() and cairo_line_to(), and then
- * draw shapes with cairo_stroke() or cairo_fill().
- *
- * #cairo_t<!-- -->'s can be pushed to a stack via cairo_save().
- * They may then safely be changed, without losing the current state.
- * Use cairo_restore() to restore to the saved state.
- **/
-
-/**
- * SECTION:cairo-text
- * @Title: text
- * @Short_Description: Rendering text and glyphs
- * @See_Also: #cairo_font_face_t, #cairo_scaled_font_t, cairo_text_path(),
- * cairo_glyph_path()
- *
- * The functions with <emphasis>text</emphasis> in their name form cairo's
- * <firstterm>toy</firstterm> text API. The toy API takes UTF-8 encoded
- * text and is limited in its functionality to rendering simple
- * left-to-right text with no advanced features. That means for example
- * that most complex scripts like Hebrew, Arabic, and Indic scripts are
- * out of question. No kerning or correct positioning of diacritical marks
- * either. The font selection is pretty limited too and doesn't handle the
- * case that the selected font does not cover the characters in the text.
- * This set of functions are really that, a toy text API, for testing and
- * demonstration purposes. Any serious application should avoid them.
- *
- * The functions with <emphasis>glyphs</emphasis> in their name form cairo's
- * <firstterm>low-level</firstterm> text API. The low-level API relies on
- * the user to convert text to a set of glyph indexes and positions. This
- * is a very hard problem and is best handled by external libraries, like
- * the pangocairo that is part of the Pango text layout and rendering library.
- * Pango is available from <ulink
- * url="http://www.pango.org/">http://www.pango.org/</ulink>.
- **/
-
-/**
- * SECTION:cairo-transforms
- * @Title: Transformations
- * @Short_Description: Manipulating the current transformation matrix
- * @See_Also: #cairo_matrix_t
- *
- * The current transformation matrix, <firstterm>ctm</firstterm>, is a
- * two-dimensional affine transformation that maps all coordinates and other
- * drawing instruments from the <firstterm>user space</firstterm> into the
- * surface's canonical coordinate system, also known as the <firstterm>device
- * space</firstterm>.
- **/
-
-#define DEFINE_NIL_CONTEXT(status) \
- { \
- CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ \
- status, /* status */ \
- { 0, 0, 0, NULL }, /* user_data */ \
- NULL \
- }
-
-static const cairo_t _cairo_nil[] = {
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_NO_MEMORY),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_RESTORE),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_POP_GROUP),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_NO_CURRENT_POINT),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_MATRIX),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_STATUS),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_NULL_POINTER),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_STRING),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_PATH_DATA),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_READ_ERROR),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_WRITE_ERROR),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_SURFACE_FINISHED),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_SURFACE_TYPE_MISMATCH),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_PATTERN_TYPE_MISMATCH),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_CONTENT),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_FORMAT),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_VISUAL),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_FILE_NOT_FOUND),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_DASH),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_DSC_COMMENT),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_INDEX),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_TEMP_FILE_ERROR),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_STRIDE),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_FONT_TYPE_MISMATCH),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_USER_FONT_IMMUTABLE),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_USER_FONT_ERROR),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_NEGATIVE_COUNT),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_CLUSTERS),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_SLANT),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_WEIGHT),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_SIZE),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_DEVICE_TYPE_MISMATCH),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_DEVICE_ERROR),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_MESH_CONSTRUCTION),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_DEVICE_FINISHED),
- DEFINE_NIL_CONTEXT (CAIRO_STATUS_JBIG2_GLOBAL_MISSING)
-
-};
-COMPILE_TIME_ASSERT (ARRAY_LENGTH (_cairo_nil) == CAIRO_STATUS_LAST_STATUS - 1);
-
-/**
- * _cairo_set_error:
- * @cr: a cairo context
- * @status: a status value indicating an error
- *
- * Atomically sets cr->status to @status and calls _cairo_error;
- * Does nothing if status is %CAIRO_STATUS_SUCCESS.
- *
- * All assignments of an error status to cr->status should happen
- * through _cairo_set_error(). Note that due to the nature of the atomic
- * operation, it is not safe to call this function on the nil objects.
- *
- * The purpose of this function is to allow the user to set a
- * breakpoint in _cairo_error() to generate a stack trace for when the
- * user causes cairo to detect an error.
- **/
-static void
-_cairo_set_error (cairo_t *cr, cairo_status_t status)
-{
- /* Don't overwrite an existing error. This preserves the first
- * error, which is the most significant. */
- _cairo_status_set_error (&cr->status, _cairo_error (status));
-}
-
-cairo_t *
-_cairo_create_in_error (cairo_status_t status)
-{
- cairo_t *cr;
-
- assert (status != CAIRO_STATUS_SUCCESS);
-
- cr = (cairo_t *) &_cairo_nil[status - CAIRO_STATUS_NO_MEMORY];
- assert (status == cr->status);
-
- return cr;
-}
-
-/**
- * cairo_create:
- * @target: target surface for the context
- *
- * Creates a new #cairo_t with all graphics state parameters set to
- * default values and with @target as a target surface. The target
- * surface should be constructed with a backend-specific function such
- * as cairo_image_surface_create() (or any other
- * <function>cairo_<emphasis>backend</emphasis>_surface_create(<!-- -->)</function>
- * variant).
- *
- * This function references @target, so you can immediately
- * call cairo_surface_destroy() on it if you don't need to
- * maintain a separate reference to it.
- *
- * Return value: a newly allocated #cairo_t with a reference
- * count of 1. The initial reference count should be released
- * with cairo_destroy() when you are done using the #cairo_t.
- * This function never returns %NULL. If memory cannot be
- * allocated, a special #cairo_t object will be returned on
- * which cairo_status() returns %CAIRO_STATUS_NO_MEMORY. If
- * you attempt to target a surface which does not support
- * writing (such as #cairo_mime_surface_t) then a
- * %CAIRO_STATUS_WRITE_ERROR will be raised. You can use this
- * object normally, but no drawing will be done.
- *
- * Since: 1.0
- **/
-cairo_t *
-cairo_create (cairo_surface_t *target)
-{
- if (unlikely (target == NULL))
- return _cairo_create_in_error (_cairo_error (CAIRO_STATUS_NULL_POINTER));
- if (unlikely (target->status))
- return _cairo_create_in_error (target->status);
- if (unlikely (target->finished))
- return _cairo_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED));
-
- if (target->backend->create_context == NULL)
- return _cairo_create_in_error (_cairo_error (CAIRO_STATUS_WRITE_ERROR));
-
- return target->backend->create_context (target);
-
-}
-slim_hidden_def (cairo_create);
-
-void
-_cairo_init (cairo_t *cr,
- const cairo_backend_t *backend)
-{
- CAIRO_REFERENCE_COUNT_INIT (&cr->ref_count, 1);
- cr->status = CAIRO_STATUS_SUCCESS;
- _cairo_user_data_array_init (&cr->user_data);
-
- cr->backend = backend;
-}
-
-/**
- * cairo_reference:
- * @cr: a #cairo_t
- *
- * Increases the reference count on @cr by one. This prevents
- * @cr from being destroyed until a matching call to cairo_destroy()
- * is made.
- *
- * The number of references to a #cairo_t can be get using
- * cairo_get_reference_count().
- *
- * Return value: the referenced #cairo_t.
- *
- * Since: 1.0
- **/
-cairo_t *
-cairo_reference (cairo_t *cr)
-{
- if (cr == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count))
- return cr;
-
- assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&cr->ref_count));
-
- _cairo_reference_count_inc (&cr->ref_count);
-
- return cr;
-}
-
-void
-_cairo_fini (cairo_t *cr)
-{
- _cairo_user_data_array_fini (&cr->user_data);
-}
-
-/**
- * cairo_destroy:
- * @cr: a #cairo_t
- *
- * Decreases the reference count on @cr by one. If the result
- * is zero, then @cr and all associated resources are freed.
- * See cairo_reference().
- *
- * Since: 1.0
- **/
-void
-cairo_destroy (cairo_t *cr)
-{
- if (cr == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count))
- return;
-
- assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&cr->ref_count));
-
- if (! _cairo_reference_count_dec_and_test (&cr->ref_count))
- return;
-
- cr->backend->destroy (cr);
-}
-slim_hidden_def (cairo_destroy);
-
-/**
- * cairo_get_user_data:
- * @cr: a #cairo_t
- * @key: the address of the #cairo_user_data_key_t the user data was
- * attached to
- *
- * Return user data previously attached to @cr using the specified
- * key. If no user data has been attached with the given key this
- * function returns %NULL.
- *
- * Return value: the user data previously attached or %NULL.
- *
- * Since: 1.4
- **/
-void *
-cairo_get_user_data (cairo_t *cr,
- const cairo_user_data_key_t *key)
-{
- return _cairo_user_data_array_get_data (&cr->user_data, key);
-}
-
-/**
- * cairo_set_user_data:
- * @cr: a #cairo_t
- * @key: the address of a #cairo_user_data_key_t to attach the user data to
- * @user_data: the user data to attach to the #cairo_t
- * @destroy: a #cairo_destroy_func_t which will be called when the
- * #cairo_t is destroyed or when new user data is attached using the
- * same key.
- *
- * Attach user data to @cr. To remove user data from a surface,
- * call this function with the key that was used to set it and %NULL
- * for @data.
- *
- * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a
- * slot could not be allocated for the user data.
- *
- * Since: 1.4
- **/
-cairo_status_t
-cairo_set_user_data (cairo_t *cr,
- const cairo_user_data_key_t *key,
- void *user_data,
- cairo_destroy_func_t destroy)
-{
- if (CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count))
- return cr->status;
-
- return _cairo_user_data_array_set_data (&cr->user_data,
- key, user_data, destroy);
-}
-
-/**
- * cairo_get_reference_count:
- * @cr: a #cairo_t
- *
- * Returns the current reference count of @cr.
- *
- * Return value: the current reference count of @cr. If the
- * object is a nil object, 0 will be returned.
- *
- * Since: 1.4
- **/
-unsigned int
-cairo_get_reference_count (cairo_t *cr)
-{
- if (cr == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count))
- return 0;
-
- return CAIRO_REFERENCE_COUNT_GET_VALUE (&cr->ref_count);
-}
-
-/**
- * cairo_save:
- * @cr: a #cairo_t
- *
- * Makes a copy of the current state of @cr and saves it
- * on an internal stack of saved states for @cr. When
- * cairo_restore() is called, @cr will be restored to
- * the saved state. Multiple calls to cairo_save() and
- * cairo_restore() can be nested; each call to cairo_restore()
- * restores the state from the matching paired cairo_save().
- *
- * It isn't necessary to clear all saved states before
- * a #cairo_t is freed. If the reference count of a #cairo_t
- * drops to zero in response to a call to cairo_destroy(),
- * any saved states will be freed along with the #cairo_t.
- *
- * Since: 1.0
- **/
-void
-cairo_save (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->save (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_save);
-
-/**
- * cairo_restore:
- * @cr: a #cairo_t
- *
- * Restores @cr to the state saved by a preceding call to
- * cairo_save() and removes that state from the stack of
- * saved states.
- *
- * Since: 1.0
- **/
-void
-cairo_restore (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->restore (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_restore);
-
-/**
- * cairo_push_group:
- * @cr: a cairo context
- *
- * Temporarily redirects drawing to an intermediate surface known as a
- * group. The redirection lasts until the group is completed by a call
- * to cairo_pop_group() or cairo_pop_group_to_source(). These calls
- * provide the result of any drawing to the group as a pattern,
- * (either as an explicit object, or set as the source pattern).
- *
- * This group functionality can be convenient for performing
- * intermediate compositing. One common use of a group is to render
- * objects as opaque within the group, (so that they occlude each
- * other), and then blend the result with translucence onto the
- * destination.
- *
- * Groups can be nested arbitrarily deep by making balanced calls to
- * cairo_push_group()/cairo_pop_group(). Each call pushes/pops the new
- * target group onto/from a stack.
- *
- * The cairo_push_group() function calls cairo_save() so that any
- * changes to the graphics state will not be visible outside the
- * group, (the pop_group functions call cairo_restore()).
- *
- * By default the intermediate group will have a content type of
- * %CAIRO_CONTENT_COLOR_ALPHA. Other content types can be chosen for
- * the group by using cairo_push_group_with_content() instead.
- *
- * As an example, here is how one might fill and stroke a path with
- * translucence, but without any portion of the fill being visible
- * under the stroke:
- *
- * <informalexample><programlisting>
- * cairo_push_group (cr);
- * cairo_set_source (cr, fill_pattern);
- * cairo_fill_preserve (cr);
- * cairo_set_source (cr, stroke_pattern);
- * cairo_stroke (cr);
- * cairo_pop_group_to_source (cr);
- * cairo_paint_with_alpha (cr, alpha);
- * </programlisting></informalexample>
- *
- * Since: 1.2
- **/
-void
-cairo_push_group (cairo_t *cr)
-{
- cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA);
-}
-
-/**
- * cairo_push_group_with_content:
- * @cr: a cairo context
- * @content: a #cairo_content_t indicating the type of group that
- * will be created
- *
- * Temporarily redirects drawing to an intermediate surface known as a
- * group. The redirection lasts until the group is completed by a call
- * to cairo_pop_group() or cairo_pop_group_to_source(). These calls
- * provide the result of any drawing to the group as a pattern,
- * (either as an explicit object, or set as the source pattern).
- *
- * The group will have a content type of @content. The ability to
- * control this content type is the only distinction between this
- * function and cairo_push_group() which you should see for a more
- * detailed description of group rendering.
- *
- * Since: 1.2
- **/
-void
-cairo_push_group_with_content (cairo_t *cr, cairo_content_t content)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->push_group (cr, content);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_push_group_with_content);
-
-/**
- * cairo_pop_group:
- * @cr: a cairo context
- *
- * Terminates the redirection begun by a call to cairo_push_group() or
- * cairo_push_group_with_content() and returns a new pattern
- * containing the results of all drawing operations performed to the
- * group.
- *
- * The cairo_pop_group() function calls cairo_restore(), (balancing a
- * call to cairo_save() by the push_group function), so that any
- * changes to the graphics state will not be visible outside the
- * group.
- *
- * Return value: a newly created (surface) pattern containing the
- * results of all drawing operations performed to the group. The
- * caller owns the returned object and should call
- * cairo_pattern_destroy() when finished with it.
- *
- * Since: 1.2
- **/
-cairo_pattern_t *
-cairo_pop_group (cairo_t *cr)
-{
- cairo_pattern_t *group_pattern;
-
- if (unlikely (cr->status))
- return _cairo_pattern_create_in_error (cr->status);
-
- group_pattern = cr->backend->pop_group (cr);
- if (unlikely (group_pattern->status))
- _cairo_set_error (cr, group_pattern->status);
-
- return group_pattern;
-}
-slim_hidden_def(cairo_pop_group);
-
-/**
- * cairo_pop_group_to_source:
- * @cr: a cairo context
- *
- * Terminates the redirection begun by a call to cairo_push_group() or
- * cairo_push_group_with_content() and installs the resulting pattern
- * as the source pattern in the given cairo context.
- *
- * The behavior of this function is equivalent to the sequence of
- * operations:
- *
- * <informalexample><programlisting>
- * cairo_pattern_t *group = cairo_pop_group (cr);
- * cairo_set_source (cr, group);
- * cairo_pattern_destroy (group);
- * </programlisting></informalexample>
- *
- * but is more convenient as their is no need for a variable to store
- * the short-lived pointer to the pattern.
- *
- * The cairo_pop_group() function calls cairo_restore(), (balancing a
- * call to cairo_save() by the push_group function), so that any
- * changes to the graphics state will not be visible outside the
- * group.
- *
- * Since: 1.2
- **/
-void
-cairo_pop_group_to_source (cairo_t *cr)
-{
- cairo_pattern_t *group_pattern;
-
- group_pattern = cairo_pop_group (cr);
- cairo_set_source (cr, group_pattern);
- cairo_pattern_destroy (group_pattern);
-}
-
-/**
- * cairo_set_operator:
- * @cr: a #cairo_t
- * @op: a compositing operator, specified as a #cairo_operator_t
- *
- * Sets the compositing operator to be used for all drawing
- * operations. See #cairo_operator_t for details on the semantics of
- * each available compositing operator.
- *
- * The default operator is %CAIRO_OPERATOR_OVER.
- *
- * Since: 1.0
- **/
-void
-cairo_set_operator (cairo_t *cr, cairo_operator_t op)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_operator (cr, op);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_operator);
-
-
-#if 0
-/**
- * cairo_set_opacity:
- * @cr: a #cairo_t
- * @opacity: the level of opacity to use when compositing
- *
- * Sets the compositing opacity to be used for all drawing
- * operations. The effect is to fade out the operations
- * using the alpha value.
- *
- * The default opacity is 1.
- *
- * Since: TBD
- **/
-void
-cairo_set_opacity (cairo_t *cr, double opacity)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_opacity (cr, opacity);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-#endif
-
-/**
- * cairo_set_source_rgb:
- * @cr: a cairo context
- * @red: red component of color
- * @green: green component of color
- * @blue: blue component of color
- *
- * Sets the source pattern within @cr to an opaque color. This opaque
- * color will then be used for any subsequent drawing operation until
- * a new source pattern is set.
- *
- * The color components are floating point numbers in the range 0 to
- * 1. If the values passed in are outside that range, they will be
- * clamped.
- *
- * The default source pattern is opaque black, (that is, it is
- * equivalent to cairo_set_source_rgb(cr, 0.0, 0.0, 0.0)).
- *
- * Since: 1.0
- **/
-void
-cairo_set_source_rgb (cairo_t *cr, double red, double green, double blue)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_source_rgba (cr, red, green, blue, 1.);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_source_rgb);
-
-/**
- * cairo_set_source_rgba:
- * @cr: a cairo context
- * @red: red component of color
- * @green: green component of color
- * @blue: blue component of color
- * @alpha: alpha component of color
- *
- * Sets the source pattern within @cr to a translucent color. This
- * color will then be used for any subsequent drawing operation until
- * a new source pattern is set.
- *
- * The color and alpha components are floating point numbers in the
- * range 0 to 1. If the values passed in are outside that range, they
- * will be clamped.
- *
- * The default source pattern is opaque black, (that is, it is
- * equivalent to cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0)).
- *
- * Since: 1.0
- **/
-void
-cairo_set_source_rgba (cairo_t *cr,
- double red, double green, double blue,
- double alpha)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_source_rgba (cr, red, green, blue, alpha);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_set_source_surface:
- * @cr: a cairo context
- * @surface: a surface to be used to set the source pattern
- * @x: User-space X coordinate for surface origin
- * @y: User-space Y coordinate for surface origin
- *
- * This is a convenience function for creating a pattern from @surface
- * and setting it as the source in @cr with cairo_set_source().
- *
- * The @x and @y parameters give the user-space coordinate at which
- * the surface origin should appear. (The surface origin is its
- * upper-left corner before any transformation has been applied.) The
- * @x and @y parameters are negated and then set as translation values
- * in the pattern matrix.
- *
- * Other than the initial translation pattern matrix, as described
- * above, all other pattern attributes, (such as its extend mode), are
- * set to the default values as in cairo_pattern_create_for_surface().
- * The resulting pattern can be queried with cairo_get_source() so
- * that these attributes can be modified if desired, (eg. to create a
- * repeating pattern with cairo_pattern_set_extend()).
- *
- * Since: 1.0
- **/
-void
-cairo_set_source_surface (cairo_t *cr,
- cairo_surface_t *surface,
- double x,
- double y)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- if (unlikely (surface == NULL)) {
- _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
- return;
- }
-
- status = cr->backend->set_source_surface (cr, surface, x, y);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_source_surface);
-
-/**
- * cairo_set_source:
- * @cr: a cairo context
- * @source: a #cairo_pattern_t to be used as the source for
- * subsequent drawing operations.
- *
- * Sets the source pattern within @cr to @source. This pattern
- * will then be used for any subsequent drawing operation until a new
- * source pattern is set.
- *
- * Note: The pattern's transformation matrix will be locked to the
- * user space in effect at the time of cairo_set_source(). This means
- * that further modifications of the current transformation matrix
- * will not affect the source pattern. See cairo_pattern_set_matrix().
- *
- * The default source pattern is a solid pattern that is opaque black,
- * (that is, it is equivalent to cairo_set_source_rgb(cr, 0.0, 0.0,
- * 0.0)).
- *
- * Since: 1.0
- **/
-void
-cairo_set_source (cairo_t *cr, cairo_pattern_t *source)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- if (unlikely (source == NULL)) {
- _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
- return;
- }
-
- if (unlikely (source->status)) {
- _cairo_set_error (cr, source->status);
- return;
- }
-
- status = cr->backend->set_source (cr, source);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_source);
-
-/**
- * cairo_get_source:
- * @cr: a cairo context
- *
- * Gets the current source pattern for @cr.
- *
- * Return value: the current source pattern. This object is owned by
- * cairo. To keep a reference to it, you must call
- * cairo_pattern_reference().
- *
- * Since: 1.0
- **/
-cairo_pattern_t *
-cairo_get_source (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return _cairo_pattern_create_in_error (cr->status);
-
- return cr->backend->get_source (cr);
-}
-
-/**
- * cairo_set_tolerance:
- * @cr: a #cairo_t
- * @tolerance: the tolerance, in device units (typically pixels)
- *
- * Sets the tolerance used when converting paths into trapezoids.
- * Curved segments of the path will be subdivided until the maximum
- * deviation between the original path and the polygonal approximation
- * is less than @tolerance. The default value is 0.1. A larger
- * value will give better performance, a smaller value, better
- * appearance. (Reducing the value from the default value of 0.1
- * is unlikely to improve appearance significantly.) The accuracy of paths
- * within Cairo is limited by the precision of its internal arithmetic, and
- * the prescribed @tolerance is restricted to the smallest
- * representable internal value.
- *
- * Since: 1.0
- **/
-void
-cairo_set_tolerance (cairo_t *cr, double tolerance)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_tolerance (cr, tolerance);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_tolerance);
-
-/**
- * cairo_set_antialias:
- * @cr: a #cairo_t
- * @antialias: the new antialiasing mode
- *
- * Set the antialiasing mode of the rasterizer used for drawing shapes.
- * This value is a hint, and a particular backend may or may not support
- * a particular value. At the current time, no backend supports
- * %CAIRO_ANTIALIAS_SUBPIXEL when drawing shapes.
- *
- * Note that this option does not affect text rendering, instead see
- * cairo_font_options_set_antialias().
- *
- * Since: 1.0
- **/
-void
-cairo_set_antialias (cairo_t *cr, cairo_antialias_t antialias)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_antialias (cr, antialias);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_set_fill_rule:
- * @cr: a #cairo_t
- * @fill_rule: a fill rule, specified as a #cairo_fill_rule_t
- *
- * Set the current fill rule within the cairo context. The fill rule
- * is used to determine which regions are inside or outside a complex
- * (potentially self-intersecting) path. The current fill rule affects
- * both cairo_fill() and cairo_clip(). See #cairo_fill_rule_t for details
- * on the semantics of each available fill rule.
- *
- * The default fill rule is %CAIRO_FILL_RULE_WINDING.
- *
- * Since: 1.0
- **/
-void
-cairo_set_fill_rule (cairo_t *cr, cairo_fill_rule_t fill_rule)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_fill_rule (cr, fill_rule);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_set_line_width:
- * @cr: a #cairo_t
- * @width: a line width
- *
- * Sets the current line width within the cairo context. The line
- * width value specifies the diameter of a pen that is circular in
- * user space, (though device-space pen may be an ellipse in general
- * due to scaling/shear/rotation of the CTM).
- *
- * Note: When the description above refers to user space and CTM it
- * refers to the user space and CTM in effect at the time of the
- * stroking operation, not the user space and CTM in effect at the
- * time of the call to cairo_set_line_width(). The simplest usage
- * makes both of these spaces identical. That is, if there is no
- * change to the CTM between a call to cairo_set_line_width() and the
- * stroking operation, then one can just pass user-space values to
- * cairo_set_line_width() and ignore this note.
- *
- * As with the other stroke parameters, the current line width is
- * examined by cairo_stroke(), cairo_stroke_extents(), and
- * cairo_stroke_to_path(), but does not have any effect during path
- * construction.
- *
- * The default line width value is 2.0.
- *
- * Since: 1.0
- **/
-void
-cairo_set_line_width (cairo_t *cr, double width)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- if (width < 0.)
- width = 0.;
-
- status = cr->backend->set_line_width (cr, width);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_line_width);
-
-/**
- * cairo_set_line_cap:
- * @cr: a cairo context
- * @line_cap: a line cap style
- *
- * Sets the current line cap style within the cairo context. See
- * #cairo_line_cap_t for details about how the available line cap
- * styles are drawn.
- *
- * As with the other stroke parameters, the current line cap style is
- * examined by cairo_stroke(), cairo_stroke_extents(), and
- * cairo_stroke_to_path(), but does not have any effect during path
- * construction.
- *
- * The default line cap style is %CAIRO_LINE_CAP_BUTT.
- *
- * Since: 1.0
- **/
-void
-cairo_set_line_cap (cairo_t *cr, cairo_line_cap_t line_cap)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_line_cap (cr, line_cap);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_line_cap);
-
-/**
- * cairo_set_line_join:
- * @cr: a cairo context
- * @line_join: a line join style
- *
- * Sets the current line join style within the cairo context. See
- * #cairo_line_join_t for details about how the available line join
- * styles are drawn.
- *
- * As with the other stroke parameters, the current line join style is
- * examined by cairo_stroke(), cairo_stroke_extents(), and
- * cairo_stroke_to_path(), but does not have any effect during path
- * construction.
- *
- * The default line join style is %CAIRO_LINE_JOIN_MITER.
- *
- * Since: 1.0
- **/
-void
-cairo_set_line_join (cairo_t *cr, cairo_line_join_t line_join)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_line_join (cr, line_join);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_line_join);
-
-/**
- * cairo_set_dash:
- * @cr: a cairo context
- * @dashes: an array specifying alternate lengths of on and off stroke portions
- * @num_dashes: the length of the dashes array
- * @offset: an offset into the dash pattern at which the stroke should start
- *
- * Sets the dash pattern to be used by cairo_stroke(). A dash pattern
- * is specified by @dashes, an array of positive values. Each value
- * provides the length of alternate "on" and "off" portions of the
- * stroke. The @offset specifies an offset into the pattern at which
- * the stroke begins.
- *
- * Each "on" segment will have caps applied as if the segment were a
- * separate sub-path. In particular, it is valid to use an "on" length
- * of 0.0 with %CAIRO_LINE_CAP_ROUND or %CAIRO_LINE_CAP_SQUARE in order
- * to distributed dots or squares along a path.
- *
- * Note: The length values are in user-space units as evaluated at the
- * time of stroking. This is not necessarily the same as the user
- * space at the time of cairo_set_dash().
- *
- * If @num_dashes is 0 dashing is disabled.
- *
- * If @num_dashes is 1 a symmetric pattern is assumed with alternating
- * on and off portions of the size specified by the single value in
- * @dashes.
- *
- * If any value in @dashes is negative, or if all values are 0, then
- * @cr will be put into an error state with a status of
- * %CAIRO_STATUS_INVALID_DASH.
- *
- * Since: 1.0
- **/
-void
-cairo_set_dash (cairo_t *cr,
- const double *dashes,
- int num_dashes,
- double offset)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_dash (cr, dashes, num_dashes, offset);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_get_dash_count:
- * @cr: a #cairo_t
- *
- * This function returns the length of the dash array in @cr (0 if dashing
- * is not currently in effect).
- *
- * See also cairo_set_dash() and cairo_get_dash().
- *
- * Return value: the length of the dash array, or 0 if no dash array set.
- *
- * Since: 1.4
- **/
-int
-cairo_get_dash_count (cairo_t *cr)
-{
- int num_dashes;
-
- if (unlikely (cr->status))
- return 0;
-
- cr->backend->get_dash (cr, NULL, &num_dashes, NULL);
-
- return num_dashes;
-}
-
-/**
- * cairo_get_dash:
- * @cr: a #cairo_t
- * @dashes: return value for the dash array, or %NULL
- * @offset: return value for the current dash offset, or %NULL
- *
- * Gets the current dash array. If not %NULL, @dashes should be big
- * enough to hold at least the number of values returned by
- * cairo_get_dash_count().
- *
- * Since: 1.4
- **/
-void
-cairo_get_dash (cairo_t *cr,
- double *dashes,
- double *offset)
-{
- if (unlikely (cr->status))
- return;
-
- cr->backend->get_dash (cr, dashes, NULL, offset);
-}
-
-/**
- * cairo_set_miter_limit:
- * @cr: a cairo context
- * @limit: miter limit to set
- *
- * Sets the current miter limit within the cairo context.
- *
- * If the current line join style is set to %CAIRO_LINE_JOIN_MITER
- * (see cairo_set_line_join()), the miter limit is used to determine
- * whether the lines should be joined with a bevel instead of a miter.
- * Cairo divides the length of the miter by the line width.
- * If the result is greater than the miter limit, the style is
- * converted to a bevel.
- *
- * As with the other stroke parameters, the current line miter limit is
- * examined by cairo_stroke(), cairo_stroke_extents(), and
- * cairo_stroke_to_path(), but does not have any effect during path
- * construction.
- *
- * The default miter limit value is 10.0, which will convert joins
- * with interior angles less than 11 degrees to bevels instead of
- * miters. For reference, a miter limit of 2.0 makes the miter cutoff
- * at 60 degrees, and a miter limit of 1.414 makes the cutoff at 90
- * degrees.
- *
- * A miter limit for a desired angle can be computed as: miter limit =
- * 1/sin(angle/2)
- *
- * Since: 1.0
- **/
-void
-cairo_set_miter_limit (cairo_t *cr, double limit)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_miter_limit (cr, limit);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_translate:
- * @cr: a cairo context
- * @tx: amount to translate in the X direction
- * @ty: amount to translate in the Y direction
- *
- * Modifies the current transformation matrix (CTM) by translating the
- * user-space origin by (@tx, @ty). This offset is interpreted as a
- * user-space coordinate according to the CTM in place before the new
- * call to cairo_translate(). In other words, the translation of the
- * user-space origin takes place after any existing transformation.
- *
- * Since: 1.0
- **/
-void
-cairo_translate (cairo_t *cr, double tx, double ty)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->translate (cr, tx, ty);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_translate);
-
-/**
- * cairo_scale:
- * @cr: a cairo context
- * @sx: scale factor for the X dimension
- * @sy: scale factor for the Y dimension
- *
- * Modifies the current transformation matrix (CTM) by scaling the X
- * and Y user-space axes by @sx and @sy respectively. The scaling of
- * the axes takes place after any existing transformation of user
- * space.
- *
- * Since: 1.0
- **/
-void
-cairo_scale (cairo_t *cr, double sx, double sy)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->scale (cr, sx, sy);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_scale);
-
-/**
- * cairo_rotate:
- * @cr: a cairo context
- * @angle: angle (in radians) by which the user-space axes will be
- * rotated
- *
- * Modifies the current transformation matrix (CTM) by rotating the
- * user-space axes by @angle radians. The rotation of the axes takes
- * places after any existing transformation of user space. The
- * rotation direction for positive angles is from the positive X axis
- * toward the positive Y axis.
- *
- * Since: 1.0
- **/
-void
-cairo_rotate (cairo_t *cr, double angle)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->rotate (cr, angle);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_transform:
- * @cr: a cairo context
- * @matrix: a transformation to be applied to the user-space axes
- *
- * Modifies the current transformation matrix (CTM) by applying
- * @matrix as an additional transformation. The new transformation of
- * user space takes place after any existing transformation.
- *
- * Since: 1.0
- **/
-void
-cairo_transform (cairo_t *cr,
- const cairo_matrix_t *matrix)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->transform (cr, matrix);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_transform);
-
-/**
- * cairo_set_matrix:
- * @cr: a cairo context
- * @matrix: a transformation matrix from user space to device space
- *
- * Modifies the current transformation matrix (CTM) by setting it
- * equal to @matrix.
- *
- * Since: 1.0
- **/
-void
-cairo_set_matrix (cairo_t *cr,
- const cairo_matrix_t *matrix)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_matrix (cr, matrix);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_matrix);
-
-/**
- * cairo_identity_matrix:
- * @cr: a cairo context
- *
- * Resets the current transformation matrix (CTM) by setting it equal
- * to the identity matrix. That is, the user-space and device-space
- * axes will be aligned and one user-space unit will transform to one
- * device-space unit.
- *
- * Since: 1.0
- **/
-void
-cairo_identity_matrix (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_identity_matrix (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_user_to_device:
- * @cr: a cairo context
- * @x: X value of coordinate (in/out parameter)
- * @y: Y value of coordinate (in/out parameter)
- *
- * Transform a coordinate from user space to device space by
- * multiplying the given point by the current transformation matrix
- * (CTM).
- *
- * Since: 1.0
- **/
-void
-cairo_user_to_device (cairo_t *cr, double *x, double *y)
-{
- if (unlikely (cr->status))
- return;
-
- cr->backend->user_to_device (cr, x, y);
-}
-slim_hidden_def (cairo_user_to_device);
-
-/**
- * cairo_user_to_device_distance:
- * @cr: a cairo context
- * @dx: X component of a distance vector (in/out parameter)
- * @dy: Y component of a distance vector (in/out parameter)
- *
- * Transform a distance vector from user space to device space. This
- * function is similar to cairo_user_to_device() except that the
- * translation components of the CTM will be ignored when transforming
- * (@dx,@dy).
- *
- * Since: 1.0
- **/
-void
-cairo_user_to_device_distance (cairo_t *cr, double *dx, double *dy)
-{
- if (unlikely (cr->status))
- return;
-
- cr->backend->user_to_device_distance (cr, dx, dy);
-}
-slim_hidden_def (cairo_user_to_device_distance);
-
-/**
- * cairo_device_to_user:
- * @cr: a cairo
- * @x: X value of coordinate (in/out parameter)
- * @y: Y value of coordinate (in/out parameter)
- *
- * Transform a coordinate from device space to user space by
- * multiplying the given point by the inverse of the current
- * transformation matrix (CTM).
- *
- * Since: 1.0
- **/
-void
-cairo_device_to_user (cairo_t *cr, double *x, double *y)
-{
- if (unlikely (cr->status))
- return;
-
- cr->backend->device_to_user (cr, x, y);
-}
-slim_hidden_def (cairo_device_to_user);
-
-/**
- * cairo_device_to_user_distance:
- * @cr: a cairo context
- * @dx: X component of a distance vector (in/out parameter)
- * @dy: Y component of a distance vector (in/out parameter)
- *
- * Transform a distance vector from device space to user space. This
- * function is similar to cairo_device_to_user() except that the
- * translation components of the inverse CTM will be ignored when
- * transforming (@dx,@dy).
- *
- * Since: 1.0
- **/
-void
-cairo_device_to_user_distance (cairo_t *cr, double *dx, double *dy)
-{
- if (unlikely (cr->status))
- return;
-
- cr->backend->device_to_user_distance (cr, dx, dy);
-}
-
-/**
- * cairo_new_path:
- * @cr: a cairo context
- *
- * Clears the current path. After this call there will be no path and
- * no current point.
- *
- * Since: 1.0
- **/
-void
-cairo_new_path (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->new_path (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_new_path);
-
-/**
- * cairo_new_sub_path:
- * @cr: a cairo context
- *
- * Begin a new sub-path. Note that the existing path is not
- * affected. After this call there will be no current point.
- *
- * In many cases, this call is not needed since new sub-paths are
- * frequently started with cairo_move_to().
- *
- * A call to cairo_new_sub_path() is particularly useful when
- * beginning a new sub-path with one of the cairo_arc() calls. This
- * makes things easier as it is no longer necessary to manually
- * compute the arc's initial coordinates for a call to
- * cairo_move_to().
- *
- * Since: 1.2
- **/
-void
-cairo_new_sub_path (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->new_sub_path (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_move_to:
- * @cr: a cairo context
- * @x: the X coordinate of the new position
- * @y: the Y coordinate of the new position
- *
- * Begin a new sub-path. After this call the current point will be (@x,
- * @y).
- *
- * Since: 1.0
- **/
-void
-cairo_move_to (cairo_t *cr, double x, double y)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->move_to (cr, x, y);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_move_to);
-
-
-/**
- * cairo_line_to:
- * @cr: a cairo context
- * @x: the X coordinate of the end of the new line
- * @y: the Y coordinate of the end of the new line
- *
- * Adds a line to the path from the current point to position (@x, @y)
- * in user-space coordinates. After this call the current point
- * will be (@x, @y).
- *
- * If there is no current point before the call to cairo_line_to()
- * this function will behave as cairo_move_to(@cr, @x, @y).
- *
- * Since: 1.0
- **/
-void
-cairo_line_to (cairo_t *cr, double x, double y)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->line_to (cr, x, y);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_line_to);
-
-/**
- * cairo_curve_to:
- * @cr: a cairo context
- * @x1: the X coordinate of the first control point
- * @y1: the Y coordinate of the first control point
- * @x2: the X coordinate of the second control point
- * @y2: the Y coordinate of the second control point
- * @x3: the X coordinate of the end of the curve
- * @y3: the Y coordinate of the end of the curve
- *
- * Adds a cubic Bézier spline to the path from the current point to
- * position (@x3, @y3) in user-space coordinates, using (@x1, @y1) and
- * (@x2, @y2) as the control points. After this call the current point
- * will be (@x3, @y3).
- *
- * If there is no current point before the call to cairo_curve_to()
- * this function will behave as if preceded by a call to
- * cairo_move_to(@cr, @x1, @y1).
- *
- * Since: 1.0
- **/
-void
-cairo_curve_to (cairo_t *cr,
- double x1, double y1,
- double x2, double y2,
- double x3, double y3)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->curve_to (cr,
- x1, y1,
- x2, y2,
- x3, y3);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_curve_to);
-
-/**
- * cairo_arc:
- * @cr: a cairo context
- * @xc: X position of the center of the arc
- * @yc: Y position of the center of the arc
- * @radius: the radius of the arc
- * @angle1: the start angle, in radians
- * @angle2: the end angle, in radians
- *
- * Adds a circular arc of the given @radius to the current path. The
- * arc is centered at (@xc, @yc), begins at @angle1 and proceeds in
- * the direction of increasing angles to end at @angle2. If @angle2 is
- * less than @angle1 it will be progressively increased by
- * <literal>2*M_PI</literal> until it is greater than @angle1.
- *
- * If there is a current point, an initial line segment will be added
- * to the path to connect the current point to the beginning of the
- * arc. If this initial line is undesired, it can be avoided by
- * calling cairo_new_sub_path() before calling cairo_arc().
- *
- * Angles are measured in radians. An angle of 0.0 is in the direction
- * of the positive X axis (in user space). An angle of
- * <literal>M_PI/2.0</literal> radians (90 degrees) is in the
- * direction of the positive Y axis (in user space). Angles increase
- * in the direction from the positive X axis toward the positive Y
- * axis. So with the default transformation matrix, angles increase in
- * a clockwise direction.
- *
- * (To convert from degrees to radians, use <literal>degrees * (M_PI /
- * 180.)</literal>.)
- *
- * This function gives the arc in the direction of increasing angles;
- * see cairo_arc_negative() to get the arc in the direction of
- * decreasing angles.
- *
- * The arc is circular in user space. To achieve an elliptical arc,
- * you can scale the current transformation matrix by different
- * amounts in the X and Y directions. For example, to draw an ellipse
- * in the box given by @x, @y, @width, @height:
- *
- * <informalexample><programlisting>
- * cairo_save (cr);
- * cairo_translate (cr, x + width / 2., y + height / 2.);
- * cairo_scale (cr, width / 2., height / 2.);
- * cairo_arc (cr, 0., 0., 1., 0., 2 * M_PI);
- * cairo_restore (cr);
- * </programlisting></informalexample>
- *
- * Since: 1.0
- **/
-void
-cairo_arc (cairo_t *cr,
- double xc, double yc,
- double radius,
- double angle1, double angle2)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- if (angle2 < angle1) {
- /* increase angle2 by multiples of full circle until it
- * satisfies angle2 >= angle1 */
- angle2 = fmod (angle2 - angle1, 2 * M_PI);
- if (angle2 < 0)
- angle2 += 2 * M_PI;
- angle2 += angle1;
- }
-
- status = cr->backend->arc (cr, xc, yc, radius, angle1, angle2, TRUE);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_arc_negative:
- * @cr: a cairo context
- * @xc: X position of the center of the arc
- * @yc: Y position of the center of the arc
- * @radius: the radius of the arc
- * @angle1: the start angle, in radians
- * @angle2: the end angle, in radians
- *
- * Adds a circular arc of the given @radius to the current path. The
- * arc is centered at (@xc, @yc), begins at @angle1 and proceeds in
- * the direction of decreasing angles to end at @angle2. If @angle2 is
- * greater than @angle1 it will be progressively decreased by
- * <literal>2*M_PI</literal> until it is less than @angle1.
- *
- * See cairo_arc() for more details. This function differs only in the
- * direction of the arc between the two angles.
- *
- * Since: 1.0
- **/
-void
-cairo_arc_negative (cairo_t *cr,
- double xc, double yc,
- double radius,
- double angle1, double angle2)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- if (angle2 > angle1) {
- /* decrease angle2 by multiples of full circle until it
- * satisfies angle2 <= angle1 */
- angle2 = fmod (angle2 - angle1, 2 * M_PI);
- if (angle2 > 0)
- angle2 -= 2 * M_PI;
- angle2 += angle1;
- }
-
- status = cr->backend->arc (cr, xc, yc, radius, angle1, angle2, FALSE);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/* XXX: NYI
-void
-cairo_arc_to (cairo_t *cr,
- double x1, double y1,
- double x2, double y2,
- double radius)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->arc_to (cr, x1, y1, x2, y2, radius);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-void
-cairo_rel_arc_to (cairo_t *cr,
- double dx1, double dy1,
- double dx2, double dy2,
- double radius)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->rel_arc_to (cr, dx1, dy1, dx2, dy2, radius);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-*/
-
-/**
- * cairo_rel_move_to:
- * @cr: a cairo context
- * @dx: the X offset
- * @dy: the Y offset
- *
- * Begin a new sub-path. After this call the current point will offset
- * by (@x, @y).
- *
- * Given a current point of (x, y), cairo_rel_move_to(@cr, @dx, @dy)
- * is logically equivalent to cairo_move_to(@cr, x + @dx, y + @dy).
- *
- * It is an error to call this function with no current point. Doing
- * so will cause @cr to shutdown with a status of
- * %CAIRO_STATUS_NO_CURRENT_POINT.
- *
- * Since: 1.0
- **/
-void
-cairo_rel_move_to (cairo_t *cr, double dx, double dy)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->rel_move_to (cr, dx, dy);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_rel_line_to:
- * @cr: a cairo context
- * @dx: the X offset to the end of the new line
- * @dy: the Y offset to the end of the new line
- *
- * Relative-coordinate version of cairo_line_to(). Adds a line to the
- * path from the current point to a point that is offset from the
- * current point by (@dx, @dy) in user space. After this call the
- * current point will be offset by (@dx, @dy).
- *
- * Given a current point of (x, y), cairo_rel_line_to(@cr, @dx, @dy)
- * is logically equivalent to cairo_line_to(@cr, x + @dx, y + @dy).
- *
- * It is an error to call this function with no current point. Doing
- * so will cause @cr to shutdown with a status of
- * %CAIRO_STATUS_NO_CURRENT_POINT.
- *
- * Since: 1.0
- **/
-void
-cairo_rel_line_to (cairo_t *cr, double dx, double dy)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->rel_line_to (cr, dx, dy);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_rel_line_to);
-
-/**
- * cairo_rel_curve_to:
- * @cr: a cairo context
- * @dx1: the X offset to the first control point
- * @dy1: the Y offset to the first control point
- * @dx2: the X offset to the second control point
- * @dy2: the Y offset to the second control point
- * @dx3: the X offset to the end of the curve
- * @dy3: the Y offset to the end of the curve
- *
- * Relative-coordinate version of cairo_curve_to(). All offsets are
- * relative to the current point. Adds a cubic Bézier spline to the
- * path from the current point to a point offset from the current
- * point by (@dx3, @dy3), using points offset by (@dx1, @dy1) and
- * (@dx2, @dy2) as the control points. After this call the current
- * point will be offset by (@dx3, @dy3).
- *
- * Given a current point of (x, y), cairo_rel_curve_to(@cr, @dx1,
- * @dy1, @dx2, @dy2, @dx3, @dy3) is logically equivalent to
- * cairo_curve_to(@cr, x+@dx1, y+@dy1, x+@dx2, y+@dy2, x+@dx3, y+@dy3).
- *
- * It is an error to call this function with no current point. Doing
- * so will cause @cr to shutdown with a status of
- * %CAIRO_STATUS_NO_CURRENT_POINT.
- *
- * Since: 1.0
- **/
-void
-cairo_rel_curve_to (cairo_t *cr,
- double dx1, double dy1,
- double dx2, double dy2,
- double dx3, double dy3)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->rel_curve_to (cr,
- dx1, dy1,
- dx2, dy2,
- dx3, dy3);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_rectangle:
- * @cr: a cairo context
- * @x: the X coordinate of the top left corner of the rectangle
- * @y: the Y coordinate to the top left corner of the rectangle
- * @width: the width of the rectangle
- * @height: the height of the rectangle
- *
- * Adds a closed sub-path rectangle of the given size to the current
- * path at position (@x, @y) in user-space coordinates.
- *
- * This function is logically equivalent to:
- * <informalexample><programlisting>
- * cairo_move_to (cr, x, y);
- * cairo_rel_line_to (cr, width, 0);
- * cairo_rel_line_to (cr, 0, height);
- * cairo_rel_line_to (cr, -width, 0);
- * cairo_close_path (cr);
- * </programlisting></informalexample>
- *
- * Since: 1.0
- **/
-void
-cairo_rectangle (cairo_t *cr,
- double x, double y,
- double width, double height)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->rectangle (cr, x, y, width, height);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-#if 0
-/* XXX: NYI */
-void
-cairo_stroke_to_path (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- /* The code in _cairo_recording_surface_get_path has a poorman's stroke_to_path */
-
- status = _cairo_gstate_stroke_path (cr->gstate);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-#endif
-
-/**
- * cairo_close_path:
- * @cr: a cairo context
- *
- * Adds a line segment to the path from the current point to the
- * beginning of the current sub-path, (the most recent point passed to
- * cairo_move_to()), and closes this sub-path. After this call the
- * current point will be at the joined endpoint of the sub-path.
- *
- * The behavior of cairo_close_path() is distinct from simply calling
- * cairo_line_to() with the equivalent coordinate in the case of
- * stroking. When a closed sub-path is stroked, there are no caps on
- * the ends of the sub-path. Instead, there is a line join connecting
- * the final and initial segments of the sub-path.
- *
- * If there is no current point before the call to cairo_close_path(),
- * this function will have no effect.
- *
- * Note: As of cairo version 1.2.4 any call to cairo_close_path() will
- * place an explicit MOVE_TO element into the path immediately after
- * the CLOSE_PATH element, (which can be seen in cairo_copy_path() for
- * example). This can simplify path processing in some cases as it may
- * not be necessary to save the "last move_to point" during processing
- * as the MOVE_TO immediately after the CLOSE_PATH will provide that
- * point.
- *
- * Since: 1.0
- **/
-void
-cairo_close_path (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->close_path (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_close_path);
-
-/**
- * cairo_path_extents:
- * @cr: a cairo context
- * @x1: left of the resulting extents
- * @y1: top of the resulting extents
- * @x2: right of the resulting extents
- * @y2: bottom of the resulting extents
- *
- * Computes a bounding box in user-space coordinates covering the
- * points on the current path. If the current path is empty, returns
- * an empty rectangle ((0,0), (0,0)). Stroke parameters, fill rule,
- * surface dimensions and clipping are not taken into account.
- *
- * Contrast with cairo_fill_extents() and cairo_stroke_extents() which
- * return the extents of only the area that would be "inked" by
- * the corresponding drawing operations.
- *
- * The result of cairo_path_extents() is defined as equivalent to the
- * limit of cairo_stroke_extents() with %CAIRO_LINE_CAP_ROUND as the
- * line width approaches 0.0, (but never reaching the empty-rectangle
- * returned by cairo_stroke_extents() for a line width of 0.0).
- *
- * Specifically, this means that zero-area sub-paths such as
- * cairo_move_to();cairo_line_to() segments, (even degenerate cases
- * where the coordinates to both calls are identical), will be
- * considered as contributing to the extents. However, a lone
- * cairo_move_to() will not contribute to the results of
- * cairo_path_extents().
- *
- * Since: 1.6
- **/
-void
-cairo_path_extents (cairo_t *cr,
- double *x1, double *y1, double *x2, double *y2)
-{
- if (unlikely (cr->status)) {
- if (x1)
- *x1 = 0.0;
- if (y1)
- *y1 = 0.0;
- if (x2)
- *x2 = 0.0;
- if (y2)
- *y2 = 0.0;
-
- return;
- }
-
- cr->backend->path_extents (cr, x1, y1, x2, y2);
-}
-
-/**
- * cairo_paint:
- * @cr: a cairo context
- *
- * A drawing operator that paints the current source everywhere within
- * the current clip region.
- *
- * Since: 1.0
- **/
-void
-cairo_paint (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->paint (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_paint);
-
-/**
- * cairo_paint_with_alpha:
- * @cr: a cairo context
- * @alpha: alpha value, between 0 (transparent) and 1 (opaque)
- *
- * A drawing operator that paints the current source everywhere within
- * the current clip region using a mask of constant alpha value
- * @alpha. The effect is similar to cairo_paint(), but the drawing
- * is faded out using the alpha value.
- *
- * Since: 1.0
- **/
-void
-cairo_paint_with_alpha (cairo_t *cr,
- double alpha)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->paint_with_alpha (cr, alpha);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_mask:
- * @cr: a cairo context
- * @pattern: a #cairo_pattern_t
- *
- * A drawing operator that paints the current source
- * using the alpha channel of @pattern as a mask. (Opaque
- * areas of @pattern are painted with the source, transparent
- * areas are not painted.)
- *
- * Since: 1.0
- **/
-void
-cairo_mask (cairo_t *cr,
- cairo_pattern_t *pattern)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- if (unlikely (pattern == NULL)) {
- _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
- return;
- }
-
- if (unlikely (pattern->status)) {
- _cairo_set_error (cr, pattern->status);
- return;
- }
-
- status = cr->backend->mask (cr, pattern);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_mask);
-
-/**
- * cairo_mask_surface:
- * @cr: a cairo context
- * @surface: a #cairo_surface_t
- * @surface_x: X coordinate at which to place the origin of @surface
- * @surface_y: Y coordinate at which to place the origin of @surface
- *
- * A drawing operator that paints the current source
- * using the alpha channel of @surface as a mask. (Opaque
- * areas of @surface are painted with the source, transparent
- * areas are not painted.)
- *
- * Since: 1.0
- **/
-void
-cairo_mask_surface (cairo_t *cr,
- cairo_surface_t *surface,
- double surface_x,
- double surface_y)
-{
- cairo_pattern_t *pattern;
- cairo_matrix_t matrix;
-
- if (unlikely (cr->status))
- return;
-
- pattern = cairo_pattern_create_for_surface (surface);
-
- cairo_matrix_init_translate (&matrix, - surface_x, - surface_y);
- cairo_pattern_set_matrix (pattern, &matrix);
-
- cairo_mask (cr, pattern);
-
- cairo_pattern_destroy (pattern);
-}
-
-/**
- * cairo_stroke:
- * @cr: a cairo context
- *
- * A drawing operator that strokes the current path according to the
- * current line width, line join, line cap, and dash settings. After
- * cairo_stroke(), the current path will be cleared from the cairo
- * context. See cairo_set_line_width(), cairo_set_line_join(),
- * cairo_set_line_cap(), cairo_set_dash(), and
- * cairo_stroke_preserve().
- *
- * Note: Degenerate segments and sub-paths are treated specially and
- * provide a useful result. These can result in two different
- * situations:
- *
- * 1. Zero-length "on" segments set in cairo_set_dash(). If the cap
- * style is %CAIRO_LINE_CAP_ROUND or %CAIRO_LINE_CAP_SQUARE then these
- * segments will be drawn as circular dots or squares respectively. In
- * the case of %CAIRO_LINE_CAP_SQUARE, the orientation of the squares
- * is determined by the direction of the underlying path.
- *
- * 2. A sub-path created by cairo_move_to() followed by either a
- * cairo_close_path() or one or more calls to cairo_line_to() to the
- * same coordinate as the cairo_move_to(). If the cap style is
- * %CAIRO_LINE_CAP_ROUND then these sub-paths will be drawn as circular
- * dots. Note that in the case of %CAIRO_LINE_CAP_SQUARE a degenerate
- * sub-path will not be drawn at all, (since the correct orientation
- * is indeterminate).
- *
- * In no case will a cap style of %CAIRO_LINE_CAP_BUTT cause anything
- * to be drawn in the case of either degenerate segments or sub-paths.
- *
- * Since: 1.0
- **/
-void
-cairo_stroke (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->stroke (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_stroke);
-
-/**
- * cairo_stroke_preserve:
- * @cr: a cairo context
- *
- * A drawing operator that strokes the current path according to the
- * current line width, line join, line cap, and dash settings. Unlike
- * cairo_stroke(), cairo_stroke_preserve() preserves the path within the
- * cairo context.
- *
- * See cairo_set_line_width(), cairo_set_line_join(),
- * cairo_set_line_cap(), cairo_set_dash(), and
- * cairo_stroke_preserve().
- *
- * Since: 1.0
- **/
-void
-cairo_stroke_preserve (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->stroke_preserve (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_stroke_preserve);
-
-/**
- * cairo_fill:
- * @cr: a cairo context
- *
- * A drawing operator that fills the current path according to the
- * current fill rule, (each sub-path is implicitly closed before being
- * filled). After cairo_fill(), the current path will be cleared from
- * the cairo context. See cairo_set_fill_rule() and
- * cairo_fill_preserve().
- *
- * Since: 1.0
- **/
-void
-cairo_fill (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->fill (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_fill_preserve:
- * @cr: a cairo context
- *
- * A drawing operator that fills the current path according to the
- * current fill rule, (each sub-path is implicitly closed before being
- * filled). Unlike cairo_fill(), cairo_fill_preserve() preserves the
- * path within the cairo context.
- *
- * See cairo_set_fill_rule() and cairo_fill().
- *
- * Since: 1.0
- **/
-void
-cairo_fill_preserve (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->fill_preserve (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_fill_preserve);
-
-/**
- * cairo_copy_page:
- * @cr: a cairo context
- *
- * Emits the current page for backends that support multiple pages, but
- * doesn't clear it, so, the contents of the current page will be retained
- * for the next page too. Use cairo_show_page() if you want to get an
- * empty page after the emission.
- *
- * This is a convenience function that simply calls
- * cairo_surface_copy_page() on @cr's target.
- *
- * Since: 1.0
- **/
-void
-cairo_copy_page (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->copy_page (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_show_page:
- * @cr: a cairo context
- *
- * Emits and clears the current page for backends that support multiple
- * pages. Use cairo_copy_page() if you don't want to clear the page.
- *
- * This is a convenience function that simply calls
- * cairo_surface_show_page() on @cr's target.
- *
- * Since: 1.0
- **/
-void
-cairo_show_page (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->show_page (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_in_stroke:
- * @cr: a cairo context
- * @x: X coordinate of the point to test
- * @y: Y coordinate of the point to test
- *
- * Tests whether the given point is inside the area that would be
- * affected by a cairo_stroke() operation given the current path and
- * stroking parameters. Surface dimensions and clipping are not taken
- * into account.
- *
- * See cairo_stroke(), cairo_set_line_width(), cairo_set_line_join(),
- * cairo_set_line_cap(), cairo_set_dash(), and
- * cairo_stroke_preserve().
- *
- * Return value: A non-zero value if the point is inside, or zero if
- * outside.
- *
- * Since: 1.0
- **/
-cairo_bool_t
-cairo_in_stroke (cairo_t *cr, double x, double y)
-{
- cairo_status_t status;
- cairo_bool_t inside = FALSE;
-
- if (unlikely (cr->status))
- return FALSE;
-
- status = cr->backend->in_stroke (cr, x, y, &inside);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-
- return inside;
-}
-
-/**
- * cairo_in_fill:
- * @cr: a cairo context
- * @x: X coordinate of the point to test
- * @y: Y coordinate of the point to test
- *
- * Tests whether the given point is inside the area that would be
- * affected by a cairo_fill() operation given the current path and
- * filling parameters. Surface dimensions and clipping are not taken
- * into account.
- *
- * See cairo_fill(), cairo_set_fill_rule() and cairo_fill_preserve().
- *
- * Return value: A non-zero value if the point is inside, or zero if
- * outside.
- *
- * Since: 1.0
- **/
-cairo_bool_t
-cairo_in_fill (cairo_t *cr, double x, double y)
-{
- cairo_status_t status;
- cairo_bool_t inside = FALSE;
-
- if (unlikely (cr->status))
- return FALSE;
-
- status = cr->backend->in_fill (cr, x, y, &inside);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-
- return inside;
-}
-
-/**
- * cairo_stroke_extents:
- * @cr: a cairo context
- * @x1: left of the resulting extents
- * @y1: top of the resulting extents
- * @x2: right of the resulting extents
- * @y2: bottom of the resulting extents
- *
- * Computes a bounding box in user coordinates covering the area that
- * would be affected, (the "inked" area), by a cairo_stroke()
- * operation given the current path and stroke parameters.
- * If the current path is empty, returns an empty rectangle ((0,0), (0,0)).
- * Surface dimensions and clipping are not taken into account.
- *
- * Note that if the line width is set to exactly zero, then
- * cairo_stroke_extents() will return an empty rectangle. Contrast with
- * cairo_path_extents() which can be used to compute the non-empty
- * bounds as the line width approaches zero.
- *
- * Note that cairo_stroke_extents() must necessarily do more work to
- * compute the precise inked areas in light of the stroke parameters,
- * so cairo_path_extents() may be more desirable for sake of
- * performance if non-inked path extents are desired.
- *
- * See cairo_stroke(), cairo_set_line_width(), cairo_set_line_join(),
- * cairo_set_line_cap(), cairo_set_dash(), and
- * cairo_stroke_preserve().
- *
- * Since: 1.0
- **/
-void
-cairo_stroke_extents (cairo_t *cr,
- double *x1, double *y1, double *x2, double *y2)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status)) {
- if (x1)
- *x1 = 0.0;
- if (y1)
- *y1 = 0.0;
- if (x2)
- *x2 = 0.0;
- if (y2)
- *y2 = 0.0;
-
- return;
- }
-
- status = cr->backend->stroke_extents (cr, x1, y1, x2, y2);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_fill_extents:
- * @cr: a cairo context
- * @x1: left of the resulting extents
- * @y1: top of the resulting extents
- * @x2: right of the resulting extents
- * @y2: bottom of the resulting extents
- *
- * Computes a bounding box in user coordinates covering the area that
- * would be affected, (the "inked" area), by a cairo_fill() operation
- * given the current path and fill parameters. If the current path is
- * empty, returns an empty rectangle ((0,0), (0,0)). Surface
- * dimensions and clipping are not taken into account.
- *
- * Contrast with cairo_path_extents(), which is similar, but returns
- * non-zero extents for some paths with no inked area, (such as a
- * simple line segment).
- *
- * Note that cairo_fill_extents() must necessarily do more work to
- * compute the precise inked areas in light of the fill rule, so
- * cairo_path_extents() may be more desirable for sake of performance
- * if the non-inked path extents are desired.
- *
- * See cairo_fill(), cairo_set_fill_rule() and cairo_fill_preserve().
- *
- * Since: 1.0
- **/
-void
-cairo_fill_extents (cairo_t *cr,
- double *x1, double *y1, double *x2, double *y2)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status)) {
- if (x1)
- *x1 = 0.0;
- if (y1)
- *y1 = 0.0;
- if (x2)
- *x2 = 0.0;
- if (y2)
- *y2 = 0.0;
-
- return;
- }
-
- status = cr->backend->fill_extents (cr, x1, y1, x2, y2);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_clip:
- * @cr: a cairo context
- *
- * Establishes a new clip region by intersecting the current clip
- * region with the current path as it would be filled by cairo_fill()
- * and according to the current fill rule (see cairo_set_fill_rule()).
- *
- * After cairo_clip(), the current path will be cleared from the cairo
- * context.
- *
- * The current clip region affects all drawing operations by
- * effectively masking out any changes to the surface that are outside
- * the current clip region.
- *
- * Calling cairo_clip() can only make the clip region smaller, never
- * larger. But the current clip is part of the graphics state, so a
- * temporary restriction of the clip region can be achieved by
- * calling cairo_clip() within a cairo_save()/cairo_restore()
- * pair. The only other means of increasing the size of the clip
- * region is cairo_reset_clip().
- *
- * Since: 1.0
- **/
-void
-cairo_clip (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->clip (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_clip_preserve:
- * @cr: a cairo context
- *
- * Establishes a new clip region by intersecting the current clip
- * region with the current path as it would be filled by cairo_fill()
- * and according to the current fill rule (see cairo_set_fill_rule()).
- *
- * Unlike cairo_clip(), cairo_clip_preserve() preserves the path within
- * the cairo context.
- *
- * The current clip region affects all drawing operations by
- * effectively masking out any changes to the surface that are outside
- * the current clip region.
- *
- * Calling cairo_clip_preserve() can only make the clip region smaller, never
- * larger. But the current clip is part of the graphics state, so a
- * temporary restriction of the clip region can be achieved by
- * calling cairo_clip_preserve() within a cairo_save()/cairo_restore()
- * pair. The only other means of increasing the size of the clip
- * region is cairo_reset_clip().
- *
- * Since: 1.0
- **/
-void
-cairo_clip_preserve (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->clip_preserve (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def(cairo_clip_preserve);
-
-/**
- * cairo_reset_clip:
- * @cr: a cairo context
- *
- * Reset the current clip region to its original, unrestricted
- * state. That is, set the clip region to an infinitely large shape
- * containing the target surface. Equivalently, if infinity is too
- * hard to grasp, one can imagine the clip region being reset to the
- * exact bounds of the target surface.
- *
- * Note that code meant to be reusable should not call
- * cairo_reset_clip() as it will cause results unexpected by
- * higher-level code which calls cairo_clip(). Consider using
- * cairo_save() and cairo_restore() around cairo_clip() as a more
- * robust means of temporarily restricting the clip region.
- *
- * Since: 1.0
- **/
-void
-cairo_reset_clip (cairo_t *cr)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->reset_clip (cr);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_clip_extents:
- * @cr: a cairo context
- * @x1: left of the resulting extents
- * @y1: top of the resulting extents
- * @x2: right of the resulting extents
- * @y2: bottom of the resulting extents
- *
- * Computes a bounding box in user coordinates covering the area inside the
- * current clip.
- *
- * Since: 1.4
- **/
-void
-cairo_clip_extents (cairo_t *cr,
- double *x1, double *y1,
- double *x2, double *y2)
-{
- cairo_status_t status;
-
- if (x1)
- *x1 = 0.0;
- if (y1)
- *y1 = 0.0;
- if (x2)
- *x2 = 0.0;
- if (y2)
- *y2 = 0.0;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->clip_extents (cr, x1, y1, x2, y2);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_in_clip:
- * @cr: a cairo context
- * @x: X coordinate of the point to test
- * @y: Y coordinate of the point to test
- *
- * Tests whether the given point is inside the area that would be
- * visible through the current clip, i.e. the area that would be filled by
- * a cairo_paint() operation.
- *
- * See cairo_clip(), and cairo_clip_preserve().
- *
- * Return value: A non-zero value if the point is inside, or zero if
- * outside.
- *
- * Since: 1.10
- **/
-cairo_bool_t
-cairo_in_clip (cairo_t *cr, double x, double y)
-{
- cairo_status_t status;
- cairo_bool_t inside = FALSE;
-
- if (unlikely (cr->status))
- return FALSE;
-
- status = cr->backend->in_clip (cr, x, y, &inside);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-
- return inside;
-}
-
-/**
- * cairo_copy_clip_rectangle_list:
- * @cr: a cairo context
- *
- * Gets the current clip region as a list of rectangles in user coordinates.
- * Never returns %NULL.
- *
- * The status in the list may be %CAIRO_STATUS_CLIP_NOT_REPRESENTABLE to
- * indicate that the clip region cannot be represented as a list of
- * user-space rectangles. The status may have other values to indicate
- * other errors.
- *
- * Returns: the current clip region as a list of rectangles in user coordinates,
- * which should be destroyed using cairo_rectangle_list_destroy().
- *
- * Since: 1.4
- **/
-cairo_rectangle_list_t *
-cairo_copy_clip_rectangle_list (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return _cairo_rectangle_list_create_in_error (cr->status);
-
- return cr->backend->clip_copy_rectangle_list (cr);
-}
-
-/**
- * cairo_select_font_face:
- * @cr: a #cairo_t
- * @family: a font family name, encoded in UTF-8
- * @slant: the slant for the font
- * @weight: the weight for the font
- *
- * Note: The cairo_select_font_face() function call is part of what
- * the cairo designers call the "toy" text API. It is convenient for
- * short demos and simple programs, but it is not expected to be
- * adequate for serious text-using applications.
- *
- * Selects a family and style of font from a simplified description as
- * a family name, slant and weight. Cairo provides no operation to
- * list available family names on the system (this is a "toy",
- * remember), but the standard CSS2 generic family names, ("serif",
- * "sans-serif", "cursive", "fantasy", "monospace"), are likely to
- * work as expected.
- *
- * If @family starts with the string "@cairo:", or if no native font
- * backends are compiled in, cairo will use an internal font family.
- * The internal font family recognizes many modifiers in the @family
- * string, most notably, it recognizes the string "monospace". That is,
- * the family name "@cairo:monospace" will use the monospace version of
- * the internal font family.
- *
- * For "real" font selection, see the font-backend-specific
- * font_face_create functions for the font backend you are using. (For
- * example, if you are using the freetype-based cairo-ft font backend,
- * see cairo_ft_font_face_create_for_ft_face() or
- * cairo_ft_font_face_create_for_pattern().) The resulting font face
- * could then be used with cairo_scaled_font_create() and
- * cairo_set_scaled_font().
- *
- * Similarly, when using the "real" font support, you can call
- * directly into the underlying font system, (such as fontconfig or
- * freetype), for operations such as listing available fonts, etc.
- *
- * It is expected that most applications will need to use a more
- * comprehensive font handling and text layout library, (for example,
- * pango), in conjunction with cairo.
- *
- * If text is drawn without a call to cairo_select_font_face(), (nor
- * cairo_set_font_face() nor cairo_set_scaled_font()), the default
- * family is platform-specific, but is essentially "sans-serif".
- * Default slant is %CAIRO_FONT_SLANT_NORMAL, and default weight is
- * %CAIRO_FONT_WEIGHT_NORMAL.
- *
- * This function is equivalent to a call to cairo_toy_font_face_create()
- * followed by cairo_set_font_face().
- *
- * Since: 1.0
- **/
-void
-cairo_select_font_face (cairo_t *cr,
- const char *family,
- cairo_font_slant_t slant,
- cairo_font_weight_t weight)
-{
- cairo_font_face_t *font_face;
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- font_face = cairo_toy_font_face_create (family, slant, weight);
- if (unlikely (font_face->status)) {
- _cairo_set_error (cr, font_face->status);
- return;
- }
-
- status = cr->backend->set_font_face (cr, font_face);
- cairo_font_face_destroy (font_face);
-
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_font_extents:
- * @cr: a #cairo_t
- * @extents: a #cairo_font_extents_t object into which the results
- * will be stored.
- *
- * Gets the font extents for the currently selected font.
- *
- * Since: 1.0
- **/
-void
-cairo_font_extents (cairo_t *cr,
- cairo_font_extents_t *extents)
-{
- cairo_status_t status;
-
- extents->ascent = 0.0;
- extents->descent = 0.0;
- extents->height = 0.0;
- extents->max_x_advance = 0.0;
- extents->max_y_advance = 0.0;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->font_extents (cr, extents);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_set_font_face:
- * @cr: a #cairo_t
- * @font_face: a #cairo_font_face_t, or %NULL to restore to the default font
- *
- * Replaces the current #cairo_font_face_t object in the #cairo_t with
- * @font_face. The replaced font face in the #cairo_t will be
- * destroyed if there are no other references to it.
- *
- * Since: 1.0
- **/
-void
-cairo_set_font_face (cairo_t *cr,
- cairo_font_face_t *font_face)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_font_face (cr, font_face);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_get_font_face:
- * @cr: a #cairo_t
- *
- * Gets the current font face for a #cairo_t.
- *
- * Return value: the current font face. This object is owned by
- * cairo. To keep a reference to it, you must call
- * cairo_font_face_reference().
- *
- * This function never returns %NULL. If memory cannot be allocated, a
- * special "nil" #cairo_font_face_t object will be returned on which
- * cairo_font_face_status() returns %CAIRO_STATUS_NO_MEMORY. Using
- * this nil object will cause its error state to propagate to other
- * objects it is passed to, (for example, calling
- * cairo_set_font_face() with a nil font will trigger an error that
- * will shutdown the #cairo_t object).
- *
- * Since: 1.0
- **/
-cairo_font_face_t *
-cairo_get_font_face (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return (cairo_font_face_t*) &_cairo_font_face_nil;
-
- return cr->backend->get_font_face (cr);
-}
-
-/**
- * cairo_set_font_size:
- * @cr: a #cairo_t
- * @size: the new font size, in user space units
- *
- * Sets the current font matrix to a scale by a factor of @size, replacing
- * any font matrix previously set with cairo_set_font_size() or
- * cairo_set_font_matrix(). This results in a font size of @size user space
- * units. (More precisely, this matrix will result in the font's
- * em-square being a @size by @size square in user space.)
- *
- * If text is drawn without a call to cairo_set_font_size(), (nor
- * cairo_set_font_matrix() nor cairo_set_scaled_font()), the default
- * font size is 10.0.
- *
- * Since: 1.0
- **/
-void
-cairo_set_font_size (cairo_t *cr, double size)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_font_size (cr, size);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_font_size);
-
-/**
- * cairo_set_font_matrix:
- * @cr: a #cairo_t
- * @matrix: a #cairo_matrix_t describing a transform to be applied to
- * the current font.
- *
- * Sets the current font matrix to @matrix. The font matrix gives a
- * transformation from the design space of the font (in this space,
- * the em-square is 1 unit by 1 unit) to user space. Normally, a
- * simple scale is used (see cairo_set_font_size()), but a more
- * complex font matrix can be used to shear the font
- * or stretch it unequally along the two axes
- *
- * Since: 1.0
- **/
-void
-cairo_set_font_matrix (cairo_t *cr,
- const cairo_matrix_t *matrix)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cr->backend->set_font_matrix (cr, matrix);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_font_matrix);
-
-/**
- * cairo_get_font_matrix:
- * @cr: a #cairo_t
- * @matrix: return value for the matrix
- *
- * Stores the current font matrix into @matrix. See
- * cairo_set_font_matrix().
- *
- * Since: 1.0
- **/
-void
-cairo_get_font_matrix (cairo_t *cr, cairo_matrix_t *matrix)
-{
- if (unlikely (cr->status)) {
- cairo_matrix_init_identity (matrix);
- return;
- }
-
- cr->backend->get_font_matrix (cr, matrix);
-}
-
-/**
- * cairo_set_font_options:
- * @cr: a #cairo_t
- * @options: font options to use
- *
- * Sets a set of custom font rendering options for the #cairo_t.
- * Rendering options are derived by merging these options with the
- * options derived from underlying surface; if the value in @options
- * has a default value (like %CAIRO_ANTIALIAS_DEFAULT), then the value
- * from the surface is used.
- *
- * Since: 1.0
- **/
-void
-cairo_set_font_options (cairo_t *cr,
- const cairo_font_options_t *options)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- status = cairo_font_options_status ((cairo_font_options_t *) options);
- if (unlikely (status)) {
- _cairo_set_error (cr, status);
- return;
- }
-
- status = cr->backend->set_font_options (cr, options);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-slim_hidden_def (cairo_set_font_options);
-
-/**
- * cairo_get_font_options:
- * @cr: a #cairo_t
- * @options: a #cairo_font_options_t object into which to store
- * the retrieved options. All existing values are overwritten
- *
- * Retrieves font rendering options set via #cairo_set_font_options.
- * Note that the returned options do not include any options derived
- * from the underlying surface; they are literally the options
- * passed to cairo_set_font_options().
- *
- * Since: 1.0
- **/
-void
-cairo_get_font_options (cairo_t *cr,
- cairo_font_options_t *options)
-{
- /* check that we aren't trying to overwrite the nil object */
- if (cairo_font_options_status (options))
- return;
-
- if (unlikely (cr->status)) {
- _cairo_font_options_init_default (options);
- return;
- }
-
- cr->backend->get_font_options (cr, options);
-}
-
-/**
- * cairo_set_scaled_font:
- * @cr: a #cairo_t
- * @scaled_font: a #cairo_scaled_font_t
- *
- * Replaces the current font face, font matrix, and font options in
- * the #cairo_t with those of the #cairo_scaled_font_t. Except for
- * some translation, the current CTM of the #cairo_t should be the
- * same as that of the #cairo_scaled_font_t, which can be accessed
- * using cairo_scaled_font_get_ctm().
- *
- * Since: 1.2
- **/
-void
-cairo_set_scaled_font (cairo_t *cr,
- const cairo_scaled_font_t *scaled_font)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- if ((scaled_font == NULL)) {
- _cairo_set_error (cr, _cairo_error (CAIRO_STATUS_NULL_POINTER));
- return;
- }
-
- status = scaled_font->status;
- if (unlikely (status)) {
- _cairo_set_error (cr, status);
- return;
- }
-
- status = cr->backend->set_scaled_font (cr, (cairo_scaled_font_t *) scaled_font);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_get_scaled_font:
- * @cr: a #cairo_t
- *
- * Gets the current scaled font for a #cairo_t.
- *
- * Return value: the current scaled font. This object is owned by
- * cairo. To keep a reference to it, you must call
- * cairo_scaled_font_reference().
- *
- * This function never returns %NULL. If memory cannot be allocated, a
- * special "nil" #cairo_scaled_font_t object will be returned on which
- * cairo_scaled_font_status() returns %CAIRO_STATUS_NO_MEMORY. Using
- * this nil object will cause its error state to propagate to other
- * objects it is passed to, (for example, calling
- * cairo_set_scaled_font() with a nil font will trigger an error that
- * will shutdown the #cairo_t object).
- *
- * Since: 1.4
- **/
-cairo_scaled_font_t *
-cairo_get_scaled_font (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return _cairo_scaled_font_create_in_error (cr->status);
-
- return cr->backend->get_scaled_font (cr);
-}
-slim_hidden_def (cairo_get_scaled_font);
-
-/**
- * cairo_text_extents:
- * @cr: a #cairo_t
- * @utf8: a NUL-terminated string of text encoded in UTF-8, or %NULL
- * @extents: a #cairo_text_extents_t object into which the results
- * will be stored
- *
- * Gets the extents for a string of text. The extents describe a
- * user-space rectangle that encloses the "inked" portion of the text,
- * (as it would be drawn by cairo_show_text()). Additionally, the
- * x_advance and y_advance values indicate the amount by which the
- * current point would be advanced by cairo_show_text().
- *
- * Note that whitespace characters do not directly contribute to the
- * size of the rectangle (extents.width and extents.height). They do
- * contribute indirectly by changing the position of non-whitespace
- * characters. In particular, trailing whitespace characters are
- * likely to not affect the size of the rectangle, though they will
- * affect the x_advance and y_advance values.
- *
- * Since: 1.0
- **/
-void
-cairo_text_extents (cairo_t *cr,
- const char *utf8,
- cairo_text_extents_t *extents)
-{
- cairo_status_t status;
- cairo_scaled_font_t *scaled_font;
- cairo_glyph_t *glyphs = NULL;
- int num_glyphs = 0;
- double x, y;
-
- extents->x_bearing = 0.0;
- extents->y_bearing = 0.0;
- extents->width = 0.0;
- extents->height = 0.0;
- extents->x_advance = 0.0;
- extents->y_advance = 0.0;
-
- if (unlikely (cr->status))
- return;
-
- if (utf8 == NULL)
- return;
-
- scaled_font = cairo_get_scaled_font (cr);
- if (unlikely (scaled_font->status)) {
- _cairo_set_error (cr, scaled_font->status);
- return;
- }
-
- cairo_get_current_point (cr, &x, &y);
- status = cairo_scaled_font_text_to_glyphs (scaled_font,
- x, y,
- utf8, -1,
- &glyphs, &num_glyphs,
- NULL, NULL, NULL);
-
- if (likely (status == CAIRO_STATUS_SUCCESS)) {
- status = cr->backend->glyph_extents (cr,
- glyphs, num_glyphs,
- extents);
- }
- cairo_glyph_free (glyphs);
-
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_glyph_extents:
- * @cr: a #cairo_t
- * @glyphs: an array of #cairo_glyph_t objects
- * @num_glyphs: the number of elements in @glyphs
- * @extents: a #cairo_text_extents_t object into which the results
- * will be stored
- *
- * Gets the extents for an array of glyphs. The extents describe a
- * user-space rectangle that encloses the "inked" portion of the
- * glyphs, (as they would be drawn by cairo_show_glyphs()).
- * Additionally, the x_advance and y_advance values indicate the
- * amount by which the current point would be advanced by
- * cairo_show_glyphs().
- *
- * Note that whitespace glyphs do not contribute to the size of the
- * rectangle (extents.width and extents.height).
- *
- * Since: 1.0
- **/
-void
-cairo_glyph_extents (cairo_t *cr,
- const cairo_glyph_t *glyphs,
- int num_glyphs,
- cairo_text_extents_t *extents)
-{
- cairo_status_t status;
-
- extents->x_bearing = 0.0;
- extents->y_bearing = 0.0;
- extents->width = 0.0;
- extents->height = 0.0;
- extents->x_advance = 0.0;
- extents->y_advance = 0.0;
-
- if (unlikely (cr->status))
- return;
-
- if (num_glyphs == 0)
- return;
-
- if (unlikely (num_glyphs < 0)) {
- _cairo_set_error (cr, CAIRO_STATUS_NEGATIVE_COUNT);
- return;
- }
-
- if (unlikely (glyphs == NULL)) {
- _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
- return;
- }
-
- status = cr->backend->glyph_extents (cr, glyphs, num_glyphs, extents);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_show_text:
- * @cr: a cairo context
- * @utf8: a NUL-terminated string of text encoded in UTF-8, or %NULL
- *
- * A drawing operator that generates the shape from a string of UTF-8
- * characters, rendered according to the current font_face, font_size
- * (font_matrix), and font_options.
- *
- * This function first computes a set of glyphs for the string of
- * text. The first glyph is placed so that its origin is at the
- * current point. The origin of each subsequent glyph is offset from
- * that of the previous glyph by the advance values of the previous
- * glyph.
- *
- * After this call the current point is moved to the origin of where
- * the next glyph would be placed in this same progression. That is,
- * the current point will be at the origin of the final glyph offset
- * by its advance values. This allows for easy display of a single
- * logical string with multiple calls to cairo_show_text().
- *
- * Note: The cairo_show_text() function call is part of what the cairo
- * designers call the "toy" text API. It is convenient for short demos
- * and simple programs, but it is not expected to be adequate for
- * serious text-using applications. See cairo_show_glyphs() for the
- * "real" text display API in cairo.
- *
- * Since: 1.0
- **/
-void
-cairo_show_text (cairo_t *cr, const char *utf8)
-{
- cairo_text_extents_t extents;
- cairo_status_t status;
- cairo_glyph_t *glyphs, *last_glyph;
- cairo_text_cluster_t *clusters;
- int utf8_len, num_glyphs, num_clusters;
- cairo_text_cluster_flags_t cluster_flags;
- double x, y;
- cairo_bool_t has_show_text_glyphs;
- cairo_glyph_t stack_glyphs[CAIRO_STACK_ARRAY_LENGTH (cairo_glyph_t)];
- cairo_text_cluster_t stack_clusters[CAIRO_STACK_ARRAY_LENGTH (cairo_text_cluster_t)];
- cairo_scaled_font_t *scaled_font;
- cairo_glyph_text_info_t info, *i;
-
- if (unlikely (cr->status))
- return;
-
- if (utf8 == NULL)
- return;
-
- scaled_font = cairo_get_scaled_font (cr);
- if (unlikely (scaled_font->status)) {
- _cairo_set_error (cr, scaled_font->status);
- return;
- }
-
- utf8_len = strlen (utf8);
-
- has_show_text_glyphs =
- cairo_surface_has_show_text_glyphs (cairo_get_target (cr));
-
- glyphs = stack_glyphs;
- num_glyphs = ARRAY_LENGTH (stack_glyphs);
-
- if (has_show_text_glyphs) {
- clusters = stack_clusters;
- num_clusters = ARRAY_LENGTH (stack_clusters);
- } else {
- clusters = NULL;
- num_clusters = 0;
- }
-
- cairo_get_current_point (cr, &x, &y);
- status = cairo_scaled_font_text_to_glyphs (scaled_font,
- x, y,
- utf8, utf8_len,
- &glyphs, &num_glyphs,
- has_show_text_glyphs ? &clusters : NULL, &num_clusters,
- &cluster_flags);
- if (unlikely (status))
- goto BAIL;
-
- if (num_glyphs == 0)
- return;
-
- i = NULL;
- if (has_show_text_glyphs) {
- info.utf8 = utf8;
- info.utf8_len = utf8_len;
- info.clusters = clusters;
- info.num_clusters = num_clusters;
- info.cluster_flags = cluster_flags;
- i = &info;
- }
-
- status = cr->backend->glyphs (cr, glyphs, num_glyphs, i);
- if (unlikely (status))
- goto BAIL;
-
- last_glyph = &glyphs[num_glyphs - 1];
- status = cr->backend->glyph_extents (cr, last_glyph, 1, &extents);
- if (unlikely (status))
- goto BAIL;
-
- x = last_glyph->x + extents.x_advance;
- y = last_glyph->y + extents.y_advance;
- cr->backend->move_to (cr, x, y);
-
- BAIL:
- if (glyphs != stack_glyphs)
- cairo_glyph_free (glyphs);
- if (clusters != stack_clusters)
- cairo_text_cluster_free (clusters);
-
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_show_glyphs:
- * @cr: a cairo context
- * @glyphs: array of glyphs to show
- * @num_glyphs: number of glyphs to show
- *
- * A drawing operator that generates the shape from an array of glyphs,
- * rendered according to the current font face, font size
- * (font matrix), and font options.
- *
- * Since: 1.0
- **/
-void
-cairo_show_glyphs (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- if (num_glyphs == 0)
- return;
-
- if (num_glyphs < 0) {
- _cairo_set_error (cr, CAIRO_STATUS_NEGATIVE_COUNT);
- return;
- }
-
- if (glyphs == NULL) {
- _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
- return;
- }
-
- status = cr->backend->glyphs (cr, glyphs, num_glyphs, NULL);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_show_text_glyphs:
- * @cr: a cairo context
- * @utf8: a string of text encoded in UTF-8
- * @utf8_len: length of @utf8 in bytes, or -1 if it is NUL-terminated
- * @glyphs: array of glyphs to show
- * @num_glyphs: number of glyphs to show
- * @clusters: array of cluster mapping information
- * @num_clusters: number of clusters in the mapping
- * @cluster_flags: cluster mapping flags
- *
- * This operation has rendering effects similar to cairo_show_glyphs()
- * but, if the target surface supports it, uses the provided text and
- * cluster mapping to embed the text for the glyphs shown in the output.
- * If the target does not support the extended attributes, this function
- * acts like the basic cairo_show_glyphs() as if it had been passed
- * @glyphs and @num_glyphs.
- *
- * The mapping between @utf8 and @glyphs is provided by an array of
- * <firstterm>clusters</firstterm>. Each cluster covers a number of
- * text bytes and glyphs, and neighboring clusters cover neighboring
- * areas of @utf8 and @glyphs. The clusters should collectively cover @utf8
- * and @glyphs in entirety.
- *
- * The first cluster always covers bytes from the beginning of @utf8.
- * If @cluster_flags do not have the %CAIRO_TEXT_CLUSTER_FLAG_BACKWARD
- * set, the first cluster also covers the beginning
- * of @glyphs, otherwise it covers the end of the @glyphs array and
- * following clusters move backward.
- *
- * See #cairo_text_cluster_t for constraints on valid clusters.
- *
- * Since: 1.8
- **/
-void
-cairo_show_text_glyphs (cairo_t *cr,
- const char *utf8,
- int utf8_len,
- const cairo_glyph_t *glyphs,
- int num_glyphs,
- const cairo_text_cluster_t *clusters,
- int num_clusters,
- cairo_text_cluster_flags_t cluster_flags)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- /* A slew of sanity checks */
-
- /* Special case for NULL and -1 */
- if (utf8 == NULL && utf8_len == -1)
- utf8_len = 0;
-
- /* No NULLs for non-zeros */
- if ((num_glyphs && glyphs == NULL) ||
- (utf8_len && utf8 == NULL) ||
- (num_clusters && clusters == NULL)) {
- _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
- return;
- }
-
- /* A -1 for utf8_len means NUL-terminated */
- if (utf8_len == -1)
- utf8_len = strlen (utf8);
-
- /* Apart from that, no negatives */
- if (num_glyphs < 0 || utf8_len < 0 || num_clusters < 0) {
- _cairo_set_error (cr, CAIRO_STATUS_NEGATIVE_COUNT);
- return;
- }
-
- if (num_glyphs == 0 && utf8_len == 0)
- return;
-
- if (utf8) {
- /* Make sure clusters cover the entire glyphs and utf8 arrays,
- * and that cluster boundaries are UTF-8 boundaries. */
- status = _cairo_validate_text_clusters (utf8, utf8_len,
- glyphs, num_glyphs,
- clusters, num_clusters, cluster_flags);
- if (status == CAIRO_STATUS_INVALID_CLUSTERS) {
- /* Either got invalid UTF-8 text, or cluster mapping is bad.
- * Differentiate those. */
-
- cairo_status_t status2;
-
- status2 = _cairo_utf8_to_ucs4 (utf8, utf8_len, NULL, NULL);
- if (status2)
- status = status2;
- } else {
- cairo_glyph_text_info_t info;
-
- info.utf8 = utf8;
- info.utf8_len = utf8_len;
- info.clusters = clusters;
- info.num_clusters = num_clusters;
- info.cluster_flags = cluster_flags;
-
- status = cr->backend->glyphs (cr, glyphs, num_glyphs, &info);
- }
- } else {
- status = cr->backend->glyphs (cr, glyphs, num_glyphs, NULL);
- }
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_text_path:
- * @cr: a cairo context
- * @utf8: a NUL-terminated string of text encoded in UTF-8, or %NULL
- *
- * Adds closed paths for text to the current path. The generated
- * path if filled, achieves an effect similar to that of
- * cairo_show_text().
- *
- * Text conversion and positioning is done similar to cairo_show_text().
- *
- * Like cairo_show_text(), After this call the current point is
- * moved to the origin of where the next glyph would be placed in
- * this same progression. That is, the current point will be at
- * the origin of the final glyph offset by its advance values.
- * This allows for chaining multiple calls to to cairo_text_path()
- * without having to set current point in between.
- *
- * Note: The cairo_text_path() function call is part of what the cairo
- * designers call the "toy" text API. It is convenient for short demos
- * and simple programs, but it is not expected to be adequate for
- * serious text-using applications. See cairo_glyph_path() for the
- * "real" text path API in cairo.
- *
- * Since: 1.0
- **/
-void
-cairo_text_path (cairo_t *cr, const char *utf8)
-{
- cairo_status_t status;
- cairo_text_extents_t extents;
- cairo_glyph_t stack_glyphs[CAIRO_STACK_ARRAY_LENGTH (cairo_glyph_t)];
- cairo_glyph_t *glyphs, *last_glyph;
- cairo_scaled_font_t *scaled_font;
- int num_glyphs;
- double x, y;
-
- if (unlikely (cr->status))
- return;
-
- if (utf8 == NULL)
- return;
-
-
- glyphs = stack_glyphs;
- num_glyphs = ARRAY_LENGTH (stack_glyphs);
-
- scaled_font = cairo_get_scaled_font (cr);
- if (unlikely (scaled_font->status)) {
- _cairo_set_error (cr, scaled_font->status);
- return;
- }
-
- cairo_get_current_point (cr, &x, &y);
- status = cairo_scaled_font_text_to_glyphs (scaled_font,
- x, y,
- utf8, -1,
- &glyphs, &num_glyphs,
- NULL, NULL, NULL);
-
- if (num_glyphs == 0)
- return;
-
- status = cr->backend->glyph_path (cr, glyphs, num_glyphs);
-
- if (unlikely (status))
- goto BAIL;
-
- last_glyph = &glyphs[num_glyphs - 1];
- status = cr->backend->glyph_extents (cr, last_glyph, 1, &extents);
-
- if (unlikely (status))
- goto BAIL;
-
- x = last_glyph->x + extents.x_advance;
- y = last_glyph->y + extents.y_advance;
- cr->backend->move_to (cr, x, y);
-
- BAIL:
- if (glyphs != stack_glyphs)
- cairo_glyph_free (glyphs);
-
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_glyph_path:
- * @cr: a cairo context
- * @glyphs: array of glyphs to show
- * @num_glyphs: number of glyphs to show
- *
- * Adds closed paths for the glyphs to the current path. The generated
- * path if filled, achieves an effect similar to that of
- * cairo_show_glyphs().
- *
- * Since: 1.0
- **/
-void
-cairo_glyph_path (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- if (num_glyphs == 0)
- return;
-
- if (unlikely (num_glyphs < 0)) {
- _cairo_set_error (cr, CAIRO_STATUS_NEGATIVE_COUNT);
- return;
- }
-
- if (unlikely (glyphs == NULL)) {
- _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
- return;
- }
-
- status = cr->backend->glyph_path (cr, glyphs, num_glyphs);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_get_operator:
- * @cr: a cairo context
- *
- * Gets the current compositing operator for a cairo context.
- *
- * Return value: the current compositing operator.
- *
- * Since: 1.0
- **/
-cairo_operator_t
-cairo_get_operator (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return CAIRO_GSTATE_OPERATOR_DEFAULT;
-
- return cr->backend->get_operator (cr);
-}
-
-#if 0
-/**
- * cairo_get_opacity:
- * @cr: a cairo context
- *
- * Gets the current compositing opacity for a cairo context.
- *
- * Return value: the current compositing opacity.
- *
- * Since: TBD
- **/
-double
-cairo_get_opacity (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return 1.;
-
- return cr->backend->get_opacity (cr);
-}
-#endif
-
-/**
- * cairo_get_tolerance:
- * @cr: a cairo context
- *
- * Gets the current tolerance value, as set by cairo_set_tolerance().
- *
- * Return value: the current tolerance value.
- *
- * Since: 1.0
- **/
-double
-cairo_get_tolerance (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return CAIRO_GSTATE_TOLERANCE_DEFAULT;
-
- return cr->backend->get_tolerance (cr);
-}
-slim_hidden_def (cairo_get_tolerance);
-
-/**
- * cairo_get_antialias:
- * @cr: a cairo context
- *
- * Gets the current shape antialiasing mode, as set by
- * cairo_set_antialias().
- *
- * Return value: the current shape antialiasing mode.
- *
- * Since: 1.0
- **/
-cairo_antialias_t
-cairo_get_antialias (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return CAIRO_ANTIALIAS_DEFAULT;
-
- return cr->backend->get_antialias (cr);
-}
-
-/**
- * cairo_has_current_point:
- * @cr: a cairo context
- *
- * Returns whether a current point is defined on the current path.
- * See cairo_get_current_point() for details on the current point.
- *
- * Return value: whether a current point is defined.
- *
- * Since: 1.6
- **/
-cairo_bool_t
-cairo_has_current_point (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return FALSE;
-
- return cr->backend->has_current_point (cr);
-}
-
-/**
- * cairo_get_current_point:
- * @cr: a cairo context
- * @x: return value for X coordinate of the current point
- * @y: return value for Y coordinate of the current point
- *
- * Gets the current point of the current path, which is
- * conceptually the final point reached by the path so far.
- *
- * The current point is returned in the user-space coordinate
- * system. If there is no defined current point or if @cr is in an
- * error status, @x and @y will both be set to 0.0. It is possible to
- * check this in advance with cairo_has_current_point().
- *
- * Most path construction functions alter the current point. See the
- * following for details on how they affect the current point:
- * cairo_new_path(), cairo_new_sub_path(),
- * cairo_append_path(), cairo_close_path(),
- * cairo_move_to(), cairo_line_to(), cairo_curve_to(),
- * cairo_rel_move_to(), cairo_rel_line_to(), cairo_rel_curve_to(),
- * cairo_arc(), cairo_arc_negative(), cairo_rectangle(),
- * cairo_text_path(), cairo_glyph_path(), cairo_stroke_to_path().
- *
- * Some functions use and alter the current point but do not
- * otherwise change current path:
- * cairo_show_text().
- *
- * Some functions unset the current path and as a result, current point:
- * cairo_fill(), cairo_stroke().
- *
- * Since: 1.0
- **/
-void
-cairo_get_current_point (cairo_t *cr, double *x_ret, double *y_ret)
-{
- double x, y;
-
- x = y = 0;
- if (cr->status == CAIRO_STATUS_SUCCESS &&
- cr->backend->has_current_point (cr))
- {
- cr->backend->get_current_point (cr, &x, &y);
- }
-
- if (x_ret)
- *x_ret = x;
- if (y_ret)
- *y_ret = y;
-}
-slim_hidden_def(cairo_get_current_point);
-
-/**
- * cairo_get_fill_rule:
- * @cr: a cairo context
- *
- * Gets the current fill rule, as set by cairo_set_fill_rule().
- *
- * Return value: the current fill rule.
- *
- * Since: 1.0
- **/
-cairo_fill_rule_t
-cairo_get_fill_rule (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return CAIRO_GSTATE_FILL_RULE_DEFAULT;
-
- return cr->backend->get_fill_rule (cr);
-}
-
-/**
- * cairo_get_line_width:
- * @cr: a cairo context
- *
- * This function returns the current line width value exactly as set by
- * cairo_set_line_width(). Note that the value is unchanged even if
- * the CTM has changed between the calls to cairo_set_line_width() and
- * cairo_get_line_width().
- *
- * Return value: the current line width.
- *
- * Since: 1.0
- **/
-double
-cairo_get_line_width (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return CAIRO_GSTATE_LINE_WIDTH_DEFAULT;
-
- return cr->backend->get_line_width (cr);
-}
-slim_hidden_def (cairo_get_line_width);
-
-/**
- * cairo_get_line_cap:
- * @cr: a cairo context
- *
- * Gets the current line cap style, as set by cairo_set_line_cap().
- *
- * Return value: the current line cap style.
- *
- * Since: 1.0
- **/
-cairo_line_cap_t
-cairo_get_line_cap (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return CAIRO_GSTATE_LINE_CAP_DEFAULT;
-
- return cr->backend->get_line_cap (cr);
-}
-
-/**
- * cairo_get_line_join:
- * @cr: a cairo context
- *
- * Gets the current line join style, as set by cairo_set_line_join().
- *
- * Return value: the current line join style.
- *
- * Since: 1.0
- **/
-cairo_line_join_t
-cairo_get_line_join (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return CAIRO_GSTATE_LINE_JOIN_DEFAULT;
-
- return cr->backend->get_line_join (cr);
-}
-
-/**
- * cairo_get_miter_limit:
- * @cr: a cairo context
- *
- * Gets the current miter limit, as set by cairo_set_miter_limit().
- *
- * Return value: the current miter limit.
- *
- * Since: 1.0
- **/
-double
-cairo_get_miter_limit (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return CAIRO_GSTATE_MITER_LIMIT_DEFAULT;
-
- return cr->backend->get_miter_limit (cr);
-}
-
-/**
- * cairo_get_matrix:
- * @cr: a cairo context
- * @matrix: return value for the matrix
- *
- * Stores the current transformation matrix (CTM) into @matrix.
- *
- * Since: 1.0
- **/
-void
-cairo_get_matrix (cairo_t *cr, cairo_matrix_t *matrix)
-{
- if (unlikely (cr->status)) {
- cairo_matrix_init_identity (matrix);
- return;
- }
-
- cr->backend->get_matrix (cr, matrix);
-}
-slim_hidden_def (cairo_get_matrix);
-
-/**
- * cairo_get_target:
- * @cr: a cairo context
- *
- * Gets the target surface for the cairo context as passed to
- * cairo_create().
- *
- * This function will always return a valid pointer, but the result
- * can be a "nil" surface if @cr is already in an error state,
- * (ie. cairo_status() <literal>!=</literal> %CAIRO_STATUS_SUCCESS).
- * A nil surface is indicated by cairo_surface_status()
- * <literal>!=</literal> %CAIRO_STATUS_SUCCESS.
- *
- * Return value: the target surface. This object is owned by cairo. To
- * keep a reference to it, you must call cairo_surface_reference().
- *
- * Since: 1.0
- **/
-cairo_surface_t *
-cairo_get_target (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return _cairo_surface_create_in_error (cr->status);
-
- return cr->backend->get_original_target (cr);
-}
-slim_hidden_def (cairo_get_target);
-
-/**
- * cairo_get_group_target:
- * @cr: a cairo context
- *
- * Gets the current destination surface for the context. This is either
- * the original target surface as passed to cairo_create() or the target
- * surface for the current group as started by the most recent call to
- * cairo_push_group() or cairo_push_group_with_content().
- *
- * This function will always return a valid pointer, but the result
- * can be a "nil" surface if @cr is already in an error state,
- * (ie. cairo_status() <literal>!=</literal> %CAIRO_STATUS_SUCCESS).
- * A nil surface is indicated by cairo_surface_status()
- * <literal>!=</literal> %CAIRO_STATUS_SUCCESS.
- *
- * Return value: the target surface. This object is owned by cairo. To
- * keep a reference to it, you must call cairo_surface_reference().
- *
- * Since: 1.2
- **/
-cairo_surface_t *
-cairo_get_group_target (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return _cairo_surface_create_in_error (cr->status);
-
- return cr->backend->get_current_target (cr);
-}
-
-/**
- * cairo_copy_path:
- * @cr: a cairo context
- *
- * Creates a copy of the current path and returns it to the user as a
- * #cairo_path_t. See #cairo_path_data_t for hints on how to iterate
- * over the returned data structure.
- *
- * This function will always return a valid pointer, but the result
- * will have no data (<literal>data==%NULL</literal> and
- * <literal>num_data==0</literal>), if either of the following
- * conditions hold:
- *
- * <orderedlist>
- * <listitem>If there is insufficient memory to copy the path. In this
- * case <literal>path->status</literal> will be set to
- * %CAIRO_STATUS_NO_MEMORY.</listitem>
- * <listitem>If @cr is already in an error state. In this case
- * <literal>path->status</literal> will contain the same status that
- * would be returned by cairo_status().</listitem>
- * </orderedlist>
- *
- * Return value: the copy of the current path. The caller owns the
- * returned object and should call cairo_path_destroy() when finished
- * with it.
- *
- * Since: 1.0
- **/
-cairo_path_t *
-cairo_copy_path (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return _cairo_path_create_in_error (cr->status);
-
- return cr->backend->copy_path (cr);
-}
-
-/**
- * cairo_copy_path_flat:
- * @cr: a cairo context
- *
- * Gets a flattened copy of the current path and returns it to the
- * user as a #cairo_path_t. See #cairo_path_data_t for hints on
- * how to iterate over the returned data structure.
- *
- * This function is like cairo_copy_path() except that any curves
- * in the path will be approximated with piecewise-linear
- * approximations, (accurate to within the current tolerance
- * value). That is, the result is guaranteed to not have any elements
- * of type %CAIRO_PATH_CURVE_TO which will instead be replaced by a
- * series of %CAIRO_PATH_LINE_TO elements.
- *
- * This function will always return a valid pointer, but the result
- * will have no data (<literal>data==%NULL</literal> and
- * <literal>num_data==0</literal>), if either of the following
- * conditions hold:
- *
- * <orderedlist>
- * <listitem>If there is insufficient memory to copy the path. In this
- * case <literal>path->status</literal> will be set to
- * %CAIRO_STATUS_NO_MEMORY.</listitem>
- * <listitem>If @cr is already in an error state. In this case
- * <literal>path->status</literal> will contain the same status that
- * would be returned by cairo_status().</listitem>
- * </orderedlist>
- *
- * Return value: the copy of the current path. The caller owns the
- * returned object and should call cairo_path_destroy() when finished
- * with it.
- *
- * Since: 1.0
- **/
-cairo_path_t *
-cairo_copy_path_flat (cairo_t *cr)
-{
- if (unlikely (cr->status))
- return _cairo_path_create_in_error (cr->status);
-
- return cr->backend->copy_path_flat (cr);
-}
-
-/**
- * cairo_append_path:
- * @cr: a cairo context
- * @path: path to be appended
- *
- * Append the @path onto the current path. The @path may be either the
- * return value from one of cairo_copy_path() or
- * cairo_copy_path_flat() or it may be constructed manually. See
- * #cairo_path_t for details on how the path data structure should be
- * initialized, and note that <literal>path->status</literal> must be
- * initialized to %CAIRO_STATUS_SUCCESS.
- *
- * Since: 1.0
- **/
-void
-cairo_append_path (cairo_t *cr,
- const cairo_path_t *path)
-{
- cairo_status_t status;
-
- if (unlikely (cr->status))
- return;
-
- if (unlikely (path == NULL)) {
- _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
- return;
- }
-
- if (unlikely (path->status)) {
- if (path->status > CAIRO_STATUS_SUCCESS &&
- path->status <= CAIRO_STATUS_LAST_STATUS)
- _cairo_set_error (cr, path->status);
- else
- _cairo_set_error (cr, CAIRO_STATUS_INVALID_STATUS);
- return;
- }
-
- if (path->num_data == 0)
- return;
-
- if (unlikely (path->data == NULL)) {
- _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
- return;
- }
-
- status = cr->backend->append_path (cr, path);
- if (unlikely (status))
- _cairo_set_error (cr, status);
-}
-
-/**
- * cairo_status:
- * @cr: a cairo context
- *
- * Checks whether an error has previously occurred for this context.
- *
- * Returns: the current status of this context, see #cairo_status_t
- *
- * Since: 1.0
- **/
-cairo_status_t
-cairo_status (cairo_t *cr)
-{
- return cr->status;
-}
-slim_hidden_def (cairo_status);