1 /* 2 * Copyright 2011 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 8 #include "Test.h" 9 #include "TestClassDef.h" 10 #include "SkCanvas.h" 11 #include "SkDrawLooper.h" 12 13 /* 14 * Subclass of looper that just draws once, with an offset in X. 15 */ 16 class TestLooper : public SkDrawLooper { 17 public: 18 bool fOnce; 19 20 virtual void init(SkCanvas*) SK_OVERRIDE { 21 fOnce = true; 22 } 23 24 virtual bool next(SkCanvas* canvas, SkPaint*) SK_OVERRIDE { 25 if (fOnce) { 26 fOnce = false; 27 canvas->translate(SkIntToScalar(10), 0); 28 return true; 29 } 30 return false; 31 } 32 33 #ifdef SK_DEVELOPER 34 virtual void toString(SkString* str) const SK_OVERRIDE { 35 str->append("TestLooper:"); 36 } 37 #endif 38 39 SK_DECLARE_UNFLATTENABLE_OBJECT() 40 }; 41 42 static void test_drawBitmap(skiatest::Reporter* reporter) { 43 SkBitmap src; 44 src.setConfig(SkBitmap::kARGB_8888_Config, 10, 10); 45 src.allocPixels(); 46 src.eraseColor(SK_ColorWHITE); 47 48 SkBitmap dst; 49 dst.setConfig(SkBitmap::kARGB_8888_Config, 10, 10); 50 dst.allocPixels(); 51 dst.eraseColor(SK_ColorTRANSPARENT); 52 53 SkCanvas canvas(dst); 54 SkPaint paint; 55 56 // we are initially transparent 57 REPORTER_ASSERT(reporter, 0 == *dst.getAddr32(5, 5)); 58 59 // we see the bitmap drawn 60 canvas.drawBitmap(src, 0, 0, &paint); 61 REPORTER_ASSERT(reporter, 0xFFFFFFFF == *dst.getAddr32(5, 5)); 62 63 // reverify we are clear again 64 dst.eraseColor(SK_ColorTRANSPARENT); 65 REPORTER_ASSERT(reporter, 0 == *dst.getAddr32(5, 5)); 66 67 // if the bitmap is clipped out, we don't draw it 68 canvas.drawBitmap(src, SkIntToScalar(-10), 0, &paint); 69 REPORTER_ASSERT(reporter, 0 == *dst.getAddr32(5, 5)); 70 71 // now install our looper, which will draw, since it internally translates 72 // to the left. The test is to ensure that canvas' quickReject machinary 73 // allows us through, even though sans-looper we would look like we should 74 // be clipped out. 75 paint.setLooper(new TestLooper)->unref(); 76 canvas.drawBitmap(src, SkIntToScalar(-10), 0, &paint); 77 REPORTER_ASSERT(reporter, 0xFFFFFFFF == *dst.getAddr32(5, 5)); 78 } 79 80 DEF_TEST(QuickReject, reporter) { 81 test_drawBitmap(reporter); 82 } 83