OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkAlphaThresholdFilter.h" | 8 #include "SkAlphaThresholdFilter.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkReadBuffer.h" | 10 #include "SkReadBuffer.h" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 GrCoordTransform fMaskCoordTransform; | 121 GrCoordTransform fMaskCoordTransform; |
122 GrTextureAccess fMaskTextureAccess; | 122 GrTextureAccess fMaskTextureAccess; |
123 | 123 |
124 typedef GrFragmentProcessor INHERITED; | 124 typedef GrFragmentProcessor INHERITED; |
125 }; | 125 }; |
126 | 126 |
127 class GrGLAlphaThresholdEffect : public GrGLFragmentProcessor { | 127 class GrGLAlphaThresholdEffect : public GrGLFragmentProcessor { |
128 public: | 128 public: |
129 GrGLAlphaThresholdEffect(const GrFragmentProcessor&) {} | 129 GrGLAlphaThresholdEffect(const GrFragmentProcessor&) {} |
130 | 130 |
131 virtual void emitCode(GrGLFPBuilder*, | 131 virtual void emitCode(EmitArgs&) override; |
132 const GrFragmentProcessor&, | |
133 const char* outputColor, | |
134 const char* inputColor, | |
135 const TransformedCoordsArray&, | |
136 const TextureSamplerArray&) override; | |
137 | 132 |
138 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 133 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |
139 | 134 |
140 private: | 135 private: |
141 | 136 |
142 GrGLProgramDataManager::UniformHandle fInnerThresholdVar; | 137 GrGLProgramDataManager::UniformHandle fInnerThresholdVar; |
143 GrGLProgramDataManager::UniformHandle fOuterThresholdVar; | 138 GrGLProgramDataManager::UniformHandle fOuterThresholdVar; |
144 | 139 |
145 typedef GrGLFragmentProcessor INHERITED; | 140 typedef GrGLFragmentProcessor INHERITED; |
146 }; | 141 }; |
147 | 142 |
148 void GrGLAlphaThresholdEffect::emitCode(GrGLFPBuilder* builder, | 143 void GrGLAlphaThresholdEffect::emitCode(EmitArgs& args) { |
149 const GrFragmentProcessor&, | 144 fInnerThresholdVar = args.fBuilder->addUniform( |
150 const char* outputColor, | |
151 const char* inputColor, | |
152 const TransformedCoordsArray& coords, | |
153 const TextureSamplerArray& samplers) { | |
154 fInnerThresholdVar = builder->addUniform( | |
155 GrGLProgramBuilder::kFragment_Visibility, | 145 GrGLProgramBuilder::kFragment_Visibility, |
156 kFloat_GrSLType, kDefault_GrSLPrecision, | 146 kFloat_GrSLType, kDefault_GrSLPrecision, |
157 "inner_threshold"); | 147 "inner_threshold"); |
158 fOuterThresholdVar = builder->addUniform( | 148 fOuterThresholdVar = args.fBuilder->addUniform( |
159 GrGLProgramBuilder::kFragment_Visibility, | 149 GrGLProgramBuilder::kFragment_Visibility, |
160 kFloat_GrSLType, kDefault_GrSLPrecision, | 150 kFloat_GrSLType, kDefault_GrSLPrecision, |
161 "outer_threshold"); | 151 "outer_threshold"); |
162 | 152 |
163 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 153 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); |
164 SkString coords2D = fsBuilder->ensureFSCoords2D(coords, 0); | 154 SkString coords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 0); |
165 SkString maskCoords2D = fsBuilder->ensureFSCoords2D(coords, 1); | 155 SkString maskCoords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 1); |
166 | 156 |
167 fsBuilder->codeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); | 157 fsBuilder->codeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); |
168 fsBuilder->codeAppendf("\t\tvec2 mask_coord = %s;\n", maskCoords2D.c_str()); | 158 fsBuilder->codeAppendf("\t\tvec2 mask_coord = %s;\n", maskCoords2D.c_str()); |
169 fsBuilder->codeAppend("\t\tvec4 input_color = "); | 159 fsBuilder->codeAppend("\t\tvec4 input_color = "); |
170 fsBuilder->appendTextureLookup(samplers[0], "coord"); | 160 fsBuilder->appendTextureLookup(args.fSamplers[0], "coord"); |
171 fsBuilder->codeAppend(";\n"); | 161 fsBuilder->codeAppend(";\n"); |
172 fsBuilder->codeAppend("\t\tvec4 mask_color = "); | 162 fsBuilder->codeAppend("\t\tvec4 mask_color = "); |
173 fsBuilder->appendTextureLookup(samplers[1], "mask_coord"); | 163 fsBuilder->appendTextureLookup(args.fSamplers[1], "mask_coord"); |
174 fsBuilder->codeAppend(";\n"); | 164 fsBuilder->codeAppend(";\n"); |
175 | 165 |
176 fsBuilder->codeAppendf("\t\tfloat inner_thresh = %s;\n", | 166 fsBuilder->codeAppendf("\t\tfloat inner_thresh = %s;\n", |
177 builder->getUniformCStr(fInnerThresholdVar)); | 167 args.fBuilder->getUniformCStr(fInnerThresholdVar)); |
178 fsBuilder->codeAppendf("\t\tfloat outer_thresh = %s;\n", | 168 fsBuilder->codeAppendf("\t\tfloat outer_thresh = %s;\n", |
179 builder->getUniformCStr(fOuterThresholdVar)); | 169 args.fBuilder->getUniformCStr(fOuterThresholdVar)); |
180 fsBuilder->codeAppend("\t\tfloat mask = mask_color.a;\n"); | 170 fsBuilder->codeAppend("\t\tfloat mask = mask_color.a;\n"); |
181 | 171 |
182 fsBuilder->codeAppend("vec4 color = input_color;\n"); | 172 fsBuilder->codeAppend("vec4 color = input_color;\n"); |
183 fsBuilder->codeAppend("\t\tif (mask < 0.5) {\n" | 173 fsBuilder->codeAppend("\t\tif (mask < 0.5) {\n" |
184 "\t\t\tif (color.a > outer_thresh) {\n" | 174 "\t\t\tif (color.a > outer_thresh) {\n" |
185 "\t\t\t\tfloat scale = outer_thresh / color.a;\n" | 175 "\t\t\t\tfloat scale = outer_thresh / color.a;\n" |
186 "\t\t\t\tcolor.rgb *= scale;\n" | 176 "\t\t\t\tcolor.rgb *= scale;\n" |
187 "\t\t\t\tcolor.a = outer_thresh;\n" | 177 "\t\t\t\tcolor.a = outer_thresh;\n" |
188 "\t\t\t}\n" | 178 "\t\t\t}\n" |
189 "\t\t} else if (color.a < inner_thresh) {\n" | 179 "\t\t} else if (color.a < inner_thresh) {\n" |
190 "\t\t\tfloat scale = inner_thresh / max(0.001, color.a
);\n" | 180 "\t\t\tfloat scale = inner_thresh / max(0.001, color.a
);\n" |
191 "\t\t\tcolor.rgb *= scale;\n" | 181 "\t\t\tcolor.rgb *= scale;\n" |
192 "\t\t\tcolor.a = inner_thresh;\n" | 182 "\t\t\tcolor.a = inner_thresh;\n" |
193 "\t\t}\n"); | 183 "\t\t}\n"); |
194 | 184 |
195 fsBuilder->codeAppendf("%s = %s;\n", outputColor, | 185 fsBuilder->codeAppendf("%s = %s;\n", args.fOutputColor, |
196 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("color")).c_st
r()); | 186 (GrGLSLExpr4(args.fInputColor) * GrGLSLExpr4("color")
).c_str()); |
197 } | 187 } |
198 | 188 |
199 void GrGLAlphaThresholdEffect::setData(const GrGLProgramDataManager& pdman, | 189 void GrGLAlphaThresholdEffect::setData(const GrGLProgramDataManager& pdman, |
200 const GrProcessor& proc) { | 190 const GrProcessor& proc) { |
201 const AlphaThresholdEffect& alpha_threshold = proc.cast<AlphaThresholdEffect
>(); | 191 const AlphaThresholdEffect& alpha_threshold = proc.cast<AlphaThresholdEffect
>(); |
202 pdman.set1f(fInnerThresholdVar, alpha_threshold.innerThreshold()); | 192 pdman.set1f(fInnerThresholdVar, alpha_threshold.innerThreshold()); |
203 pdman.set1f(fOuterThresholdVar, alpha_threshold.outerThreshold()); | 193 pdman.set1f(fOuterThresholdVar, alpha_threshold.outerThreshold()); |
204 } | 194 } |
205 | 195 |
206 ///////////////////////////////////////////////////////////////////// | 196 ///////////////////////////////////////////////////////////////////// |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 } | 374 } |
385 | 375 |
386 #ifndef SK_IGNORE_TO_STRING | 376 #ifndef SK_IGNORE_TO_STRING |
387 void SkAlphaThresholdFilterImpl::toString(SkString* str) const { | 377 void SkAlphaThresholdFilterImpl::toString(SkString* str) const { |
388 str->appendf("SkAlphaThresholdImageFilter: ("); | 378 str->appendf("SkAlphaThresholdImageFilter: ("); |
389 str->appendf("inner: %f outer: %f", fInnerThreshold, fOuterThreshold); | 379 str->appendf("inner: %f outer: %f", fInnerThreshold, fOuterThreshold); |
390 str->append(")"); | 380 str->append(")"); |
391 } | 381 } |
392 #endif | 382 #endif |
393 | 383 |
OLD | NEW |