Index: Source/platform/graphics/ImageBuffer.cpp |
diff --git a/Source/platform/graphics/ImageBuffer.cpp b/Source/platform/graphics/ImageBuffer.cpp |
index dc908a14d25ff5ff746488cbe12f8a82fd09d0f3..9c35cde5e3a6d198d79eada66d1242daad3da815 100644 |
--- a/Source/platform/graphics/ImageBuffer.cpp |
+++ b/Source/platform/graphics/ImageBuffer.cpp |
@@ -38,6 +38,7 @@ |
#include "platform/graphics/BitmapImage.h" |
#include "platform/graphics/GraphicsContext.h" |
#include "platform/graphics/GraphicsTypes3D.h" |
+#include "platform/graphics/ImageBufferClient.h" |
#include "platform/graphics/UnacceleratedImageBufferSurface.h" |
#include "platform/graphics/gpu/DrawingBuffer.h" |
#include "platform/graphics/gpu/Extensions3DUtil.h" |
@@ -76,7 +77,9 @@ PassOwnPtr<ImageBuffer> ImageBuffer::create(const IntSize& size, OpacityMode opa |
ImageBuffer::ImageBuffer(PassOwnPtr<ImageBufferSurface> surface) |
: m_surface(surface) |
+ , m_client(0) |
{ |
+ m_surface->setImageBuffer(this); |
if (m_surface->canvas()) { |
m_context = adoptPtr(new GraphicsContext(m_surface->canvas())); |
m_context->setCertainlyOpaque(m_surface->opacityMode() == Opaque); |
@@ -90,6 +93,8 @@ ImageBuffer::~ImageBuffer() |
GraphicsContext* ImageBuffer::context() const |
{ |
+ if (!isSurfaceValid()) |
+ return 0; |
m_surface->willUse(); |
ASSERT(m_context.get()); |
return m_context.get(); |
@@ -101,11 +106,22 @@ const SkBitmap& ImageBuffer::bitmap() const |
return m_surface->bitmap(); |
} |
-bool ImageBuffer::isValid() const |
+bool ImageBuffer::isSurfaceValid() const |
{ |
return m_surface->isValid(); |
} |
+bool ImageBuffer::restoreSurface() const |
+{ |
+ return m_surface->isValid() || m_surface->restore(); |
+} |
+ |
+void ImageBuffer::notifySurfaceInvalid() |
+{ |
+ if (m_client) |
+ m_client->notifySurfaceInvalid(); |
+} |
+ |
static SkBitmap deepSkBitmapCopy(const SkBitmap& bitmap) |
{ |
SkBitmap tmp; |
@@ -117,7 +133,7 @@ static SkBitmap deepSkBitmapCopy(const SkBitmap& bitmap) |
PassRefPtr<Image> ImageBuffer::copyImage(BackingStoreCopy copyBehavior, ScaleBehavior) const |
{ |
- if (!isValid()) |
+ if (!isSurfaceValid()) |
return BitmapImage::create(NativeImageSkia::create()); |
const SkBitmap& bitmap = m_surface->bitmap(); |
@@ -136,7 +152,7 @@ blink::WebLayer* ImageBuffer::platformLayer() const |
bool ImageBuffer::copyToPlatformTexture(blink::WebGraphicsContext3D* context, Platform3DObject texture, GLenum internalFormat, GLenum destType, GLint level, bool premultiplyAlpha, bool flipY) |
{ |
- if (!m_surface->isAccelerated() || !platformLayer() || !isValid()) |
+ if (!m_surface->isAccelerated() || !platformLayer() || !isSurfaceValid()) |
return false; |
if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(internalFormat, destType, level)) |
@@ -217,13 +233,13 @@ bool ImageBuffer::copyRenderingResultsFromDrawingBuffer(DrawingBuffer* drawingBu |
void ImageBuffer::draw(GraphicsContext* context, const FloatRect& destRect, const FloatRect& srcRect, CompositeOperator op, blink::WebBlendMode blendMode) |
{ |
- if (!isValid()) |
+ if (!isSurfaceValid()) |
return; |
SkBitmap bitmap = m_surface->bitmap(); |
// For ImageBufferSurface that enables cachedBitmap, Use the cached Bitmap for CPU side usage |
// if it is available, otherwise generate and use it. |
- if (!context->isAccelerated() && m_surface->isAccelerated() && m_surface->cachedBitmapEnabled() && m_surface->isValid()) { |
+ if (!context->isAccelerated() && m_surface->isAccelerated() && m_surface->cachedBitmapEnabled() && isSurfaceValid()) { |
m_surface->updateCachedBitmapIfNeeded(); |
bitmap = m_surface->cachedBitmap(); |
} |
@@ -243,7 +259,7 @@ void ImageBuffer::flush() |
void ImageBuffer::drawPattern(GraphicsContext* context, const FloatRect& srcRect, const FloatSize& scale, |
const FloatPoint& phase, CompositeOperator op, const FloatRect& destRect, blink::WebBlendMode blendMode, const IntSize& repeatSpacing) |
{ |
- if (!isValid()) |
+ if (!isSurfaceValid()) |
return; |
const SkBitmap& bitmap = m_surface->bitmap(); |
@@ -258,7 +274,7 @@ void ImageBuffer::transformColorSpace(ColorSpace srcColorSpace, ColorSpace dstCo |
return; |
// FIXME: Disable color space conversions on accelerated canvases (for now). |
- if (context()->isAccelerated() || !isValid()) |
+ if (context()->isAccelerated() || !isSurfaceValid()) |
return; |
const SkBitmap& bitmap = m_surface->bitmap(); |
@@ -315,21 +331,21 @@ PassRefPtr<Uint8ClampedArray> getImageData(const IntRect& rect, GraphicsContext* |
PassRefPtr<Uint8ClampedArray> ImageBuffer::getUnmultipliedImageData(const IntRect& rect) const |
{ |
- if (!isValid()) |
+ if (!isSurfaceValid()) |
return Uint8ClampedArray::create(rect.width() * rect.height() * 4); |
return getImageData<Unmultiplied>(rect, context(), m_surface->size()); |
} |
PassRefPtr<Uint8ClampedArray> ImageBuffer::getPremultipliedImageData(const IntRect& rect) const |
{ |
- if (!isValid()) |
+ if (!isSurfaceValid()) |
return Uint8ClampedArray::create(rect.width() * rect.height() * 4); |
return getImageData<Premultiplied>(rect, context(), m_surface->size()); |
} |
void ImageBuffer::putByteArray(Multiply multiplied, Uint8ClampedArray* source, const IntSize& sourceSize, const IntRect& sourceRect, const IntPoint& destPoint) |
{ |
- if (!isValid()) |
+ if (!isSurfaceValid()) |
return; |
ASSERT(sourceRect.width() > 0); |
@@ -388,7 +404,7 @@ String ImageBuffer::toDataURL(const String& mimeType, const double* quality) con |
ASSERT(MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType)); |
Vector<char> encodedImage; |
- if (!isValid() || !encodeImage(m_surface->bitmap(), mimeType, quality, &encodedImage)) |
+ if (!isSurfaceValid() || !encodeImage(m_surface->bitmap(), mimeType, quality, &encodedImage)) |
return "data:,"; |
Vector<char> base64Data; |
base64Encode(encodedImage, base64Data); |