зеркало из https://github.com/mozilla/gecko-dev.git
Bug 881634 - Only use a single snapshot with DrawTargetSkia. r=Bas
This commit is contained in:
Родитель
a3f0cbe5ec
Коммит
efa3e6d5de
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче