1
#ifndef __SP_PATTERN_H__
2
#define __SP_PATTERN_H__
2
5
* SVG <pattern> implementation
5
8
* Lauris Kaplinski <lauris@kaplinski.com>
8
10
* Copyright (C) 2002 Lauris Kaplinski
10
12
* Released under GNU GPL, read the file 'COPYING' for more information
13
#ifndef SEEN_SP_PATTERN_H
14
#define SEEN_SP_PATTERN_H
18
#include <glibmm/ustring.h>
19
#include <sigc++/connection.h>
15
#include <gtk/gtktypeutils.h>
19
#define SP_TYPE_PATTERN (sp_pattern_get_type ())
20
#define SP_PATTERN(o) (GTK_CHECK_CAST ((o), SP_TYPE_PATTERN, SPPattern))
21
#define SP_PATTERN_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), SP_TYPE_PATTERN, SPPatternClass))
22
#define SP_IS_PATTERN(o) (GTK_CHECK_TYPE ((o), SP_TYPE_PATTERN))
23
#define SP_IS_PATTERN_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), SP_TYPE_PATTERN))
25
GType sp_pattern_get_type (void);
29
#include <libnr/nr-rect.h>
30
#include <libnr/nr-matrix.h>
21
31
#include "svg/svg-length.h"
22
32
#include "sp-paint-server.h"
23
33
#include "uri-references.h"
26
class SPPatternReference;
36
#define SP_PATTERN(obj) (dynamic_cast<SPPattern *>((SPObject *)obj))
37
#define SP_IS_PATTERN(obj) (dynamic_cast<const SPPattern *>((SPObject *)obj) != NULL)
39
class SPPattern : public SPPaintServer, public SPViewBox {
35
#include <sigc++/connection.h>
37
class SPPatternReference : public Inkscape::URIReference {
41
enum PatternUnits { UNITS_USERSPACEONUSE, UNITS_OBJECTBOUNDINGBOX };
39
SPPatternReference (SPObject *obj) : URIReference(obj) {}
40
SPPattern *getObject() const {
41
return (SPPattern *)URIReference::getObject();
45
virtual bool _acceptObject(SPObject *obj) const {
46
return SP_IS_PATTERN (obj);
51
SP_PATTERN_UNITS_USERSPACEONUSE,
52
SP_PATTERN_UNITS_OBJECTBOUNDINGBOX
55
struct SPPattern : public SPPaintServer {
46
56
/* Reference (href) */
48
58
SPPatternReference *ref;
52
gdouble width() const;
53
gdouble height() const;
54
Geom::OptRect viewbox() const;
55
SPPattern::PatternUnits patternUnits() const;
56
SPPattern::PatternUnits patternContentUnits() const;
57
Geom::Affine const &getTransform() const;
58
SPPattern *rootPattern(); // TODO: const
60
SPPattern *clone_if_necessary(SPItem *item, const gchar *property);
61
void transform_multiply(Geom::Affine postmul, bool set);
64
* @brief create a new pattern in XML tree
65
* @return created pattern id
67
static const gchar *produce(const std::vector<Inkscape::XML::Node *> &reprs, Geom::Rect bounds,
68
SPDocument *document, Geom::Affine transform, Geom::Affine move);
72
virtual cairo_pattern_t *pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity);
75
virtual void build(SPDocument *doc, Inkscape::XML::Node *repr);
76
virtual void release();
77
virtual void set(unsigned int key, const gchar *value);
78
virtual void update(SPCtx *ctx, unsigned int flags);
79
virtual void modified(unsigned int flags);
82
bool _hasItemChildren() const;
83
void _getChildren(std::list<SPObject *> &l);
84
SPPattern *_chain() const;
87
Count how many times pattern is used by the styles of o and its descendants
89
guint _countHrefs(SPObject *o) const;
92
Gets called when the pattern is reattached to another <pattern>
94
void _onRefChanged(SPObject *old_ref, SPObject *ref);
97
Gets called when the referenced <pattern> is changed
99
void _onRefModified(SPObject *ref, guint flags);
101
60
/* patternUnits and patternContentUnits attribute */
102
PatternUnits _pattern_units : 1;
103
bool _pattern_units_set : 1;
104
PatternUnits _pattern_content_units : 1;
105
bool _pattern_content_units_set : 1;
61
guint patternUnits : 1;
62
guint patternUnits_set : 1;
63
guint patternContentUnits : 1;
64
guint patternContentUnits_set : 1;
106
65
/* patternTransform attribute */
107
Geom::Affine _pattern_transform;
108
bool _pattern_transform_set : 1;
66
Geom::Matrix patternTransform;
67
guint patternTransform_set : 1;
109
68
/* Tile rectangle */
115
sigc::connection _modified_connection;
119
class SPPatternReference : public Inkscape::URIReference {
121
SPPatternReference(SPObject *obj)
126
SPPattern *getObject() const
128
return reinterpret_cast<SPPattern *>(URIReference::getObject());
132
virtual bool _acceptObject(SPObject *obj) const {
133
return SP_IS_PATTERN (obj)&& URIReference::_acceptObject(obj);
137
#endif // SEEN_SP_PATTERN_H
75
guint viewBox_set : 1;
77
sigc::connection modified_connection;
80
struct SPPatternClass {
81
SPPaintServerClass parent_class;
84
guint pattern_users (SPPattern *pattern);
85
SPPattern *pattern_chain (SPPattern *pattern);
86
SPPattern *sp_pattern_clone_if_necessary (SPItem *item, SPPattern *pattern, const gchar *property);
87
void sp_pattern_transform_multiply (SPPattern *pattern, Geom::Matrix postmul, bool set);
89
const gchar *pattern_tile (GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Matrix transform, Geom::Matrix move);
91
SPPattern *pattern_getroot (SPPattern *pat);
93
guint pattern_patternUnits (SPPattern *pat);
94
guint pattern_patternContentUnits (SPPattern *pat);
95
Geom::Matrix const &pattern_patternTransform(SPPattern const *pat);
96
gdouble pattern_x (SPPattern *pat);
97
gdouble pattern_y (SPPattern *pat);
98
gdouble pattern_width (SPPattern *pat);
99
gdouble pattern_height (SPPattern *pat);
100
NRRect *pattern_viewBox (SPPattern *pat);
102
#endif //__SP_PATTERN_H__