[cairo-commit] 2 commits - src/cairo-ps-surface.c test/6x13.pcf test/bitmap-font.c test/bitmap-font-ref.png test/bitmap-font-rgb24-ref.png test/.gitignore test/Makefile.am

Carl Worth cworth at kemper.freedesktop.org
Tue Jun 20 17:54:06 PDT 2006


 src/cairo-ps-surface.c         |   45 +++++++++++++++--
 test/.gitignore                |    1 
 test/6x13.pcf                  |binary
 test/Makefile.am               |    3 +
 test/bitmap-font-ref.png       |binary
 test/bitmap-font-rgb24-ref.png |binary
 test/bitmap-font.c             |  106 +++++++++++++++++++++++++++++++++++++++++
 7 files changed, 149 insertions(+), 6 deletions(-)

New commits:
diff-tree c6c1da2a2346de6c1df82fab2e7bafec7f37db50 (from cca08d9bce1647444acdb78aedb6ad6967c07661)
Author: Carl Worth <cworth at cworth.org>
Date:   Tue Jun 20 17:49:05 2006 -0700

    PS: Add support for emitting bitmapped glyphs into type3 fonts.
    
    The bitmap-font now passes when run against the ps backend.

diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c
index 4ded02e..ced69e2 100644
--- a/src/cairo-ps-surface.c
+++ b/src/cairo-ps-surface.c
@@ -477,6 +477,9 @@ _cairo_ps_surface_emit_bitmap_glyph_data
 {
     cairo_scaled_glyph_t *scaled_glyph;
     cairo_status_t status;
+    cairo_image_surface_t *image;
+    unsigned char *row, *byte;
+    int rows, cols, bytes_per_row;
 
     status = _cairo_scaled_glyph_lookup (scaled_font,
 					 glyph_index,
@@ -484,6 +487,9 @@ _cairo_ps_surface_emit_bitmap_glyph_data
 					 CAIRO_SCALED_GLYPH_INFO_SURFACE,
 					 &scaled_glyph);
 
+    image = scaled_glyph->surface;
+    assert (image->format == CAIRO_FORMAT_A1);
+
     _cairo_output_stream_printf (surface->final_stream,
 				 "0 0 %f %f %f %f setcachedevice\n",
 				 _cairo_fixed_to_double (scaled_glyph->bbox.p1.x),
@@ -491,13 +497,40 @@ _cairo_ps_surface_emit_bitmap_glyph_data
 				 _cairo_fixed_to_double (scaled_glyph->bbox.p2.x),
 				 - _cairo_fixed_to_double (scaled_glyph->bbox.p1.y));
 
-    /* XXX: Should be painting the surface from scaled_glyph here, not just a filled rectangle. */
     _cairo_output_stream_printf (surface->final_stream,
-				 "%f %f %f %f rectfill\n",
-				 _cairo_fixed_to_double (scaled_glyph->bbox.p1.x),
-				 - _cairo_fixed_to_double (scaled_glyph->bbox.p2.y),
-				 _cairo_fixed_to_double (scaled_glyph->bbox.p2.x) - _cairo_fixed_to_double (scaled_glyph->bbox.p1.x),
-				 _cairo_fixed_to_double (scaled_glyph->bbox.p1.y) - _cairo_fixed_to_double (scaled_glyph->bbox.p2.y));
+				 "<<\n"
+				 "   /ImageType 1\n"
+				 "   /Width %d\n"
+				 "   /Height %d\n"
+				 "   /ImageMatrix [%f %f %f %f %f %f]\n"
+				 "   /Decode [1 0]\n"
+				 "   /BitsPerComponent 1\n",
+				 image->width,
+				 image->height,
+				 image->base.device_transform.xx,
+				 image->base.device_transform.yx,
+				 image->base.device_transform.xy,
+				 image->base.device_transform.yy,
+				 image->base.device_transform.x0,
+				 - image->base.device_transform.y0);
+
+    _cairo_output_stream_printf (surface->final_stream,
+				 "   /DataSource   {<");
+    bytes_per_row = (image->width + 7) / 8;
+    for (row = image->data, rows = image->height; rows; row += image->stride, rows--) {
+	for (byte = row, cols = (image->width + 7) / 8; cols; byte++, cols--) {
+	    unsigned char output_byte = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (*byte);
+	    _cairo_output_stream_printf (surface->final_stream, "%02x ", output_byte);
+	}
+	_cairo_output_stream_printf (surface->final_stream, "\n   ");
+    }
+    _cairo_output_stream_printf (surface->final_stream,
+				 "   >}\n");
+    _cairo_output_stream_printf (surface->final_stream,
+				 ">>\n");
+
+    _cairo_output_stream_printf (surface->final_stream,
+				 "imagemask\n");
 
     return CAIRO_STATUS_SUCCESS;
 }
diff-tree cca08d9bce1647444acdb78aedb6ad6967c07661 (from ab8ae66f9d5c92af96b4a530957537ec7d33c128)
Author: Carl Worth <cworth at cworth.org>
Date:   Tue Jun 20 17:48:06 2006 -0700

    New bitmap-font test with bundled 6x13 font.
    
    The 6x13 font is a public-domain terminal font from the X
    distribution.

diff --git a/test/.gitignore b/test/.gitignore
index 0eed345..08059b7 100644
--- a/test/.gitignore
+++ b/test/.gitignore
@@ -3,6 +3,7 @@
 Makefile
 Makefile.in
 a8-mask
+bitmap-font
 caps-joins
 caps-joins-alpha
 caps-sub-paths
diff --git a/test/6x13.pcf b/test/6x13.pcf
index e147bc6..1325ae6 100644
Binary files a/test/6x13.pcf and b/test/6x13.pcf differ
diff --git a/test/Makefile.am b/test/Makefile.am
index 213149d..374206a 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -86,6 +86,7 @@ TESTS += pthread-show-text
 endif
 
 if CAIRO_HAS_FT_FONT
+TESTS += bitmap-font
 TESTS += ft-font-create-for-ft-face
 TESTS += ft-text-vertical-layout
 TESTS += ft-text-antialias-none
@@ -142,6 +143,8 @@ endif
 EXTRA_DIST =						\
 make-html.pl						\
 a8-mask-ref.png						\
+bitmap-font-ref.png					\
+bitmap-font-rgb24-ref.png				\
 caps-joins-ref.png					\
 caps-joins-alpha-ref.png				\
 caps-joins-ps-argb32-ref.png				\
diff --git a/test/bitmap-font-ref.png b/test/bitmap-font-ref.png
new file mode 100644
index 0000000..886c62f
Binary files /dev/null and b/test/bitmap-font-ref.png differ
diff --git a/test/bitmap-font-rgb24-ref.png b/test/bitmap-font-rgb24-ref.png
new file mode 100644
index 0000000..abea9b1
Binary files /dev/null and b/test/bitmap-font-rgb24-ref.png differ
diff --git a/test/bitmap-font.c b/test/bitmap-font.c
new file mode 100644
index 0000000..6351a3f
--- /dev/null
+++ b/test/bitmap-font.c
@@ -0,0 +1,106 @@
+/*
+ * Copyright © 2005 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-test.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <cairo-ft.h>
+#include <fontconfig/fontconfig.h>
+
+#define FONT "6x13.pcf"
+#define TEXT_SIZE 13
+
+cairo_test_t test = {
+    "bitmap-font",
+    "Test drawing with a font consisting only of bitmaps",
+    246 + 1, TEXT_SIZE
+};
+
+static cairo_test_status_t
+draw (cairo_t *cr, int width, int height)
+{
+    FcPattern *pattern;
+    cairo_font_face_t *font_face;
+    cairo_status_t status;
+    char *srcdir = getenv ("srcdir");
+    char *filename;
+    struct stat stat_buf;
+
+    if (! srcdir)
+	srcdir = ".";
+
+    xasprintf (&filename, "%s/%s", srcdir, FONT);
+
+    if (stat (filename, &stat_buf) || ! S_ISREG (stat_buf.st_mode)) {
+	cairo_test_log ("Error finding font: %s: file not found?\n", filename);
+	return CAIRO_TEST_FAILURE;
+    }
+
+    pattern = FcPatternCreate ();
+    if (! pattern) {
+	cairo_test_log ("FcPatternCreate failed.\n");
+	return CAIRO_TEST_FAILURE;
+    }
+
+    FcPatternAddString (pattern, FC_FILE, (unsigned char *) filename);
+    free (filename);
+    FcPatternAddInteger (pattern, FC_INDEX, 0);
+    font_face = cairo_ft_font_face_create_for_pattern (pattern);
+
+    status = cairo_font_face_status (font_face);
+    if (status) {
+	cairo_test_log ("Error creating font face for %s: %s\n",
+			filename,
+			cairo_status_to_string (status));
+	return CAIRO_TEST_FAILURE;
+    }
+
+    if (cairo_font_face_get_type (font_face) != CAIRO_FONT_TYPE_FT) {
+	cairo_test_log ("Unexpected value from cairo_font_face_get_type: %d (expected %d)\n",
+			cairo_font_face_get_type (font_face), CAIRO_FONT_TYPE_FT);
+	cairo_font_face_destroy (font_face);
+	return CAIRO_TEST_FAILURE;
+    }
+
+    cairo_set_font_face (cr, font_face);
+
+    FcPatternDestroy (pattern);
+    cairo_font_face_destroy (font_face);
+
+    cairo_move_to (cr, 1, TEXT_SIZE - 3);
+    cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); /* blue */
+    cairo_show_text (cr, "the quick brown fox jumps over a lazy dog");
+
+    return CAIRO_TEST_SUCCESS;
+}
+
+int
+main (void)
+{
+    return cairo_test (&test, draw);
+}


More information about the cairo-commit mailing list