1eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com/* 2eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com * Copyright 2013 Google Inc. 3eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com * 4eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com * Use of this source code is governed by a BSD-style license that can be 5eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com * found in the LICENSE file. 6eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com */ 7eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com 8eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com#include "SkBitmap.h" 98f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkMipMap.h" 10eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com#include "SkRandom.h" 118f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h" 12eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com 13e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgstatic void make_bitmap(SkBitmap* bm, SkRandom& rand) { 14eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com // for now, Build needs a min size of 2, otherwise it will return NULL. 15eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com // should fix that to support 1 X N, where N > 1 to return non-null. 16eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com int w = 2 + rand.nextU() % 1000; 17eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com int h = 2 + rand.nextU() % 1000; 18deee496cd30070e52556dcb538c2e5eb39b66b81mike@reedtribe.org bm->allocN32Pixels(w, h); 19eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com bm->eraseColor(SK_ColorWHITE); 20eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com} 21eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com 22e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(MipMap, reporter) { 23eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com SkBitmap bm; 24e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 25eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com 26eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com for (int i = 0; i < 500; ++i) { 27eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com make_bitmap(&bm, rand); 28eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com SkAutoTUnref<SkMipMap> mm(SkMipMap::Build(bm)); 29a79919883e275e7a5e00afc50be10cc721f6ba1dskia.committer@gmail.com 30eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com REPORTER_ASSERT(reporter, !mm->extractLevel(SK_Scalar1, NULL)); 31eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com REPORTER_ASSERT(reporter, !mm->extractLevel(SK_Scalar1 * 2, NULL)); 32a79919883e275e7a5e00afc50be10cc721f6ba1dskia.committer@gmail.com 332c38fed29df8fef80ce8268841e8506e2ceb19e7reed@google.com SkMipMap::Level prevLevel; 342c38fed29df8fef80ce8268841e8506e2ceb19e7reed@google.com sk_bzero(&prevLevel, sizeof(prevLevel)); 35eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com 36eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com SkScalar scale = SK_Scalar1; 37eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com for (int j = 0; j < 30; ++j) { 38eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com scale = scale * 2 / 3; 39eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com 40eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com SkMipMap::Level level; 41eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com if (mm->extractLevel(scale, &level)) { 42eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com REPORTER_ASSERT(reporter, level.fPixels); 43eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com REPORTER_ASSERT(reporter, level.fWidth > 0); 44eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com REPORTER_ASSERT(reporter, level.fHeight > 0); 45eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com REPORTER_ASSERT(reporter, level.fRowBytes >= level.fWidth * 4); 46a79919883e275e7a5e00afc50be10cc721f6ba1dskia.committer@gmail.com 47eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com if (prevLevel.fPixels) { 48eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com REPORTER_ASSERT(reporter, level.fWidth <= prevLevel.fWidth); 49eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com REPORTER_ASSERT(reporter, level.fHeight <= prevLevel.fHeight); 50eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com } 51eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com prevLevel = level; 52eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com } 53eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com } 54eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com } 55eed6f1b76b6690796e3d40993b1504ba1eca2df5reed@google.com} 56