| 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))
|
|
|