diff options
Diffstat (limited to 'librsvg/test-ft-gtk.c')
-rw-r--r-- | librsvg/test-ft-gtk.c | 459 |
1 files changed, 0 insertions, 459 deletions
diff --git a/librsvg/test-ft-gtk.c b/librsvg/test-ft-gtk.c deleted file mode 100644 index 8f2a53d7a..000000000 --- a/librsvg/test-ft-gtk.c +++ /dev/null @@ -1,459 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- - - test-ft-gtk.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 <sys/time.h> -#include <unistd.h> - -#include <gtk/gtk.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 "art_render.h" -#include "art_render_mask.h" - -#include "rsvg.h" -#include "rsvg-ft.h" - -typedef struct _TestCtx TestCtx; - -struct _TestCtx { - RsvgFTCtx *ctx; - RsvgFTFontHandle fh; - int n_lines; - char **lines; - int y_sp; - int y_scroll; - GtkWidget *drawingarea; - GtkWidget *status; - double start_time; - gboolean do_drawing; - gboolean do_scrolling; - gboolean do_invert; -}; - -static double -timing_get_time (void) -{ - struct timeval tv; - struct timezone tz; - - gettimeofday (&tv, &tz); - - return tv.tv_sec + 1e-6 * tv.tv_usec; -} - -static void invert_glyph (guchar *buf, int rowstride, int width, int height) -{ - int x, y; - int first; - int n_words; - int last; - guint32 *middle; - - if (width >= 8 && ((rowstride & 3) == 0)) { - first = (-(long)buf) & 3; - n_words = (width - first) >> 2; - last = first + (n_words << 2); - - for (y = 0; y < height; y++) { - middle = (guint32 *)(buf + first); - for (x = 0; x < first; x++) - buf[x] = ~buf[x]; - for (x = 0; x < n_words; x++) - middle[x] = ~middle[x]; - for (x = last; x < width; x++) - buf[x] = ~buf[x]; - buf += rowstride; - } - } else { - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - buf[x] = ~buf[x]; - buf += rowstride; - } - } -} - -static void draw_line (TestCtx *ctx, int line_num, ArtIRect *rect) -{ - GtkWidget *drawingarea = ctx->drawingarea; - int y0; - RsvgFTGlyph *glyph; - const double affine[6] = { 1, 0, 0, 1, 5, 12 }; - int glyph_xy[2]; - ArtIRect line_rect, clear_rect, glyph_rect, draw_rect; - int width; - - width = drawingarea->allocation.width; - - y0 = line_num * ctx->y_sp - ctx->y_scroll; - if (line_num < 0 || line_num >= ctx->n_lines) { - if (ctx->do_drawing) { - gdk_draw_rectangle (drawingarea->window, - drawingarea->style->white_gc, - TRUE, - 0, y0, width, ctx->y_sp); - } - } else { - guchar *buf; - int rowstride; - - glyph = rsvg_ft_render_string (ctx->ctx, ctx->fh, - ctx->lines[line_num], - strlen (ctx->lines[line_num]), - 14, 14, - affine, - glyph_xy); - rowstride = glyph->rowstride; - - glyph_rect.x0 = glyph_xy[0]; - glyph_rect.y0 = y0 + glyph_xy[1]; - glyph_rect.x1 = glyph_rect.x0 + glyph->width; - glyph_rect.y1 = glyph_rect.y0 + glyph->height; - line_rect.x0 = 0; - line_rect.y0 = y0; - line_rect.x1 = width; - line_rect.y1 = y0 + ctx->y_sp; - art_irect_intersect (&clear_rect, rect, &line_rect); - - if (ctx->do_drawing) - gdk_draw_rectangle (drawingarea->window, - drawingarea->style->white_gc, - TRUE, - clear_rect.x0, clear_rect.y0, - clear_rect.x1 - clear_rect.x0, - clear_rect.y1 - clear_rect.y0); - - art_irect_intersect (&draw_rect, rect, &glyph_rect); - if (!art_irect_empty (&draw_rect) && ctx->do_drawing) { - buf = glyph->buf + - draw_rect.x0 - glyph_rect.x0 + - rowstride * (draw_rect.y0 - glyph_rect.y0); - if (ctx->do_invert) { - invert_glyph (buf, rowstride, - draw_rect.x1 - draw_rect.x0, - draw_rect.y1 - draw_rect.y0); - } - gdk_draw_gray_image (drawingarea->window, - drawingarea->style->white_gc, - draw_rect.x0, draw_rect.y0, - draw_rect.x1 - draw_rect.x0, - draw_rect.y1 - draw_rect.y0, - GDK_RGB_DITHER_NONE, - buf, - rowstride); - } - rsvg_ft_glyph_unref (glyph); - } -} - -static gint -test_expose (GtkWidget *widget, GdkEventExpose *event, TestCtx *ctx) -{ - int line0, line1; - int line; - ArtIRect rect; - - rect.x0 = event->area.x; - rect.y0 = event->area.y; - rect.x1 = rect.x0 + event->area.width; - rect.y1 = rect.y0 + event->area.height; - line0 = (rect.y0 + ctx->y_scroll) / ctx->y_sp; - line1 = (rect.y1 + ctx->y_scroll + ctx->y_sp - 1) / ctx->y_sp; - for (line = line0; line < line1; line++) { -#ifdef VERBOSE - g_print ("drawing line %d of [%d..%d]\n", line, line0, line1 - 1); -#endif - draw_line (ctx, line, &rect); - } - return FALSE; -} - -static void -scroll_to (TestCtx *ctx, int new_y) -{ - GtkWidget *drawingarea = ctx->drawingarea; - int scroll_amt = new_y - ctx->y_scroll; - int width = drawingarea->allocation.width; - int height = drawingarea->allocation.height; - int y0, y1; - GdkEventExpose expose; - - if (scroll_amt == 0) - return; - -#ifdef VERBOSE - g_print ("scrolling to %d\n", new_y); -#endif - if (scroll_amt > 0 && scroll_amt < height) { - y0 = height - scroll_amt; - y1 = height; - if (ctx->do_scrolling) { - gdk_draw_pixmap (drawingarea->window, - drawingarea->style->white_gc, - drawingarea->window, - 0, scroll_amt, - 0, 0, - width, y0); - } - } else if (scroll_amt < 0 && -scroll_amt < height) { - y0 = 0; - y1 = -scroll_amt; - if (ctx->do_scrolling) { - gdk_draw_pixmap (drawingarea->window, - drawingarea->style->white_gc, - drawingarea->window, - 0, 0, - 0, y1, - width, height - y1); - } - } else { - y0 = 0; - y1 = height; - } - ctx->y_scroll = new_y; - expose.area.x = 0; - expose.area.width = width; - expose.area.y = y0; - expose.area.height = y1 - y0; - test_expose (drawingarea, &expose, ctx); -} - -static gboolean scroll_idler (gpointer data) -{ - TestCtx *ctx = (TestCtx *)data; - GtkWidget *drawingarea = ctx->drawingarea; - int width = drawingarea->allocation.width; - int height = drawingarea->allocation.height; - - if ((ctx->y_scroll + height) < ctx->n_lines * ctx->y_sp) { - scroll_to (ctx, ctx->y_scroll + 100); - return TRUE; - } else { - double elapsed; - char str[128]; - - scroll_to (ctx, 0); - elapsed = timing_get_time () - ctx->start_time; - sprintf (str, "%g seconds to scroll, %g Mpix/s", - elapsed, - width * ctx->y_sp * ctx->n_lines * 1e-6 / elapsed); - gtk_label_set_text (GTK_LABEL (ctx->status), str); - return FALSE; - } -} - -static void -check_toggle (GtkWidget *button, int state, gboolean *bool) { - *bool = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); -} - -static GtkWidget * -check_button (const char *label, gboolean *bool) { - GtkWidget *result; - - result = gtk_check_button_new_with_label (label); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (result), *bool); - gtk_signal_connect (GTK_OBJECT (result), "state_changed", - (GtkSignalFunc) check_toggle, bool); - return result; -} - -static void -start_scrolling (GtkWidget *widget, TestCtx *ctx) -{ - scroll_to (ctx, 0); - gtk_idle_add (scroll_idler, ctx); - ctx->start_time = timing_get_time (); - gtk_label_set_text (GTK_LABEL (ctx->status), "Scrolling..."); -} - -static void -test_ft_quit (GtkWidget *widget, TestCtx *ctx) -{ - rsvg_ft_ctx_done (ctx->ctx); - gtk_main_quit (); -} - -static TestCtx *new_test_window (const char *fn, const char *afn, - int width, int height) -{ - GtkWidget *topwin; - GtkWidget *vbox; - GtkWidget *buttonbar; - GtkWidget *button; - GtkWidget *drawingarea; - TestCtx *ctx; - - ctx = g_new (TestCtx, 1); - - topwin = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_signal_connect (GTK_OBJECT (topwin), "destroy", - (GtkSignalFunc) test_ft_quit, ctx); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (topwin), vbox); - - drawingarea = gtk_drawing_area_new (); - gtk_drawing_area_size (GTK_DRAWING_AREA (drawingarea), width, height); - gtk_box_pack_start (GTK_BOX (vbox), drawingarea, TRUE, TRUE, 0); - - ctx->ctx = rsvg_ft_ctx_new (); - ctx->fh = rsvg_ft_intern (ctx->ctx, fn); - if (afn) rsvg_ft_font_attach (ctx->ctx, ctx->fh, afn); - ctx->n_lines = 0; - ctx->lines = NULL; - ctx->y_sp = 16; - ctx->y_scroll = 0; - ctx->drawingarea = drawingarea; - - ctx->do_drawing = TRUE; - ctx->do_scrolling = TRUE; - ctx->do_invert = TRUE; - - gtk_signal_connect (GTK_OBJECT (drawingarea), "expose_event", - (GtkSignalFunc) test_expose, ctx); - - buttonbar = gtk_hbox_new (FALSE, 5); - gtk_box_pack_start (GTK_BOX (vbox), buttonbar, FALSE, FALSE, 0); - - button = check_button ("Do drawing", &ctx->do_drawing); - gtk_container_add (GTK_CONTAINER (buttonbar), button); - - button = check_button ("Do scrolling", &ctx->do_scrolling); - gtk_container_add (GTK_CONTAINER (buttonbar), button); - - button = check_button ("Do invert", &ctx->do_invert); - gtk_container_add (GTK_CONTAINER (buttonbar), button); - - button = gtk_button_new_with_label ("Start scroll test"); - gtk_container_add (GTK_CONTAINER (buttonbar), button); - gtk_signal_connect (GTK_OBJECT (button), "clicked", - (GtkSignalFunc) start_scrolling, ctx); - - ctx->status = gtk_label_new (""); - gtk_box_pack_start (GTK_BOX (vbox), ctx->status, FALSE, FALSE, 2); - - gtk_widget_show_all (topwin); - - return ctx; -} - -static void set_text (TestCtx *ctx, const char *fn) { - FILE *f; - char line[256]; - int n_lines; - char **lines; - - lines = NULL; - - f = fopen (fn, "r"); - if (f == NULL) { - g_warning ("Error opening file %s\n", fn); - return; - } - n_lines = 0; - for (;;) { - int len; - - if (fgets (line, sizeof(line), f) == NULL) - break; - if (n_lines == 0) - lines = g_new (char *, 1); - else if (!(n_lines & (n_lines - 1))) { - lines = g_renew (char *, lines, n_lines << 1); - } - - g_assert (lines != NULL); - - len = strlen (line); - if (len > 0 && line[len - 1] == '\n') - line[--len] = 0; - while (len > 0 && line[len - 1] == '\r') - line[--len] = 0; - lines[n_lines++] = g_strdup (line); - } - fclose (f); - ctx->n_lines = n_lines; - ctx->lines = lines; -} - -int main(int argc, char **argv) -{ - char *zoom_str = "1.0"; - - gint font_width = 36; - gint font_height = 36; - char *font_file_name = "/usr/share/fonts/default/Type1/n021003l.pfb"; - char *add_font_file_name = NULL; - char *text_file_name = "rsvg-ft.c"; - - poptContext optCtx; - struct poptOption optionsTable[] = - { - {"zoom", 'z', POPT_ARG_STRING, &zoom_str, 0, NULL, "zoom factor"}, - {"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"}, - {"add-font-file-name", 'a', POPT_ARG_STRING, &add_font_file_name, 0, NULL, "Additional Font File Name"}, - {"text-file-name", 't', POPT_ARG_STRING, &text_file_name, 0, NULL, "Text"}, - POPT_AUTOHELP {NULL, 0, 0, NULL, 0} - }; - char c; - const char *const *args; - TestCtx *ctx; - - gtk_init (&argc, &argv); - - gdk_rgb_init (); - - gtk_widget_set_default_colormap (gdk_rgb_get_cmap ()); - gtk_widget_set_default_visual (gdk_rgb_get_visual ()); - - optCtx = - poptGetContext("test-ft", argc, (const char **) argv, - optionsTable, 0); - - c = poptGetNextOpt(optCtx); - args = poptGetArgs(optCtx); - - ctx = new_test_window (font_file_name, add_font_file_name, 640, 480); - - set_text (ctx, text_file_name); - - gtk_main (); - - return 0; -} |