DrawTargetOffset.h (8187B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef MOZILLA_GFX_DRAWTARGETOFFSET_H_ 8 #define MOZILLA_GFX_DRAWTARGETOFFSET_H_ 9 10 #include "2D.h" 11 12 #include "Filters.h" 13 #include "Logging.h" 14 15 namespace mozilla { 16 namespace gfx { 17 18 class SourceSurfaceOffset : public SourceSurface { 19 public: 20 SourceSurfaceOffset(RefPtr<SourceSurface> aSurface, IntPoint aOffset) 21 : mSurface(aSurface), mOffset(aOffset) { 22 MOZ_RELEASE_ASSERT(mSurface); 23 } 24 25 virtual SurfaceType GetType() const override { return SurfaceType::OFFSET; } 26 virtual IntSize GetSize() const override { return mSurface->GetSize(); } 27 virtual IntRect GetRect() const override { 28 return mSurface->GetRect() + mOffset; 29 } 30 virtual SurfaceFormat GetFormat() const override { 31 return mSurface->GetFormat(); 32 } 33 virtual already_AddRefed<DataSourceSurface> GetDataSurface() override { 34 return mSurface->GetDataSurface(); 35 } 36 virtual already_AddRefed<SourceSurface> GetUnderlyingSurface() override { 37 return mSurface->GetUnderlyingSurface(); 38 } 39 virtual SurfaceType GetUnderlyingType() const override { 40 return mSurface->GetUnderlyingType(); 41 } 42 43 private: 44 RefPtr<SourceSurface> mSurface; 45 IntPoint mOffset; 46 }; 47 48 class DrawTargetOffset : public DrawTarget { 49 public: 50 DrawTargetOffset(); 51 52 bool Init(DrawTarget* aDrawTarget, IntPoint aOrigin); 53 54 virtual bool IsValid() const override { return mDrawTarget->IsValid(); } 55 56 // We'll pestimistically return true here 57 virtual bool IsTiledDrawTarget() const override { return true; } 58 59 virtual DrawTargetType GetType() const override { 60 return mDrawTarget->GetType(); 61 } 62 virtual BackendType GetBackendType() const override { 63 return mDrawTarget->GetBackendType(); 64 } 65 virtual already_AddRefed<SourceSurface> Snapshot() override; 66 virtual already_AddRefed<SourceSurface> IntoLuminanceSource( 67 LuminanceType aLuminanceType, float aOpacity) override; 68 virtual void DetachAllSnapshots() override; 69 virtual IntSize GetSize() const override { return mDrawTarget->GetSize(); } 70 virtual IntRect GetRect() const override { 71 return mDrawTarget->GetRect() + mOrigin; 72 } 73 74 virtual void Flush() override; 75 virtual void DrawSurface(SourceSurface* aSurface, const Rect& aDest, 76 const Rect& aSource, 77 const DrawSurfaceOptions& aSurfOptions, 78 const DrawOptions& aOptions) override; 79 virtual void DrawFilter(FilterNode* aNode, const Rect& aSourceRect, 80 const Point& aDestPoint, 81 const DrawOptions& aOptions = DrawOptions()) override; 82 virtual void DrawSurfaceWithShadow( 83 SourceSurface* aSurface, const Point& aDest, const ShadowOptions& aShadow, 84 CompositionOp aOperator) override { /* Not implemented */ 85 MOZ_CRASH("GFX: DrawSurfaceWithShadow"); 86 } 87 88 virtual void ClearRect(const Rect& aRect) override; 89 virtual void MaskSurface( 90 const Pattern& aSource, SourceSurface* aMask, Point aOffset, 91 const DrawOptions& aOptions = DrawOptions()) override; 92 93 virtual void CopySurface(SourceSurface* aSurface, const IntRect& aSourceRect, 94 const IntPoint& aDestination) override; 95 96 virtual void FillRect(const Rect& aRect, const Pattern& aPattern, 97 const DrawOptions& aOptions = DrawOptions()) override; 98 virtual void FillRoundedRect( 99 const RoundedRect& aRect, const Pattern& aPattern, 100 const DrawOptions& aOptions = DrawOptions()) override; 101 virtual void StrokeRect(const Rect& aRect, const Pattern& aPattern, 102 const StrokeOptions& aStrokeOptions = StrokeOptions(), 103 const DrawOptions& aOptions = DrawOptions()) override; 104 virtual void StrokeLine(const Point& aStart, const Point& aEnd, 105 const Pattern& aPattern, 106 const StrokeOptions& aStrokeOptions = StrokeOptions(), 107 const DrawOptions& aOptions = DrawOptions()) override; 108 virtual void Stroke(const Path* aPath, const Pattern& aPattern, 109 const StrokeOptions& aStrokeOptions = StrokeOptions(), 110 const DrawOptions& aOptions = DrawOptions()) override; 111 virtual void Fill(const Path* aPath, const Pattern& aPattern, 112 const DrawOptions& aOptions = DrawOptions()) override; 113 virtual void FillGlyphs(ScaledFont* aFont, const GlyphBuffer& aBuffer, 114 const Pattern& aPattern, 115 const DrawOptions& aOptions = DrawOptions()) override; 116 virtual void StrokeGlyphs( 117 ScaledFont* aFont, const GlyphBuffer& aBuffer, const Pattern& aPattern, 118 const StrokeOptions& aStrokeOptions = StrokeOptions(), 119 const DrawOptions& aOptions = DrawOptions()) override; 120 virtual void Mask(const Pattern& aSource, const Pattern& aMask, 121 const DrawOptions& aOptions = DrawOptions()) override; 122 virtual void PushClip(const Path* aPath) override; 123 virtual void PushClipRect(const Rect& aRect) override; 124 virtual void PopClip() override; 125 virtual bool RemoveAllClips() override { 126 return mDrawTarget->RemoveAllClips(); 127 } 128 virtual void PushLayer(bool aOpaque, Float aOpacity, SourceSurface* aMask, 129 const Matrix& aMaskTransform, 130 const IntRect& aBounds = IntRect(), 131 bool aCopyBackground = false) override; 132 virtual void PushLayerWithBlend( 133 bool aOpaque, Float aOpacity, SourceSurface* aMask, 134 const Matrix& aMaskTransform, const IntRect& aBounds = IntRect(), 135 bool aCopyBackground = false, 136 CompositionOp = CompositionOp::OP_OVER) override; 137 virtual bool Draw3DTransformedSurface(SourceSurface* aSurface, 138 const Matrix4x4& aMatrix) override; 139 virtual void PopLayer() override; 140 141 virtual void SetTransform(const Matrix& aTransform) override; 142 143 virtual void SetPermitSubpixelAA(bool aPermitSubpixelAA) override; 144 145 virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromData( 146 unsigned char* aData, const IntSize& aSize, int32_t aStride, 147 SurfaceFormat aFormat) const override { 148 return mDrawTarget->CreateSourceSurfaceFromData(aData, aSize, aStride, 149 aFormat); 150 } 151 virtual already_AddRefed<SourceSurface> OptimizeSourceSurface( 152 SourceSurface* aSurface) const override { 153 return mDrawTarget->OptimizeSourceSurface(aSurface); 154 } 155 156 virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromNativeSurface( 157 const NativeSurface& aSurface) const override { 158 return mDrawTarget->CreateSourceSurfaceFromNativeSurface(aSurface); 159 } 160 161 virtual already_AddRefed<DrawTarget> CreateSimilarDrawTarget( 162 const IntSize& aSize, SurfaceFormat aFormat) const override { 163 return mDrawTarget->CreateSimilarDrawTarget(aSize, aFormat); 164 } 165 166 virtual bool CanCreateSimilarDrawTarget( 167 const IntSize& aSize, SurfaceFormat aFormat) const override { 168 return mDrawTarget->CanCreateSimilarDrawTarget(aSize, aFormat); 169 } 170 virtual RefPtr<DrawTarget> CreateClippedDrawTarget( 171 const Rect& aBounds, SurfaceFormat aFormat) override; 172 173 virtual already_AddRefed<PathBuilder> CreatePathBuilder( 174 FillRule aFillRule = FillRule::FILL_WINDING) const override { 175 return mDrawTarget->CreatePathBuilder(aFillRule); 176 } 177 178 virtual already_AddRefed<GradientStops> CreateGradientStops( 179 GradientStop* aStops, uint32_t aNumStops, 180 ExtendMode aExtendMode = ExtendMode::CLAMP) const override { 181 return mDrawTarget->CreateGradientStops(aStops, aNumStops, aExtendMode); 182 } 183 virtual already_AddRefed<FilterNode> CreateFilter(FilterType aType) override { 184 return mDrawTarget->CreateFilter(aType); 185 } 186 187 private: 188 RefPtr<DrawTarget> mDrawTarget; 189 IntPoint mOrigin; 190 }; 191 192 } // namespace gfx 193 } // namespace mozilla 194 195 #endif