create inline version of setLine that assumes no clip. 10% faster for dashing gms
Review URL: https://codereview.appspot.com/6455078

git-svn-id: http://skia.googlecode.com/svn/trunk@4920 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkEdge.h b/src/core/SkEdge.h
index 575b602..22a26d0 100644
--- a/src/core/SkEdge.h
+++ b/src/core/SkEdge.h
@@ -11,6 +11,8 @@
 #define SkEdge_DEFINED
 
 #include "SkRect.h"
+#include "SkFDot6.h"
+#include "SkMath.h"
 
 struct SkEdge {
     enum Type {
@@ -33,6 +35,8 @@
 
     int setLine(const SkPoint& p0, const SkPoint& p1, const SkIRect* clip,
                 int shiftUp);
+    // call this version if you know you don't have a clip
+    inline int setLine(const SkPoint& p0, const SkPoint& p1, int shiftUp);
     inline int updateLine(SkFixed ax, SkFixed ay, SkFixed bx, SkFixed by);
     void chopLineWithClip(const SkIRect& clip);
 
@@ -78,4 +82,52 @@
     int updateCubic();
 };
 
+int SkEdge::setLine(const SkPoint& p0, const SkPoint& p1, int shift) {
+    SkFDot6 x0, y0, x1, y1;
+    
+    {
+#ifdef SK_SCALAR_IS_FLOAT
+        float scale = float(1 << (shift + 6));
+        x0 = int(p0.fX * scale);
+        y0 = int(p0.fY * scale);
+        x1 = int(p1.fX * scale);
+        y1 = int(p1.fY * scale);
+#else
+        shift = 10 - shift;
+        x0 = p0.fX >> shift;
+        y0 = p0.fY >> shift;
+        x1 = p1.fX >> shift;
+        y1 = p1.fY >> shift;
+#endif
+    }
+    
+    int winding = 1;
+    
+    if (y0 > y1) {
+        SkTSwap(x0, x1);
+        SkTSwap(y0, y1);
+        winding = -1;
+    }
+    
+    int top = SkFDot6Round(y0);
+    int bot = SkFDot6Round(y1);
+    
+    // are we a zero-height line?
+    if (top == bot) {
+        return 0;
+    }
+    
+    SkFixed slope = SkFDot6Div(x1 - x0, y1 - y0);
+    
+    fX          = SkFDot6ToFixed(x0 + SkFixedMul(slope, (32 - y0) & 63));   // + SK_Fixed1/2
+    fDX         = slope;
+    fFirstY     = top;
+    fLastY      = bot - 1;
+    fCurveCount = 0;
+    fWinding    = SkToS8(winding);
+    fCurveShift = 0;
+    return 1;
+}
+
+
 #endif
diff --git a/src/core/SkEdgeBuilder.cpp b/src/core/SkEdgeBuilder.cpp
index 01a40f0..74b412c 100644
--- a/src/core/SkEdgeBuilder.cpp
+++ b/src/core/SkEdgeBuilder.cpp
@@ -24,7 +24,7 @@
 
 void SkEdgeBuilder::addLine(const SkPoint pts[]) {
     SkEdge* edge = typedAllocThrow<SkEdge>(fAlloc);
-    if (edge->setLine(pts[0], pts[1], NULL, fShiftUp)) {
+    if (edge->setLine(pts[0], pts[1], fShiftUp)) {
         fList.push(edge);
     } else {
         // TODO: unallocate edge from storage...
@@ -118,7 +118,7 @@
                     int lineCount = SkLineClipper::ClipLine(pts, clip, lines);
                     SkASSERT(lineCount <= SkLineClipper::kMaxClippedLineSegments);
                     for (int i = 0; i < lineCount; i++) {
-                        if (edge->setLine(lines[i], lines[i + 1], NULL, shiftUp)) {
+                        if (edge->setLine(lines[i], lines[i + 1], shiftUp)) {
                             *edgePtr++ = edge++;
                         }
                     }
@@ -138,7 +138,7 @@
                     // the corresponding line/quad/cubic verbs
                     break;
                 case SkPath::kLine_Verb:
-                    if (edge->setLine(pts[0], pts[1], NULL, shiftUp)) {
+                    if (edge->setLine(pts[0], pts[1], shiftUp)) {
                         *edgePtr++ = edge++;
                     }
                     break;