diff --git a/experimental/AndroidPathRenderer/GrAndroidPathRenderer.cpp b/experimental/AndroidPathRenderer/GrAndroidPathRenderer.cpp
index c2bb708..f74a57a 100644
--- a/experimental/AndroidPathRenderer/GrAndroidPathRenderer.cpp
+++ b/experimental/AndroidPathRenderer/GrAndroidPathRenderer.cpp
@@ -1,75 +1,75 @@
-
-/*
- * Copyright 2012 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "GrAndroidPathRenderer.h"
-#include "AndroidPathRenderer.h"
-#include "Vertex.h"
-
-GrAndroidPathRenderer::GrAndroidPathRenderer() {
-}
-
-bool GrAndroidPathRenderer::canDrawPath(const SkPath& path,
-                                        const SkStrokeRec& stroke,
-                                        const GrDrawTarget* target,
-                                        bool antiAlias) const {
-    return ((stroke.isFillStyle() || stroke.getStyle() == SkStrokeRec::kStroke_Style) 
-             && !path.isInverseFillType() && path.isConvex());
-}
-
-struct ColorVertex {
-    SkPoint pos;
-    GrColor color;
-};
-
-bool GrAndroidPathRenderer::onDrawPath(const SkPath& origPath,
-                                       const SkStrokeRec& stroke,
-                                       GrDrawTarget* target,
-                                       bool antiAlias) {
-
-    // generate verts using Android algorithm
-    android::uirenderer::VertexBuffer vertices;
-    android::uirenderer::PathRenderer::ConvexPathVertices(origPath, stroke, antiAlias, NULL, 
-                                                          &vertices);
- 
-    // set vertex layout depending on anti-alias
-    GrVertexLayout layout = antiAlias ? GrDrawTarget::kCoverage_VertexLayoutBit : 0;
-
-    // allocate our vert buffer
-    int vertCount = vertices.getSize();
-    GrDrawTarget::AutoReleaseGeometry geo(target, layout, vertCount, 0);
-    if (!geo.succeeded()) {
-        GrPrintf("Failed to get space for vertices!\n");
-        return false;
-    }
-
-    // copy android verts to our vertex buffer
-    if (antiAlias) {
-        ColorVertex* outVert = reinterpret_cast<ColorVertex*>(geo.vertices());
-        android::uirenderer::AlphaVertex* inVert = 
-            reinterpret_cast<android::uirenderer::AlphaVertex*>(vertices.getBuffer());
-
-        for (int i = 0; i < vertCount; ++i) {
-            // copy vertex position
-            outVert->pos.set(inVert->position[0], inVert->position[1]);
-            // copy alpha
-            int coverage = static_cast<int>(inVert->alpha * 0xff);
-            outVert->color = GrColorPackRGBA(coverage, coverage, coverage, coverage);
-            ++outVert;
-            ++inVert;
-        }
-    } else {
-       size_t vsize = GrDrawTarget::VertexSize(layout);
-       size_t copySize = vsize*vertCount;
-       memcpy(geo.vertices(), vertices.getBuffer(), copySize);
-    }
-    
-    // render it
-    target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, vertCount);
-
-    return true;
-}
+
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "GrAndroidPathRenderer.h"
+#include "AndroidPathRenderer.h"
+#include "Vertex.h"
+
+GrAndroidPathRenderer::GrAndroidPathRenderer() {
+}
+
+bool GrAndroidPathRenderer::canDrawPath(const SkPath& path,
+                                        const SkStrokeRec& stroke,
+                                        const GrDrawTarget* target,
+                                        bool antiAlias) const {
+    return ((stroke.isFillStyle() || stroke.getStyle() == SkStrokeRec::kStroke_Style)
+             && !path.isInverseFillType() && path.isConvex());
+}
+
+struct ColorVertex {
+    SkPoint pos;
+    GrColor color;
+};
+
+bool GrAndroidPathRenderer::onDrawPath(const SkPath& origPath,
+                                       const SkStrokeRec& stroke,
+                                       GrDrawTarget* target,
+                                       bool antiAlias) {
+
+    // generate verts using Android algorithm
+    android::uirenderer::VertexBuffer vertices;
+    android::uirenderer::PathRenderer::ConvexPathVertices(origPath, stroke, antiAlias, NULL,
+                                                          &vertices);
+
+    // set vertex layout depending on anti-alias
+    GrVertexLayout layout = antiAlias ? GrDrawTarget::kCoverage_VertexLayoutBit : 0;
+
+    // allocate our vert buffer
+    int vertCount = vertices.getSize();
+    GrDrawTarget::AutoReleaseGeometry geo(target, layout, vertCount, 0);
+    if (!geo.succeeded()) {
+        GrPrintf("Failed to get space for vertices!\n");
+        return false;
+    }
+
+    // copy android verts to our vertex buffer
+    if (antiAlias) {
+        ColorVertex* outVert = reinterpret_cast<ColorVertex*>(geo.vertices());
+        android::uirenderer::AlphaVertex* inVert =
+            reinterpret_cast<android::uirenderer::AlphaVertex*>(vertices.getBuffer());
+
+        for (int i = 0; i < vertCount; ++i) {
+            // copy vertex position
+            outVert->pos.set(inVert->position[0], inVert->position[1]);
+            // copy alpha
+            int coverage = static_cast<int>(inVert->alpha * 0xff);
+            outVert->color = GrColorPackRGBA(coverage, coverage, coverage, coverage);
+            ++outVert;
+            ++inVert;
+        }
+    } else {
+       size_t vsize = GrDrawTarget::VertexSize(layout);
+       size_t copySize = vsize*vertCount;
+       memcpy(geo.vertices(), vertices.getBuffer(), copySize);
+    }
+
+    // render it
+    target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, vertCount);
+
+    return true;
+}
