1 /* cairo - a vector graphics library with display and print output
3 * Copyright © 2005 Red Hat, Inc.
5 * This library is free software; you can redistribute it and/or
6 * modify it either under the terms of the GNU Lesser General Public
7 * License version 2.1 as published by the Free Software Foundation
8 * (the "LGPL") or, at your option, under the terms of the Mozilla
9 * Public License Version 1.1 (the "MPL"). If you do not alter this
10 * notice, a recipient may use your version of this file under either
11 * the MPL or the LGPL.
13 * You should have received a copy of the LGPL along with this library
14 * in the file COPYING-LGPL-2.1; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
16 * You should have received a copy of the MPL along with this library
17 * in the file COPYING-MPL-1.1
19 * The contents of this file are subject to the Mozilla Public License
20 * Version 1.1 (the "License"); you may not use this file except in
21 * compliance with the License. You may obtain a copy of the License at
22 * http://www.mozilla.org/MPL/
24 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
25 * OF ANY KIND, either express or implied. See the LGPL or the MPL for
26 * the specific language governing rights and limitations.
28 * The Original Code is the cairo graphics library.
30 * The Initial Developer of the Original Code is Red Hat, Inc.
33 * Carl D. Worth <cworth@redhat.com>
36 #ifndef CAIRO_PATH_FIXED_PRIVATE_H
37 #define CAIRO_PATH_FIXED_PRIVATE_H
39 #include "cairo-types-private.h"
40 #include "cairo-compiler-private.h"
41 #include "cairo-list-private.h"
49 CAIRO_PATH_OP_MOVE_TO
= 0,
50 CAIRO_PATH_OP_LINE_TO
= 1,
51 CAIRO_PATH_OP_CURVE_TO
= 2,
52 CAIRO_PATH_OP_CLOSE_PATH
= 3
55 /* we want to make sure a single byte is used for the enum */
56 typedef char cairo_path_op_t
;
58 /* make _cairo_path_fixed fit into ~512 bytes -- about 50 items */
59 #define CAIRO_PATH_BUF_SIZE ((512 - sizeof (cairo_path_buf_t)) \
60 / (2 * sizeof (cairo_point_t) + sizeof (cairo_path_op_t)))
62 #define cairo_path_head(path__) (&(path__)->buf.base)
63 #define cairo_path_tail(path__) cairo_path_buf_prev (cairo_path_head (path__))
65 #define cairo_path_buf_next(pos__) \
66 cairo_list_entry ((pos__)->link.next, cairo_path_buf_t, link)
67 #define cairo_path_buf_prev(pos__) \
68 cairo_list_entry ((pos__)->link.prev, cairo_path_buf_t, link)
70 #define cairo_path_foreach_buf_start(pos__, path__) \
71 pos__ = cairo_path_head (path__); do
72 #define cairo_path_foreach_buf_end(pos__, path__) \
73 while ((pos__ = cairo_path_buf_next (pos__)) != cairo_path_head (path__))
76 typedef struct _cairo_path_buf
{
79 unsigned int size_ops
;
80 unsigned int num_points
;
81 unsigned int size_points
;
84 cairo_point_t
*points
;
87 typedef struct _cairo_path_buf_fixed
{
88 cairo_path_buf_t base
;
90 cairo_path_op_t op
[CAIRO_PATH_BUF_SIZE
];
91 cairo_point_t points
[2 * CAIRO_PATH_BUF_SIZE
];
92 } cairo_path_buf_fixed_t
;
96 has_curve_to => !stroke_is_rectilinear
97 fill_is_rectilinear => stroke_is_rectilinear
98 fill_is_empty => fill_is_rectilinear
99 fill_maybe_region => fill_is_rectilinear
101 struct _cairo_path_fixed
{
102 cairo_point_t last_move_point
;
103 cairo_point_t current_point
;
104 unsigned int has_current_point
: 1;
105 unsigned int needs_move_to
: 1;
106 unsigned int has_extents
: 1;
107 unsigned int has_curve_to
: 1;
108 unsigned int stroke_is_rectilinear
: 1;
109 unsigned int fill_is_rectilinear
: 1;
110 unsigned int fill_maybe_region
: 1;
111 unsigned int fill_is_empty
: 1;
115 cairo_path_buf_fixed_t buf
;
119 _cairo_path_fixed_translate (cairo_path_fixed_t
*path
,
123 cairo_private cairo_status_t
124 _cairo_path_fixed_append (cairo_path_fixed_t
*path
,
125 const cairo_path_fixed_t
*other
,
129 cairo_private
unsigned long
130 _cairo_path_fixed_hash (const cairo_path_fixed_t
*path
);
132 cairo_private
unsigned long
133 _cairo_path_fixed_size (const cairo_path_fixed_t
*path
);
135 cairo_private cairo_bool_t
136 _cairo_path_fixed_equal (const cairo_path_fixed_t
*a
,
137 const cairo_path_fixed_t
*b
);
139 typedef struct _cairo_path_fixed_iter
{
140 const cairo_path_buf_t
*first
;
141 const cairo_path_buf_t
*buf
;
143 unsigned int n_point
;
144 } cairo_path_fixed_iter_t
;
147 _cairo_path_fixed_iter_init (cairo_path_fixed_iter_t
*iter
,
148 const cairo_path_fixed_t
*path
);
150 cairo_private cairo_bool_t
151 _cairo_path_fixed_iter_is_fill_box (cairo_path_fixed_iter_t
*_iter
,
154 cairo_private cairo_bool_t
155 _cairo_path_fixed_iter_at_end (const cairo_path_fixed_iter_t
*iter
);
157 static inline cairo_bool_t
158 _cairo_path_fixed_fill_is_empty (const cairo_path_fixed_t
*path
)
160 return path
->fill_is_empty
;
163 static inline cairo_bool_t
164 _cairo_path_fixed_fill_is_rectilinear (const cairo_path_fixed_t
*path
)
166 if (! path
->fill_is_rectilinear
)
169 if (! path
->has_current_point
|| path
->needs_move_to
)
172 /* check whether the implicit close preserves the rectilinear property */
173 return path
->current_point
.x
== path
->last_move_point
.x
||
174 path
->current_point
.y
== path
->last_move_point
.y
;
177 static inline cairo_bool_t
178 _cairo_path_fixed_stroke_is_rectilinear (const cairo_path_fixed_t
*path
)
180 return path
->stroke_is_rectilinear
;
183 static inline cairo_bool_t
184 _cairo_path_fixed_fill_maybe_region (const cairo_path_fixed_t
*path
)
186 if (! path
->fill_maybe_region
)
189 if (! path
->has_current_point
|| path
->needs_move_to
)
192 /* check whether the implicit close preserves the rectilinear property
193 * (the integer point property is automatically preserved)
195 return path
->current_point
.x
== path
->last_move_point
.x
||
196 path
->current_point
.y
== path
->last_move_point
.y
;
199 cairo_private cairo_bool_t
200 _cairo_path_fixed_is_stroke_box (const cairo_path_fixed_t
*path
,
203 cairo_private cairo_bool_t
204 _cairo_path_fixed_is_simple_quad (const cairo_path_fixed_t
*path
);
206 #endif /* CAIRO_PATH_FIXED_PRIVATE_H */