]> www.fi.muni.cz Git - evince.git/blobdiff - backend/dvi/cairo-device.c
a11: using ATK_ROLE_DOCUMENT_FRAME it's more correct
[evince.git] / backend / dvi / cairo-device.c
index b8ec39e6877c904b8a9ff0f69635a52c8ce6c362..9f4badb2546496ebf7e575f4b12ebb787bc19dc2 100644 (file)
  *
  * 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #include <config.h>
 
-#include <gdk/gdkcolor.h>
+#include <stdlib.h>
+#include <gdk/gdk.h>
 #ifdef HAVE_SPECTRE
 #include <libspectre/spectre.h>
 #endif
@@ -54,7 +55,9 @@ dvi_cairo_draw_glyph (DviContext  *dvi,
 
        glyph = &ch->grey;
 
-       isbox = (glyph->data == NULL || (dvi->params.flags & MDVI_PARAM_CHARBOXES));
+       isbox = (glyph->data == NULL ||
+                (dvi->params.flags & MDVI_PARAM_CHARBOXES) ||
+                MDVI_GLYPH_ISEMPTY (glyph->data));
 
        x = - glyph->x + x0 + cairo_device->xmargin;
        y = - glyph->y + y0 + cairo_device->ymargin;
@@ -199,12 +202,9 @@ dvi_cairo_alloc_colors (void  *device_data,
                        int    density)
 {
        double  frac;
-       GdkColor color, color_fg, color_bg;
+       GdkColor color, color_fg;
        int     i, n;
-
-       color_bg.red = (bg >> 16) & 0xff;
-       color_bg.green = (bg >> 8) & 0xff;
-       color_bg.blue = (bg >> 0) & 0xff;
+       unsigned int alpha;
 
        color_fg.red = (fg >> 16) & 0xff;
        color_fg.green = (fg >> 8) & 0xff;
@@ -216,11 +216,12 @@ dvi_cairo_alloc_colors (void  *device_data,
                        pow ((double)i / n, 1 / gamma) :
                        1 - pow ((double)(n - i) / n, -gamma);
                
-               color.red = frac * ((double)color_fg.red - color_bg.red) + color_bg.red;
-               color.green = frac * ((double)color_fg.green - color_bg.green) + color_bg.green;
-               color.blue = frac * ((double)color_fg.blue - color_bg.blue) + color_bg.blue;
-               
-               pixels[i] = (color.red << 16) + (color.green << 8) + color.blue + 0xff000000;
+               color.red = frac * color_fg.red;
+               color.green = frac * color_fg.green;
+               color.blue = frac * color_fg.blue;
+               alpha = frac * 0xFF;
+
+               pixels[i] = (alpha << 24) + (color.red << 16) + (color.green << 8) + color.blue;
        }
 
        return npixels;
@@ -232,7 +233,7 @@ dvi_cairo_create_image (void *device_data,
                        Uint  height,
                        Uint  bpp)
 {
-       return cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
+       return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
 }
 
 static void
@@ -244,19 +245,24 @@ dvi_cairo_free_image (void *ptr)
 static void
 dvi_cairo_put_pixel (void *image, int x, int y, Ulong color)
 {
-       cairo_t         *cr;
        cairo_surface_t *surface;
        gint             rowstride;
-       guchar          *p;
+       guint32         *p;
 
        surface = (cairo_surface_t *) image;
 
        rowstride = cairo_image_surface_get_stride (surface);
-       p = cairo_image_surface_get_data (surface) + y * rowstride + x * 4;
+       p = (guint32*) (cairo_image_surface_get_data (surface) + y * rowstride + x * 4);
+
+        /* per cairo docs, must flush before modifying outside of cairo */
+        cairo_surface_flush(surface);
+       *p = color;
+}
 
-       p[2] = (color >> 16) & 0xff;
-       p[1] = (color >> 8) & 0xff;
-       p[0] = (color >> 0) & 0xff;
+static void
+dvi_cairo_image_done (void *ptr)
+{
+        cairo_surface_mark_dirty((cairo_surface_t *)ptr);
 }
 
 static void
@@ -280,6 +286,7 @@ mdvi_cairo_device_init (DviDevice *device)
        device->create_image = dvi_cairo_create_image;
        device->free_image = dvi_cairo_free_image;
        device->put_pixel = dvi_cairo_put_pixel;
+        device->image_done = dvi_cairo_image_done;
        device->set_color = dvi_cairo_set_color;
 #ifdef HAVE_SPECTRE
        device->draw_ps = dvi_cairo_draw_ps;
@@ -319,9 +326,6 @@ mdvi_cairo_device_render (DviContext* dvi)
        gint             page_width;
        gint             page_height;
        cairo_surface_t *surface;
-       gchar           *pixels;
-       gint             rowstride;
-       static const cairo_user_data_key_t key;
 
        cairo_device = (DviCairoDevice *) dvi->device.device_data;
 
@@ -331,19 +335,14 @@ mdvi_cairo_device_render (DviContext* dvi)
        page_width = dvi->dvi_page_w * dvi->params.conv + 2 * cairo_device->xmargin;
        page_height = dvi->dvi_page_h * dvi->params.vconv + 2 * cairo_device->ymargin;
 
-       rowstride = page_width * 4;
-       pixels = (gchar *) g_malloc (page_height * rowstride);
-       memset (pixels, 0xff, page_height * rowstride);
-
-       surface = cairo_image_surface_create_for_data (pixels,
-                                                      CAIRO_FORMAT_RGB24,
-                                                      page_width, page_height,
-                                                      rowstride);
-       cairo_surface_set_user_data (surface, &key,
-                                    pixels, (cairo_destroy_func_t)g_free);
+       surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+                                              page_width, page_height);
 
        cairo_device->cr = cairo_create (surface);
-       cairo_surface_destroy (surface);
+        cairo_surface_destroy (surface);
+
+        cairo_set_source_rgb (cairo_device->cr, 1., 1., 1.);
+        cairo_paint (cairo_device->cr);
 
        mdvi_dopage (dvi, dvi->currpage);
 }