| Index: Source/platform/graphics/RecordingImageBufferSurface.cpp
|
| diff --git a/Source/platform/graphics/RecordingImageBufferSurface.cpp b/Source/platform/graphics/RecordingImageBufferSurface.cpp
|
| index 1d57c614d757a1b03d61de4176e118b9217be992..db4c5594e0ef5653be38c9b4a2b6d248ab8bf8ac 100644
|
| --- a/Source/platform/graphics/RecordingImageBufferSurface.cpp
|
| +++ b/Source/platform/graphics/RecordingImageBufferSurface.cpp
|
| @@ -16,11 +16,12 @@
|
|
|
| namespace blink {
|
|
|
| -RecordingImageBufferSurface::RecordingImageBufferSurface(const IntSize& size, OpacityMode opacityMode)
|
| +RecordingImageBufferSurface::RecordingImageBufferSurface(const IntSize& size, PassOwnPtr<RecordingImageBufferFallbackSurfaceFactory> fallbackFactory, OpacityMode opacityMode)
|
| : ImageBufferSurface(size, opacityMode)
|
| , m_imageBuffer(0)
|
| , m_initialSaveCount(0)
|
| , m_frameWasCleared(true)
|
| + , m_fallbackFactory(fallbackFactory)
|
| {
|
| initializeCurrentFrame();
|
| }
|
| @@ -60,42 +61,49 @@ void RecordingImageBufferSurface::setImageBuffer(ImageBuffer* imageBuffer)
|
| m_imageBuffer->context()->setRegionTrackingMode(GraphicsContext::RegionTrackingOverwrite);
|
| m_imageBuffer->context()->resetCanvas(m_currentFrame->getRecordingCanvas());
|
| }
|
| + if (m_fallbackSurface) {
|
| + m_fallbackSurface->setImageBuffer(imageBuffer);
|
| + }
|
| }
|
|
|
| void RecordingImageBufferSurface::willAccessPixels()
|
| {
|
| - fallBackToRasterCanvas();
|
| + if (m_fallbackSurface)
|
| + m_fallbackSurface->willAccessPixels();
|
| + else
|
| + fallBackToRasterCanvas();
|
| }
|
|
|
| void RecordingImageBufferSurface::fallBackToRasterCanvas()
|
| {
|
| - if (m_rasterCanvas) {
|
| + if (m_fallbackSurface) {
|
| ASSERT(!m_currentFrame);
|
| return;
|
| }
|
|
|
| - m_rasterCanvas = adoptPtr(SkCanvas::NewRasterN32(size().width(), size().height()));
|
| + m_fallbackSurface = m_fallbackFactory->createSurface(size(), opacityMode());
|
| + m_fallbackSurface->setImageBuffer(m_imageBuffer);
|
|
|
| if (m_previousFrame) {
|
| - m_previousFrame->draw(m_rasterCanvas.get());
|
| + m_previousFrame->draw(m_fallbackSurface->canvas());
|
| m_previousFrame.clear();
|
| }
|
| if (m_currentFrame) {
|
| RefPtr<SkPicture> currentPicture = adoptRef(m_currentFrame->endRecording());
|
| - currentPicture->draw(m_rasterCanvas.get());
|
| + currentPicture->draw(m_fallbackSurface->canvas());
|
| m_currentFrame.clear();
|
| }
|
|
|
| if (m_imageBuffer) {
|
| m_imageBuffer->context()->setRegionTrackingMode(GraphicsContext::RegionTrackingDisabled);
|
| - m_imageBuffer->context()->resetCanvas(m_rasterCanvas.get());
|
| + m_imageBuffer->context()->resetCanvas(m_fallbackSurface->canvas());
|
| }
|
| }
|
|
|
| SkCanvas* RecordingImageBufferSurface::canvas() const
|
| {
|
| - if (m_rasterCanvas)
|
| - return m_rasterCanvas.get();
|
| + if (m_fallbackSurface)
|
| + return m_fallbackSurface->canvas();
|
|
|
| ASSERT(m_currentFrame->getRecordingCanvas());
|
| return m_currentFrame->getRecordingCanvas();
|
| @@ -103,6 +111,9 @@ SkCanvas* RecordingImageBufferSurface::canvas() const
|
|
|
| PassRefPtr<SkPicture> RecordingImageBufferSurface::getPicture()
|
| {
|
| + if (m_fallbackSurface)
|
| + return nullptr;
|
| +
|
| bool canUsePicture = finalizeFrameInternal();
|
| m_imageBuffer->didFinalizeFrame();
|
|
|
| @@ -110,25 +121,35 @@ PassRefPtr<SkPicture> RecordingImageBufferSurface::getPicture()
|
| return m_previousFrame;
|
| }
|
|
|
| - if (!m_rasterCanvas)
|
| + if (!m_fallbackSurface)
|
| fallBackToRasterCanvas();
|
| return nullptr;
|
| }
|
|
|
| -void RecordingImageBufferSurface::finalizeFrame(const FloatRect &)
|
| +void RecordingImageBufferSurface::finalizeFrame(const FloatRect &dirtyRect)
|
| {
|
| - if (!finalizeFrameInternal() && !m_rasterCanvas) {
|
| - fallBackToRasterCanvas();
|
| + if (m_fallbackSurface) {
|
| + m_fallbackSurface->finalizeFrame(dirtyRect);
|
| + return;
|
| }
|
| +
|
| + if (!finalizeFrameInternal())
|
| + fallBackToRasterCanvas();
|
| }
|
|
|
| void RecordingImageBufferSurface::didClearCanvas()
|
| {
|
| + if (m_fallbackSurface) {
|
| + m_fallbackSurface->didClearCanvas();
|
| + return;
|
| + }
|
| m_frameWasCleared = true;
|
| }
|
|
|
| bool RecordingImageBufferSurface::finalizeFrameInternal()
|
| {
|
| + ASSERT(!m_fallbackSurface);
|
| +
|
| if (!m_imageBuffer->isDirty()) {
|
| if (m_currentFrame && !m_previousFrame) {
|
| // Create an initial blank frame
|
| @@ -138,10 +159,6 @@ bool RecordingImageBufferSurface::finalizeFrameInternal()
|
| return m_currentFrame;
|
| }
|
|
|
| - if (!m_currentFrame) {
|
| - return false;
|
| - }
|
| -
|
| IntRect canvasRect(IntPoint(0, 0), size());
|
| if (!m_frameWasCleared && !m_imageBuffer->context()->opaqueRegion().asRect().contains(canvasRect)) {
|
| return false;
|
| @@ -194,4 +211,79 @@ void RecordingImageBufferSurface::setCurrentState(SkCanvas* dstCanvas, StateStac
|
| dstCanvas->setMatrix(stateStack->peek().m_ctm);
|
| }
|
|
|
| +// Fallback passthroughs
|
| +
|
| +const SkBitmap& RecordingImageBufferSurface::bitmap()
|
| +{
|
| + if (m_fallbackSurface)
|
| + return m_fallbackSurface->bitmap();
|
| + return ImageBufferSurface::bitmap();
|
| +}
|
| +
|
| +bool RecordingImageBufferSurface::restore()
|
| +{
|
| + if (m_fallbackSurface)
|
| + return m_fallbackSurface->restore();
|
| + return ImageBufferSurface::restore();
|
| +}
|
| +
|
| +WebLayer* RecordingImageBufferSurface::layer() const
|
| +{
|
| + if (m_fallbackSurface)
|
| + return m_fallbackSurface->layer();
|
| + return ImageBufferSurface::layer();
|
| +}
|
| +
|
| +bool RecordingImageBufferSurface::isAccelerated() const
|
| +{
|
| + if (m_fallbackSurface)
|
| + return m_fallbackSurface->isAccelerated();
|
| + return ImageBufferSurface::isAccelerated();
|
| +}
|
| +
|
| +Platform3DObject RecordingImageBufferSurface::getBackingTexture() const
|
| +{
|
| + if (m_fallbackSurface)
|
| + return m_fallbackSurface->getBackingTexture();
|
| + return ImageBufferSurface::getBackingTexture();
|
| +}
|
| +
|
| +bool RecordingImageBufferSurface::cachedBitmapEnabled() const
|
| +{
|
| + if (m_fallbackSurface)
|
| + return m_fallbackSurface->cachedBitmapEnabled();
|
| + return ImageBufferSurface::cachedBitmapEnabled();
|
| +}
|
| +
|
| +const SkBitmap& RecordingImageBufferSurface::cachedBitmap() const
|
| +{
|
| + if (m_fallbackSurface)
|
| + return m_fallbackSurface->cachedBitmap();
|
| + return ImageBufferSurface::cachedBitmap();
|
| +}
|
| +
|
| +void RecordingImageBufferSurface::invalidateCachedBitmap()
|
| +{
|
| + if (m_fallbackSurface)
|
| + m_fallbackSurface->invalidateCachedBitmap();
|
| + else
|
| + ImageBufferSurface::invalidateCachedBitmap();
|
| +}
|
| +
|
| +void RecordingImageBufferSurface::updateCachedBitmapIfNeeded()
|
| +{
|
| + if (m_fallbackSurface)
|
| + m_fallbackSurface->updateCachedBitmapIfNeeded();
|
| + else
|
| + ImageBufferSurface::updateCachedBitmapIfNeeded();
|
| +}
|
| +
|
| +void RecordingImageBufferSurface::setIsHidden(bool hidden)
|
| +{
|
| + if (m_fallbackSurface)
|
| + m_fallbackSurface->setIsHidden(hidden);
|
| + else
|
| + ImageBufferSurface::setIsHidden(hidden);
|
| +}
|
| +
|
| } // namespace blink
|
|
|