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