/* LIBPIKA - The PIKA Library * Copyright (C) 1995-2003 Peter Mattis and Spencer Kimball * * pikavectors_pdb.c * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ /* NOTE: This file is auto-generated by pdbgen.pl */ #include "config.h" #include "stamp-pdbgen.h" #include "pika.h" /** * SECTION: pikavectors * @title: pikavectors * @short_description: Functions for querying and manipulating vectors. * * Functions for querying and manipulating vectors. **/ /** * pika_vectors_new: * @image: The image. * @name: the name of the new vector object. * * Creates a new empty vectors object. * * Creates a new empty vectors object. The vectors object needs to be * added to the image using pika_image_insert_vectors(). * * Returns: (transfer none): * the current vector object, 0 if no vector exists in the image. * * Since: 2.4 **/ PikaVectors * pika_vectors_new (PikaImage *image, const gchar *name) { PikaValueArray *args; PikaValueArray *return_vals; PikaVectors *vectors = NULL; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_IMAGE, image, G_TYPE_STRING, name, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-new", args); pika_value_array_unref (args); if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) vectors = PIKA_VALUES_GET_VECTORS (return_vals, 1); pika_value_array_unref (return_vals); return vectors; } /** * pika_vectors_new_from_text_layer: * @image: The image. * @layer: The text layer. * * Creates a new vectors object from a text layer. * * Creates a new vectors object from a text layer. The vectors object * needs to be added to the image using pika_image_insert_vectors(). * * Returns: (transfer none): The vectors of the text layer. * * Since: 2.6 **/ PikaVectors * pika_vectors_new_from_text_layer (PikaImage *image, PikaLayer *layer) { PikaValueArray *args; PikaValueArray *return_vals; PikaVectors *vectors = NULL; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_IMAGE, image, PIKA_TYPE_LAYER, layer, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-new-from-text-layer", args); pika_value_array_unref (args); if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) vectors = PIKA_VALUES_GET_VECTORS (return_vals, 1); pika_value_array_unref (return_vals); return vectors; } /** * pika_vectors_copy: * @vectors: The vectors object to copy. * * Copy a vectors object. * * This procedure copies the specified vectors object and returns the * copy. * * Returns: (transfer none): The newly copied vectors object. * * Since: 2.6 **/ PikaVectors * pika_vectors_copy (PikaVectors *vectors) { PikaValueArray *args; PikaValueArray *return_vals; PikaVectors *vectors_copy = NULL; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-copy", args); pika_value_array_unref (args); if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) vectors_copy = PIKA_VALUES_GET_VECTORS (return_vals, 1); pika_value_array_unref (return_vals); return vectors_copy; } /** * pika_vectors_get_strokes: * @vectors: The vectors object. * @num_strokes: (out): The number of strokes returned. * * List the strokes associated with the passed path. * * Returns an Array with the stroke-IDs associated with the passed * path. * * Returns: (array length=num_strokes) (element-type gint32) (transfer full): * List of the strokes belonging to the path. * The returned value must be freed with g_free(). * * Since: 2.4 **/ gint * pika_vectors_get_strokes (PikaVectors *vectors, gint *num_strokes) { PikaValueArray *args; PikaValueArray *return_vals; gint *stroke_ids = NULL; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-get-strokes", args); pika_value_array_unref (args); *num_strokes = 0; if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) { *num_strokes = PIKA_VALUES_GET_INT (return_vals, 1); stroke_ids = PIKA_VALUES_DUP_INT32_ARRAY (return_vals, 2); } pika_value_array_unref (return_vals); return stroke_ids; } /** * pika_vectors_stroke_get_length: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @precision: The precision used for approximating straight portions of the stroke. * * Measure the length of the given stroke. * * Measure the length of the given stroke. * * Returns: The length (in pixels) of the given stroke. * * Since: 2.4 **/ gdouble pika_vectors_stroke_get_length (PikaVectors *vectors, gint stroke_id, gdouble precision) { PikaValueArray *args; PikaValueArray *return_vals; gdouble length = 0.0; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_DOUBLE, precision, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-get-length", args); pika_value_array_unref (args); if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) length = PIKA_VALUES_GET_DOUBLE (return_vals, 1); pika_value_array_unref (return_vals); return length; } /** * pika_vectors_stroke_get_point_at_dist: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @dist: The given distance. * @precision: The precision used for the approximation. * @x_point: (out): The x position of the point. * @y_point: (out): The y position of the point. * @slope: (out): The slope (dy / dx) at the specified point. * @valid: (out): Indicator for the validity of the returned data. * * Get point at a specified distance along the stroke. * * This will return the x,y position of a point at a given distance * along the stroke. The distance will be obtained by first digitizing * the curve internally and then walking along the curve. For a closed * stroke the start of the path is the first point on the path that was * created. This might not be obvious. If the stroke is not long * enough, a \"valid\" flag will be FALSE. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_stroke_get_point_at_dist (PikaVectors *vectors, gint stroke_id, gdouble dist, gdouble precision, gdouble *x_point, gdouble *y_point, gdouble *slope, gboolean *valid) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_DOUBLE, dist, G_TYPE_DOUBLE, precision, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-get-point-at-dist", args); pika_value_array_unref (args); *x_point = 0.0; *y_point = 0.0; *slope = 0.0; *valid = FALSE; success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; if (success) { *x_point = PIKA_VALUES_GET_DOUBLE (return_vals, 1); *y_point = PIKA_VALUES_GET_DOUBLE (return_vals, 2); *slope = PIKA_VALUES_GET_DOUBLE (return_vals, 3); *valid = PIKA_VALUES_GET_BOOLEAN (return_vals, 4); } pika_value_array_unref (return_vals); return success; } /** * pika_vectors_remove_stroke: * @vectors: The vectors object. * @stroke_id: The stroke ID. * * remove the stroke from a vectors object. * * Remove the stroke from a vectors object. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_remove_stroke (PikaVectors *vectors, gint stroke_id) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-remove-stroke", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_stroke_close: * @vectors: The vectors object. * @stroke_id: The stroke ID. * * closes the specified stroke. * * Closes the specified stroke. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_stroke_close (PikaVectors *vectors, gint stroke_id) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-close", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_stroke_reverse: * @vectors: The vectors object. * @stroke_id: The stroke ID. * * reverses the specified stroke. * * Reverses the specified stroke. * * Returns: TRUE on success. * * Since: 3.0 **/ gboolean pika_vectors_stroke_reverse (PikaVectors *vectors, gint stroke_id) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-reverse", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_stroke_translate: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @off_x: Offset in x direction. * @off_y: Offset in y direction. * * translate the given stroke. * * Translate the given stroke. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_stroke_translate (PikaVectors *vectors, gint stroke_id, gdouble off_x, gdouble off_y) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_DOUBLE, off_x, G_TYPE_DOUBLE, off_y, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-translate", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_stroke_scale: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @scale_x: Scale factor in x direction. * @scale_y: Scale factor in y direction. * * scales the given stroke. * * Scale the given stroke. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_stroke_scale (PikaVectors *vectors, gint stroke_id, gdouble scale_x, gdouble scale_y) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_DOUBLE, scale_x, G_TYPE_DOUBLE, scale_y, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-scale", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_stroke_rotate: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @center_x: X coordinate of the rotation center. * @center_y: Y coordinate of the rotation center. * @angle: angle to rotate about. * * rotates the given stroke. * * Rotates the given stroke around given center by angle (in degrees). * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_stroke_rotate (PikaVectors *vectors, gint stroke_id, gdouble center_x, gdouble center_y, gdouble angle) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_DOUBLE, center_x, G_TYPE_DOUBLE, center_y, G_TYPE_DOUBLE, angle, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-rotate", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_stroke_flip: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @flip_type: Flip orientation, either vertical or horizontal. * @axis: axis coordinate about which to flip, in pixels. * * flips the given stroke. * * Rotates the given stroke around given center by angle (in degrees). * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_stroke_flip (PikaVectors *vectors, gint stroke_id, PikaOrientationType flip_type, gdouble axis) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, PIKA_TYPE_ORIENTATION_TYPE, flip_type, G_TYPE_DOUBLE, axis, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-flip", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_stroke_flip_free: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @x1: X coordinate of the first point of the flipping axis. * @y1: Y coordinate of the first point of the flipping axis. * @x2: X coordinate of the second point of the flipping axis. * @y2: Y coordinate of the second point of the flipping axis. * * flips the given stroke about an arbitrary axis. * * Flips the given stroke about an arbitrary axis. Axis is defined by * two coordinates in the image (in pixels), through which the flipping * axis passes. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_stroke_flip_free (PikaVectors *vectors, gint stroke_id, gdouble x1, gdouble y1, gdouble x2, gdouble y2) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_DOUBLE, x1, G_TYPE_DOUBLE, y1, G_TYPE_DOUBLE, x2, G_TYPE_DOUBLE, y2, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-flip-free", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_stroke_get_points: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @num_points: (out): The number of floats returned. * @controlpoints: (out) (array length=num_points) (element-type gdouble) (transfer full): List of the control points for the stroke (x0, y0, x1, y1, ...). * @closed: (out): Whether the stroke is closed or not. * * returns the control points of a stroke. * * returns the control points of a stroke. The interpretation of the * coordinates returned depends on the type of the stroke. For Pika 2.4 * this is always a bezier stroke, where the coordinates are the * control points. * * Returns: type of the stroke (always PIKA_VECTORS_STROKE_TYPE_BEZIER for now). * * Since: 2.4 **/ PikaVectorsStrokeType pika_vectors_stroke_get_points (PikaVectors *vectors, gint stroke_id, gint *num_points, gdouble **controlpoints, gboolean *closed) { PikaValueArray *args; PikaValueArray *return_vals; PikaVectorsStrokeType type = 0; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-get-points", args); pika_value_array_unref (args); *num_points = 0; if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) { type = PIKA_VALUES_GET_ENUM (return_vals, 1); *num_points = PIKA_VALUES_GET_INT (return_vals, 2); *controlpoints = PIKA_VALUES_DUP_FLOAT_ARRAY (return_vals, 3); *closed = PIKA_VALUES_GET_BOOLEAN (return_vals, 4); } pika_value_array_unref (return_vals); return type; } /** * pika_vectors_stroke_new_from_points: * @vectors: The vectors object. * @type: type of the stroke (always PIKA_VECTORS_STROKE_TYPE_BEZIER for now). * @num_points: The number of elements in the array, i.e. the number of controlpoints in the stroke * 2 (x- and y-coordinate). * @controlpoints: (array length=num_points) (element-type gdouble): List of the x- and y-coordinates of the control points. * @closed: Whether the stroke is to be closed or not. * * Adds a stroke of a given type to the vectors object. * * Adds a stroke of a given type to the vectors object. The coordinates * of the control points can be specified. For now only strokes of the * type PIKA_VECTORS_STROKE_TYPE_BEZIER are supported. The control * points are specified as a pair of float values for the x- and * y-coordinate. The Bezier stroke type needs a multiple of three * control points. Each Bezier segment endpoint (anchor, A) has two * additional control points (C) associated. They are specified in the * order CACCACCAC... * * Returns: The stroke ID of the newly created stroke. * * Since: 2.4 **/ gint pika_vectors_stroke_new_from_points (PikaVectors *vectors, PikaVectorsStrokeType type, gint num_points, const gdouble *controlpoints, gboolean closed) { PikaValueArray *args; PikaValueArray *return_vals; gint stroke_id = 0; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, PIKA_TYPE_VECTORS_STROKE_TYPE, type, G_TYPE_INT, num_points, PIKA_TYPE_FLOAT_ARRAY, NULL, G_TYPE_BOOLEAN, closed, G_TYPE_NONE); pika_value_set_float_array (pika_value_array_index (args, 3), controlpoints, num_points); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-new-from-points", args); pika_value_array_unref (args); if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) stroke_id = PIKA_VALUES_GET_INT (return_vals, 1); pika_value_array_unref (return_vals); return stroke_id; } /** * pika_vectors_stroke_interpolate: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @precision: The precision used for the approximation. * @num_coords: (out): The number of floats returned. * @closed: (out): Whether the stroke is closed or not. * * returns polygonal approximation of the stroke. * * returns polygonal approximation of the stroke. * * Returns: (array length=num_coords) (element-type gdouble) (transfer full): * List of the coords along the path (x0, y0, x1, y1, ...). * The returned value must be freed with g_free(). * * Since: 2.4 **/ gdouble * pika_vectors_stroke_interpolate (PikaVectors *vectors, gint stroke_id, gdouble precision, gint *num_coords, gboolean *closed) { PikaValueArray *args; PikaValueArray *return_vals; gdouble *coords = NULL; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_DOUBLE, precision, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-stroke-interpolate", args); pika_value_array_unref (args); *num_coords = 0; if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) { *num_coords = PIKA_VALUES_GET_INT (return_vals, 1); coords = PIKA_VALUES_DUP_FLOAT_ARRAY (return_vals, 2); *closed = PIKA_VALUES_GET_BOOLEAN (return_vals, 3); } pika_value_array_unref (return_vals); return coords; } /** * pika_vectors_bezier_stroke_new_moveto: * @vectors: The vectors object. * @x0: The x-coordinate of the moveto. * @y0: The y-coordinate of the moveto. * * Adds a bezier stroke with a single moveto to the vectors object. * * Adds a bezier stroke with a single moveto to the vectors object. * * Returns: The resulting stroke. * * Since: 2.4 **/ gint pika_vectors_bezier_stroke_new_moveto (PikaVectors *vectors, gdouble x0, gdouble y0) { PikaValueArray *args; PikaValueArray *return_vals; gint stroke_id = 0; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_DOUBLE, x0, G_TYPE_DOUBLE, y0, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-bezier-stroke-new-moveto", args); pika_value_array_unref (args); if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) stroke_id = PIKA_VALUES_GET_INT (return_vals, 1); pika_value_array_unref (return_vals); return stroke_id; } /** * pika_vectors_bezier_stroke_lineto: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @x0: The x-coordinate of the lineto. * @y0: The y-coordinate of the lineto. * * Extends a bezier stroke with a lineto. * * Extends a bezier stroke with a lineto. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_bezier_stroke_lineto (PikaVectors *vectors, gint stroke_id, gdouble x0, gdouble y0) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_DOUBLE, x0, G_TYPE_DOUBLE, y0, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-bezier-stroke-lineto", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_bezier_stroke_conicto: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @x0: The x-coordinate of the control point. * @y0: The y-coordinate of the control point. * @x1: The x-coordinate of the end point. * @y1: The y-coordinate of the end point. * * Extends a bezier stroke with a conic bezier spline. * * Extends a bezier stroke with a conic bezier spline. Actually a cubic * bezier spline gets added that realizes the shape of a conic bezier * spline. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_bezier_stroke_conicto (PikaVectors *vectors, gint stroke_id, gdouble x0, gdouble y0, gdouble x1, gdouble y1) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_DOUBLE, x0, G_TYPE_DOUBLE, y0, G_TYPE_DOUBLE, x1, G_TYPE_DOUBLE, y1, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-bezier-stroke-conicto", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_bezier_stroke_cubicto: * @vectors: The vectors object. * @stroke_id: The stroke ID. * @x0: The x-coordinate of the first control point. * @y0: The y-coordinate of the first control point. * @x1: The x-coordinate of the second control point. * @y1: The y-coordinate of the second control point. * @x2: The x-coordinate of the end point. * @y2: The y-coordinate of the end point. * * Extends a bezier stroke with a cubic bezier spline. * * Extends a bezier stroke with a cubic bezier spline. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_bezier_stroke_cubicto (PikaVectors *vectors, gint stroke_id, gdouble x0, gdouble y0, gdouble x1, gdouble y1, gdouble x2, gdouble y2) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_INT, stroke_id, G_TYPE_DOUBLE, x0, G_TYPE_DOUBLE, y0, G_TYPE_DOUBLE, x1, G_TYPE_DOUBLE, y1, G_TYPE_DOUBLE, x2, G_TYPE_DOUBLE, y2, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-bezier-stroke-cubicto", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_bezier_stroke_new_ellipse: * @vectors: The vectors object. * @x0: The x-coordinate of the center. * @y0: The y-coordinate of the center. * @radius_x: The radius in x direction. * @radius_y: The radius in y direction. * @angle: The angle the x-axis of the ellipse (radians, counterclockwise). * * Adds a bezier stroke describing an ellipse the vectors object. * * Adds a bezier stroke describing an ellipse the vectors object. * * Returns: The resulting stroke. * * Since: 2.4 **/ gint pika_vectors_bezier_stroke_new_ellipse (PikaVectors *vectors, gdouble x0, gdouble y0, gdouble radius_x, gdouble radius_y, gdouble angle) { PikaValueArray *args; PikaValueArray *return_vals; gint stroke_id = 0; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_VECTORS, vectors, G_TYPE_DOUBLE, x0, G_TYPE_DOUBLE, y0, G_TYPE_DOUBLE, radius_x, G_TYPE_DOUBLE, radius_y, G_TYPE_DOUBLE, angle, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-bezier-stroke-new-ellipse", args); pika_value_array_unref (args); if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) stroke_id = PIKA_VALUES_GET_INT (return_vals, 1); pika_value_array_unref (return_vals); return stroke_id; } /** * pika_vectors_import_from_file: * @image: The image. * @file: The SVG file to import. * @merge: Merge paths into a single vectors object. * @scale: Scale the SVG to image dimensions. * @num_vectors: (out): The number of newly created vectors. * @vectors: (out) (array length=num_vectors) (element-type PikaVectors) (transfer container): The list of newly created vectors. * * Import paths from an SVG file. * * This procedure imports paths from an SVG file. SVG elements other * than paths and basic shapes are ignored. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_import_from_file (PikaImage *image, GFile *file, gboolean merge, gboolean scale, gint *num_vectors, PikaVectors ***vectors) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_IMAGE, image, G_TYPE_FILE, file, G_TYPE_BOOLEAN, merge, G_TYPE_BOOLEAN, scale, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-import-from-file", args); pika_value_array_unref (args); *num_vectors = 0; *vectors = NULL; success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; if (success) { *num_vectors = PIKA_VALUES_GET_INT (return_vals, 1); { PikaObjectArray *a = g_value_get_boxed (pika_value_array_index (return_vals, 2)); if (a) *vectors = g_memdup2 (a->data, a->length * sizeof (gpointer)); }; } pika_value_array_unref (return_vals); return success; } /** * pika_vectors_import_from_string: * @image: The image. * @string: A string that must be a complete and valid SVG document. * @length: Number of bytes in string or -1 if the string is NULL terminated. * @merge: Merge paths into a single vectors object. * @scale: Scale the SVG to image dimensions. * @num_vectors: (out): The number of newly created vectors. * @vectors: (out) (array length=num_vectors) (element-type PikaVectors) (transfer container): The list of newly created vectors. * * Import paths from an SVG string. * * This procedure works like pika_vectors_import_from_file() but takes * a string rather than reading the SVG from a file. This allows you to * write scripts that generate SVG and feed it to PIKA. * * Returns: TRUE on success. * * Since: 2.4 **/ gboolean pika_vectors_import_from_string (PikaImage *image, const gchar *string, gint length, gboolean merge, gboolean scale, gint *num_vectors, PikaVectors ***vectors) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_IMAGE, image, G_TYPE_STRING, string, G_TYPE_INT, length, G_TYPE_BOOLEAN, merge, G_TYPE_BOOLEAN, scale, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-import-from-string", args); pika_value_array_unref (args); *num_vectors = 0; *vectors = NULL; success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; if (success) { *num_vectors = PIKA_VALUES_GET_INT (return_vals, 1); { PikaObjectArray *a = g_value_get_boxed (pika_value_array_index (return_vals, 2)); if (a) *vectors = g_memdup2 (a->data, a->length * sizeof (gpointer)); }; } pika_value_array_unref (return_vals); return success; } /** * pika_vectors_export_to_file: * @image: The image. * @file: The SVG file to create. * @vectors: The vectors object to export, or %NULL for all in the image. * * save a path as an SVG file. * * This procedure creates an SVG file to save a Vectors object, that * is, a path. The resulting file can be edited using a vector graphics * application, or later reloaded into PIKA. Pass %NULL as the * 'vectors' argument to export all paths in the image. * * Returns: TRUE on success. * * Since: 2.6 **/ gboolean pika_vectors_export_to_file (PikaImage *image, GFile *file, PikaVectors *vectors) { PikaValueArray *args; PikaValueArray *return_vals; gboolean success = TRUE; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_IMAGE, image, G_TYPE_FILE, file, PIKA_TYPE_VECTORS, vectors, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-export-to-file", args); pika_value_array_unref (args); success = PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS; pika_value_array_unref (return_vals); return success; } /** * pika_vectors_export_to_string: * @image: The image. * @vectors: The vectors object to export, or %NULL for all in the image. * * Save a path as an SVG string. * * This procedure works like pika_vectors_export_to_file() but creates * a string rather than a file. The string is NULL-terminated and holds * a complete XML document. Pass %NULL as the 'vectors' argument to * export all paths in the image. * * Returns: (transfer full): * A string whose contents are a complete SVG document. * The returned value must be freed with g_free(). * * Since: 2.6 **/ gchar * pika_vectors_export_to_string (PikaImage *image, PikaVectors *vectors) { PikaValueArray *args; PikaValueArray *return_vals; gchar *string = NULL; args = pika_value_array_new_from_types (NULL, PIKA_TYPE_IMAGE, image, PIKA_TYPE_VECTORS, vectors, G_TYPE_NONE); return_vals = _pika_pdb_run_procedure_array (pika_get_pdb (), "pika-vectors-export-to-string", args); pika_value_array_unref (args); if (PIKA_VALUES_GET_ENUM (return_vals, 0) == PIKA_PDB_SUCCESS) string = PIKA_VALUES_DUP_STRING (return_vals, 1); pika_value_array_unref (return_vals); return string; }