aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-10-12 17:30:25 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-10-12 17:30:25 +0000
commit1fe269071d8c012a623bc922f327f95b1f27dd68 (patch)
tree7117437cbec2540187c986625b31ac4bcd5b1d69 /src
parenta99226eb8c959a0c47ef097348c4780fb1fd618b (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.cpp73
-rw-r--r--src/core/SkBitmapProcState.h1
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&,