forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			191 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- 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_DRAWTARGETOFFSET_H_
 | |
| #define MOZILLA_GFX_DRAWTARGETOFFSET_H_
 | |
| 
 | |
| #include "2D.h"
 | |
| 
 | |
| #include "mozilla/Vector.h"
 | |
| 
 | |
| #include "Filters.h"
 | |
| #include "Logging.h"
 | |
| 
 | |
| #include <vector>
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace gfx {
 | |
| 
 | |
| class SourceSurfaceOffset : public SourceSurface {
 | |
|  public:
 | |
|   SourceSurfaceOffset(RefPtr<SourceSurface> aSurface, IntPoint aOffset)
 | |
|       : mSurface(aSurface), mOffset(aOffset) {
 | |
|     MOZ_RELEASE_ASSERT(mSurface);
 | |
|   }
 | |
| 
 | |
|   virtual SurfaceType GetType() const override { return SurfaceType::OFFSET; }
 | |
|   virtual IntSize GetSize() const override { return mSurface->GetSize(); }
 | |
|   virtual IntRect GetRect() const override {
 | |
|     return mSurface->GetRect() + mOffset;
 | |
|   }
 | |
|   virtual SurfaceFormat GetFormat() const override {
 | |
|     return mSurface->GetFormat();
 | |
|   }
 | |
|   virtual already_AddRefed<DataSourceSurface> GetDataSurface() override {
 | |
|     return mSurface->GetDataSurface();
 | |
|   }
 | |
|   virtual already_AddRefed<SourceSurface> GetUnderlyingSurface() override {
 | |
|     return mSurface->GetUnderlyingSurface();
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   RefPtr<SourceSurface> mSurface;
 | |
|   IntPoint mOffset;
 | |
| };
 | |
| 
 | |
| class DrawTargetOffset : public DrawTarget {
 | |
|  public:
 | |
|   DrawTargetOffset();
 | |
| 
 | |
|   bool Init(DrawTarget* aDrawTarget, IntPoint aOrigin);
 | |
| 
 | |
|   // We'll pestimistically return true here
 | |
|   virtual bool IsTiledDrawTarget() const override { return true; }
 | |
| 
 | |
|   virtual DrawTargetType GetType() const override {
 | |
|     return mDrawTarget->GetType();
 | |
|   }
 | |
|   virtual BackendType GetBackendType() const override {
 | |
|     return mDrawTarget->GetBackendType();
 | |
|   }
 | |
|   virtual already_AddRefed<SourceSurface> Snapshot() override;
 | |
|   virtual already_AddRefed<SourceSurface> IntoLuminanceSource(
 | |
|       LuminanceType aLuminanceType, float aOpacity) override;
 | |
|   virtual void DetachAllSnapshots() override;
 | |
|   virtual IntSize GetSize() const override { return mDrawTarget->GetSize(); }
 | |
|   virtual IntRect GetRect() const override {
 | |
|     return mDrawTarget->GetRect() + mOrigin;
 | |
|   }
 | |
| 
 | |
|   virtual void Flush() override;
 | |
|   virtual void DrawSurface(SourceSurface* aSurface, const Rect& aDest,
 | |
|                            const Rect& aSource,
 | |
|                            const DrawSurfaceOptions& aSurfOptions,
 | |
|                            const DrawOptions& aOptions) override;
 | |
|   virtual void DrawFilter(FilterNode* aNode, const Rect& aSourceRect,
 | |
|                           const Point& aDestPoint,
 | |
|                           const DrawOptions& aOptions = DrawOptions()) override;
 | |
|   virtual void DrawSurfaceWithShadow(
 | |
|       SourceSurface* aSurface, const Point& aDest, const ShadowOptions& aShadow,
 | |
|       CompositionOp aOperator) override { /* Not implemented */
 | |
|     MOZ_CRASH("GFX: DrawSurfaceWithShadow");
 | |
|   }
 | |
| 
 | |
|   virtual void ClearRect(const Rect& aRect) override;
 | |
|   virtual void MaskSurface(
 | |
|       const Pattern& aSource, SourceSurface* aMask, Point aOffset,
 | |
|       const DrawOptions& aOptions = DrawOptions()) override;
 | |
| 
 | |
|   virtual void CopySurface(SourceSurface* aSurface, const IntRect& aSourceRect,
 | |
|                            const IntPoint& aDestination) override;
 | |
| 
 | |
|   virtual void FillRect(const Rect& aRect, const Pattern& aPattern,
 | |
|                         const DrawOptions& aOptions = DrawOptions()) override;
 | |
|   virtual void FillRoundedRect(
 | |
|       const RoundedRect& aRect, const Pattern& aPattern,
 | |
|       const DrawOptions& aOptions = DrawOptions()) override;
 | |
|   virtual void StrokeRect(const Rect& aRect, const Pattern& aPattern,
 | |
|                           const StrokeOptions& aStrokeOptions = StrokeOptions(),
 | |
|                           const DrawOptions& aOptions = DrawOptions()) override;
 | |
|   virtual void StrokeLine(const Point& aStart, const Point& aEnd,
 | |
|                           const Pattern& aPattern,
 | |
|                           const StrokeOptions& aStrokeOptions = StrokeOptions(),
 | |
|                           const DrawOptions& aOptions = DrawOptions()) override;
 | |
|   virtual void Stroke(const Path* aPath, const Pattern& aPattern,
 | |
|                       const StrokeOptions& aStrokeOptions = StrokeOptions(),
 | |
|                       const DrawOptions& aOptions = DrawOptions()) override;
 | |
|   virtual void Fill(const Path* aPath, const Pattern& aPattern,
 | |
|                     const DrawOptions& aOptions = DrawOptions()) override;
 | |
|   virtual void FillGlyphs(ScaledFont* aFont, const GlyphBuffer& aBuffer,
 | |
|                           const Pattern& aPattern,
 | |
|                           const DrawOptions& aOptions = DrawOptions()) override;
 | |
|   virtual void StrokeGlyphs(
 | |
|       ScaledFont* aFont, const GlyphBuffer& aBuffer, const Pattern& aPattern,
 | |
|       const StrokeOptions& aStrokeOptions = StrokeOptions(),
 | |
|       const DrawOptions& aOptions = DrawOptions()) override;
 | |
|   virtual void Mask(const Pattern& aSource, const Pattern& aMask,
 | |
|                     const DrawOptions& aOptions = DrawOptions()) override;
 | |
|   virtual void PushClip(const Path* aPath) override;
 | |
|   virtual void PushClipRect(const Rect& aRect) override;
 | |
|   virtual void PopClip() override;
 | |
|   virtual void PushLayer(bool aOpaque, Float aOpacity, SourceSurface* aMask,
 | |
|                          const Matrix& aMaskTransform,
 | |
|                          const IntRect& aBounds = IntRect(),
 | |
|                          bool aCopyBackground = false) override;
 | |
|   virtual void PushLayerWithBlend(
 | |
|       bool aOpaque, Float aOpacity, SourceSurface* aMask,
 | |
|       const Matrix& aMaskTransform, const IntRect& aBounds = IntRect(),
 | |
|       bool aCopyBackground = false,
 | |
|       CompositionOp = CompositionOp::OP_OVER) override;
 | |
|   virtual bool Draw3DTransformedSurface(SourceSurface* aSurface,
 | |
|                                         const Matrix4x4& aMatrix) override;
 | |
|   virtual void PopLayer() override;
 | |
| 
 | |
|   virtual void SetTransform(const Matrix& aTransform) override;
 | |
| 
 | |
|   virtual void SetPermitSubpixelAA(bool aPermitSubpixelAA) override;
 | |
| 
 | |
|   virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromData(
 | |
|       unsigned char* aData, const IntSize& aSize, int32_t aStride,
 | |
|       SurfaceFormat aFormat) const override {
 | |
|     return mDrawTarget->CreateSourceSurfaceFromData(aData, aSize, aStride,
 | |
|                                                     aFormat);
 | |
|   }
 | |
|   virtual already_AddRefed<SourceSurface> OptimizeSourceSurface(
 | |
|       SourceSurface* aSurface) const override {
 | |
|     return mDrawTarget->OptimizeSourceSurface(aSurface);
 | |
|   }
 | |
| 
 | |
|   virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromNativeSurface(
 | |
|       const NativeSurface& aSurface) const override {
 | |
|     return mDrawTarget->CreateSourceSurfaceFromNativeSurface(aSurface);
 | |
|   }
 | |
| 
 | |
|   virtual already_AddRefed<DrawTarget> CreateSimilarDrawTarget(
 | |
|       const IntSize& aSize, SurfaceFormat aFormat) const override {
 | |
|     return mDrawTarget->CreateSimilarDrawTarget(aSize, aFormat);
 | |
|   }
 | |
| 
 | |
|   virtual bool CanCreateSimilarDrawTarget(
 | |
|       const IntSize& aSize, SurfaceFormat aFormat) const override {
 | |
|     return mDrawTarget->CanCreateSimilarDrawTarget(aSize, aFormat);
 | |
|   }
 | |
|   virtual RefPtr<DrawTarget> CreateClippedDrawTarget(
 | |
|       const Rect& aBounds, SurfaceFormat aFormat) override;
 | |
| 
 | |
|   virtual already_AddRefed<PathBuilder> CreatePathBuilder(
 | |
|       FillRule aFillRule = FillRule::FILL_WINDING) const override {
 | |
|     return mDrawTarget->CreatePathBuilder(aFillRule);
 | |
|   }
 | |
| 
 | |
|   virtual already_AddRefed<GradientStops> CreateGradientStops(
 | |
|       GradientStop* aStops, uint32_t aNumStops,
 | |
|       ExtendMode aExtendMode = ExtendMode::CLAMP) const override {
 | |
|     return mDrawTarget->CreateGradientStops(aStops, aNumStops, aExtendMode);
 | |
|   }
 | |
|   virtual already_AddRefed<FilterNode> CreateFilter(FilterType aType) override {
 | |
|     return mDrawTarget->CreateFilter(aType);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   RefPtr<DrawTarget> mDrawTarget;
 | |
|   IntPoint mOrigin;
 | |
| };
 | |
| 
 | |
| }  // namespace gfx
 | |
| }  // namespace mozilla
 | |
| 
 | |
| #endif
 | 
