X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=backend%2Fdvi%2Fcairo-device.c;h=9f4badb2546496ebf7e575f4b12ebb787bc19dc2;hb=dae88237d66fd49588cc27136c59376c443f9e9f;hp=b8ec39e6877c904b8a9ff0f69635a52c8ce6c362;hpb=4207c30cf856a79bc6e23219bf43554470cd4b0b;p=evince.git diff --git a/backend/dvi/cairo-device.c b/backend/dvi/cairo-device.c index b8ec39e6..9f4badb2 100644 --- a/backend/dvi/cairo-device.c +++ b/backend/dvi/cairo-device.c @@ -13,12 +13,13 @@ * * 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 -#include +#include +#include #ifdef HAVE_SPECTRE #include #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); }