rsvg-styles.h 6.29 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
/* enums and data structures are ABI compatible with libart */

typedef enum {
68 69 70
    RSVG_PATH_STROKE_JOIN_MITER,
    RSVG_PATH_STROKE_JOIN_ROUND,
    RSVG_PATH_STROKE_JOIN_BEVEL
Dom Lachowicz's avatar
Dom Lachowicz committed
71 72 73
} RsvgPathStrokeJoinType;

typedef enum {
74 75 76
    RSVG_PATH_STROKE_CAP_BUTT,
    RSVG_PATH_STROKE_CAP_ROUND,
    RSVG_PATH_STROKE_CAP_SQUARE
Dom Lachowicz's avatar
Dom Lachowicz committed
77 78 79 80 81
} RsvgPathStrokeCapType;

typedef struct _RsvgVpathDash RsvgVpathDash;

struct _RsvgVpathDash {
82 83 84
    RsvgLength offset;
    int n_dash;
    double *dash;
Dom Lachowicz's avatar
Dom Lachowicz committed
85 86 87 88
};

/* end libart theft... */

89
struct _RsvgState {
90
    RsvgState *parent;
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
    double affine[6];
    double personal_affine[6];

    RsvgFilter *filter;
    void *mask;
    void *clip_path_ref;
    guint8 adobe_blend;         /* 0..11 */
    guint8 opacity;             /* 0..255 */

    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;

    RsvgPathStrokeCapType cap;
    gboolean has_cap;
    RsvgPathStrokeJoinType join;
    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;
    UnicodeBidi unicode_bidi;
    gboolean has_unicode_bidi;
    TextAnchor text_anchor;
    gboolean has_text_anchor;
148 149
    RsvgLength letter_spacing;
    gboolean has_letter_spacing;
150 151 152 153 154 155 156 157 158 159 160

    guint text_offset;

    guint32 stop_color;         /* rgb */
    gboolean has_stop_color;
    gint stop_opacity;          /* 0..255 */
    gboolean has_stop_opacity;

    gboolean visible;
    gboolean has_visible;

161 162 163
    gboolean space_preserve;
    gboolean has_space_preserve;

164 165 166 167 168
    gboolean has_cond;
    gboolean cond_true;

    RsvgVpathDash dash;
    gboolean has_dash;
169
    gboolean has_dashoffset;
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

    guint32 current_color;
    gboolean has_current_color;

    guint32 flood_color;
    gboolean has_flood_color;

    guchar flood_opacity;
    gboolean has_flood_opacity;

    RsvgNode *startMarker;
    RsvgNode *middleMarker;
    RsvgNode *endMarker;
    gboolean has_startMarker;
    gboolean has_middleMarker;
    gboolean has_endMarker;

187
    cairo_operator_t comp_op;
188
    RsvgEnableBackgroundType enable_background;
189

190
    cairo_antialias_t shape_rendering_type;
191
    gboolean has_shape_rendering_type;
192 193

    cairo_antialias_t text_rendering_type;
194
    gboolean has_text_rendering_type;
195 196

    GHashTable *styles;
197
};
198

Hiroyuki Ikezoe's avatar
Hiroyuki Ikezoe committed
199
RsvgState *rsvg_state_new (void);
200

201
void rsvg_state_init        (RsvgState * state);
202
void rsvg_state_reinit      (RsvgState * state);
203 204
void rsvg_state_clone       (RsvgState * dst, const RsvgState * src);
void rsvg_state_inherit     (RsvgState * dst, const RsvgState * src);
205 206 207 208
void rsvg_state_reinherit   (RsvgState * dst, const RsvgState * src);
void rsvg_state_dominate    (RsvgState * dst, const RsvgState * src);
void rsvg_state_override    (RsvgState * dst, const RsvgState * src);
void rsvg_state_finalize    (RsvgState * state);
209
void rsvg_state_free_all    (RsvgState * state);
210 211

void rsvg_parse_style_pairs (RsvgHandle * ctx, RsvgState * state, RsvgPropertyBag * atts);
212 213
void rsvg_parse_style	    (RsvgHandle * ctx, RsvgState * state, const char *str);
void rsvg_parse_cssbuffer   (RsvgHandle * ctx, const char *buff, size_t buflen);
214 215 216

void rsvg_parse_style_attrs (RsvgHandle * ctx, RsvgState * state, const char *tag,
                             const char *klazz, const char *id, RsvgPropertyBag * atts);
217

218 219
gdouble rsvg_viewport_percentage (gdouble width, gdouble height);
gdouble rsvg_dpi_percentage      (RsvgHandle * ctx);
220

221
gboolean rsvg_parse_transform   (double dst[6], const char *src);
222

223
RsvgState *rsvg_state_parent    (RsvgState * state);
224

225 226 227
void       rsvg_state_pop       (RsvgDrawingCtx * ctx);
void       rsvg_state_push      (RsvgDrawingCtx * ctx);
RsvgState *rsvg_current_state   (RsvgDrawingCtx * ctx);
228

229
void rsvg_state_reinherit_top	(RsvgDrawingCtx * ctx, RsvgState * state, int dominate);
230

231
void rsvg_state_reconstruct	(RsvgState * state, RsvgNode * current);
232

233
G_END_DECLS
234

235
#endif                          /* RSVG_STYLES_H */