mathematical 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/mathematical/extconf.rb +14 -0
- data/ext/mathematical/itex2MML.h +63 -0
- data/ext/mathematical/lasemrender.c +257 -0
- data/ext/mathematical/lex.yy.c +6548 -0
- data/ext/mathematical/lsm.c +31 -0
- data/ext/mathematical/lsm.h +39 -0
- data/ext/mathematical/lsmattributes.c +279 -0
- data/ext/mathematical/lsmattributes.h +75 -0
- data/ext/mathematical/lsmcairo.c +598 -0
- data/ext/mathematical/lsmcairo.h +51 -0
- data/ext/mathematical/lsmdebug.c +183 -0
- data/ext/mathematical/lsmdebug.h +73 -0
- data/ext/mathematical/lsmdom.h +43 -0
- data/ext/mathematical/lsmdomcharacterdata.c +114 -0
- data/ext/mathematical/lsmdomcharacterdata.h +59 -0
- data/ext/mathematical/lsmdomdocument.c +255 -0
- data/ext/mathematical/lsmdomdocument.h +75 -0
- data/ext/mathematical/lsmdomdocumentfragment.c +81 -0
- data/ext/mathematical/lsmdomdocumentfragment.h +55 -0
- data/ext/mathematical/lsmdomelement.c +148 -0
- data/ext/mathematical/lsmdomelement.h +62 -0
- data/ext/mathematical/lsmdomentities.c +2166 -0
- data/ext/mathematical/lsmdomentities.h +35 -0
- data/ext/mathematical/lsmdomenumtypes.c +99 -0
- data/ext/mathematical/lsmdomenumtypes.h +26 -0
- data/ext/mathematical/lsmdomimplementation.c +82 -0
- data/ext/mathematical/lsmdomimplementation.h +41 -0
- data/ext/mathematical/lsmdomnamednodemap.c +118 -0
- data/ext/mathematical/lsmdomnamednodemap.h +64 -0
- data/ext/mathematical/lsmdomnode.c +737 -0
- data/ext/mathematical/lsmdomnode.h +122 -0
- data/ext/mathematical/lsmdomnodelist.c +70 -0
- data/ext/mathematical/lsmdomnodelist.h +58 -0
- data/ext/mathematical/lsmdomparser.c +461 -0
- data/ext/mathematical/lsmdomparser.h +54 -0
- data/ext/mathematical/lsmdomtext.c +82 -0
- data/ext/mathematical/lsmdomtext.h +55 -0
- data/ext/mathematical/lsmdomtypes.h +44 -0
- data/ext/mathematical/lsmdomview.c +422 -0
- data/ext/mathematical/lsmdomview.h +94 -0
- data/ext/mathematical/lsmitex.c +76 -0
- data/ext/mathematical/lsmitex.h +36 -0
- data/ext/mathematical/lsmmathml.h +66 -0
- data/ext/mathematical/lsmmathmlactionelement.c +93 -0
- data/ext/mathematical/lsmmathmlactionelement.h +57 -0
- data/ext/mathematical/lsmmathmlaligngroupelement.c +102 -0
- data/ext/mathematical/lsmmathmlaligngroupelement.h +56 -0
- data/ext/mathematical/lsmmathmlalignmarkelement.c +102 -0
- data/ext/mathematical/lsmmathmlalignmarkelement.h +56 -0
- data/ext/mathematical/lsmmathmlattributes.c +197 -0
- data/ext/mathematical/lsmmathmlattributes.h +126 -0
- data/ext/mathematical/lsmmathmldocument.c +304 -0
- data/ext/mathematical/lsmmathmldocument.h +61 -0
- data/ext/mathematical/lsmmathmlelement.c +491 -0
- data/ext/mathematical/lsmmathmlelement.h +107 -0
- data/ext/mathematical/lsmmathmlenums.c +429 -0
- data/ext/mathematical/lsmmathmlenums.h +182 -0
- data/ext/mathematical/lsmmathmlenumtypes.c +666 -0
- data/ext/mathematical/lsmmathmlenumtypes.h +90 -0
- data/ext/mathematical/lsmmathmlerrorelement.c +58 -0
- data/ext/mathematical/lsmmathmlerrorelement.h +56 -0
- data/ext/mathematical/lsmmathmlfencedelement.c +178 -0
- data/ext/mathematical/lsmmathmlfencedelement.h +65 -0
- data/ext/mathematical/lsmmathmlfractionelement.c +253 -0
- data/ext/mathematical/lsmmathmlfractionelement.h +62 -0
- data/ext/mathematical/lsmmathmlglyphtableams.c +597 -0
- data/ext/mathematical/lsmmathmlglyphtableams.h +45 -0
- data/ext/mathematical/lsmmathmlitexelement.c +187 -0
- data/ext/mathematical/lsmmathmlitexelement.h +60 -0
- data/ext/mathematical/lsmmathmllayoututils.c +191 -0
- data/ext/mathematical/lsmmathmllayoututils.h +58 -0
- data/ext/mathematical/lsmmathmlmathelement.c +204 -0
- data/ext/mathematical/lsmmathmlmathelement.h +81 -0
- data/ext/mathematical/lsmmathmloperatordictionary.c +3332 -0
- data/ext/mathematical/lsmmathmloperatordictionary.h +54 -0
- data/ext/mathematical/lsmmathmloperatorelement.c +307 -0
- data/ext/mathematical/lsmmathmloperatorelement.h +73 -0
- data/ext/mathematical/lsmmathmlpaddedelement.c +58 -0
- data/ext/mathematical/lsmmathmlpaddedelement.h +56 -0
- data/ext/mathematical/lsmmathmlphantomelement.c +71 -0
- data/ext/mathematical/lsmmathmlphantomelement.h +56 -0
- data/ext/mathematical/lsmmathmlpresentationcontainer.c +43 -0
- data/ext/mathematical/lsmmathmlpresentationcontainer.h +54 -0
- data/ext/mathematical/lsmmathmlpresentationtoken.c +303 -0
- data/ext/mathematical/lsmmathmlpresentationtoken.h +83 -0
- data/ext/mathematical/lsmmathmlradicalelement.c +266 -0
- data/ext/mathematical/lsmmathmlradicalelement.h +71 -0
- data/ext/mathematical/lsmmathmlrowelement.c +58 -0
- data/ext/mathematical/lsmmathmlrowelement.h +56 -0
- data/ext/mathematical/lsmmathmlscriptelement.c +282 -0
- data/ext/mathematical/lsmmathmlscriptelement.h +78 -0
- data/ext/mathematical/lsmmathmlsemanticselement.c +84 -0
- data/ext/mathematical/lsmmathmlsemanticselement.h +56 -0
- data/ext/mathematical/lsmmathmlspaceelement.c +142 -0
- data/ext/mathematical/lsmmathmlspaceelement.h +60 -0
- data/ext/mathematical/lsmmathmlstringelement.c +123 -0
- data/ext/mathematical/lsmmathmlstringelement.h +58 -0
- data/ext/mathematical/lsmmathmlstyle.c +130 -0
- data/ext/mathematical/lsmmathmlstyle.h +81 -0
- data/ext/mathematical/lsmmathmlstyleelement.c +307 -0
- data/ext/mathematical/lsmmathmlstyleelement.h +87 -0
- data/ext/mathematical/lsmmathmltablecellelement.c +122 -0
- data/ext/mathematical/lsmmathmltablecellelement.h +62 -0
- data/ext/mathematical/lsmmathmltableelement.c +545 -0
- data/ext/mathematical/lsmmathmltableelement.h +78 -0
- data/ext/mathematical/lsmmathmltablerowelement.c +120 -0
- data/ext/mathematical/lsmmathmltablerowelement.h +64 -0
- data/ext/mathematical/lsmmathmltraits.c +819 -0
- data/ext/mathematical/lsmmathmltraits.h +119 -0
- data/ext/mathematical/lsmmathmltypes.h +66 -0
- data/ext/mathematical/lsmmathmlunderoverelement.c +485 -0
- data/ext/mathematical/lsmmathmlunderoverelement.h +82 -0
- data/ext/mathematical/lsmmathmlutils.c +170 -0
- data/ext/mathematical/lsmmathmlutils.h +50 -0
- data/ext/mathematical/lsmmathmlview.c +1048 -0
- data/ext/mathematical/lsmmathmlview.h +164 -0
- data/ext/mathematical/lsmproperties.c +418 -0
- data/ext/mathematical/lsmproperties.h +85 -0
- data/ext/mathematical/lsmstr.c +231 -0
- data/ext/mathematical/lsmstr.h +114 -0
- data/ext/mathematical/lsmsvg.h +67 -0
- data/ext/mathematical/lsmsvgaelement.c +73 -0
- data/ext/mathematical/lsmsvgaelement.h +55 -0
- data/ext/mathematical/lsmsvgattributes.h +118 -0
- data/ext/mathematical/lsmsvgcircleelement.c +153 -0
- data/ext/mathematical/lsmsvgcircleelement.h +59 -0
- data/ext/mathematical/lsmsvgclippathelement.c +134 -0
- data/ext/mathematical/lsmsvgclippathelement.h +59 -0
- data/ext/mathematical/lsmsvgcolors.c +212 -0
- data/ext/mathematical/lsmsvgcolors.h +39 -0
- data/ext/mathematical/lsmsvgdefselement.c +74 -0
- data/ext/mathematical/lsmsvgdefselement.h +55 -0
- data/ext/mathematical/lsmsvgdocument.c +288 -0
- data/ext/mathematical/lsmsvgdocument.h +64 -0
- data/ext/mathematical/lsmsvgelement.c +373 -0
- data/ext/mathematical/lsmsvgelement.h +81 -0
- data/ext/mathematical/lsmsvgellipseelement.c +158 -0
- data/ext/mathematical/lsmsvgellipseelement.h +60 -0
- data/ext/mathematical/lsmsvgenums.c +544 -0
- data/ext/mathematical/lsmsvgenums.h +357 -0
- data/ext/mathematical/lsmsvgenumtypes.c +1083 -0
- data/ext/mathematical/lsmsvgenumtypes.h +111 -0
- data/ext/mathematical/lsmsvgfilterblend.c +105 -0
- data/ext/mathematical/lsmsvgfilterblend.h +58 -0
- data/ext/mathematical/lsmsvgfiltercomposite.c +109 -0
- data/ext/mathematical/lsmsvgfiltercomposite.h +58 -0
- data/ext/mathematical/lsmsvgfilterelement.c +266 -0
- data/ext/mathematical/lsmsvgfilterelement.h +66 -0
- data/ext/mathematical/lsmsvgfilterflood.c +86 -0
- data/ext/mathematical/lsmsvgfilterflood.h +55 -0
- data/ext/mathematical/lsmsvgfiltergaussianblur.c +114 -0
- data/ext/mathematical/lsmsvgfiltergaussianblur.h +57 -0
- data/ext/mathematical/lsmsvgfiltermerge.c +98 -0
- data/ext/mathematical/lsmsvgfiltermerge.h +55 -0
- data/ext/mathematical/lsmsvgfiltermergenode.c +87 -0
- data/ext/mathematical/lsmsvgfiltermergenode.h +57 -0
- data/ext/mathematical/lsmsvgfilteroffset.c +112 -0
- data/ext/mathematical/lsmsvgfilteroffset.h +58 -0
- data/ext/mathematical/lsmsvgfilterprimitive.c +168 -0
- data/ext/mathematical/lsmsvgfilterprimitive.h +66 -0
- data/ext/mathematical/lsmsvgfilterspecularlighting.c +127 -0
- data/ext/mathematical/lsmsvgfilterspecularlighting.h +60 -0
- data/ext/mathematical/lsmsvgfiltersurface.c +455 -0
- data/ext/mathematical/lsmsvgfiltersurface.h +66 -0
- data/ext/mathematical/lsmsvgfiltertile.c +102 -0
- data/ext/mathematical/lsmsvgfiltertile.h +57 -0
- data/ext/mathematical/lsmsvggelement.c +73 -0
- data/ext/mathematical/lsmsvggelement.h +55 -0
- data/ext/mathematical/lsmsvggradientelement.c +151 -0
- data/ext/mathematical/lsmsvggradientelement.h +68 -0
- data/ext/mathematical/lsmsvgimageelement.c +261 -0
- data/ext/mathematical/lsmsvgimageelement.h +67 -0
- data/ext/mathematical/lsmsvglength.c +152 -0
- data/ext/mathematical/lsmsvglength.h +65 -0
- data/ext/mathematical/lsmsvglineargradientelement.c +271 -0
- data/ext/mathematical/lsmsvglineargradientelement.h +60 -0
- data/ext/mathematical/lsmsvglineelement.c +153 -0
- data/ext/mathematical/lsmsvglineelement.h +60 -0
- data/ext/mathematical/lsmsvgmarkerelement.c +266 -0
- data/ext/mathematical/lsmsvgmarkerelement.h +74 -0
- data/ext/mathematical/lsmsvgmaskelement.c +232 -0
- data/ext/mathematical/lsmsvgmaskelement.h +64 -0
- data/ext/mathematical/lsmsvgmatrix.c +205 -0
- data/ext/mathematical/lsmsvgmatrix.h +59 -0
- data/ext/mathematical/lsmsvgpathelement.c +115 -0
- data/ext/mathematical/lsmsvgpathelement.h +59 -0
- data/ext/mathematical/lsmsvgpatternelement.c +398 -0
- data/ext/mathematical/lsmsvgpatternelement.h +69 -0
- data/ext/mathematical/lsmsvgpolygonelement.c +106 -0
- data/ext/mathematical/lsmsvgpolygonelement.h +57 -0
- data/ext/mathematical/lsmsvgpolylineelement.c +106 -0
- data/ext/mathematical/lsmsvgpolylineelement.h +57 -0
- data/ext/mathematical/lsmsvgradialgradientelement.c +323 -0
- data/ext/mathematical/lsmsvgradialgradientelement.h +61 -0
- data/ext/mathematical/lsmsvgrectelement.c +184 -0
- data/ext/mathematical/lsmsvgrectelement.h +62 -0
- data/ext/mathematical/lsmsvgstopelement.c +106 -0
- data/ext/mathematical/lsmsvgstopelement.h +57 -0
- data/ext/mathematical/lsmsvgstyle.c +560 -0
- data/ext/mathematical/lsmsvgstyle.h +217 -0
- data/ext/mathematical/lsmsvgsvgelement.c +260 -0
- data/ext/mathematical/lsmsvgsvgelement.h +71 -0
- data/ext/mathematical/lsmsvgswitchelement.c +103 -0
- data/ext/mathematical/lsmsvgswitchelement.h +55 -0
- data/ext/mathematical/lsmsvgsymbolelement.c +74 -0
- data/ext/mathematical/lsmsvgsymbolelement.h +55 -0
- data/ext/mathematical/lsmsvgtextelement.c +203 -0
- data/ext/mathematical/lsmsvgtextelement.h +60 -0
- data/ext/mathematical/lsmsvgtraits.c +1232 -0
- data/ext/mathematical/lsmsvgtraits.h +104 -0
- data/ext/mathematical/lsmsvgtransformable.c +106 -0
- data/ext/mathematical/lsmsvgtransformable.h +54 -0
- data/ext/mathematical/lsmsvgtspanelement.c +174 -0
- data/ext/mathematical/lsmsvgtspanelement.h +60 -0
- data/ext/mathematical/lsmsvgtypes.h +77 -0
- data/ext/mathematical/lsmsvguseelement.c +237 -0
- data/ext/mathematical/lsmsvguseelement.h +69 -0
- data/ext/mathematical/lsmsvgview.c +2583 -0
- data/ext/mathematical/lsmsvgview.h +179 -0
- data/ext/mathematical/lsmtraits.c +119 -0
- data/ext/mathematical/lsmtraits.h +49 -0
- data/ext/mathematical/lsmtypes.h +36 -0
- data/ext/mathematical/lsmutils.c +54 -0
- data/ext/mathematical/lsmutils.h +56 -0
- data/ext/mathematical/mathematical.c +145 -0
- data/ext/mathematical/y.tab.c +6179 -0
- data/ext/mathematical/y.tab.h +389 -0
- data/lib/mathematical/version.rb +1 -1
- data/mathematical.gemspec +8 -6
- data/test/mathematical/basic_test.rb +9 -0
- data/test/mathematical/fixtures/after/brackets_display.html +1 -0
- data/test/mathematical/fixtures/after/compliance_accents.html +17 -0
- data/test/mathematical/fixtures/after/compliance_arrows.html +71 -0
- data/test/mathematical/fixtures/after/compliance_colors.html +4 -0
- data/test/mathematical/fixtures/after/compliance_greek_letters.html +42 -0
- data/test/mathematical/fixtures/after/compliance_large_math.html +19 -0
- data/test/mathematical/fixtures/after/compliance_log_symbols.html +34 -0
- data/test/mathematical/fixtures/after/compliance_operators.html +262 -0
- data/test/mathematical/fixtures/after/dollar_sign_inline.html +1 -0
- data/test/mathematical/fixtures/after/equation_display.html +1 -0
- data/test/mathematical/fixtures/after/multiple_dollar_inline.html +1 -0
- data/test/mathematical/fixtures/after/parens_inline.html +1 -0
- data/test/mathematical/fixtures/before/brackets_display.text +1 -0
- data/test/mathematical/fixtures/before/compliance_accents.text +17 -0
- data/test/mathematical/fixtures/before/compliance_arrows.text +71 -0
- data/test/mathematical/fixtures/before/compliance_colors.text +4 -0
- data/test/mathematical/fixtures/before/compliance_greek_letters.text +42 -0
- data/test/mathematical/fixtures/before/compliance_large_math.text +19 -0
- data/test/mathematical/fixtures/before/compliance_log_symbols.text +34 -0
- data/test/mathematical/fixtures/before/compliance_operators.text +262 -0
- data/test/mathematical/fixtures/before/dollar_sign_inline.text +1 -0
- data/test/mathematical/fixtures/before/equation_display.text +1 -0
- data/test/mathematical/fixtures/before/multiple_dollar_inline.text +1 -0
- data/test/mathematical/fixtures/before/parens_inline.text +1 -0
- data/test/mathematical/fixtures/performance/big_file.text +1767 -0
- data/test/mathematical/fixtures_test.rb +45 -0
- data/test/mathematical/maliciousness_test.rb +45 -0
- data/test/mathematical/performance_test.rb +15 -0
- data/test/test_helper.rb +5 -0
- metadata +301 -14
- data/lib/mathematical.bundle +0 -0
- data/lib/mathematical/mathematical.bundle +0 -0
@@ -0,0 +1,398 @@
|
|
1
|
+
/* Lasem
|
2
|
+
*
|
3
|
+
* Copyright © 2009 Emmanuel Pacaud
|
4
|
+
*
|
5
|
+
* This library is free software; you can redistribute it and/or
|
6
|
+
* modify it under the terms of the GNU Lesser General Public
|
7
|
+
* License as published by the Free Software Foundation; either
|
8
|
+
* version 2 of the License, or (at your option) any later version.
|
9
|
+
*
|
10
|
+
* This library is distributed in the hope that it will be useful,
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
* Lesser General Public License for more details.
|
14
|
+
*
|
15
|
+
* You should have received a copy of the GNU Lesser General
|
16
|
+
* Public License along with this library; if not, write to the
|
17
|
+
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
18
|
+
* Boston, MA 02111-1307, USA.
|
19
|
+
*
|
20
|
+
* Author:
|
21
|
+
* Emmanuel Pacaud <emmanuel@gnome.org>
|
22
|
+
*/
|
23
|
+
|
24
|
+
#include <lsmsvgpatternelement.h>
|
25
|
+
#include <lsmsvgview.h>
|
26
|
+
#include <lsmdebug.h>
|
27
|
+
#include <lsmsvgdocument.h>
|
28
|
+
#include <stdio.h>
|
29
|
+
|
30
|
+
typedef struct {
|
31
|
+
LsmSvgLength x;
|
32
|
+
LsmSvgLength y;
|
33
|
+
LsmSvgLength width;
|
34
|
+
LsmSvgLength height;
|
35
|
+
LsmSvgMatrix transform;
|
36
|
+
LsmSvgPatternUnits units;
|
37
|
+
LsmSvgPatternUnits content_units;
|
38
|
+
LsmBox viewbox;
|
39
|
+
LsmSvgPreserveAspectRatio preserve_aspect_ratio;
|
40
|
+
} LsmSvgPatternElementAttributes;
|
41
|
+
|
42
|
+
static LsmSvgPatternElementAttributes default_attributes = {
|
43
|
+
.x = { .value_unit = 0.0, .type = LSM_SVG_LENGTH_TYPE_PX},
|
44
|
+
.y = { .value_unit = 0.0, .type = LSM_SVG_LENGTH_TYPE_PX},
|
45
|
+
.width = { .value_unit = 0.0, .type = LSM_SVG_LENGTH_TYPE_PX},
|
46
|
+
.height = { .value_unit = 0.0, .type = LSM_SVG_LENGTH_TYPE_PX},
|
47
|
+
.transform = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0, LSM_SVG_MATRIX_FLAGS_IDENTITY},
|
48
|
+
.units = LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX,
|
49
|
+
.content_units = LSM_SVG_PATTERN_UNITS_USER_SPACE_ON_USE,
|
50
|
+
.viewbox = {0.0, 0.0, 0.0, 0.0},
|
51
|
+
.preserve_aspect_ratio = {
|
52
|
+
.defer = FALSE,
|
53
|
+
.align = LSM_SVG_ALIGN_X_MID_Y_MID,
|
54
|
+
.meet_or_slice = LSM_SVG_MEET_OR_SLICE_MEET
|
55
|
+
}
|
56
|
+
};
|
57
|
+
|
58
|
+
static GObjectClass *parent_class;
|
59
|
+
|
60
|
+
/* GdomNode implementation */
|
61
|
+
|
62
|
+
static const char *
|
63
|
+
_pattern_element_get_node_name (LsmDomNode *node)
|
64
|
+
{
|
65
|
+
return "pattern";
|
66
|
+
}
|
67
|
+
|
68
|
+
/* LsmSvgElement implementation */
|
69
|
+
|
70
|
+
static LsmSvgPatternElement *
|
71
|
+
lsm_svg_pattern_element_inherit_referenced (LsmSvgDocument *owner,
|
72
|
+
LsmSvgPatternElement *pattern,
|
73
|
+
LsmSvgPatternElementAttributes *attributes,
|
74
|
+
GSList **elements)
|
75
|
+
{
|
76
|
+
LsmSvgPatternElement *referenced_pattern = pattern;
|
77
|
+
LsmSvgElement *element;
|
78
|
+
|
79
|
+
*elements = g_slist_prepend (*elements, pattern);
|
80
|
+
|
81
|
+
if (lsm_attribute_is_defined (&pattern->href)) {
|
82
|
+
char *id;
|
83
|
+
GSList *iter;
|
84
|
+
gboolean circular_reference_found = FALSE;
|
85
|
+
|
86
|
+
id = pattern->href.value;
|
87
|
+
if (id == NULL)
|
88
|
+
return NULL;
|
89
|
+
if (*id == '#')
|
90
|
+
id++;
|
91
|
+
|
92
|
+
element = lsm_svg_document_get_element_by_id (owner, id);
|
93
|
+
|
94
|
+
for (iter = *elements; iter != NULL; iter = iter->next)
|
95
|
+
if (iter->data == element) {
|
96
|
+
lsm_debug_render ("[LsmSvgPatternElement::inherit_attributes] "
|
97
|
+
"Circular reference (id = %s)", id);
|
98
|
+
circular_reference_found = TRUE;
|
99
|
+
}
|
100
|
+
|
101
|
+
if (!circular_reference_found) {
|
102
|
+
if (LSM_IS_SVG_PATTERN_ELEMENT (element)) {
|
103
|
+
lsm_debug_render ("[LsmSvgPatternElement::inherit_attributes] "
|
104
|
+
"Found referenced element '%s'", id);
|
105
|
+
|
106
|
+
referenced_pattern = lsm_svg_pattern_element_inherit_referenced
|
107
|
+
(owner,
|
108
|
+
LSM_SVG_PATTERN_ELEMENT (element),
|
109
|
+
attributes, elements);
|
110
|
+
} else {
|
111
|
+
lsm_debug_render ("[LsmSvgPatternElement::inherit_attributes] "
|
112
|
+
"Referenced element '%s' not found", id);
|
113
|
+
referenced_pattern = NULL;
|
114
|
+
}
|
115
|
+
} else
|
116
|
+
referenced_pattern = NULL;
|
117
|
+
}
|
118
|
+
|
119
|
+
if (lsm_attribute_is_defined (&pattern->x.base))
|
120
|
+
attributes->x = pattern->x.length;
|
121
|
+
if (lsm_attribute_is_defined (&pattern->y.base))
|
122
|
+
attributes->y = pattern->y.length;
|
123
|
+
if (lsm_attribute_is_defined (&pattern->width.base))
|
124
|
+
attributes->width = pattern->width.length;
|
125
|
+
if (lsm_attribute_is_defined (&pattern->height.base))
|
126
|
+
attributes->height = pattern->height.length;
|
127
|
+
if (lsm_attribute_is_defined (&pattern->transform.base))
|
128
|
+
attributes->transform = pattern->transform.matrix;
|
129
|
+
if (lsm_attribute_is_defined (&pattern->units.base))
|
130
|
+
attributes->units = pattern->units.value;
|
131
|
+
if (lsm_attribute_is_defined (&pattern->content_units.base))
|
132
|
+
attributes->content_units = pattern->content_units.value;
|
133
|
+
if (lsm_attribute_is_defined (&pattern->viewbox.base))
|
134
|
+
attributes->viewbox = pattern->viewbox.value;
|
135
|
+
if (lsm_attribute_is_defined (&pattern->preserve_aspect_ratio.base))
|
136
|
+
attributes->preserve_aspect_ratio = pattern->preserve_aspect_ratio.value;
|
137
|
+
|
138
|
+
return referenced_pattern;
|
139
|
+
}
|
140
|
+
|
141
|
+
static void
|
142
|
+
lsm_svg_pattern_element_render (LsmSvgElement *self, LsmSvgView *view)
|
143
|
+
{
|
144
|
+
LsmSvgPatternElement *pattern = LSM_SVG_PATTERN_ELEMENT (self);
|
145
|
+
LsmSvgPatternElement *referenced_pattern;
|
146
|
+
gboolean is_object_bounding_box;
|
147
|
+
gboolean is_viewbox_defined;
|
148
|
+
LsmBox viewport;
|
149
|
+
LsmBox image_box;
|
150
|
+
const LsmBox *pattern_extents;
|
151
|
+
LsmSvgStyle *style;
|
152
|
+
gboolean is_matrix_invertible = TRUE;
|
153
|
+
|
154
|
+
if (!pattern->enable_rendering) {
|
155
|
+
lsm_debug_render ("[LsmSvgPatternElement::render] Direct rendering not allowed");
|
156
|
+
return;
|
157
|
+
} else {
|
158
|
+
pattern->enable_rendering = FALSE;
|
159
|
+
}
|
160
|
+
|
161
|
+
if (lsm_attribute_is_defined (&pattern->href)) {
|
162
|
+
LsmSvgPatternElementAttributes attributes;
|
163
|
+
LsmSvgDocument *owner;
|
164
|
+
attributes = default_attributes;
|
165
|
+
GSList *elements = NULL;
|
166
|
+
|
167
|
+
owner = LSM_SVG_DOCUMENT (lsm_dom_node_get_owner_document (LSM_DOM_NODE (self)));
|
168
|
+
|
169
|
+
referenced_pattern = lsm_svg_pattern_element_inherit_referenced (owner, pattern,
|
170
|
+
&attributes, &elements);
|
171
|
+
|
172
|
+
g_slist_free (elements);
|
173
|
+
|
174
|
+
pattern->x.length = attributes.x;
|
175
|
+
pattern->y.length = attributes.y;
|
176
|
+
pattern->width.length = attributes.width;
|
177
|
+
pattern->height.length = attributes.height;
|
178
|
+
pattern->transform.matrix = attributes.transform;
|
179
|
+
pattern->units.value = attributes.units;
|
180
|
+
pattern->content_units.value = attributes.content_units;
|
181
|
+
pattern->viewbox.value = attributes.viewbox;
|
182
|
+
pattern->preserve_aspect_ratio.value = attributes.preserve_aspect_ratio;
|
183
|
+
} else
|
184
|
+
referenced_pattern = pattern;
|
185
|
+
|
186
|
+
if (referenced_pattern == NULL)
|
187
|
+
return;
|
188
|
+
|
189
|
+
style = lsm_svg_style_new_inherited (NULL, &self->property_bag);
|
190
|
+
style->ignore_group_opacity = FALSE;
|
191
|
+
lsm_svg_view_push_composition (view, style);
|
192
|
+
|
193
|
+
pattern_extents = lsm_svg_view_get_pattern_extents (view);
|
194
|
+
|
195
|
+
is_object_bounding_box = (pattern->units.value == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX);
|
196
|
+
|
197
|
+
if (is_object_bounding_box) {
|
198
|
+
LsmBox viewbox = {.x = 0.0, .y = .0, .width = 1.0, .height = 1.0};
|
199
|
+
|
200
|
+
lsm_svg_view_push_viewbox (view, &viewbox);
|
201
|
+
}
|
202
|
+
|
203
|
+
viewport.x = lsm_svg_view_normalize_length (view, &pattern->x.length,
|
204
|
+
LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
|
205
|
+
viewport.y = lsm_svg_view_normalize_length (view, &pattern->y.length,
|
206
|
+
LSM_SVG_LENGTH_DIRECTION_VERTICAL);
|
207
|
+
viewport.width = lsm_svg_view_normalize_length (view, &pattern->width.length,
|
208
|
+
LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
|
209
|
+
viewport.height = lsm_svg_view_normalize_length (view, &pattern->height.length,
|
210
|
+
LSM_SVG_LENGTH_DIRECTION_VERTICAL);
|
211
|
+
|
212
|
+
image_box = viewport;
|
213
|
+
|
214
|
+
if (is_object_bounding_box) {
|
215
|
+
lsm_svg_view_pop_viewbox (view);
|
216
|
+
|
217
|
+
image_box.x *= pattern_extents->width;
|
218
|
+
image_box.y *= pattern_extents->height;
|
219
|
+
image_box.width *= pattern_extents->width;
|
220
|
+
image_box.height *= pattern_extents->height;
|
221
|
+
}
|
222
|
+
|
223
|
+
if (viewport.width <= 0.0 || viewport.height <= 0.0) {
|
224
|
+
lsm_debug_render ("[LsmSvgPatternElement::render] Invalid viewport w = %g, h = %g",
|
225
|
+
viewport.width, viewport.height);
|
226
|
+
lsm_svg_view_pop_composition (view);
|
227
|
+
lsm_svg_style_unref (style);
|
228
|
+
return;
|
229
|
+
}
|
230
|
+
|
231
|
+
lsm_debug_render ("[LsmSvgPatternElement::render] Create pattern x = %g, y = %g, w = %g, h = %g",
|
232
|
+
viewport.x, viewport.y, viewport.width, viewport.height);
|
233
|
+
|
234
|
+
if (!lsm_svg_view_create_surface_pattern (view, &image_box,
|
235
|
+
&pattern->transform.matrix,
|
236
|
+
LSM_SVG_VIEW_SURFACE_TYPE_AUTO)) {
|
237
|
+
lsm_debug_render ("[LsmSvgPatternElement::render] Intermediate surface creation failed");
|
238
|
+
lsm_svg_view_pop_composition (view);
|
239
|
+
lsm_svg_style_unref (style);
|
240
|
+
return;
|
241
|
+
}
|
242
|
+
|
243
|
+
is_object_bounding_box = (pattern->content_units.value == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX);
|
244
|
+
|
245
|
+
if (is_object_bounding_box) {
|
246
|
+
LsmSvgMatrix matrix;
|
247
|
+
LsmBox viewbox = {.x = 0.0, .y = .0, .width = 1.0, .height = 1.0};
|
248
|
+
|
249
|
+
lsm_svg_matrix_init_scale (&matrix, pattern_extents->width, pattern_extents->height);
|
250
|
+
lsm_svg_matrix_translate (&matrix, -pattern_extents->x, -pattern_extents->y);
|
251
|
+
lsm_svg_view_push_viewbox (view, &viewbox);
|
252
|
+
is_matrix_invertible = lsm_svg_view_push_matrix (view, &matrix);
|
253
|
+
|
254
|
+
lsm_debug_render ("[LsmSvgPatternElement::render] object_bounding_box"
|
255
|
+
" x_scale = %g, y_scale = %g, x_offset = %g, y_offset = %g",
|
256
|
+
pattern_extents->width, pattern_extents->height,
|
257
|
+
pattern_extents->x, pattern_extents->y);
|
258
|
+
}
|
259
|
+
|
260
|
+
if (is_matrix_invertible) {
|
261
|
+
|
262
|
+
is_viewbox_defined = lsm_attribute_is_defined (&pattern->viewbox.base);
|
263
|
+
|
264
|
+
if (!(is_viewbox_defined) ||
|
265
|
+
(is_viewbox_defined && pattern->viewbox.value.width > 0.0 && pattern->viewbox.value.height > 0.0)) {
|
266
|
+
|
267
|
+
lsm_svg_view_push_viewport (view, &viewport, is_viewbox_defined ? &pattern->viewbox.value : NULL,
|
268
|
+
&pattern->preserve_aspect_ratio.value, LSM_SVG_OVERFLOW_HIDDEN);
|
269
|
+
|
270
|
+
LSM_SVG_ELEMENT_CLASS (parent_class)->render (LSM_SVG_ELEMENT (referenced_pattern), view);
|
271
|
+
|
272
|
+
lsm_svg_view_pop_viewport (view);
|
273
|
+
}
|
274
|
+
}
|
275
|
+
|
276
|
+
if (is_object_bounding_box) {
|
277
|
+
lsm_svg_view_pop_matrix (view);
|
278
|
+
lsm_svg_view_pop_viewbox (view);
|
279
|
+
}
|
280
|
+
|
281
|
+
lsm_svg_view_pop_composition (view);
|
282
|
+
lsm_svg_style_unref (style);
|
283
|
+
}
|
284
|
+
|
285
|
+
static void
|
286
|
+
lsm_svg_pattern_element_enable_rendering (LsmSvgElement *element)
|
287
|
+
{
|
288
|
+
LSM_SVG_PATTERN_ELEMENT (element)->enable_rendering = TRUE;
|
289
|
+
}
|
290
|
+
|
291
|
+
/* LsmSvgPatternElement implementation */
|
292
|
+
|
293
|
+
LsmDomNode *
|
294
|
+
lsm_svg_pattern_element_new (void)
|
295
|
+
{
|
296
|
+
return g_object_new (LSM_TYPE_SVG_PATTERN_ELEMENT, NULL);
|
297
|
+
}
|
298
|
+
|
299
|
+
static void
|
300
|
+
lsm_svg_pattern_element_init (LsmSvgPatternElement *self)
|
301
|
+
{
|
302
|
+
self->enable_rendering = FALSE;
|
303
|
+
self->x.length = default_attributes.x;
|
304
|
+
self->y.length = default_attributes.y;
|
305
|
+
self->width.length = default_attributes.width;
|
306
|
+
self->height.length = default_attributes.height;
|
307
|
+
self->transform.matrix = default_attributes.transform;
|
308
|
+
self->units.value = default_attributes.units;
|
309
|
+
self->content_units.value = default_attributes.content_units;
|
310
|
+
self->preserve_aspect_ratio.value = default_attributes.preserve_aspect_ratio;
|
311
|
+
}
|
312
|
+
|
313
|
+
/* LsmSvgPatternElement class */
|
314
|
+
|
315
|
+
static const LsmAttributeInfos lsm_svg_pattern_element_attribute_infos[] = {
|
316
|
+
{
|
317
|
+
.name = "x",
|
318
|
+
.attribute_offset = offsetof (LsmSvgPatternElement, x),
|
319
|
+
.trait_class = &lsm_svg_length_trait_class,
|
320
|
+
.trait_default = &default_attributes.x
|
321
|
+
},
|
322
|
+
{
|
323
|
+
.name = "y",
|
324
|
+
.attribute_offset = offsetof (LsmSvgPatternElement, y),
|
325
|
+
.trait_class = &lsm_svg_length_trait_class,
|
326
|
+
.trait_default = &default_attributes.y
|
327
|
+
},
|
328
|
+
{
|
329
|
+
.name = "width",
|
330
|
+
.attribute_offset = offsetof (LsmSvgPatternElement, width),
|
331
|
+
.trait_class = &lsm_svg_length_trait_class,
|
332
|
+
.trait_default = &default_attributes.width
|
333
|
+
},
|
334
|
+
{
|
335
|
+
.name = "height",
|
336
|
+
.attribute_offset = offsetof (LsmSvgPatternElement, height),
|
337
|
+
.trait_class = &lsm_svg_length_trait_class,
|
338
|
+
.trait_default = &default_attributes.height
|
339
|
+
},
|
340
|
+
{
|
341
|
+
.name = "patternUnits",
|
342
|
+
.attribute_offset = offsetof (LsmSvgPatternElement, units),
|
343
|
+
.trait_class = &lsm_svg_pattern_units_trait_class,
|
344
|
+
.trait_default = &default_attributes.units
|
345
|
+
},
|
346
|
+
{
|
347
|
+
.name = "patternContentUnits",
|
348
|
+
.attribute_offset = offsetof (LsmSvgPatternElement, content_units),
|
349
|
+
.trait_class = &lsm_svg_pattern_units_trait_class,
|
350
|
+
.trait_default = &default_attributes.content_units
|
351
|
+
},
|
352
|
+
{
|
353
|
+
.name = "patternTransform",
|
354
|
+
.attribute_offset = offsetof (LsmSvgPatternElement, transform),
|
355
|
+
.trait_class = &lsm_svg_matrix_trait_class,
|
356
|
+
.trait_default = &default_attributes.transform
|
357
|
+
},
|
358
|
+
{
|
359
|
+
.name = "xlink:href",
|
360
|
+
.attribute_offset = offsetof (LsmSvgPatternElement, href),
|
361
|
+
.trait_class = &lsm_null_trait_class
|
362
|
+
},
|
363
|
+
{
|
364
|
+
.name = "viewBox",
|
365
|
+
.attribute_offset = offsetof (LsmSvgPatternElement, viewbox),
|
366
|
+
.trait_class = &lsm_box_trait_class,
|
367
|
+
.trait_default = &default_attributes.viewbox
|
368
|
+
},
|
369
|
+
{
|
370
|
+
.name = "preserveAspectRatio",
|
371
|
+
.attribute_offset = offsetof (LsmSvgPatternElement, preserve_aspect_ratio),
|
372
|
+
.trait_class = &lsm_svg_preserve_aspect_ratio_trait_class,
|
373
|
+
.trait_default = &default_attributes.preserve_aspect_ratio
|
374
|
+
}
|
375
|
+
};
|
376
|
+
|
377
|
+
static void
|
378
|
+
lsm_svg_pattern_element_class_init (LsmSvgPatternElementClass *klass)
|
379
|
+
{
|
380
|
+
LsmDomNodeClass *d_node_class = LSM_DOM_NODE_CLASS (klass);
|
381
|
+
LsmSvgElementClass *s_element_class = LSM_SVG_ELEMENT_CLASS (klass);
|
382
|
+
|
383
|
+
parent_class = g_type_class_peek_parent (klass);
|
384
|
+
|
385
|
+
d_node_class->get_node_name = _pattern_element_get_node_name;
|
386
|
+
|
387
|
+
s_element_class->category = LSM_SVG_ELEMENT_CATEGORY_CONTAINER;
|
388
|
+
|
389
|
+
s_element_class->render = lsm_svg_pattern_element_render;
|
390
|
+
s_element_class->enable_rendering = lsm_svg_pattern_element_enable_rendering;
|
391
|
+
s_element_class->attribute_manager = lsm_attribute_manager_duplicate (s_element_class->attribute_manager);
|
392
|
+
|
393
|
+
lsm_attribute_manager_add_attributes (s_element_class->attribute_manager,
|
394
|
+
G_N_ELEMENTS (lsm_svg_pattern_element_attribute_infos),
|
395
|
+
lsm_svg_pattern_element_attribute_infos);
|
396
|
+
}
|
397
|
+
|
398
|
+
G_DEFINE_TYPE (LsmSvgPatternElement, lsm_svg_pattern_element, LSM_TYPE_SVG_ELEMENT)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
/* Lasem
|
2
|
+
*
|
3
|
+
* Copyright © 2009 Emmanuel Pacaud
|
4
|
+
*
|
5
|
+
* This library is free software; you can redistribute it and/or
|
6
|
+
* modify it under the terms of the GNU Lesser General Public
|
7
|
+
* License as published by the Free Software Foundation; either
|
8
|
+
* version 2 of the License, or (at your option) any later version.
|
9
|
+
*
|
10
|
+
* This library is distributed in the hope that it will be useful,
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
* Lesser General Public License for more details.
|
14
|
+
*
|
15
|
+
* You should have received a copy of the GNU Lesser General
|
16
|
+
* Public License along with this library; if not, write to the
|
17
|
+
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
18
|
+
* Boston, MA 02111-1307, USA.
|
19
|
+
*
|
20
|
+
* Author:
|
21
|
+
* Emmanuel Pacaud <emmanuel@gnome.org>
|
22
|
+
*/
|
23
|
+
|
24
|
+
#ifndef LSM_SVG_PATTERN_ELEMENT_H
|
25
|
+
#define LSM_SVG_PATTERN_ELEMENT_H
|
26
|
+
|
27
|
+
#include <lsmsvgtypes.h>
|
28
|
+
#include <lsmsvgelement.h>
|
29
|
+
|
30
|
+
G_BEGIN_DECLS
|
31
|
+
|
32
|
+
#define LSM_TYPE_SVG_PATTERN_ELEMENT (lsm_svg_pattern_element_get_type ())
|
33
|
+
#define LSM_SVG_PATTERN_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LSM_TYPE_SVG_PATTERN_ELEMENT, LsmSvgPatternElement))
|
34
|
+
#define LSM_SVG_PATTERN_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LSM_TYPE_SVG_PATTERN_ELEMENT, LsmSvgPatternElementClass))
|
35
|
+
#define LSM_IS_SVG_PATTERN_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LSM_TYPE_SVG_PATTERN_ELEMENT))
|
36
|
+
#define LSM_IS_SVG_PATTERN_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LSM_TYPE_SVG_PATTERN_ELEMENT))
|
37
|
+
#define LSM_SVG_PATTERN_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), LSM_TYPE_SVG_PATTERN_ELEMENT, LsmSvgPatternElementClass))
|
38
|
+
|
39
|
+
typedef struct _LsmSvgPatternElementClass LsmSvgPatternElementClass;
|
40
|
+
|
41
|
+
struct _LsmSvgPatternElement {
|
42
|
+
LsmSvgElement element;
|
43
|
+
|
44
|
+
LsmSvgLengthAttribute x;
|
45
|
+
LsmSvgLengthAttribute y;
|
46
|
+
LsmSvgLengthAttribute width;
|
47
|
+
LsmSvgLengthAttribute height;
|
48
|
+
LsmSvgTransformAttribute transform;
|
49
|
+
LsmSvgPatternUnitsAttribute units;
|
50
|
+
LsmSvgPatternUnitsAttribute content_units;
|
51
|
+
LsmAttribute href;
|
52
|
+
|
53
|
+
LsmSvgViewboxAttribute viewbox;
|
54
|
+
LsmSvgPreserveAspectRatioAttribute preserve_aspect_ratio;
|
55
|
+
|
56
|
+
gboolean enable_rendering;
|
57
|
+
};
|
58
|
+
|
59
|
+
struct _LsmSvgPatternElementClass {
|
60
|
+
LsmSvgElementClass element_class;
|
61
|
+
};
|
62
|
+
|
63
|
+
GType lsm_svg_pattern_element_get_type (void);
|
64
|
+
|
65
|
+
LsmDomNode * lsm_svg_pattern_element_new (void);
|
66
|
+
|
67
|
+
G_END_DECLS
|
68
|
+
|
69
|
+
#endif
|