Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: src/effects/SkMorphologyImageFilter.cpp

Issue 23018003: Rename GrGLUniformManager to GrGLUniform and ref GrGLUniforms directly Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/effects/SkMatrixConvolutionImageFilter.cpp ('k') | src/effects/SkPerlinNoiseShader.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "SkMorphologyImageFilter.h" 8 #include "SkMorphologyImageFilter.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 289
290 virtual void emitCode(GrGLShaderBuilder*, 290 virtual void emitCode(GrGLShaderBuilder*,
291 const GrDrawEffect&, 291 const GrDrawEffect&,
292 EffectKey, 292 EffectKey,
293 const char* outputColor, 293 const char* outputColor,
294 const char* inputColor, 294 const char* inputColor,
295 const TextureSamplerArray&) SK_OVERRIDE; 295 const TextureSamplerArray&) SK_OVERRIDE;
296 296
297 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); 297 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
298 298
299 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE; 299 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
300 300
301 private: 301 private:
302 int width() const { return GrMorphologyEffect::WidthFromRadius(fRadius); } 302 int width() const { return GrMorphologyEffect::WidthFromRadius(fRadius); }
303 303
304 int fRadius; 304 int fRadius;
305 GrMorphologyEffect::MorphologyType fType; 305 GrMorphologyEffect::MorphologyType fType;
306 GrGLUniformManager::UniformHandle fImageIncrementUni; 306 GrGLUniform* fImageIncrementUni;
307 GrGLEffectMatrix fEffectMatrix; 307 GrGLEffectMatrix fEffectMatrix;
308 308
309 typedef GrGLEffect INHERITED; 309 typedef GrGLEffect INHERITED;
310 }; 310 };
311 311
312 GrGLMorphologyEffect::GrGLMorphologyEffect(const GrBackendEffectFactory& factory , 312 GrGLMorphologyEffect::GrGLMorphologyEffect(const GrBackendEffectFactory& factory ,
313 const GrDrawEffect& drawEffect) 313 const GrDrawEffect& drawEffect)
314 : INHERITED(factory) 314 : INHERITED(factory)
315 , fImageIncrementUni(GrGLUniformManager::kInvalidUniformHandle) 315 , fImageIncrementUni(NULL)
316 , fEffectMatrix(drawEffect.castEffect<GrMorphologyEffect>().coordsType()) { 316 , fEffectMatrix(drawEffect.castEffect<GrMorphologyEffect>().coordsType()) {
317 const GrMorphologyEffect& m = drawEffect.castEffect<GrMorphologyEffect>(); 317 const GrMorphologyEffect& m = drawEffect.castEffect<GrMorphologyEffect>();
318 fRadius = m.radius(); 318 fRadius = m.radius();
319 fType = m.type(); 319 fType = m.type();
320 } 320 }
321 321
322 void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder, 322 void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder,
323 const GrDrawEffect&, 323 const GrDrawEffect&,
324 EffectKey key, 324 EffectKey key,
325 const char* outputColor, 325 const char* outputColor,
326 const char* inputColor, 326 const char* inputColor,
327 const TextureSamplerArray& samplers) { 327 const TextureSamplerArray& samplers) {
328 const char* coords; 328 const char* coords;
329 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); 329 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords);
330 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader Type, 330
331 kVec2f_GrSLType, "ImageIncrement"); 331 GrGLShaderBuilder::Uniform* imageIncrementUni =
332 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
333 kVec2f_GrSLType, "ImageIncrement");
334 fImageIncrementUni = imageIncrementUni->glUniform();
332 335
333 const char* func; 336 const char* func;
334 switch (fType) { 337 switch (fType) {
335 case GrMorphologyEffect::kErode_MorphologyType: 338 case GrMorphologyEffect::kErode_MorphologyType:
336 builder->fsCodeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", outputColor); 339 builder->fsCodeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", outputColor);
337 func = "min"; 340 func = "min";
338 break; 341 break;
339 case GrMorphologyEffect::kDilate_MorphologyType: 342 case GrMorphologyEffect::kDilate_MorphologyType:
340 builder->fsCodeAppendf("\t\t%s = vec4(0, 0, 0, 0);\n", outputColor); 343 builder->fsCodeAppendf("\t\t%s = vec4(0, 0, 0, 0);\n", outputColor);
341 func = "max"; 344 func = "max";
342 break; 345 break;
343 default: 346 default:
344 GrCrash("Unexpected type"); 347 GrCrash("Unexpected type");
345 func = ""; // suppress warning 348 func = ""; // suppress warning
346 break; 349 break;
347 } 350 }
348 const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
349 351
350 builder->fsCodeAppendf("\t\tvec2 coord = %s - %d.0 * %s;\n", coords, fRadius , imgInc); 352 builder->fsCodeAppendf("\t\tvec2 coord = %s - %d.0 * %s;\n", coords, fRadius , imageIncrementUni->c_str());
351 builder->fsCodeAppendf("\t\tfor (int i = 0; i < %d; i++) {\n", this->width() ); 353 builder->fsCodeAppendf("\t\tfor (int i = 0; i < %d; i++) {\n", this->width() );
352 builder->fsCodeAppendf("\t\t\t%s = %s(%s, ", outputColor, func, outputColor) ; 354 builder->fsCodeAppendf("\t\t\t%s = %s(%s, ", outputColor, func, outputColor) ;
353 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample rs[0], "coord"); 355 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample rs[0], "coord");
354 builder->fsCodeAppend(");\n"); 356 builder->fsCodeAppend(");\n");
355 builder->fsCodeAppendf("\t\t\tcoord += %s;\n", imgInc); 357 builder->fsCodeAppendf("\t\t\tcoord += %s;\n", imageIncrementUni->c_str());
356 builder->fsCodeAppend("\t\t}\n"); 358 builder->fsCodeAppend("\t\t}\n");
357 SkString modulate; 359 SkString modulate;
358 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); 360 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor);
359 builder->fsCodeAppend(modulate.c_str()); 361 builder->fsCodeAppend(modulate.c_str());
360 } 362 }
361 363
362 GrGLEffect::EffectKey GrGLMorphologyEffect::GenKey(const GrDrawEffect& drawEffec t, 364 GrGLEffect::EffectKey GrGLMorphologyEffect::GenKey(const GrDrawEffect& drawEffec t,
363 const GrGLCaps&) { 365 const GrGLCaps&) {
364 const GrMorphologyEffect& m = drawEffect.castEffect<GrMorphologyEffect>(); 366 const GrMorphologyEffect& m = drawEffect.castEffect<GrMorphologyEffect>();
365 EffectKey key = static_cast<EffectKey>(m.radius()); 367 EffectKey key = static_cast<EffectKey>(m.radius());
366 key |= (m.type() << 8); 368 key |= (m.type() << 8);
367 key <<= GrGLEffectMatrix::kKeyBits; 369 key <<= GrGLEffectMatrix::kKeyBits;
368 EffectKey matrixKey = GrGLEffectMatrix::GenKey(m.getMatrix(), 370 EffectKey matrixKey = GrGLEffectMatrix::GenKey(m.getMatrix(),
369 drawEffect, 371 drawEffect,
370 m.coordsType(), 372 m.coordsType(),
371 m.texture(0)); 373 m.texture(0));
372 return key | matrixKey; 374 return key | matrixKey;
373 } 375 }
374 376
375 void GrGLMorphologyEffect::setData(const GrGLUniformManager& uman, 377 void GrGLMorphologyEffect::setData(const GrGLContext& context,
376 const GrDrawEffect& drawEffect) { 378 const GrDrawEffect& drawEffect) {
377 const Gr1DKernelEffect& kern = drawEffect.castEffect<Gr1DKernelEffect>(); 379 const Gr1DKernelEffect& kern = drawEffect.castEffect<Gr1DKernelEffect>();
378 GrTexture& texture = *kern.texture(0); 380 GrTexture& texture = *kern.texture(0);
379 // the code we generated was for a specific kernel radius 381 // the code we generated was for a specific kernel radius
380 GrAssert(kern.radius() == fRadius); 382 GrAssert(kern.radius() == fRadius);
381 float imageIncrement[2] = { 0 }; 383 float imageIncrement[2] = { 0 };
382 switch (kern.direction()) { 384 switch (kern.direction()) {
383 case Gr1DKernelEffect::kX_Direction: 385 case Gr1DKernelEffect::kX_Direction:
384 imageIncrement[0] = 1.0f / texture.width(); 386 imageIncrement[0] = 1.0f / texture.width();
385 break; 387 break;
386 case Gr1DKernelEffect::kY_Direction: 388 case Gr1DKernelEffect::kY_Direction:
387 imageIncrement[1] = 1.0f / texture.height(); 389 imageIncrement[1] = 1.0f / texture.height();
388 break; 390 break;
389 default: 391 default:
390 GrCrash("Unknown filter direction."); 392 GrCrash("Unknown filter direction.");
391 } 393 }
392 uman.set2fv(fImageIncrementUni, 0, 1, imageIncrement); 394 fImageIncrementUni->set2fv(context, 0, 1, imageIncrement);
393 fEffectMatrix.setData(uman, kern.getMatrix(), drawEffect, kern.texture(0)); 395 fEffectMatrix.setData(context, kern.getMatrix(), drawEffect, kern.texture(0) );
394 } 396 }
395 397
396 /////////////////////////////////////////////////////////////////////////////// 398 ///////////////////////////////////////////////////////////////////////////////
397 399
398 GrMorphologyEffect::GrMorphologyEffect(GrTexture* texture, 400 GrMorphologyEffect::GrMorphologyEffect(GrTexture* texture,
399 Direction direction, 401 Direction direction,
400 int radius, 402 int radius,
401 MorphologyType type) 403 MorphologyType type)
402 : Gr1DKernelEffect(texture, direction, radius) 404 : Gr1DKernelEffect(texture, direction, radius)
403 , fType(type) { 405 , fType(type) {
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 } 526 }
525 GrTexture* input = inputBM.getTexture(); 527 GrTexture* input = inputBM.getTexture();
526 SkIRect bounds; 528 SkIRect bounds;
527 src.getBounds(&bounds); 529 src.getBounds(&bounds);
528 SkAutoTUnref<GrTexture> resultTex(apply_morphology(input, bounds, 530 SkAutoTUnref<GrTexture> resultTex(apply_morphology(input, bounds,
529 GrMorphologyEffect::kErode_MorphologyType, radius())); 531 GrMorphologyEffect::kErode_MorphologyType, radius()));
530 return SkImageFilterUtils::WrapTexture(resultTex, src.width(), src.height(), result); 532 return SkImageFilterUtils::WrapTexture(resultTex, src.width(), src.height(), result);
531 } 533 }
532 534
533 #endif 535 #endif
OLDNEW
« no previous file with comments | « src/effects/SkMatrixConvolutionImageFilter.cpp ('k') | src/effects/SkPerlinNoiseShader.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698