Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright 2013 Google Inc. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license that can be | |
| 5 * found in the LICENSE file. | |
| 6 */ | |
| 7 #include "Test.h" | |
| 8 #include "SkBitmap.h" | |
| 9 #include "SkCanvas.h" | |
| 10 #include "SkDraw.h" | |
| 11 #include "SkDevice.h" | |
| 12 #include "SkLayerDrawLooper.h" | |
| 13 #include "SkMatrix.h" | |
| 14 #include "SkPaint.h" | |
| 15 #include "SkRect.h" | |
| 16 #include "SkRefCnt.h" | |
| 17 #include "SkScalar.h" | |
| 18 #include "SkXfermode.h" | |
| 19 | |
| 20 namespace { | |
| 21 | |
| 22 class FakeDevice : public SkDevice { | |
| 23 public: | |
| 24 FakeDevice() : SkDevice(SkBitmap::kARGB_8888_Config, 100, 100) { } | |
| 25 | |
| 26 virtual void drawRect(const SkDraw& draw, const SkRect& r, const SkPaint& pa int) { | |
| 27 fLastMatrix = *draw.fMatrix; | |
| 28 SkDevice::drawRect(draw, r, paint); | |
| 29 } | |
| 30 | |
| 31 SkMatrix fLastMatrix; | |
| 32 }; | |
| 33 | |
| 34 } // namespace | |
| 35 | |
| 36 static void test_frontToBack(skiatest::Reporter* reporter) { | |
| 37 SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); | |
| 38 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
| |
| 39 SkLayerDrawLooper::LayerInfo layerInfo; | |
| 40 | |
| 41 // Add the front layer, with the defaults. | |
| 42 (void)looper->addLayer(layerInfo); | |
| 43 | |
| 44 // Add the back layer, with some layer info set. | |
| 45 layerInfo.fOffset.set(SkFloatToScalar(10.0f), SkFloatToScalar(20.0f)); | |
| 46 layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; | |
| 47 SkPaint* layerPaint = looper->addLayer(layerInfo); | |
| 48 layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); | |
| 49 | |
| 50 FakeDevice device; | |
| 51 SkCanvas canvas(&device); | |
| 52 SkPaint paint; | |
| 53 looper->init(&canvas); | |
| 54 | |
| 55 // The back layer should come first. | |
| 56 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
| 57 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrc_Mode)); | |
| 58 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
| 59 REPORTER_ASSERT(reporter, SkFloatToScalar(10.0f) == device.fLastMatrix.getTr anslateX()); | |
| 60 REPORTER_ASSERT(reporter, SkFloatToScalar(20.0f) == device.fLastMatrix.getTr anslateY()); | |
| 61 paint.reset(); | |
| 62 | |
| 63 // Then the front layer. | |
| 64 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
| 65 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrcOver_Mode)); | |
| 66 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
| 67 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateX()); | |
| 68 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateY()); | |
| 69 | |
| 70 // Only two layers were added, so that should be the end. | |
| 71 REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); | |
| 72 } | |
| 73 | |
| 74 static void test_backToFront(skiatest::Reporter* reporter) { | |
| 75 SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); | |
| 76 SkAutoUnref aur(looper); | |
| 77 SkLayerDrawLooper::LayerInfo layerInfo; | |
| 78 | |
| 79 // Add the back layer, with the defaults. | |
| 80 (void)looper->addLayerOnTop(layerInfo); | |
| 81 | |
| 82 // Add the front layer, with some layer info set. | |
| 83 layerInfo.fOffset.set(SkFloatToScalar(10.0f), SkFloatToScalar(20.0f)); | |
| 84 layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; | |
| 85 SkPaint* layerPaint = looper->addLayerOnTop(layerInfo); | |
| 86 layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); | |
| 87 | |
| 88 FakeDevice device; | |
| 89 SkCanvas canvas(&device); | |
| 90 SkPaint paint; | |
| 91 looper->init(&canvas); | |
| 92 | |
| 93 // The back layer should come first. | |
| 94 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
| 95 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrcOver_Mode)); | |
| 96 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
| 97 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateX()); | |
| 98 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateY()); | |
| 99 paint.reset(); | |
| 100 | |
| 101 // Then the front layer. | |
| 102 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
| 103 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrc_Mode)); | |
| 104 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
| 105 REPORTER_ASSERT(reporter, SkFloatToScalar(10.0f) == device.fLastMatrix.getTr anslateX()); | |
| 106 REPORTER_ASSERT(reporter, SkFloatToScalar(20.0f) == device.fLastMatrix.getTr anslateY()); | |
| 107 | |
| 108 // Only two layers were added, so that should be the end. | |
| 109 REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); | |
| 110 } | |
| 111 | |
| 112 static void test_mixed(skiatest::Reporter* reporter) { | |
| 113 SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); | |
| 114 SkAutoUnref aur(looper); | |
| 115 SkLayerDrawLooper::LayerInfo layerInfo; | |
| 116 | |
| 117 // Add the back layer, with the defaults. | |
| 118 (void)looper->addLayer(layerInfo); | |
| 119 | |
| 120 // Add the front layer, with some layer info set. | |
| 121 layerInfo.fOffset.set(SkFloatToScalar(10.0f), SkFloatToScalar(20.0f)); | |
| 122 layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; | |
| 123 SkPaint* layerPaint = looper->addLayerOnTop(layerInfo); | |
| 124 layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode); | |
| 125 | |
| 126 FakeDevice device; | |
| 127 SkCanvas canvas(&device); | |
| 128 SkPaint paint; | |
| 129 looper->init(&canvas); | |
| 130 | |
| 131 // The back layer should come first. | |
| 132 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
| 133 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrcOver_Mode)); | |
| 134 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
| 135 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateX()); | |
| 136 REPORTER_ASSERT(reporter, SkFloatToScalar(0.0f) == device.fLastMatrix.getTra nslateY()); | |
| 137 paint.reset(); | |
| 138 | |
| 139 // Then the front layer. | |
| 140 REPORTER_ASSERT(reporter, looper->next(&canvas, &paint)); | |
| 141 REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode ::kSrc_Mode)); | |
| 142 canvas.drawRect(SkRect::MakeWH(SkFloatToScalar(50.0f), SkFloatToScalar(50.0f )), paint); | |
| 143 REPORTER_ASSERT(reporter, SkFloatToScalar(10.0f) == device.fLastMatrix.getTr anslateX()); | |
| 144 REPORTER_ASSERT(reporter, SkFloatToScalar(20.0f) == device.fLastMatrix.getTr anslateY()); | |
| 145 | |
| 146 // Only two layers were added, so that should be the end. | |
| 147 REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint)); | |
| 148 } | |
| 149 | |
| 150 static void TestLayerDrawLooper(skiatest::Reporter* reporter) { | |
| 151 test_frontToBack(reporter); | |
| 152 test_backToFront(reporter); | |
| 153 test_mixed(reporter); | |
| 154 } | |
| 155 | |
| 156 #include "TestClassDef.h" | |
| 157 DEFINE_TESTCLASS("LayerDrawLooper", TestLayerDrawLooperClass, TestLayerDrawLoope r) | |
| OLD | NEW |