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

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

Issue 12547012: Make GrGLEffects use an interface to append their code. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 9 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/SkMagnifierImageFilter.cpp ('k') | src/effects/SkMorphologyImageFilter.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 "SkMatrixConvolutionImageFilter.h" 8 #include "SkMatrixConvolutionImageFilter.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 const GrMatrixConvolutionEffect& m = CastEffect<GrMatrixConvolutionEffect>(e ffect); 358 const GrMatrixConvolutionEffect& m = CastEffect<GrMatrixConvolutionEffect>(e ffect);
359 fKernelSize = m.kernelSize(); 359 fKernelSize = m.kernelSize();
360 fTileMode = m.tileMode(); 360 fTileMode = m.tileMode();
361 fConvolveAlpha = m.convolveAlpha(); 361 fConvolveAlpha = m.convolveAlpha();
362 } 362 }
363 363
364 static void appendTextureLookup(GrGLShaderBuilder* builder, 364 static void appendTextureLookup(GrGLShaderBuilder* builder,
365 const GrGLShaderBuilder::TextureSampler& sampler , 365 const GrGLShaderBuilder::TextureSampler& sampler ,
366 const char* coord, 366 const char* coord,
367 SkMatrixConvolutionImageFilter::TileMode tileMod e) { 367 SkMatrixConvolutionImageFilter::TileMode tileMod e) {
368 SkString* code = &builder->fFSCode;
369 SkString clampedCoord; 368 SkString clampedCoord;
370 switch (tileMode) { 369 switch (tileMode) {
371 case SkMatrixConvolutionImageFilter::kClamp_TileMode: 370 case SkMatrixConvolutionImageFilter::kClamp_TileMode:
372 clampedCoord.printf("clamp(%s, 0.0, 1.0)", coord); 371 clampedCoord.printf("clamp(%s, 0.0, 1.0)", coord);
373 coord = clampedCoord.c_str(); 372 coord = clampedCoord.c_str();
374 break; 373 break;
375 case SkMatrixConvolutionImageFilter::kRepeat_TileMode: 374 case SkMatrixConvolutionImageFilter::kRepeat_TileMode:
376 clampedCoord.printf("fract(%s)", coord); 375 clampedCoord.printf("fract(%s)", coord);
377 coord = clampedCoord.c_str(); 376 coord = clampedCoord.c_str();
378 break; 377 break;
379 case SkMatrixConvolutionImageFilter::kClampToBlack_TileMode: 378 case SkMatrixConvolutionImageFilter::kClampToBlack_TileMode:
380 code->appendf("clamp(%s, 0.0, 1.0) != %s ? vec4(0, 0, 0, 0) : ", coo rd, coord); 379 builder->fsCodeAppendf("clamp(%s, 0.0, 1.0) != %s ? vec4(0, 0, 0, 0) : ", coord, coord);
381 break; 380 break;
382 } 381 }
383 builder->appendTextureLookup(code, sampler, coord); 382 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, sample r, coord);
384 } 383 }
385 384
386 void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder, 385 void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder,
387 const GrEffectStage&, 386 const GrEffectStage&,
388 EffectKey key, 387 EffectKey key,
389 const char* vertexCoords, 388 const char* vertexCoords,
390 const char* outputColor, 389 const char* outputColor,
391 const char* inputColor, 390 const char* inputColor,
392 const TextureSamplerArray& samplers) { 391 const TextureSamplerArray& samplers) {
393 const char* coords; 392 const char* coords;
394 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords); 393 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords);
395 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader Type, 394 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader Type,
396 kVec2f_GrSLType, "ImageIncrement"); 395 kVec2f_GrSLType, "ImageIncrement");
397 fKernelUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderTyp e, 396 fKernelUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderTyp e,
398 kFloat_GrSLType, "Kernel", fKernelS ize.width() * fKernelSize.height()); 397 kFloat_GrSLType, "Kernel", fKernelS ize.width() * fKernelSize.height());
399 fTargetUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 398 fTargetUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
400 kVec2f_GrSLType, "Target"); 399 kVec2f_GrSLType, "Target");
401 fGainUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 400 fGainUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
402 kFloat_GrSLType, "Gain"); 401 kFloat_GrSLType, "Gain");
403 fBiasUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 402 fBiasUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
404 kFloat_GrSLType, "Bias"); 403 kFloat_GrSLType, "Bias");
405 404
406 SkString* code = &builder->fFSCode;
407
408 const char* target = builder->getUniformCStr(fTargetUni); 405 const char* target = builder->getUniformCStr(fTargetUni);
409 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); 406 const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
410 const char* kernel = builder->getUniformCStr(fKernelUni); 407 const char* kernel = builder->getUniformCStr(fKernelUni);
411 const char* gain = builder->getUniformCStr(fGainUni); 408 const char* gain = builder->getUniformCStr(fGainUni);
412 const char* bias = builder->getUniformCStr(fBiasUni); 409 const char* bias = builder->getUniformCStr(fBiasUni);
413 int kWidth = fKernelSize.width(); 410 int kWidth = fKernelSize.width();
414 int kHeight = fKernelSize.height(); 411 int kHeight = fKernelSize.height();
415 412
416 code->appendf("\t\tvec4 sum = vec4(0, 0, 0, 0);\n"); 413 builder->fsCodeAppend("\t\tvec4 sum = vec4(0, 0, 0, 0);\n");
417 code->appendf("\t\tvec2 coord = %s - %s * %s;\n", coords, target, imgInc); 414 builder->fsCodeAppendf("\t\tvec2 coord = %s - %s * %s;\n", coords, target, i mgInc);
418 code->appendf("\t\tfor (int y = 0; y < %d; y++) {\n", kHeight); 415 builder->fsCodeAppendf("\t\tfor (int y = 0; y < %d; y++) {\n", kHeight);
419 code->appendf("\t\t\tfor (int x = 0; x < %d; x++) {\n", kWidth); 416 builder->fsCodeAppendf("\t\t\tfor (int x = 0; x < %d; x++) {\n", kWidth);
420 code->appendf("\t\t\t\tfloat k = %s[y * %d + x];\n", kernel, kWidth); 417 builder->fsCodeAppendf("\t\t\t\tfloat k = %s[y * %d + x];\n", kernel, kWidth );
421 code->appendf("\t\t\t\tvec2 coord2 = coord + vec2(x, y) * %s;\n", imgInc); 418 builder->fsCodeAppendf("\t\t\t\tvec2 coord2 = coord + vec2(x, y) * %s;\n", i mgInc);
422 code->appendf("\t\t\t\tvec4 c = "); 419 builder->fsCodeAppend("\t\t\t\tvec4 c = ");
423 appendTextureLookup(builder, samplers[0], "coord2", fTileMode); 420 appendTextureLookup(builder, samplers[0], "coord2", fTileMode);
424 code->appendf(";\n"); 421 builder->fsCodeAppend(";\n");
425 if (!fConvolveAlpha) { 422 if (!fConvolveAlpha) {
426 code->appendf("\t\t\t\tc.rgb /= c.a;\n"); 423 builder->fsCodeAppend("\t\t\t\tc.rgb /= c.a;\n");
427 } 424 }
428 code->appendf("\t\t\t\tsum += c * k;\n"); 425 builder->fsCodeAppend("\t\t\t\tsum += c * k;\n");
429 code->appendf("\t\t\t}\n"); 426 builder->fsCodeAppend("\t\t\t}\n");
430 code->appendf("\t\t}\n"); 427 builder->fsCodeAppend("\t\t}\n");
431 if (fConvolveAlpha) { 428 if (fConvolveAlpha) {
432 code->appendf("\t\t%s = sum * %s + %s;\n", outputColor, gain, bias); 429 builder->fsCodeAppendf("\t\t%s = sum * %s + %s;\n", outputColor, gain, b ias);
433 code->appendf("\t\t%s.rgb = clamp(%s.rgb, 0.0, %s.a);\n", outputColor, o utputColor, outputColor); 430 builder->fsCodeAppendf("\t\t%s.rgb = clamp(%s.rgb, 0.0, %s.a);\n", outpu tColor, outputColor, outputColor);
434 } else { 431 } else {
435 code->appendf("\t\tvec4 c = "); 432 builder->fsCodeAppend("\t\tvec4 c = ");
436 appendTextureLookup(builder, samplers[0], coords, fTileMode); 433 appendTextureLookup(builder, samplers[0], coords, fTileMode);
437 code->appendf(";\n"); 434 builder->fsCodeAppend(";\n");
438 code->appendf("\t\t%s.a = c.a;\n", outputColor); 435 builder->fsCodeAppendf("\t\t%s.a = c.a;\n", outputColor);
439 code->appendf("\t\t%s.rgb = sum.rgb * %s + %s;\n", outputColor, gain, bi as); 436 builder->fsCodeAppendf("\t\t%s.rgb = sum.rgb * %s + %s;\n", outputColor, gain, bias);
440 code->appendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor); 437 builder->fsCodeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor );
441 } 438 }
442 } 439 }
443 440
444 namespace { 441 namespace {
445 442
446 int encodeXY(int x, int y) { 443 int encodeXY(int x, int y) {
447 SkASSERT(x >= 1 && y >= 1 && x * y <= 32); 444 SkASSERT(x >= 1 && y >= 1 && x * y <= 32);
448 if (y < x) 445 if (y < x)
449 return 0x40 | encodeXY(y, x); 446 return 0x40 | encodeXY(y, x);
450 else 447 else
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 fTarget, 573 fTarget,
577 fTileMode, 574 fTileMode,
578 fConvolveAlpha); 575 fConvolveAlpha);
579 } 576 }
580 return ok; 577 return ok;
581 } 578 }
582 579
583 /////////////////////////////////////////////////////////////////////////////// 580 ///////////////////////////////////////////////////////////////////////////////
584 581
585 #endif 582 #endif
OLDNEW
« no previous file with comments | « src/effects/SkMagnifierImageFilter.cpp ('k') | src/effects/SkMorphologyImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698