CAIRO_FORMAT_A8 not allowed for cairo-qt image backend diff --git a/gfx/cairo/cairo/src/cairo-qt-surface.cpp b/gfx/cairo/cairo/src/cairo-qt-surface.cpp --- a/gfx/cairo/cairo/src/cairo-qt-surface.cpp +++ b/gfx/cairo/cairo/src/cairo-qt-surface.cpp @@ -459,17 +459,17 @@ _cairo_qt_surface_finish (void *abstract { cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; D(fprintf(stderr, "q[%p] finish\n", abstract_surface)); /* Only delete p if we created it */ if (qs->image || qs->pixmap) delete qs->p; - else + else if (qs->p) qs->p->restore (); if (qs->image_equiv) cairo_surface_destroy (qs->image_equiv); _cairo_surface_clipper_reset (&qs->clipper); if (qs->image) @@ -736,17 +736,17 @@ _cairo_qt_surface_set_clip_region (cairo } static cairo_int_status_t _cairo_qt_surface_set_clip (cairo_qt_surface_t *qs, cairo_clip_t *clip) { cairo_int_status_t status; - D(fprintf(stderr, "q[%p] intersect_clip_path %s\n", abstract_surface, path ? "(path)" : "(clear)")); + D(fprintf(stderr, "q[%p] intersect_clip_path %s\n", qs, clip ? "(path)" : "(clear)")); if (clip == NULL) { _cairo_surface_clipper_reset (&qs->clipper); // How the clip path is reset depends on whether we own p or not if (qs->pixmap || qs->image) { // we own p qs->p->setClipping (false); } else { @@ -1605,16 +1605,25 @@ cairo_qt_surface_create_with_qimage (cai _cairo_surface_init (&qs->base, &cairo_qt_surface_backend, _cairo_content_from_format (format)); _cairo_surface_clipper_init (&qs->clipper, _cairo_qt_surface_clipper_intersect_clip_path); + if (CAIRO_FORMAT_A8 == format) { + qs->image = NULL; + qs->image_equiv = cairo_image_surface_create(format, + width, height); + qs->p = NULL; + qs->supports_porter_duff = false; + qs->window = QRect(0, 0, width, height); + return &qs->base; + } QImage *image = new QImage (width, height, _qimage_format_from_cairo_format (format)); qs->image = image; if (!image->isNull()) { qs->p = new QPainter(image);