OLD | NEW |
| (Empty) |
1 /* | |
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 | |
8 #include "gm.h" | |
9 #include "SkPath.h" | |
10 #include "SkRandom.h" | |
11 #include "SkRRect.h" | |
12 #include "SkSurface.h" | |
13 | |
14 namespace skiagm { | |
15 | |
16 constexpr SkRect kSrcImageClip{75, 75, 275, 275}; | |
17 | |
18 /* | |
19 * The purpose of this test is to exercise all three codepaths in GrDrawContext
(drawFilledRect, | |
20 * fillRectToRect, fillRectWithLocalMatrix) that pre-crop filled rects based on
the clip. | |
21 * | |
22 * The test creates an image of a green square surrounded by red background, the
n draws this image | |
23 * in various ways with the red clipped out. The test is successful if there is
no visible red | |
24 * background, scissor is never used, and ideally, all the rectangles draw in on
e batch. | |
25 */ | |
26 class CroppedRectsGM : public GM { | |
27 private: | |
28 SkString onShortName() override final { return SkString("croppedrects"); } | |
29 SkISize onISize() override { return SkISize::Make(500, 500); } | |
30 | |
31 void onOnceBeforeDraw() override { | |
32 sk_sp<SkSurface> srcSurface = SkSurface::MakeRasterN32Premul(500, 500); | |
33 SkCanvas* srcCanvas = srcSurface->getCanvas(); | |
34 | |
35 srcCanvas->clear(SK_ColorRED); | |
36 | |
37 SkPaint paint; | |
38 paint.setColor(0xff00ff00); | |
39 srcCanvas->drawRect(kSrcImageClip, paint); | |
40 | |
41 constexpr SkScalar kStrokeWidth = 10; | |
42 SkPaint stroke; | |
43 stroke.setStyle(SkPaint::kStroke_Style); | |
44 stroke.setStrokeWidth(kStrokeWidth); | |
45 stroke.setColor(0xff008800); | |
46 srcCanvas->drawRect(kSrcImageClip.makeInset(kStrokeWidth / 2, kStrokeWid
th / 2), stroke); | |
47 | |
48 fSrcImage = srcSurface->makeImageSnapshot(SkBudgeted::kYes, SkSurface::k
No_ForceUnique); | |
49 fSrcImageShader = fSrcImage->makeShader(SkShader::kClamp_TileMode, | |
50 SkShader::kClamp_TileMode); | |
51 } | |
52 | |
53 void onDraw(SkCanvas* canvas) override { | |
54 canvas->clear(SK_ColorWHITE); | |
55 | |
56 { | |
57 // GrDrawContext::drawFilledRect. | |
58 SkAutoCanvasRestore acr(canvas, true); | |
59 SkPaint paint; | |
60 paint.setShader(fSrcImageShader); | |
61 paint.setFilterQuality(kNone_SkFilterQuality); | |
62 canvas->clipRect(kSrcImageClip); | |
63 canvas->drawPaint(paint); | |
64 } | |
65 | |
66 { | |
67 // GrDrawContext::fillRectToRect. | |
68 SkAutoCanvasRestore acr(canvas, true); | |
69 SkPaint paint; | |
70 paint.setFilterQuality(kNone_SkFilterQuality); | |
71 SkRect drawRect = SkRect::MakeXYWH(350, 100, 100, 300); | |
72 canvas->clipRect(drawRect); | |
73 canvas->drawImageRect(fSrcImage.get(), | |
74 kSrcImageClip.makeOutset(0.5f * kSrcImageClip.
width(), | |
75 kSrcImageClip.height(
)), | |
76 drawRect.makeOutset(0.5f * drawRect.width(), d
rawRect.height()), | |
77 &paint); | |
78 } | |
79 | |
80 { | |
81 // GrDrawContext::fillRectWithLocalMatrix. | |
82 SkAutoCanvasRestore acr(canvas, true); | |
83 SkPath path; | |
84 path.moveTo(kSrcImageClip.fLeft - kSrcImageClip.width(), kSrcImageCl
ip.centerY()); | |
85 path.lineTo(kSrcImageClip.fRight + 3 * kSrcImageClip.width(), kSrcIm
ageClip.centerY()); | |
86 SkPaint paint; | |
87 paint.setStyle(SkPaint::kStroke_Style); | |
88 paint.setStrokeWidth(2 * kSrcImageClip.height()); | |
89 paint.setShader(fSrcImageShader); | |
90 paint.setFilterQuality(kNone_SkFilterQuality); | |
91 canvas->translate(-90, 263); | |
92 canvas->scale(300 / kSrcImageClip.width(), 100 / kSrcImageClip.heigh
t()); | |
93 canvas->clipRect(kSrcImageClip); | |
94 canvas->drawPath(path, paint); | |
95 } | |
96 | |
97 // TODO: assert the draw target only has one batch in the post-MDB world
. | |
98 } | |
99 | |
100 sk_sp<SkImage> fSrcImage; | |
101 sk_sp<SkShader> fSrcImageShader; | |
102 | |
103 typedef GM INHERITED; | |
104 }; | |
105 | |
106 DEF_GM( return new CroppedRectsGM(); ) | |
107 | |
108 } | |
OLD | NEW |