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 12 matching lines...) Expand all Loading... |
23 extern const SkBitmapProcState::SampleProc16 gSkBitmapProcStateSample16_neon[]; | 23 extern const SkBitmapProcState::SampleProc16 gSkBitmapProcStateSample16_neon[]; |
24 extern const SkBitmapProcState::SampleProc32 gSkBitmapProcStateSample32_neon[]; | 24 extern const SkBitmapProcState::SampleProc32 gSkBitmapProcStateSample32_neon[]; |
25 extern void S16_D16_filter_DX_neon(const SkBitmapProcState&, const uint32_t*, i
nt, uint16_t*); | 25 extern void S16_D16_filter_DX_neon(const SkBitmapProcState&, const uint32_t*, i
nt, uint16_t*); |
26 extern void Clamp_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&, i
nt, int, uint16_t*, int); | 26 extern void Clamp_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&, i
nt, int, uint16_t*, int); |
27 extern void Repeat_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&,
int, int, uint16_t*, int); | 27 extern void Repeat_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&,
int, int, uint16_t*, int); |
28 extern void SI8_opaque_D32_filter_DX_neon(const SkBitmapProcState&, const uint3
2_t*, int, SkPMColor*); | 28 extern void SI8_opaque_D32_filter_DX_neon(const SkBitmapProcState&, const uint3
2_t*, int, SkPMColor*); |
29 extern void SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&,
int, int, uint32_t*, int); | 29 extern void SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&,
int, int, uint32_t*, int); |
30 extern void Clamp_SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcSt
ate&, int, int, uint32_t*, int); | 30 extern void Clamp_SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcSt
ate&, int, int, uint32_t*, int); |
31 #endif | 31 #endif |
32 | 32 |
| 33 extern void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState&
, int, int, uint32_t*, int); |
| 34 |
33 #define NAME_WRAP(x) x | 35 #define NAME_WRAP(x) x |
34 #include "SkBitmapProcState_filter.h" | 36 #include "SkBitmapProcState_filter.h" |
35 #include "SkBitmapProcState_procs.h" | 37 #include "SkBitmapProcState_procs.h" |
36 | 38 |
37 /////////////////////////////////////////////////////////////////////////////// | 39 /////////////////////////////////////////////////////////////////////////////// |
38 | 40 |
39 // true iff the matrix contains, at most, scale and translate elements | 41 // true iff the matrix contains, at most, scale and translate elements |
40 static bool matrix_only_scale_translate(const SkMatrix& m) { | 42 static bool matrix_only_scale_translate(const SkMatrix& m) { |
41 return m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask); | 43 return m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask); |
42 } | 44 } |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 // our special-case shaderprocs | 584 // our special-case shaderprocs |
583 if (SK_ARM_NEON_WRAP(S16_D16_filter_DX) == fSampleProc16) { | 585 if (SK_ARM_NEON_WRAP(S16_D16_filter_DX) == fSampleProc16) { |
584 if (clampClamp) { | 586 if (clampClamp) { |
585 fShaderProc16 = SK_ARM_NEON_WRAP(Clamp_S16_D16_filter_DX_shaderp
roc); | 587 fShaderProc16 = SK_ARM_NEON_WRAP(Clamp_S16_D16_filter_DX_shaderp
roc); |
586 } else if (SkShader::kRepeat_TileMode == fTileModeX && | 588 } else if (SkShader::kRepeat_TileMode == fTileModeX && |
587 SkShader::kRepeat_TileMode == fTileModeY) { | 589 SkShader::kRepeat_TileMode == fTileModeY) { |
588 fShaderProc16 = SK_ARM_NEON_WRAP(Repeat_S16_D16_filter_DX_shader
proc); | 590 fShaderProc16 = SK_ARM_NEON_WRAP(Repeat_S16_D16_filter_DX_shader
proc); |
589 } | 591 } |
590 } else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 &
& clampClamp) { | 592 } else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 &
& clampClamp) { |
591 fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shad
erproc); | 593 fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shad
erproc); |
| 594 } else if (S32_opaque_D32_nofilter_DX == fSampleProc32 && clampClamp) { |
| 595 fShaderProc32 = Clamp_S32_opaque_D32_nofilter_DX_shaderproc; |
592 } | 596 } |
593 | 597 |
594 if (NULL == fShaderProc32) { | 598 if (NULL == fShaderProc32) { |
595 fShaderProc32 = this->chooseShaderProc32(); | 599 fShaderProc32 = this->chooseShaderProc32(); |
596 } | 600 } |
597 } | 601 } |
598 | 602 |
599 // see if our platform has any accelerated overrides | 603 // see if our platform has any accelerated overrides |
600 this->platformProcs(); | 604 this->platformProcs(); |
601 | 605 |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1012 } else { | 1016 } else { |
1013 size >>= 2; | 1017 size >>= 2; |
1014 } | 1018 } |
1015 | 1019 |
1016 if (fFilterLevel != SkPaint::kNone_FilterLevel) { | 1020 if (fFilterLevel != SkPaint::kNone_FilterLevel) { |
1017 size >>= 1; | 1021 size >>= 1; |
1018 } | 1022 } |
1019 | 1023 |
1020 return size; | 1024 return size; |
1021 } | 1025 } |
| 1026 |
| 1027 /////////////////////// |
| 1028 |
| 1029 void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState& s, in
t x, int y, |
| 1030 SkPMColor* SK_RESTRICT dst, in
t count) { |
| 1031 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | |
| 1032 SkMatrix::kScale_Mask)) == 0); |
| 1033 |
| 1034 const unsigned maxX = s.fBitmap->width() - 1; |
| 1035 SkFractionalInt fx; |
| 1036 int dstY; |
| 1037 { |
| 1038 SkPoint pt; |
| 1039 s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar
(y) + SK_ScalarHalf, |
| 1040 &pt); |
| 1041 fx = SkScalarToFractionalInt(pt.fY); |
| 1042 const unsigned maxY = s.fBitmap->height() - 1; |
| 1043 dstY = SkClampMax(SkFractionalIntToInt(fx), maxY); |
| 1044 fx = SkScalarToFractionalInt(pt.fX); |
| 1045 } |
| 1046 |
| 1047 const SkPMColor* SK_RESTRICT src = s.fBitmap->getAddr32(0, dstY); |
| 1048 const SkFractionalInt dx = s.fInvSxFractionalInt; |
| 1049 |
| 1050 // Check if we're safely inside [0...maxX] so no need to clamp each computed
index. |
| 1051 // |
| 1052 if ((uint64_t)SkFractionalIntToInt(fx) <= maxX && |
| 1053 (uint64_t)SkFractionalIntToInt(fx + dx * (count - 1)) <= maxX) |
| 1054 { |
| 1055 int count4 = count >> 2; |
| 1056 for (int i = 0; i < count4; ++i) { |
| 1057 SkPMColor src0 = src[SkFractionalIntToInt(fx)]; fx += dx; |
| 1058 SkPMColor src1 = src[SkFractionalIntToInt(fx)]; fx += dx; |
| 1059 SkPMColor src2 = src[SkFractionalIntToInt(fx)]; fx += dx; |
| 1060 SkPMColor src3 = src[SkFractionalIntToInt(fx)]; fx += dx; |
| 1061 dst[0] = src0; |
| 1062 dst[1] = src1; |
| 1063 dst[2] = src2; |
| 1064 dst[3] = src3; |
| 1065 dst += 4; |
| 1066 } |
| 1067 for (int i = (count4 << 2); i < count; ++i) { |
| 1068 unsigned index = SkFractionalIntToInt(fx); |
| 1069 SkASSERT(index <= maxX); |
| 1070 *dst++ = src[index]; |
| 1071 fx += dx; |
| 1072 } |
| 1073 } else { |
| 1074 for (int i = 0; i < count; ++i) { |
| 1075 dst[i] = src[SkClampMax(SkFractionalIntToInt(fx), maxX)]; |
| 1076 fx += dx; |
| 1077 } |
| 1078 } |
| 1079 } |
| 1080 |
OLD | NEW |