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; }