diff --git a/samplecode/SamplePolyToPoly.cpp b/samplecode/SamplePolyToPoly.cpp
index 98e4484..4b6686d 100644
--- a/samplecode/SamplePolyToPoly.cpp
+++ b/samplecode/SamplePolyToPoly.cpp
@@ -9,7 +9,7 @@
 extern bool SkSetPoly3To3(SkMatrix* matrix, const SkPoint src[3], const SkPoint dst[3]);
 
 class PolyToPolyView : public SkView {
-public:    
+public:
 	PolyToPolyView() {
         // tests
         {
@@ -17,20 +17,20 @@
             SkPoint dst[] = { 0, 0, 2*SK_Scalar1, 0, 0, 2*SK_Scalar1 };
             SkMatrix m1, m2;
             bool success;
-            
+
             success = m1.setPolyToPoly(src, dst, 3);
             SkDebugf("--- setPolyToPoly1 %d\n", success);
 
-            m2.reset();            
+            m2.reset();
             m2.set(SkMatrix::kMScaleX, dst[1].fX - dst[0].fX);
             m2.set(SkMatrix::kMSkewX,  dst[2].fX - dst[0].fX);
             m2.set(SkMatrix::kMTransX, dst[0].fX);
             m2.set(SkMatrix::kMSkewY,  dst[1].fY - dst[0].fY);
             m2.set(SkMatrix::kMScaleY, dst[2].fY - dst[0].fY);
             m2.set(SkMatrix::kMTransY, dst[0].fY);
-            
+
             m1.reset();
-            
+
             const SkScalar src1[] = {
                 0, 0, 0, SkFloatToScalar(427), SkFloatToScalar(316), SkFloatToScalar(427), SkFloatToScalar(316), 0
             };
@@ -38,10 +38,10 @@
                 SkFloatToScalar(158), SkFloatToScalar(177.5f), SkFloatToScalar(158), SkFloatToScalar(249.5f),
                 SkFloatToScalar(158), SkFloatToScalar(604.5f), SkFloatToScalar(158), SkFloatToScalar(-177.5f)
             };
-            
+
             success = m2.setPolyToPoly((const SkPoint*)src1, (SkPoint*)dst1, 4);
             SkDebugf("--- setPolyToPoly2 %d\n", success);
-            
+
             {
                 const SkPoint src[] = {
                     SkIntToScalar(1), SkIntToScalar(0),
@@ -53,16 +53,16 @@
                     SkIntToScalar(45), SkIntToScalar(26),
                     SkIntToScalar(32), SkIntToScalar(17)
                 };
-                
+
                 SkMatrix m0, m1;
                 m0.setPolyToPoly(src, dst, 3);
-                SkSetPoly3To3(&m1, src, dst);
+              //  SkSetPoly3To3(&m1, src, dst);
                 m0.dump();
                 m1.dump();
             }
         }
     }
-    
+
 protected:
     // overrides from SkEventSink
     virtual bool onQuery(SkEvent* evt)  {
@@ -73,7 +73,7 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorWHITE);
     }
@@ -82,23 +82,23 @@
                        const int idst[], int count) {
         SkMatrix matrix;
         SkPoint src[4], dst[4];
-        
+
         for (int i = 0; i < count; i++) {
             src[i].set(SkIntToScalar(isrc[2*i+0]), SkIntToScalar(isrc[2*i+1]));
             dst[i].set(SkIntToScalar(idst[2*i+0]), SkIntToScalar(idst[2*i+1]));
         }
-        
+
         canvas->save();
         matrix.setPolyToPoly(src, dst, count);
         canvas->concat(matrix);
-        
+
         paint->setColor(SK_ColorGRAY);
         paint->setStyle(SkPaint::kStroke_Style);
         const SkScalar D = SkIntToScalar(64);
         canvas->drawRectCoords(0, 0, D, D, *paint);
         canvas->drawLine(0, 0, D, D, *paint);
         canvas->drawLine(0, D, D, 0, *paint);
-        
+
         SkPaint::FontMetrics fm;
         paint->getFontMetrics(&fm);
         paint->setColor(SK_ColorRED);
@@ -108,13 +108,13 @@
         SkString str;
         str.appendS32(count);
         canvas->drawText(str.c_str(), str.size(), x, y, *paint);
-        
+
         canvas->restore();
     }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         this->drawBG(canvas);
-        
+
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStrokeWidth(SkIntToScalar(4));
@@ -128,7 +128,7 @@
         const int dst1[] = { 5, 5 };
         doDraw(canvas, &paint, src1, dst1, 1);
         canvas->restore();
-        
+
         canvas->save();
         canvas->translate(SkIntToScalar(160), SkIntToScalar(10));
         // rotate/uniform-scale (2 points)
@@ -136,7 +136,7 @@
         const int dst2[] = { 32, 32, 64, 48 };
         doDraw(canvas, &paint, src2, dst2, 2);
         canvas->restore();
-        
+
         canvas->save();
         canvas->translate(SkIntToScalar(10), SkIntToScalar(110));
         // rotate/skew (3 points)
@@ -144,7 +144,7 @@
         const int dst3[] = { 0, 0, 96, 0, 24, 64 };
         doDraw(canvas, &paint, src3, dst3, 3);
         canvas->restore();
-        
+
         canvas->save();
         canvas->translate(SkIntToScalar(160), SkIntToScalar(110));
         // perspective (4 points)
@@ -153,7 +153,7 @@
         doDraw(canvas, &paint, src4, dst4, 4);
         canvas->restore();
     }
-    
+
 private:
     typedef SkView INHERITED;
 };
