Index: third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
index 4982dd7ed2ec559b27a7c809271d21f025a70e0f..493a379ba87340d99138418c06cc12e8e5a1ae15 100644 |
--- a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
@@ -146,16 +146,6 @@ bool ImageBuffer::isDirty() { |
return m_client ? m_client->isDirty() : false; |
} |
-void ImageBuffer::didDisableAcceleration() const { |
- DCHECK(m_gpuMemoryUsage); |
- DCHECK_GT(s_globalAcceleratedImageBufferCount, 0u); |
- if (m_client) |
- m_client->didDisableAcceleration(); |
- s_globalAcceleratedImageBufferCount--; |
- s_globalGPUMemoryUsage -= m_gpuMemoryUsage; |
- m_gpuMemoryUsage = 0; |
-} |
- |
void ImageBuffer::didFinalizeFrame() { |
if (m_client) |
m_client->didFinalizeFrame(); |
@@ -367,8 +357,9 @@ bool ImageBuffer::getImageData(Multiply multiplied, |
DCHECK(canvas()); |
if (ExpensiveCanvasHeuristicParameters::GetImageDataForcesNoAcceleration && |
- !RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled()) |
+ !RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled()) { |
const_cast<ImageBuffer*>(this)->disableAcceleration(); |
+ } |
sk_sp<SkImage> snapshot = m_surface->newImageSnapshot( |
PreferNoAcceleration, SnapshotReasonGetImageData); |
@@ -442,22 +433,22 @@ void ImageBuffer::putByteArray(Multiply multiplied, |
if (!isSurfaceValid()) |
return; |
- ASSERT(sourceRect.width() > 0); |
- ASSERT(sourceRect.height() > 0); |
+ DCHECK_GT(sourceRect.width(), 0); |
+ DCHECK_GT(sourceRect.height(), 0); |
int originX = sourceRect.x(); |
int destX = destPoint.x() + sourceRect.x(); |
- ASSERT(destX >= 0); |
- ASSERT(destX < m_surface->size().width()); |
- ASSERT(originX >= 0); |
- ASSERT(originX < sourceRect.maxX()); |
+ DCHECK_GE(destX, 0); |
+ DCHECK_LT(destX, m_surface->size().width()); |
+ DCHECK_GE(originX, 0); |
+ DCHECK_LT(originX, sourceRect.maxX()); |
int originY = sourceRect.y(); |
int destY = destPoint.y() + sourceRect.y(); |
- ASSERT(destY >= 0); |
- ASSERT(destY < m_surface->size().height()); |
- ASSERT(originY >= 0); |
- ASSERT(originY < sourceRect.maxY()); |
+ DCHECK_GE(destY, 0); |
+ DCHECK_LT(destY, m_surface->size().height()); |
+ DCHECK_GE(originY, 0); |
+ DCHECK_LT(originY, sourceRect.maxY()); |
const size_t srcBytesPerRow = 4 * sourceSize.width(); |
const void* srcAddr = source + originY * srcBytesPerRow + originX * 4; |
@@ -492,6 +483,9 @@ void ImageBuffer::updateGPUMemoryUsage() const { |
s_globalAcceleratedImageBufferCount--; |
s_globalGPUMemoryUsage -= m_gpuMemoryUsage; |
m_gpuMemoryUsage = 0; |
+ |
+ if (m_client) |
+ m_client->didDisableAcceleration(); |
} |
} |
@@ -519,12 +513,6 @@ void ImageBuffer::disableAcceleration() { |
if (!isAccelerated()) |
return; |
- sk_sp<SkImage> image = |
- m_surface->newImageSnapshot(PreferNoAcceleration, SnapshotReasonPaint); |
- // Using a GPU-backed image with RecordingImageBufferSurface |
- // will fail at playback time. |
- image = image->makeNonTextureImage(); |
- |
// Create and configure a recording (unaccelerated) surface. |
std::unique_ptr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory = |
WTF::makeUnique<UnacceleratedSurfaceFactory>(); |
@@ -532,13 +520,26 @@ void ImageBuffer::disableAcceleration() { |
WTF::wrapUnique(new RecordingImageBufferSurface( |
m_surface->size(), std::move(surfaceFactory), |
m_surface->getOpacityMode(), m_surface->colorSpace())); |
+ setSurface(std::move(surface)); |
+} |
+ |
+void ImageBuffer::setSurface(std::unique_ptr<ImageBufferSurface> surface) { |
+ sk_sp<SkImage> image = |
+ m_surface->newImageSnapshot(PreferNoAcceleration, SnapshotReasonPaint); |
+ |
+ if (surface->isRecording()) { |
+ // Using a GPU-backed image with RecordingImageBufferSurface |
+ // will fail at playback time. |
+ image = image->makeNonTextureImage(); |
+ } |
+ |
surface->canvas()->drawImage(image.get(), 0, 0); |
surface->setImageBuffer(this); |
if (m_client) |
m_client->restoreCanvasMatrixClipStack(surface->canvas()); |
m_surface = std::move(surface); |
- didDisableAcceleration(); |
+ updateGPUMemoryUsage(); |
} |
bool ImageDataBuffer::encodeImage(const String& mimeType, |
@@ -556,7 +557,7 @@ bool ImageDataBuffer::encodeImage(const String& mimeType, |
} else { |
if (!PNGImageEncoder::encode(*this, encodedImage)) |
return false; |
- ASSERT(mimeType == "image/png"); |
+ DCHECK_EQ(mimeType, "image/png"); |
} |
return true; |
@@ -564,7 +565,7 @@ bool ImageDataBuffer::encodeImage(const String& mimeType, |
String ImageDataBuffer::toDataURL(const String& mimeType, |
const double& quality) const { |
- ASSERT(MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType)); |
+ DCHECK(MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType)); |
Vector<unsigned char> result; |
if (!encodeImage(mimeType, quality, &result)) |