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 "SkCodec.h" | |
9 #include "SkCodecPriv.h" | |
10 #include "SkSampler.h" | |
11 #include "SkUtils.h" | |
12 | |
13 void SkSampler::Fill(void* dst, SkColorType colorType, int width, int numRows, s ize_t rowBytes, | |
scroggo
2015/10/07 18:46:39
Was this code moved cleanly over from SkSwizzler.c
msarett
2015/10/07 20:53:23
The only difference is that we do not pass in an S
| |
14 uint32_t colorOrIndex, SkCodec::ZeroInitialized zeroInit) { | |
15 SkASSERT(dst != nullptr); | |
16 | |
17 // Calculate bytes to fill. We use getSafeSize since the last row may not b e padded. | |
18 SkImageInfo info = SkImageInfo::Make(width, numRows, colorType, | |
19 SkAlphaType::kUnknown_SkAlphaType); | |
20 const size_t bytesToFill = info.getSafeSize(rowBytes); | |
21 | |
22 // Use the proper memset routine to fill the remaining bytes | |
23 switch (colorType) { | |
24 case kN32_SkColorType: { | |
25 // If memory is zero initialized, we may not need to fill | |
26 uint32_t color = colorOrIndex; | |
27 if (SkCodec::kYes_ZeroInitialized == zeroInit && 0 == color) { | |
28 return; | |
29 } | |
30 | |
31 // We must fill row by row in the case of unaligned row bytes | |
32 if (SkIsAlign4((size_t) dst) && SkIsAlign4(rowBytes)) { | |
33 sk_memset32((uint32_t*) dst, color, | |
34 (uint32_t) bytesToFill / sizeof(SkPMColor)); | |
35 } else { | |
36 // We must fill row by row in the case of unaligned row bytes. This is an | |
37 // unlikely, slow case. | |
38 SkCodecPrintf("Warning: Strange number of row bytes, fill will b e slow.\n"); | |
39 uint32_t* dstRow = (uint32_t*) dst; | |
40 for (uint32_t row = 0; row < numRows; row++) { | |
41 for (int32_t col = 0; col < width; col++) { | |
42 dstRow[col] = color; | |
43 } | |
44 dstRow = SkTAddOffset<uint32_t>(dstRow, rowBytes); | |
45 } | |
46 } | |
47 break; | |
48 } | |
49 case kRGB_565_SkColorType: { | |
50 // If the destination is k565, the caller passes in a 16-bit color. | |
51 // We will not assert that the high bits of colorOrIndex must be zer oed. | |
52 // This allows us to take advantage of the fact that the low 16 bits of an | |
53 // SKPMColor may be a valid a 565 color. For example, the low 16 | |
54 // bits of SK_ColorBLACK are identical to the 565 representation | |
55 // for black. | |
56 | |
57 // If memory is zero initialized, we may not need to fill | |
58 uint16_t color = (uint16_t) colorOrIndex; | |
59 if (SkCodec::kYes_ZeroInitialized == zeroInit && 0 == color) { | |
60 return; | |
61 } | |
62 | |
63 if (SkIsAlign2((size_t) dst) && SkIsAlign2(rowBytes)) { | |
64 sk_memset16((uint16_t*) dst, color, (uint32_t) bytesToFill / siz eof(uint16_t)); | |
65 } else { | |
66 // We must fill row by row in the case of unaligned row bytes. This is an | |
67 // unlikely, slow case. | |
68 SkCodecPrintf("Warning: Strange number of row bytes, fill will b e slow.\n"); | |
69 uint16_t* dstRow = (uint16_t*) dst; | |
70 for (uint32_t row = 0; row < numRows; row++) { | |
71 for (int32_t col = 0; col < width; col++) { | |
72 dstRow[col] = color; | |
73 } | |
74 dstRow = SkTAddOffset<uint16_t>(dstRow, rowBytes); | |
75 } | |
76 } | |
77 break; | |
78 } | |
79 case kIndex_8_SkColorType: | |
80 // On an index destination color type, always assume the input is an index. | |
81 // Fall through | |
82 case kGray_8_SkColorType: | |
83 // If the destination is kGray, the caller passes in an 8-bit color. | |
84 // We will not assert that the high bits of colorOrIndex must be zer oed. | |
85 // This allows us to take advantage of the fact that the low 8 bits of an | |
86 // SKPMColor may be a valid a grayscale color. For example, the low 8 | |
87 // bits of SK_ColorBLACK are identical to the grayscale representati on | |
88 // for black. | |
89 | |
90 // If memory is zero initialized, we may not need to fill | |
91 if (SkCodec::kYes_ZeroInitialized == zeroInit && 0 == (uint8_t) colo rOrIndex) { | |
92 return; | |
93 } | |
94 | |
95 memset(dst, (uint8_t) colorOrIndex, bytesToFill); | |
96 break; | |
97 default: | |
98 SkCodecPrintf("Error: Unsupported dst color type for fill(). Doing nothing.\n"); | |
99 SkASSERT(false); | |
100 break; | |
101 } | |
102 } | |
OLD | NEW |