| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "SkBlurMaskFilter.h" | 9 #include "SkBlurMaskFilter.h" |
| 10 #include "SkBlurMask.h" | 10 #include "SkBlurMask.h" |
| (...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 private: | 690 private: |
| 691 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; | 691 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
| 692 | 692 |
| 693 UniformHandle fProxyRectUniform; | 693 UniformHandle fProxyRectUniform; |
| 694 UniformHandle fProfileSizeUniform; | 694 UniformHandle fProfileSizeUniform; |
| 695 GrSLPrecision fPrecision; | 695 GrSLPrecision fPrecision; |
| 696 | 696 |
| 697 typedef GrGLSLFragmentProcessor INHERITED; | 697 typedef GrGLSLFragmentProcessor INHERITED; |
| 698 }; | 698 }; |
| 699 | 699 |
| 700 void OutputRectBlurProfileLookup(GrGLSLFragmentBuilder* fsBuilder, | 700 void OutputRectBlurProfileLookup(GrGLSLFragmentBuilder* fragBuilder, |
| 701 const GrGLSLTextureSampler& sampler, | 701 const GrGLSLTextureSampler& sampler, |
| 702 const char *output, | 702 const char *output, |
| 703 const char *profileSize, const char *loc, | 703 const char *profileSize, const char *loc, |
| 704 const char *blurred_width, | 704 const char *blurred_width, |
| 705 const char *sharp_width) { | 705 const char *sharp_width) { |
| 706 fsBuilder->codeAppendf("float %s;", output); | 706 fragBuilder->codeAppendf("float %s;", output); |
| 707 fsBuilder->codeAppendf("{"); | 707 fragBuilder->codeAppendf("{"); |
| 708 fsBuilder->codeAppendf("float coord = ((abs(%s - 0.5 * %s) - 0.5 * %s)) / %s
;", | 708 fragBuilder->codeAppendf("float coord = ((abs(%s - 0.5 * %s) - 0.5 * %s)) /
%s;", |
| 709 loc, blurred_width, sharp_width, profileSize); | 709 loc, blurred_width, sharp_width, profileSize); |
| 710 fsBuilder->codeAppendf("%s = ", output); | 710 fragBuilder->codeAppendf("%s = ", output); |
| 711 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); | 711 fragBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); |
| 712 fsBuilder->codeAppend(".a;"); | 712 fragBuilder->codeAppend(".a;"); |
| 713 fsBuilder->codeAppendf("}"); | 713 fragBuilder->codeAppendf("}"); |
| 714 } | 714 } |
| 715 | 715 |
| 716 | 716 |
| 717 void GrGLRectBlurEffect::GenKey(GrSLPrecision precision, GrProcessorKeyBuilder*
b) { | 717 void GrGLRectBlurEffect::GenKey(GrSLPrecision precision, GrProcessorKeyBuilder*
b) { |
| 718 b->add32(precision); | 718 b->add32(precision); |
| 719 } | 719 } |
| 720 | 720 |
| 721 | 721 |
| 722 void GrGLRectBlurEffect::emitCode(EmitArgs& args) { | 722 void GrGLRectBlurEffect::emitCode(EmitArgs& args) { |
| 723 | 723 |
| 724 const char *rectName; | 724 const char *rectName; |
| 725 const char *profileSizeName; | 725 const char *profileSizeName; |
| 726 | 726 |
| 727 const char* precisionString = GrGLSLShaderVar::PrecisionString(args.fBuilder
->glslCaps(), | 727 const char* precisionString = GrGLSLShaderVar::PrecisionString(args.fBuilder
->glslCaps(), |
| 728 fPrecision); | 728 fPrecision); |
| 729 fProxyRectUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragmen
t_Visibility, | 729 fProxyRectUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragmen
t_Visibility, |
| 730 kVec4f_GrSLType, | 730 kVec4f_GrSLType, |
| 731 fPrecision, | 731 fPrecision, |
| 732 "proxyRect", | 732 "proxyRect", |
| 733 &rectName); | 733 &rectName); |
| 734 fProfileSizeUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragm
ent_Visibility, | 734 fProfileSizeUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragm
ent_Visibility, |
| 735 kFloat_GrSLType, | 735 kFloat_GrSLType, |
| 736 kDefault_GrSLPrecision, | 736 kDefault_GrSLPrecision, |
| 737 "profileSize", | 737 "profileSize", |
| 738 &profileSizeName); | 738 &profileSizeName); |
| 739 | 739 |
| 740 GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder()
; | 740 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 741 const char *fragmentPos = fsBuilder->fragmentPosition(); | 741 const char *fragmentPos = fragBuilder->fragmentPosition(); |
| 742 | 742 |
| 743 if (args.fInputColor) { | 743 if (args.fInputColor) { |
| 744 fsBuilder->codeAppendf("vec4 src=%s;", args.fInputColor); | 744 fragBuilder->codeAppendf("vec4 src=%s;", args.fInputColor); |
| 745 } else { | 745 } else { |
| 746 fsBuilder->codeAppendf("vec4 src=vec4(1);"); | 746 fragBuilder->codeAppendf("vec4 src=vec4(1);"); |
| 747 } | 747 } |
| 748 | 748 |
| 749 fsBuilder->codeAppendf("%s vec2 translatedPos = %s.xy - %s.xy;", precisionSt
ring, fragmentPos, | 749 fragBuilder->codeAppendf("%s vec2 translatedPos = %s.xy - %s.xy;", precision
String, fragmentPos, |
| 750 rectName); | 750 rectName); |
| 751 fsBuilder->codeAppendf("%s float width = %s.z - %s.x;", precisionString, rec
tName, rectName); | 751 fragBuilder->codeAppendf("%s float width = %s.z - %s.x;", precisionString, r
ectName, rectName); |
| 752 fsBuilder->codeAppendf("%s float height = %s.w - %s.y;", precisionString, re
ctName, rectName); | 752 fragBuilder->codeAppendf("%s float height = %s.w - %s.y;", precisionString,
rectName, rectName); |
| 753 | 753 |
| 754 fsBuilder->codeAppendf("%s vec2 smallDims = vec2(width - %s, height - %s);",
precisionString, | 754 fragBuilder->codeAppendf("%s vec2 smallDims = vec2(width - %s, height - %s);
", precisionString, |
| 755 profileSizeName, profileSizeName); | 755 profileSizeName, profileSizeName); |
| 756 fsBuilder->codeAppendf("%s float center = 2.0 * floor(%s/2.0 + .25) - 1.0;",
precisionString, | 756 fragBuilder->codeAppendf("%s float center = 2.0 * floor(%s/2.0 + .25) - 1.0;
", precisionString, |
| 757 profileSizeName); | 757 profileSizeName); |
| 758 fsBuilder->codeAppendf("%s vec2 wh = smallDims - vec2(center,center);", prec
isionString); | 758 fragBuilder->codeAppendf("%s vec2 wh = smallDims - vec2(center,center);", pr
ecisionString); |
| 759 | 759 |
| 760 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "horiz_lookup", pr
ofileSizeName, | 760 OutputRectBlurProfileLookup(fragBuilder, args.fSamplers[0], "horiz_lookup",
profileSizeName, |
| 761 "translatedPos.x", "width", "wh.x"); | 761 "translatedPos.x", "width", "wh.x"); |
| 762 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "vert_lookup", pro
fileSizeName, | 762 OutputRectBlurProfileLookup(fragBuilder, args.fSamplers[0], "vert_lookup", p
rofileSizeName, |
| 763 "translatedPos.y", "height", "wh.y"); | 763 "translatedPos.y", "height", "wh.y"); |
| 764 | 764 |
| 765 fsBuilder->codeAppendf("float final = horiz_lookup * vert_lookup;"); | 765 fragBuilder->codeAppendf("float final = horiz_lookup * vert_lookup;"); |
| 766 fsBuilder->codeAppendf("%s = src * final;", args.fOutputColor); | 766 fragBuilder->codeAppendf("%s = src * final;", args.fOutputColor); |
| 767 } | 767 } |
| 768 | 768 |
| 769 void GrGLRectBlurEffect::onSetData(const GrGLSLProgramDataManager& pdman, | 769 void GrGLRectBlurEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
| 770 const GrProcessor& proc) { | 770 const GrProcessor& proc) { |
| 771 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); | 771 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); |
| 772 SkRect rect = rbe.getRect(); | 772 SkRect rect = rbe.getRect(); |
| 773 | 773 |
| 774 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot
tom); | 774 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot
tom); |
| 775 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); | 775 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); |
| 776 } | 776 } |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1076 kFloat_GrSLType, | 1076 kFloat_GrSLType, |
| 1077 kDefault_GrSLPrecision, | 1077 kDefault_GrSLPrecision, |
| 1078 "cornerRadius", | 1078 "cornerRadius", |
| 1079 &cornerRadiusName); | 1079 &cornerRadiusName); |
| 1080 fBlurRadiusUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragme
nt_Visibility, | 1080 fBlurRadiusUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragme
nt_Visibility, |
| 1081 kFloat_GrSLType, | 1081 kFloat_GrSLType, |
| 1082 kDefault_GrSLPrecision, | 1082 kDefault_GrSLPrecision, |
| 1083 "blurRadius", | 1083 "blurRadius", |
| 1084 &blurRadiusName); | 1084 &blurRadiusName); |
| 1085 | 1085 |
| 1086 GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder()
; | 1086 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 1087 const char* fragmentPos = fsBuilder->fragmentPosition(); | 1087 const char* fragmentPos = fragBuilder->fragmentPosition(); |
| 1088 | 1088 |
| 1089 // warp the fragment position to the appropriate part of the 9patch blur tex
ture | 1089 // warp the fragment position to the appropriate part of the 9patch blur tex
ture |
| 1090 | 1090 |
| 1091 fsBuilder->codeAppendf("vec2 rectCenter = (%s.xy + %s.zw)/2.0;", rectName, r
ectName); | 1091 fragBuilder->codeAppendf("vec2 rectCenter = (%s.xy + %s.zw)/2.0;", rectName,
rectName); |
| 1092 fsBuilder->codeAppendf("vec2 translatedFragPos = %s.xy - %s.xy;", fragmentPo
s, rectName); | 1092 fragBuilder->codeAppendf("vec2 translatedFragPos = %s.xy - %s.xy;", fragment
Pos, rectName); |
| 1093 fsBuilder->codeAppendf("float threshold = %s + 2.0*%s;", cornerRadiusName, b
lurRadiusName); | 1093 fragBuilder->codeAppendf("float threshold = %s + 2.0*%s;", cornerRadiusName,
blurRadiusName); |
| 1094 fsBuilder->codeAppendf("vec2 middle = %s.zw - %s.xy - 2.0*threshold;", rectN
ame, rectName); | 1094 fragBuilder->codeAppendf("vec2 middle = %s.zw - %s.xy - 2.0*threshold;", rec
tName, rectName); |
| 1095 | 1095 |
| 1096 fsBuilder->codeAppendf("if (translatedFragPos.x >= threshold && translatedFr
agPos.x < (middle.x+threshold)) {"); | 1096 fragBuilder->codeAppendf( |
| 1097 fsBuilder->codeAppendf("translatedFragPos.x = threshold;\n"); | 1097 "if (translatedFragPos.x >= threshold && translatedFragPos.x < (middl
e.x+threshold)) {"); |
| 1098 fsBuilder->codeAppendf("} else if (translatedFragPos.x >= (middle.x + thresh
old)) {"); | 1098 fragBuilder->codeAppendf("translatedFragPos.x = threshold;\n"); |
| 1099 fsBuilder->codeAppendf("translatedFragPos.x -= middle.x - 1.0;"); | 1099 fragBuilder->codeAppendf("} else if (translatedFragPos.x >= (middle.x + thre
shold)) {"); |
| 1100 fsBuilder->codeAppendf("}"); | 1100 fragBuilder->codeAppendf("translatedFragPos.x -= middle.x - 1.0;"); |
| 1101 fragBuilder->codeAppendf("}"); |
| 1101 | 1102 |
| 1102 fsBuilder->codeAppendf("if (translatedFragPos.y > threshold && translatedFra
gPos.y < (middle.y+threshold)) {"); | 1103 fragBuilder->codeAppendf( |
| 1103 fsBuilder->codeAppendf("translatedFragPos.y = threshold;"); | 1104 "if (translatedFragPos.y > threshold && translatedFragPos.y < (middl
e.y+threshold)) {"); |
| 1104 fsBuilder->codeAppendf("} else if (translatedFragPos.y >= (middle.y + thresh
old)) {"); | 1105 fragBuilder->codeAppendf("translatedFragPos.y = threshold;"); |
| 1105 fsBuilder->codeAppendf("translatedFragPos.y -= middle.y - 1.0;"); | 1106 fragBuilder->codeAppendf("} else if (translatedFragPos.y >= (middle.y + thre
shold)) {"); |
| 1106 fsBuilder->codeAppendf("}"); | 1107 fragBuilder->codeAppendf("translatedFragPos.y -= middle.y - 1.0;"); |
| 1108 fragBuilder->codeAppendf("}"); |
| 1107 | 1109 |
| 1108 fsBuilder->codeAppendf("vec2 proxyDims = vec2(2.0*threshold+1.0);"); | 1110 fragBuilder->codeAppendf("vec2 proxyDims = vec2(2.0*threshold+1.0);"); |
| 1109 fsBuilder->codeAppendf("vec2 texCoord = translatedFragPos / proxyDims;"); | 1111 fragBuilder->codeAppendf("vec2 texCoord = translatedFragPos / proxyDims;"); |
| 1110 | 1112 |
| 1111 fsBuilder->codeAppendf("%s = ", args.fOutputColor); | 1113 fragBuilder->codeAppendf("%s = ", args.fOutputColor); |
| 1112 fsBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0
], "texCoord"); | 1114 fragBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers
[0], "texCoord"); |
| 1113 fsBuilder->codeAppend(";"); | 1115 fragBuilder->codeAppend(";"); |
| 1114 } | 1116 } |
| 1115 | 1117 |
| 1116 void GrGLRRectBlurEffect::onSetData(const GrGLSLProgramDataManager& pdman, | 1118 void GrGLRRectBlurEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
| 1117 const GrProcessor& proc) { | 1119 const GrProcessor& proc) { |
| 1118 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); | 1120 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); |
| 1119 SkRRect rrect = brre.getRRect(); | 1121 SkRRect rrect = brre.getRRect(); |
| 1120 | 1122 |
| 1121 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); | 1123 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); |
| 1122 pdman.set1f(fBlurRadiusUniform, blurRadius); | 1124 pdman.set1f(fBlurRadiusUniform, blurRadius); |
| 1123 | 1125 |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1302 } else { | 1304 } else { |
| 1303 str->append("None"); | 1305 str->append("None"); |
| 1304 } | 1306 } |
| 1305 str->append("))"); | 1307 str->append("))"); |
| 1306 } | 1308 } |
| 1307 #endif | 1309 #endif |
| 1308 | 1310 |
| 1309 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1311 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
| 1310 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1312 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
| 1311 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1313 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |