diff --git a/bench/MathBench.cpp b/bench/MathBench.cpp
index 9feb5af..61ac26b 100644
--- a/bench/MathBench.cpp
+++ b/bench/MathBench.cpp
@@ -22,7 +22,9 @@
         }
     }
 
-    virtual void performTest(float dst[], const float src[], int count) = 0;
+    virtual void performTest(float* SK_RESTRICT dst, 
+                              const float* SK_RESTRICT src, 
+                              int count) = 0;
 
 protected:
     virtual int mulLoopCount() const { return 1; }
@@ -47,10 +49,13 @@
     MathBenchU32(void* param, const char name[]) : INHERITED(param, name) {}
 
 protected:
-    virtual void performITest(uint32_t* dst, const uint32_t* src, int count) = 0;
+    virtual void performITest(uint32_t* SK_RESTRICT dst, 
+                              const uint32_t* SK_RESTRICT src, 
+                              int count) = 0;
     
-    virtual void performTest(float* SK_RESTRICT dst, const float* SK_RESTRICT src,
-                             int count) SK_OVERRIDE {
+    virtual void performTest(float* SK_RESTRICT dst, 
+                              const float* SK_RESTRICT src,
+                              int count) SK_OVERRIDE {
         uint32_t* d = SkTCast<uint32_t*>(dst);
         const uint32_t* s = SkTCast<const uint32_t*>(src);
         this->performITest(d, s, count);
@@ -65,7 +70,9 @@
 public:
     NoOpMathBench(void* param) : INHERITED(param, "noOp") {}
 protected:
-    virtual void performTest(float dst[], const float src[], int count) {
+    virtual void performTest(float* SK_RESTRICT dst, 
+                              const float* SK_RESTRICT src, 
+                              int count) {
         for (int i = 0; i < count; ++i) {
             dst[i] = src[i] + 1;
         }
@@ -78,7 +85,9 @@
 public:
     SlowISqrtMathBench(void* param) : INHERITED(param, "slowIsqrt") {}
 protected:
-    virtual void performTest(float dst[], const float src[], int count) {
+    virtual void performTest(float* SK_RESTRICT dst, 
+                              const float* SK_RESTRICT src, 
+                              int count) {
         for (int i = 0; i < count; ++i) {
             dst[i] = 1.0f / sk_float_sqrt(src[i]);
         }
@@ -101,7 +110,9 @@
 public:
     FastISqrtMathBench(void* param) : INHERITED(param, "fastIsqrt") {}
 protected:
-    virtual void performTest(float dst[], const float src[], int count) {
+    virtual void performTest(float* SK_RESTRICT dst, 
+                              const float* SK_RESTRICT src, 
+                              int count) {
         for (int i = 0; i < count; ++i) {
             dst[i] = SkFastInvSqrt(src[i]);
         }
@@ -159,7 +170,7 @@
 }
 
 static bool isFinite_float(float x) {
-    return sk_float_isfinite(x);
+    return SkToBool(sk_float_isfinite(x));
 }
 
 static bool isFinite_mulzero(float x) {
diff --git a/experimental/Debugger/DebuggerContentView.cpp b/experimental/Debugger/DebuggerContentView.cpp
index d12582a..27fc8c6 100644
--- a/experimental/Debugger/DebuggerContentView.cpp
+++ b/experimental/Debugger/DebuggerContentView.cpp
@@ -5,7 +5,7 @@
 static const char gIsDebuggerQuery[] = "is-debugger";
 class DebuggerView : public SampleView {
 public:
-	DebuggerView(const char* data, size_t size) {
+        DebuggerView(const char* data, size_t size) {
         fData.append(size, data);
         fCommandsVisible = true;
         fCommandsResizing = false;
@@ -192,7 +192,8 @@
                     fStateResizing = true;
                 }
                 else if (curr.fX < fCommands->width()) {
-                    fAtomsToRead = fCommands->selectHighlight(curr.fY);
+                    fAtomsToRead = fCommands->selectHighlight(
+                                                  SkScalarFloorToInt(curr.fY));
                 }
                 else 
                     handled = false;
@@ -232,8 +233,8 @@
         this->INHERITED::onSizeChange();
         fCommands->setSize(CMD_WIDTH, this->height());
         fCommands->setLoc(0, 0);
-        fState->setSize(this->width() - CMD_WIDTH, INFO_HEIGHT);
-        fState->setLoc(CMD_WIDTH, this->height() - INFO_HEIGHT);
+        fState->setSize(this->width() - CMD_WIDTH, SkFloatToScalar(INFO_HEIGHT));
+        fState->setLoc(CMD_WIDTH, this->height() - SkFloatToScalar(INFO_HEIGHT));
     }
     
 private:
diff --git a/experimental/Debugger/DebuggerViews.h b/experimental/Debugger/DebuggerViews.h
index acaa68b..f025c79 100644
--- a/experimental/Debugger/DebuggerViews.h
+++ b/experimental/Debugger/DebuggerViews.h
@@ -25,7 +25,7 @@
 
 #define SKDEBUGGER_TEXTSIZE         14
 #define CMD_WIDTH                   200
-#define INFO_HEIGHT                 150.0
+#define INFO_HEIGHT                 150.0f
 #define SKDEBUGGER_HIGHLIGHTCOLOR   0xFF113399
 #define SKDEBUGGER_TEXTCOLOR        0xFF000000
 #define SKDEBUGGER_RESIZEBARCOLOR   0xFF333333
diff --git a/gm/tablecolorfilter.cpp b/gm/tablecolorfilter.cpp
index 7f0a623..6e2b943 100644
--- a/gm/tablecolorfilter.cpp
+++ b/gm/tablecolorfilter.cpp
@@ -66,7 +66,7 @@
 static void make_table2(uint8_t table[]) {
     for (int i = 0; i < 256; ++i) {
         float fi = i / 255.0f;
-        table[i] = sqrtf(fi) * 255;
+        table[i] = static_cast<uint8_t>(sqrtf(fi) * 255);
     }
 }
 
diff --git a/samplecode/SamplePicture.cpp b/samplecode/SamplePicture.cpp
index d2c9d65..7317fbe 100644
--- a/samplecode/SamplePicture.cpp
+++ b/samplecode/SamplePicture.cpp
@@ -57,7 +57,7 @@
 class PictureView : public SampleView {
     SkBitmap fBitmap;
 public:
-	PictureView() {
+        PictureView() {
         SkImageRef_GlobalPool::SetRAMBudget(16 * 1024);
 
         fBitmap = load_bitmap();
@@ -102,7 +102,7 @@
         SkPaint paint;
 
         canvas->save();
-        canvas->scale(0.5f, 0.5f);
+        canvas->scale(SkFloatToScalar(0.5f), SkFloatToScalar(0.5f));
         canvas->drawBitmap(fBitmap, 0, 0, NULL);
         canvas->restore();
 
diff --git a/tests/AAClipTest.cpp b/tests/AAClipTest.cpp
index 4817c06..2898f30 100644
--- a/tests/AAClipTest.cpp
+++ b/tests/AAClipTest.cpp
@@ -322,10 +322,10 @@
     {
         SkAAClip clip;
         SkRect r;
-        r.fLeft = SkFloatToScalar(129.892181);
-        r.fTop = SkFloatToScalar(10.3999996);
-        r.fRight = SkFloatToScalar(130.892181); 
-        r.fBottom = SkFloatToScalar(20.3999996);
+        r.fLeft = SkFloatToScalar(129.892181f);
+        r.fTop = SkFloatToScalar(10.3999996f);
+        r.fRight = SkFloatToScalar(130.892181f); 
+        r.fBottom = SkFloatToScalar(20.3999996f);
         clip.setRect(r, true);
     }
 }
diff --git a/tests/ClipCubicTest.cpp b/tests/ClipCubicTest.cpp
index 491d0e5..1c9199f 100644
--- a/tests/ClipCubicTest.cpp
+++ b/tests/ClipCubicTest.cpp
@@ -81,7 +81,7 @@
     SkPoint clipped[4], shouldbe[4];
     SkIRect clipRect;
     bool success;
-    const float tol = SkFloatToScalar(1e-4);
+    const float tol = SkFloatToScalar(1e-4f);
 
     // Test no clip, with plenty of room.
     clipRect.set(-2, -2, 6, 14);
@@ -119,9 +119,9 @@
     success = clipper.clipCubic(crv, clipped);
     REPORTER_ASSERT(reporter, success == true);
     REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve(
-        0.5126125216, 1,
-        1.841195941,  4.337081432,
-        1.297019958,  10.19801331,
+        0.5126125216f, 1,
+        1.841195941f,  4.337081432f,
+        1.297019958f,  10.19801331f,
         4,            12,
         shouldbe), tol));
 
@@ -131,9 +131,9 @@
     success = clipper.clipCubic(crv, clipped);
     REPORTER_ASSERT(reporter, success == true);
     REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve(
-        00.8412352204, 2,
-        1.767683744,   5.400758266,
-        1.55052948,    10.36701965,
+        00.8412352204f, 2,
+        1.767683744f,   5.400758266f,
+        1.55052948f,    10.36701965f,
         4,             12,
         shouldbe), tol));
 
@@ -144,9 +144,9 @@
     REPORTER_ASSERT(reporter, success == true);
     REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve(
         0,           0,
-        1.742904663, 2.614356995,
-        1.207521796, 8.266430855,
-        3.026495695, 11,
+        1.742904663f, 2.614356995f,
+        1.207521796f, 8.266430855f,
+        3.026495695f, 11,
         shouldbe), tol));
 
     // Test clip at 10.
@@ -156,9 +156,9 @@
     REPORTER_ASSERT(reporter, success == true);
     REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve(
         0,           0,
-        1.551193237, 2.326789856,
-        1.297736168, 7.059780121,
-        2.505550385, 10,
+        1.551193237f, 2.326789856f,
+        1.297736168f, 7.059780121f,
+        2.505550385f, 10,
         shouldbe), tol));
 
     test_giantClip();
diff --git a/tests/ClipperTest.cpp b/tests/ClipperTest.cpp
index d8949bf..d739d31 100644
--- a/tests/ClipperTest.cpp
+++ b/tests/ClipperTest.cpp
@@ -52,10 +52,10 @@
     SkEdgeClipper clipper;
     
     const SkPoint pts[] = {
-        { SkFloatToScalar(3.0995476e+010),  SkFloatToScalar(42.929779) },
-        { SkFloatToScalar(-3.0995163e+010), SkFloatToScalar(51.050385) },
-        { SkFloatToScalar(-3.0995157e+010), SkFloatToScalar(51.050392) },
-        { SkFloatToScalar(-3.0995134e+010), SkFloatToScalar(51.050400) },
+        { SkFloatToScalar(3.0995476e+010f),  SkFloatToScalar(42.929779f) },
+        { SkFloatToScalar(-3.0995163e+010f), SkFloatToScalar(51.050385f) },
+        { SkFloatToScalar(-3.0995157e+010f), SkFloatToScalar(51.050392f) },
+        { SkFloatToScalar(-3.0995134e+010f), SkFloatToScalar(51.050400f) },
     };
 
     const SkRect clip = { 0, 0, SkIntToScalar(300), SkIntToScalar(200) };
diff --git a/tests/PaintTest.cpp b/tests/PaintTest.cpp
index 6350eb5..d459b39 100644
--- a/tests/PaintTest.cpp
+++ b/tests/PaintTest.cpp
@@ -69,14 +69,14 @@
     SkPath path, stroke;
     SkPaint paint;
 
-    path.moveTo(SkFloatToFixed(460.2881309415525f),
-                SkFloatToFixed(303.250847066498));
-    path.cubicTo(SkFloatToFixed(463.36378422175284),
-                 SkFloatToFixed(302.1169735073363),
-                 SkFloatToFixed(456.32239330810046),
-                 SkFloatToFixed(304.720354932878),
-                 SkFloatToFixed(453.15255460013304),
-                 SkFloatToFixed(305.788586869862));
+    path.moveTo(SkFloatToScalar(460.2881309415525f),
+                SkFloatToScalar(303.250847066498f));
+    path.cubicTo(SkFloatToScalar(463.36378422175284f),
+                 SkFloatToScalar(302.1169735073363f),
+                 SkFloatToScalar(456.32239330810046f),
+                 SkFloatToScalar(304.720354932878f),
+                 SkFloatToScalar(453.15255460013304f),
+                 SkFloatToScalar(305.788586869862f));
     
     SkRect fillR, strokeR;
     fillR = path.getBounds();
diff --git a/tests/PathCoverageTest.cpp b/tests/PathCoverageTest.cpp
index 91de178..4f2f1be 100644
--- a/tests/PathCoverageTest.cpp
+++ b/tests/PathCoverageTest.cpp
@@ -60,8 +60,8 @@
     if (d < tol) {
        return 1;
     } else {
-       int temp = SkScalarCeil(SkScalarSqrt(SkScalarDiv(d, tol)));
-       uint32_t count = SkMinScalar(SkNextPow2(temp), MAX_POINTS_PER_CURVE);
+       int temp = SkScalarCeilToInt(SkScalarSqrt(SkScalarDiv(d, tol)));
+       uint32_t count = SkMin32(SkNextPow2(temp), MAX_POINTS_PER_CURVE);
        return count;
     }
 }
diff --git a/tests/PathMeasureTest.cpp b/tests/PathMeasureTest.cpp
index 2ff9f3a..bceb427 100644
--- a/tests/PathMeasureTest.cpp
+++ b/tests/PathMeasureTest.cpp
@@ -61,7 +61,9 @@
     SkVector tangent;
     REPORTER_ASSERT(reporter, meas.getPosTan(SK_ScalarHalf, &position, &tangent));
     REPORTER_ASSERT(reporter,
-        SkScalarNearlyEqual(position.fX, -SK_ScalarHalf, SK_Scalar1 * 0.0001));
+        SkScalarNearlyEqual(position.fX,
+                            -SK_ScalarHalf,
+                            SkFloatToScalar(0.0001f)));
     REPORTER_ASSERT(reporter, position.fY == 0);
     REPORTER_ASSERT(reporter, tangent.fX == -SK_Scalar1);
     REPORTER_ASSERT(reporter, tangent.fY == 0);
@@ -84,22 +86,28 @@
     REPORTER_ASSERT(reporter, length == SK_Scalar1 * 6);
     REPORTER_ASSERT(reporter, meas.getPosTan(SK_ScalarHalf, &position, &tangent));
     REPORTER_ASSERT(reporter,
-        SkScalarNearlyEqual(position.fX, SK_ScalarHalf, SK_Scalar1 * 0.0001));
+        SkScalarNearlyEqual(position.fX,
+                            SK_ScalarHalf,
+                            SkFloatToScalar(0.0001f)));
     REPORTER_ASSERT(reporter, position.fY == 0);
     REPORTER_ASSERT(reporter, tangent.fX == SK_Scalar1);
     REPORTER_ASSERT(reporter, tangent.fY == 0);
     REPORTER_ASSERT(reporter, meas.getPosTan(SK_Scalar1 * 2.5f, &position, &tangent));
     REPORTER_ASSERT(reporter,
-        SkScalarNearlyEqual(position.fX, SK_Scalar1, SK_Scalar1 * 0.0001));
+        SkScalarNearlyEqual(position.fX, SK_Scalar1, SkFloatToScalar(0.0001f)));
     REPORTER_ASSERT(reporter,
         SkScalarNearlyEqual(position.fY, SK_Scalar1 * 1.5f));
     REPORTER_ASSERT(reporter, tangent.fX == 0);
     REPORTER_ASSERT(reporter, tangent.fY == SK_Scalar1);
     REPORTER_ASSERT(reporter, meas.getPosTan(SK_Scalar1 * 4.5f, &position, &tangent));
     REPORTER_ASSERT(reporter,
-        SkScalarNearlyEqual(position.fX, SK_Scalar1 * 2.5f, SK_Scalar1 * 0.0001));
+        SkScalarNearlyEqual(position.fX, 
+                            SkFloatToScalar(2.5f), 
+                            SkFloatToScalar(0.0001f)));
     REPORTER_ASSERT(reporter,
-        SkScalarNearlyEqual(position.fY, SK_Scalar1 * 2.0f, SK_Scalar1 * 0.0001));
+        SkScalarNearlyEqual(position.fY, 
+                            SkFloatToScalar(2.0f),
+                            SkFloatToScalar(0.0001f)));
     REPORTER_ASSERT(reporter, tangent.fX == SK_Scalar1);
     REPORTER_ASSERT(reporter, tangent.fY == 0);
 
@@ -114,7 +122,9 @@
     REPORTER_ASSERT(reporter, length == SK_Scalar1);
     REPORTER_ASSERT(reporter, meas.getPosTan(SK_ScalarHalf, &position, &tangent));
     REPORTER_ASSERT(reporter,
-        SkScalarNearlyEqual(position.fX, SK_ScalarHalf, SK_Scalar1 * 0.0001));
+        SkScalarNearlyEqual(position.fX,
+                            SK_ScalarHalf,
+                            SkFloatToScalar(0.0001f)));
     REPORTER_ASSERT(reporter, position.fY == 0);
     REPORTER_ASSERT(reporter, tangent.fX == SK_Scalar1);
     REPORTER_ASSERT(reporter, tangent.fY == 0);
@@ -123,9 +133,13 @@
     REPORTER_ASSERT(reporter, length == SK_Scalar1);
     REPORTER_ASSERT(reporter, meas.getPosTan(SK_ScalarHalf, &position, &tangent));
     REPORTER_ASSERT(reporter,
-        SkScalarNearlyEqual(position.fX, SK_Scalar1 * 1.5f, SK_Scalar1 * 0.0001));
+        SkScalarNearlyEqual(position.fX, 
+                            SkFloatToScalar(1.5f),
+                            SkFloatToScalar(0.0001f)));
     REPORTER_ASSERT(reporter,
-        SkScalarNearlyEqual(position.fY, SK_Scalar1 * 2.0f, SK_Scalar1 * 0.0001));
+        SkScalarNearlyEqual(position.fY,
+                            SkFloatToScalar(2.0f),
+                            SkFloatToScalar(0.0001f)));
     REPORTER_ASSERT(reporter, tangent.fX == -SK_Scalar1);
     REPORTER_ASSERT(reporter, tangent.fY == 0);
 }
diff --git a/tests/ScalarTest.cpp b/tests/ScalarTest.cpp
index 981fb0f..cc88e74 100644
--- a/tests/ScalarTest.cpp
+++ b/tests/ScalarTest.cpp
@@ -20,7 +20,7 @@
 }
 
 static bool isFinite_float(float x) {
-    return sk_float_isfinite(x);
+    return SkToBool(sk_float_isfinite(x));
 }
 
 static bool isFinite_mulzero(float x) {
