LEFT | RIGHT |
(no file at all) | |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkCoreBlitters.h" | 10 #include "SkCoreBlitters.h" |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 | 122 |
123 void SkA8_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) { | 123 void SkA8_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) { |
124 if (fSrcA == 0) { | 124 if (fSrcA == 0) { |
125 return; | 125 return; |
126 } | 126 } |
127 | 127 |
128 if (mask.fFormat == SkMask::kBW_Format) { | 128 if (mask.fFormat == SkMask::kBW_Format) { |
129 if (fSrcA == 0xFF) { | 129 if (fSrcA == 0xFF) { |
130 SkA8_BlitBW(fDevice, mask, clip); | 130 SkA8_BlitBW(fDevice, mask, clip); |
131 } else { | 131 } else { |
132 SkA8_BlendBW(fDevice, mask, clip, fSrcA, | 132 SkA8_BlendBW(fDevice, mask, clip, fSrcA, 256 - fSrcA); |
133 SkAlpha255To256(255 - fSrcA)); | |
134 } | 133 } |
135 return; | 134 return; |
136 } | 135 } |
137 | 136 |
138 int x = clip.fLeft; | 137 int x = clip.fLeft; |
139 int y = clip.fTop; | 138 int y = clip.fTop; |
140 int width = clip.width(); | 139 int width = clip.width(); |
141 int height = clip.height(); | 140 int height = clip.height(); |
142 uint8_t* device = fDevice.getAddr8(x, y); | 141 uint8_t* device = fDevice.getAddr8(x, y); |
143 const uint8_t* alpha = mask.getAddr8(x, y); | 142 const uint8_t* alpha = mask.getAddr8(x, y); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 unsigned sa = SkAlphaMul(fSrcA, SkAlpha255To256(alpha)); | 180 unsigned sa = SkAlphaMul(fSrcA, SkAlpha255To256(alpha)); |
182 uint8_t* device = fDevice.getAddr8(x, y); | 181 uint8_t* device = fDevice.getAddr8(x, y); |
183 int rowBytes = fDevice.rowBytes(); | 182 int rowBytes = fDevice.rowBytes(); |
184 | 183 |
185 if (sa == 0xFF) { | 184 if (sa == 0xFF) { |
186 for (int i = 0; i < height; i++) { | 185 for (int i = 0; i < height; i++) { |
187 *device = SkToU8(sa); | 186 *device = SkToU8(sa); |
188 device += rowBytes; | 187 device += rowBytes; |
189 } | 188 } |
190 } else { | 189 } else { |
191 unsigned scale = 256 - SkAlpha255To256(sa); | 190 unsigned dst_scale = 256 - sa; |
192 | 191 |
193 for (int i = 0; i < height; i++) { | 192 for (int i = 0; i < height; i++) { |
194 *device = SkToU8(sa + SkAlphaMul(*device, scale)); | 193 *device = SkToU8(sa + SkAlphaMul(*device, dst_scale)); |
195 device += rowBytes; | 194 device += rowBytes; |
196 } | 195 } |
197 } | 196 } |
198 } | 197 } |
199 | 198 |
200 void SkA8_Blitter::blitRect(int x, int y, int width, int height) { | 199 void SkA8_Blitter::blitRect(int x, int y, int width, int height) { |
201 SkASSERT(x >= 0 && y >= 0 && | 200 SkASSERT(x >= 0 && y >= 0 && |
202 (unsigned)(x + width) <= (unsigned)fDevice.width() && | 201 (unsigned)(x + width) <= (unsigned)fDevice.width() && |
203 (unsigned)(y + height) <= (unsigned)fDevice.height()); | 202 (unsigned)(y + height) <= (unsigned)fDevice.height()); |
204 | 203 |
205 if (fSrcA == 0) { | 204 if (fSrcA == 0) { |
206 return; | 205 return; |
207 } | 206 } |
208 | 207 |
209 uint8_t* device = fDevice.getAddr8(x, y); | 208 uint8_t* device = fDevice.getAddr8(x, y); |
210 unsigned srcA = fSrcA; | 209 unsigned srcA = fSrcA; |
211 | 210 |
212 if (srcA == 255) { | 211 if (srcA == 255) { |
213 while (--height >= 0) { | 212 while (--height >= 0) { |
214 memset(device, 0xFF, width); | 213 memset(device, 0xFF, width); |
215 device += fDevice.rowBytes(); | 214 device += fDevice.rowBytes(); |
216 } | 215 } |
217 } else { | 216 } else { |
218 unsigned scale = 256 - SkAlpha255To256(srcA); | 217 unsigned scale = 256 - srcA; |
219 | 218 |
220 while (--height >= 0) { | 219 while (--height >= 0) { |
221 for (int i = 0; i < width; i++) { | 220 for (int i = 0; i < width; i++) { |
222 device[i] = SkToU8(srcA + SkAlphaMul(device[i], scale)); | 221 device[i] = SkToU8(srcA + SkAlphaMul(device[i], scale)); |
223 } | 222 } |
224 device += fDevice.rowBytes(); | 223 device += fDevice.rowBytes(); |
225 } | 224 } |
226 } | 225 } |
227 } | 226 } |
228 | 227 |
(...skipping 26 matching lines...) Expand all Loading... |
255 memset(device, 0xFF, width); | 254 memset(device, 0xFF, width); |
256 } else { | 255 } else { |
257 SkPMColor* span = fBuffer; | 256 SkPMColor* span = fBuffer; |
258 | 257 |
259 fShader->shadeSpan(x, y, span, width); | 258 fShader->shadeSpan(x, y, span, width); |
260 if (fXfermode) { | 259 if (fXfermode) { |
261 fXfermode->xferA8(device, span, width, NULL); | 260 fXfermode->xferA8(device, span, width, NULL); |
262 } else { | 261 } else { |
263 for (int i = width - 1; i >= 0; --i) { | 262 for (int i = width - 1; i >= 0; --i) { |
264 unsigned srcA = SkGetPackedA32(span[i]); | 263 unsigned srcA = SkGetPackedA32(span[i]); |
265 unsigned scale = 256 - SkAlpha255To256(srcA); | 264 unsigned scale = 256 - srcA; |
266 | 265 |
267 device[i] = SkToU8(srcA + SkAlphaMul(device[i], scale)); | 266 device[i] = SkToU8(srcA + SkAlphaMul(device[i], scale)); |
268 } | 267 } |
269 } | 268 } |
270 } | 269 } |
271 } | 270 } |
272 | 271 |
273 static inline uint8_t aa_blend8(SkPMColor src, U8CPU da, int aa) { | 272 static inline uint8_t aa_blend8(SkPMColor src, U8CPU da, int aa) { |
274 SkASSERT((unsigned)aa <= 255); | 273 SkASSERT((unsigned)aa <= 255); |
275 | 274 |
| 275 int sa = SkGetPackedA32(src); |
276 int src_scale = SkAlpha255To256(aa); | 276 int src_scale = SkAlpha255To256(aa); |
277 int sa = SkGetPackedA32(src); | |
278 int dst_scale = 256 - SkAlphaMul(sa, src_scale); | 277 int dst_scale = 256 - SkAlphaMul(sa, src_scale); |
279 | 278 |
280 return SkToU8((sa * src_scale + da * dst_scale) >> 8); | 279 return SkToU8(SkAlphaMul(sa, src_scale) + SkAlphaMul(da, dst_scale)); |
281 } | 280 } |
282 | 281 |
283 void SkA8_Shader_Blitter::blitAntiH(int x, int y, const SkAlpha antialias[], | 282 void SkA8_Shader_Blitter::blitAntiH(int x, int y, const SkAlpha antialias[], |
284 const int16_t runs[]) { | 283 const int16_t runs[]) { |
285 SkShader* shader = fShader; | 284 SkShader* shader = fShader; |
286 SkXfermode* mode = fXfermode; | 285 SkXfermode* mode = fXfermode; |
287 uint8_t* aaExpand = fAAExpand; | 286 uint8_t* aaExpand = fAAExpand; |
288 SkPMColor* span = fBuffer; | 287 SkPMColor* span = fBuffer; |
289 uint8_t* device = fDevice.getAddr8(x, y); | 288 uint8_t* device = fDevice.getAddr8(x, y); |
290 int opaque = fShader->getFlags() & SkShader::kOpaqueAlpha_Flag; | 289 int opaque = fShader->getFlags() & SkShader::kOpaqueAlpha_Flag; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 if (fXfermode) { | 336 if (fXfermode) { |
338 fXfermode->xferA8(device, span, width, alpha); | 337 fXfermode->xferA8(device, span, width, alpha); |
339 } | 338 } |
340 | 339 |
341 y += 1; | 340 y += 1; |
342 device += fDevice.rowBytes(); | 341 device += fDevice.rowBytes(); |
343 alpha += mask.fRowBytes; | 342 alpha += mask.fRowBytes; |
344 } | 343 } |
345 } | 344 } |
346 | 345 |
LEFT | RIGHT |