OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 The Android Open Source Project |
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 "SkBitmap.h" | 8 #include "SkBitmap.h" |
9 #include "SkMagnifierImageFilter.h" | 9 #include "SkMagnifierImageFilter.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 kVec2f_GrSLType, "uOffset"); | 141 kVec2f_GrSLType, "uOffset"); |
142 fZoomVar = builder->addUniform( | 142 fZoomVar = builder->addUniform( |
143 GrGLShaderBuilder::kFragment_ShaderType | | 143 GrGLShaderBuilder::kFragment_ShaderType | |
144 GrGLShaderBuilder::kVertex_ShaderType, | 144 GrGLShaderBuilder::kVertex_ShaderType, |
145 kVec2f_GrSLType, "uZoom"); | 145 kVec2f_GrSLType, "uZoom"); |
146 fInsetVar = builder->addUniform( | 146 fInsetVar = builder->addUniform( |
147 GrGLShaderBuilder::kFragment_ShaderType | | 147 GrGLShaderBuilder::kFragment_ShaderType | |
148 GrGLShaderBuilder::kVertex_ShaderType, | 148 GrGLShaderBuilder::kVertex_ShaderType, |
149 kVec2f_GrSLType, "uInset"); | 149 kVec2f_GrSLType, "uInset"); |
150 | 150 |
151 SkString* code = &builder->fFSCode; | 151 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords); |
| 152 builder->fsCodeAppendf("\t\tvec2 zoom_coord = %s + %s / %s;\n", |
| 153 builder->getUniformCStr(fOffsetVar), |
| 154 coords, |
| 155 builder->getUniformCStr(fZoomVar)); |
152 | 156 |
153 code->appendf("\t\tvec2 coord = %s;\n", coords); | 157 builder->fsCodeAppend("\t\tvec2 delta = min(coord, vec2(1.0, 1.0) - coord);\
n"); |
154 code->appendf("\t\tvec2 zoom_coord = %s + %s / %s;\n", | |
155 builder->getUniformCStr(fOffsetVar), | |
156 coords, | |
157 builder->getUniformCStr(fZoomVar)); | |
158 | 158 |
159 code->appendf("\t\tvec2 delta = min(coord, vec2(1.0, 1.0) - coord);\n"); | 159 builder->fsCodeAppendf("\t\tdelta = delta / %s;\n", builder->getUniformCStr(
fInsetVar)); |
160 | 160 |
161 code->appendf("\t\tdelta = delta / %s;\n", builder->getUniformCStr(fInsetVar
)); | 161 builder->fsCodeAppend("\t\tfloat weight = 0.0;\n"); |
| 162 builder->fsCodeAppend("\t\tif (delta.s < 2.0 && delta.t < 2.0) {\n"); |
| 163 builder->fsCodeAppend("\t\t\tdelta = vec2(2.0, 2.0) - delta;\n"); |
| 164 builder->fsCodeAppend("\t\t\tfloat dist = length(delta);\n"); |
| 165 builder->fsCodeAppend("\t\t\tdist = max(2.0 - dist, 0.0);\n"); |
| 166 builder->fsCodeAppend("\t\t\tweight = min(dist * dist, 1.0);\n"); |
| 167 builder->fsCodeAppend("\t\t} else {\n"); |
| 168 builder->fsCodeAppend("\t\t\tvec2 delta_squared = delta * delta;\n"); |
| 169 builder->fsCodeAppend("\t\t\tweight = min(min(delta_squared.s, delta_squared
.y), 1.0);\n"); |
| 170 builder->fsCodeAppend("\t\t}\n"); |
162 | 171 |
163 code->appendf("\t\tfloat weight = 0.0;\n"); | 172 builder->fsCodeAppend("\t\tvec2 mix_coord = mix(coord, zoom_coord, weight);\
n"); |
164 code->appendf("\t\tif (delta.s < 2.0 && delta.t < 2.0) {\n"); | 173 builder->fsCodeAppend("\t\tvec4 output_color = "); |
165 code->appendf("\t\t\tdelta = vec2(2.0, 2.0) - delta;\n"); | 174 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample
rs[0], "mix_coord"); |
166 code->appendf("\t\t\tfloat dist = length(delta);\n"); | 175 builder->fsCodeAppend(";\n"); |
167 code->appendf("\t\t\tdist = max(2.0 - dist, 0.0);\n"); | |
168 code->appendf("\t\t\tweight = min(dist * dist, 1.0);\n"); | |
169 code->appendf("\t\t} else {\n"); | |
170 code->appendf("\t\t\tvec2 delta_squared = delta * delta;\n"); | |
171 code->appendf("\t\t\tweight = min(min(delta_squared.s, delta_squared.y), 1.0
);\n"); | |
172 code->appendf("\t\t}\n"); | |
173 | 176 |
174 code->appendf("\t\tvec2 mix_coord = mix(coord, zoom_coord, weight);\n"); | 177 builder->fsCodeAppendf("\t\t%s = output_color;", outputColor); |
175 code->appendf("\t\tvec4 output_color = "); | 178 SkString modulate; |
176 builder->appendTextureLookup(code, samplers[0], "mix_coord"); | 179 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
177 code->append(";\n"); | 180 builder->fsCodeAppend(modulate.c_str()); |
178 | |
179 code->appendf("\t\t%s = output_color;", outputColor); | |
180 GrGLSLMulVarBy4f(code, 2, outputColor, inputColor); | |
181 } | 181 } |
182 | 182 |
183 void GrGLMagnifierEffect::setData(const GrGLUniformManager& uman, | 183 void GrGLMagnifierEffect::setData(const GrGLUniformManager& uman, |
184 const GrEffectStage& stage) { | 184 const GrEffectStage& stage) { |
185 const GrMagnifierEffect& zoom = GetEffectFromStage<GrMagnifierEffect>(stage)
; | 185 const GrMagnifierEffect& zoom = GetEffectFromStage<GrMagnifierEffect>(stage)
; |
186 uman.set2f(fOffsetVar, zoom.x_offset(), zoom.y_offset()); | 186 uman.set2f(fOffsetVar, zoom.x_offset(), zoom.y_offset()); |
187 uman.set2f(fZoomVar, zoom.x_zoom(), zoom.y_zoom()); | 187 uman.set2f(fZoomVar, zoom.x_zoom(), zoom.y_zoom()); |
188 uman.set2f(fInsetVar, zoom.x_inset(), zoom.y_inset()); | 188 uman.set2f(fInsetVar, zoom.x_inset(), zoom.y_inset()); |
189 fEffectMatrix.setData(uman, zoom.getMatrix(), stage.getCoordChangeMatrix(),
zoom.texture(0)); | 189 fEffectMatrix.setData(uman, zoom.getMatrix(), stage.getCoordChangeMatrix(),
zoom.texture(0)); |
190 } | 190 } |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 | 347 |
348 int x_val = SkMin32(SkScalarFloorToInt(x_interp), width - 1); | 348 int x_val = SkMin32(SkScalarFloorToInt(x_interp), width - 1); |
349 int y_val = SkMin32(SkScalarFloorToInt(y_interp), height - 1); | 349 int y_val = SkMin32(SkScalarFloorToInt(y_interp), height - 1); |
350 | 350 |
351 *dptr = sptr[y_val * width + x_val]; | 351 *dptr = sptr[y_val * width + x_val]; |
352 dptr++; | 352 dptr++; |
353 } | 353 } |
354 } | 354 } |
355 return true; | 355 return true; |
356 } | 356 } |
OLD | NEW |