LayerRendererChromium.cpp [plain text]
#include "config.h"
#if USE(ACCELERATED_COMPOSITING)
#include "LayerRendererChromium.h"
#include "LayerChromium.h"
#include "PlatformContextSkia.h"
#include "skia/ext/platform_canvas.h"
namespace WebCore {
PassOwnPtr<LayerRendererChromium> LayerRendererChromium::create()
{
return new LayerRendererChromium();
}
LayerRendererChromium::LayerRendererChromium()
: m_rootLayer(0)
, m_needsDisplay(false)
{
}
LayerRendererChromium::~LayerRendererChromium()
{
}
void LayerRendererChromium::updateLayerContents()
{
if (m_rootLayer)
updateLayerContentsRecursive(m_rootLayer.get());
}
#if PLATFORM(SKIA)
void LayerRendererChromium::drawLayersInCanvas(skia::PlatformCanvas* canvas, const IntRect& clipRect)
{
if (!m_rootLayer)
return;
canvas->save();
canvas->clipRect(SkRect(clipRect));
canvas->drawBitmap(m_rootLayer->platformCanvas()->getDevice()->accessBitmap(false), 0, 0, 0);
canvas->translate(-m_scrollFrame.fLeft, -m_scrollFrame.fTop);
float opacity = 1.0f;
const Vector<RefPtr<LayerChromium> >& sublayers = m_rootLayer->getSublayers();
for (size_t i = 0; i < sublayers.size(); i++)
drawLayerInCanvasRecursive(canvas, sublayers[i].get(), opacity);
canvas->restore();
m_needsDisplay = false;
}
void LayerRendererChromium::drawLayerInCanvasRecursive(skia::PlatformCanvas* canvas, LayerChromium* layer, float opacity)
{
SkAutoCanvasRestore autoRestoreCanvas(canvas, true);
FloatPoint position = layer->position();
FloatPoint anchorPoint = layer->anchorPoint();
SkMatrix transform = layer->transform().toAffineTransform();
IntSize bounds = layer->bounds();
canvas->translate(position.x(), position.y());
SkScalar tx = SkScalarMul(anchorPoint.x(), bounds.width());
SkScalar ty = SkScalarMul(anchorPoint.y(), bounds.height());
canvas->translate(tx, ty);
canvas->concat(transform);
canvas->translate(-tx, -ty);
canvas->translate(-0.5f * bounds.width(), -0.5f * bounds.height());
layer->drawDebugBorder();
SkPaint opacityPaint;
opacity *= layer->opacity();
opacityPaint.setAlpha(opacity * 255);
canvas->drawBitmap(layer->platformCanvas()->getDevice()->accessBitmap(false), 0, 0, &opacityPaint);
const Vector<RefPtr<LayerChromium> >& sublayers = layer->getSublayers();
for (size_t i = 0; i < sublayers.size(); i++)
drawLayerInCanvasRecursive(canvas, sublayers[i].get(), opacity);
}
#endif // PLATFORM(SKIA)
void LayerRendererChromium::updateLayerContentsRecursive(LayerChromium* layer)
{
layer->updateContents();
const Vector<RefPtr<LayerChromium> >& sublayers = layer->getSublayers();
for (size_t i = 0; i < sublayers.size(); i++)
updateLayerContentsRecursive(sublayers[i].get());
}
}
#endif // USE(ACCELERATED_COMPOSITING)