LayerTextureUpdaterTest.cpp [plain text]
#include "config.h"
#include "LayerTextureUpdater.h"
#include "BitmapCanvasLayerTextureUpdater.h"
#include "BitmapSkPictureCanvasLayerTextureUpdater.h"
#include "FrameBufferSkPictureCanvasLayerTextureUpdater.h"
#include "GraphicsContext.h"
#include "LayerPainterChromium.h"
#include "PlatformContextSkia.h"
#include "SkPictureCanvasLayerTextureUpdater.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using namespace WebCore;
namespace {
struct PaintCallback {
virtual void operator()(GraphicsContext&, const IntRect&) = 0;
};
class TestLayerPainterChromium : public LayerPainterChromium {
public:
TestLayerPainterChromium(PaintCallback& callback) : m_callback(callback) { }
virtual void paint(GraphicsContext& context, const IntRect& contentRect)
{
m_callback(context, contentRect);
}
private:
PaintCallback& m_callback;
};
struct PaintFillOpaque : public PaintCallback {
virtual void operator()(GraphicsContext& context, const IntRect& contentRect)
{
Color opaque(255, 0, 0, 255);
IntRect top(contentRect.x(), contentRect.y(), contentRect.width(), contentRect.height() / 2);
IntRect bottom(contentRect.x(), contentRect.y() + contentRect.height() / 2, contentRect.width(), contentRect.height() / 2);
context.fillRect(top, opaque, ColorSpaceDeviceRGB);
context.fillRect(bottom, opaque, ColorSpaceDeviceRGB);
}
};
struct PaintFillAlpha : public PaintCallback {
virtual void operator()(GraphicsContext& context, const IntRect& contentRect)
{
Color alpha(0, 0, 0, 0);
context.fillRect(contentRect, alpha, ColorSpaceDeviceRGB);
}
};
struct PaintFillPartialOpaque : public PaintCallback {
PaintFillPartialOpaque(IntRect opaqueRect)
: m_opaqueRect(opaqueRect)
{
}
virtual void operator()(GraphicsContext& context, const IntRect& contentRect)
{
Color alpha(0, 0, 0, 0);
context.fillRect(contentRect, alpha, ColorSpaceDeviceRGB);
IntRect fillOpaque = m_opaqueRect;
fillOpaque.intersect(contentRect);
Color opaque(255, 255, 255, 255);
context.fillRect(fillOpaque, opaque, ColorSpaceDeviceRGB);
}
IntRect m_opaqueRect;
};
#define EXPECT_EQ_RECT(a, b) \
EXPECT_EQ(a.x(), b.x()); \
EXPECT_EQ(a.maxX(), b.maxX()); \
EXPECT_EQ(a.y(), b.y()); \
EXPECT_EQ(a.maxY(), b.maxY());
TEST(LayerTextureUpdaterTest, testOpaqueRectPresentAfterOpaquePaint)
{
PaintFillOpaque fillOpaque;
RefPtr<LayerTextureUpdater> updater;
IntRect opaqueRect;
OwnPtr<TestLayerPainterChromium> painter;
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillOpaque));
updater = BitmapCanvasLayerTextureUpdater::create(painter.release(), false);
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 400, 400), opaqueRect);
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillOpaque));
updater = BitmapSkPictureCanvasLayerTextureUpdater::create(painter.release(), false);
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 400, 400), opaqueRect);
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillOpaque));
updater = FrameBufferSkPictureCanvasLayerTextureUpdater::create(painter.release());
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 400, 400), opaqueRect);
}
TEST(LayerTextureUpdaterTest, testOpaqueRectNotPresentAfterNonOpaquePaint)
{
PaintFillAlpha fillAlpha;
RefPtr<LayerTextureUpdater> updater;
IntRect opaqueRect;
OwnPtr<TestLayerPainterChromium> painter;
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillAlpha));
updater = BitmapCanvasLayerTextureUpdater::create(painter.release(), false);
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), opaqueRect);
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillAlpha));
updater = BitmapSkPictureCanvasLayerTextureUpdater::create(painter.release(), false);
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), opaqueRect);
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillAlpha));
updater = FrameBufferSkPictureCanvasLayerTextureUpdater::create(painter.release());
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), opaqueRect);
}
TEST(LayerTextureUpdaterTest, testOpaqueRectNotPresentForOpaqueLayerWithOpaquePaint)
{
PaintFillOpaque fillOpaque;
RefPtr<LayerTextureUpdater> updater;
IntRect opaqueRect;
OwnPtr<TestLayerPainterChromium> painter;
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillOpaque));
updater = BitmapCanvasLayerTextureUpdater::create(painter.release(), false);
updater->setOpaque(true);
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), opaqueRect);
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillOpaque));
updater = BitmapSkPictureCanvasLayerTextureUpdater::create(painter.release(), false);
updater->setOpaque(true);
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), opaqueRect);
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillOpaque));
updater = FrameBufferSkPictureCanvasLayerTextureUpdater::create(painter.release());
updater->setOpaque(true);
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), opaqueRect);
}
TEST(LayerTextureUpdaterTest, testOpaqueRectNotPresentForOpaqueLayerWithNonOpaquePaint)
{
PaintFillAlpha fillAlpha;
RefPtr<LayerTextureUpdater> updater;
IntRect opaqueRect;
OwnPtr<TestLayerPainterChromium> painter;
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillAlpha));
updater = BitmapCanvasLayerTextureUpdater::create(painter.release(), false);
updater->setOpaque(true);
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), opaqueRect);
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillAlpha));
updater = BitmapSkPictureCanvasLayerTextureUpdater::create(painter.release(), false);
updater->setOpaque(true);
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), opaqueRect);
opaqueRect = IntRect();
painter = adoptPtr(new TestLayerPainterChromium(fillAlpha));
updater = FrameBufferSkPictureCanvasLayerTextureUpdater::create(painter.release());
updater->setOpaque(true);
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), opaqueRect);
}
TEST(LayerTextureUpdaterTest, testPartialOpaqueRectNoTransform)
{
IntRect partialRect(100, 200, 50, 75);
PaintFillPartialOpaque fillPartial(partialRect);
OwnPtr<TestLayerPainterChromium> painter(adoptPtr(new TestLayerPainterChromium(fillPartial)));
RefPtr<LayerTextureUpdater> updater = BitmapCanvasLayerTextureUpdater::create(painter.release(), false);
IntRect opaqueRect;
updater->prepareToUpdate(IntRect(0, 0, 400, 400), IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(partialRect, opaqueRect);
}
TEST(LayerTextureUpdaterTest, testPartialOpaqueRectTranslation)
{
IntRect partialRect(100, 200, 50, 75);
PaintFillPartialOpaque fillPartial(partialRect);
OwnPtr<TestLayerPainterChromium> painter(adoptPtr(new TestLayerPainterChromium(fillPartial)));
RefPtr<LayerTextureUpdater> updater = BitmapCanvasLayerTextureUpdater::create(painter.release(), false);
IntRect opaqueRect;
IntRect contentRect(11, 12, 389, 388);
updater->prepareToUpdate(contentRect, IntSize(400, 400), 0, 1, opaqueRect);
EXPECT_EQ_RECT(partialRect, opaqueRect);
}
TEST(LayerTextureUpdaterTest, testPartialOpaqueRectScale)
{
float contentsScale = 0.5;
IntRect partialRect(9, 20, 50, 75);
IntRect partialDeviceRect(partialRect);
PaintFillPartialOpaque fillPartial(partialDeviceRect);
OwnPtr<TestLayerPainterChromium> painter(adoptPtr(new TestLayerPainterChromium(fillPartial)));
RefPtr<LayerTextureUpdater> updater = BitmapCanvasLayerTextureUpdater::create(painter.release(), false);
IntRect opaqueRect;
IntRect contentRect(4, 6, 396, 394);
updater->prepareToUpdate(contentRect, IntSize(400, 400), 0, contentsScale, opaqueRect);
IntRect scaledRect(10, 20, 48, 74);
EXPECT_EQ_RECT(scaledRect, opaqueRect);
}
}