summaryrefslogtreecommitdiff
path: root/examples/xftview.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/xftview.c')
-rw-r--r--examples/xftview.c142
1 files changed, 142 insertions, 0 deletions
diff --git a/examples/xftview.c b/examples/xftview.c
new file mode 100644
index 00000000..0b95e2f9
--- /dev/null
+++ b/examples/xftview.c
@@ -0,0 +1,142 @@
+/* Pango
+ * pangoft2topgm.c: Example program to view a UTF-8 encoding file
+ * using Pango to render result.
+ *
+ * Copyright (C) 1999,2004 Red Hat, Inc.
+ * Copyright (C) 2001 Sun Microsystems
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "renderdemo.h"
+
+#include <pango/pangoxft.h>
+
+static Region update_region = NULL;
+static XftDraw *draw;
+static PangoContext *context;
+
+static void
+xft_render (PangoLayout *layout,
+ int x,
+ int y,
+ gpointer data)
+{
+ XftColor color;
+
+ color.color.red = 0x0;
+ color.color.green = 0x0;
+ color.color.blue = 0x0;
+ color.color.alpha = 0xffff;
+
+ pango_xft_render_layout (draw, &color, layout, x, y);
+}
+
+void
+update ()
+{
+ XRectangle area;
+ XftColor color;
+
+ XClipBox (update_region, &area);
+ XftDrawSetClip (draw, update_region);
+ XDestroyRegion (update_region);
+ update_region = NULL;
+
+ color.color.red = 0xffff;
+ color.color.blue = 0xffff;
+ color.color.green = 0xffff;
+ color.color.alpha = 0xffff;
+
+ XftDrawRect (draw, &color,
+ area.x, area.y, area.width, area.height);
+
+ do_output (context, xft_render, draw, NULL, NULL);
+}
+
+void
+expose (XExposeEvent *xev)
+{
+ XRectangle area;
+
+ if (!update_region)
+ update_region = XCreateRegion ();
+
+ area.x = xev->x;
+ area.y = xev->y;
+ area.width = xev->width;
+ area.height = xev->height;
+
+ XUnionRectWithRegion (&area, update_region, update_region);
+}
+
+int main (int argc, char **argv)
+{
+ Display *display;
+ int screen;
+ Window window;
+ XEvent xev;
+ unsigned long bg;
+ int width, height;
+
+ g_type_init();
+
+ XftInit (NULL);
+
+ parse_options (argc, argv);
+
+ display = XOpenDisplay (NULL);
+ if (!display)
+ fail ("Cannot open display %s\n", XDisplayName (NULL));
+
+ screen = DefaultScreen (display);
+ bg = WhitePixel (display, screen);
+
+ context = pango_xft_get_context (display, screen);
+ do_output (context, NULL, NULL, &width, &height);
+
+ window = XCreateSimpleWindow (display, DefaultRootWindow (display),
+ 0, 0, width, height, 0,
+ bg, bg);
+ XSelectInput (display, window, ExposureMask);
+
+ XMapWindow (display, window);
+ draw = XftDrawCreate (display, window,
+ DefaultVisual (display, screen),
+ DefaultColormap (display, screen));
+ XmbSetWMProperties (display, window,
+ get_options_string (),
+ NULL, NULL, 0, NULL, NULL, NULL);
+
+ while (1)
+ {
+ if (!XPending (display) && update_region)
+ update ();
+
+ XNextEvent (display, &xev);
+ if (xev.xany.type == Expose)
+ {
+ expose (&xev.xexpose);
+ }
+ }
+
+ return 0;
+}