bool gfxSurfaceDrawable::Draw(gfxContext* aContext, const gfxRect& aFillRect, bool aRepeat, const GraphicsFilter& aFilter, const gfxMatrix& aTransform) { nsRefPtr<gfxPattern> pattern = new gfxPattern(mSurface); if (aRepeat) { pattern->SetExtend(gfxPattern::EXTEND_REPEAT); pattern->SetFilter(aFilter); } else { GraphicsFilter filter = aFilter; if (aContext->CurrentMatrix().HasOnlyIntegerTranslation() && aTransform.HasOnlyIntegerTranslation()) { // If we only have integer translation, no special filtering needs to // happen and we explicitly use FILTER_FAST. This is fast for some // backends. filter = GraphicsFilter::FILTER_FAST; } nsRefPtr<gfxASurface> currentTarget = aContext->CurrentSurface(); gfxMatrix deviceSpaceToImageSpace = DeviceToImageTransform(aContext, aTransform); PreparePatternForUntiledDrawing(pattern, deviceSpaceToImageSpace, currentTarget, filter); } pattern->SetMatrix(gfxMatrix(aTransform).Multiply(mTransform)); aContext->NewPath(); aContext->SetPattern(pattern); aContext->Rectangle(aFillRect); aContext->Fill(); return true; }
bool gfxSurfaceDrawable::Draw(gfxContext* aContext, const gfxRect& aFillRect, bool aRepeat, const GraphicsFilter& aFilter, const gfxMatrix& aTransform) { nsRefPtr<gfxPattern> pattern; if (mDrawTarget) { if (aContext->IsCairo()) { nsRefPtr<gfxASurface> source = gfxPlatform::GetPlatform()->GetThebesSurfaceForDrawTarget(mDrawTarget); pattern = new gfxPattern(source); } else { RefPtr<SourceSurface> source = mDrawTarget->Snapshot(); pattern = new gfxPattern(source, Matrix()); } } else if (mSourceSurface) { pattern = new gfxPattern(mSourceSurface, Matrix()); } else { pattern = new gfxPattern(mSurface); } if (aRepeat) { pattern->SetExtend(gfxPattern::EXTEND_REPEAT); pattern->SetFilter(aFilter); } else { GraphicsFilter filter = aFilter; if (aContext->CurrentMatrix().HasOnlyIntegerTranslation() && aTransform.HasOnlyIntegerTranslation()) { // If we only have integer translation, no special filtering needs to // happen and we explicitly use FILTER_FAST. This is fast for some // backends. filter = GraphicsFilter::FILTER_FAST; } nsRefPtr<gfxASurface> currentTarget = aContext->CurrentSurface(); gfxMatrix deviceSpaceToImageSpace = DeviceToImageTransform(aContext, aTransform); PreparePatternForUntiledDrawing(pattern, deviceSpaceToImageSpace, currentTarget, filter); } pattern->SetMatrix(gfxMatrix(aTransform).Multiply(mTransform)); aContext->NewPath(); aContext->SetPattern(pattern); aContext->Rectangle(aFillRect); aContext->Fill(); // clear the pattern so that the snapshot is released before the // drawable is destroyed aContext->SetDeviceColor(gfxRGBA(0.0, 0.0, 0.0, 0.0)); return true; }