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