fix cheap calc of edgelist size
authorreed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 5 Nov 2009 21:04:00 +0000 (21:04 +0000)
committerreed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 5 Nov 2009 21:04:00 +0000 (21:04 +0000)
git-svn-id: http://skia.googlecode.com/svn/trunk@419 2bbb7eff-a529-9590-31e7-b0007b416f81

samplecode/SampleFuzz.cpp
src/core/SkScan_AntiPath.cpp
src/core/SkScan_Path.cpp

index 309affe02bd3c0d21feb5609189bb97e62b4a5fd..ba1fc0338214387424c893b09bc39c960a0ae5ff 100644 (file)
@@ -122,7 +122,7 @@ static void do_fuzz(SkCanvas* canvas) {
             case 1: mode = SkXfermode::kXor_Mode; break;
             case 2: mode = SkXfermode::kSrcOver_Mode; break;
           }
-          paint.setXfermode(mode);
+          paint.setXfermodeMode(mode);
       }
       break;
 
@@ -339,6 +339,7 @@ protected:
     }
     
     virtual void onDraw(SkCanvas* canvas) {
+        SkIRect r = canvas->getTotalClip().getBounds();
         this->drawBG(canvas);
         do_fuzz(canvas);
         this->inval(NULL);
index c5504c6c2e25d67c03f27c68418b659aee5b9c74..7b24f73d56c8a4ac155277037b4abd3bffb4ab8b 100644 (file)
@@ -366,7 +366,6 @@ void SkScan::AntiFillPath(const SkPath& path, const SkRegion& clip,
     if (ir.isEmpty()) {
         return;
     }
-    SkASSERT(SkIntToScalar(ir.fTop) <= path.getBounds().fTop);
 
     // use bit-or since we expect all to pass, so no need to go slower with
     // a short-circuiting logical-or
index e2745795aef5a62cf21f96da399933aa874d1535..8246376a79b5cdae151e34bff5262c9bccb63b18 100644 (file)
@@ -446,11 +446,23 @@ static int worst_case_edge_count(const SkPath& path, size_t* storage)
 
 /* Much faster than worst_case_edge_count, but over estimates even more
 */
-static int cheap_worst_case_edge_count(const SkPath& path, size_t* storage)
-{
+static int cheap_worst_case_edge_count(const SkPath& path, size_t* storage) {
     int ptCount = path.getPoints(NULL, 0);
-    int edgeCount = ptCount;
-    *storage = edgeCount * sizeof(SkCubicEdge);
+    // worst case is curve, close, curve, close, as that is 
+    //     2 lines per pt, or             : pts * 2
+    //     2 quads + 1 line per 2 pts, or : pts * 3 / 2
+    //     3 cubics + 1 line per 3 pts    : pts * 4 / 3
+    int edgeCount = ptCount << 1;
+    // worst storage, due to relative size of different edge types, is
+    // quads * 3 / 2
+    size_t quadSize = (ptCount * 3 >> 1) * sizeof(SkQuadraticEdge);
+#if 0
+    size_t lineSize = (ptCount << 1) * sizeof(SkEdge);
+    size_t cubicSize = (ptCount * 3 / 4) * sizeof(SkCubicEdge);
+    SkASSERT(lineSize <= quadSize);
+    SkASSERT(cubicSize <= quadSize);
+#endif
+    *storage = quadSize;
     return edgeCount;
 }