[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