10d7cf3273
* clutter/cogl/cogl-path.h: * clutter/cogl/common/cogl-primitives.c: * clutter/cogl/common/cogl-primitives.h: * clutter/cogl/gl/cogl-primitives.c: * clutter/cogl/gles/cogl-primitives.c: Changed the semantics of cogl_path_move_to. Previously this always started a new path but now it instead starts a new disjoint sub path. The path isn't cleared until you call either cogl_path_stroke, cogl_path_fill or cogl_path_new. There are also cogl_path_stroke_preserve and cogl_path_fill_preserve functions. * clutter/cogl/gl/cogl-context.c: * clutter/cogl/gl/cogl-context.h: * clutter/cogl/gles/cogl-context.c: * clutter/cogl/gles/cogl-context.h: Convert the path nodes array to a GArray. * clutter/cogl/gl/cogl-texture.c: * clutter/cogl/gles/cogl-texture.c: Call cogl_clip_ensure * clutter/cogl/common/cogl-clip-stack.c: * clutter/cogl/common/cogl-clip-stack.h: Simplified the clip stack code quite a bit to make it more maintainable. Previously whenever you added a new clip it would go through a separate route to immediately intersect with the current clip and when you removed it again it would immediately rebuild the entire clip. Now when you add or remove a clip it doesn't do anything immediately but just sets a dirty flag instead. * clutter/cogl/gl/cogl.c: * clutter/cogl/gles/cogl.c: Taken away the code to intersect stencil clips when there is exactly one stencil bit. It won't work with path clips and I don't know of any platform that doesn't have eight or zero stencil bits. It needs at least three bits to intersect a path with an existing clip. cogl_features_init now just decides you don't have a stencil buffer at all if you have less than three bits. * clutter/cogl/cogl.h.in: New functions and documentation. * tests/interactive/test-clip.c: Replaced with a different test that lets you add and remove clips. The three different mouse buttons add clips in different shapes. This makes it easier to test multiple levels of clipping. * tests/interactive/test-cogl-primitives.c: Use cogl_path_stroke_preserve when using the same path again. * doc/reference/cogl/cogl-sections.txt: Document the new functions.
359 lines
13 KiB
C
359 lines
13 KiB
C
/* cogl-path.h: Path primitives
|
|
* This file is part of Clutter
|
|
*
|
|
* Copyright (C) 2008 Intel Corporation.
|
|
*
|
|
* 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 2 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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#if !defined(__COGL_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
|
|
#error "Only <cogl/cogl.h> can be included directly."
|
|
#endif
|
|
|
|
#ifndef __COGL_PATH_H__
|
|
#define __COGL_PATH_H__
|
|
|
|
#include <cogl/cogl-types.h>
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
/**
|
|
* SECTION:cogl-primitives
|
|
* @short_description: Functions that draw various primitive shapes and
|
|
* allow for construction of more complex paths.
|
|
*
|
|
* There are three levels on which drawing with cogl can be used. The
|
|
* highest level functions construct various simple primitive shapes
|
|
* to be either filled or stroked. Using a lower-level set of functions
|
|
* more complex and arbitrary paths can be constructed by concatenating
|
|
* straight line, bezier curve and arc segments. Additionally there
|
|
* are utility functions that draw the most common primitives - rectangles
|
|
* and trapezoids - in a maximaly optimized fashion.
|
|
*
|
|
* When constructing arbitrary paths, the current pen location is
|
|
* initialized using the move_to command. The subsequent path segments
|
|
* implicitly use the last pen location as their first vertex and move
|
|
* the pen location to the last vertex they produce at the end. Also
|
|
* there are special versions of functions that allow specifying the
|
|
* vertices of the path segments relative to the last pen location
|
|
* rather then in the absolute coordinates.
|
|
*/
|
|
|
|
/**
|
|
* cogl_rectangle:
|
|
* @x: X coordinate of the top-left corner
|
|
* @y: Y coordinate of the top-left corner
|
|
* @width: Width of the rectangle
|
|
* @height: Height of the rectangle
|
|
*
|
|
* Fills a rectangle at the given coordinates with the current
|
|
* drawing color in a highly optimizied fashion.
|
|
**/
|
|
void cogl_rectangle (gint x,
|
|
gint y,
|
|
guint width,
|
|
guint height);
|
|
|
|
/**
|
|
* cogl_rectanglex:
|
|
* @x: X coordinate of the top-left corner
|
|
* @y: Y coordinate of the top-left corner
|
|
* @width: Width of the rectangle
|
|
* @height: Height of the rectangle
|
|
*
|
|
* A fixed-point version of cogl_fast_fill_rectangle.
|
|
**/
|
|
void cogl_rectanglex (CoglFixed x,
|
|
CoglFixed y,
|
|
CoglFixed width,
|
|
CoglFixed height);
|
|
|
|
/**
|
|
* cogl_path_fill:
|
|
*
|
|
* Fills the constructed shape using the current drawing color. The
|
|
* current path is then cleared. To use the path again, call
|
|
* cogl_path_fill_preserve() instead.
|
|
**/
|
|
void cogl_path_fill (void);
|
|
|
|
/**
|
|
* cogl_path_fill_preserve:
|
|
*
|
|
* Fills the constructed shape using the current drawing color and
|
|
* preserves the path to be used again.
|
|
*
|
|
* Since: 1.0
|
|
**/
|
|
void cogl_path_fill_preserve (void);
|
|
|
|
/**
|
|
* cogl_path_stroke:
|
|
*
|
|
* Strokes the constructed shape using the current drawing color and a
|
|
* width of 1 pixel (regardless of the current transformation
|
|
* matrix). To current path is then cleared. To use the path again,
|
|
* call cogl_path_stroke_preserve() instead.
|
|
**/
|
|
void cogl_path_stroke (void);
|
|
|
|
|
|
/**
|
|
* cogl_path_stroke_preserve:
|
|
*
|
|
* Strokes the constructed shape using the current drawing color and
|
|
* preserves the path to be used again.
|
|
*
|
|
* Since: 1.0
|
|
**/
|
|
void cogl_path_stroke_preserve (void);
|
|
|
|
/**
|
|
* cogl_path_new:
|
|
*
|
|
* Clears the current path and starts a new one.
|
|
*
|
|
* Since: 1.0
|
|
*/
|
|
void cogl_path_new (void);
|
|
|
|
/**
|
|
* cogl_path_move_to:
|
|
* @x: X coordinate of the pen location to move to.
|
|
* @y: Y coordinate of the pen location to move to.
|
|
*
|
|
* Moves the pen to the given location. If there is an existing path
|
|
* this will start a new disjoint subpath.
|
|
**/
|
|
void cogl_path_move_to (CoglFixed x,
|
|
CoglFixed y);
|
|
|
|
|
|
/**
|
|
* cogl_path_rel_move_to:
|
|
* @x: X offset from the current pen location to move the pen to.
|
|
* @y: Y offset from the current pen location to move the pen to.
|
|
*
|
|
* Moves the pen to the given offset relative to the current pen
|
|
* location. If there is an existing path this will start a new
|
|
* disjoint subpath.
|
|
**/
|
|
void cogl_path_rel_move_to (CoglFixed x,
|
|
CoglFixed y);
|
|
|
|
/**
|
|
* cogl_path_line_to:
|
|
* @x: X coordinate of the end line vertex
|
|
* @y: Y coordinate of the end line vertex
|
|
*
|
|
* Adds a straight line segment to the current path that ends at the
|
|
* given coordinates.
|
|
**/
|
|
void cogl_path_line_to (CoglFixed x,
|
|
CoglFixed y);
|
|
|
|
/**
|
|
* cogl_path_rel_line_to:
|
|
* @x: X offset from the current pen location of the end line vertex
|
|
* @y: Y offset from the current pen location of the end line vertex
|
|
*
|
|
* Adds a straight line segment to the current path that ends at the
|
|
* given coordinates relative to the current pen location.
|
|
**/
|
|
void cogl_path_rel_line_to (CoglFixed x,
|
|
CoglFixed y);
|
|
|
|
|
|
/**
|
|
* cogl_path_arc:
|
|
* @center_x: X coordinate of the elliptical arc center
|
|
* @center_y: Y coordinate of the elliptical arc center
|
|
* @radius_x: X radius of the elliptical arc
|
|
* @radius_y: Y radious of the elliptical arc
|
|
* @angle_1: Angle in the unit-circle at which the arc begin
|
|
* @angle_2: Angle in the unit-circle at which the arc ends
|
|
*
|
|
* Adds an elliptical arc segment to the current path. A straight line
|
|
* segment will link the current pen location with the first vertex
|
|
* of the arc. If you perform a move_to to the arcs start just before
|
|
* drawing it you create a free standing arc.
|
|
**/
|
|
void cogl_path_arc (CoglFixed center_x,
|
|
CoglFixed center_y,
|
|
CoglFixed radius_x,
|
|
CoglFixed radius_y,
|
|
CoglAngle angle_1,
|
|
CoglAngle angle_2);
|
|
|
|
|
|
|
|
/**
|
|
* cogl_path_curve_to:
|
|
* @x1: X coordinate of the second bezier control point
|
|
* @y1: Y coordinate of the second bezier control point
|
|
* @x2: X coordinate of the third bezier control point
|
|
* @y2: Y coordinate of the third bezier control point
|
|
* @x3: X coordinate of the fourth bezier control point
|
|
* @y3: Y coordinate of the fourth bezier control point
|
|
*
|
|
* Adds a cubic bezier curve segment to the current path with the given
|
|
* second, third and fourth control points and using current pen location
|
|
* as the first control point.
|
|
**/
|
|
void cogl_path_curve_to (CoglFixed x1,
|
|
CoglFixed y1,
|
|
CoglFixed x2,
|
|
CoglFixed y2,
|
|
CoglFixed x3,
|
|
CoglFixed y3);
|
|
|
|
/**
|
|
* cogl_path_rel_curve_to:
|
|
* @x1: X coordinate of the second bezier control point
|
|
* @y1: Y coordinate of the second bezier control point
|
|
* @x2: X coordinate of the third bezier control point
|
|
* @y2: Y coordinate of the third bezier control point
|
|
* @x3: X coordinate of the fourth bezier control point
|
|
* @y3: Y coordinate of the fourth bezier control point
|
|
*
|
|
* Adds a cubic bezier curve segment to the current path with the given
|
|
* second, third and fourth control points and using current pen location
|
|
* as the first control point. The given coordinates are relative to the
|
|
* current pen location.
|
|
*/
|
|
void cogl_path_rel_curve_to (CoglFixed x1,
|
|
CoglFixed y1,
|
|
CoglFixed x2,
|
|
CoglFixed y2,
|
|
CoglFixed x3,
|
|
CoglFixed y3);
|
|
|
|
/**
|
|
* cogl_path_close:
|
|
*
|
|
* Closes the path being constructed by adding a straight line segment
|
|
* to it that ends at the first vertex of the path.
|
|
**/
|
|
void cogl_path_close (void);
|
|
|
|
/**
|
|
* cogl_path_line:
|
|
* @x1: X coordinate of the start line vertex
|
|
* @y1: Y coordinate of the start line vertex
|
|
* @x2: X coordinate of the end line vertex
|
|
* @y2: Y coordinate of the end line vertex
|
|
*
|
|
* Constructs a straight line shape starting and ending at the given
|
|
* coordinates. If there is an existing path this will start a new
|
|
* disjoint sub-path.
|
|
**/
|
|
void cogl_path_line (CoglFixed x1,
|
|
CoglFixed y1,
|
|
CoglFixed x2,
|
|
CoglFixed y2);
|
|
|
|
/**
|
|
* cogl_path_polyline:
|
|
* @coords: A pointer to the first element of an array of fixed-point
|
|
* values that specify the vertex coordinates.
|
|
* @num_points: The total number of vertices.
|
|
*
|
|
* Constructs a series of straight line segments, starting from the
|
|
* first given vertex coordinate. If there is an existing path this
|
|
* will start a new disjoint sub-path. Each subsequent segment starts
|
|
* where the previous one ended and ends at the next given vertex
|
|
* coordinate.
|
|
*
|
|
* The coords array must contain 2 * num_points values. The first value
|
|
* represents the X coordinate of the first vertex, the second value
|
|
* represents the Y coordinate of the first vertex, continuing in the same
|
|
* fashion for the rest of the vertices. (num_points - 1) segments will
|
|
* be constructed.
|
|
**/
|
|
void cogl_path_polyline (CoglFixed *coords,
|
|
gint num_points);
|
|
|
|
|
|
/**
|
|
* cogl_path_polygon:
|
|
* @coords: A pointer to the first element of an array of fixed-point
|
|
* values that specify the vertex coordinates.
|
|
* @num_points: The total number of vertices.
|
|
*
|
|
* Constructs a polygonal shape of the given number of vertices. If
|
|
* there is an existing path this will start a new disjoint sub-path.
|
|
*
|
|
* The coords array must contain 2 * num_points values. The first value
|
|
* represents the X coordinate of the first vertex, the second value
|
|
* represents the Y coordinate of the first vertex, continuing in the same
|
|
* fashion for the rest of the vertices.
|
|
**/
|
|
void cogl_path_polygon (CoglFixed *coords,
|
|
gint num_points);
|
|
|
|
|
|
/**
|
|
* cogl_path_rectangle:
|
|
* @x: X coordinate of the top-left corner.
|
|
* @y: Y coordinate of the top-left corner.
|
|
* @width: Rectangle width.
|
|
* @height: Rectangle height.
|
|
*
|
|
* Constructs a rectangular shape at the given coordinates. If there
|
|
* is an existing path this will start a new disjoint sub-path.
|
|
**/
|
|
void cogl_path_rectangle (CoglFixed x,
|
|
CoglFixed y,
|
|
CoglFixed width,
|
|
CoglFixed height);
|
|
|
|
/**
|
|
* cogl_path_ellipse:
|
|
* @center_x: X coordinate of the ellipse center
|
|
* @center_y: Y coordinate of the ellipse center
|
|
* @radius_x: X radius of the ellipse
|
|
* @radius_y: Y radius of the ellipse
|
|
*
|
|
* Constructs an ellipse shape. If there is an existing path this will
|
|
* start a new disjoint sub-path.
|
|
**/
|
|
void cogl_path_ellipse (CoglFixed center_x,
|
|
CoglFixed center_y,
|
|
CoglFixed radius_x,
|
|
CoglFixed radius_y);
|
|
|
|
/**
|
|
* cogl_path_round_rectangle:
|
|
* @x: X coordinate of the top-left corner
|
|
* @y: Y coordinate of the top-left corner
|
|
* @width: Width of the rectangle
|
|
* @height: Height of the rectangle
|
|
* @radius: Radius of the corner arcs.
|
|
* @arc_step: Angle increment resolution for subdivision of
|
|
* the corner arcs.
|
|
*
|
|
* Constructs a rectangular shape with rounded corners. If there is an
|
|
* existing path this will start a new disjoint sub-path.
|
|
**/
|
|
void cogl_path_round_rectangle (CoglFixed x,
|
|
CoglFixed y,
|
|
CoglFixed width,
|
|
CoglFixed height,
|
|
CoglFixed radius,
|
|
CoglAngle arc_step);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __COGL_PATH_H__ */
|