| /* |
| * 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.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))); |
| } |
| } |
| |
| #endif |