blob: 75f231970c667058afbd90666cc874e16fac6d3c [file] [log] [blame]
csmartdaltonbf4a8f92016-09-06 10:01:06 -07001/*
2 * Copyright 2016 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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkCanvas.h"
10#include "include/core/SkClipOp.h"
11#include "include/core/SkColorSpace.h"
12#include "include/core/SkImageInfo.h"
13#include "include/core/SkMatrix.h"
14#include "include/core/SkPaint.h"
15#include "include/core/SkPoint.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "include/core/SkRRect.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040017#include "include/core/SkRect.h"
18#include "include/core/SkRefCnt.h"
19#include "include/core/SkRegion.h"
20#include "include/core/SkSize.h"
21#include "include/core/SkString.h"
22#include "include/core/SkTypes.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040023#include "include/private/SkColorData.h"
Brian Salomon8f7d9532020-12-23 09:16:59 -050024#include "src/core/SkCanvasPriv.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050025#include "src/core/SkClipStack.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040026#include "tools/ToolUtils.h"
27
28#include <utility>
29
csmartdaltonbf4a8f92016-09-06 10:01:06 -070030constexpr static SkIRect kDeviceRect = {0, 0, 600, 600};
csmartdaltonbf4a8f92016-09-06 10:01:06 -070031constexpr static SkIRect kCoverRect = {50, 50, 550, 550};
csmartdaltonbf4a8f92016-09-06 10:01:06 -070032
33namespace skiagm {
34
35////////////////////////////////////////////////////////////////////////////////////////////////////
36
csmartdaltonbf4a8f92016-09-06 10:01:06 -070037/**
38 * Draws a clip that will exercise window rectangles if they are supported.
39 */
Michael Ludwige1d00402021-08-09 12:21:52 -040040class WindowRectanglesGM : public GM {
csmartdaltonbf4a8f92016-09-06 10:01:06 -070041private:
Michael Ludwige1d00402021-08-09 12:21:52 -040042 DrawResult coverClipStack(const SkClipStack&, SkCanvas*, SkString* errorMsg);
43
44 SkISize onISize() override { return SkISize::Make(kDeviceRect.width(), kDeviceRect.height()); }
45 SkString onShortName() override { return SkString("windowrectangles"); }
46 DrawResult onDraw(SkCanvas*, SkString* errorMsg) override;
csmartdaltonbf4a8f92016-09-06 10:01:06 -070047};
48
Michael Ludwige1d00402021-08-09 12:21:52 -040049DrawResult WindowRectanglesGM::coverClipStack(const SkClipStack& stack, SkCanvas* canvas,
Chris Dalton50e24d72019-02-07 16:20:09 -070050 SkString* errorMsg) {
csmartdaltonbf4a8f92016-09-06 10:01:06 -070051 SkPaint paint;
52 paint.setColor(0xff00aa80);
53
54 // Set up the canvas's clip to match our SkClipStack.
csmartdaltonbf4a8f92016-09-06 10:01:06 -070055 SkClipStack::Iter iter(stack, SkClipStack::Iter::kBottom_IterStart);
56 for (const SkClipStack::Element* element = iter.next(); element; element = iter.next()) {
Michael Ludwige1d00402021-08-09 12:21:52 -040057 SkASSERT(!element->isReplaceOp());
Mike Reed598524d2017-03-08 13:13:44 -050058 SkClipOp op = element->getOp();
59 bool isAA = element->isAA();
Brian Salomonf3b46e52017-08-30 11:37:57 -040060 switch (element->getDeviceSpaceType()) {
Michael Ludwig4e221bd2020-06-05 11:29:36 -040061 case SkClipStack::Element::DeviceSpaceType::kShader:
62 canvas->clipShader(element->refShader(), op);
63 break;
Brian Salomonf3b46e52017-08-30 11:37:57 -040064 case SkClipStack::Element::DeviceSpaceType::kPath:
65 canvas->clipPath(element->getDeviceSpacePath(), op, isAA);
Mike Reed598524d2017-03-08 13:13:44 -050066 break;
Brian Salomonf3b46e52017-08-30 11:37:57 -040067 case SkClipStack::Element::DeviceSpaceType::kRRect:
68 canvas->clipRRect(element->getDeviceSpaceRRect(), op, isAA);
Mike Reed598524d2017-03-08 13:13:44 -050069 break;
Brian Salomonf3b46e52017-08-30 11:37:57 -040070 case SkClipStack::Element::DeviceSpaceType::kRect:
71 canvas->clipRect(element->getDeviceSpaceRect(), op, isAA);
Mike Reed598524d2017-03-08 13:13:44 -050072 break;
Brian Salomonf3b46e52017-08-30 11:37:57 -040073 case SkClipStack::Element::DeviceSpaceType::kEmpty:
Michael Ludwig2f6e2f82021-08-03 13:08:50 -040074 canvas->clipRect({ 0, 0, 0, 0 }, SkClipOp::kIntersect, false);
Mike Reed598524d2017-03-08 13:13:44 -050075 break;
76 }
csmartdaltonbf4a8f92016-09-06 10:01:06 -070077 }
78
79 canvas->drawRect(SkRect::Make(kCoverRect), paint);
Chris Dalton50e24d72019-02-07 16:20:09 -070080 return DrawResult::kOk;
csmartdaltonbf4a8f92016-09-06 10:01:06 -070081}
82
Michael Ludwige1d00402021-08-09 12:21:52 -040083DrawResult WindowRectanglesGM::onDraw(SkCanvas* canvas, SkString* errorMsg) {
84 ToolUtils::draw_checkerboard(canvas, 0xffffffff, 0xffc6c3c6, 25);
85 SkClipStack stack;
86 stack.clipRect(SkRect::MakeXYWH(370.75, 80.25, 149, 100), SkMatrix::I(),
87 SkClipOp::kDifference, false);
88 stack.clipRect(SkRect::MakeXYWH(80.25, 420.75, 150, 100), SkMatrix::I(),
89 SkClipOp::kDifference, true);
90 stack.clipRRect(SkRRect::MakeRectXY(SkRect::MakeXYWH(200, 200, 200, 200), 60, 45),
91 SkMatrix::I(), SkClipOp::kDifference, true);
92
93 SkRRect nine;
94 nine.setNinePatch(SkRect::MakeXYWH(550 - 30.25 - 100, 370.75, 100, 150), 12, 35, 23, 20);
95 stack.clipRRect(nine, SkMatrix::I(), SkClipOp::kDifference, true);
96
97 SkRRect complx;
98 SkVector complxRadii[4] = {{6, 4}, {8, 12}, {16, 24}, {48, 32}};
99 complx.setRectRadii(SkRect::MakeXYWH(80.25, 80.75, 100, 149), complxRadii);
100 stack.clipRRect(complx, SkMatrix::I(), SkClipOp::kDifference, false);
101
102 return this->coverClipStack(stack, canvas, errorMsg);
103}
104
csmartdaltonbf4a8f92016-09-06 10:01:06 -0700105DEF_GM( return new WindowRectanglesGM(); )
Robert Phillips1ca0da42021-06-14 15:27:19 -0400106} // namespace skiagm