1
2
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
#ifndef EXTENSION_INTERNAL_CAIRO_RENDER_CONTEXT_H_SEEN
#define EXTENSION_INTERNAL_CAIRO_RENDER_CONTEXT_H_SEEN
/** \file
* Declaration of CairoRenderContext, a class used for rendering with Cairo.
*/
/*
* Authors:
* Miklos Erdelyi <erdelyim@gmail.com>
*
* Copyright (C) 2006 Miklos Erdelyi
*
* Licensed under GNU GPL
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#ifdef HAVE_CAIRO_PDF
#include "extension/extension.h"
#include <set>
#include <string>
#include "libnr/nr-path.h"
#include <libnr/nr-matrix-ops.h>
#include "style.h"
#include <cairo.h>
class SPClipPath;
class SPMask;
namespace Inkscape {
namespace Extension {
namespace Internal {
class CairoRenderer;
class CairoRenderContext;
class CairoRenderState;
class CairoGlyphInfo;
// Holds info for rendering a glyph
struct CairoGlyphInfo {
unsigned long index;
double x;
double y;
};
struct CairoRenderState {
unsigned int merge_opacity : 1; // whether fill/stroke opacity can be mul'd with item opacity
unsigned int need_layer : 1;
unsigned int has_overflow : 1;
unsigned int parent_has_userspace : 1; // whether the parent's ctm should be applied
float opacity;
SPClipPath *clip_path;
SPMask* mask;
NRMatrix transform; // the CTM
};
class CairoRenderContext {
friend class CairoRenderer;
public:
CairoRenderContext *cloneMe(void) const;
CairoRenderContext *cloneMe(double width, double height) const;
bool finish(void);
CairoRenderer *getRenderer(void) const;
cairo_t *getCairoContext(void) const;
typedef enum CairoRenderMode {
RENDER_MODE_NORMAL,
RENDER_MODE_CLIP
};
typedef enum CairoClipMode {
CLIP_MODE_PATH,
CLIP_MODE_MASK
};
bool setImageTarget(cairo_format_t format);
bool setPdfTarget(gchar const *utf8_fn);
/** Creates the cairo_surface_t for the context with the
given width, height and with the currently set target
surface type. */
bool setupSurface(double width, double height);
cairo_surface_t *getSurface(void);
/** Saves the contents of the context to a PNG file. */
bool saveAsPng(const char *file_name);
/* Render/clip mode setting/query */
void setRenderMode(CairoRenderMode mode);
CairoRenderMode getRenderMode(void) const;
void setClipMode(CairoClipMode mode);
CairoClipMode getClipMode(void) const;
void addBpath(NArtBpath const *bp);
void setBpath(NArtBpath const *bp);
void pushLayer(void);
void popLayer(void);
/* Graphics state manipulation */
void pushState(void);
void popState(void);
CairoRenderState *getCurrentState(void) const;
CairoRenderState *getParentState(void) const;
void setStateForStyle(SPStyle const *style);
void transform(NRMatrix const *transform);
void setTransform(NRMatrix const *transform);
void getTransform(NRMatrix *copy) const;
void getParentTransform(NRMatrix *copy) const;
/* Clipping methods */
void addClipPath(NArtBpath const *bp, SPIEnum const *fill_rule);
void addClippingRect(double x, double y, double width, double height);
/* Rendering methods */
bool renderPath(NRBPath const *bpath, SPStyle const *style, NRRect const *pbox);
bool renderImage(unsigned char *px, unsigned int w, unsigned int h, unsigned int rs,
NRMatrix const *image_transform, SPStyle const *style);
bool renderGlyphtext(PangoFont *font, NRMatrix const *font_matrix,
std::vector<CairoGlyphInfo> const &glyphtext, SPStyle const *style);
/* More general rendering methods will have to be added (like fill, stroke) */
protected:
CairoRenderContext(CairoRenderer *renderer);
~CairoRenderContext(void);
float _width;
float _height;
unsigned short _dpi;
FILE *_stream;
unsigned int _is_valid : 1;
unsigned int _vector_based_target : 1;
cairo_t *_cr;
cairo_surface_t *_surface;
cairo_surface_type_t _target;
cairo_format_t _target_format;
PangoLayout *_layout;
unsigned int _clip_rule : 8;
unsigned int _clip_winding_failed : 1;
GSList *_state_stack;
CairoRenderState *_state; // the current state
CairoRenderer *_renderer;
CairoRenderMode _render_mode;
CairoClipMode _clip_mode;
cairo_pattern_t *_createPatternForPaintServer(SPPaintServer const *const paintserver,
NRRect const *pbox, float alpha);
cairo_pattern_t *_createPatternPainter(SPPaintServer const *const paintserver, NRRect const *pbox);
unsigned int _showGlyphs(cairo_t *cr, PangoFont *font, std::vector<CairoGlyphInfo> const &glyphtext, bool is_stroke);
void _setFillStyle(SPStyle const *style, NRRect const *pbox);
void _setStrokeStyle(SPStyle const *style, NRRect const *pbox);
void _initCairoMatrix(cairo_matrix_t *matrix, NRMatrix const *transform);
void _concatTransform(cairo_t *cr, double xx, double yx, double xy, double yy, double x0, double y0);
void _concatTransform(cairo_t *cr, NRMatrix const *transform);
CairoRenderState *_createState(void);
};
} /* namespace Internal */
} /* namespace Extension */
} /* namespace Inkscape */
#endif /* HAVE_CAIRO_PDF */
#endif /* !EXTENSION_INTERNAL_CAIRO_RENDER_CONTEXT_H_SEEN */
/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
|