diff --git a/samplecode/SampleAll.cpp b/samplecode/SampleAll.cpp
index 8907a34..647a199 100644
--- a/samplecode/SampleAll.cpp
+++ b/samplecode/SampleAll.cpp
@@ -451,7 +451,7 @@
         canvas->drawBitmap(fBug, left, top, &paint);
         canvas->translate(SkIntToScalar(30), 0);
         canvas->drawSprite(fTb,
-            SkScalarRound(canvas->getTotalMatrix().getTranslateX()),
+            SkScalarRoundToInt(canvas->getTotalMatrix().getTranslateX()),
             spriteOffset + 10, &paint);
 
         canvas->translate(-SkIntToScalar(30), SkIntToScalar(30));
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 2d96eff..010fc25 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -306,8 +306,8 @@
             win->attach(fBackend, fMSAASampleCount, &attachmentInfo);
 
             GrBackendRenderTargetDesc desc;
-            desc.fWidth = SkScalarRound(win->width());
-            desc.fHeight = SkScalarRound(win->height());
+            desc.fWidth = SkScalarRoundToInt(win->width());
+            desc.fHeight = SkScalarRoundToInt(win->height());
             desc.fConfig = kSkia8888_GrPixelConfig;
             desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
             desc.fSampleCnt = attachmentInfo.fSampleCount;
@@ -1314,8 +1314,8 @@
         int count = canvas->save();
         canvas->resetMatrix();
         // Ensure the mouse position is on screen.
-        int width = SkScalarRound(this->width());
-        int height = SkScalarRound(this->height());
+        int width = SkScalarRoundToInt(this->width());
+        int height = SkScalarRoundToInt(this->height());
         if (fMouseX >= width) fMouseX = width - 1;
         else if (fMouseX < 0) fMouseX = 0;
         if (fMouseY >= height) fMouseY = height - 1;
@@ -2039,8 +2039,8 @@
     if (Click::kMoved_State == state) {
         updatePointer(x, y);
     }
-    int w = SkScalarRound(this->width());
-    int h = SkScalarRound(this->height());
+    int w = SkScalarRoundToInt(this->width());
+    int h = SkScalarRoundToInt(this->height());
 
     // check for the resize-box
     if (w - x < 16 && h - y < 16) {
diff --git a/samplecode/SampleCull.cpp b/samplecode/SampleCull.cpp
index 18f2d0c..afc4184 100644
--- a/samplecode/SampleCull.cpp
+++ b/samplecode/SampleCull.cpp
@@ -79,10 +79,12 @@
         for (;;)
             switch (iter.next(pts)) {
             case SkPath::kMove_Verb:
-                array[n++].set(SkScalarRound(pts[0].fX), SkScalarRound(pts[0].fY));
+                array[n++].set(SkScalarRoundToInt(pts[0].fX),
+                               SkScalarRoundToInt(pts[0].fY));
                 break;
             case SkPath::kLine_Verb:
-                array[n++].set(SkScalarRound(pts[1].fX), SkScalarRound(pts[1].fY));
+                array[n++].set(SkScalarRoundToInt(pts[1].fX),
+                               SkScalarRoundToInt(pts[1].fY));
                 break;
             case SkPath::kDone_Verb:
                 goto FINISHED2;
diff --git a/samplecode/SampleDegenerateTwoPtRadials.cpp b/samplecode/SampleDegenerateTwoPtRadials.cpp
index 07adae8..92e49a7 100644
--- a/samplecode/SampleDegenerateTwoPtRadials.cpp
+++ b/samplecode/SampleDegenerateTwoPtRadials.cpp
@@ -58,7 +58,7 @@
     virtual void onDrawContent(SkCanvas* canvas) {
         fTime += SampleCode::GetAnimSecondsDelta();
         SkScalar delta = fTime / 15.f;
-        int intPart = SkScalarFloor(delta);
+        int intPart = SkScalarFloorToInt(delta);
         delta = delta - SK_Scalar1 * intPart;
         if (intPart % 2) {
             delta = SK_Scalar1 - delta;
diff --git a/samplecode/SampleFilter2.cpp b/samplecode/SampleFilter2.cpp
index b4314c5..f3ab7f4 100644
--- a/samplecode/SampleFilter2.cpp
+++ b/samplecode/SampleFilter2.cpp
@@ -82,8 +82,8 @@
                 for (int i = 0; i < fBitmapCount; i++) {
                     SkScalar x = (k * fBitmapCount + j) * W;
                     SkScalar y = i * H;
-                    x = SkIntToScalar(SkScalarRound(x));
-                    y = SkIntToScalar(SkScalarRound(y));
+                    x = SkScalarRoundToScalar(x);
+                    y = SkScalarRoundToScalar(y);
                     canvas->drawBitmap(fBitmaps[i], x, y, &paint);
                     if (i == 0) {
                         SkPaint p;
diff --git a/samplecode/SampleLayerMask.cpp b/samplecode/SampleLayerMask.cpp
index 2e70833..33c06d1 100644
--- a/samplecode/SampleLayerMask.cpp
+++ b/samplecode/SampleLayerMask.cpp
@@ -34,8 +34,8 @@
 
         if (true) {
             SkBitmap mask;
-            int w = SkScalarRound(r.width());
-            int h = SkScalarRound(r.height());
+            int w = SkScalarRoundToInt(r.width());
+            int h = SkScalarRoundToInt(r.height());
             mask.setConfig(SkBitmap::kARGB_8888_Config, w, h);
             mask.allocPixels();
             mask.eraseColor(SK_ColorTRANSPARENT);
diff --git a/samplecode/SampleLines.cpp b/samplecode/SampleLines.cpp
index df35e86..d8304d1 100644
--- a/samplecode/SampleLines.cpp
+++ b/samplecode/SampleLines.cpp
@@ -99,7 +99,7 @@
     }
 
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) SK_OVERRIDE {
-        fAlpha = SkScalarRound(y);
+        fAlpha = SkScalarRoundToInt(y);
         this->inval(NULL);
         return NULL;
     }
diff --git a/samplecode/SampleRegion.cpp b/samplecode/SampleRegion.cpp
index 886eb96..7e3e0d2 100644
--- a/samplecode/SampleRegion.cpp
+++ b/samplecode/SampleRegion.cpp
@@ -396,7 +396,8 @@
 
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
                                               unsigned modi) SK_OVERRIDE {
-        return fRect.contains(SkScalarRound(x), SkScalarRound(y)) ? new Click(this) : NULL;
+        return fRect.contains(SkScalarRoundToInt(x),
+                              SkScalarRoundToInt(y)) ? new Click(this) : NULL;
     }
 
     virtual bool onClick(Click* click) {
diff --git a/samplecode/SampleSkLayer.cpp b/samplecode/SampleSkLayer.cpp
index 8d30ff6..c57a281 100644
--- a/samplecode/SampleSkLayer.cpp
+++ b/samplecode/SampleSkLayer.cpp
@@ -140,7 +140,7 @@
 
         SkPaint paint;
         paint.setColor(fColor);
-        paint.setAlpha(SkScalarRound(opacity * 255));
+        paint.setAlpha(SkScalarRoundToInt(opacity * 255));
 
         canvas->drawRect(r, paint);
     }
diff --git a/samplecode/SampleText.cpp b/samplecode/SampleText.cpp
index aa314dd..c881961 100644
--- a/samplecode/SampleText.cpp
+++ b/samplecode/SampleText.cpp
@@ -176,7 +176,7 @@
      //   printf(" %d %g", i, x);
         x = powf(x, ee);
      //   printf(" %g", x);
-        int xx = SkScalarRound(x * 255);
+        int xx = SkScalarRoundToInt(x * 255);
      //   printf(" %d\n", xx);
         fTable[i] = SkToU8(xx);
     }
