ImageLayerChromium.cpp [plain text]
#include "config.h"
#if USE(ACCELERATED_COMPOSITING)
#include "ImageLayerChromium.h"
#include "Image.h"
#include "LayerTextureSubImage.h"
#include "LayerTextureUpdater.h"
#include "ManagedTexture.h"
#include "PlatformColor.h"
#include "cc/CCLayerImpl.h"
#include "cc/CCLayerTreeHost.h"
namespace WebCore {
class ImageLayerTextureUpdater : public LayerTextureUpdater {
public:
class Texture : public LayerTextureUpdater::Texture {
public:
Texture(ImageLayerTextureUpdater* textureUpdater, PassOwnPtr<ManagedTexture> texture)
: LayerTextureUpdater::Texture(texture)
, m_textureUpdater(textureUpdater)
{
}
virtual void updateRect(GraphicsContext3D* context, TextureAllocator* allocator, const IntRect& sourceRect, const IntRect& destRect)
{
textureUpdater()->updateTextureRect(context, allocator, texture(), sourceRect, destRect);
}
private:
ImageLayerTextureUpdater* textureUpdater() { return m_textureUpdater; }
ImageLayerTextureUpdater* m_textureUpdater;
};
static PassRefPtr<ImageLayerTextureUpdater> create(bool useMapTexSubImage)
{
return adoptRef(new ImageLayerTextureUpdater(useMapTexSubImage));
}
virtual ~ImageLayerTextureUpdater() { }
virtual PassOwnPtr<LayerTextureUpdater::Texture> createTexture(TextureManager* manager)
{
return adoptPtr(new Texture(this, ManagedTexture::create(manager)));
}
virtual SampledTexelFormat sampledTexelFormat(GC3Denum textureFormat)
{
return PlatformColor::sameComponentOrder(textureFormat) ?
LayerTextureUpdater::SampledTexelFormatRGBA : LayerTextureUpdater::SampledTexelFormatBGRA;
}
virtual void updateLayerRect(const IntRect& contentRect, const IntSize& tileSize, int , float , IntRect* )
{
m_texSubImage.setSubImageSize(tileSize);
}
virtual void updateTextureRect(GraphicsContext3D* context, TextureAllocator* allocator, ManagedTexture* texture, const IntRect& sourceRect, const IntRect& destRect)
{
texture->bindTexture(context, allocator);
IntRect clippedSourceRect = sourceRect;
clippedSourceRect.intersect(imageRect());
IntRect clippedDestRect = destRect;
clippedDestRect.move(clippedSourceRect.location() - sourceRect.location());
clippedDestRect.setSize(clippedSourceRect.size());
m_texSubImage.upload(m_image.pixels(), imageRect(), clippedSourceRect, clippedDestRect, texture->format(), context);
}
void updateFromImage(NativeImagePtr nativeImage)
{
m_image.updateFromImage(nativeImage);
}
IntSize imageSize() const
{
return m_image.size();
}
private:
explicit ImageLayerTextureUpdater(bool useMapTexSubImage)
: m_texSubImage(useMapTexSubImage)
{
}
IntRect imageRect() const
{
return IntRect(IntPoint::zero(), m_image.size());
}
PlatformImage m_image;
LayerTextureSubImage m_texSubImage;
};
PassRefPtr<ImageLayerChromium> ImageLayerChromium::create()
{
return adoptRef(new ImageLayerChromium());
}
ImageLayerChromium::ImageLayerChromium()
: TiledLayerChromium()
, m_imageForCurrentFrame(0)
{
}
ImageLayerChromium::~ImageLayerChromium()
{
}
void ImageLayerChromium::setContents(Image* contents)
{
if ((m_contents == contents) && (m_contents->nativeImageForCurrentFrame() == m_imageForCurrentFrame))
return;
m_contents = contents;
m_imageForCurrentFrame = m_contents->nativeImageForCurrentFrame();
setNeedsDisplay();
}
void ImageLayerChromium::update(CCTextureUpdater& updater, const CCOcclusionTracker* occlusion)
{
createTextureUpdaterIfNeeded();
if (m_needsDisplay) {
m_textureUpdater->updateFromImage(m_contents->nativeImageForCurrentFrame());
updateTileSizeAndTilingOption();
invalidateRect(IntRect(IntPoint(), contentBounds()));
m_needsDisplay = false;
}
updateLayerRect(updater, visibleLayerRect(), occlusion);
}
void ImageLayerChromium::createTextureUpdaterIfNeeded()
{
if (m_textureUpdater)
return;
m_textureUpdater = ImageLayerTextureUpdater::create(layerTreeHost()->layerRendererCapabilities().usingMapSub);
GC3Denum textureFormat = layerTreeHost()->layerRendererCapabilities().bestTextureFormat;
setTextureFormat(textureFormat);
setSampledTexelFormat(textureUpdater()->sampledTexelFormat(textureFormat));
}
LayerTextureUpdater* ImageLayerChromium::textureUpdater() const
{
return m_textureUpdater.get();
}
IntSize ImageLayerChromium::contentBounds() const
{
if (!m_contents)
return IntSize();
return m_contents->size();
}
bool ImageLayerChromium::drawsContent() const
{
return m_contents && TiledLayerChromium::drawsContent();
}
bool ImageLayerChromium::needsContentsScale() const
{
return false;
}
}
#endif // USE(ACCELERATED_COMPOSITING)