| OLD | NEW |
| 1 #include "SkBitmapProcState.h" | 1 #include "SkBitmapProcState.h" |
| 2 #include "SkColorPriv.h" | 2 #include "SkColorPriv.h" |
| 3 #include "SkFilterProc.h" | 3 #include "SkFilterProc.h" |
| 4 #include "SkPaint.h" | 4 #include "SkPaint.h" |
| 5 #include "SkShader.h" // for tilemodes | 5 #include "SkShader.h" // for tilemodes |
| 6 | 6 |
| 7 #ifdef SK_CPU_BENDIAN | 7 #ifdef SK_CPU_BENDIAN |
| 8 #define UNPACK_PRIMARY_SHORT(packed) ((uint32_t)(packed) >> 16) | 8 #define UNPACK_PRIMARY_SHORT(packed) ((uint32_t)(packed) >> 16) |
| 9 #define UNPACK_SECONDARY_SHORT(packed) ((packed) & 0xFFFF) | 9 #define UNPACK_SECONDARY_SHORT(packed) ((packed) & 0xFFFF) |
| 10 #else | 10 #else |
| 11 #define UNPACK_PRIMARY_SHORT(packed) ((packed) & 0xFFFF) | 11 #define UNPACK_PRIMARY_SHORT(packed) ((packed) & 0xFFFF) |
| 12 #define UNPACK_SECONDARY_SHORT(packed) ((uint32_t)(packed) >> 16) | 12 #define UNPACK_SECONDARY_SHORT(packed) ((uint32_t)(packed) >> 16) |
| 13 #endif | 13 #endif |
| 14 | 14 |
| 15 static inline SkPMColor Filter_32(unsigned x, unsigned y, | 15 static inline SkPMColor Filter_32(unsigned x, unsigned y, |
| 16 SkPMColor a00, SkPMColor a01, | 16 SkPMColor a00, SkPMColor a01, |
| 17 SkPMColor a10, SkPMColor a11) { | 17 SkPMColor a10, SkPMColor a11) { |
| 18 SkASSERT((unsigned)x <= 0xF); | 18 SkASSERT((unsigned)x <= 0xF); |
| 19 SkASSERT((unsigned)y <= 0xF); | 19 SkASSERT((unsigned)y <= 0xF); |
| 20 | 20 |
| 21 int xy = x * y; | 21 int xy = x * y; |
| 22 uint32_t mask = gMask_00FF00FF; //0xFF00FF; | 22 uint32_t mask = gMask_00FF00FF; //0xFF00FF; |
| 23 | 23 |
| 24 int scale = 256 - 16*y - 16*x + xy; | 24 int scale = 256 - 16*y - 16*x + xy; |
| 25 uint32_t lo = (a00 & mask) * scale; | 25 uint32_t lo = (a00 & mask) * scale; |
| 26 uint32_t hi = ((a00 >> 8) & mask) * scale; | 26 uint32_t hi = ((a00 >> 8) & mask) * scale; |
| 27 | 27 |
| 28 scale = 16*x - xy; | 28 scale = 16*x - xy; |
| 29 lo += (a01 & mask) * scale; | 29 lo += (a01 & mask) * scale; |
| 30 hi += ((a01 >> 8) & mask) * scale; | 30 hi += ((a01 >> 8) & mask) * scale; |
| 31 | 31 |
| 32 scale = 16*y - xy; | 32 scale = 16*y - xy; |
| 33 lo += (a10 & mask) * scale; | 33 lo += (a10 & mask) * scale; |
| 34 hi += ((a10 >> 8) & mask) * scale; | 34 hi += ((a10 >> 8) & mask) * scale; |
| 35 | 35 |
| 36 lo += (a11 & mask) * xy; | 36 lo += (a11 & mask) * xy; |
| 37 hi += ((a11 >> 8) & mask) * xy; | 37 hi += ((a11 >> 8) & mask) * xy; |
| 38 | 38 |
| 39 return ((lo >> 8) & mask) | (hi & ~mask); | 39 return ((lo >> 8) & mask) | (hi & ~mask); |
| 40 } | 40 } |
| 41 | 41 |
| 42 // returns expanded * 5bits | 42 // returns expanded * 5bits |
| 43 static inline uint32_t Filter_565_Expanded(unsigned x, unsigned y, | 43 static inline uint32_t Filter_565_Expanded(unsigned x, unsigned y, |
| 44 uint32_t a00, uint32_t a01, | 44 uint32_t a00, uint32_t a01, |
| 45 uint32_t a10, uint32_t a11) { | 45 uint32_t a10, uint32_t a11) { |
| 46 SkASSERT((unsigned)x <= 0xF); | 46 SkASSERT((unsigned)x <= 0xF); |
| 47 SkASSERT((unsigned)y <= 0xF); | 47 SkASSERT((unsigned)y <= 0xF); |
| 48 | 48 |
| 49 a00 = SkExpand_rgb_16(a00); | 49 a00 = SkExpand_rgb_16(a00); |
| 50 a01 = SkExpand_rgb_16(a01); | 50 a01 = SkExpand_rgb_16(a01); |
| 51 a10 = SkExpand_rgb_16(a10); | 51 a10 = SkExpand_rgb_16(a10); |
| 52 a11 = SkExpand_rgb_16(a11); | 52 a11 = SkExpand_rgb_16(a11); |
| 53 | 53 |
| 54 int xy = x * y >> 3; | 54 int xy = x * y >> 3; |
| 55 return a00 * (32 - 2*y - 2*x + xy) + | 55 return a00 * (32 - 2*y - 2*x + xy) + |
| 56 a01 * (2*x - xy) + | 56 a01 * (2*x - xy) + |
| 57 a10 * (2*y - xy) + | 57 a10 * (2*y - xy) + |
| 58 a11 * xy; | 58 a11 * xy; |
| 59 } | 59 } |
| 60 | 60 |
| 61 // turn an expanded 565 * 5bits into SkPMColor | 61 // turn an expanded 565 * 5bits into SkPMColor |
| 62 // g:11 | r:10 | x:1 | b:10 | 62 // g:11 | r:10 | x:1 | b:10 |
| 63 static inline SkPMColor SkExpanded_565_To_PMColor(uint32_t c) { | 63 static inline SkPMColor SkExpanded_565_To_PMColor(uint32_t c) { |
| 64 unsigned r = (c >> 13) & 0xFF; | 64 unsigned r = (c >> 13) & 0xFF; |
| 65 unsigned g = (c >> 24); | 65 unsigned g = (c >> 24); |
| 66 unsigned b = (c >> 2) & 0xFF; | 66 unsigned b = (c >> 2) & 0xFF; |
| 67 return SkPackARGB32(0xFF, r, g, b); | 67 return SkPackARGB32(0xFF, r, g, b); |
| 68 } | 68 } |
| 69 | 69 |
| 70 // returns answer in SkPMColor format | 70 // returns answer in SkPMColor format |
| 71 static inline SkPMColor Filter_4444_D32(unsigned x, unsigned y, | 71 static inline SkPMColor Filter_4444_D32(unsigned x, unsigned y, |
| 72 uint32_t a00, uint32_t a01, | 72 uint32_t a00, uint32_t a01, |
| 73 uint32_t a10, uint32_t a11) { | 73 uint32_t a10, uint32_t a11) { |
| 74 SkASSERT((unsigned)x <= 0xF); | 74 SkASSERT((unsigned)x <= 0xF); |
| 75 SkASSERT((unsigned)y <= 0xF); | 75 SkASSERT((unsigned)y <= 0xF); |
| 76 | 76 |
| 77 a00 = SkExpand_4444(a00); | 77 a00 = SkExpand_4444(a00); |
| 78 a01 = SkExpand_4444(a01); | 78 a01 = SkExpand_4444(a01); |
| 79 a10 = SkExpand_4444(a10); | 79 a10 = SkExpand_4444(a10); |
| 80 a11 = SkExpand_4444(a11); | 80 a11 = SkExpand_4444(a11); |
| 81 | 81 |
| 82 int xy = x * y >> 4; | 82 int xy = x * y >> 4; |
| 83 uint32_t result = a00 * (16 - y - x + xy) + | 83 uint32_t result = a00 * (16 - y - x + xy) + |
| 84 a01 * (x - xy) + | 84 a01 * (x - xy) + |
| 85 a10 * (y - xy) + | 85 a10 * (y - xy) + |
| 86 a11 * xy; | 86 a11 * xy; |
| 87 | 87 |
| 88 return SkCompact_8888(result); | 88 return SkCompact_8888(result); |
| 89 } | 89 } |
| 90 | 90 |
| 91 static inline U8CPU Filter_8(unsigned x, unsigned y, | 91 static inline U8CPU Filter_8(unsigned x, unsigned y, |
| 92 U8CPU a00, U8CPU a01, | 92 U8CPU a00, U8CPU a01, |
| 93 U8CPU a10, U8CPU a11) { | 93 U8CPU a10, U8CPU a11) { |
| 94 SkASSERT((unsigned)x <= 0xF); | 94 SkASSERT((unsigned)x <= 0xF); |
| 95 SkASSERT((unsigned)y <= 0xF); | 95 SkASSERT((unsigned)y <= 0xF); |
| 96 | 96 |
| 97 int xy = x * y; | 97 int xy = x * y; |
| 98 unsigned result = a00 * (256 - 16*y - 16*x + xy) + | 98 unsigned result = a00 * (256 - 16*y - 16*x + xy) + |
| 99 a01 * (16*x - xy) + | 99 a01 * (16*x - xy) + |
| 100 a10 * (16*y - xy) + | 100 a10 * (16*y - xy) + |
| 101 a11 * xy; | 101 a11 * xy; |
| 102 | 102 |
| 103 return result >> 8; | 103 return result >> 8; |
| 104 } | 104 } |
| 105 | 105 |
| 106 /***************************************************************************** | 106 /***************************************************************************** |
| 107 * | 107 * |
| 108 * D32 functions | 108 * D32 functions |
| 109 * | 109 * |
| 110 */ | 110 */ |
| 111 | 111 |
| 112 // SRC == 8888 | 112 // SRC == 8888 |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 if (SkShader::kClamp_TileMode == fTileModeX && | 334 if (SkShader::kClamp_TileMode == fTileModeX && |
| 335 SkShader::kClamp_TileMode == fTileModeY) { | 335 SkShader::kClamp_TileMode == fTileModeY) { |
| 336 m = &inv; | 336 m = &inv; |
| 337 clamp_clamp = true; | 337 clamp_clamp = true; |
| 338 } else { | 338 } else { |
| 339 fUnitInvMatrix = inv; | 339 fUnitInvMatrix = inv; |
| 340 fUnitInvMatrix.postIDiv(fOrigBitmap.width(), fOrigBitmap.height()); | 340 fUnitInvMatrix.postIDiv(fOrigBitmap.width(), fOrigBitmap.height()); |
| 341 m = &fUnitInvMatrix; | 341 m = &fUnitInvMatrix; |
| 342 clamp_clamp = false; | 342 clamp_clamp = false; |
| 343 } | 343 } |
| 344 | 344 |
| 345 fBitmap = &fOrigBitmap; | 345 fBitmap = &fOrigBitmap; |
| 346 if (fOrigBitmap.hasMipMap()) { | 346 if (fOrigBitmap.hasMipMap()) { |
| 347 int shift = fOrigBitmap.extractMipLevel(&fMipBitmap, | 347 int shift = fOrigBitmap.extractMipLevel(&fMipBitmap, |
| 348 SkScalarToFixed(m->getScaleX()), | 348 SkScalarToFixed(m->getScaleX()), |
| 349 SkScalarToFixed(m->getSkewY())); | 349 SkScalarToFixed(m->getSkewY())); |
| 350 | 350 |
| 351 if (shift > 0) { | 351 if (shift > 0) { |
| 352 if (m != &fUnitInvMatrix) { | 352 if (m != &fUnitInvMatrix) { |
| 353 fUnitInvMatrix = *m; | 353 fUnitInvMatrix = *m; |
| 354 m = &fUnitInvMatrix; | 354 m = &fUnitInvMatrix; |
| 355 } | 355 } |
| 356 | 356 |
| 357 SkScalar scale = SkFixedToScalar(SK_Fixed1 >> shift); | 357 SkScalar scale = SkFixedToScalar(SK_Fixed1 >> shift); |
| 358 fUnitInvMatrix.postScale(scale, scale); | 358 fUnitInvMatrix.postScale(scale, scale); |
| 359 | 359 |
| 360 // now point here instead of fOrigBitmap | 360 // now point here instead of fOrigBitmap |
| 361 fBitmap = &fMipBitmap; | 361 fBitmap = &fMipBitmap; |
| 362 } | 362 } |
| 363 } | 363 } |
| 364 | 364 |
| 365 fInvMatrix = m; | 365 fInvMatrix = m; |
| 366 fInvProc = m->getMapXYProc(); | 366 fInvProc = m->getMapXYProc(); |
| 367 fInvType = m->getType(); | 367 fInvType = m->getType(); |
| 368 fInvSx = SkScalarToFixed(m->getScaleX()); | 368 fInvSx = SkScalarToFixed(m->getScaleX()); |
| 369 fInvSy = SkScalarToFixed(m->getScaleY()); | 369 fInvSy = SkScalarToFixed(m->getScaleY()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 384 fShaderProc16 = NULL; | 384 fShaderProc16 = NULL; |
| 385 fSampleProc32 = NULL; | 385 fSampleProc32 = NULL; |
| 386 fSampleProc16 = NULL; | 386 fSampleProc16 = NULL; |
| 387 | 387 |
| 388 fMatrixProc = this->chooseMatrixProc(); | 388 fMatrixProc = this->chooseMatrixProc(); |
| 389 if (NULL == fMatrixProc) { | 389 if (NULL == fMatrixProc) { |
| 390 return false; | 390 return false; |
| 391 } | 391 } |
| 392 | 392 |
| 393 /////////////////////////////////////////////////////////////////////// | 393 /////////////////////////////////////////////////////////////////////// |
| 394 | 394 |
| 395 int index = 0; | 395 int index = 0; |
| 396 if (fAlphaScale < 256) { // note: this distinction is not used for D16 | 396 if (fAlphaScale < 256) { // note: this distinction is not used for D16 |
| 397 index |= 1; | 397 index |= 1; |
| 398 } | 398 } |
| 399 if (fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) { | 399 if (fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) { |
| 400 index |= 2; | 400 index |= 2; |
| 401 } | 401 } |
| 402 if (fDoFilter) { | 402 if (fDoFilter) { |
| 403 index |= 4; | 403 index |= 4; |
| 404 } | 404 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 426 | 426 |
| 427 static const SampleProc32 gSample32[] = { | 427 static const SampleProc32 gSample32[] = { |
| 428 S32_opaque_D32_nofilter_DXDY, | 428 S32_opaque_D32_nofilter_DXDY, |
| 429 S32_alpha_D32_nofilter_DXDY, | 429 S32_alpha_D32_nofilter_DXDY, |
| 430 S32_opaque_D32_nofilter_DX, | 430 S32_opaque_D32_nofilter_DX, |
| 431 S32_alpha_D32_nofilter_DX, | 431 S32_alpha_D32_nofilter_DX, |
| 432 S32_opaque_D32_filter_DXDY, | 432 S32_opaque_D32_filter_DXDY, |
| 433 S32_alpha_D32_filter_DXDY, | 433 S32_alpha_D32_filter_DXDY, |
| 434 S32_opaque_D32_filter_DX, | 434 S32_opaque_D32_filter_DX, |
| 435 S32_alpha_D32_filter_DX, | 435 S32_alpha_D32_filter_DX, |
| 436 | 436 |
| 437 S16_opaque_D32_nofilter_DXDY, | 437 S16_opaque_D32_nofilter_DXDY, |
| 438 S16_alpha_D32_nofilter_DXDY, | 438 S16_alpha_D32_nofilter_DXDY, |
| 439 S16_opaque_D32_nofilter_DX, | 439 S16_opaque_D32_nofilter_DX, |
| 440 S16_alpha_D32_nofilter_DX, | 440 S16_alpha_D32_nofilter_DX, |
| 441 S16_opaque_D32_filter_DXDY, | 441 S16_opaque_D32_filter_DXDY, |
| 442 S16_alpha_D32_filter_DXDY, | 442 S16_alpha_D32_filter_DXDY, |
| 443 S16_opaque_D32_filter_DX, | 443 S16_opaque_D32_filter_DX, |
| 444 S16_alpha_D32_filter_DX, | 444 S16_alpha_D32_filter_DX, |
| 445 | 445 |
| 446 SI8_opaque_D32_nofilter_DXDY, | 446 SI8_opaque_D32_nofilter_DXDY, |
| 447 SI8_alpha_D32_nofilter_DXDY, | 447 SI8_alpha_D32_nofilter_DXDY, |
| 448 SI8_opaque_D32_nofilter_DX, | 448 SI8_opaque_D32_nofilter_DX, |
| 449 SI8_alpha_D32_nofilter_DX, | 449 SI8_alpha_D32_nofilter_DX, |
| 450 SI8_opaque_D32_filter_DXDY, | 450 SI8_opaque_D32_filter_DXDY, |
| 451 SI8_alpha_D32_filter_DXDY, | 451 SI8_alpha_D32_filter_DXDY, |
| 452 SI8_opaque_D32_filter_DX, | 452 SI8_opaque_D32_filter_DX, |
| 453 SI8_alpha_D32_filter_DX, | 453 SI8_alpha_D32_filter_DX, |
| 454 | 454 |
| 455 S4444_opaque_D32_nofilter_DXDY, | 455 S4444_opaque_D32_nofilter_DXDY, |
| 456 S4444_alpha_D32_nofilter_DXDY, | 456 S4444_alpha_D32_nofilter_DXDY, |
| 457 S4444_opaque_D32_nofilter_DX, | 457 S4444_opaque_D32_nofilter_DX, |
| 458 S4444_alpha_D32_nofilter_DX, | 458 S4444_alpha_D32_nofilter_DX, |
| 459 S4444_opaque_D32_filter_DXDY, | 459 S4444_opaque_D32_filter_DXDY, |
| 460 S4444_alpha_D32_filter_DXDY, | 460 S4444_alpha_D32_filter_DXDY, |
| 461 S4444_opaque_D32_filter_DX, | 461 S4444_opaque_D32_filter_DX, |
| 462 S4444_alpha_D32_filter_DX, | 462 S4444_alpha_D32_filter_DX, |
| 463 | 463 |
| 464 // A8 treats alpha/opauqe the same (equally efficient) | 464 // A8 treats alpha/opauqe the same (equally efficient) |
| 465 SA8_alpha_D32_nofilter_DXDY, | 465 SA8_alpha_D32_nofilter_DXDY, |
| 466 SA8_alpha_D32_nofilter_DXDY, | 466 SA8_alpha_D32_nofilter_DXDY, |
| 467 SA8_alpha_D32_nofilter_DX, | 467 SA8_alpha_D32_nofilter_DX, |
| 468 SA8_alpha_D32_nofilter_DX, | 468 SA8_alpha_D32_nofilter_DX, |
| 469 SA8_alpha_D32_filter_DXDY, | 469 SA8_alpha_D32_filter_DXDY, |
| 470 SA8_alpha_D32_filter_DXDY, | 470 SA8_alpha_D32_filter_DXDY, |
| 471 SA8_alpha_D32_filter_DX, | 471 SA8_alpha_D32_filter_DX, |
| 472 SA8_alpha_D32_filter_DX | 472 SA8_alpha_D32_filter_DX |
| 473 }; | 473 }; |
| 474 | 474 |
| 475 static const SampleProc16 gSample16[] = { | 475 static const SampleProc16 gSample16[] = { |
| 476 S32_D16_nofilter_DXDY, | 476 S32_D16_nofilter_DXDY, |
| 477 S32_D16_nofilter_DX, | 477 S32_D16_nofilter_DX, |
| 478 S32_D16_filter_DXDY, | 478 S32_D16_filter_DXDY, |
| 479 S32_D16_filter_DX, | 479 S32_D16_filter_DX, |
| 480 | 480 |
| 481 S16_D16_nofilter_DXDY, | 481 S16_D16_nofilter_DXDY, |
| 482 S16_D16_nofilter_DX, | 482 S16_D16_nofilter_DX, |
| 483 S16_D16_filter_DXDY, | 483 S16_D16_filter_DXDY, |
| 484 S16_D16_filter_DX, | 484 S16_D16_filter_DX, |
| 485 | 485 |
| 486 SI8_D16_nofilter_DXDY, | 486 SI8_D16_nofilter_DXDY, |
| 487 SI8_D16_nofilter_DX, | 487 SI8_D16_nofilter_DX, |
| 488 SI8_D16_filter_DXDY, | 488 SI8_D16_filter_DXDY, |
| 489 SI8_D16_filter_DX, | 489 SI8_D16_filter_DX, |
| 490 | 490 |
| 491 // Don't support 4444 -> 565 | 491 // Don't support 4444 -> 565 |
| 492 NULL, NULL, NULL, NULL, | 492 NULL, NULL, NULL, NULL, |
| 493 // Don't support A8 -> 565 | 493 // Don't support A8 -> 565 |
| 494 NULL, NULL, NULL, NULL | 494 NULL, NULL, NULL, NULL |
| 495 }; | 495 }; |
| 496 | 496 |
| 497 fSampleProc32 = gSample32[index]; | 497 fSampleProc32 = gSample32[index]; |
| 498 index >>= 1; // shift away any opaque/alpha distinction | 498 index >>= 1; // shift away any opaque/alpha distinction |
| 499 fSampleProc16 = gSample16[index]; | 499 fSampleProc16 = gSample16[index]; |
| 500 | 500 |
| 501 // our special-case shaderprocs | 501 // our special-case shaderprocs |
| 502 if (S16_D16_filter_DX == fSampleProc16) { | 502 if (S16_D16_filter_DX == fSampleProc16) { |
| 503 if (clamp_clamp) { | 503 if (clamp_clamp) { |
| 504 fShaderProc16 = Clamp_S16_D16_filter_DX_shaderproc; | 504 fShaderProc16 = Clamp_S16_D16_filter_DX_shaderproc; |
| 505 } else if (SkShader::kRepeat_TileMode == fTileModeX && | 505 } else if (SkShader::kRepeat_TileMode == fTileModeX && |
| 506 SkShader::kRepeat_TileMode == fTileModeY) { | 506 SkShader::kRepeat_TileMode == fTileModeY) { |
| 507 fShaderProc16 = Repeat_S16_D16_filter_DX_shaderproc; | 507 fShaderProc16 = Repeat_S16_D16_filter_DX_shaderproc; |
| 508 } | 508 } |
| 509 } | 509 } |
| 510 return true; | 510 return true; |
| 511 } | 511 } |
| 512 | 512 |
| OLD | NEW |