diff --git a/bench/AAClipBench.cpp b/bench/AAClipBench.cpp
index 978a371..657b6ff 100644
--- a/bench/AAClipBench.cpp
+++ b/bench/AAClipBench.cpp
@@ -43,7 +43,7 @@
 
 protected:
     virtual const char* onGetName() { return fName.c_str(); }
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
 
         SkPaint paint;
         this->setupPaint(&paint);
@@ -158,7 +158,7 @@
             canvas->restore();
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
 
         for (int i = 0; i < loops; ++i) {
             SkPoint offset = SkPoint::Make(0, 0);
@@ -195,7 +195,7 @@
 
 protected:
     virtual const char* onGetName() { return fName.c_str(); }
-    virtual void onDraw(const int loops, SkCanvas*) {
+    virtual void onDraw(int loops, SkCanvas*) {
         SkPaint paint;
         this->setupPaint(&paint);
 
@@ -230,7 +230,7 @@
 
 protected:
     virtual const char* onGetName() { return "aaclip_setregion"; }
-    virtual void onDraw(const int loops, SkCanvas*) {
+    virtual void onDraw(int loops, SkCanvas*) {
         for (int i = 0; i < loops; ++i) {
             SkAAClip clip;
             clip.setRegion(fRegion);
diff --git a/bench/AlternatingColorPatternBench.cpp b/bench/AlternatingColorPatternBench.cpp
index cb561e3..b7285d6 100644
--- a/bench/AlternatingColorPatternBench.cpp
+++ b/bench/AlternatingColorPatternBench.cpp
@@ -147,7 +147,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(false);
         paint.setFilterQuality(kLow_SkFilterQuality);
diff --git a/bench/Benchmark.cpp b/bench/Benchmark.cpp
index 98fec2e..df1e347 100644
--- a/bench/Benchmark.cpp
+++ b/bench/Benchmark.cpp
@@ -53,7 +53,7 @@
     this->onPerCanvasPostDraw(canvas);
 }
 
-void Benchmark::draw(const int loops, SkCanvas* canvas) {
+void Benchmark::draw(int loops, SkCanvas* canvas) {
     SkAutoCanvasRestore ar(canvas, true/*save now*/);
     this->onDraw(loops, canvas);
 }
diff --git a/bench/Benchmark.h b/bench/Benchmark.h
index 06d42e8..00b05af 100644
--- a/bench/Benchmark.h
+++ b/bench/Benchmark.h
@@ -82,7 +82,7 @@
     void postDraw(SkCanvas*);
 
     // Bench framework can tune loops to be large enough for stable timing.
-    void draw(const int loops, SkCanvas*);
+    void draw(int loops, SkCanvas*);
 
     void setForceAlpha(int alpha) {
         fForceAlpha = alpha;
@@ -123,7 +123,7 @@
     virtual void onPostDraw(SkCanvas*) {}
     // Each bench should do its main work in a loop like this:
     //   for (int i = 0; i < loops; i++) { <work here> }
-    virtual void onDraw(const int loops, SkCanvas*) = 0;
+    virtual void onDraw(int loops, SkCanvas*) = 0;
 
     virtual SkIPoint onGetSize();
 
diff --git a/bench/BezierBench.cpp b/bench/BezierBench.cpp
index d4fdf0f..6c8be69 100755
--- a/bench/BezierBench.cpp
+++ b/bench/BezierBench.cpp
@@ -79,7 +79,7 @@
         return fName.c_str();
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         fRec.fCanvas = canvas;
         this->setupPaint(&fRec.fPaint);
         fRec.fPaint.setStyle(SkPaint::kStroke_Style);
diff --git a/bench/BigPathBench.cpp b/bench/BigPathBench.cpp
index a554b38..0ed8fc5 100644
--- a/bench/BigPathBench.cpp
+++ b/bench/BigPathBench.cpp
@@ -50,7 +50,7 @@
         make_path(fPath);
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
diff --git a/bench/BitmapBench.cpp b/bench/BitmapBench.cpp
index 260a2c9..812f8c3 100644
--- a/bench/BitmapBench.cpp
+++ b/bench/BitmapBench.cpp
@@ -131,7 +131,7 @@
         fBitmap.setIsVolatile(fIsVolatile);
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         if (fDoScale) {
             canvas->scale(.99f, .99f);
         }
@@ -225,7 +225,7 @@
         return fFullName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkISize dim = canvas->getDeviceSize();
         if (fFlags & kScale_Flag) {
             const SkScalar x = SkIntToScalar(dim.fWidth) / 2;
diff --git a/bench/BitmapRectBench.cpp b/bench/BitmapRectBench.cpp
index 93659c1..7211ae2 100644
--- a/bench/BitmapRectBench.cpp
+++ b/bench/BitmapRectBench.cpp
@@ -87,7 +87,7 @@
     }
 
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRandom rand;
 
         SkPaint paint;
diff --git a/bench/BitmapRegionDecoderBench.cpp b/bench/BitmapRegionDecoderBench.cpp
index 5872942..0398b58 100644
--- a/bench/BitmapRegionDecoderBench.cpp
+++ b/bench/BitmapRegionDecoderBench.cpp
@@ -58,7 +58,7 @@
     fBRD.reset(SkBitmapRegionDecoderInterface::CreateBitmapRegionDecoder(stream, fStrategy));
 }
 
-void BitmapRegionDecoderBench::onDraw(const int n, SkCanvas* canvas) {
+void BitmapRegionDecoderBench::onDraw(int n, SkCanvas* canvas) {
     SkAutoTDelete<SkBitmap> bitmap;
     for (int i = 0; i < n; i++) {
         bitmap.reset(fBRD->decodeRegion(fSubset.left(), fSubset.top(), fSubset.width(),
diff --git a/bench/BitmapRegionDecoderBench.h b/bench/BitmapRegionDecoderBench.h
index 4f4d55e..3f3da6c 100644
--- a/bench/BitmapRegionDecoderBench.h
+++ b/bench/BitmapRegionDecoderBench.h
@@ -33,7 +33,7 @@
 protected:
     const char* onGetName() override;
     bool isSuitableFor(Backend backend) override;
-    void onDraw(const int n, SkCanvas* canvas) override;
+    void onDraw(int n, SkCanvas* canvas) override;
     void onDelayedSetup() override;
 
 private:
diff --git a/bench/BitmapScaleBench.cpp b/bench/BitmapScaleBench.cpp
index b3f0763..37ce7cf 100644
--- a/bench/BitmapScaleBench.cpp
+++ b/bench/BitmapScaleBench.cpp
@@ -65,7 +65,7 @@
         fMatrix.setScale( scale(), scale() );
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         SkPaint paint;
         this->setupPaint(&paint);
 
diff --git a/bench/BlurBench.cpp b/bench/BlurBench.cpp
index 4133adc..29f0dfd 100644
--- a/bench/BlurBench.cpp
+++ b/bench/BlurBench.cpp
@@ -53,7 +53,7 @@
         return fName.c_str();
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         SkPaint paint;
         this->setupPaint(&paint);
 
diff --git a/bench/BlurImageFilterBench.cpp b/bench/BlurImageFilterBench.cpp
index d7d3eb2..e4476a1 100644
--- a/bench/BlurImageFilterBench.cpp
+++ b/bench/BlurImageFilterBench.cpp
@@ -42,7 +42,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         static const SkScalar kX = 0;
         static const SkScalar kY = 0;
diff --git a/bench/BlurRectBench.cpp b/bench/BlurRectBench.cpp
index 890a79e..b8a7211 100644
--- a/bench/BlurRectBench.cpp
+++ b/bench/BlurRectBench.cpp
@@ -51,7 +51,7 @@
         fName = name;
     }
 
-    virtual void onDraw(const int loops, SkCanvas*) {
+    virtual void onDraw(int loops, SkCanvas*) {
         SkPaint paint;
         this->setupPaint(&paint);
 
diff --git a/bench/BlurRectsBench.cpp b/bench/BlurRectsBench.cpp
index 8384771..6bfde8e 100644
--- a/bench/BlurRectsBench.cpp
+++ b/bench/BlurRectsBench.cpp
@@ -29,7 +29,7 @@
         fName = name;
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         paint.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle, fRadius))->unref();
 
diff --git a/bench/BlurRoundRectBench.cpp b/bench/BlurRoundRectBench.cpp
index 9f1e143..5213276 100644
--- a/bench/BlurRoundRectBench.cpp
+++ b/bench/BlurRoundRectBench.cpp
@@ -39,7 +39,7 @@
                               SkScalarCeilToInt(fRRect.rect().height()));
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkLayerDrawLooper::Builder looperBuilder;
         {
             SkLayerDrawLooper::LayerInfo info;
diff --git a/bench/ChartBench.cpp b/bench/ChartBench.cpp
index 8b3aa73..c5a3a5b 100644
--- a/bench/ChartBench.cpp
+++ b/bench/ChartBench.cpp
@@ -104,7 +104,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         bool sizeChanged = false;
         if (canvas->getDeviceSize() != fSize) {
             fSize = canvas->getDeviceSize();
diff --git a/bench/ChecksumBench.cpp b/bench/ChecksumBench.cpp
index c731a8f..a2c2824 100644
--- a/bench/ChecksumBench.cpp
+++ b/bench/ChecksumBench.cpp
@@ -51,7 +51,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         switch (fType) {
             case kChecksum_ChecksumType: {
                 for (int i = 0; i < loops; i++) {
diff --git a/bench/ChromeBench.cpp b/bench/ChromeBench.cpp
index 231d09b..94c3f25 100644
--- a/bench/ChromeBench.cpp
+++ b/bench/ChromeBench.cpp
@@ -461,7 +461,7 @@
 protected:
 
     virtual const char* onGetName() { return "chrome_scrollGmail"; }
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         SkDEBUGCODE(this->validateBounds(canvas));
         SkPaint paint;
         this->setupPaint(&paint);
diff --git a/bench/CmapBench.cpp b/bench/CmapBench.cpp
index 5bec506..a2fb506 100644
--- a/bench/CmapBench.cpp
+++ b/bench/CmapBench.cpp
@@ -85,7 +85,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         fProc(loops, fPaint, fText, sizeof(fText), NGLYPHS);
     }
 
diff --git a/bench/CodecBench.cpp b/bench/CodecBench.cpp
index 0b457a4..1384480 100644
--- a/bench/CodecBench.cpp
+++ b/bench/CodecBench.cpp
@@ -48,7 +48,7 @@
     fPixelStorage.reset(fInfo.getSafeSize(fInfo.minRowBytes()));
 }
 
-void CodecBench::onDraw(const int n, SkCanvas* canvas) {
+void CodecBench::onDraw(int n, SkCanvas* canvas) {
     SkAutoTDelete<SkCodec> codec;
     SkPMColor colorTable[256];
     int colorCount;
diff --git a/bench/CodecBench.h b/bench/CodecBench.h
index efa3cb2..a574b4c 100644
--- a/bench/CodecBench.h
+++ b/bench/CodecBench.h
@@ -25,7 +25,7 @@
 protected:
     const char* onGetName() override;
     bool isSuitableFor(Backend backend) override;
-    void onDraw(const int n, SkCanvas* canvas) override;
+    void onDraw(int n, SkCanvas* canvas) override;
     void onDelayedSetup() override;
 
 private:
diff --git a/bench/ColorCubeBench.cpp b/bench/ColorCubeBench.cpp
index ec0a47b..55d1726 100644
--- a/bench/ColorCubeBench.cpp
+++ b/bench/ColorCubeBench.cpp
@@ -38,7 +38,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         this->test(loops, canvas);
     }
 
@@ -93,7 +93,7 @@
         }
     }
 
-    void test(const int loops, SkCanvas* canvas) {
+    void test(int loops, SkCanvas* canvas) {
         SkPaint paint;
         for (int i = 0; i < loops; i++) {
             SkAutoTUnref<SkColorFilter> colorCube(
diff --git a/bench/ColorFilterBench.cpp b/bench/ColorFilterBench.cpp
index 3c4ddd8..5365a9c 100644
--- a/bench/ColorFilterBench.cpp
+++ b/bench/ColorFilterBench.cpp
@@ -74,7 +74,7 @@
         return isSmall() ? "colorfilter_dim_bright_small" : "colorfilter_dim_bright_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRect r = getFilterRect();
         SkPaint paint;
         paint.setColor(SK_ColorRED);
@@ -104,7 +104,7 @@
         return isSmall() ? "colorfilter_bright_gray_small" : "colorfilter_bright_gray_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRect r = getFilterRect();
         SkPaint paint;
         paint.setColor(SK_ColorRED);
@@ -131,7 +131,7 @@
         return isSmall() ? "colorfilter_gray_bright_small" : "colorfilter_gray_bright_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRect r = getFilterRect();
         SkPaint paint;
         paint.setColor(SK_ColorRED);
@@ -158,7 +158,7 @@
         return isSmall() ? "colorfilter_blue_bright_small" : "colorfilter_blue_bright_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRect r = getFilterRect();
         SkPaint paint;
         paint.setColor(SK_ColorRED);
@@ -185,7 +185,7 @@
         return isSmall() ? "colorfilter_bright_blue_small" : "colorfilter_bright_blue_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRect r = getFilterRect();
         SkPaint paint;
         paint.setColor(SK_ColorRED);
@@ -212,7 +212,7 @@
         return isSmall() ? "colorfilter_bright_small" : "colorfilter_bright_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRect r = getFilterRect();
         SkPaint paint;
         paint.setColor(SK_ColorRED);
@@ -238,7 +238,7 @@
         return isSmall() ? "colorfilter_blue_small" : "colorfilter_blue_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRect r = getFilterRect();
         SkPaint paint;
         paint.setColor(SK_ColorRED);
@@ -263,7 +263,7 @@
         return isSmall() ? "colorfilter_gray_small" : "colorfilter_gray_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRect r = getFilterRect();
         SkPaint paint;
         paint.setColor(SK_ColorRED);
diff --git a/bench/ColorPrivBench.cpp b/bench/ColorPrivBench.cpp
index 4aa51c4..314f0cb 100644
--- a/bench/ColorPrivBench.cpp
+++ b/bench/ColorPrivBench.cpp
@@ -39,7 +39,7 @@
         if (kScale) fScales[256] = 255;  // We'll just do 255 twice if we're limited to [0,255].
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         // We xor results of FourByteInterp into junk to make sure the function runs.
         volatile SkPMColor junk = 0;
 
diff --git a/bench/ControlBench.cpp b/bench/ControlBench.cpp
index 8c1177a..d76184c 100644
--- a/bench/ControlBench.cpp
+++ b/bench/ControlBench.cpp
@@ -14,7 +14,7 @@
     const char* onGetName() override { return "control"; }
     bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         // Nothing terribly useful: force a memory read, a memory write, and some math.
         volatile uint32_t rand = 0;
         for (int i = 0; i < 1000*loops; i++) {
diff --git a/bench/CoverageBench.cpp b/bench/CoverageBench.cpp
index 135ef39..3dee668 100644
--- a/bench/CoverageBench.cpp
+++ b/bench/CoverageBench.cpp
@@ -48,7 +48,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         if (fDrawCoverage) {
             for (int i = 0; i < loops; ++i) {
                 fDraw.drawPathCoverage(fPath, fPaint);
diff --git a/bench/DashBench.cpp b/bench/DashBench.cpp
index 1003634..eb964f6 100644
--- a/bench/DashBench.cpp
+++ b/bench/DashBench.cpp
@@ -62,7 +62,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         this->setupPaint(&paint);
         paint.setStyle(SkPaint::kStroke_Style);
@@ -194,7 +194,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         SkPath dst;
         for (int i = 0; i < loops; ++i) {
             SkStrokeRec rec(SkStrokeRec::kHairline_InitStyle);
@@ -232,7 +232,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         this->setupPaint(&paint);
         paint.setStrokeWidth(fStrokeWidth);
@@ -271,7 +271,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint p;
         this->setupPaint(&p);
         p.setColor(SK_ColorBLACK);
@@ -357,7 +357,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint p;
         this->setupPaint(&p);
         p.setStyle(SkPaint::kStroke_Style);
@@ -397,7 +397,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint p;
         this->setupPaint(&p);
         p.setColor(SK_ColorBLACK);
diff --git a/bench/DecodingBench.cpp b/bench/DecodingBench.cpp
index 0c95094..2feb7dd 100644
--- a/bench/DecodingBench.cpp
+++ b/bench/DecodingBench.cpp
@@ -27,7 +27,7 @@
     // Parse filename and the color type to give the benchmark a useful name
     SkString baseName = SkOSPath::Basename(path.c_str());
     fName.printf("Decode_%s_%s", baseName.c_str(), color_type_to_str(colorType));
-    
+
 #ifdef SK_DEBUG
     // Ensure that we can create a decoder.
     SkAutoTDelete<SkStreamRewindable> stream(new SkMemoryStream(fData));
@@ -78,7 +78,7 @@
     void* fPixelStorage; // Unowned. DecodingBench owns this.
 };
 
-void DecodingBench::onDraw(const int n, SkCanvas* canvas) {
+void DecodingBench::onDraw(int n, SkCanvas* canvas) {
     SkBitmap bitmap;
     // Declare the allocator before the decoder, so it will outlive the
     // decoder, which will unref it.
diff --git a/bench/DecodingBench.h b/bench/DecodingBench.h
index b30e972..196749d 100644
--- a/bench/DecodingBench.h
+++ b/bench/DecodingBench.h
@@ -27,7 +27,7 @@
 protected:
     const char* onGetName() override;
     bool isSuitableFor(Backend backend) override;
-    void onDraw(const int n, SkCanvas* canvas) override;
+    void onDraw(int n, SkCanvas* canvas) override;
     void onDelayedSetup() override;
 
 private:
diff --git a/bench/DisplacementBench.cpp b/bench/DisplacementBench.cpp
index d9ddc8b..f3f9472 100644
--- a/bench/DisplacementBench.cpp
+++ b/bench/DisplacementBench.cpp
@@ -100,7 +100,7 @@
         return this->isSmall() ? "displacement_zero_small" : "displacement_zero_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         SkAutoTUnref<SkImageFilter> displ(SkImageSource::Create(fCheckerboard));
         // No displacement effect
@@ -127,7 +127,7 @@
         return isSmall() ? "displacement_alpha_small" : "displacement_alpha_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         SkAutoTUnref<SkImageFilter> displ(SkImageSource::Create(fCheckerboard));
         // Displacement, with 1 alpha component (which isn't pre-multiplied)
@@ -153,7 +153,7 @@
         return isSmall() ? "displacement_full_small" : "displacement_full_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         SkAutoTUnref<SkImageFilter> displ(SkImageSource::Create(fCheckerboard));
         // Displacement, with 2 non-alpha components
diff --git a/bench/DrawBitmapAABench.cpp b/bench/DrawBitmapAABench.cpp
index 9d5003b..011c30a 100644
--- a/bench/DrawBitmapAABench.cpp
+++ b/bench/DrawBitmapAABench.cpp
@@ -37,7 +37,7 @@
         fBitmap.eraseARGB(255, 0, 255, 0);
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         canvas->concat(fMatrix);
         for (int i = 0; i < loops; i++) {
             canvas->drawBitmap(fBitmap, 0, 0, &fPaint);
diff --git a/bench/ETCBitmapBench.cpp b/bench/ETCBitmapBench.cpp
index db8e37e..d4068ca 100644
--- a/bench/ETCBitmapBench.cpp
+++ b/bench/ETCBitmapBench.cpp
@@ -158,7 +158,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         for (int i = 0; i < loops; ++i) {
             if (fDecompress) {
                 canvas->drawBitmap(this->fBitmap, 0, 0, nullptr);
@@ -206,7 +206,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPixelRef* pr = fBitmap.pixelRef();
         for (int i = 0; i < loops; ++i) {
             if (pr) {
diff --git a/bench/FSRectBench.cpp b/bench/FSRectBench.cpp
index 4c7173b..cd9a36b 100644
--- a/bench/FSRectBench.cpp
+++ b/bench/FSRectBench.cpp
@@ -39,7 +39,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         for (int i = 0; i < loops; ++i) {
             paint.setColor(fColors[i % N]);
diff --git a/bench/FontCacheBench.cpp b/bench/FontCacheBench.cpp
index 35bb329..b9944f6 100644
--- a/bench/FontCacheBench.cpp
+++ b/bench/FontCacheBench.cpp
@@ -32,7 +32,7 @@
         return "fontcache";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         this->setupPaint(&paint);
         paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
@@ -108,7 +108,7 @@
         return "fontefficiency";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         static bool gDone;
         if (gDone) {
             return;
diff --git a/bench/FontScalerBench.cpp b/bench/FontScalerBench.cpp
index f813adb..a5ab7b5 100644
--- a/bench/FontScalerBench.cpp
+++ b/bench/FontScalerBench.cpp
@@ -25,7 +25,7 @@
 
 protected:
     virtual const char* onGetName() { return fName.c_str(); }
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         SkPaint paint;
         this->setupPaint(&paint);
         paint.setLCDRenderText(fDoLCD);
diff --git a/bench/GLBench.cpp b/bench/GLBench.cpp
index 23dd04f..e51adba 100644
--- a/bench/GLBench.cpp
+++ b/bench/GLBench.cpp
@@ -50,7 +50,7 @@
     this->teardown(ctx->interface());
 }
 
-void GLBench::onDraw(const int loops, SkCanvas* canvas) {
+void GLBench::onDraw(int loops, SkCanvas* canvas) {
     const GrGLContext* ctx = this->getGLContext(canvas);
     if (!ctx) {
         return;
diff --git a/bench/GLBench.h b/bench/GLBench.h
index dde0358..9033b12 100644
--- a/bench/GLBench.h
+++ b/bench/GLBench.h
@@ -33,8 +33,8 @@
     virtual void setup(const GrGLContext*)=0;
     void onPostDraw(SkCanvas* canvas) override;
     virtual void teardown(const GrGLInterface*)=0;
-    void onDraw(const int loops, SkCanvas*) override;
-    virtual void glDraw(const int loops, const GrGLContext*)=0;
+    void onDraw(int loops, SkCanvas*) override;
+    virtual void glDraw(int loops, const GrGLContext*)=0;
     static GrGLuint CompileShader(const GrGLInterface*, const char* shaderSrc, GrGLenum type);
     static GrGLuint CreateProgram(const GrGLInterface*, const char* vshader, const char* fshader);
     static GrGLuint SetupFramebuffer(const GrGLInterface*, int screenWidth, int screenHeight);
diff --git a/bench/GLInstancedArraysBench.cpp b/bench/GLInstancedArraysBench.cpp
index 5cb4c06..128f539 100644
--- a/bench/GLInstancedArraysBench.cpp
+++ b/bench/GLInstancedArraysBench.cpp
@@ -62,7 +62,7 @@
 
     const GrGLContext* onGetGLContext(const GrGLContext*) override;
     void setup(const GrGLContext*) override;
-    void glDraw(const int loops, const GrGLContext*) override;
+    void glDraw(int loops, const GrGLContext*) override;
     void teardown(const GrGLInterface*) override;
 
 private:
@@ -339,7 +339,7 @@
     GR_GL_CALL(gl, BindVertexArray(fVAO));
 }
 
-void GLCpuPosInstancedArraysBench::glDraw(const int loops, const GrGLContext* ctx) {
+void GLCpuPosInstancedArraysBench::glDraw(int loops, const GrGLContext* ctx) {
     const GrGLInterface* gl = ctx->interface();
 
     uint32_t maxTrianglesPerFlush = fDrawDiv == 0 ?  kNumTri :
diff --git a/bench/GLVec4ScalarBench.cpp b/bench/GLVec4ScalarBench.cpp
index bbd282e..5dcf4c1 100644
--- a/bench/GLVec4ScalarBench.cpp
+++ b/bench/GLVec4ScalarBench.cpp
@@ -54,7 +54,7 @@
     }
 
     void setup(const GrGLContext*) override;
-    void glDraw(const int loops, const GrGLContext*) override;
+    void glDraw(int loops, const GrGLContext*) override;
     void teardown(const GrGLInterface*) override;
 
 private:
@@ -262,7 +262,7 @@
     GR_GL_CALL(gl, UseProgram(fProgram));
 }
 
-void GLVec4ScalarBench::glDraw(const int loops, const GrGLContext* ctx) {
+void GLVec4ScalarBench::glDraw(int loops, const GrGLContext* ctx) {
     const GrGLInterface* gl = ctx->interface();
 
     for (int i = 0; i < loops; i++) {
diff --git a/bench/GLVertexAttributesBench.cpp b/bench/GLVertexAttributesBench.cpp
index f55fb65..6a4ccf5 100644
--- a/bench/GLVertexAttributesBench.cpp
+++ b/bench/GLVertexAttributesBench.cpp
@@ -36,7 +36,7 @@
 protected:
     const char* onGetName() override { return fName.c_str(); }
     void setup(const GrGLContext*) override;
-    void glDraw(const int loops, const GrGLContext*) override;
+    void glDraw(int loops, const GrGLContext*) override;
     void teardown(const GrGLInterface*) override;
 
     static const GrGLuint kScreenWidth = 800;
@@ -207,7 +207,7 @@
     GR_GL_CALL(gl, UseProgram(fProgram));
 }
 
-void GLVertexAttributesBench::glDraw(const int loops, const GrGLContext* ctx) {
+void GLVertexAttributesBench::glDraw(int loops, const GrGLContext* ctx) {
     const GrGLInterface* gl = ctx->interface();
 
     // upload vertex attributes
diff --git a/bench/GMBench.cpp b/bench/GMBench.cpp
index bcc83eb..57f0d3c 100644
--- a/bench/GMBench.cpp
+++ b/bench/GMBench.cpp
@@ -21,7 +21,7 @@
     return kNonRendering_Backend != backend;
 }
 
-void GMBench::onDraw(const int loops, SkCanvas* canvas) {
+void GMBench::onDraw(int loops, SkCanvas* canvas) {
     // Do we care about timing the draw of the background (once)?
     // Does the GM ever rely on drawBackground to lazily compute something?
     fGM->drawBackground(canvas);
diff --git a/bench/GMBench.h b/bench/GMBench.h
index 82ca3c9..5e8b04a 100644
--- a/bench/GMBench.h
+++ b/bench/GMBench.h
@@ -23,7 +23,7 @@
 protected:
     const char* onGetName() override;
     bool isSuitableFor(Backend backend) override;
-    void onDraw(const int loops, SkCanvas* canvas) override;
+    void onDraw(int loops, SkCanvas* canvas) override;
     SkIPoint onGetSize() override;
 
 private:
diff --git a/bench/GameBench.cpp b/bench/GameBench.cpp
index b1edf2e..823f5b0 100644
--- a/bench/GameBench.cpp
+++ b/bench/GameBench.cpp
@@ -86,7 +86,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRandom scaleRand;
         SkRandom transRand;
         SkRandom rotRand;
diff --git a/bench/GeometryBench.cpp b/bench/GeometryBench.cpp
index 718d6a4..d93578e 100644
--- a/bench/GeometryBench.cpp
+++ b/bench/GeometryBench.cpp
@@ -65,7 +65,7 @@
     GeoRectBench_intersect() : GeoRectBench("rect_intersect") {}
 
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         for (int outer = 0; outer < loops; ++outer) {
             int count = 0;
             for (size_t i = 0; i < SK_ARRAY_COUNT(fRects); ++i) {
@@ -82,7 +82,7 @@
     GeoRectBench_intersect_rect() : GeoRectBench("rect_intersect_rect") {}
 
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         for (int outer = 0; outer < loops; ++outer) {
             int count = 0;
             SkRect r;
@@ -99,7 +99,7 @@
     GeoRectBench_Intersects() : GeoRectBench("rect_Intersects") {}
     
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         for (int outer = 0; outer < loops; ++outer) {
             int count = 0;
             for (size_t i = 0; i < SK_ARRAY_COUNT(fRects); ++i) {
@@ -115,7 +115,7 @@
     GeoRectBench_sort() : GeoRectBench("rect_sort") {}
     
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         for (int outer = 0; outer < loops; ++outer) {
             for (size_t i = 0; i < SK_ARRAY_COUNT(fRects); ++i) {
                 fRects[i].sort();
@@ -148,7 +148,7 @@
 public:
     EvalQuadAt0() : QuadBenchBase("evalquadat0") {}
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPoint result;
         for (int outer = 0; outer < loops; ++outer) {
             SkEvalQuadAt(fPts, 0.5f, &result);
@@ -164,7 +164,7 @@
 public:
     EvalQuadAt1() : QuadBenchBase("evalquadat1") {}
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPoint result;
         for (int outer = 0; outer < loops; ++outer) {
             result = SkEvalQuadAt(fPts, 0.5f);
@@ -182,7 +182,7 @@
 public:
     EvalQuadTangentAt0() : QuadBenchBase("evalquadtangentat0") {}
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPoint result;
         for (int outer = 0; outer < loops; ++outer) {
             SkEvalQuadAt(fPts, 0.5f, nullptr, &result);
@@ -198,7 +198,7 @@
 public:
     EvalQuadTangentAt1() : QuadBenchBase("evalquadtangentat1") {}
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPoint result;
         for (int outer = 0; outer < loops; ++outer) {
             result = SkEvalQuadTangentAt(fPts, 0.5f);
@@ -216,7 +216,7 @@
 public:
     ChopQuadAt() : QuadBenchBase("chopquadat") {}
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPoint dst[5];
         for (int outer = 0; outer < loops; ++outer) {
             SkChopQuadAt(fPts, dst, 0.5f);
@@ -232,7 +232,7 @@
 public:
     ChopCubicAt() : QuadBenchBase("chopcubicat0") {}
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPoint dst[7];
         for (int outer = 0; outer < loops; ++outer) {
             SkChopCubicAt(fPts, dst, 0.5f);
diff --git a/bench/GrMemoryPoolBench.cpp b/bench/GrMemoryPoolBench.cpp
index fd29775..3efe653 100644
--- a/bench/GrMemoryPoolBench.cpp
+++ b/bench/GrMemoryPoolBench.cpp
@@ -43,7 +43,7 @@
         return "grmemorypool_stack";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         SkRandom r;
         enum {
             kMaxObjects = 4 * (1 << 10),
@@ -105,7 +105,7 @@
         return "grmemorypool_random";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         SkRandom r;
         enum {
             kMaxObjects = 4 * (1 << 10),
@@ -153,7 +153,7 @@
         return "grmemorypool_queue";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         SkRandom r;
         C* objects[M];
         for (int i = 0; i < loops; i++) {
diff --git a/bench/GrResourceCacheBench.cpp b/bench/GrResourceCacheBench.cpp
index d022f19..bc38035 100644
--- a/bench/GrResourceCacheBench.cpp
+++ b/bench/GrResourceCacheBench.cpp
@@ -69,7 +69,7 @@
         return fFullName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
         if (nullptr == context) {
             return;
@@ -134,7 +134,7 @@
         populate_cache(gpu, CACHE_SIZE_COUNT, fKeyData32Count);
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         if (!fContext) {
             return;
         }
diff --git a/bench/GradientBench.cpp b/bench/GradientBench.cpp
index 705099d..53b9e95 100644
--- a/bench/GradientBench.cpp
+++ b/bench/GradientBench.cpp
@@ -248,7 +248,7 @@
         return fName.c_str();
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         SkPaint paint;
         this->setupPaint(&paint);
 
@@ -337,7 +337,7 @@
         return fName.c_str();
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         SkPaint paint;
         this->setupPaint(&paint);
 
diff --git a/bench/HairlinePathBench.cpp b/bench/HairlinePathBench.cpp
index 0e12d70..176adc5 100644
--- a/bench/HairlinePathBench.cpp
+++ b/bench/HairlinePathBench.cpp
@@ -51,7 +51,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint(fPaint);
         this->setupPaint(&paint);
 
diff --git a/bench/ImageBench.cpp b/bench/ImageBench.cpp
index 69ab17f..89fbcd6 100644
--- a/bench/ImageBench.cpp
+++ b/bench/ImageBench.cpp
@@ -39,7 +39,7 @@
         fRasterSurface.reset(SkSurface::NewRaster(info));
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; i++) {
             for (int inner = 0; inner < 10; ++inner) {
                 fRasterSurface->getCanvas()->drawImage(fImage, 0, 0);
diff --git a/bench/ImageCacheBench.cpp b/bench/ImageCacheBench.cpp
index fe11868..cf35bbf 100644
--- a/bench/ImageCacheBench.cpp
+++ b/bench/ImageCacheBench.cpp
@@ -55,7 +55,7 @@
         return "imagecache";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         if (fCache.getTotalBytesUsed() == 0) {
             this->populateCache();
         }
diff --git a/bench/ImageFilterCollapse.cpp b/bench/ImageFilterCollapse.cpp
index 010149b..2a2fa3a 100644
--- a/bench/ImageFilterCollapse.cpp
+++ b/bench/ImageFilterCollapse.cpp
@@ -39,7 +39,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         makeBitmap();
 
         for(int i = 0; i < loops; i++) {
diff --git a/bench/ImageFilterDAGBench.cpp b/bench/ImageFilterDAGBench.cpp
index 47d59bc..74e23ef 100644
--- a/bench/ImageFilterDAGBench.cpp
+++ b/bench/ImageFilterDAGBench.cpp
@@ -25,7 +25,7 @@
         return "image_filter_dag";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         for (int j = 0; j < loops; j++) {
             SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(20.0f, 20.0f));
             SkImageFilter* inputs[kNumInputs];
diff --git a/bench/InterpBench.cpp b/bench/InterpBench.cpp
index 8171131..b95f57d 100644
--- a/bench/InterpBench.cpp
+++ b/bench/InterpBench.cpp
@@ -42,7 +42,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         int n = loops * this->mulLoopCount();
         for (int i = 0; i < n; i++) {
             this->performTest(fDst, fFx, fDx, kBuffer);
diff --git a/bench/LightingBench.cpp b/bench/LightingBench.cpp
index e65362b..2c78749 100644
--- a/bench/LightingBench.cpp
+++ b/bench/LightingBench.cpp
@@ -20,7 +20,7 @@
     LightingBaseBench(bool small) : fIsSmall(small) { }
 
 protected:
-    void draw(const int loops, SkCanvas* canvas, SkImageFilter* imageFilter) const {
+    void draw(int loops, SkCanvas* canvas, SkImageFilter* imageFilter) const {
         SkRect r = fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) :
                               SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE);
         SkPaint paint;
@@ -107,7 +107,7 @@
         return fIsSmall ? "lightingpointlitdiffuse_small" : "lightingpointlitdiffuse_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         draw(loops, canvas, SkLightingImageFilter::CreatePointLitDiffuse(GetPointLocation(),
                                                                          GetWhite(),
                                                                          GetSurfaceScale(),
@@ -128,7 +128,7 @@
         return fIsSmall ? "lightingdistantlitdiffuse_small" : "lightingdistantlitdiffuse_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         draw(loops, canvas, SkLightingImageFilter::CreateDistantLitDiffuse(GetDistantDirection(),
                                                                            GetWhite(),
                                                                            GetSurfaceScale(),
@@ -149,7 +149,7 @@
         return fIsSmall ? "lightingspotlitdiffuse_small" : "lightingspotlitdiffuse_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         draw(loops, canvas, SkLightingImageFilter::CreateSpotLitDiffuse(GetSpotLocation(),
                                                                         GetSpotTarget(),
                                                                         GetSpotExponent(),
@@ -173,7 +173,7 @@
         return fIsSmall ? "lightingpointlitspecular_small" : "lightingpointlitspecular_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         draw(loops, canvas, SkLightingImageFilter::CreatePointLitSpecular(GetPointLocation(),
                                                                           GetWhite(),
                                                                           GetSurfaceScale(),
@@ -195,7 +195,7 @@
         return fIsSmall ? "lightingdistantlitspecular_small" : "lightingdistantlitspecular_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         draw(loops, canvas, SkLightingImageFilter::CreateDistantLitSpecular(GetDistantDirection(),
                                                                             GetWhite(),
                                                                             GetSurfaceScale(),
@@ -217,7 +217,7 @@
         return fIsSmall ? "lightingspotlitspecular_small" : "lightingspotlitspecular_large";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         draw(loops, canvas, SkLightingImageFilter::CreateSpotLitSpecular(GetSpotLocation(),
                                                                          GetSpotTarget(),
                                                                          GetSpotExponent(),
diff --git a/bench/LineBench.cpp b/bench/LineBench.cpp
index 76231b8..67dc564 100644
--- a/bench/LineBench.cpp
+++ b/bench/LineBench.cpp
@@ -42,7 +42,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         this->setupPaint(&paint);
 
diff --git a/bench/MagnifierBench.cpp b/bench/MagnifierBench.cpp
index c79c668..6185059 100644
--- a/bench/MagnifierBench.cpp
+++ b/bench/MagnifierBench.cpp
@@ -33,7 +33,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         const int w = fIsSmall ? FILTER_WIDTH_SMALL : FILTER_WIDTH_LARGE;
         const int h = fIsSmall ? FILTER_HEIGHT_SMALL : FILTER_HEIGHT_LARGE;
         SkPaint paint;
diff --git a/bench/MathBench.cpp b/bench/MathBench.cpp
index 02867e2..a5cc033 100644
--- a/bench/MathBench.cpp
+++ b/bench/MathBench.cpp
@@ -53,7 +53,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         int n = loops * this->mulLoopCount();
         for (int i = 0; i < n; i++) {
             this->performTest(fDst, fSrc, kBuffer);
@@ -287,7 +287,7 @@
     }
 
 protected:
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         IsFiniteProc proc = fProc;
         const float* data = fData;
         // do this so the compiler won't throw away the function call
@@ -357,7 +357,7 @@
     virtual void process(float) {}
 
 protected:
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         SkRandom rand;
         float accum = 0;
         const float* data = fData;
@@ -419,7 +419,7 @@
     virtual void process(int) {}
 
 protected:
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         int accum = 0;
 
         if (fUsePortable) {
@@ -475,7 +475,7 @@
     virtual void process(int) {}
 
 protected:
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         int accum = 0;
 
         for (int j = 0; j < loops; ++j) {
@@ -519,7 +519,7 @@
     }
 
 protected:
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int j = 0; j < loops; ++j) {
             for (int i = 0; i < N - 4; ++i) {
                 fResult[i] = SkFloatToFixed(fData[i]);
@@ -559,7 +559,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         volatile T a = 0, b = 0;
         T div = 0, mod = 0;
         for (int i = 0; i < loops; i++) {
diff --git a/bench/Matrix44Bench.cpp b/bench/Matrix44Bench.cpp
index 1949263..b376d5a 100644
--- a/bench/Matrix44Bench.cpp
+++ b/bench/Matrix44Bench.cpp
@@ -30,7 +30,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; i++) {
             this->performTest();
         }
diff --git a/bench/MatrixBench.cpp b/bench/MatrixBench.cpp
index 9471f18..5e62eac 100644
--- a/bench/MatrixBench.cpp
+++ b/bench/MatrixBench.cpp
@@ -31,7 +31,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; i++) {
             this->performTest();
         }
diff --git a/bench/MatrixConvolutionBench.cpp b/bench/MatrixConvolutionBench.cpp
index 6593ab0..6302f12 100644
--- a/bench/MatrixConvolutionBench.cpp
+++ b/bench/MatrixConvolutionBench.cpp
@@ -35,7 +35,7 @@
         return fName.c_str();
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         SkPaint paint;
         this->setupPaint(&paint);
         paint.setAntiAlias(true);
diff --git a/bench/MemoryBench.cpp b/bench/MemoryBench.cpp
index 2b0f2ab..cd9afe4 100644
--- a/bench/MemoryBench.cpp
+++ b/bench/MemoryBench.cpp
@@ -30,7 +30,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         size_t inc = fMinSize >> 4;
         SkASSERT(inc > 0);
         size_t total = fMinSize * 64;
diff --git a/bench/MemsetBench.cpp b/bench/MemsetBench.cpp
index d1682bd..beae339 100644
--- a/bench/MemsetBench.cpp
+++ b/bench/MemsetBench.cpp
@@ -20,7 +20,7 @@
     bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
     const char* onGetName() override { return fName.c_str(); }
 
-    void onDraw(const int loops, SkCanvas*) override;
+    void onDraw(int loops, SkCanvas*) override;
 
 private:
     int fN;
@@ -28,13 +28,13 @@
     SkString fName;
 };
 
-template <> void MemsetBench<uint32_t, false>::onDraw(const int loops, SkCanvas*) {
+template <> void MemsetBench<uint32_t, false>::onDraw(int loops, SkCanvas*) {
     for (int i = 0; i < 1000*loops; i++) {
         sk_memset32(fBuffer.get(), 0xFACEB004, fN);
     }
 }
 
-template <> void MemsetBench<uint16_t, false>::onDraw(const int loops, SkCanvas*) {
+template <> void MemsetBench<uint16_t, false>::onDraw(int loops, SkCanvas*) {
     for (int i = 0; i < 1000*loops; i++) {
         sk_memset16(fBuffer.get(), 0x4973, fN);
     }
@@ -45,13 +45,13 @@
     for (int i = 0; i < n; i++) { dst[i] = val; }
 }
 
-template <> void MemsetBench<uint32_t, true>::onDraw(const int loops, SkCanvas*) {
+template <> void MemsetBench<uint32_t, true>::onDraw(int loops, SkCanvas*) {
     for (int i = 0; i < 1000*loops; i++) {
         memsetT<uint32_t>(fBuffer.get(), 0xFACEB004, fN);
     }
 }
 
-template <> void MemsetBench<uint16_t, true>::onDraw(const int loops, SkCanvas*) {
+template <> void MemsetBench<uint16_t, true>::onDraw(int loops, SkCanvas*) {
     for (int i = 0; i < 1000*loops; i++) {
         memsetT<uint16_t>(fBuffer.get(), 0x4973, fN);
     }
diff --git a/bench/MergeBench.cpp b/bench/MergeBench.cpp
index 404f646..925b6b2 100644
--- a/bench/MergeBench.cpp
+++ b/bench/MergeBench.cpp
@@ -33,7 +33,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRect r = fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) :
                               SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE);
         SkPaint paint;
diff --git a/bench/MipMapBench.cpp b/bench/MipMapBench.cpp
index 2fb52bb..137fbe4 100644
--- a/bench/MipMapBench.cpp
+++ b/bench/MipMapBench.cpp
@@ -27,7 +27,7 @@
         fBitmap.eraseColor(SK_ColorWHITE);  // so we don't read uninitialized memory
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; i++) {
             SkMipMap::Build(fBitmap, nullptr)->unref();
         }
diff --git a/bench/MorphologyBench.cpp b/bench/MorphologyBench.cpp
index 972892b..51da197 100644
--- a/bench/MorphologyBench.cpp
+++ b/bench/MorphologyBench.cpp
@@ -50,7 +50,7 @@
         return fName.c_str();
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         SkPaint paint;
         this->setupPaint(&paint);
 
diff --git a/bench/MutexBench.cpp b/bench/MutexBench.cpp
index ba92a43..d1d014d 100644
--- a/bench/MutexBench.cpp
+++ b/bench/MutexBench.cpp
@@ -23,7 +23,7 @@
         return fBenchName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; i++) {
             fMu.acquire();
             fMu.release();
@@ -47,7 +47,7 @@
         return "SkSharedMutexSharedUncontendedBenchmark";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; i++) {
             fMu.acquireShared();
             fMu.releaseShared();
diff --git a/bench/PatchBench.cpp b/bench/PatchBench.cpp
index 26caad0..6f51b45 100644
--- a/bench/PatchBench.cpp
+++ b/bench/PatchBench.cpp
@@ -123,7 +123,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         canvas->scale(fScale.x(), fScale.y());
         for (int i = 0; i < loops; i++) {
             switch (fVertexMode) {
diff --git a/bench/PatchGridBench.cpp b/bench/PatchGridBench.cpp
index dc64b53..ef78532 100644
--- a/bench/PatchGridBench.cpp
+++ b/bench/PatchGridBench.cpp
@@ -214,7 +214,7 @@
         this->setupPaint(&fPaint);
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         this->setScale(canvas);
         for (int i = 0; i < loops; i++) {
             fGrid.draw(canvas, fPaint);
diff --git a/bench/PathBench.cpp b/bench/PathBench.cpp
index e09fc3e..d0ede02 100644
--- a/bench/PathBench.cpp
+++ b/bench/PathBench.cpp
@@ -51,7 +51,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint(fPaint);
         this->setupPaint(&paint);
 
@@ -329,7 +329,7 @@
         this->createData(10, 100);
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             if (i % 1000 == 0) {
                 fPath.reset();  // PathRef memory can grow without bound otherwise.
@@ -363,7 +363,7 @@
         }
         this->finishedMakingPaths();
     }
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             int idx = i & (kPathCnt - 1);
             fCopies[idx] = fPaths[idx];
@@ -403,7 +403,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         if (fInPlace) {
             for (int i = 0; i < loops; ++i) {
                 fPaths[i & (kPathCnt - 1)].transform(fMatrix);
@@ -450,7 +450,7 @@
         this->finishedMakingPaths();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             int idx = i & (kPathCnt - 1);
             fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]);
@@ -514,7 +514,7 @@
         this->finishedMakingPaths();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         switch (fType) {
             case kAdd_AddType:
                 for (int i = 0; i < loops; ++i) {
@@ -582,7 +582,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
 
         paint.setColor(SK_ColorBLACK);
@@ -688,7 +688,7 @@
         SkASSERT(path->isConvex());
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRandom rand;
         SkRect r;
 
@@ -762,7 +762,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             const SkRect& rect = fQueryRects[i % kQueryRectCnt];
             fParity = fParity != fPath.conservativelyContainsRect(rect);
@@ -825,7 +825,7 @@
 private:
     const char* onGetName() override { return fName.c_str(); }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             fRQ.chop(fDst);
         }
@@ -841,7 +841,7 @@
     ConicBench_EvalPos(bool useV2) : fUseV2(useV2) {
         fName.printf("conic-eval-pos%d", useV2);
     }
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         if (fUseV2) {
             for (int i = 0; i < loops; ++i) {
                 for (int j = 0; j < 1000; ++j) {
@@ -866,7 +866,7 @@
     ConicBench_EvalTan(bool useV2) : fUseV2(useV2) {
         fName.printf("conic-eval-tan%d", useV2);
     }
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         if (fUseV2) {
             for (int i = 0; i < loops; ++i) {
                 for (int j = 0; j < 1000; ++j) {
@@ -930,7 +930,7 @@
         return "conic-compute-error";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         SkVector err;
         for (int i = 0; i < loops; ++i) {
             for (int j = 0; j < CONICS; ++j) {
@@ -952,7 +952,7 @@
         return "conic-asQuadTol";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             for (int j = 0; j < CONICS; ++j) {
                 fConics[j].asQuadTol(SK_ScalarHalf);
@@ -973,7 +973,7 @@
         return "conic-quadPow2";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             for (int j = 0; j < CONICS; ++j) {
                 fConics[j].computeQuadPOW2(SK_ScalarHalf);
diff --git a/bench/PathIterBench.cpp b/bench/PathIterBench.cpp
index 2da2594..5a8727f 100644
--- a/bench/PathIterBench.cpp
+++ b/bench/PathIterBench.cpp
@@ -66,7 +66,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         if (fRaw) {
             for (int i = 0; i < loops; ++i) {
                 SkPath::RawIter iter(fPath);
diff --git a/bench/PerlinNoiseBench.cpp b/bench/PerlinNoiseBench.cpp
index 3fbb723..7c4894d 100644
--- a/bench/PerlinNoiseBench.cpp
+++ b/bench/PerlinNoiseBench.cpp
@@ -21,7 +21,7 @@
         return "perlinnoise";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         this->test(loops, canvas, 0, 0, SkPerlinNoiseShader::kFractalNoise_Type,
                    0.1f, 0.1f, 3, 0, false);
     }
@@ -38,7 +38,7 @@
         canvas->restore();
     }
 
-    void test(const int loops, SkCanvas* canvas, int x, int y, SkPerlinNoiseShader::Type type,
+    void test(int loops, SkCanvas* canvas, int x, int y, SkPerlinNoiseShader::Type type,
               float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed,
               bool stitchTiles) {
         SkShader* shader = (type == SkPerlinNoiseShader::kFractalNoise_Type) ?
diff --git a/bench/PictureNestingBench.cpp b/bench/PictureNestingBench.cpp
index e315fe6..a968d51 100644
--- a/bench/PictureNestingBench.cpp
+++ b/bench/PictureNestingBench.cpp
@@ -117,7 +117,7 @@
         return backend == kNonRendering_Backend;
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         SkIPoint canvasSize = onGetSize();
         SkPictureRecorder recorder;
 
@@ -151,7 +151,7 @@
         fPicture.reset(recorder.endRecording());
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         for (int i = 0; i < loops; i++) {
             canvas->drawPicture(fPicture);
         }
diff --git a/bench/PictureOverheadBench.cpp b/bench/PictureOverheadBench.cpp
index c9dedf4..62a51ec 100644
--- a/bench/PictureOverheadBench.cpp
+++ b/bench/PictureOverheadBench.cpp
@@ -19,7 +19,7 @@
     }
     bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         SkPictureRecorder rec;
         for (int i = 0; i < loops; i++) {
             rec.beginRecording(SkRect::MakeWH(2000,3000));
diff --git a/bench/PicturePlaybackBench.cpp b/bench/PicturePlaybackBench.cpp
index 6c42a69..84951a1 100644
--- a/bench/PicturePlaybackBench.cpp
+++ b/bench/PicturePlaybackBench.cpp
@@ -37,7 +37,7 @@
         return fName.c_str();
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
 
         SkPictureRecorder recorder;
         SkCanvas* pCanvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT, nullptr, 0);
@@ -185,7 +185,7 @@
         fPic.reset(recorder.endRecording());
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         for (int i = 0; i < loops; i++) {
             // This inner loop guarantees we make the same choices for all bench variants.
             SkRandom rand;
diff --git a/bench/PremulAndUnpremulAlphaOpsBench.cpp b/bench/PremulAndUnpremulAlphaOpsBench.cpp
index a325332..a6b7a8c 100644
--- a/bench/PremulAndUnpremulAlphaOpsBench.cpp
+++ b/bench/PremulAndUnpremulAlphaOpsBench.cpp
@@ -43,7 +43,7 @@
         fBmp2.allocPixels(info);    // used in readPixels()
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         canvas->clear(SK_ColorBLACK);
 
         for (int loop = 0; loop < loops; ++loop) {
diff --git a/bench/RTreeBench.cpp b/bench/RTreeBench.cpp
index 61aa154..e484050 100644
--- a/bench/RTreeBench.cpp
+++ b/bench/RTreeBench.cpp
@@ -34,7 +34,7 @@
     const char* onGetName() override {
         return fName.c_str();
     }
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRandom rand;
         SkAutoTMalloc<SkRect> rects(NUM_BUILD_RECTS);
         for (int i = 0; i < NUM_BUILD_RECTS; ++i) {
@@ -76,7 +76,7 @@
         fTree.insert(rects.get(), NUM_QUERY_RECTS);
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRandom rand;
         for (int i = 0; i < loops; ++i) {
             SkTDArray<int> hits;
diff --git a/bench/ReadPixBench.cpp b/bench/ReadPixBench.cpp
index 917b917..7df5260 100644
--- a/bench/ReadPixBench.cpp
+++ b/bench/ReadPixBench.cpp
@@ -24,7 +24,7 @@
         return "readpix";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         canvas->clear(SK_ColorBLACK);
 
         SkISize size = canvas->getDeviceSize();
diff --git a/bench/RecordingBench.cpp b/bench/RecordingBench.cpp
index c66e11a..1cc4d15 100644
--- a/bench/RecordingBench.cpp
+++ b/bench/RecordingBench.cpp
@@ -28,7 +28,7 @@
                           SkScalarCeilToInt(fSrc->cullRect().height()));
 }
 
-void RecordingBench::onDraw(const int loops, SkCanvas*) {
+void RecordingBench::onDraw(int loops, SkCanvas*) {
     SkRTreeFactory factory;
     const SkScalar w = fSrc->cullRect().width(),
                    h = fSrc->cullRect().height();
diff --git a/bench/RecordingBench.h b/bench/RecordingBench.h
index 6cb5d51..0a8befe 100644
--- a/bench/RecordingBench.h
+++ b/bench/RecordingBench.h
@@ -18,7 +18,7 @@
 protected:
     const char* onGetName() override;
     bool isSuitableFor(Backend) override;
-    void onDraw(const int loops, SkCanvas*) override;
+    void onDraw(int loops, SkCanvas*) override;
     SkIPoint onGetSize() override;
 
 private:
diff --git a/bench/RectBench.cpp b/bench/RectBench.cpp
index 456c6f1..a700b36 100644
--- a/bench/RectBench.cpp
+++ b/bench/RectBench.cpp
@@ -67,7 +67,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         if (fStroke > 0) {
             paint.setStyle(SkPaint::kStroke_Style);
@@ -170,7 +170,7 @@
     }
 
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkScalar gSizes[] = {
             SkIntToScalar(7), 0
         };
@@ -218,7 +218,7 @@
     }
 
 protected:
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkScalar gSizes[] = {
             SkIntToScalar(13), SkIntToScalar(24)
         };
diff --git a/bench/RectanizerBench.cpp b/bench/RectanizerBench.cpp
index 203da01..9b7e3ae 100644
--- a/bench/RectanizerBench.cpp
+++ b/bench/RectanizerBench.cpp
@@ -83,7 +83,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRandom rand;
         SkIPoint16 loc;
         SkISize size;
diff --git a/bench/RectoriBench.cpp b/bench/RectoriBench.cpp
index 8d8bd3d..1f4da86 100644
--- a/bench/RectoriBench.cpp
+++ b/bench/RectoriBench.cpp
@@ -25,7 +25,7 @@
         return "rectori";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRandom Random;
 
         for (int i = 0; i < loops; i++) {
diff --git a/bench/RefCntBench.cpp b/bench/RefCntBench.cpp
index 313e9a4..cf7cc30 100644
--- a/bench/RefCntBench.cpp
+++ b/bench/RefCntBench.cpp
@@ -27,7 +27,7 @@
         return "atomic_inc_32";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             sk_atomic_inc(&fX);
         }
@@ -51,7 +51,7 @@
         return "atomic_inc_64";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             sk_atomic_inc(&fX);
         }
@@ -73,7 +73,7 @@
         return "ref_cnt_stack";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             SkRefCnt ref;
             for (int j = 0; j < M; ++j) {
@@ -107,7 +107,7 @@
         return "ref_cnt_heap";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         char memory[sizeof(PlacedRefCnt)];
         for (int i = 0; i < loops; ++i) {
             PlacedRefCnt* ref = new (memory) PlacedRefCnt();
@@ -134,7 +134,7 @@
         return "ref_cnt_new";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             SkRefCnt* ref = new SkRefCnt();
             for (int j = 0; j < M; ++j) {
@@ -162,7 +162,7 @@
         return "ref_cnt_stack_weak";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             SkWeakRefCnt ref;
             for (int j = 0; j < M; ++j) {
@@ -193,7 +193,7 @@
         return "ref_cnt_heap_weak";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         char memory[sizeof(PlacedWeakRefCnt)];
         for (int i = 0; i < loops; ++i) {
             PlacedWeakRefCnt* ref = new (memory) PlacedWeakRefCnt();
@@ -220,7 +220,7 @@
         return "ref_cnt_new_weak";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             SkWeakRefCnt* ref = new SkWeakRefCnt();
             for (int j = 0; j < M; ++j) {
diff --git a/bench/RegionBench.cpp b/bench/RegionBench.cpp
index b6f763c..8554569 100644
--- a/bench/RegionBench.cpp
+++ b/bench/RegionBench.cpp
@@ -106,7 +106,7 @@
 protected:
     const char* onGetName() override { return fName.c_str(); }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         Proc proc = fProc;
         for (int i = 0; i < loops; ++i) {
             proc(fA, fB);
diff --git a/bench/RegionContainBench.cpp b/bench/RegionContainBench.cpp
index 10a6007..961cbe3 100644
--- a/bench/RegionContainBench.cpp
+++ b/bench/RegionContainBench.cpp
@@ -52,7 +52,7 @@
 protected:
     const char* onGetName() override { return fName.c_str(); }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         Proc proc = fProc;
 
         for (int i = 0; i < loops; ++i) {
diff --git a/bench/RepeatTileBench.cpp b/bench/RepeatTileBench.cpp
index 9b24eee..39830bf 100644
--- a/bench/RepeatTileBench.cpp
+++ b/bench/RepeatTileBench.cpp
@@ -127,7 +127,7 @@
     }
 
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint(fPaint);
         this->setupPaint(&paint);
 
diff --git a/bench/RotatedRectBench.cpp b/bench/RotatedRectBench.cpp
index c37a6be..5ae0b1b 100644
--- a/bench/RotatedRectBench.cpp
+++ b/bench/RotatedRectBench.cpp
@@ -77,7 +77,7 @@
 protected:
     const char* onGetName() override { return fName.c_str(); }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(fAA);
         paint.setXfermodeMode(fMode);
diff --git a/bench/SKPBench.cpp b/bench/SKPBench.cpp
index f0dafb6..4426133 100644
--- a/bench/SKPBench.cpp
+++ b/bench/SKPBench.cpp
@@ -104,7 +104,7 @@
     return SkIPoint::Make(fClip.width(), fClip.height());
 }
 
-void SKPBench::onDraw(const int loops, SkCanvas* canvas) {
+void SKPBench::onDraw(int loops, SkCanvas* canvas) {
     SkASSERT(fDoLooping || 1 == loops);
     if (fUseMultiPictureDraw) {
         for (int i = 0; i < loops; i++) {
diff --git a/bench/SKPBench.h b/bench/SKPBench.h
index 05b5857..89c9a36 100644
--- a/bench/SKPBench.h
+++ b/bench/SKPBench.h
@@ -34,7 +34,7 @@
     void onPerCanvasPreDraw(SkCanvas*) override;
     void onPerCanvasPostDraw(SkCanvas*) override;
     bool isSuitableFor(Backend backend) override;
-    void onDraw(const int loops, SkCanvas* canvas) override;
+    void onDraw(int loops, SkCanvas* canvas) override;
     SkIPoint onGetSize() override;
 
     virtual void drawMPDPicture();
diff --git a/bench/ScalarBench.cpp b/bench/ScalarBench.cpp
index 2c59fa5..0048c6e 100644
--- a/bench/ScalarBench.cpp
+++ b/bench/ScalarBench.cpp
@@ -31,7 +31,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         for (int i = 0; i < loops; i++) {
             this->performTest();
         }
@@ -149,7 +149,7 @@
         return "rect_bounds";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkRect r;
         for (int i = 0; i < loops; ++i) {
             for (int i = 0; i < 1000; ++i) {
diff --git a/bench/ShaderMaskBench.cpp b/bench/ShaderMaskBench.cpp
index 3280535..eb77cbf 100644
--- a/bench/ShaderMaskBench.cpp
+++ b/bench/ShaderMaskBench.cpp
@@ -54,7 +54,7 @@
         return fName.c_str();
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         const SkIPoint dim = this->getSize();
         SkRandom rand;
 
diff --git a/bench/Sk4fBench.cpp b/bench/Sk4fBench.cpp
index 5397863..02ac145 100644
--- a/bench/Sk4fBench.cpp
+++ b/bench/Sk4fBench.cpp
@@ -26,7 +26,7 @@
     const char* onGetName() override { return "Sk4f_roundtrip"; }
     bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         // Unlike blackhole, junk can and probably will be a register.
         uint32_t junk = 0;
         uint32_t seed = 0;
@@ -47,7 +47,7 @@
     bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
 
     SkPMColor fDevice[100];
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         Sk4f c0(0,0,255,255),
              c1(255,0,0,255),
              dc = c1 - c0,
diff --git a/bench/SkGlyphCacheBench.cpp b/bench/SkGlyphCacheBench.cpp
index 7865961..c99b572 100644
--- a/bench/SkGlyphCacheBench.cpp
+++ b/bench/SkGlyphCacheBench.cpp
@@ -50,7 +50,7 @@
         return backend == kNonRendering_Backend;
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         size_t oldCacheLimitSize = SkGraphics::GetFontCacheLimit();
         SkGraphics::SetFontCacheLimit(fCacheSize);
         SkTypeface* typeface = sk_tool_utils::create_portable_typeface(
@@ -87,7 +87,7 @@
         return backend == kNonRendering_Backend;
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         size_t oldCacheLimitSize = SkGraphics::GetFontCacheLimit();
         SkGraphics::SetFontCacheLimit(fCacheSize);
         SkTypeface* typefaces[] =
diff --git a/bench/SkipZeroesBench.cpp b/bench/SkipZeroesBench.cpp
index 5382832..1a5f61d 100644
--- a/bench/SkipZeroesBench.cpp
+++ b/bench/SkipZeroesBench.cpp
@@ -73,7 +73,7 @@
         }
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         if (!fValid) {
 #ifdef SK_DEBUG
             SkDebugf("stream was invalid: %s\n", fFilename.c_str());
diff --git a/bench/SortBench.cpp b/bench/SortBench.cpp
index f621670..9bc11c7 100644
--- a/bench/SortBench.cpp
+++ b/bench/SortBench.cpp
@@ -124,7 +124,7 @@
         gRec[fType].fProc(fUnsorted.get());
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         SkAutoTMalloc<int> sorted(N);
         for (int i = 0; i < loops; i++) {
             memcpy(sorted.get(), fUnsorted.get(), N*sizeof(int));
diff --git a/bench/StrokeBench.cpp b/bench/StrokeBench.cpp
index d673748..63199d0 100644
--- a/bench/StrokeBench.cpp
+++ b/bench/StrokeBench.cpp
@@ -27,7 +27,7 @@
 
     const char* onGetName() override { return fName.c_str(); }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint(fPaint);
         this->setupPaint(&paint);
 
diff --git a/bench/TableBench.cpp b/bench/TableBench.cpp
index a99e03b..346aba8 100644
--- a/bench/TableBench.cpp
+++ b/bench/TableBench.cpp
@@ -33,7 +33,7 @@
         return "tablebench";
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         SkPaint cellPaint;
         cellPaint.setColor(0xFFFFFFF);
 
diff --git a/bench/TextBench.cpp b/bench/TextBench.cpp
index cc9537a..f2d7bd3 100644
--- a/bench/TextBench.cpp
+++ b/bench/TextBench.cpp
@@ -111,7 +111,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         const SkIPoint dim = this->getSize();
         SkRandom rand;
 
diff --git a/bench/TextBlobBench.cpp b/bench/TextBlobBench.cpp
index 5f4dbba..6d5a88f 100644
--- a/bench/TextBlobBench.cpp
+++ b/bench/TextBlobBench.cpp
@@ -54,7 +54,7 @@
         return "TextBlobBench";
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
 
         // To ensure maximum caching, we just redraw the blob at the same place everytime
diff --git a/bench/TileBench.cpp b/bench/TileBench.cpp
index cf35760..6b91ada 100644
--- a/bench/TileBench.cpp
+++ b/bench/TileBench.cpp
@@ -80,7 +80,7 @@
         return fName.c_str();
     }
 
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         SkPaint paint(fPaint);
         this->setupPaint(&paint);
         paint.setFilterQuality(fDoFilter ? kLow_SkFilterQuality
diff --git a/bench/VertBench.cpp b/bench/VertBench.cpp
index d2e5269..daff26e 100644
--- a/bench/VertBench.cpp
+++ b/bench/VertBench.cpp
@@ -77,7 +77,7 @@
 
 protected:
     virtual const char* onGetName() { return fName.c_str(); }
-    virtual void onDraw(const int loops, SkCanvas* canvas) {
+    virtual void onDraw(int loops, SkCanvas* canvas) {
         SkPaint paint;
         this->setupPaint(&paint);
 
diff --git a/bench/WritePixelsBench.cpp b/bench/WritePixelsBench.cpp
index 0b98cf8..d9f8eb7 100644
--- a/bench/WritePixelsBench.cpp
+++ b/bench/WritePixelsBench.cpp
@@ -45,7 +45,7 @@
         return fName.c_str();
     }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkISize size = canvas->getDeviceSize();
 
         canvas->clear(0xFFFF0000);
diff --git a/bench/WriterBench.cpp b/bench/WriterBench.cpp
index 6db1cf1..115ffc1 100644
--- a/bench/WriterBench.cpp
+++ b/bench/WriterBench.cpp
@@ -21,7 +21,7 @@
         return "writer";
     }
 
-    void onDraw(const int loops, SkCanvas*) override {
+    void onDraw(int loops, SkCanvas*) override {
         static const char gStr[] = "abcdefghimjklmnopqrstuvwxyz";
         static const size_t gLen = strlen(gStr);
         SkWriter32 writer;
diff --git a/bench/XfermodeBench.cpp b/bench/XfermodeBench.cpp
index 7e61826..f407c59 100644
--- a/bench/XfermodeBench.cpp
+++ b/bench/XfermodeBench.cpp
@@ -33,7 +33,7 @@
 protected:
     const char* onGetName() override { return fName.c_str(); }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         const char* text = "Hamburgefons";
         size_t len = strlen(text);
         SkISize size = canvas->getDeviceSize();
@@ -85,7 +85,7 @@
 protected:
     const char* onGetName() override { return "xfermode_create"; }
 
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         for (int outer = 0; outer < loops * 10; ++outer) {
             for (int i = 0; i <= SkXfermode::kLastMode; ++i) {
                 SkXfermode* xfer = SkXfermode::Create(SkXfermode::Mode(i));
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
index 6328aa1..a7a47c5 100644
--- a/bench/nanobench.cpp
+++ b/bench/nanobench.cpp
@@ -1182,7 +1182,7 @@
             bench->perCanvasPreDraw(canvas);
 
             int maxFrameLag;
-            const int loops = target->needsFrameTiming(&maxFrameLag)
+            int loops = target->needsFrameTiming(&maxFrameLag)
                 ? setup_gpu_bench(target, bench.get(), maxFrameLag)
                 : setup_cpu_bench(overhead, target, bench.get());
 
diff --git a/bench/subset/SubsetSingleBench.cpp b/bench/subset/SubsetSingleBench.cpp
index e409cf7..232c159 100644
--- a/bench/subset/SubsetSingleBench.cpp
+++ b/bench/subset/SubsetSingleBench.cpp
@@ -57,7 +57,7 @@
     return kNonRendering_Backend == backend;
 }
 
-void SubsetSingleBench::onDraw(const int n, SkCanvas* canvas) {
+void SubsetSingleBench::onDraw(int n, SkCanvas* canvas) {
     // When the color type is kIndex8, we will need to store the color table.  If it is
     // used, it will be initialized by the codec.
     int colorCount;
diff --git a/bench/subset/SubsetSingleBench.h b/bench/subset/SubsetSingleBench.h
index 1484a51..62e281a 100644
--- a/bench/subset/SubsetSingleBench.h
+++ b/bench/subset/SubsetSingleBench.h
@@ -31,7 +31,7 @@
 protected:
     const char* onGetName() override;
     bool isSuitableFor(Backend backend) override;
-    void onDraw(const int n, SkCanvas* canvas) override;
+    void onDraw(int n, SkCanvas* canvas) override;
 
 private:
     SkString                      fName;
diff --git a/bench/subset/SubsetTranslateBench.cpp b/bench/subset/SubsetTranslateBench.cpp
index a5c4d46..8f29ba8 100644
--- a/bench/subset/SubsetTranslateBench.cpp
+++ b/bench/subset/SubsetTranslateBench.cpp
@@ -53,7 +53,7 @@
     return kNonRendering_Backend == backend;
 }
 
-void SubsetTranslateBench::onDraw(const int n, SkCanvas* canvas) {
+void SubsetTranslateBench::onDraw(int n, SkCanvas* canvas) {
     // When the color type is kIndex8, we will need to store the color table.  If it is
     // used, it will be initialized by the codec.
     int colorCount;
diff --git a/bench/subset/SubsetTranslateBench.h b/bench/subset/SubsetTranslateBench.h
index c7c6feb..298732c 100644
--- a/bench/subset/SubsetTranslateBench.h
+++ b/bench/subset/SubsetTranslateBench.h
@@ -29,7 +29,7 @@
 protected:
     const char* onGetName() override;
     bool isSuitableFor(Backend backend) override;
-    void onDraw(const int n, SkCanvas* canvas) override;
+    void onDraw(int n, SkCanvas* canvas) override;
 
 private:
     SkString                      fName;
diff --git a/bench/subset/SubsetZoomBench.cpp b/bench/subset/SubsetZoomBench.cpp
index 869e930..ffd8670 100644
--- a/bench/subset/SubsetZoomBench.cpp
+++ b/bench/subset/SubsetZoomBench.cpp
@@ -53,7 +53,7 @@
     return kNonRendering_Backend == backend;
 }
 
-void SubsetZoomBench::onDraw(const int n, SkCanvas* canvas) {
+void SubsetZoomBench::onDraw(int n, SkCanvas* canvas) {
     // When the color type is kIndex8, we will need to store the color table.  If it is
     // used, it will be initialized by the codec.
     int colorCount;
diff --git a/bench/subset/SubsetZoomBench.h b/bench/subset/SubsetZoomBench.h
index 6a8f62d..7fba4af 100644
--- a/bench/subset/SubsetZoomBench.h
+++ b/bench/subset/SubsetZoomBench.h
@@ -29,7 +29,7 @@
 protected:
     const char* onGetName() override;
     bool isSuitableFor(Backend backend) override;
-    void onDraw(const int n, SkCanvas* canvas) override;
+    void onDraw(int n, SkCanvas* canvas) override;
 
 private:
     SkString                      fName;
diff --git a/tools/VisualBench/VisualLightweightBenchModule.cpp b/tools/VisualBench/VisualLightweightBenchModule.cpp
index d54c788..cdb9318 100644
--- a/tools/VisualBench/VisualLightweightBenchModule.cpp
+++ b/tools/VisualBench/VisualLightweightBenchModule.cpp
@@ -58,7 +58,7 @@
         #include "BigPathBench.inc"
     }
     const char* onGetName() override { return "warmupbench"; }
-    void onDraw(const int loops, SkCanvas* canvas) override {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(2);
diff --git a/tools/VisualBench/VisualSKPBench.cpp b/tools/VisualBench/VisualSKPBench.cpp
index 9e03d71..649d324 100644
--- a/tools/VisualBench/VisualSKPBench.cpp
+++ b/tools/VisualBench/VisualSKPBench.cpp
@@ -26,7 +26,7 @@
     return backend != kNonRendering_Backend;
 }
 
-void VisualSKPBench::onDraw(const int loops, SkCanvas* canvas) {
+void VisualSKPBench::onDraw(int loops, SkCanvas* canvas) {
     for (int i = 0; i < loops; i++) {
         canvas->drawPicture(fPic);
     }
diff --git a/tools/VisualBench/VisualSKPBench.h b/tools/VisualBench/VisualSKPBench.h
index cc35dea..6b9593b 100644
--- a/tools/VisualBench/VisualSKPBench.h
+++ b/tools/VisualBench/VisualSKPBench.h
@@ -24,7 +24,7 @@
     const char* onGetName() override;
     const char* onGetUniqueName() override;
     bool isSuitableFor(Backend backend) override;
-    void onDraw(const int loops, SkCanvas* canvas) override;
+    void onDraw(int loops, SkCanvas* canvas) override;
 
 private:
     SkAutoTUnref<const SkPicture> fPic;
