diff --git a/experimental/Intersection/Simplify.cpp b/experimental/Intersection/Simplify.cpp
index a221e6b..c52ff5f 100644
--- a/experimental/Intersection/Simplify.cpp
+++ b/experimental/Intersection/Simplify.cpp
@@ -1092,10 +1092,10 @@
         return activeOp(xorMiMask, xorSuMask, index, endIndex, op, sumMiWinding, sumSuWinding,
             maxWinding, sumWinding, oppMaxWinding, oppSumWinding);
     }
-    
+
     bool activeOp(int xorMiMask, int xorSuMask,
             int index, int endIndex, ShapeOp op,
-            int& sumMiWinding, int& sumSuWinding, 
+            int& sumMiWinding, int& sumSuWinding,
             int& maxWinding, int& sumWinding, int& oppMaxWinding, int& oppSumWinding) {
         setUpWindings(index, endIndex, sumMiWinding, sumSuWinding,
                 maxWinding, sumWinding, oppMaxWinding, oppSumWinding);
@@ -1963,11 +1963,11 @@
      The Opp variable name part designates that the value is for the Opposite operator.
      Opposite values result from combining coincident spans.
      */
-     
+
     Segment* findNextOp(SkTDArray<Span*>& chase, int& nextStart, int& nextEnd,
             bool& unsortable, ShapeOp op, const int xorMiMask, const int xorSuMask) {
         const int startIndex = nextStart;
-        const int endIndex = nextEnd;    
+        const int endIndex = nextEnd;
         SkASSERT(startIndex != endIndex);
         const int count = fTs.count();
         SkASSERT(startIndex < endIndex ? startIndex < count - 1 : startIndex > 0);
@@ -2803,7 +2803,7 @@
         markDoneBinary(SkMin32(index, endIndex), winding, oppWinding);
         return last;
     }
-    
+
     Span* markAndChaseDoneBinary(int index, int endIndex) {
         int step = SkSign32(endIndex - index);
         Span* last = innerChaseDoneBinary(index, step);
@@ -2820,7 +2820,7 @@
         markWinding(min, winding);
         return last;
     }
-    
+
     Span* markAndChaseWinding(int index, int endIndex, int winding, int oppWinding) {
         int min = SkMin32(index, endIndex);
         int step = SkSign32(endIndex - index);
@@ -3262,7 +3262,7 @@
         }
         return oppWinding;
     }
-    
+
     int updateOppWinding(const Angle* angle) const {
         int startIndex = angle->start();
         int endIndex = angle->end();
diff --git a/include/core/SkClipStack.h b/include/core/SkClipStack.h
index 4155bd0..d4f6a52 100644
--- a/include/core/SkClipStack.h
+++ b/include/core/SkClipStack.h
@@ -103,7 +103,7 @@
            clips are Booleaned together. */
         SkClipStack::BoundsType fFiniteBoundType;
         SkRect                  fFiniteBound;
- 
+
         // When element is applied to the previous elements in the stack is the result known to be
         // equivalent to a single rect intersection? IIOW, is the clip effectively a rectangle.
         bool                    fIsIntersectionOfRects;
@@ -163,7 +163,7 @@
         inline bool operator!=(const Element& b) const;
         inline bool canBeIntersectedInPlace(int saveCount, SkRegion::Op op) const;
         /* This method checks to see if two rect clips can be safely merged into one. The issue here
-          is that to be strictly correct all the edges of the resulting rect must have the same 
+          is that to be strictly correct all the edges of the resulting rect must have the same
           anti-aliasing. */
         bool rectRectIntersectAllowed(const SkRect& newR, bool newAA) const;
         /** Determines possible finite bounds for the Element given the previous element of the
diff --git a/include/core/SkRRect.h b/include/core/SkRRect.h
index 046df36..66c1ee2 100644
--- a/include/core/SkRRect.h
+++ b/include/core/SkRRect.h
@@ -33,24 +33,24 @@
 //      add RR rendering shader to Ganesh (akin to cicle drawing code)
 //          - only for simple RRs
 //      detect and triangulate RRectorii rather than falling back to SW in Ganesh
-//      
+//
 
 /** \class SkRRect
 
-    The SkRRect class represents a rounded rect with a potentially different 
-    radii for each corner. It does not have a constructor so must be 
-    initialized with one of the initialization functions (e.g., setEmpty, 
+    The SkRRect class represents a rounded rect with a potentially different
+    radii for each corner. It does not have a constructor so must be
+    initialized with one of the initialization functions (e.g., setEmpty,
     setRectRadii, etc.)
 
-    This class is intended to roughly match CSS' border-*-*-radius capabilities. 
+    This class is intended to roughly match CSS' border-*-*-radius capabilities.
     This means:
-        If either of a corner's radii are 0 the corner will be square. 
+        If either of a corner's radii are 0 the corner will be square.
         Negative radii are not allowed (they are clamped to zero).
         If the corner curves overlap they will be proportionally reduced to fit.
 */
 class SK_API SkRRect {
 public:
-    /** 
+    /**
      * Enum to capture the various possible subtypes of RR. Accessed
      * by type(). The subtypes become progressively less restrictive.
      */
@@ -60,16 +60,16 @@
 
         //!< The RR is actually a (non-empty) rect (i.e., at least one radius
         //!< at each corner is zero)
-        kRect_Type,  
+        kRect_Type,
 
-        //!< The RR is actually a (non-empty) oval (i.e., all x radii are equal 
+        //!< The RR is actually a (non-empty) oval (i.e., all x radii are equal
         //!< and >= width/2 and all the y radii are equal and >= height/2
-        kOval_Type,  
+        kOval_Type,
 
-        //!< The RR is non-empty and all the x radii are equal & all y radii 
-        //!< are equal but it is not an oval (i.e., there are lines between 
+        //!< The RR is non-empty and all the x radii are equal & all y radii
+        //!< are equal but it is not an oval (i.e., there are lines between
         //!< the curves) nor a rect (i.e., both radii are non-zero)
-        kSimple_Type,  
+        kSimple_Type,
 
         //!< A fully general (non-empty) RR. Some of the x and/or y radii are
         //!< different from the others and there must be one corner where
@@ -77,7 +77,7 @@
         kComplex_Type,
     };
 
-    /** 
+    /**
      * Returns the RR's sub type.
      */
     Type type() const {
@@ -90,10 +90,10 @@
         return fType;
     }
 
-    /** 
+    /**
      * Set this RR to the empty rectangle (0,0,0,0) with 0 x & y radii.
      */
-    void setEmpty() { 
+    void setEmpty() {
         fRect.setEmpty();
         memset(fRadii, 0, sizeof(fRadii));
         fType = kEmpty_Type;
@@ -101,7 +101,7 @@
         SkDEBUGCODE(this->validate();)
     }
 
-    /** 
+    /**
      * Set this RR to match the supplied rect. All radii will be 0.
      */
     void setRect(const SkRect& rect) {
@@ -117,7 +117,7 @@
         SkDEBUGCODE(this->validate();)
     }
 
-    /** 
+    /**
      * Set this RR to match the supplied oval. All x radii will equal half the
      * width and all y radii will equal half the height.
      */
@@ -139,17 +139,17 @@
         SkDEBUGCODE(this->validate();)
     }
 
-    /** 
+    /**
      * Initialize the RR with the same radii for all four corners.
      */
     void setRectXY(const SkRect& rect, SkScalar xRad, SkScalar yRad);
 
-    /** 
+    /**
      * Initialize the RR with potentially different radii for all four corners.
      */
     void setRectRadii(const SkRect& rect, const SkVector radii[4]);
 
-    // The radii are stored in UL, UR, LR, LL order. 
+    // The radii are stored in UL, UR, LR, LL order.
     enum Corner {
         kUpperLeft_Corner,
         kUpperRight_Corner,
@@ -204,7 +204,7 @@
 
     SkRect fRect;
     // Radii order is UL, UR, LR, LL. Use Corner enum to index into fRadii[]
-    SkVector fRadii[4];     
+    SkVector fRadii[4];
     mutable Type fType;
     // TODO: add padding so we can use memcpy for flattening and not copy
     // uninitialized data
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
index 46b10b7..e1ddb33 100644
--- a/src/core/SkDraw.cpp
+++ b/src/core/SkDraw.cpp
@@ -334,10 +334,10 @@
     uint32_t value;
     const SkBitmap* bitmap = blitter->justAnOpaqueColor(&value);
     SkASSERT(bitmap);
-    
+
     uint16_t* addr = bitmap->getAddr16(0, 0);
     int rb = bitmap->rowBytes();
-    
+
     for (int i = 0; i < count; i++) {
         int x = SkScalarFloorToInt(devPts[i].fX);
         int y = SkScalarFloorToInt(devPts[i].fY);
@@ -355,10 +355,10 @@
     uint32_t value;
     const SkBitmap* bitmap = blitter->justAnOpaqueColor(&value);
     SkASSERT(bitmap);
-    
+
     SkPMColor* addr = bitmap->getAddr32(0, 0);
     int rb = bitmap->rowBytes();
-    
+
     for (int i = 0; i < count; i++) {
         int x = SkScalarFloorToInt(devPts[i].fX);
         int y = SkScalarFloorToInt(devPts[i].fY);
@@ -417,13 +417,13 @@
     for (int i = 0; i < count; i++) {
         SkFixed x = SkScalarToFixed(devPts[i].fX);
         SkFixed y = SkScalarToFixed(devPts[i].fY);
-        
+
         SkXRect r;
         r.fLeft = x - radius;
         r.fTop = y - radius;
         r.fRight = x + radius;
         r.fBottom = y + radius;
-        
+
         SkScan::FillXRect(r, *rec.fRC, blitter);
     }
 }
diff --git a/src/core/SkRRect.cpp b/src/core/SkRRect.cpp
index 03b8bbb..db1c7dd 100644
--- a/src/core/SkRRect.cpp
+++ b/src/core/SkRRect.cpp
@@ -75,14 +75,14 @@
     }
 
     // Proportionally scale down all radii to fit. Find the minimum ratio
-    // of a side and the radii on that side (for all four sides) and use 
+    // of a side and the radii on that side (for all four sides) and use
     // that to scale down _all_ the radii. This algorithm is from the
     // W3 spec (http://www.w3.org/TR/css3-background/) section 5.5 - Overlapping
     // Curves:
-    // "Let f = min(Li/Si), where i is one of { top, right, bottom, left }, 
+    // "Let f = min(Li/Si), where i is one of { top, right, bottom, left },
     //   Si is the sum of the two corresponding radii of the corners on side i,
-    //   and Ltop = Lbottom = the width of the box, 
-    //   and Lleft = Lright = the height of the box. 
+    //   and Ltop = Lbottom = the width of the box,
+    //   and Lleft = Lright = the height of the box.
     // If f < 1, then all corner radii are reduced by multiplying them by f."
     SkScalar scale = SK_Scalar1;
 
@@ -143,7 +143,7 @@
         canonicalPt.set(x - fRect.centerX(), y - fRect.centerY());
         index = kUpperLeft_Corner;  // any corner will do in this case
     } else {
-        if (x < fRect.fLeft + fRadii[kUpperLeft_Corner].fX && 
+        if (x < fRect.fLeft + fRadii[kUpperLeft_Corner].fX &&
             y < fRect.fTop + fRadii[kUpperLeft_Corner].fY) {
             // UL corner
             index = kUpperLeft_Corner;
@@ -252,7 +252,7 @@
             SkASSERT(fRect.isEmpty());
             SkASSERT(allRadiiZero && allRadiiSame && allCornersSquare);
 
-            SkASSERT(0 == fRect.fLeft && 0 == fRect.fTop && 
+            SkASSERT(0 == fRect.fLeft && 0 == fRect.fTop &&
                      0 == fRect.fRight && 0 == fRect.fBottom);
             break;
         case kRect_Type:
diff --git a/src/utils/SkPictureUtils.cpp b/src/utils/SkPictureUtils.cpp
index 16cf11d..46ca6d6 100644
--- a/src/utils/SkPictureUtils.cpp
+++ b/src/utils/SkPictureUtils.cpp
@@ -76,7 +76,7 @@
                              SkCanvas::Config8888 config8888) SK_OVERRIDE {
         not_supported();
     }
-    
+
     virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE {
         this->addBitmapFromPaint(paint);
     }
@@ -146,7 +146,7 @@
 class NoSaveLayerCanvas : public SkCanvas {
 public:
     NoSaveLayerCanvas(SkDevice* device) : INHERITED(device) {}
-    
+
     // turn saveLayer() into save() for speed, should not affect correctness.
     virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
                           SaveFlags flags) SK_OVERRIDE {
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp
index 567a8d2..79ca313 100644
--- a/tests/PictureTest.cpp
+++ b/tests/PictureTest.cpp
@@ -207,7 +207,7 @@
             SkAutoDataUnref adu(data);
 
             gather_from_colors(result, refs, N, &array);
-            
+
             /*
              *  GatherPixelRefs is conservative, so it can return more bitmaps
              *  that we actually can see (usually because of conservative bounds
diff --git a/tests/RoundRectTest.cpp b/tests/RoundRectTest.cpp
index fd4780c..a358c5a 100644
--- a/tests/RoundRectTest.cpp
+++ b/tests/RoundRectTest.cpp
@@ -16,7 +16,7 @@
     // Test out initialization methods
     SkPoint zeroPt = { 0.0, 0.0 };
     SkRRect empty;
-    
+
     empty.setEmpty();
 
     REPORTER_ASSERT(reporter, SkRRect::kEmpty_Type == empty.type());
@@ -48,7 +48,7 @@
     REPORTER_ASSERT(reporter, rr2.rect() == rect);
 
     for (int i = 0; i < 4; ++i) {
-        REPORTER_ASSERT(reporter, 
+        REPORTER_ASSERT(reporter,
                         rr2.radii((SkRRect::Corner) i).equalsWithinTolerance(halfPoint));
     }
 
@@ -63,7 +63,7 @@
     for (int i = 0; i < 4; ++i) {
         REPORTER_ASSERT(reporter, p == rr3.radii((SkRRect::Corner) i));
     }
-    
+
     //----
     SkPoint radii[4] = { { 5, 5 }, { 5, 5 }, { 5, 5 }, { 5, 5 } };
 
@@ -99,7 +99,7 @@
 // Test out the cases when the RR degenerates to a rect
 static void test_round_rect_rects(skiatest::Reporter* reporter) {
     SkRect r;
-    static const SkPoint pts[] = { 
+    static const SkPoint pts[] = {
         // Upper Left
         { -SK_Scalar1, -SK_Scalar1 },               // out
         { SK_Scalar1, SK_Scalar1 },                 // in
@@ -121,7 +121,7 @@
 
     //----
     SkRRect empty;
-    
+
     empty.setEmpty();
 
     REPORTER_ASSERT(reporter, SkRRect::kEmpty_Type == empty.type());
@@ -166,7 +166,7 @@
     static const SkScalar kEps = 0.1f;
     static const SkScalar kWidthTol = SkScalarHalf(kWidth) * (SK_Scalar1 - SK_ScalarRoot2Over2);
     static const SkScalar kHeightTol = SkScalarHalf(kHeight) * (SK_Scalar1 - SK_ScalarRoot2Over2);
-    static const SkPoint pts[] = { 
+    static const SkPoint pts[] = {
         // Upper Left
         { kWidthTol - kEps, kHeightTol - kEps },       // out
         { kWidthTol + kEps, kHeightTol + kEps },       // in
@@ -204,7 +204,7 @@
 static void test_round_rect_general(skiatest::Reporter* reporter) {
     static const SkScalar kEps = 0.1f;
     static const SkScalar kDist20 = 20 * (SK_Scalar1 - SK_ScalarRoot2Over2);
-    static const SkPoint pts[] = { 
+    static const SkPoint pts[] = {
         // Upper Left
         { kDist20 - kEps, kDist20 - kEps },       // out
         { kDist20 + kEps, kDist20 + kEps },       // in
@@ -236,7 +236,7 @@
 
     //----
     static const SkScalar kDist50 = 50*(SK_Scalar1 - SK_ScalarRoot2Over2);
-    static const SkPoint pts2[] = { 
+    static const SkPoint pts2[] = {
         // Upper Left
         { -SK_Scalar1, -SK_Scalar1 },           // out
         { SK_Scalar1, SK_Scalar1 },             // in
diff --git a/tools/PictureRenderer.cpp b/tools/PictureRenderer.cpp
index 69ce6f8..3f96e90 100644
--- a/tools/PictureRenderer.cpp
+++ b/tools/PictureRenderer.cpp
@@ -669,7 +669,7 @@
                                        SkIntToScalar(fPicture->height()));
         SkData* data = SkPictureUtils::GatherPixelRefs(fPicture, bounds);
         SkSafeUnref(data);
-        
+
         return NULL == path;    // we don't have anything to write
     }
 
@@ -682,5 +682,5 @@
 PictureRenderer* CreateGatherPixelRefsRenderer() {
     return SkNEW(GatherRenderer);
 }
-    
+
 } // namespace sk_tools
