blob: b02d5562ddbb1e1ea2b453bc9b10408f8825f141 [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"
Ruiqi Maob609e6d2018-07-17 10:19:38 -040013#include "GrShaderCaps.h"
joshualitt4973d9d2014-11-08 09:24:25 -080014
joshualitt4973d9d2014-11-08 09:24:25 -080015/*
16 * A factory for creating default Geometry Processors which simply multiply position by the uniform
Brian Salomon09d994e2016-12-21 11:14:46 -050017 * view matrix and wire through color, coverage, UV coords if requested.
joshualitt4973d9d2014-11-08 09:24:25 -080018 */
joshualitt7a0d6972015-07-28 10:20:08 -070019namespace GrDefaultGeoProcFactory {
joshualitte9d60952015-07-27 12:13:14 -070020 struct Color {
21 enum Type {
Brian Salomon3de0aee2017-01-29 09:34:17 -050022 kPremulGrColorUniform_Type,
23 kPremulGrColorAttribute_Type,
Brian Osman2a4c4df2018-12-20 14:06:54 -050024 kPremulWideColorAttribute_Type,
Brian Salomon3de0aee2017-01-29 09:34:17 -050025 kUnpremulSkColorAttribute_Type,
joshualitte9d60952015-07-27 12:13:14 -070026 };
Brian Osmancf860852018-10-31 14:04:39 -040027 explicit Color(const SkPMColor4f& color)
Brian Osmanfa6d8652017-05-31 09:37:27 -040028 : fType(kPremulGrColorUniform_Type)
29 , fColor(color)
Brian Osmanfa6d8652017-05-31 09:37:27 -040030 , fColorSpaceXform(nullptr) {}
31 Color(Type type)
32 : fType(type)
Brian Osmancf860852018-10-31 14:04:39 -040033 , fColor(SK_PMColor4fILLEGAL)
Brian Osmanfa6d8652017-05-31 09:37:27 -040034 , fColorSpaceXform(nullptr) {
Brian Salomon3de0aee2017-01-29 09:34:17 -050035 SkASSERT(type != kPremulGrColorUniform_Type);
joshualitte9d60952015-07-27 12:13:14 -070036 }
37
38 Type fType;
Brian Osmancf860852018-10-31 14:04:39 -040039 SkPMColor4f fColor;
Brian Osmanfa6d8652017-05-31 09:37:27 -040040
Brian Osman08a50e02018-06-15 15:06:48 -040041 // This only applies to SkColor. Any GrColors are assumed to have been color converted
Brian Osmanfa6d8652017-05-31 09:37:27 -040042 // during paint conversion.
Brian Osmanfa6d8652017-05-31 09:37:27 -040043 sk_sp<GrColorSpaceXform> fColorSpaceXform;
joshualitte9d60952015-07-27 12:13:14 -070044 };
45
46 struct Coverage {
47 enum Type {
joshualitte9d60952015-07-27 12:13:14 -070048 kSolid_Type,
49 kUniform_Type,
50 kAttribute_Type,
Brian Osman80879d42019-01-07 16:15:27 -050051 kAttributeTweakAlpha_Type,
joshualitte9d60952015-07-27 12:13:14 -070052 };
Brian Salomon8c852be2017-01-04 10:44:42 -050053 explicit Coverage(uint8_t coverage) : fType(kUniform_Type), fCoverage(coverage) {}
joshualitte9d60952015-07-27 12:13:14 -070054 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 {
joshualitt0d986d82015-07-28 10:01:18 -070064 kUnused_Type,
joshualitte9d60952015-07-27 12:13:14 -070065 kUsePosition_Type,
66 kHasExplicit_Type,
joshualittb2aa7cb2015-08-05 11:05:22 -070067 kHasTransformed_Type,
joshualitte9d60952015-07-27 12:13:14 -070068 };
halcanary96fcdcc2015-08-27 07:41:13 -070069 LocalCoords(Type type) : fType(type), fMatrix(nullptr) {}
joshualitt0d986d82015-07-28 10:01:18 -070070 LocalCoords(Type type, const SkMatrix* matrix) : fType(type), fMatrix(matrix) {
71 SkASSERT(kUnused_Type != type);
72 }
halcanary96fcdcc2015-08-27 07:41:13 -070073 bool hasLocalMatrix() const { return nullptr != fMatrix; }
joshualitt0d986d82015-07-28 10:01:18 -070074
75 Type fType;
76 const SkMatrix* fMatrix;
joshualitte9d60952015-07-27 12:13:14 -070077 };
78
Ruiqi Maob609e6d2018-07-17 10:19:38 -040079 sk_sp<GrGeometryProcessor> Make(const GrShaderCaps*,
80 const Color&,
bungeman06ca8ec2016-06-09 08:01:03 -070081 const Coverage&,
82 const LocalCoords&,
83 const SkMatrix& viewMatrix);
joshualitte9d60952015-07-27 12:13:14 -070084
joshualitt5478d422014-11-14 16:00:38 -080085 /*
joshualitt0d986d82015-07-28 10:01:18 -070086 * Use this factory to create a GrGeometryProcessor that expects a device space vertex position
87 * attribute. The view matrix must still be provided to compute correctly transformed
88 * coordinates for GrFragmentProcessors. It may fail if the view matrix is not invertible.
joshualitt5478d422014-11-14 16:00:38 -080089 */
Ruiqi Maob609e6d2018-07-17 10:19:38 -040090 sk_sp<GrGeometryProcessor> MakeForDeviceSpace(const GrShaderCaps*,
91 const Color&,
bungeman06ca8ec2016-06-09 08:01:03 -070092 const Coverage&,
93 const LocalCoords&,
94 const SkMatrix& viewMatrix);
joshualitt4973d9d2014-11-08 09:24:25 -080095};
96
97#endif