Code

Require a pageBox in the constructor for GfxState so that we do not always need to...
[inkscape.git] / src / extension / internal / pdf-cairo.cpp
index 52ca35e330ac47639929f68c2c69afc59f84126a..0b500864d14c189b1a9bab81a4b0adcac55adae5 100644 (file)
@@ -18,6 +18,8 @@
 # include "config.h"
 #endif
 
+#ifdef HAVE_CAIRO_PDF
+
 #ifndef PANGO_ENABLE_BACKEND
 #define PANGO_ENABLE_BACKEND
 #endif
@@ -380,15 +382,18 @@ PrintCairoPDF::bind(Inkscape::Extension::Print *mod, NRMatrix const *transform,
     if (!_stream) return 0;  // XXX: fixme, returning -1 as unsigned.
     if (_bitmap) return 0;
     
-    cairo_save(cr);
+    if (opacity < 1.0) {
+        cairo_push_group(cr);
+    } else {
+        cairo_save(cr);
+    }
     _concat_transform(cr, transform->c[0], transform->c[1], transform->c[2], transform->c[3], transform->c[4], transform->c[5]);
 //    g_printf("bind: (%f) %f %f %f %f %f %f\n", opacity, transform->c[0], transform->c[1], transform->c[2], transform->c[3], transform->c[4], transform->c[5]);
     // remember these to be able to undo them when outputting text
     _last_tx = transform->c[4];
     _last_ty = transform->c[5];
     
-    float new_opacity = _alpha_stack.back() * opacity;
-    _alpha_stack.push_back(new_opacity);
+    _alpha_stack.push_back(opacity);
     
     return 1;
 }
@@ -398,8 +403,15 @@ PrintCairoPDF::release(Inkscape::Extension::Print *mod)
 {
     if (!_stream) return 0; // XXX: fixme, returning -1 as unsigned.
     if (_bitmap) return 0;
+
+    float opacity = _alpha_stack.back();
     
-    cairo_restore(cr);
+    if (opacity < 1.0) {
+        cairo_pop_group_to_source(cr);
+        cairo_paint_with_alpha(cr, opacity);
+    } else {
+        cairo_restore(cr);
+    }
 //    g_printf("release\n");
     _alpha_stack.pop_back();
     g_assert(_alpha_stack.size() > 0);
@@ -485,12 +497,12 @@ PrintCairoPDF::create_pattern_for_paint(SPPaintServer const *const paintserver,
                        case SP_GRADIENT_SPREAD_REPEAT:
                                cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT);
                                break;
-                       case SP_GRADIENT_SPREAD_REFLECT:        // not supported by cairo-pdf yet
-                               //cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REFLECT);
-                               //break;
+                       case SP_GRADIENT_SPREAD_REFLECT:
+                               cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REFLECT);
+                               break;
                        case SP_GRADIENT_SPREAD_PAD:
             default:
-                               cairo_pattern_set_extend(pattern, CAIRO_EXTEND_NONE);   // PAD not supported by cairo-pdf yet
+                               cairo_pattern_set_extend(pattern, CAIRO_EXTEND_PAD);
                                break;
                }
 
@@ -529,9 +541,7 @@ PrintCairoPDF::print_fill_style(cairo_t *cr, SPStyle const *const style, NRRect
         float rgb[3];
         sp_color_get_rgb_floatv(&style->fill.value.color, rgb);
 
-        float alpha = 1.0;
-        alpha *= SP_SCALE24_TO_FLOAT(style->fill_opacity.value);
-       alpha *= _alpha_stack.back();
+        float alpha = SP_SCALE24_TO_FLOAT(style->fill_opacity.value);
 
         cairo_set_source_rgba(cr, rgb[0], rgb[1], rgb[2], alpha);
     } else {
@@ -558,9 +568,7 @@ PrintCairoPDF::fill(Inkscape::Extension::Print *mod, NRBPath const *bpath, NRMat
         || ( style->fill.type == SP_PAINT_TYPE_PAINTSERVER
              && SP_IS_GRADIENT(SP_STYLE_FILL_SERVER(style)) ) ) {
         
-        float alpha = 1.0;
-        alpha *= SP_SCALE24_TO_FLOAT(style->fill_opacity.value);
-       alpha *= _alpha_stack.back();
+        float alpha = SP_SCALE24_TO_FLOAT(style->fill_opacity.value);
                
         cairo_save(cr);
         
@@ -589,9 +597,7 @@ PrintCairoPDF::fill(Inkscape::Extension::Print *mod, NRBPath const *bpath, NRMat
 void
 PrintCairoPDF::print_stroke_style(cairo_t *cr, SPStyle const *style, NRRect const *pbox)
 {
-    float alpha = 1.0;
-    alpha *= SP_SCALE24_TO_FLOAT(style->stroke_opacity.value);
-    alpha *= _alpha_stack.back();
+    float alpha = SP_SCALE24_TO_FLOAT(style->stroke_opacity.value);
 
     if ( style->stroke.type == SP_PAINT_TYPE_COLOR ) {
         float rgb[3];
@@ -1030,6 +1036,8 @@ PrintCairoPDF::init(void)
 
 /* End of GNU GPL code */
 
+#endif /* HAVE_CAIRO_PDF */
+
 
 /*
   Local Variables: