diff options
author | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-05-22 12:14:50 +0000 |
---|---|---|
committer | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-05-22 12:14:50 +0000 |
commit | 67febd9506629568d6e63b4a9e673ace4b42fa2a (patch) | |
tree | 7f25665954a94dab45b37b1deeb1fe1de20db8e3 | |
parent | f3fcbbea08863f0632c6a9ea056369427fe38d14 (diff) |
Converted AAClips SampleApp slide to GM:simpleaaclip
http://codereview.appspot.com/6220043/
git-svn-id: http://skia.googlecode.com/svn/trunk@4025 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | gm/simpleaaclip.cpp | 209 | ||||
-rw-r--r-- | gyp/SampleApp.gyp | 1 | ||||
-rw-r--r-- | gyp/gm.gyp | 3 | ||||
-rw-r--r-- | gyp/gmslides.gypi | 1 | ||||
-rw-r--r-- | samplecode/SampleAAClip2.cpp | 275 |
5 files changed, 213 insertions, 276 deletions
diff --git a/gm/simpleaaclip.cpp b/gm/simpleaaclip.cpp new file mode 100644 index 0000000000..6873816b20 --- /dev/null +++ b/gm/simpleaaclip.cpp @@ -0,0 +1,209 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#include "gm.h" +#include "SkCanvas.h" +#include "SkAAClip.h" + +namespace skiagm { + +static void paint_rgn(SkCanvas* canvas, const SkAAClip& clip, + const SkPaint& paint) { + SkMask mask; + 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); + + // need to copy for deferred drawing test to work + SkBitmap bm2; + + bm.deepCopyTo(&bm2, SkBitmap::kA8_Config); + + canvas->drawBitmap(bm2, + SK_Scalar1 * mask.fBounds.fLeft, + SK_Scalar1 * mask.fBounds.fTop, + &paint); +} + +////////////////////////////////////////////////////////////////////////////// +/* + * This GM tests anti aliased single operation booleans with SkAAClips, + * SkRect and SkPaths. + */ +class SimpleClipGM : public GM { +public: + enum SkGeomTypes { + kRect_GeomType, + kPath_GeomType, + kAAClip_GeomType + }; + + SimpleClipGM(SkGeomTypes geomType) + : fGeomType(geomType) { + + // offset the rects a bit so we get anti-aliasing in the rect case + fBase.set(SkFloatToScalar(100.5f), + SkFloatToScalar(100.5f), + SkFloatToScalar(150.5f), + SkFloatToScalar(150.5f)); + fRect = fBase; + fRect.inset(5, 5); + fRect.offset(25, 25); + + fBasePath.addRoundRect(fBase, SkIntToScalar(5), SkIntToScalar(5)); + fRectPath.addRoundRect(fRect, SkIntToScalar(5), SkIntToScalar(5)); + INHERITED::setBGColor(0xFFDDDDDD); + } + +protected: + void buildRgn(SkAAClip* clip, SkRegion::Op op) { + clip->setPath(fBasePath, NULL, true); + + SkAAClip clip2; + clip2.setPath(fRectPath, NULL, true); + clip->op(clip2, op); + } + + void drawOrig(SkCanvas* canvas) { + SkPaint paint; + + paint.setStyle(SkPaint::kStroke_Style); + paint.setColor(SK_ColorBLACK); + + canvas->drawRect(fBase, paint); + canvas->drawRect(fRect, paint); + } + + void drawRgnOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) { + + SkAAClip clip; + + this->buildRgn(&clip, op); + this->drawOrig(canvas); + + SkPaint paint; + paint.setColor(color); + paint_rgn(canvas, clip, paint); + } + + void drawPathsOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) { + + this->drawOrig(canvas); + + canvas->save(); + + // create the clip mask with the supplied boolean op + if (kPath_GeomType == fGeomType) { + // path-based case + canvas->clipPath(fBasePath, SkRegion::kReplace_Op, true); + canvas->clipPath(fRectPath, op, true); + } else { + // rect-based case + canvas->clipRect(fBase, SkRegion::kReplace_Op, true); + canvas->clipRect(fRect, op, true); + } + + // draw a rect that will entirely cover the clip mask area + SkPaint paint; + paint.setColor(color); + + SkRect r = SkRect::MakeLTRB(SkIntToScalar(90), SkIntToScalar(90), + SkIntToScalar(180), SkIntToScalar(180)); + + canvas->drawRect(r, paint); + + canvas->restore(); + } + + virtual SkString onShortName() { + SkString str; + str.printf("simpleaaclip_%s", + kRect_GeomType == fGeomType ? "rect" : + (kPath_GeomType == fGeomType ? "path" : + "aaclip")); + return str; + } + + virtual SkISize onISize() { + return make_isize(640, 480); + } + + virtual void onDraw(SkCanvas* canvas) { + + static const struct { + SkColor fColor; + const char* fName; + SkRegion::Op fOp; + } gOps[] = { + { SK_ColorBLACK, "Difference", SkRegion::kDifference_Op }, + { SK_ColorRED, "Intersect", SkRegion::kIntersect_Op }, + { 0xFF008800, "Union", SkRegion::kUnion_Op }, + { SK_ColorBLUE, "XOR", SkRegion::kXOR_Op }, + { SK_ColorGREEN, "Rev Diff", SkRegion::kReverseDifference_Op }, + { SK_ColorYELLOW, "Replace", SkRegion::kReplace_Op } + }; + + SkPaint textPaint; + textPaint.setAntiAlias(true); + textPaint.setTextSize(SK_Scalar1*24); + + for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) { + canvas->drawText(gOps[op].fName, strlen(gOps[op].fName), + SkIntToScalar(75), SkIntToScalar(50), + textPaint); + + if (kAAClip_GeomType == fGeomType) { + this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor); + } else { + this->drawPathsOped(canvas, gOps[op].fOp, gOps[op].fColor); + } + + if (op && !(op % 3)) { + canvas->translate(SkIntToScalar(-600), SkIntToScalar(250)); + } else { + canvas->translate(SkIntToScalar(200), 0); + } + } + } +private: + + SkGeomTypes fGeomType; + + SkRect fBase; + SkRect fRect; + + SkPath fBasePath; // fBase as a round rect + SkPath fRectPath; // fRect as a round rect + + typedef GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +// rects +static GM* MyFactory(void*) { return new SimpleClipGM( + SimpleClipGM::kRect_GeomType); } +static GMRegistry reg(MyFactory); + +// paths +static GM* MyFactory2(void*) { return new SimpleClipGM( + SimpleClipGM::kPath_GeomType); } +static GMRegistry reg2(MyFactory2); + +// aa clip +static GM* MyFactory3(void*) { return new SimpleClipGM( + SimpleClipGM::kAAClip_GeomType); } +static GMRegistry reg3(MyFactory3); + +} diff --git a/gyp/SampleApp.gyp b/gyp/SampleApp.gyp index a9af72a235..84524880be 100644 --- a/gyp/SampleApp.gyp +++ b/gyp/SampleApp.gyp @@ -24,7 +24,6 @@ '../samplecode/OverView.cpp', '../samplecode/Sample2PtRadial.cpp', '../samplecode/SampleAAClip.cpp', - '../samplecode/SampleAAClip2.cpp', '../samplecode/SampleAARects.cpp', '../samplecode/SampleAARectModes.cpp', '../samplecode/SampleAll.cpp', diff --git a/gyp/gm.gyp b/gyp/gm.gyp index 9e3eaacfe8..b33313010f 100644 --- a/gyp/gm.gyp +++ b/gyp/gm.gyp @@ -7,6 +7,9 @@ { 'target_name': 'gm', 'type': 'executable', + 'include_dirs' : [ + '../src/core', + ], 'includes': [ 'gmslides.gypi', ], diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi index 659fe9f192..2b64074334 100644 --- a/gyp/gmslides.gypi +++ b/gyp/gmslides.gypi @@ -46,6 +46,7 @@ '../gm/shadertext.cpp', '../gm/shadows.cpp', '../gm/shapes.cpp', + '../gm/simpleaaclip.cpp', '../gm/strokefill.cpp', '../gm/strokerects.cpp', '../gm/strokes.cpp', diff --git a/samplecode/SampleAAClip2.cpp b/samplecode/SampleAAClip2.cpp deleted file mode 100644 index 6000da059d..0000000000 --- a/samplecode/SampleAAClip2.cpp +++ /dev/null @@ -1,275 +0,0 @@ - -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -#include "SkAAClip.h" -#include "SampleCode.h" -#include "SkView.h" -#include "SkCanvas.h" -#include "SkGradientShader.h" -#include "SkPath.h" -#include "SkRegion.h" -#include "SkShader.h" -#include "SkUtils.h" -#include "SkImageDecoder.h" - -#define USE_PATHS 1 - -#ifdef SK_BUILD_FOR_WIN -// windows doesn't have roundf -inline float roundf(float x) { return (x-floor(x))>0.5 ? ceil(x) : floor(x); } -#endif - -static void drawClip(SkCanvas* canvas, const SkAAClip& clip) { - SkMask mask; - 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); - - SkPaint paint; - canvas->drawBitmap(bm, - SK_Scalar1 * mask.fBounds.fLeft, - SK_Scalar1 * mask.fBounds.fTop, - &paint); -} - -static void paint_rgn(SkCanvas* canvas, const SkAAClip& clip, - const SkPaint& paint) { - SkMask mask; - 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); - - canvas->drawBitmap(bm, - SK_Scalar1 * mask.fBounds.fLeft, - SK_Scalar1 * mask.fBounds.fTop, - &paint); -} - -class AAClipView2 : public SampleView { -public: - AAClipView2() { - fBase.set(100, 100, 150, 150); - fRect = fBase; - fRect.inset(5, 5); - fRect.offset(25, 25); - this->setBGColor(0xFFDDDDDD); - } - - static void setAAClip(SkAAClip* clip, const SkIRect& rect) { - SkRect r; - r.set(rect); - SkPath path; - path.addRoundRect(r, SkIntToScalar(5), SkIntToScalar(5)); - clip->setPath(path, NULL, true); - } - - void build_rgn(SkAAClip* clip, SkRegion::Op op) { - setAAClip(clip, fBase); - - SkAAClip clip2; - setAAClip(&clip2, fRect); - clip->op(clip2, op); - } - -protected: - // overrides from SkEventSink - virtual bool onQuery(SkEvent* evt) { - if (SampleCode::TitleQ(*evt)) { - SampleCode::TitleR(evt, "AAClips"); - return true; - } - return this->INHERITED::onQuery(evt); - } - - void drawOrig(SkCanvas* canvas, bool bg) { - SkRect r; - SkPaint paint; - - paint.setStyle(SkPaint::kStroke_Style); - if (bg) - paint.setColor(0xFFBBBBBB); - - r.set(fBase); - canvas->drawRect(r, paint); - r.set(fRect); - canvas->drawRect(r, paint); - } - - static void outer_frame(SkCanvas* canvas, const SkIRect& rect) { - SkRect r; - r.set(rect); - r.inset(-SK_ScalarHalf, -SK_ScalarHalf); - - SkPaint paint; - paint.setColor(SK_ColorGRAY); - paint.setStyle(SkPaint::kStroke_Style); - canvas->drawRect(r, paint); - } - - void drawRgnOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) { - - SkAAClip clip; - - this->build_rgn(&clip, op); - this->drawOrig(canvas, true); - - SkPaint paint; - paint.setColor((color & ~(0xFF << 24)) | (0x44 << 24)); - paint_rgn(canvas, clip, paint); - - paint.setStyle(SkPaint::kStroke_Style); - paint.setColor(color); - paint_rgn(canvas, clip, paint); - SkAAClip clip2(clip); - clip2.translate(0, 80); - outer_frame(canvas, clip2.getBounds()); - paint_rgn(canvas, clip2, paint); - } - - static void createPath(SkPath *path, const SkIRect& rect) { - SkRect r; - r.set(rect); - path->addRoundRect(r, SkIntToScalar(5), SkIntToScalar(5)); - } - - void drawPathsOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) { - - this->drawOrig(canvas, true); - - canvas->save(); - - // create the clip mask with the supplied boolean op - -#if USE_PATHS - // path-based case - SkPath base; - createPath(&base, fBase); - - canvas->clipPath(base, SkRegion::kReplace_Op, true); -#else - // rect-based case - SkRect base; - base.set(fBase); - // offset the rects so we get a bit of anti-aliasing - base.offset(SkFloatToScalar(0.5f), SkFloatToScalar(0.5f)); - canvas->clipRect(base, SkRegion::kReplace_Op, true); - -#endif - -#if USE_PATHS - // path-based case - SkPath rect; - createPath(&rect, fRect); - - canvas->clipPath(rect, op, true); -#else - // rect-based case - SkRect rect; - rect.set(fRect); - // offset the rects so we get a bit of anti-aliasing - rect.offset(SkFloatToScalar(0.5f), SkFloatToScalar(0.5f)); - canvas->clipRect(rect, op, true); -#endif - - // draw a rect that will entirely cover the clip mask area - SkPaint paint; - paint.setColor(color); - - SkRect r = SkRect::MakeLTRB(SkIntToScalar(90), SkIntToScalar(90), - SkIntToScalar(180), SkIntToScalar(180)); - - canvas->drawRect(r, paint); - - canvas->restore(); - } - - virtual void onDrawContent(SkCanvas* canvas) { - - static const struct { - SkColor fColor; - const char* fName; - SkRegion::Op fOp; - } gOps[] = { - { SK_ColorBLACK, "Difference", SkRegion::kDifference_Op }, - { SK_ColorRED, "Intersect", SkRegion::kIntersect_Op }, - { 0xFF008800, "Union", SkRegion::kUnion_Op }, - { SK_ColorBLUE, "XOR", SkRegion::kXOR_Op }, - { SK_ColorGREEN, "Rev Diff", SkRegion::kReverseDifference_Op }, - { SK_ColorYELLOW, "Replace", SkRegion::kReplace_Op } - }; - - SkPaint textPaint; - textPaint.setAntiAlias(true); - textPaint.setTextSize(SK_Scalar1*24); - - this->drawOrig(canvas, false); - - canvas->translate(0, SkIntToScalar(200)); - - for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) { - canvas->drawText(gOps[op].fName, strlen(gOps[op].fName), - SkIntToScalar(75), SkIntToScalar(50), textPaint); - - this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor); - - if (op && !(op % 3)) { - canvas->translate(SkIntToScalar(-600), SkIntToScalar(250)); - } else { - canvas->translate(SkIntToScalar(200), 0); - } - } - - canvas->translate(SkIntToScalar(int(SK_ARRAY_COUNT(gOps) / 3) * -200), - SkIntToScalar(250)); - - for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) { - canvas->drawText(gOps[op].fName, strlen(gOps[op].fName), - SkIntToScalar(75), SkIntToScalar(50), textPaint); - - this->drawPathsOped(canvas, gOps[op].fOp, gOps[op].fColor); - - if (op && !(op % 3)) { - canvas->translate(SkIntToScalar(-600), SkIntToScalar(250)); - } else { - canvas->translate(SkIntToScalar(200), 0); - } - } - - } - - virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { - return fRect.contains(SkScalarRound(x), SkScalarRound(y)) ? new Click(this) : NULL; - } - - virtual bool onClick(Click* click) { - fRect.offset(click->fICurr.fX - click->fIPrev.fX, - click->fICurr.fY - click->fIPrev.fY); - this->inval(NULL); - return true; - } - -private: - SkIRect fBase, fRect; - - typedef SampleView INHERITED; -}; - -////////////////////////////////////////////////////////////////////////////// - -static SkView* MyFactory() { return new AAClipView2; } -static SkViewRegister reg(MyFactory); - |