Chromium Code Reviews| 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 |