bool Canvas2DLayerBridge::restoreSurface() { ASSERT(!m_destructionInProgress); if (m_destructionInProgress) return false; ASSERT(isAccelerated() && !m_surface); WebGraphicsContext3D* sharedContext = 0; m_layer->clearTexture(); m_contextProvider = adoptPtr(Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (m_contextProvider) sharedContext = m_contextProvider->context3d(); if (sharedContext && !sharedContext->isContextLost()) { GrContext* grCtx = m_contextProvider->grContext(); bool surfaceIsAccelerated; RefPtr<SkSurface> surface(createSkSurface(grCtx, m_size, m_msaaSampleCount, m_opacityMode, &surfaceIsAccelerated)); // Current paradigm does support switching from accelerated to non-accelerated, which would be tricky // due to changes to the layer tree, which can only happen at specific times during the document lifecycle. // Therefore, we can only accept the restored surface if it is accelerated. if (surface.get() && surfaceIsAccelerated) { m_surface = surface.release(); // FIXME: draw sad canvas picture into new buffer crbug.com/243842 } } return m_surface; }
bool Canvas2DLayerBridge::restoreSurface() { ASSERT(!m_destructionInProgress); if (m_destructionInProgress) return false; ASSERT(m_layer && !m_isSurfaceValid); WebGraphicsContext3D* sharedContext = 0; // We must clear the mailboxes before calling m_layer->clearTexture() to prevent // re-entry via mailboxReleased from operating on defunct GrContext objects. m_mailboxes.clear(); m_layer->clearTexture(); m_contextProvider = adoptPtr(Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (m_contextProvider) sharedContext = m_contextProvider->context3d(); if (sharedContext && !sharedContext->isContextLost()) { IntSize size(m_canvas->getTopDevice()->width(), m_canvas->getTopDevice()->height()); RefPtr<SkSurface> surface(createSkSurface(m_contextProvider->grContext(), size, m_msaaSampleCount, m_opacityMode)); if (surface.get()) { m_surface = surface.release(); m_canvas->setSurface(m_surface.get()); m_isSurfaceValid = true; // FIXME: draw sad canvas picture into new buffer crbug.com/243842 } } return m_isSurfaceValid; }
bool Canvas2DLayerBridge::restoreSurface() { ASSERT(!m_destructionInProgress); if (m_destructionInProgress) return false; ASSERT(m_layer && !m_surface); WebGraphicsContext3D* sharedContext = 0; m_layer->clearTexture(); m_contextProvider = adoptPtr(Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (m_contextProvider) sharedContext = m_contextProvider->context3d(); if (sharedContext && !sharedContext->isContextLost()) { GrContext* grCtx = m_contextProvider->grContext(); RefPtr<SkSurface> surface(createSkSurface(grCtx, m_size, m_msaaSampleCount, m_opacityMode)); if (surface.get()) { m_surface = surface.release(); m_initialSurfaceSaveCount = m_surface->getCanvas()->getSaveCount(); // FIXME: draw sad canvas picture into new buffer crbug.com/243842 } } return m_surface; }
bool Canvas2DLayerBridge::restoreSurface() { ASSERT(!m_destructionInProgress); if (m_destructionInProgress) return false; ASSERT(m_layer && !m_isSurfaceValid); WebGraphicsContext3D* sharedContext = 0; m_layer->clearTexture(); m_contextProvider = adoptPtr(Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (m_contextProvider) sharedContext = m_contextProvider->context3d(); if (sharedContext && !sharedContext->isContextLost()) { SkISize skSize = m_canvas->getBaseLayerSize(); IntSize size(skSize.width(), skSize.height()); RefPtr<SkSurface> surface(createSkSurface(m_contextProvider->grContext(), size, m_msaaSampleCount, m_opacityMode)); if (surface.get()) { m_surface = surface.release(); m_canvas->setSurface(m_surface.get()); m_isSurfaceValid = true; // FIXME: draw sad canvas picture into new buffer crbug.com/243842 } } return m_isSurfaceValid; }