1322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 2322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com/* 3322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com * Copyright 2011 Google Inc. 4322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com * 5322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com * Use of this source code is governed by a BSD-style license that can be 6322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com * found in the LICENSE file. 7322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com */ 8322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 9322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com#include "SampleCode.h" 10322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com#include "SkView.h" 11322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com#include "SkCanvas.h" 12322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com#include "SkAAClip.h" 13322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 14c90419199525141a5b98091f856e359bf9daf5b1reed@google.comstatic void testop(const SkIRect& r0, const SkIRect& r1, SkRegion::Op op, 15c90419199525141a5b98091f856e359bf9daf5b1reed@google.com const SkIRect& expectedR) { 16c90419199525141a5b98091f856e359bf9daf5b1reed@google.com SkAAClip c0, c1, c2; 17c90419199525141a5b98091f856e359bf9daf5b1reed@google.com c0.setRect(r0); 18c90419199525141a5b98091f856e359bf9daf5b1reed@google.com c1.setRect(r1); 19c90419199525141a5b98091f856e359bf9daf5b1reed@google.com c2.op(c0, c1, op); 20ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 210e51577a14f903ffeafa117a75954baeb173ffb9humper@google.com SkDEBUGCODE(SkIRect r2 = c2.getBounds()); 22c90419199525141a5b98091f856e359bf9daf5b1reed@google.com SkASSERT(r2 == expectedR); 23c90419199525141a5b98091f856e359bf9daf5b1reed@google.com} 24c90419199525141a5b98091f856e359bf9daf5b1reed@google.com 25c90419199525141a5b98091f856e359bf9daf5b1reed@google.comstatic const struct { 26c90419199525141a5b98091f856e359bf9daf5b1reed@google.com SkIRect r0; 27c90419199525141a5b98091f856e359bf9daf5b1reed@google.com SkIRect r1; 28c90419199525141a5b98091f856e359bf9daf5b1reed@google.com SkRegion::Op op; 29c90419199525141a5b98091f856e359bf9daf5b1reed@google.com SkIRect expectedR; 30c90419199525141a5b98091f856e359bf9daf5b1reed@google.com} gRec[] = { 31c90419199525141a5b98091f856e359bf9daf5b1reed@google.com {{ 1, 2, 9, 3 }, { -3, 2, 5, 11 }, SkRegion::kDifference_Op, { 5, 2, 9, 3 }}, 32c90419199525141a5b98091f856e359bf9daf5b1reed@google.com {{ 1, 10, 5, 13 }, { 1, 2, 5, 11 }, SkRegion::kDifference_Op, { 1, 11, 5, 13 }}, 33c90419199525141a5b98091f856e359bf9daf5b1reed@google.com {{ 1, 10, 5, 13 }, { 1, 2, 5, 11 }, SkRegion::kReverseDifference_Op, { 1, 2, 5, 10 }}, 34c90419199525141a5b98091f856e359bf9daf5b1reed@google.com}; 35c90419199525141a5b98091f856e359bf9daf5b1reed@google.com 36c90419199525141a5b98091f856e359bf9daf5b1reed@google.comstatic void testop() { 37c90419199525141a5b98091f856e359bf9daf5b1reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { 38c90419199525141a5b98091f856e359bf9daf5b1reed@google.com testop(gRec[i].r0, gRec[i].r1, gRec[i].op, gRec[i].expectedR); 39c90419199525141a5b98091f856e359bf9daf5b1reed@google.com } 40c90419199525141a5b98091f856e359bf9daf5b1reed@google.com} 41c90419199525141a5b98091f856e359bf9daf5b1reed@google.com 42322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.comstatic void drawClip(SkCanvas* canvas, const SkAAClip& clip) { 43322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkMask mask; 44322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkBitmap bm; 45ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 46322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com clip.copyToMask(&mask); 47045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkAutoMaskFreeImage amfi(mask.fImage); 48045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com 49dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org bm.installMaskPixels(mask); 50322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 51322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkPaint paint; 52820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com canvas->drawBitmap(bm, 53820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com SK_Scalar1 * mask.fBounds.fLeft, 54820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com SK_Scalar1 * mask.fBounds.fTop, 55820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com &paint); 56322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com} 57322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 58322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.comclass AAClipView : public SampleView { 59322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.compublic: 60322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com AAClipView() { 61c90419199525141a5b98091f856e359bf9daf5b1reed@google.com testop(); 62322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com } 63322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 64322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.comprotected: 65322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com // overrides from SkEventSink 66322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com virtual bool onQuery(SkEvent* evt) { 67322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com if (SampleCode::TitleQ(*evt)) { 68322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SampleCode::TitleR(evt, "AAClip"); 69322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com return true; 70322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com } 71322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com return this->INHERITED::onQuery(evt); 72322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com } 73322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 74322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com virtual void onDrawContent(SkCanvas* canvas) { 75322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com#if 1 76322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkAAClip aaclip; 77322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkPath path; 78322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkRect bounds; 79ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 80322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com bounds.set(0, 0, 20, 20); 81322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com bounds.inset(SK_ScalarHalf, SK_ScalarHalf); 82322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 83322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com// path.addRect(bounds); 84322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com// path.addOval(bounds); 85322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com path.addRoundRect(bounds, 4, 4); 86322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com aaclip.setPath(path); 87322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com canvas->translate(30, 30); 88322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com drawClip(canvas, aaclip); 89322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 90322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkAAClip aaclip2; 91322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com path.offset(10, 10); 92322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com aaclip2.setPath(path); 93322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com canvas->translate(30, 0); 94322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com drawClip(canvas, aaclip2); 95322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 96322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkAAClip aaclip3; 97322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com aaclip3.op(aaclip, aaclip2, SkRegion::kIntersect_Op); 98322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com canvas->translate(30, 0); 99322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com drawClip(canvas, aaclip3); 100ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 101322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com#endif 102ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 103322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com#if 0 104322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkRect r; 105322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com r.set(0, 0, this->width(), this->height()); 106322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com r.inset(20, 20); 107322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com canvas->clipRect(r); 108ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 109322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkPath path; 110322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com path.addRect(r); 111322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com SkPaint paint; 112322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com paint.setAntiAlias(true); 113322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com paint.setColor(SK_ColorRED); 114322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com canvas->drawPath(path, paint); 115322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com#endif 116322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com } 117322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 118322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.comprivate: 119322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com typedef SkView INHERITED; 120322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com}; 121322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 122322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com////////////////////////////////////////////////////////////////////////////// 123322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.com 124322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.comstatic SkView* MyFactory() { return new AAClipView; } 125322878907f6c5c5fb8abdbce7d348a3cd66ff2fareed@google.comstatic SkViewRegister reg(MyFactory); 126