Subversion Repositories Scribus

Rev

Rev 14952 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
14952 fschmid 1
/* cairo - a vector graphics library with display and print output
2
 *
3
 * Copyright © 2005 Red Hat, Inc
4
 *
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.
12
 *
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
18122 mrdocs 15
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
14952 fschmid 16
 * You should have received a copy of the MPL along with this library
17
 * in the file COPYING-MPL-1.1
18
 *
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/
23
 *
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.
27
 *
28
 * The Original Code is the cairo graphics library.
29
 *
30
 * The Initial Developer of the Original Code is Red Hat, Inc.
31
 *
32
 * Contributor(s):
33
 *      Carl Worth <cworth@cworth.org>
34
 */
35
 
36
#include "cairoint.h"
37
 
38
void
39
_cairo_stroke_style_init (cairo_stroke_style_t *style)
40
{
41
    VG (VALGRIND_MAKE_MEM_UNDEFINED (style, sizeof (cairo_stroke_style_t)));
42
 
43
    style->line_width = CAIRO_GSTATE_LINE_WIDTH_DEFAULT;
44
    style->line_cap = CAIRO_GSTATE_LINE_CAP_DEFAULT;
45
    style->line_join = CAIRO_GSTATE_LINE_JOIN_DEFAULT;
46
    style->miter_limit = CAIRO_GSTATE_MITER_LIMIT_DEFAULT;
47
 
48
    style->dash = NULL;
49
    style->num_dashes = 0;
50
    style->dash_offset = 0.0;
51
}
52
 
53
cairo_status_t
54
_cairo_stroke_style_init_copy (cairo_stroke_style_t *style,
55
                               cairo_stroke_style_t *other)
56
{
57
    if (CAIRO_INJECT_FAULT ())
58
        return _cairo_error (CAIRO_STATUS_NO_MEMORY);
59
 
60
    VG (VALGRIND_MAKE_MEM_UNDEFINED (style, sizeof (cairo_stroke_style_t)));
61
 
62
    style->line_width = other->line_width;
63
    style->line_cap = other->line_cap;
64
    style->line_join = other->line_join;
65
    style->miter_limit = other->miter_limit;
66
 
67
    style->num_dashes = other->num_dashes;
68
 
69
    if (other->dash == NULL) {
70
        style->dash = NULL;
71
    } else {
72
        style->dash = _cairo_malloc_ab (style->num_dashes, sizeof (double));
73
        if (unlikely (style->dash == NULL))
74
            return _cairo_error (CAIRO_STATUS_NO_MEMORY);
75
 
76
        memcpy (style->dash, other->dash,
77
                style->num_dashes * sizeof (double));
78
    }
79
 
80
    style->dash_offset = other->dash_offset;
81
 
82
    return CAIRO_STATUS_SUCCESS;
83
}
84
 
85
void
86
_cairo_stroke_style_fini (cairo_stroke_style_t *style)
87
{
88
    if (style->dash) {
89
        free (style->dash);
90
        style->dash = NULL;
91
    }
92
    style->num_dashes = 0;
93
 
94
    VG (VALGRIND_MAKE_MEM_NOACCESS (style, sizeof (cairo_stroke_style_t)));
95
}
96
 
97
/*
98
 * For a stroke in the given style, compute the maximum distance
99
 * from the path that vertices could be generated.  In the case
100
 * of rotation in the ctm, the distance will not be exact.
101
 */
102
void
103
_cairo_stroke_style_max_distance_from_path (const cairo_stroke_style_t *style,
104
                                            const cairo_matrix_t *ctm,
105
                                            double *dx, double *dy)
106
{
107
    double style_expansion = 0.5;
108
 
109
    if (style->line_cap == CAIRO_LINE_CAP_SQUARE)
110
        style_expansion = M_SQRT1_2;
111
 
112
    if (style->line_join == CAIRO_LINE_JOIN_MITER &&
113
        style_expansion < M_SQRT2 * style->miter_limit)
114
    {
115
        style_expansion = M_SQRT2 * style->miter_limit;
116
    }
117
 
118
    style_expansion *= style->line_width;
119
 
120
    *dx = style_expansion * hypot (ctm->xx, ctm->xy);
121
    *dy = style_expansion * hypot (ctm->yy, ctm->yx);
122
}