rsvg-styles.h 6.43 KB
Newer Older
1 2
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim: set sw=4 sts=4 ts=4 expandtab: */
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
   rsvg-styles.h: Handle SVG styles

   Copyright (C) 2000 Eazel, Inc.
   Copyright (C) 2002 Dom Lachowicz <cinamod@hotmail.com>

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This program 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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public
   License along with this program; if not, write to the
   Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.

   Author: Raph Levien <raph@artofcode.com>
*/

#ifndef RSVG_STYLES_H
#define RSVG_STYLES_H

30
#include <cairo.h>
31 32 33 34
#include "rsvg.h"
#include "rsvg-paint-server.h"

#include <libxml/SAX.h>
Dom Lachowicz's avatar
Dom Lachowicz committed
35
#include <pango/pango.h>
36

37 38 39
G_BEGIN_DECLS 

typedef int TextDecoration;
40 41

enum {
42 43 44 45
    TEXT_NORMAL = 0x00,
    TEXT_OVERLINE = 0x01,
    TEXT_UNDERLINE = 0x02,
    TEXT_STRIKE = 0x04
46 47
};

Dom Lachowicz's avatar
Dom Lachowicz committed
48
typedef enum {
49 50 51
    TEXT_ANCHOR_START,
    TEXT_ANCHOR_MIDDLE,
    TEXT_ANCHOR_END
Dom Lachowicz's avatar
Dom Lachowicz committed
52 53
} TextAnchor;

54
typedef enum {
55 56 57
    UNICODE_BIDI_NORMAL = 0,
    UNICODE_BIDI_EMBED = 1,
    UNICODE_BIDI_OVERRIDE = 2
58 59
} UnicodeBidi;

60 61 62 63 64
typedef enum {
    RSVG_ENABLE_BACKGROUND_ACCUMULATE,
    RSVG_ENABLE_BACKGROUND_NEW
} RsvgEnableBackgroundType;

Dom Lachowicz's avatar
Dom Lachowicz committed
65 66 67 68 69
/* enums and data structures are ABI compatible with libart */

typedef struct _RsvgVpathDash RsvgVpathDash;

struct _RsvgVpathDash {
70 71 72
    RsvgLength offset;
    int n_dash;
    double *dash;
Dom Lachowicz's avatar
Dom Lachowicz committed
73 74
};

75 76 77 78 79 80 81 82 83 84 85 86 87
typedef enum {
    STOP_COLOR_UNSPECIFIED,
    STOP_COLOR_SPECIFIED,
    STOP_COLOR_INHERIT,
    STOP_COLOR_CURRENT_COLOR
} StopColor;

typedef enum {
    STOP_OPACITY_UNSPECIFIED,
    STOP_OPACITY_SPECIFIED,
    STOP_OPACITY_INHERIT
} StopOpacity;

Dom Lachowicz's avatar
Dom Lachowicz committed
88 89
/* end libart theft... */

90
struct _RsvgState {
91
    RsvgState *parent;
Christian Persch's avatar
Christian Persch committed
92 93
    cairo_matrix_t affine;
    cairo_matrix_t personal_affine;
94

95
    char *filter;
96
    char *mask;
97
    char *clip_path;
98
    guint8 opacity;             /* 0..255 */
99 100
    double baseline_shift;
    gboolean has_baseline_shift;
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

    RsvgPaintServer *fill;
    gboolean has_fill_server;
    guint8 fill_opacity;        /* 0..255 */
    gboolean has_fill_opacity;
    gint fill_rule;
    gboolean has_fill_rule;
    gint clip_rule;
    gboolean has_clip_rule;

    gboolean overflow;
    gboolean has_overflow;

    RsvgPaintServer *stroke;
    gboolean has_stroke_server;
    guint8 stroke_opacity;      /* 0..255 */
    gboolean has_stroke_opacity;
    RsvgLength stroke_width;
    gboolean has_stroke_width;
    double miter_limit;
    gboolean has_miter_limit;

123
    cairo_line_cap_t cap;
124
    gboolean has_cap;
125
    cairo_line_join_t join;
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
    gboolean has_join;

    RsvgLength font_size;
    gboolean has_font_size;
    char *font_family;
    gboolean has_font_family;
    char *lang;
    gboolean has_lang;
    PangoStyle font_style;
    gboolean has_font_style;
    PangoVariant font_variant;
    gboolean has_font_variant;
    PangoWeight font_weight;
    gboolean has_font_weight;
    PangoStretch font_stretch;
    gboolean has_font_stretch;
    TextDecoration font_decor;
    gboolean has_font_decor;
    PangoDirection text_dir;
    gboolean has_text_dir;
146 147
    PangoGravity text_gravity;
    gboolean has_text_gravity;
148 149 150 151
    UnicodeBidi unicode_bidi;
    gboolean has_unicode_bidi;
    TextAnchor text_anchor;
    gboolean has_text_anchor;
152 153
    RsvgLength letter_spacing;
    gboolean has_letter_spacing;
154 155 156 157 158

    guint text_offset;

    guint32 stop_color;         /* rgb */
    gboolean has_stop_color;
159
    StopColor stop_color_mode;
160 161
    gint stop_opacity;          /* 0..255 */
    gboolean has_stop_opacity;
162
    StopOpacity stop_opacity_mode;
163 164 165 166

    gboolean visible;
    gboolean has_visible;

167 168 169
    gboolean space_preserve;
    gboolean has_space_preserve;

170 171 172 173 174
    gboolean has_cond;
    gboolean cond_true;

    RsvgVpathDash dash;
    gboolean has_dash;
175
    gboolean has_dashoffset;
176 177 178 179 180 181 182 183 184 185

    guint32 current_color;
    gboolean has_current_color;

    guint32 flood_color;
    gboolean has_flood_color;

    guchar flood_opacity;
    gboolean has_flood_opacity;

Benjamin Otte's avatar
Benjamin Otte committed
186 187 188
    char *startMarker;
    char *middleMarker;
    char *endMarker;
189 190 191 192
    gboolean has_startMarker;
    gboolean has_middleMarker;
    gboolean has_endMarker;

193
    cairo_operator_t comp_op;
194
    RsvgEnableBackgroundType enable_background;
195

196
    cairo_antialias_t shape_rendering_type;
197
    gboolean has_shape_rendering_type;
198 199

    cairo_antialias_t text_rendering_type;
200
    gboolean has_text_rendering_type;
201 202

    GHashTable *styles;
203
};
204

205
G_GNUC_INTERNAL
Hiroyuki Ikezoe's avatar
Hiroyuki Ikezoe committed
206
RsvgState *rsvg_state_new (void);
207

208
G_GNUC_INTERNAL
209 210
void rsvg_state_free (RsvgState *state);

211
G_GNUC_INTERNAL
212
void rsvg_state_reinit      (RsvgState * state);
213
G_GNUC_INTERNAL
214
void rsvg_state_clone       (RsvgState * dst, const RsvgState * src);
215
G_GNUC_INTERNAL
216
void rsvg_state_inherit     (RsvgState * dst, const RsvgState * src);
217
G_GNUC_INTERNAL
218
void rsvg_state_reinherit   (RsvgState * dst, const RsvgState * src);
219

220
G_GNUC_INTERNAL
221
void rsvg_state_free_all    (RsvgState * state);
222

223
G_GNUC_INTERNAL
224
void rsvg_parse_style_pairs (RsvgHandle * ctx, RsvgState * state, RsvgPropertyBag * atts);
225
G_GNUC_INTERNAL
226
void rsvg_parse_style	    (RsvgHandle * ctx, RsvgState * state, const char *str);
227
G_GNUC_INTERNAL
228
void rsvg_parse_cssbuffer   (RsvgHandle * ctx, const char *buff, size_t buflen);
229
G_GNUC_INTERNAL
230
void rsvg_parse_style_attrs (RsvgHandle *ctx, RsvgNode *node, const char *tag,
231
                             const char *klazz, const char *id, RsvgPropertyBag * atts);
232

233
G_GNUC_INTERNAL
Christian Persch's avatar
Christian Persch committed
234
gboolean rsvg_parse_transform   (cairo_matrix_t *matrix, const char *src);
235

236
G_GNUC_INTERNAL
237
RsvgState *rsvg_state_parent    (RsvgState * state);
238

239
G_GNUC_INTERNAL
240
void       rsvg_state_pop       (RsvgDrawingCtx * ctx);
241
G_GNUC_INTERNAL
242
void       rsvg_state_push      (RsvgDrawingCtx * ctx);
243
G_GNUC_INTERNAL
244
RsvgState *rsvg_current_state   (RsvgDrawingCtx * ctx);
245

246
G_GNUC_INTERNAL
247
void rsvg_state_reinherit_top	(RsvgDrawingCtx * ctx, RsvgState * state, int dominate);
248

249
G_GNUC_INTERNAL
250
void rsvg_state_reconstruct	(RsvgState * state, RsvgNode * current);
251

252 253 254
G_GNUC_INTERNAL
gboolean rsvg_state_is_overflow (RsvgState *state);

255
G_END_DECLS
256

257
#endif                          /* RSVG_STYLES_H */