Canvas2DLayerChromium.cpp [plain text]
#include "config.h"
#if USE(ACCELERATED_COMPOSITING)
#include "Canvas2DLayerChromium.h"
#include "DrawingBuffer.h"
#include "GraphicsContext3D.h"
#include "LayerRendererChromium.h"
namespace WebCore {
PassRefPtr<Canvas2DLayerChromium> Canvas2DLayerChromium::create(DrawingBuffer* drawingBuffer, GraphicsLayerChromium* owner)
{
return adoptRef(new Canvas2DLayerChromium(drawingBuffer, owner));
}
Canvas2DLayerChromium::Canvas2DLayerChromium(DrawingBuffer* drawingBuffer, GraphicsLayerChromium* owner)
: CanvasLayerChromium(owner)
, m_drawingBuffer(drawingBuffer)
{
}
Canvas2DLayerChromium::~Canvas2DLayerChromium()
{
if (m_textureId)
layerRendererContext()->deleteTexture(m_textureId);
if (m_drawingBuffer && layerRenderer())
layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D().get());
}
void Canvas2DLayerChromium::updateCompositorResources()
{
if (!m_contentsDirty || !m_drawingBuffer)
return;
if (m_textureChanged) { GraphicsContext3D* context = layerRendererContext();
if (m_textureId)
context->deleteTexture(m_textureId);
m_textureId = context->createTexture();
context->activeTexture(GraphicsContext3D::TEXTURE0);
context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureId);
IntSize size = m_drawingBuffer->size();
context->texImage2DResourceSafe(GraphicsContext3D::TEXTURE_2D, 0, GraphicsContext3D::RGBA, size.width(), size.height(), 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE);
context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR);
context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR);
context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
context->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
m_textureChanged = false;
context->finish();
}
if (m_contentsDirty) {
m_drawingBuffer->publishToPlatformLayer();
m_contentsDirty = false;
}
}
void Canvas2DLayerChromium::setTextureChanged()
{
m_textureChanged = true;
}
unsigned Canvas2DLayerChromium::textureId() const
{
return m_textureId;
}
void Canvas2DLayerChromium::setDrawingBuffer(DrawingBuffer* drawingBuffer)
{
if (drawingBuffer != m_drawingBuffer) {
if (m_drawingBuffer && layerRenderer())
layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D().get());
m_drawingBuffer = drawingBuffer;
m_textureChanged = true;
if (drawingBuffer && layerRenderer())
layerRenderer()->addChildContext(m_drawingBuffer->graphicsContext3D().get());
}
}
void Canvas2DLayerChromium::setLayerRenderer(LayerRendererChromium* newLayerRenderer)
{
if (layerRenderer() != newLayerRenderer && m_drawingBuffer) {
if (m_drawingBuffer->graphicsContext3D()) {
if (layerRenderer())
layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D().get());
if (newLayerRenderer)
newLayerRenderer->addChildContext(m_drawingBuffer->graphicsContext3D().get());
}
LayerChromium::setLayerRenderer(newLayerRenderer);
}
}
}
#endif // USE(ACCELERATED_COMPOSITING)