diff options
author | 2011-10-24 12:19:46 +0000 | |
---|---|---|
committer | 2011-10-24 12:19:46 +0000 | |
commit | 045e62d715f5ee9b03deb5af3c750f8318096179 (patch) | |
tree | e16aed890a3a96aff73f66b13de3b079cd638df3 /samplecode | |
parent | 5a0920c22c0dfc62109efdda08ed7e150806e2ff (diff) |
enable soft clipping (yikes)
git-svn-id: http://skia.googlecode.com/svn/trunk@2515 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode')
-rw-r--r-- | samplecode/SampleAAClip.cpp | 2 | ||||
-rw-r--r-- | samplecode/SampleAAClip2.cpp | 4 | ||||
-rw-r--r-- | samplecode/SampleApp.cpp | 2 | ||||
-rw-r--r-- | samplecode/SampleClip.cpp | 88 | ||||
-rw-r--r-- | samplecode/SampleFuzz.cpp | 1 | ||||
-rw-r--r-- | samplecode/SampleXfermodesBlur.cpp | 25 |
6 files changed, 101 insertions, 21 deletions
diff --git a/samplecode/SampleAAClip.cpp b/samplecode/SampleAAClip.cpp index dd6af09253..93a77cb4d1 100644 --- a/samplecode/SampleAAClip.cpp +++ b/samplecode/SampleAAClip.cpp @@ -16,6 +16,8 @@ static void drawClip(SkCanvas* canvas, const SkAAClip& clip) { 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 6d854e80ca..e8f5a1490a 100644 --- a/samplecode/SampleAAClip2.cpp +++ b/samplecode/SampleAAClip2.cpp @@ -26,6 +26,8 @@ static void drawClip(SkCanvas* canvas, const SkAAClip& clip) { 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 @@ static void paint_rgn(SkCanvas* canvas, const SkAAClip& clip, 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 bed54596b3..740047e534 100644 --- a/samplecode/SampleApp.cpp +++ b/samplecode/SampleApp.cpp @@ -893,7 +893,7 @@ SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) { 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 87ff0b6277..570f0b98f4 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()); + p.addOval(r); + canvas->drawPath(p, paint); + } +} + +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.setStyle(SkPaint::kFill_Style); 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); } } -typedef void (*CanvasProc)(SkCanvas*); +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 @@ protected: } 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 51350be9ca..02b2391be9 100644 --- a/samplecode/SampleFuzz.cpp +++ b/samplecode/SampleFuzz.cpp @@ -354,7 +354,6 @@ protected: } 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 cce37f5f5c..11b1268086 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 @@ class XfermodesBlurView : public SampleView { 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: |