void CoordinatedImageBacking::update() { releaseSurfaceIfNeeded(); bool changedToVisible; updateVisibilityIfNeeded(changedToVisible); if (!m_isVisible) return; if (!changedToVisible) { if (!m_isDirty) return; if (m_nativeImagePtr == m_image->nativeImageForCurrentFrame()) { m_isDirty = false; return; } } m_surface = CoordinatedSurface::create(IntSize(m_image->size()), !m_image->currentFrameKnownToBeOpaque() ? CoordinatedSurface::SupportsAlpha : CoordinatedSurface::NoFlags); if (!m_surface) { m_isDirty = false; return; } IntRect rect(IntPoint::zero(), IntSize(m_image->size())); ImageBackingSurfaceClient surfaceClient(m_image.get(), rect); m_surface->paintToSurface(rect, &surfaceClient); m_nativeImagePtr = m_image->nativeImageForCurrentFrame(); m_client->updateImageBacking(id(), m_surface); m_isDirty = false; }
bool UpdateAtlas::paintOnAvailableBuffer(const IntSize& size, uint32_t& atlasID, IntPoint& offset, CoordinatedSurface::Client& client) { m_inactivityInSeconds = 0; buildLayoutIfNeeded(); IntRect rect = m_areaAllocator->allocate(size); // No available buffer was found. if (rect.isEmpty()) return false; if (!m_surface) return false; atlasID = m_ID; // FIXME: Use tri-state buffers, to allow faster updates. offset = rect.location(); UpdateAtlasSurfaceClient surfaceClient(client, size, supportsAlpha()); m_surface->paintToSurface(rect, surfaceClient); return true; }