11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "Test.h"
987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkBitmap.h"
1087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkCanvas.h"
1187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
1287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic bool check_for_all_zeros(const SkBitmap& bm) {
1387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkAutoLockPixels alp(bm);
1487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
1587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    size_t count = bm.width() * bm.bytesPerPixel();
1687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    for (int y = 0; y < bm.height(); y++) {
1787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        const uint8_t* ptr = reinterpret_cast<const uint8_t*>(bm.getAddr(0, y));
1887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        for (size_t i = 0; i < count; i++) {
1987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            if (ptr[i]) {
2087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger                return false;
2187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            }
2287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        }
2387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
2487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return true;
2587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
2687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
2787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic const int gWidth = 256;
2887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic const int gHeight = 256;
2987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
3087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic void create(SkBitmap* bm, SkBitmap::Config config, SkColor color) {
3187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    bm->setConfig(config, gWidth, gHeight);
3287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    bm->allocPixels();
3387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    bm->eraseColor(color);
3487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
3587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
3687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic void TestDrawBitmapRect(skiatest::Reporter* reporter) {
3787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkBitmap src, dst;
3887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
3987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    create(&src, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF);
4087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    create(&dst, SkBitmap::kARGB_8888_Config, 0);
4187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
4287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkCanvas canvas(dst);
4387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
4487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkIRect srcR = { gWidth, 0, gWidth + 16, 16 };
4587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkRect  dstR = { 0, 0, SkIntToScalar(16), SkIntToScalar(16) };
4687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
4787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    canvas.drawBitmapRect(src, &srcR, dstR, NULL);
4887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
4987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    // ensure that we draw nothing if srcR does not intersect the bitmap
5087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    REPORTER_ASSERT(reporter, check_for_all_zeros(dst));
5187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
5287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
5387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "TestClassDef.h"
5487b8e645865f9633f410c02252a0fd3feb18f09bDerek SollenbergerDEFINE_TESTCLASS("DrawBitmapRect", TestDrawBitmapRectClass, TestDrawBitmapRect)
55