/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkTypes.h" #include "Test.h" #if SK_SUPPORT_GPU #include "GrWindowRectangles.h" static SkIRect next_irect(SkRandom& r) { return {r.nextS(), r.nextS(), r.nextS(), r.nextS()}; } DEF_TEST(WindowRectangles, reporter) { SkRandom r; SkIRect windowData[GrWindowRectangles::kMaxWindows]; for (int i = 0; i < GrWindowRectangles::kMaxWindows; ++i) { windowData[i] = next_irect(r); } GrWindowRectangles wr; for (int i = 0; i < GrWindowRectangles::kMaxWindows - 1; ++i) { REPORTER_ASSERT(reporter, wr.count() == i); REPORTER_ASSERT(reporter, !memcmp(wr.data(), windowData, i * sizeof(SkIRect))); GrWindowRectangles wr2(wr); REPORTER_ASSERT(reporter, wr2 == wr); REPORTER_ASSERT(reporter, wr2.mode() == wr.mode()); REPORTER_ASSERT(reporter, wr2.count() == wr.count()); REPORTER_ASSERT(reporter, !memcmp(wr2.data(), wr.data(), i * sizeof(SkIRect))); wr.addWindow(windowData[i]); } SkASSERT(wr.count() == GrWindowRectangles::kMaxWindows - 1); { GrWindowRectangles A(wr), B(wr); REPORTER_ASSERT(reporter, B == A); REPORTER_ASSERT(reporter, B.data() == A.data()); // Should use copy-on-write. A.addWindow(windowData[GrWindowRectangles::kMaxWindows - 1]); REPORTER_ASSERT(reporter, B.data() != A.data()); REPORTER_ASSERT(reporter, B != A); B.addWindow(SkIRect::MakeLargest()); REPORTER_ASSERT(reporter, B != A); REPORTER_ASSERT(reporter, !memcmp(A.data(), windowData, GrWindowRectangles::kMaxWindows * sizeof(SkIRect))); REPORTER_ASSERT(reporter, !memcmp(B.data(), windowData, (GrWindowRectangles::kMaxWindows - 1) * sizeof(SkIRect))); REPORTER_ASSERT(reporter, B.data()[GrWindowRectangles::kMaxWindows - 1] == SkIRect::MakeLargest()); } { GrWindowRectangles A(wr), B(wr); REPORTER_ASSERT(reporter, B == A); REPORTER_ASSERT(reporter, B.data() == A.data()); // Should use copy-on-write. A.addWindow(windowData[GrWindowRectangles::kMaxWindows - 1]); B.addWindow(windowData[GrWindowRectangles::kMaxWindows - 1]); REPORTER_ASSERT(reporter, B == A); REPORTER_ASSERT(reporter, B.data() != A.data()); REPORTER_ASSERT(reporter, !memcmp(B.data(), A.data(), GrWindowRectangles::kMaxWindows * sizeof(SkIRect))); REPORTER_ASSERT(reporter, !memcmp(A.data(), windowData, GrWindowRectangles::kMaxWindows * sizeof(SkIRect))); } GrWindowRectangles wrI(GrWindowRectangles::Mode::kInclusive); for (int i = 0; i < wr.count(); ++i) { wrI.addWindow(windowData[i]); } REPORTER_ASSERT(reporter, wrI != wr); REPORTER_ASSERT(reporter, wrI.mode() != wr.mode()); REPORTER_ASSERT(reporter, wrI.count() == wr.count()); REPORTER_ASSERT(reporter, !memcmp(wrI.data(), wr.data(), wr.count() * sizeof(SkIRect))); wr.reset(GrWindowRectangles::Mode::kInclusive); for (int i = 0; i < wrI.count(); ++i) { wr.addWindow(windowData[i]); } REPORTER_ASSERT(reporter, wrI == wr); } #endif