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 |