11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h"
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkDrawLooper.h"
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "Test.h"
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  Subclass of looper that just draws once, with an offset in X.
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass TestLooper : public SkDrawLooper {
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool fOnce;
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void init(SkCanvas*) SK_OVERRIDE {
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fOnce = true;
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool next(SkCanvas* canvas, SkPaint*) SK_OVERRIDE {
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fOnce) {
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fOnce = false;
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(SkIntToScalar(10), 0);
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return true;
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual Factory getFactory() SK_OVERRIDE {
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return NULL;
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void test_drawBitmap(skiatest::Reporter* reporter) {
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkBitmap src;
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    src.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    src.allocPixels();
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    src.eraseColor(SK_ColorWHITE);
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkBitmap dst;
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    dst.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    dst.allocPixels();
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    dst.eraseColor(0);
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkCanvas canvas(dst);
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPaint  paint;
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we are initially transparent
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    REPORTER_ASSERT(reporter, 0 == *dst.getAddr32(5, 5));
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we see the bitmap drawn
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    canvas.drawBitmap(src, 0, 0, &paint);
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    REPORTER_ASSERT(reporter, 0xFFFFFFFF == *dst.getAddr32(5, 5));
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // reverify we are clear again
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    dst.eraseColor(0);
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    REPORTER_ASSERT(reporter, 0 == *dst.getAddr32(5, 5));
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // if the bitmap is clipped out, we don't draw it
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    canvas.drawBitmap(src, SkIntToScalar(-10), 0, &paint);
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    REPORTER_ASSERT(reporter, 0 == *dst.getAddr32(5, 5));
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // now install our looper, which will draw, since it internally translates
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // to the left. The test is to ensure that canvas' quickReject machinary
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // allows us through, even though sans-looper we would look like we should
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // be clipped out.
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    paint.setLooper(new TestLooper)->unref();
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    canvas.drawBitmap(src, SkIntToScalar(-10), 0, &paint);
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    REPORTER_ASSERT(reporter, 0xFFFFFFFF == *dst.getAddr32(5, 5));
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void test(skiatest::Reporter* reporter) {
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    test_drawBitmap(reporter);
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "TestClassDef.h"
801cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerDEFINE_TESTCLASS("QuickReject", QuickRejectClass, test)
81