OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2015 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 | |
8 #include "SkSwizzler.h" | |
9 #include "Test.h" | |
10 | |
11 static void check_fill(skiatest::Reporter* r, | |
12 SkColorType colorType, | |
13 uint32_t width, | |
14 uint32_t height, | |
15 uint32_t startRow, | |
16 size_t rowBytes, | |
17 size_t totalBytes, | |
18 uint32_t offset, | |
19 uint32_t colorOrIndex, | |
20 SkPMColor* colorTable) { | |
21 | |
22 // Create fake image data where every byte has a value of 0 | |
23 SkAutoTDelete<uint8_t> storage((uint8_t*) sk_malloc_throw(totalBytes)); | |
24 memset(storage.get(), 0, totalBytes); | |
25 uint8_t* imageData = storage.get() + offset; | |
26 | |
27 // Create fake image info (alpha type does not matter) | |
28 SkImageInfo imageInfo = SkImageInfo::Make(width, height, colorType, kUnknown _SkAlphaType); | |
29 | |
30 // Fill image with the fill value starting at the indicated row | |
31 SkSwizzler::Fill(imageData, imageInfo, rowBytes, startRow, colorOrIndex, col orTable); | |
32 | |
33 // Ensure that the pixels are filled properly | |
34 // The bots should catch any memory corruption | |
35 uint8_t* indexPtr = imageData + startRow * rowBytes; | |
36 uint32_t* colorPtr = (uint32_t*) indexPtr; | |
37 for (uint32_t y = startRow; y < height; y++) { | |
38 for (uint32_t x = 0; x < width; x++) { | |
39 if (kIndex_8_SkColorType == colorType) { | |
40 REPORTER_ASSERT(r, 0x1 == indexPtr[x]); | |
scroggo
2015/04/08 20:37:38
nit: make these constants?
msarett
2015/04/09 13:02:48
Done.
| |
41 } else { | |
42 REPORTER_ASSERT(r, 0x22334455 == colorPtr[x]); | |
43 } | |
44 } | |
45 indexPtr += rowBytes; | |
46 colorPtr = (uint32_t*) indexPtr; | |
47 } | |
48 } | |
49 | |
50 // Test Fill() with different combinations of dimensions, alignment, and padding | |
51 DEF_TEST(SwizzlerFill, r) { | |
52 // These are the values we will look for to indicate that the fill was succe ssful | |
53 uint8_t fillIndex = 0x1; | |
54 uint32_t fillColor = 0x22334455; | |
55 | |
56 // Set up a color table | |
57 SkPMColor colorTable[fillIndex + 1]; | |
58 memset(colorTable, 0, sizeof(SkPMColor) * (fillIndex + 1)); | |
scroggo
2015/04/08 20:37:37
This seems extra complicated? Why not:
colorTable
msarett
2015/04/09 13:02:48
Yeah, essentially it seemed weird to me to test wi
scroggo
2015/04/09 14:53:48
Sgtm. Please add a comment that explains why you'r
| |
59 colorTable[fillIndex] = fillColor; | |
60 | |
61 // Test on an invalid width and representative widths | |
62 const uint32_t widths[] = { 0, 10, 50 }; | |
63 | |
64 // In order to call Fill(), there must be at least one row to fill | |
65 // Test on the smallest possible height and representative heights | |
66 const uint32_t heights[] = { 1, 5, 10 }; | |
67 | |
68 // Test on interesting possibilities for row padding | |
69 const uint32_t paddings[] = { 0, 1, 2, 3, 4 }; | |
70 | |
71 // Iterate over test dimensions | |
72 for (uint32_t w = 0; w < SK_ARRAY_COUNT(widths); w++) { | |
scroggo
2015/04/08 20:37:37
I know I led you astray when I suggested this befo
msarett
2015/04/09 13:02:48
Excellent!
| |
73 for (uint32_t h = 0; h < SK_ARRAY_COUNT(heights); h++) { | |
74 for (uint32_t p = 0; p < SK_ARRAY_COUNT(paddings); p++) { | |
75 | |
76 // Calculate row bytes | |
77 uint32_t colorRowBytes = sizeof(SkPMColor) * widths[w] + padding s[p]; | |
scroggo
2015/04/08 20:37:37
Same as:
SkColorTypeBytesPerPixel(kN32) + paddin
msarett
2015/04/09 13:02:48
I think it is a little clearer!
| |
78 uint32_t indexRowBytes = widths[w] + paddings[p]; | |
79 | |
80 // If there is padding, we can invent an offset to change the me mory alignment | |
81 for (uint32_t offset = p; offset <= p; offset++) { | |
scroggo
2015/04/08 20:37:37
Wait, isn't this just a loop that only executes on
msarett
2015/04/09 13:02:48
Yes this is a bug. I intended offset to go from 0
| |
82 | |
83 // Calculate total bytes | |
84 // The last row may not be padded. We will always assume th at it is in fact | |
85 // not padded and test on the smallest possible value for to tal bytes. | |
86 uint32_t colorTotalBytes = colorRowBytes * heights[h] - padd ings[p] + offset; | |
scroggo
2015/04/08 20:37:38
It seems like this is
SkImageInfo colorInfo = SkI
msarett
2015/04/09 13:02:48
I think it is better. I need to be better at bein
| |
87 uint32_t indexTotalBytes = indexRowBytes * heights[h] - padd ings[p] + offset; | |
88 | |
89 // Test all possible start rows | |
90 for (uint32_t startRow = 0; startRow < heights[h]; startRow+ +) { | |
91 | |
92 // Fill with an index that we use to look up a color | |
93 check_fill(r, kN32_SkColorType, widths[w], heights[h], s tartRow, | |
94 colorRowBytes, colorTotalBytes, offset, fillInde x, | |
95 colorTable); | |
96 | |
97 // Fill with a color | |
98 check_fill(r, kN32_SkColorType, widths[w], heights[h], s tartRow, | |
99 colorRowBytes, colorTotalBytes, offset, fillColo r, | |
100 NULL); | |
101 | |
102 // Fill with an index | |
103 check_fill(r, kIndex_8_SkColorType, widths[w], heights[h ], startRow, | |
104 indexRowBytes, indexTotalBytes, offset, fillInde x, | |
105 NULL); | |
106 } | |
107 } | |
108 } | |
109 } | |
110 } | |
111 } | |
OLD | NEW |