2 * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2, or (at your option)
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 #include <gdk/gdkcolor.h>
20 #include "cairo-device.h"
36 dvi_cairo_draw_glyph (DviContext *dvi,
41 DviCairoDevice *cairo_device;
45 cairo_surface_t *surface;
47 cairo_device = (DviCairoDevice *) dvi->device.device_data;
51 isbox = (glyph->data == NULL || (dvi->params.flags & MDVI_PARAM_CHARBOXES));
53 x = - glyph->x + x0 + cairo_device->xmargin;
54 y = - glyph->y + y0 + cairo_device->ymargin;
58 surface = cairo_get_target (cairo_device->cr);
60 || x + w > cairo_image_surface_get_width (surface)
61 || y + h > cairo_image_surface_get_height (surface))
64 cairo_save (cairo_device->cr);
66 cairo_rectangle (cairo_device->cr,
67 x - cairo_device->xmargin,
68 y - cairo_device->ymargin,
70 cairo_stroke (cairo_device->cr);
72 cairo_translate (cairo_device->cr, x, y);
73 cairo_set_source_surface (cairo_device->cr,
74 (cairo_surface_t *) glyph->data,
76 cairo_paint (cairo_device->cr);
79 cairo_restore (cairo_device->cr);
83 dvi_cairo_draw_rule (DviContext *dvi,
90 DviCairoDevice *cairo_device;
93 cairo_device = (DviCairoDevice *) dvi->device.device_data;
95 color = cairo_device->fg;
97 cairo_save (cairo_device->cr);
99 cairo_set_line_width (cairo_device->cr,
100 cairo_get_line_width (cairo_device->cr) * cairo_device->scale);
101 cairo_set_source_rgb (cairo_device->cr,
102 ((color >> 16) & 0xff) / 255.,
103 ((color >> 8) & 0xff) / 255.,
104 ((color >> 0) & 0xff) / 255.);
106 cairo_rectangle (cairo_device->cr,
107 x + cairo_device->xmargin,
108 y + cairo_device->ymargin,
111 cairo_stroke (cairo_device->cr);
113 cairo_fill (cairo_device->cr);
116 cairo_restore (cairo_device->cr);
120 dvi_cairo_alloc_colors (void *device_data,
129 GdkColor color, color_fg, color_bg;
132 color_bg.red = (bg >> 16) & 0xff;
133 color_bg.green = (bg >> 8) & 0xff;
134 color_bg.blue = (bg >> 0) & 0xff;
136 color_fg.red = (fg >> 16) & 0xff;
137 color_fg.green = (fg >> 8) & 0xff;
138 color_fg.blue = (fg >> 0) & 0xff;
141 for (i = 0; i < npixels; i++) {
143 pow ((double)i / n, 1 / gamma) :
144 1 - pow ((double)(n - i) / n, -gamma);
146 color.red = frac * ((double)color_fg.red - color_bg.red) + color_bg.red;
147 color.green = frac * ((double)color_fg.green - color_bg.green) + color_bg.green;
148 color.blue = frac * ((double)color_fg.blue - color_bg.blue) + color_bg.blue;
150 pixels[i] = (color.red << 16) + (color.green << 8) + color.blue + 0xff000000;
157 dvi_cairo_create_image (void *device_data,
162 return cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
166 dvi_cairo_free_image (void *ptr)
168 cairo_surface_destroy ((cairo_surface_t *)ptr);
172 dvi_cairo_put_pixel (void *image, int x, int y, Ulong color)
175 cairo_surface_t *surface;
179 surface = (cairo_surface_t *) image;
181 rowstride = cairo_image_surface_get_stride (surface);
182 p = cairo_image_surface_get_data (surface) + y * rowstride + x * 4;
184 p[2] = (color >> 16) & 0xff;
185 p[1] = (color >> 8) & 0xff;
186 p[0] = (color >> 0) & 0xff;
190 dvi_cairo_set_color (void *device_data, Ulong fg, Ulong bg)
192 DviCairoDevice *cairo_device = (DviCairoDevice *) device_data;
194 cairo_device->fg = fg;
195 cairo_device->bg = bg;
200 mdvi_cairo_device_init (DviDevice *device)
202 device->device_data = g_new0 (DviCairoDevice, 1);
204 device->draw_glyph = dvi_cairo_draw_glyph;
205 device->draw_rule = dvi_cairo_draw_rule;
206 device->alloc_colors = dvi_cairo_alloc_colors;
207 device->create_image = dvi_cairo_create_image;
208 device->free_image = dvi_cairo_free_image;
209 device->put_pixel = dvi_cairo_put_pixel;
210 device->set_color = dvi_cairo_set_color;
211 device->refresh = NULL;
215 mdvi_cairo_device_free (DviDevice *device)
217 DviCairoDevice *cairo_device;
219 cairo_device = (DviCairoDevice *) device->device_data;
221 if (cairo_device->cr)
222 cairo_destroy (cairo_device->cr);
224 g_free (cairo_device);
228 mdvi_cairo_device_get_surface (DviDevice *device)
230 DviCairoDevice *cairo_device;
232 cairo_device = (DviCairoDevice *) device->device_data;
234 return cairo_surface_reference (cairo_get_target (cairo_device->cr));
238 mdvi_cairo_device_render (DviContext* dvi)
240 DviCairoDevice *cairo_device;
243 cairo_surface_t *surface;
246 static const cairo_user_data_key_t key;
248 cairo_device = (DviCairoDevice *) dvi->device.device_data;
250 if (cairo_device->cr)
251 cairo_destroy (cairo_device->cr);
253 page_width = dvi->dvi_page_w * dvi->params.conv + 2 * cairo_device->xmargin;
254 page_height = dvi->dvi_page_h * dvi->params.vconv + 2 * cairo_device->ymargin;
256 rowstride = page_width * 4;
257 pixels = (gchar *) g_malloc (page_height * rowstride);
258 memset (pixels, 0xff, page_height * rowstride);
260 surface = cairo_image_surface_create_for_data (pixels,
262 page_width, page_height,
264 cairo_surface_set_user_data (surface, &key,
265 pixels, (cairo_destroy_func_t)g_free);
267 cairo_device->cr = cairo_create (surface);
268 cairo_surface_destroy (surface);
270 mdvi_dopage (dvi, dvi->currpage);
274 mdvi_cairo_device_set_margins (DviDevice *device,
278 DviCairoDevice *cairo_device;
280 cairo_device = (DviCairoDevice *) device->device_data;
282 cairo_device->xmargin = xmargin;
283 cairo_device->ymargin = ymargin;
287 mdvi_cairo_device_set_scale (DviDevice *device,
290 DviCairoDevice *cairo_device;
292 cairo_device = (DviCairoDevice *) device->device_data;
294 cairo_device->scale = scale;