[cairo-commit] 3 commits - perf/cairo-perf.c perf/cairo-perf.h perf/Makefile.am perf/subimage_copy.c perf/text.c src/cairo-scaled-font.c

Carl Worth cworth at kemper.freedesktop.org
Thu Oct 5 12:31:53 PDT 2006


 perf/Makefile.am        |    4 ++
 perf/cairo-perf.c       |    2 +
 perf/cairo-perf.h       |    2 +
 perf/subimage_copy.c    |   71 ++++++++++++++++++++++++++++++++++++++++++++++++
 perf/text.c             |   61 +++++++++++++++++++++++++++++++++++++++++
 src/cairo-scaled-font.c |    2 -
 6 files changed, 140 insertions(+), 2 deletions(-)

New commits:
diff-tree 5412343a77b7b336886ed763a3518ff4602f27aa (from 9285a1f7fe88db760b7cf49c87ac9be613f21630)
Author: Carl Worth <cworth at cworth.org>
Date:   Thu Oct 5 12:13:48 2006 -0700

    perf: Add subimage_copy test to demonstrate performance bug found by monty

diff --git a/perf/Makefile.am b/perf/Makefile.am
index d96fd63..ef6dc73 100644
--- a/perf/Makefile.am
+++ b/perf/Makefile.am
@@ -21,6 +21,7 @@ cairo_perf_SOURCES =		\
 	fill.c			\
 	paint.c			\
 	stroke.c		\
+	subimage_copy.c		\
 	tessellate.c		\
 	text.c
 
diff --git a/perf/cairo-perf.c b/perf/cairo-perf.c
index b98382f..5b94869 100644
--- a/perf/cairo-perf.c
+++ b/perf/cairo-perf.c
@@ -238,5 +238,6 @@ cairo_perf_case_t perf_cases[] = {
     { stroke, 64, 256},
     { text,   64, 256},
     { tessellate, 100, 100},
+    { subimage_copy, 16, 512},
     { NULL }
 };
diff --git a/perf/cairo-perf.h b/perf/cairo-perf.h
index b2bcde8..cf3d33d 100644
--- a/perf/cairo-perf.h
+++ b/perf/cairo-perf.h
@@ -85,6 +85,7 @@ cairo_perf_cover_sources_and_operators (
 CAIRO_PERF_DECL (fill);
 CAIRO_PERF_DECL (paint);
 CAIRO_PERF_DECL (stroke);
+CAIRO_PERF_DECL (subimage_copy);
 CAIRO_PERF_DECL (tessellate);
 CAIRO_PERF_DECL (text);
 
diff --git a/perf/subimage_copy.c b/perf/subimage_copy.c
new file mode 100644
index 0000000..54f596f
--- /dev/null
+++ b/perf/subimage_copy.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright © 2006 Red Hat, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * Red Hat, Inc. not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission. Red Hat, Inc. makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Carl D. Worth <cworth at cworth.org>
+ */
+
+#include "cairo-perf.h"
+
+/* This case exposes a performance bug found by Christopher "Monty"
+ * Montgomery in that copying a tiny portion of an image surface to an
+ * X surface causes the entire image surface to be copied to an
+ * intermediate surface.
+ *
+ * If the performance bug is fixed, then the time this test takes
+ * should be independent of the source and destination surface sizes.
+ */
+
+static cairo_perf_ticks_t
+do_subimage_copy (cairo_t *cr, int width, int height)
+{
+    cairo_rectangle (cr, 2, 2, 4, 4);
+    cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+
+    cairo_perf_timer_start ();
+
+    cairo_fill (cr);
+
+    cairo_perf_timer_stop ();
+
+    return cairo_perf_timer_elapsed ();
+}
+
+void
+subimage_copy (cairo_perf_t *perf, cairo_t *cr, int width, int height)
+{
+    cairo_surface_t *image;
+    cairo_t *cr2;
+
+    cairo_set_source_rgb (cr, 0, 0, 1); /* blue */
+    cairo_paint (cr);
+
+    image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+    cr2 = cairo_create (image);
+    cairo_set_source_rgb (cr2, 1, 0, 0); /* red */
+    cairo_paint (cr2);
+    cairo_destroy (cr2);
+
+    cairo_set_source_surface (cr, image, 0, 0);
+    cairo_surface_destroy (image);
+
+    cairo_perf_run (perf, "subimage_copy", do_subimage_copy);
+}
diff-tree 9285a1f7fe88db760b7cf49c87ac9be613f21630 (from f1db0135476a039ea43dfd67c56763b05aea2ec4)
Author: Carl Worth <cworth at cworth.org>
Date:   Wed Oct 4 18:35:16 2006 -0700

    perf: Add text test

diff --git a/perf/Makefile.am b/perf/Makefile.am
index a0f0f42..d96fd63 100644
--- a/perf/Makefile.am
+++ b/perf/Makefile.am
@@ -21,7 +21,8 @@ cairo_perf_SOURCES =		\
 	fill.c			\
 	paint.c			\
 	stroke.c		\
-	tessellate.c
+	tessellate.c		\
+	text.c
 
 if CAIRO_HAS_WIN32_SURFACE
 cairo_perf_SOURCES += cairo-perf-win32.c
diff --git a/perf/cairo-perf.c b/perf/cairo-perf.c
index e54e8fb..b98382f 100644
--- a/perf/cairo-perf.c
+++ b/perf/cairo-perf.c
@@ -236,6 +236,7 @@ cairo_perf_case_t perf_cases[] = {
     { paint,  64, 512},
     { fill,   64, 256},
     { stroke, 64, 256},
+    { text,   64, 256},
     { tessellate, 100, 100},
     { NULL }
 };
diff --git a/perf/cairo-perf.h b/perf/cairo-perf.h
index ec61254..b2bcde8 100644
--- a/perf/cairo-perf.h
+++ b/perf/cairo-perf.h
@@ -86,5 +86,6 @@ CAIRO_PERF_DECL (fill);
 CAIRO_PERF_DECL (paint);
 CAIRO_PERF_DECL (stroke);
 CAIRO_PERF_DECL (tessellate);
+CAIRO_PERF_DECL (text);
 
 #endif
diff --git a/perf/text.c b/perf/text.c
new file mode 100644
index 0000000..de5e0cd
--- /dev/null
+++ b/perf/text.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright © 2006 Red Hat, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * Red Hat, Inc. not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission. Red Hat, Inc. makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Carl D. Worth <cworth at cworth.org>
+ */
+
+#include "cairo-perf.h"
+
+static cairo_perf_ticks_t
+do_text (cairo_t *cr, int width, int height)
+{
+    const char text[] = "the jay, pig, fox, zebra and my wolves quack";
+    int len = strlen (text);
+    double x, y;
+    int i = 0;
+
+    cairo_perf_timer_start ();
+
+    cairo_set_font_size (cr, 9);
+    do {
+	cairo_move_to (cr, 0, i * 10);
+	cairo_show_text (cr, text + i);
+	cairo_get_current_point (cr, &x, &y);
+	while (x < width) {
+	    cairo_show_text (cr, text);
+	    cairo_get_current_point (cr, &x, &y);
+	}
+	i++;
+	if (i >= len)
+	    i = 0;
+    } while (y < height);
+
+    cairo_perf_timer_stop ();
+
+    return cairo_perf_timer_elapsed ();
+}
+
+void
+text (cairo_perf_t *perf, cairo_t *cr, int width, int height)
+{
+    cairo_perf_cover_sources_and_operators (perf, "text", do_text);
+}
diff-tree f1db0135476a039ea43dfd67c56763b05aea2ec4 (from 2041db91968c7c06cdb2e454f572c50d75144d29)
Author: Carl Worth <cworth at cworth.org>
Date:   Wed Oct 4 18:34:09 2006 -0700

    Fix typo that was resulting in device glyph_extents of INT16_MAX in some cases.

diff --git a/src/cairo-scaled-font.c b/src/cairo-scaled-font.c
index 700f209..0a96b9d 100755
--- a/src/cairo-scaled-font.c
+++ b/src/cairo-scaled-font.c
@@ -834,7 +834,7 @@ _cairo_scaled_font_glyph_device_extents 
     cairo_status_t status = CAIRO_STATUS_SUCCESS;
     int i;
     int min_x = INT16_MAX, max_x = INT16_MIN;
-    int	min_y = INT16_MAX, max_y = INT16_MAX;
+    int	min_y = INT16_MAX, max_y = INT16_MIN;
 
     if (scaled_font->status)
 	return scaled_font->status;


More information about the cairo-commit mailing list