Bug 881634 - Only use a single snapshot with DrawTargetSkia. r=Bas

This commit is contained in:
Matt Woodrow 2013-08-01 21:12:16 -04:00
Родитель a3f0cbe5ec
Коммит efa3e6d5de
4 изменённых файлов: 24 добавлений и 44 удалений

Просмотреть файл

@ -76,6 +76,7 @@ public:
};
DrawTargetSkia::DrawTargetSkia()
: mSnapshot(nullptr)
{
#ifdef ANDROID
mSoftClipping = false;
@ -86,19 +87,20 @@ DrawTargetSkia::DrawTargetSkia()
DrawTargetSkia::~DrawTargetSkia()
{
MOZ_ASSERT(mSnapshots.size() == 0);
}
TemporaryRef<SourceSurface>
DrawTargetSkia::Snapshot()
{
RefPtr<SourceSurfaceSkia> source = new SourceSurfaceSkia();
RefPtr<SourceSurfaceSkia> snapshot = mSnapshot;
if (!snapshot) {
snapshot = new SourceSurfaceSkia();
mSnapshot = snapshot;
if (!snapshot->InitFromCanvas(mCanvas.get(), mFormat, this))
return nullptr;
}
if (!source->InitFromCanvas(mCanvas.get(), mFormat, this))
return nullptr;
AppendSnapshot(source);
return source;
return snapshot;
}
void SetPaintPattern(SkPaint& aPaint, const Pattern& aPattern, Float aAlpha = 1.0)
@ -772,33 +774,20 @@ DrawTargetSkia::CreateGradientStops(GradientStop *aStops, uint32_t aNumStops, Ex
return new GradientStopsSkia(stops, aNumStops, aExtendMode);
}
void
DrawTargetSkia::AppendSnapshot(SourceSurfaceSkia* aSnapshot)
{
mSnapshots.push_back(aSnapshot);
}
void
DrawTargetSkia::RemoveSnapshot(SourceSurfaceSkia* aSnapshot)
{
std::vector<SourceSurfaceSkia*>::iterator iter = std::find(mSnapshots.begin(), mSnapshots.end(), aSnapshot);
if (iter != mSnapshots.end()) {
mSnapshots.erase(iter);
}
}
void
DrawTargetSkia::MarkChanged()
{
if (mSnapshots.size()) {
for (std::vector<SourceSurfaceSkia*>::iterator iter = mSnapshots.begin();
iter != mSnapshots.end(); iter++) {
(*iter)->DrawTargetWillChange();
}
// All snapshots will now have copied data.
mSnapshots.clear();
if (mSnapshot) {
mSnapshot->DrawTargetWillChange();
mSnapshot = nullptr;
}
}
void
DrawTargetSkia::SnapshotDestroyed()
{
mSnapshot = nullptr;
}
}
}

Просмотреть файл

@ -114,8 +114,7 @@ public:
private:
friend class SourceSurfaceSkia;
void AppendSnapshot(SourceSurfaceSkia* aSnapshot);
void RemoveSnapshot(SourceSurfaceSkia* aSnapshot);
void SnapshotDestroyed();
void MarkChanged();
@ -133,7 +132,7 @@ private:
IntSize mSize;
SkRefPtr<SkCanvas> mCanvas;
std::vector<SourceSurfaceSkia*> mSnapshots;
SourceSurfaceSkia* mSnapshot;
bool mSoftClipping;
};

Просмотреть файл

@ -22,7 +22,10 @@ SourceSurfaceSkia::SourceSurfaceSkia()
SourceSurfaceSkia::~SourceSurfaceSkia()
{
MaybeUnlock();
MarkIndependent();
if (mDrawTarget) {
mDrawTarget->SnapshotDestroyed();
mDrawTarget = nullptr;
}
}
IntSize
@ -108,15 +111,6 @@ SourceSurfaceSkia::DrawTargetWillChange()
}
}
void
SourceSurfaceSkia::MarkIndependent()
{
if (mDrawTarget) {
mDrawTarget->RemoveSnapshot(this);
mDrawTarget = nullptr;
}
}
void
SourceSurfaceSkia::MaybeUnlock()
{

Просмотреть файл

@ -45,8 +45,6 @@ private:
friend class DrawTargetSkia;
void DrawTargetWillChange();
void DrawTargetDestroyed();
void MarkIndependent();
void MaybeUnlock();
SkBitmap mBitmap;