| 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 "SkMorphologyImageFilter.h" | 8 #include "SkMorphologyImageFilter.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 void GrGLMorphologyEffect::emitCode(EmitArgs& args) { | 290 void GrGLMorphologyEffect::emitCode(EmitArgs& args) { |
| 291 fPixelSizeUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Vi
sibility, | 291 fPixelSizeUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Vi
sibility, |
| 292 kFloat_GrSLType, kDefault_GrSLPrecis
ion, | 292 kFloat_GrSLType, kDefault_GrSLPrecis
ion, |
| 293 "PixelSize"); | 293 "PixelSize"); |
| 294 const char* pixelSizeInc = args.fBuilder->getUniformCStr(fPixelSizeUni); | 294 const char* pixelSizeInc = args.fBuilder->getUniformCStr(fPixelSizeUni); |
| 295 fRangeUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibi
lity, | 295 fRangeUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibi
lity, |
| 296 kVec2f_GrSLType, kDefault_GrSLPrecis
ion, | 296 kVec2f_GrSLType, kDefault_GrSLPrecis
ion, |
| 297 "Range"); | 297 "Range"); |
| 298 const char* range = args.fBuilder->getUniformCStr(fRangeUni); | 298 const char* range = args.fBuilder->getUniformCStr(fRangeUni); |
| 299 | 299 |
| 300 GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder()
; | 300 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 301 SkString coords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 0); | 301 SkString coords2D = fragBuilder->ensureFSCoords2D(args.fCoords, 0); |
| 302 const char* func; | 302 const char* func; |
| 303 switch (fType) { | 303 switch (fType) { |
| 304 case GrMorphologyEffect::kErode_MorphologyType: | 304 case GrMorphologyEffect::kErode_MorphologyType: |
| 305 fsBuilder->codeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", args.fOutputC
olor); | 305 fragBuilder->codeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", args.fOutpu
tColor); |
| 306 func = "min"; | 306 func = "min"; |
| 307 break; | 307 break; |
| 308 case GrMorphologyEffect::kDilate_MorphologyType: | 308 case GrMorphologyEffect::kDilate_MorphologyType: |
| 309 fsBuilder->codeAppendf("\t\t%s = vec4(0, 0, 0, 0);\n", args.fOutputC
olor); | 309 fragBuilder->codeAppendf("\t\t%s = vec4(0, 0, 0, 0);\n", args.fOutpu
tColor); |
| 310 func = "max"; | 310 func = "max"; |
| 311 break; | 311 break; |
| 312 default: | 312 default: |
| 313 SkFAIL("Unexpected type"); | 313 SkFAIL("Unexpected type"); |
| 314 func = ""; // suppress warning | 314 func = ""; // suppress warning |
| 315 break; | 315 break; |
| 316 } | 316 } |
| 317 | 317 |
| 318 const char* dir; | 318 const char* dir; |
| 319 switch (fDirection) { | 319 switch (fDirection) { |
| 320 case Gr1DKernelEffect::kX_Direction: | 320 case Gr1DKernelEffect::kX_Direction: |
| 321 dir = "x"; | 321 dir = "x"; |
| 322 break; | 322 break; |
| 323 case Gr1DKernelEffect::kY_Direction: | 323 case Gr1DKernelEffect::kY_Direction: |
| 324 dir = "y"; | 324 dir = "y"; |
| 325 break; | 325 break; |
| 326 default: | 326 default: |
| 327 SkFAIL("Unknown filter direction."); | 327 SkFAIL("Unknown filter direction."); |
| 328 dir = ""; // suppress warning | 328 dir = ""; // suppress warning |
| 329 } | 329 } |
| 330 | 330 |
| 331 // vec2 coord = coord2D; | 331 // vec2 coord = coord2D; |
| 332 fsBuilder->codeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); | 332 fragBuilder->codeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); |
| 333 // coord.x -= radius * pixelSize; | 333 // coord.x -= radius * pixelSize; |
| 334 fsBuilder->codeAppendf("\t\tcoord.%s -= %d.0 * %s; \n", dir, fRadius, pixelS
izeInc); | 334 fragBuilder->codeAppendf("\t\tcoord.%s -= %d.0 * %s; \n", dir, fRadius, pixe
lSizeInc); |
| 335 if (fUseRange) { | 335 if (fUseRange) { |
| 336 // highBound = min(highBound, coord.x + (width-1) * pixelSize); | 336 // highBound = min(highBound, coord.x + (width-1) * pixelSize); |
| 337 fsBuilder->codeAppendf("\t\tfloat highBound = min(%s.y, coord.%s + %f *
%s);", | 337 fragBuilder->codeAppendf("\t\tfloat highBound = min(%s.y, coord.%s + %f
* %s);", |
| 338 range, dir, float(width() - 1), pixelSizeInc); | 338 range, dir, float(width() - 1), pixelSizeInc); |
| 339 // coord.x = max(lowBound, coord.x); | 339 // coord.x = max(lowBound, coord.x); |
| 340 fsBuilder->codeAppendf("\t\tcoord.%s = max(%s.x, coord.%s);", dir, range
, dir); | 340 fragBuilder->codeAppendf("\t\tcoord.%s = max(%s.x, coord.%s);", dir, ran
ge, dir); |
| 341 } | 341 } |
| 342 fsBuilder->codeAppendf("\t\tfor (int i = 0; i < %d; i++) {\n", width()); | 342 fragBuilder->codeAppendf("\t\tfor (int i = 0; i < %d; i++) {\n", width()); |
| 343 fsBuilder->codeAppendf("\t\t\t%s = %s(%s, ", args.fOutputColor, func, args.f
OutputColor); | 343 fragBuilder->codeAppendf("\t\t\t%s = %s(%s, ", args.fOutputColor, func, args
.fOutputColor); |
| 344 fsBuilder->appendTextureLookup(args.fSamplers[0], "coord"); | 344 fragBuilder->appendTextureLookup(args.fSamplers[0], "coord"); |
| 345 fsBuilder->codeAppend(");\n"); | 345 fragBuilder->codeAppend(");\n"); |
| 346 // coord.x += pixelSize; | 346 // coord.x += pixelSize; |
| 347 fsBuilder->codeAppendf("\t\t\tcoord.%s += %s;\n", dir, pixelSizeInc); | 347 fragBuilder->codeAppendf("\t\t\tcoord.%s += %s;\n", dir, pixelSizeInc); |
| 348 if (fUseRange) { | 348 if (fUseRange) { |
| 349 // coord.x = min(highBound, coord.x); | 349 // coord.x = min(highBound, coord.x); |
| 350 fsBuilder->codeAppendf("\t\t\tcoord.%s = min(highBound, coord.%s);", dir
, dir); | 350 fragBuilder->codeAppendf("\t\t\tcoord.%s = min(highBound, coord.%s);", d
ir, dir); |
| 351 } | 351 } |
| 352 fsBuilder->codeAppend("\t\t}\n"); | 352 fragBuilder->codeAppend("\t\t}\n"); |
| 353 SkString modulate; | 353 SkString modulate; |
| 354 GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor); | 354 GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor); |
| 355 fsBuilder->codeAppend(modulate.c_str()); | 355 fragBuilder->codeAppend(modulate.c_str()); |
| 356 } | 356 } |
| 357 | 357 |
| 358 void GrGLMorphologyEffect::GenKey(const GrProcessor& proc, | 358 void GrGLMorphologyEffect::GenKey(const GrProcessor& proc, |
| 359 const GrGLSLCaps&, GrProcessorKeyBuilder* b) { | 359 const GrGLSLCaps&, GrProcessorKeyBuilder* b) { |
| 360 const GrMorphologyEffect& m = proc.cast<GrMorphologyEffect>(); | 360 const GrMorphologyEffect& m = proc.cast<GrMorphologyEffect>(); |
| 361 uint32_t key = static_cast<uint32_t>(m.radius()); | 361 uint32_t key = static_cast<uint32_t>(m.radius()); |
| 362 key |= (m.type() << 8); | 362 key |= (m.type() << 8); |
| 363 key |= (m.direction() << 9); | 363 key |= (m.direction() << 9); |
| 364 if (m.useRange()) key |= 1 << 10; | 364 if (m.useRange()) key |= 1 << 10; |
| 365 b->add32(key); | 365 b->add32(key); |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 SkBitmap* result, SkIPoint* offset) con
st { | 671 SkBitmap* result, SkIPoint* offset) con
st { |
| 672 return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset); | 672 return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset); |
| 673 } | 673 } |
| 674 | 674 |
| 675 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
Context& ctx, | 675 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
Context& ctx, |
| 676 SkBitmap* result, SkIPoint* offset) cons
t { | 676 SkBitmap* result, SkIPoint* offset) cons
t { |
| 677 return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset); | 677 return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset); |
| 678 } | 678 } |
| 679 | 679 |
| 680 #endif | 680 #endif |
| OLD | NEW |