switch bitmapshader internals over to pixmap

BUG=skia:
NOTRY=True

Review URL: https://codereview.chromium.org/1158273007
diff --git a/src/core/SkBitmapController.cpp b/src/core/SkBitmapController.cpp
index 484db8e..dd7eb6f 100644
--- a/src/core/SkBitmapController.cpp
+++ b/src/core/SkBitmapController.cpp
@@ -42,12 +42,9 @@
 
     State* state = this->onRequestBitmap(bm, inv, quality, storage, storageSize);
     if (state) {
-        if (!state->fLockedBitmap.getPixels()) {
-            state->fLockedBitmap.lockPixels();
-            if (!state->fLockedBitmap.getPixels()) {
-                SkInPlaceDeleteCheck(state, storage);
-                state = NULL;
-            }
+        if (NULL == state->fPixmap.addr()) {
+            SkInPlaceDeleteCheck(state, storage);
+            state = NULL;
         }
     }
     return state;
@@ -65,6 +62,7 @@
     SkDefaultBitmapControllerState(const SkBitmap& src, const SkMatrix& inv, SkFilterQuality qual);
 
 private:
+    SkBitmap                     fResultBitmap;
     SkAutoTUnref<const SkMipMap> fCurrMip;
     
     bool processHQRequest(const SkBitmap& orig);
@@ -123,8 +121,8 @@
     SkScalar roundedDestWidth = SkScalarRoundToScalar(trueDestWidth);
     SkScalar roundedDestHeight = SkScalarRoundToScalar(trueDestHeight);
     
-    if (!SkBitmapCache::Find(origBitmap, roundedDestWidth, roundedDestHeight, &fLockedBitmap)) {
-        if (!SkBitmapScaler::Resize(&fLockedBitmap,
+    if (!SkBitmapCache::Find(origBitmap, roundedDestWidth, roundedDestHeight, &fResultBitmap)) {
+        if (!SkBitmapScaler::Resize(&fResultBitmap,
                                     origBitmap,
                                     SkBitmapScaler::RESIZE_BEST,
                                     roundedDestWidth,
@@ -133,12 +131,12 @@
             return false; // we failed to create fScaledBitmap
         }
         
-        SkASSERT(fLockedBitmap.getPixels());
-        fLockedBitmap.setImmutable();
-        SkBitmapCache::Add(origBitmap, roundedDestWidth, roundedDestHeight, fLockedBitmap);
+        SkASSERT(fResultBitmap.getPixels());
+        fResultBitmap.setImmutable();
+        SkBitmapCache::Add(origBitmap, roundedDestWidth, roundedDestHeight, fResultBitmap);
     }
     
-    SkASSERT(fLockedBitmap.getPixels());
+    SkASSERT(fResultBitmap.getPixels());
     
     fInvMatrix.postScale(roundedDestWidth / origBitmap.width(),
                          roundedDestHeight / origBitmap.height());
@@ -188,7 +186,7 @@
             const SkImageInfo info = origBitmap.info().makeWH(level.fWidth, level.fHeight);
             // todo: if we could wrap the fCurrMip in a pixelref, then we could just install
             //       that here, and not need to explicitly track it ourselves.
-            return fLockedBitmap.installPixels(info, level.fPixels, level.fRowBytes);
+            return fResultBitmap.installPixels(info, level.fPixels, level.fRowBytes);
         } else {
             // failed to extract, so release the mipmap
             fCurrMip.reset(NULL);
@@ -203,10 +201,19 @@
     fInvMatrix = inv;
     fQuality = qual;
 
-    if (!this->processHQRequest(src) && !this->processMediumRequest(src)) {
-        fLockedBitmap = src;
+    if (this->processHQRequest(src) || this->processMediumRequest(src)) {
+        SkASSERT(fResultBitmap.getPixels());
+    } else {
+        fResultBitmap = src;
+        fResultBitmap.lockPixels();
+        // lock may fail to give us pixels
     }
     SkASSERT(fQuality <= kLow_SkFilterQuality);
+
+    // fResultBitmap.getPixels() may be null, but our caller knows to check fPixmap.addr()
+    // and will destroy us if it is NULL.
+    fPixmap.reset(fResultBitmap.info(), fResultBitmap.getPixels(), fResultBitmap.rowBytes(),
+                  fResultBitmap.getColorTable());
 }
 
 SkBitmapController::State* SkDefaultBitmapController::onRequestBitmap(const SkBitmap& bm,
diff --git a/src/core/SkBitmapController.h b/src/core/SkBitmapController.h
index bc3c696..ead4b78 100644
--- a/src/core/SkBitmapController.h
+++ b/src/core/SkBitmapController.h
@@ -21,12 +21,12 @@
     public:
         virtual ~State() {}
 
-        const SkBitmap& lockedBitmap() const { return fLockedBitmap; }
+        const SkPixmap& pixmap() const { return fPixmap; }
         const SkMatrix& invMatrix() const { return fInvMatrix; }
         SkFilterQuality quality() const { return fQuality; }
     
     protected:
-        SkBitmap        fLockedBitmap;
+        SkPixmap        fPixmap;
         SkMatrix        fInvMatrix;
         SkFilterQuality fQuality;
     
diff --git a/src/core/SkBitmapProcShader.cpp b/src/core/SkBitmapProcShader.cpp
index c1a03fe..e17e60b 100644
--- a/src/core/SkBitmapProcShader.cpp
+++ b/src/core/SkBitmapProcShader.cpp
@@ -117,22 +117,22 @@
     : INHERITED(shader, rec)
     , fState(state)
 {
-    const SkBitmap& bitmap = *fState->fBitmap;
-    bool bitmapIsOpaque = bitmap.isOpaque();
+    const SkPixmap& pixmap = fState->fPixmap;
+    bool isOpaque = pixmap.isOpaque();
 
     // update fFlags
     uint32_t flags = 0;
-    if (bitmapIsOpaque && (255 == this->getPaintAlpha())) {
+    if (isOpaque && (255 == this->getPaintAlpha())) {
         flags |= kOpaqueAlpha_Flag;
     }
 
-    switch (bitmap.colorType()) {
+    switch (pixmap.colorType()) {
         case kRGB_565_SkColorType:
             flags |= (kHasSpan16_Flag | kIntrinsicly16_Flag);
             break;
         case kIndex_8_SkColorType:
         case kN32_SkColorType:
-            if (bitmapIsOpaque) {
+            if (isOpaque) {
                 flags |= kHasSpan16_Flag;
             }
             break;
@@ -142,14 +142,14 @@
             break;
     }
 
-    if (rec.fPaint->isDither() && bitmap.colorType() != kRGB_565_SkColorType) {
+    if (rec.fPaint->isDither() && pixmap.colorType() != kRGB_565_SkColorType) {
         // gradients can auto-dither in their 16bit sampler, but we don't so
         // we clear the flag here.
         flags &= ~kHasSpan16_Flag;
     }
 
     // if we're only 1-pixel high, and we don't rotate, then we can claim this
-    if (1 == bitmap.height() &&
+    if (1 == pixmap.height() &&
             only_scale_and_translate(this->getTotalInverse())) {
         flags |= kConstInY32_Flag;
         if (flags & kHasSpan16_Flag) {
@@ -190,9 +190,7 @@
     SkBitmapProcState::SampleProc32 sproc = state.getSampleProc32();
     int max = state.maxCountForBufferSize(sizeof(buffer[0]) * BUF_MAX);
 
-    SkASSERT(state.fBitmap->getPixels());
-    SkASSERT(state.fBitmap->pixelRef() == NULL ||
-             state.fBitmap->pixelRef()->isLocked());
+    SkASSERT(state.fPixmap.addr());
 
     for (;;) {
         int n = count;
@@ -243,9 +241,7 @@
     SkBitmapProcState::SampleProc16 sproc = state.getSampleProc16();
     int max = state.maxCountForBufferSize(sizeof(buffer));
 
-    SkASSERT(state.fBitmap->getPixels());
-    SkASSERT(state.fBitmap->pixelRef() == NULL ||
-             state.fBitmap->pixelRef()->isLocked());
+    SkASSERT(state.fPixmap.addr());
 
     for (;;) {
         int n = count;
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
index 314fdd7..2227010 100644
--- a/src/core/SkBitmapProcState.cpp
+++ b/src/core/SkBitmapProcState.cpp
@@ -54,12 +54,12 @@
  *  For the purposes of drawing bitmaps, if a matrix is "almost" translate
  *  go ahead and treat it as if it were, so that subsequent code can go fast.
  */
-static bool just_trans_clamp(const SkMatrix& matrix, const SkBitmap& bitmap) {
+static bool just_trans_clamp(const SkMatrix& matrix, const SkPixmap& pixmap) {
     SkASSERT(matrix_only_scale_translate(matrix));
 
     if (matrix.getType() & SkMatrix::kScale_Mask) {
-        SkRect src, dst;
-        bitmap.getBounds(&src);
+        SkRect dst;
+        SkRect src = SkRect::Make(pixmap.bounds());
 
         // Can't call mapRect(), since that will fix up inverted rectangles,
         // e.g. when scale is negative, and we don't want to return true for
@@ -74,7 +74,7 @@
         // phase (in pixel space) that any translate in the matrix might impart.
         SkIRect idst;
         dst.round(&idst);
-        return idst.width() == bitmap.width() && idst.height() == bitmap.height();
+        return idst.width() == pixmap.width() && idst.height() == pixmap.height();
     }
     // if we got here, we're either kTranslate_Mask or identity
     return true;
@@ -114,20 +114,21 @@
  *    and may be removed.
  */
 bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
-    fBitmap = NULL;
+    fPixmap.reset();
     fInvMatrix = inv;
     fFilterLevel = paint.getFilterQuality();
 
     SkDefaultBitmapController controller;
     fBMState = controller.requestBitmap(fOrigBitmap, inv, paint.getFilterQuality(),
                                         fBMStateStorage.get(), fBMStateStorage.size());
-    if (NULL == fBMState) {
+    // Note : we allow the controller to return an empty (zero-dimension) result. Should we?
+    if (NULL == fBMState || fBMState->pixmap().info().isEmpty()) {
         return false;
     }
-    fBitmap = &fBMState->lockedBitmap();
+    fPixmap = fBMState->pixmap();
     fInvMatrix = fBMState->invMatrix();
     fFilterLevel = fBMState->quality();
-    SkASSERT(fBitmap->getPixels());
+    SkASSERT(fPixmap.addr());
     
     bool trivialMatrix = (fInvMatrix.getType() & ~SkMatrix::kTranslate_Mask) == 0;
     bool clampClamp = SkShader::kClamp_TileMode == fTileModeX &&
@@ -141,7 +142,7 @@
     // in both X and Y since clamping to width,height is just as easy as to 0xFFFF.
 
     if (!(clampClamp || trivialMatrix)) {
-        fInvMatrix.postIDiv(fBitmap->width(), fBitmap->height());
+        fInvMatrix.postIDiv(fPixmap.width(), fPixmap.height());
     }
 
     // Now that all possible changes to the matrix have taken place, check
@@ -155,7 +156,7 @@
     if (matrix_only_scale_translate(fInvMatrix)) {
         SkMatrix forward;
         if (fInvMatrix.invert(&forward)) {
-            if (clampClamp ? just_trans_clamp(forward, *fBitmap)
+            if (clampClamp ? just_trans_clamp(forward, fPixmap)
                            : just_trans_general(forward)) {
                 SkScalar tx = -SkScalarRoundToScalar(forward.getTranslateX());
                 SkScalar ty = -SkScalarRoundToScalar(forward.getTranslateY());
@@ -188,7 +189,7 @@
         // the image has a suitable size.
 
         if (fInvType <= SkMatrix::kTranslate_Mask ||
-            !valid_for_filtering(fBitmap->width() | fBitmap->height()))
+            !valid_for_filtering(fPixmap.width() | fPixmap.height()))
         {
             fFilterLevel = kNone_SkFilterQuality;
         }
@@ -207,7 +208,7 @@
 
     ///////////////////////////////////////////////////////////////////////
 
-    const SkAlphaType at = fBitmap->alphaType();
+    const SkAlphaType at = fPixmap.alphaType();
 
     // No need to do this if we're doing HQ sampling; if filter quality is
     // still set to HQ by the time we get here, then we must have installed
@@ -226,7 +227,7 @@
             index |= 4;
         }
         // bits 3,4,5 encoding the source bitmap format
-        switch (fBitmap->colorType()) {
+        switch (fPixmap.colorType()) {
             case kN32_SkColorType:
                 if (kPremul_SkAlphaType != at && kOpaque_SkAlphaType != at) {
                     return false;
@@ -383,8 +384,8 @@
     SkASSERT(count > 0 && colors != NULL);
     SkASSERT(kNone_SkFilterQuality == s.fFilterLevel);
 
-    const int maxX = s.fBitmap->width() - 1;
-    const int maxY = s.fBitmap->height() - 1;
+    const int maxX = s.fPixmap.width() - 1;
+    const int maxY = s.fPixmap.height() - 1;
     int ix = s.fFilterOneX + x;
     int iy = SkClampMax(s.fFilterOneY + y, maxY);
 #ifdef SK_DEBUG
@@ -399,7 +400,7 @@
         SkASSERT(ix == ix2);
     }
 #endif
-    const SkPMColor* row = s.fBitmap->getAddr32(0, iy);
+    const SkPMColor* row = s.fPixmap.addr32(0, iy);
 
     // clamp to the left
     if (ix < 0) {
@@ -457,8 +458,8 @@
     SkASSERT(count > 0 && colors != NULL);
     SkASSERT(kNone_SkFilterQuality == s.fFilterLevel);
 
-    const int stopX = s.fBitmap->width();
-    const int stopY = s.fBitmap->height();
+    const int stopX = s.fPixmap.width();
+    const int stopY = s.fPixmap.height();
     int ix = s.fFilterOneX + x;
     int iy = sk_int_mod(s.fFilterOneY + y, stopY);
 #ifdef SK_DEBUG
@@ -473,7 +474,7 @@
         SkASSERT(ix == ix2);
     }
 #endif
-    const SkPMColor* row = s.fBitmap->getAddr32(0, iy);
+    const SkPMColor* row = s.fPixmap.addr32(0, iy);
 
     ix = sk_int_mod(ix, stopX);
     for (;;) {
@@ -495,7 +496,7 @@
     SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) == 0);
     SkASSERT(s.fInvKy == 0);
     SkASSERT(count > 0 && colors != NULL);
-    SkASSERT(1 == s.fBitmap->width());
+    SkASSERT(1 == s.fPixmap.width());
 
     int iY0;
     int iY1   SK_INIT_TO_AVOID_WARNING;
@@ -525,7 +526,7 @@
             // its own tiling and sampling we need to undo that here.
             if (SkShader::kClamp_TileMode != s.fTileModeX ||
                 SkShader::kClamp_TileMode != s.fTileModeY) {
-                yTemp = SkScalarFloorToInt(pt.fY * s.fBitmap->height());
+                yTemp = SkScalarFloorToInt(pt.fY * s.fPixmap.height());
             } else {
                 yTemp = SkScalarFloorToInt(pt.fY);
             }
@@ -533,7 +534,7 @@
             yTemp = s.fFilterOneY + y;
         }
 
-        const int stopY = s.fBitmap->height();
+        const int stopY = s.fPixmap.height();
         switch (s.fTileModeY) {
             case SkShader::kClamp_TileMode:
                 iY0 = SkClampMax(yTemp, stopY-1);
@@ -557,7 +558,7 @@
             if (s.fInvType > SkMatrix::kTranslate_Mask &&
                 (SkShader::kClamp_TileMode != s.fTileModeX ||
                  SkShader::kClamp_TileMode != s.fTileModeY)) {
-                pt.fY *= s.fBitmap->height();
+                pt.fY *= s.fPixmap.height();
             }
             int iY2;
 
@@ -579,11 +580,11 @@
 #endif
     }
 
-    const SkPMColor* row0 = s.fBitmap->getAddr32(0, iY0);
+    const SkPMColor* row0 = s.fPixmap.addr32(0, iY0);
     SkPMColor color;
 
     if (kNone_SkFilterQuality != s.fFilterLevel) {
-        const SkPMColor* row1 = s.fBitmap->getAddr32(0, iY1);
+        const SkPMColor* row1 = s.fPixmap.addr32(0, iY1);
 
         if (s.fAlphaScale < 256) {
             Filter_32_alpha(iSubY, *row0, *row1, &color, s.fAlphaScale);
@@ -631,13 +632,13 @@
 
 SkBitmapProcState::ShaderProc32 SkBitmapProcState::chooseShaderProc32() {
 
-    if (kN32_SkColorType != fBitmap->colorType()) {
+    if (kN32_SkColorType != fPixmap.colorType()) {
         return NULL;
     }
 
     static const unsigned kMask = SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask;
 
-    if (1 == fBitmap->width() && 0 == (fInvType & ~kMask)) {
+    if (1 == fPixmap.width() && 0 == (fInvType & ~kMask)) {
         if (kNone_SkFilterQuality == fFilterLevel &&
             fInvType <= SkMatrix::kTranslate_Mask &&
             !this->setupForTranslate()) {
@@ -752,7 +753,7 @@
     } else {
         proc = state.fFilterLevel != kNone_SkFilterQuality ? check_affine_filter : check_affine_nofilter;
     }
-    proc(bitmapXY, count, state.fBitmap->width(), state.fBitmap->height());
+    proc(bitmapXY, count, state.fPixmap.width(), state.fPixmap.height());
 }
 
 SkBitmapProcState::MatrixProc SkBitmapProcState::getMatrixProc() const {
@@ -799,7 +800,7 @@
     SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
                              SkMatrix::kScale_Mask)) == 0);
 
-    const unsigned maxX = s.fBitmap->width() - 1;
+    const unsigned maxX = s.fPixmap.width() - 1;
     SkFractionalInt fx;
     int dstY;
     {
@@ -807,12 +808,12 @@
         s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf,
                    &pt);
         fx = SkScalarToFractionalInt(pt.fY);
-        const unsigned maxY = s.fBitmap->height() - 1;
+        const unsigned maxY = s.fPixmap.height() - 1;
         dstY = SkClampMax(SkFractionalIntToInt(fx), maxY);
         fx = SkScalarToFractionalInt(pt.fX);
     }
 
-    const SkPMColor* SK_RESTRICT src = s.fBitmap->getAddr32(0, dstY);
+    const SkPMColor* SK_RESTRICT src = s.fPixmap.addr32(0, dstY);
     const SkFractionalInt dx = s.fInvSxFractionalInt;
 
     // Check if we're safely inside [0...maxX] so no need to clamp each computed index.
diff --git a/src/core/SkBitmapProcState.h b/src/core/SkBitmapProcState.h
index 0afc773..31d1142 100644
--- a/src/core/SkBitmapProcState.h
+++ b/src/core/SkBitmapProcState.h
@@ -52,7 +52,7 @@
     typedef U16CPU (*FixedTileLowBitsProc)(SkFixed, int);   // returns 0..0xF
     typedef U16CPU (*IntTileProc)(int value, int count);   // returns 0..count-1
 
-    const SkBitmap*     fBitmap;            // chooseProcs - orig or scaled
+    SkPixmap            fPixmap;
     SkMatrix            fInvMatrix;         // copy of what is in fBMState, can we remove the dup?
 
     SkMatrix::MapXYProc fInvProc;           // chooseProcs
diff --git a/src/core/SkBitmapProcState_matrix.h b/src/core/SkBitmapProcState_matrix.h
index b71c3c3..bdab846 100644
--- a/src/core/SkBitmapProcState_matrix.h
+++ b/src/core/SkBitmapProcState_matrix.h
@@ -55,7 +55,7 @@
 
     PREAMBLE(s);
 
-    const unsigned maxX = s.fBitmap->width() - 1;
+    const unsigned maxX = s.fPixmap.width() - 1;
     const SkFixed one = s.fFilterOneX;
     const SkFractionalInt dx = s.fInvSxFractionalInt;
     SkFractionalInt fx;
@@ -65,7 +65,7 @@
         s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
                                   SkIntToScalar(y) + SK_ScalarHalf, &pt);
         const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
-        const unsigned maxY = s.fBitmap->height() - 1;
+        const unsigned maxY = s.fPixmap.height() - 1;
         // compute our two Y values up front
         *xy++ = PACK_FILTER_Y_NAME(fy, maxY, s.fFilterOneY PREAMBLE_ARG_Y);
         // now initialize fx
@@ -106,8 +106,8 @@
     SkFixed fy = SkScalarToFixed(srcPt.fY) - (oneY >> 1);
     SkFixed dx = s.fInvSx;
     SkFixed dy = s.fInvKy;
-    unsigned maxX = s.fBitmap->width() - 1;
-    unsigned maxY = s.fBitmap->height() - 1;
+    unsigned maxX = s.fPixmap.width() - 1;
+    unsigned maxY = s.fPixmap.height() - 1;
 
     do {
         *xy++ = PACK_FILTER_Y_NAME(fy, maxY, oneY PREAMBLE_ARG_Y);
@@ -123,8 +123,8 @@
     SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask);
 
     PREAMBLE(s);
-    unsigned maxX = s.fBitmap->width() - 1;
-    unsigned maxY = s.fBitmap->height() - 1;
+    unsigned maxX = s.fPixmap.width() - 1;
+    unsigned maxY = s.fPixmap.height() - 1;
     SkFixed oneX = s.fFilterOneX;
     SkFixed oneY = s.fFilterOneY;
 
diff --git a/src/core/SkBitmapProcState_matrixProcs.cpp b/src/core/SkBitmapProcState_matrixProcs.cpp
index b7a2ccb..1870a0e 100644
--- a/src/core/SkBitmapProcState_matrixProcs.cpp
+++ b/src/core/SkBitmapProcState_matrixProcs.cpp
@@ -1,3 +1,12 @@
+/*
+ * Copyright 2008 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+// The copyright below was added in 2009, but I see no record of moto contributions...?
+
 /* NEON optimized code (C) COPYRIGHT 2009 Motorola
  *
  * Use of this source code is governed by a BSD-style license that can be
@@ -321,7 +330,7 @@
     s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
                SkIntToScalar(y) + SK_ScalarHalf, &pt);
     **xy = s.fIntTileProcY(SkScalarToFixed(pt.fY) >> 16,
-                           s.fBitmap->height());
+                           s.fPixmap.height());
     *xy += 1;   // bump the ptr
     // return our starting X position
     return SkScalarToFixed(pt.fX) >> 16;
@@ -332,7 +341,7 @@
     SkASSERT((s.fInvType & ~SkMatrix::kTranslate_Mask) == 0);
 
     int xpos = nofilter_trans_preamble(s, &xy, x, y);
-    const int width = s.fBitmap->width();
+    const int width = s.fPixmap.width();
     if (1 == width) {
         // all of the following X values must be 0
         memset(xy, 0, count * sizeof(uint16_t));
@@ -380,7 +389,7 @@
     SkASSERT((s.fInvType & ~SkMatrix::kTranslate_Mask) == 0);
 
     int xpos = nofilter_trans_preamble(s, &xy, x, y);
-    const int width = s.fBitmap->width();
+    const int width = s.fPixmap.width();
     if (1 == width) {
         // all of the following X values must be 0
         memset(xy, 0, count * sizeof(uint16_t));
@@ -420,7 +429,7 @@
     SkASSERT((s.fInvType & ~SkMatrix::kTranslate_Mask) == 0);
 
     int xpos = nofilter_trans_preamble(s, &xy, x, y);
-    const int width = s.fBitmap->width();
+    const int width = s.fPixmap.width();
     if (1 == width) {
         // all of the following X values must be 0
         memset(xy, 0, count * sizeof(uint16_t));
@@ -507,8 +516,8 @@
     }
 
     // all remaining procs use this form for filterOne
-    fFilterOneX = SK_Fixed1 / fBitmap->width();
-    fFilterOneY = SK_Fixed1 / fBitmap->height();
+    fFilterOneX = SK_Fixed1 / fPixmap.width();
+    fFilterOneY = SK_Fixed1 / fPixmap.height();
 
     if (SkShader::kRepeat_TileMode == fTileModeX && SkShader::kRepeat_TileMode == fTileModeY) {
         return SK_ARM_NEON_WRAP(RepeatX_RepeatY_Procs)[index];
diff --git a/src/core/SkBitmapProcState_matrix_template.h b/src/core/SkBitmapProcState_matrix_template.h
index 4b0044b..468013c 100644
--- a/src/core/SkBitmapProcState_matrix_template.h
+++ b/src/core/SkBitmapProcState_matrix_template.h
@@ -19,14 +19,14 @@
 
     // we store y, x, x, x, x, x
 
-    const unsigned maxX = s.fBitmap->width() - 1;
+    const unsigned maxX = s.fPixmap.width() - 1;
     SkFractionalInt fx;
     {
         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;
+        const unsigned maxY = s.fPixmap.height() - 1;
         *xy++ = TileProc::Y(s, SkFractionalIntToFixed(fx), maxY);
         fx = SkScalarToFractionalInt(pt.fX);
     }
@@ -89,8 +89,8 @@
     SkFractionalInt fy = SkScalarToFractionalInt(srcPt.fY);
     SkFractionalInt dx = s.fInvSxFractionalInt;
     SkFractionalInt dy = s.fInvKyFractionalInt;
-    int maxX = s.fBitmap->width() - 1;
-    int maxY = s.fBitmap->height() - 1;
+    int maxX = s.fPixmap.width() - 1;
+    int maxY = s.fPixmap.height() - 1;
 
     for (int i = count; i > 0; --i) {
         *xy++ = (TileProc::Y(s, SkFractionalIntToFixed(fy), maxY) << 16) |
@@ -104,8 +104,8 @@
                         int count, int x, int y) {
     SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask);
 
-    int maxX = s.fBitmap->width() - 1;
-    int maxY = s.fBitmap->height() - 1;
+    int maxX = s.fPixmap.width() - 1;
+    int maxY = s.fPixmap.height() - 1;
 
     SkPerspIter   iter(s.fInvMatrix,
                        SkIntToScalar(x) + SK_ScalarHalf,
diff --git a/src/core/SkBitmapProcState_procs.h b/src/core/SkBitmapProcState_procs.h
index a9b8750..03e1927 100644
--- a/src/core/SkBitmapProcState_procs.h
+++ b/src/core/SkBitmapProcState_procs.h
@@ -90,7 +90,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(S32_opaque_D32 ## suffix)
 #define DSTSIZE                 32
 #define SRCTYPE                 SkPMColor
-#define CHECKSTATE(state)       SkASSERT(4 == state.fBitmap->bytesPerPixel()); \
+#define CHECKSTATE(state)       SkASSERT(4 == state.fPixmap.info().bytesPerPixel()); \
                                 SkASSERT(state.fAlphaScale == 256)
 #define RETURNDST(src)          src
 #define SRC_TO_FILTER(src)      src
@@ -102,7 +102,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(S32_alpha_D32 ## suffix)
 #define DSTSIZE                 32
 #define SRCTYPE                 SkPMColor
-#define CHECKSTATE(state)       SkASSERT(4 == state.fBitmap->bytesPerPixel()); \
+#define CHECKSTATE(state)       SkASSERT(4 == state.fPixmap.info().bytesPerPixel()); \
                                 SkASSERT(state.fAlphaScale < 256)
 #define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale
 #define RETURNDST(src)          SkAlphaMulQ(src, alphaScale)
@@ -121,7 +121,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(S16_opaque_D32 ## suffix)
 #define DSTSIZE                 32
 #define SRCTYPE                 uint16_t
-#define CHECKSTATE(state)       SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType()); \
+#define CHECKSTATE(state)       SkASSERT(kRGB_565_SkColorType == state.fPixmap.colorType()); \
                                 SkASSERT(state.fAlphaScale == 256)
 #define RETURNDST(src)          SkPixel16ToPixel32(src)
 #define SRC_TO_FILTER(src)      src
@@ -137,7 +137,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(S16_alpha_D32 ## suffix)
 #define DSTSIZE                 32
 #define SRCTYPE                 uint16_t
-#define CHECKSTATE(state)       SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType()); \
+#define CHECKSTATE(state)       SkASSERT(kRGB_565_SkColorType == state.fPixmap.colorType()); \
                                 SkASSERT(state.fAlphaScale < 256)
 #define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale
 #define RETURNDST(src)          SkAlphaMulQ(SkPixel16ToPixel32(src), alphaScale)
@@ -152,9 +152,9 @@
 #define MAKENAME(suffix)        NAME_WRAP(SI8_opaque_D32 ## suffix)
 #define DSTSIZE                 32
 #define SRCTYPE                 uint8_t
-#define CHECKSTATE(state)       SkASSERT(kIndex_8_SkColorType == state.fBitmap->colorType()); \
+#define CHECKSTATE(state)       SkASSERT(kIndex_8_SkColorType == state.fPixmap.colorType()); \
                                 SkASSERT(state.fAlphaScale == 256)
-#define PREAMBLE(state)         const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->readColors()
+#define PREAMBLE(state)         const SkPMColor* SK_RESTRICT table = state.fPixmap.ctable()->readColors()
 #define RETURNDST(src)          table[src]
 #define SRC_TO_FILTER(src)      table[src]
 #define POSTAMBLE(state)
@@ -166,10 +166,10 @@
 #define MAKENAME(suffix)        NAME_WRAP(SI8_alpha_D32 ## suffix)
 #define DSTSIZE                 32
 #define SRCTYPE                 uint8_t
-#define CHECKSTATE(state)       SkASSERT(kIndex_8_SkColorType == state.fBitmap->colorType()); \
+#define CHECKSTATE(state)       SkASSERT(kIndex_8_SkColorType == state.fPixmap.colorType()); \
                                 SkASSERT(state.fAlphaScale < 256)
 #define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale; \
-                                const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->readColors()
+                                const SkPMColor* SK_RESTRICT table = state.fPixmap.ctable()->readColors()
 #define RETURNDST(src)          SkAlphaMulQ(table[src], alphaScale)
 #define SRC_TO_FILTER(src)      table[src]
 #define POSTAMBLE(state)
@@ -183,7 +183,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(S4444_opaque_D32 ## suffix)
 #define DSTSIZE                 32
 #define SRCTYPE                 SkPMColor16
-#define CHECKSTATE(state)       SkASSERT(kARGB_4444_SkColorType == state.fBitmap->colorType()); \
+#define CHECKSTATE(state)       SkASSERT(kARGB_4444_SkColorType == state.fPixmap.colorType()); \
                                 SkASSERT(state.fAlphaScale == 256)
 #define RETURNDST(src)          SkPixel4444ToPixel32(src)
 #define SRC_TO_FILTER(src)      src
@@ -199,7 +199,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(S4444_alpha_D32 ## suffix)
 #define DSTSIZE                 32
 #define SRCTYPE                 SkPMColor16
-#define CHECKSTATE(state)       SkASSERT(kARGB_4444_SkColorType == state.fBitmap->colorType()); \
+#define CHECKSTATE(state)       SkASSERT(kARGB_4444_SkColorType == state.fPixmap.colorType()); \
                                 SkASSERT(state.fAlphaScale < 256)
 #define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale
 #define RETURNDST(src)          SkAlphaMulQ(SkPixel4444ToPixel32(src), alphaScale)
@@ -218,7 +218,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(SA8_alpha_D32 ## suffix)
 #define DSTSIZE                 32
 #define SRCTYPE                 uint8_t
-#define CHECKSTATE(state)       SkASSERT(kAlpha_8_SkColorType == state.fBitmap->colorType());
+#define CHECKSTATE(state)       SkASSERT(kAlpha_8_SkColorType == state.fPixmap.colorType());
 #define PREAMBLE(state)         const SkPMColor pmColor = state.fPaintPMColor;
 #define RETURNDST(src)          SkAlphaMulQ(pmColor, SkAlpha255To256(src))
 #define SRC_TO_FILTER(src)      src
@@ -237,7 +237,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(SG8_alpha_D32 ## suffix)
 #define DSTSIZE                 32
 #define SRCTYPE                 uint8_t
-#define CHECKSTATE(state)       SkASSERT(kGray_8_SkColorType == state.fBitmap->colorType());
+#define CHECKSTATE(state)       SkASSERT(kGray_8_SkColorType == state.fPixmap.colorType());
 #define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale
 #define RETURNDST(src)          SkAlphaMulQ(SkPackARGB32(0xFF, src, src, src), alphaScale)
 #define SRC_TO_FILTER(src)      src
@@ -262,8 +262,8 @@
 #define MAKENAME(suffix)        NAME_WRAP(S32_D16 ## suffix)
 #define DSTSIZE                 16
 #define SRCTYPE                 SkPMColor
-#define CHECKSTATE(state)       SkASSERT(4 == state.fBitmap->bytesPerPixel()); \
-                                SkASSERT(state.fBitmap->isOpaque())
+#define CHECKSTATE(state)       SkASSERT(4 == state.fPixmap.info().bytesPerPixel()); \
+                                SkASSERT(state.fPixmap.isOpaque())
 #define RETURNDST(src)          SkPixel32ToPixel16(src)
 #define SRC_TO_FILTER(src)      src
 #include "SkBitmapProcState_sample.h"
@@ -280,7 +280,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(S16_D16 ## suffix)
 #define DSTSIZE                 16
 #define SRCTYPE                 uint16_t
-#define CHECKSTATE(state)       SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType())
+#define CHECKSTATE(state)       SkASSERT(kRGB_565_SkColorType == state.fPixmap.colorType())
 #define RETURNDST(src)          src
 #define SRC_TO_FILTER(src)      src
 #include "SkBitmapProcState_sample.h"
@@ -297,9 +297,9 @@
 #define MAKENAME(suffix)        NAME_WRAP(SI8_D16 ## suffix)
 #define DSTSIZE                 16
 #define SRCTYPE                 uint8_t
-#define CHECKSTATE(state)       SkASSERT(kIndex_8_SkColorType == state.fBitmap->colorType()); \
-                                SkASSERT(state.fBitmap->isOpaque())
-#define PREAMBLE(state)         const uint16_t* SK_RESTRICT table = state.fBitmap->getColorTable()->read16BitCache()
+#define CHECKSTATE(state)       SkASSERT(kIndex_8_SkColorType == state.fPixmap.colorType()); \
+                                SkASSERT(state.fPixmap.isOpaque())
+#define PREAMBLE(state)         const uint16_t* SK_RESTRICT table = state.fPixmap.ctable()->read16BitCache()
 #define RETURNDST(src)          table[src]
 #define SRC_TO_FILTER(src)      table[src]
 #define POSTAMBLE(state)
@@ -325,7 +325,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(Clamp_S16_D16 ## suffix)
 #define SRCTYPE                 uint16_t
 #define DSTTYPE                 uint16_t
-#define CHECKSTATE(state)       SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType())
+#define CHECKSTATE(state)       SkASSERT(kRGB_565_SkColorType == state.fPixmap.colorType())
 #define SRC_TO_FILTER(src)      src
 #include "SkBitmapProcState_shaderproc.h"
 
@@ -338,7 +338,7 @@
 #define MAKENAME(suffix)        NAME_WRAP(Repeat_S16_D16 ## suffix)
 #define SRCTYPE                 uint16_t
 #define DSTTYPE                 uint16_t
-#define CHECKSTATE(state)       SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType())
+#define CHECKSTATE(state)       SkASSERT(kRGB_565_SkColorType == state.fPixmap.colorType())
 #define SRC_TO_FILTER(src)      src
 #include "SkBitmapProcState_shaderproc.h"
 
@@ -353,8 +353,8 @@
 #define MAKENAME(suffix)        NAME_WRAP(Clamp_SI8_opaque_D32 ## suffix)
 #define SRCTYPE                 uint8_t
 #define DSTTYPE                 uint32_t
-#define CHECKSTATE(state)       SkASSERT(kIndex_8_SkColorType == state.fBitmap->colorType())
-#define PREAMBLE(state)         const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->readColors()
+#define CHECKSTATE(state)       SkASSERT(kIndex_8_SkColorType == state.fPixmap.colorType())
+#define PREAMBLE(state)         const SkPMColor* SK_RESTRICT table = state.fPixmap.ctable()->readColors()
 #define SRC_TO_FILTER(src)      table[src]
 #define POSTAMBLE(state)
 #include "SkBitmapProcState_shaderproc.h"
diff --git a/src/core/SkBitmapProcState_sample.h b/src/core/SkBitmapProcState_sample.h
index 7030516..5322a36 100644
--- a/src/core/SkBitmapProcState_sample.h
+++ b/src/core/SkBitmapProcState_sample.h
@@ -48,29 +48,29 @@
 #ifdef PREAMBLE
     PREAMBLE(s);
 #endif
-    const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
-    size_t rb = s.fBitmap->rowBytes();
+    const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr();
+    size_t rb = s.fPixmap.rowBytes();
 
     uint32_t XY;
     SRCTYPE src;
 
     for (int i = (count >> 1); i > 0; --i) {
         XY = *xy++;
-        SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() &&
-                 (XY & 0xFFFF) < (unsigned)s.fBitmap->width());
+        SkASSERT((XY >> 16) < (unsigned)s.fPixmap.height() &&
+                 (XY & 0xFFFF) < (unsigned)s.fPixmap.width());
         src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
         *colors++ = RETURNDST(src);
 
         XY = *xy++;
-        SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() &&
-                 (XY & 0xFFFF) < (unsigned)s.fBitmap->width());
+        SkASSERT((XY >> 16) < (unsigned)s.fPixmap.height() &&
+                 (XY & 0xFFFF) < (unsigned)s.fPixmap.width());
         src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
         *colors++ = RETURNDST(src);
     }
     if (count & 1) {
         XY = *xy++;
-        SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() &&
-                 (XY & 0xFFFF) < (unsigned)s.fBitmap->width());
+        SkASSERT((XY >> 16) < (unsigned)s.fPixmap.height() &&
+                 (XY & 0xFFFF) < (unsigned)s.fPixmap.width());
         src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
         *colors++ = RETURNDST(src);
     }
@@ -91,18 +91,18 @@
 #ifdef PREAMBLE
     PREAMBLE(s);
 #endif
-    const SRCTYPE* SK_RESTRICT srcAddr = (const SRCTYPE*)s.fBitmap->getPixels();
+    const SRCTYPE* SK_RESTRICT srcAddr = (const SRCTYPE*)s.fPixmap.addr();
 
     // buffer is y32, x16, x16, x16, x16, x16
     // bump srcAddr to the proper row, since we're told Y never changes
-    SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
+    SkASSERT((unsigned)xy[0] < (unsigned)s.fPixmap.height());
     srcAddr = (const SRCTYPE*)((const char*)srcAddr +
-                                                xy[0] * s.fBitmap->rowBytes());
+                                                xy[0] * s.fPixmap.rowBytes());
     xy += 1;
 
     SRCTYPE src;
 
-    if (1 == s.fBitmap->width()) {
+    if (1 == s.fPixmap.width()) {
         src = srcAddr[0];
         DSTTYPE dstValue = RETURNDST(src);
         BITMAPPROC_MEMSET(colors, dstValue, count);
@@ -123,7 +123,7 @@
         }
         const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy);
         for (i = (count & 3); i > 0; --i) {
-            SkASSERT(*xx < (unsigned)s.fBitmap->width());
+            SkASSERT(*xx < (unsigned)s.fPixmap.width());
             src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
         }
     }
@@ -145,8 +145,8 @@
 #ifdef PREAMBLE
     PREAMBLE(s);
 #endif
-    const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
-    size_t rb = s.fBitmap->rowBytes();
+    const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr();
+    size_t rb = s.fPixmap.rowBytes();
     unsigned subY;
     const SRCTYPE* SK_RESTRICT row0;
     const SRCTYPE* SK_RESTRICT row1;
@@ -191,8 +191,8 @@
 #ifdef PREAMBLE
         PREAMBLE(s);
 #endif
-    const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
-    size_t rb = s.fBitmap->rowBytes();
+    const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr();
+    size_t rb = s.fPixmap.rowBytes();
 
     do {
         uint32_t data = *xy++;
diff --git a/src/core/SkBitmapProcState_shaderproc.h b/src/core/SkBitmapProcState_shaderproc.h
index 7a7d45e..2708b01 100644
--- a/src/core/SkBitmapProcState_shaderproc.h
+++ b/src/core/SkBitmapProcState_shaderproc.h
@@ -24,7 +24,7 @@
     SkASSERT(s.fFilterLevel != kNone_SkFilterQuality);
     SkDEBUGCODE(CHECKSTATE(s);)
 
-    const unsigned maxX = s.fBitmap->width() - 1;
+    const unsigned maxX = s.fPixmap.width() - 1;
     const SkFixed oneX = s.fFilterOneX;
     const SkFixed dx = s.fInvSx;
     SkFixed fx;
@@ -37,14 +37,14 @@
         s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
                    SkIntToScalar(y) + SK_ScalarHalf, &pt);
         SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
-        const unsigned maxY = s.fBitmap->height() - 1;
+        const unsigned maxY = s.fPixmap.height() - 1;
         // compute our two Y values up front
         subY = TILEY_LOW_BITS(fy, maxY);
         int y0 = TILEY_PROCF(fy, maxY);
         int y1 = TILEY_PROCF((fy + s.fFilterOneY), maxY);
 
-        const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
-        size_t rb = s.fBitmap->rowBytes();
+        const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr();
+        size_t rb = s.fPixmap.rowBytes();
         row0 = (const SRCTYPE*)(srcAddr + y0 * rb);
         row1 = (const SRCTYPE*)(srcAddr + y1 * rb);
         // now initialize fx
diff --git a/src/opts/SkBitmapProcState_matrix_neon.h b/src/opts/SkBitmapProcState_matrix_neon.h
index 72bf1bc..fbb2a1e 100644
--- a/src/opts/SkBitmapProcState_matrix_neon.h
+++ b/src/opts/SkBitmapProcState_matrix_neon.h
@@ -1,7 +1,12 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
 
 #include <arm_neon.h>
 
-
 #define SCALE_NOFILTER_NAME     MAKENAME(_nofilter_scale)
 #define SCALE_FILTER_NAME       MAKENAME(_filter_scale)
 #define AFFINE_NOFILTER_NAME    MAKENAME(_nofilter_affine)
@@ -30,14 +35,14 @@
     PREAMBLE(s);
 
     // we store y, x, x, x, x, x
-    const unsigned maxX = s.fBitmap->width() - 1;
+    const unsigned maxX = s.fPixmap.width() - 1;
     SkFractionalInt fx;
     {
         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;
+        const unsigned maxY = s.fPixmap.height() - 1;
         *xy++ = TILEY_PROCF(SkFractionalIntToFixed(fx), maxY);
         fx = SkScalarToFractionalInt(pt.fX);
     }
@@ -122,8 +127,8 @@
     SkFractionalInt fy = SkScalarToFractionalInt(srcPt.fY);
     SkFractionalInt dx = s.fInvSxFractionalInt;
     SkFractionalInt dy = s.fInvKyFractionalInt;
-    int maxX = s.fBitmap->width() - 1;
-    int maxY = s.fBitmap->height() - 1;
+    int maxX = s.fPixmap.width() - 1;
+    int maxY = s.fPixmap.height() - 1;
 
     if (count >= 8) {
         SkFractionalInt dx4 = dx * 4;
@@ -187,8 +192,8 @@
 
     PREAMBLE(s);
     // max{X,Y} are int here, but later shown/assumed to fit in 16 bits
-    int maxX = s.fBitmap->width() - 1;
-    int maxY = s.fBitmap->height() - 1;
+    int maxX = s.fPixmap.width() - 1;
+    int maxY = s.fPixmap.height() - 1;
 
     SkPerspIter iter(s.fInvMatrix,
                      SkIntToScalar(x) + SK_ScalarHalf,
@@ -293,7 +298,7 @@
 
     PREAMBLE(s);
 
-    const unsigned maxX = s.fBitmap->width() - 1;
+    const unsigned maxX = s.fPixmap.width() - 1;
     const SkFixed one = s.fFilterOneX;
     const SkFractionalInt dx = s.fInvSxFractionalInt;
     SkFractionalInt fx;
@@ -303,7 +308,7 @@
         s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
                                  SkIntToScalar(y) + SK_ScalarHalf, &pt);
         const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
-        const unsigned maxY = s.fBitmap->height() - 1;
+        const unsigned maxY = s.fPixmap.height() - 1;
         // compute our two Y values up front
         *xy++ = PACK_FILTER_Y_NAME(fy, maxY, s.fFilterOneY PREAMBLE_ARG_Y);
         // now initialize fx
@@ -369,8 +374,8 @@
     SkFixed fy = SkScalarToFixed(srcPt.fY) - (oneY >> 1);
     SkFixed dx = s.fInvSx;
     SkFixed dy = s.fInvKy;
-    unsigned maxX = s.fBitmap->width() - 1;
-    unsigned maxY = s.fBitmap->height() - 1;
+    unsigned maxX = s.fPixmap.width() - 1;
+    unsigned maxY = s.fPixmap.height() - 1;
 
     if (count >= 4) {
         int32x4_t wide_fy, wide_fx;
@@ -420,8 +425,8 @@
     SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask);
 
     PREAMBLE(s);
-    unsigned maxX = s.fBitmap->width() - 1;
-    unsigned maxY = s.fBitmap->height() - 1;
+    unsigned maxX = s.fPixmap.width() - 1;
+    unsigned maxY = s.fPixmap.height() - 1;
     SkFixed oneX = s.fFilterOneX;
     SkFixed oneY = s.fFilterOneY;
 
diff --git a/src/opts/SkBitmapProcState_opts_SSE2.cpp b/src/opts/SkBitmapProcState_opts_SSE2.cpp
index 659caf2..f55a099 100644
--- a/src/opts/SkBitmapProcState_opts_SSE2.cpp
+++ b/src/opts/SkBitmapProcState_opts_SSE2.cpp
@@ -16,11 +16,11 @@
                                    int count, uint32_t* colors) {
     SkASSERT(count > 0 && colors != NULL);
     SkASSERT(s.fFilterLevel != kNone_SkFilterQuality);
-    SkASSERT(kN32_SkColorType == s.fBitmap->colorType());
+    SkASSERT(kN32_SkColorType == s.fPixmap.colorType());
     SkASSERT(s.fAlphaScale == 256);
 
-    const char* srcAddr = static_cast<const char*>(s.fBitmap->getPixels());
-    size_t rb = s.fBitmap->rowBytes();
+    const char* srcAddr = static_cast<const char*>(s.fPixmap.addr());
+    size_t rb = s.fPixmap.rowBytes();
     uint32_t XY = *xy++;
     unsigned y0 = XY >> 14;
     const uint32_t* row0 = reinterpret_cast<const uint32_t*>(srcAddr + (y0 >> 4) * rb);
@@ -122,11 +122,11 @@
                                   int count, uint32_t* colors) {
     SkASSERT(count > 0 && colors != NULL);
     SkASSERT(s.fFilterLevel != kNone_SkFilterQuality);
-    SkASSERT(kN32_SkColorType == s.fBitmap->colorType());
+    SkASSERT(kN32_SkColorType == s.fPixmap.colorType());
     SkASSERT(s.fAlphaScale < 256);
 
-    const char* srcAddr = static_cast<const char*>(s.fBitmap->getPixels());
-    size_t rb = s.fBitmap->rowBytes();
+    const char* srcAddr = static_cast<const char*>(s.fPixmap.addr());
+    size_t rb = s.fPixmap.rowBytes();
     uint32_t XY = *xy++;
     unsigned y0 = XY >> 14;
     const uint32_t* row0 = reinterpret_cast<const uint32_t*>(srcAddr + (y0 >> 4) * rb);
@@ -249,7 +249,7 @@
                              SkMatrix::kScale_Mask)) == 0);
     SkASSERT(s.fInvKy == 0);
 
-    const unsigned maxX = s.fBitmap->width() - 1;
+    const unsigned maxX = s.fPixmap.width() - 1;
     const SkFixed one = s.fFilterOneX;
     const SkFixed dx = s.fInvSx;
     SkFixed fx;
@@ -258,7 +258,7 @@
     s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
                              SkIntToScalar(y) + SK_ScalarHalf, &pt);
     const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
-    const unsigned maxY = s.fBitmap->height() - 1;
+    const unsigned maxY = s.fPixmap.height() - 1;
     // compute our two Y values up front
     *xy++ = ClampX_ClampY_pack_filter(fy, maxY, s.fFilterOneY);
     // now initialize fx
@@ -373,13 +373,13 @@
                              SkMatrix::kScale_Mask)) == 0);
 
     // we store y, x, x, x, x, x
-    const unsigned maxX = s.fBitmap->width() - 1;
+    const unsigned maxX = s.fPixmap.width() - 1;
     SkFixed fx;
     SkPoint pt;
     s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
                              SkIntToScalar(y) + SK_ScalarHalf, &pt);
     fx = SkScalarToFixed(pt.fY);
-    const unsigned maxY = s.fBitmap->height() - 1;
+    const unsigned maxY = s.fPixmap.height() - 1;
     *xy++ = SkClampMax(fx >> 16, maxY);
     fx = SkScalarToFixed(pt.fX);
 
@@ -500,8 +500,8 @@
     SkFixed fy = SkScalarToFixed(srcPt.fY) - (oneY >> 1);
     SkFixed dx = s.fInvSx;
     SkFixed dy = s.fInvKy;
-    unsigned maxX = s.fBitmap->width() - 1;
-    unsigned maxY = s.fBitmap->height() - 1;
+    unsigned maxX = s.fPixmap.width() - 1;
+    unsigned maxY = s.fPixmap.height() - 1;
 
     if (count >= 2 && (maxX <= 0xFFFF)) {
         SkFixed dx2 = dx + dx;
@@ -574,8 +574,8 @@
     SkFixed fy = SkScalarToFixed(srcPt.fY);
     SkFixed dx = s.fInvSx;
     SkFixed dy = s.fInvKy;
-    int maxX = s.fBitmap->width() - 1;
-    int maxY = s.fBitmap->height() - 1;
+    int maxX = s.fPixmap.width() - 1;
+    int maxY = s.fPixmap.height() - 1;
 
     if (count >= 4 && (maxX <= 0xFFFF)) {
         while (((size_t)xy & 0x0F) != 0) {
@@ -642,12 +642,12 @@
                             int count, uint16_t* colors) {
     SkASSERT(count > 0 && colors != NULL);
     SkASSERT(s.fFilterLevel != kNone_SkFilterQuality);
-    SkASSERT(kN32_SkColorType == s.fBitmap->colorType());
-    SkASSERT(s.fBitmap->isOpaque());
+    SkASSERT(kN32_SkColorType == s.fPixmap.colorType());
+    SkASSERT(s.fPixmap.isOpaque());
 
     SkPMColor dstColor;
-    const char* srcAddr = static_cast<const char*>(s.fBitmap->getPixels());
-    size_t rb = s.fBitmap->rowBytes();
+    const char* srcAddr = static_cast<const char*>(s.fPixmap.addr());
+    size_t rb = s.fPixmap.rowBytes();
     uint32_t XY = *xy++;
     unsigned y0 = XY >> 14;
     const uint32_t* row0 = reinterpret_cast<const uint32_t*>(srcAddr + (y0 >> 4) * rb);
diff --git a/src/opts/SkBitmapProcState_opts_SSSE3.cpp b/src/opts/SkBitmapProcState_opts_SSSE3.cpp
index bfcd7ca..15a9664 100644
--- a/src/opts/SkBitmapProcState_opts_SSSE3.cpp
+++ b/src/opts/SkBitmapProcState_opts_SSSE3.cpp
@@ -395,7 +395,7 @@
                                      int count, uint32_t* colors) {
     SkASSERT(count > 0 && colors != NULL);
     SkASSERT(s.fFilterLevel != kNone_SkFilterQuality);
-    SkASSERT(kN32_SkColorType == s.fBitmap->colorType());
+    SkASSERT(kN32_SkColorType == s.fPixmap.colorType());
     if (has_alpha) {
         SkASSERT(s.fAlphaScale < 256);
     } else {
@@ -403,8 +403,8 @@
     }
 
     const uint8_t* src_addr =
-            static_cast<const uint8_t*>(s.fBitmap->getPixels());
-    const size_t rb = s.fBitmap->rowBytes();
+            static_cast<const uint8_t*>(s.fPixmap.addr());
+    const size_t rb = s.fPixmap.rowBytes();
     const uint32_t XY = *xy++;
     const unsigned y0 = XY >> 14;
     const uint32_t* row0 =
@@ -587,7 +587,7 @@
                                        int count, uint32_t* colors) {
     SkASSERT(count > 0 && colors != NULL);
     SkASSERT(s.fFilterLevel != kNone_SkFilterQuality);
-    SkASSERT(kN32_SkColorType == s.fBitmap->colorType());
+    SkASSERT(kN32_SkColorType == s.fPixmap.colorType());
     if (has_alpha) {
         SkASSERT(s.fAlphaScale < 256);
     } else {
@@ -595,8 +595,8 @@
     }
 
     const uint8_t* src_addr =
-                        static_cast<const uint8_t*>(s.fBitmap->getPixels());
-    const size_t rb = s.fBitmap->rowBytes();
+                        static_cast<const uint8_t*>(s.fPixmap.addr());
+    const size_t rb = s.fPixmap.rowBytes();
 
     // vector constants
     const __m128i mask_dist_select = _mm_set_epi8(12, 12, 12, 12,
diff --git a/src/opts/SkBitmapProcState_opts_arm.cpp b/src/opts/SkBitmapProcState_opts_arm.cpp
index e6799de..bd67ba4 100644
--- a/src/opts/SkBitmapProcState_opts_arm.cpp
+++ b/src/opts/SkBitmapProcState_opts_arm.cpp
@@ -30,18 +30,17 @@
     SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
     SkASSERT(kNone_SkFilterQuality == s.fFilterLevel);
 
-    const uint16_t* SK_RESTRICT table = s.fBitmap->getColorTable()->read16BitCache();
-    const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fBitmap->getPixels();
+    const uint16_t* SK_RESTRICT table = s.fPixmap.ctable()->read16BitCache();
+    const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fPixmap.addr();
 
     // buffer is y32, x16, x16, x16, x16, x16
     // bump srcAddr to the proper row, since we're told Y never changes
-    SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
-    srcAddr = (const uint8_t*)((const char*)srcAddr +
-                               xy[0] * s.fBitmap->rowBytes());
+    SkASSERT((unsigned)xy[0] < (unsigned)s.fPixmap.height());
+    srcAddr = (const uint8_t*)((const char*)srcAddr + xy[0] * s.fPixmap.rowBytes());
 
     uint8_t src;
 
-    if (1 == s.fBitmap->width()) {
+    if (1 == s.fPixmap.width()) {
         src = srcAddr[0];
         uint16_t dstValue = table[src];
         sk_memset16(colors, dstValue, count);
@@ -119,15 +118,15 @@
     SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
     SkASSERT(kNone_SkFilterQuality == s.fFilterLevel);
 
-    const SkPMColor* SK_RESTRICT table = s.fBitmap->getColorTable()->readColors();
-    const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fBitmap->getPixels();
+    const SkPMColor* SK_RESTRICT table = s.fPixmap.ctable()->readColors();
+    const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fPixmap.addr();
 
     // buffer is y32, x16, x16, x16, x16, x16
     // bump srcAddr to the proper row, since we're told Y never changes
-    SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
-    srcAddr = (const uint8_t*)((const char*)srcAddr + xy[0] * s.fBitmap->rowBytes());
+    SkASSERT((unsigned)xy[0] < (unsigned)s.fPixmap.height());
+    srcAddr = (const uint8_t*)((const char*)srcAddr + xy[0] * s.fPixmap.rowBytes());
 
-    if (1 == s.fBitmap->width()) {
+    if (1 == s.fPixmap.width()) {
         uint8_t src = srcAddr[0];
         SkPMColor dstValue = table[src];
         sk_memset32(colors, dstValue, count);
@@ -199,7 +198,7 @@
         justDx = true;
     }
 
-    switch (fBitmap->colorType()) {
+    switch (fPixmap.colorType()) {
         case kIndex_8_SkColorType:
             if (justDx && kNone_SkFilterQuality == fFilterLevel) {
 #if 0   /* crashing on android device */
diff --git a/src/opts/SkBitmapProcState_opts_mips_dsp.cpp b/src/opts/SkBitmapProcState_opts_mips_dsp.cpp
index 049519a..6b8195c 100644
--- a/src/opts/SkBitmapProcState_opts_mips_dsp.cpp
+++ b/src/opts/SkBitmapProcState_opts_mips_dsp.cpp
@@ -18,13 +18,13 @@
     SkASSERT(count > 0 && colors != NULL);
     SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
     SkASSERT(kNone_SkFilterQuality == s.fFilterLevel);
-    const uint16_t* SK_RESTRICT table = s.fBitmap->getColorTable()->read16BitCache();
-    const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fBitmap->getPixels();
-    SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
-    srcAddr = (const uint8_t*)((const char*)srcAddr + xy[0] * s.fBitmap->rowBytes());
+    const uint16_t* SK_RESTRICT table = s.fPixmap.ctable()->read16BitCache();
+    const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fPixmap.addr();
+    SkASSERT((unsigned)xy[0] < (unsigned)s.fPixmap.height());
+    srcAddr = (const uint8_t*)((const char*)srcAddr + xy[0] * s.fPixmap.rowBytes());
     uint8_t src;
 
-    if (1 == s.fBitmap->width()) {
+    if (1 == s.fPixmap.width()) {
         src = srcAddr[0];
         uint16_t dstValue = table[src];
         sk_memset16(colors, dstValue, count);
@@ -150,11 +150,11 @@
     SkASSERT(count > 0 && colors != NULL);
     SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
     SkASSERT(kNone_SkFilterQuality == s.fFilterLevel);
-    const SkPMColor* SK_RESTRICT table = s.fBitmap->getColorTable()->readColors();
-    const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fBitmap->getPixels();
-    srcAddr = (const uint8_t*)((const char*)srcAddr + xy[0] * s.fBitmap->rowBytes());
+    const SkPMColor* SK_RESTRICT table = s.fPixmap.ctable()->readColors();
+    const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fPixmap.addr();
+    srcAddr = (const uint8_t*)((const char*)srcAddr + xy[0] * s.fPixmap.rowBytes());
 
-    if (1 == s.fBitmap->width()) {
+    if (1 == s.fPixmap.width()) {
         uint8_t src = srcAddr[0];
         SkPMColor dstValue = table[src];
         sk_memset32(colors, dstValue, count);
@@ -376,7 +376,7 @@
         justDx = true;
     }
 
-    switch (fBitmap->colorType()) {
+    switch (fPixmap.colorType()) {
         case kIndex_8_SkColorType:
             if (justDx && kNone_SkFilterQuality == fFilterLevel) {
                 fSampleProc16 = SI8_D16_nofilter_DX_mips_dsp;