mathematical 0.0.1 → 0.0.2

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 (261) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -4
  3. data/.gitmodules +0 -4
  4. data/README.md +108 -28
  5. data/Rakefile +3 -31
  6. data/ext/mathematical/README.itex2MML.md +11 -0
  7. data/ext/mathematical/README.lasem.md +11 -0
  8. data/ext/mathematical/extconf.rb +51 -0
  9. data/ext/mathematical/itex2MML.h +63 -0
  10. data/ext/mathematical/lasemrender.c +257 -0
  11. data/ext/mathematical/lex.yy.c +6548 -0
  12. data/ext/mathematical/lsm.c +30 -0
  13. data/ext/mathematical/lsm.h +36 -0
  14. data/ext/mathematical/lsmattributes.c +279 -0
  15. data/ext/mathematical/lsmattributes.h +75 -0
  16. data/ext/mathematical/lsmcairo.c +598 -0
  17. data/ext/mathematical/lsmcairo.h +51 -0
  18. data/ext/mathematical/lsmdebug.c +179 -0
  19. data/ext/mathematical/lsmdebug.h +76 -0
  20. data/ext/mathematical/lsmdom.h +43 -0
  21. data/ext/mathematical/lsmdomcharacterdata.c +114 -0
  22. data/ext/mathematical/lsmdomcharacterdata.h +59 -0
  23. data/ext/mathematical/lsmdomdocument.c +292 -0
  24. data/ext/mathematical/lsmdomdocument.h +82 -0
  25. data/ext/mathematical/lsmdomdocumentfragment.c +81 -0
  26. data/ext/mathematical/lsmdomdocumentfragment.h +55 -0
  27. data/ext/mathematical/lsmdomelement.c +148 -0
  28. data/ext/mathematical/lsmdomelement.h +62 -0
  29. data/ext/mathematical/lsmdomentities.c +2155 -0
  30. data/ext/mathematical/lsmdomentities.h +35 -0
  31. data/ext/mathematical/lsmdomenumtypes.c +99 -0
  32. data/ext/mathematical/lsmdomenumtypes.c.template +39 -0
  33. data/ext/mathematical/lsmdomenumtypes.h +26 -0
  34. data/ext/mathematical/lsmdomenumtypes.h.template +26 -0
  35. data/ext/mathematical/lsmdomimplementation.c +82 -0
  36. data/ext/mathematical/lsmdomimplementation.h +41 -0
  37. data/ext/mathematical/lsmdomnamednodemap.c +118 -0
  38. data/ext/mathematical/lsmdomnamednodemap.h +64 -0
  39. data/ext/mathematical/lsmdomnode.c +725 -0
  40. data/ext/mathematical/lsmdomnode.h +120 -0
  41. data/ext/mathematical/lsmdomnodelist.c +70 -0
  42. data/ext/mathematical/lsmdomnodelist.h +58 -0
  43. data/ext/mathematical/lsmdomparser.c +461 -0
  44. data/ext/mathematical/lsmdomparser.h +54 -0
  45. data/ext/mathematical/lsmdomtext.c +82 -0
  46. data/ext/mathematical/lsmdomtext.h +55 -0
  47. data/ext/mathematical/lsmdomtypes.h +44 -0
  48. data/ext/mathematical/lsmdomview.c +422 -0
  49. data/ext/mathematical/lsmdomview.h +94 -0
  50. data/ext/mathematical/lsmmathml.h +66 -0
  51. data/ext/mathematical/lsmmathmlactionelement.c +93 -0
  52. data/ext/mathematical/lsmmathmlactionelement.h +57 -0
  53. data/ext/mathematical/lsmmathmlaligngroupelement.c +102 -0
  54. data/ext/mathematical/lsmmathmlaligngroupelement.h +56 -0
  55. data/ext/mathematical/lsmmathmlalignmarkelement.c +102 -0
  56. data/ext/mathematical/lsmmathmlalignmarkelement.h +56 -0
  57. data/ext/mathematical/lsmmathmlattributes.c +197 -0
  58. data/ext/mathematical/lsmmathmlattributes.h +126 -0
  59. data/ext/mathematical/lsmmathmldocument.c +306 -0
  60. data/ext/mathematical/lsmmathmldocument.h +61 -0
  61. data/ext/mathematical/lsmmathmlelement.c +491 -0
  62. data/ext/mathematical/lsmmathmlelement.h +107 -0
  63. data/ext/mathematical/lsmmathmlenums.c +429 -0
  64. data/ext/mathematical/lsmmathmlenums.h +182 -0
  65. data/ext/mathematical/lsmmathmlenumtypes.c +666 -0
  66. data/ext/mathematical/lsmmathmlenumtypes.c.template +39 -0
  67. data/ext/mathematical/lsmmathmlenumtypes.h +90 -0
  68. data/ext/mathematical/lsmmathmlenumtypes.h.template +26 -0
  69. data/ext/mathematical/lsmmathmlerrorelement.c +58 -0
  70. data/ext/mathematical/lsmmathmlerrorelement.h +56 -0
  71. data/ext/mathematical/lsmmathmlfencedelement.c +178 -0
  72. data/ext/mathematical/lsmmathmlfencedelement.h +65 -0
  73. data/ext/mathematical/lsmmathmlfractionelement.c +253 -0
  74. data/ext/mathematical/lsmmathmlfractionelement.h +62 -0
  75. data/ext/mathematical/lsmmathmlglyphtableams.c +597 -0
  76. data/ext/mathematical/lsmmathmlglyphtableams.h +45 -0
  77. data/ext/mathematical/lsmmathmlitexelement.c +187 -0
  78. data/ext/mathematical/lsmmathmlitexelement.h +60 -0
  79. data/ext/mathematical/lsmmathmllayoututils.c +191 -0
  80. data/ext/mathematical/lsmmathmllayoututils.h +58 -0
  81. data/ext/mathematical/lsmmathmlmathelement.c +204 -0
  82. data/ext/mathematical/lsmmathmlmathelement.h +81 -0
  83. data/ext/mathematical/lsmmathmloperatordictionary.c +3332 -0
  84. data/ext/mathematical/lsmmathmloperatordictionary.h +54 -0
  85. data/ext/mathematical/lsmmathmloperatorelement.c +307 -0
  86. data/ext/mathematical/lsmmathmloperatorelement.h +73 -0
  87. data/ext/mathematical/lsmmathmlpaddedelement.c +58 -0
  88. data/ext/mathematical/lsmmathmlpaddedelement.h +56 -0
  89. data/ext/mathematical/lsmmathmlphantomelement.c +71 -0
  90. data/ext/mathematical/lsmmathmlphantomelement.h +56 -0
  91. data/ext/mathematical/lsmmathmlpresentationcontainer.c +43 -0
  92. data/ext/mathematical/lsmmathmlpresentationcontainer.h +54 -0
  93. data/ext/mathematical/lsmmathmlpresentationtoken.c +303 -0
  94. data/ext/mathematical/lsmmathmlpresentationtoken.h +83 -0
  95. data/ext/mathematical/lsmmathmlradicalelement.c +266 -0
  96. data/ext/mathematical/lsmmathmlradicalelement.h +71 -0
  97. data/ext/mathematical/lsmmathmlrowelement.c +58 -0
  98. data/ext/mathematical/lsmmathmlrowelement.h +56 -0
  99. data/ext/mathematical/lsmmathmlscriptelement.c +282 -0
  100. data/ext/mathematical/lsmmathmlscriptelement.h +78 -0
  101. data/ext/mathematical/lsmmathmlsemanticselement.c +82 -0
  102. data/ext/mathematical/lsmmathmlsemanticselement.h +56 -0
  103. data/ext/mathematical/lsmmathmlspaceelement.c +142 -0
  104. data/ext/mathematical/lsmmathmlspaceelement.h +60 -0
  105. data/ext/mathematical/lsmmathmlstringelement.c +123 -0
  106. data/ext/mathematical/lsmmathmlstringelement.h +58 -0
  107. data/ext/mathematical/lsmmathmlstyle.c +130 -0
  108. data/ext/mathematical/lsmmathmlstyle.h +81 -0
  109. data/ext/mathematical/lsmmathmlstyleelement.c +307 -0
  110. data/ext/mathematical/lsmmathmlstyleelement.h +87 -0
  111. data/ext/mathematical/lsmmathmltablecellelement.c +122 -0
  112. data/ext/mathematical/lsmmathmltablecellelement.h +62 -0
  113. data/ext/mathematical/lsmmathmltableelement.c +545 -0
  114. data/ext/mathematical/lsmmathmltableelement.h +78 -0
  115. data/ext/mathematical/lsmmathmltablerowelement.c +120 -0
  116. data/ext/mathematical/lsmmathmltablerowelement.h +64 -0
  117. data/ext/mathematical/lsmmathmltraits.c +819 -0
  118. data/ext/mathematical/lsmmathmltraits.h +119 -0
  119. data/ext/mathematical/lsmmathmltypes.h +66 -0
  120. data/ext/mathematical/lsmmathmlunderoverelement.c +485 -0
  121. data/ext/mathematical/lsmmathmlunderoverelement.h +82 -0
  122. data/ext/mathematical/lsmmathmlutils.c +170 -0
  123. data/ext/mathematical/lsmmathmlutils.h +50 -0
  124. data/ext/mathematical/lsmmathmlview.c +1048 -0
  125. data/ext/mathematical/lsmmathmlview.h +164 -0
  126. data/ext/mathematical/lsmproperties.c +418 -0
  127. data/ext/mathematical/lsmproperties.h +85 -0
  128. data/ext/mathematical/lsmstr.c +231 -0
  129. data/ext/mathematical/lsmstr.h +114 -0
  130. data/ext/mathematical/lsmsvg.h +67 -0
  131. data/ext/mathematical/lsmsvgaelement.c +73 -0
  132. data/ext/mathematical/lsmsvgaelement.h +55 -0
  133. data/ext/mathematical/lsmsvgattributes.h +113 -0
  134. data/ext/mathematical/lsmsvgcircleelement.c +153 -0
  135. data/ext/mathematical/lsmsvgcircleelement.h +59 -0
  136. data/ext/mathematical/lsmsvgclippathelement.c +134 -0
  137. data/ext/mathematical/lsmsvgclippathelement.h +59 -0
  138. data/ext/mathematical/lsmsvgcolors.c +212 -0
  139. data/ext/mathematical/lsmsvgcolors.h +39 -0
  140. data/ext/mathematical/lsmsvgdefselement.c +74 -0
  141. data/ext/mathematical/lsmsvgdefselement.h +55 -0
  142. data/ext/mathematical/lsmsvgdocument.c +230 -0
  143. data/ext/mathematical/lsmsvgdocument.h +58 -0
  144. data/ext/mathematical/lsmsvgelement.c +367 -0
  145. data/ext/mathematical/lsmsvgelement.h +81 -0
  146. data/ext/mathematical/lsmsvgellipseelement.c +158 -0
  147. data/ext/mathematical/lsmsvgellipseelement.h +60 -0
  148. data/ext/mathematical/lsmsvgenums.c +544 -0
  149. data/ext/mathematical/lsmsvgenums.h +357 -0
  150. data/ext/mathematical/lsmsvgenumtypes.c +1083 -0
  151. data/ext/mathematical/lsmsvgenumtypes.c.template +39 -0
  152. data/ext/mathematical/lsmsvgenumtypes.h +111 -0
  153. data/ext/mathematical/lsmsvgenumtypes.h.template +26 -0
  154. data/ext/mathematical/lsmsvgfilterblend.c +105 -0
  155. data/ext/mathematical/lsmsvgfilterblend.h +58 -0
  156. data/ext/mathematical/lsmsvgfiltercomposite.c +109 -0
  157. data/ext/mathematical/lsmsvgfiltercomposite.h +58 -0
  158. data/ext/mathematical/lsmsvgfilterelement.c +266 -0
  159. data/ext/mathematical/lsmsvgfilterelement.h +66 -0
  160. data/ext/mathematical/lsmsvgfilterflood.c +86 -0
  161. data/ext/mathematical/lsmsvgfilterflood.h +55 -0
  162. data/ext/mathematical/lsmsvgfiltergaussianblur.c +114 -0
  163. data/ext/mathematical/lsmsvgfiltergaussianblur.h +57 -0
  164. data/ext/mathematical/lsmsvgfiltermerge.c +98 -0
  165. data/ext/mathematical/lsmsvgfiltermerge.h +55 -0
  166. data/ext/mathematical/lsmsvgfiltermergenode.c +87 -0
  167. data/ext/mathematical/lsmsvgfiltermergenode.h +57 -0
  168. data/ext/mathematical/lsmsvgfilteroffset.c +112 -0
  169. data/ext/mathematical/lsmsvgfilteroffset.h +58 -0
  170. data/ext/mathematical/lsmsvgfilterprimitive.c +168 -0
  171. data/ext/mathematical/lsmsvgfilterprimitive.h +66 -0
  172. data/ext/mathematical/lsmsvgfilterspecularlighting.c +127 -0
  173. data/ext/mathematical/lsmsvgfilterspecularlighting.h +60 -0
  174. data/ext/mathematical/lsmsvgfiltersurface.c +455 -0
  175. data/ext/mathematical/lsmsvgfiltersurface.h +66 -0
  176. data/ext/mathematical/lsmsvgfiltertile.c +102 -0
  177. data/ext/mathematical/lsmsvgfiltertile.h +57 -0
  178. data/ext/mathematical/lsmsvggelement.c +73 -0
  179. data/ext/mathematical/lsmsvggelement.h +55 -0
  180. data/ext/mathematical/lsmsvggradientelement.c +151 -0
  181. data/ext/mathematical/lsmsvggradientelement.h +68 -0
  182. data/ext/mathematical/lsmsvgimageelement.c +261 -0
  183. data/ext/mathematical/lsmsvgimageelement.h +67 -0
  184. data/ext/mathematical/lsmsvglength.c +93 -0
  185. data/ext/mathematical/lsmsvglength.h +59 -0
  186. data/ext/mathematical/lsmsvglineargradientelement.c +271 -0
  187. data/ext/mathematical/lsmsvglineargradientelement.h +60 -0
  188. data/ext/mathematical/lsmsvglineelement.c +153 -0
  189. data/ext/mathematical/lsmsvglineelement.h +60 -0
  190. data/ext/mathematical/lsmsvgmarkerelement.c +266 -0
  191. data/ext/mathematical/lsmsvgmarkerelement.h +74 -0
  192. data/ext/mathematical/lsmsvgmaskelement.c +232 -0
  193. data/ext/mathematical/lsmsvgmaskelement.h +64 -0
  194. data/ext/mathematical/lsmsvgmatrix.c +205 -0
  195. data/ext/mathematical/lsmsvgmatrix.h +59 -0
  196. data/ext/mathematical/lsmsvgpathelement.c +115 -0
  197. data/ext/mathematical/lsmsvgpathelement.h +59 -0
  198. data/ext/mathematical/lsmsvgpatternelement.c +398 -0
  199. data/ext/mathematical/lsmsvgpatternelement.h +69 -0
  200. data/ext/mathematical/lsmsvgpolygonelement.c +106 -0
  201. data/ext/mathematical/lsmsvgpolygonelement.h +57 -0
  202. data/ext/mathematical/lsmsvgpolylineelement.c +106 -0
  203. data/ext/mathematical/lsmsvgpolylineelement.h +57 -0
  204. data/ext/mathematical/lsmsvgradialgradientelement.c +323 -0
  205. data/ext/mathematical/lsmsvgradialgradientelement.h +61 -0
  206. data/ext/mathematical/lsmsvgrectelement.c +184 -0
  207. data/ext/mathematical/lsmsvgrectelement.h +62 -0
  208. data/ext/mathematical/lsmsvgstopelement.c +106 -0
  209. data/ext/mathematical/lsmsvgstopelement.h +57 -0
  210. data/ext/mathematical/lsmsvgstyle.c +558 -0
  211. data/ext/mathematical/lsmsvgstyle.h +217 -0
  212. data/ext/mathematical/lsmsvgsvgelement.c +260 -0
  213. data/ext/mathematical/lsmsvgsvgelement.h +71 -0
  214. data/ext/mathematical/lsmsvgswitchelement.c +103 -0
  215. data/ext/mathematical/lsmsvgswitchelement.h +55 -0
  216. data/ext/mathematical/lsmsvgsymbolelement.c +74 -0
  217. data/ext/mathematical/lsmsvgsymbolelement.h +55 -0
  218. data/ext/mathematical/lsmsvgtextelement.c +170 -0
  219. data/ext/mathematical/lsmsvgtextelement.h +58 -0
  220. data/ext/mathematical/lsmsvgtraits.c +1158 -0
  221. data/ext/mathematical/lsmsvgtraits.h +103 -0
  222. data/ext/mathematical/lsmsvgtransformable.c +106 -0
  223. data/ext/mathematical/lsmsvgtransformable.h +54 -0
  224. data/ext/mathematical/lsmsvgtspanelement.c +143 -0
  225. data/ext/mathematical/lsmsvgtspanelement.h +58 -0
  226. data/ext/mathematical/lsmsvgtypes.h +77 -0
  227. data/ext/mathematical/lsmsvguseelement.c +237 -0
  228. data/ext/mathematical/lsmsvguseelement.h +69 -0
  229. data/ext/mathematical/lsmsvgview.c +2400 -0
  230. data/ext/mathematical/lsmsvgview.h +168 -0
  231. data/ext/mathematical/lsmtraits.c +119 -0
  232. data/ext/mathematical/lsmtraits.h +49 -0
  233. data/ext/mathematical/lsmtypes.h +36 -0
  234. data/ext/mathematical/lsmutils.c +54 -0
  235. data/ext/mathematical/lsmutils.h +56 -0
  236. data/ext/mathematical/mathematical.c +122 -0
  237. data/ext/mathematical/y.tab.c +6179 -0
  238. data/ext/mathematical/y.tab.h +389 -0
  239. data/lib/mathematical.rb +7 -3
  240. data/lib/mathematical/parser.rb +1 -1
  241. data/lib/mathematical/render.rb +51 -77
  242. data/lib/mathematical/version.rb +1 -1
  243. data/mathematical.gemspec +5 -3
  244. data/script/bench +21 -0
  245. data/script/single_test +7 -0
  246. data/test/mathematical/basic_test.rb +30 -1
  247. data/test/mathematical/fixtures/after/brackets_display.html +1 -0
  248. data/test/mathematical/fixtures/after/dollar_sign_inline.html +1 -0
  249. data/test/mathematical/fixtures/after/equation_display.html +1 -0
  250. data/test/mathematical/fixtures/after/multiple_dollar_inline.html +1 -0
  251. data/test/mathematical/fixtures/after/parens_inline.html +1 -0
  252. data/test/mathematical/fixtures/before/brackets_display.text +1 -0
  253. data/test/mathematical/fixtures/before/{basic.text → dollar_sign_inline.text} +0 -0
  254. data/test/mathematical/fixtures/before/equation_display.text +1 -0
  255. data/test/mathematical/fixtures/before/multiple_dollar_inline.text +1 -0
  256. data/test/mathematical/fixtures/before/parens_inline.text +1 -0
  257. data/test/mathematical/fixtures/performance/big_file.text +1767 -0
  258. data/test/mathematical/performance_test.rb +13 -0
  259. data/test/test_helper.rb +1 -0
  260. metadata +303 -18
  261. data/test/mathematical/fixtures/after/basic.html +0 -1
@@ -0,0 +1,55 @@
1
+ /* Lasem
2
+ *
3
+ * Copyright © 2009-2012 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_DEFS_ELEMENT_H
25
+ #define LSM_SVG_DEFS_ELEMENT_H
26
+
27
+ #include <lsmsvgtypes.h>
28
+ #include <lsmsvgtransformable.h>
29
+
30
+ G_BEGIN_DECLS
31
+
32
+ #define LSM_TYPE_SVG_DEFS_ELEMENT (lsm_svg_defs_element_get_type ())
33
+ #define LSM_SVG_DEFS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LSM_TYPE_SVG_DEFS_ELEMENT, LsmSvgDefsElement))
34
+ #define LSM_SVG_DEFS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LSM_TYPE_SVG_DEFS_ELEMENT, LsmSvgDefsElementClass))
35
+ #define LSM_IS_SVG_DEFS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LSM_TYPE_SVG_DEFS_ELEMENT))
36
+ #define LSM_IS_SVG_DEFS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LSM_TYPE_SVG_DEFS_ELEMENT))
37
+ #define LSM_SVG_DEFS_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), LSM_TYPE_SVG_DEFS_ELEMENT, LsmSvgDefsElementClass))
38
+
39
+ typedef struct _LsmSvgDefsElementClass LsmSvgDefsElementClass;
40
+
41
+ struct _LsmSvgDefsElement {
42
+ LsmSvgTransformable base;
43
+ };
44
+
45
+ struct _LsmSvgDefsElementClass {
46
+ LsmSvgTransformableClass base_class;
47
+ };
48
+
49
+ GType lsm_svg_defs_element_get_type (void);
50
+
51
+ LsmDomNode * lsm_svg_defs_element_new (void);
52
+
53
+ G_END_DECLS
54
+
55
+ #endif
@@ -0,0 +1,230 @@
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 <lsmdebug.h>
25
+ #include <lsmsvgaelement.h>
26
+ #include <lsmsvgcircleelement.h>
27
+ #include <lsmsvgclippathelement.h>
28
+ #include <lsmsvgdefselement.h>
29
+ #include <lsmsvgdocument.h>
30
+ #include <lsmsvgellipseelement.h>
31
+ #include <lsmsvgfilterelement.h>
32
+ #include <lsmsvgfilterblend.h>
33
+ #include <lsmsvgfiltercomposite.h>
34
+ #include <lsmsvgfilterflood.h>
35
+ #include <lsmsvgfiltergaussianblur.h>
36
+ #include <lsmsvgfilteroffset.h>
37
+ #include <lsmsvgfiltermerge.h>
38
+ #include <lsmsvgfiltermergenode.h>
39
+ #include <lsmsvgfilterspecularlighting.h>
40
+ #include <lsmsvgfiltertile.h>
41
+ #include <lsmsvggelement.h>
42
+ #include <lsmsvgimageelement.h>
43
+ #include <lsmsvglineargradientelement.h>
44
+ #include <lsmsvglineelement.h>
45
+ #include <lsmsvgmarkerelement.h>
46
+ #include <lsmsvgmaskelement.h>
47
+ #include <lsmsvgpolylineelement.h>
48
+ #include <lsmsvgpolygonelement.h>
49
+ #include <lsmsvgpathelement.h>
50
+ #include <lsmsvgpatternelement.h>
51
+ #include <lsmsvgradialgradientelement.h>
52
+ #include <lsmsvgrectelement.h>
53
+ #include <lsmsvgsvgelement.h>
54
+ #include <lsmsvgstopelement.h>
55
+ #include <lsmsvgswitchelement.h>
56
+ #include <lsmsvgsymbolelement.h>
57
+ #include <lsmsvgtextelement.h>
58
+ #include <lsmsvgtspanelement.h>
59
+ #include <lsmsvguseelement.h>
60
+ #include <lsmsvgview.h>
61
+ #include <string.h>
62
+
63
+ /* LsmDomNode implementation */
64
+
65
+ static gboolean
66
+ lsm_svg_document_can_append_child (LsmDomNode *self, LsmDomNode *child)
67
+ {
68
+ return (LSM_IS_SVG_SVG_ELEMENT (child));
69
+ }
70
+
71
+ /* LsmDomDocument implementation */
72
+
73
+ LsmSvgElement *
74
+ lsm_svg_document_get_element_by_url (LsmSvgDocument *document, const char *url)
75
+ {
76
+ LsmDomElement *element;
77
+ char *end;
78
+ char *id;
79
+
80
+ g_return_val_if_fail (LSM_IS_SVG_DOCUMENT (document), NULL);
81
+
82
+ if (url == NULL || strncmp (url, "url(#", 5) != 0)
83
+ return NULL;
84
+
85
+ id = g_strdup (url + 5);
86
+ for (end = id; *end != '\0' && *end != ')'; end++);
87
+ *end = '\0';
88
+
89
+ element = lsm_dom_document_get_element_by_id (LSM_DOM_DOCUMENT (document), id);
90
+
91
+ g_free (id);
92
+
93
+ return LSM_SVG_ELEMENT (element);
94
+ }
95
+
96
+ static LsmDomElement *
97
+ _create_element (LsmDomDocument *document, const char *tag_name)
98
+ {
99
+ LsmDomNode *node = NULL;
100
+
101
+ if (strcmp (tag_name, "svg") == 0)
102
+ node = lsm_svg_svg_element_new ();
103
+ else if (strcmp (tag_name, "g") == 0)
104
+ node = lsm_svg_g_element_new ();
105
+ else if (strcmp (tag_name, "rect") == 0)
106
+ node = lsm_svg_rect_element_new ();
107
+ else if (strcmp (tag_name, "circle") == 0)
108
+ node = lsm_svg_circle_element_new ();
109
+ else if (strcmp (tag_name, "ellipse") == 0)
110
+ node = lsm_svg_ellipse_element_new ();
111
+ else if (strcmp (tag_name, "path") == 0)
112
+ node = lsm_svg_path_element_new ();
113
+ else if (strcmp (tag_name, "line") == 0)
114
+ node = lsm_svg_line_element_new ();
115
+ else if (strcmp (tag_name, "polyline") == 0)
116
+ node = lsm_svg_polyline_element_new ();
117
+ else if (strcmp (tag_name, "polygon") == 0)
118
+ node = lsm_svg_polygon_element_new ();
119
+ else if (strcmp (tag_name, "text") == 0)
120
+ node = lsm_svg_text_element_new ();
121
+ else if (strcmp (tag_name, "tspan") == 0)
122
+ node = lsm_svg_tspan_element_new ();
123
+ else if (strcmp (tag_name, "linearGradient") == 0)
124
+ node = lsm_svg_linear_gradient_element_new ();
125
+ else if (strcmp (tag_name, "radialGradient") == 0)
126
+ node = lsm_svg_radial_gradient_element_new ();
127
+ else if (strcmp (tag_name, "stop") == 0)
128
+ node = lsm_svg_stop_element_new ();
129
+ else if (strcmp (tag_name, "pattern") == 0)
130
+ node = lsm_svg_pattern_element_new ();
131
+ else if (strcmp (tag_name, "mask") == 0)
132
+ node = lsm_svg_mask_element_new ();
133
+ else if (strcmp (tag_name, "use") == 0)
134
+ node = lsm_svg_use_element_new ();
135
+ else if (strcmp (tag_name, "image") == 0)
136
+ node = lsm_svg_image_element_new ();
137
+ else if (strcmp (tag_name, "defs") == 0)
138
+ node = lsm_svg_defs_element_new ();
139
+ else if (strcmp (tag_name, "symbol") == 0)
140
+ node = lsm_svg_symbol_element_new ();
141
+ else if (strcmp (tag_name, "marker") == 0)
142
+ node = lsm_svg_marker_element_new ();
143
+ else if (strcmp (tag_name, "clipPath") == 0)
144
+ node = lsm_svg_clip_path_element_new ();
145
+ else if (strcmp (tag_name, "switch") == 0)
146
+ node = lsm_svg_switch_element_new ();
147
+ else if (strcmp (tag_name, "a") == 0)
148
+ node = lsm_svg_a_element_new ();
149
+ else if (strcmp (tag_name, "filter") == 0)
150
+ node = lsm_svg_filter_element_new ();
151
+ else if (strcmp (tag_name, "feBlend") == 0)
152
+ node = lsm_svg_filter_blend_new ();
153
+ else if (strcmp (tag_name, "feComposite") == 0)
154
+ node = lsm_svg_filter_composite_new ();
155
+ else if (strcmp (tag_name, "feFlood") == 0)
156
+ node = lsm_svg_filter_flood_new ();
157
+ else if (strcmp (tag_name, "feGaussianBlur") == 0)
158
+ node = lsm_svg_filter_gaussian_blur_new ();
159
+ else if (strcmp (tag_name, "feMerge") == 0)
160
+ node = lsm_svg_filter_merge_new ();
161
+ else if (strcmp (tag_name, "feMergeNode") == 0)
162
+ node = lsm_svg_filter_merge_node_new ();
163
+ else if (strcmp (tag_name, "feOffset") == 0)
164
+ node = lsm_svg_filter_offset_new ();
165
+ else if (strcmp (tag_name, "feSpecularLighting") == 0)
166
+ node = lsm_svg_filter_specular_lighting_new ();
167
+ else if (strcmp (tag_name, "feTile") == 0)
168
+ node = lsm_svg_filter_tile_new ();
169
+
170
+ if (node != NULL)
171
+ lsm_debug_dom ("[LsmSvgDocument::create_element] Create a %s element", tag_name);
172
+
173
+ return LSM_DOM_ELEMENT (node);
174
+ }
175
+
176
+ static LsmDomElement *
177
+ lsm_svg_document_create_element (LsmDomDocument *document, const char *tag_name)
178
+ {
179
+ LsmDomElement *element;
180
+
181
+ element = _create_element (document, tag_name);
182
+ if (element != NULL)
183
+ return element;
184
+
185
+ if (g_str_has_prefix (tag_name, "svg:"))
186
+ return _create_element (document, &tag_name[4]);
187
+
188
+ return NULL;
189
+ }
190
+
191
+ static LsmDomView *
192
+ lsm_svg_document_create_view (LsmDomDocument *document)
193
+ {
194
+ return LSM_DOM_VIEW (lsm_svg_view_new (LSM_SVG_DOCUMENT (document)));
195
+ }
196
+
197
+ /* LsmSvgDocument implementation */
198
+
199
+ LsmDomDocument *
200
+ lsm_svg_document_new (void)
201
+ {
202
+ return g_object_new (LSM_TYPE_SVG_DOCUMENT, NULL);
203
+ }
204
+
205
+ static void
206
+ lsm_svg_document_init (LsmSvgDocument *document)
207
+ {
208
+ }
209
+
210
+ LsmSvgSvgElement *
211
+ lsm_svg_document_get_root_element (const LsmSvgDocument *document)
212
+ {
213
+ return LSM_SVG_SVG_ELEMENT (lsm_dom_document_get_document_element (LSM_DOM_DOCUMENT (document)));
214
+ }
215
+
216
+ /* LsmSvgDocument class */
217
+
218
+ static void
219
+ lsm_svg_document_class_init (LsmSvgDocumentClass *m_document_class)
220
+ {
221
+ LsmDomNodeClass *d_node_class = LSM_DOM_NODE_CLASS (m_document_class);
222
+ LsmDomDocumentClass *d_document_class = LSM_DOM_DOCUMENT_CLASS (m_document_class);
223
+
224
+ d_node_class->can_append_child = lsm_svg_document_can_append_child;
225
+
226
+ d_document_class->create_element = lsm_svg_document_create_element;
227
+ d_document_class->create_view = lsm_svg_document_create_view;
228
+ }
229
+
230
+ G_DEFINE_TYPE (LsmSvgDocument, lsm_svg_document, LSM_TYPE_DOM_DOCUMENT)
@@ -0,0 +1,58 @@
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_DOCUMENT_H
25
+ #define LSM_SVG_DOCUMENT_H
26
+
27
+ #include <lsmsvgtypes.h>
28
+ #include <lsmdomdocument.h>
29
+
30
+ G_BEGIN_DECLS
31
+
32
+ #define LSM_TYPE_SVG_DOCUMENT (lsm_svg_document_get_type ())
33
+ #define LSM_SVG_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LSM_TYPE_SVG_DOCUMENT, LsmSvgDocument))
34
+ #define LSM_SVG_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LSM_TYPE_SVG_DOCUMENT, LsmSvgDocumentClass))
35
+ #define LSM_IS_SVG_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LSM_TYPE_SVG_DOCUMENT))
36
+ #define LSM_IS_SVG_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LSM_TYPE_SVG_DOCUMENT))
37
+ #define LSM_SVG_DOCUMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), LSM_TYPE_SVG_DOCUMENT, LsmSvgDocumentClass))
38
+
39
+ typedef struct _LsmSvgDocumentClass LsmSvgDocumentClass;
40
+
41
+ struct _LsmSvgDocument {
42
+ LsmDomDocument document;
43
+ };
44
+
45
+ struct _LsmSvgDocumentClass {
46
+ LsmDomDocumentClass parent_class;
47
+ };
48
+
49
+ GType lsm_svg_document_get_type (void);
50
+
51
+ LsmDomDocument * lsm_svg_document_new (void);
52
+ LsmSvgSvgElement * lsm_svg_document_get_root_element (const LsmSvgDocument *document);
53
+ LsmSvgElement * lsm_svg_document_get_element_by_url (LsmSvgDocument *document, const char *url);
54
+
55
+ G_END_DECLS
56
+
57
+ #endif
58
+
@@ -0,0 +1,367 @@
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 <lsmdebug.h>
25
+ #include <lsmattributes.h>
26
+ #include <lsmproperties.h>
27
+ #include <lsmdomdocument.h>
28
+ #include <lsmsvgelement.h>
29
+ #include <lsmsvgtransformable.h>
30
+ #include <lsmsvgpatternelement.h>
31
+ #include <lsmsvgradialgradientelement.h>
32
+ #include <lsmsvglineargradientelement.h>
33
+ #include <lsmsvgclippathelement.h>
34
+ #include <lsmsvgmarkerelement.h>
35
+ #include <lsmsvgmaskelement.h>
36
+ #include <lsmsvgfilterelement.h>
37
+ #include <lsmsvgview.h>
38
+ #include <string.h>
39
+
40
+ static GObjectClass *parent_class;
41
+
42
+ /* LsmDomNode implementation */
43
+
44
+ static gboolean
45
+ lsm_svg_element_can_append_child (LsmDomNode *self, LsmDomNode *child)
46
+ {
47
+ return (LSM_IS_SVG_ELEMENT (child));
48
+ }
49
+
50
+ static gboolean
51
+ lsm_svg_element_child_changed (LsmDomNode *parent, LsmDomNode *child)
52
+ {
53
+ #if 0
54
+ if (LSM_IS_SVG_ELEMENT (child) &&
55
+ lsm_svg_element_get_category (LSM_SVG_ELEMENT (child)) == 0)
56
+ g_warning ("Category not defined for '%s'", lsm_dom_node_get_node_name (child));
57
+ #endif
58
+
59
+ return TRUE;
60
+ }
61
+
62
+ /* LsmDomElement implementation */
63
+
64
+ static void
65
+ lsm_svg_element_set_attribute (LsmDomElement *self, const char* name, const char *value)
66
+ {
67
+ LsmSvgElementClass *s_element_class = LSM_SVG_ELEMENT_GET_CLASS (self);
68
+ LsmSvgElement *s_element = LSM_SVG_ELEMENT (self);
69
+
70
+ lsm_debug_dom ("[LsmSvgElement::set_attribute] node = %s, name = %s, value = %s",
71
+ lsm_dom_node_get_node_name (LSM_DOM_NODE (self)), name, value);
72
+
73
+ /* TODO Avoid double hash table lookup */
74
+ if (!lsm_attribute_manager_set_attribute (s_element_class->attribute_manager,
75
+ self, name, value))
76
+ lsm_svg_property_bag_set_property (&s_element->property_bag, name, value);
77
+
78
+ if (g_strcmp0 (name, "id") == 0 ||
79
+ g_strcmp0 (name, "xml:id") == 0) {
80
+ LsmDomDocument *document;
81
+
82
+ document = lsm_dom_node_get_owner_document (LSM_DOM_NODE (self));
83
+ if (document != NULL)
84
+ lsm_dom_document_register_element (document, LSM_DOM_ELEMENT (self), value);
85
+ }
86
+ }
87
+
88
+ const char *
89
+ lsm_svg_element_get_attribute (LsmDomElement *self, const char *name)
90
+ {
91
+ LsmSvgElementClass *s_element_class = LSM_SVG_ELEMENT_GET_CLASS(self);
92
+ LsmSvgElement *s_element = LSM_SVG_ELEMENT (self);
93
+ const char *value;
94
+
95
+ /* TODO Avoid double hash table lookup */
96
+ value = lsm_attribute_manager_get_attribute (s_element_class->attribute_manager,
97
+ self, name);
98
+ if (value != NULL)
99
+ return value;
100
+
101
+ return lsm_svg_property_bag_get_property (&s_element->property_bag, name);
102
+ }
103
+
104
+ static char *
105
+ lsm_svg_element_get_serialized_attributes (LsmDomElement *self)
106
+ {
107
+ LsmSvgElementClass *s_element_class = LSM_SVG_ELEMENT_GET_CLASS(self);
108
+ LsmSvgElement *s_element = LSM_SVG_ELEMENT (self);
109
+ char *properties;
110
+ char *attributes;
111
+ char *result;
112
+
113
+ properties = lsm_svg_property_bag_serialize (&s_element->property_bag);
114
+ attributes = lsm_attribute_manager_serialize (s_element_class->attribute_manager, self);
115
+
116
+ if (attributes == NULL)
117
+ return properties;
118
+
119
+ if (properties == NULL)
120
+ return attributes;
121
+
122
+ result = g_strconcat (attributes, " ", properties, NULL);
123
+
124
+ g_free (properties);
125
+ g_free (attributes);
126
+
127
+ return result;
128
+ }
129
+
130
+ /* LsmSvgElement implementation */
131
+
132
+ LsmSvgElementCategory
133
+ lsm_svg_element_get_category (LsmSvgElement *element)
134
+ {
135
+ LsmSvgElementClass *s_element_class = LSM_SVG_ELEMENT_GET_CLASS (element);
136
+
137
+ return s_element_class != NULL ? s_element_class->category : 0;
138
+ }
139
+
140
+ static void
141
+ _render (LsmSvgElement *element, LsmSvgView *view)
142
+ {
143
+ LsmDomNode *node;
144
+
145
+ lsm_debug_render ("[LsmSvgElement::_render");
146
+
147
+ for (node = LSM_DOM_NODE (element)->first_child; node != NULL; node = node->next_sibling)
148
+ if (LSM_IS_SVG_ELEMENT (node))
149
+ lsm_svg_element_render (LSM_SVG_ELEMENT (node), view);
150
+ }
151
+
152
+ static void
153
+ _transformed_render (LsmSvgElement *element, LsmSvgView *view)
154
+ {
155
+ LsmSvgElementClass *element_class;
156
+ const LsmSvgStyle *parent_style;
157
+ LsmSvgStyle *style;
158
+
159
+ element_class = LSM_SVG_ELEMENT_GET_CLASS (element);
160
+
161
+ parent_style = lsm_svg_view_get_current_style (view);
162
+ style = lsm_svg_style_new_inherited (parent_style, &element->property_bag);
163
+ style->ignore_group_opacity = element_class->is_shape_element;
164
+
165
+ if (style->visibility->value == LSM_SVG_VISIBILITY_VISIBLE &&
166
+ style->display->value != LSM_SVG_DISPLAY_NONE) {
167
+
168
+ lsm_debug_render ("[LsmSvgElement::render] Render %s (%s)",
169
+ lsm_dom_node_get_node_name (LSM_DOM_NODE (element)),
170
+ element->id.value != NULL ? element->id.value : "no id");
171
+ lsm_svg_view_push_element (view, element);
172
+ lsm_svg_view_push_composition (view, style);
173
+
174
+ element_class->render (element, view);
175
+
176
+ lsm_svg_view_pop_composition (view);
177
+ lsm_svg_view_pop_element (view);
178
+ }
179
+
180
+ lsm_svg_style_unref (style);
181
+ }
182
+
183
+ void
184
+ lsm_svg_element_render (LsmSvgElement *element, LsmSvgView *view)
185
+ {
186
+ LsmSvgElementClass *element_class;
187
+
188
+ g_return_if_fail (LSM_IS_SVG_ELEMENT (element));
189
+
190
+ element_class = LSM_SVG_ELEMENT_GET_CLASS (element);
191
+
192
+ if (element_class->render != NULL)
193
+ element_class->transformed_render (element, view);
194
+ }
195
+
196
+ static void
197
+ lsm_svg_element_enable_rendering (LsmSvgElement *element)
198
+ {
199
+ LsmSvgElementClass *element_class;
200
+
201
+ g_return_if_fail (LSM_IS_SVG_ELEMENT (element));
202
+
203
+ element_class = LSM_SVG_ELEMENT_GET_CLASS (element);
204
+ g_return_if_fail (element_class->enable_rendering != NULL);
205
+
206
+ element_class->enable_rendering (element);
207
+ }
208
+
209
+ void
210
+ lsm_svg_element_force_render (LsmSvgElement *element, LsmSvgView *view)
211
+ {
212
+ g_return_if_fail (LSM_IS_SVG_PATTERN_ELEMENT (element) ||
213
+ LSM_IS_SVG_RADIAL_GRADIENT_ELEMENT (element) ||
214
+ LSM_IS_SVG_LINEAR_GRADIENT_ELEMENT (element) ||
215
+ LSM_IS_SVG_MASK_ELEMENT (element) ||
216
+ LSM_IS_SVG_CLIP_PATH_ELEMENT (element) ||
217
+ LSM_IS_SVG_MARKER_ELEMENT (element) ||
218
+ LSM_IS_SVG_FILTER_ELEMENT (element));
219
+
220
+ lsm_svg_element_enable_rendering (element);
221
+ lsm_svg_element_render (element, view);
222
+ }
223
+
224
+ void
225
+ lsm_svg_element_transformed_get_extents (LsmSvgElement *element, LsmSvgView *view, LsmExtents *extents)
226
+ {
227
+ LsmSvgElementClass *element_class;
228
+ g_return_if_fail (LSM_IS_SVG_ELEMENT (element));
229
+ g_return_if_fail (LSM_IS_SVG_VIEW (view));
230
+ g_return_if_fail (extents != NULL);
231
+
232
+ element_class = LSM_SVG_ELEMENT_GET_CLASS (element);
233
+
234
+ if (element_class->transformed_get_extents != NULL)
235
+ element_class->transformed_get_extents (element, view, extents);
236
+ else
237
+ element_class->get_extents (element, view, extents);
238
+ }
239
+
240
+ static void
241
+ _get_extents (LsmSvgElement *element, LsmSvgView *view, LsmExtents *extents)
242
+ {
243
+ LsmDomNode *node;
244
+ gboolean first_child = TRUE;
245
+ LsmExtents element_extents = {0.0, 0.0, 0.0, 0.0};
246
+
247
+ lsm_debug_render ("[LsmSvgElement::_get_extents]");
248
+
249
+ for (node = LSM_DOM_NODE (element)->first_child; node != NULL; node = node->next_sibling) {
250
+ if (LSM_IS_SVG_ELEMENT (node)) {
251
+ LsmExtents child_extents;
252
+ LsmSvgElement *child_element;
253
+ LsmSvgElementClass *child_element_class;
254
+
255
+ child_element = LSM_SVG_ELEMENT (node);
256
+ child_element_class = LSM_SVG_ELEMENT_GET_CLASS (node);
257
+
258
+ if (child_element_class->transformed_get_extents != NULL)
259
+ child_element_class->transformed_get_extents (child_element, view, &child_extents);
260
+ else
261
+ child_element_class->get_extents (child_element, view, &child_extents);
262
+
263
+ if (first_child) {
264
+ element_extents = child_extents;
265
+ first_child = FALSE;
266
+ } else {
267
+ element_extents.x1 = MIN (element_extents.x1, child_extents.x1);
268
+ element_extents.y1 = MIN (element_extents.y1, child_extents.y1);
269
+ element_extents.x2 = MAX (element_extents.x2, child_extents.x2);
270
+ element_extents.y2 = MAX (element_extents.y2, child_extents.y2);
271
+ }
272
+ }
273
+ }
274
+
275
+ *extents = element_extents;
276
+ }
277
+
278
+ void
279
+ lsm_svg_element_get_extents (LsmSvgElement *element, LsmSvgView *view, LsmExtents *extents)
280
+ {
281
+ LsmSvgElementClass *element_class;
282
+
283
+ g_return_if_fail (LSM_IS_SVG_ELEMENT (element));
284
+ g_return_if_fail (LSM_IS_SVG_VIEW (view));
285
+ g_return_if_fail (extents != NULL);
286
+
287
+ element_class = LSM_SVG_ELEMENT_GET_CLASS (element);
288
+ element_class->get_extents (element, view, extents);
289
+
290
+ if (element->id.value != NULL)
291
+ lsm_debug_measure ("LsmSvgElement::get_extents] Extents for '%s' = %g,%g %g,%g",
292
+ element->id.value,
293
+ extents->x1, extents->y1, extents->x2, extents->y2);
294
+ else
295
+ lsm_debug_measure ("LsmSvgElement::get_extents] Extents for <%s> = %g,%g %g,%g",
296
+ lsm_dom_node_get_node_name (LSM_DOM_NODE (element)),
297
+ extents->x1, extents->y1, extents->x2, extents->y2);
298
+ }
299
+
300
+ static void
301
+ lsm_svg_element_init (LsmSvgElement *element)
302
+ {
303
+ }
304
+
305
+ static void
306
+ lsm_svg_element_finalize (GObject *object)
307
+ {
308
+ LsmSvgElementClass *s_element_class = LSM_SVG_ELEMENT_GET_CLASS (object);
309
+ LsmSvgElement *svg_element = LSM_SVG_ELEMENT (object);
310
+
311
+ lsm_svg_property_bag_clean (&svg_element->property_bag);
312
+ lsm_attribute_manager_clean_attributes (s_element_class->attribute_manager, svg_element);
313
+
314
+ parent_class->finalize (object);
315
+ }
316
+
317
+ /* LsmSvgElement class */
318
+
319
+ static const LsmSvgMatrix matrix_default = { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, LSM_SVG_MATRIX_FLAGS_IDENTITY};
320
+
321
+ static const LsmAttributeInfos lsm_svg_attribute_infos[] = {
322
+ {
323
+ .name = "id",
324
+ .trait_class = &lsm_null_trait_class,
325
+ .attribute_offset = offsetof (LsmSvgElement, id)
326
+ },
327
+ {
328
+ .name = "xml:id",
329
+ .trait_class = &lsm_null_trait_class,
330
+ .attribute_offset = offsetof (LsmSvgElement, id)
331
+ },
332
+ {
333
+ .name = "class",
334
+ .trait_class = &lsm_null_trait_class,
335
+ .attribute_offset = offsetof (LsmSvgElement, class_name)
336
+ }
337
+ };
338
+
339
+ static void
340
+ lsm_svg_element_class_init (LsmSvgElementClass *s_element_class)
341
+ {
342
+ GObjectClass *object_class = G_OBJECT_CLASS (s_element_class);
343
+ LsmDomNodeClass *d_node_class = LSM_DOM_NODE_CLASS (s_element_class);
344
+ LsmDomElementClass *d_element_class = LSM_DOM_ELEMENT_CLASS (s_element_class);
345
+
346
+ parent_class = g_type_class_peek_parent (s_element_class);
347
+
348
+ object_class->finalize = lsm_svg_element_finalize;
349
+
350
+ d_node_class->can_append_child = lsm_svg_element_can_append_child;
351
+ d_node_class->child_changed = lsm_svg_element_child_changed;
352
+
353
+ d_element_class->get_attribute = lsm_svg_element_get_attribute;
354
+ d_element_class->set_attribute = lsm_svg_element_set_attribute;
355
+ d_element_class->get_serialized_attributes = lsm_svg_element_get_serialized_attributes;
356
+
357
+ s_element_class->category = 0;
358
+
359
+ s_element_class->render = _render;
360
+ s_element_class->get_extents = _get_extents;
361
+ s_element_class->transformed_render = _transformed_render;
362
+ s_element_class->transformed_get_extents = NULL;
363
+ s_element_class->attribute_manager = lsm_attribute_manager_new (G_N_ELEMENTS (lsm_svg_attribute_infos),
364
+ lsm_svg_attribute_infos);
365
+ }
366
+
367
+ G_DEFINE_ABSTRACT_TYPE (LsmSvgElement, lsm_svg_element, LSM_TYPE_DOM_ELEMENT)