mathematical 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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;