OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkBitmapCache.h" | 8 #include "SkBitmapCache.h" |
9 #include "SkBitmapProcState.h" | 9 #include "SkBitmapProcState.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 if (SkPaint::kLow_FilterLevel == fFilterLevel) { | 450 if (SkPaint::kLow_FilterLevel == fFilterLevel) { |
451 // Only try bilerp if the matrix is "interesting" and | 451 // Only try bilerp if the matrix is "interesting" and |
452 // the image has a suitable size. | 452 // the image has a suitable size. |
453 | 453 |
454 if (fInvType <= SkMatrix::kTranslate_Mask || | 454 if (fInvType <= SkMatrix::kTranslate_Mask || |
455 !valid_for_filtering(fBitmap->width() | fBitmap->height())) { | 455 !valid_for_filtering(fBitmap->width() | fBitmap->height())) { |
456 fFilterLevel = SkPaint::kNone_FilterLevel; | 456 fFilterLevel = SkPaint::kNone_FilterLevel; |
457 } | 457 } |
458 } | 458 } |
459 | 459 |
460 // At this point, we know exactly what kind of sampling the per-scanline | 460 return this->chooseScanlineProcs(trivialMatrix, clampClamp, paint); |
461 // shader will perform. | 461 } |
462 | 462 |
| 463 bool SkBitmapProcState::chooseScanlineProcs(bool trivialMatrix, bool clampClamp, |
| 464 const SkPaint& paint) { |
463 fMatrixProc = this->chooseMatrixProc(trivialMatrix); | 465 fMatrixProc = this->chooseMatrixProc(trivialMatrix); |
464 // TODO(dominikg): SkASSERT(fMatrixProc) instead? chooseMatrixProc never ret
urns NULL. | 466 // TODO(dominikg): SkASSERT(fMatrixProc) instead? chooseMatrixProc never ret
urns NULL. |
465 if (NULL == fMatrixProc) { | 467 if (NULL == fMatrixProc) { |
466 return false; | 468 return false; |
467 } | 469 } |
468 | 470 |
469 /////////////////////////////////////////////////////////////////////// | 471 /////////////////////////////////////////////////////////////////////// |
470 | 472 |
471 const SkAlphaType at = fBitmap->alphaType(); | 473 const SkAlphaType at = fBitmap->alphaType(); |
472 | 474 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 break; | 513 break; |
512 case kAlpha_8_SkColorType: | 514 case kAlpha_8_SkColorType: |
513 index |= 32; | 515 index |= 32; |
514 fPaintPMColor = SkPreMultiplyColor(paint.getColor()); | 516 fPaintPMColor = SkPreMultiplyColor(paint.getColor()); |
515 break; | 517 break; |
516 default: | 518 default: |
517 // TODO(dominikg): Should we ever get here? SkASSERT(false) inst
ead? | 519 // TODO(dominikg): Should we ever get here? SkASSERT(false) inst
ead? |
518 return false; | 520 return false; |
519 } | 521 } |
520 | 522 |
521 #if !SK_ARM_NEON_IS_ALWAYS | 523 #if !SK_ARM_NEON_IS_ALWAYS |
522 static const SampleProc32 gSkBitmapProcStateSample32[] = { | 524 static const SampleProc32 gSkBitmapProcStateSample32[] = { |
523 S32_opaque_D32_nofilter_DXDY, | 525 S32_opaque_D32_nofilter_DXDY, |
524 S32_alpha_D32_nofilter_DXDY, | 526 S32_alpha_D32_nofilter_DXDY, |
525 S32_opaque_D32_nofilter_DX, | 527 S32_opaque_D32_nofilter_DX, |
526 S32_alpha_D32_nofilter_DX, | 528 S32_alpha_D32_nofilter_DX, |
527 S32_opaque_D32_filter_DXDY, | 529 S32_opaque_D32_filter_DXDY, |
528 S32_alpha_D32_filter_DXDY, | 530 S32_alpha_D32_filter_DXDY, |
529 S32_opaque_D32_filter_DX, | 531 S32_opaque_D32_filter_DX, |
530 S32_alpha_D32_filter_DX, | 532 S32_alpha_D32_filter_DX, |
531 | 533 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 SI8_D16_nofilter_DXDY, | 583 SI8_D16_nofilter_DXDY, |
582 SI8_D16_nofilter_DX, | 584 SI8_D16_nofilter_DX, |
583 SI8_D16_filter_DXDY, | 585 SI8_D16_filter_DXDY, |
584 SI8_D16_filter_DX, | 586 SI8_D16_filter_DX, |
585 | 587 |
586 // Don't support 4444 -> 565 | 588 // Don't support 4444 -> 565 |
587 NULL, NULL, NULL, NULL, | 589 NULL, NULL, NULL, NULL, |
588 // Don't support A8 -> 565 | 590 // Don't support A8 -> 565 |
589 NULL, NULL, NULL, NULL | 591 NULL, NULL, NULL, NULL |
590 }; | 592 }; |
591 #endif | 593 #endif |
592 | 594 |
593 fSampleProc32 = SK_ARM_NEON_WRAP(gSkBitmapProcStateSample32)[index]; | 595 fSampleProc32 = SK_ARM_NEON_WRAP(gSkBitmapProcStateSample32)[index]; |
594 index >>= 1; // shift away any opaque/alpha distinction | 596 index >>= 1; // shift away any opaque/alpha distinction |
595 fSampleProc16 = SK_ARM_NEON_WRAP(gSkBitmapProcStateSample16)[index]; | 597 fSampleProc16 = SK_ARM_NEON_WRAP(gSkBitmapProcStateSample16)[index]; |
596 | 598 |
597 // our special-case shaderprocs | 599 // our special-case shaderprocs |
598 if (SK_ARM_NEON_WRAP(S16_D16_filter_DX) == fSampleProc16) { | 600 if (SK_ARM_NEON_WRAP(S16_D16_filter_DX) == fSampleProc16) { |
599 if (clampClamp) { | 601 if (clampClamp) { |
600 fShaderProc16 = SK_ARM_NEON_WRAP(Clamp_S16_D16_filter_DX_shaderp
roc); | 602 fShaderProc16 = SK_ARM_NEON_WRAP(Clamp_S16_D16_filter_DX_shaderp
roc); |
601 } else if (SkShader::kRepeat_TileMode == fTileModeX && | 603 } else if (SkShader::kRepeat_TileMode == fTileModeX && |
602 SkShader::kRepeat_TileMode == fTileModeY) { | 604 SkShader::kRepeat_TileMode == fTileModeY) { |
603 fShaderProc16 = SK_ARM_NEON_WRAP(Repeat_S16_D16_filter_DX_shader
proc); | 605 fShaderProc16 = SK_ARM_NEON_WRAP(Repeat_S16_D16_filter_DX_shader
proc); |
604 } | 606 } |
605 } else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 &
& clampClamp) { | 607 } else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 &
& clampClamp) { |
606 fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shad
erproc); | 608 fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shad
erproc); |
607 } else if (S32_opaque_D32_nofilter_DX == fSampleProc32 && clampClamp) { | 609 } else if (S32_opaque_D32_nofilter_DX == fSampleProc32 && clampClamp) { |
608 fShaderProc32 = Clamp_S32_opaque_D32_nofilter_DX_shaderproc; | 610 fShaderProc32 = Clamp_S32_opaque_D32_nofilter_DX_shaderproc; |
609 } | 611 } |
610 | 612 |
611 if (NULL == fShaderProc32) { | 613 if (NULL == fShaderProc32) { |
612 fShaderProc32 = this->chooseShaderProc32(); | 614 fShaderProc32 = this->chooseShaderProc32(); |
613 } | 615 } |
614 } | 616 } |
615 | 617 |
616 // see if our platform has any accelerated overrides | 618 // see if our platform has any accelerated overrides |
617 this->platformProcs(); | 619 this->platformProcs(); |
618 | 620 |
619 return true; | 621 return true; |
620 } | 622 } |
621 | 623 |
622 static void Clamp_S32_D32_nofilter_trans_shaderproc(const SkBitmapProcState& s, | 624 static void Clamp_S32_D32_nofilter_trans_shaderproc(const SkBitmapProcState& s, |
623 int x, int y, | 625 int x, int y, |
624 SkPMColor* SK_RESTRICT color
s, | 626 SkPMColor* SK_RESTRICT color
s, |
625 int count) { | 627 int count) { |
626 SkASSERT(((s.fInvType & ~SkMatrix::kTranslate_Mask)) == 0); | 628 SkASSERT(((s.fInvType & ~SkMatrix::kTranslate_Mask)) == 0); |
627 SkASSERT(s.fInvKy == 0); | 629 SkASSERT(s.fInvKy == 0); |
628 SkASSERT(count > 0 && colors != NULL); | 630 SkASSERT(count > 0 && colors != NULL); |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1084 fx += dx; | 1086 fx += dx; |
1085 } | 1087 } |
1086 } else { | 1088 } else { |
1087 for (int i = 0; i < count; ++i) { | 1089 for (int i = 0; i < count; ++i) { |
1088 dst[i] = src[SkClampMax(SkFractionalIntToInt(fx), maxX)]; | 1090 dst[i] = src[SkClampMax(SkFractionalIntToInt(fx), maxX)]; |
1089 fx += dx; | 1091 fx += dx; |
1090 } | 1092 } |
1091 } | 1093 } |
1092 } | 1094 } |
1093 | 1095 |
OLD | NEW |