mathematical 1.1.1 → 1.2.0

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/ext/mathematical/extconf.rb +6 -1
  3. data/ext/mathematical/lasem/src/lsmdomcharacterdata.c +17 -0
  4. data/ext/mathematical/lasem/src/lsmdomdocument.c +17 -0
  5. data/ext/mathematical/lasem/src/lsmmathmlfencedelement.c +8 -6
  6. data/ext/mathematical/lasem/src/lsmmathmloperatorelement.c +8 -6
  7. data/ext/mathematical/lasem/src/lsmmathmlview.c +12 -7
  8. data/ext/mathematical/lasem/src/lsmmathmlview.h +2 -0
  9. data/ext/mathematical/lasem/src/lsmsvgsymbolelement.c +74 -0
  10. data/ext/mathematical/lasem/src/lsmsvgsymbolelement.h +3 -0
  11. data/ext/mathematical/lasem/src/lsmsvguseelement.c +10 -9
  12. data/ext/mathematical/lasem/src/lsmsvgview.c +12 -0
  13. data/ext/mathematical/lasem/src/lsmsvgview.h +1 -0
  14. data/ext/mathematical/lasem/tests/lsmtest.c +1 -1
  15. data/ext/mathematical/lasem/tests/suite.c +18 -1
  16. data/ext/mathematical/mtex2MML/src/lex.yy.c +4454 -4090
  17. data/ext/mathematical/mtex2MML/src/mtex2MML.h +1 -0
  18. data/ext/mathematical/mtex2MML/src/parse_extras.c +176 -41
  19. data/ext/mathematical/mtex2MML/src/parse_extras.h +30 -8
  20. data/ext/mathematical/mtex2MML/src/string_extras.c +5 -26
  21. data/ext/mathematical/mtex2MML/src/string_extras.h +1 -6
  22. data/ext/mathematical/mtex2MML/src/y.tab.c +6600 -5492
  23. data/ext/mathematical/mtex2MML/src/y.tab.h +572 -525
  24. data/lib/mathematical/version.rb +1 -1
  25. data/mathematical.gemspec +1 -1
  26. data/test/mathematical/basic_test.rb +1 -1
  27. data/test/mathematical/corrections_test.rb +1 -1
  28. data/test/mathematical/fixtures_test.rb +1 -1
  29. data/test/mathematical/maliciousness_test.rb +17 -17
  30. data/test/mathematical/mathjax_test.rb +2 -3
  31. data/test/mathematical/mathml_test.rb +1 -1
  32. data/test/mathematical/multiples_test.rb +1 -1
  33. data/test/mathematical/performance_test.rb +6 -8
  34. data/test/mathematical/png_test.rb +1 -1
  35. data/test/test_helper.rb +2 -2
  36. metadata +6 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c820da257090af3286f7e4756f79ce1aece737d
4
- data.tar.gz: d2f998fbdd90b00510d0a5ac678af9397fa00dd8
3
+ metadata.gz: 950af06de24ca977728f01092c6ded39e96f39fc
4
+ data.tar.gz: 29148c1fd98932067e1c81c54d30bbb982501817
5
5
  SHA512:
6
- metadata.gz: 643d66def8e1670019d4a9bdad47d3914fb0e09136790e6349e5088a2dcda5db606e81da6480f92c23dc0887b3b10fa2596c28eb31b53420d38300fec0b729be
7
- data.tar.gz: fedb115fd8b874671d9dfaa43004e89d06640ea3f0288ac3c939d8bff4418c0b58c0e7dc07e89c04058f8367a6c2a807e2ed20a32b3225827ba7493201e57b23
6
+ metadata.gz: 1c9be59980546ff2fa68bed0dc4b4206cc4b9a4ec3b793189fa95355c912c51c0845787934c558004546136384e42c8d50957a4c75f13f66d4b6d0383319a5e4
7
+ data.tar.gz: 7d76ab7e62ea37b69f50cefb2f4c31767331ecd635850113ce1550acc19737755cda5cca95caf03f98121723d2a2a43c4f61f909f1539e87844b5b8a8971cd76
@@ -20,12 +20,17 @@ find_header('libxml/xpathInternals.h', '/include/libxml2', '/usr/include/libxml2
20
20
  FileUtils.cp_r(Dir.glob("#{LASEM_DIR}/*"), File.dirname(__FILE__))
21
21
  File.delete(File.join(File.dirname(__FILE__), 'lasemrender.c'))
22
22
 
23
+ debug_file = File.join(File.dirname(__FILE__), 'mtex2MML_debug.cc')
24
+ if File.exists?(debug_file)
25
+ File.delete(File.join(File.dirname(__FILE__), 'mtex2MML_debug.cc'))
26
+ end
27
+
23
28
  # build mtex2MML Bison files
24
29
  Dir.chdir(MTEX_DIR) do
25
30
  system 'make'
26
31
  end
27
32
 
28
- FileUtils.cp_r(Dir.glob("#{MTEX_DIR}/*.{c,h,cc}"), File.dirname(__FILE__))
33
+ FileUtils.cp_r(Dir.glob("#{MTEX_DIR}/*.{c,h}"), File.dirname(__FILE__))
29
34
  FileUtils.cp_r("#{MTEX_DIR}/deps/.", File.dirname(__FILE__))
30
35
  FileUtils.cp_r(Dir.glob("#{MTEX_DIR}/deps/**/*"), File.dirname(__FILE__))
31
36
 
@@ -57,6 +57,15 @@ lsm_dom_character_data_set_node_value (LsmDomNode* self, const char *value)
57
57
 
58
58
  /* LsmDomCharacterData implementation */
59
59
 
60
+ /**
61
+ * lsm_dom_character_data_get_data:
62
+ * @self: a #LsmDomCharacterData
63
+ *
64
+ * Get the character node data.
65
+ *
66
+ * Return value: character node data.
67
+ */
68
+
60
69
  const char *
61
70
  lsm_dom_character_data_get_data (LsmDomCharacterData* self)
62
71
  {
@@ -65,6 +74,14 @@ lsm_dom_character_data_get_data (LsmDomCharacterData* self)
65
74
  return self->data;
66
75
  }
67
76
 
77
+ /**
78
+ * lsm_dom_character_data_set_data:
79
+ * @self: a #LsmDomCharacterData
80
+ * @value: new node data
81
+ *
82
+ * Set the character node data.
83
+ */
84
+
68
85
  void
69
86
  lsm_dom_character_data_set_data (LsmDomCharacterData* self, const char * value)
70
87
  {
@@ -57,6 +57,8 @@ lsm_dom_document_get_node_type (LsmDomNode *node)
57
57
  * lsm_dom_document_get_document_element:
58
58
  * @self: a #LsmDomElement
59
59
  *
60
+ * Get the child node that is the root element of the document.
61
+ *
60
62
  * Returns: (transfer none): document element
61
63
  */
62
64
 
@@ -73,6 +75,8 @@ lsm_dom_document_get_document_element (LsmDomDocument *self)
73
75
  * @self: a #LsmDomDocument
74
76
  * @tag_name: name of the element to create
75
77
  *
78
+ * Create a new element node with a type corresponding to @tag_name.
79
+ *
76
80
  * Returns: (transfer full): a newly created #LsmDomElement
77
81
  */
78
82
 
@@ -113,6 +117,8 @@ lsm_dom_document_create_text_node_base (LsmDomDocument *document, const char *da
113
117
  * @self: a #LsmDomDocument
114
118
  * @data: content of the text node
115
119
  *
120
+ * Create a text node with @data as its initial content.
121
+ *
116
122
  * Returns: (transfer full): a newly created #LsmDomText
117
123
  */
118
124
 
@@ -128,6 +134,8 @@ lsm_dom_document_create_text_node (LsmDomDocument *document, const char *data)
128
134
  * lsm_dom_document_create_view:
129
135
  * @self: a #LsmDomDocument
130
136
  *
137
+ * Create a #LsmDomView for document rendering.
138
+ *
131
139
  * Returns: (transfer full): a new #LsmDomView
132
140
  */
133
141
 
@@ -139,6 +147,15 @@ lsm_dom_document_create_view (LsmDomDocument *self)
139
147
  return LSM_DOM_DOCUMENT_GET_CLASS (self)->create_view (self);
140
148
  }
141
149
 
150
+ /**
151
+ * lsm_dom_document_get_url:
152
+ * @self: a #LsmDomDocument
153
+ *
154
+ * Get document URL.
155
+ *
156
+ * Return value: document URL.
157
+ */
158
+
142
159
  const char *
143
160
  lsm_dom_document_get_url (LsmDomDocument *self)
144
161
  {
@@ -55,18 +55,20 @@ lsm_mathml_fenced_element_measure (LsmMathmlElement *self, LsmMathmlView *view,
55
55
 
56
56
  if (open != NULL && open[0] != '\0') {
57
57
  lsm_mathml_view_measure_operator (view, &self->style,
58
- open, FALSE, TRUE,
59
- axis_offset,
60
- &stretch_bbox, &fenced->open_bbox);
58
+ open, FALSE, TRUE,
59
+ axis_offset,
60
+ 0, G_MAXDOUBLE,
61
+ &stretch_bbox, &fenced->open_bbox);
61
62
  spacing += self->style.math_size * LSM_MATHML_SPACE_EM_THIN;
62
63
  } else
63
64
  fenced->open_bbox = lsm_mathml_bbox_null;
64
65
 
65
66
  if (close != NULL && close[0] != '\0') {
66
67
  lsm_mathml_view_measure_operator (view, &self->style,
67
- close, FALSE, TRUE,
68
- axis_offset,
69
- &stretch_bbox, &fenced->close_bbox);
68
+ close, FALSE, TRUE,
69
+ axis_offset,
70
+ 0, G_MAXDOUBLE,
71
+ &stretch_bbox, &fenced->close_bbox);
70
72
  spacing += self->style.math_size * LSM_MATHML_SPACE_EM_THIN;
71
73
  } else
72
74
  fenced->close_bbox = lsm_mathml_bbox_null;
@@ -152,12 +152,14 @@ lsm_mathml_operator_element_measure (LsmMathmlElement *self, LsmMathmlView *view
152
152
  self->bbox = lsm_mathml_bbox_null;
153
153
 
154
154
  lsm_mathml_view_measure_operator (view, &self->style,
155
- text,
156
- operator_element->is_large_op,
157
- operator_element->symmetric.value,
158
- lsm_mathml_view_measure_axis_offset (view, self->style.math_size),
159
- operator_element->stretchy.value ? stretch_bbox : &lsm_mathml_bbox_null,
160
- &self->bbox);
155
+ text,
156
+ operator_element->is_large_op,
157
+ operator_element->symmetric.value,
158
+ lsm_mathml_view_measure_axis_offset (view, self->style.math_size),
159
+ operator_element->min_size.value,
160
+ operator_element->max_size.value,
161
+ operator_element->stretchy.value ? stretch_bbox : &lsm_mathml_bbox_null,
162
+ &self->bbox);
161
163
 
162
164
  g_free (text);
163
165
 
@@ -361,12 +361,15 @@ lsm_mathml_view_update_layout_for_operator (LsmMathmlView *view,
361
361
 
362
362
  void
363
363
  lsm_mathml_view_measure_operator (LsmMathmlView *view,
364
- const LsmMathmlElementStyle *style,
365
- char const *text,
366
- gboolean large,
367
- gboolean symmetric,
368
- double axis_offset,
369
- LsmMathmlBbox const *stretch_bbox, LsmMathmlBbox *bbox)
364
+ const LsmMathmlElementStyle *style,
365
+ char const *text,
366
+ gboolean large,
367
+ gboolean symmetric,
368
+ double axis_offset,
369
+ double min_size, /* TODO actually use this parameter */
370
+ double max_size, /* TODO actually use this parameter */
371
+ LsmMathmlBbox const *stretch_bbox,
372
+ LsmMathmlBbox *bbox)
370
373
  {
371
374
  PangoFontDescription *font_description;
372
375
  PangoLayout *pango_layout;
@@ -658,7 +661,9 @@ lsm_mathml_view_measure_radical (LsmMathmlView *view,
658
661
  radical_stretch_bbox.depth += LSM_MATHML_SPACE_EM_THICK * style->math_size;
659
662
 
660
663
  lsm_mathml_view_measure_operator (view, style, LSM_MATHML_RADICAL_UTF8,
661
- FALSE, FALSE, 0.0, &radical_stretch_bbox, bbox);
664
+ FALSE, FALSE, 0.0,
665
+ 0, G_MAXDOUBLE,
666
+ &radical_stretch_bbox, bbox);
662
667
 
663
668
  if (x_offset != NULL) {
664
669
  *x_offset = bbox->width * LSM_MATHML_RADICAL_ORDER_X_OFFSET;
@@ -111,6 +111,8 @@ void lsm_mathml_view_measure_operator (LsmMathmlView *view,
111
111
  char const *text,
112
112
  gboolean large, gboolean symmetric,
113
113
  double axis_offset,
114
+ double min_size,
115
+ double max_size,
114
116
  const LsmMathmlBbox *stretch_bbox,
115
117
  LsmMathmlBbox *bbox);
116
118
  void lsm_mathml_view_show_operator (LsmMathmlView *view,
@@ -22,7 +22,9 @@
22
22
  */
23
23
 
24
24
  #include <lsmsvgsymbolelement.h>
25
+ #include <lsmsvguseelement.h>
25
26
  #include <lsmsvgview.h>
27
+ #include <lsmsvgtraits.h>
26
28
  #include <lsmdebug.h>
27
29
  #include <lsmdomdocument.h>
28
30
  #include <stdio.h>
@@ -41,6 +43,49 @@ lsm_svg_symbol_element_get_node_name (LsmDomNode *node)
41
43
 
42
44
  /* LsmSvgGraphic implementation */
43
45
 
46
+ static void
47
+ _symbol_element_render (LsmSvgElement *self, LsmSvgView *view)
48
+ {
49
+ LsmSvgSymbolElement *symbol = LSM_SVG_SYMBOL_ELEMENT (self);
50
+ LsmSvgUseElement *use_element;
51
+ LsmSvgElement *element;
52
+ LsmSvgStyle *style;
53
+ LsmBox viewport;
54
+ gboolean is_viewbox_defined;
55
+
56
+ element = lsm_svg_view_get_referencing_element (view);
57
+ if (!LSM_IS_SVG_USE_ELEMENT (element))
58
+ return;
59
+
60
+ use_element = LSM_SVG_USE_ELEMENT (element);
61
+
62
+ style = lsm_svg_view_get_current_style (view);
63
+
64
+ viewport.x = 0;
65
+ viewport.y = 0;
66
+ viewport.width = lsm_svg_view_normalize_length (view, &use_element->width.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
67
+ viewport.height = lsm_svg_view_normalize_length (view, &use_element->height.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
68
+
69
+ is_viewbox_defined = lsm_attribute_is_defined ((LsmAttribute *) &symbol->viewbox);
70
+
71
+ if (is_viewbox_defined && (symbol->viewbox.value.width == 0.0 ||
72
+ symbol->viewbox.value.height == 0.0))
73
+ return;
74
+
75
+ if (viewport.width <= 0.0 || viewport.height <= 0.0)
76
+ return;
77
+
78
+ lsm_debug_render ("[LsmSvgSymbolElement::render] viewport %g, %g, %g, %g",
79
+ viewport.x, viewport.y, viewport.width, viewport.height);
80
+
81
+ lsm_svg_view_push_viewport (view, &viewport, is_viewbox_defined ? &symbol->viewbox.value : NULL,
82
+ &symbol->preserve_aspect_ratio.value, style->overflow->value);
83
+
84
+ LSM_SVG_ELEMENT_CLASS (parent_class)->render (self, view);
85
+
86
+ lsm_svg_view_pop_viewport (view);
87
+ }
88
+
44
89
  /* LsmSvgSymbolElement implementation */
45
90
 
46
91
  LsmDomNode *
@@ -49,6 +94,13 @@ lsm_svg_symbol_element_new (void)
49
94
  return g_object_new (LSM_TYPE_SVG_SYMBOL_ELEMENT, NULL);
50
95
  }
51
96
 
97
+ static const LsmBox viewbox_default = {0.0, 0.0, 0.0, 0.0};
98
+ static const LsmSvgPreserveAspectRatio preserve_aspect_ratio_default = {
99
+ .defer = FALSE,
100
+ .align = LSM_SVG_ALIGN_X_MID_Y_MID,
101
+ .meet_or_slice = LSM_SVG_MEET_OR_SLICE_MEET
102
+ };
103
+
52
104
  static void
53
105
  lsm_svg_symbol_element_init (LsmSvgSymbolElement *self)
54
106
  {
@@ -56,6 +108,21 @@ lsm_svg_symbol_element_init (LsmSvgSymbolElement *self)
56
108
 
57
109
  /* LsmSvgSymbolElement class */
58
110
 
111
+ static const LsmAttributeInfos lsm_svg_symbol_element_attribute_infos[] = {
112
+ {
113
+ .name = "viewBox",
114
+ .attribute_offset = offsetof (LsmSvgSymbolElement, viewbox),
115
+ .trait_class = &lsm_box_trait_class,
116
+ .trait_default = &viewbox_default
117
+ },
118
+ {
119
+ .name = "preserveAspectRatio",
120
+ .attribute_offset = offsetof (LsmSvgSymbolElement, preserve_aspect_ratio),
121
+ .trait_class = &lsm_svg_preserve_aspect_ratio_trait_class,
122
+ .trait_default = &preserve_aspect_ratio_default
123
+ }
124
+ };
125
+
59
126
  static void
60
127
  lsm_svg_symbol_element_class_init (LsmSvgSymbolElementClass *klass)
61
128
  {
@@ -69,6 +136,13 @@ lsm_svg_symbol_element_class_init (LsmSvgSymbolElementClass *klass)
69
136
  s_element_class->category =
70
137
  LSM_SVG_ELEMENT_CATEGORY_CONTAINER |
71
138
  LSM_SVG_ELEMENT_CATEGORY_STRUCTURAL;
139
+
140
+ s_element_class->render = _symbol_element_render;
141
+ s_element_class->attribute_manager = lsm_attribute_manager_duplicate (s_element_class->attribute_manager);
142
+
143
+ lsm_attribute_manager_add_attributes (s_element_class->attribute_manager,
144
+ G_N_ELEMENTS (lsm_svg_symbol_element_attribute_infos),
145
+ lsm_svg_symbol_element_attribute_infos);
72
146
  }
73
147
 
74
148
  G_DEFINE_TYPE (LsmSvgSymbolElement, lsm_svg_symbol_element, LSM_TYPE_SVG_ELEMENT)
@@ -40,6 +40,9 @@ typedef struct _LsmSvgSymbolElementClass LsmSvgSymbolElementClass;
40
40
 
41
41
  struct _LsmSvgSymbolElement {
42
42
  LsmSvgElement element;
43
+
44
+ LsmSvgViewboxAttribute viewbox;
45
+ LsmSvgPreserveAspectRatioAttribute preserve_aspect_ratio;
43
46
  };
44
47
 
45
48
  struct _LsmSvgSymbolElementClass {
@@ -164,15 +164,16 @@ lsm_svg_use_element_new (void)
164
164
  return g_object_new (LSM_TYPE_SVG_USE_ELEMENT, NULL);
165
165
  }
166
166
 
167
- static const LsmSvgLength length_default = { .value_unit = 0.0, .type = LSM_SVG_LENGTH_TYPE_PX};
167
+ static const LsmSvgLength position_default = { .value_unit = 0.0, .type = LSM_SVG_LENGTH_TYPE_PX};
168
+ static const LsmSvgLength size_default = { .value_unit = 100.0, .type = LSM_SVG_LENGTH_TYPE_PERCENTAGE};
168
169
 
169
170
  static void
170
171
  lsm_svg_use_element_init (LsmSvgUseElement *self)
171
172
  {
172
- self->x.length = length_default;
173
- self->y.length = length_default;
174
- self->width.length = length_default;
175
- self->height.length = length_default;
173
+ self->x.length = position_default;
174
+ self->y.length = position_default;
175
+ self->width.length = size_default;
176
+ self->height.length = size_default;
176
177
  }
177
178
 
178
179
  /* LsmSvgUseElement class */
@@ -182,25 +183,25 @@ static const LsmAttributeInfos lsm_svg_use_element_attribute_infos[] = {
182
183
  .name = "x",
183
184
  .attribute_offset = offsetof (LsmSvgUseElement, x),
184
185
  .trait_class = &lsm_svg_length_trait_class,
185
- .trait_default = &length_default
186
+ .trait_default = &position_default
186
187
  },
187
188
  {
188
189
  .name = "y",
189
190
  .attribute_offset = offsetof (LsmSvgUseElement, y),
190
191
  .trait_class = &lsm_svg_length_trait_class,
191
- .trait_default = &length_default
192
+ .trait_default = &position_default
192
193
  },
193
194
  {
194
195
  .name = "width",
195
196
  .attribute_offset = offsetof (LsmSvgUseElement, width),
196
197
  .trait_class = &lsm_svg_length_trait_class,
197
- .trait_default = &length_default
198
+ .trait_default = &size_default
198
199
  },
199
200
  {
200
201
  .name = "height",
201
202
  .attribute_offset = offsetof (LsmSvgUseElement, height),
202
203
  .trait_class = &lsm_svg_length_trait_class,
203
- .trait_default = &length_default
204
+ .trait_default = &size_default
204
205
  },
205
206
  {
206
207
  .name = "xlink:href",
@@ -2226,6 +2226,18 @@ lsm_svg_view_pop_element (LsmSvgView *view)
2226
2226
  view->element_stack = g_slist_delete_link (view->element_stack, view->element_stack);
2227
2227
  }
2228
2228
 
2229
+ LsmSvgElement *
2230
+ lsm_svg_view_get_referencing_element (LsmSvgView *view)
2231
+ {
2232
+ g_return_val_if_fail (LSM_IS_SVG_VIEW (view), NULL);
2233
+
2234
+ if (view->element_stack == NULL ||
2235
+ view->element_stack->next == NULL)
2236
+ return NULL;
2237
+
2238
+ return view->element_stack->next->data;
2239
+ }
2240
+
2229
2241
  static gboolean
2230
2242
  lsm_svg_view_circular_reference_check (LsmSvgView *view, LsmSvgElement *element)
2231
2243
  {
@@ -155,6 +155,7 @@ void lsm_svg_view_pop_matrix (LsmSvgView *view);
155
155
 
156
156
  void lsm_svg_view_push_element (LsmSvgView *view, const LsmSvgElement *element);
157
157
  void lsm_svg_view_pop_element (LsmSvgView *view);
158
+ LsmSvgElement * lsm_svg_view_get_referencing_element (LsmSvgView *view);
158
159
 
159
160
  void lsm_svg_view_push_style (LsmSvgView *view, LsmSvgStyle *style);
160
161
  void lsm_svg_view_pop_style (LsmSvgView *view);
@@ -61,7 +61,7 @@ static gboolean option_debug_mask = FALSE;
61
61
  static gboolean option_debug_group = FALSE;
62
62
  static gboolean option_debug_text = FALSE;
63
63
  static gboolean option_dry_run = FALSE;
64
- static double option_compare_fuzz = 10.0;
64
+ static double option_compare_fuzz = 15.0;
65
65
 
66
66
  static const GOptionEntry entries[] =
67
67
  {
@@ -2,6 +2,8 @@
2
2
  #include <string.h>
3
3
  #include <lsmdom.h>
4
4
 
5
+ GKeyFile *suite_options;
6
+
5
7
  static GSList *
6
8
  build_file_list (const char *path, GRegex *filename_regex)
7
9
  {
@@ -47,6 +49,7 @@ static void
47
49
  render_test (gconstpointer user_data)
48
50
  {
49
51
  const char *filename = user_data;
52
+ char *basename;
50
53
  LsmDomDocument *document;
51
54
  LsmDomView *view;
52
55
  LsmBox viewport;
@@ -54,6 +57,8 @@ render_test (gconstpointer user_data)
54
57
  cairo_t *cairo;
55
58
  cairo_surface_t *surface;
56
59
 
60
+ basename = g_path_get_basename (filename);
61
+
57
62
  document = lsm_dom_document_new_from_path (filename, NULL);
58
63
  g_assert (LSM_IS_DOM_DOCUMENT (document));
59
64
 
@@ -76,13 +81,20 @@ render_test (gconstpointer user_data)
76
81
 
77
82
  if (cairo_status (cairo) == CAIRO_STATUS_SUCCESS) {
78
83
  lsm_dom_view_render (LSM_DOM_VIEW (view), cairo, 1, 1);
79
- g_assert (cairo_status (cairo) == CAIRO_STATUS_SUCCESS);
84
+
85
+ if (cairo_status (cairo) != CAIRO_STATUS_SUCCESS) {
86
+ g_test_message ("cairo_status = %s", cairo_status_to_string (cairo_status (cairo)));
87
+ if (!g_key_file_get_boolean (suite_options, basename, "ignore-cairo-status", NULL))
88
+ g_test_fail ();
89
+ }
80
90
  }
81
91
 
82
92
  cairo_destroy (cairo);
83
93
 
84
94
  g_object_unref (view);
85
95
  g_object_unref (document);
96
+
97
+ g_free (basename);
86
98
  }
87
99
 
88
100
  static void
@@ -107,6 +119,9 @@ main (int argc, char *argv[])
107
119
  g_type_init ();
108
120
  #endif
109
121
 
122
+ suite_options = g_key_file_new ();
123
+ g_assert (g_key_file_load_from_file (suite_options, SUITE_OPTION_FILE, G_KEY_FILE_NONE, NULL));
124
+
110
125
  g_test_init (&argc, &argv, NULL);
111
126
 
112
127
  filename_regex = g_regex_new ("\\.(svg|mml)$", 0, 0, NULL);
@@ -119,6 +134,8 @@ main (int argc, char *argv[])
119
134
  g_slist_free (files);
120
135
  g_regex_unref (filename_regex);
121
136
 
137
+ g_key_file_free (suite_options);
138
+
122
139
  lsm_shutdown ();
123
140
 
124
141
  return result;