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 11 matching lines...) Expand all Loading... | |
22 // These are defined in src/opts/SkBitmapProcState_arm_neon.cpp | 22 // These are defined in src/opts/SkBitmapProcState_arm_neon.cpp |
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 extern void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState &, int, int, uint32_t*, int); | |
32 | 33 |
33 #define NAME_WRAP(x) x | 34 #define NAME_WRAP(x) x |
34 #include "SkBitmapProcState_filter.h" | 35 #include "SkBitmapProcState_filter.h" |
35 #include "SkBitmapProcState_procs.h" | 36 #include "SkBitmapProcState_procs.h" |
36 | 37 |
37 /////////////////////////////////////////////////////////////////////////////// | 38 /////////////////////////////////////////////////////////////////////////////// |
38 | 39 |
39 // true iff the matrix contains, at most, scale and translate elements | 40 // true iff the matrix contains, at most, scale and translate elements |
40 static bool matrix_only_scale_translate(const SkMatrix& m) { | 41 static bool matrix_only_scale_translate(const SkMatrix& m) { |
41 return m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask); | 42 return m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask); |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
582 // our special-case shaderprocs | 583 // our special-case shaderprocs |
583 if (SK_ARM_NEON_WRAP(S16_D16_filter_DX) == fSampleProc16) { | 584 if (SK_ARM_NEON_WRAP(S16_D16_filter_DX) == fSampleProc16) { |
584 if (clampClamp) { | 585 if (clampClamp) { |
585 fShaderProc16 = SK_ARM_NEON_WRAP(Clamp_S16_D16_filter_DX_shaderp roc); | 586 fShaderProc16 = SK_ARM_NEON_WRAP(Clamp_S16_D16_filter_DX_shaderp roc); |
586 } else if (SkShader::kRepeat_TileMode == fTileModeX && | 587 } else if (SkShader::kRepeat_TileMode == fTileModeX && |
587 SkShader::kRepeat_TileMode == fTileModeY) { | 588 SkShader::kRepeat_TileMode == fTileModeY) { |
588 fShaderProc16 = SK_ARM_NEON_WRAP(Repeat_S16_D16_filter_DX_shader proc); | 589 fShaderProc16 = SK_ARM_NEON_WRAP(Repeat_S16_D16_filter_DX_shader proc); |
589 } | 590 } |
590 } else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 & & clampClamp) { | 591 } 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); | 592 fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shad erproc); |
593 } else if (SK_ARM_NEON_WRAP(S32_opaque_D32_nofilter_DX) == fSampleProc32 && clampClamp) { | |
djsollen
2014/10/23 19:00:33
compile fails because S32_opaque_D32_nofilter_DX_n
reed1
2014/10/23 19:13:56
Done.
| |
594 fShaderProc32 = Clamp_S32_opaque_D32_nofilter_DX_shaderproc; | |
592 } | 595 } |
593 | 596 |
594 if (NULL == fShaderProc32) { | 597 if (NULL == fShaderProc32) { |
595 fShaderProc32 = this->chooseShaderProc32(); | 598 fShaderProc32 = this->chooseShaderProc32(); |
596 } | 599 } |
597 } | 600 } |
598 | 601 |
599 // see if our platform has any accelerated overrides | 602 // see if our platform has any accelerated overrides |
600 this->platformProcs(); | 603 this->platformProcs(); |
601 | 604 |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1012 } else { | 1015 } else { |
1013 size >>= 2; | 1016 size >>= 2; |
1014 } | 1017 } |
1015 | 1018 |
1016 if (fFilterLevel != SkPaint::kNone_FilterLevel) { | 1019 if (fFilterLevel != SkPaint::kNone_FilterLevel) { |
1017 size >>= 1; | 1020 size >>= 1; |
1018 } | 1021 } |
1019 | 1022 |
1020 return size; | 1023 return size; |
1021 } | 1024 } |
1025 | |
1026 /////////////////////// | |
1027 | |
1028 void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState& s, in t x, int y, | |
1029 SkPMColor* SK_RESTRICT dst, in t count) { | |
1030 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | | |
1031 SkMatrix::kScale_Mask)) == 0); | |
1032 | |
1033 const unsigned maxX = s.fBitmap->width() - 1; | |
1034 SkFractionalInt fx; | |
1035 int dstY; | |
1036 { | |
1037 SkPoint pt; | |
1038 s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar (y) + SK_ScalarHalf, | |
1039 &pt); | |
1040 fx = SkScalarToFractionalInt(pt.fY); | |
1041 const unsigned maxY = s.fBitmap->height() - 1; | |
1042 dstY = SkClampMax(SkFractionalIntToInt(fx), maxY); | |
1043 fx = SkScalarToFractionalInt(pt.fX); | |
1044 } | |
1045 | |
1046 const SkPMColor* SK_RESTRICT src = s.fBitmap->getAddr32(0, dstY); | |
1047 const SkFractionalInt dx = s.fInvSxFractionalInt; | |
1048 | |
1049 if ((unsigned)(fx >> 48) <= maxX && (unsigned)((fx + dx * (count - 1)) >> 48 ) <= maxX) { | |
mtklein
2014/10/23 19:05:45
Can't hurt to make this a little more readable?
i
reed1
2014/10/23 19:13:56
Done.
| |
1050 int count4 = count >> 2; | |
1051 for (int i = 0; i < count4; ++i) { | |
1052 SkPMColor src0 = src[SkFractionalIntToInt(fx)]; fx += dx; | |
1053 SkPMColor src1 = src[SkFractionalIntToInt(fx)]; fx += dx; | |
1054 SkPMColor src2 = src[SkFractionalIntToInt(fx)]; fx += dx; | |
1055 SkPMColor src3 = src[SkFractionalIntToInt(fx)]; fx += dx; | |
1056 dst[0] = src0; | |
1057 dst[1] = src1; | |
1058 dst[2] = src2; | |
1059 dst[3] = src3; | |
1060 dst += 4; | |
1061 } | |
1062 for (int i = (count4 << 2); i < count; ++i) { | |
1063 unsigned index = SkFractionalIntToInt(fx); | |
1064 SkASSERT(index <= maxX); | |
1065 *dst++ = src[index]; | |
1066 fx += dx; | |
1067 } | |
1068 } else { | |
1069 for (int i = 0; i < count; ++i) { | |
1070 dst[i] = src[SkClampMax(SkFractionalIntToInt(fx), maxX)]; | |
1071 fx += dx; | |
1072 } | |
1073 } | |
1074 } | |
1075 | |
OLD | NEW |