diff options
author | 2012-10-12 17:30:25 +0000 | |
---|---|---|
committer | 2012-10-12 17:30:25 +0000 | |
commit | 1fe269071d8c012a623bc922f327f95b1f27dd68 (patch) | |
tree | 7117437cbec2540187c986625b31ac4bcd5b1d69 /src | |
parent | a99226eb8c959a0c47ef097348c4780fb1fd618b (diff) |
add shaderproc32 for translate+clamp+nofilter.
todo: should be pretty easy to have a variant for repeat tilemode as well
Review URL: https://codereview.appspot.com/6658053
git-svn-id: http://skia.googlecode.com/svn/trunk@5926 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkBitmapProcState.cpp | 73 | ||||
-rw-r--r-- | src/core/SkBitmapProcState.h | 1 |
2 files changed, 74 insertions, 0 deletions
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp index 3eccf47e70..e540545f43 100644 --- a/src/core/SkBitmapProcState.cpp +++ b/src/core/SkBitmapProcState.cpp @@ -227,11 +227,84 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) { fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shaderproc); } + if (NULL == fShaderProc32) { + fShaderProc32 = this->chooseShaderProc32(); + } + // see if our platform has any accelerated overrides this->platformProcs(); return true; } +static void Clamp_S32_D32_nofilter_trans_shaderproc(const SkBitmapProcState& s, + int x, int y, + SkPMColor* SK_RESTRICT colors, + int count) { + SkASSERT(((s.fInvType & ~SkMatrix::kTranslate_Mask)) == 0); + SkASSERT(s.fInvKy == 0); + SkASSERT(count > 0 && colors != NULL); + SkASSERT(!s.fDoFilter); + + const int maxX = s.fBitmap->width() - 1; + SkPMColor* row; + int ix; + + { + SkPoint pt; + s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, + SkIntToScalar(y) + SK_ScalarHalf, &pt); + const unsigned maxY = s.fBitmap->height() - 1; + int y = SkClampMax(SkScalarFloorToInt(pt.fY), maxY); + row = s.fBitmap->getAddr32(0, y); + ix = SkScalarFloorToInt(pt.fX); + } + + // clamp to the left + if (ix < 0) { + int n = SkMin32(-ix, count); + sk_memset32(colors, row[0], n); + count -= n; + if (0 == count) { + return; + } + colors += n; + SkASSERT(-ix == n); + ix = 0; + } + // copy the middle + if (ix <= maxX) { + int n = maxX - ix + 1; + memcpy(colors, row + ix, count * sizeof(SkPMColor)); + count -= n; + if (0 == count) { + return; + } + colors += n; + } + // clamp to the right + sk_memset32(colors, row[maxX], count); +} + +SkBitmapProcState::ShaderProc32 SkBitmapProcState::chooseShaderProc32() { + if (fAlphaScale < 256) { + return NULL; + } + if (fInvType > SkMatrix::kTranslate_Mask) { + return NULL; + } + if (fDoFilter) { + return NULL; + } + if (SkBitmap::kARGB_8888_Config != fBitmap->config()) { + return NULL; + } + + if (SkShader::kClamp_TileMode == fTileModeX && SkShader::kClamp_TileMode == fTileModeY) { + return Clamp_S32_D32_nofilter_trans_shaderproc; + } + return NULL; +} + /////////////////////////////////////////////////////////////////////////////// #ifdef SK_DEBUG diff --git a/src/core/SkBitmapProcState.h b/src/core/SkBitmapProcState.h index 4e3a1a1b3e..d9ac5c717b 100644 --- a/src/core/SkBitmapProcState.h +++ b/src/core/SkBitmapProcState.h @@ -137,6 +137,7 @@ private: MatrixProc chooseMatrixProc(bool trivial_matrix); bool chooseProcs(const SkMatrix& inv, const SkPaint&); + ShaderProc32 chooseShaderProc32(); #ifdef SK_DEBUG static void DebugMatrixProc(const SkBitmapProcState&, |