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 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
656 GrTextureAccess fBlurProfileAccess; | 656 GrTextureAccess fBlurProfileAccess; |
657 | 657 |
658 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 658 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
659 | 659 |
660 typedef GrFragmentProcessor INHERITED; | 660 typedef GrFragmentProcessor INHERITED; |
661 }; | 661 }; |
662 | 662 |
663 class GrGLRectBlurEffect : public GrGLFragmentProcessor { | 663 class GrGLRectBlurEffect : public GrGLFragmentProcessor { |
664 public: | 664 public: |
665 GrGLRectBlurEffect(const GrProcessor&) {} | 665 GrGLRectBlurEffect(const GrProcessor&) {} |
666 virtual void emitCode(GrGLFPBuilder*, | 666 virtual void emitCode(EmitArgs&) override; |
667 const GrFragmentProcessor&, | |
668 const char* outputColor, | |
669 const char* inputColor, | |
670 const TransformedCoordsArray&, | |
671 const TextureSamplerArray&) override; | |
672 | 667 |
673 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 668 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |
674 | 669 |
675 private: | 670 private: |
676 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 671 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
677 | 672 |
678 UniformHandle fProxyRectUniform; | 673 UniformHandle fProxyRectUniform; |
679 UniformHandle fProfileSizeUniform; | 674 UniformHandle fProfileSizeUniform; |
680 | 675 |
681 typedef GrGLFragmentProcessor INHERITED; | 676 typedef GrGLFragmentProcessor INHERITED; |
682 }; | 677 }; |
683 | 678 |
684 void OutputRectBlurProfileLookup(GrGLFragmentBuilder* fsBuilder, | 679 void OutputRectBlurProfileLookup(GrGLFragmentBuilder* fsBuilder, |
685 const GrGLShaderBuilder::TextureSampler& sample r, | 680 const GrGLShaderBuilder::TextureSampler& sample r, |
686 const char *output, | 681 const char *output, |
687 const char *profileSize, const char *loc, | 682 const char *profileSize, const char *loc, |
688 const char *blurred_width, | 683 const char *blurred_width, |
689 const char *sharp_width) { | 684 const char *sharp_width) { |
690 fsBuilder->codeAppendf("\tfloat %s;\n", output); | 685 fsBuilder->codeAppendf("\tfloat %s;\n", output); |
691 fsBuilder->codeAppendf("\t\t{\n"); | 686 fsBuilder->codeAppendf("\t\t{\n"); |
692 fsBuilder->codeAppendf("\t\t\tfloat coord = (0.5 * (abs(2.0*%s - %s) - %s))/ %s;\n", | 687 fsBuilder->codeAppendf("\t\t\tfloat coord = (0.5 * (abs(2.0*%s - %s) - %s))/ %s;\n", |
693 loc, blurred_width, sharp_width, profileSize); | 688 loc, blurred_width, sharp_width, profileSize); |
694 fsBuilder->codeAppendf("\t\t\t%s = ", output); | 689 fsBuilder->codeAppendf("\t\t\t%s = ", output); |
695 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); | 690 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); |
696 fsBuilder->codeAppend(".a;\n"); | 691 fsBuilder->codeAppend(".a;\n"); |
697 fsBuilder->codeAppendf("\t\t}\n"); | 692 fsBuilder->codeAppendf("\t\t}\n"); |
698 } | 693 } |
699 | 694 |
700 void GrGLRectBlurEffect::emitCode(GrGLFPBuilder* builder, | 695 void GrGLRectBlurEffect::emitCode(EmitArgs& args) { |
701 const GrFragmentProcessor&, | |
702 const char* outputColor, | |
703 const char* inputColor, | |
704 const TransformedCoordsArray& coords, | |
705 const TextureSamplerArray& samplers) { | |
706 | 696 |
707 const char *rectName; | 697 const char *rectName; |
708 const char *profileSizeName; | 698 const char *profileSizeName; |
709 | 699 |
710 fProxyRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity, | 700 fProxyRectUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_ Visibility, |
711 kVec4f_GrSLType, | 701 kVec4f_GrSLType, |
712 kDefault_GrSLPrecision, | 702 kDefault_GrSLPrecision, |
713 "proxyRect", | 703 "proxyRect", |
714 &rectName); | 704 &rectName); |
715 fProfileSizeUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visi bility, | 705 fProfileSizeUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragmen t_Visibility, |
716 kFloat_GrSLType, | 706 kFloat_GrSLType, |
717 kDefault_GrSLPrecision, | 707 kDefault_GrSLPrecision, |
718 "profileSize", | 708 "profileSize", |
719 &profileSizeName); | 709 &profileSizeName); |
720 | 710 |
721 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 711 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); |
722 const char *fragmentPos = fsBuilder->fragmentPosition(); | 712 const char *fragmentPos = fsBuilder->fragmentPosition(); |
723 | 713 |
724 if (inputColor) { | 714 if (args.fInputColor) { |
725 fsBuilder->codeAppendf("\tvec4 src=%s;\n", inputColor); | 715 fsBuilder->codeAppendf("\tvec4 src=%s;\n", args.fInputColor); |
726 } else { | 716 } else { |
727 fsBuilder->codeAppendf("\tvec4 src=vec4(1)\n;"); | 717 fsBuilder->codeAppendf("\tvec4 src=vec4(1)\n;"); |
728 } | 718 } |
729 | 719 |
730 fsBuilder->codeAppendf("\tvec2 translatedPos = %s.xy - %s.xy;\n", fragmentPo s, rectName ); | 720 fsBuilder->codeAppendf("\tvec2 translatedPos = %s.xy - %s.xy;\n", fragmentPo s, rectName ); |
731 fsBuilder->codeAppendf("\tfloat width = %s.z - %s.x;\n", rectName, rectName) ; | 721 fsBuilder->codeAppendf("\tfloat width = %s.z - %s.x;\n", rectName, rectName) ; |
732 fsBuilder->codeAppendf("\tfloat height = %s.w - %s.y;\n", rectName, rectName ); | 722 fsBuilder->codeAppendf("\tfloat height = %s.w - %s.y;\n", rectName, rectName ); |
733 | 723 |
734 fsBuilder->codeAppendf("\tvec2 smallDims = vec2(width - %s, height-%s);\n", profileSizeName, profileSizeName); | 724 fsBuilder->codeAppendf("\tvec2 smallDims = vec2(width - %s, height-%s);\n", profileSizeName, profileSizeName); |
735 fsBuilder->codeAppendf("\tfloat center = 2.0 * floor(%s/2.0 + .25) - 1.0;\n" , profileSizeName); | 725 fsBuilder->codeAppendf("\tfloat center = 2.0 * floor(%s/2.0 + .25) - 1.0;\n" , profileSizeName); |
736 fsBuilder->codeAppendf("\tvec2 wh = smallDims - vec2(center,center);\n"); | 726 fsBuilder->codeAppendf("\tvec2 wh = smallDims - vec2(center,center);\n"); |
737 | 727 |
738 OutputRectBlurProfileLookup(fsBuilder, samplers[0], "horiz_lookup", profileS izeName, "translatedPos.x", "width", "wh.x"); | 728 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "horiz_lookup", pr ofileSizeName, "translatedPos.x", "width", "wh.x"); |
joshualitt
2015/07/22 19:34:04
line wrap @100
| |
739 OutputRectBlurProfileLookup(fsBuilder, samplers[0], "vert_lookup", profileSi zeName, "translatedPos.y", "height", "wh.y"); | 729 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "vert_lookup", pro fileSizeName, "translatedPos.y", "height", "wh.y"); |
joshualitt
2015/07/22 19:34:04
line wrap @100
| |
740 | 730 |
741 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n"); | 731 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n"); |
742 fsBuilder->codeAppendf("\t%s = src * final;\n", outputColor ); | 732 fsBuilder->codeAppendf("\t%s = src * final;\n", args.fOutputColor ); |
743 } | 733 } |
744 | 734 |
745 void GrGLRectBlurEffect::setData(const GrGLProgramDataManager& pdman, | 735 void GrGLRectBlurEffect::setData(const GrGLProgramDataManager& pdman, |
746 const GrProcessor& proc) { | 736 const GrProcessor& proc) { |
747 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); | 737 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); |
748 SkRect rect = rbe.getRect(); | 738 SkRect rect = rbe.getRect(); |
749 | 739 |
750 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom); | 740 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom); |
751 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); | 741 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); |
752 } | 742 } |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1015 rrect.setRectXY(SkRect::MakeWH(w, h), r, r); | 1005 rrect.setRectXY(SkRect::MakeWH(w, h), r, r); |
1016 return GrRRectBlurEffect::Create(d->fContext, sigma, rrect); | 1006 return GrRRectBlurEffect::Create(d->fContext, sigma, rrect); |
1017 } | 1007 } |
1018 | 1008 |
1019 ////////////////////////////////////////////////////////////////////////////// | 1009 ////////////////////////////////////////////////////////////////////////////// |
1020 | 1010 |
1021 class GrGLRRectBlurEffect : public GrGLFragmentProcessor { | 1011 class GrGLRRectBlurEffect : public GrGLFragmentProcessor { |
1022 public: | 1012 public: |
1023 GrGLRRectBlurEffect(const GrProcessor&) {} | 1013 GrGLRRectBlurEffect(const GrProcessor&) {} |
1024 | 1014 |
1025 virtual void emitCode(GrGLFPBuilder*, | 1015 virtual void emitCode(EmitArgs&) override; |
1026 const GrFragmentProcessor&, | |
1027 const char* outputColor, | |
1028 const char* inputColor, | |
1029 const TransformedCoordsArray&, | |
1030 const TextureSamplerArray&) override; | |
1031 | 1016 |
1032 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1017 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |
1033 | 1018 |
1034 private: | 1019 private: |
1035 GrGLProgramDataManager::UniformHandle fProxyRectUniform; | 1020 GrGLProgramDataManager::UniformHandle fProxyRectUniform; |
1036 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; | 1021 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; |
1037 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; | 1022 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; |
1038 typedef GrGLFragmentProcessor INHERITED; | 1023 typedef GrGLFragmentProcessor INHERITED; |
1039 }; | 1024 }; |
1040 | 1025 |
1041 void GrGLRRectBlurEffect::emitCode(GrGLFPBuilder* builder, | 1026 void GrGLRRectBlurEffect::emitCode(EmitArgs& args) { |
1042 const GrFragmentProcessor&, | |
1043 const char* outputColor, | |
1044 const char* inputColor, | |
1045 const TransformedCoordsArray&, | |
1046 const TextureSamplerArray& samplers) { | |
1047 const char *rectName; | 1027 const char *rectName; |
1048 const char *cornerRadiusName; | 1028 const char *cornerRadiusName; |
1049 const char *blurRadiusName; | 1029 const char *blurRadiusName; |
1050 | 1030 |
1051 // The proxy rect has left, top, right, and bottom edges correspond to | 1031 // The proxy rect has left, top, right, and bottom edges correspond to |
1052 // components x, y, z, and w, respectively. | 1032 // components x, y, z, and w, respectively. |
1053 | 1033 |
1054 fProxyRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity, | 1034 fProxyRectUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_ Visibility, |
1055 kVec4f_GrSLType, | 1035 kVec4f_GrSLType, |
1056 kDefault_GrSLPrecision, | 1036 kDefault_GrSLPrecision, |
1057 "proxyRect", | 1037 "proxyRect", |
1058 &rectName); | 1038 &rectName); |
1059 fCornerRadiusUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Vis ibility, | 1039 fCornerRadiusUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragme nt_Visibility, |
1060 kFloat_GrSLType, | 1040 kFloat_GrSLType, |
1061 kDefault_GrSLPrecision, | 1041 kDefault_GrSLPrecision, |
1062 "cornerRadius", | 1042 "cornerRadius", |
1063 &cornerRadiusName); | 1043 &cornerRadiusName); |
1064 fBlurRadiusUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visib ility, | 1044 fBlurRadiusUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment _Visibility, |
1065 kFloat_GrSLType, | 1045 kFloat_GrSLType, |
1066 kDefault_GrSLPrecision, | 1046 kDefault_GrSLPrecision, |
1067 "blurRadius", | 1047 "blurRadius", |
1068 &blurRadiusName); | 1048 &blurRadiusName); |
1069 | 1049 |
1070 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 1050 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); |
1071 const char* fragmentPos = fsBuilder->fragmentPosition(); | 1051 const char* fragmentPos = fsBuilder->fragmentPosition(); |
1072 | 1052 |
1073 // warp the fragment position to the appropriate part of the 9patch blur tex ture | 1053 // warp the fragment position to the appropriate part of the 9patch blur tex ture |
1074 | 1054 |
1075 fsBuilder->codeAppendf("\t\tvec2 rectCenter = (%s.xy + %s.zw)/2.0;\n", rectN ame, rectName); | 1055 fsBuilder->codeAppendf("\t\tvec2 rectCenter = (%s.xy + %s.zw)/2.0;\n", rectN ame, rectName); |
1076 fsBuilder->codeAppendf("\t\tvec2 translatedFragPos = %s.xy - %s.xy;\n", frag mentPos, rectName); | 1056 fsBuilder->codeAppendf("\t\tvec2 translatedFragPos = %s.xy - %s.xy;\n", frag mentPos, rectName); |
1077 fsBuilder->codeAppendf("\t\tfloat threshold = %s + 2.0*%s;\n", cornerRadiusN ame, blurRadiusName ); | 1057 fsBuilder->codeAppendf("\t\tfloat threshold = %s + 2.0*%s;\n", cornerRadiusN ame, blurRadiusName ); |
1078 fsBuilder->codeAppendf("\t\tvec2 middle = %s.zw - %s.xy - 2.0*threshold;\n", rectName, rectName ); | 1058 fsBuilder->codeAppendf("\t\tvec2 middle = %s.zw - %s.xy - 2.0*threshold;\n", rectName, rectName ); |
1079 | 1059 |
1080 fsBuilder->codeAppendf("\t\tif (translatedFragPos.x >= threshold && translat edFragPos.x < (middle.x+threshold)) {\n" ); | 1060 fsBuilder->codeAppendf("\t\tif (translatedFragPos.x >= threshold && translat edFragPos.x < (middle.x+threshold)) {\n" ); |
1081 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x = threshold;\n"); | 1061 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x = threshold;\n"); |
1082 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.x >= (middle.x + th reshold)) {\n"); | 1062 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.x >= (middle.x + th reshold)) {\n"); |
1083 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x -= middle.x - 1.0;\n"); | 1063 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x -= middle.x - 1.0;\n"); |
1084 fsBuilder->codeAppendf("\t\t}\n"); | 1064 fsBuilder->codeAppendf("\t\t}\n"); |
1085 | 1065 |
1086 fsBuilder->codeAppendf("\t\tif (translatedFragPos.y > threshold && translate dFragPos.y < (middle.y+threshold)) {\n" ); | 1066 fsBuilder->codeAppendf("\t\tif (translatedFragPos.y > threshold && translate dFragPos.y < (middle.y+threshold)) {\n" ); |
1087 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y = threshold;\n"); | 1067 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y = threshold;\n"); |
1088 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.y >= (middle.y + th reshold)) {\n"); | 1068 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.y >= (middle.y + th reshold)) {\n"); |
1089 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y -= middle.y - 1.0;\n"); | 1069 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y -= middle.y - 1.0;\n"); |
1090 fsBuilder->codeAppendf("\t\t}\n"); | 1070 fsBuilder->codeAppendf("\t\t}\n"); |
1091 | 1071 |
1092 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n"); | 1072 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n"); |
1093 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n "); | 1073 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n "); |
1094 | 1074 |
1095 fsBuilder->codeAppendf("\t%s = ", outputColor); | 1075 fsBuilder->codeAppendf("\t%s = ", args.fOutputColor); |
1096 fsBuilder->appendTextureLookupAndModulate(inputColor, samplers[0], "texCoord "); | 1076 fsBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0 ], "texCoord"); |
1097 fsBuilder->codeAppend(";\n"); | 1077 fsBuilder->codeAppend(";\n"); |
1098 } | 1078 } |
1099 | 1079 |
1100 void GrGLRRectBlurEffect::setData(const GrGLProgramDataManager& pdman, | 1080 void GrGLRRectBlurEffect::setData(const GrGLProgramDataManager& pdman, |
1101 const GrProcessor& proc) { | 1081 const GrProcessor& proc) { |
1102 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); | 1082 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); |
1103 SkRRect rrect = brre.getRRect(); | 1083 SkRRect rrect = brre.getRRect(); |
1104 | 1084 |
1105 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); | 1085 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); |
1106 pdman.set1f(fBlurRadiusUniform, blurRadius); | 1086 pdman.set1f(fBlurRadiusUniform, blurRadius); |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1286 } else { | 1266 } else { |
1287 str->append("None"); | 1267 str->append("None"); |
1288 } | 1268 } |
1289 str->append("))"); | 1269 str->append("))"); |
1290 } | 1270 } |
1291 #endif | 1271 #endif |
1292 | 1272 |
1293 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1273 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
1294 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1274 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
1295 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1275 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |