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 |