LayerDrawLooperTest.cpp revision 74ba2f62dce1998bd6555291ab0a5330c276301d
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 "SkBitmap.h" 91f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com#include "SkBitmapDevice.h" 108f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkCanvas.h" 118f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkDraw.h" 128f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkLayerDrawLooper.h" 138f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkMatrix.h" 148f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkPaint.h" 158f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkRect.h" 168f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkRefCnt.h" 178f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkScalar.h" 188f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org#include "SkXfermode.h" 198f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.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) { 3874ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org SkLayerDrawLooper::Builder looperBuilder; 398f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org SkLayerDrawLooper::LayerInfo layerInfo; 408f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 418f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Add the front layer, with the defaults. 4274ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org (void)looperBuilder.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; 4774ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org SkPaint* layerPaint = looperBuilder.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; 5374ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org SkAutoTUnref<SkLayerDrawLooper> looper(looperBuilder.detachLooper()); 548f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org looper->init(&canvas); 558f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 568f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // The back layer should come first. 578f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); 588f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode)); 594b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint); 604b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX()); 614b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY()); 628f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org paint.reset(); 638f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 648f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Then the front layer. 658f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); 668f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)); 674b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint); 684b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX()); 694b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY()); 708f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 718f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Only two layers were added, so that should be the end. 728f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); 738f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org} 748f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 758f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.orgstatic void test_backToFront(skiatest::Reporter* reporter) { 7674ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org SkLayerDrawLooper::Builder looperBuilder; 778f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org SkLayerDrawLooper::LayerInfo layerInfo; 788f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 798f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Add the back layer, with the defaults. 8074ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org (void)looperBuilder.addLayerOnTop(layerInfo); 818f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 828f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Add the front layer, with some layer info set. 834b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org layerInfo.fOffset.set(10.0f, 20.0f); 848f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; 8574ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org SkPaint* layerPaint = looperBuilder.addLayerOnTop(layerInfo); 868f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); 878f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 888f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org FakeDevice device; 898f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org SkCanvas canvas(&device); 908f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org SkPaint paint; 9174ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org SkAutoTUnref<SkLayerDrawLooper> looper(looperBuilder.detachLooper()); 928f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org looper->init(&canvas); 938f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 948f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // The back layer should come first. 958f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); 968f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)); 974b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint); 984b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX()); 994b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY()); 1008f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org paint.reset(); 1018f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 1028f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Then the front layer. 1038f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); 1048f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode)); 1054b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint); 1064b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX()); 1074b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY()); 1088f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 1098f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Only two layers were added, so that should be the end. 1108f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); 1118f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org} 1128f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 1138f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.orgstatic void test_mixed(skiatest::Reporter* reporter) { 11474ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org SkLayerDrawLooper::Builder looperBuilder; 1158f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org SkLayerDrawLooper::LayerInfo layerInfo; 1168f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 1178f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Add the back layer, with the defaults. 11874ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org (void)looperBuilder.addLayer(layerInfo); 1198f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 1208f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Add the front layer, with some layer info set. 1214b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org layerInfo.fOffset.set(10.0f, 20.0f); 1228f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; 12374ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org SkPaint* layerPaint = looperBuilder.addLayerOnTop(layerInfo); 1248f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); 1258f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 1268f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org FakeDevice device; 1278f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org SkCanvas canvas(&device); 1288f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org SkPaint paint; 12974ba2f62dce1998bd6555291ab0a5330c276301dcommit-bot@chromium.org SkAutoTUnref<SkLayerDrawLooper> looper(looperBuilder.detachLooper()); 1308f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org looper->init(&canvas); 1318f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 1328f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // The back layer should come first. 1338f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); 1348f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)); 1354b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint); 1364b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX()); 1374b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY()); 1388f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org paint.reset(); 1398f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 1408f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Then the front layer. 1418f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); 1428f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode)); 1434b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint); 1444b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX()); 1454b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY()); 1468f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 1478f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org // Only two layers were added, so that should be the end. 1488f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); 1498f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org} 1508f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org 151e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(LayerDrawLooper, reporter) { 1528f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org test_frontToBack(reporter); 1538f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org test_backToFront(reporter); 1548f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org test_mixed(reporter); 1558f838259ab65e44562902679fa88cb00575b99cecommit-bot@chromium.org} 156