Index: src/core/SkBitmapProcState.cpp |
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp |
index 2a449d6d8fa8e7732732bd9046517eb2a2ddb57d..4528d64f8f910b6338431f2d18d1f8e424c43856 100644 |
--- a/src/core/SkBitmapProcState.cpp |
+++ b/src/core/SkBitmapProcState.cpp |
@@ -29,6 +29,7 @@ extern void SI8_opaque_D32_filter_DX_neon(const SkBitmapProcState&, const uint3 |
extern void SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint32_t*, int); |
extern void Clamp_SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint32_t*, int); |
#endif |
+extern void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState&, int, int, uint32_t*, int); |
#define NAME_WRAP(x) x |
#include "SkBitmapProcState_filter.h" |
@@ -589,6 +590,8 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) { |
} |
} else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 && clampClamp) { |
fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shaderproc); |
+ } 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.
|
+ fShaderProc32 = Clamp_S32_opaque_D32_nofilter_DX_shaderproc; |
} |
if (NULL == fShaderProc32) { |
@@ -1019,3 +1022,54 @@ int SkBitmapProcState::maxCountForBufferSize(size_t bufferSize) const { |
return size; |
} |
+ |
+/////////////////////// |
+ |
+void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState& s, int x, int y, |
+ SkPMColor* SK_RESTRICT dst, int count) { |
+ SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | |
+ SkMatrix::kScale_Mask)) == 0); |
+ |
+ const unsigned maxX = s.fBitmap->width() - 1; |
+ SkFractionalInt fx; |
+ int dstY; |
+ { |
+ SkPoint pt; |
+ s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, |
+ &pt); |
+ fx = SkScalarToFractionalInt(pt.fY); |
+ const unsigned maxY = s.fBitmap->height() - 1; |
+ dstY = SkClampMax(SkFractionalIntToInt(fx), maxY); |
+ fx = SkScalarToFractionalInt(pt.fX); |
+ } |
+ |
+ const SkPMColor* SK_RESTRICT src = s.fBitmap->getAddr32(0, dstY); |
+ const SkFractionalInt dx = s.fInvSxFractionalInt; |
+ |
+ 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.
|
+ int count4 = count >> 2; |
+ for (int i = 0; i < count4; ++i) { |
+ SkPMColor src0 = src[SkFractionalIntToInt(fx)]; fx += dx; |
+ SkPMColor src1 = src[SkFractionalIntToInt(fx)]; fx += dx; |
+ SkPMColor src2 = src[SkFractionalIntToInt(fx)]; fx += dx; |
+ SkPMColor src3 = src[SkFractionalIntToInt(fx)]; fx += dx; |
+ dst[0] = src0; |
+ dst[1] = src1; |
+ dst[2] = src2; |
+ dst[3] = src3; |
+ dst += 4; |
+ } |
+ for (int i = (count4 << 2); i < count; ++i) { |
+ unsigned index = SkFractionalIntToInt(fx); |
+ SkASSERT(index <= maxX); |
+ *dst++ = src[index]; |
+ fx += dx; |
+ } |
+ } else { |
+ for (int i = 0; i < count; ++i) { |
+ dst[i] = src[SkClampMax(SkFractionalIntToInt(fx), maxX)]; |
+ fx += dx; |
+ } |
+ } |
+} |
+ |