Incorporate changes related to Tom's post-hoc comments on the convex path renderer.
authorbsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 17 Jan 2012 16:28:34 +0000 (16:28 +0000)
committerbsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 17 Jan 2012 16:28:34 +0000 (16:28 +0000)
git-svn-id: http://skia.googlecode.com/svn/trunk@3045 2bbb7eff-a529-9590-31e7-b0007b416f81

gm/convexpaths.cpp
src/gpu/GrAAConvexPathRenderer.cpp

index a7e31197692f1c1497c857ba159bb60fc7750ef0..5d8f049bab878097989c2923d7967873ee046ada 100644 (file)
@@ -79,6 +79,8 @@ protected:
                                         20 * SK_Scalar1, 40 * SK_Scalar1,
                                         SkPath::kCCW_Direction);
         /*
+        It turns out arcTos are not automatically marked as convex and they
+        may in fact be ever so slightly concave.
         fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0,
                                                   50 * SK_Scalar1,
                                                   100 * SK_Scalar1),
@@ -86,9 +88,16 @@ protected:
         */
 
         // point degenerate
-        fPaths.push_back().lineTo(0,0);
-        fPaths.push_back().quadTo(0,0,0,0);
-        fPaths.push_back().cubicTo(0,0,0,0,0,0);
+        fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
+        fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1);
+        
+        fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
+        fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
+                             50 * SK_Scalar1, 50 * SK_Scalar1);
+        fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
+        fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1,
+                              50 * SK_Scalar1, 50 * SK_Scalar1,
+                              50 * SK_Scalar1, 50 * SK_Scalar1);
 
         // line degenerate
         fPaths.push_back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
index 7260962b18a0f140ea1efd66048b7d3cceb22907..8cf6c77fcfe03237c5303446aed87de8387f6f97 100644 (file)
@@ -87,10 +87,13 @@ bool get_segments(const GrPath& path,
     *quadCnt = 0;
     *lineCnt = 0;
     SkPath::Iter iter(path, true);
-    // This renderer overemphasis very thin paths (every pixel intersected by
-    // the path will be at least 1/2 on). When the path degenerates to a line
-    // this makes the path draw as a hairline. This is a pretty glaring error
-    // so we detect this case and will not draw.
+    // This renderer overemphasises very thin path regions. We use the distance
+    // to the path from the sample to compute coverage. Every pixel intersected
+    // by the path will be hit and the maximum distance is sqrt(2)/2. We don't
+    // notice that the sample may be close to a very thin area of the path and 
+    // thus should be very light. This is particularly egregious for degenerate
+    // line paths. We detect paths that are very close to a line (zero area) and
+    // draw nothing.
     if (is_path_degenerate(path)) {
         return false;
     }
@@ -147,8 +150,11 @@ void get_counts(int quadCount, int lineCount, int* vCount, int* iCount) {
     *iCount = 15  * lineCount + 24 * quadCount;
 }
 
-// for visual debugging, exagerate the AA smear at the edges
-// requires modifying the distance calc in the shader actually shade differently
+// This macro can be defined for visual debugging purposes. It exagerates the AA
+// smear at the edges by increasing the size of the extruded geometry used for
+// AA. However, the coverage value computed in the shader will still go to zero
+// at distance > .5 outside the curves. So, the shader code has be modified as
+// well to stretch out the AA smear.
 //#define STRETCH_AA
 #define STRETCH_FACTOR (20 * SK_Scalar1)