示例#1
0
int64_t LayerTreeCoordinator::adoptImageBackingStore(Image* image)
{
    if (!image)
        return InvalidWebLayerID;

    int64_t key = 0;

#if PLATFORM(QT)
    QPixmap* nativeImage = image->nativeImageForCurrentFrame();

    if (!nativeImage)
        return InvalidWebLayerID;

    key = nativeImage->cacheKey();
#elif USE(CAIRO)
    NativeImageCairo* nativeImage = image->nativeImageForCurrentFrame();
    if (!nativeImage)
        return InvalidWebLayerID;
    // This can be safely done since we own the reference.
    // A corresponding cairo_surface_destroy() is ensured in releaseImageBackingStore().
    cairo_surface_t* cairoSurface = cairo_surface_reference(nativeImage->surface());
    key = reinterpret_cast<int64_t>(cairoSurface);
#endif

    HashMap<int64_t, int>::iterator it = m_directlyCompositedImageRefCounts.find(key);

    if (it != m_directlyCompositedImageRefCounts.end()) {
        ++(it->value);
        return key;
    }

    // Check if we were going to release this image during the next flush.
    size_t releasedIndex = m_releasedDirectlyCompositedImages.find(key);
    if (releasedIndex == notFound) {
        RefPtr<ShareableBitmap> bitmap = ShareableBitmap::createShareable(image->size(), (image->currentFrameHasAlpha() ? ShareableBitmap::SupportsAlpha : 0));
        {
            OwnPtr<WebCore::GraphicsContext> graphicsContext = bitmap->createGraphicsContext();
            graphicsContext->drawImage(image, ColorSpaceDeviceRGB, IntPoint::zero());
        }
        ShareableBitmap::Handle handle;
        bitmap->createHandle(handle);
        m_webPage->send(Messages::LayerTreeCoordinatorProxy::CreateDirectlyCompositedImage(key, handle));
    } else
        m_releasedDirectlyCompositedImages.remove(releasedIndex);

    m_directlyCompositedImageRefCounts.add(key, 1);
    return key;
}