summaryrefslogtreecommitdiff
path: root/librsvg/test-ft.c
diff options
context:
space:
mode:
Diffstat (limited to 'librsvg/test-ft.c')
-rw-r--r--librsvg/test-ft.c418
1 files changed, 0 insertions, 418 deletions
diff --git a/librsvg/test-ft.c b/librsvg/test-ft.c
deleted file mode 100644
index 710ad3047..000000000
--- a/librsvg/test-ft.c
+++ /dev/null
@@ -1,418 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
-
- test-ft.c: Testbed for freetype/libart integration.
-
- Copyright (C) 2000 Eazel, Inc.
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public
- License along with this program; if not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-
- Author: Raph Levien <raph@artofcode.com>
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <png.h>
-#include <popt.h>
-#include <math.h>
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include <freetype/freetype.h>
-
-#include <libart_lgpl/art_misc.h>
-#include <libart_lgpl/art_rect.h>
-#include <libart_lgpl/art_alphagamma.h>
-#include <libart_lgpl/art_affine.h>
-#include <libart_lgpl/art_affine.h>
-#include "art_render.h"
-#include "art_render_mask.h"
-
-#include "rsvg.h"
-#include "rsvg-ft.h"
-
-#if 0
-typedef struct _ArtMaskSourceFT ArtMaskSourceFT;
-
-struct _ArtMaskSourceFT {
- ArtMaskSource super;
- ArtRender *render;
- art_boolean first;
- const RsvgFTFont *font;
- const char *text;
-};
-
-void
-art_render_freetype(ArtRender * render, const RsvgFTFont * font,
- const char *text, double sx, double sy,
- const double affine[6]);
-
-static void
-art_render_ft_done(ArtRenderCallback * self, ArtRender * render)
-{
- art_free(self);
-}
-
-static int
-art_render_ft_can_drive(ArtMaskSource * self, ArtRender * render)
-{
- return 0;
-}
-
-static void
-art_render_ft_render(ArtRenderCallback * self, ArtRender * render,
- art_u8 * dest, int y)
-{
-}
-
-static void
-art_render_ft_prepare(ArtMaskSource *self, ArtRender *render,
- art_boolean first)
-{
- ArtMaskSourceFT *z = (ArtMaskSourceFT *) self;
-
- z->first = first;
- z->super.super.render = art_render_ft_render;
-}
-
-void
-art_render_freetype(ArtRender * render, const RsvgFTFont *font,
- const char *text, double sx, double sy,
- const double affine[6])
-{
- ArtMaskSourceFT *mask_source = art_new(ArtMaskSourceFT, 1);
-
- mask_source->super.super.render = NULL;
- mask_source->super.super.done = art_render_ft_done;
- mask_source->super.can_drive = art_render_ft_can_drive;
- mask_source->super.invoke_driver = NULL;
- mask_source->super.prepare = art_render_ft_prepare;
- mask_source->render = render;
- mask_source->font = font;
- mask_source->text = text;
-
- art_render_add_mask_source(render, &mask_source->super);
-}
-#endif
-
-/* The following routine is lifted wholesale from nautilus-icon-factory.c.
- It should find a permanent home somewhere else, at which point it should
- be deleted here and simply linked. -RLL
-*/
-
-/* utility routine for saving a pixbuf to a png file.
- * This was adapted from Iain Holmes' code in gnome-iconedit, and probably
- * should be in a utility library, possibly in gdk-pixbuf itself.
- *
- * It is split up into save_pixbuf_to_file and save_pixbuf_to_file_internal
- * to work around a gcc warning about handle possibly getting clobbered by
- * longjmp. Declaring handle 'volatile FILE *' didn't work as it should have.
- */
-static gboolean
-save_pixbuf_to_file_internal (GdkPixbuf *pixbuf, char *filename, FILE *handle)
-{
- char *buffer;
- gboolean has_alpha;
- int width, height, depth, rowstride;
- guchar *pixels;
- png_structp png_ptr;
- png_infop info_ptr;
- png_text text[2];
- int i;
-
- png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
- if (png_ptr == NULL) {
- return FALSE;
- }
-
- info_ptr = png_create_info_struct (png_ptr);
- if (info_ptr == NULL) {
- png_destroy_write_struct (&png_ptr, (png_infopp)NULL);
- return FALSE;
- }
-
- if (setjmp (png_ptr->jmpbuf)) {
- png_destroy_write_struct (&png_ptr, &info_ptr);
- return FALSE;
- }
-
- png_init_io (png_ptr, (FILE *)handle);
-
- has_alpha = gdk_pixbuf_get_has_alpha (pixbuf);
- width = gdk_pixbuf_get_width (pixbuf);
- height = gdk_pixbuf_get_height (pixbuf);
- depth = gdk_pixbuf_get_bits_per_sample (pixbuf);
- pixels = gdk_pixbuf_get_pixels (pixbuf);
- rowstride = gdk_pixbuf_get_rowstride (pixbuf);
-
- png_set_IHDR (png_ptr, info_ptr, width, height,
- depth, PNG_COLOR_TYPE_RGB_ALPHA,
- PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
-
- /* Some text to go with the png image */
- text[0].key = "Title";
- text[0].text = filename;
- text[0].compression = PNG_TEXT_COMPRESSION_NONE;
- text[1].key = "Software";
- text[1].text = "Test-Rsvg";
- text[1].compression = PNG_TEXT_COMPRESSION_NONE;
- png_set_text (png_ptr, info_ptr, text, 2);
-
- /* Write header data */
- png_write_info (png_ptr, info_ptr);
-
- /* if there is no alpha in the data, allocate buffer to expand into */
- if (has_alpha) {
- buffer = NULL;
- } else {
- buffer = g_malloc(4 * width);
- }
-
- /* pump the raster data into libpng, one scan line at a time */
- for (i = 0; i < height; i++) {
- if (has_alpha) {
- png_bytep row_pointer = pixels;
- png_write_row (png_ptr, row_pointer);
- } else {
- /* expand RGB to RGBA using an opaque alpha value */
- int x;
- char *buffer_ptr = buffer;
- char *source_ptr = pixels;
- for (x = 0; x < width; x++) {
- *buffer_ptr++ = *source_ptr++;
- *buffer_ptr++ = *source_ptr++;
- *buffer_ptr++ = *source_ptr++;
- *buffer_ptr++ = 255;
- }
- png_write_row (png_ptr, (png_bytep) buffer);
- }
- pixels += rowstride;
- }
-
- png_write_end (png_ptr, info_ptr);
- png_destroy_write_struct (&png_ptr, &info_ptr);
-
- g_free (buffer);
-
- return TRUE;
-}
-
-static gboolean
-save_pixbuf_to_file (GdkPixbuf *pixbuf, char *filename)
-{
- FILE *handle;
- gboolean result;
-
- g_return_val_if_fail (pixbuf != NULL, FALSE);
- g_return_val_if_fail (filename != NULL, FALSE);
- g_return_val_if_fail (filename[0] != '\0', FALSE);
-
- if (!strcmp (filename, "-")) {
- handle = stdout;
- } else {
- handle = fopen (filename, "wb");
- }
-
- if (handle == NULL) {
- return FALSE;
- }
-
- result = save_pixbuf_to_file_internal (pixbuf, filename, handle);
- if (!result || handle != stdout)
- fclose (handle);
-
- return result;
-}
-
-static void test_pixmap_destroy(guchar * pixels, gpointer data)
-{
- g_free(pixels);
-}
-
-#if 0
-/**
- * pixbuf_from_rsvg_ft_glyph: Create a GdkPixbuf from a glyph.
- * @glyph: The glyph to render as a pixbuf.
- * @rgb: Foreground color for rendering.
- *
- * Renders a glyph as a transparent pixbuf, with foreground color @rgb.
- *
- * Return value: the resulting GdkPixbuf.
- **/
-static GdkPixbuf *
-pixbuf_from_rsvg_ft_glyph (RsvgFTGlyph *glyph, guint32 rgb)
-{
- GdkPixbuf *pixbuf;
- int width = glyph->x1 - glyph->x0;
- int height = glyph->y1 - glyph->y0;
- int rowstride;
- art_u8 *pixels;
- int x, y;
- const guchar *src_line;
- art_u8 *dst_line;
- const art_u8 r = (rgb >> 16) & 0xff;
- const art_u8 g = (rgb >> 8) & 0xff;
- const art_u8 b = rgb & 0xff;
-
- fprintf (stderr, "xpen, ypen = (%f, %f)\n", glyph->xpen, glyph->ypen);
-
- rowstride = width << 2;
- pixels = g_new (art_u8, rowstride * height);
- src_line = glyph->buf;
- dst_line = pixels;
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- dst_line[x * 4] = r;
- dst_line[x * 4 + 1] = g;
- dst_line[x * 4 + 2] = b;
- dst_line[x * 4 + 3] = src_line[x];
- }
- src_line += glyph->rowstride;
- dst_line += rowstride;
- }
- pixbuf = gdk_pixbuf_new_from_data (pixels,
- GDK_COLORSPACE_RGB,
- 1, 8,
- width, height, rowstride,
- test_pixmap_destroy,
- NULL);
- return pixbuf;
-}
-#endif
-
-static GdkPixbuf *
-glyph_render_test (RsvgFTGlyph *glyph, int glyph_xy[2]) {
- GdkPixbuf *pixbuf;
- art_u8 *pixels;
- int width;
- int height;
- int rowstride;
- ArtRender *render;
- ArtPixMaxDepth color[3] = {ART_PIX_MAX_FROM_8(0x80), 0, 0 };
-
- width = glyph->width;
- height = glyph->height;
-
- width = 200;
- height = 200;
-
- rowstride = width << 2;
- pixels = g_new (art_u8, rowstride * height);
-
- render = art_render_new (0, 0, width, height,
- pixels, rowstride,
- 3, 8, ART_ALPHA_SEPARATE, NULL);
- art_render_image_solid (render, color);
- art_render_mask (render,
- glyph_xy[0], glyph_xy[1],
- glyph_xy[0] + glyph->width, glyph_xy[1] + glyph->height,
- glyph->buf, glyph->rowstride);
- art_render_invoke (render);
-
- pixbuf = gdk_pixbuf_new_from_data (pixels,
- GDK_COLORSPACE_RGB,
- 1, 8,
- width, height, rowstride,
- test_pixmap_destroy,
- NULL);
- return pixbuf;
-}
-
-int main(int argc, char **argv)
-{
- char *out_fn;
- GdkPixbuf *pixbuf;
- char *zoom_str = "1.0";
- int n_iter = 1;
-
- gint font_width = 36;
- gint font_height = 36;
- char *font_file_name = "/usr/share/fonts/default/Type1/n021003l.pfb";
-
- poptContext optCtx;
- struct poptOption optionsTable[] =
- {
- {"zoom", 'z', POPT_ARG_STRING, &zoom_str, 0, NULL, "zoom factor"},
- {"num-iter", 'n', POPT_ARG_INT, &n_iter, 0, NULL, "number of iterations"},
- {"font-width", 'w', POPT_ARG_INT, &font_width, 0, NULL, "Font Width"},
- {"font-height", 'h', POPT_ARG_INT, &font_height, 0, NULL, "Font Height"},
- {"font-file-name", 'f', POPT_ARG_STRING, &font_file_name, 0, NULL, "Font File Name"},
- POPT_AUTOHELP {NULL, 0, 0, NULL, 0}
- };
- char c;
- const char *const *args;
- int i;
-
- RsvgFTCtx *ctx;
- RsvgFTFontHandle fh;
-
-#if 1
- const double affine[6] = { .707, -.707, .707, .707, 10, 150 };
-#else
- double affine[6];
- art_affine_identity (affine);
-#endif
-
- optCtx =
- poptGetContext("test-ft", argc, (const char **) argv,
- optionsTable, 0);
-
- c = poptGetNextOpt(optCtx);
- args = poptGetArgs(optCtx);
-
- if (args == NULL || args[0] == NULL)
- out_fn = "-";
- else
- out_fn = (char *) args[0];
-
- ctx = rsvg_ft_ctx_new ();
- fh = rsvg_ft_intern (ctx, font_file_name);
-
- for (i = 0; i < n_iter; i++) {
- RsvgFTGlyph *glyph;
- int glyph_xy[2];
-
-
- glyph = rsvg_ft_render_string (ctx, fh,
- "graphic(s)",
- strlen ("graphic(s)"),
- font_width,
- font_height,
- affine,
- glyph_xy);
-
-/* fprintf (stderr, "xpen, ypen = (%f, %f)\n", glyph->xpen, glyph->ypen); */
-/* fprintf (stderr, "glyph_xy = (%d, %d)\n", glyph_xy[0], glyph_xy[1]); */
-
- glyph_xy[0] = 0; /* += glyph->xpen; */
- glyph_xy[1] = 0; /* += glyph->ypen; */
-
- pixbuf = glyph_render_test (glyph, glyph_xy);
-
- if (pixbuf != NULL) {
- if (n_iter > 1)
- gdk_pixbuf_unref(pixbuf);
- else
- save_pixbuf_to_file(pixbuf, out_fn);
- } else {
- fprintf(stderr, "Error rendering.\n");
- return 1;
- }
- }
-
- return 0;
-}