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