OLD | NEW |
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 #ifndef SkColorPriv_DEFINED | 10 #ifndef SkColorPriv_DEFINED |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 U8CPU srcWeight) { | 266 U8CPU srcWeight) { |
267 unsigned scale = SkAlpha255To256(srcWeight); | 267 unsigned scale = SkAlpha255To256(srcWeight); |
268 return SkFourByteInterp256(src, dst, scale); | 268 return SkFourByteInterp256(src, dst, scale); |
269 } | 269 } |
270 | 270 |
271 /** | 271 /** |
272 * 32b optimized version; currently appears to be 10% faster even on 64b | 272 * 32b optimized version; currently appears to be 10% faster even on 64b |
273 * architectures than an equivalent 64b version and 30% faster than | 273 * architectures than an equivalent 64b version and 30% faster than |
274 * SkFourByteInterp(). Third parameter controls blending of the first two: | 274 * SkFourByteInterp(). Third parameter controls blending of the first two: |
275 * (src, dst, 0) returns dst | 275 * (src, dst, 0) returns dst |
276 * (src, dst, 0xFF) returns src | 276 * (src, dst, 256) returns src |
277 * ** Does not match the results of SkFourByteInterp() because we use | 277 * ** Does not match the results of SkFourByteInterp256() because we use |
278 * a more accurate scale computation! | 278 * a more accurate scale computation! |
279 * TODO: migrate Skia function to using an accurate 255->266 alpha | 279 * TODO: migrate Skia function to using an accurate 255->266 alpha |
280 * conversion. | 280 * conversion. |
281 */ | 281 */ |
282 static inline SkPMColor SkFastFourByteInterp(SkPMColor src, | 282 static inline SkPMColor SkFastFourByteInterp256(SkPMColor src, |
283 SkPMColor dst, | 283 SkPMColor dst, |
284 U8CPU srcWeight) { | 284 unsigned scale) { |
285 SkASSERT(srcWeight < 256); | 285 SkASSERT(scale <= 256); |
286 | 286 |
287 // Reorders ARGB to AG-RB in order to reduce the number of operations. | 287 // Reorders ARGB to AG-RB in order to reduce the number of operations. |
288 const uint32_t mask = 0xFF00FF; | 288 const uint32_t mask = 0xFF00FF; |
289 uint32_t src_rb = src & mask; | 289 uint32_t src_rb = src & mask; |
290 uint32_t src_ag = (src >> 8) & mask; | 290 uint32_t src_ag = (src >> 8) & mask; |
291 uint32_t dst_rb = dst & mask; | 291 uint32_t dst_rb = dst & mask; |
292 uint32_t dst_ag = (dst >> 8) & mask; | 292 uint32_t dst_ag = (dst >> 8) & mask; |
293 | 293 |
294 // scale = srcWeight + (srcWeight >> 7) is more accurate than | |
295 // scale = srcWeight + 1, but 7% slower | |
296 int scale = srcWeight + (srcWeight >> 7); | |
297 | |
298 uint32_t ret_rb = src_rb * scale + (256 - scale) * dst_rb; | 294 uint32_t ret_rb = src_rb * scale + (256 - scale) * dst_rb; |
299 uint32_t ret_ag = src_ag * scale + (256 - scale) * dst_ag; | 295 uint32_t ret_ag = src_ag * scale + (256 - scale) * dst_ag; |
300 | 296 |
301 return (ret_ag & ~mask) | ((ret_rb & ~mask) >> 8); | 297 return (ret_ag & ~mask) | ((ret_rb & ~mask) >> 8); |
302 } | 298 } |
303 | 299 |
| 300 static inline SkPMColor SkFastFourByteInterp(SkPMColor src, |
| 301 SkPMColor dst, |
| 302 U8CPU srcWeight) { |
| 303 SkASSERT(srcWeight <= 255); |
| 304 // scale = srcWeight + (srcWeight >> 7) is more accurate than |
| 305 // scale = srcWeight + 1, but 7% slower |
| 306 return SkFastFourByteInterp256(src, dst, srcWeight + (srcWeight >> 7)); |
| 307 } |
| 308 |
304 /** | 309 /** |
305 * Same as SkPackARGB32, but this version guarantees to not check that the | 310 * Same as SkPackARGB32, but this version guarantees to not check that the |
306 * values are premultiplied in the debug version. | 311 * values are premultiplied in the debug version. |
307 */ | 312 */ |
308 static inline SkPMColor SkPackARGB32NoCheck(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
{ | 313 static inline SkPMColor SkPackARGB32NoCheck(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
{ |
309 return (a << SK_A32_SHIFT) | (r << SK_R32_SHIFT) | | 314 return (a << SK_A32_SHIFT) | (r << SK_R32_SHIFT) | |
310 (g << SK_G32_SHIFT) | (b << SK_B32_SHIFT); | 315 (g << SK_G32_SHIFT) | (b << SK_B32_SHIFT); |
311 } | 316 } |
312 | 317 |
313 static inline | 318 static inline |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 int srcG = SkColorGetG(color); | 859 int srcG = SkColorGetG(color); |
855 int srcB = SkColorGetB(color); | 860 int srcB = SkColorGetB(color); |
856 | 861 |
857 for (int i = 0; i < width; i++) { | 862 for (int i = 0; i < width; i++) { |
858 dst[i] = SkBlendLCD16Opaque(srcR, srcG, srcB, dst[i], src[i], | 863 dst[i] = SkBlendLCD16Opaque(srcR, srcG, srcB, dst[i], src[i], |
859 opaqueDst); | 864 opaqueDst); |
860 } | 865 } |
861 } | 866 } |
862 | 867 |
863 #endif | 868 #endif |
OLD | NEW |