1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef MOZILLA_GFX_DRAWTARGETTILED_H_
7 #define MOZILLA_GFX_DRAWTARGETTILED_H_
17 struct TileInternal
: public Tile
{
22 explicit TileInternal(const Tile
& aOther
)
31 class DrawTargetTiled
: public DrawTarget
36 bool Init(const TileSet
& mTiles
);
38 virtual bool IsTiledDrawTarget() const { return true; }
40 virtual DrawTargetType
GetType() const MOZ_OVERRIDE
{ return mTiles
[0].mDrawTarget
->GetType(); }
41 virtual BackendType
GetBackendType() const { return mTiles
[0].mDrawTarget
->GetBackendType(); }
42 virtual TemporaryRef
<SourceSurface
> Snapshot();
43 virtual IntSize
GetSize() { return IntSize(mRect
.XMost(), mRect
.YMost()); }
46 virtual void DrawSurface(SourceSurface
*aSurface
,
49 const DrawSurfaceOptions
&aSurfOptions
,
50 const DrawOptions
&aOptions
);
51 virtual void DrawFilter(FilterNode
*aNode
,
52 const Rect
&aSourceRect
,
53 const Point
&aDestPoint
,
54 const DrawOptions
&aOptions
= DrawOptions());
55 virtual void DrawSurfaceWithShadow(SourceSurface
*aSurface
,
60 CompositionOp aOperator
) { /* Not implemented */ MOZ_CRASH(); }
62 virtual void ClearRect(const Rect
&aRect
);
63 virtual void MaskSurface(const Pattern
&aSource
,
66 const DrawOptions
&aOptions
= DrawOptions());
68 virtual void CopySurface(SourceSurface
*aSurface
,
69 const IntRect
&aSourceRect
,
70 const IntPoint
&aDestination
);
72 virtual void FillRect(const Rect
&aRect
,
73 const Pattern
&aPattern
,
74 const DrawOptions
&aOptions
= DrawOptions());
75 virtual void StrokeRect(const Rect
&aRect
,
76 const Pattern
&aPattern
,
77 const StrokeOptions
&aStrokeOptions
= StrokeOptions(),
78 const DrawOptions
&aOptions
= DrawOptions());
79 virtual void StrokeLine(const Point
&aStart
,
81 const Pattern
&aPattern
,
82 const StrokeOptions
&aStrokeOptions
= StrokeOptions(),
83 const DrawOptions
&aOptions
= DrawOptions());
84 virtual void Stroke(const Path
*aPath
,
85 const Pattern
&aPattern
,
86 const StrokeOptions
&aStrokeOptions
= StrokeOptions(),
87 const DrawOptions
&aOptions
= DrawOptions());
88 virtual void Fill(const Path
*aPath
,
89 const Pattern
&aPattern
,
90 const DrawOptions
&aOptions
= DrawOptions());
91 virtual void FillGlyphs(ScaledFont
*aFont
,
92 const GlyphBuffer
&aBuffer
,
93 const Pattern
&aPattern
,
94 const DrawOptions
&aOptions
= DrawOptions(),
95 const GlyphRenderingOptions
*aRenderingOptions
= nullptr);
96 virtual void Mask(const Pattern
&aSource
,
98 const DrawOptions
&aOptions
= DrawOptions());
99 virtual void PushClip(const Path
*aPath
);
100 virtual void PushClipRect(const Rect
&aRect
);
101 virtual void PopClip();
103 virtual void SetTransform(const Matrix
&aTransform
);
105 virtual TemporaryRef
<SourceSurface
> CreateSourceSurfaceFromData(unsigned char *aData
,
106 const IntSize
&aSize
,
108 SurfaceFormat aFormat
) const
110 return mTiles
[0].mDrawTarget
->CreateSourceSurfaceFromData(aData
, aSize
, aStride
, aFormat
);
112 virtual TemporaryRef
<SourceSurface
> OptimizeSourceSurface(SourceSurface
*aSurface
) const
114 return mTiles
[0].mDrawTarget
->OptimizeSourceSurface(aSurface
);
117 virtual TemporaryRef
<SourceSurface
>
118 CreateSourceSurfaceFromNativeSurface(const NativeSurface
&aSurface
) const
120 return mTiles
[0].mDrawTarget
->CreateSourceSurfaceFromNativeSurface(aSurface
);
123 virtual TemporaryRef
<DrawTarget
>
124 CreateSimilarDrawTarget(const IntSize
&aSize
, SurfaceFormat aFormat
) const
126 return mTiles
[0].mDrawTarget
->CreateSimilarDrawTarget(aSize
, aFormat
);
129 virtual TemporaryRef
<PathBuilder
> CreatePathBuilder(FillRule aFillRule
= FillRule::FILL_WINDING
) const
131 return mTiles
[0].mDrawTarget
->CreatePathBuilder(aFillRule
);
134 virtual TemporaryRef
<GradientStops
>
135 CreateGradientStops(GradientStop
*aStops
,
137 ExtendMode aExtendMode
= ExtendMode::CLAMP
) const
139 return mTiles
[0].mDrawTarget
->CreateGradientStops(aStops
, aNumStops
, aExtendMode
);
141 virtual TemporaryRef
<FilterNode
> CreateFilter(FilterType aType
)
143 return mTiles
[0].mDrawTarget
->CreateFilter(aType
);
147 std::vector
<TileInternal
> mTiles
;
148 std::vector
<std::vector
<uint32_t> > mClippedOutTilesStack
;
152 class SnapshotTiled
: public SourceSurface
155 SnapshotTiled(const std::vector
<TileInternal
>& aTiles
, const IntRect
& aRect
)
158 for (size_t i
= 0; i
< aTiles
.size(); i
++) {
159 mSnapshots
.push_back(aTiles
[i
].mDrawTarget
->Snapshot());
160 mOrigins
.push_back(aTiles
[i
].mTileOrigin
);
164 virtual SurfaceType
GetType() const { return SurfaceType::TILED
; }
165 virtual IntSize
GetSize() const { return IntSize(mRect
.XMost(), mRect
.YMost()); }
166 virtual SurfaceFormat
GetFormat() const { return mSnapshots
[0]->GetFormat(); }
168 virtual TemporaryRef
<DataSourceSurface
> GetDataSurface()
170 RefPtr
<DataSourceSurface
> surf
= Factory::CreateDataSourceSurface(GetSize(), GetFormat());
172 DataSourceSurface::MappedSurface mappedSurf
;
173 surf
->Map(DataSourceSurface::MapType::WRITE
, &mappedSurf
);
176 RefPtr
<DrawTarget
> dt
=
177 Factory::CreateDrawTargetForData(BackendType::CAIRO
, mappedSurf
.mData
,
178 GetSize(), mappedSurf
.mStride
, GetFormat());
180 for (size_t i
= 0; i
< mSnapshots
.size(); i
++) {
181 RefPtr
<DataSourceSurface
> dataSurf
= mSnapshots
[i
]->GetDataSurface();
182 dt
->CopySurface(dataSurf
, IntRect(IntPoint(0, 0), mSnapshots
[i
]->GetSize()), mOrigins
[i
]);
187 return surf
.forget();
190 std::vector
<RefPtr
<SourceSurface
>> mSnapshots
;
191 std::vector
<IntPoint
> mOrigins
;