*
* 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>
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;
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;
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;
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
rowstride = cairo_image_surface_get_stride (surface);
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;
}
+static void
+dvi_cairo_image_done (void *ptr)
+{
+ cairo_surface_mark_dirty((cairo_surface_t *)ptr);
+}
+
static void
dvi_cairo_set_color (void *device_data, Ulong fg, Ulong bg)
{
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;
gint page_width;
gint page_height;
cairo_surface_t *surface;
- guchar *pixels;
- gint rowstride;
- static const cairo_user_data_key_t key;
cairo_device = (DviCairoDevice *) dvi->device.device_data;
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 = (guchar *) 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);
}