1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
4 * (GLABELS) Label and Business Card Creation program for GNOME
6 * cairo_markup_path.c: Cairo markup path module
8 * Copyright (C) 2001-2007 Jim Evins <evins@snaught.com>.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "cairo-markup-path.h"
34 /*===========================================*/
36 /*===========================================*/
38 /*===========================================*/
40 /*===========================================*/
42 /*===========================================*/
43 /* Local function prototypes */
44 /*===========================================*/
46 static void gl_cairo_markup_margin_path (cairo_t *cr,
47 const lglTemplateMarkup *markup,
50 static void gl_cairo_markup_margin_rect_path (cairo_t *cr,
51 const lglTemplateMarkup *markup,
54 static void gl_cairo_markup_margin_round_path (cairo_t *cr,
55 const lglTemplateMarkup *markup,
58 static void gl_cairo_markup_margin_cd_path (cairo_t *cr,
59 const lglTemplateMarkup *markup,
62 static void gl_cairo_markup_line_path (cairo_t *cr,
63 const lglTemplateMarkup *markup);
65 static void gl_cairo_markup_circle_path (cairo_t *cr,
66 const lglTemplateMarkup *markup);
68 static void gl_cairo_markup_rect_path (cairo_t *cr,
69 const lglTemplateMarkup *markup);
72 /*--------------------------------------------------------------------------*/
73 /* Create markup path */
74 /*--------------------------------------------------------------------------*/
76 gl_cairo_markup_path (cairo_t *cr,
77 const lglTemplateMarkup *markup,
80 gl_debug (DEBUG_PATH, "START");
82 switch (markup->type) {
83 case LGL_TEMPLATE_MARKUP_MARGIN:
84 gl_cairo_markup_margin_path (cr, markup, label);
86 case LGL_TEMPLATE_MARKUP_LINE:
87 gl_cairo_markup_line_path (cr, markup);
89 case LGL_TEMPLATE_MARKUP_CIRCLE:
90 gl_cairo_markup_circle_path (cr, markup);
92 case LGL_TEMPLATE_MARKUP_RECT:
93 gl_cairo_markup_rect_path (cr, markup);
96 g_message ("Unknown template markup type");
100 gl_debug (DEBUG_PATH, "END");
103 /*---------------------------------------------------------------------------*/
104 /* PRIVATE. Draw margin markup. */
105 /*---------------------------------------------------------------------------*/
107 gl_cairo_markup_margin_path (cairo_t *cr,
108 const lglTemplateMarkup *markup,
111 const lglTemplateFrame *frame;
113 gl_debug (DEBUG_PATH, "START");
115 frame = (lglTemplateFrame *)label->template->frames->data;
117 switch (frame->shape) {
119 case LGL_TEMPLATE_FRAME_SHAPE_RECT:
120 gl_cairo_markup_margin_rect_path (cr, markup, label);
123 case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
124 gl_cairo_markup_margin_round_path (cr, markup, label);
127 case LGL_TEMPLATE_FRAME_SHAPE_CD:
128 gl_cairo_markup_margin_cd_path (cr, markup, label);
132 g_message ("Unknown template label style");
136 gl_debug (DEBUG_PATH, "END");
139 /*---------------------------------------------------------------------------*/
140 /* PRIVATE. Draw simple recangular margin. */
141 /*---------------------------------------------------------------------------*/
143 gl_cairo_markup_margin_rect_path (cairo_t *cr,
144 const lglTemplateMarkup *markup,
147 const lglTemplateFrame *frame;
150 gl_debug (DEBUG_PATH, "START");
152 frame = (lglTemplateFrame *)label->template->frames->data;
154 m = markup->margin.size;
156 gl_label_get_size (label, &w, &h);
159 r = MAX (frame->rect.r - m, 0.0);
163 cairo_rectangle (cr, m, m, w, h);
168 cairo_arc_negative (cr, m+r, m+r, r, 3*G_PI/2, G_PI);
169 cairo_arc_negative (cr, m+r, m+h-r, r, G_PI, G_PI/2);
170 cairo_arc_negative (cr, m+w-r, m+h-r, r, G_PI/2, 0.);
171 cairo_arc_negative (cr, m+w-r, m+r, r, 2*G_PI, 3*G_PI/2);
172 cairo_close_path (cr);
175 gl_debug (DEBUG_PATH, "END");
178 /*---------------------------------------------------------------------------*/
179 /* PRIVATE. Draw round margin. */
180 /*---------------------------------------------------------------------------*/
182 gl_cairo_markup_margin_round_path (cairo_t *cr,
183 const lglTemplateMarkup *markup,
186 const lglTemplateFrame *frame;
189 gl_debug (DEBUG_PATH, "START");
191 frame = (lglTemplateFrame *)label->template->frames->data;
194 m = markup->margin.size;
196 cairo_arc (cr, r, r, r-m, 0, 2*G_PI);
197 cairo_close_path (cr);
199 gl_debug (DEBUG_PATH, "END");
202 /*---------------------------------------------------------------------------*/
203 /* PRIVATE. Draw CD margins. */
204 /*---------------------------------------------------------------------------*/
206 gl_cairo_markup_margin_cd_path (cairo_t *cr,
207 const lglTemplateMarkup *markup,
210 const lglTemplateFrame *frame;
212 gdouble theta1, theta2;
216 gl_debug (DEBUG_PATH, "START");
218 frame = (lglTemplateFrame *)label->template->frames->data;
220 gl_label_get_size (label, &w, &h);
224 m = markup->margin.size;
225 r1 = frame->cd.r1 - m;
226 r2 = frame->cd.r2 + m;
230 * Outer path (may be clipped)
232 theta1 = acos ((w-2*m) / (2.0*r1));
233 theta2 = asin ((h-2*m) / (2.0*r1));
236 cairo_arc (cr, xc, yc, r1, theta1, theta2);
237 cairo_arc (cr, xc, yc, r1, G_PI-theta2, G_PI-theta1);
238 cairo_arc (cr, xc, yc, r1, G_PI+theta1, G_PI+theta2);
239 cairo_arc (cr, xc, yc, r1, 2*G_PI-theta2, 2*G_PI-theta1);
240 cairo_close_path (cr);
243 /* Inner path (hole) */
244 cairo_new_sub_path (cr);
245 cairo_arc (cr, xc, yc, r2, 0.0, 2*G_PI);
246 cairo_close_path (cr);
248 gl_debug (DEBUG_PATH, "END");
251 /*---------------------------------------------------------------------------*/
252 /* PRIVATE. Draw line markup. */
253 /*---------------------------------------------------------------------------*/
255 gl_cairo_markup_line_path (cairo_t *cr,
256 const lglTemplateMarkup *markup)
258 gl_debug (DEBUG_PATH, "START");
260 cairo_move_to (cr, markup->line.x1, markup->line.y1);
261 cairo_line_to (cr, markup->line.x2, markup->line.y2);
263 gl_debug (DEBUG_PATH, "END");
266 /*---------------------------------------------------------------------------*/
267 /* PRIVATE. Draw circle markup. */
268 /*---------------------------------------------------------------------------*/
270 gl_cairo_markup_circle_path (cairo_t *cr,
271 const lglTemplateMarkup *markup)
273 gl_debug (DEBUG_PATH, "START");
276 markup->circle.x0, markup->circle.y0,
279 cairo_close_path (cr);
281 gl_debug (DEBUG_PATH, "END");
284 /*---------------------------------------------------------------------------*/
285 /* PRIVATE. Draw rect markup. */
286 /*---------------------------------------------------------------------------*/
288 gl_cairo_markup_rect_path (cairo_t *cr,
289 const lglTemplateMarkup *markup)
291 gdouble x1 = markup->rect.x1;
292 gdouble y1 = markup->rect.y1;
293 gdouble w = markup->rect.w;
294 gdouble h = markup->rect.h;
295 gdouble r = markup->rect.r;
297 gl_debug (DEBUG_PATH, "START");
301 cairo_rectangle (cr, x1, y1, w, h);
306 cairo_arc_negative (cr, x1+r, y1+r, r, 3*G_PI/2, G_PI);
307 cairo_arc_negative (cr, x1+r, y1+h-r, r, G_PI, G_PI/2);
308 cairo_arc_negative (cr, x1+w-r, y1+h-r, r, G_PI/2, 0.);
309 cairo_arc_negative (cr, x1+w-r, y1+r, r, 2*G_PI, 3*G_PI/2);
310 cairo_close_path (cr);
313 gl_debug (DEBUG_PATH, "END");