aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-10-12 20:50:24 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-10-12 20:50:24 +0000
commitf7698de60e2cfecf84cb84f957e6fe69325fe67f (patch)
treecacfa98ea90320b293b2f10c77562ac0ce55ac3d /src
parent2d6535a91dd94f93d74964bd21731794d9369f5e (diff)
retool fFilterOne[X,Y] to store the translate dx, dy, so we can avoid float
conversions on every scanline. git-svn-id: http://skia.googlecode.com/svn/trunk@5939 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r--src/core/SkBitmapProcState.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
index dfcd0021b9..a1eff9f2a7 100644
--- a/src/core/SkBitmapProcState.cpp
+++ b/src/core/SkBitmapProcState.cpp
@@ -246,18 +246,22 @@ static void Clamp_S32_D32_nofilter_trans_shaderproc(const SkBitmapProcState& s,
SkASSERT(!s.fDoFilter);
const int maxX = s.fBitmap->width() - 1;
- SkPMColor* row;
- int ix;
-
+ const int maxY = s.fBitmap->height() - 1;
+ int ix = s.fFilterOneX + x;
+ int iy = SkClampMax(s.fFilterOneY + y, maxY);
+#ifdef SK_DEBUG
{
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);
+ int iy2 = SkClampMax(SkScalarFloorToInt(pt.fY), maxY);
+ int ix2 = SkScalarFloorToInt(pt.fX);
+
+ SkASSERT(iy == iy2);
+ SkASSERT(ix == ix2);
}
+#endif
+ const SkPMColor* row = s.fBitmap->getAddr32(0, iy);
// clamp to the left
if (ix < 0) {
@@ -301,6 +305,13 @@ SkBitmapProcState::ShaderProc32 SkBitmapProcState::chooseShaderProc32() {
}
if (SkShader::kClamp_TileMode == fTileModeX && SkShader::kClamp_TileMode == fTileModeY) {
+ SkPoint pt;
+ fInvProc(*fInvMatrix, SK_ScalarHalf, SK_ScalarHalf, &pt);
+ // Since we know we're not filtered, we re-purpose these fields allow
+ // us to go from device -> src coordinates w/ just an integer add,
+ // rather than running through the inverse-matrix
+ fFilterOneX = SkScalarFloorToInt(pt.fX);
+ fFilterOneY = SkScalarFloorToInt(pt.fY);
return Clamp_S32_D32_nofilter_trans_shaderproc;
}
return NULL;