xref: /aosp_15_r20/external/skia/gm/strokerect_anisotropic.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2020 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h"
11*c8dee2aaSAndroid Build Coastguard Worker 
draw_sqooshed_rect(SkCanvas * canvas,SkVector xlate,const SkPaint & p)12*c8dee2aaSAndroid Build Coastguard Worker static void draw_sqooshed_rect(SkCanvas* canvas, SkVector xlate, const SkPaint& p) {
13*c8dee2aaSAndroid Build Coastguard Worker     canvas->save();
14*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(xlate.fX, xlate.fY);
15*c8dee2aaSAndroid Build Coastguard Worker         canvas->scale(0.03f, 2.0f);
16*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawRect(SkRect::MakeLTRB(-500, -10, 500, 10), p);
17*c8dee2aaSAndroid Build Coastguard Worker     canvas->restore();
18*c8dee2aaSAndroid Build Coastguard Worker }
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker /*
21*c8dee2aaSAndroid Build Coastguard Worker  * This GM is intended to wring out any lingering anisotropic
22*c8dee2aaSAndroid Build Coastguard Worker  * stroke rect bugs. It contains a repro case for crbug.com/935303
23*c8dee2aaSAndroid Build Coastguard Worker  * The pattern is:
24*c8dee2aaSAndroid Build Coastguard Worker  *
25*c8dee2aaSAndroid Build Coastguard Worker  *         miter @       miter @      bevel @       bevel @
26*c8dee2aaSAndroid Build Coastguard Worker  *         whole pixels  half pixels  whole pixels  half pixels
27*c8dee2aaSAndroid Build Coastguard Worker  *
28*c8dee2aaSAndroid Build Coastguard Worker  *   AA
29*c8dee2aaSAndroid Build Coastguard Worker  *
30*c8dee2aaSAndroid Build Coastguard Worker  * non-AA
31*c8dee2aaSAndroid Build Coastguard Worker  *
32*c8dee2aaSAndroid Build Coastguard Worker  */
33*c8dee2aaSAndroid Build Coastguard Worker class StrokeRectAnisotropicGM : public skiagm::GM {
34*c8dee2aaSAndroid Build Coastguard Worker public:
StrokeRectAnisotropicGM()35*c8dee2aaSAndroid Build Coastguard Worker     StrokeRectAnisotropicGM() {}
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const38*c8dee2aaSAndroid Build Coastguard Worker     SkString getName() const override { return SkString("strokerect_anisotropic"); }
39*c8dee2aaSAndroid Build Coastguard Worker 
getISize()40*c8dee2aaSAndroid Build Coastguard Worker     SkISize getISize() override { return SkISize::Make(160, 160); }
41*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(SkCanvas * canvas)42*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(SkCanvas* canvas) override {
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker         SkPaint aaPaint;
45*c8dee2aaSAndroid Build Coastguard Worker         aaPaint.setColor(SkColorSetARGB(255, 0, 0, 0));
46*c8dee2aaSAndroid Build Coastguard Worker         aaPaint.setAntiAlias(true);
47*c8dee2aaSAndroid Build Coastguard Worker         aaPaint.setStrokeWidth(10);
48*c8dee2aaSAndroid Build Coastguard Worker         aaPaint.setStyle(SkPaint::kStroke_Style);
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker         SkPaint bwPaint;
51*c8dee2aaSAndroid Build Coastguard Worker         bwPaint.setColor(SkColorSetARGB(255, 0, 0, 0));
52*c8dee2aaSAndroid Build Coastguard Worker         bwPaint.setStrokeWidth(10);
53*c8dee2aaSAndroid Build Coastguard Worker         bwPaint.setStyle(SkPaint::kStroke_Style);
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker         // The two miter columns
56*c8dee2aaSAndroid Build Coastguard Worker         draw_sqooshed_rect(canvas, {  20.0f, 40.5f }, aaPaint);  // whole pixels
57*c8dee2aaSAndroid Build Coastguard Worker         draw_sqooshed_rect(canvas, {  20.0f, 110.5f }, bwPaint); // whole pixels
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker         draw_sqooshed_rect(canvas, {  60.5f, 40.0f }, aaPaint);  // half pixels
60*c8dee2aaSAndroid Build Coastguard Worker         draw_sqooshed_rect(canvas, {  60.5f, 110.0f }, bwPaint); // half pixels
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker         aaPaint.setStrokeJoin(SkPaint::kBevel_Join);
63*c8dee2aaSAndroid Build Coastguard Worker         bwPaint.setStrokeJoin(SkPaint::kBevel_Join);
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker         // The two bevel columns
66*c8dee2aaSAndroid Build Coastguard Worker         draw_sqooshed_rect(canvas, { 100.0f, 40.5f }, aaPaint);  // whole pixels
67*c8dee2aaSAndroid Build Coastguard Worker         draw_sqooshed_rect(canvas, { 100.0f, 110.5f }, bwPaint); // whole pixels
68*c8dee2aaSAndroid Build Coastguard Worker 
69*c8dee2aaSAndroid Build Coastguard Worker         draw_sqooshed_rect(canvas, { 140.5f, 40.0f }, aaPaint);  // half pixels
70*c8dee2aaSAndroid Build Coastguard Worker         draw_sqooshed_rect(canvas, { 140.5f, 110.0f }, bwPaint); // half pixels
71*c8dee2aaSAndroid Build Coastguard Worker     }
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker private:
74*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GM;
75*c8dee2aaSAndroid Build Coastguard Worker };
76*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new StrokeRectAnisotropicGM;)
77*c8dee2aaSAndroid Build Coastguard Worker 
78