add optimization for width==1 bitmaps in shader procs
odd warning fixes and cleanup



git-svn-id: http://skia.googlecode.com/svn/trunk@63 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkBitmapProcState_matrix.h b/src/core/SkBitmapProcState_matrix.h
index f54f8b1..049d6d4 100644
--- a/src/core/SkBitmapProcState_matrix.h
+++ b/src/core/SkBitmapProcState_matrix.h
@@ -26,7 +26,6 @@
     // we store y, x, x, x, x, x
 
     const unsigned maxX = s.fBitmap->width() - 1;
-    const SkFixed dx = s.fInvSx;
     SkFixed fx;
     {
         SkPoint pt;
@@ -37,6 +36,14 @@
         *xy++ = TILEY_PROCF(fx, maxY);
         fx = SkScalarToFixed(pt.fX);
     }
+    
+    if (0 == maxX) {
+        // all of the following X values must be 0
+        memset(xy, 0, count * sizeof(uint16_t));
+        return;
+    }
+
+    const SkFixed dx = s.fInvSx;
 
 #ifdef CHECK_FOR_DECAL
     // test if we don't need to apply the tile proc
diff --git a/src/core/SkBitmapProcState_sample.h b/src/core/SkBitmapProcState_sample.h
index 122ccf8..41a08eb 100644
--- a/src/core/SkBitmapProcState_sample.h
+++ b/src/core/SkBitmapProcState_sample.h
@@ -1,3 +1,4 @@
+#include "SkUtils.h"
 
 #if DSTSIZE==32
     #define DSTTYPE SkPMColor
@@ -7,6 +8,14 @@
     #error "need DSTSIZE to be 32 or 16"
 #endif
 
+#if (DSTSIZE == 32)
+    #define BITMAPPROC_MEMSET(ptr, value, n) sk_memset32(ptr, value, n)
+#elif (DSTSIZE == 16)
+    #define BITMAPPROC_MEMSET(ptr, value, n) sk_memset16(ptr, value, n)
+#else
+    #error "unsupported DSTSIZE
+#endif
+
 static void MAKENAME(_nofilter_DXDY)(const SkBitmapProcState& s,
                                      const uint32_t* SK_RESTRICT xy,
                                      int count, DSTTYPE* SK_RESTRICT colors) {
@@ -61,33 +70,39 @@
     PREAMBLE(s);
 #endif
     const SRCTYPE* SK_RESTRICT srcAddr = (const SRCTYPE*)s.fBitmap->getPixels();
-    int i;
 
+    // buffer is y32, x16, x16, x16, x16, x16
     // bump srcAddr to the proper row, since we're told Y never changes
     SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
     srcAddr = (const SRCTYPE*)((const char*)srcAddr +
                                                 xy[0] * s.fBitmap->rowBytes());
-    // buffer is y32, x16, x16, x16, x16, x16
-    const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy + 1);
     
     SRCTYPE src;
     
-    for (i = (count >> 2); i > 0; --i) {
-        SkASSERT(*xx < (unsigned)s.fBitmap->width());
-        src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
-        
-        SkASSERT(*xx < (unsigned)s.fBitmap->width());
-        src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
-        
-        SkASSERT(*xx < (unsigned)s.fBitmap->width());
-        src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
-        
-        SkASSERT(*xx < (unsigned)s.fBitmap->width());
-        src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
-    }
-    for (i = (count & 3); i > 0; --i) {
-        SkASSERT(*xx < (unsigned)s.fBitmap->width());
-        src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+    if (1 == s.fBitmap->width()) {
+        src = srcAddr[0];
+        DSTTYPE dstValue = RETURNDST(src);
+        BITMAPPROC_MEMSET(colors, dstValue, count);
+    } else {
+        int i;
+        const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy + 1);
+        for (i = (count >> 2); i > 0; --i) {
+            SkASSERT(*xx < (unsigned)s.fBitmap->width());
+            src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+            
+            SkASSERT(*xx < (unsigned)s.fBitmap->width());
+            src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+            
+            SkASSERT(*xx < (unsigned)s.fBitmap->width());
+            src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+            
+            SkASSERT(*xx < (unsigned)s.fBitmap->width());
+            src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+        }
+        for (i = (count & 3); i > 0; --i) {
+            SkASSERT(*xx < (unsigned)s.fBitmap->width());
+            src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
+        }
     }
     
 #ifdef POSTAMBLE
@@ -205,3 +220,4 @@
 #undef GET_FILTER_ROW
 #undef GET_FILTER_ROW_PROC
 #undef GET_FILTER_PROC
+#undef BITMAPPROC_MEMSET
diff --git a/src/effects/SkGradientShader.cpp b/src/effects/SkGradientShader.cpp
index a1674cb..b0d91ee 100644
--- a/src/effects/SkGradientShader.cpp
+++ b/src/effects/SkGradientShader.cpp
@@ -733,7 +733,7 @@
 #ifdef TEST_GRADIENT_DITHER
 static void dither_memset16(uint16_t dst[], uint16_t value, uint16_t other, int count)
 {
-    if ((unsigned)dst & 2)
+    if (reinterpret_cast<uintptr_t>(dst) & 2)
     {
         *dst++ = value;
         count -= 1;
diff --git a/src/ports/SkFontHost_linux.cpp b/src/ports/SkFontHost_linux.cpp
index f75718d..c00e226 100644
--- a/src/ports/SkFontHost_linux.cpp
+++ b/src/ports/SkFontHost_linux.cpp
@@ -592,6 +592,11 @@
     return SkNEW_ARGS(StreamTypeface, (style, false, NULL, stream));
 }
 
+SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[])
+{
+    return SkFontHost::CreateTypeface(SkNEW_ARGS(SkMMAPStream, (path)));
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 size_t SkFontHost::ShouldPurgeFontCache(size_t sizeAllocatedSoFar)
diff --git a/src/utils/SkDumpCanvas.cpp b/src/utils/SkDumpCanvas.cpp
index fb203ef..a0c85fe 100644
--- a/src/utils/SkDumpCanvas.cpp
+++ b/src/utils/SkDumpCanvas.cpp
@@ -12,13 +12,41 @@
 #include "SkMaskFilter.h"
 
 static void toString(const SkRect& r, SkString* str) {
-    str->printf("[(%g %g) %g %g]",
+    str->printf("[%g,%g %g:%g]",
                 SkScalarToFloat(r.fLeft), SkScalarToFloat(r.fTop),
                 SkScalarToFloat(r.width()), SkScalarToFloat(r.height()));
 }
 
 static void toString(const SkIRect& r, SkString* str) {
-    str->printf("[(%d %d) %d %d]", r.fLeft, r.fTop, r.width(), r.height());
+    str->printf("[%d,%d %d:%d]", r.fLeft, r.fTop, r.width(), r.height());
+}
+
+static void dumpVerbs(const SkPath& path, SkString* str) {
+    SkPath::Iter iter(path, false);
+    SkPoint pts[4];
+    for (;;) {
+        switch (iter.next(pts)) {
+            case SkPath::kMove_Verb:
+                str->appendf(" M%g,%g", pts[0].fX, pts[0].fY);
+                break;
+            case SkPath::kLine_Verb:
+                str->appendf(" L%g,%g", pts[0].fX, pts[0].fY);
+                break;
+            case SkPath::kQuad_Verb:
+                str->appendf(" Q%g,%g,%g,%g", pts[1].fX, pts[1].fY,
+                             pts[2].fX, pts[2].fY);
+                break;
+            case SkPath::kCubic_Verb:
+                str->appendf(" C%g,%g,%g,%g,%g,%g", pts[1].fX, pts[1].fY,
+                             pts[2].fX, pts[2].fY, pts[3].fX, pts[3].fY);
+                break;
+            case SkPath::kClose_Verb:
+                str->appendf("X");
+                break;
+            case SkPath::kDone_Verb:
+                return;
+        }
+    }
 }
 
 static void toString(const SkPath& path, SkString* str) {
@@ -28,6 +56,11 @@
         SkRect bounds;
         path.computeBounds(&bounds, SkPath::kFast_BoundsType);
         toString(bounds, str);
+#if 1
+        SkString s;
+        dumpVerbs(path, &s);
+        str->append(s.c_str());
+#endif
         str->append("]");
         str->prepend("path:[");
     }
@@ -244,7 +277,7 @@
                                const SkPaint* paint) {
     SkString str;
     toString(bitmap, &str);
-    this->dump(kDrawBitmap_Verb, paint, "drawBitmap(%s (%g %g))", str.c_str(),
+    this->dump(kDrawBitmap_Verb, paint, "drawBitmap(%s %g %g)", str.c_str(),
                SkScalarToFloat(x), SkScalarToFloat(y));
 }
 
@@ -279,7 +312,7 @@
                                const SkPaint* paint) {
     SkString str;
     toString(bitmap, &str);
-    this->dump(kDrawBitmap_Verb, paint, "drawSprite(%s (%d %d))", str.c_str(),
+    this->dump(kDrawBitmap_Verb, paint, "drawSprite(%s %d %d)", str.c_str(),
                x, y);
 }
 
@@ -287,7 +320,7 @@
                              SkScalar y, const SkPaint& paint) {
     SkString str;
     toString(text, byteLength, paint.getTextEncoding(), &str);
-    this->dump(kDrawText_Verb, &paint, "drawText(%s [%d] (%g %g))", str.c_str(),
+    this->dump(kDrawText_Verb, &paint, "drawText(%s [%d] %g %g)", str.c_str(),
                byteLength, SkScalarToFloat(x), SkScalarToFloat(y));
 }
 
@@ -295,7 +328,7 @@
                                 const SkPoint pos[], const SkPaint& paint) {
     SkString str;
     toString(text, byteLength, paint.getTextEncoding(), &str);
-    this->dump(kDrawText_Verb, &paint, "drawPosText(%s [%d] (%g %g ...))",
+    this->dump(kDrawText_Verb, &paint, "drawPosText(%s [%d] %g %g ...)",
                str.c_str(), byteLength, SkScalarToFloat(pos[0].fX),
                SkScalarToFloat(pos[0].fY));
 }
@@ -305,7 +338,7 @@
                                  const SkPaint& paint) {
     SkString str;
     toString(text, byteLength, paint.getTextEncoding(), &str);
-    this->dump(kDrawText_Verb, &paint, "drawPosTextH(%s [%d] (%g %g ...))",
+    this->dump(kDrawText_Verb, &paint, "drawPosTextH(%s [%d] %g %g ...)",
                str.c_str(), byteLength, SkScalarToFloat(xpos[0]),
                SkScalarToFloat(constY));
 }
@@ -328,7 +361,7 @@
                                  const SkColor colors[], SkXfermode* xmode,
                                  const uint16_t indices[], int indexCount,
                                  const SkPaint& paint) {
-    this->dump(kDrawVertices_Verb, &paint, "drawVertices(%s [%d] [%g %g ...]",
+    this->dump(kDrawVertices_Verb, &paint, "drawVertices(%s [%d] %g %g ...)",
                toString(vmode), vertexCount, SkScalarToFloat(vertices[0].fX),
                SkScalarToFloat(vertices[0].fY));
 }
diff --git a/src/views/SkOSFile.cpp b/src/utils/SkOSFile.cpp
similarity index 100%
rename from src/views/SkOSFile.cpp
rename to src/utils/SkOSFile.cpp