blob: 0003c6ad5ca9507a04cda8032a085a914ad4884b [file] [log] [blame]
reed@google.com32287892011-10-05 16:27:44 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Ben Wagnerb2c4ea62018-08-08 11:36:17 -04008#include "Sample.h"
reedfb8c1fc2015-08-04 18:44:56 -07009#include "SkAAClip.h"
bungemand3ebb482015-08-05 13:57:49 -070010#include "SkCanvas.h"
11#include "SkPath.h"
reed@google.com32287892011-10-05 16:27:44 +000012
reed@google.comc9041912011-10-27 16:58:46 +000013static void testop(const SkIRect& r0, const SkIRect& r1, SkRegion::Op op,
14 const SkIRect& expectedR) {
15 SkAAClip c0, c1, c2;
16 c0.setRect(r0);
17 c1.setRect(r1);
18 c2.op(c0, c1, op);
rmistry@google.comae933ce2012-08-23 18:19:56 +000019
humper@google.com0e515772013-01-07 19:54:40 +000020 SkDEBUGCODE(SkIRect r2 = c2.getBounds());
reed@google.comc9041912011-10-27 16:58:46 +000021 SkASSERT(r2 == expectedR);
22}
23
24static const struct {
25 SkIRect r0;
26 SkIRect r1;
27 SkRegion::Op op;
28 SkIRect expectedR;
29} gRec[] = {
30 {{ 1, 2, 9, 3 }, { -3, 2, 5, 11 }, SkRegion::kDifference_Op, { 5, 2, 9, 3 }},
31 {{ 1, 10, 5, 13 }, { 1, 2, 5, 11 }, SkRegion::kDifference_Op, { 1, 11, 5, 13 }},
32 {{ 1, 10, 5, 13 }, { 1, 2, 5, 11 }, SkRegion::kReverseDifference_Op, { 1, 2, 5, 10 }},
33};
34
35static void testop() {
36 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
37 testop(gRec[i].r0, gRec[i].r1, gRec[i].op, gRec[i].expectedR);
38 }
39}
40
reed@google.com32287892011-10-05 16:27:44 +000041static void drawClip(SkCanvas* canvas, const SkAAClip& clip) {
42 SkMask mask;
43 SkBitmap bm;
rmistry@google.comae933ce2012-08-23 18:19:56 +000044
reed@google.com32287892011-10-05 16:27:44 +000045 clip.copyToMask(&mask);
reed@google.com045e62d2011-10-24 12:19:46 +000046 SkAutoMaskFreeImage amfi(mask.fImage);
47
commit-bot@chromium.orgdac52252014-02-17 21:21:46 +000048 bm.installMaskPixels(mask);
reed@google.com32287892011-10-05 16:27:44 +000049
50 SkPaint paint;
bsalomon@google.com820e80a2011-10-24 21:09:40 +000051 canvas->drawBitmap(bm,
52 SK_Scalar1 * mask.fBounds.fLeft,
53 SK_Scalar1 * mask.fBounds.fTop,
54 &paint);
reed@google.com32287892011-10-05 16:27:44 +000055}
56
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040057class AAClipView : public Sample {
reed@google.com32287892011-10-05 16:27:44 +000058public:
59 AAClipView() {
reed@google.comc9041912011-10-27 16:58:46 +000060 testop();
reed@google.com32287892011-10-05 16:27:44 +000061 }
62
63protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040064 virtual bool onQuery(Sample::Event* evt) {
65 if (Sample::TitleQ(*evt)) {
66 Sample::TitleR(evt, "AAClip");
reed@google.com32287892011-10-05 16:27:44 +000067 return true;
68 }
69 return this->INHERITED::onQuery(evt);
70 }
71
72 virtual void onDrawContent(SkCanvas* canvas) {
73#if 1
74 SkAAClip aaclip;
75 SkPath path;
76 SkRect bounds;
rmistry@google.comae933ce2012-08-23 18:19:56 +000077
reed@google.com32287892011-10-05 16:27:44 +000078 bounds.set(0, 0, 20, 20);
79 bounds.inset(SK_ScalarHalf, SK_ScalarHalf);
80
81// path.addRect(bounds);
82// path.addOval(bounds);
83 path.addRoundRect(bounds, 4, 4);
84 aaclip.setPath(path);
85 canvas->translate(30, 30);
86 drawClip(canvas, aaclip);
87
88 SkAAClip aaclip2;
89 path.offset(10, 10);
90 aaclip2.setPath(path);
91 canvas->translate(30, 0);
92 drawClip(canvas, aaclip2);
93
94 SkAAClip aaclip3;
95 aaclip3.op(aaclip, aaclip2, SkRegion::kIntersect_Op);
96 canvas->translate(30, 0);
97 drawClip(canvas, aaclip3);
rmistry@google.comae933ce2012-08-23 18:19:56 +000098
reed@google.com32287892011-10-05 16:27:44 +000099#endif
rmistry@google.comae933ce2012-08-23 18:19:56 +0000100
reed@google.com32287892011-10-05 16:27:44 +0000101#if 0
102 SkRect r;
103 r.set(0, 0, this->width(), this->height());
104 r.inset(20, 20);
105 canvas->clipRect(r);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000106
reed@google.com32287892011-10-05 16:27:44 +0000107 SkPath path;
108 path.addRect(r);
109 SkPaint paint;
110 paint.setAntiAlias(true);
111 paint.setColor(SK_ColorRED);
112 canvas->drawPath(path, paint);
113#endif
114 }
115
116private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400117 typedef Sample INHERITED;
reed@google.com32287892011-10-05 16:27:44 +0000118};
119
120//////////////////////////////////////////////////////////////////////////////
121
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400122DEF_SAMPLE( return new AAClipView(); )