enable soft clipping (yikes)



git-svn-id: http://skia.googlecode.com/svn/trunk@2515 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleAAClip.cpp b/samplecode/SampleAAClip.cpp
index dd6af09..93a77cb 100644
--- a/samplecode/SampleAAClip.cpp
+++ b/samplecode/SampleAAClip.cpp
@@ -16,6 +16,8 @@
     SkBitmap bm;
     
     clip.copyToMask(&mask);
+    SkAutoMaskFreeImage amfi(mask.fImage);
+
     bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(),
                  mask.fBounds.height(), mask.fRowBytes);
     bm.setPixels(mask.fImage);
diff --git a/samplecode/SampleAAClip2.cpp b/samplecode/SampleAAClip2.cpp
index 6d854e8..e8f5a14 100644
--- a/samplecode/SampleAAClip2.cpp
+++ b/samplecode/SampleAAClip2.cpp
@@ -26,6 +26,8 @@
     SkBitmap bm;
     
     clip.copyToMask(&mask);
+    SkAutoMaskFreeImage amfi(mask.fImage);
+
     bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(),
                  mask.fBounds.height(), mask.fRowBytes);
     bm.setPixels(mask.fImage);
@@ -40,6 +42,8 @@
     SkBitmap bm;
     
     clip.copyToMask(&mask);
+    SkAutoMaskFreeImage amfi(mask.fImage);
+
     bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(),
                  mask.fBounds.height(), mask.fRowBytes);
     bm.setPixels(mask.fImage);
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index bed5459..740047e 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -893,7 +893,7 @@
 
     if (fUseClip) {
         canvas->drawColor(0xFFFF88FF);
-        canvas->clipPath(fClipPath);
+        canvas->clipPath(fClipPath, SkRegion::kIntersect_Op, true);
     }
 
     return canvas;
diff --git a/samplecode/SampleClip.cpp b/samplecode/SampleClip.cpp
index 87ff0b6..570f0b9 100644
--- a/samplecode/SampleClip.cpp
+++ b/samplecode/SampleClip.cpp
@@ -13,58 +13,106 @@
 #include "SkPaint.h"
 #include "SkRandom.h"
 
-#define W   270
+#define W   150
 #define H   200
 
-static void show_text(SkCanvas* canvas) {
+static void show_text(SkCanvas* canvas, bool doAA) {
     SkRandom rand;
     SkPaint paint;
-    paint.setAntiAlias(true);
+    paint.setAntiAlias(doAA);
+    paint.setLCDRenderText(true);
     paint.setTextSize(SkIntToScalar(20));
     
-    for (int i = 0; i < 300; ++i) {
+    for (int i = 0; i < 200; ++i) {
         paint.setColor((SK_A32_MASK << SK_A32_SHIFT) | rand.nextU());
         canvas->drawText("Hamburgefons", 12,
-                         rand.nextSScalar1() * W, rand.nextSScalar1() * H,
+                         rand.nextSScalar1() * W, rand.nextSScalar1() * H + 20,
                          paint);
     }
 }
 
-static void show_geo(SkCanvas* canvas) {
+static bool valid(int i) {
+    return i < 15 && i > 7;
+}
+
+static void show_fill(SkCanvas* canvas, bool doAA) {
     SkRandom rand;
     SkPaint paint;
-    paint.setAntiAlias(true);
+    paint.setAntiAlias(doAA);
     
-    for (int i = 0; i < 30; ++i) {
+    for (int i = 0; i < 50; ++i) {
         SkRect r;
         SkPath p;
-
+        
         r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
                   rand.nextUScalar1() * W, rand.nextUScalar1() * H);
-        paint.setStyle(SkPaint::kFill_Style);
         paint.setColor(rand.nextU());
         canvas->drawRect(r, paint);
         
         r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
                   rand.nextUScalar1() * W, rand.nextUScalar1() * H);
-        paint.setStyle(SkPaint::kStroke_Style);
-        paint.setColor(rand.nextU());
-        canvas->drawRect(r, paint);
-        
-        r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
-                  rand.nextUScalar1() * W, rand.nextUScalar1() * H);
-        paint.setStyle(SkPaint::kFill_Style);
         paint.setColor(rand.nextU());
         p.addOval(r);
         canvas->drawPath(p, paint);
     }
 }
 
-typedef void (*CanvasProc)(SkCanvas*);
+static SkScalar randRange(SkRandom& rand, SkScalar min, SkScalar max) {
+    SkASSERT(min <= max);
+    return min + SkScalarMul(rand.nextUScalar1(), max - min);
+}
+
+static void show_stroke(SkCanvas* canvas, bool doAA, SkScalar strokeWidth, int n) {
+    SkRandom rand;
+    SkPaint paint;
+    paint.setAntiAlias(doAA);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(strokeWidth);
+    
+    for (int i = 0; i < n; ++i) {
+        SkRect r;
+        SkPath p;
+        
+        r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
+                  rand.nextUScalar1() * W, rand.nextUScalar1() * H);
+        paint.setColor(rand.nextU());
+        canvas->drawRect(r, paint);
+        
+        r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
+                  rand.nextUScalar1() * W, rand.nextUScalar1() * H);
+        paint.setColor(rand.nextU());
+        p.addOval(r);
+        canvas->drawPath(p, paint);
+
+        const SkScalar minx = -SkIntToScalar(W)/4;
+        const SkScalar maxx = 5*SkIntToScalar(W)/4;
+        const SkScalar miny = -SkIntToScalar(H)/4;
+        const SkScalar maxy = 5*SkIntToScalar(H)/4;
+        paint.setColor(rand.nextU());
+        canvas->drawLine(randRange(rand, minx, maxx), randRange(rand, miny, maxy),
+                         randRange(rand, minx, maxx), randRange(rand, miny, maxy),
+                         paint);
+    }
+}
+
+static void show_hair(SkCanvas* canvas, bool doAA) {
+    show_stroke(canvas, doAA, 0, 150);
+}
+
+static void show_thick(SkCanvas* canvas, bool doAA) {
+    show_stroke(canvas, doAA, SkIntToScalar(5), 50);
+}
+
+typedef void (*CanvasProc)(SkCanvas*, bool);
+
+#include "SkAAClip.h"
 
 class ClipView : public SampleView {
 public:
     ClipView() {
+        SkAAClip clip;
+        SkIRect r = { -2, -3, 842, 18 };
+        clip.setRect(r);
     }
 
     virtual ~ClipView() {
@@ -81,25 +129,27 @@
     }
 
     virtual void onDrawContent(SkCanvas* canvas) {
-        canvas->drawColor(SK_ColorLTGRAY);
+        canvas->drawColor(SK_ColorWHITE);
         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
 
         static const CanvasProc gProc[] = {
-            show_text, show_geo
+            show_text, show_thick, show_hair, show_fill
         };
         
         SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
         SkPath clipPath;
         r.inset(SK_Scalar1 / 4, SK_Scalar1 / 4);
-        clipPath.addRoundRect(r, SkIntToScalar(16), SkIntToScalar(16));
+        clipPath.addRoundRect(r, SkIntToScalar(20), SkIntToScalar(20));
+
+//        clipPath.toggleInverseFillType();
 
         for (int aa = 0; aa <= 1; ++aa) {
             canvas->save();
             for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); ++i) {
                 canvas->save();
-                canvas->clipPath(clipPath);
-                canvas->drawColor(SK_ColorWHITE);
-                gProc[i](canvas);
+                canvas->clipPath(clipPath, SkRegion::kIntersect_Op, true);
+//                canvas->drawColor(SK_ColorWHITE);
+                gProc[i](canvas, SkToBool(aa));
                 canvas->restore();
                 canvas->translate(W * SK_Scalar1 * 8 / 7, 0);
             }
diff --git a/samplecode/SampleFuzz.cpp b/samplecode/SampleFuzz.cpp
index 51350be..02b2391 100644
--- a/samplecode/SampleFuzz.cpp
+++ b/samplecode/SampleFuzz.cpp
@@ -354,7 +354,6 @@
     }
     
     virtual void onDrawContent(SkCanvas* canvas) {
-        SkIRect r = canvas->getTotalClip().getBounds();
         do_fuzz(canvas);
         this->inval(NULL);
     }
diff --git a/samplecode/SampleXfermodesBlur.cpp b/samplecode/SampleXfermodesBlur.cpp
index cce37f5..11b1268 100644
--- a/samplecode/SampleXfermodesBlur.cpp
+++ b/samplecode/SampleXfermodesBlur.cpp
@@ -31,6 +31,11 @@
 #include "SkImageDecoder.h"
 #include "SkBlurMaskFilter.h"
 
+#ifdef SK_BUILD_FOR_MAC
+#import <ApplicationServices/ApplicationServices.h>
+SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef);
+#endif
+
 static void setNamedTypeface(SkPaint* paint, const char name[]) {
     SkTypeface* face = SkTypeface::CreateFromName(name, SkTypeface::kNormal);
     paint->setTypeface(face);
@@ -68,6 +73,26 @@
         r.set(ww/3, hh/3, ww*19/20, hh*19/20);
         r.offset(x, y);
         canvas->drawRect(r, p);
+
+#ifdef SK_BUILD_FOR_MAC
+        static const char* gNames[] = { "Arial", "Times", "Courier", "Lucida" };
+        for (int j = 0; j < SK_ARRAY_COUNT(gNames); ++j) {
+            CFStringRef name = CFStringCreateWithCString(NULL, gNames[j], kCFStringEncodingUTF8);
+            CTFontRef font = CTFontCreateWithName(name, 0, NULL);
+            SkTypeface* face = SkCreateTypefaceFromCTFont(font);
+            SkDebugf("%s ct:%p face:%p ats:%p\n", gNames[j], font, face, CTFontGetPlatformFont(font, NULL));
+            for (int i = 9; i <= 24; ++i) {
+                CTFontRef newFont = CTFontCreateCopyWithAttributes(font, i, NULL, NULL);
+                SkTypeface* newFace = SkCreateTypefaceFromCTFont(newFont);
+                SkDebugf("size:%d ct:%p face:%p ats:%p\n", i, newFont, newFace, CTFontGetPlatformFont(newFont, NULL));
+                newFace->unref();
+                CFRelease(newFont);
+            }
+            face->unref();
+            CFRelease(font);
+            CFRelease(name);
+        }
+#endif
     }
 
 public: