Bug 1073336 part 14a - Update animation generation when changing animations via the...
[gecko.git] / gfx / 2d / DrawTargetTiled.h
blob7190c986c59569f1760a7afcca7562c94f93bd75
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_
9 #include "2D.h"
10 #include "Filters.h"
12 #include <vector>
14 namespace mozilla {
15 namespace gfx {
17 struct TileInternal : public Tile {
18 TileInternal()
19 : mClippedOut(false)
22 explicit TileInternal(const Tile& aOther)
23 : Tile(aOther)
24 , mClippedOut(false)
27 bool mClippedOut;
31 class DrawTargetTiled : public DrawTarget
33 public:
34 DrawTargetTiled();
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()); }
45 virtual void Flush();
46 virtual void DrawSurface(SourceSurface *aSurface,
47 const Rect &aDest,
48 const Rect &aSource,
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,
56 const Point &aDest,
57 const Color &aColor,
58 const Point &aOffset,
59 Float aSigma,
60 CompositionOp aOperator) { /* Not implemented */ MOZ_CRASH(); }
62 virtual void ClearRect(const Rect &aRect);
63 virtual void MaskSurface(const Pattern &aSource,
64 SourceSurface *aMask,
65 Point aOffset,
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,
80 const Point &aEnd,
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,
97 const Pattern &aMask,
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,
107 int32_t aStride,
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,
136 uint32_t aNumStops,
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);
146 private:
147 std::vector<TileInternal> mTiles;
148 std::vector<std::vector<uint32_t> > mClippedOutTilesStack;
149 IntRect mRect;
152 class SnapshotTiled : public SourceSurface
154 public:
155 SnapshotTiled(const std::vector<TileInternal>& aTiles, const IntRect& aRect)
156 : mRect(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]);
185 surf->Unmap();
187 return surf.forget();
190 std::vector<RefPtr<SourceSurface>> mSnapshots;
191 std::vector<IntPoint> mOrigins;
192 IntRect mRect;
198 #endif