blob: 52db807ca46e042e524f864cfc56e6c411c5fe4e [file] [log] [blame]
joshualitt4973d9d2014-11-08 09:24:25 -08001/*
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
Brian Salomon0c26a9d2017-07-06 10:09:38 -040011#include "GrColorSpaceXform.h"
joshualitt4973d9d2014-11-08 09:24:25 -080012#include "GrGeometryProcessor.h"
13
joshualitt4973d9d2014-11-08 09:24:25 -080014/*
15 * A factory for creating default Geometry Processors which simply multiply position by the uniform
Brian Salomon09d994e2016-12-21 11:14:46 -050016 * view matrix and wire through color, coverage, UV coords if requested.
joshualitt4973d9d2014-11-08 09:24:25 -080017 */
joshualitt7a0d6972015-07-28 10:20:08 -070018namespace GrDefaultGeoProcFactory {
joshualitt4973d9d2014-11-08 09:24:25 -080019 // Structs for adding vertex attributes
20 struct PositionAttr {
21 SkPoint fPosition;
22 };
23
24 struct PositionCoverageAttr {
25 SkPoint fPosition;
senorblancof57372d2016-08-31 10:36:19 -070026 float fCoverage;
joshualitt4973d9d2014-11-08 09:24:25 -080027 };
28
29 struct PositionColorAttr {
30 SkPoint fPosition;
31 SkColor fColor;
32 };
33
34 struct PositionColorCoverageAttr {
35 SkPoint fPosition;
36 SkColor fColor;
senorblancof57372d2016-08-31 10:36:19 -070037 float fCoverage;
joshualitt4973d9d2014-11-08 09:24:25 -080038 };
39
40 struct PositionLocalCoordAttr {
41 SkPoint fPosition;
42 SkPoint fLocalCoord;
43 };
44
45 struct PositionLocalCoordCoverageAttr {
46 SkPoint fPosition;
47 SkPoint fLocalCoord;
senorblancof57372d2016-08-31 10:36:19 -070048 float fCoverage;
joshualitt4973d9d2014-11-08 09:24:25 -080049 };
50
51 struct PositionColorLocalCoordAttr {
52 SkPoint fPosition;
53 GrColor fColor;
54 SkPoint fLocalCoord;
55 };
56
Ruiqi Mao4ec72f72018-07-10 17:21:07 -040057 struct PositionColorLocalCoordCoverageAttr {
joshualitt4973d9d2014-11-08 09:24:25 -080058 SkPoint fPosition;
59 GrColor fColor;
60 SkPoint fLocalCoord;
senorblancof57372d2016-08-31 10:36:19 -070061 float fCoverage;
joshualitt4973d9d2014-11-08 09:24:25 -080062 };
63
joshualitte9d60952015-07-27 12:13:14 -070064 struct Color {
65 enum Type {
Brian Salomon3de0aee2017-01-29 09:34:17 -050066 kPremulGrColorUniform_Type,
67 kPremulGrColorAttribute_Type,
68 kUnpremulSkColorAttribute_Type,
joshualitte9d60952015-07-27 12:13:14 -070069 };
Brian Osmanfa6d8652017-05-31 09:37:27 -040070 explicit Color(GrColor color)
71 : fType(kPremulGrColorUniform_Type)
72 , fColor(color)
Brian Osmanfa6d8652017-05-31 09:37:27 -040073 , fColorSpaceXform(nullptr) {}
74 Color(Type type)
75 : fType(type)
76 , fColor(GrColor_ILLEGAL)
Brian Osmanfa6d8652017-05-31 09:37:27 -040077 , fColorSpaceXform(nullptr) {
Brian Salomon3de0aee2017-01-29 09:34:17 -050078 SkASSERT(type != kPremulGrColorUniform_Type);
joshualitte9d60952015-07-27 12:13:14 -070079 }
80
81 Type fType;
82 GrColor fColor;
Brian Osmanfa6d8652017-05-31 09:37:27 -040083
Brian Osman08a50e02018-06-15 15:06:48 -040084 // This only applies to SkColor. Any GrColors are assumed to have been color converted
Brian Osmanfa6d8652017-05-31 09:37:27 -040085 // during paint conversion.
Brian Osmanfa6d8652017-05-31 09:37:27 -040086 sk_sp<GrColorSpaceXform> fColorSpaceXform;
joshualitte9d60952015-07-27 12:13:14 -070087 };
88
89 struct Coverage {
90 enum Type {
joshualitte9d60952015-07-27 12:13:14 -070091 kSolid_Type,
92 kUniform_Type,
93 kAttribute_Type,
94 };
Brian Salomon8c852be2017-01-04 10:44:42 -050095 explicit Coverage(uint8_t coverage) : fType(kUniform_Type), fCoverage(coverage) {}
joshualitte9d60952015-07-27 12:13:14 -070096 Coverage(Type type) : fType(type), fCoverage(0xff) {
97 SkASSERT(type != kUniform_Type);
98 }
99
100 Type fType;
101 uint8_t fCoverage;
102 };
103
104 struct LocalCoords {
105 enum Type {
joshualitt0d986d82015-07-28 10:01:18 -0700106 kUnused_Type,
joshualitte9d60952015-07-27 12:13:14 -0700107 kUsePosition_Type,
108 kHasExplicit_Type,
joshualittb2aa7cb2015-08-05 11:05:22 -0700109 kHasTransformed_Type,
joshualitte9d60952015-07-27 12:13:14 -0700110 };
halcanary96fcdcc2015-08-27 07:41:13 -0700111 LocalCoords(Type type) : fType(type), fMatrix(nullptr) {}
joshualitt0d986d82015-07-28 10:01:18 -0700112 LocalCoords(Type type, const SkMatrix* matrix) : fType(type), fMatrix(matrix) {
113 SkASSERT(kUnused_Type != type);
114 }
halcanary96fcdcc2015-08-27 07:41:13 -0700115 bool hasLocalMatrix() const { return nullptr != fMatrix; }
joshualitt0d986d82015-07-28 10:01:18 -0700116
117 Type fType;
118 const SkMatrix* fMatrix;
joshualitte9d60952015-07-27 12:13:14 -0700119 };
120
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400121 struct Bones {
122 Bones(const float bones[], int boneCount)
123 : fBones(bones)
124 , fBoneCount(boneCount) {}
125
126 const float* fBones;
127 int fBoneCount;
128 };
129
bungeman06ca8ec2016-06-09 08:01:03 -0700130 sk_sp<GrGeometryProcessor> Make(const Color&,
131 const Coverage&,
132 const LocalCoords&,
133 const SkMatrix& viewMatrix);
joshualitte9d60952015-07-27 12:13:14 -0700134
joshualitt5478d422014-11-14 16:00:38 -0800135 /*
joshualitt0d986d82015-07-28 10:01:18 -0700136 * Use this factory to create a GrGeometryProcessor that expects a device space vertex position
137 * attribute. The view matrix must still be provided to compute correctly transformed
138 * coordinates for GrFragmentProcessors. It may fail if the view matrix is not invertible.
joshualitt5478d422014-11-14 16:00:38 -0800139 */
bungeman06ca8ec2016-06-09 08:01:03 -0700140 sk_sp<GrGeometryProcessor> MakeForDeviceSpace(const Color&,
141 const Coverage&,
142 const LocalCoords&,
143 const SkMatrix& viewMatrix);
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400144
145 /*
146 * Use this factory to create a GrGeometryProcessor that supports skeletal animation through
147 * deformation of vertices using matrices that are passed in. This should only be called from
148 * GrDrawVerticesOp.
149 */
150 sk_sp<GrGeometryProcessor> MakeWithBones(const Color&,
151 const Coverage&,
152 const LocalCoords&,
153 const Bones&,
154 const SkMatrix& viewMatrix);
joshualitt4973d9d2014-11-08 09:24:25 -0800155};
156
157#endif