1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.org 86898d52c371309d81c2184ea991785d2485323e4reed@google.com#include "SkRandom.h" 9ff1ec2f1a8d417236f36d1396182538967e68e1awjmaclean@chromium.org#include "SkRect.h" 108f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h" 11ff1ec2f1a8d417236f36d1396182538967e68e1awjmaclean@chromium.org 12534240f6058773cc2366b8310ed5452286a6dfffreed@google.comstatic float make_zero() { 13534240f6058773cc2366b8310ed5452286a6dfffreed@google.com return sk_float_sin(0); 14534240f6058773cc2366b8310ed5452286a6dfffreed@google.com} 15d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com 162b57dc6bb241a6627c4375ee54b73039983d03dareed@google.comstruct RectCenter { 172b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com SkIRect fRect; 182b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com SkIPoint fCenter; 192b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com}; 202b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com 216898d52c371309d81c2184ea991785d2485323e4reed@google.comstatic void test_center(skiatest::Reporter* reporter) { 222b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com static const RectCenter gData[] = { 236898d52c371309d81c2184ea991785d2485323e4reed@google.com { { 0, 0, 0, 0 }, { 0, 0 } }, 246898d52c371309d81c2184ea991785d2485323e4reed@google.com { { 0, 0, 1, 1 }, { 0, 0 } }, 256898d52c371309d81c2184ea991785d2485323e4reed@google.com { { -1, -1, 0, 0 }, { -1, -1 } }, 266898d52c371309d81c2184ea991785d2485323e4reed@google.com { { 0, 0, 10, 7 }, { 5, 3 } }, 276898d52c371309d81c2184ea991785d2485323e4reed@google.com { { 0, 0, 11, 6 }, { 5, 3 } }, 286898d52c371309d81c2184ea991785d2485323e4reed@google.com }; 292b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com for (size_t index = 0; index < SK_ARRAY_COUNT(gData); ++index) { 306898d52c371309d81c2184ea991785d2485323e4reed@google.com REPORTER_ASSERT(reporter, 312b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com gData[index].fRect.centerX() == gData[index].fCenter.x()); 326898d52c371309d81c2184ea991785d2485323e4reed@google.com REPORTER_ASSERT(reporter, 332b57dc6bb241a6627c4375ee54b73039983d03dareed@google.com gData[index].fRect.centerY() == gData[index].fCenter.y()); 346898d52c371309d81c2184ea991785d2485323e4reed@google.com } 356898d52c371309d81c2184ea991785d2485323e4reed@google.com 36e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 376898d52c371309d81c2184ea991785d2485323e4reed@google.com for (int i = 0; i < 10000; ++i) { 386898d52c371309d81c2184ea991785d2485323e4reed@google.com SkIRect r; 39d9f7503e0cb0c4db856f53b4bdeec1332db6f296skia.committer@gmail.com 406898d52c371309d81c2184ea991785d2485323e4reed@google.com r.set(rand.nextS() >> 2, rand.nextS() >> 2, 416898d52c371309d81c2184ea991785d2485323e4reed@google.com rand.nextS() >> 2, rand.nextS() >> 2); 426898d52c371309d81c2184ea991785d2485323e4reed@google.com int cx = r.centerX(); 436898d52c371309d81c2184ea991785d2485323e4reed@google.com int cy = r.centerY(); 44ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com REPORTER_ASSERT(reporter, ((r.left() + r.right()) >> 1) == cx); 45ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com REPORTER_ASSERT(reporter, ((r.top() + r.bottom()) >> 1) == cy); 466898d52c371309d81c2184ea991785d2485323e4reed@google.com } 476898d52c371309d81c2184ea991785d2485323e4reed@google.com} 486898d52c371309d81c2184ea991785d2485323e4reed@google.com 49d41344553163085bfcfaf7d5882c6028934f8e3breed@android.comstatic void check_invalid(skiatest::Reporter* reporter, 50d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkScalar l, SkScalar t, SkScalar r, SkScalar b) { 51d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkRect rect; 52d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com rect.set(l, t, r, b); 531607863b608b7db6c813228768ed5d72997bbc82reed@google.com REPORTER_ASSERT(reporter, !rect.isFinite()); 54d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com} 55534240f6058773cc2366b8310ed5452286a6dfffreed@google.com 561607863b608b7db6c813228768ed5d72997bbc82reed@google.com// Tests that isFinite() will reject any rect with +/-inf values 57ff1ec2f1a8d417236f36d1396182538967e68e1awjmaclean@chromium.org// as one of its coordinates. 58e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(InfRect, reporter) { 597b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com float inf = 1 / make_zero(); // infinity 607b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com float nan = inf * 0; 617b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com SkASSERT(!(nan == nan)); 62d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkScalar small = SkIntToScalar(10); 63d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkScalar big = SkIntToScalar(100); 64d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com 657b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com REPORTER_ASSERT(reporter, SkRect::MakeEmpty().isFinite()); 667b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com 67d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com SkRect rect = SkRect::MakeXYWH(small, small, big, big); 681607863b608b7db6c813228768ed5d72997bbc82reed@google.com REPORTER_ASSERT(reporter, rect.isFinite()); 69ff1ec2f1a8d417236f36d1396182538967e68e1awjmaclean@chromium.org 707b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com const SkScalar invalid[] = { nan, inf, -inf }; 717b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(invalid); ++i) { 727b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com check_invalid(reporter, small, small, big, invalid[i]); 737b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com check_invalid(reporter, small, small, invalid[i], big); 747b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com check_invalid(reporter, small, invalid[i], big, big); 757b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com check_invalid(reporter, invalid[i], small, big, big); 767b463acd46b8df866d3a27fbaf69b0090c842d1ereed@google.com } 77d9f7503e0cb0c4db856f53b4bdeec1332db6f296skia.committer@gmail.com 786898d52c371309d81c2184ea991785d2485323e4reed@google.com test_center(reporter); 79ff1ec2f1a8d417236f36d1396182538967e68e1awjmaclean@chromium.org} 80ff1ec2f1a8d417236f36d1396182538967e68e1awjmaclean@chromium.org 81ff1ec2f1a8d417236f36d1396182538967e68e1awjmaclean@chromium.org// need tests for SkStrSearch 82