summaryrefslogtreecommitdiff
path: root/src/ml_cairo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ml_cairo.c')
-rw-r--r--src/ml_cairo.c131
1 files changed, 90 insertions, 41 deletions
diff --git a/src/ml_cairo.c b/src/ml_cairo.c
index 1e80d89..e7a4e32 100644
--- a/src/ml_cairo.c
+++ b/src/ml_cairo.c
@@ -7,6 +7,17 @@
#include "ml_cairo_wrappers.h"
#include <cairo.h>
+/* import file-based backends */
+#ifdef CAIRO_HAS_PS_SURFACE
+# include <cairo-ps.h>
+#endif
+#ifdef CAIRO_HAS_PDF_SURFACE
+# include <cairo-pdf.h>
+#endif
+#ifdef CAIRO_HAS_PNG_SURFACE
+# include <cairo-png.h>
+#endif
+
#include "ml_cairo_channel.h"
#include "ml_cairo_status.h"
#include "ml_cairo.h"
@@ -39,10 +50,8 @@ Val_cairo_t (cairo_t * p)
}
Make_Val_final_pointer(cairo_surface_t, Ignore, cairo_surface_destroy, 20)
-#define cairo_surface_t_val(v) ((cairo_surface_t *)Pointer_val(v))
Make_Val_final_pointer(cairo_matrix_t, Ignore, cairo_matrix_destroy, 100)
-#define cairo_matrix_t_val(v) ((cairo_matrix_t *)Pointer_val(v))
Make_Val_final_pointer(cairo_pattern_t, Ignore, cairo_pattern_destroy, 20)
#define cairo_pattern_t_val(v) ((cairo_pattern_t *)Pointer_val(v))
@@ -73,7 +82,7 @@ ml_cairo_get_suspend_exn (value v_cr)
ML_0(cairo_create, Val_cairo_t)
-ML_1(cairo_destroy, cairo_t_val, Unit)
+/* ML_1(cairo_destroy, cairo_t_val, Unit) */
CAMLprim value
ml_cairo_save (value v_cr)
@@ -132,6 +141,25 @@ Unsupported(ml_cairo_set_target_ps)
#endif /* CAIRO_HAS_PS_SURFACE */
ML_bc6(cairo_set_target_ps)
+#ifdef CAIRO_HAS_PDF_SURFACE
+CAMLprim value
+ml_cairo_set_target_pdf (value v_cr, value v_file, value v_width_inches,
+ value v_height_inches, value v_x_pixels_per_inch,
+ value v_y_pixels_per_inch)
+{
+ cairo_set_target_pdf (cairo_t_val (v_cr), FILE_val (v_file),
+ Double_val (v_width_inches),
+ Double_val (v_height_inches),
+ Double_val (v_x_pixels_per_inch),
+ Double_val (v_y_pixels_per_inch));
+ check_cairo_status (v_cr);
+ return Val_unit;
+}
+#else
+Unsupported(ml_cairo_set_target_pdf)
+#endif /* CAIRO_HAS_PDF_SURFACE */
+ML_bc6(cairo_set_target_pdf)
+
#ifdef CAIRO_HAS_PNG_SURFACE
CAMLprim value
ml_cairo_set_target_png (value v_cr, value v_file, value v_format,
@@ -168,17 +196,17 @@ ml_cairo_set_rgb_color (value v_cr, value v_red, value v_green, value v_blue)
}
CAMLprim value
-ml_cairo_set_alpha (value v_cr, value v_alpha)
+ml_cairo_set_pattern (value v_cr, value v_pattern)
{
- cairo_set_alpha (cairo_t_val (v_cr), Double_val (v_alpha));
+ cairo_set_pattern (cairo_t_val (v_cr), cairo_pattern_t_val (v_pattern));
check_cairo_status (v_cr);
return Val_unit;
}
CAMLprim value
-ml_cairo_set_pattern (value v_cr, value v_pattern)
+ml_cairo_set_alpha (value v_cr, value v_alpha)
{
- cairo_set_pattern (cairo_t_val (v_cr), cairo_pattern_t_val (v_pattern));
+ cairo_set_alpha (cairo_t_val (v_cr), Double_val (v_alpha));
check_cairo_status (v_cr);
return Val_unit;
}
@@ -366,7 +394,6 @@ ml_cairo_inverse_transform_distance (value cr, value p)
return Val_unit;
}
-
CAMLprim value
ml_cairo_new_path (value v_cr)
{
@@ -515,7 +542,7 @@ ml_cairo_in_stroke (value v_cr, value v_x, value v_y)
c_ret =
cairo_in_stroke (cairo_t_val (v_cr), Double_val (v_x), Double_val (v_y));
check_cairo_status (v_cr);
- return Val_int (c_ret);
+ return Val_bool (c_ret);
}
CAMLprim value
@@ -525,7 +552,7 @@ ml_cairo_in_fill (value v_cr, value v_x, value v_y)
c_ret =
cairo_in_fill (cairo_t_val (v_cr), Double_val (v_x), Double_val (v_y));
check_cairo_status (v_cr);
- return Val_int (c_ret);
+ return Val_bool (c_ret);
}
CAMLprim value
@@ -565,28 +592,27 @@ ml_cairo_fill_extents (value v_cr)
}
CAMLprim value
-ml_cairo_clip (value v_cr)
+ml_cairo_init_clip (value v_cr)
{
- cairo_clip (cairo_t_val (v_cr));
+ cairo_init_clip (cairo_t_val (v_cr));
check_cairo_status (v_cr);
return Val_unit;
}
CAMLprim value
-ml_cairo_init_clip (value v_cr)
+ml_cairo_clip (value v_cr)
{
- cairo_init_clip (cairo_t_val (v_cr));
+ cairo_clip (cairo_t_val (v_cr));
check_cairo_status (v_cr);
return Val_unit;
}
Make_Val_final_pointer(cairo_font_t, Ignore, cairo_font_destroy, 20)
-#define cairo_font_t_val(v) ((cairo_font_t *)Pointer_val(v))
static void
cairo_glyph_t_val (cairo_glyph_t * _s, value _v)
{
- _s->index = Int_val (Field (_v, 0));
+ _s->index = Long_val (Field (_v, 0));
_s->x = Double_val (Field (_v, 1));
_s->y = Double_val (Field (_v, 2));
}
@@ -677,6 +703,7 @@ ml_cairo_current_font (value cr)
{
cairo_font_t *f = cairo_current_font (cairo_t_val (cr));
check_cairo_status (cr);
+ cairo_font_reference (f);
return Val_cairo_font_t (f);
}
@@ -741,7 +768,7 @@ ml_cairo_glyph_path (value v_ct, value v_glyphs)
return Val_unit;
}
-ML_1(cairo_font_destroy, cairo_font_t_val, Unit)
+/* ML_1(cairo_font_destroy, cairo_font_t_val, Unit) */
ML_2(cairo_font_set_transform, cairo_font_t_val, cairo_matrix_t_val, Unit)
ML_2(cairo_font_current_transform, cairo_font_t_val, cairo_matrix_t_val, Unit)
@@ -886,7 +913,20 @@ ml_cairo_current_target_surface (value cr)
return Val_cairo_surface_t (s);
}
-ML_1(cairo_status, cairo_t_val, Val_cairo_status_t)
+CAMLprim value
+ml_cairo_status (value v_cr)
+{
+ value v;
+ int status = cairo_status (cairo_t_val (v_cr));
+ if (status == CAIRO_STATUS_SUCCESS)
+ v = Val_unit;
+ else
+ {
+ v = alloc_small (1, 0);
+ Field (v, 0) = Val_int (status - 1);
+ }
+ return v;
+}
ML_1(cairo_status_string, cairo_t_val, copy_string)
CAMLprim value
@@ -902,7 +942,7 @@ ml_cairo_surface_create_for_image (value img)
}
ML_4(cairo_surface_create_similar, cairo_surface_t_val, cairo_format_t_val, Int_val, Int_val, Val_cairo_surface_t)
-ML_1(cairo_surface_destroy, cairo_surface_t_val, Unit)
+/* ML_1(cairo_surface_destroy, cairo_surface_t_val, Unit) */
ML_2(cairo_surface_set_repeat, cairo_surface_t_val, Int_val, Val_cairo_status_t)
ML_2(cairo_surface_set_matrix, cairo_surface_t_val, cairo_matrix_t_val, Val_cairo_status_t)
@@ -912,6 +952,7 @@ ML_2(cairo_surface_get_matrix, cairo_surface_t_val, cairo_matrix_t_val, Val_cair
#define Val_cairo_filter_t(v) Val_int(v)
ML_2(cairo_surface_set_filter, cairo_surface_t_val, cairo_filter_t_val, Val_cairo_status_t)
+ML_1(cairo_surface_get_filter, cairo_surface_t_val, Val_cairo_filter_t)
ML_3(cairo_image_surface_create, cairo_format_t_val, Int_val, Int_val, Val_cairo_surface_t)
@@ -934,14 +975,37 @@ ML_5(cairo_ps_surface_create, FILE_val, Double_val, Double_val, Double_val, Doub
Unsupported(ml_cairo_ps_surface_create)
#endif /* CAIRO_HAS_PS_SURFACE */
+#ifdef CAIRO_HAS_PDF_SURFACE
+ML_5(cairo_pdf_surface_create, FILE_val, Double_val, Double_val, Double_val, Double_val, Val_cairo_surface_t)
+#else
+Unsupported(ml_cairo_pdf_surface_create)
+#endif /* CAIRO_HAS_PDF_SURFACE */
+
#ifdef CAIRO_HAS_PNG_SURFACE
ML_4(cairo_png_surface_create, FILE_val, cairo_format_t_val, Double_val, Double_val, Val_cairo_surface_t)
#else
Unsupported(ml_cairo_png_surface_create)
#endif /* CAIRO_HAS_PNG_SURFACE */
+ML_1 (cairo_pattern_create_for_surface, cairo_surface_t_val, Val_cairo_pattern_t)
+ML_4 (cairo_pattern_create_linear, Double_val, Double_val, Double_val, Double_val, Val_cairo_pattern_t)
+ML_6 (cairo_pattern_create_radial, Double_val, Double_val, Double_val, Double_val, Double_val, Double_val, Val_cairo_pattern_t)
+ML_bc6 (cairo_pattern_create_radial)
+ML_6 (cairo_pattern_add_color_stop, cairo_pattern_t_val, Double_val, Double_val, Double_val, Double_val, Double_val, Val_cairo_status_t)
+ML_bc6 (cairo_pattern_add_color_stop)
+ML_2 (cairo_pattern_set_matrix, cairo_pattern_t_val, cairo_matrix_t_val, Val_cairo_status_t)
+ML_2 (cairo_pattern_get_matrix, cairo_pattern_t_val, cairo_matrix_t_val, Val_cairo_status_t)
+
+#define cairo_extend_t_val(v) ((cairo_extend_t) Int_val(v))
+#define Val_cairo_extend_t(v) Val_int(v)
+
+ML_2 (cairo_pattern_set_extend, cairo_pattern_t_val, cairo_extend_t_val, Val_cairo_status_t)
+ML_1 (cairo_pattern_get_extend, cairo_pattern_t_val, Val_cairo_extend_t)
+ML_2 (cairo_pattern_set_filter, cairo_pattern_t_val, cairo_filter_t_val, Val_cairo_status_t)
+ML_1 (cairo_pattern_get_filter, cairo_pattern_t_val, Val_cairo_filter_t)
+
ML_0(cairo_matrix_create, Val_cairo_matrix_t)
-ML_1(cairo_matrix_destroy, cairo_matrix_t_val, Unit)
+/* ML_1(cairo_matrix_destroy, cairo_matrix_t_val, Unit) */
ML_2(cairo_matrix_copy, cairo_matrix_t_val, cairo_matrix_t_val, Val_cairo_status_t)
ML_1(cairo_matrix_set_identity, cairo_matrix_t_val, Val_cairo_status_t)
CAMLprim value
@@ -985,25 +1049,27 @@ ML_3(cairo_matrix_multiply, cairo_matrix_t_val, cairo_matrix_t_val, cairo_matrix
CAMLprim value
ml_cairo_matrix_transform_distance (value m, value p)
{
+ cairo_status_t s;
double x, y;
x = Double_field (p, 0);
y = Double_field (p, 1);
- cairo_matrix_transform_distance (cairo_matrix_t_val (m), &x, &y);
+ s = cairo_matrix_transform_distance (cairo_matrix_t_val (m), &x, &y);
Store_double_field (p, 0, x);
Store_double_field (p, 1, y);
- return Val_unit;
+ return Val_cairo_status_t (s);
}
CAMLprim value
ml_cairo_matrix_transform_point (value m, value p)
{
+ cairo_status_t s;
double x, y;
x = Double_field (p, 0);
y = Double_field (p, 1);
- cairo_matrix_transform_point (cairo_matrix_t_val (m), &x, &y);
+ s = cairo_matrix_transform_point (cairo_matrix_t_val (m), &x, &y);
Store_double_field (p, 0, x);
Store_double_field (p, 1, y);
- return Val_unit;
+ return Val_cairo_status_t (s);
}
CAMLprim value
@@ -1021,20 +1087,3 @@ ml_cairo_surface_finalise (value s)
Store_pointer (s, NULL);
return Val_unit;
}
-
-ML_1 (cairo_pattern_create_for_surface, cairo_surface_t_val, Val_cairo_pattern_t)
-ML_4 (cairo_pattern_create_linear, Double_val, Double_val, Double_val, Double_val, Val_cairo_pattern_t)
-ML_6 (cairo_pattern_create_radial, Double_val, Double_val, Double_val, Double_val, Double_val, Double_val, Val_cairo_pattern_t)
-ML_bc6 (cairo_pattern_create_radial)
-ML_6 (cairo_pattern_add_color_stop, cairo_pattern_t_val, Double_val, Double_val, Double_val, Double_val, Double_val, Val_cairo_status_t)
-ML_bc6 (cairo_pattern_add_color_stop)
-ML_2(cairo_pattern_set_matrix, cairo_pattern_t_val, cairo_matrix_t_val, Val_cairo_status_t)
-ML_2(cairo_pattern_get_matrix, cairo_pattern_t_val, cairo_matrix_t_val, Val_cairo_status_t)
-
-#define cairo_extend_t_val(v) ((cairo_extend_t) Int_val(v))
-#define Val_cairo_extend_t(v) Val_int(v)
-
-ML_2 (cairo_pattern_set_extend, cairo_pattern_t_val, cairo_extend_t_val, Val_cairo_status_t)
-ML_1 (cairo_pattern_get_extend, cairo_pattern_t_val, Val_cairo_extend_t)
-ML_2 (cairo_pattern_set_filter, cairo_pattern_t_val, cairo_filter_t_val, Val_cairo_status_t)
-ML_1 (cairo_pattern_get_filter, cairo_pattern_t_val, Val_cairo_filter_t)