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 | |
35 #define NAME_WRAP(x) x | 33 #define NAME_WRAP(x) x |
36 #include "SkBitmapProcState_filter.h" | 34 #include "SkBitmapProcState_filter.h" |
37 #include "SkBitmapProcState_procs.h" | 35 #include "SkBitmapProcState_procs.h" |
38 | 36 |
39 /////////////////////////////////////////////////////////////////////////////// | 37 /////////////////////////////////////////////////////////////////////////////// |
40 | 38 |
41 // true iff the matrix contains, at most, scale and translate elements | 39 // true iff the matrix contains, at most, scale and translate elements |
42 static bool matrix_only_scale_translate(const SkMatrix& m) { | 40 static bool matrix_only_scale_translate(const SkMatrix& m) { |
43 return m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask); | 41 return m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask); |
44 } | 42 } |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 // our special-case shaderprocs | 582 // our special-case shaderprocs |
585 if (SK_ARM_NEON_WRAP(S16_D16_filter_DX) == fSampleProc16) { | 583 if (SK_ARM_NEON_WRAP(S16_D16_filter_DX) == fSampleProc16) { |
586 if (clampClamp) { | 584 if (clampClamp) { |
587 fShaderProc16 = SK_ARM_NEON_WRAP(Clamp_S16_D16_filter_DX_shaderp
roc); | 585 fShaderProc16 = SK_ARM_NEON_WRAP(Clamp_S16_D16_filter_DX_shaderp
roc); |
588 } else if (SkShader::kRepeat_TileMode == fTileModeX && | 586 } else if (SkShader::kRepeat_TileMode == fTileModeX && |
589 SkShader::kRepeat_TileMode == fTileModeY) { | 587 SkShader::kRepeat_TileMode == fTileModeY) { |
590 fShaderProc16 = SK_ARM_NEON_WRAP(Repeat_S16_D16_filter_DX_shader
proc); | 588 fShaderProc16 = SK_ARM_NEON_WRAP(Repeat_S16_D16_filter_DX_shader
proc); |
591 } | 589 } |
592 } else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 &
& clampClamp) { | 590 } else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 &
& clampClamp) { |
593 fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shad
erproc); | 591 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; | |
596 } | 592 } |
597 | 593 |
598 if (NULL == fShaderProc32) { | 594 if (NULL == fShaderProc32) { |
599 fShaderProc32 = this->chooseShaderProc32(); | 595 fShaderProc32 = this->chooseShaderProc32(); |
600 } | 596 } |
601 } | 597 } |
602 | 598 |
603 // see if our platform has any accelerated overrides | 599 // see if our platform has any accelerated overrides |
604 this->platformProcs(); | 600 this->platformProcs(); |
605 | 601 |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 } else { | 1012 } else { |
1017 size >>= 2; | 1013 size >>= 2; |
1018 } | 1014 } |
1019 | 1015 |
1020 if (fFilterLevel != SkPaint::kNone_FilterLevel) { | 1016 if (fFilterLevel != SkPaint::kNone_FilterLevel) { |
1021 size >>= 1; | 1017 size >>= 1; |
1022 } | 1018 } |
1023 | 1019 |
1024 return size; | 1020 return size; |
1025 } | 1021 } |
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 |