Chromium Code Reviews| Index: tests/LayerDrawLooperTest.cpp |
| diff --git a/tests/LayerDrawLooperTest.cpp b/tests/LayerDrawLooperTest.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8fe751bdef301c0e47ca2d718375759959b93fc6 |
| --- /dev/null |
| +++ b/tests/LayerDrawLooperTest.cpp |
| @@ -0,0 +1,157 @@ |
| +/* |
| + * Copyright 2013 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| +#include "Test.h" |
| +#include "SkBitmap.h" |
| +#include "SkCanvas.h" |
| +#include "SkDraw.h" |
| +#include "SkDevice.h" |
| +#include "SkLayerDrawLooper.h" |
| +#include "SkMatrix.h" |
| +#include "SkPaint.h" |
| +#include "SkRect.h" |
| +#include "SkRefCnt.h" |
| +#include "SkScalar.h" |
| +#include "SkXfermode.h" |
| + |
| +namespace { |
| + |
| +class FakeDevice : public SkDevice { |
| +public: |
| + FakeDevice() : SkDevice(SkBitmap::kARGB_8888_Config, 100, 100) { } |
| + |
| + virtual void drawRect(const SkDraw& draw, const SkRect& r, const SkPaint& paint) { |
| + fLastMatrix = *draw.fMatrix; |
| + SkDevice::drawRect(draw, r, paint); |
| + } |
| + |
| + SkMatrix fLastMatrix; |
| +}; |
| + |
| +} // namespace |
| + |
| +static void test_frontToBack(skiatest::Reporter* reporter) { |
| + SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); |
| + SkAutoUnref aur(looper); |
|
Tom Hudson
2013/05/22 09:46:04
Probably slightly more idiomatic to use SkAutoUnre
jbroman
2013/05/22 12:18:48
Changed to SkAutoTUnref<SkLayerDrawLooper>, here a
|
| + SkLayerDrawLooper::LayerInfo layerInfo; |
| + |
| + // Add the front layer, with the defaults. |
| + (void)looper->addLayer(layerInfo); |
| + |
| + // Add the back layer, with some layer info set. |
| + layerInfo.fOffset.set(SkFloatToScalar(10.0f), SkFloatToScalar(20.0f)); |
| + layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; |
| + SkPaint* layerPaint = looper->addLayer(layerInfo); |
| + layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); |
| + |
| + FakeDevice device; |
| + SkCanvas canvas(&device); |
| + SkPaint paint; |
| + looper->init(&canvas); |
| + |
| + // The back layer should come first. |
| + REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); |
| + REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode)); |
| + canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f)), paint); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(10.0f) == device.fLastMatrix.getTranslateX()); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(20.0f) == device.fLastMatrix.getTranslateY()); |
| + paint.reset(); |
| + |
| + // Then the front layer. |
| + REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); |
| + REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)); |
| + canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f)), paint); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTranslateX()); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTranslateY()); |
| + |
| + // Only two layers were added, so that should be the end. |
| + REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); |
| +} |
| + |
| +static void test_backToFront(skiatest::Reporter* reporter) { |
| + SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); |
| + SkAutoUnref aur(looper); |
| + SkLayerDrawLooper::LayerInfo layerInfo; |
| + |
| + // Add the back layer, with the defaults. |
| + (void)looper->addLayerOnTop(layerInfo); |
| + |
| + // Add the front layer, with some layer info set. |
| + layerInfo.fOffset.set(SkFloatToScalar(10.0f), SkFloatToScalar(20.0f)); |
| + layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; |
| + SkPaint* layerPaint = looper->addLayerOnTop(layerInfo); |
| + layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); |
| + |
| + FakeDevice device; |
| + SkCanvas canvas(&device); |
| + SkPaint paint; |
| + looper->init(&canvas); |
| + |
| + // The back layer should come first. |
| + REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); |
| + REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)); |
| + canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f)), paint); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTranslateX()); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTranslateY()); |
| + paint.reset(); |
| + |
| + // Then the front layer. |
| + REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); |
| + REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode)); |
| + canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f)), paint); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(10.0f) == device.fLastMatrix.getTranslateX()); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(20.0f) == device.fLastMatrix.getTranslateY()); |
| + |
| + // Only two layers were added, so that should be the end. |
| + REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); |
| +} |
| + |
| +static void test_mixed(skiatest::Reporter* reporter) { |
| + SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); |
| + SkAutoUnref aur(looper); |
| + SkLayerDrawLooper::LayerInfo layerInfo; |
| + |
| + // Add the back layer, with the defaults. |
| + (void)looper->addLayer(layerInfo); |
| + |
| + // Add the front layer, with some layer info set. |
| + layerInfo.fOffset.set(SkFloatToScalar(10.0f), SkFloatToScalar(20.0f)); |
| + layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; |
| + SkPaint* layerPaint = looper->addLayerOnTop(layerInfo); |
| + layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); |
| + |
| + FakeDevice device; |
| + SkCanvas canvas(&device); |
| + SkPaint paint; |
| + looper->init(&canvas); |
| + |
| + // The back layer should come first. |
| + REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); |
| + REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)); |
| + canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f)), paint); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTranslateX()); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTranslateY()); |
| + paint.reset(); |
| + |
| + // Then the front layer. |
| + REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); |
| + REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode)); |
| + canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f)), paint); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(10.0f) == device.fLastMatrix.getTranslateX()); |
| + REPORTER_ASSERT(reporter, SkFloatToScalar(20.0f) == device.fLastMatrix.getTranslateY()); |
| + |
| + // Only two layers were added, so that should be the end. |
| + REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); |
| +} |
| + |
| +static void TestLayerDrawLooper(skiatest::Reporter* reporter) { |
| + test_frontToBack(reporter); |
| + test_backToFront(reporter); |
| + test_mixed(reporter); |
| +} |
| + |
| +#include "TestClassDef.h" |
| +DEFINE_TESTCLASS("LayerDrawLooper", TestLayerDrawLooperClass, TestLayerDrawLooper) |