LayerDrawLooperTest.cpp revision 4b413c8bb123e42ca4b9c7bfa6bc2167283cb84c
18f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org/*
28f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org * Copyright 2013 Google Inc.
38f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org *
48f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
58f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org * found in the LICENSE file.
68f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org */
7ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.org
88f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "Test.h"
98f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkBitmap.h"
101f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com#include "SkBitmapDevice.h"
118f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkCanvas.h"
128f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkDraw.h"
138f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkLayerDrawLooper.h"
148f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkMatrix.h"
158f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkPaint.h"
168f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkRect.h"
178f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkRefCnt.h"
188f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkScalar.h"
198f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkXfermode.h"
208f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
211f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.comclass FakeDevice : public SkBitmapDevice {
228f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.orgpublic:
231f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com    FakeDevice() : SkBitmapDevice(SkBitmap::kARGB_8888_Config, 100, 100, false) { }
248f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
257f1af501f206da48a7ff791af53432c9c1c89d08skia.committer@gmail.com    virtual void drawRect(const SkDraw& draw, const SkRect& r,
263e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                          const SkPaint& paint) SK_OVERRIDE {
278f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org        fLastMatrix = *draw.fMatrix;
281f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com        INHERITED::drawRect(draw, r, paint);
298f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    }
308f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
318f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkMatrix fLastMatrix;
321f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com
331f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.comprivate:
341f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com    typedef SkBitmapDevice INHERITED;
358f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org};
368f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
378f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.orgstatic void test_frontToBack(skiatest::Reporter* reporter) {
388f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkAutoTUnref<SkLayerDrawLooper> looper(SkNEW(SkLayerDrawLooper));
398f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkLayerDrawLooper::LayerInfo layerInfo;
408f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
418f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Add the front layer, with the defaults.
428f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    (void)looper->addLayer(layerInfo);
438f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
448f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Add the back layer, with some layer info set.
454b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    layerInfo.fOffset.set(10.0f, 20.0f);
468f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit;
478f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkPaint* layerPaint = looper->addLayer(layerInfo);
488f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode);
498f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
508f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    FakeDevice device;
518f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkCanvas canvas(&device);
528f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkPaint paint;
538f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    looper->init(&canvas);
548f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
558f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // The back layer should come first.
568f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
578f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode));
584b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
594b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX());
604b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY());
618f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    paint.reset();
628f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
638f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Then the front layer.
648f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
658f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode));
664b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
674b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX());
684b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY());
698f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
708f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Only two layers were added, so that should be the end.
718f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint));
728f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org}
738f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
748f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.orgstatic void test_backToFront(skiatest::Reporter* reporter) {
758f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkAutoTUnref<SkLayerDrawLooper> looper(SkNEW(SkLayerDrawLooper));
768f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkLayerDrawLooper::LayerInfo layerInfo;
778f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
788f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Add the back layer, with the defaults.
798f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    (void)looper->addLayerOnTop(layerInfo);
808f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
818f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Add the front layer, with some layer info set.
824b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    layerInfo.fOffset.set(10.0f, 20.0f);
838f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit;
848f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkPaint* layerPaint = looper->addLayerOnTop(layerInfo);
858f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode);
868f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
878f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    FakeDevice device;
888f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkCanvas canvas(&device);
898f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkPaint paint;
908f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    looper->init(&canvas);
918f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
928f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // The back layer should come first.
938f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
948f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode));
954b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
964b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX());
974b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY());
988f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    paint.reset();
998f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1008f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Then the front layer.
1018f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
1028f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode));
1034b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
1044b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX());
1054b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY());
1068f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1078f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Only two layers were added, so that should be the end.
1088f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint));
1098f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org}
1108f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1118f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.orgstatic void test_mixed(skiatest::Reporter* reporter) {
1128f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkAutoTUnref<SkLayerDrawLooper> looper(SkNEW(SkLayerDrawLooper));
1138f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkLayerDrawLooper::LayerInfo layerInfo;
1148f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1158f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Add the back layer, with the defaults.
1168f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    (void)looper->addLayer(layerInfo);
1178f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1188f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Add the front layer, with some layer info set.
1194b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    layerInfo.fOffset.set(10.0f, 20.0f);
1208f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit;
1218f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkPaint* layerPaint = looper->addLayerOnTop(layerInfo);
1228f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode);
1238f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1248f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    FakeDevice device;
1258f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkCanvas canvas(&device);
1268f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    SkPaint paint;
1278f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    looper->init(&canvas);
1288f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1298f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // The back layer should come first.
1308f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
1318f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode));
1324b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
1334b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX());
1344b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY());
1358f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    paint.reset();
1368f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1378f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Then the front layer.
1388f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
1398f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode));
1404b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
1414b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX());
1424b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org    REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY());
1438f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1448f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    // Only two layers were added, so that should be the end.
1458f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint));
1468f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org}
1478f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1488f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.orgstatic void TestLayerDrawLooper(skiatest::Reporter* reporter) {
1498f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    test_frontToBack(reporter);
1508f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    test_backToFront(reporter);
1518f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org    test_mixed(reporter);
1528f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org}
1538f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org
1548f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "TestClassDef.h"
1558f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.orgDEFINE_TESTCLASS("LayerDrawLooper", TestLayerDrawLooperClass, TestLayerDrawLooper)
156