OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkDeviceLooper.h" | 8 #include "SkDeviceLooper.h" |
9 #include "SkRasterClip.h" | 9 #include "SkRasterClip.h" |
10 #include "Test.h" | 10 #include "Test.h" |
11 | 11 |
12 static void make_pm(SkAutoPixmapStorage* pixmap, int w, int h) { | 12 static void make_bm(SkBitmap* bm, int w, int h) { |
13 pixmap->alloc(SkImageInfo::Make(w, h, kAlpha_8_SkColorType, kPremul_SkAlphaT
ype)); | 13 bm->allocPixels(SkImageInfo::Make(w, h, kAlpha_8_SkColorType, |
| 14 kPremul_SkAlphaType)); |
14 } | 15 } |
15 | 16 |
16 static bool equal(const SkRasterClip& a, const SkRasterClip& b) { | 17 static bool equal(const SkRasterClip& a, const SkRasterClip& b) { |
17 if (a.isBW()) { | 18 if (a.isBW()) { |
18 return b.isBW() && a.bwRgn() == b.bwRgn(); | 19 return b.isBW() && a.bwRgn() == b.bwRgn(); |
19 } else { | 20 } else { |
20 return a.isAA() && a.aaRgn() == b.aaRgn(); | 21 return a.isAA() && a.aaRgn() == b.aaRgn(); |
21 } | 22 } |
22 } | 23 } |
23 | 24 |
24 static const struct { | 25 static const struct { |
25 SkISize fDevSize; | 26 SkISize fDevSize; |
26 SkIRect fRCBounds; | 27 SkIRect fRCBounds; |
27 SkIRect fRect; | 28 SkIRect fRect; |
28 } gRec[] = { | 29 } gRec[] = { |
29 { { 4000, 10 }, { 0, 0, 4000, 10 }, { 0, 0, 4000, 4000 } }, | 30 { { 4000, 10 }, { 0, 0, 4000, 10 }, { 0, 0, 4000, 4000 } }, |
30 { { 10, 4000 }, { 0, 0, 10, 4000 }, { 0, 0, 4000, 4000 } }, | 31 { { 10, 4000 }, { 0, 0, 10, 4000 }, { 0, 0, 4000, 4000 } }, |
31 // very large devce, small rect | 32 // very large devce, small rect |
32 { { 32000, 10 }, { 0, 0, 32000, 10 }, { 0, 0, 4000, 4000 } }, | 33 { { 32000, 10 }, { 0, 0, 32000, 10 }, { 0, 0, 4000, 4000 } }, |
33 { { 10, 32000 }, { 0, 0, 10, 32000 }, { 0, 0, 4000, 4000 } }, | 34 { { 10, 32000 }, { 0, 0, 10, 32000 }, { 0, 0, 4000, 4000 } }, |
34 // very large device, small clip | 35 // very large device, small clip |
35 { { 32000, 10 }, { 0, 0, 4000, 10 }, { 0, 0, 32000, 32000 } }, | 36 { { 32000, 10 }, { 0, 0, 4000, 10 }, { 0, 0, 32000, 32000 } }, |
36 { { 10, 32000 }, { 0, 0, 10, 4000 }, { 0, 0, 32000, 32000 } }, | 37 { { 10, 32000 }, { 0, 0, 10, 4000 }, { 0, 0, 32000, 32000 } }, |
37 }; | 38 }; |
38 | 39 |
39 static void test_simple(skiatest::Reporter* reporter) { | 40 static void test_simple(skiatest::Reporter* reporter) { |
40 | 41 |
41 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | 42 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
42 SkAutoPixmapStorage pmap; | 43 SkBitmap bitmap; |
43 make_pm(&pmap, gRec[i].fDevSize.width(), gRec[i].fDevSize.height()); | 44 make_bm(&bitmap, gRec[i].fDevSize.width(), gRec[i].fDevSize.height()); |
44 | 45 |
45 SkRasterClip rc(gRec[i].fRCBounds); | 46 SkRasterClip rc(gRec[i].fRCBounds); |
46 | 47 |
47 for (int aa = 0; aa <= 1; ++aa) { | 48 for (int aa = 0; aa <= 1; ++aa) { |
48 SkDeviceLooper looper(pmap, rc, gRec[i].fRect, SkToBool(aa)); | 49 SkDeviceLooper looper(bitmap, rc, gRec[i].fRect, SkToBool(aa)); |
49 | 50 |
50 bool valid = looper.next(); | 51 bool valid = looper.next(); |
51 REPORTER_ASSERT(reporter, valid); | 52 REPORTER_ASSERT(reporter, valid); |
52 if (valid) { | 53 if (valid) { |
53 REPORTER_ASSERT(reporter, looper.getPixmap().width() == pmap.wid
th()); | 54 REPORTER_ASSERT(reporter, looper.getBitmap().width() == bitmap.w
idth()); |
54 REPORTER_ASSERT(reporter, looper.getPixmap().height() == pmap.he
ight()); | 55 REPORTER_ASSERT(reporter, looper.getBitmap().height() == bitmap.
height()); |
55 REPORTER_ASSERT(reporter, equal(looper.getRC(), rc)); | 56 REPORTER_ASSERT(reporter, equal(looper.getRC(), rc)); |
56 | 57 |
57 REPORTER_ASSERT(reporter, !looper.next()); | 58 REPORTER_ASSERT(reporter, !looper.next()); |
58 } | 59 } |
59 } | 60 } |
60 // test that a rect that doesn't intersect returns no loops | 61 // test that a rect that doesn't intersect returns no loops |
61 { | 62 { |
62 SkIRect r = rc.getBounds(); | 63 SkIRect r = rc.getBounds(); |
63 r.offset(r.width(), 0); | 64 r.offset(r.width(), 0); |
64 SkDeviceLooper looper(pmap, rc, r, false); | 65 SkDeviceLooper looper(bitmap, rc, r, false); |
65 REPORTER_ASSERT(reporter, !looper.next()); | 66 REPORTER_ASSERT(reporter, !looper.next()); |
66 } | 67 } |
67 } | 68 } |
68 } | 69 } |
69 | 70 |
70 // mask-bits are interpreted as the areas where the clip is visible | 71 // mask-bits are interpreted as the areas where the clip is visible |
71 // [ 0x01 0x02 ] | 72 // [ 0x01 0x02 ] |
72 // [ 0x04 0x08 ] | 73 // [ 0x04 0x08 ] |
73 // | 74 // |
74 static void make_rgn(SkRegion* rgn, int w, int h, unsigned mask) { | 75 static void make_rgn(SkRegion* rgn, int w, int h, unsigned mask) { |
(...skipping 26 matching lines...) Expand all Loading... |
101 bool fAA; | 102 bool fAA; |
102 } const gRec[] = { | 103 } const gRec[] = { |
103 { { BW_SIZE, BW_SIZE }, false }, | 104 { { BW_SIZE, BW_SIZE }, false }, |
104 { { AA_SIZE, AA_SIZE }, true }, | 105 { { AA_SIZE, AA_SIZE }, true }, |
105 }; | 106 }; |
106 | 107 |
107 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | 108 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
108 const int w = gRec[i].fSize.width(); | 109 const int w = gRec[i].fSize.width(); |
109 const int h = gRec[i].fSize.height(); | 110 const int h = gRec[i].fSize.height(); |
110 | 111 |
111 SkAutoPixmapStorage pmap; | 112 SkBitmap bitmap; |
112 make_pm(&pmap, w, h); | 113 make_bm(&bitmap, w, h); |
113 | 114 |
114 const SkIRect rect = SkIRect::MakeWH(w, h); | 115 const SkIRect rect = SkIRect::MakeWH(w, h); |
115 | 116 |
116 // mask-bits are interpreted as the areas where the clip is visible | 117 // mask-bits are interpreted as the areas where the clip is visible |
117 // [ 0x01 0x02 ] | 118 // [ 0x01 0x02 ] |
118 // [ 0x04 0x08 ] | 119 // [ 0x04 0x08 ] |
119 // | 120 // |
120 for (int mask = 0; mask <= 15; ++mask) { | 121 for (int mask = 0; mask <= 15; ++mask) { |
121 SkRegion rgn; | 122 SkRegion rgn; |
122 make_rgn(&rgn, w, h, mask); | 123 make_rgn(&rgn, w, h, mask); |
123 | 124 |
124 SkRasterClip rc; | 125 SkRasterClip rc; |
125 rc.op(rgn, SkRegion::kReplace_Op); | 126 rc.op(rgn, SkRegion::kReplace_Op); |
126 | 127 |
127 SkDeviceLooper looper(pmap, rc, rect, gRec[i].fAA); | 128 SkDeviceLooper looper(bitmap, rc, rect, gRec[i].fAA); |
128 while (looper.next()) { | 129 while (looper.next()) { |
129 REPORTER_ASSERT(reporter, !looper.getRC().isEmpty()); | 130 REPORTER_ASSERT(reporter, !looper.getRC().isEmpty()); |
130 } | 131 } |
131 } | 132 } |
132 } | 133 } |
133 } | 134 } |
134 | 135 |
135 DEF_TEST(DeviceLooper, reporter) { | 136 DEF_TEST(DeviceLooper, reporter) { |
136 test_simple(reporter); | 137 test_simple(reporter); |
137 test_complex(reporter); | 138 test_complex(reporter); |
138 } | 139 } |
OLD | NEW |