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;
}
Example #2
0
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;
}