1 | /* |
2 | * Copyright 2015 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 | #ifndef GrTestUtils_DEFINED |
9 | #define GrTestUtils_DEFINED |
10 | |
11 | #include "include/core/SkTypes.h" |
12 | |
13 | #if GR_TEST_UTILS |
14 | |
15 | #include "include/core/SkPathEffect.h" |
16 | #include "include/core/SkStrokeRec.h" |
17 | #include "include/private/SkMacros.h" |
18 | #include "include/private/SkTemplates.h" |
19 | #include "include/utils/SkRandom.h" |
20 | #include "src/gpu/GrColor.h" |
21 | #include "src/gpu/GrFPArgs.h" |
22 | #include "src/gpu/GrSamplerState.h" |
23 | #include "src/shaders/SkShaderBase.h" |
24 | |
25 | class GrColorInfo; |
26 | class GrColorSpaceXform; |
27 | class GrProcessorTestData; |
28 | class GrStyle; |
29 | class SkMatrix; |
30 | class SkPath; |
31 | class SkRRect; |
32 | struct SkRect; |
33 | |
34 | namespace GrTest { |
35 | /** |
36 | * Helpers for use in Test functions. |
37 | */ |
38 | const SkMatrix& TestMatrix(SkRandom*); |
39 | const SkMatrix& TestMatrixPreservesRightAngles(SkRandom*); |
40 | const SkMatrix& TestMatrixRectStaysRect(SkRandom*); |
41 | const SkMatrix& TestMatrixInvertible(SkRandom*); |
42 | const SkMatrix& TestMatrixPerspective(SkRandom*); |
43 | void TestWrapModes(SkRandom*, GrSamplerState::WrapMode[2]); |
44 | const SkRect& TestRect(SkRandom*); |
45 | const SkRect& TestSquare(SkRandom*); |
46 | const SkRRect& TestRRectSimple(SkRandom*); |
47 | const SkPath& TestPath(SkRandom*); |
48 | const SkPath& TestPathConvex(SkRandom*); |
49 | SkStrokeRec TestStrokeRec(SkRandom*); |
50 | /** Creates styles with dash path effects and null path effects */ |
51 | void TestStyle(SkRandom*, GrStyle*); |
52 | sk_sp<SkColorSpace> TestColorSpace(SkRandom*); |
53 | sk_sp<GrColorSpaceXform> TestColorXform(SkRandom*); |
54 | |
55 | class TestAsFPArgs { |
56 | public: |
57 | TestAsFPArgs(GrProcessorTestData*); |
58 | ~TestAsFPArgs(); |
59 | const GrFPArgs& args() const { return fArgs; } |
60 | |
61 | private: |
62 | SkMatrix fViewMatrixStorage; |
63 | std::unique_ptr<GrColorInfo> fColorInfoStorage; |
64 | GrFPArgs fArgs; |
65 | }; |
66 | |
67 | // We have a simplified dash path effect here to avoid relying on SkDashPathEffect which |
68 | // is in the optional build target effects. |
69 | class TestDashPathEffect : public SkPathEffect { |
70 | public: |
71 | static sk_sp<SkPathEffect> Make(const SkScalar* intervals, int count, SkScalar phase) { |
72 | return sk_sp<SkPathEffect>(new TestDashPathEffect(intervals, count, phase)); |
73 | } |
74 | |
75 | Factory getFactory() const override { return nullptr; } |
76 | const char* getTypeName() const override { return nullptr; } |
77 | |
78 | protected: |
79 | bool onFilterPath(SkPath* dst, const SkPath&, SkStrokeRec* , const SkRect*) const override; |
80 | DashType onAsADash(DashInfo* info) const override; |
81 | |
82 | private: |
83 | TestDashPathEffect(const SkScalar* intervals, int count, SkScalar phase); |
84 | |
85 | int fCount; |
86 | SkAutoTArray<SkScalar> fIntervals; |
87 | SkScalar fPhase; |
88 | SkScalar fInitialDashLength; |
89 | int fInitialDashIndex; |
90 | SkScalar fIntervalLength; |
91 | }; |
92 | |
93 | } // namespace GrTest |
94 | |
95 | static inline GrColor GrRandomColor(SkRandom* random) { |
96 | // There are only a few cases of random colors which interest us |
97 | enum ColorMode { |
98 | kAllOnes_ColorMode, |
99 | kAllZeros_ColorMode, |
100 | kAlphaOne_ColorMode, |
101 | kRandom_ColorMode, |
102 | kLast_ColorMode = kRandom_ColorMode |
103 | }; |
104 | |
105 | ColorMode colorMode = ColorMode(random->nextULessThan(kLast_ColorMode + 1)); |
106 | GrColor color SK_INIT_TO_AVOID_WARNING; |
107 | switch (colorMode) { |
108 | case kAllOnes_ColorMode: |
109 | color = GrColorPackRGBA(0xFF, 0xFF, 0xFF, 0xFF); |
110 | break; |
111 | case kAllZeros_ColorMode: |
112 | color = GrColorPackRGBA(0, 0, 0, 0); |
113 | break; |
114 | case kAlphaOne_ColorMode: |
115 | color = GrColorPackRGBA(random->nextULessThan(256), |
116 | random->nextULessThan(256), |
117 | random->nextULessThan(256), |
118 | 0xFF); |
119 | break; |
120 | case kRandom_ColorMode: { |
121 | uint8_t alpha = random->nextULessThan(256); |
122 | color = GrColorPackRGBA(random->nextRangeU(0, alpha), |
123 | random->nextRangeU(0, alpha), |
124 | random->nextRangeU(0, alpha), |
125 | alpha); |
126 | break; |
127 | } |
128 | } |
129 | return color; |
130 | } |
131 | |
132 | static inline uint8_t GrRandomCoverage(SkRandom* random) { |
133 | enum CoverageMode { |
134 | kZero_CoverageMode, |
135 | kAllOnes_CoverageMode, |
136 | kRandom_CoverageMode, |
137 | kLast_CoverageMode = kRandom_CoverageMode |
138 | }; |
139 | |
140 | CoverageMode colorMode = CoverageMode(random->nextULessThan(kLast_CoverageMode + 1)); |
141 | uint8_t coverage SK_INIT_TO_AVOID_WARNING; |
142 | switch (colorMode) { |
143 | case kZero_CoverageMode: |
144 | coverage = 0; |
145 | break; |
146 | case kAllOnes_CoverageMode: |
147 | coverage = 0xff; |
148 | break; |
149 | case kRandom_CoverageMode: |
150 | coverage = random->nextULessThan(256); |
151 | break; |
152 | } |
153 | return coverage; |
154 | } |
155 | |
156 | #endif |
157 | #endif |
158 | |