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.
Files changed (263) hide show
  1. checksums.yaml +4 -4
  2. data/ext/mathematical/extconf.rb +14 -0
  3. data/ext/mathematical/itex2MML.h +63 -0
  4. data/ext/mathematical/lasemrender.c +257 -0
  5. data/ext/mathematical/lex.yy.c +6548 -0
  6. data/ext/mathematical/lsm.c +31 -0
  7. data/ext/mathematical/lsm.h +39 -0
  8. data/ext/mathematical/lsmattributes.c +279 -0
  9. data/ext/mathematical/lsmattributes.h +75 -0
  10. data/ext/mathematical/lsmcairo.c +598 -0
  11. data/ext/mathematical/lsmcairo.h +51 -0
  12. data/ext/mathematical/lsmdebug.c +183 -0
  13. data/ext/mathematical/lsmdebug.h +73 -0
  14. data/ext/mathematical/lsmdom.h +43 -0
  15. data/ext/mathematical/lsmdomcharacterdata.c +114 -0
  16. data/ext/mathematical/lsmdomcharacterdata.h +59 -0
  17. data/ext/mathematical/lsmdomdocument.c +255 -0
  18. data/ext/mathematical/lsmdomdocument.h +75 -0
  19. data/ext/mathematical/lsmdomdocumentfragment.c +81 -0
  20. data/ext/mathematical/lsmdomdocumentfragment.h +55 -0
  21. data/ext/mathematical/lsmdomelement.c +148 -0
  22. data/ext/mathematical/lsmdomelement.h +62 -0
  23. data/ext/mathematical/lsmdomentities.c +2166 -0
  24. data/ext/mathematical/lsmdomentities.h +35 -0
  25. data/ext/mathematical/lsmdomenumtypes.c +99 -0
  26. data/ext/mathematical/lsmdomenumtypes.h +26 -0
  27. data/ext/mathematical/lsmdomimplementation.c +82 -0
  28. data/ext/mathematical/lsmdomimplementation.h +41 -0
  29. data/ext/mathematical/lsmdomnamednodemap.c +118 -0
  30. data/ext/mathematical/lsmdomnamednodemap.h +64 -0
  31. data/ext/mathematical/lsmdomnode.c +737 -0
  32. data/ext/mathematical/lsmdomnode.h +122 -0
  33. data/ext/mathematical/lsmdomnodelist.c +70 -0
  34. data/ext/mathematical/lsmdomnodelist.h +58 -0
  35. data/ext/mathematical/lsmdomparser.c +461 -0
  36. data/ext/mathematical/lsmdomparser.h +54 -0
  37. data/ext/mathematical/lsmdomtext.c +82 -0
  38. data/ext/mathematical/lsmdomtext.h +55 -0
  39. data/ext/mathematical/lsmdomtypes.h +44 -0
  40. data/ext/mathematical/lsmdomview.c +422 -0
  41. data/ext/mathematical/lsmdomview.h +94 -0
  42. data/ext/mathematical/lsmitex.c +76 -0
  43. data/ext/mathematical/lsmitex.h +36 -0
  44. data/ext/mathematical/lsmmathml.h +66 -0
  45. data/ext/mathematical/lsmmathmlactionelement.c +93 -0
  46. data/ext/mathematical/lsmmathmlactionelement.h +57 -0
  47. data/ext/mathematical/lsmmathmlaligngroupelement.c +102 -0
  48. data/ext/mathematical/lsmmathmlaligngroupelement.h +56 -0
  49. data/ext/mathematical/lsmmathmlalignmarkelement.c +102 -0
  50. data/ext/mathematical/lsmmathmlalignmarkelement.h +56 -0
  51. data/ext/mathematical/lsmmathmlattributes.c +197 -0
  52. data/ext/mathematical/lsmmathmlattributes.h +126 -0
  53. data/ext/mathematical/lsmmathmldocument.c +304 -0
  54. data/ext/mathematical/lsmmathmldocument.h +61 -0
  55. data/ext/mathematical/lsmmathmlelement.c +491 -0
  56. data/ext/mathematical/lsmmathmlelement.h +107 -0
  57. data/ext/mathematical/lsmmathmlenums.c +429 -0
  58. data/ext/mathematical/lsmmathmlenums.h +182 -0
  59. data/ext/mathematical/lsmmathmlenumtypes.c +666 -0
  60. data/ext/mathematical/lsmmathmlenumtypes.h +90 -0
  61. data/ext/mathematical/lsmmathmlerrorelement.c +58 -0
  62. data/ext/mathematical/lsmmathmlerrorelement.h +56 -0
  63. data/ext/mathematical/lsmmathmlfencedelement.c +178 -0
  64. data/ext/mathematical/lsmmathmlfencedelement.h +65 -0
  65. data/ext/mathematical/lsmmathmlfractionelement.c +253 -0
  66. data/ext/mathematical/lsmmathmlfractionelement.h +62 -0
  67. data/ext/mathematical/lsmmathmlglyphtableams.c +597 -0
  68. data/ext/mathematical/lsmmathmlglyphtableams.h +45 -0
  69. data/ext/mathematical/lsmmathmlitexelement.c +187 -0
  70. data/ext/mathematical/lsmmathmlitexelement.h +60 -0
  71. data/ext/mathematical/lsmmathmllayoututils.c +191 -0
  72. data/ext/mathematical/lsmmathmllayoututils.h +58 -0
  73. data/ext/mathematical/lsmmathmlmathelement.c +204 -0
  74. data/ext/mathematical/lsmmathmlmathelement.h +81 -0
  75. data/ext/mathematical/lsmmathmloperatordictionary.c +3332 -0
  76. data/ext/mathematical/lsmmathmloperatordictionary.h +54 -0
  77. data/ext/mathematical/lsmmathmloperatorelement.c +307 -0
  78. data/ext/mathematical/lsmmathmloperatorelement.h +73 -0
  79. data/ext/mathematical/lsmmathmlpaddedelement.c +58 -0
  80. data/ext/mathematical/lsmmathmlpaddedelement.h +56 -0
  81. data/ext/mathematical/lsmmathmlphantomelement.c +71 -0
  82. data/ext/mathematical/lsmmathmlphantomelement.h +56 -0
  83. data/ext/mathematical/lsmmathmlpresentationcontainer.c +43 -0
  84. data/ext/mathematical/lsmmathmlpresentationcontainer.h +54 -0
  85. data/ext/mathematical/lsmmathmlpresentationtoken.c +303 -0
  86. data/ext/mathematical/lsmmathmlpresentationtoken.h +83 -0
  87. data/ext/mathematical/lsmmathmlradicalelement.c +266 -0
  88. data/ext/mathematical/lsmmathmlradicalelement.h +71 -0
  89. data/ext/mathematical/lsmmathmlrowelement.c +58 -0
  90. data/ext/mathematical/lsmmathmlrowelement.h +56 -0
  91. data/ext/mathematical/lsmmathmlscriptelement.c +282 -0
  92. data/ext/mathematical/lsmmathmlscriptelement.h +78 -0
  93. data/ext/mathematical/lsmmathmlsemanticselement.c +84 -0
  94. data/ext/mathematical/lsmmathmlsemanticselement.h +56 -0
  95. data/ext/mathematical/lsmmathmlspaceelement.c +142 -0
  96. data/ext/mathematical/lsmmathmlspaceelement.h +60 -0
  97. data/ext/mathematical/lsmmathmlstringelement.c +123 -0
  98. data/ext/mathematical/lsmmathmlstringelement.h +58 -0
  99. data/ext/mathematical/lsmmathmlstyle.c +130 -0
  100. data/ext/mathematical/lsmmathmlstyle.h +81 -0
  101. data/ext/mathematical/lsmmathmlstyleelement.c +307 -0
  102. data/ext/mathematical/lsmmathmlstyleelement.h +87 -0
  103. data/ext/mathematical/lsmmathmltablecellelement.c +122 -0
  104. data/ext/mathematical/lsmmathmltablecellelement.h +62 -0
  105. data/ext/mathematical/lsmmathmltableelement.c +545 -0
  106. data/ext/mathematical/lsmmathmltableelement.h +78 -0
  107. data/ext/mathematical/lsmmathmltablerowelement.c +120 -0
  108. data/ext/mathematical/lsmmathmltablerowelement.h +64 -0
  109. data/ext/mathematical/lsmmathmltraits.c +819 -0
  110. data/ext/mathematical/lsmmathmltraits.h +119 -0
  111. data/ext/mathematical/lsmmathmltypes.h +66 -0
  112. data/ext/mathematical/lsmmathmlunderoverelement.c +485 -0
  113. data/ext/mathematical/lsmmathmlunderoverelement.h +82 -0
  114. data/ext/mathematical/lsmmathmlutils.c +170 -0
  115. data/ext/mathematical/lsmmathmlutils.h +50 -0
  116. data/ext/mathematical/lsmmathmlview.c +1048 -0
  117. data/ext/mathematical/lsmmathmlview.h +164 -0
  118. data/ext/mathematical/lsmproperties.c +418 -0
  119. data/ext/mathematical/lsmproperties.h +85 -0
  120. data/ext/mathematical/lsmstr.c +231 -0
  121. data/ext/mathematical/lsmstr.h +114 -0
  122. data/ext/mathematical/lsmsvg.h +67 -0
  123. data/ext/mathematical/lsmsvgaelement.c +73 -0
  124. data/ext/mathematical/lsmsvgaelement.h +55 -0
  125. data/ext/mathematical/lsmsvgattributes.h +118 -0
  126. data/ext/mathematical/lsmsvgcircleelement.c +153 -0
  127. data/ext/mathematical/lsmsvgcircleelement.h +59 -0
  128. data/ext/mathematical/lsmsvgclippathelement.c +134 -0
  129. data/ext/mathematical/lsmsvgclippathelement.h +59 -0
  130. data/ext/mathematical/lsmsvgcolors.c +212 -0
  131. data/ext/mathematical/lsmsvgcolors.h +39 -0
  132. data/ext/mathematical/lsmsvgdefselement.c +74 -0
  133. data/ext/mathematical/lsmsvgdefselement.h +55 -0
  134. data/ext/mathematical/lsmsvgdocument.c +288 -0
  135. data/ext/mathematical/lsmsvgdocument.h +64 -0
  136. data/ext/mathematical/lsmsvgelement.c +373 -0
  137. data/ext/mathematical/lsmsvgelement.h +81 -0
  138. data/ext/mathematical/lsmsvgellipseelement.c +158 -0
  139. data/ext/mathematical/lsmsvgellipseelement.h +60 -0
  140. data/ext/mathematical/lsmsvgenums.c +544 -0
  141. data/ext/mathematical/lsmsvgenums.h +357 -0
  142. data/ext/mathematical/lsmsvgenumtypes.c +1083 -0
  143. data/ext/mathematical/lsmsvgenumtypes.h +111 -0
  144. data/ext/mathematical/lsmsvgfilterblend.c +105 -0
  145. data/ext/mathematical/lsmsvgfilterblend.h +58 -0
  146. data/ext/mathematical/lsmsvgfiltercomposite.c +109 -0
  147. data/ext/mathematical/lsmsvgfiltercomposite.h +58 -0
  148. data/ext/mathematical/lsmsvgfilterelement.c +266 -0
  149. data/ext/mathematical/lsmsvgfilterelement.h +66 -0
  150. data/ext/mathematical/lsmsvgfilterflood.c +86 -0
  151. data/ext/mathematical/lsmsvgfilterflood.h +55 -0
  152. data/ext/mathematical/lsmsvgfiltergaussianblur.c +114 -0
  153. data/ext/mathematical/lsmsvgfiltergaussianblur.h +57 -0
  154. data/ext/mathematical/lsmsvgfiltermerge.c +98 -0
  155. data/ext/mathematical/lsmsvgfiltermerge.h +55 -0
  156. data/ext/mathematical/lsmsvgfiltermergenode.c +87 -0
  157. data/ext/mathematical/lsmsvgfiltermergenode.h +57 -0
  158. data/ext/mathematical/lsmsvgfilteroffset.c +112 -0
  159. data/ext/mathematical/lsmsvgfilteroffset.h +58 -0
  160. data/ext/mathematical/lsmsvgfilterprimitive.c +168 -0
  161. data/ext/mathematical/lsmsvgfilterprimitive.h +66 -0
  162. data/ext/mathematical/lsmsvgfilterspecularlighting.c +127 -0
  163. data/ext/mathematical/lsmsvgfilterspecularlighting.h +60 -0
  164. data/ext/mathematical/lsmsvgfiltersurface.c +455 -0
  165. data/ext/mathematical/lsmsvgfiltersurface.h +66 -0
  166. data/ext/mathematical/lsmsvgfiltertile.c +102 -0
  167. data/ext/mathematical/lsmsvgfiltertile.h +57 -0
  168. data/ext/mathematical/lsmsvggelement.c +73 -0
  169. data/ext/mathematical/lsmsvggelement.h +55 -0
  170. data/ext/mathematical/lsmsvggradientelement.c +151 -0
  171. data/ext/mathematical/lsmsvggradientelement.h +68 -0
  172. data/ext/mathematical/lsmsvgimageelement.c +261 -0
  173. data/ext/mathematical/lsmsvgimageelement.h +67 -0
  174. data/ext/mathematical/lsmsvglength.c +152 -0
  175. data/ext/mathematical/lsmsvglength.h +65 -0
  176. data/ext/mathematical/lsmsvglineargradientelement.c +271 -0
  177. data/ext/mathematical/lsmsvglineargradientelement.h +60 -0
  178. data/ext/mathematical/lsmsvglineelement.c +153 -0
  179. data/ext/mathematical/lsmsvglineelement.h +60 -0
  180. data/ext/mathematical/lsmsvgmarkerelement.c +266 -0
  181. data/ext/mathematical/lsmsvgmarkerelement.h +74 -0
  182. data/ext/mathematical/lsmsvgmaskelement.c +232 -0
  183. data/ext/mathematical/lsmsvgmaskelement.h +64 -0
  184. data/ext/mathematical/lsmsvgmatrix.c +205 -0
  185. data/ext/mathematical/lsmsvgmatrix.h +59 -0
  186. data/ext/mathematical/lsmsvgpathelement.c +115 -0
  187. data/ext/mathematical/lsmsvgpathelement.h +59 -0
  188. data/ext/mathematical/lsmsvgpatternelement.c +398 -0
  189. data/ext/mathematical/lsmsvgpatternelement.h +69 -0
  190. data/ext/mathematical/lsmsvgpolygonelement.c +106 -0
  191. data/ext/mathematical/lsmsvgpolygonelement.h +57 -0
  192. data/ext/mathematical/lsmsvgpolylineelement.c +106 -0
  193. data/ext/mathematical/lsmsvgpolylineelement.h +57 -0
  194. data/ext/mathematical/lsmsvgradialgradientelement.c +323 -0
  195. data/ext/mathematical/lsmsvgradialgradientelement.h +61 -0
  196. data/ext/mathematical/lsmsvgrectelement.c +184 -0
  197. data/ext/mathematical/lsmsvgrectelement.h +62 -0
  198. data/ext/mathematical/lsmsvgstopelement.c +106 -0
  199. data/ext/mathematical/lsmsvgstopelement.h +57 -0
  200. data/ext/mathematical/lsmsvgstyle.c +560 -0
  201. data/ext/mathematical/lsmsvgstyle.h +217 -0
  202. data/ext/mathematical/lsmsvgsvgelement.c +260 -0
  203. data/ext/mathematical/lsmsvgsvgelement.h +71 -0
  204. data/ext/mathematical/lsmsvgswitchelement.c +103 -0
  205. data/ext/mathematical/lsmsvgswitchelement.h +55 -0
  206. data/ext/mathematical/lsmsvgsymbolelement.c +74 -0
  207. data/ext/mathematical/lsmsvgsymbolelement.h +55 -0
  208. data/ext/mathematical/lsmsvgtextelement.c +203 -0
  209. data/ext/mathematical/lsmsvgtextelement.h +60 -0
  210. data/ext/mathematical/lsmsvgtraits.c +1232 -0
  211. data/ext/mathematical/lsmsvgtraits.h +104 -0
  212. data/ext/mathematical/lsmsvgtransformable.c +106 -0
  213. data/ext/mathematical/lsmsvgtransformable.h +54 -0
  214. data/ext/mathematical/lsmsvgtspanelement.c +174 -0
  215. data/ext/mathematical/lsmsvgtspanelement.h +60 -0
  216. data/ext/mathematical/lsmsvgtypes.h +77 -0
  217. data/ext/mathematical/lsmsvguseelement.c +237 -0
  218. data/ext/mathematical/lsmsvguseelement.h +69 -0
  219. data/ext/mathematical/lsmsvgview.c +2583 -0
  220. data/ext/mathematical/lsmsvgview.h +179 -0
  221. data/ext/mathematical/lsmtraits.c +119 -0
  222. data/ext/mathematical/lsmtraits.h +49 -0
  223. data/ext/mathematical/lsmtypes.h +36 -0
  224. data/ext/mathematical/lsmutils.c +54 -0
  225. data/ext/mathematical/lsmutils.h +56 -0
  226. data/ext/mathematical/mathematical.c +145 -0
  227. data/ext/mathematical/y.tab.c +6179 -0
  228. data/ext/mathematical/y.tab.h +389 -0
  229. data/lib/mathematical/version.rb +1 -1
  230. data/mathematical.gemspec +8 -6
  231. data/test/mathematical/basic_test.rb +9 -0
  232. data/test/mathematical/fixtures/after/brackets_display.html +1 -0
  233. data/test/mathematical/fixtures/after/compliance_accents.html +17 -0
  234. data/test/mathematical/fixtures/after/compliance_arrows.html +71 -0
  235. data/test/mathematical/fixtures/after/compliance_colors.html +4 -0
  236. data/test/mathematical/fixtures/after/compliance_greek_letters.html +42 -0
  237. data/test/mathematical/fixtures/after/compliance_large_math.html +19 -0
  238. data/test/mathematical/fixtures/after/compliance_log_symbols.html +34 -0
  239. data/test/mathematical/fixtures/after/compliance_operators.html +262 -0
  240. data/test/mathematical/fixtures/after/dollar_sign_inline.html +1 -0
  241. data/test/mathematical/fixtures/after/equation_display.html +1 -0
  242. data/test/mathematical/fixtures/after/multiple_dollar_inline.html +1 -0
  243. data/test/mathematical/fixtures/after/parens_inline.html +1 -0
  244. data/test/mathematical/fixtures/before/brackets_display.text +1 -0
  245. data/test/mathematical/fixtures/before/compliance_accents.text +17 -0
  246. data/test/mathematical/fixtures/before/compliance_arrows.text +71 -0
  247. data/test/mathematical/fixtures/before/compliance_colors.text +4 -0
  248. data/test/mathematical/fixtures/before/compliance_greek_letters.text +42 -0
  249. data/test/mathematical/fixtures/before/compliance_large_math.text +19 -0
  250. data/test/mathematical/fixtures/before/compliance_log_symbols.text +34 -0
  251. data/test/mathematical/fixtures/before/compliance_operators.text +262 -0
  252. data/test/mathematical/fixtures/before/dollar_sign_inline.text +1 -0
  253. data/test/mathematical/fixtures/before/equation_display.text +1 -0
  254. data/test/mathematical/fixtures/before/multiple_dollar_inline.text +1 -0
  255. data/test/mathematical/fixtures/before/parens_inline.text +1 -0
  256. data/test/mathematical/fixtures/performance/big_file.text +1767 -0
  257. data/test/mathematical/fixtures_test.rb +45 -0
  258. data/test/mathematical/maliciousness_test.rb +45 -0
  259. data/test/mathematical/performance_test.rb +15 -0
  260. data/test/test_helper.rb +5 -0
  261. metadata +301 -14
  262. data/lib/mathematical.bundle +0 -0
  263. 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