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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 float fXOffset; | 80 float fXOffset; |
81 float fYOffset; | 81 float fYOffset; |
82 float fXZoom; | 82 float fXZoom; |
83 float fYZoom; | 83 float fYZoom; |
84 float fXInset; | 84 float fXInset; |
85 float fYInset; | 85 float fYInset; |
86 | 86 |
87 typedef GrSingleTextureEffect INHERITED; | 87 typedef GrSingleTextureEffect INHERITED; |
88 }; | 88 }; |
89 | 89 |
90 // For brevity | |
91 typedef GrGLUniformManager::UniformHandle UniformHandle; | |
92 | |
93 class GrGLMagnifierEffect : public GrGLEffect { | 90 class GrGLMagnifierEffect : public GrGLEffect { |
94 public: | 91 public: |
95 GrGLMagnifierEffect(const GrBackendEffectFactory&, const GrDrawEffect&); | 92 GrGLMagnifierEffect(const GrBackendEffectFactory&, const GrDrawEffect&); |
96 | 93 |
97 virtual void emitCode(GrGLShaderBuilder*, | 94 virtual void emitCode(GrGLShaderBuilder*, |
98 const GrDrawEffect&, | 95 const GrDrawEffect&, |
99 EffectKey, | 96 EffectKey, |
100 const char* outputColor, | 97 const char* outputColor, |
101 const char* inputColor, | 98 const char* inputColor, |
102 const TextureSamplerArray&) SK_OVERRIDE; | 99 const TextureSamplerArray&) SK_OVERRIDE; |
103 | 100 |
104 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; | 101 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE; |
105 | 102 |
106 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); | 103 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); |
107 | 104 |
108 private: | 105 private: |
109 UniformHandle fOffsetVar; | 106 GrGLUniform* fOffsetVar; |
110 UniformHandle fZoomVar; | 107 GrGLUniform* fZoomVar; |
111 UniformHandle fInsetVar; | 108 GrGLUniform* fInsetVar; |
112 | 109 |
113 GrGLEffectMatrix fEffectMatrix; | 110 GrGLEffectMatrix fEffectMatrix; |
114 | 111 |
115 typedef GrGLEffect INHERITED; | 112 typedef GrGLEffect INHERITED; |
116 }; | 113 }; |
117 | 114 |
118 GrGLMagnifierEffect::GrGLMagnifierEffect(const GrBackendEffectFactory& factory, | 115 GrGLMagnifierEffect::GrGLMagnifierEffect(const GrBackendEffectFactory& factory, |
119 const GrDrawEffect& drawEffect) | 116 const GrDrawEffect& drawEffect) |
120 : INHERITED(factory) | 117 : INHERITED(factory) |
121 , fOffsetVar(GrGLUniformManager::kInvalidUniformHandle) | 118 , fOffsetVar(NULL) |
122 , fZoomVar(GrGLUniformManager::kInvalidUniformHandle) | 119 , fZoomVar(NULL) |
123 , fInsetVar(GrGLUniformManager::kInvalidUniformHandle) | 120 , fInsetVar(NULL) |
124 , fEffectMatrix(drawEffect.castEffect<GrMagnifierEffect>().coordsType()) { | 121 , fEffectMatrix(drawEffect.castEffect<GrMagnifierEffect>().coordsType()) { |
125 } | 122 } |
126 | 123 |
127 void GrGLMagnifierEffect::emitCode(GrGLShaderBuilder* builder, | 124 void GrGLMagnifierEffect::emitCode(GrGLShaderBuilder* builder, |
128 const GrDrawEffect&, | 125 const GrDrawEffect&, |
129 EffectKey key, | 126 EffectKey key, |
130 const char* outputColor, | 127 const char* outputColor, |
131 const char* inputColor, | 128 const char* inputColor, |
132 const TextureSamplerArray& samplers) { | 129 const TextureSamplerArray& samplers) { |
133 const char* coords; | 130 const char* coords; |
134 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); | 131 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); |
135 fOffsetVar = builder->addUniform( | 132 GrGLShaderBuilder::Uniform* offsetVar = builder->addUniform( |
136 GrGLShaderBuilder::kFragment_ShaderType | | 133 GrGLShaderBuilder::kFragment_ShaderType | |
137 GrGLShaderBuilder::kVertex_ShaderType, | 134 GrGLShaderBuilder::kVertex_ShaderType, |
138 kVec2f_GrSLType, "uOffset"); | 135 kVec2f_GrSLType, "uOffset"); |
139 fZoomVar = builder->addUniform( | 136 fOffsetVar = offsetVar->glUniform(); |
| 137 |
| 138 GrGLShaderBuilder::Uniform* zoomVar = builder->addUniform( |
140 GrGLShaderBuilder::kFragment_ShaderType | | 139 GrGLShaderBuilder::kFragment_ShaderType | |
141 GrGLShaderBuilder::kVertex_ShaderType, | 140 GrGLShaderBuilder::kVertex_ShaderType, |
142 kVec2f_GrSLType, "uZoom"); | 141 kVec2f_GrSLType, "uZoom"); |
143 fInsetVar = builder->addUniform( | 142 fZoomVar = zoomVar->glUniform(); |
| 143 |
| 144 GrGLShaderBuilder::Uniform* insetVar = builder->addUniform( |
144 GrGLShaderBuilder::kFragment_ShaderType | | 145 GrGLShaderBuilder::kFragment_ShaderType | |
145 GrGLShaderBuilder::kVertex_ShaderType, | 146 GrGLShaderBuilder::kVertex_ShaderType, |
146 kVec2f_GrSLType, "uInset"); | 147 kVec2f_GrSLType, "uInset"); |
147 | 148 |
| 149 fInsetVar = insetVar->glUniform(); |
| 150 |
148 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords); | 151 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords); |
149 builder->fsCodeAppendf("\t\tvec2 zoom_coord = %s + %s / %s;\n", | 152 builder->fsCodeAppendf("\t\tvec2 zoom_coord = %s + %s / %s;\n", |
150 builder->getUniformCStr(fOffsetVar), | 153 offsetVar->c_str(), |
151 coords, | 154 coords, |
152 builder->getUniformCStr(fZoomVar)); | 155 zoomVar->c_str()); |
153 | 156 |
154 builder->fsCodeAppend("\t\tvec2 delta = min(coord, vec2(1.0, 1.0) - coord);\
n"); | 157 builder->fsCodeAppend("\t\tvec2 delta = min(coord, vec2(1.0, 1.0) - coord);\
n"); |
155 | 158 |
156 builder->fsCodeAppendf("\t\tdelta = delta / %s;\n", builder->getUniformCStr(
fInsetVar)); | 159 builder->fsCodeAppendf("\t\tdelta = delta / %s;\n", insetVar->c_str()); |
157 | 160 |
158 builder->fsCodeAppend("\t\tfloat weight = 0.0;\n"); | 161 builder->fsCodeAppend("\t\tfloat weight = 0.0;\n"); |
159 builder->fsCodeAppend("\t\tif (delta.s < 2.0 && delta.t < 2.0) {\n"); | 162 builder->fsCodeAppend("\t\tif (delta.s < 2.0 && delta.t < 2.0) {\n"); |
160 builder->fsCodeAppend("\t\t\tdelta = vec2(2.0, 2.0) - delta;\n"); | 163 builder->fsCodeAppend("\t\t\tdelta = vec2(2.0, 2.0) - delta;\n"); |
161 builder->fsCodeAppend("\t\t\tfloat dist = length(delta);\n"); | 164 builder->fsCodeAppend("\t\t\tfloat dist = length(delta);\n"); |
162 builder->fsCodeAppend("\t\t\tdist = max(2.0 - dist, 0.0);\n"); | 165 builder->fsCodeAppend("\t\t\tdist = max(2.0 - dist, 0.0);\n"); |
163 builder->fsCodeAppend("\t\t\tweight = min(dist * dist, 1.0);\n"); | 166 builder->fsCodeAppend("\t\t\tweight = min(dist * dist, 1.0);\n"); |
164 builder->fsCodeAppend("\t\t} else {\n"); | 167 builder->fsCodeAppend("\t\t} else {\n"); |
165 builder->fsCodeAppend("\t\t\tvec2 delta_squared = delta * delta;\n"); | 168 builder->fsCodeAppend("\t\t\tvec2 delta_squared = delta * delta;\n"); |
166 builder->fsCodeAppend("\t\t\tweight = min(min(delta_squared.s, delta_squared
.y), 1.0);\n"); | 169 builder->fsCodeAppend("\t\t\tweight = min(min(delta_squared.s, delta_squared
.y), 1.0);\n"); |
167 builder->fsCodeAppend("\t\t}\n"); | 170 builder->fsCodeAppend("\t\t}\n"); |
168 | 171 |
169 builder->fsCodeAppend("\t\tvec2 mix_coord = mix(coord, zoom_coord, weight);\
n"); | 172 builder->fsCodeAppend("\t\tvec2 mix_coord = mix(coord, zoom_coord, weight);\
n"); |
170 builder->fsCodeAppend("\t\tvec4 output_color = "); | 173 builder->fsCodeAppend("\t\tvec4 output_color = "); |
171 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample
rs[0], "mix_coord"); | 174 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample
rs[0], "mix_coord"); |
172 builder->fsCodeAppend(";\n"); | 175 builder->fsCodeAppend(";\n"); |
173 | 176 |
174 builder->fsCodeAppendf("\t\t%s = output_color;", outputColor); | 177 builder->fsCodeAppendf("\t\t%s = output_color;", outputColor); |
175 SkString modulate; | 178 SkString modulate; |
176 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); | 179 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
177 builder->fsCodeAppend(modulate.c_str()); | 180 builder->fsCodeAppend(modulate.c_str()); |
178 } | 181 } |
179 | 182 |
180 void GrGLMagnifierEffect::setData(const GrGLUniformManager& uman, | 183 void GrGLMagnifierEffect::setData(const GrGLContext& context, |
181 const GrDrawEffect& drawEffect) { | 184 const GrDrawEffect& drawEffect) { |
182 const GrMagnifierEffect& zoom = drawEffect.castEffect<GrMagnifierEffect>(); | 185 const GrMagnifierEffect& zoom = drawEffect.castEffect<GrMagnifierEffect>(); |
183 uman.set2f(fOffsetVar, zoom.x_offset(), zoom.y_offset()); | 186 fOffsetVar->set2f(context, zoom.x_offset(), zoom.y_offset()); |
184 uman.set2f(fZoomVar, zoom.x_zoom(), zoom.y_zoom()); | 187 fZoomVar->set2f(context, zoom.x_zoom(), zoom.y_zoom()); |
185 uman.set2f(fInsetVar, zoom.x_inset(), zoom.y_inset()); | 188 fInsetVar->set2f(context, zoom.x_inset(), zoom.y_inset()); |
186 fEffectMatrix.setData(uman, zoom.getMatrix(), drawEffect, zoom.texture(0)); | 189 fEffectMatrix.setData(context, zoom.getMatrix(), drawEffect, zoom.texture(0)
); |
187 } | 190 } |
188 | 191 |
189 GrGLEffect::EffectKey GrGLMagnifierEffect::GenKey(const GrDrawEffect& drawEffect
, | 192 GrGLEffect::EffectKey GrGLMagnifierEffect::GenKey(const GrDrawEffect& drawEffect
, |
190 const GrGLCaps&) { | 193 const GrGLCaps&) { |
191 const GrMagnifierEffect& zoom = drawEffect.castEffect<GrMagnifierEffect>(); | 194 const GrMagnifierEffect& zoom = drawEffect.castEffect<GrMagnifierEffect>(); |
192 return GrGLEffectMatrix::GenKey(zoom.getMatrix(), | 195 return GrGLEffectMatrix::GenKey(zoom.getMatrix(), |
193 drawEffect, | 196 drawEffect, |
194 zoom.coordsType(), | 197 zoom.coordsType(), |
195 zoom.texture(0)); | 198 zoom.texture(0)); |
196 } | 199 } |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 | 348 |
346 int x_val = SkMin32(SkScalarFloorToInt(x_interp), width - 1); | 349 int x_val = SkMin32(SkScalarFloorToInt(x_interp), width - 1); |
347 int y_val = SkMin32(SkScalarFloorToInt(y_interp), height - 1); | 350 int y_val = SkMin32(SkScalarFloorToInt(y_interp), height - 1); |
348 | 351 |
349 *dptr = sptr[y_val * width + x_val]; | 352 *dptr = sptr[y_val * width + x_val]; |
350 dptr++; | 353 dptr++; |
351 } | 354 } |
352 } | 355 } |
353 return true; | 356 return true; |
354 } | 357 } |
OLD | NEW |