diff --git a/gfx/layers/basic/BasicLayers.cpp b/gfx/layers/basic/BasicLayers.cpp index 621fa5acaf06..57dba5534f62 100644 --- a/gfx/layers/basic/BasicLayers.cpp +++ b/gfx/layers/basic/BasicLayers.cpp @@ -743,14 +743,7 @@ BasicImageLayer::PaintContext(gfxPattern* aPattern, // No need to snap here; our transform has already taken care of it. aContext->Rectangle(gfxRect(0, 0, aSize.width, aSize.height)); aContext->SetPattern(aPattern); - if (aOpacity != 1.0) { - aContext->Save(); - aContext->Clip(); - aContext->Paint(aOpacity); - aContext->Restore(); - } else { - aContext->Fill(); - } + aContext->FillWithOpacity(aOpacity); } class BasicColorLayer : public ColorLayer, BasicImplData { @@ -962,14 +955,7 @@ BasicCanvasLayer::PaintWithOpacity(gfxContext* aContext, // No need to snap here; our transform is already set up to snap our rect aContext->Rectangle(gfxRect(0, 0, mBounds.width, mBounds.height)); aContext->SetPattern(pat); - if (aOpacity != 1.0) { - aContext->Save(); - aContext->Clip(); - aContext->Paint(aOpacity); - aContext->Restore(); - } else { - aContext->Fill(); - } + aContext->FillWithOpacity(aOpacity); if (mNeedsYFlip) { aContext->SetMatrix(m); @@ -2496,7 +2482,7 @@ BasicShadowCanvasLayer::Paint(gfxContext* aContext, // No need to snap here; our transform has already taken care of it aContext->Rectangle(r); aContext->SetPattern(pat); - aContext->Fill(); + aContext->FillWithOpacity(GetEffectiveOpacity()); } // Create a shadow layer (PLayerChild) for aLayer, if we're forwarding diff --git a/gfx/thebes/gfxContext.cpp b/gfx/thebes/gfxContext.cpp index c516011ab371..dd2d90fb059f 100644 --- a/gfx/thebes/gfxContext.cpp +++ b/gfx/thebes/gfxContext.cpp @@ -151,6 +151,21 @@ gfxContext::Fill() cairo_fill_preserve(mCairo); } +void +gfxContext::FillWithOpacity(gfxFloat aOpacity) +{ + // This method exists in the hope that one day cairo gets a direct + // API for this, and then we would change this method to use that + // API instead. + if (aOpacity != 1.0) { + gfxContextAutoSaveRestore saveRestore(this); + Clip(); + Paint(aOpacity); + } else { + Fill(); + } +} + void gfxContext::MoveTo(const gfxPoint& pt) { diff --git a/gfx/thebes/gfxContext.h b/gfx/thebes/gfxContext.h index 66fca6e9950b..6ac8143ec750 100644 --- a/gfx/thebes/gfxContext.h +++ b/gfx/thebes/gfxContext.h @@ -129,6 +129,14 @@ public: */ void Fill(); + /** + * Fill the current path according to the current settings and + * with |aOpacity|. + * + * Does not consume the current path. + */ + void FillWithOpacity(gfxFloat aOpacity); + /** * Forgets the current path. */