blob: 5fb10b944131a68aa0773b8e3d008c7692362b4a [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
2 Copyright 2010 Google Inc.
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17
18#ifndef GrSamplerState_DEFINED
19#define GrSamplerState_DEFINED
20
21#include "GrTypes.h"
22
23class GrSamplerState {
24public:
25 enum SampleMode {
26 kNormal_SampleMode, //!< sample color directly
reed@google.comac10a2d2010-12-22 21:39:39 +000027 kRadial_SampleMode, //!< treat as radial gradient
28 kRadial2_SampleMode, //!< treat as 2-point radial gradient
29 kSweep_SampleMode, //!< treat as sweep gradient
30 };
31
32 /**
33 * Describes how a texture is sampled when coordinates are outside the
34 * texture border
35 */
36 enum WrapMode {
37 kClamp_WrapMode,
38 kRepeat_WrapMode,
39 kMirror_WrapMode
40 };
41
42 /**
43 * Default sampler state is set to kClamp and no-filter
44 */
45 GrSamplerState() {
46 this->setClampNoFilter();
47 }
48
49 GrSamplerState(bool filter) {
50 fWrapX = kClamp_WrapMode;
51 fWrapY = kClamp_WrapMode;
52 fSampleMode = kNormal_SampleMode;
53 fFilter = filter;
54 }
55
56 GrSamplerState(WrapMode wx, WrapMode wy, bool filter) {
57 fWrapX = wx;
58 fWrapY = wy;
59 fSampleMode = kNormal_SampleMode;
60 fFilter = filter;
61 }
62
63 GrSamplerState(WrapMode wx, WrapMode wy, SampleMode sample, bool filter) {
64 fWrapX = wx;
65 fWrapY = wy;
66 fSampleMode = sample;
67 fFilter = filter;
68 }
69
70 WrapMode getWrapX() const { return fWrapX; }
71 WrapMode getWrapY() const { return fWrapY; }
72 SampleMode getSampleMode() const { return fSampleMode; }
73 bool isFilter() const { return fFilter; }
74
75 bool isGradient() const {
76 return kRadial_SampleMode == fSampleMode ||
77 kRadial2_SampleMode == fSampleMode ||
78 kSweep_SampleMode == fSampleMode;
79 }
80
81 void setWrapX(WrapMode mode) { fWrapX = mode; }
82 void setWrapY(WrapMode mode) { fWrapY = mode; }
83 void setSampleMode(SampleMode mode) { fSampleMode = mode; }
84 void setFilter(bool filter) { fFilter = filter; }
85
86 void setClampNoFilter() {
87 fWrapX = kClamp_WrapMode;
88 fWrapY = kClamp_WrapMode;
89 fSampleMode = kNormal_SampleMode;
90 fFilter = false;
91 }
92
93 GrScalar getRadial2CenterX1() const { return fRadial2CenterX1; }
94 GrScalar getRadial2Radius0() const { return fRadial2Radius0; }
95 bool isRadial2PosRoot() const { return fRadial2PosRoot; }
96
97 /**
98 * Sets the parameters for kRadial2_SampleMode. The texture
99 * matrix must be set so that the first point is at (0,0) and the second
100 * point lies on the x-axis. The second radius minus the first is 1 unit.
101 * The additional parameters to define the gradient are specified by this
102 * function.
103 */
104 void setRadial2Params(GrScalar centerX1, GrScalar radius0, bool posRoot) {
105 fRadial2CenterX1 = centerX1;
106 fRadial2Radius0 = radius0;
107 fRadial2PosRoot = posRoot;
108 }
109
110 static const GrSamplerState& ClampNoFilter() {
111 return gClampNoFilter;
112 }
113
114private:
115 WrapMode fWrapX;
116 WrapMode fWrapY;
117 SampleMode fSampleMode;
118 bool fFilter;
119
120 // these are undefined unless fSampleMode == kRadial2_SampleMode
121 GrScalar fRadial2CenterX1;
122 GrScalar fRadial2Radius0;
123 bool fRadial2PosRoot;
124
125 static const GrSamplerState gClampNoFilter;
126};
127
128#endif
129