[cairo-commit] 2 commits - util/cairo-script util/cairo-trace
Chris Wilson
ickle at kemper.freedesktop.org
Sat Jun 13 07:45:18 PDT 2009
util/cairo-script/Makefile.am | 2
util/cairo-trace/trace.c | 145 ++++++++++++++++++++++++------------------
2 files changed, 84 insertions(+), 63 deletions(-)
New commits:
commit c52eed6680dd13f6bc65dc4a26b6c8eab5a94a54
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Jun 13 15:42:43 2009 +0100
[trace] Handle wrapping python
python lazily loads libcairo.so and so it is not available via RTLD_NEXT,
and we need to dlopen cairo ourselves. Similarly the linker is not able to
resolve any naked function references and so we need to ensure that all of
our own calls into the library are wrapped with DLCALL.
diff --git a/util/cairo-trace/trace.c b/util/cairo-trace/trace.c
index db7a251..418908e 100644
--- a/util/cairo-trace/trace.c
+++ b/util/cairo-trace/trace.c
@@ -35,6 +35,7 @@
#include <math.h>
#include <locale.h> /* for locale independent %f printing */
#include <ctype.h>
+#include <assert.h>
#include <cairo.h>
#if CAIRO_HAS_FT_FONT
@@ -80,10 +81,17 @@
* printed numbers.
*/
+static void *_dlhandle = RTLD_NEXT;
#define DLCALL(name, args...) ({ \
static typeof (&name) name##_real; \
- if (name##_real == NULL) \
- name##_real = dlsym (RTLD_NEXT, #name); \
+ if (name##_real == NULL) { \
+ name##_real = dlsym (_dlhandle, #name); \
+ if (name##_real == NULL && _dlhandle == RTLD_NEXT) { \
+ _dlhandle = dlopen ("libcairo.so", RTLD_LAZY); \
+ name##_real = dlsym (_dlhandle, #name); \
+ assert (name##_real != NULL); \
+ } \
+ } \
(*name##_real) (args); \
})
@@ -1381,20 +1389,22 @@ _emit_image (cairo_surface_t *image,
uint8_t *rowdata;
uint8_t *data;
struct _data_stream stream;
+ cairo_status_t status;
- if (cairo_surface_status (image)) {
+ status = DLCALL (cairo_surface_status, image);
+ if (status) {
_trace_printf ("dict\n"
" /status //%s set\n"
" image",
- _status_to_string (cairo_surface_status (image)));
+ _status_to_string (status));
return;
}
- width = cairo_image_surface_get_width (image);
- height = cairo_image_surface_get_height (image);
- stride = cairo_image_surface_get_stride (image);
- format = cairo_image_surface_get_format (image);
- data = cairo_image_surface_get_data (image);
+ width = DLCALL (cairo_image_surface_get_width, image);
+ height = DLCALL (cairo_image_surface_get_height, image);
+ stride = DLCALL (cairo_image_surface_get_stride, image);
+ format = DLCALL (cairo_image_surface_get_format, image);
+ data = DLCALL (cairo_image_surface_get_data, image);
_trace_printf ("dict\n"
" /width %d set\n"
@@ -1410,7 +1420,7 @@ _emit_image (cairo_surface_t *image,
va_end (ap);
}
- if (cairo_version () >= CAIRO_VERSION_ENCODE (1, 9, 0)) {
+ if (DLCALL (cairo_version) >= CAIRO_VERSION_ENCODE (1, 9, 0)) {
const char *mime_types[] = {
CAIRO_MIME_TYPE_JPEG,
CAIRO_MIME_TYPE_PNG,
@@ -1421,8 +1431,8 @@ _emit_image (cairo_surface_t *image,
const unsigned char *mime_data;
unsigned int mime_length;
- cairo_surface_get_mime_data (image, *mime_type,
- &mime_data, &mime_length);
+ DLCALL (cairo_surface_get_mime_data,
+ image, *mime_type, &mime_data, &mime_length);
if (mime_data != NULL) {
_trace_printf (" /mime-type (%s) set\n"
" /source <~",
@@ -2607,25 +2617,25 @@ _emit_font_options (const cairo_font_options_t *options)
_trace_printf ("dict\n");
- antialias = cairo_font_options_get_antialias (options);
+ antialias = DLCALL (cairo_font_options_get_antialias, options);
if (antialias != CAIRO_ANTIALIAS_DEFAULT) {
_trace_printf (" /antialias //%s set\n",
_antialias_to_string (antialias));
}
- subpixel_order = cairo_font_options_get_subpixel_order (options);
+ subpixel_order = DLCALL (cairo_font_options_get_subpixel_order, options);
if (subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT) {
_trace_printf (" /subpixel-order //%s set\n",
_subpixel_order_to_string (subpixel_order));
}
- hint_style = cairo_font_options_get_hint_style (options);
+ hint_style = DLCALL (cairo_font_options_get_hint_style, options);
if (hint_style != CAIRO_HINT_STYLE_DEFAULT) {
_trace_printf (" /hint-style //%s set\n",
_hint_style_to_string (hint_style));
}
- hint_metrics = cairo_font_options_get_hint_metrics (options);
+ hint_metrics = DLCALL (cairo_font_options_get_hint_metrics, options);
if (hint_style != CAIRO_HINT_METRICS_DEFAULT) {
_trace_printf (" /hint-metrics //%s set\n",
_hint_metrics_to_string (hint_metrics));
@@ -2775,6 +2785,18 @@ cairo_show_text (cairo_t *cr, const char *utf8)
DLCALL (cairo_show_text, cr, utf8);
}
+static void
+_glyph_advance (cairo_scaled_font_t *font,
+ const cairo_glyph_t *glyph,
+ double *x, double *y)
+{
+ cairo_text_extents_t extents;
+
+ DLCALL (cairo_scaled_font_glyph_extents, font, glyph, 1, &extents);
+ *x += extents.x_advance;
+ *y += extents.y_advance;
+}
+
#define TOLERANCE 1e-5
static void
_emit_glyphs (cairo_scaled_font_t *font,
@@ -2802,8 +2824,6 @@ _emit_glyphs (cairo_scaled_font_t *font,
_trace_printf ("[%g %g [", x, y);
first = true;
while (num_glyphs--) {
- cairo_text_extents_t extents;
-
if (fabs (glyphs->x - x) > TOLERANCE ||
fabs (glyphs->y - y) > TOLERANCE)
{
@@ -2818,10 +2838,7 @@ _emit_glyphs (cairo_scaled_font_t *font,
_trace_printf ("%lu", glyphs->index);
first = false;
- cairo_scaled_font_glyph_extents (font, glyphs, 1, &extents);
- x += extents.x_advance;
- y += extents.y_advance;
-
+ _glyph_advance (font, glyphs, &x, &y);
glyphs++;
}
_trace_printf ("]]");
@@ -2834,7 +2851,6 @@ _emit_glyphs (cairo_scaled_font_t *font,
_trace_printf ("[%g %g <~", x, y);
_write_base85_data_start (&stream);
while (num_glyphs--) {
- cairo_text_extents_t extents;
unsigned char c;
if (fabs (glyphs->x - x) > TOLERANCE ||
@@ -2850,10 +2866,7 @@ _emit_glyphs (cairo_scaled_font_t *font,
c = glyphs->index;
_write_base85_data (&stream, &c, 1);
- cairo_scaled_font_glyph_extents (font, glyphs, 1, &extents);
- x += extents.x_advance;
- y += extents.y_advance;
-
+ _glyph_advance (font, glyphs, &x, &y);
glyphs++;
}
_write_base85_data_end (&stream);
@@ -3686,6 +3699,24 @@ FT_Done_Face (FT_Face face)
}
#endif
+static void
+_surface_object_set_size (cairo_surface_t *surface, int width, int height)
+{
+ Object *obj;
+
+ obj = _get_object (SURFACE, surface);
+ obj->width = width;
+ obj->height = height;
+}
+
+static void
+_surface_object_set_size_from_surface (cairo_surface_t *surface)
+{
+ _surface_object_set_size (surface,
+ DLCALL (cairo_image_surface_get_width, surface),
+ DLCALL (cairo_image_surface_get_height, surface));
+}
+
#if CAIRO_HAS_PS_SURFACE
#include<cairo-ps.h>
@@ -3711,8 +3742,7 @@ cairo_ps_surface_create (const char *filename, double width_in_points, double he
width_in_points,
height_in_points,
surface_id);
- _get_object (SURFACE, ret)->width = width_in_points;
- _get_object (SURFACE, ret)->height = height_in_points;
+ _surface_object_set_size (ret, width_in_points, height_in_points);
_push_operand (SURFACE, ret);
_write_unlock ();
}
@@ -3739,8 +3769,7 @@ cairo_ps_surface_create_for_stream (cairo_write_func_t write_func, void *closure
width_in_points,
height_in_points,
surface_id);
- _get_object (SURFACE, ret)->width = width_in_points;
- _get_object (SURFACE, ret)->height = height_in_points;
+ _surface_object_set_size (ret, width_in_points, height_in_points);
_push_operand (SURFACE, ret);
_write_unlock ();
}
@@ -3782,8 +3811,7 @@ cairo_pdf_surface_create (const char *filename, double width_in_points, double h
width_in_points,
height_in_points,
surface_id);
- _get_object (SURFACE, ret)->width = width_in_points;
- _get_object (SURFACE, ret)->height = height_in_points;
+ _surface_object_set_size (ret, width_in_points, height_in_points);
_push_operand (SURFACE, ret);
_write_unlock ();
}
@@ -3810,8 +3838,7 @@ cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func, void *closur
width_in_points,
height_in_points,
surface_id);
- _get_object (SURFACE, ret)->width = width_in_points;
- _get_object (SURFACE, ret)->height = height_in_points;
+ _surface_object_set_size (ret, width_in_points, height_in_points);
_push_operand (SURFACE, ret);
_write_unlock ();
}
@@ -3851,8 +3878,7 @@ cairo_svg_surface_create (const char *filename, double width, double height)
width,
height,
surface_id);
- _get_object (SURFACE, ret)->width = width;
- _get_object (SURFACE, ret)->height = height;
+ _surface_object_set_size (ret, width, height);
_push_operand (SURFACE, ret);
_write_unlock ();
}
@@ -3879,8 +3905,7 @@ cairo_svg_surface_create_for_stream (cairo_write_func_t write_func, void *closur
width,
height,
surface_id);
- _get_object (SURFACE, ret)->width = width;
- _get_object (SURFACE, ret)->height = height;
+ _surface_object_set_size (ret, width, height);
_push_operand (SURFACE, ret);
_write_unlock ();
}
@@ -3910,8 +3935,7 @@ cairo_image_surface_create_from_png (const char *filename)
_emit_image (ret, " /filename %s set\n", filename_string);
_trace_printf (" dup /s%ld exch def\n",
surface_id);
- _get_object (SURFACE, ret)->width = cairo_image_surface_get_width (ret);
- _get_object (SURFACE, ret)->height = cairo_image_surface_get_height (ret);
+ _surface_object_set_size_from_surface (ret);
_get_object (SURFACE, ret)->defined = true;
_push_operand (SURFACE, ret);
_write_unlock ();
@@ -3934,8 +3958,7 @@ cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func, void *c
_emit_image (ret, NULL);
_trace_printf (" dup /s%ld exch def\n",
surface_id);
- _get_object (SURFACE, ret)->width = cairo_image_surface_get_width (ret);
- _get_object (SURFACE, ret)->height = cairo_image_surface_get_height (ret);
+ _surface_object_set_size_from_surface (ret);
_get_object (SURFACE, ret)->defined = true;
_push_operand (SURFACE, ret);
_write_unlock ();
@@ -3945,6 +3968,12 @@ cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func, void *c
}
#endif
+static const char *
+_content_from_surface (cairo_surface_t *surface)
+{
+ return _content_to_string (DLCALL (cairo_surface_get_content, surface));
+}
+
#if CAIRO_HAS_XLIB_SURFACE
#include <cairo-xlib.h>
@@ -3971,13 +4000,12 @@ cairo_xlib_surface_create (Display *dpy,
" /height %d set\n"
" surface dup /s%ld exch def\n",
drawable,
- _content_to_string (cairo_surface_get_content (ret)),
+ _content_from_surface (ret),
width,
height,
surface_id);
_get_object (SURFACE, ret)->defined = true;
- _get_object (SURFACE, ret)->width = width;
- _get_object (SURFACE, ret)->height = height;
+ _surface_object_set_size (ret, width, height);
_get_object (SURFACE, ret)->foreign = true;
_push_operand (SURFACE, ret);
_write_unlock ();
@@ -4010,13 +4038,12 @@ cairo_xlib_surface_create_for_bitmap (Display *dpy,
" /depth 1 set\n"
" surface dup /s%ld exch def\n",
bitmap,
- _content_to_string (cairo_surface_get_content (ret)),
+ _content_from_surface (ret),
width,
height,
surface_id);
_get_object (SURFACE, ret)->defined = true;
- _get_object (SURFACE, ret)->width = width;
- _get_object (SURFACE, ret)->height = height;
+ _surface_object_set_size (ret, width, height);
_get_object (SURFACE, ret)->foreign = true;
_push_operand (SURFACE, ret);
_write_unlock ();
@@ -4052,14 +4079,13 @@ cairo_xlib_surface_create_with_xrender_format (Display *dpy,
" /depth %d set\n"
" surface dup /s%ld exch def\n",
drawable,
- _content_to_string (cairo_surface_get_content (ret)),
+ _content_from_surface (ret),
width,
height,
format->depth,
surface_id);
_get_object (SURFACE, ret)->defined = true;
- _get_object (SURFACE, ret)->width = width;
- _get_object (SURFACE, ret)->height = height;
+ _surface_object_set_size (ret, width, height);
_get_object (SURFACE, ret)->foreign = true;
_push_operand (SURFACE, ret);
_write_unlock ();
@@ -4095,8 +4121,7 @@ cairo_script_surface_create (const char *filename,
" surface dup /s%ld exch def\n",
width, height,
surface_id);
- _get_object (SURFACE, ret)->width = width;
- _get_object (SURFACE, ret)->height = height;
+ _surface_set_size (ret, width, height);
_get_object (SURFACE, ret)->defined = true;
_push_operand (SURFACE, ret);
_write_unlock ();
@@ -4127,8 +4152,7 @@ cairo_script_surface_create_for_stream (cairo_write_func_t write_func,
" surface dup /s%ld exch def\n",
width, height,
surface_id);
- _get_object (SURFACE, ret)->width = width;
- _get_object (SURFACE, ret)->height = height;
+ _surface_object_set_size (ret, width, height);
_get_object (SURFACE, ret)->defined = true;
_push_operand (SURFACE, ret);
_write_unlock ();
@@ -4162,8 +4186,7 @@ _cairo_test_fallback_surface_create (cairo_content_t content,
_content_to_string (content),
width, height,
surface_id);
- _get_object (SURFACE, ret)->width = width;
- _get_object (SURFACE, ret)->height = height;
+ _surface_object_set_size (ret, width, height);
_get_object (SURFACE, ret)->defined = true;
_push_operand (SURFACE, ret);
_write_unlock ();
@@ -4200,8 +4223,7 @@ _cairo_test_paginated_surface_create_for_data (unsigned char *data,
_content_to_string (content),
width, height, stride,
surface_id);
- _get_object (SURFACE, ret)->width = width;
- _get_object (SURFACE, ret)->height = height;
+ _surface_object_set_size (ret, width, height);
_get_object (SURFACE, ret)->defined = true;
_push_operand (SURFACE, ret);
_write_unlock ();
@@ -4233,8 +4255,7 @@ _cairo_test_meta_surface_create (cairo_content_t content,
_content_to_string (content),
width, height,
surface_id);
- _get_object (SURFACE, ret)->width = width;
- _get_object (SURFACE, ret)->height = height;
+ _surface_object_set_size (ret, width, height);
_get_object (SURFACE, ret)->defined = true;
_push_operand (SURFACE, ret);
_write_unlock ();
commit 606790a86083d31fa50ed5e0cf621eca56c16e33
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Jun 13 14:07:22 2009 +0100
[script] Disable compilation of examples
Now that cairo-perf-trace exists and is a far superior replay tool, use
EXTRA_PROGRAM for the original replay tools.
diff --git a/util/cairo-script/Makefile.am b/util/cairo-script/Makefile.am
index db5e953..644185b 100644
--- a/util/cairo-script/Makefile.am
+++ b/util/cairo-script/Makefile.am
@@ -1,7 +1,7 @@
SUBDIRS = examples
lib_LTLIBRARIES = libcairo-script-interpreter.la
-noinst_PROGRAMS = csi-replay csi-exec
+EXTRA_PROGRAMS = csi-replay csi-exec
AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src
More information about the cairo-commit
mailing list