[pango: 12/16] Bug 523166 – pango-view opens display even when



commit df05d117a5c168fb90138d7d6bae760c1b2851af
Author: Behdad Esfahbod <behdad behdad org>
Date:   Sat Mar 14 21:33:07 2009 -0400

    Bug 523166 â?? pango-view opens display even when invoked with -q
    
    Works now.
---
 pango-view/viewer-cairo.c      |   85 ++++++++++++++++++++++++++++++++++++----
 pango-view/viewer-cairo.h      |    2 +-
 pango-view/viewer-main.c       |   12 +++++-
 pango-view/viewer-pangocairo.c |    6 ++-
 pango-view/viewer-x.c          |    4 +-
 pango-view/viewer.h            |    1 -
 6 files changed, 93 insertions(+), 17 deletions(-)

diff --git a/pango-view/viewer-cairo.c b/pango-view/viewer-cairo.c
index eb56d45..0f3cd5c 100644
--- a/pango-view/viewer-cairo.c
+++ b/pango-view/viewer-cairo.c
@@ -21,16 +21,21 @@
 #include "config.h"
 
 #include "viewer-cairo.h"
+#include "viewer-render.h"
+
+#include <cairo.h>
+
+
 
 #ifdef HAVE_CAIRO_XLIB
 #include "viewer-x.h"
 #include <cairo-xlib.h>
 
 static cairo_surface_t *
-cairo_x_view_create_surface (gpointer instance,
-			     gpointer surface,
-			     int      width,
-			     int      height)
+cairo_x_view_iface_create_surface (gpointer instance,
+				   gpointer surface,
+				   int      width,
+				   int      height)
 {
   XViewer *x = (XViewer *)instance;
   Drawable drawable = (Drawable) surface;
@@ -42,12 +47,76 @@ cairo_x_view_create_surface (gpointer instance,
 
 static CairoViewerIface cairo_x_viewer_iface = {
   &x_viewer,
-  cairo_x_view_create_surface
+  cairo_x_view_iface_create_surface
 };
+#endif /* HAVE_CAIRO_XLIB */
 
-const CairoViewerIface *
-get_default_cairo_viewer_iface (void)
+
+
+static gpointer
+cairo_image_view_create (const PangoViewer *klass G_GNUC_UNUSED)
+{
+  return NULL;
+}
+
+static void
+cairo_image_view_destroy (gpointer instance G_GNUC_UNUSED)
+{
+}
+
+static gpointer
+cairo_image_view_create_surface (gpointer instance,
+				 int      width,
+				 int      height)
+{
+  /* TODO: Be smarter about format? */
+  return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+}
+
+static void
+cairo_image_view_destroy_surface (gpointer instance,
+				  gpointer surface)
+{
+  cairo_surface_destroy (surface);
+}
+
+const PangoViewer cairo_image_viewer = {
+  "CairoImage",
+  NULL,
+  NULL,
+  cairo_image_view_create,
+  cairo_image_view_destroy,
+  NULL,
+  cairo_image_view_create_surface,
+  cairo_image_view_destroy_surface,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL
+};
+
+static cairo_surface_t *
+cairo_image_view_iface_create_surface (gpointer instance,
+				       gpointer surface,
+				       int      width,
+				       int      height)
 {
-  return &cairo_x_viewer_iface;
+  return surface;
 }
+
+static CairoViewerIface cairo_image_viewer_iface = {
+  &cairo_image_viewer,
+  cairo_image_view_iface_create_surface
+};
+
+const CairoViewerIface *
+get_cairo_viewer_iface (void)
+{
+#ifdef HAVE_CAIRO_XLIB
+  if (opt_display)
+    return &cairo_x_viewer_iface;
 #endif /* HAVE_CAIRO_XLIB */
+
+  return &cairo_image_viewer_iface;
+}
diff --git a/pango-view/viewer-cairo.h b/pango-view/viewer-cairo.h
index ba5a5d7..7e6d9ae 100644
--- a/pango-view/viewer-cairo.h
+++ b/pango-view/viewer-cairo.h
@@ -37,6 +37,6 @@ struct _CairoViewerIface
 				       int      height);
 };
 
-const CairoViewerIface *get_default_cairo_viewer_iface (void);
+const CairoViewerIface *get_cairo_viewer_iface (void);
 
 #endif /* VIEWER_CAIRO_H */
diff --git a/pango-view/viewer-main.c b/pango-view/viewer-main.c
index 2b66468..611a4fb 100644
--- a/pango-view/viewer-main.c
+++ b/pango-view/viewer-main.c
@@ -118,8 +118,13 @@ main (int    argc,
 	  gpointer state = NULL;
 
 	  if (view->create_window)
-	    window = view->create_window (instance, title, width, height);
+	    {
+	      window = view->create_window (instance, title, width, height);
+	      if (!window)
+	        goto no_display;
+	    }
 
+	  opt_display = FALSE;
 	  while (1)
 	    {
 	      state = view->display (instance, surface, window, width, height, state);
@@ -132,7 +137,10 @@ main (int    argc,
 	  if (view->destroy_window)
 	    view->destroy_window (instance, window);
 	}
-      else
+no_display:
+
+      /* If failed to display natively, call ImageMagick */
+      if (opt_display)
 	{
 	  int fd;
 	  FILE *stream;
diff --git a/pango-view/viewer-pangocairo.c b/pango-view/viewer-pangocairo.c
index 45c03df..8475627 100644
--- a/pango-view/viewer-pangocairo.c
+++ b/pango-view/viewer-pangocairo.c
@@ -36,7 +36,6 @@ typedef struct
   cairo_font_options_t *font_options;
 } CairoViewer;
 
-/* TODO: hinting */
 static gpointer
 pangocairo_view_create (const PangoViewer *klass G_GNUC_UNUSED)
 {
@@ -44,7 +43,7 @@ pangocairo_view_create (const PangoViewer *klass G_GNUC_UNUSED)
 
   instance = g_slice_new (CairoViewer);
 
-  instance->iface = get_default_cairo_viewer_iface ();
+  instance->iface = get_cairo_viewer_iface ();
   instance->backend = instance->iface->backend_class->create (instance->iface->backend_class);
 
   instance->fontmap = pango_cairo_font_map_new ();
@@ -364,6 +363,9 @@ pangocairo_view_create_window (gpointer    instance,
 {
   CairoViewer *c = (CairoViewer *) instance;
 
+  if (!c->iface->backend_class->create_window)
+    return NULL;
+
   return c->iface->backend_class->create_window (c->backend,
 						 title,
 						 width, height);
diff --git a/pango-view/viewer-x.c b/pango-view/viewer-x.c
index 58f1c59..25492f3 100644
--- a/pango-view/viewer-x.c
+++ b/pango-view/viewer-x.c
@@ -32,7 +32,7 @@ x_view_init (gpointer           instance,
 
   x->display = XOpenDisplay (NULL);
   if (!x->display)
-    fail ("Cannot open display %s\n", XDisplayName (NULL));
+    fail ("Cannot open display %s", XDisplayName (NULL));
 
   x->screen = DefaultScreen (x->display);
 }
@@ -237,5 +237,3 @@ const PangoViewer x_viewer = {
   x_view_destroy_window,
   x_view_display
 };
-
-const PangoViewer *fallback_viewer = &x_viewer;
diff --git a/pango-view/viewer.h b/pango-view/viewer.h
index 20fbdbe..055ca58 100644
--- a/pango-view/viewer.h
+++ b/pango-view/viewer.h
@@ -93,7 +93,6 @@ struct _PangoViewer {
 
 };
 
-extern const PangoViewer *fallback_viewer;
 extern const PangoViewer *viewers[];
 
 #endif /* VIEWER_H */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]