diff --git a/experimental/AndroidPathRenderer/AndroidPathRenderer.cpp b/experimental/AndroidPathRenderer/AndroidPathRenderer.cpp
index 3ade9e6..051ed19 100644
--- a/experimental/AndroidPathRenderer/AndroidPathRenderer.cpp
+++ b/experimental/AndroidPathRenderer/AndroidPathRenderer.cpp
@@ -52,8 +52,8 @@
         float m01 = transform->getSkewY();
         float m10 = transform->getSkewX();
         float m11 = transform->getScaleY();
-        float scaleX = sqrt(m00 * m00 + m01 * m01);
-        float scaleY = sqrt(m10 * m10 + m11 * m11);
+        float scaleX = sk_float_sqrt(m00 * m00 + m01 * m01);
+        float scaleY = sk_float_sqrt(m10 * m10 + m11 * m11);
         inverseScaleX = (scaleX != 0) ? (1.0f / scaleX) : 1.0f;
         inverseScaleY = (scaleY != 0) ? (1.0f / scaleY) : 1.0f;
     } else {
@@ -82,7 +82,7 @@
  */
 inline SkVector totalOffsetFromNormals(const SkVector& normalA, const SkVector& normalB) {
     SkVector pseudoNormal = normalA + normalB;
-    pseudoNormal.scale(1.0f / (1.0f + fabs(normalA.dot(normalB))));
+    pseudoNormal.scale(1.0f / (1.0f + sk_float_abs(normalA.dot(normalB))));
     return pseudoNormal;
 }
 
@@ -661,8 +661,8 @@
         float sqrInvScaleX, float sqrInvScaleY, SkTArray<Vertex, true>* outputVertices) {
     float dx = p2x - p1x;
     float dy = p2y - p1y;
-    float d1 = fabs((c1x - p2x) * dy - (c1y - p2y) * dx);
-    float d2 = fabs((c2x - p2x) * dy - (c2y - p2y) * dx);
+    float d1 = sk_float_abs((c1x - p2x) * dy - (c1y - p2y) * dx);
+    float d2 = sk_float_abs((c2x - p2x) * dy - (c2y - p2y) * dx);
     float d = d1 + d2;
 
     // multiplying by sqrInvScaleY/X equivalent to multiplying in dimensional scale factors
diff --git a/gm/blurrect.cpp b/gm/blurrect.cpp
index a7598fe..a1faf94 100644
--- a/gm/blurrect.cpp
+++ b/gm/blurrect.cpp
@@ -138,7 +138,7 @@
 class BlurRectCompareGM : public skiagm::GM {
     SkString  fName;
     unsigned int fRectWidth, fRectHeight;
-    float fRadius;
+    SkScalar fRadius;
 public:
     BlurRectCompareGM(const char name[], unsigned int rectWidth, unsigned int rectHeight, float radius) :
         fName(name)
@@ -149,7 +149,7 @@
 
   int width() const { return fRectWidth; }
   int height() const { return fRectHeight; }
-  int radius() const { return fRadius; }
+  SkScalar radius() const { return fRadius; }
 
 protected:
     virtual SkString onShortName() {
@@ -160,7 +160,7 @@
         return SkISize::Make(640, 480);
     }
 
-    virtual void makeMask( SkMask *m, SkRect r ) = 0;
+    virtual void makeMask( SkMask *m, const SkRect& ) = 0;
 
     virtual void onDraw(SkCanvas* canvas) {
       SkRect r;
@@ -184,12 +184,14 @@
 
 class BlurRectFastGM: public BlurRectCompareGM {
 public:
-  BlurRectFastGM(const char name[], unsigned int rect_width, unsigned int rect_height, float blur_radius) :
-    BlurRectCompareGM( name, rect_width, rect_height, blur_radius ) {}
+    BlurRectFastGM(const char name[], unsigned int rect_width,
+                   unsigned int rect_height, float blur_radius) :
+        BlurRectCompareGM( name, rect_width, rect_height, blur_radius ) {}
 protected:
-  virtual void makeMask( SkMask *m, SkRect r ) {
-    SkBlurMask::BlurRect( m, r, radius(), SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality );
-  }
+    virtual void makeMask( SkMask *m, const SkRect& r) SK_OVERRIDE {
+        SkBlurMask::BlurRect( m, r, radius(), SkBlurMask::kNormal_Style,
+                             SkBlurMask::kHigh_Quality );
+    }
 };
 
 class BlurRectSlowGM: public BlurRectCompareGM {
@@ -197,17 +199,18 @@
   BlurRectSlowGM(const char name[], unsigned int rect_width, unsigned int rect_height, float blur_radius) :
     BlurRectCompareGM( name, rect_width, rect_height, blur_radius ) {}
 protected:
-  virtual void makeMask( SkMask *m, SkRect r ) {
-    SkMask src;
-    src.fFormat = SkMask::kA8_Format;
-    src.fRowBytes = r.width();
-    src.fBounds = SkIRect::MakeWH(r.width(), r.height());
-    src.fImage = SkMask::AllocImage( src.computeTotalImageSize() );
+    virtual void makeMask( SkMask *m, const SkRect& r) SK_OVERRIDE {
+        SkMask src;
+        r.roundOut(&src.fBounds);
+        src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop);  // move to origin
+        src.fFormat = SkMask::kA8_Format;
+        src.fRowBytes = src.fBounds.width();
+        src.fImage = SkMask::AllocImage( src.computeTotalImageSize() );
 
-    memset( src.fImage, 0xff, src.computeTotalImageSize() );
+        memset( src.fImage, 0xff, src.computeTotalImageSize() );
 
-    SkBlurMask::BlurSeparable( m, src, radius()/2, SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality );
-  }
+        SkBlurMask::BlurSeparable( m, src, radius()/2, SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality );
+    }
 };
 
 
diff --git a/gm/dashing.cpp b/gm/dashing.cpp
index 70fb9b1..914824d 100644
--- a/gm/dashing.cpp
+++ b/gm/dashing.cpp
@@ -245,7 +245,7 @@
         // 1on/1off 1x1 squares with phase of 1 and non-integer length - rects fastpath
         canvas->save();
             canvas->translate(332, 0);
-            this->drawDashedLines(canvas, 99.5, SK_ScalarHalf, SK_Scalar1, 1, false);
+            this->drawDashedLines(canvas, 99.5f, SK_ScalarHalf, SK_Scalar1, 1, false);
         canvas->restore();
 
         // 1on/1off 3x3 squares with phase of 0 - points fast path
diff --git a/samplecode/SampleRotateCircles.cpp b/samplecode/SampleRotateCircles.cpp
index 32a46a3..5bac6cf 100644
--- a/samplecode/SampleRotateCircles.cpp
+++ b/samplecode/SampleRotateCircles.cpp
@@ -249,11 +249,12 @@
 
         SkPoint pos, tan;
         for (SkScalar dist = 0; dist <= total; dist += delta) {
-            (void)meas.getPosTan(dist, &pos, &tan);
-            tan.scale(radius);
-            tan.rotateCCW();
-            canvas->drawLine(pos.x() + tan.x(), pos.y() + tan.y(),
-                             pos.x() - tan.x(), pos.y() - tan.y(), paint);
+            if (meas.getPosTan(dist, &pos, &tan)) {
+                tan.scale(radius);
+                tan.rotateCCW();
+                canvas->drawLine(pos.x() + tan.x(), pos.y() + tan.y(),
+                                 pos.x() - tan.x(), pos.y() - tan.y(), paint);
+            }
         }
     }
 
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
index 5554f46..f0dafc1 100644
--- a/src/core/SkBitmap.cpp
+++ b/src/core/SkBitmap.cpp
@@ -701,7 +701,7 @@
             if (!table) {
                 return false;
             }
-            SkPMColor c = ~0;
+            SkPMColor c = (SkPMColor)~0;
             for (int i = bm.getColorTable()->count() - 1; i >= 0; --i) {
                 c &= table[i];
             }
@@ -724,7 +724,7 @@
             return true;
         } break;
         case SkBitmap::kARGB_8888_Config: {
-            SkPMColor c = ~0;
+            SkPMColor c = (SkPMColor)~0;
             for (int y = 0; y < height; ++y) {
                 const SkPMColor* row = bm.getAddr32(0, y);
                 for (int x = 0; x < width; ++x) {
diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp
index a1e32bc..26ac088 100644
--- a/src/utils/SkDeferredCanvas.cpp
+++ b/src/utils/SkDeferredCanvas.cpp
@@ -20,7 +20,7 @@
 enum {
     // Deferred canvas will auto-flush when recording reaches this limit
     kDefaultMaxRecordingStorageBytes = 64*1024*1024,
-    kDeferredCanvasBitmapSizeThreshold = ~0, // Disables this feature
+    kDeferredCanvasBitmapSizeThreshold = ~0U, // Disables this feature
 };
 
 enum PlaybackMode {
