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 "GrColorSpaceXform.h" 12 #include "GrGeometryProcessor.h" 13 14 /* 15 * A factory for creating default Geometry Processors which simply multiply position by the uniform 16 * view matrix and wire through color, coverage, UV coords if requested. 17 */ 18 namespace GrDefaultGeoProcFactory { 19 // Structs for adding vertex attributes 20 struct PositionAttr { 21 SkPoint fPosition; 22 }; 23 24 struct PositionCoverageAttr { 25 SkPoint fPosition; 26 float fCoverage; 27 }; 28 29 struct PositionColorAttr { 30 SkPoint fPosition; 31 SkColor fColor; 32 }; 33 34 struct PositionColorCoverageAttr { 35 SkPoint fPosition; 36 SkColor fColor; 37 float fCoverage; 38 }; 39 40 struct PositionLocalCoordAttr { 41 SkPoint fPosition; 42 SkPoint fLocalCoord; 43 }; 44 45 struct PositionLocalCoordCoverageAttr { 46 SkPoint fPosition; 47 SkPoint fLocalCoord; 48 float fCoverage; 49 }; 50 51 struct PositionColorLocalCoordAttr { 52 SkPoint fPosition; 53 GrColor fColor; 54 SkPoint fLocalCoord; 55 }; 56 57 struct PositionColorLocalCoordCoverage { 58 SkPoint fPosition; 59 GrColor fColor; 60 SkPoint fLocalCoord; 61 float fCoverage; 62 }; 63 64 struct Color { 65 enum Type { 66 kPremulGrColorUniform_Type, 67 kPremulGrColorAttribute_Type, 68 kUnpremulSkColorAttribute_Type, 69 }; 70 explicit Color(GrColor color) 71 : fType(kPremulGrColorUniform_Type) 72 , fColor(color) 73 , fLinearize(false) 74 , fColorSpaceXform(nullptr) {} 75 Color(Type type) 76 : fType(type) 77 , fColor(GrColor_ILLEGAL) 78 , fLinearize(false) 79 , fColorSpaceXform(nullptr) { 80 SkASSERT(type != kPremulGrColorUniform_Type); 81 } 82 83 Type fType; 84 GrColor fColor; 85 86 // These options only apply to SkColor. Any GrColors are assumed to have been color managed 87 // during paint conversion. 88 bool fLinearize; 89 sk_sp<GrColorSpaceXform> fColorSpaceXform; 90 }; 91 92 struct Coverage { 93 enum Type { 94 kSolid_Type, 95 kUniform_Type, 96 kAttribute_Type, 97 }; 98 explicit Coverage(uint8_t coverage) : fType(kUniform_Type), fCoverage(coverage) {} 99 Coverage(Type type) : fType(type), fCoverage(0xff) { 100 SkASSERT(type != kUniform_Type); 101 } 102 103 Type fType; 104 uint8_t fCoverage; 105 }; 106 107 struct LocalCoords { 108 enum Type { 109 kUnused_Type, 110 kUsePosition_Type, 111 kHasExplicit_Type, 112 kHasTransformed_Type, 113 }; 114 LocalCoords(Type type) : fType(type), fMatrix(nullptr) {} 115 LocalCoords(Type type, const SkMatrix* matrix) : fType(type), fMatrix(matrix) { 116 SkASSERT(kUnused_Type != type); 117 } 118 bool hasLocalMatrix() const { return nullptr != fMatrix; } 119 120 Type fType; 121 const SkMatrix* fMatrix; 122 }; 123 124 sk_sp<GrGeometryProcessor> Make(const Color&, 125 const Coverage&, 126 const LocalCoords&, 127 const SkMatrix& viewMatrix); 128 129 /* 130 * Use this factory to create a GrGeometryProcessor that expects a device space vertex position 131 * attribute. The view matrix must still be provided to compute correctly transformed 132 * coordinates for GrFragmentProcessors. It may fail if the view matrix is not invertible. 133 */ 134 sk_sp<GrGeometryProcessor> MakeForDeviceSpace(const Color&, 135 const Coverage&, 136 const LocalCoords&, 137 const SkMatrix& viewMatrix); 138 }; 139 140 #endif 141