diff --git a/gm/arithmode.cpp b/gm/arithmode.cpp
index 8212acb..6f10dd6 100644
--- a/gm/arithmode.cpp
+++ b/gm/arithmode.cpp
@@ -94,7 +94,7 @@
     virtual void onDraw(SkCanvas* canvas) {
         SkBitmap src = make_src();
         SkBitmap dst = make_dst();
-        
+
         const SkScalar one = SK_Scalar1;
         static const SkScalar K[] = {
             0, 0, 0, 0,
@@ -109,7 +109,7 @@
             one/4, one/2, one/2, 0,
             -one/4, one/2, one/2, 0,
         };
-        
+
         const SkScalar* k = K;
         const SkScalar* stop = k + SK_ARRAY_COUNT(K);
         SkScalar y = 0;
diff --git a/gm/blend.cpp b/gm/blend.cpp
index d766a18..f1f47b3 100644
--- a/gm/blend.cpp
+++ b/gm/blend.cpp
@@ -16,7 +16,7 @@
     ImageBlendGM() : fInitialized(false) {
         this->setBGColor(0xFF000000);
     }
-    
+
 protected:
     virtual SkString onShortName() {
         return SkString("blend");
@@ -83,7 +83,7 @@
         paint.setImageFilter(SkNEW_ARGS(SkBlendImageFilter, (SkBlendImageFilter::kLighten_Mode, background)))->unref();
         canvas->drawSprite(fBitmap, 400, 0, &paint);
     }
-    
+
 private:
     typedef GM INHERITED;
     SkBitmap fBitmap, fCheckerboard;
diff --git a/gm/complexclip2.cpp b/gm/complexclip2.cpp
index e72227a..ce1f0e0 100644
--- a/gm/complexclip2.cpp
+++ b/gm/complexclip2.cpp
@@ -19,7 +19,7 @@
     : fDoPaths(doPaths)
     , fAntiAlias(antiAlias) {
         this->setBGColor(SkColorSetRGB(0xDD,0xA0,0xDD));
-        
+
         // offset the rects a bit so we get antialiasing even in the rect case
         SkScalar xA = SkFloatToScalar(0.65f);
         SkScalar xB = SkFloatToScalar(10.65f);
@@ -93,7 +93,7 @@
         }
 
         SkString str;
-        str.printf("complexclip2_%s_%s", 
+        str.printf("complexclip2_%s_%s",
                     fDoPaths ? "path" : "rect",
                     fAntiAlias ? "aa" : "bw");
         return str;
@@ -119,7 +119,7 @@
                 canvas->translate(kPadX * SK_Scalar1 + (fWidth + kPadX * SK_Scalar1)*j,
                                   kPadY * SK_Scalar1 + (fHeight + kPadY * SK_Scalar1)*i);
 
-                // draw the original shapes first so we can see the 
+                // draw the original shapes first so we can see the
                 // antialiasing on the clipped draw
                 for (int k = 0; k < 5; ++k) {
                     rectPaint.setColor(fRectColors[k]);
@@ -132,12 +132,12 @@
 
                 for (int k = 0; k < 5; ++k) {
                     if (fDoPaths) {
-                        canvas->clipPath(fPaths[k], 
-                                         fOps[j*kRows+i][k], 
+                        canvas->clipPath(fPaths[k],
+                                         fOps[j*kRows+i][k],
                                          fAntiAlias);
                     } else {
-                        canvas->clipRect(fRects[k], 
-                                         fOps[j*kRows+i][k], 
+                        canvas->clipRect(fRects[k],
+                                         fOps[j*kRows+i][k],
                                          fAntiAlias);
                     }
                 }
diff --git a/gm/dashcubics.cpp b/gm/dashcubics.cpp
index d245070..bbce9be 100644
--- a/gm/dashcubics.cpp
+++ b/gm/dashcubics.cpp
@@ -41,7 +41,7 @@
         "C 283,231 344,195 338,98";
 
         SkParsePath::FromSVGString(d, &path);
-        
+
         SkScalar intervals[] = { 5, 10 };
         SkPathEffect* pe = new SkDashPathEffect(intervals, 2, 0);
 
diff --git a/gm/dashing.cpp b/gm/dashing.cpp
index 196b401..2f1f026 100644
--- a/gm/dashing.cpp
+++ b/gm/dashing.cpp
@@ -51,7 +51,7 @@
             { 1, 1 },
             { 4, 1 },
         };
-        
+
         SkPaint paint;
         paint.setStyle(SkPaint::kStroke_Style);
 
@@ -64,7 +64,7 @@
                     int w = width * width * width;
                     paint.setAntiAlias(SkToBool(aa));
                     paint.setStrokeWidth(SkIntToScalar(w));
-                    
+
                     int scale = w ? w : 1;
 
                     drawline(canvas, gData[data].fOnInterval * scale,
@@ -74,7 +74,7 @@
                 }
             }
         }
-        
+
         show_giant_dash(canvas);
     }
 };
@@ -84,7 +84,7 @@
 static void make_unit_star(SkPath* path, int n) {
     SkScalar rad = -SK_ScalarPI / 2;
     const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
-    
+
     path->moveTo(0, -SK_Scalar1);
     for (int i = 1; i < n; i++) {
         rad += drad;
@@ -117,14 +117,14 @@
 class Dashing2GM : public skiagm::GM {
 public:
     Dashing2GM() {}
-    
+
 protected:
     SkString onShortName() {
         return SkString("dashing2");
     }
-    
+
     SkISize onISize() { return skiagm::make_isize(640, 480); }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         static const int gIntervals[] = {
             3,  // 3 dashes: each count [0] followed by intervals [1..count]
@@ -136,12 +136,12 @@
         void (*gProc[])(SkPath*, const SkRect&) = {
             make_path_line, make_path_rect, make_path_oval, make_path_star,
         };
-    
+
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkIntToScalar(6));
-        
+
         SkRect bounds = SkRect::MakeWH(SkIntToScalar(120), SkIntToScalar(120));
         bounds.offset(SkIntToScalar(20), SkIntToScalar(20));
         SkScalar dx = bounds.width() * 4 / 3;
@@ -156,13 +156,13 @@
             }
             SkScalar phase = vals[0] / 2;
             paint.setPathEffect(new SkDashPathEffect(vals, count, phase))->unref();
-            
+
             for (size_t x = 0; x < SK_ARRAY_COUNT(gProc); ++x) {
                 SkPath path;
                 SkRect r = bounds;
                 r.offset(x * dx, y * dy);
                 gProc[x](&path, r);
-                
+
                 canvas->drawPath(path, paint);
             }
         }
diff --git a/gm/drawbitmaprect.cpp b/gm/drawbitmaprect.cpp
index fdd0726..f9b348f 100644
--- a/gm/drawbitmaprect.cpp
+++ b/gm/drawbitmaprect.cpp
@@ -87,9 +87,9 @@
     SkString onShortName() {
         return SkString("drawbitmaprect");
     }
-    
+
     SkISize onISize() { return make_isize(gSize, gSize); }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         static const int kBmpSize = 2048;
         if (fLargeBitmap.isNull()) {
diff --git a/gm/emptypath.cpp b/gm/emptypath.cpp
index c52932e..df314a3 100644
--- a/gm/emptypath.cpp
+++ b/gm/emptypath.cpp
@@ -20,7 +20,7 @@
     SkString onShortName() {
         return SkString("emptypath");
     }
-        
+
     SkISize onISize() { return make_isize(600, 280); }
 
     void drawEmpty(SkCanvas* canvas,
@@ -38,7 +38,7 @@
         canvas->drawPath(path, paint);
         canvas->restore();
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         struct FillAndName {
             SkPath::FillType fFill;
@@ -120,7 +120,7 @@
         canvas->restore();
         canvas->restore();
     }
-    
+
 private:
     typedef GM INHERITED;
 };
diff --git a/gm/extractbitmap.cpp b/gm/extractbitmap.cpp
index 68f6d44..59f8a93 100644
--- a/gm/extractbitmap.cpp
+++ b/gm/extractbitmap.cpp
@@ -29,7 +29,7 @@
 class ExtractBitmapGM : public GM {
 public:
     ExtractBitmapGM() {}
-    
+
 protected:
     // overrides from SkEventSink
     virtual SkString onShortName() SK_OVERRIDE {
@@ -75,14 +75,14 @@
 
         // Now do the same but with a device bitmap as source image
         SkAutoTUnref<SkDevice> secondDevice(canvas->createCompatibleDevice(
-            SkBitmap::kARGB_8888_Config, bitmap.width(), 
+            SkBitmap::kARGB_8888_Config, bitmap.width(),
             bitmap.height(), true));
         SkCanvas secondCanvas(secondDevice.get());
         secondCanvas.writePixels(bitmap, 0, 0);
 
         SkBitmap deviceBitmap = secondDevice->accessBitmap(false);
         SkBitmap deviceSubset;
-        deviceBitmap.extractSubset(&deviceSubset, 
+        deviceBitmap.extractSubset(&deviceSubset,
              SkIRect::MakeXYWH(x, y, x, y));
 
         canvas->translate(SkIntToScalar(120), SkIntToScalar(0));
@@ -91,7 +91,7 @@
         canvas->drawBitmap(deviceSubset, 0, 0);
 
     }
-    
+
 private:
     typedef GM INHERITED;
 };
diff --git a/gm/giantbitmap.cpp b/gm/giantbitmap.cpp
index 2ac7727..16c01d7 100644
--- a/gm/giantbitmap.cpp
+++ b/gm/giantbitmap.cpp
@@ -23,7 +23,7 @@
     SkShader::TileMode fMode;
     bool fDoFilter;
     bool fDoRotate;
-    
+
     const SkBitmap& getBitmap() {
         if (NULL == fBM) {
             fBM = new SkBitmap;
@@ -39,7 +39,7 @@
             SkPaint paint;
             paint.setAntiAlias(true);
             paint.setStrokeWidth(SkIntToScalar(20));
-            
+
 #if 0
             for (int y = -H*2; y < H; y += 50) {
                 SkScalar yy = SkIntToScalar(y);
@@ -108,12 +108,12 @@
             m.setScale(scale, scale);
         }
         s->setLocalMatrix(m);
-        
+
         paint.setShader(s)->unref();
         paint.setFilterBitmap(fDoFilter);
 
         canvas->translate(SkIntToScalar(50), SkIntToScalar(50));
-        
+
         SkRect r = SkRect::MakeXYWH(-50, -50, 32, 16);
 //        canvas->drawRect(r, paint); return;
         canvas->drawPaint(paint);
diff --git a/gm/gradtext.cpp b/gm/gradtext.cpp
index c155cb7..f26222a 100644
--- a/gm/gradtext.cpp
+++ b/gm/gradtext.cpp
@@ -36,7 +36,7 @@
 }
 
 namespace skiagm {
-    
+
 // Replicate chrome layout test - clipped pathed gradient-shaded text
 class ChromeGradTextGM1 : public GM {
 public:
@@ -149,7 +149,7 @@
 
             paint.setShader(make_grad2(SkIntToScalar(80)))->unref();
             draw_text3(canvas, paint);
-            
+
             canvas->translate(0, paint.getTextSize() * 2);
         }
     }
diff --git a/gm/hairmodes.cpp b/gm/hairmodes.cpp
index 8ede95c..67f1fa3 100644
--- a/gm/hairmodes.cpp
+++ b/gm/hairmodes.cpp
@@ -54,7 +54,7 @@
         paint.setStrokeWidth(SK_Scalar1 * angle * 2 / 24);
         canvas->drawLine(W/2, H/2, W/2 + x, H/2 + y, paint);
     }
-    
+
     return H;
 }
 
@@ -68,7 +68,7 @@
     SkShader* s = SkShader::CreateBitmapShader(bm,
                                                SkShader::kRepeat_TileMode,
                                                SkShader::kRepeat_TileMode);
-    
+
     SkMatrix m;
     m.setScale(SkIntToScalar(6), SkIntToScalar(6));
     s->setLocalMatrix(m);
@@ -76,28 +76,28 @@
 }
 
 namespace skiagm {
-    
+
     class HairModesGM : public GM {
         SkPaint fBGPaint;
     public:
         HairModesGM() {
             fBGPaint.setShader(make_bg_shader())->unref();
         }
-        
+
     protected:
-        
+
         virtual SkString onShortName() {
             return SkString("hairmodes");
         }
-        
+
         virtual SkISize onISize() { return make_isize(640, 480); }
-        
+
         virtual void onDraw(SkCanvas* canvas) {
             const SkRect bounds = SkRect::MakeWH(W, H);
             static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 };
-            
+
             canvas->translate(SkIntToScalar(4), SkIntToScalar(4));
-            
+
             for (int alpha = 0; alpha < 4; ++alpha) {
                 canvas->save();
                 canvas->save();
@@ -108,14 +108,14 @@
                         canvas->save();
                     }
                     SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
-                    
+
                     canvas->drawRect(bounds, fBGPaint);
                     canvas->saveLayer(&bounds, NULL);
                     SkScalar dy = drawCell(canvas, mode,
                                            gAlphaValue[alpha & 1],
                                            gAlphaValue[alpha & 2]);
                     canvas->restore();
-                    
+
                     canvas->translate(0, dy * 5 / 4);
                     SkSafeUnref(mode);
                 }
@@ -131,10 +131,10 @@
     private:
         typedef GM INHERITED;
     };
-    
+
     //////////////////////////////////////////////////////////////////////////////
-    
+
     static GM* MyFactory(void*) { return new HairModesGM; }
     static GMRegistry reg(MyFactory);
-    
+
 }
diff --git a/gm/image.cpp b/gm/image.cpp
index 3b83c02..4ee90a4 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -42,11 +42,11 @@
     SkScalar radius = (size.fWidth - stroke) / 2;
 
     SkPaint paint;
-    
+
     paint.setAntiAlias(true);
     paint.setColor(fillC);
     canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint);
-    
+
     paint.setStyle(SkPaint::kStroke_Style);
     paint.setStrokeWidth(stroke);
     paint.setColor(SK_ColorBLACK);
@@ -89,21 +89,21 @@
         fBuffer = sk_malloc_throw(fBufferSize);
         fSize.set(SkIntToScalar(W), SkIntToScalar(H));
     }
-    
+
     virtual ~ImageGM() {
         sk_free(fBuffer);
     }
-        
-    
+
+
 protected:
     virtual SkString onShortName() {
         return SkString("image");
     }
-    
+
     virtual SkISize onISize() {
         return SkISize::Make(640, 480);
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         drawJpeg(canvas, this->getISize());
 
@@ -129,13 +129,13 @@
         canvas->translate(80, 0);
         test_surface(canvas, surf2);
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
-    
+
 //////////////////////////////////////////////////////////////////////////////
 
 static skiagm::GM* MyFactory(void*) { return new ImageGM; }
 static skiagm::GMRegistry reg(MyFactory);
-    
+
diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp
index a10e3a4..f805b44 100644
--- a/gm/imagefiltersgraph.cpp
+++ b/gm/imagefiltersgraph.cpp
@@ -55,7 +55,7 @@
             fInitialized = true;
         }
         canvas->clear(0x00000000);
-        
+
         SkAutoTUnref<SkImageFilter> bitmapSource(new SkBitmapSource(fBitmap));
 
         SkAutoTUnref<SkColorFilter> cf(SkColorFilter::CreateModeFilter(SK_ColorRED,
diff --git a/gm/lighting.cpp b/gm/lighting.cpp
index 2b41528..46474ab 100644
--- a/gm/lighting.cpp
+++ b/gm/lighting.cpp
@@ -18,7 +18,7 @@
     ImageLightingGM() : fInitialized(false) {
         this->setBGColor(0xFF000000);
     }
-    
+
 protected:
     virtual SkString onShortName() {
         return SkString("lighting");
@@ -76,7 +76,7 @@
         paint.setImageFilter(SkLightingImageFilter::CreateSpotLitSpecular(spotLocation, spotTarget, spotExponent, cutoffAngle, white, surfaceScale, ks, shininess))->unref();
         canvas->drawSprite(fBitmap, 220, 110, &paint);
     }
-    
+
 private:
     typedef GM INHERITED;
     SkBitmap fBitmap;
diff --git a/gm/morphology.cpp b/gm/morphology.cpp
index 29d29d0..83de758 100644
--- a/gm/morphology.cpp
+++ b/gm/morphology.cpp
@@ -19,7 +19,7 @@
         this->setBGColor(0xFF000000);
         fOnce = false;
     }
-    
+
 protected:
     virtual SkString onShortName() {
         return SkString("morphology");
@@ -83,7 +83,7 @@
             }
         }
     }
-    
+
 private:
     typedef GM INHERITED;
     SkBitmap fBitmap;
diff --git a/gm/patheffects.cpp b/gm/patheffects.cpp
index bf89e0d..a1fb675 100644
--- a/gm/patheffects.cpp
+++ b/gm/patheffects.cpp
@@ -68,7 +68,7 @@
     path.close();
     path.offset(SkIntToScalar(-6), 0);
     scale(&path, 1.5f);
-    
+
     paint->setPathEffect(new SkPath1DPathEffect(path, SkIntToScalar(21), 0,
                                 SkPath1DPathEffect::kRotate_Style))->unref();
     compose_pe(paint);
@@ -92,7 +92,7 @@
 
     SkPath path;
     path.addCircle(0, 0, SkIntToScalar(5));
-    
+
     return new SkPath2DPathEffect(m, path);
 }
 
diff --git a/gm/points.cpp b/gm/points.cpp
index e4f3c2e..0646d61 100644
--- a/gm/points.cpp
+++ b/gm/points.cpp
@@ -12,14 +12,14 @@
 
 class PointsGM : public GM {
 public:
-	PointsGM() {}
+    PointsGM() {}
 
 protected:
     virtual SkString onShortName() {
         return SkString("points");
     }
 
-	virtual SkISize onISize() {
+    virtual SkISize onISize() {
         return make_isize(640, 490);
     }
 
diff --git a/gm/samplerstress.cpp b/gm/samplerstress.cpp
index 4329f12..93a26dd 100644
--- a/gm/samplerstress.cpp
+++ b/gm/samplerstress.cpp
@@ -12,13 +12,13 @@
 
 namespace skiagm {
 
-/** 
+/**
  * Stress test the samplers by rendering a textured glyph with a mask and
  * an AA clip
  */
 class SamplerStressGM : public GM {
 public:
-    SamplerStressGM() 
+    SamplerStressGM()
     : fTextureCreated(false)
     , fShader(NULL)
     , fMaskFilter(NULL) {
@@ -47,7 +47,7 @@
         static const int xSize = 16;
         static const int ySize = 16;
 
-        fTexture.setConfig(SkBitmap::kARGB_8888_Config, 
+        fTexture.setConfig(SkBitmap::kARGB_8888_Config,
                            xSize,
                            ySize,
                            xSize*sizeof(SkColor));
diff --git a/gm/shadertext.cpp b/gm/shadertext.cpp
index 0eb7b34..d8641db 100644
--- a/gm/shadertext.cpp
+++ b/gm/shadertext.cpp
@@ -109,7 +109,7 @@
 
 class ShaderTextGM : public GM {
 public:
-	ShaderTextGM() {
+    ShaderTextGM() {
         this->setBGColor(0xFFDDDDDD);
     }
 
@@ -119,7 +119,7 @@
         return SkString("shadertext");
     }
 
-	SkISize onISize() { return make_isize(1450, 500); }
+    SkISize onISize() { return make_isize(1450, 500); }
 
     virtual void onDraw(SkCanvas* canvas) {
         const char text[] = "Shaded Text";
@@ -174,8 +174,8 @@
 
         SkPath path;
         path.arcTo(SkRect::MakeXYWH(SkIntToScalar(-40), SkIntToScalar(15),
-                                    SkIntToScalar(300), SkIntToScalar(90)), 
-                                    SkIntToScalar(225), SkIntToScalar(90), 
+                                    SkIntToScalar(300), SkIntToScalar(90)),
+                                    SkIntToScalar(225), SkIntToScalar(90),
                                     false);
         path.close();
 
diff --git a/gm/strokefill.cpp b/gm/strokefill.cpp
index e1a07eb..445de81 100644
--- a/gm/strokefill.cpp
+++ b/gm/strokefill.cpp
@@ -43,7 +43,7 @@
         paint.setAntiAlias(true);
         paint.setTextSize(SkIntToScalar(100));
         paint.setStrokeWidth(SkIntToScalar(5));
-        
+
         SkTypeface* face = SkTypeface::CreateFromName("Papyrus", SkTypeface::kNormal);
         SkSafeUnref(paint.setTypeface(face));
         show_bold(canvas, "Hello", 5, x, y, paint);
@@ -60,18 +60,18 @@
         path.addCircle(x, y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCW_Direction);
         path.addCircle(x, y + SkIntToScalar(200), SkIntToScalar(40), SkPath::kCCW_Direction);
         canvas->drawPath(path, paint);
-        
+
         SkPath path2;
         path2.setFillType(SkPath::kWinding_FillType);
         path2.addCircle(x + SkIntToScalar(120), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCCW_Direction);
         path2.addCircle(x + SkIntToScalar(120), y + SkIntToScalar(200), SkIntToScalar(40), SkPath::kCW_Direction);
         canvas->drawPath(path2, paint);
-        
+
         path2.reset();
         path2.addCircle(x + SkIntToScalar(240), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCCW_Direction);
         canvas->drawPath(path2, paint);
         SkASSERT(path2.cheapIsDirection(SkPath::kCCW_Direction));
-        
+
         path2.reset();
         SkASSERT(!path2.cheapComputeDirection(NULL));
         path2.addCircle(x + SkIntToScalar(360), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCW_Direction);
diff --git a/gm/strokes.cpp b/gm/strokes.cpp
index d4532f3..c479d69 100644
--- a/gm/strokes.cpp
+++ b/gm/strokes.cpp
@@ -25,33 +25,33 @@
     SkScalar h = rand.nextUScalar1() * (H >> 2);
     SkScalar hoffset = rand.nextSScalar1();
     SkScalar woffset = rand.nextSScalar1();
-    
+
     r->set(x, y, x + w, y + h);
     r->offset(-w/2 + woffset, -h/2 + hoffset);
-    
+
     paint->setColor(rand.nextU());
     paint->setAlpha(0xFF);
 }
 
-    
+
 class StrokesGM : public skiagm::GM {
 public:
     StrokesGM() {}
-    
+
 protected:
     virtual SkString onShortName() {
         return SkString("strokes_round");
     }
-    
+
     virtual SkISize onISize() {
         return SkISize::Make(W, H*2);
     }
-    
-    virtual void onDraw(SkCanvas* canvas) {        
+
+    virtual void onDraw(SkCanvas* canvas) {
         SkPaint paint;
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkIntToScalar(9)/2);
-        
+
         for (int y = 0; y < 2; y++) {
             paint.setAntiAlias(!!y);
             SkAutoCanvasRestore acr(canvas, true);
@@ -60,7 +60,7 @@
                                               SkIntToScalar(2), SkIntToScalar(2)
                                               , SW - SkIntToScalar(2), SH - SkIntToScalar(2)
                                               ));
-            
+
             SkRandom rand;
             for (int i = 0; i < N; i++) {
                 SkRect r;
@@ -72,7 +72,7 @@
             }
         }
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
@@ -89,16 +89,16 @@
             fPath.lineTo(x, y);
         }
     }
-    
+
 protected:
     virtual SkString onShortName() {
         return SkString("strokes_poly");
     }
-    
+
     virtual SkISize onISize() {
         return SkISize::Make(W, H*2);
     }
-    
+
     static void rotate(SkScalar angle, SkScalar px, SkScalar py, SkCanvas* canvas) {
         SkMatrix matrix;
         matrix.setRotate(angle, px, py);
@@ -107,11 +107,11 @@
 
     virtual void onDraw(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorWHITE);
-        
+
         SkPaint paint;
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkIntToScalar(9)/2);
-        
+
         for (int y = 0; y < 2; y++) {
             paint.setAntiAlias(!!y);
             SkAutoCanvasRestore acr(canvas, true);
@@ -120,7 +120,7 @@
                                               SkIntToScalar(2),
                                               SW - SkIntToScalar(2),
                                               SH - SkIntToScalar(2)));
-            
+
             SkRandom rand;
             for (int i = 0; i < N/2; i++) {
                 SkRect r;
@@ -130,7 +130,7 @@
             }
         }
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
@@ -149,25 +149,25 @@
         path->addRect(inset(bounds), SkPath::kCW_Direction);
         title->set("CW CW");
     }
-    
+
     static void make1(SkPath* path, const SkRect& bounds, SkString* title) {
         path->addRect(bounds, SkPath::kCW_Direction);
         path->addRect(inset(bounds), SkPath::kCCW_Direction);
         title->set("CW CCW");
     }
-    
+
     static void make2(SkPath* path, const SkRect& bounds, SkString* title) {
         path->addOval(bounds, SkPath::kCW_Direction);
         path->addOval(inset(bounds), SkPath::kCW_Direction);
         title->set("CW CW");
     }
-    
+
     static void make3(SkPath* path, const SkRect& bounds, SkString* title) {
         path->addOval(bounds, SkPath::kCW_Direction);
         path->addOval(inset(bounds), SkPath::kCCW_Direction);
         title->set("CW CCW");
     }
-    
+
     static void make4(SkPath* path, const SkRect& bounds, SkString* title) {
         path->addRect(bounds, SkPath::kCW_Direction);
         SkRect r = bounds;
@@ -175,7 +175,7 @@
         path->addOval(r, SkPath::kCW_Direction);
         title->set("CW CW");
     }
-    
+
     static void make5(SkPath* path, const SkRect& bounds, SkString* title) {
         path->addRect(bounds, SkPath::kCW_Direction);
         SkRect r = bounds;
@@ -186,16 +186,16 @@
 
 public:
     Strokes3GM() {}
-    
+
 protected:
     virtual SkString onShortName() {
         return SkString("strokes3");
     }
-    
+
     virtual SkISize onISize() {
         return SkISize::Make(W, H*2);
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         SkPaint origPaint;
         origPaint.setAntiAlias(true);
@@ -219,7 +219,7 @@
             SkPath orig;
             SkString str;
             procs[i](&orig, bounds, &str);
-            
+
             canvas->save();
             for (int j = 0; j < 13; ++j) {
                 strokePaint.setStrokeWidth(SK_Scalar1 * j * j);
@@ -234,7 +234,7 @@
             canvas->translate(0, dy);
         }
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
diff --git a/gm/texteffects.cpp b/gm/texteffects.cpp
index fddfadf..18cae70 100644
--- a/gm/texteffects.cpp
+++ b/gm/texteffects.cpp
@@ -14,12 +14,12 @@
     p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(3),
                                              SkBlurMaskFilter::kNormal_BlurStyle))->unref();
     rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
-    
+
     p.setMaskFilter(NULL);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
     rast->addLayer(p);
-    
+
     p.setAlpha(0x11);
     p.setStyle(SkPaint::kFill_Style);
     p.setXfermodeMode(SkXfermode::kSrc_Mode);
@@ -28,7 +28,7 @@
 
 static void r1(SkLayerRasterizer* rast, SkPaint& p) {
     rast->addLayer(p);
-    
+
     p.setAlpha(0x40);
     p.setXfermodeMode(SkXfermode::kSrc_Mode);
     p.setStyle(SkPaint::kStroke_Style);
@@ -40,7 +40,7 @@
     p.setStyle(SkPaint::kStrokeAndFill_Style);
     p.setStrokeWidth(SK_Scalar1*4);
     rast->addLayer(p);
-    
+
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1*3/2);
     p.setXfermodeMode(SkXfermode::kClear_Mode);
@@ -51,7 +51,7 @@
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1*3);
     rast->addLayer(p);
-    
+
     p.setAlpha(0x20);
     p.setStyle(SkPaint::kFill_Style);
     p.setXfermodeMode(SkXfermode::kSrc_Mode);
@@ -61,11 +61,11 @@
 static void r4(SkLayerRasterizer* rast, SkPaint& p) {
     p.setAlpha(0x60);
     rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
-    
+
     p.setAlpha(0xFF);
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rast->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
-    
+
     p.setXfermode(NULL);
     rast->addLayer(p);
 }
@@ -74,7 +74,7 @@
 
 static void r5(SkLayerRasterizer* rast, SkPaint& p) {
     rast->addLayer(p);
-    
+
     p.setPathEffect(new SkDiscretePathEffect(SK_Scalar1*4, SK_Scalar1*3))->unref();
     p.setXfermodeMode(SkXfermode::kSrcOut_Mode);
     rast->addLayer(p);
@@ -82,7 +82,7 @@
 
 static void r6(SkLayerRasterizer* rast, SkPaint& p) {
     rast->addLayer(p);
-    
+
     p.setAntiAlias(false);
     SkLayerRasterizer* rast2 = new SkLayerRasterizer;
     r5(rast2, p);
@@ -109,14 +109,14 @@
 
 static void r8(SkLayerRasterizer* rast, SkPaint& p) {
     rast->addLayer(p);
-    
+
     SkMatrix    lattice;
     lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
     lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
     p.setPathEffect(MakeDotEffect(SK_Scalar1*2, lattice))->unref();
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rast->addLayer(p);
-    
+
     p.setPathEffect(NULL);
     p.setXfermode(NULL);
     p.setStyle(SkPaint::kStroke_Style);
@@ -128,33 +128,33 @@
 public:
     Line2DPathEffect(SkScalar width, const SkMatrix& matrix)
     : Sk2DPathEffect(matrix), fWidth(width) {}
-    
-	virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec) SK_OVERRIDE {
+
+    virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec) SK_OVERRIDE {
         if (this->INHERITED::filterPath(dst, src, rec)) {
             rec->setStrokeStyle(fWidth);
             return true;
         }
         return false;
     }
-    
+
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Line2DPathEffect)
-    
+
 protected:
-	virtual void nextSpan(int u, int v, int ucount, SkPath* dst) {
+    virtual void nextSpan(int u, int v, int ucount, SkPath* dst) {
         if (ucount > 1) {
-            SkPoint	src[2], dstP[2];
-            
+            SkPoint    src[2], dstP[2];
+
             src[0].set(SkIntToScalar(u) + SK_ScalarHalf,
                        SkIntToScalar(v) + SK_ScalarHalf);
             src[1].set(SkIntToScalar(u+ucount) + SK_ScalarHalf,
                        SkIntToScalar(v) + SK_ScalarHalf);
             this->getMatrix().mapPoints(dstP, src, 2);
-            
+
             dst->moveTo(dstP[0]);
             dst->lineTo(dstP[1]);
         }
     }
-    
+
     Line2DPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
         fWidth = buffer.readScalar();
     }
@@ -162,23 +162,23 @@
         this->INHERITED::flatten(buffer);
         buffer.writeScalar(fWidth);
     }
-    
+
 private:
     SkScalar fWidth;
-    
+
     typedef Sk2DPathEffect INHERITED;
 };
 
 static void r9(SkLayerRasterizer* rast, SkPaint& p) {
     rast->addLayer(p);
-    
+
     SkMatrix    lattice;
     lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
     lattice.postRotate(SkIntToScalar(30), 0, 0);
     p.setPathEffect(new Line2DPathEffect(SK_Scalar1*2, lattice))->unref();
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rast->addLayer(p);
-    
+
     p.setPathEffect(NULL);
     p.setXfermode(NULL);
     p.setStyle(SkPaint::kStroke_Style);
@@ -210,12 +210,12 @@
     {
         SkPaint p;
         SkLayerRasterizer*  rast = new SkLayerRasterizer;
-        
+
         p.setAntiAlias(true);
         proc(rast, p);
         paint->setRasterizer(rast)->unref();
     }
-    
+
 #if 0
     SkScalar dir[] = { SK_Scalar1, SK_Scalar1, SK_Scalar1 };
     paint->setMaskFilter(SkBlurMaskFilter::CreateEmboss(dir, SK_Scalar1/4, SkIntToScalar(4), SkIntToScalar(3)))->unref();
@@ -225,40 +225,40 @@
 
 class TextEffectsGM : public skiagm::GM {
 public:
-	TextEffectsGM() {}
-    
+    TextEffectsGM() {}
+
 protected:
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("texteffects");
     }
-    
+
     virtual SkISize onISize() SK_OVERRIDE {
         return SkISize::Make(460, 680);
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
         canvas->save();
-        
+
         SkPaint     paint;
         paint.setAntiAlias(true);
         paint.setTextSize(SkIntToScalar(56));
-        
+
         SkScalar    x = SkIntToScalar(20);
         SkScalar    y = paint.getTextSize();
-        
+
         SkString str("Hamburgefons");
-        
+
         for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) {
             apply_shader(&paint, i);
-            
+
             //  paint.setMaskFilter(NULL);
             //  paint.setColor(SK_ColorBLACK);
-            
+
             canvas->drawText(str.c_str(), str.size(), x, y, paint);
-            
+
             y += paint.getFontSpacing();
         }
-        
+
         canvas->restore();
     }
 
@@ -270,9 +270,9 @@
 private:
     typedef skiagm::GM INHERITED;
 };
-    
+
 //////////////////////////////////////////////////////////////////////////////
 
 static skiagm::GM* MyFactory(void*) { return new TextEffectsGM; }
 static skiagm::GMRegistry reg(MyFactory);
-    
+
diff --git a/gm/tilemodes.cpp b/gm/tilemodes.cpp
index 289caae..08bcb79 100644
--- a/gm/tilemodes.cpp
+++ b/gm/tilemodes.cpp
@@ -25,14 +25,14 @@
     bm->setConfig(config, w, h);
     bm->allocPixels();
     bm->eraseColor(0);
-    
+
     SkCanvas    canvas(*bm);
     SkPoint     pts[] = { { 0, 0 }, { SkIntToScalar(w), SkIntToScalar(h)} };
     SkColor     colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
     SkScalar    pos[] = { 0, SK_Scalar1/2, SK_Scalar1 };
     SkPaint     paint;
-    
-    SkUnitMapper*   um = NULL;    
+
+    SkUnitMapper*   um = NULL;
 
     um = new SkCosineMapper;
 //    um = new SkDiscreteMapper(12);
@@ -63,7 +63,7 @@
 class TilingGM : public GM {
     SkBlurDrawLooper    fLooper;
 public:
-	TilingGM()
+    TilingGM()
             : fLooper(SkIntToScalar(1), SkIntToScalar(2), SkIntToScalar(2),
                       0x88000000) {
         for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
@@ -72,23 +72,23 @@
     }
 
     SkBitmap    fTexture[SK_ARRAY_COUNT(gConfigs)];
-	
+
 protected:
     SkString onShortName() {
         return SkString("tilemodes");
     }
-    
-	SkISize onISize() { return make_isize(880, 560); }
-    
+
+    SkISize onISize() { return make_isize(880, 560); }
+
     virtual void onDraw(SkCanvas* canvas) {
-        
+
         SkRect r = { 0, 0, SkIntToScalar(gWidth*2), SkIntToScalar(gHeight*2) };
 
         static const char* gConfigNames[] = { "8888", "565", "4444" };
-    
+
         static const bool           gFilters[] = { false, true };
         static const char*          gFilterNames[] = {     "point",                     "bilinear" };
-    
+
         static const SkShader::TileMode gModes[] = { SkShader::kClamp_TileMode, SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode };
         static const char*          gModeNames[] = {    "C",                    "R",                   "M" };
 
@@ -106,11 +106,11 @@
 
                 p.setTextAlign(SkPaint::kCenter_Align);
                 canvas->drawText(str.c_str(), str.size(), x + r.width()/2, y, p);
-                
+
                 x += r.width() * 4 / 3;
             }
         }
-        
+
         y += SkIntToScalar(16);
 
         for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
@@ -121,12 +121,12 @@
                         SkPaint paint;
                         setup(&paint, fTexture[i], gFilters[j], gModes[kx], gModes[ky]);
                         paint.setDither(true);
-                        
+
                         canvas->save();
                         canvas->translate(x, y);
                         canvas->drawRect(r, paint);
                         canvas->restore();
-                        
+
                         x += r.width() * 4 / 3;
                     }
                 }
@@ -143,7 +143,7 @@
             }
         }
     }
-    
+
 private:
     typedef GM INHERITED;
 };
diff --git a/gm/tinybitmap.cpp b/gm/tinybitmap.cpp
index d532b5b..3b1006c 100644
--- a/gm/tinybitmap.cpp
+++ b/gm/tinybitmap.cpp
@@ -38,7 +38,7 @@
         this->setBGColor(0xFFDDDDDD);
         fBM = make_bitmap();
     }
-    
+
 protected:
     SkString onShortName() {
         return SkString("tinybitmap");
@@ -47,7 +47,7 @@
     virtual SkISize onISize() { return make_isize(100, 100); }
 
     virtual void onDraw(SkCanvas* canvas) {
-        SkShader* s = 
+        SkShader* s =
             SkShader::CreateBitmapShader(fBM, SkShader::kRepeat_TileMode,
                                          SkShader::kMirror_TileMode);
         SkPaint paint;
@@ -55,7 +55,7 @@
         paint.setShader(s)->unref();
         canvas->drawPaint(paint);
     }
-    
+
 private:
     typedef GM INHERITED;
 };
diff --git a/gm/twopointradial.cpp b/gm/twopointradial.cpp
index 2d50814..40712e8 100644
--- a/gm/twopointradial.cpp
+++ b/gm/twopointradial.cpp
@@ -30,19 +30,19 @@
     SkColor colors[] = { SK_ColorGREEN, SK_ColorRED };
     SkPaint paint;
     paint.setAntiAlias(true);
-    
+
     SkString str;
     str.printf("%g,%g,%g  %g,%g,%g",
                SkScalarToFloat(c0.fX), SkScalarToFloat(c0.fY), SkScalarToFloat(r0),
                SkScalarToFloat(c1.fX), SkScalarToFloat(c1.fY), SkScalarToFloat(r1));
     canvas->drawText(str.c_str(), str.size(),
                      bounds.fLeft, bounds.fTop - paint.getTextSize()/2, paint);
-    
+
     paint.setShader(SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1,
                                                             colors, NULL, 2,
                                                             SkShader::kClamp_TileMode))->unref();
     canvas->drawRect(bounds, paint);
-    
+
     paint.setShader(NULL);
     paint.setColor(0x66000000);
     paint.setStyle(SkPaint::kStroke_Style);
@@ -67,14 +67,14 @@
             SkPaint paint;
             paint.setColor(SK_ColorBLUE);
             canvas->drawRect(
-                    SkRect::MakeWH(SkIntToScalar(this->getISize().fWidth), 
-                                   SkIntToScalar(this->getISize().fHeight)), 
+                    SkRect::MakeWH(SkIntToScalar(this->getISize().fWidth),
+                                   SkIntToScalar(this->getISize().fHeight)),
                     paint);
         }
         SkPaint paint;
         const int R0 = 20;
         const int R1 = 40;
-    
+
         const SkScalar DX = SkIntToScalar(250);
         const SkScalar DY = SkIntToScalar(130);
 
@@ -88,12 +88,12 @@
             0, 0, R0,       25, 0, R0,
             0, 0, R0,       100, 0, R0,
         };
-            
+
         int count = SK_ARRAY_COUNT(gData) / 6;
         for (int i = 0; i < count; ++i) {
             SkScalar data[6];
             intToScalars(data, &gData[i * 6], 6);
-            
+
             int n = canvas->save();
             drawGrad(canvas, &data[0], &data[3]);
             canvas->translate(DX, 0);
diff --git a/gm/typeface.cpp b/gm/typeface.cpp
index 9c73630..2217863 100644
--- a/gm/typeface.cpp
+++ b/gm/typeface.cpp
@@ -71,7 +71,7 @@
     }
 
     SkTypeface** fFaces;
-    
+
     typedef GM INHERITED;
 };
 
diff --git a/gm/verttext.cpp b/gm/verttext.cpp
index 0f3cb3b..67a2da5 100644
--- a/gm/verttext.cpp
+++ b/gm/verttext.cpp
@@ -56,7 +56,7 @@
     virtual void onDraw(SkCanvas* canvas) {
         SkScalar x = SkIntToScalar(100);
         SkScalar y = SkIntToScalar(50);
-        
+
         for (int i = 0; i < 4; ++i) {
             SkPaint     paint;
             paint.setAntiAlias(true);
@@ -70,7 +70,7 @@
             paint.setVerticalText(true);
             drawBaseline(canvas, paint, x, y);
             canvas->drawText(gText, gLen, x, y, paint);
-            
+
             x += SkIntToScalar(40);
             y += SkIntToScalar(120);
 
diff --git a/gm/verttext2.cpp b/gm/verttext2.cpp
index 8491dc3..33380e0 100644
--- a/gm/verttext2.cpp
+++ b/gm/verttext2.cpp
@@ -39,7 +39,7 @@
     SkISize onISize() { return make_isize(640, 480); }
 
     virtual void onDraw(SkCanvas* canvas) {
-        
+
         for (int i = 0; i < 3; ++i) {
             SkPaint paint;
             paint.setColor(SK_ColorRED);
@@ -77,7 +77,7 @@
         paint.setTypeface(family);
         paint.setTextSize(textHeight);
 
-        canvas->drawText(string.c_str(), string.size(), y, 
+        canvas->drawText(string.c_str(), string.size(), y,
                 SkIntToScalar(alignment == SkPaint::kLeft_Align ? 10 : 240),
                 paint);
         y += textHeight;
diff --git a/gm/verylargebitmap.cpp b/gm/verylargebitmap.cpp
index b0fdf27..4704a86 100644
--- a/gm/verylargebitmap.cpp
+++ b/gm/verylargebitmap.cpp
@@ -70,7 +70,7 @@
 
         show_bm(canvas, big, small, SK_ColorBLUE);
         canvas->translate(0, SkIntToScalar(150));
-        
+
         // as of this writing, the raster code will fail to draw the scaled version
         // since it has a 64K limit on x,y coordinates... (but gpu should succeed)
         show_bm(canvas, veryBig, small, SK_ColorGREEN);
diff --git a/gm/xfermodes.cpp b/gm/xfermodes.cpp
index 42b8a6a..25100d2 100644
--- a/gm/xfermodes.cpp
+++ b/gm/xfermodes.cpp
@@ -62,7 +62,7 @@
             scratchBitmap.setPixels(localData);
             scratchBitmap.setIsOpaque(true);
             scratchBitmap.copyTo(&fBG, SkBitmap::kARGB_4444_Config);
-            
+
             make_bitmaps(W, H, &fSrcB, &fDstB);
             fOnce = true;
         }
diff --git a/samplecode/GMSampleView.h b/samplecode/GMSampleView.h
index 7decfcb..0b224a5 100644
--- a/samplecode/GMSampleView.h
+++ b/samplecode/GMSampleView.h
@@ -20,11 +20,11 @@
 public:
     GMSampleView(GM* gm)
     : fGM(gm) {}
-    
+
     virtual ~GMSampleView() {
         delete fGM;
     }
-    
+
 protected:
     virtual bool onQuery(SkEvent* evt) {
         if (SampleCode::TitleQ(*evt)) {
@@ -35,7 +35,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         fGM->drawContent(canvas);
     }
diff --git a/samplecode/Sample2PtRadial.cpp b/samplecode/Sample2PtRadial.cpp
index 0c44fd6..073fd82 100644
--- a/samplecode/Sample2PtRadial.cpp
+++ b/samplecode/Sample2PtRadial.cpp
@@ -36,7 +36,7 @@
         SkShader* s = SkGradientShader::CreateTwoPointRadial(c0, r0, c1, r1, colors,
                                                              NULL, 2,
                                                              SkShader::kClamp_TileMode);
-        
+
         SkPaint paint;
         paint.setShader(s)->unref();
         canvas->drawPaint(paint);
diff --git a/samplecode/SampleAAClip.cpp b/samplecode/SampleAAClip.cpp
index d2931fa..196641e 100644
--- a/samplecode/SampleAAClip.cpp
+++ b/samplecode/SampleAAClip.cpp
@@ -17,7 +17,7 @@
     c0.setRect(r0);
     c1.setRect(r1);
     c2.op(c0, c1, op);
-    
+
     SkIRect r2 = c2.getBounds();
     SkASSERT(r2 == expectedR);
 }
@@ -42,7 +42,7 @@
 static void drawClip(SkCanvas* canvas, const SkAAClip& clip) {
     SkMask mask;
     SkBitmap bm;
-    
+
     clip.copyToMask(&mask);
     SkAutoMaskFreeImage amfi(mask.fImage);
 
@@ -78,7 +78,7 @@
         SkAAClip aaclip;
         SkPath path;
         SkRect bounds;
-        
+
         bounds.set(0, 0, 20, 20);
         bounds.inset(SK_ScalarHalf, SK_ScalarHalf);
 
@@ -99,15 +99,15 @@
         aaclip3.op(aaclip, aaclip2, SkRegion::kIntersect_Op);
         canvas->translate(30, 0);
         drawClip(canvas, aaclip3);
-        
+
 #endif
-        
+
 #if 0
         SkRect r;
         r.set(0, 0, this->width(), this->height());
         r.inset(20, 20);
         canvas->clipRect(r);
-        
+
         SkPath path;
         path.addRect(r);
         SkPaint paint;
diff --git a/samplecode/SampleAARectModes.cpp b/samplecode/SampleAARectModes.cpp
index a1004a3..00edfba 100644
--- a/samplecode/SampleAARectModes.cpp
+++ b/samplecode/SampleAARectModes.cpp
@@ -57,7 +57,7 @@
                                    H / 4 + offset,
                                    W / 2, H / 2);
     canvas->drawRect(rect, paint);
-    
+
     return H;
 }
 
@@ -72,7 +72,7 @@
     SkShader* s = SkShader::CreateBitmapShader(bm,
                                                SkShader::kRepeat_TileMode,
                                                SkShader::kRepeat_TileMode);
-    
+
     SkMatrix m;
     m.setScale(SkIntToScalar(6), SkIntToScalar(6));
     s->setLocalMatrix(m);
@@ -112,7 +112,7 @@
                     canvas->save();
                 }
                 SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
-                
+
                 canvas->drawRect(bounds, fBGPaint);
                 canvas->saveLayer(&bounds, NULL);
                 SkScalar dy = drawCell(canvas, mode,
@@ -128,7 +128,7 @@
             canvas->translate(W * 5 / 4, 0);
         }
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleAARects.cpp b/samplecode/SampleAARects.cpp
index 0490552..e66f8df 100644
--- a/samplecode/SampleAARects.cpp
+++ b/samplecode/SampleAARects.cpp
@@ -17,13 +17,13 @@
     bitmap.setConfig(SkBitmap::kARGB_8888_Config, n, n);
     bitmap.allocPixels();
     bitmap.eraseColor(SK_ColorGREEN);
-    
+
     SkCanvas canvas(bitmap);
     SkRect r;
     r.set(0, 0, SkIntToScalar(n), SkIntToScalar(n));
     SkPaint paint;
     paint.setAntiAlias(true);
-    
+
     paint.setColor(SK_ColorRED);
     canvas.drawOval(r, paint);
     paint.setColor(SK_ColorBLUE);
@@ -31,7 +31,7 @@
     paint.setStyle(SkPaint::kStroke_Style);
     canvas.drawLine(0, 0, r.fRight, r.fBottom, paint);
     canvas.drawLine(0, r.fBottom, r.fRight, 0, paint);
-    
+
     return bitmap;
 }
 
@@ -43,10 +43,10 @@
 public:
     AARectView() {
         fBitmap = createBitmap(N);
-        
+
         fWidth = N;
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -184,7 +184,7 @@
             }
         }
     }
-    
+
 private:
     int fWidth;
 
diff --git a/samplecode/SampleAll.cpp b/samplecode/SampleAll.cpp
index 9644e79..b850642 100644
--- a/samplecode/SampleAll.cpp
+++ b/samplecode/SampleAll.cpp
@@ -38,14 +38,14 @@
 #include "SkXfermode.h"
 
 #include <math.h>
-    
+
 static inline SkPMColor rgb2gray(SkPMColor c) {
     unsigned r = SkGetPackedR32(c);
     unsigned g = SkGetPackedG32(c);
     unsigned b = SkGetPackedB32(c);
-    
+
     unsigned x = (r * 5 + g * 7 + b * 4) >> 4;
-    
+
     return SkPackARGB32(0, x, x, x) | (c & (SK_A32_MASK << SK_A32_SHIFT));
 }
 
@@ -69,7 +69,7 @@
             result[i] = src[i] & mask;
         }
     }
-    
+
 private:
     SkPMColor   fMask;
 };
@@ -101,7 +101,7 @@
     p.setStrokeWidth(SK_Scalar1*2);
     rast->addLayer(p);
 }
-    
+
 static void r2(SkLayerRasterizer* rast, SkPaint& p) {
     p.setStyle(SkPaint::kStrokeAndFill_Style);
     p.setStrokeWidth(SK_Scalar1*4);
@@ -146,7 +146,7 @@
 
 static void r6(SkLayerRasterizer* rast, SkPaint& p) {
     rast->addLayer(p);
-    
+
     p.setAntiAlias(false);
     SkLayerRasterizer* rast2 = new SkLayerRasterizer;
     r5(rast2, p);
@@ -163,10 +163,10 @@
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Dot2DPathEffect)
 
 protected:
-	virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) {
+    virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) {
         dst->addCircle(loc.fX, loc.fY, fRadius);
     }
-    
+
     Dot2DPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
         fRadius = buffer.readScalar();
     }
@@ -191,7 +191,7 @@
 
 static void r8(SkLayerRasterizer* rast, SkPaint& p) {
     rast->addLayer(p);
-    
+
     SkMatrix    lattice;
     lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
     lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
@@ -211,32 +211,32 @@
     Line2DPathEffect(SkScalar width, const SkMatrix& matrix)
         : Sk2DPathEffect(matrix), fWidth(width) {}
 
-	virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec) SK_OVERRIDE {
+    virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec) SK_OVERRIDE {
         if (this->INHERITED::filterPath(dst, src, rec)) {
             rec->setStrokeStyle(fWidth);
             return true;
         }
         return false;
     }
-    
+
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Line2DPathEffect)
 
 protected:
-	virtual void nextSpan(int u, int v, int ucount, SkPath* dst) {
+    virtual void nextSpan(int u, int v, int ucount, SkPath* dst) {
         if (ucount > 1) {
-            SkPoint	src[2], dstP[2];
+            SkPoint    src[2], dstP[2];
 
             src[0].set(SkIntToScalar(u) + SK_ScalarHalf,
                        SkIntToScalar(v) + SK_ScalarHalf);
             src[1].set(SkIntToScalar(u+ucount) + SK_ScalarHalf,
                        SkIntToScalar(v) + SK_ScalarHalf);
             this->getMatrix().mapPoints(dstP, src, 2);
-            
+
             dst->moveTo(dstP[0]);
             dst->lineTo(dstP[1]);
         }
     }
-    
+
     Line2DPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
         fWidth = buffer.readScalar();
     }
@@ -255,7 +255,7 @@
 
 static void r9(SkLayerRasterizer* rast, SkPaint& p) {
     rast->addLayer(p);
-    
+
     SkMatrix    lattice;
     lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
     lattice.postRotate(SkIntToScalar(30), 0, 0);
@@ -286,7 +286,7 @@
     { 0xFFFFFF, 0x000000 }  // identity case
 };
 
-static void apply_shader(SkPaint* paint, int index) {    
+static void apply_shader(SkPaint* paint, int index) {
     raster_proc proc = gRastProcs[index];
     if (proc) {
         SkPaint p;
@@ -299,7 +299,7 @@
 
 #if 1
     SkScalar dir[] = { SK_Scalar1, SK_Scalar1, SK_Scalar1 };
-    paint->setMaskFilter(SkBlurMaskFilter::CreateEmboss(dir, SK_Scalar1/4, SkIntToScalar(4), SkIntToScalar(3)))->unref();    
+    paint->setMaskFilter(SkBlurMaskFilter::CreateEmboss(dir, SK_Scalar1/4, SkIntToScalar(4), SkIntToScalar(3)))->unref();
     paint->setColor(SK_ColorBLUE);
 #endif
 }
@@ -307,7 +307,7 @@
 class DemoView : public SampleView {
 public:
     DemoView() {}
-	
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -317,11 +317,11 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual bool onClick(Click* click) {
         return this->INHERITED::onClick(click);
     }
-    
+
     void makePath(SkPath& path) {
         path.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(20),
             SkPath::kCCW_Direction);
@@ -339,7 +339,7 @@
         }
         path.close();
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         canvas->save();
         drawPicture(canvas, 0);
@@ -367,36 +367,36 @@
             } while (true);
         }
     }
-    
+
     void drawPicture(SkCanvas* canvas, int spriteOffset) {
-	    SkMatrix matrix; matrix.reset();
-		SkPaint paint;
-		SkPath path;
+        SkMatrix matrix; matrix.reset();
+        SkPaint paint;
+        SkPath path;
         SkPoint start = {0, 0};
         SkPoint stop = { SkIntToScalar(40), SkIntToScalar(40) };
-		SkRect rect = {0, 0, SkIntToScalar(40), SkIntToScalar(40) };
-		SkRect rect2 = {0, 0, SkIntToScalar(65), SkIntToScalar(20) };
-		SkScalar left = 0, top = 0, x = 0, y = 0;
-		size_t index;
-		
-		char ascii[] = "ascii...";
-		size_t asciiLength = sizeof(ascii) - 1;
-		char utf8[] = "utf8" "\xe2\x80\xa6";
-		short utf16[] = {'u', 't', 'f', '1', '6', 0x2026 };
-		short utf16simple[] = {'u', 't', 'f', '1', '6', '!' };
-		
+        SkRect rect = {0, 0, SkIntToScalar(40), SkIntToScalar(40) };
+        SkRect rect2 = {0, 0, SkIntToScalar(65), SkIntToScalar(20) };
+        SkScalar left = 0, top = 0, x = 0, y = 0;
+        size_t index;
+
+        char ascii[] = "ascii...";
+        size_t asciiLength = sizeof(ascii) - 1;
+        char utf8[] = "utf8" "\xe2\x80\xa6";
+        short utf16[] = {'u', 't', 'f', '1', '6', 0x2026 };
+        short utf16simple[] = {'u', 't', 'f', '1', '6', '!' };
+
         makePath(path);
         SkTDArray<SkPoint>(pos);
-		pos.setCount(asciiLength);
-		for (index = 0;  index < asciiLength; index++)
-			pos[index].set(SkIntToScalar((unsigned int)index * 10),
+        pos.setCount(asciiLength);
+        for (index = 0;  index < asciiLength; index++)
+            pos[index].set(SkIntToScalar((unsigned int)index * 10),
                                        SkIntToScalar((unsigned int)index * 2));
         SkTDArray<SkPoint>(pos2);
-		pos2.setCount(asciiLength);
-		for (index = 0;  index < asciiLength; index++)
-			pos2[index].set(SkIntToScalar((unsigned int)index * 10),
+        pos2.setCount(asciiLength);
+        for (index = 0;  index < asciiLength; index++)
+            pos2[index].set(SkIntToScalar((unsigned int)index * 10),
                                         SkIntToScalar(20));
-		
+
         // shaders
         SkPoint linearPoints[] = { { 0, 0, }, { SkIntToScalar(40), SkIntToScalar(40) } };
         SkColor linearColors[] = { SK_ColorRED, SK_ColorBLUE };
@@ -416,116 +416,116 @@
         SkShader::TileMode radialMode = SkShader::kRepeat_TileMode;
         SkUnitMapper* radialMapper = new SkCosineMapper();
         SkAutoUnref unmapRadialMapper(radialMapper);
-        SkShader* radial = SkGradientShader::CreateRadial(radialCenter, 
+        SkShader* radial = SkGradientShader::CreateRadial(radialCenter,
             radialRadius, radialColors, radialPos, radialCount,
             radialMode, radialMapper);
-        
+
         SkTransparentShader* transparentShader = new SkTransparentShader();
         SkEmbossMaskFilter::Light light;
         light.fDirection[0] = SK_Scalar1/2;
         light.fDirection[1] = SK_Scalar1/2;
         light.fDirection[2] = SK_Scalar1/3;
-        light.fAmbient		= 0x48;
-        light.fSpecular		= 0x80;
+        light.fAmbient        = 0x48;
+        light.fSpecular        = 0x80;
         SkScalar radius = SkIntToScalar(12)/5;
-        SkEmbossMaskFilter* embossFilter = new SkEmbossMaskFilter(light, 
+        SkEmbossMaskFilter* embossFilter = new SkEmbossMaskFilter(light,
             radius);
-            
+
         SkXfermode* xfermode = SkXfermode::Create(SkXfermode::kXor_Mode);
         SkColorFilter* lightingFilter = SkColorFilter::CreateLightingFilter(
             0xff89bc45, 0xff112233);
-        
+
         canvas->save();
-		canvas->translate(SkIntToScalar(0), SkIntToScalar(5));
-		paint.setFlags(SkPaint::kAntiAlias_Flag | SkPaint::kFilterBitmap_Flag);
-		// !!! draw through a clip
-		paint.setColor(SK_ColorLTGRAY);
-		paint.setStyle(SkPaint::kFill_Style);
+        canvas->translate(SkIntToScalar(0), SkIntToScalar(5));
+        paint.setFlags(SkPaint::kAntiAlias_Flag | SkPaint::kFilterBitmap_Flag);
+        // !!! draw through a clip
+        paint.setColor(SK_ColorLTGRAY);
+        paint.setStyle(SkPaint::kFill_Style);
         SkRect clip = {0, 0, SkIntToScalar(320), SkIntToScalar(120)};
         canvas->clipRect(clip);
-        paint.setShader(SkShader::CreateBitmapShader(fTx, 
+        paint.setShader(SkShader::CreateBitmapShader(fTx,
             SkShader::kMirror_TileMode, SkShader::kRepeat_TileMode))->unref();
-		canvas->drawPaint(paint);
-		canvas->save();
-        
+        canvas->drawPaint(paint);
+        canvas->save();
+
         // line (exercises xfermode, colorShader, colorFilter, filterShader)
-		paint.setColor(SK_ColorGREEN);
-		paint.setStrokeWidth(SkIntToScalar(10));
-		paint.setStyle(SkPaint::kStroke_Style);
+        paint.setColor(SK_ColorGREEN);
+        paint.setStrokeWidth(SkIntToScalar(10));
+        paint.setStyle(SkPaint::kStroke_Style);
         paint.setXfermode(xfermode)->unref();
         paint.setColorFilter(lightingFilter)->unref();
-		canvas->drawLine(start.fX, start.fY, stop.fX, stop.fY, paint); // should not be green
-		paint.setXfermode(NULL);
+        canvas->drawLine(start.fX, start.fY, stop.fX, stop.fY, paint); // should not be green
+        paint.setXfermode(NULL);
         paint.setColorFilter(NULL);
-        
+
         // rectangle
-		paint.setStyle(SkPaint::kFill_Style);
-		canvas->translate(SkIntToScalar(50), 0);
-		paint.setColor(SK_ColorYELLOW);
+        paint.setStyle(SkPaint::kFill_Style);
+        canvas->translate(SkIntToScalar(50), 0);
+        paint.setColor(SK_ColorYELLOW);
         paint.setShader(linear)->unref();
         paint.setPathEffect(pathEffectTest())->unref();
-		canvas->drawRect(rect, paint); 
+        canvas->drawRect(rect, paint);
         paint.setPathEffect(NULL);
-        
+
         // circle w/ emboss & transparent (exercises 3dshader)
-		canvas->translate(SkIntToScalar(50), 0);
+        canvas->translate(SkIntToScalar(50), 0);
         paint.setMaskFilter(embossFilter)->unref();
         canvas->drawOval(rect, paint);
-		canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
+        canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
         paint.setShader(transparentShader)->unref();
         canvas->drawOval(rect, paint);
-		canvas->translate(0, SkIntToScalar(-10));
-        
+        canvas->translate(0, SkIntToScalar(-10));
+
         // path
-		canvas->translate(SkIntToScalar(50), 0);
-		paint.setColor(SK_ColorRED);
-		paint.setStyle(SkPaint::kStroke_Style);
-		paint.setStrokeWidth(SkIntToScalar(5));
+        canvas->translate(SkIntToScalar(50), 0);
+        paint.setColor(SK_ColorRED);
+        paint.setStyle(SkPaint::kStroke_Style);
+        paint.setStrokeWidth(SkIntToScalar(5));
         paint.setShader(radial)->unref();
         paint.setMaskFilter(NULL);
-		canvas->drawPath(path, paint);
-		
+        canvas->drawPath(path, paint);
+
         paint.setShader(NULL);
         // bitmap, sprite
-		canvas->translate(SkIntToScalar(50), 0);
-		paint.setStyle(SkPaint::kFill_Style);
-		canvas->drawBitmap(fBug, left, top, &paint);
-		canvas->translate(SkIntToScalar(30), 0);
-		canvas->drawSprite(fTb, 
-			SkScalarRound(canvas->getTotalMatrix().getTranslateX()), 
+        canvas->translate(SkIntToScalar(50), 0);
+        paint.setStyle(SkPaint::kFill_Style);
+        canvas->drawBitmap(fBug, left, top, &paint);
+        canvas->translate(SkIntToScalar(30), 0);
+        canvas->drawSprite(fTb,
+            SkScalarRound(canvas->getTotalMatrix().getTranslateX()),
             spriteOffset + 10, &paint);
 
-		canvas->translate(-SkIntToScalar(30), SkIntToScalar(30));
+        canvas->translate(-SkIntToScalar(30), SkIntToScalar(30));
         paint.setShader(shaderTest())->unref(); // test compose shader
-		canvas->drawRect(rect2, paint); 
+        canvas->drawRect(rect2, paint);
         paint.setShader(NULL);
-		
+
         canvas->restore();
         // text
-		canvas->translate(0, SkIntToScalar(60));
-        canvas->save();
-		paint.setColor(SK_ColorGRAY);
-		canvas->drawPosText(ascii, asciiLength, pos.begin(), paint);
-		canvas->drawPosText(ascii, asciiLength, pos2.begin(), paint);
-
-		canvas->translate(SkIntToScalar(50), 0);
-		paint.setColor(SK_ColorCYAN);
-		canvas->drawText(utf8, sizeof(utf8) - 1, x, y, paint);
-       
-		canvas->translate(SkIntToScalar(30), 0);
-		paint.setColor(SK_ColorMAGENTA);
-		paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
-        matrix.setTranslate(SkIntToScalar(10), SkIntToScalar(10));
-		canvas->drawTextOnPath((void*) utf16, sizeof(utf16), path, &matrix, paint);
-		canvas->translate(0, SkIntToScalar(20));
-		canvas->drawTextOnPath((void*) utf16simple, sizeof(utf16simple), path, &matrix, paint);
-        canvas->restore();
-        
         canvas->translate(0, SkIntToScalar(60));
-		paint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
+        canvas->save();
+        paint.setColor(SK_ColorGRAY);
+        canvas->drawPosText(ascii, asciiLength, pos.begin(), paint);
+        canvas->drawPosText(ascii, asciiLength, pos2.begin(), paint);
+
+        canvas->translate(SkIntToScalar(50), 0);
+        paint.setColor(SK_ColorCYAN);
+        canvas->drawText(utf8, sizeof(utf8) - 1, x, y, paint);
+
+        canvas->translate(SkIntToScalar(30), 0);
+        paint.setColor(SK_ColorMAGENTA);
+        paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
+        matrix.setTranslate(SkIntToScalar(10), SkIntToScalar(10));
+        canvas->drawTextOnPath((void*) utf16, sizeof(utf16), path, &matrix, paint);
+        canvas->translate(0, SkIntToScalar(20));
+        canvas->drawTextOnPath((void*) utf16simple, sizeof(utf16simple), path, &matrix, paint);
+        canvas->restore();
+
+        canvas->translate(0, SkIntToScalar(60));
+        paint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
         canvas->restore();
     }
-    
+
     /*
 ./SkColorFilter.h:25:class SkColorFilter : public SkFlattenable { -- abstract
     static SkColorFilter* CreatXfermodeFilter() *** untested ***
@@ -560,7 +560,7 @@
     ./SkAvoidXfermode.h:28:class SkAvoidXfermode : public SkXfermode { *** not done *** chmod +w .h .cpp
     ./SkXfermode.h:54:class SkProcXfermode : public SkXfermode {
     */
-    
+
     /*
 ./SkBlurMaskFilter.h:25:class SkBlurMaskFilter {
     chmod +w SkBlurMaskFilter.cpp
@@ -574,13 +574,13 @@
 /* untested:
 SkCornerPathEffect.h:28:class SkCornerPathEffect : public SkPathEffect {
 */
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         fClickPt.set(x, y);
         this->inval(NULL);
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
     SkPathEffect* pathEffectTest() {
         static const int gXY[] = { 1, 0, 0, -1, 2, -1, 3, 0, 2, 1, 0, 1 };
         SkScalar gPhase = 0;
@@ -590,9 +590,9 @@
             path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
         path.close();
         path.offset(SkIntToScalar(-6), 0);
-        SkPathEffect* outer = new SkPath1DPathEffect(path, SkIntToScalar(12), 
+        SkPathEffect* outer = new SkPath1DPathEffect(path, SkIntToScalar(12),
             gPhase, SkPath1DPathEffect::kRotate_Style);
-        SkPathEffect* inner = new SkDiscretePathEffect(SkIntToScalar(2), 
+        SkPathEffect* inner = new SkDiscretePathEffect(SkIntToScalar(2),
             SkIntToScalar(1)/10); // SkCornerPathEffect(SkIntToScalar(2));
         SkPathEffect* result = new SkComposePathEffect(outer, inner);
         outer->unref();
@@ -603,11 +603,11 @@
     SkShader* shaderTest() {
         SkPoint pts[] = { { 0, 0, }, { SkIntToScalar(100), 0 } };
         SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
-        SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 
+        SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL,
             2, SkShader::kClamp_TileMode);
         pts[1].set(0, SkIntToScalar(100));
         SkColor colors2[] = {SK_ColorBLACK,  SkColorSetARGB(0x80, 0, 0, 0)};
-        SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors2, NULL, 
+        SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors2, NULL,
             2, SkShader::kClamp_TileMode);
         SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstIn_Mode);
         SkShader* result = new SkComposeShader(shaderA, shaderB, mode);
@@ -618,23 +618,23 @@
     }
 
     virtual void startTest() {
-		SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/bugcirc.gif", &fBug);
-		SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/tbcirc.gif", &fTb);
-		SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/05psp04.gif", &fTx);
-	}
+        SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/bugcirc.gif", &fBug);
+        SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/tbcirc.gif", &fTb);
+        SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/05psp04.gif", &fTx);
+    }
 
     void drawRaster(SkCanvas* canvas)  {
         for (size_t index = 0; index < SK_ARRAY_COUNT(gRastProcs); index++)
             drawOneRaster(canvas);
     }
-    
+
     void drawOneRaster(SkCanvas* canvas) {
         canvas->save();
 
         SkScalar    x = SkIntToScalar(20);
         SkScalar    y = SkIntToScalar(40);
         SkPaint     paint;
-        
+
         paint.setAntiAlias(true);
         paint.setTextSize(SkIntToScalar(48));
         paint.setTypeface(SkTypeface::CreateFromName("sans-serif",
@@ -644,7 +644,7 @@
 
         for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) {
             apply_shader(&paint, i);
-            
+
           //  paint.setMaskFilter(NULL);
           //  paint.setColor(SK_ColorBLACK);
 
@@ -654,7 +654,7 @@
                                     gLightingColors[index].fMul,
                                     gLightingColors[index].fAdd))->unref();
 #endif
-            
+
             canvas->drawText(str.c_str(), str.size(), x, y, paint);
             SkRect  oval = { x, y - SkIntToScalar(40), x + SkIntToScalar(40), y };
             paint.setStyle(SkPaint::kStroke_Style);
@@ -665,7 +665,7 @@
         }
 
         canvas->restore();
-        
+
         if (1) {
             SkAvoidXfermode   mode(SK_ColorWHITE, 0xFF,
                                    SkAvoidXfermode::kTargetColor_Mode);
diff --git a/samplecode/SampleAnimatedGradient.cpp b/samplecode/SampleAnimatedGradient.cpp
index 1b90cc8..c4a4ec5 100644
--- a/samplecode/SampleAnimatedGradient.cpp
+++ b/samplecode/SampleAnimatedGradient.cpp
@@ -11,12 +11,12 @@
 
 class GradientView : public SampleView {
 public:
-	GradientView() {
+    GradientView() {
         this->setBGColor(0xFFDDDDDD);
-	}
-	
+    }
+
 protected:
-	struct GradData {
+    struct GradData {
         int             fCount;
         const SkColor*  fColors;
         const SkScalar* fPos;
@@ -35,11 +35,11 @@
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkScalarHalf(SkIntToScalar(3)));
         paint.setStyle(SkPaint::kFill_Style);
-        
+
         SkPoint p = SkPoint::Make(0,0);
         SkPoint q = SkPoint::Make(100,100);
         SkPoint pts[] = {p, q};
-        
+
         SkScalar t, temp, x, y;
         SkColor gColors[] = {
             SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
@@ -51,42 +51,42 @@
         x =  SkScalarSinCos(angle, &y);
         SkScalar colorPositions[] = { 0, 0.1 + x, 0.4 + y, 0.9 - x + y, 1.0};
         GradData data = { 5, gColors, colorPositions };
-        
-        
+
+
         SkRect r = { 0, 0, SkIntToScalar(200), SkIntToScalar(200) };
         SkShader* shader1 = SkGradientShader::CreateLinear(
-                           pts, data.fColors, data.fPos,data.fCount, 
+                           pts, data.fColors, data.fPos,data.fCount,
                            SkShader::kMirror_TileMode);
         paint.setShader(shader1)->unref();
-        
+
         canvas->drawRect(r, paint);
-        
-        
+
+
         SkPoint s = SkPoint::Make(100,100);
         SkShader* shader2 = SkGradientShader::CreateRadial(
-                           s, 100, data.fColors, data.fPos, data.fCount, 
+                           s, 100, data.fColors, data.fPos, data.fCount,
                            SkShader::kMirror_TileMode);
         paint.setShader(shader2)->unref();
         canvas->translate(250, 0);
         canvas->drawRect(r, paint);
-        
+
         SkShader* shader3 = SkGradientShader::CreateTwoPointRadial(
                            p, 0, q, 100, data.fColors, data.fPos, data.fCount,
                            SkShader::kMirror_TileMode);
         paint.setShader(shader3)->unref();
         canvas->translate(0, 250);
         canvas->drawRect(r, paint);
-        
+
         SkShader* shader4 = SkGradientShader::CreateSweep(
                             100, 100, data.fColors, data.fPos, data.fCount);
- 
+
         paint.setShader(shader4)->unref();
         canvas->translate(-250, 0);
         canvas->drawRect(r, paint);
-        
-        this->inval(NULL);		
+
+        this->inval(NULL);
     }
-	
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleAnimator.cpp b/samplecode/SampleAnimator.cpp
index 09742a0..7b46d47 100644
--- a/samplecode/SampleAnimator.cpp
+++ b/samplecode/SampleAnimator.cpp
@@ -23,20 +23,20 @@
     void setURIBase(const char dir[]);
 
     SkAnimator* getAnimator() const { return fAnimator; }
-    
+
     bool    decodeFile(const char path[]);
     bool    decodeMemory(const void* buffer, size_t size);
     bool    decodeStream(SkStream* stream);
-    
+
 protected:
     // overrides
     virtual void onDraw(SkCanvas*);
     virtual bool onQuery(SkEvent* evt);
-    
+
 private:
     SkString fBaseURI;
     SkAnimator* fAnimator;
-    
+
     typedef SkView INHERITED;
 };
 
@@ -63,24 +63,24 @@
 }
 
 static const SkDOMNode* find_nodeID(const SkDOM& dom,
-						const SkDOMNode* node, const char name[]) {
-	if (NULL == node) {
-		node = dom.getRootNode();
-	}
-	do {
-		const char* idval = dom.findAttr(node, "id");
-		if (idval && !strcmp(idval, name)) {
-			return node;
-		}
-		const SkDOMNode* child = dom.getFirstChild(node);
-		if (child) {
-			const SkDOMNode* found = find_nodeID(dom, child, name);
-			if (found) {
-				return found;
-			}
-		}
-	} while ((node = dom.getNextSibling(node)) != NULL);
-	return NULL;
+                        const SkDOMNode* node, const char name[]) {
+    if (NULL == node) {
+        node = dom.getRootNode();
+    }
+    do {
+        const char* idval = dom.findAttr(node, "id");
+        if (idval && !strcmp(idval, name)) {
+            return node;
+        }
+        const SkDOMNode* child = dom.getFirstChild(node);
+        if (child) {
+            const SkDOMNode* found = find_nodeID(dom, child, name);
+            if (found) {
+                return found;
+            }
+        }
+    } while ((node = dom.getNextSibling(node)) != NULL);
+    return NULL;
 }
 
 bool SkAnimatorView::decodeStream(SkStream* stream) {
@@ -94,32 +94,32 @@
         return false;
     }
 #else
-	size_t len = stream->getLength();
-	char* text = (char*)sk_malloc_throw(len);
-	stream->read(text, len);
-	SkDOM dom;
-	const SkDOM::Node* root = dom.build(text, len);
-	if (NULL == root) {
-		return false;
-	}
-	if (!fAnimator->decodeDOM(dom, root)) {
-		delete fAnimator;
-		fAnimator = NULL;
-		return false;
-	}
-	for (int i = 0; i <= 10; i++) {
-		SkString name("glyph");
-		name.appendS32(i);
-		const SkDOM::Node* node = find_nodeID(dom, NULL, name.c_str());
-		SkASSERT(node);
-		SkRect r;
-		dom.findScalar(node, "left", &r.fLeft);
-		dom.findScalar(node, "top", &r.fTop);
-		dom.findScalar(node, "width", &r.fRight); r.fRight += r.fLeft;
-		dom.findScalar(node, "height", &r.fBottom); r.fBottom += r.fTop;
-		SkDebugf("--- %s [%g %g %g %g]\n", name.c_str(),
-				 r.fLeft, r.fTop, r.fRight, r.fBottom);
-	}
+    size_t len = stream->getLength();
+    char* text = (char*)sk_malloc_throw(len);
+    stream->read(text, len);
+    SkDOM dom;
+    const SkDOM::Node* root = dom.build(text, len);
+    if (NULL == root) {
+        return false;
+    }
+    if (!fAnimator->decodeDOM(dom, root)) {
+        delete fAnimator;
+        fAnimator = NULL;
+        return false;
+    }
+    for (int i = 0; i <= 10; i++) {
+        SkString name("glyph");
+        name.appendS32(i);
+        const SkDOM::Node* node = find_nodeID(dom, NULL, name.c_str());
+        SkASSERT(node);
+        SkRect r;
+        dom.findScalar(node, "left", &r.fLeft);
+        dom.findScalar(node, "top", &r.fTop);
+        dom.findScalar(node, "width", &r.fRight); r.fRight += r.fLeft;
+        dom.findScalar(node, "height", &r.fBottom); r.fBottom += r.fTop;
+        SkDebugf("--- %s [%g %g %g %g]\n", name.c_str(),
+                 r.fLeft, r.fTop, r.fRight, r.fBottom);
+    }
 #endif
     return true;
 }
@@ -136,13 +136,13 @@
         canvas->scale(0.5, 0.5);
         fAnimator->draw(canvas, 0);
         canvas->restore();
-        
+
         canvas->save();
         canvas->translate(190, 40);
         canvas->scale(0.25, 0.25);
         fAnimator->draw(canvas, 0);
         canvas->restore();
-        
+
         this->inval(NULL);
 #endif
     }
@@ -165,8 +165,8 @@
     av->setURIBase("/skia/trunk/animations/");
     av->decodeFile("/skia/trunk/animations/checkbox.xml");
 #else
-	av->setURIBase("/");
-	av->decodeFile("/testanim.txt");
+    av->setURIBase("/");
+    av->decodeFile("/testanim.txt");
 #endif
     return av;
 }
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 25a0e87..97a252c 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -1093,7 +1093,7 @@
     } else {
         const SkScalar cw = SkScalarDiv(this->width(), SkIntToScalar(fTileCount.width()));
         const SkScalar ch = SkScalarDiv(this->height(), SkIntToScalar(fTileCount.height()));
-        
+
         for (int y = 0; y < fTileCount.height(); ++y) {
             for (int x = 0; x < fTileCount.width(); ++x) {
                 SkAutoCanvasRestore acr(canvas, true);
@@ -1101,7 +1101,7 @@
                 this->INHERITED::draw(canvas);
             }
         }
-        
+
         if (!fTileCount.equals(1, 1)) {
             SkPaint paint;
             paint.setColor(0x60FF00FF);
diff --git a/samplecode/SampleArc.cpp b/samplecode/SampleArc.cpp
index 43660a3..a87d280 100644
--- a/samplecode/SampleArc.cpp
+++ b/samplecode/SampleArc.cpp
@@ -37,7 +37,7 @@
 
 class ArcsView : public SampleView {
 public:
-	ArcsView() {
+    ArcsView() {
         testparse();
         fSweep = SkIntToScalar(100);
         this->setBGColor(0xFFDDDDDD);
@@ -52,7 +52,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     static void drawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
         canvas->drawRect(r, p);
         canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p);
@@ -60,23 +60,23 @@
         canvas->drawLine(r.fLeft, r.centerY(), r.fRight, r.centerY(), p);
         canvas->drawLine(r.centerX(), r.fTop, r.centerX(), r.fBottom, p);
     }
-    
+
     static void draw_label(SkCanvas* canvas, const SkRect& rect,
                             int start, int sweep) {
         SkPaint paint;
-        
+
         paint.setAntiAlias(true);
         paint.setTextAlign(SkPaint::kCenter_Align);
-        
+
         SkString    str;
-        
+
         str.appendS32(start);
         str.append(", ");
         str.appendS32(sweep);
         canvas->drawText(str.c_str(), str.size(), rect.centerX(),
                          rect.fBottom + paint.getTextSize() * 5/4, paint);
     }
-    
+
     static void drawArcs(SkCanvas* canvas) {
         SkPaint paint;
         SkRect  r;
@@ -86,12 +86,12 @@
         r.set(0, 0, w, h);
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
-        
+
         canvas->save();
         canvas->translate(SkIntToScalar(10), SkIntToScalar(300));
-        
+
         paint.setStrokeWidth(SkIntToScalar(1));
-        
+
         static const int gAngles[] = {
             0, 360,
             0, 45,
@@ -103,7 +103,7 @@
             -180, -270,
             225, 90
         };
-        
+
         for (size_t i = 0; i < SK_ARRAY_COUNT(gAngles); i += 2) {
             paint.setColor(SK_ColorBLACK);
             drawRectWithLines(canvas, r, paint);
@@ -111,15 +111,15 @@
             paint.setColor(SK_ColorRED);
             canvas->drawArc(r, SkIntToScalar(gAngles[i]),
                             SkIntToScalar(gAngles[i+1]), false, paint);
-            
+
             draw_label(canvas, r, gAngles[i], gAngles[i+1]);
 
             canvas->translate(w * 8 / 7, 0);
         }
-        
+
         canvas->restore();
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         fSweep = SampleCode::GetAnimScalar(SkIntToScalar(360)/24,
                                            SkIntToScalar(360));
@@ -127,14 +127,14 @@
 
         SkRect  r;
         SkPaint paint;
-        
+
         paint.setAntiAlias(true);
         paint.setStrokeWidth(SkIntToScalar(2));
         paint.setStyle(SkPaint::kStroke_Style);
-        
+
         r.set(0, 0, SkIntToScalar(200), SkIntToScalar(200));
         r.offset(SkIntToScalar(20), SkIntToScalar(20));
-        
+
         if (false) {
             const SkScalar d = SkIntToScalar(3);
             const SkScalar rad[] = { d, d, d, d, d, d, d, d };
@@ -145,10 +145,10 @@
         }
 
         drawRectWithLines(canvas, r, paint);
-        
+
    //     printf("----- sweep %g %X\n", SkScalarToFloat(fSweep), SkDegreesToRadians(fSweep));
-        
-        
+
+
         paint.setStyle(SkPaint::kFill_Style);
         paint.setColor(0x800000FF);
         canvas->drawArc(r, 0, fSweep, true, paint);
@@ -159,25 +159,25 @@
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setColor(SK_ColorRED);
         canvas->drawArc(r, 0, fSweep, true, paint);
-        
+
         paint.setStrokeWidth(0);
         paint.setColor(SK_ColorBLUE);
         canvas->drawArc(r, 0, fSweep, false, paint);
-        
+
         drawArcs(canvas);
         this->inval(NULL);
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
      //   fSweep += SK_Scalar1;
         this->inval(NULL);
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
     virtual bool onClick(Click* click) {
         return this->INHERITED::onClick(click);
     }
-    
+
 private:
     SkScalar fSweep;
 
diff --git a/samplecode/SampleAvoid.cpp b/samplecode/SampleAvoid.cpp
index 81050a3..b8bac0d 100644
--- a/samplecode/SampleAvoid.cpp
+++ b/samplecode/SampleAvoid.cpp
@@ -37,7 +37,7 @@
                                                  SkShader::kMirror_TileMode);
 #endif
     }
-    
+
     virtual ~AvoidView() {
         fShader->unref();
     }
@@ -54,7 +54,7 @@
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
-        
+
         canvas->translate(r.width() / 6, r.height() / 6);
 
         paint.setShader(fShader);
@@ -73,7 +73,7 @@
 
         paint.setShader(NULL);
         paint.setColor(SK_ColorMAGENTA);
-        
+
         SkPaint frameP;
         frameP.setStyle(SkPaint::kStroke_Style);
 
@@ -91,7 +91,7 @@
             canvas->drawRect(rr, frameP);
         }
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleBigGradient.cpp b/samplecode/SampleBigGradient.cpp
index 8e08e15..6a68fa0 100644
--- a/samplecode/SampleBigGradient.cpp
+++ b/samplecode/SampleBigGradient.cpp
@@ -19,7 +19,7 @@
 
 class BigGradientView : public SampleView {
 public:
-	BigGradientView() {}
+    BigGradientView() {}
 
 protected:
     // overrides from SkEventSink
diff --git a/samplecode/SampleBitmapRect.cpp b/samplecode/SampleBitmapRect.cpp
index 684c976..ba7efbf 100644
--- a/samplecode/SampleBitmapRect.cpp
+++ b/samplecode/SampleBitmapRect.cpp
@@ -39,7 +39,7 @@
         SkDevice* dev = new SkGpuDevice(ctx, SkBitmap::kARGB_8888_Config, 64, 64);
         canvas.setDevice(dev)->unref();
         *bitmap = dev->accessBitmap(false);
-    } else 
+    } else
 #endif
     {
         bitmap->setConfig(SkBitmap::kARGB_8888_Config, 64, 64);
@@ -59,10 +59,10 @@
 
 class BitmapRectView : public SampleView {
 public:
-	BitmapRectView() {
+    BitmapRectView() {
         this->setBGColor(SK_ColorGRAY);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -72,7 +72,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         GrContext* ctx = SampleCode::GetGr();
 
@@ -102,11 +102,11 @@
 
             canvas->drawRect(dstR, paint);
             canvas->drawRect(srcR, paint);
-            
+
             canvas->translate(160, 0);
         }
     }
-    
+
 private:
     typedef SkView INHERITED;
 };
diff --git a/samplecode/SampleBlur.cpp b/samplecode/SampleBlur.cpp
index f49d96e..1444949 100644
--- a/samplecode/SampleBlur.cpp
+++ b/samplecode/SampleBlur.cpp
@@ -51,7 +51,7 @@
 class BlurView : public SampleView {
     SkBitmap    fBM;
 public:
-	BlurView() {
+    BlurView() {
         if (false) { // avoid bit rot, suppress warning
             fBM = make_bitmap();
         }
diff --git a/samplecode/SampleBox.cpp b/samplecode/SampleBox.cpp
index 2301a91..19ff6ca 100644
--- a/samplecode/SampleBox.cpp
+++ b/samplecode/SampleBox.cpp
@@ -11,10 +11,10 @@
 
 class SimpleView : public SampleView {
 public:
-	SimpleView() {
+    SimpleView() {
         this->setBGColor(0xFFDDDDDD);
-	}
-	
+    }
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt)  {
@@ -24,14 +24,14 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-	
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkScalarHalf(SkIntToScalar(3)));
         paint.setStyle(SkPaint::kFill_Style);
-        
+
         SkRect  r;
         SkScalar x,y;
         x = 10;
@@ -44,7 +44,7 @@
             canvas->drawRect(r, paint);
         }
     }
-	
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleCamera.cpp b/samplecode/SampleCamera.cpp
index a4af2de..12e7e04 100644
--- a/samplecode/SampleCamera.cpp
+++ b/samplecode/SampleCamera.cpp
@@ -23,7 +23,7 @@
     int     fShaderIndex;
     bool    fFrontFace;
 public:
-	CameraView() {
+    CameraView() {
         fRX = fRY = fRZ = 0;
         fShaderIndex = 0;
         fFrontFace = false;
@@ -36,7 +36,7 @@
                 SkShader* s = SkShader::CreateBitmapShader(bm,
                                                            SkShader::kClamp_TileMode,
                                                            SkShader::kClamp_TileMode);
-                
+
                 SkRect src = { 0, 0, SkIntToScalar(bm.width()), SkIntToScalar(bm.height()) };
                 SkRect dst = { -150, -150, 150, 150 };
                 SkMatrix matrix;
@@ -49,7 +49,7 @@
         }
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
     virtual ~CameraView() {
         fShaders.unrefAll();
     }
@@ -72,7 +72,7 @@
         view.rotateX(fRX);
         view.rotateY(fRY);
         view.applyToCanvas(canvas);
-        
+
         SkPaint paint;
         if (fShaders.count() > 0) {
             bool frontFace = view.dotWithNormal(0, 0, SK_Scalar1) < 0;
@@ -80,13 +80,13 @@
                 fFrontFace = frontFace;
                 fShaderIndex = (fShaderIndex + 1) % fShaders.count();
             }
-        
+
             paint.setAntiAlias(true);
             paint.setShader(fShaders[fShaderIndex]);
             SkRect r = { -150, -150, 150, 150 };
             canvas->drawRoundRect(r, 30, 30, paint);
         }
-        
+
         fRY += SampleCode::GetAnimSecondsDelta() * 90;
         if (fRY >= SkIntToScalar(360)) {
             fRY = 0;
diff --git a/samplecode/SampleCircle.cpp b/samplecode/SampleCircle.cpp
index def90ad..1444e1b 100644
--- a/samplecode/SampleCircle.cpp
+++ b/samplecode/SampleCircle.cpp
@@ -35,7 +35,7 @@
         fDX = fDY = fRAD = 0;
         fN = 3;
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -45,10 +45,10 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void circle(SkCanvas* canvas, int width, bool aa) {
         SkPaint paint;
-        
+
         paint.setAntiAlias(aa);
         if (width < 0) {
             paint.setStyle(SkPaint::kFill_Style);
@@ -61,7 +61,7 @@
             test_circlebounds(canvas);
         }
     }
-    
+
     void drawSix(SkCanvas* canvas, SkScalar dx, SkScalar dy) {
         for (int width = -1; width <= 1; width++) {
             canvas->save();
@@ -72,13 +72,13 @@
             canvas->translate(dx, 0);
         }
     }
-    
+
     static void blowup(SkCanvas* canvas, const SkIRect& src, const SkRect& dst) {
         SkDevice* device = canvas->getDevice();
         const SkBitmap& bm = device->accessBitmap(false);
         canvas->drawBitmapRect(bm, &src, dst, NULL);
     }
-    
+
     static void make_poly(SkPath* path, int n) {
         if (n <= 0) {
             return;
@@ -94,7 +94,7 @@
         }
         path->close();
     }
-    
+
     static void rotate(SkCanvas* canvas, SkScalar angle, SkScalar px, SkScalar py) {
         canvas->translate(-px, -py);
         canvas->rotate(angle);
@@ -119,7 +119,7 @@
             canvas->drawPath(path, paint);
         }
     }
-    
+
 private:
     int fN;
     typedef SampleView INHERITED;
diff --git a/samplecode/SampleClip.cpp b/samplecode/SampleClip.cpp
index 6695c62..ce3736e 100644
--- a/samplecode/SampleClip.cpp
+++ b/samplecode/SampleClip.cpp
@@ -22,7 +22,7 @@
     paint.setAntiAlias(doAA);
     paint.setLCDRenderText(true);
     paint.setTextSize(SkIntToScalar(20));
-    
+
     for (int i = 0; i < 200; ++i) {
         paint.setColor((SK_A32_MASK << SK_A32_SHIFT) | rand.nextU());
         canvas->drawText("Hamburgefons", 12,
@@ -35,16 +35,16 @@
     SkRandom rand;
     SkPaint paint;
     paint.setAntiAlias(doAA);
-    
+
     for (int i = 0; i < 50; ++i) {
         SkRect r;
         SkPath p;
-        
+
         r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
                   rand.nextUScalar1() * W, rand.nextUScalar1() * H);
         paint.setColor(rand.nextU());
         canvas->drawRect(r, paint);
-        
+
         r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
                   rand.nextUScalar1() * W, rand.nextUScalar1() * H);
         paint.setColor(rand.nextU());
@@ -64,16 +64,16 @@
     paint.setAntiAlias(doAA);
     paint.setStyle(SkPaint::kStroke_Style);
     paint.setStrokeWidth(strokeWidth);
-    
+
     for (int i = 0; i < n; ++i) {
         SkRect r;
         SkPath p;
-        
+
         r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
                   rand.nextUScalar1() * W, rand.nextUScalar1() * H);
         paint.setColor(rand.nextU());
         canvas->drawRect(r, paint);
-        
+
         r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
                   rand.nextUScalar1() * W, rand.nextUScalar1() * H);
         paint.setColor(rand.nextU());
@@ -131,7 +131,7 @@
         static const CanvasProc gProc[] = {
             show_text, show_thick, show_hair, show_fill
         };
-        
+
         SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
         SkPath clipPath;
         r.inset(SK_Scalar1 / 4, SK_Scalar1 / 4);
@@ -153,7 +153,7 @@
             canvas->translate(0, H * SK_Scalar1 * 8 / 7);
         }
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleCode.h b/samplecode/SampleCode.h
index e86ddd6..8bd5fbd 100644
--- a/samplecode/SampleCode.h
+++ b/samplecode/SampleCode.h
@@ -25,7 +25,7 @@
     static bool TitleQ(const SkEvent&);
     static void TitleR(SkEvent*, const char title[]);
     static bool RequestTitle(SkView* view, SkString* title);
-    
+
     static bool PrefSizeQ(const SkEvent&);
     static void PrefSizeR(SkEvent*, SkScalar width, SkScalar height);
 
@@ -47,7 +47,7 @@
 
 // interface that constructs SkViews
 class SkViewFactory : public SkRefCnt {
-public:    
+public:
     virtual SkView* operator() () const = 0;
 };
 
@@ -58,7 +58,7 @@
 public:
     SkFuncViewFactory(SkViewCreateFunc func);
     virtual SkView* operator() () const SK_OVERRIDE;
-    
+
 private:
     SkViewCreateFunc fCreateFunc;
 };
@@ -70,7 +70,7 @@
 // factory function that creates a skiagm::GM
 typedef skiagm::GM* (*GMFactoryFunc)(void*);
 
-// Takes a GM factory function and implements the SkViewFactory interface 
+// Takes a GM factory function and implements the SkViewFactory interface
 // by making the GM and wrapping it in a GMSampleView. GMSampleView bridges
 // the SampleView interface to skiagm::GM.
 class SkGMSampleViewFactory : public SkViewFactory {
@@ -90,16 +90,16 @@
     ~SkViewRegister() {
         fFact->unref();
     }
-    
+
     static const SkViewRegister* Head() { return gHead; }
-    
+
     SkViewRegister* next() const { return fChain; }
     const SkViewFactory*   factory() const { return fFact; }
-    
+
 private:
     SkViewFactory*  fFact;
     SkViewRegister* fChain;
-    
+
     static SkViewRegister* gHead;
 };
 
@@ -107,7 +107,7 @@
 
 class SampleView : public SkView {
 public:
-    SampleView() : fPipeState(SkOSMenu::kOffState), 
+    SampleView() : fPipeState(SkOSMenu::kOffState),
             fBGColor(SK_ColorWHITE), fRepeatCount(1) {
     }
 
@@ -116,20 +116,20 @@
     static bool IsSampleView(SkView*);
     static bool SetRepeatDraw(SkView*, int count);
     static bool SetUsePipe(SkView*, SkOSMenu::TriState);
-    
+
     /**
      *  Call this to request menu items from a SampleView.
-     *  Subclassing notes: A subclass of SampleView can overwrite this method 
+     *  Subclassing notes: A subclass of SampleView can overwrite this method
      *  to add new items of various types to the menu and change its title.
      *  The events attached to any new menu items must be handled in its onEvent
-     *  method. See SkOSMenu.h for helper functions.   
+     *  method. See SkOSMenu.h for helper functions.
      */
     virtual void requestMenu(SkOSMenu* menu) {}
 
 protected:
     virtual void onDrawBackground(SkCanvas*);
     virtual void onDrawContent(SkCanvas*) = 0;
-    
+
     // overrides
     virtual bool onEvent(const SkEvent& evt);
     virtual bool onQuery(SkEvent* evt);
@@ -138,7 +138,7 @@
 
     SkOSMenu::TriState fPipeState;
     SkColor fBGColor;
-    
+
 private:
     int fRepeatCount;
 
diff --git a/samplecode/SampleColorFilter.cpp b/samplecode/SampleColorFilter.cpp
index 3e1dbb1..bbabea2 100644
--- a/samplecode/SampleColorFilter.cpp
+++ b/samplecode/SampleColorFilter.cpp
@@ -23,7 +23,7 @@
 
 #define SK_R16_BITS 5
 
-static int round5_slow(int x) {    
+static int round5_slow(int x) {
     int orig = x & 7;
     int fake = x >> 5;
     int trunc = x >> 3;
@@ -69,7 +69,7 @@
         int err2 = i - v2;
         SkDebugf("--- %3d : trunc=%3d (%2d) round:%3d (%2d) \n"/*new:%d (%2d)\n"*/, i,
                  v0, err0, v1, err1, v2, err2);
-        
+
 
         e0 += err0;
         e1 += err1;
@@ -102,7 +102,7 @@
     bitmap.setConfig(SkBitmap::kARGB_8888_Config, n, n);
     bitmap.allocPixels();
     bitmap.eraseColor(0);
-    
+
     SkCanvas canvas(bitmap);
     SkRect r;
     r.set(0, 0, SkIntToScalar(n), SkIntToScalar(n));
@@ -110,7 +110,7 @@
 
     SkPaint paint;
     paint.setAntiAlias(true);
-    
+
     paint.setColor(SK_ColorRED);
     canvas.drawOval(r, paint);
 
@@ -118,7 +118,7 @@
     paint.setXfermodeMode(SkXfermode::kSrc_Mode);
     paint.setColor(0x800000FF);
     canvas.drawOval(r, paint);
-    
+
     return bitmap;
 }
 
@@ -132,7 +132,7 @@
     ColorFilterView() {
         fBitmap = createBitmap(N);
         fShader = createChecker();
-      
+
         if (false) { // avoid bit rot, suppress warning
             test_5bits();
         }
@@ -168,7 +168,7 @@
             canvas->drawRect(r, p);
             return;
         }
-        
+
         static const SkXfermode::Mode gModes[] = {
             SkXfermode::kClear_Mode,
             SkXfermode::kSrc_Mode,
@@ -185,7 +185,7 @@
             SkXfermode::kPlus_Mode,
             SkXfermode::kMultiply_Mode,
         };
-    
+
         static const SkColor gColors[] = {
             0xFF000000,
             0x80000000,
@@ -205,9 +205,9 @@
                 canvas->drawBitmap(fBitmap, x * N * 1.25f, y * N * scale, &paint);
             }
         }
-        
+
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleComplexClip.cpp b/samplecode/SampleComplexClip.cpp
index e7f9a01..ff343dd 100644
--- a/samplecode/SampleComplexClip.cpp
+++ b/samplecode/SampleComplexClip.cpp
@@ -12,7 +12,7 @@
 
 class ComplexClipView : public SampleView {
 public:
-	ComplexClipView() {
+    ComplexClipView() {
         this->setBGColor(0xFFA0DDA0);
     }
 
diff --git a/samplecode/SampleConcavePaths.cpp b/samplecode/SampleConcavePaths.cpp
index 1659ec0..549e9e2 100644
--- a/samplecode/SampleConcavePaths.cpp
+++ b/samplecode/SampleConcavePaths.cpp
@@ -27,8 +27,8 @@
 
 class ConcavePathView : public SampleView {
 public:
-	ConcavePathView() {}
-    
+    ConcavePathView() {}
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -38,10 +38,10 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
-    virtual void onDrawContent(SkCanvas* canvas) {        
+
+    virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
-        
+
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kFill_Style);
 
@@ -136,12 +136,12 @@
             canvas->restore();
         }
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         this->inval(NULL);
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleCull.cpp b/samplecode/SampleCull.cpp
index 778d0fc..18d9bdc 100644
--- a/samplecode/SampleCull.cpp
+++ b/samplecode/SampleCull.cpp
@@ -19,7 +19,7 @@
 
 static void addbump(SkPath* path, const SkPoint pts[2], SkScalar bump) {
     SkVector    tang;
-    
+
     tang.setLength(pts[1].fX - pts[0].fX, pts[1].fY - pts[0].fY, bump);
 
     path->lineTo(SkScalarHalf(pts[0].fX + pts[1].fX) - tang.fY,
@@ -31,7 +31,7 @@
     SkPath::Iter    iter(*path, false);
     SkPoint         pts[4];
     SkPath          tmp;
-    
+
     for (;;)
         switch (iter.next(pts)) {
         case SkPath::kMove_Verb:
@@ -90,7 +90,7 @@
                 break;
             }
     }
-    
+
 FINISHED2:
     *count = n;
     return array;
@@ -102,11 +102,11 @@
 
 class CullView : public SampleView {
 public:
-	CullView() {
+    CullView() {
         fClip.set(0, 0, SkIntToScalar(160), SkIntToScalar(160));
-        
+
         SkRandom    rand;
-        
+
         for (int i = 0; i < 50; i++) {
             SkScalar x = nextScalarRange(rand, -fClip.width()*1, fClip.width()*2);
             SkScalar y = nextScalarRange(rand, -fClip.height()*1, fClip.height()*2);
@@ -115,16 +115,16 @@
             else
                 fPath.lineTo(x, y);
         }
-        
+
         SkScalar bump = fClip.width()/8;
         subdivide(&fPath, bump);
         subdivide(&fPath, bump);
         subdivide(&fPath, bump);
         fPoints = getpts(fPath, &fPtCount);
-        
+
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
     virtual ~CullView() {
         delete[] fPoints;
     }
@@ -138,7 +138,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkAutoCanvasRestore ar(canvas, true);
 
@@ -148,7 +148,7 @@
    //     canvas->scale(SK_Scalar1*3, SK_Scalar1*3, 0, 0);
 
         SkPaint paint;
-        
+
     //    paint.setAntiAliasOn(true);
         paint.setStyle(SkPaint::kStroke_Style);
 
@@ -165,21 +165,21 @@
         SkPath  tmp;
         SkIRect iclip;
         fClip.round(&iclip);
-        
+
         SkCullPointsPath    cpp(iclip, &tmp);
-        
+
         cpp.moveTo(fPoints[0].fX, fPoints[0].fY);
         for (int i = 0; i < fPtCount; i++)
             cpp.lineTo(fPoints[i].fX, fPoints[i].fY);
-        
+
         paint.setColor(SK_ColorRED);
         paint.setStrokeWidth(SkIntToScalar(3));
         paint.setStrokeJoin(SkPaint::kRound_Join);
         canvas->drawPath(tmp, paint);
-        
+
         this->inval(NULL);
     }
-    
+
 private:
     SkRect      fClip;
     SkIPoint*   fPoints;
diff --git a/samplecode/SampleDash.cpp b/samplecode/SampleDash.cpp
index fc0d678..2c16e54 100644
--- a/samplecode/SampleDash.cpp
+++ b/samplecode/SampleDash.cpp
@@ -40,7 +40,7 @@
     DashView() {
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -71,7 +71,7 @@
             for (size_t j = 0; j < len; j++) {
                 interval[j] = SkIntToScalar(gStr[i][j] - '0');
             }
-            
+
             SkDashPathEffect dash(interval, len, 0);
             paint.setPathEffect(&dash);
             canvas->drawLine(x0, y0, x1, y0, paint);
diff --git a/samplecode/SampleDecode.cpp b/samplecode/SampleDecode.cpp
index fa2b727..48759c0 100644
--- a/samplecode/SampleDecode.cpp
+++ b/samplecode/SampleDecode.cpp
@@ -40,7 +40,7 @@
             SkDELETE(codec);
         }
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -50,17 +50,17 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(0xFFDDDDDD);
 //        canvas->drawColor(SK_ColorWHITE);
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         this->drawBG(canvas);
-        
+
         canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
-        
+
         for (size_t i = 0; i < SK_ARRAY_COUNT(fBitmap); i++) {
             canvas->drawBitmap(fBitmap[i], 0, 0);
             canvas->translate(SkIntToScalar(fBitmap[i].width()), 0);
diff --git a/samplecode/SampleDither.cpp b/samplecode/SampleDither.cpp
index 85ac2b1..7e5fc21 100644
--- a/samplecode/SampleDither.cpp
+++ b/samplecode/SampleDither.cpp
@@ -24,20 +24,20 @@
 static void draw_sweep(SkCanvas* c, int width, int height, SkScalar angle) {
     SkRect  r;
     SkPaint p;
-    
+
     p.setAntiAlias(true);
 //    p.setDither(true);
     p.setStrokeWidth(SkIntToScalar(width/10));
     p.setStyle(SkPaint::kStroke_Style);
 
     r.set(0, 0, SkIntToScalar(width), SkIntToScalar(height));
-    
+
     //    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN, SK_ColorCYAN };
     SkColor colors[] = { 0x4c737373, 0x4c737373, 0xffffd300 };
     SkShader* s = SkGradientShader::CreateSweep(r.centerX(), r.centerY(),
                                                 colors, NULL, SK_ARRAY_COUNT(colors));
     p.setShader(s)->unref();
-    
+
     SkAutoCanvasRestore acr(c, true);
 
     c->translate(r.centerX(), r.centerY());
@@ -57,7 +57,7 @@
         SkScalar thickness = p.getStrokeWidth();
         SkScalar sweep = SkFloatToScalar(360.0f);
         SkPath path;
-        
+
         path.moveTo(x + radius, y);
         // outer top
         path.lineTo(x + radius + thickness, y);
@@ -78,38 +78,38 @@
 #else
     bm->eraseColor(0);
 #endif
-    
-    SkCanvas c(*bm);    
+
+    SkCanvas c(*bm);
     draw_sweep(&c, bm->width(), bm->height(), 0);
 }
 
 static void pre_dither(const SkBitmap& bm) {
     SkAutoLockPixels alp(bm);
-    
+
     for (int y = 0; y < bm.height(); y++) {
         DITHER_4444_SCAN(y);
-        
+
         SkPMColor* p = bm.getAddr32(0, y);
         for (int x = 0; x < bm.width(); x++) {
             SkPMColor c = *p;
-            
+
             unsigned a = SkGetPackedA32(c);
             unsigned r = SkGetPackedR32(c);
             unsigned g = SkGetPackedG32(c);
             unsigned b = SkGetPackedB32(c);
-            
+
             unsigned d = DITHER_VALUE(x);
 
             a = SkDITHER_A32To4444(a, d);
             r = SkDITHER_R32To4444(r, d);
             g = SkDITHER_G32To4444(g, d);
             b = SkDITHER_B32To4444(b, d);
-            
+
             a = SkA4444ToA32(a);
             r = SkR4444ToR32(r);
             g = SkG4444ToG32(g);
             b = SkB4444ToB32(b);
-            
+
             *p++ = SkPackARGB32(a, r, g, b);
         }
     }
@@ -120,14 +120,14 @@
     SkBitmap    fBM, fBMPreDither, fBM16;
     SkScalar fAngle;
 
-	DitherView() {
+    DitherView() {
         make_bm(&fBM);
         make_bm(&fBMPreDither);
         pre_dither(fBMPreDither);
         fBM.copyTo(&fBM16, SkBitmap::kARGB_4444_Config);
-        
+
         fAngle = 0;
-        
+
         this->setBGColor(0xFF181818);
     }
 
@@ -140,29 +140,29 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         SkScalar x = SkIntToScalar(10);
         SkScalar y = SkIntToScalar(10);
         const SkScalar DX = SkIntToScalar(fBM.width() + 10);
-        
+
         paint.setAntiAlias(true);
-        
+
         if (true) {
             canvas->drawBitmap(fBM, x, y, &paint);
             x += DX;
             paint.setDither(true);
             canvas->drawBitmap(fBM, x, y, &paint);
-            
+
             x += DX;
             paint.setDither(false);
             canvas->drawBitmap(fBMPreDither, x, y, &paint);
-            
+
             x += DX;
             canvas->drawBitmap(fBM16, x, y, &paint);
         }
-        
+
         canvas->translate(DX, DX*2);
         draw_sweep(canvas, fBM.width(), fBM.height(), fAngle);
         canvas->translate(DX, 0);
diff --git a/samplecode/SampleDitherBitmap.cpp b/samplecode/SampleDitherBitmap.cpp
index c243782..b84d0dd 100644
--- a/samplecode/SampleDitherBitmap.cpp
+++ b/samplecode/SampleDitherBitmap.cpp
@@ -40,7 +40,7 @@
 static void test_pathregion() {
     SkPath path;
     SkRegion region;
-    path.moveTo(25071800.f, -141823808.f); 
+    path.moveTo(25071800.f, -141823808.f);
     path.lineTo(25075500.f, -141824000.f);
     path.lineTo(25075400.f, -141827712.f);
     path.lineTo(25071810.f, -141827600.f);
@@ -81,14 +81,14 @@
     SkBitmap    fBM8;
     SkBitmap    fBM32;
 public:
-	DitherBitmapView() {
+    DitherBitmapView() {
         test_pathregion();
         fBM8 = make_bitmap();
         fBM8.copyTo(&fBM32, SkBitmap::kARGB_8888_Config);
-        
+
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -98,7 +98,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     static void setBitmapOpaque(SkBitmap* bm, bool isOpaque) {
         SkAutoLockPixels alp(*bm);  // needed for ctable
         bm->setIsOpaque(isOpaque);
@@ -107,7 +107,7 @@
             ctable->setIsOpaque(isOpaque);
         }
     }
-    
+
     static void draw2(SkCanvas* canvas, const SkBitmap& bm) {
         SkPaint paint;
         SkBitmap bitmap(bm);
@@ -125,7 +125,7 @@
         paint.setDither(true);
         canvas->drawBitmap(bitmap, x, SkIntToScalar(bm.height() + 10), &paint);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
 
@@ -136,7 +136,7 @@
         canvas->translate(0, SkIntToScalar(fBM8.height() *3));
         draw_gradient(canvas);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleDraw.cpp b/samplecode/SampleDraw.cpp
index c418585..e1f62fe 100644
--- a/samplecode/SampleDraw.cpp
+++ b/samplecode/SampleDraw.cpp
@@ -13,19 +13,19 @@
 
 static void test_clearonlayers(SkCanvas* canvas) {
     SkCanvas& c = *canvas;
-    
+
     SkPaint paint;
     paint.setColor(SK_ColorBLUE);
     paint.setStyle(SkPaint::kStrokeAndFill_Style);
     SkRect rect = SkRect::MakeXYWH(25, 25, 50, 50);
     c.drawRect(rect, paint);
-    
+
     c.clipRect(rect);
-    
+
     c.saveLayer(NULL, NULL);
     rect = SkRect::MakeXYWH(50, 10, 40, 80);
     c.clipRect(rect, SkRegion::kUnion_Op);
-    
+
     rect = SkRect::MakeXYWH(50, 0, 50, 100);
     // You might draw something here, but it's not necessary.
     // paint.setColor(SK_ColorRED);
@@ -37,11 +37,11 @@
 
 static void test_strokerect(SkCanvas* canvas, const SkRect& r) {
     SkPaint p;
-    
+
     p.setAntiAlias(true);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(4);
-    
+
     canvas->drawRect(r, p);
 
     SkPath path;
@@ -61,27 +61,27 @@
     r.offset(0.25f, 0.3333f);
     test_strokerect(canvas, r);
     canvas->translate(0, 20);
-    
+
     r.set(10, 10, 14.5f, 14.5f);
     r.offset(0.25f, 0.3333f);
     test_strokerect(canvas, r);
     canvas->translate(0, 20);
-    
+
     r.set(10, 10, 14.5f, 20);
     r.offset(0.25f, 0.3333f);
     test_strokerect(canvas, r);
     canvas->translate(0, 20);
-    
+
     r.set(10, 10, 20, 14.5f);
     r.offset(0.25f, 0.3333f);
     test_strokerect(canvas, r);
     canvas->translate(0, 20);
-    
+
     r.set(10, 10, 20, 20);
     r.offset(0.25f, 0.3333f);
     test_strokerect(canvas, r);
     canvas->translate(0, 20);
-    
+
 }
 
 class Draw : public SkRefCnt {
@@ -236,7 +236,7 @@
     }
 
     virtual Draw* create(const SkPoint&, const SkPoint&) = 0;
-    
+
 private:
     SkPaint fPaint;
 };
@@ -291,7 +291,7 @@
         }
         return NULL;
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
diff --git a/samplecode/SampleEffects.cpp b/samplecode/SampleEffects.cpp
index e04d642..15ad809 100644
--- a/samplecode/SampleEffects.cpp
+++ b/samplecode/SampleEffects.cpp
@@ -60,7 +60,7 @@
     SkPath fPath;
     SkPaint fPaint[SK_ARRAY_COUNT(gPaintProcs)];
 
-	EffectsView() {
+    EffectsView() {
         size_t i;
         const float pts[] = {
             0, 0,
@@ -75,7 +75,7 @@
         for (i = 2; i < SK_ARRAY_COUNT(pts); i += 2) {
             fPath.lineTo(pts[i], pts[i+1]);
         }
-        
+
         for (i = 0; i < SK_ARRAY_COUNT(gPaintProcs); i++) {
             fPaint[i].setAntiAlias(true);
             fPaint[i].setColor(COLOR);
@@ -85,10 +85,10 @@
         SkColorMatrix cm;
         cm.setRotate(SkColorMatrix::kG_Axis, 180);
         cm.setIdentity();
-        
+
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -98,7 +98,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         canvas->scale(3, 3);
         canvas->translate(10, 30);
@@ -107,7 +107,7 @@
             canvas->translate(32, 0);
         }
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleEmboss.cpp b/samplecode/SampleEmboss.cpp
index bf12636..41c7455 100644
--- a/samplecode/SampleEmboss.cpp
+++ b/samplecode/SampleEmboss.cpp
@@ -29,14 +29,14 @@
 class EmbossView : public SampleView {
     SkEmbossMaskFilter::Light   fLight;
 public:
-	EmbossView() {
+    EmbossView() {
         fLight.fDirection[0] = SK_Scalar1;
         fLight.fDirection[1] = SK_Scalar1;
         fLight.fDirection[2] = SK_Scalar1;
         fLight.fAmbient = 128;
         fLight.fSpecular = 16*2;
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -49,18 +49,18 @@
 
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
-        
+
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkIntToScalar(10));
         paint.setMaskFilter(new SkEmbossMaskFilter(fLight, SkIntToScalar(4)))->unref();
         paint.setShader(new SkColorShader(SK_ColorBLUE))->unref();
         paint.setDither(true);
-        
+
         canvas->drawCircle(SkIntToScalar(50), SkIntToScalar(50),
                            SkIntToScalar(30), paint);
     }
-    
+
 private:
 
     typedef SampleView INHERITED;
diff --git a/samplecode/SampleEmptyPath.cpp b/samplecode/SampleEmptyPath.cpp
index cffe6cf..49ad7c5 100644
--- a/samplecode/SampleEmptyPath.cpp
+++ b/samplecode/SampleEmptyPath.cpp
@@ -24,7 +24,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawEmpty(SkCanvas* canvas,
                    SkColor color,
                    const SkRect& clip,
@@ -40,7 +40,7 @@
         canvas->drawPath(path, paint);
         canvas->restore();
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         struct FillAndName {
             SkPath::FillType fFill;
@@ -110,7 +110,7 @@
                 labelPaint.setColor(color);
                 labelPaint.setAntiAlias(true);
                 labelPaint.setLCDRenderText(true);
-                canvas->drawText(label, strlen(label), 
+                canvas->drawText(label, strlen(label),
                                  0, rect.height() + 15 * SK_Scalar1,
                                  labelPaint);
             }
@@ -118,7 +118,7 @@
         canvas->restore();
         canvas->restore();
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleEncode.cpp b/samplecode/SampleEncode.cpp
index 6999a06..afcde03 100644
--- a/samplecode/SampleEncode.cpp
+++ b/samplecode/SampleEncode.cpp
@@ -28,13 +28,13 @@
     const int   width = 98;
     const int   height = 100;
     SkBitmap    device;
-    
+
     device.setConfig(SkBitmap::kARGB_8888_Config, width, height);
     device.allocPixels();
 
     SkCanvas    canvas(device);
     SkPaint     paint;
-    
+
     paint.setAntiAlias(true);
     canvas.drawColor(SK_ColorRED);
     paint.setColor(SK_ColorBLUE);
@@ -67,7 +67,7 @@
             SkColorTable* ctable = new SkColorTable(colors, 256);
             bm->allocPixels(ctable);
             ctable->unref();
-            
+
             for (int y = 0; y < height; y++) {
                 for (int x = 0; x < width; x++) {
                     *bm->getAddr8(x, y) = SkGetPackedR32(*device.getAddr32(x, y));
@@ -118,22 +118,22 @@
     SkBitmap*   fBitmaps;
     size_t      fBitmapCount;
 
-	EncodeView() {
+    EncodeView() {
     #if 1
         (void)mkdir(gPath, S_IRWXU | S_IRWXG | S_IRWXO);
-        
+
         fBitmapCount = SK_ARRAY_COUNT(gConfigs);
         fBitmaps = new SkBitmap[fBitmapCount];
         for (size_t i = 0; i < fBitmapCount; i++) {
             make_image(&fBitmaps[i], gConfigs[i], i);
-            
+
             for (size_t j = 0; j < SK_ARRAY_COUNT(gExt); j++) {
                 SkString path;
                 make_name(&path, i, j);
-                
+
                 // remove any previous run of this file
                 remove(path.c_str());
-                
+
                 SkImageEncoder* codec = SkImageEncoder::Create(gTypes[j]);
                 if (NULL == codec ||
                         !codec->encodeFile(path.c_str(), fBitmaps[i], 100)) {
@@ -149,11 +149,11 @@
     #endif
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
     virtual ~EncodeView() {
         delete[] fBitmaps;
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -163,21 +163,21 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         if (fBitmapCount == 0) {
             return;
         }
-        
+
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setTextAlign(SkPaint::kCenter_Align);
-        
+
         canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
-        
+
         SkScalar x = 0, y = 0, maxX = 0;
         const int SPACER = 10;
-        
+
         for (size_t i = 0; i < fBitmapCount; i++) {
             canvas->drawText(gConfigLabels[i], strlen(gConfigLabels[i]),
                              x + SkIntToScalar(fBitmaps[i].width()) / 2, 0,
@@ -185,20 +185,20 @@
             y = paint.getTextSize();
 
             canvas->drawBitmap(fBitmaps[i], x, y);
-            
+
             SkScalar yy = y;
             for (size_t j = 0; j < SK_ARRAY_COUNT(gExt); j++) {
                 yy += SkIntToScalar(fBitmaps[i].height() + 10);
 
                 SkBitmap bm;
                 SkString name;
-                
+
                 make_name(&name, i, j);
-                
+
                 SkImageDecoder::DecodeFile(name.c_str(), &bm);
                 canvas->drawBitmap(bm, x, yy);
             }
-            
+
             x += SkIntToScalar(fBitmaps[i].width() + SPACER);
             if (x > maxX) {
                 maxX = x;
@@ -214,12 +214,12 @@
             y += SkIntToScalar(fBitmaps[0].height() + SPACER);
         }
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         this->inval(NULL);
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleFillType.cpp b/samplecode/SampleFillType.cpp
index ae97720..b291834 100644
--- a/samplecode/SampleFillType.cpp
+++ b/samplecode/SampleFillType.cpp
@@ -19,14 +19,14 @@
 class FillTypeView : public SampleView {
     SkPath fPath;
 public:
-	FillTypeView() {
+    FillTypeView() {
         const SkScalar radius = SkIntToScalar(45);
         fPath.addCircle(SkIntToScalar(50), SkIntToScalar(50), radius);
         fPath.addCircle(SkIntToScalar(100), SkIntToScalar(100), radius);
 
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -36,7 +36,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void showPath(SkCanvas* canvas, int x, int y, SkPath::FillType ft,
                   SkScalar scale, const SkPaint& paint) {
 
@@ -53,7 +53,7 @@
         canvas->drawPath(fPath, paint);
         canvas->restore();
     }
-    
+
     void showFour(SkCanvas* canvas, SkScalar scale, const SkPaint& paint) {
         showPath(canvas,   0,   0, SkPath::kWinding_FillType,
                  scale, paint);
@@ -64,10 +64,10 @@
         showPath(canvas, 200, 200, SkPath::kInverseEvenOdd_FillType,
                  scale, paint);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
-        
+
         SkPaint paint;
         const SkScalar scale = SkIntToScalar(5)/4;
 
@@ -85,7 +85,7 @@
         canvas->translate(SkIntToScalar(450), 0);
         showFour(canvas, scale, paint);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleFilter.cpp b/samplecode/SampleFilter.cpp
index 350523d..75eb7d7 100644
--- a/samplecode/SampleFilter.cpp
+++ b/samplecode/SampleFilter.cpp
@@ -30,7 +30,7 @@
     bm->setConfig(SkBitmap::kIndex8_Config, 2, 2);
     bm->allocPixels(ctable);
     ctable->unref();
-    
+
     *bm->getAddr8(0, 0) = 0;
     *bm->getAddr8(1, 0) = 1;
     *bm->getAddr8(0, 1) = 2;
@@ -89,7 +89,7 @@
     canvas->translate(SkIntToScalar(48), 0);
 
     canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale));
-    
+
     x += draw_set(canvas, bm, 0, &paint);
     paint.reset();
     paint.setAlpha(0x80);
@@ -101,12 +101,12 @@
 public:
     SkBitmap    fBM8, fBM4444, fBM16, fBM32;
 
-	FilterView() {
+    FilterView() {
         make_bm(&fBM8);
         fBM8.copyTo(&fBM4444, SkBitmap::kARGB_4444_Config);
         fBM8.copyTo(&fBM16, SkBitmap::kRGB_565_Config);
         fBM8.copyTo(&fBM32, SkBitmap::kARGB_8888_Config);
-        
+
         this->setBGColor(0xFFDDDDDD);
     }
 
@@ -119,11 +119,11 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkScalar x = SkIntToScalar(10);
         SkScalar y = SkIntToScalar(10);
-        
+
         canvas->translate(x, y);
         y = draw_row(canvas, fBM8);
         canvas->translate(0, y);
@@ -133,7 +133,7 @@
         canvas->translate(0, y);
         draw_row(canvas, fBM32);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleFilter2.cpp b/samplecode/SampleFilter2.cpp
index da4147e..8582447 100644
--- a/samplecode/SampleFilter2.cpp
+++ b/samplecode/SampleFilter2.cpp
@@ -30,10 +30,10 @@
     int         fBitmapCount;
     int         fCurrIndex;
 
-	Filter2View() {
+    Filter2View() {
         fBitmapCount = SK_ARRAY_COUNT(gNames)*2;
         fBitmaps = new SkBitmap[fBitmapCount];
-        
+
         for (int i = 0; i < fBitmapCount/2; i++) {
             SkImageDecoder::DecodeFile(gNames[i], &fBitmaps[i],
                                        SkBitmap::kARGB_8888_Config,
@@ -45,14 +45,14 @@
                                    SkImageDecoder::kDecodePixels_Mode, NULL);
         }
         fCurrIndex = 0;
-        
+
         this->setBGColor(SK_ColorGRAY);
     }
-    
+
     virtual ~Filter2View() {
         delete[] fBitmaps;
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -64,14 +64,14 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         canvas->translate(SkIntToScalar(10), SkIntToScalar(50));
-        
+
         const SkScalar W = SkIntToScalar(fBitmaps[0].width() + 1);
         const SkScalar H = SkIntToScalar(fBitmaps[0].height() + 1);
         SkPaint paint;
-        
+
         const SkScalar scale = SkFloatToScalar(0.897917f);
         canvas->scale(SK_Scalar1, scale);
 
@@ -111,7 +111,7 @@
             }
         }
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleFontCache.cpp b/samplecode/SampleFontCache.cpp
index 2546890..d5c2add 100644
--- a/samplecode/SampleFontCache.cpp
+++ b/samplecode/SampleFontCache.cpp
@@ -17,15 +17,15 @@
     SkPaint paint;
     uint16_t text[32];
     SkRandom rand;
-    
+
     paint.setAntiAlias(true);
     paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
     for (int j = 0; j < SK_ARRAY_COUNT(text); j++)
         text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32);
-    
+
     for (int i = 9; i < 36; i++) {
         SkPaint::FontMetrics m;
-        
+
         paint.setTextSize(SkIntToScalar(i));
         paint.getFontMetrics(&m);
         paint.measureText(text, sizeof(text));
@@ -36,20 +36,20 @@
     SkPaint paint;
     uint16_t text[32];
     SkRandom rand;
-    
+
     paint.setAntiAlias(true);
     paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
     for (int j = 0; j < SK_ARRAY_COUNT(text); j++)
         text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32);
-    
+
     SkScalar x = SkIntToScalar(10);
     SkScalar y = SkIntToScalar(20);
-    
+
     canvas->drawColor(SK_ColorWHITE);
     for (int i = 9; i < 36; i++)
     {
         SkPaint::FontMetrics m;
-        
+
         paint.setTextSize(SkIntToScalar(i));
         paint.getFontMetrics(&m);
         canvas->drawText(text, sizeof(text), x, y, paint);
@@ -79,16 +79,16 @@
 class FontCacheView : public SampleView {
 public:
     enum { N = 4 };
-    
+
     pthread_t   fMThreads[N];
     pthread_t   fDThreads[N];
     SkBitmap    fBitmaps[N];
 
-	FontCacheView() {
+    FontCacheView() {
         gDone = false;
         for (int i = 0; i < N; i++) {
             int status;
-            
+
             status = pthread_create(&fMThreads[i], NULL,  measure_proc, NULL);
             SkASSERT(0 == status);
 
@@ -99,7 +99,7 @@
         }
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
     virtual ~FontCacheView() {
         gDone = true;
         for (int i = 0; i < N; i++) {
@@ -110,7 +110,7 @@
             SkASSERT(0 == status);
         }
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -120,7 +120,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkScalar x = 0;
         SkScalar y = 0;
@@ -130,7 +130,7 @@
         }
         this->inval(NULL);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleFontScalerTest.cpp b/samplecode/SampleFontScalerTest.cpp
index e6321de..8494e75 100644
--- a/samplecode/SampleFontScalerTest.cpp
+++ b/samplecode/SampleFontScalerTest.cpp
@@ -40,7 +40,7 @@
     SkTypeface* fFaces[gFaceCount];
 
 public:
-	FontScalerTestView() {
+    FontScalerTestView() {
         for (int i = 0; i < gFaceCount; i++) {
             fFaces[i] = SkTypeface::CreateFromName(gFaces[i].fName,
                                                    gFaces[i].fStyle);
@@ -77,11 +77,11 @@
         if (false) {
             SkPoint pts[4];
             pts[0].set(1.61061274e+09f, 6291456);
-            pts[1].set(SkFloatToScalar(-7.18397061e+15f), 
+            pts[1].set(SkFloatToScalar(-7.18397061e+15f),
                        SkFloatToScalar(-1.53091184e+13f));
-            pts[2].set(SkFloatToScalar(-1.30077315e+16f), 
+            pts[2].set(SkFloatToScalar(-1.30077315e+16f),
                        SkFloatToScalar(-2.77196141e+13f));
-            pts[3].set(SkFloatToScalar(-1.30077315e+16f), 
+            pts[3].set(SkFloatToScalar(-1.30077315e+16f),
                        SkFloatToScalar(-2.77196162e+13f));
 
             SkPath path;
diff --git a/samplecode/SampleFuzz.cpp b/samplecode/SampleFuzz.cpp
index 6966d0d..c082c4d 100644
--- a/samplecode/SampleFuzz.cpp
+++ b/samplecode/SampleFuzz.cpp
@@ -65,7 +65,7 @@
   if (R(2) == 1) v = (float)R(100); else
 
   switch (sel) {
-    case 0: break; 
+    case 0: break;
     case 1: v = 0; break;
     case 2: v = 0.000001f; break;
     case 3: v = 10000; break;
@@ -89,7 +89,7 @@
   if (quick == true) sel = 0; else sel = R(6);
 
   switch (sel) {
- 
+
     case 0:
     case 1:
     case 2:
@@ -121,13 +121,13 @@
     return make_color();
 #endif
 }
-    
+
 
 static void do_fuzz(SkCanvas* canvas) {
     SkPath path;
     SkPaint paint;
     paint.setAntiAlias(true);
-    
+
   for (int i=0;i<100;i++) {
   switch (R(33)) {
 
@@ -156,35 +156,35 @@
       switch (R(2)) {
           case 0: paint.setStrokeCap(SkPaint::kRound_Cap); break;
         case 1: paint.setStrokeCap(SkPaint::kButt_Cap); break;
-      }      
+      }
       break;
 
     case 4:
       switch (R(2)) {
           case 0: paint.setStrokeJoin(SkPaint::kRound_Join); break;
         case 1: paint.setStrokeJoin(SkPaint::kMiter_Join); break;
-      }      
+      }
       break;
 
-    case 5: 
-      paint.setStrokeWidth(make_number()); 
+    case 5:
+      paint.setStrokeWidth(make_number());
       break;
 
-    case 6: 
+    case 6:
       paint.setStrokeMiter(make_number());
       break;
 
-    case 7: 
+    case 7:
       if (quick == true) break;
           SkSafeUnref(paint.setMaskFilter(SkBlurMaskFilter::Create(make_number(), SkBlurMaskFilter::kNormal_BlurStyle)));
       break;
 
-    case 8: 
+    case 8:
       if (quick == true) break;
-      //ctx.shadowColor = make_fill(); 
+      //ctx.shadowColor = make_fill();
       break;
 
-    case 9: 
+    case 9:
       if (quick == true) break;
       //ctx.shadowOffsetX = make_number();
       //ctx.shadowOffsetY = make_number();
@@ -269,7 +269,7 @@
               canvas->drawPath(path, paint);
               paint.setStyle(s);
           } break;
-          
+
           case 23: {
               SkRect r;
               r.set(make_number(),make_number(),make_number(),make_number());
@@ -278,7 +278,7 @@
               canvas->drawRect(r, paint);
               paint.setStyle(s);
           } break;
-          
+
     case 24:
       if (quick == true) break;
       //ctx.arc(make_number(),make_number(),make_number(),make_number(),make_number(),true);
@@ -326,7 +326,7 @@
       if (scale_large == true) {
 
         switch (scval) {
-          case 0: canvas->scale(-1000000000,1); 
+          case 0: canvas->scale(-1000000000,1);
                   canvas->scale(-1000000000,1);
                   scval = 1; break;
           case 1: canvas->scale(-.000000001f,1); scval = 2; break;
@@ -348,10 +348,10 @@
 
 class FuzzView : public SampleView {
 public:
-	FuzzView() {
+    FuzzView() {
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -361,16 +361,16 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(0xFFDDDDDD);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         do_fuzz(canvas);
         this->inval(NULL);
     }
-    
+
 private:
     typedef SkView INHERITED;
 };
diff --git a/samplecode/SampleGradients.cpp b/samplecode/SampleGradients.cpp
index 661c20a..f1a2dd9 100644
--- a/samplecode/SampleGradients.cpp
+++ b/samplecode/SampleGradients.cpp
@@ -23,16 +23,16 @@
           SkIntToScalar(410), SkIntToScalar(30));
     SkPaint p, p2;
     p2.setStyle(SkPaint::kStroke_Style);
-    
+
     p.setShader(setgrad(r, 0xFF00FF00, 0x0000FF00))->unref();
     canvas->drawRect(r, p);
     canvas->drawRect(r, p2);
-    
+
     r.offset(0, r.height() + SkIntToScalar(4));
     p.setShader(setgrad(r, 0xFF00FF00, 0x00000000))->unref();
     canvas->drawRect(r, p);
     canvas->drawRect(r, p2);
-    
+
     r.offset(0, r.height() + SkIntToScalar(4));
     p.setShader(setgrad(r, 0xFF00FF00, 0x00FF0000))->unref();
     canvas->drawRect(r, p);
@@ -69,7 +69,7 @@
     return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos,
                                           data.fCount, tm, mapper);
 }
-                                          
+
 static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data,
                             SkShader::TileMode tm, SkUnitMapper* mapper) {
     SkPoint center;
@@ -122,10 +122,10 @@
 
 class GradientsView : public SampleView {
 public:
-	GradientsView() {
+    GradientsView() {
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -166,14 +166,14 @@
             canvas->translate(SK_ARRAY_COUNT(gGradData)*SkIntToScalar(120), 0);
         }
         canvas->restore();
-        
+
         canvas->translate(0, SkIntToScalar(370));
         if (false) { // avoid bit rot, suppress warning
             test_alphagradients(canvas);
         }
         this->inval(NULL);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleHairCurves.cpp b/samplecode/SampleHairCurves.cpp
index 152cbeb..2bb2fa2 100644
--- a/samplecode/SampleHairCurves.cpp
+++ b/samplecode/SampleHairCurves.cpp
@@ -15,7 +15,7 @@
 public:
     HairCurvesView() {
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
diff --git a/samplecode/SampleHairModes.cpp b/samplecode/SampleHairModes.cpp
index 4780476..59cb25c 100644
--- a/samplecode/SampleHairModes.cpp
+++ b/samplecode/SampleHairModes.cpp
@@ -56,7 +56,7 @@
         paint.setStrokeWidth(SK_Scalar1 * angle * 2 / 24);
         canvas->drawLine(W/2, H/2, W/2 + x, H/2 + y, paint);
     }
-    
+
     return H;
 }
 
@@ -70,7 +70,7 @@
     SkShader* s = SkShader::CreateBitmapShader(bm,
                                                SkShader::kRepeat_TileMode,
                                                SkShader::kRepeat_TileMode);
-    
+
     SkMatrix m;
     m.setScale(SkIntToScalar(6), SkIntToScalar(6));
     s->setLocalMatrix(m);
@@ -80,7 +80,7 @@
 class HairModesView : public SampleView {
     SkPaint fBGPaint;
 public:
-	HairModesView() {
+    HairModesView() {
         fBGPaint.setShader(make_bg_shader())->unref();
     }
 
@@ -110,7 +110,7 @@
                     canvas->save();
                 }
                 SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
-                
+
                 canvas->drawRect(bounds, fBGPaint);
                 canvas->saveLayer(&bounds, NULL);
                 SkScalar dy = drawCell(canvas, mode,
@@ -126,7 +126,7 @@
             canvas->translate(W * 5 / 4, 0);
         }
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleHairline.cpp b/samplecode/SampleHairline.cpp
index 7302727..7aa4666 100644
--- a/samplecode/SampleHairline.cpp
+++ b/samplecode/SampleHairline.cpp
@@ -41,7 +41,7 @@
 
     SkPoint pt0 = { SkFloatToScalar(799.33374f), SkFloatToScalar(1.2360189f) };
     SkPoint pt1 = { SkFloatToScalar(808.49969f), SkFloatToScalar(-7.4338055f) };
-    
+
     SkPaint paint;
     paint.setAntiAlias(true);
     canvas.drawLine(pt0.fX, pt0.fY, pt1.fX, pt1.fY, paint);
@@ -112,7 +112,7 @@
     SkPoint pts[N];
     for (int i = 0; i < 50; i++) {
         generate_pts(pts, N, WIDTH, HEIGHT);
-        
+
         SkPath path;
         path.moveTo(pts[0]);
         for (int j = 1; j < N; j++) {
@@ -135,14 +135,14 @@
     SkPoint pts[N];
     for (int i = 0; i < 10; i++) {
         generate_pts(pts, N, WIDTH, HEIGHT);
-        
+
         SkPath path;
         path.moveTo(pts[0]);
         for (int j = 1; j < N - 2; j++) {
             path.quadTo(pts[j], ave(pts[j], pts[j+1]));
         }
         path.quadTo(pts[N - 2], pts[N - 1]);
-        
+
         canvas->drawPath(path, paint);
     }
 }
@@ -159,14 +159,14 @@
     SkPoint pts[N];
     for (int i = 0; i < 10; i++) {
         generate_pts(pts, N, WIDTH, HEIGHT);
-        
+
         SkPath path;
         path.moveTo(pts[0]);
         for (int j = 1; j < N - 2; j++) {
             add_cubic(&path, pts[j], ave(pts[j], pts[j+1]));
         }
         add_cubic(&path, pts[N - 2], pts[N - 1]);
-        
+
         canvas->drawPath(path, paint);
     }
 }
@@ -192,13 +192,13 @@
     int fProcIndex;
     bool fDoAA;
 public:
-	HairlineView() {
+    HairlineView() {
         fCounter = 0;
         fProcIndex = 0;
         fDoAA = true;
         fNow = 0;
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -210,7 +210,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void show_bitmaps(SkCanvas* canvas, const SkBitmap& b0, const SkBitmap& b1,
                       const SkIRect& inset) {
         canvas->drawBitmap(b0, 0, 0, NULL);
@@ -221,11 +221,11 @@
 
     virtual void onDrawContent(SkCanvas* canvas) {
         gRand.setSeed(fNow);
-        
+
         if (false) { // avoid bit rot, suppress warning
             test_chromium_9005();
         }
-        
+
         SkBitmap bm, bm2;
         bm.setConfig(SkBitmap::kARGB_8888_Config,
                      WIDTH + MARGIN*2,
@@ -237,7 +237,7 @@
         bm2.setConfig(SkBitmap::kARGB_8888_Config, WIDTH, HEIGHT,
                       bm.rowBytes());
         bm2.setPixels(bm.getAddr32(MARGIN, MARGIN));
-        
+
         SkCanvas c2(bm2);
         SkPaint paint;
         paint.setAntiAlias(fDoAA);
@@ -266,7 +266,7 @@
         this->inval(NULL);
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
 
 private:
     typedef SampleView INHERITED;
diff --git a/samplecode/SampleImage.cpp b/samplecode/SampleImage.cpp
index 8867baf..8fdf6b9 100644
--- a/samplecode/SampleImage.cpp
+++ b/samplecode/SampleImage.cpp
@@ -35,7 +35,7 @@
     if (SkImageDecoder::DecodeStream(stream, bitmap, pref,
                                  SkImageDecoder::kDecodeBounds_Mode, NULL)) {
         SkASSERT(bitmap->config() != SkBitmap::kNo_Config);
-    
+
         SkImageRef* ref = new SkImageRef_GlobalPool(stream, bitmap->config());
         ref->setURI(name);
         bitmap->setPixelRef(ref)->unref();
@@ -50,34 +50,34 @@
     SkBitmap*   fBitmaps;
     SkShader*   fShader;
 
-	ImageView() {
+    ImageView() {
         SkImageRef_GlobalPool::SetRAMBudget(32 * 1024);
-        
+
         int i, N = SK_ARRAY_COUNT(gNames);
         fBitmaps = new SkBitmap[N];
-        
+
         for (i = 0; i < N; i++) {
             SkString str("/skimages/");
             str.append(gNames[i]);
             SkFILEStream* stream = new SkFILEStream(str.c_str());
-            
+
             SetImageRef(&fBitmaps[i], stream, SkBitmap::kNo_Config, gNames[i]);
             if (i & 1)
                 fBitmaps[i].buildMipMap();
             stream->unref();
         }
-        
+
         fShader = SkShader::CreateBitmapShader(fBitmaps[5],
                                                SkShader::kRepeat_TileMode,
                                                SkShader::kRepeat_TileMode);
-        
+
         if (true) {
             SkMatrix m;
-            
+
             m.setRotate(SkIntToScalar(30));
             fShader->setLocalMatrix(m);
         }
-        
+
 #if 0
         SkImageRef::DumpPool();
         for (i = 0; i < N; i++) {
@@ -92,20 +92,20 @@
             success = bm.lockPixels();
             SkDebugf(" addr=%d", bm.getPixels());
             if (success)
-                bm.unlockPixels();            
+                bm.unlockPixels();
             SkDebugf("\n");
         }
         SkImageRef::DumpPool();
 #endif
     }
-    
+
     virtual ~ImageView() {
         delete[] fBitmaps;
         delete fShader;
 
         SkImageRef_GlobalPool::DumpPool();
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -115,43 +115,43 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(0xFFDDDDDD);
 //        canvas->drawColor(SK_ColorWHITE);
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         this->drawBG(canvas);
-        
+
         canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
-        
+
         SkScalar x = 0, y = 0;
-        
+
         for (size_t i = 0; i < SK_ARRAY_COUNT(gNames); i++) {
             canvas->drawBitmap(fBitmaps[i], x, y);
             x += SkIntToScalar(fBitmaps[i].width() + 10);
         }
-        
+
         canvas->translate(0, SkIntToScalar(120));
 
         SkPaint paint;
         paint.setShader(fShader);
         paint.setFilterBitmap(true);
         SkRect r = { 0, 0, SkIntToScalar(300), SkIntToScalar(100) };
-        
+
         canvas->drawRect(r, paint);
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         this->inval(NULL);
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
     virtual bool onClick(Click* click) {
         return this->INHERITED::onClick(click);
     }
-    
+
 private:
     typedef SkView INHERITED;
 };
diff --git a/samplecode/SampleImageDir.cpp b/samplecode/SampleImageDir.cpp
index 8d6f5e0..c37f857 100644
--- a/samplecode/SampleImageDir.cpp
+++ b/samplecode/SampleImageDir.cpp
@@ -135,9 +135,9 @@
     SkScalar    fSaturation;
     SkScalar    fAngle;
 
-	ImageDirView() {
+    ImageDirView() {
         SkImageRef_GlobalPool::SetRAMBudget(320 * 1024);
-        
+
 #ifdef SPECIFIC_IMAGE
         fBitmaps = new SkBitmap[3];
         fStrings = new SkString[3];
@@ -171,7 +171,7 @@
             SkString path(IMAGE_DIR);
             path.append(name);
             SkStream* stream = new SkFILEStream(path.c_str());
-            
+
             SetImageRef(&fBitmaps[i], stream, SkBitmap::kNo_Config,
                         name.c_str());
             stream->unref();
@@ -181,20 +181,20 @@
 #endif
         fCurrIndex = 0;
         fDX = fDY = 0;
-        
+
         fSaturation = SK_Scalar1;
         fAngle = 0;
-        
+
         fScale = SK_Scalar1;
     }
-    
+
     virtual ~ImageDirView() {
         delete[] fBitmaps;
         delete[] fStrings;
 
         SkImageRef_GlobalPool::DumpPool();
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -210,23 +210,23 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawBG(SkCanvas* canvas) {
 //        canvas->drawColor(0xFFDDDDDD);
         canvas->drawColor(SK_ColorGRAY);
         canvas->drawColor(SK_ColorWHITE);
     }
-    
+
     SkScalar fScale;
     virtual void onDraw(SkCanvas* canvas) {
         this->drawBG(canvas);
-        
+
         if (true) {
             canvas->scale(SkIntToScalar(2), SkIntToScalar(2));
             drawmarshmallow(canvas);
             return;
         }
-        
+
         if (false) {
             SkPaint p;
             p.setStyle(SkPaint::kStroke_Style);
@@ -244,16 +244,16 @@
             DrawRoundRect(*canvas);
             return;
         }
-    
+
         canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
-        
+
         SkScalar x = SkIntToScalar(32), y = SkIntToScalar(32);
         SkPaint paint;
 
 #if 0
         for (int i = 0; i < fBitmapCount; i++) {
             SkPaint p;
-            
+
 #if 1
             const SkScalar cm[] = {
                 SkIntToScalar(2), 0, 0, 0, SkIntToScalar(-255),
@@ -264,7 +264,7 @@
             SkColorFilter* cf = new SkColorMatrixFilter(cm);
             p.setColorFilter(cf)->unref();
 #endif
-            
+
             canvas->drawBitmap(fBitmaps[i], x, y, &p);
             x += SkIntToScalar(fBitmaps[i].width() + 10);
         }
@@ -282,7 +282,7 @@
         }
 #endif
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         if (true) {
             fCurrIndex += 1;
@@ -292,7 +292,7 @@
         }
         return new Click(this);
     }
-    
+
     virtual bool onClick(Click* click)  {
         SkScalar center = this->width()/2;
         fSaturation = SkScalarDiv(click->fCurr.fX - center, center/2);
@@ -301,14 +301,14 @@
 
         fDX += click->fCurr.fX - click->fPrev.fX;
         fDY += click->fCurr.fY - click->fPrev.fY;
-        
+
         fScale = SkScalarDiv(click->fCurr.fX, this->width());
 
         this->inval(NULL);
         return true;
         return this->INHERITED::onClick(click);
     }
-    
+
 private:
     SkScalar fDX, fDY;
     typedef SkView INHERITED;
diff --git a/samplecode/SampleLCD.cpp b/samplecode/SampleLCD.cpp
index 5f8cb0b..7136448 100644
--- a/samplecode/SampleLCD.cpp
+++ b/samplecode/SampleLCD.cpp
@@ -15,7 +15,7 @@
 class LCDView : public SkView {
 public:
     LCDView() {}
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -25,17 +25,17 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorWHITE);
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         this->drawBG(canvas);
 
         SkPaint paint;
         paint.setAntiAlias(true);
-        
+
         SkScalar textSize = SkIntToScalar(6);
         SkScalar delta = SK_Scalar1;
         const char* text = "HHHamburgefonts iii";
@@ -47,16 +47,16 @@
         for (int i = 0; i < 20; i++) {
             paint.setTextSize(textSize);
             textSize += delta;
-            
+
             paint.setLCDRenderText(false);
             canvas->drawText(text, len, x0, y, paint);
             paint.setLCDRenderText(true);
             canvas->drawText(text, len, x1, y, paint);
-            
+
             y += paint.getFontSpacing();
         }
     }
-    
+
 private:
     typedef SkView INHERITED;
 };
diff --git a/samplecode/SampleLayerMask.cpp b/samplecode/SampleLayerMask.cpp
index 883642c..78b9800 100644
--- a/samplecode/SampleLayerMask.cpp
+++ b/samplecode/SampleLayerMask.cpp
@@ -14,10 +14,10 @@
 
 class LayerMaskView : public SampleView {
 public:
-	LayerMaskView() {
+    LayerMaskView() {
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -27,7 +27,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawMask(SkCanvas* canvas, const SkRect& r) {
         SkPaint paint;
         paint.setAntiAlias(true);
@@ -43,7 +43,7 @@
             SkRect bounds = r;
             bounds.offset(-bounds.fLeft, -bounds.fTop);
             c.drawOval(bounds, paint);
-            
+
             paint.setXfermodeMode(SkXfermode::kDstIn_Mode);
             canvas->drawBitmap(mask, r.fLeft, r.fTop, &paint);
         } else {
@@ -63,7 +63,7 @@
         drawMask(canvas, r);
         canvas->restore();
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleLayers.cpp b/samplecode/SampleLayers.cpp
index 06fdd3f..95061b5 100644
--- a/samplecode/SampleLayers.cpp
+++ b/samplecode/SampleLayers.cpp
@@ -31,7 +31,7 @@
     SkColor colors[] = { 0, SK_ColorWHITE };
     SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
     SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
-    
+
     paint->setShader(s)->unref();
     paint->setXfermodeMode(SkXfermode::kDstIn_Mode);
 }
@@ -57,7 +57,7 @@
     SkAutoCanvasRestore ar(canvas, true);
 
     SkRect r;
-    
+
     SkPaint p;
     p.setAlpha(0x88);
 
@@ -67,15 +67,15 @@
 
     r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
     canvas->clipRect(r);
-    
+
     r.fBottom = SkIntToScalar(20);
     canvas->saveLayer(&r, NULL, (SkCanvas::SaveFlags)(SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kFullColorLayer_SaveFlag));
 
     r.fTop = SkIntToScalar(80);
     r.fBottom = SkIntToScalar(100);
     canvas->saveLayer(&r, NULL, (SkCanvas::SaveFlags)(SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kFullColorLayer_SaveFlag));
-    
-    // now draw the "content" 
+
+    // now draw the "content"
 
     if (true) {
         r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
@@ -86,19 +86,19 @@
         p.setColor(SK_ColorRED);
         p.setAntiAlias(true);
         canvas->drawOval(r, p);
-        
+
         dump_layers("inside layer alpha", canvas);
-        
+
         canvas->restore();
     } else {
         r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
-        
+
         SkPaint p;
         p.setColor(SK_ColorRED);
         p.setAntiAlias(true);
         canvas->drawOval(r, p);
     }
-    
+
 //    return;
 
     dump_layers("outside layer alpha", canvas);
@@ -116,7 +116,7 @@
     m.setScale(SK_Scalar1, -SK_Scalar1);
     m.postTranslate(0, SkIntToScalar(100));
     s->setLocalMatrix(m);
-    
+
     r.fTop = SkIntToScalar(80);
     r.fBottom = SkIntToScalar(100);
 //    SkDebugf("--------- draw bot grad\n");
@@ -135,14 +135,14 @@
     virtual void restore(SkCanvas*, SkPaint* p, SkDrawFilter::Type) {
         p->setColor(fColor);
     }
-    
+
 private:
     SkColor fColor;
 };
 
 class LayersView : public SkView {
 public:
-	LayersView() {}
+    LayersView() {}
 
 protected:
     // overrides from SkEventSink
@@ -153,18 +153,18 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorGRAY);
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         this->drawBG(canvas);
-        
+
         if (true) {
             SkRect r;
-			r.set(SkIntToScalar(0), SkIntToScalar(0),
-				  SkIntToScalar(220), SkIntToScalar(120));
+            r.set(SkIntToScalar(0), SkIntToScalar(0),
+                  SkIntToScalar(220), SkIntToScalar(120));
             SkPaint p;
             canvas->saveLayer(&r, &p);
             canvas->drawColor(0xFFFF0000);
@@ -174,15 +174,15 @@
             canvas->restore();
             return;
         }
-        
+
         if (false) {
             SkRect r;
-			r.set(SkIntToScalar(0), SkIntToScalar(0),
-				  SkIntToScalar(220), SkIntToScalar(120));
+            r.set(SkIntToScalar(0), SkIntToScalar(0),
+                  SkIntToScalar(220), SkIntToScalar(120));
             SkPaint p;
             p.setAlpha(0x88);
             p.setAntiAlias(true);
-            
+
             if (true) {
                 canvas->saveLayer(&r, &p);
                 p.setColor(0xFFFF0000);
@@ -203,36 +203,36 @@
             canvas->translate(SkIntToScalar(300), 0);
 
             SkRect r;
-			r.set(SkIntToScalar(0), SkIntToScalar(0),
-				  SkIntToScalar(220), SkIntToScalar(60));
+            r.set(SkIntToScalar(0), SkIntToScalar(0),
+                  SkIntToScalar(220), SkIntToScalar(60));
 
             canvas->saveLayer(&r, &p, (SkCanvas::SaveFlags)(SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kFullColorLayer_SaveFlag));
 //            canvas->clipRect(r, SkRegion::kDifference_Op);
 //            canvas->clipRect(r, SkRegion::kIntersect_Op);
 
-			r.set(SkIntToScalar(0), SkIntToScalar(0),
-				  SkIntToScalar(220), SkIntToScalar(120));
+            r.set(SkIntToScalar(0), SkIntToScalar(0),
+                  SkIntToScalar(220), SkIntToScalar(120));
             p.setColor(SK_ColorBLUE);
             canvas->drawOval(r, p);
             canvas->restore();
             return;
         }
-        
+
         //canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
         test_fade(canvas);
         return;
 
     //    canvas->setDrawFilter(new RedFilter)->unref();
-        
+
         SkRect  r;
         SkPaint p;
-        
+
         canvas->translate(SkIntToScalar(220), SkIntToScalar(20));
-        
+
         p.setAntiAlias(true);
         r.set(SkIntToScalar(20), SkIntToScalar(20),
               SkIntToScalar(220), SkIntToScalar(120));
-        
+
         p.setColor(SK_ColorBLUE);
      //   p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(8), SkBlurMaskFilter::kNormal_BlurStyle))->unref();
         canvas->drawRect(r, p);
@@ -244,25 +244,25 @@
 
         p.setColor(SK_ColorRED);
         canvas->drawOval(r, p);
-        
+
         p.setAlpha(0x80);
         p.setXfermodeMode(SkXfermode::kDstIn_Mode);
         canvas->drawRect(bounds, p);
 
         canvas->restore();
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         this->inval(NULL);
-        
+
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
     virtual bool onClick(Click* click) {
         return this->INHERITED::onClick(click);
     }
 
-	virtual bool handleKey(SkKey key) {
+    virtual bool handleKey(SkKey key) {
         this->inval(NULL);
         return true;
     }
diff --git a/samplecode/SampleLines.cpp b/samplecode/SampleLines.cpp
index 0048d39..57d7050 100644
--- a/samplecode/SampleLines.cpp
+++ b/samplecode/SampleLines.cpp
@@ -32,8 +32,8 @@
 
 class LinesView : public SampleView {
 public:
-	LinesView() {}
-    
+    LinesView() {}
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -49,12 +49,12 @@
      */
     void drawRings(SkCanvas* canvas) {
         canvas->scale(SkIntToScalar(1)/2, SkIntToScalar(1)/2);
-        
-        SkRect  r;        
+
+        SkRect  r;
         SkScalar x = SkIntToScalar(10);
         SkScalar y = SkIntToScalar(10);
         r.set(x, y, x + SkIntToScalar(100), y + SkIntToScalar(100));
-        
+
         SkPaint paint;
      //   paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
@@ -63,32 +63,32 @@
      //   paint.setColor(0xFFFFFFFF);
         canvas->drawRect(r, paint);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkBitmap bm;
         SkImageDecoder::DecodeFile("/kill.gif", &bm);
         canvas->drawBitmap(bm, 0, 0, NULL);
-        
+
         this->drawRings(canvas);
         return;
 
         SkPaint paint;
-        
+
       //  fAlpha = 0x80;
         paint.setColor(SK_ColorWHITE);
         paint.setAlpha(fAlpha & 0xFF);
         SkRect r;
-        
+
         SkScalar x = SkIntToScalar(10);
         SkScalar y = SkIntToScalar(10);
         r.set(x, y, x + SkIntToScalar(100), y + SkIntToScalar(100));
         canvas->drawRect(r, paint);
         return;
-        
+
         paint.setColor(0xffffff00);            // yellow
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkIntToScalar(2));
-        
+
 //        y += SK_Scalar1/2;
 
         canvas->drawLine(x, y, x + SkIntToScalar(90), y + SkIntToScalar(90), paint);
diff --git a/samplecode/SampleMeasure.cpp b/samplecode/SampleMeasure.cpp
index 35ad5bd..18b3720 100644
--- a/samplecode/SampleMeasure.cpp
+++ b/samplecode/SampleMeasure.cpp
@@ -56,10 +56,10 @@
         p.setLinearText(gSettings[i].fLinearText);
         p.setDevKernText(gSettings[i].fDevKernText);
         SkScalar scale = gSettings[i].fScale;
-        
+
         int n = p.getTextWidths(text, len, widths, rects);
         SkScalar w = p.measureText(text, len, &bounds, scale);
-        
+
         p.setStyle(SkPaint::kFill_Style);
         p.setColor(0x8888FF88);
         canvas->drawRect(bounds, p);
@@ -81,7 +81,7 @@
         canvas->drawLine(0, 0, w, 0, p);
         p.setStrokeWidth(SkIntToScalar(4));
         canvas->drawPoint(x, 0, p);
-        
+
         canvas->translate(0, dy);
     }
 }
@@ -90,7 +90,7 @@
 public:
     SkPaint fPaint;
 
-	MeasureView() {
+    MeasureView() {
         fPaint.setAntiAlias(true);
         fPaint.setTextSize(SkIntToScalar(64));
         this->setBGColor(0xFFDDDDDD);
@@ -105,12 +105,12 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         canvas->translate(fPaint.getTextSize(), fPaint.getTextSize());
         doMeasure(canvas, fPaint, "Hamburgefons");
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleMipMap.cpp b/samplecode/SampleMipMap.cpp
index a7e3166..e0a8e4d 100644
--- a/samplecode/SampleMipMap.cpp
+++ b/samplecode/SampleMipMap.cpp
@@ -17,13 +17,13 @@
     bitmap.setConfig(SkBitmap::kARGB_8888_Config, n, n);
     bitmap.allocPixels();
     bitmap.eraseColor(0);
-    
+
     SkCanvas canvas(bitmap);
     SkRect r;
     r.set(0, 0, SkIntToScalar(n), SkIntToScalar(n));
     SkPaint paint;
     paint.setAntiAlias(true);
-    
+
     paint.setColor(SK_ColorRED);
     canvas.drawOval(r, paint);
     paint.setColor(SK_ColorBLUE);
@@ -31,7 +31,7 @@
     paint.setStyle(SkPaint::kStroke_Style);
     canvas.drawLine(0, 0, r.fRight, r.fBottom, paint);
     canvas.drawLine(0, r.fBottom, r.fRight, 0, paint);
-    
+
     return bitmap;
 }
 
@@ -45,7 +45,7 @@
     MipMapView() {
         fOnce = false;
     }
-    
+
     void init() {
         if (fOnce) {
             return;
@@ -53,10 +53,10 @@
         fOnce = true;
 
         fBitmap = createBitmap(N);
-        
+
         fWidth = N;
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -66,7 +66,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawN(SkCanvas* canvas, const SkBitmap& bitmap) {
         SkAutoCanvasRestore acr(canvas, true);
         for (int i = N; i > 1; i >>= 1) {
@@ -75,12 +75,12 @@
             canvas->scale(SK_ScalarHalf, SK_ScalarHalf);
         }
     }
-    
+
     void drawN2(SkCanvas* canvas, const SkBitmap& bitmap) {
         SkBitmap bg;
         bg.setConfig(SkBitmap::kARGB_8888_Config, N, N);
         bg.allocPixels();
-        
+
         SkAutoCanvasRestore acr(canvas, true);
         for (int i = 0; i < 6; i++) {
             bg.eraseColor(0);
@@ -95,11 +95,11 @@
             canvas->translate(SkIntToScalar(N + 8), 0);
         }
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         this->init();
         canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
-        
+
         canvas->scale(1.00000001f, 0.9999999f);
 
         drawN2(canvas, fBitmap);
@@ -131,7 +131,7 @@
         canvas->drawBitmapRect(bitmap, NULL, dst, NULL);
         canvas->translate(SkIntToScalar(N + 8), 0);
         canvas->drawBitmapRect(bitmap, NULL, dst, &paint);
-        
+
         SkShader* s = SkShader::CreateBitmapShader(bitmap,
                                                    SkShader::kRepeat_TileMode,
                                                    SkShader::kRepeat_TileMode);
@@ -144,10 +144,10 @@
         r.set(0, 0, SkIntToScalar(4*N), SkIntToScalar(5*N/2));
         r.offset(SkIntToScalar(N + 12), -SkIntToScalar(N + 4));
         canvas->drawRect(r, paint);
-        
+
         this->inval(NULL);
     }
-    
+
 private:
     int fWidth;
 
diff --git a/samplecode/SampleMovie.cpp b/samplecode/SampleMovie.cpp
index 17fbc79..c85976b 100644
--- a/samplecode/SampleMovie.cpp
+++ b/samplecode/SampleMovie.cpp
@@ -15,7 +15,7 @@
 class AnimGifView : public SkView {
     SkMovie*    fMovie;
 public:
-	AnimGifView() {
+    AnimGifView() {
         fMovie = SkMovie::DecodeFile("/skimages/dollarblk.gif");
     }
 
diff --git a/samplecode/SampleOvalTest.cpp b/samplecode/SampleOvalTest.cpp
index dab4fbc..340acf6 100644
--- a/samplecode/SampleOvalTest.cpp
+++ b/samplecode/SampleOvalTest.cpp
@@ -19,7 +19,7 @@
     SkPMColor   fOutsideColor;  // signals an exterior pixels that was set
     SkBitmap    fBitmap;
 
-	OvalTestView() {
+    OvalTestView() {
         fSize.set(SK_Scalar1, SK_Scalar1);
 
         fBitmap.setConfig(SkBitmap::kARGB_8888_Config, kILimit, kILimit);
diff --git a/samplecode/SampleOverflow.cpp b/samplecode/SampleOverflow.cpp
index e8a1196..64c36d2 100644
--- a/samplecode/SampleOverflow.cpp
+++ b/samplecode/SampleOverflow.cpp
@@ -19,37 +19,37 @@
     SkCanvas canvas;
     SkMatrix matrix;
     matrix.reset();
-    
+
     bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1370, 812);
     bitmap.allocPixels();
     canvas.setBitmapDevice(bitmap);
-    
+
     // set up clipper
     SkRect skclip;
     skclip.set(SkIntToFixed(284), SkIntToFixed(40), SkIntToFixed(1370), SkIntToFixed(708));
-    
+
     ret = canvas.clipRect(skclip);
     SkASSERT(ret);
-    
+
     matrix.set(SkMatrix::kMTransX, SkFloatToFixed(-1153.28));
     matrix.set(SkMatrix::kMTransY, SkFloatToFixed(1180.50));
-    
+
     matrix.set(SkMatrix::kMScaleX, SkFloatToFixed(0.177171));
     matrix.set(SkMatrix::kMScaleY, SkFloatToFixed(0.177043));
-    
+
     matrix.set(SkMatrix::kMSkewX, SkFloatToFixed(0.126968));
     matrix.set(SkMatrix::kMSkewY, SkFloatToFixed(-0.126876));
-    
+
     matrix.set(SkMatrix::kMPersp0, SkFloatToFixed(0.0));
     matrix.set(SkMatrix::kMPersp1, SkFloatToFixed(0.0));
-    
+
     ret = canvas.concat(matrix);
-    
+
     paint.setAntiAlias(true);
     paint.setColor(0xb2202020);
     paint.setStyle(SkPaint::kStroke_Style);
     paint.setStrokeWidth(SkFloatToFixed(68.13));
-    
+
     SkRect r;
     r.set(SkFloatToFixed(-313.714417), SkFloatToFixed(-4.826389), SkFloatToFixed(18014.447266), SkFloatToFixed(1858.154541));
     canvas.drawRoundRect(r, SkFloatToFixed(91.756363), SkFloatToFixed(91.756363), paint);
@@ -59,12 +59,12 @@
 #ifdef SK_SCALAR_IS_FLOATx // FIXME: unclear when if ever this can be enabled
 static bool HitTestPath(const SkPath& path, SkScalar x, SkScalar y) {
     SkRegion    rgn, clip;
-    
+
     int ix = SkScalarFloor(x);
     int iy = SkScalarFloor(y);
 
     clip.setRect(ix, iy, ix + 1, iy + 1);
-    
+
     bool contains = rgn.setPath(path, clip);
     return contains;
 }
@@ -72,7 +72,7 @@
 
 static void TestOverflowHitTest() {
     SkPath path;
-    
+
 #ifdef SK_SCALAR_IS_FLOATx // FIXME: unclear when if ever this can be enabled
     path.addCircle(0, 0, 70000, SkPath::kCCW_Direction);
     SkASSERT(HitTestPath(path, 40000, 40000));
@@ -81,7 +81,7 @@
 
 class OverflowView : public SampleView {
 public:
-	OverflowView() {}
+    OverflowView() {}
 
 protected:
     // overrides from SkEventSink
@@ -92,12 +92,12 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         DrawRoundRect();
         TestOverflowHitTest();
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SamplePageFlip.cpp b/samplecode/SamplePageFlip.cpp
index 99670bd..7daeb1b 100644
--- a/samplecode/SamplePageFlip.cpp
+++ b/samplecode/SamplePageFlip.cpp
@@ -49,31 +49,31 @@
     SkScalar    y = 0;
 
     SkPaint paint;
-    
+
     paint.setAntiAlias(true);
     paint.setColor(SK_ColorRED);
-    
+
     SkRect oval;
     oval.setEmpty();
 
     SkRect clipR = SkRect::MakeWH(SkIntToScalar(bm->width()), SkIntToScalar(bm->height()));
     clipR.inset(SK_Scalar1/4, SK_Scalar1/4);
-                                  
+
     while (!gDone) {
         ref->inval(oval, true);
         oval.set(x, y, x + SkIntToScalar(OVALW), y + SkIntToScalar(OVALH));
         ref->inval(oval, true);
 
         SkAutoFlipUpdate    update(ref);
-        
+
         if (!update.dirty().isEmpty()) {
             // this must be local to the loop, since it needs to forget the pixels
             // its writing to after each iteration, since we do the swap
             SkCanvas    canvas(update.bitmap());
             canvas.clipRegion(update.dirty());
-            canvas.drawColor(0, SkXfermode::kClear_Mode);            
+            canvas.drawColor(0, SkXfermode::kClear_Mode);
             canvas.clipRect(clipR, SkRegion::kIntersect_Op, true);
-            
+
             canvas.drawOval(oval, paint);
         }
         bounce(&x, &dx, WIDTH-OVALW);
@@ -92,18 +92,18 @@
 class PageFlipView : public SampleView {
     bool fOnce;
 public:
-    
+
     enum { N = SK_ARRAY_COUNT(gConfigs) };
-    
+
     pthread_t   fThreads[N];
     SkBitmap    fBitmaps[N];
 
-	PageFlipView() {
+    PageFlipView() {
         gDone = false;
         fOnce = false;
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
     void init() {
         if (fOnce) {
             return;
@@ -113,20 +113,20 @@
         for (int i = 0; i < N; i++) {
             int             status;
             pthread_attr_t  attr;
-            
+
             status = pthread_attr_init(&attr);
             SkASSERT(0 == status);
-            
+
             fBitmaps[i].setConfig(gConfigs[i], WIDTH, HEIGHT);
             SkFlipPixelRef* pr = new SkFlipPixelRef(gConfigs[i], WIDTH, HEIGHT);
             fBitmaps[i].setPixelRef(pr)->unref();
             fBitmaps[i].eraseColor(0);
-            
+
             status = pthread_create(&fThreads[i], &attr,  draw_proc, &fBitmaps[i]);
             SkASSERT(0 == status);
         }
     }
-    
+
     virtual ~PageFlipView() {
         if (!fOnce) {
             return;
@@ -138,7 +138,7 @@
             SkASSERT(0 == status);
         }
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -159,16 +159,16 @@
         }
         this->inval(NULL);
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         this->inval(NULL);
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
     virtual bool onClick(Click* click) {
         return this->INHERITED::onClick(click);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SamplePatch.cpp b/samplecode/SamplePatch.cpp
index 4c3721b..a58999a 100644
--- a/samplecode/SamplePatch.cpp
+++ b/samplecode/SamplePatch.cpp
@@ -225,7 +225,7 @@
     SkPoint     fPts[12];
 
 public:
-	PatchView() {
+    PatchView() {
         fShader0 = make_shader0(&fSize0);
         fSize1 = fSize0;
         if (fSize0.fX == 0 || fSize0.fY == 0) {
diff --git a/samplecode/SamplePath.cpp b/samplecode/SamplePath.cpp
index 69b48fa..b07307a 100644
--- a/samplecode/SamplePath.cpp
+++ b/samplecode/SamplePath.cpp
@@ -50,7 +50,7 @@
     const char* str = "M2242 -590088L-377758 9.94099e+07L-377758 9.94099e+07L2242 -590088Z";
     SkPath path;
     SkParsePath::FromSVGString(str, &path);
-    
+
     {
 #ifdef SK_BUILD_FOR_WIN
         // windows doesn't have strtof
@@ -62,7 +62,7 @@
         int fx = (int)(x * 65536);
         int ffx = SkScalarToFixed(x);
         printf("%g %x %x %x\n", x, ix, fx, ffx);
-        
+
         SkRect r = path.getBounds();
         SkIRect ir;
         r.round(&ir);
@@ -71,7 +71,7 @@
                SkScalarToDouble(r.fRight), SkScalarToDouble(r.fBottom),
                ir.fLeft, ir.fTop, ir.fRight, ir.fBottom);
     }
-    
+
     SkBitmap bitmap;
     bitmap.setConfig(SkBitmap::kARGB_8888_Config, 300, 200);
     bitmap.allocPixels();
@@ -88,11 +88,11 @@
     SkPath fPath[6];
     bool fShowHairline;
     bool fOnce;
-    
-	PathView() {
+
+    PathView() {
         fOnce = false;
     }
-    
+
     void init() {
         if (fOnce) {
             return;
@@ -103,47 +103,47 @@
         test_cubic2();
 
         fShowHairline = false;
-        
+
         fDStroke = 1;
         fStroke = 10;
         fMinStroke = 10;
         fMaxStroke = 180;
 
         const int V = 85;
-        
+
         fPath[0].moveTo(SkIntToScalar(40), SkIntToScalar(70));
         fPath[0].lineTo(SkIntToScalar(70), SkIntToScalar(70) + SK_Scalar1/1);
         fPath[0].lineTo(SkIntToScalar(110), SkIntToScalar(70));
-        
+
         fPath[1].moveTo(SkIntToScalar(40), SkIntToScalar(70));
         fPath[1].lineTo(SkIntToScalar(70), SkIntToScalar(70) - SK_Scalar1/1);
         fPath[1].lineTo(SkIntToScalar(110), SkIntToScalar(70));
-        
+
         fPath[2].moveTo(SkIntToScalar(V), SkIntToScalar(V));
         fPath[2].lineTo(SkIntToScalar(50), SkIntToScalar(V));
         fPath[2].lineTo(SkIntToScalar(50), SkIntToScalar(50));
-        
+
         fPath[3].moveTo(SkIntToScalar(50), SkIntToScalar(50));
         fPath[3].lineTo(SkIntToScalar(50), SkIntToScalar(V));
         fPath[3].lineTo(SkIntToScalar(V), SkIntToScalar(V));
-        
+
         fPath[4].moveTo(SkIntToScalar(50), SkIntToScalar(50));
         fPath[4].lineTo(SkIntToScalar(50), SkIntToScalar(V));
         fPath[4].lineTo(SkIntToScalar(52), SkIntToScalar(50));
-        
+
         fPath[5].moveTo(SkIntToScalar(52), SkIntToScalar(50));
         fPath[5].lineTo(SkIntToScalar(50), SkIntToScalar(V));
         fPath[5].lineTo(SkIntToScalar(50), SkIntToScalar(50));
-        
+
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
     void nextStroke() {
         fStroke += fDStroke;
         if (fStroke > fMaxStroke || fStroke < fMinStroke)
             fDStroke = -fDStroke;
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -153,10 +153,10 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawPath(SkCanvas* canvas, const SkPath& path, SkPaint::Join j) {
         SkPaint paint;
-        
+
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeJoin(j);
@@ -164,19 +164,19 @@
 
         if (fShowHairline) {
             SkPath  fill;
-            
-            paint.getFillPath(path, &fill);            
+
+            paint.getFillPath(path, &fill);
             paint.setStrokeWidth(0);
             canvas->drawPath(fill, paint);
         } else {
             canvas->drawPath(path, paint);
         }
-        
+
         paint.setColor(SK_ColorRED);
         paint.setStrokeWidth(0);
         canvas->drawPath(path, paint);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         this->init();
         canvas->translate(SkIntToScalar(50), SkIntToScalar(50));
@@ -194,20 +194,20 @@
                 canvas->translate(SkIntToScalar(200), 0);
             }
             canvas->restore();
-            
+
             canvas->translate(0, SkIntToScalar(200));
         }
-        
+
         this->nextStroke();
         this->inval(NULL);
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         fShowHairline = !fShowHairline;
         this->inval(NULL);
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SamplePathClip.cpp b/samplecode/SamplePathClip.cpp
index aa392da..b999c39 100644
--- a/samplecode/SamplePathClip.cpp
+++ b/samplecode/SamplePathClip.cpp
@@ -26,15 +26,15 @@
     SkRect fOval;
     SkPoint fCenter;
 
-	PathClipView() {
+    PathClipView() {
         fOval.set(0, 0, SkIntToScalar(200), SkIntToScalar(50));
         fCenter.set(SkIntToScalar(250), SkIntToScalar(250));
-        
+
 //        test_ats();
     }
-    
+
     virtual ~PathClipView() {}
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -44,14 +44,14 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkRect oval = fOval;
         oval.offset(fCenter.fX - oval.centerX(), fCenter.fY - oval.centerY());
-        
+
         SkPaint p;
         p.setAntiAlias(true);
-        
+
         p.setStyle(SkPaint::kStroke_Style);
         canvas->drawOval(oval, p);
 
@@ -59,11 +59,11 @@
         r.set(SkIntToScalar(200), SkIntToScalar(200),
               SkIntToScalar(300), SkIntToScalar(300));
         canvas->clipRect(r);
-        
+
         p.setStyle(SkPaint::kFill_Style);
         p.setColor(SK_ColorRED);
         canvas->drawRect(r, p);
-     
+
         p.setColor(0x800000FF);
         r.set(SkIntToScalar(150), SkIntToScalar(10),
               SkIntToScalar(250), SkIntToScalar(400));
@@ -73,13 +73,13 @@
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         return new Click(this);
     }
-        
+
     virtual bool onClick(Click* click) {
         fCenter.set(click->fCurr.fX, click->fCurr.fY);
         this->inval(NULL);
         return false;
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SamplePathEffects.cpp b/samplecode/SamplePathEffects.cpp
index 1317b82..35d3260 100644
--- a/samplecode/SamplePathEffects.cpp
+++ b/samplecode/SamplePathEffects.cpp
@@ -39,7 +39,7 @@
     path.offset(SkIntToScalar(-6), 0);
 
     SkPathEffect* outer = new SkPath1DPathEffect(path, SkIntToScalar(12), gPhase, SkPath1DPathEffect::kRotate_Style);
-    
+
     if (flags == 2)
         return outer;
 
@@ -79,18 +79,18 @@
         SkPaint paint;
         paint.setAntiAlias(true);
 
-#if 0        
+#if 0
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SK_Scalar1*4);
         this->addLayer(paint);
-    
+
         paint.setStrokeWidth(SK_Scalar1*1);
         paint.setXfermode(SkXfermode::kClear_Mode);
         this->addLayer(paint);
 #else
         paint.setAlpha(0x66);
         this->addLayer(paint, SkIntToScalar(4), SkIntToScalar(4));
-    
+
         paint.setAlpha(0xFF);
         this->addLayer(paint);
 #endif
@@ -101,13 +101,13 @@
     SkPath  fPath;
     SkPoint fClickPt;
 public:
-	PathEffectView() {
+    PathEffectView() {
         SkRandom    rand;
         int         steps = 20;
         SkScalar    dist = SkIntToScalar(400);
         SkScalar    x = SkIntToScalar(20);
         SkScalar    y = SkIntToScalar(50);
-        
+
         fPath.moveTo(x, y);
         for (int i = 0; i < steps; i++) {
             x += dist/steps;
@@ -126,12 +126,12 @@
             oval.offset(x, 0);
             fPath.addRoundRect(oval, SkIntToScalar(8), SkIntToScalar(8));
         }
-        
+
         fClickPt.set(SkIntToScalar(200), SkIntToScalar(200));
-        
+
         this->setBGColor(0xFFDDDDDD);
     }
-	
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -141,37 +141,37 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         gPhase -= SampleCode::GetAnimSecondsDelta() * 40;
         this->inval(NULL);
-        
+
         SkPaint paint;
-        
+
 #if 0
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkIntToScalar(5));
         canvas->drawPath(fPath, paint);
         paint.setStrokeWidth(0);
-        
+
         paint.setColor(SK_ColorWHITE);
         paint.setPathEffect(make_pe(1))->unref();
         canvas->drawPath(fPath, paint);
 #endif
-        
+
         canvas->translate(0, SkIntToScalar(50));
-        
+
         paint.setColor(SK_ColorBLUE);
         paint.setPathEffect(make_pe(2))->unref();
         canvas->drawPath(fPath, paint);
-        
+
         canvas->translate(0, SkIntToScalar(50));
-        
+
         paint.setARGB(0xFF, 0, 0xBB, 0);
         paint.setPathEffect(make_pe(3))->unref();
         canvas->drawPath(fPath, paint);
-        
+
         canvas->translate(0, SkIntToScalar(50));
 
         paint.setARGB(0xFF, 0, 0, 0);
@@ -179,7 +179,7 @@
         paint.setRasterizer(new testrast)->unref();
         canvas->drawPath(fPath, paint);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SamplePathFill.cpp b/samplecode/SamplePathFill.cpp
index bcc00d3..9c7cdc6 100644
--- a/samplecode/SamplePathFill.cpp
+++ b/samplecode/SamplePathFill.cpp
@@ -58,7 +58,7 @@
     const SkScalar x0 = x;
     const SkScalar dx = SK_Scalar1 * 5;
     const SkScalar dy = SK_Scalar1 * 10;
-    
+
     path->moveTo(x, y);
     for (int i = 0; i < 32; i++) {
         x += dx;
diff --git a/samplecode/SamplePictFile.cpp b/samplecode/SamplePictFile.cpp
index b24f908..555732f 100644
--- a/samplecode/SamplePictFile.cpp
+++ b/samplecode/SamplePictFile.cpp
@@ -31,7 +31,7 @@
 class PictFileView : public SampleView {
     SkString    fFilename;
     SkPicture*  fPicture;
-    
+
     static SkPicture* LoadPicture(const char path[]) {
         SkPicture* pic = NULL;
 
@@ -55,11 +55,11 @@
     PictFileView(const char name[] = NULL) : fFilename(name) {
         fPicture = NULL;
     }
-    
+
     virtual ~PictFileView() {
         SkSafeUnref(fPicture);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -71,7 +71,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         if (!fPicture) {
             fPicture = LoadPicture(fFilename.c_str());
@@ -80,7 +80,7 @@
             canvas->drawPicture(*fPicture);
         }
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SamplePicture.cpp b/samplecode/SamplePicture.cpp
index 7317fbe..17a0d75 100644
--- a/samplecode/SamplePicture.cpp
+++ b/samplecode/SamplePicture.cpp
@@ -35,7 +35,7 @@
 static SkBitmap load_bitmap() {
     SkStream* stream = new SkFILEStream("/skimages/sesame_street_ensemble-hp.jpg");
     SkAutoUnref aur(stream);
-    
+
     SkBitmap bm;
     if (SkImageDecoder::DecodeStream(stream, &bm, SkBitmap::kNo_Config,
                                      SkImageDecoder::kDecodeBounds_Mode)) {
@@ -66,7 +66,7 @@
         SkCanvas* canvas = fPicture->beginRecording(100, 100);
         SkPaint paint;
         paint.setAntiAlias(true);
-        
+
         canvas->drawBitmap(fBitmap, 0, 0, NULL);
 
         drawCircle(canvas, 50, SK_ColorBLACK);
@@ -83,11 +83,11 @@
         // the other references to fSubPicture
         fSubPicture->unref();
     }
-    
+
     virtual ~PictureView() {
         fPicture->unref();
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -110,7 +110,7 @@
         const char afterStr[] = "after circle";
 
         paint.setAntiAlias(true);
-    
+
         paint.setColor(SK_ColorRED);
         canvas->drawData(beforeStr, sizeof(beforeStr));
         canvas->drawCircle(SkIntToScalar(50), SkIntToScalar(50),
@@ -120,7 +120,7 @@
         paint.setTextSize(SkIntToScalar(40));
         canvas->drawText("Picture", 7, SkIntToScalar(50), SkIntToScalar(62),
                          paint);
-        
+
     }
 
     virtual void onDrawContent(SkCanvas* canvas) {
@@ -131,7 +131,7 @@
 
         drawSomething(pict->beginRecording(100, 100));
         pict->endRecording();
-    
+
         canvas->save();
         canvas->translate(SkIntToScalar(300), SkIntToScalar(50));
         canvas->scale(-SK_Scalar1, -SK_Scalar1);
@@ -145,7 +145,7 @@
         canvas->translate(0, -SkIntToScalar(50));
         canvas->drawPicture(*pict);
         canvas->restore();
-        
+
         canvas->save();
         canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
         canvas->scale(-SK_Scalar1, SK_Scalar1);
@@ -158,9 +158,9 @@
             SkDumpCanvas dumpCanvas(&dumper);
             dumpCanvas.drawPicture(*pict);
         }
-        
+
         // test that we can re-record a subpicture, and see the results
-        
+
         SkRandom rand(SampleCode::GetAnimTime());
         canvas->translate(SkIntToScalar(10), SkIntToScalar(250));
         drawCircle(fSubPicture->beginRecording(50, 50), 25,
@@ -168,14 +168,14 @@
         canvas->drawPicture(*fPicture);
         delayInval(500);
     }
-    
+
 private:
     #define INVAL_ALL_TYPE  "inval-all"
-    
+
     void delayInval(SkMSec delay) {
         (new SkEvent(INVAL_ALL_TYPE, this->getSinkID()))->postDelay(delay);
     }
-    
+
     virtual bool onEvent(const SkEvent& evt) {
         if (evt.isType(INVAL_ALL_TYPE)) {
             this->inval(NULL);
diff --git a/samplecode/SamplePoints.cpp b/samplecode/SamplePoints.cpp
index 717cd8c..705a7b1 100644
--- a/samplecode/SamplePoints.cpp
+++ b/samplecode/SamplePoints.cpp
@@ -29,7 +29,7 @@
 
 class PointsView : public SampleView {
 public:
-	PointsView() {}
+    PointsView() {}
 
 protected:
     // overrides from SkEventSink
diff --git a/samplecode/SamplePolyToPoly.cpp b/samplecode/SamplePolyToPoly.cpp
index c12b402..da527c2 100644
--- a/samplecode/SamplePolyToPoly.cpp
+++ b/samplecode/SamplePolyToPoly.cpp
@@ -17,7 +17,7 @@
 
 class PolyToPolyView : public SampleView {
 public:
-	PolyToPolyView() {
+    PolyToPolyView() {
         // tests
         {
             SkPoint src[] = { { 0, 0 },
diff --git a/samplecode/SampleRegion.cpp b/samplecode/SampleRegion.cpp
index 0525f46..269fc6a 100644
--- a/samplecode/SampleRegion.cpp
+++ b/samplecode/SampleRegion.cpp
@@ -26,13 +26,13 @@
 
     SkScalar dx = 20;
     SkScalar dy = 20;
-    
+
     SkPath path;
-    path.addRect(0.0f, 0.0f, 
-                 SkIntToScalar(width), SkIntToScalar(height), 
+    path.addRect(0.0f, 0.0f,
+                 SkIntToScalar(width), SkIntToScalar(height),
                  SkPath::kCW_Direction);
     SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
-    
+
     SkCanvas c(bitmap);
     c.translate(dx, dy);
 
@@ -57,7 +57,7 @@
     // Need a bounds for the text
     SkRect bounds;
     SkPaint::FontMetrics fm;
-    
+
     paint.getFontMetrics(&fm);
     bounds.set(x, y + fm.fTop, x + paint.measureText(text, len), y + fm.fBottom);
 
@@ -92,7 +92,7 @@
     SkPaint paint;
     paint.setAntiAlias(true);
     paint.setTextSize(20);
-    
+
     const char* str = "Hamburgefons";
     size_t len = strlen(str);
     SkScalar x = 20;
@@ -126,7 +126,7 @@
                      size_t count, int32_t runs[]) {
     SkIRect r;
     r.set(left, top, right, bottom);
-    
+
     rgn->debugSetRuns(runs, count);
     SkASSERT(rgn->getBounds() == r);
 }
@@ -156,7 +156,7 @@
         0x7fffffff
     };
     make_rgn(rb, 112, 182, 240, 260, SK_ARRAY_COUNT(dataB), dataB);
-    
+
     rc->op(*ra, *rb, SkRegion::kUnion_Op);
 }
 #endif
@@ -184,7 +184,7 @@
                       const SkPaint& paint) {
     SkRegion scaled;
     scale_rgn(&scaled, rgn, 0.5f);
-    
+
     SkRegion::Iterator  iter(rgn);
 
     for (; !iter.done(); iter.next())
@@ -197,7 +197,7 @@
 
 class RegionView : public SampleView {
 public:
-	RegionView() {
+    RegionView() {
         fBase.set(100, 100, 150, 150);
         fRect = fBase;
         fRect.inset(5, 5);
@@ -227,7 +227,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     static void drawstr(SkCanvas* canvas, const char text[], const SkPoint& loc,
                         bool hilite) {
         SkPaint paint;
@@ -240,7 +240,7 @@
     void drawPredicates(SkCanvas* canvas, const SkPoint pts[]) {
         SkRegion rgn;
         build_base_rgn(&rgn);
-        
+
         drawstr(canvas, "Intersects", pts[0], rgn.intersects(fRect));
         drawstr(canvas, "Contains", pts[1], rgn.contains(fRect));
     }
@@ -248,11 +248,11 @@
     void drawOrig(SkCanvas* canvas, bool bg) {
         SkRect      r;
         SkPaint     paint;
-        
+
         paint.setStyle(SkPaint::kStroke_Style);
         if (bg)
             paint.setColor(0xFFBBBBBB);
-        
+
         SkRegion rgn;
         build_base_rgn(&rgn);
         paint_rgn(canvas, rgn, paint);
@@ -260,29 +260,29 @@
         r.set(fRect);
         canvas->drawRect(r, paint);
     }
-    
+
     void drawRgnOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) {
         SkRegion    rgn;
 
         this->build_rgn(&rgn, op);
-        
+
         {
             SkRegion tmp, tmp2(rgn);
-            
+
             tmp = tmp2;
             tmp.translate(5, -3);
-            
+
             {
                 char    buffer[1000];
                 size_t  size = tmp.writeToMemory(NULL);
                 SkASSERT(size <= sizeof(buffer));
                 size_t  size2 = tmp.writeToMemory(buffer);
                 SkASSERT(size == size2);
-                
+
                 SkRegion    tmp3;
                 size2 = tmp3.readFromMemory(buffer);
                 SkASSERT(size == size2);
-                
+
                 SkASSERT(tmp3 == tmp);
             }
 
@@ -302,7 +302,7 @@
         paint.setColor(color);
         paint_rgn(canvas, rgn, paint);
     }
-    
+
     void drawPathOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) {
         SkRegion    rgn;
         SkPath      path;
@@ -321,7 +321,7 @@
         paint.setStyle(SkPaint::kStroke_Style);
         canvas->drawPath(path, paint);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         if (false) { // avoid bit rot, suppress warning
             test_strokerect(canvas);
@@ -335,10 +335,10 @@
         if (true) {
             SkRegion a, b, c;
             test_union_bug_1505668(&a, &b, &c);
-            
+
             if (false) {    // draw the result of the test
                 SkPaint paint;
-                
+
                 canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
                 paint.setColor(SK_ColorRED);
                 paint_rgn(canvas, a, paint);
@@ -377,7 +377,7 @@
             canvas->translate(SkIntToScalar(200), 0);
             this->drawRgnOped(canvas, SkRegion::kUnion_Op, SK_ColorBLACK);
         canvas->restore();
-        
+
         canvas->translate(0, SkIntToScalar(200));
 
         for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) {
@@ -389,25 +389,25 @@
             canvas->translate(0, SkIntToScalar(200));
             this->drawPathOped(canvas, gOps[op].fOp, gOps[op].fColor);
             canvas->restore();
-            
+
             canvas->translate(SkIntToScalar(200), 0);
         }
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         return fRect.contains(SkScalarRound(x), SkScalarRound(y)) ? new Click(this) : NULL;
     }
-    
+
     virtual bool onClick(Click* click) {
         fRect.offset(click->fICurr.fX - click->fIPrev.fX,
                      click->fICurr.fY - click->fIPrev.fY);
         this->inval(NULL);
         return true;
     }
-    
+
 private:
     SkIRect    fBase, fRect;
-    
+
     typedef SampleView INHERITED;
 };
 
diff --git a/samplecode/SampleRepeatTile.cpp b/samplecode/SampleRepeatTile.cpp
index 16a23ad..54c79ef 100644
--- a/samplecode/SampleRepeatTile.cpp
+++ b/samplecode/SampleRepeatTile.cpp
@@ -38,13 +38,13 @@
     SkBitmap bm;
     make_bitmap(&bm);
 
-    SkShader* shader = SkShader::CreateBitmapShader(bm, tm, tm);    
+    SkShader* shader = SkShader::CreateBitmapShader(bm, tm, tm);
     paint->setShader(shader)->unref();
 }
 
 class RepeatTileView : public SampleView {
 public:
-	RepeatTileView() {
+    RepeatTileView() {
         this->setBGColor(SK_ColorGRAY);
     }
 
@@ -57,27 +57,27 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         make_paint(&paint, SkShader::kRepeat_TileMode);
-        
+
 //        canvas->scale(SK_Scalar1*2, SK_Scalar1);
         canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
         canvas->drawPaint(paint);
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         this->inval(NULL);
-        
+
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
     virtual bool onClick(Click* click) {
         return this->INHERITED::onClick(click);
     }
 
-	virtual bool handleKey(SkKey key) {
+    virtual bool handleKey(SkKey key) {
         this->inval(NULL);
         return true;
     }
diff --git a/samplecode/SampleShaderText.cpp b/samplecode/SampleShaderText.cpp
index eb92efd..cada977 100644
--- a/samplecode/SampleShaderText.cpp
+++ b/samplecode/SampleShaderText.cpp
@@ -108,7 +108,7 @@
 
 class ShaderTextView : public SampleView {
 public:
-	ShaderTextView() {
+    ShaderTextView() {
         this->setBGColor(0xFFDDDDDD);
     }
 
@@ -175,8 +175,8 @@
 
         SkPath path;
         path.arcTo(SkRect::MakeXYWH(SkIntToScalar(-40), SkIntToScalar(15),
-                                    SkIntToScalar(300), SkIntToScalar(90)), 
-                                    SkIntToScalar(225), SkIntToScalar(90), 
+                                    SkIntToScalar(300), SkIntToScalar(90)),
+                                    SkIntToScalar(225), SkIntToScalar(90),
                                     false);
         path.close();
 
diff --git a/samplecode/SampleShaders.cpp b/samplecode/SampleShaders.cpp
index 99cd680..78b63a3 100644
--- a/samplecode/SampleShaders.cpp
+++ b/samplecode/SampleShaders.cpp
@@ -52,7 +52,7 @@
     SkShader*   fShader;
     SkBitmap    fBitmap;
 
-	ShaderView() {
+    ShaderView() {
         SkImageDecoder::DecodeFile("/skimages/logo.gif", &fBitmap);
 
         SkPoint pts[2];
diff --git a/samplecode/SampleSkLayer.cpp b/samplecode/SampleSkLayer.cpp
index bff6034..e7c0ddb 100644
--- a/samplecode/SampleSkLayer.cpp
+++ b/samplecode/SampleSkLayer.cpp
@@ -79,7 +79,7 @@
     m0.setScale(2,3,4);
     m0.preTranslate(5, 6, 7);
     test_inv("preTranslate", m0);
-    
+
     m0.setScale(2, 4, 6);
     m0.postScale(SkDoubleToMScalar(0.5));
     test_inv("scale/postscale to 1,2,3", m0);
@@ -108,7 +108,7 @@
     m0.setTranslate(3, 4, 5);
     test_33(m0, 1, 0, 3, 0, 1, 4);
 }
-    
+
 ///////////////////////////////////////////////////////////////////////////////
 
 static void dump_layers(const SkLayer* layer, int tab = 0) {
@@ -154,7 +154,7 @@
     SkLayer* fRootLayer;
     SkLayer* fLastChild;
 public:
-	SkLayerView() {
+    SkLayerView() {
         test44();
         static const int W = 600;
         static const int H = 440;
@@ -179,7 +179,7 @@
             child->setPosition(gData[i].fPosX, gData[i].fPosY);
             fRootLayer->addChild(child)->unref();
         }
-        
+
         SkLayer* child = new TestLayer(0xFFDD8844);
         child->setSize(120, 80);
         child->setPosition(fRootLayer->getWidth()/2 - child->getWidth()/2,
@@ -192,7 +192,7 @@
         }
         fLastChild = child;
         fRootLayer->addChild(child)->unref();
-        
+
         if (false) {
             SkMatrix matrix;
             matrix.setScale(0.5, 0.5);
@@ -201,11 +201,11 @@
 
 //        dump_layers(fRootLayer);
     }
-    
+
     virtual ~SkLayerView() {
         SkSafeUnref(fRootLayer);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -215,13 +215,13 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorWHITE);
-        
+
         canvas->translate(20, 20);
         fRootLayer->draw(canvas);
-        
+
         // visual test of getLocalTransform
         if (true) {
             SkMatrix matrix;
@@ -234,7 +234,7 @@
             canvas->drawRect(SkRect::MakeSize(fLastChild->getSize()), paint);
         }
     }
-    
+
 private:
     typedef SkView INHERITED;
 };
diff --git a/samplecode/SampleSlides.cpp b/samplecode/SampleSlides.cpp
index 54a9cf9..574564f 100644
--- a/samplecode/SampleSlides.cpp
+++ b/samplecode/SampleSlides.cpp
@@ -77,7 +77,7 @@
     path.close();
     path.offset(SkIntToScalar(-6), 0);
     scale(&path, SkFloatToScalar(1.5f));
-    
+
     paint->setPathEffect(new SkPath1DPathEffect(path, SkIntToScalar(21), 0,
                                 SkPath1DPathEffect::kRotate_Style))->unref();
     compose_pe(paint);
@@ -101,7 +101,7 @@
 
     SkPath path;
     path.addCircle(0, 0, SkIntToScalar(5));
-    
+
     return new SkPath2DPathEffect(m, path);
 }
 
@@ -137,7 +137,7 @@
     path.addOval(r, SkPath::kCW_Direction);
     r.inset(50, 50);
     path.addRect(r, SkPath::kCCW_Direction);
-    
+
     canvas->translate(320, 20);
     for (i = 0; i < SK_ARRAY_COUNT(gPE2); i++) {
         gPE2[i](&paint);
@@ -226,7 +226,7 @@
     SkPaint paint;
     paint.setAntiAlias(true);
     paint.setDither(true);
-    
+
     canvas->translate(SkIntToScalar(20), SkIntToScalar(10));
     for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
         canvas->save();
@@ -262,30 +262,30 @@
     SkPaint paint;
     paint.setAntiAlias(true);
     paint.setTextSize(40);
-    
+
     paint.setStyle(SkPaint::kStroke_Style);
     canvas->drawPath(path, paint);
     paint.setStyle(SkPaint::kFill_Style);
-    
+
     SkScalar x = 50;
     paint.setColor(0xFF008800);
     canvas->drawTextOnPathHV(text, len, path,
                              x, paint.getTextSize()*2/3, paint);
     paint.setColor(SK_ColorRED);
     canvas->drawTextOnPathHV(text, len, path,
-                             x + 60, 0, paint);    
+                             x + 60, 0, paint);
     paint.setColor(SK_ColorBLUE);
     canvas->drawTextOnPathHV(text, len, path,
                              x + 120, -paint.getTextSize()*2/3, paint);
 
     path.offset(0, 200);
     paint.setTextAlign(SkPaint::kRight_Align);
-    
+
     text = "Matrices";
     len = strlen(text);
     SkScalar pathLen = getpathlen(path);
     SkMatrix matrix;
-    
+
     paint.setColor(SK_ColorBLACK);
     paint.setStyle(SkPaint::kStroke_Style);
     canvas->drawPath(path, paint);
@@ -293,16 +293,16 @@
 
     paint.setTextSize(50);
     canvas->drawTextOnPath(text, len, path, NULL, paint);
-    
+
     paint.setColor(SK_ColorRED);
     matrix.setScale(-SK_Scalar1, SK_Scalar1);
     matrix.postTranslate(pathLen, 0);
     canvas->drawTextOnPath(text, len, path, &matrix, paint);
-    
+
     paint.setColor(SK_ColorBLUE);
     matrix.setScale(SK_Scalar1, -SK_Scalar1);
     canvas->drawTextOnPath(text, len, path, &matrix, paint);
-    
+
     paint.setColor(0xFF008800);
     matrix.setScale(-SK_Scalar1, -SK_Scalar1);
     matrix.postTranslate(pathLen, 0);
@@ -318,7 +318,7 @@
 
 static SkShader* make_shader0(SkIPoint* size) {
     SkBitmap    bm;
-    
+
     SkImageDecoder::DecodeFile("/skimages/logo.gif", &bm);
     size->set(bm.width(), bm.height());
     return SkShader::CreateBitmapShader(bm, SkShader::kClamp_TileMode,
@@ -339,7 +339,7 @@
     int                     fCount;
     SkPoint*                fVerts;
     SkPoint*                fTexs;
-    
+
     Rec() : fCount(0), fVerts(NULL), fTexs(NULL) {}
     ~Rec() { delete[] fVerts; delete[] fTexs; }
 };
@@ -347,11 +347,11 @@
 static void make_tris(Rec* rec) {
     int n = 10;
     SkRandom    rand;
-    
+
     rec->fMode = SkCanvas::kTriangles_VertexMode;
     rec->fCount = n * 3;
     rec->fVerts = new SkPoint[rec->fCount];
-    
+
     for (int i = 0; i < n; i++) {
         SkPoint* v = &rec->fVerts[i*3];
         for (int j = 0; j < 3; j++) {
@@ -364,15 +364,15 @@
     const SkScalar tx = SkIntToScalar(texWidth);
     const SkScalar ty = SkIntToScalar(texHeight);
     const int n = 24;
-    
+
     rec->fMode = SkCanvas::kTriangleFan_VertexMode;
     rec->fCount = n + 2;
     rec->fVerts = new SkPoint[rec->fCount];
     rec->fTexs  = new SkPoint[rec->fCount];
-    
+
     SkPoint* v = rec->fVerts;
     SkPoint* t = rec->fTexs;
-    
+
     v[0].set(0, 0);
     t[0].set(0, 0);
     for (int i = 0; i < n; i++) {
@@ -383,7 +383,7 @@
     }
     v[n+1] = v[1];
     t[n+1].set(tx, ty);
-    
+
     SkMatrix m;
     m.setScale(SkIntToScalar(100), SkIntToScalar(100));
     m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
@@ -394,30 +394,30 @@
     const SkScalar tx = SkIntToScalar(texWidth);
     const SkScalar ty = SkIntToScalar(texHeight);
     const int n = 24;
-    
+
     rec->fMode = SkCanvas::kTriangleStrip_VertexMode;
     rec->fCount = 2 * (n + 1);
     rec->fVerts = new SkPoint[rec->fCount];
     rec->fTexs  = new SkPoint[rec->fCount];
-    
+
     SkPoint* v = rec->fVerts;
     SkPoint* t = rec->fTexs;
-    
+
     for (int i = 0; i < n; i++) {
         SkScalar cos;
         SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos);
         v[i*2 + 0].set(cos/2, sin/2);
         v[i*2 + 1].set(cos, sin);
-        
+
         t[i*2 + 0].set(tx * i / n, ty);
         t[i*2 + 1].set(tx * i / n, 0);
     }
     v[2*n + 0] = v[0];
     v[2*n + 1] = v[1];
-    
+
     t[2*n + 0].set(tx, ty);
     t[2*n + 1].set(tx, 0);
-    
+
     SkMatrix m;
     m.setScale(SkIntToScalar(100), SkIntToScalar(100));
     m.postTranslate(SkIntToScalar(110), SkIntToScalar(110));
@@ -427,7 +427,7 @@
 static void mesh_slide(SkCanvas* canvas) {
     Rec fRecs[3];
     SkIPoint    size;
-    
+
     SkShader* fShader0 = make_shader0(&size);
     SkShader* fShader1 = make_shader1(size);
 
@@ -441,30 +441,30 @@
     SkPaint paint;
     paint.setDither(true);
     paint.setFilterBitmap(true);
-    
+
     for (size_t i = 0; i < SK_ARRAY_COUNT(fRecs); i++) {
         canvas->save();
-        
+
         paint.setShader(NULL);
         canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                              fRecs[i].fVerts, fRecs[i].fTexs,
                              NULL, NULL, NULL, 0, paint);
-        
+
         canvas->translate(SkIntToScalar(210), 0);
-        
+
         paint.setShader(fShader0);
         canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                              fRecs[i].fVerts, fRecs[i].fTexs,
                              NULL, NULL, NULL, 0, paint);
-        
+
         canvas->translate(SkIntToScalar(210), 0);
-        
+
         paint.setShader(fShader1);
         canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                              fRecs[i].fVerts, fRecs[i].fTexs,
                              NULL, NULL, NULL, 0, paint);
         canvas->restore();
-        
+
         canvas->translate(0, SkIntToScalar(250));
     }
 }
@@ -480,12 +480,12 @@
     p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(3),
                                              SkBlurMaskFilter::kNormal_BlurStyle))->unref();
     rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
-    
+
     p.setMaskFilter(NULL);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
     rast->addLayer(p);
-    
+
     p.setAlpha(0x11);
     p.setStyle(SkPaint::kFill_Style);
     p.setXfermodeMode(SkXfermode::kSrc_Mode);
@@ -495,7 +495,7 @@
 static void r1(SkLayerRasterizer* rast, SkPaint& p)
 {
     rast->addLayer(p);
-    
+
     p.setAlpha(0x40);
     p.setXfermodeMode(SkXfermode::kSrc_Mode);
     p.setStyle(SkPaint::kStroke_Style);
@@ -508,7 +508,7 @@
     p.setStyle(SkPaint::kStrokeAndFill_Style);
     p.setStrokeWidth(SK_Scalar1*4);
     rast->addLayer(p);
-    
+
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1*3/2);
     p.setXfermodeMode(SkXfermode::kClear_Mode);
@@ -520,7 +520,7 @@
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1*3);
     rast->addLayer(p);
-    
+
     p.setAlpha(0x20);
     p.setStyle(SkPaint::kFill_Style);
     p.setXfermodeMode(SkXfermode::kSrc_Mode);
@@ -531,11 +531,11 @@
 {
     p.setAlpha(0x60);
     rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
-    
+
     p.setAlpha(0xFF);
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rast->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
-    
+
     p.setXfermode(NULL);
     rast->addLayer(p);
 }
@@ -545,7 +545,7 @@
 static void r5(SkLayerRasterizer* rast, SkPaint& p)
 {
     rast->addLayer(p);
-    
+
     p.setPathEffect(new SkDiscretePathEffect(SK_Scalar1*4, SK_Scalar1*3))->unref();
     p.setXfermodeMode(SkXfermode::kSrcOut_Mode);
     rast->addLayer(p);
@@ -554,7 +554,7 @@
 static void r6(SkLayerRasterizer* rast, SkPaint& p)
 {
     rast->addLayer(p);
-    
+
     p.setAntiAlias(false);
     SkLayerRasterizer* rast2 = new SkLayerRasterizer;
     r5(rast2, p);
@@ -583,14 +583,14 @@
 static void r8(SkLayerRasterizer* rast, SkPaint& p)
 {
     rast->addLayer(p);
-    
+
     SkMatrix    lattice;
     lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
     lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
     p.setPathEffect(MakeDotEffect(SK_Scalar1*2, lattice))->unref();
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rast->addLayer(p);
-    
+
     p.setPathEffect(NULL);
     p.setXfermode(NULL);
     p.setStyle(SkPaint::kStroke_Style);
@@ -602,34 +602,34 @@
 public:
     Line2DPathEffect(SkScalar width, const SkMatrix& matrix)
     : Sk2DPathEffect(matrix), fWidth(width) {}
-    
-	virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec) SK_OVERRIDE {
+
+    virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec) SK_OVERRIDE {
         if (this->INHERITED::filterPath(dst, src, rec)) {
             rec->setStrokeStyle(fWidth);
             return true;
         }
         return false;
     }
-    
+
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Line2DPathEffect)
 protected:
-	virtual void nextSpan(int u, int v, int ucount, SkPath* dst)
+    virtual void nextSpan(int u, int v, int ucount, SkPath* dst)
     {
         if (ucount > 1)
         {
-            SkPoint	src[2], dstP[2];
-            
+            SkPoint    src[2], dstP[2];
+
             src[0].set(SkIntToScalar(u) + SK_ScalarHalf,
                        SkIntToScalar(v) + SK_ScalarHalf);
             src[1].set(SkIntToScalar(u+ucount) + SK_ScalarHalf,
                        SkIntToScalar(v) + SK_ScalarHalf);
             this->getMatrix().mapPoints(dstP, src, 2);
-            
+
             dst->moveTo(dstP[0]);
             dst->lineTo(dstP[1]);
         }
     }
-    
+
     Line2DPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer)
     {
         fWidth = buffer.readScalar();
@@ -639,24 +639,24 @@
         this->INHERITED::flatten(buffer);
         buffer.writeScalar(fWidth);
     }
-    
+
 private:
     SkScalar fWidth;
-    
+
     typedef Sk2DPathEffect INHERITED;
 };
 
 static void r9(SkLayerRasterizer* rast, SkPaint& p)
 {
     rast->addLayer(p);
-    
+
     SkMatrix    lattice;
     lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
     lattice.postRotate(SkIntToScalar(30), 0, 0);
     p.setPathEffect(new Line2DPathEffect(SK_Scalar1*2, lattice))->unref();
     p.setXfermodeMode(SkXfermode::kClear_Mode);
     rast->addLayer(p);
-    
+
     p.setPathEffect(NULL);
     p.setXfermode(NULL);
     p.setStyle(SkPaint::kStroke_Style);
@@ -670,11 +670,11 @@
     r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
 };
 
-static void apply_shader(SkPaint* paint, int index) {    
+static void apply_shader(SkPaint* paint, int index) {
     raster_proc proc = gRastProcs[index];
     SkPaint p;
     SkLayerRasterizer*  rast = new SkLayerRasterizer;
-    
+
     p.setAntiAlias(true);
     proc(rast, p);
     paint->setRasterizer(rast)->unref();
@@ -723,7 +723,7 @@
     SlideView() {
         fOnce = false;
     }
-    
+
     void init() {
         if (fOnce) {
             return;
@@ -731,7 +731,7 @@
         fOnce = true;
 
         fIndex = 0;
-        
+
         SkBitmap bm;
         bm.setConfig(SkBitmap::kARGB_8888_Config, 1024, 768);
         bm.allocPixels();
@@ -749,7 +749,7 @@
         }
         this->setBGColor(BG_COLOR);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -759,7 +759,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         this->init();
         gProc[fIndex](canvas);
diff --git a/samplecode/SampleSpiral.cpp b/samplecode/SampleSpiral.cpp
index 7d14484..be6e728 100644
--- a/samplecode/SampleSpiral.cpp
+++ b/samplecode/SampleSpiral.cpp
@@ -11,10 +11,10 @@
 
 class SpiralView : public SampleView {
 public:
-	SpiralView() {
+    SpiralView() {
         this->setBGColor(0xFFDDDDDD);
-	}
-	
+    }
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt)  {
@@ -24,21 +24,21 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-	
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkScalarHalf(SkIntToScalar(3)));
         paint.setStyle(SkPaint::kFill_Style);
-        
+
         SkRect r;
         SkScalar l,t,x,y;
         l = SampleCode::GetAnimScalar(SkIntToScalar(10),
                                       SkIntToScalar(400));
         t = SampleCode::GetAnimScalar(SkIntToScalar(5),
                                       SkIntToScalar(200));
-        
+
         canvas->translate(320,240);
         for (int i = 0; i < 35; i++) {
             paint.setColor(0xFFF00FF0 - i * 0x04000000);
@@ -52,7 +52,7 @@
 
         this->inval(NULL);
     }
-	
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleStrokePath.cpp b/samplecode/SampleStrokePath.cpp
index 1fb5fea..ca5135d 100644
--- a/samplecode/SampleStrokePath.cpp
+++ b/samplecode/SampleStrokePath.cpp
@@ -17,14 +17,14 @@
 static void test_huge_stroke(SkCanvas* canvas) {
     SkRect srcR = { 0, 0, 72000, 54000 };
     SkRect dstR = { 0, 0, 640, 480 };
-    
+
     SkPath path;
     path.moveTo(17600, 8000);
     path.lineTo(52800, 8000);
     path.lineTo(52800, 41600);
     path.lineTo(17600, 41600);
     path.close();
-    
+
     SkPaint paint;
     paint.setAntiAlias(true);
     paint.setStrokeWidth(8000);
@@ -54,7 +54,7 @@
         for (int x = 1; x <= 3; x++) {
             src.fBounds.set(0, 0, x, y);
             src.fRowBytes = src.fBounds.width();
-            
+
             SkScalar radius = 1.f;
 
             printf("src [%d %d %d %d] radius %g\n", src.fBounds.fLeft, src.fBounds.fTop,
@@ -99,7 +99,7 @@
     SkScalar    fWidth;
     SkPath      fPath;
 public:
-	StrokePathView() {
+    StrokePathView() {
 //        test_blur();
         fWidth = SkIntToScalar(120);
 
@@ -114,14 +114,14 @@
         fPath.addCircle(0, 0, SkIntToScalar(50), SkPath::kCW_Direction);
         fPath.addCircle(0, SkIntToScalar(-50), SkIntToScalar(30), SkPath::kCW_Direction);
 #endif
-        
+
         scale_to_width(&fPath, fWidth);
         const SkRect& bounds = fPath.getBounds();
         fPath.offset(-bounds.fLeft, -bounds.fTop);
 
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -131,9 +131,9 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     SkRandom rand;
-    
+
     void drawSet(SkCanvas* canvas, SkPaint* paint) {
         SkAutoCanvasRestore acr(canvas, true);
 
@@ -152,7 +152,7 @@
 
         SkPaint paint;
         paint.setAntiAlias(true);
-        
+
         if (true) {
             canvas->drawColor(SK_ColorBLACK);
 
@@ -177,7 +177,7 @@
                     canvas->drawText("Title Bar", 9, x*SkIntToScalar(100), y*SkIntToScalar(30), paint);
                     radius *= 0.75f;
                 }
-                
+
             }
             return;
         }
@@ -200,10 +200,10 @@
         fPath = p;
         fPath.offset(100, 0);
 #endif
-        
+
         fPath.setFillType(SkPath::kWinding_FillType);
         drawSet(canvas, &paint);
-        
+
         canvas->translate(0, fPath.getBounds().height() * 5 / 4);
         fPath.setFillType(SkPath::kEvenOdd_FillType);
         drawSet(canvas, &paint);
diff --git a/samplecode/SampleStrokeRect.cpp b/samplecode/SampleStrokeRect.cpp
index e9d3c2e..edf9228 100644
--- a/samplecode/SampleStrokeRect.cpp
+++ b/samplecode/SampleStrokeRect.cpp
@@ -14,7 +14,7 @@
 class StrokeRectSample : public SampleView {
 public:
     StrokeRectSample() {}
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -24,7 +24,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         paint.setAntiAlias(true);
@@ -64,7 +64,7 @@
             canvas->translate(SkIntToScalar(150), 0);
         }
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleStrokeText.cpp b/samplecode/SampleStrokeText.cpp
index 94b227c..8245f4e 100644
--- a/samplecode/SampleStrokeText.cpp
+++ b/samplecode/SampleStrokeText.cpp
@@ -41,7 +41,7 @@
     bounds.inset(sw, sw);
     path.offset(-bounds.fLeft, -bounds.fTop);
     bounds.offset(-bounds.fLeft, -bounds.fTop);
-    
+
     int w = SkScalarRound(bounds.width());
     int h = SkScalarRound(bounds.height());
     SkPaint paint(original);
@@ -56,7 +56,7 @@
         paint.setStyle(SkPaint::kFill_Style);
         canvas.drawPath(path, paint);
     }
-    
+
     dst->setConfig(config, w, h);
     dst->allocPixels();
     dst->eraseColor(SK_ColorWHITE);
@@ -87,7 +87,7 @@
     bounds.inset(sw, sw);
     path.offset(-bounds.fLeft, -bounds.fTop);
     bounds.offset(-bounds.fLeft, -bounds.fTop);
-    
+
     int w = SkScalarRound(bounds.width());
     int h = SkScalarRound(bounds.height());
     SkPaint paint(original);
@@ -96,7 +96,7 @@
     paint.setXfermodeMode(SkXfermode::kDstATop_Mode);
     paint.setColor(original.getColor());
     paint.setStyle(SkPaint::kStroke_Style);
-    
+
     dst->setConfig(config, w, h);
     dst->allocPixels();
     dst->eraseColor(SK_ColorWHITE);
@@ -108,10 +108,10 @@
 class StrokeTextView : public SampleView {
     bool fAA;
 public:
-	StrokeTextView() : fAA(false) {
+    StrokeTextView() : fAA(false) {
         this->setBGColor(0xFFCC8844);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -121,24 +121,24 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkBitmap bm;
         SkPaint paint;
-        
+
         paint.setStrokeWidth(SkIntToScalar(6));
         paint.setTextSize(SkIntToScalar(80));
 //        paint.setTypeface(Typeface.DEFAULT_BOLD);
-        
+
         lettersToBitmap(&bm, "Test Case", paint, SkBitmap::kARGB_4444_Config);
         if (false) { // avoid bit rot, suppress warning
             lettersToBitmap2(&bm, "Test Case", paint, SkBitmap::kARGB_4444_Config);
         }
         canvas->drawBitmap(bm, 0, 0);
     }
-    
+
 private:
-    
+
     typedef SampleView INHERITED;
 };
 
diff --git a/samplecode/SampleTests.cpp b/samplecode/SampleTests.cpp
index 5542bf6..ea317e1 100644
--- a/samplecode/SampleTests.cpp
+++ b/samplecode/SampleTests.cpp
@@ -12,7 +12,7 @@
 #include "test.h"
 
 namespace skiatest {
-    
+
 class MyReporter : public Reporter {
 protected:
     virtual void onStart(Test* test) {}
@@ -28,11 +28,11 @@
         r->ref();
         fReg = TestRegistry::Head();
     }
-    
+
     ~Iter() {
         fReporter->unref();
     }
-    
+
     Test* next() {
         if (fReg) {
             TestRegistry::Factory fact = fReg->factory();
@@ -43,7 +43,7 @@
         }
         return NULL;
     }
-    
+
     static int Count() {
         const TestRegistry* reg = TestRegistry::Head();
         int count = 0;
@@ -53,7 +53,7 @@
         }
         return count;
     }
-    
+
 private:
     Reporter* fReporter;
     const TestRegistry* fReg;
@@ -62,7 +62,7 @@
 
 class TestsView : public SkView {
 public:
-	TestsView() {}
+    TestsView() {}
 
 protected:
     // overrides from SkEventSink
@@ -73,36 +73,36 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorWHITE);
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         this->drawBG(canvas);
 
         skiatest::MyReporter reporter;
         skiatest::Iter iter(&reporter);
         skiatest::Test* test;
-        
+
         while ((test = iter.next()) != NULL) {
             test->run();
             SkDELETE(test);
         }
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         this->inval(NULL);
-        
+
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
     virtual bool onClick(Click* click) {
         this->inval(NULL);
         return this->INHERITED::onClick(click);
     }
 
-	virtual bool handleKey(SkKey key) {
+    virtual bool handleKey(SkKey key) {
         this->inval(NULL);
         return true;
     }
diff --git a/samplecode/SampleText.cpp b/samplecode/SampleText.cpp
index 7d192f4..8ff36e4 100644
--- a/samplecode/SampleText.cpp
+++ b/samplecode/SampleText.cpp
@@ -221,7 +221,7 @@
 
 class TextSpeedView : public SampleView {
 public:
-	TextSpeedView() {
+    TextSpeedView() {
         fMF = makemf();
 
         fHints = 0;
diff --git a/samplecode/SampleTextAlpha.cpp b/samplecode/SampleTextAlpha.cpp
index de1461f..6333588 100644
--- a/samplecode/SampleTextAlpha.cpp
+++ b/samplecode/SampleTextAlpha.cpp
@@ -31,7 +31,7 @@
     if (bm.config() != SkBitmap::kRGB_565_Config) {
         return;
     }
-    
+
     for (int y = 0; y < bm.height(); y++) {
         for (int x = 0; x < bm.width(); x++) {
             uint16_t c = *bm.getAddr16(x, y);
@@ -44,11 +44,11 @@
 }
 
 class TextAlphaView : public SampleView {
-public:    
-	TextAlphaView() {
+public:
+    TextAlphaView() {
         fByte = 0xFF;
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt)  {
@@ -59,23 +59,23 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         const char* str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
         SkPaint paint;
         SkScalar    x = SkIntToScalar(10);
         SkScalar    y = SkIntToScalar(20);
-        
+
         paint.setFlags(0x105);
-        
+
         paint.setARGB(fByte, 0xFF, 0xFF, 0xFF);
-        
+
         paint.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(3),
                                         SkBlurMaskFilter::kNormal_BlurStyle));
         paint.getMaskFilter()->unref();
-        
+
         SkRandom rand;
-        
+
         for (int ps = 6; ps <= 35; ps++) {
             paint.setColor(rand.nextU() | (0xFF << 24));
             paint.setTextSize(SkIntToScalar(ps));
@@ -94,11 +94,11 @@
             this->inval(NULL);
         }
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         return new Click(this);
     }
-    
+
     virtual bool onClick(Click* click) {
         int y = click->fICurr.fY;
         if (y < 0) {
@@ -110,7 +110,7 @@
         this->inval(NULL);
         return true;
     }
-    
+
 private:
     int fByte;
 
diff --git a/samplecode/SampleTextBox.cpp b/samplecode/SampleTextBox.cpp
index 6a8c50e..d8612db 100644
--- a/samplecode/SampleTextBox.cpp
+++ b/samplecode/SampleTextBox.cpp
@@ -35,27 +35,27 @@
 #endif
 
 static const char gText[] =
-	"When in the Course of human events it becomes necessary for one people "
-	"to dissolve the political bands which have connected them with another "
-	"and to assume among the powers of the earth, the separate and equal "
-	"station to which the Laws of Nature and of Nature's God entitle them, "
-	"a decent respect to the opinions of mankind requires that they should "
-	"declare the causes which impel them to the separation.";
+    "When in the Course of human events it becomes necessary for one people "
+    "to dissolve the political bands which have connected them with another "
+    "and to assume among the powers of the earth, the separate and equal "
+    "station to which the Laws of Nature and of Nature's God entitle them, "
+    "a decent respect to the opinions of mankind requires that they should "
+    "declare the causes which impel them to the separation.";
 
 class TextBoxView : public SampleView {
 public:
-	TextBoxView() {
+    TextBoxView() {
 #if defined(SK_BUILD_FOR_WIN) && defined(SK_FONTHOST_WIN_GDI)
-		LOGFONT lf;
-		sk_bzero(&lf, sizeof(lf));
-		lf.lfHeight = 9;
-		SkTypeface* tf0 = SkCreateTypefaceFromLOGFONT(lf);
-		lf.lfHeight = 12;
-		SkTypeface* tf1 = SkCreateTypefaceFromLOGFONT(lf);
-		// we assert that different sizes should not affect which face we get
-		SkASSERT(tf0 == tf1);
-		tf0->unref();
-		tf1->unref();
+        LOGFONT lf;
+        sk_bzero(&lf, sizeof(lf));
+        lf.lfHeight = 9;
+        SkTypeface* tf0 = SkCreateTypefaceFromLOGFONT(lf);
+        lf.lfHeight = 12;
+        SkTypeface* tf1 = SkCreateTypefaceFromLOGFONT(lf);
+        // we assert that different sizes should not affect which face we get
+        SkASSERT(tf0 == tf1);
+        tf0->unref();
+        tf1->unref();
 #endif
     }
 
@@ -75,24 +75,24 @@
 
         canvas->clipRect(SkRect::MakeWH(w, h));
         canvas->drawColor(bg);
-		SkScalar margin = 20;
+        SkScalar margin = 20;
         SkTextBox tbox;
-		tbox.setMode(SkTextBox::kLineBreak_Mode);
-		tbox.setBox(margin, margin,
-					w - margin, h - margin);
-		tbox.setSpacing(SkIntToScalar(3)/3, 0);
+        tbox.setMode(SkTextBox::kLineBreak_Mode);
+        tbox.setBox(margin, margin,
+                    w - margin, h - margin);
+        tbox.setSpacing(SkIntToScalar(3)/3, 0);
 
-		SkPaint paint;
-		paint.setAntiAlias(true);
+        SkPaint paint;
+        paint.setAntiAlias(true);
         paint.setLCDRenderText(true);
         paint.setColor(fg);
-		tbox.setText(gText, strlen(gText), paint);
+        tbox.setText(gText, strlen(gText), paint);
 
-		for (int i = 9; i < 24; i += 2) {
-			paint.setTextSize(SkIntToScalar(i));
-			tbox.draw(canvas);
-			canvas->translate(0, tbox.getTextHeight() + paint.getFontSpacing());
-		}
+        for (int i = 9; i < 24; i += 2) {
+            paint.setTextSize(SkIntToScalar(i));
+            tbox.draw(canvas);
+            canvas->translate(0, tbox.getTextHeight() + paint.getFontSpacing());
+        }
     }
 
     virtual void onDrawContent(SkCanvas* canvas) {
diff --git a/samplecode/SampleTextOnPath.cpp b/samplecode/SampleTextOnPath.cpp
index 00d9cba..976f3c8 100644
--- a/samplecode/SampleTextOnPath.cpp
+++ b/samplecode/SampleTextOnPath.cpp
@@ -51,19 +51,19 @@
     SkPaint paint;
     SkPath  path;
     SkMatrix matrix;
-    
+
     path.moveTo(SkIntToScalar(050), SkIntToScalar(200));
     path.quadTo(SkIntToScalar(250), SkIntToScalar(000),
                 SkIntToScalar(450), SkIntToScalar(200));
 
     paint.setAntiAlias(true);
-    
+
     paint.setStyle(SkPaint::kStroke_Style);
     canvas->drawPath(path, paint);
     paint.setStyle(SkPaint::kFill_Style);
     paint.setTextSize(SkIntToScalar(48));
     paint.setTextAlign(SkPaint::kRight_Align);
-    
+
     const char* text = "Reflection";
     size_t      len = strlen(text);
 
@@ -71,16 +71,16 @@
     SkScalar pathLen = meas.getLength();
 
     canvas->drawTextOnPath(text, len, path, NULL, paint);
-    
+
     paint.setColor(SK_ColorRED);
     matrix.setScale(-SK_Scalar1, SK_Scalar1);
     matrix.postTranslate(pathLen, 0);
     canvas->drawTextOnPath(text, len, path, &matrix, paint);
-    
+
     paint.setColor(SK_ColorBLUE);
     matrix.setScale(SK_Scalar1, -SK_Scalar1);
     canvas->drawTextOnPath(text, len, path, &matrix, paint);
-    
+
     paint.setColor(SK_ColorGREEN);
     matrix.setScale(-SK_Scalar1, -SK_Scalar1);
     matrix.postTranslate(pathLen, 0);
@@ -92,7 +92,7 @@
     SkPath      fPath;
     SkScalar    fHOffset;
 
-	TextOnPathView() {
+    TextOnPathView() {
         SkRect r;
         r.set(SkIntToScalar(100), SkIntToScalar(100),
               SkIntToScalar(300), SkIntToScalar(300));
@@ -111,7 +111,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         paint.setAntiAlias(true);
@@ -139,27 +139,27 @@
         paint.setColor(SK_ColorGREEN);
         paint.setStyle(SkPaint::kStroke_Style);
         canvas->drawPath(fPath, paint);
-        
+
         canvas->translate(SkIntToScalar(275), 0);
         textStrokePath(canvas);
 
         canvas->translate(SkIntToScalar(-275), SkIntToScalar(250));
         textPathMatrix(canvas);
-        
+
         if (REPEAT_COUNT > 1)
             this->inval(NULL);
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         fHints += 1;
         this->inval(NULL);
         return this->INHERITED::onFindClickHandler(x, y);
     }
-    
+
     virtual bool onClick(Click* click) {
         return this->INHERITED::onClick(click);
     }
-    
+
 private:
     int fHints;
     typedef SampleView INHERITED;
diff --git a/samplecode/SampleTextureDomain.cpp b/samplecode/SampleTextureDomain.cpp
index 4291468..07dcb40 100755
--- a/samplecode/SampleTextureDomain.cpp
+++ b/samplecode/SampleTextureDomain.cpp
@@ -78,7 +78,7 @@
         canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint);
 
         // Test that bitmap blurring using a subrect
-        // renders correctly 
+        // renders correctly
         srcRect.setXYWH(1, 1, 3, 3);
         dstRect.setXYWH(5.0f, 405.0f, 305.0f, 305.0f);
         SkMaskFilter* mf = SkBlurMaskFilter::Create(
@@ -94,7 +94,7 @@
         // but it will test a code path in SkGpuDevice::drawBitmap
         // that handles blurs with rects transformed to non-
         // orthogonal rects. It also tests the NULL src rect handling
-	mf = SkBlurMaskFilter::Create(
+    mf = SkBlurMaskFilter::Create(
             5,
             SkBlurMaskFilter::kNormal_BlurStyle,
             SkBlurMaskFilter::kHighQuality_BlurFlag);
diff --git a/samplecode/SampleTiling.cpp b/samplecode/SampleTiling.cpp
index d72544b..e7b6a7f 100644
--- a/samplecode/SampleTiling.cpp
+++ b/samplecode/SampleTiling.cpp
@@ -27,14 +27,14 @@
     bm->setConfig(config, w, h);
     bm->allocPixels();
     bm->eraseColor(0);
-    
+
     SkCanvas    canvas(*bm);
     SkPoint     pts[] = { { 0, 0 }, { SkIntToScalar(w), SkIntToScalar(h) } };
     SkColor     colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
     SkScalar    pos[] = { 0, SK_Scalar1/2, SK_Scalar1 };
     SkPaint     paint;
-    
-    SkUnitMapper*   um = NULL;    
+
+    SkUnitMapper*   um = NULL;
 
     um = new SkCosineMapper;
 //    um = new SkDiscreteMapper(12);
@@ -66,7 +66,7 @@
     SkPicture*          fTextPicture;
     SkBlurDrawLooper    fLooper;
 public:
-	TilingView()
+    TilingView()
             : fLooper(SkIntToScalar(1), SkIntToScalar(2), SkIntToScalar(2),
                       0x88000000) {
         fTextPicture = new SkPicture();
@@ -80,7 +80,7 @@
     }
 
     SkBitmap    fTexture[SK_ARRAY_COUNT(gConfigs)];
-	
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -90,15 +90,15 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkRect r = { 0, 0, SkIntToScalar(gWidth*2), SkIntToScalar(gHeight*2) };
 
         static const char* gConfigNames[] = { "8888", "565", "4444" };
-    
+
         static const bool           gFilters[] = { false, true };
         static const char*          gFilterNames[] = {     "point",                     "bilinear" };
-    
+
         static const SkShader::TileMode gModes[] = { SkShader::kClamp_TileMode, SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode };
         static const char*          gModeNames[] = {    "C",                    "R",                   "M" };
 
@@ -122,12 +122,12 @@
 
                     p.setTextAlign(SkPaint::kCenter_Align);
                     textCanvas->drawText(str.c_str(), str.size(), x + r.width()/2, y, p);
-                    
+
                     x += r.width() * 4 / 3;
                 }
             }
         }
-        
+
         y += SkIntToScalar(16);
 
         for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
@@ -138,12 +138,12 @@
                         SkPaint paint;
                         setup(&paint, fTexture[i], gFilters[j], gModes[kx], gModes[ky]);
                         paint.setDither(true);
-                        
+
                         canvas->save();
                         canvas->translate(x, y);
                         canvas->drawRect(r, paint);
                         canvas->restore();
-                        
+
                         x += r.width() * 4 / 3;
                     }
                 }
@@ -162,7 +162,7 @@
 
         canvas->drawPicture(*fTextPicture);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleTinyBitmap.cpp b/samplecode/SampleTinyBitmap.cpp
index 605d829..d682317 100644
--- a/samplecode/SampleTinyBitmap.cpp
+++ b/samplecode/SampleTinyBitmap.cpp
@@ -40,11 +40,11 @@
 class TinyBitmapView : public SampleView {
     SkBitmap    fBM;
 public:
-	TinyBitmapView() {
+    TinyBitmapView() {
         fBM = make_bitmap();
         this->setBGColor(0xFFDDDDDD);
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -54,7 +54,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     static void setBitmapOpaque(SkBitmap* bm, bool isOpaque) {
         SkAutoLockPixels alp(*bm);  // needed for ctable
         bm->setIsOpaque(isOpaque);
@@ -63,7 +63,7 @@
             ctable->setIsOpaque(isOpaque);
         }
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkShader* s = SkShader::CreateBitmapShader(fBM, SkShader::kRepeat_TileMode,
                                                    SkShader::kMirror_TileMode);
@@ -71,7 +71,7 @@
         paint.setShader(s)->unref();
         canvas->drawPaint(paint);
     }
-    
+
 private:
     typedef SkView INHERITED;
 };
diff --git a/samplecode/SampleTriangles.cpp b/samplecode/SampleTriangles.cpp
index e2ba652..d6adc16 100644
--- a/samplecode/SampleTriangles.cpp
+++ b/samplecode/SampleTriangles.cpp
@@ -44,12 +44,12 @@
 public:
     SkPath fPaths[COUNT_PROCS];
 
-	TriangleView() {
+    TriangleView() {
         for (size_t i = 0; i < COUNT_PROCS; i++) {
             gProcs[i](&fPaths[i]);
         }
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -59,26 +59,26 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorGRAY);
     }
-    
+
     static void draw_path(SkCanvas* canvas, const SkPaint& pathPaint,
                           const SkPath& path, const SkPaint& triPaint) {
         canvas->drawPath(path, pathPaint);
-        
+
         int n = path.getPoints(NULL, 0);
         SkPoint* pts = new SkPoint[n];
         path.getPoints(pts, n);
-        
+
         SkTDArray<SkPoint> triangles;
         if (SkConcaveToTriangles(n, pts, &triangles)) {
             canvas->drawVertices(SkCanvas::kTriangles_VertexMode,
                                  triangles.count(), triangles.begin(), NULL,
                                  NULL, NULL, NULL, 0, triPaint);
         }
-        
+
         SkPaint paint;
         paint.setColor(SK_ColorGREEN);
         paint.setStrokeWidth(SkIntToScalar(4));
@@ -88,11 +88,11 @@
 
     virtual void onDraw(SkCanvas* canvas) {
         this->drawBG(canvas);
-        
+
         canvas->translate(SIZE/2, SIZE/2);
 
         SkPaint pathPaint, triPaint;
-        
+
         pathPaint.setColor(SK_ColorBLUE);
         pathPaint.setStrokeWidth(SIZE / 12);
 
@@ -108,12 +108,12 @@
 
             pathPaint.setStyle(SkPaint::kStroke_Style);
             draw_path(canvas, pathPaint, fPaths[i], triPaint);
-            
+
             canvas->restore();
             canvas->translate(SIZE * 6 / 5, 0);
         }
     }
-    
+
 private:
     typedef SkView INHERITED;
 };
diff --git a/samplecode/SampleTypeface.cpp b/samplecode/SampleTypeface.cpp
index ccdb086..9bc8762 100644
--- a/samplecode/SampleTypeface.cpp
+++ b/samplecode/SampleTypeface.cpp
@@ -76,7 +76,7 @@
     SkTypeface* fFaces[gFaceCount];
 
 public:
-	TypefaceView() {
+    TypefaceView() {
         test_4444_dither();
         for (int i = 0; i < gFaceCount; i++) {
             fFaces[i] = SkTypeface::CreateFromName(gFaces[i].fName,
diff --git a/samplecode/SampleUnitMapper.cpp b/samplecode/SampleUnitMapper.cpp
index 09d0f14..8cc9afb 100644
--- a/samplecode/SampleUnitMapper.cpp
+++ b/samplecode/SampleUnitMapper.cpp
@@ -69,7 +69,7 @@
         }
         this->setViews();
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -79,14 +79,14 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setColor(0xFF8888FF);
 
         SkRect r = { 0, 0, SK_Scalar1, SK_Scalar1 };
-        
+
         canvas->concat(fMatrix);
         canvas->drawRect(r, paint);
 
@@ -94,7 +94,7 @@
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(0);
         paint.setStrokeCap(SkPaint::kRound_Cap);
-        
+
         SkPath path;
         path.moveTo(fPts[0]);
         path.cubicTo(fPts[1], fPts[2], fPts[3]);
@@ -145,10 +145,10 @@
         fDragIndex = hittest(x, y);
         return fDragIndex >= 0 ? new Click(this) : NULL;
     }
-    
+
     virtual bool onClick(Click* click) {
         if (fDragIndex >= 0) {
-            if (!invertPt(click->fCurr.fX, click->fCurr.fY, 
+            if (!invertPt(click->fCurr.fX, click->fCurr.fY,
                           &fPts[fDragIndex])) {
                 return false;
             }
@@ -159,7 +159,7 @@
         }
         return false;
     }
-    
+
 private:
     int fDragIndex;
 
diff --git a/samplecode/SampleVertices.cpp b/samplecode/SampleVertices.cpp
index b59442d..d6dd7ea 100644
--- a/samplecode/SampleVertices.cpp
+++ b/samplecode/SampleVertices.cpp
@@ -56,7 +56,7 @@
     SkShader*   fShader1;
 
 public:
-	VerticesView() {
+    VerticesView() {
         SkIPoint    size;
 
         fShader0 = make_shader0(&size);
diff --git a/samplecode/SampleWarp.cpp b/samplecode/SampleWarp.cpp
index b421c60..323df80 100644
--- a/samplecode/SampleWarp.cpp
+++ b/samplecode/SampleWarp.cpp
@@ -62,30 +62,30 @@
     canvas->drawBitmap(mask, 0, 0, &paint);
     paint.setMaskFilter(NULL);
     canvas->drawBitmap(orig, -offset.fX, -offset.fY, &paint);
-    
+
     canvas->translate(120, 0);
-    
+
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(orig, -offset.fX, -offset.fY, &paint);
-    
+
     canvas->translate(120, 0);
-    
+
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(orig, -offset.fX, -offset.fY, &paint);
-    
+
     canvas->translate(120, 0);
-    
+
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(orig, -offset.fX, -offset.fY, &paint);
-    
+
     canvas->translate(120, 0);
-    
+
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(mask, 0, 0, &paint);
     canvas->drawBitmap(mask, 0, 0, &paint);
@@ -116,13 +116,13 @@
 
     pts[0].set(x0, y0);
     pts[3].set(x3, y3);
-    
+
     tmp = SkPointInterp(pts[0], pts[3], SK_Scalar1/3);
     tmp2 = pts[0] - tmp;
     tmp2.rotateCW();
     tmp2.scale(scale);
     pts[1] = tmp + tmp2;
-    
+
     tmp = SkPointInterp(pts[0], pts[3], 2*SK_Scalar1/3);
     tmp2 = pts[3] - tmp;
     tmp2.rotateCW();
@@ -131,40 +131,40 @@
 }
 
 static void test_patch(SkCanvas* canvas, const SkBitmap& bm, SkScalar scale) {
-    SkCubicBoundary cubic;    
+    SkCubicBoundary cubic;
     set_cubic(cubic.fPts + 0, 0, 0, 100, 0, scale);
     set_cubic(cubic.fPts + 3, 100, 0, 100, 100, scale);
     set_cubic(cubic.fPts + 6, 100, 100,  0, 100, -scale);
     set_cubic(cubic.fPts + 9, 0, 100, 0, 0, 0);
-    
+
     SkBoundaryPatch patch;
     patch.setBoundary(&cubic);
-    
+
     const int Rows = 16;
     const int Cols = 16;
     SkPoint pts[Rows * Cols];
     patch.evalPatch(pts, Rows, Cols);
-    
+
     SkPaint paint;
     paint.setAntiAlias(true);
     paint.setFilterBitmap(true);
     paint.setStrokeWidth(1);
     paint.setStrokeCap(SkPaint::kRound_Cap);
-    
+
     canvas->translate(50, 50);
     canvas->scale(3, 3);
-    
+
     SkMeshUtils::Draw(canvas, bm, Rows, Cols, pts, NULL, paint);
 }
 
 static void test_drag(SkCanvas* canvas, const SkBitmap& bm,
                       const SkPoint& p0, const SkPoint& p1) {
-    SkCubicBoundary cubic;    
+    SkCubicBoundary cubic;
     set_cubic(cubic.fPts + 0, 0, 0, 100, 0, 0);
     set_cubic(cubic.fPts + 3, 100, 0, 100, 100, 0);
     set_cubic(cubic.fPts + 6, 100, 100,  0, 100, 0);
     set_cubic(cubic.fPts + 9, 0, 100, 0, 0, 0);
-    
+
 #if 0
     cubic.fPts[1] += p1 - p0;
     cubic.fPts[2] += p1 - p0;
@@ -182,21 +182,21 @@
 
     SkBoundaryPatch patch;
     patch.setBoundary(&cubic);
-    
+
     const int Rows = 16;
     const int Cols = 16;
     SkPoint pts[Rows * Cols];
     patch.evalPatch(pts, Rows, Cols);
-    
+
     SkPaint paint;
     paint.setAntiAlias(true);
     paint.setFilterBitmap(true);
     paint.setStrokeWidth(1);
     paint.setStrokeCap(SkPaint::kRound_Cap);
-    
+
     canvas->translate(50, 50);
     canvas->scale(3, 3);
-    
+
     SkAutoCanvasRestore acr(canvas, true);
 
     SkRect r = { 0, 0, 100, 100 };
@@ -256,7 +256,7 @@
     fPts = new SkPoint[fCount * 2];
     fTex = fPts + fCount;
     memcpy(fPts, src.fPts, fCount * 2 * sizeof(SkPoint));
-    
+
     delete[] fIndices;
     fIndexCount = src.fIndexCount;
     fIndices = new uint16_t[fIndexCount];
@@ -281,7 +281,7 @@
     delete[] fIndices;
     fIndexCount = rows * cols * 6;
     fIndices = new uint16_t[fIndexCount];
-    
+
     SkPoint* pts = fPts;
     const SkScalar dx = bounds.width() / rows;
     const SkScalar dy = bounds.height() / cols;
@@ -296,7 +296,7 @@
             pts += 1;
             tex->set(texture.fLeft + x*dtx, texture.fTop + y*dty);
             tex += 1;
-            
+
             if (y < cols && x < rows) {
                 *idx++ = index;
                 *idx++ = index + rows + 1;
@@ -305,7 +305,7 @@
                 *idx++ = index + 1;
                 *idx++ = index + rows + 1;
                 *idx++ = index + rows + 2;
-                
+
                 index += 1;
             }
         }
@@ -332,22 +332,22 @@
     SkBitmap    fBitmap;
     SkMatrix    fMatrix, fInverse;
 public:
-	WarpView() {
+    WarpView() {
         SkBitmap bm;
 //        SkImageDecoder::DecodeFile("/skimages/marker.png", &bm);
         SkImageDecoder::DecodeFile("/skimages/logo.gif", &bm);
    //     SkImageDecoder::DecodeFile("/beach_shot.JPG", &bm);
         fBitmap = bm;
-        
+
         SkRect bounds, texture;
         texture.set(0, 0, SkIntToScalar(fBitmap.width()),
                     SkIntToScalar(fBitmap.height()));
         bounds = texture;
-        
+
 //        fMesh.init(bounds, fBitmap.width() / 40, fBitmap.height() / 40, texture);
         fMesh.init(bounds, fBitmap.width()/16, fBitmap.height()/16, texture);
         fOrig = fMesh;
-        
+
         fP0.set(0, 0);
         fP1 = fP0;
 
@@ -364,7 +364,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     static SkPoint apply_warp(const SkVector& drag, SkScalar dragLength,
                               const SkPoint& dragStart, const SkPoint& dragCurr,
                               const SkPoint& orig) {
@@ -373,10 +373,10 @@
         if (length <= kNearlyZero) {
             return orig;
         }
-        
+
         const SkScalar period = 20;
         const SkScalar mag = dragLength / 3;
-        
+
         SkScalar d = length / (period);
         d = mag * SkScalarSin(d) / d;
         SkScalar dx = delta.fX * d;
@@ -385,7 +385,7 @@
         SkScalar py = orig.fY + dy;
         return SkPoint::Make(px, py);
     }
-    
+
     static SkPoint apply_warp2(const SkVector& drag, SkScalar dragLength,
                               const SkPoint& dragStart, const SkPoint& dragCurr,
                               const SkPoint& orig) {
@@ -394,24 +394,24 @@
         if (length <= kNearlyZero) {
             return orig;
         }
-        
+
         const SkScalar period = 10 + dragLength/4;
         const SkScalar mag = dragLength / 3;
-        
+
         SkScalar d = length / (period);
         if (d > SK_ScalarPI) {
             d = SK_ScalarPI;
         }
 
         d = -mag * SkScalarSin(d);
-        
+
         SkScalar dx = delta.fX * d;
         SkScalar dy = delta.fY * d;
         SkScalar px = orig.fX + dx;
         SkScalar py = orig.fY + dy;
         return SkPoint::Make(px, py);
     }
-    
+
     typedef SkPoint (*WarpProc)(const SkVector& drag, SkScalar dragLength,
                              const SkPoint& dragStart, const SkPoint& dragCurr,
                              const SkPoint& orig);
@@ -428,11 +428,11 @@
         fP0 = p0;
         fP1 = p1;
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorLTGRAY);
      //   test_bigblur(canvas); return;
-        
+
         canvas->concat(fMatrix);
 
         SkPaint paint;
@@ -441,18 +441,18 @@
                                                      SkShader::kClamp_TileMode,
                                                      SkShader::kClamp_TileMode))->unref();
         fMesh.draw(canvas, paint); //return;
-        
+
         paint.setShader(NULL);
         paint.setColor(SK_ColorRED);
         fMesh.draw(canvas, paint);
 
     //    test_drag(canvas, fBitmap, fP0, fP1);
     }
-    
+
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         return new Click(this);
     }
-    
+
     virtual bool onClick(Click* click) {
         SkPoint pts[2] = { click->fOrig, click->fCurr };
         fInverse.mapPoints(pts, 2);
@@ -460,7 +460,7 @@
         this->inval(NULL);
         return true;
     }
-    
+
 private:
     SkIRect    fBase, fRect;
     SkPoint     fP0, fP1;
diff --git a/samplecode/SampleWritePixels.cpp b/samplecode/SampleWritePixels.cpp
index 45e9f41..f9df8f5 100644
--- a/samplecode/SampleWritePixels.cpp
+++ b/samplecode/SampleWritePixels.cpp
@@ -32,8 +32,8 @@
 class WritePixelsView : public SampleView {
     SkPath fPath;
 public:
-	WritePixelsView() {}
-    
+    WritePixelsView() {}
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt) {
@@ -43,13 +43,13 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     virtual void onDrawContent(SkCanvas* canvas) {
         SkBitmap bitmap;
         create_bitmap(&bitmap);
         int x = bitmap.width() / 2;
         int y = bitmap.height() / 2;
-        
+
         SkBitmap subset;
         bitmap.extractSubset(&subset, SkIRect::MakeXYWH(x, y, x, y));
 
@@ -58,7 +58,7 @@
         canvas->writePixels(bitmap, 0, 0);
         canvas->writePixels(subset, 0, 0);
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleXfermodes.cpp b/samplecode/SampleXfermodes.cpp
index 4ad967e..531e0cd 100644
--- a/samplecode/SampleXfermodes.cpp
+++ b/samplecode/SampleXfermodes.cpp
@@ -136,10 +136,10 @@
     const static int H = 64;
     bool fOnce;
 
-	XfermodesView() {
+    XfermodesView() {
         fOnce = false;
     }
-    
+
     void init() {
         if (fOnce) {
             return;
diff --git a/samplecode/SampleXfermodesBlur.cpp b/samplecode/SampleXfermodesBlur.cpp
index feccf44..9d368a2 100644
--- a/samplecode/SampleXfermodesBlur.cpp
+++ b/samplecode/SampleXfermodesBlur.cpp
@@ -131,7 +131,7 @@
         if (false) {
             SkPaint paint;
             paint.setAntiAlias(true);
-            
+
             SkRect r0 = { 0, 0, 10.5f, 20 };
             SkRect r1 = { 10.5f, 10, 20, 30 };
             paint.setColor(SK_ColorRED);
diff --git a/samplecode/TransitionView.cpp b/samplecode/TransitionView.cpp
index 7a50f11..95938ef 100644
--- a/samplecode/TransitionView.cpp
+++ b/samplecode/TransitionView.cpp
@@ -24,15 +24,15 @@
 public:
     TransitionView(SkView* prev, SkView* next, int direction) : fInterp(4, 2){
         fAnimationDirection = (Direction)(1 << (direction % 8));
-        
+
         fPrev = prev;
         fPrev->setClipToBounds(false);
         fPrev->setVisibleP(true);
         (void)SampleView::SetUsePipe(fPrev, SkOSMenu::kOffState);
-        //Not calling unref because fPrev is assumed to have been created, so 
+        //Not calling unref because fPrev is assumed to have been created, so
         //this will result in a transfer of ownership
         this->attachChildToBack(fPrev);
-        
+
         fNext = next;
         fNext->setClipToBounds(true);
         fNext->setVisibleP(true);
@@ -40,20 +40,20 @@
         //Calling unref because next is a newly created view and TransitionView
         //is now the sole owner of fNext
         this->attachChildToFront(fNext)->unref();
-        
+
         fDone = false;
         //SkDebugf("--created transition\n");
     }
-    
+
     ~TransitionView(){
         //SkDebugf("--deleted transition\n");
     }
-    
+
     virtual void requestMenu(SkOSMenu* menu) {
         if (SampleView::IsSampleView(fNext))
             ((SampleView*)fNext)->requestMenu(menu);
     }
-    
+
 protected:
     virtual bool onQuery(SkEvent* evt) {
         if (SampleCode::TitleQ(*evt)) {
@@ -82,7 +82,7 @@
         if (evt.isType("transition-done")) {
             fNext->setLoc(0, 0);
             fNext->setClipToBounds(false);
-            SkEvent* evt = new SkEvent(gReplaceTransitionEvt, 
+            SkEvent* evt = new SkEvent(gReplaceTransitionEvt,
                                        this->getParent()->getSinkID());
             evt->setFast32(fNext->getSinkID());
             //increate ref count of fNext so it survives detachAllChildren
@@ -101,7 +101,7 @@
         if (is_overview(fNext) || is_overview(fPrev)) {
             fPipeState = SkOSMenu::kOffState;
         }
-        
+
         SkScalar values[4];
         SkInterpolator::Result result = fInterp.timeToValues(SkTime::GetMSecs(), values);
         //SkDebugf("transition %x %d pipe:%d\n", this, result, fUsePipe);
@@ -118,13 +118,13 @@
             fDone = true;
         }
     }
-    
+
     virtual void onSizeChange() {
         this->INHERITED::onSizeChange();
-        
+
         fNext->setSize(this->width(), this->height());
         fPrev->setSize(this->width(), this->height());
-        
+
         SkScalar lr = 0, ud = 0;
         if (fAnimationDirection & (kLeftDirection|kULDirection|kDLDirection))
             lr = this->width();
@@ -134,13 +134,13 @@
             ud = this->height();
         if (fAnimationDirection & (kDownDirection|kDLDirection|kDRDirection))
             ud = -this->height();
-        
+
         fBegin[kPrevX] = fBegin[kPrevY] = 0;
         fBegin[kNextX] = lr;
         fBegin[kNextY] = ud;
         fNext->setLocX(lr);
         fNext->setLocY(ud);
-        
+
         if (is_transition(fPrev))
             lr = ud = 0;
         fEnd[kPrevX] = -lr;
@@ -151,7 +151,7 @@
         fInterp.setKeyFrame(0, SkTime::GetMSecs(), fBegin, blend);
         fInterp.setKeyFrame(1, SkTime::GetMSecs()+500, fEnd, blend);
     }
-    
+
 private:
     enum {
         kPrevX = 0,
@@ -163,7 +163,7 @@
     SkView* fNext;
     bool    fDone;
     SkInterpolator fInterp;
-    
+
     enum Direction{
         kUpDirection    = 1,
         kURDirection    = 1 << 1,
@@ -174,11 +174,11 @@
         kLeftDirection  = 1 << 6,
         kULDirection    = 1 << 7
     };
-    
+
     Direction fAnimationDirection;
     SkScalar fBegin[4];
     SkScalar fEnd[4];
-    
+
     typedef SampleView INHERITED;
 };
 
