OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkCodecPriv.h" | 8 #include "SkCodecPriv.h" |
9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
10 #include "SkMaskSwizzler.h" | 10 #include "SkMaskSwizzler.h" |
11 | 11 |
12 static void swizzle_mask16_to_n32_opaque( | 12 static void swizzle_mask16_to_rgba_opaque( |
13 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 13 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
14 uint32_t startX, uint32_t sampleX) { | 14 uint32_t startX, uint32_t sampleX) { |
15 | 15 |
16 // Use the masks to decode to the destination | 16 // Use the masks to decode to the destination |
17 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; | 17 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; |
18 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 18 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
19 for (int i = 0; i < width; i++) { | 19 for (int i = 0; i < width; i++) { |
20 uint16_t p = srcPtr[0]; | 20 uint16_t p = srcPtr[0]; |
21 uint8_t red = masks->getRed(p); | 21 uint8_t red = masks->getRed(p); |
22 uint8_t green = masks->getGreen(p); | 22 uint8_t green = masks->getGreen(p); |
23 uint8_t blue = masks->getBlue(p); | 23 uint8_t blue = masks->getBlue(p); |
24 dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); | 24 dstPtr[i] = SkPackARGB_as_RGBA(0xFF, red, green, blue); |
25 srcPtr += sampleX; | 25 srcPtr += sampleX; |
26 } | 26 } |
27 } | 27 } |
28 | 28 |
29 static void swizzle_mask16_to_n32_unpremul( | 29 static void swizzle_mask16_to_bgra_opaque( |
30 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 30 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
31 uint32_t startX, uint32_t sampleX) { | 31 uint32_t startX, uint32_t sampleX) { |
32 | 32 |
| 33 // Use the masks to decode to the destination |
| 34 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; |
| 35 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 36 for (int i = 0; i < width; i++) { |
| 37 uint16_t p = srcPtr[0]; |
| 38 uint8_t red = masks->getRed(p); |
| 39 uint8_t green = masks->getGreen(p); |
| 40 uint8_t blue = masks->getBlue(p); |
| 41 dstPtr[i] = SkPackARGB_as_BGRA(0xFF, red, green, blue); |
| 42 srcPtr += sampleX; |
| 43 } |
| 44 } |
| 45 |
| 46 static void swizzle_mask16_to_rgba_unpremul( |
| 47 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
| 48 uint32_t startX, uint32_t sampleX) { |
| 49 |
33 // Use the masks to decode to the destination | 50 // Use the masks to decode to the destination |
34 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; | 51 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; |
35 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 52 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
36 for (int i = 0; i < width; i++) { | 53 for (int i = 0; i < width; i++) { |
37 uint16_t p = srcPtr[0]; | 54 uint16_t p = srcPtr[0]; |
38 uint8_t red = masks->getRed(p); | 55 uint8_t red = masks->getRed(p); |
39 uint8_t green = masks->getGreen(p); | 56 uint8_t green = masks->getGreen(p); |
40 uint8_t blue = masks->getBlue(p); | 57 uint8_t blue = masks->getBlue(p); |
41 uint8_t alpha = masks->getAlpha(p); | 58 uint8_t alpha = masks->getAlpha(p); |
42 dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); | 59 dstPtr[i] = SkPackARGB_as_RGBA(alpha, red, green, blue); |
43 srcPtr += sampleX; | 60 srcPtr += sampleX; |
44 } | 61 } |
45 } | 62 } |
46 | 63 |
47 static void swizzle_mask16_to_n32_premul( | 64 static void swizzle_mask16_to_bgra_unpremul( |
48 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 65 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
49 uint32_t startX, uint32_t sampleX) { | 66 uint32_t startX, uint32_t sampleX) { |
50 | 67 |
51 // Use the masks to decode to the destination | 68 // Use the masks to decode to the destination |
52 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; | 69 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; |
53 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 70 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
54 for (int i = 0; i < width; i++) { | 71 for (int i = 0; i < width; i++) { |
55 uint16_t p = srcPtr[0]; | 72 uint16_t p = srcPtr[0]; |
56 uint8_t red = masks->getRed(p); | 73 uint8_t red = masks->getRed(p); |
57 uint8_t green = masks->getGreen(p); | 74 uint8_t green = masks->getGreen(p); |
58 uint8_t blue = masks->getBlue(p); | 75 uint8_t blue = masks->getBlue(p); |
59 uint8_t alpha = masks->getAlpha(p); | 76 uint8_t alpha = masks->getAlpha(p); |
60 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); | 77 dstPtr[i] = SkPackARGB_as_BGRA(alpha, red, green, blue); |
61 srcPtr += sampleX; | 78 srcPtr += sampleX; |
62 } | 79 } |
63 } | 80 } |
| 81 |
| 82 static void swizzle_mask16_to_rgba_premul( |
| 83 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
| 84 uint32_t startX, uint32_t sampleX) { |
| 85 |
| 86 // Use the masks to decode to the destination |
| 87 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; |
| 88 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 89 for (int i = 0; i < width; i++) { |
| 90 uint16_t p = srcPtr[0]; |
| 91 uint8_t red = masks->getRed(p); |
| 92 uint8_t green = masks->getGreen(p); |
| 93 uint8_t blue = masks->getBlue(p); |
| 94 uint8_t alpha = masks->getAlpha(p); |
| 95 dstPtr[i] = premultiply_argb_as_rgba(alpha, red, green, blue); |
| 96 srcPtr += sampleX; |
| 97 } |
| 98 } |
| 99 |
| 100 static void swizzle_mask16_to_bgra_premul( |
| 101 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
| 102 uint32_t startX, uint32_t sampleX) { |
| 103 |
| 104 // Use the masks to decode to the destination |
| 105 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; |
| 106 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 107 for (int i = 0; i < width; i++) { |
| 108 uint16_t p = srcPtr[0]; |
| 109 uint8_t red = masks->getRed(p); |
| 110 uint8_t green = masks->getGreen(p); |
| 111 uint8_t blue = masks->getBlue(p); |
| 112 uint8_t alpha = masks->getAlpha(p); |
| 113 dstPtr[i] = premultiply_argb_as_bgra(alpha, red, green, blue); |
| 114 srcPtr += sampleX; |
| 115 } |
| 116 } |
64 | 117 |
65 // TODO (msarett): We have promoted a two byte per pixel image to 8888, only to | 118 // TODO (msarett): We have promoted a two byte per pixel image to 8888, only to |
66 // convert it back to 565. Instead, we should swizzle to 565 directly. | 119 // convert it back to 565. Instead, we should swizzle to 565 directly. |
67 static void swizzle_mask16_to_565( | 120 static void swizzle_mask16_to_565( |
68 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 121 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
69 uint32_t startX, uint32_t sampleX) { | 122 uint32_t startX, uint32_t sampleX) { |
70 | 123 |
71 // Use the masks to decode to the destination | 124 // Use the masks to decode to the destination |
72 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; | 125 uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; |
73 uint16_t* dstPtr = (uint16_t*) dstRow; | 126 uint16_t* dstPtr = (uint16_t*) dstRow; |
74 for (int i = 0; i < width; i++) { | 127 for (int i = 0; i < width; i++) { |
75 uint16_t p = srcPtr[0]; | 128 uint16_t p = srcPtr[0]; |
76 uint8_t red = masks->getRed(p); | 129 uint8_t red = masks->getRed(p); |
77 uint8_t green = masks->getGreen(p); | 130 uint8_t green = masks->getGreen(p); |
78 uint8_t blue = masks->getBlue(p); | 131 uint8_t blue = masks->getBlue(p); |
79 dstPtr[i] = SkPack888ToRGB16(red, green, blue); | 132 dstPtr[i] = SkPack888ToRGB16(red, green, blue); |
80 srcPtr += sampleX; | 133 srcPtr += sampleX; |
81 } | 134 } |
82 } | 135 } |
83 | 136 |
84 static void swizzle_mask24_to_n32_opaque( | 137 static void swizzle_mask24_to_rgba_opaque( |
85 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 138 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
86 uint32_t startX, uint32_t sampleX) { | 139 uint32_t startX, uint32_t sampleX) { |
87 | 140 |
| 141 // Use the masks to decode to the destination |
| 142 srcRow += 3 * startX; |
| 143 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 144 for (int i = 0; i < width; i++) { |
| 145 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; |
| 146 uint8_t red = masks->getRed(p); |
| 147 uint8_t green = masks->getGreen(p); |
| 148 uint8_t blue = masks->getBlue(p); |
| 149 dstPtr[i] = SkPackARGB_as_RGBA(0xFF, red, green, blue); |
| 150 srcRow += 3 * sampleX; |
| 151 } |
| 152 } |
| 153 |
| 154 static void swizzle_mask24_to_bgra_opaque( |
| 155 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
| 156 uint32_t startX, uint32_t sampleX) { |
| 157 |
| 158 // Use the masks to decode to the destination |
| 159 srcRow += 3 * startX; |
| 160 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 161 for (int i = 0; i < width; i++) { |
| 162 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; |
| 163 uint8_t red = masks->getRed(p); |
| 164 uint8_t green = masks->getGreen(p); |
| 165 uint8_t blue = masks->getBlue(p); |
| 166 dstPtr[i] = SkPackARGB_as_BGRA(0xFF, red, green, blue); |
| 167 srcRow += 3 * sampleX; |
| 168 } |
| 169 } |
| 170 |
| 171 static void swizzle_mask24_to_rgba_unpremul( |
| 172 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
| 173 uint32_t startX, uint32_t sampleX) { |
| 174 |
88 // Use the masks to decode to the destination | 175 // Use the masks to decode to the destination |
89 srcRow += 3 * startX; | 176 srcRow += 3 * startX; |
90 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 177 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
91 for (int i = 0; i < width; i++) { | 178 for (int i = 0; i < width; i++) { |
92 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; | 179 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; |
93 uint8_t red = masks->getRed(p); | 180 uint8_t red = masks->getRed(p); |
94 uint8_t green = masks->getGreen(p); | 181 uint8_t green = masks->getGreen(p); |
95 uint8_t blue = masks->getBlue(p); | 182 uint8_t blue = masks->getBlue(p); |
96 dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); | 183 uint8_t alpha = masks->getAlpha(p); |
| 184 dstPtr[i] = SkPackARGB_as_RGBA(alpha, red, green, blue); |
97 srcRow += 3 * sampleX; | 185 srcRow += 3 * sampleX; |
98 } | 186 } |
99 } | 187 } |
100 | 188 |
101 static void swizzle_mask24_to_n32_unpremul( | 189 static void swizzle_mask24_to_bgra_unpremul( |
102 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 190 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
103 uint32_t startX, uint32_t sampleX) { | 191 uint32_t startX, uint32_t sampleX) { |
104 | 192 |
105 // Use the masks to decode to the destination | 193 // Use the masks to decode to the destination |
106 srcRow += 3 * startX; | 194 srcRow += 3 * startX; |
107 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 195 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
108 for (int i = 0; i < width; i++) { | 196 for (int i = 0; i < width; i++) { |
109 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; | 197 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; |
110 uint8_t red = masks->getRed(p); | 198 uint8_t red = masks->getRed(p); |
111 uint8_t green = masks->getGreen(p); | 199 uint8_t green = masks->getGreen(p); |
112 uint8_t blue = masks->getBlue(p); | 200 uint8_t blue = masks->getBlue(p); |
113 uint8_t alpha = masks->getAlpha(p); | 201 uint8_t alpha = masks->getAlpha(p); |
114 dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); | 202 dstPtr[i] = SkPackARGB_as_BGRA(alpha, red, green, blue); |
115 srcRow += 3 * sampleX; | 203 srcRow += 3 * sampleX; |
116 } | 204 } |
117 } | 205 } |
118 | 206 |
119 static void swizzle_mask24_to_n32_premul( | 207 static void swizzle_mask24_to_rgba_premul( |
120 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 208 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
121 uint32_t startX, uint32_t sampleX) { | 209 uint32_t startX, uint32_t sampleX) { |
122 | 210 |
123 // Use the masks to decode to the destination | 211 // Use the masks to decode to the destination |
124 srcRow += 3 * startX; | 212 srcRow += 3 * startX; |
125 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 213 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
126 for (int i = 0; i < width; i++) { | 214 for (int i = 0; i < width; i++) { |
127 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; | 215 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; |
128 uint8_t red = masks->getRed(p); | 216 uint8_t red = masks->getRed(p); |
129 uint8_t green = masks->getGreen(p); | 217 uint8_t green = masks->getGreen(p); |
130 uint8_t blue = masks->getBlue(p); | 218 uint8_t blue = masks->getBlue(p); |
131 uint8_t alpha = masks->getAlpha(p); | 219 uint8_t alpha = masks->getAlpha(p); |
132 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); | 220 dstPtr[i] = premultiply_argb_as_rgba(alpha, red, green, blue); |
133 srcRow += 3 * sampleX; | 221 srcRow += 3 * sampleX; |
134 } | 222 } |
135 } | 223 } |
| 224 |
| 225 static void swizzle_mask24_to_bgra_premul( |
| 226 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
| 227 uint32_t startX, uint32_t sampleX) { |
| 228 |
| 229 // Use the masks to decode to the destination |
| 230 srcRow += 3 * startX; |
| 231 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 232 for (int i = 0; i < width; i++) { |
| 233 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; |
| 234 uint8_t red = masks->getRed(p); |
| 235 uint8_t green = masks->getGreen(p); |
| 236 uint8_t blue = masks->getBlue(p); |
| 237 uint8_t alpha = masks->getAlpha(p); |
| 238 dstPtr[i] = premultiply_argb_as_bgra(alpha, red, green, blue); |
| 239 srcRow += 3 * sampleX; |
| 240 } |
| 241 } |
136 | 242 |
137 static void swizzle_mask24_to_565( | 243 static void swizzle_mask24_to_565( |
138 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 244 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
139 uint32_t startX, uint32_t sampleX) { | 245 uint32_t startX, uint32_t sampleX) { |
140 | 246 |
141 // Use the masks to decode to the destination | 247 // Use the masks to decode to the destination |
142 srcRow += 3 * startX; | 248 srcRow += 3 * startX; |
143 uint16_t* dstPtr = (uint16_t*) dstRow; | 249 uint16_t* dstPtr = (uint16_t*) dstRow; |
144 for (int i = 0; i < width; i++) { | 250 for (int i = 0; i < width; i++) { |
145 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; | 251 uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; |
146 uint8_t red = masks->getRed(p); | 252 uint8_t red = masks->getRed(p); |
147 uint8_t green = masks->getGreen(p); | 253 uint8_t green = masks->getGreen(p); |
148 uint8_t blue = masks->getBlue(p); | 254 uint8_t blue = masks->getBlue(p); |
149 dstPtr[i] = SkPack888ToRGB16(red, green, blue); | 255 dstPtr[i] = SkPack888ToRGB16(red, green, blue); |
150 srcRow += 3 * sampleX; | 256 srcRow += 3 * sampleX; |
151 } | 257 } |
152 } | 258 } |
153 | 259 |
154 static void swizzle_mask32_to_n32_opaque( | 260 static void swizzle_mask32_to_rgba_opaque( |
155 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 261 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
156 uint32_t startX, uint32_t sampleX) { | 262 uint32_t startX, uint32_t sampleX) { |
157 | 263 |
| 264 // Use the masks to decode to the destination |
| 265 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; |
| 266 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 267 for (int i = 0; i < width; i++) { |
| 268 uint32_t p = srcPtr[0]; |
| 269 uint8_t red = masks->getRed(p); |
| 270 uint8_t green = masks->getGreen(p); |
| 271 uint8_t blue = masks->getBlue(p); |
| 272 dstPtr[i] = SkPackARGB_as_RGBA(0xFF, red, green, blue); |
| 273 srcPtr += sampleX; |
| 274 } |
| 275 } |
| 276 |
| 277 static void swizzle_mask32_to_bgra_opaque( |
| 278 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
| 279 uint32_t startX, uint32_t sampleX) { |
| 280 |
| 281 // Use the masks to decode to the destination |
| 282 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; |
| 283 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 284 for (int i = 0; i < width; i++) { |
| 285 uint32_t p = srcPtr[0]; |
| 286 uint8_t red = masks->getRed(p); |
| 287 uint8_t green = masks->getGreen(p); |
| 288 uint8_t blue = masks->getBlue(p); |
| 289 dstPtr[i] = SkPackARGB_as_BGRA(0xFF, red, green, blue); |
| 290 srcPtr += sampleX; |
| 291 } |
| 292 } |
| 293 |
| 294 static void swizzle_mask32_to_rgba_unpremul( |
| 295 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
| 296 uint32_t startX, uint32_t sampleX) { |
| 297 |
| 298 // Use the masks to decode to the destination |
| 299 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; |
| 300 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 301 for (int i = 0; i < width; i++) { |
| 302 uint32_t p = srcPtr[0]; |
| 303 uint8_t red = masks->getRed(p); |
| 304 uint8_t green = masks->getGreen(p); |
| 305 uint8_t blue = masks->getBlue(p); |
| 306 uint8_t alpha = masks->getAlpha(p); |
| 307 dstPtr[i] = SkPackARGB_as_RGBA(alpha, red, green, blue); |
| 308 srcPtr += sampleX; |
| 309 } |
| 310 } |
| 311 |
| 312 static void swizzle_mask32_to_bgra_unpremul( |
| 313 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
| 314 uint32_t startX, uint32_t sampleX) { |
| 315 |
158 // Use the masks to decode to the destination | 316 // Use the masks to decode to the destination |
159 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; | 317 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; |
160 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 318 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
161 for (int i = 0; i < width; i++) { | 319 for (int i = 0; i < width; i++) { |
162 uint32_t p = srcPtr[0]; | 320 uint32_t p = srcPtr[0]; |
163 uint8_t red = masks->getRed(p); | 321 uint8_t red = masks->getRed(p); |
164 uint8_t green = masks->getGreen(p); | 322 uint8_t green = masks->getGreen(p); |
165 uint8_t blue = masks->getBlue(p); | 323 uint8_t blue = masks->getBlue(p); |
166 dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); | 324 uint8_t alpha = masks->getAlpha(p); |
| 325 dstPtr[i] = SkPackARGB_as_BGRA(alpha, red, green, blue); |
167 srcPtr += sampleX; | 326 srcPtr += sampleX; |
168 } | 327 } |
169 } | 328 } |
170 | 329 |
171 static void swizzle_mask32_to_n32_unpremul( | 330 static void swizzle_mask32_to_rgba_premul( |
172 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 331 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
173 uint32_t startX, uint32_t sampleX) { | 332 uint32_t startX, uint32_t sampleX) { |
174 | 333 |
175 // Use the masks to decode to the destination | 334 // Use the masks to decode to the destination |
176 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; | 335 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; |
177 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 336 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
178 for (int i = 0; i < width; i++) { | 337 for (int i = 0; i < width; i++) { |
179 uint32_t p = srcPtr[0]; | 338 uint32_t p = srcPtr[0]; |
180 uint8_t red = masks->getRed(p); | 339 uint8_t red = masks->getRed(p); |
181 uint8_t green = masks->getGreen(p); | 340 uint8_t green = masks->getGreen(p); |
182 uint8_t blue = masks->getBlue(p); | 341 uint8_t blue = masks->getBlue(p); |
183 uint8_t alpha = masks->getAlpha(p); | 342 uint8_t alpha = masks->getAlpha(p); |
184 dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); | 343 dstPtr[i] = premultiply_argb_as_rgba(alpha, red, green, blue); |
185 srcPtr += sampleX; | 344 srcPtr += sampleX; |
186 } | 345 } |
187 } | 346 } |
188 | 347 |
189 static void swizzle_mask32_to_n32_premul( | 348 static void swizzle_mask32_to_bgra_premul( |
190 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 349 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
191 uint32_t startX, uint32_t sampleX) { | 350 uint32_t startX, uint32_t sampleX) { |
192 | 351 |
193 // Use the masks to decode to the destination | 352 // Use the masks to decode to the destination |
194 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; | 353 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; |
195 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 354 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
196 for (int i = 0; i < width; i++) { | 355 for (int i = 0; i < width; i++) { |
197 uint32_t p = srcPtr[0]; | 356 uint32_t p = srcPtr[0]; |
198 uint8_t red = masks->getRed(p); | 357 uint8_t red = masks->getRed(p); |
199 uint8_t green = masks->getGreen(p); | 358 uint8_t green = masks->getGreen(p); |
200 uint8_t blue = masks->getBlue(p); | 359 uint8_t blue = masks->getBlue(p); |
201 uint8_t alpha = masks->getAlpha(p); | 360 uint8_t alpha = masks->getAlpha(p); |
202 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); | 361 dstPtr[i] = premultiply_argb_as_bgra(alpha, red, green, blue); |
203 srcPtr += sampleX; | 362 srcPtr += sampleX; |
204 } | 363 } |
205 } | 364 } |
206 | 365 |
207 static void swizzle_mask32_to_565( | 366 static void swizzle_mask32_to_565( |
208 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, | 367 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
209 uint32_t startX, uint32_t sampleX) { | 368 uint32_t startX, uint32_t sampleX) { |
210 // Use the masks to decode to the destination | 369 // Use the masks to decode to the destination |
211 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; | 370 uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; |
212 uint16_t* dstPtr = (uint16_t*) dstRow; | 371 uint16_t* dstPtr = (uint16_t*) dstRow; |
(...skipping 14 matching lines...) Expand all Loading... |
227 */ | 386 */ |
228 SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler(const SkImageInfo& dstInfo, | 387 SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler(const SkImageInfo& dstInfo, |
229 const SkImageInfo& srcInfo, SkMasks* masks, uint32_t bitsPerPixel, | 388 const SkImageInfo& srcInfo, SkMasks* masks, uint32_t bitsPerPixel, |
230 const SkCodec::Options& options) { | 389 const SkCodec::Options& options) { |
231 | 390 |
232 // Choose the appropriate row procedure | 391 // Choose the appropriate row procedure |
233 RowProc proc = nullptr; | 392 RowProc proc = nullptr; |
234 switch (bitsPerPixel) { | 393 switch (bitsPerPixel) { |
235 case 16: | 394 case 16: |
236 switch (dstInfo.colorType()) { | 395 switch (dstInfo.colorType()) { |
237 case kN32_SkColorType: | 396 case kRGBA_8888_SkColorType: |
238 if (kOpaque_SkAlphaType == srcInfo.alphaType()) { | 397 if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
239 proc = &swizzle_mask16_to_n32_opaque; | 398 proc = &swizzle_mask16_to_rgba_opaque; |
240 } else { | 399 } else { |
241 switch (dstInfo.alphaType()) { | 400 switch (dstInfo.alphaType()) { |
242 case kUnpremul_SkAlphaType: | 401 case kUnpremul_SkAlphaType: |
243 proc = &swizzle_mask16_to_n32_unpremul; | 402 proc = &swizzle_mask16_to_rgba_unpremul; |
244 break; | 403 break; |
245 case kPremul_SkAlphaType: | 404 case kPremul_SkAlphaType: |
246 proc = &swizzle_mask16_to_n32_premul; | 405 proc = &swizzle_mask16_to_rgba_premul; |
247 break; | 406 break; |
248 default: | 407 default: |
249 break; | 408 break; |
| 409 } |
| 410 } |
| 411 break; |
| 412 case kBGRA_8888_SkColorType: |
| 413 if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
| 414 proc = &swizzle_mask16_to_bgra_opaque; |
| 415 } else { |
| 416 switch (dstInfo.alphaType()) { |
| 417 case kUnpremul_SkAlphaType: |
| 418 proc = &swizzle_mask16_to_bgra_unpremul; |
| 419 break; |
| 420 case kPremul_SkAlphaType: |
| 421 proc = &swizzle_mask16_to_bgra_premul; |
| 422 break; |
| 423 default: |
| 424 break; |
250 } | 425 } |
251 } | 426 } |
252 break; | 427 break; |
253 case kRGB_565_SkColorType: | 428 case kRGB_565_SkColorType: |
254 proc = &swizzle_mask16_to_565; | 429 proc = &swizzle_mask16_to_565; |
255 break; | 430 break; |
256 default: | 431 default: |
257 break; | 432 break; |
258 } | 433 } |
259 break; | 434 break; |
260 case 24: | 435 case 24: |
261 switch (dstInfo.colorType()) { | 436 switch (dstInfo.colorType()) { |
262 case kN32_SkColorType: | 437 case kRGBA_8888_SkColorType: |
263 if (kOpaque_SkAlphaType == srcInfo.alphaType()) { | 438 if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
264 proc = &swizzle_mask24_to_n32_opaque; | 439 proc = &swizzle_mask24_to_rgba_opaque; |
265 } else { | 440 } else { |
266 switch (dstInfo.alphaType()) { | 441 switch (dstInfo.alphaType()) { |
267 case kUnpremul_SkAlphaType: | 442 case kUnpremul_SkAlphaType: |
268 proc = &swizzle_mask24_to_n32_unpremul; | 443 proc = &swizzle_mask24_to_rgba_unpremul; |
269 break; | 444 break; |
270 case kPremul_SkAlphaType: | 445 case kPremul_SkAlphaType: |
271 proc = &swizzle_mask24_to_n32_premul; | 446 proc = &swizzle_mask24_to_rgba_premul; |
272 break; | 447 break; |
273 default: | 448 default: |
274 break; | 449 break; |
| 450 } |
| 451 } |
| 452 break; |
| 453 case kBGRA_8888_SkColorType: |
| 454 if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
| 455 proc = &swizzle_mask24_to_bgra_opaque; |
| 456 } else { |
| 457 switch (dstInfo.alphaType()) { |
| 458 case kUnpremul_SkAlphaType: |
| 459 proc = &swizzle_mask24_to_bgra_unpremul; |
| 460 break; |
| 461 case kPremul_SkAlphaType: |
| 462 proc = &swizzle_mask24_to_bgra_premul; |
| 463 break; |
| 464 default: |
| 465 break; |
275 } | 466 } |
276 } | 467 } |
277 break; | 468 break; |
278 case kRGB_565_SkColorType: | 469 case kRGB_565_SkColorType: |
279 proc = &swizzle_mask24_to_565; | 470 proc = &swizzle_mask24_to_565; |
280 break; | 471 break; |
281 default: | 472 default: |
282 break; | 473 break; |
283 } | 474 } |
284 break; | 475 break; |
285 case 32: | 476 case 32: |
286 switch (dstInfo.colorType()) { | 477 switch (dstInfo.colorType()) { |
287 case kN32_SkColorType: | 478 case kRGBA_8888_SkColorType: |
288 if (kOpaque_SkAlphaType == srcInfo.alphaType()) { | 479 if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
289 proc = &swizzle_mask32_to_n32_opaque; | 480 proc = &swizzle_mask32_to_rgba_opaque; |
290 } else { | 481 } else { |
291 switch (dstInfo.alphaType()) { | 482 switch (dstInfo.alphaType()) { |
292 case kUnpremul_SkAlphaType: | 483 case kUnpremul_SkAlphaType: |
293 proc = &swizzle_mask32_to_n32_unpremul; | 484 proc = &swizzle_mask32_to_rgba_unpremul; |
294 break; | 485 break; |
295 case kPremul_SkAlphaType: | 486 case kPremul_SkAlphaType: |
296 proc = &swizzle_mask32_to_n32_premul; | 487 proc = &swizzle_mask32_to_rgba_premul; |
297 break; | 488 break; |
298 default: | 489 default: |
299 break; | 490 break; |
| 491 } |
| 492 } |
| 493 break; |
| 494 case kBGRA_8888_SkColorType: |
| 495 if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
| 496 proc = &swizzle_mask32_to_bgra_opaque; |
| 497 } else { |
| 498 switch (dstInfo.alphaType()) { |
| 499 case kUnpremul_SkAlphaType: |
| 500 proc = &swizzle_mask32_to_bgra_unpremul; |
| 501 break; |
| 502 case kPremul_SkAlphaType: |
| 503 proc = &swizzle_mask32_to_bgra_premul; |
| 504 break; |
| 505 default: |
| 506 break; |
300 } | 507 } |
301 } | 508 } |
302 break; | 509 break; |
303 case kRGB_565_SkColorType: | 510 case kRGB_565_SkColorType: |
304 proc = &swizzle_mask32_to_565; | 511 proc = &swizzle_mask32_to_565; |
305 break; | 512 break; |
306 default: | 513 default: |
307 break; | 514 break; |
308 } | 515 } |
309 break; | 516 break; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 | 559 |
353 /* | 560 /* |
354 * | 561 * |
355 * Swizzle the specified row | 562 * Swizzle the specified row |
356 * | 563 * |
357 */ | 564 */ |
358 void SkMaskSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { | 565 void SkMaskSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { |
359 SkASSERT(nullptr != dst && nullptr != src); | 566 SkASSERT(nullptr != dst && nullptr != src); |
360 fRowProc(dst, src, fDstWidth, fMasks, fX0, fSampleX); | 567 fRowProc(dst, src, fDstWidth, fMasks, fX0, fSampleX); |
361 } | 568 } |
OLD | NEW |