diff options
Diffstat (limited to '')
-rw-r--r-- | gfx/2d/DrawCommands.h | 997 |
1 files changed, 997 insertions, 0 deletions
diff --git a/gfx/2d/DrawCommands.h b/gfx/2d/DrawCommands.h new file mode 100644 index 0000000000..23db4c9be1 --- /dev/null +++ b/gfx/2d/DrawCommands.h @@ -0,0 +1,997 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_GFX_DRAWCOMMANDS_H_ +#define MOZILLA_GFX_DRAWCOMMANDS_H_ + +#include <math.h> + +#include "2D.h" +#include "Blur.h" +#include "Filters.h" +#include <vector> +#include "CaptureCommandList.h" +#include "DrawCommand.h" +#include "FilterNodeCapture.h" +#include "Logging.h" +#include "nsRegion.h" + +namespace mozilla { +namespace gfx { + +#define CLONE_INTO(Type) new (aList->Append<Type>()) Type + +class StrokeOptionsCommand : public DrawingCommand { + public: + StrokeOptionsCommand(const StrokeOptions& aStrokeOptions) + : mStrokeOptions(aStrokeOptions) { + // Stroke Options dashes are owned by the caller. + // Have to copy them here so they don't get freed + // between now and replay. + if (aStrokeOptions.mDashLength) { + mDashes.resize(aStrokeOptions.mDashLength); + mStrokeOptions.mDashPattern = &mDashes.front(); + PodCopy(&mDashes.front(), aStrokeOptions.mDashPattern, + mStrokeOptions.mDashLength); + } + } + + virtual ~StrokeOptionsCommand() = default; + + protected: + StrokeOptions mStrokeOptions; + std::vector<Float> mDashes; +}; + +class StoredPattern { + public: + explicit StoredPattern(const Pattern& aPattern) { Assign(aPattern); } + + void Assign(const Pattern& aPattern) { + switch (aPattern.GetType()) { + case PatternType::COLOR: + new (mColor) ColorPattern(*static_cast<const ColorPattern*>(&aPattern)); + return; + case PatternType::SURFACE: { + SurfacePattern* surfPat = new (mSurface) + SurfacePattern(*static_cast<const SurfacePattern*>(&aPattern)); + surfPat->mSurface->GuaranteePersistance(); + return; + } + case PatternType::LINEAR_GRADIENT: + new (mLinear) LinearGradientPattern( + *static_cast<const LinearGradientPattern*>(&aPattern)); + return; + case PatternType::RADIAL_GRADIENT: + new (mRadial) RadialGradientPattern( + *static_cast<const RadialGradientPattern*>(&aPattern)); + return; + case PatternType::CONIC_GRADIENT: + new (mConic) ConicGradientPattern( + *static_cast<const ConicGradientPattern*>(&aPattern)); + return; + } + } + + ~StoredPattern() { reinterpret_cast<Pattern*>(mPattern)->~Pattern(); } + + Pattern* Get() { return reinterpret_cast<Pattern*>(mPattern); } + + const Pattern* Get() const { + return reinterpret_cast<const Pattern*>(mPattern); + } + + operator Pattern&() { return *reinterpret_cast<Pattern*>(mPattern); } + + operator const Pattern&() const { + return *reinterpret_cast<const Pattern*>(mPattern); + } + + StoredPattern(const StoredPattern& aPattern) { Assign(aPattern); } + + private: + StoredPattern operator=(const StoredPattern& aOther) { + // Block this so that we notice if someone's doing excessive assigning. + return *this; + } + + union { + char mPattern[sizeof(Pattern)]; + char mColor[sizeof(ColorPattern)]; + char mLinear[sizeof(LinearGradientPattern)]; + char mRadial[sizeof(RadialGradientPattern)]; + char mConic[sizeof(ConicGradientPattern)]; + char mSurface[sizeof(SurfacePattern)]; + }; +}; + +class DrawSurfaceCommand : public DrawingCommand { + public: + DrawSurfaceCommand(SourceSurface* aSurface, const Rect& aDest, + const Rect& aSource, + const DrawSurfaceOptions& aSurfOptions, + const DrawOptions& aOptions) + : mSurface(aSurface), + mDest(aDest), + mSource(aSource), + mSurfOptions(aSurfOptions), + mOptions(aOptions) {} + + CommandType GetType() const override { return DrawSurfaceCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(DrawSurfaceCommand) + (mSurface, mDest, mSource, mSurfOptions, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->DrawSurface(mSurface, mDest, mSource, mSurfOptions, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[DrawSurface surf=" << mSurface; + aStream << " dest=" << mDest; + aStream << " src=" << mSource; + aStream << " surfOpt=" << mSurfOptions; + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::DRAWSURFACE; + + private: + RefPtr<SourceSurface> mSurface; + Rect mDest; + Rect mSource; + DrawSurfaceOptions mSurfOptions; + DrawOptions mOptions; +}; + +class DrawSurfaceWithShadowCommand : public DrawingCommand { + public: + DrawSurfaceWithShadowCommand(SourceSurface* aSurface, const Point& aDest, + const DeviceColor& aColor, const Point& aOffset, + Float aSigma, CompositionOp aOperator) + : mSurface(aSurface), + mDest(aDest), + mColor(aColor), + mOffset(aOffset), + mSigma(aSigma), + mOperator(aOperator) {} + + CommandType GetType() const override { + return DrawSurfaceWithShadowCommand::Type; + } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(DrawSurfaceWithShadowCommand) + (mSurface, mDest, mColor, mOffset, mSigma, mOperator); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->DrawSurfaceWithShadow(mSurface, mDest, mColor, mOffset, mSigma, + mOperator); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[DrawSurfaceWithShadow surf=" << mSurface; + aStream << " dest=" << mDest; + aStream << " color=" << mColor; + aStream << " offset=" << mOffset; + aStream << " sigma=" << mSigma; + aStream << " op=" << mOperator; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::DRAWSURFACEWITHSHADOW; + + private: + RefPtr<SourceSurface> mSurface; + Point mDest; + DeviceColor mColor; + Point mOffset; + Float mSigma; + CompositionOp mOperator; +}; + +class DrawFilterCommand : public DrawingCommand { + public: + DrawFilterCommand(FilterNode* aFilter, const Rect& aSourceRect, + const Point& aDestPoint, const DrawOptions& aOptions) + : mFilter(aFilter), + mSourceRect(aSourceRect), + mDestPoint(aDestPoint), + mOptions(aOptions) {} + + CommandType GetType() const override { return DrawFilterCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(DrawFilterCommand)(mFilter, mSourceRect, mDestPoint, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + RefPtr<FilterNode> filter = mFilter; + if (mFilter->GetBackendType() == FilterBackend::FILTER_BACKEND_CAPTURE) { + filter = static_cast<FilterNodeCapture*>(filter.get())->Validate(aDT); + + // This can happen if the FilterNodeCapture is unable to create a + // backing FilterNode on the target backend. Normally this would be + // handled by the painting code, but here there's not much we can do. + if (!filter) { + return; + } + } + aDT->DrawFilter(filter, mSourceRect, mDestPoint, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[DrawFilter surf=" << mFilter; + aStream << " src=" << mSourceRect; + aStream << " dest=" << mDestPoint; + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::DRAWFILTER; + + private: + RefPtr<FilterNode> mFilter; + Rect mSourceRect; + Point mDestPoint; + DrawOptions mOptions; +}; + +class ClearRectCommand : public DrawingCommand { + public: + explicit ClearRectCommand(const Rect& aRect) : mRect(aRect) {} + + CommandType GetType() const override { return ClearRectCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(ClearRectCommand)(mRect); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->ClearRect(mRect); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[ClearRect rect=" << mRect << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::CLEARRECT; + + private: + Rect mRect; +}; + +class CopySurfaceCommand : public DrawingCommand { + public: + CopySurfaceCommand(SourceSurface* aSurface, const IntRect& aSourceRect, + const IntPoint& aDestination) + : mSurface(aSurface), + mSourceRect(aSourceRect), + mDestination(aDestination) {} + + CommandType GetType() const override { return CopySurfaceCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(CopySurfaceCommand)(mSurface, mSourceRect, mDestination); + } + + virtual void ExecuteOnDT(DrawTarget* aDT, + const Matrix* aTransform) const override { + MOZ_ASSERT(!aTransform || !aTransform->HasNonIntegerTranslation()); + Point dest(Float(mDestination.x), Float(mDestination.y)); + if (aTransform) { + dest = aTransform->TransformPoint(dest); + } + aDT->CopySurface(mSurface, mSourceRect, + IntPoint(uint32_t(dest.x), uint32_t(dest.y))); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[CopySurface surf=" << mSurface; + aStream << " src=" << mSourceRect; + aStream << " dest=" << mDestination; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::COPYSURFACE; + + private: + RefPtr<SourceSurface> mSurface; + IntRect mSourceRect; + IntPoint mDestination; +}; + +class CopyRectCommand : public DrawingCommand { + public: + CopyRectCommand(const IntRect& aSourceRect, const IntPoint& aDestination) + : mSourceRect(aSourceRect), mDestination(aDestination) {} + + CommandType GetType() const override { return CopyRectCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(CopyRectCommand)(mSourceRect, mDestination); + } + + virtual void ExecuteOnDT(DrawTarget* aDT, + const Matrix* aTransform) const override { + aDT->CopyRect(mSourceRect, mDestination); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[CopyRect src=" << mSourceRect; + aStream << " dest=" << mDestination; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::COPYRECT; + + private: + IntRect mSourceRect; + IntPoint mDestination; +}; + +class FillRectCommand : public DrawingCommand { + public: + FillRectCommand(const Rect& aRect, const Pattern& aPattern, + const DrawOptions& aOptions) + : mRect(aRect), mPattern(aPattern), mOptions(aOptions) {} + + CommandType GetType() const override { return FillRectCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(FillRectCommand)(mRect, mPattern, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->FillRect(mRect, mPattern, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[FillRect rect=" << mRect; + aStream << " pattern=" << mPattern.Get(); + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::FILLRECT; + + private: + Rect mRect; + StoredPattern mPattern; + DrawOptions mOptions; +}; + +class FillRoundedRectCommand : public DrawingCommand { + public: + FillRoundedRectCommand(const RoundedRect& aRect, const Pattern& aPattern, + const DrawOptions& aOptions) + : mRect(aRect), mPattern(aPattern), mOptions(aOptions) {} + + CommandType GetType() const override { return FillRoundedRectCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(FillRoundedRectCommand)(mRect, mPattern, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->FillRoundedRect(mRect, mPattern, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[FillRoundedRect rect=" << mRect.rect; + aStream << " pattern=" << mPattern.Get(); + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::FILLROUNDEDRECT; + + private: + RoundedRect mRect; + StoredPattern mPattern; + DrawOptions mOptions; +}; + +class StrokeRectCommand : public StrokeOptionsCommand { + public: + StrokeRectCommand(const Rect& aRect, const Pattern& aPattern, + const StrokeOptions& aStrokeOptions, + const DrawOptions& aOptions) + : StrokeOptionsCommand(aStrokeOptions), + mRect(aRect), + mPattern(aPattern), + mOptions(aOptions) {} + + CommandType GetType() const override { return StrokeRectCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(StrokeRectCommand)(mRect, mPattern, mStrokeOptions, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->StrokeRect(mRect, mPattern, mStrokeOptions, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[StrokeRect rect=" << mRect; + aStream << " pattern=" << mPattern.Get(); + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::STROKERECT; + + private: + Rect mRect; + StoredPattern mPattern; + DrawOptions mOptions; +}; + +class StrokeLineCommand : public StrokeOptionsCommand { + public: + StrokeLineCommand(const Point& aStart, const Point& aEnd, + const Pattern& aPattern, + const StrokeOptions& aStrokeOptions, + const DrawOptions& aOptions) + : StrokeOptionsCommand(aStrokeOptions), + mStart(aStart), + mEnd(aEnd), + mPattern(aPattern), + mOptions(aOptions) {} + + CommandType GetType() const override { return StrokeLineCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(StrokeLineCommand) + (mStart, mEnd, mPattern, mStrokeOptions, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->StrokeLine(mStart, mEnd, mPattern, mStrokeOptions, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[StrokeLine start=" << mStart; + aStream << " end=" << mEnd; + aStream << " pattern=" << mPattern.Get(); + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::STROKELINE; + + private: + Point mStart; + Point mEnd; + StoredPattern mPattern; + DrawOptions mOptions; +}; + +class FillCommand : public DrawingCommand { + public: + FillCommand(const Path* aPath, const Pattern& aPattern, + const DrawOptions& aOptions) + : mPath(const_cast<Path*>(aPath)), + mPattern(aPattern), + mOptions(aOptions) {} + + CommandType GetType() const override { return FillCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(FillCommand)(mPath, mPattern, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->Fill(mPath, mPattern, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[FillCommand path=" << mPath; + aStream << " pattern=" << mPattern.Get(); + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::FILL; + + private: + RefPtr<Path> mPath; + StoredPattern mPattern; + DrawOptions mOptions; +}; + +class StrokeCommand : public StrokeOptionsCommand { + public: + StrokeCommand(const Path* aPath, const Pattern& aPattern, + const StrokeOptions& aStrokeOptions, + const DrawOptions& aOptions) + : StrokeOptionsCommand(aStrokeOptions), + mPath(const_cast<Path*>(aPath)), + mPattern(aPattern), + mOptions(aOptions) {} + + CommandType GetType() const override { return StrokeCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(StrokeCommand)(mPath, mPattern, mStrokeOptions, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->Stroke(mPath, mPattern, mStrokeOptions, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[Stroke path=" << mPath; + aStream << " pattern=" << mPattern.Get(); + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::STROKE; + + private: + RefPtr<Path> mPath; + StoredPattern mPattern; + DrawOptions mOptions; +}; + +class FillGlyphsCommand : public DrawingCommand { + friend class DrawTargetCaptureImpl; + + public: + FillGlyphsCommand(ScaledFont* aFont, const GlyphBuffer& aBuffer, + const Pattern& aPattern, const DrawOptions& aOptions) + : mFont(aFont), mPattern(aPattern), mOptions(aOptions) { + mGlyphs.resize(aBuffer.mNumGlyphs); + memcpy(&mGlyphs.front(), aBuffer.mGlyphs, + sizeof(Glyph) * aBuffer.mNumGlyphs); + } + + CommandType GetType() const override { return FillGlyphsCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + GlyphBuffer glyphs = { + mGlyphs.data(), + (uint32_t)mGlyphs.size(), + }; + CLONE_INTO(FillGlyphsCommand)(mFont, glyphs, mPattern, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + GlyphBuffer buf; + buf.mNumGlyphs = mGlyphs.size(); + buf.mGlyphs = &mGlyphs.front(); + aDT->FillGlyphs(mFont, buf, mPattern, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[FillGlyphs font=" << mFont; + aStream << " glyphCount=" << mGlyphs.size(); + aStream << " pattern=" << mPattern.Get(); + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::FILLGLYPHS; + + private: + RefPtr<ScaledFont> mFont; + std::vector<Glyph> mGlyphs; + StoredPattern mPattern; + DrawOptions mOptions; +}; + +class StrokeGlyphsCommand : public StrokeOptionsCommand { + friend class DrawTargetCaptureImpl; + + public: + StrokeGlyphsCommand(ScaledFont* aFont, const GlyphBuffer& aBuffer, + const Pattern& aPattern, + const StrokeOptions& aStrokeOptions, + const DrawOptions& aOptions) + : StrokeOptionsCommand(aStrokeOptions), + mFont(aFont), + mPattern(aPattern), + mOptions(aOptions) { + mGlyphs.resize(aBuffer.mNumGlyphs); + memcpy(&mGlyphs.front(), aBuffer.mGlyphs, + sizeof(Glyph) * aBuffer.mNumGlyphs); + } + + CommandType GetType() const override { return StrokeGlyphsCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + GlyphBuffer glyphs = { + mGlyphs.data(), + (uint32_t)mGlyphs.size(), + }; + CLONE_INTO(StrokeGlyphsCommand) + (mFont, glyphs, mPattern, mStrokeOptions, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + GlyphBuffer buf; + buf.mNumGlyphs = mGlyphs.size(); + buf.mGlyphs = &mGlyphs.front(); + aDT->StrokeGlyphs(mFont, buf, mPattern, mStrokeOptions, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[StrokeGlyphs font=" << mFont; + aStream << " glyphCount=" << mGlyphs.size(); + aStream << " pattern=" << mPattern.Get(); + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::STROKEGLYPHS; + + private: + RefPtr<ScaledFont> mFont; + std::vector<Glyph> mGlyphs; + StoredPattern mPattern; + DrawOptions mOptions; +}; + +class MaskCommand : public DrawingCommand { + public: + MaskCommand(const Pattern& aSource, const Pattern& aMask, + const DrawOptions& aOptions) + : mSource(aSource), mMask(aMask), mOptions(aOptions) {} + + CommandType GetType() const override { return MaskCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(MaskCommand)(mSource, mMask, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->Mask(mSource, mMask, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[Mask source=" << mSource.Get(); + aStream << " mask=" << mMask.Get(); + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::MASK; + + private: + StoredPattern mSource; + StoredPattern mMask; + DrawOptions mOptions; +}; + +class MaskSurfaceCommand : public DrawingCommand { + public: + MaskSurfaceCommand(const Pattern& aSource, const SourceSurface* aMask, + const Point& aOffset, const DrawOptions& aOptions) + : mSource(aSource), + mMask(const_cast<SourceSurface*>(aMask)), + mOffset(aOffset), + mOptions(aOptions) {} + + CommandType GetType() const override { return MaskSurfaceCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(MaskSurfaceCommand)(mSource, mMask, mOffset, mOptions); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->MaskSurface(mSource, mMask, mOffset, mOptions); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[Mask source=" << mSource.Get(); + aStream << " mask=" << mMask; + aStream << " offset=" << &mOffset; + aStream << " opt=" << mOptions; + aStream << "]"; + } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::MASKSURFACE; + + private: + StoredPattern mSource; + RefPtr<SourceSurface> mMask; + Point mOffset; + DrawOptions mOptions; +}; + +class PushClipCommand : public DrawingCommand { + public: + explicit PushClipCommand(const Path* aPath) + : mPath(const_cast<Path*>(aPath)) {} + + CommandType GetType() const override { return PushClipCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(PushClipCommand)(mPath); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->PushClip(mPath); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[PushClip path=" << mPath << "]"; + } + + static const bool AffectsSnapshot = false; + static const CommandType Type = CommandType::PUSHCLIP; + + private: + RefPtr<Path> mPath; +}; + +class PushClipRectCommand : public DrawingCommand { + public: + explicit PushClipRectCommand(const Rect& aRect) : mRect(aRect) {} + + CommandType GetType() const override { return PushClipRectCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(PushClipRectCommand)(mRect); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->PushClipRect(mRect); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[PushClipRect rect=" << mRect << "]"; + } + + static const bool AffectsSnapshot = false; + static const CommandType Type = CommandType::PUSHCLIPRECT; + + private: + Rect mRect; +}; + +class PushLayerCommand : public DrawingCommand { + public: + PushLayerCommand(const bool aOpaque, const Float aOpacity, + SourceSurface* aMask, const Matrix& aMaskTransform, + const IntRect& aBounds, bool aCopyBackground) + : mOpaque(aOpaque), + mOpacity(aOpacity), + mMask(aMask), + mMaskTransform(aMaskTransform), + mBounds(aBounds), + mCopyBackground(aCopyBackground) {} + + CommandType GetType() const override { return PushLayerCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(PushLayerCommand) + (mOpaque, mOpacity, mMask, mMaskTransform, mBounds, mCopyBackground); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->PushLayer(mOpaque, mOpacity, mMask, mMaskTransform, mBounds, + mCopyBackground); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[PushLayer opaque=" << mOpaque; + aStream << " opacity=" << mOpacity; + aStream << " mask=" << mMask; + aStream << " maskTransform=" << mMaskTransform; + aStream << " bounds=" << mBounds; + aStream << " copyBackground=" << mCopyBackground; + aStream << "]"; + } + + static const bool AffectsSnapshot = false; + static const CommandType Type = CommandType::PUSHLAYER; + + private: + bool mOpaque; + float mOpacity; + RefPtr<SourceSurface> mMask; + Matrix mMaskTransform; + IntRect mBounds; + bool mCopyBackground; +}; + +class PopClipCommand : public DrawingCommand { + public: + PopClipCommand() = default; + + CommandType GetType() const override { return PopClipCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(PopClipCommand)(); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->PopClip(); + } + + void Log(TreeLog<>& aStream) const override { aStream << "[PopClip]"; } + + static const bool AffectsSnapshot = false; + static const CommandType Type = CommandType::POPCLIP; +}; + +class PopLayerCommand : public DrawingCommand { + public: + PopLayerCommand() = default; + + CommandType GetType() const override { return PopLayerCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(PopLayerCommand)(); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->PopLayer(); + } + + void Log(TreeLog<>& aStream) const override { aStream << "[PopLayer]"; } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::POPLAYER; +}; + +class SetTransformCommand : public DrawingCommand { + friend class DrawTargetCaptureImpl; + + public: + explicit SetTransformCommand(const Matrix& aTransform) + : mTransform(aTransform) {} + + CommandType GetType() const override { return SetTransformCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(SetTransformCommand)(mTransform); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix* aMatrix) const override { + if (aMatrix) { + aDT->SetTransform(mTransform * (*aMatrix)); + } else { + aDT->SetTransform(mTransform); + } + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[SetTransform transform=" << mTransform << "]"; + } + + static const bool AffectsSnapshot = false; + static const CommandType Type = CommandType::SETTRANSFORM; + + private: + Matrix mTransform; +}; + +class SetPermitSubpixelAACommand : public DrawingCommand { + friend class DrawTargetCaptureImpl; + + public: + explicit SetPermitSubpixelAACommand(bool aPermitSubpixelAA) + : mPermitSubpixelAA(aPermitSubpixelAA) {} + + CommandType GetType() const override { + return SetPermitSubpixelAACommand::Type; + } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(SetPermitSubpixelAACommand)(mPermitSubpixelAA); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix* aMatrix) const override { + aDT->SetPermitSubpixelAA(mPermitSubpixelAA); + } + + void Log(TreeLog<>& aStream) const override { + aStream << "[SetPermitSubpixelAA permitSubpixelAA=" << mPermitSubpixelAA + << "]"; + } + + static const bool AffectsSnapshot = false; + static const CommandType Type = CommandType::SETPERMITSUBPIXELAA; + + private: + bool mPermitSubpixelAA; +}; + +class FlushCommand : public DrawingCommand { + public: + FlushCommand() = default; + + CommandType GetType() const override { return FlushCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(FlushCommand)(); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->Flush(); + } + + void Log(TreeLog<>& aStream) const override { aStream << "[Flush]"; } + + static const bool AffectsSnapshot = false; + static const CommandType Type = CommandType::FLUSH; +}; + +class BlurCommand : public DrawingCommand { + public: + explicit BlurCommand(const AlphaBoxBlur& aBlur) : mBlur(aBlur) {} + + CommandType GetType() const override { return BlurCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(BlurCommand)(mBlur); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->Blur(mBlur); + } + + void Log(TreeLog<>& aStream) const override { aStream << "[Blur]"; } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::BLUR; + + private: + AlphaBoxBlur mBlur; +}; + +class PadEdgesCommand : public DrawingCommand { + public: + explicit PadEdgesCommand(const IntRegion& aRegion) : mRegion(aRegion) {} + + CommandType GetType() const override { return PadEdgesCommand::Type; } + + void CloneInto(CaptureCommandList* aList) override { + CLONE_INTO(PadEdgesCommand)(IntRegion(mRegion)); + } + + void ExecuteOnDT(DrawTarget* aDT, const Matrix*) const override { + aDT->PadEdges(mRegion); + } + + void Log(TreeLog<>& aStream) const override { aStream << "[PADEDGES]"; } + + static const bool AffectsSnapshot = true; + static const CommandType Type = CommandType::PADEDGES; + + private: + IntRegion mRegion; +}; + +#undef CLONE_INTO + +} // namespace gfx +} // namespace mozilla + +#endif /* MOZILLA_GFX_DRAWCOMMANDS_H_ */ |