• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2014 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 GrDefaultGeoProcFactory_DEFINED
9 #define GrDefaultGeoProcFactory_DEFINED
10 
11 #include "src/gpu/GrColorSpaceXform.h"
12 #include "src/gpu/GrGeometryProcessor.h"
13 #include "src/gpu/GrShaderCaps.h"
14 
15 /*
16  * A factory for creating default Geometry Processors which simply multiply position by the uniform
17  * view matrix and wire through color, coverage, UV coords if requested.
18  */
19 namespace GrDefaultGeoProcFactory {
20     struct Color {
21         enum Type {
22             kPremulGrColorUniform_Type,
23             kPremulGrColorAttribute_Type,
24             kPremulWideColorAttribute_Type,
25             kUnpremulSkColorAttribute_Type,
26         };
ColorColor27         explicit Color(const SkPMColor4f& color)
28                 : fType(kPremulGrColorUniform_Type)
29                 , fColor(color)
30                 , fColorSpaceXform(nullptr) {}
ColorColor31         Color(Type type)
32                 : fType(type)
33                 , fColor(SK_PMColor4fILLEGAL)
34                 , fColorSpaceXform(nullptr) {
35             SkASSERT(type != kPremulGrColorUniform_Type);
36         }
37 
38         Type fType;
39         SkPMColor4f fColor;
40 
41         // This only applies to SkColor. Any GrColors are assumed to have been color converted
42         // during paint conversion.
43         sk_sp<GrColorSpaceXform> fColorSpaceXform;
44     };
45 
46     struct Coverage {
47         enum Type {
48             kSolid_Type,
49             kUniform_Type,
50             kAttribute_Type,
51             kAttributeTweakAlpha_Type,
52         };
CoverageCoverage53         explicit Coverage(uint8_t coverage) : fType(kUniform_Type), fCoverage(coverage) {}
CoverageCoverage54         Coverage(Type type) : fType(type), fCoverage(0xff) {
55             SkASSERT(type != kUniform_Type);
56         }
57 
58         Type fType;
59         uint8_t fCoverage;
60     };
61 
62     struct LocalCoords {
63         enum Type {
64             kUnused_Type,
65             kUsePosition_Type,
66             kHasExplicit_Type,
67             kHasTransformed_Type,
68         };
LocalCoordsLocalCoords69         LocalCoords(Type type) : fType(type), fMatrix(nullptr) {}
LocalCoordsLocalCoords70         LocalCoords(Type type, const SkMatrix* matrix) : fType(type), fMatrix(matrix) {
71             SkASSERT(kUnused_Type != type);
72         }
hasLocalMatrixLocalCoords73         bool hasLocalMatrix() const { return nullptr != fMatrix; }
74 
75         Type fType;
76         const SkMatrix* fMatrix;
77     };
78 
79     GrGeometryProcessor* Make(SkArenaAlloc*,
80                               const GrShaderCaps*,
81                               const Color&,
82                               const Coverage&,
83                               const LocalCoords&,
84                               const SkMatrix& viewMatrix);
85 
86     /*
87      * Use this factory to create a GrGeometryProcessor that expects a device space vertex position
88      * attribute. The view matrix must still be provided to compute correctly transformed
89      * coordinates for GrFragmentProcessors. It may fail if the view matrix is not invertible.
90      */
91     GrGeometryProcessor* MakeForDeviceSpace(SkArenaAlloc*,
92                                             const GrShaderCaps*,
93                                             const Color&,
94                                             const Coverage&,
95                                             const LocalCoords&,
96                                             const SkMatrix& viewMatrix);
97 };
98 
99 #endif
100