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 |