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