| 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 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 604 #if SK_SUPPORT_GPU | 604 #if SK_SUPPORT_GPU |
| 605 | 605 |
| 606 class GrGLRectBlurEffect; | 606 class GrGLRectBlurEffect; |
| 607 | 607 |
| 608 class GrRectBlurEffect : public GrFragmentProcessor { | 608 class GrRectBlurEffect : public GrFragmentProcessor { |
| 609 public: | 609 public: |
| 610 virtual ~GrRectBlurEffect(); | 610 virtual ~GrRectBlurEffect(); |
| 611 | 611 |
| 612 const char* name() const override { return "RectBlur"; } | 612 const char* name() const override { return "RectBlur"; } |
| 613 | 613 |
| 614 GrGLFragmentProcessor* createGLInstance() const override; | |
| 615 | |
| 616 /** | 614 /** |
| 617 * Create a simple filter effect with custom bicubic coefficients. | 615 * Create a simple filter effect with custom bicubic coefficients. |
| 618 */ | 616 */ |
| 619 static GrFragmentProcessor* Create(GrTextureProvider *textureProvider, const
SkRect& rect, | 617 static GrFragmentProcessor* Create(GrTextureProvider *textureProvider, const
SkRect& rect, |
| 620 float sigma) { | 618 float sigma) { |
| 621 GrTexture *blurProfileTexture = NULL; | 619 GrTexture *blurProfileTexture = NULL; |
| 622 int doubleProfileSize = SkScalarCeilToInt(12*sigma); | 620 int doubleProfileSize = SkScalarCeilToInt(12*sigma); |
| 623 | 621 |
| 624 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.heigh
t()) { | 622 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.heigh
t()) { |
| 625 // if the blur sigma is too large so the gaussian overlaps the whole | 623 // if the blur sigma is too large so the gaussian overlaps the whole |
| 626 // rect in either direction, fall back to CPU path for now. | 624 // rect in either direction, fall back to CPU path for now. |
| 627 | 625 |
| 628 return NULL; | 626 return NULL; |
| 629 } | 627 } |
| 630 | 628 |
| 631 bool createdBlurProfileTexture = CreateBlurProfileTexture( | 629 bool createdBlurProfileTexture = CreateBlurProfileTexture( |
| 632 textureProvider, sigma, &blurProfileTexture); | 630 textureProvider, sigma, &blurProfileTexture); |
| 633 SkAutoTUnref<GrTexture> hunref(blurProfileTexture); | 631 SkAutoTUnref<GrTexture> hunref(blurProfileTexture); |
| 634 if (!createdBlurProfileTexture) { | 632 if (!createdBlurProfileTexture) { |
| 635 return NULL; | 633 return NULL; |
| 636 } | 634 } |
| 637 return SkNEW_ARGS(GrRectBlurEffect, (rect, sigma, blurProfileTexture)); | 635 return SkNEW_ARGS(GrRectBlurEffect, (rect, sigma, blurProfileTexture)); |
| 638 } | 636 } |
| 639 | 637 |
| 640 const SkRect& getRect() const { return fRect; } | 638 const SkRect& getRect() const { return fRect; } |
| 641 float getSigma() const { return fSigma; } | 639 float getSigma() const { return fSigma; } |
| 642 | 640 |
| 643 private: | 641 private: |
| 642 GrGLFragmentProcessor* onCreateGLInstance() const override; |
| 643 |
| 644 GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blur_profile); | 644 GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blur_profile); |
| 645 | 645 |
| 646 virtual void onGetGLProcessorKey(const GrGLSLCaps& caps, | 646 virtual void onGetGLProcessorKey(const GrGLSLCaps& caps, |
| 647 GrProcessorKeyBuilder* b) const override; | 647 GrProcessorKeyBuilder* b) const override; |
| 648 | 648 |
| 649 bool onIsEqual(const GrFragmentProcessor&) const override; | 649 bool onIsEqual(const GrFragmentProcessor&) const override; |
| 650 | 650 |
| 651 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; | 651 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; |
| 652 | 652 |
| 653 static bool CreateBlurProfileTexture(GrTextureProvider*, float sigma, | 653 static bool CreateBlurProfileTexture(GrTextureProvider*, float sigma, |
| 654 GrTexture **blurProfileTexture); | 654 GrTexture **blurProfileTexture); |
| 655 | 655 |
| 656 SkRect fRect; | 656 SkRect fRect; |
| 657 float fSigma; | 657 float fSigma; |
| 658 GrTextureAccess fBlurProfileAccess; | 658 GrTextureAccess fBlurProfileAccess; |
| 659 | 659 |
| 660 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 660 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 661 | 661 |
| 662 typedef GrFragmentProcessor INHERITED; | 662 typedef GrFragmentProcessor INHERITED; |
| 663 }; | 663 }; |
| 664 | 664 |
| 665 class GrGLRectBlurEffect : public GrGLFragmentProcessor { | 665 class GrGLRectBlurEffect : public GrGLFragmentProcessor { |
| 666 public: | 666 public: |
| 667 GrGLRectBlurEffect(const GrProcessor&) {} | 667 GrGLRectBlurEffect(const GrProcessor&) {} |
| 668 virtual void emitCode(EmitArgs&) override; | 668 virtual void emitCode(EmitArgs&) override; |
| 669 | 669 |
| 670 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 670 protected: |
| 671 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; |
| 671 | 672 |
| 672 private: | 673 private: |
| 673 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 674 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
| 674 | 675 |
| 675 UniformHandle fProxyRectUniform; | 676 UniformHandle fProxyRectUniform; |
| 676 UniformHandle fProfileSizeUniform; | 677 UniformHandle fProfileSizeUniform; |
| 677 | 678 |
| 678 typedef GrGLFragmentProcessor INHERITED; | 679 typedef GrGLFragmentProcessor INHERITED; |
| 679 }; | 680 }; |
| 680 | 681 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 729 | 730 |
| 730 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "horiz_lookup", pr
ofileSizeName, | 731 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "horiz_lookup", pr
ofileSizeName, |
| 731 "translatedPos.x", "width", "wh.x"); | 732 "translatedPos.x", "width", "wh.x"); |
| 732 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "vert_lookup", pro
fileSizeName, | 733 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "vert_lookup", pro
fileSizeName, |
| 733 "translatedPos.y", "height", "wh.y"); | 734 "translatedPos.y", "height", "wh.y"); |
| 734 | 735 |
| 735 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n"); | 736 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n"); |
| 736 fsBuilder->codeAppendf("\t%s = src * final;\n", args.fOutputColor ); | 737 fsBuilder->codeAppendf("\t%s = src * final;\n", args.fOutputColor ); |
| 737 } | 738 } |
| 738 | 739 |
| 739 void GrGLRectBlurEffect::setData(const GrGLProgramDataManager& pdman, | 740 void GrGLRectBlurEffect::onSetData(const GrGLProgramDataManager& pdman, |
| 740 const GrProcessor& proc) { | 741 const GrProcessor& proc) { |
| 741 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); | 742 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); |
| 742 SkRect rect = rbe.getRect(); | 743 SkRect rect = rbe.getRect(); |
| 743 | 744 |
| 744 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot
tom); | 745 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot
tom); |
| 745 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); | 746 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); |
| 746 } | 747 } |
| 747 | 748 |
| 748 bool GrRectBlurEffect::CreateBlurProfileTexture(GrTextureProvider* textureProvid
er, float sigma, | 749 bool GrRectBlurEffect::CreateBlurProfileTexture(GrTextureProvider* textureProvid
er, float sigma, |
| 749 GrTexture **blurProfileTexture)
{ | 750 GrTexture **blurProfileTexture)
{ |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 } | 794 } |
| 794 | 795 |
| 795 GrRectBlurEffect::~GrRectBlurEffect() { | 796 GrRectBlurEffect::~GrRectBlurEffect() { |
| 796 } | 797 } |
| 797 | 798 |
| 798 void GrRectBlurEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, | 799 void GrRectBlurEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, |
| 799 GrProcessorKeyBuilder* b) const { | 800 GrProcessorKeyBuilder* b) const { |
| 800 GrGLRectBlurEffect::GenKey(*this, caps, b); | 801 GrGLRectBlurEffect::GenKey(*this, caps, b); |
| 801 } | 802 } |
| 802 | 803 |
| 803 GrGLFragmentProcessor* GrRectBlurEffect::createGLInstance() const { | 804 GrGLFragmentProcessor* GrRectBlurEffect::onCreateGLInstance() const { |
| 804 return SkNEW_ARGS(GrGLRectBlurEffect, (*this)); | 805 return SkNEW_ARGS(GrGLRectBlurEffect, (*this)); |
| 805 } | 806 } |
| 806 | 807 |
| 807 bool GrRectBlurEffect::onIsEqual(const GrFragmentProcessor& sBase) const { | 808 bool GrRectBlurEffect::onIsEqual(const GrFragmentProcessor& sBase) const { |
| 808 const GrRectBlurEffect& s = sBase.cast<GrRectBlurEffect>(); | 809 const GrRectBlurEffect& s = sBase.cast<GrRectBlurEffect>(); |
| 809 return this->getSigma() == s.getSigma() && this->getRect() == s.getRect(); | 810 return this->getSigma() == s.getSigma() && this->getRect() == s.getRect(); |
| 810 } | 811 } |
| 811 | 812 |
| 812 void GrRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const
{ | 813 void GrRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const
{ |
| 813 inout->mulByUnknownSingleComponent(); | 814 inout->mulByUnknownSingleComponent(); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 public: | 874 public: |
| 874 | 875 |
| 875 static GrFragmentProcessor* Create(GrTextureProvider*, float sigma, const Sk
RRect&); | 876 static GrFragmentProcessor* Create(GrTextureProvider*, float sigma, const Sk
RRect&); |
| 876 | 877 |
| 877 virtual ~GrRRectBlurEffect() {}; | 878 virtual ~GrRRectBlurEffect() {}; |
| 878 const char* name() const override { return "GrRRectBlur"; } | 879 const char* name() const override { return "GrRRectBlur"; } |
| 879 | 880 |
| 880 const SkRRect& getRRect() const { return fRRect; } | 881 const SkRRect& getRRect() const { return fRRect; } |
| 881 float getSigma() const { return fSigma; } | 882 float getSigma() const { return fSigma; } |
| 882 | 883 |
| 883 GrGLFragmentProcessor* createGLInstance() const override; | 884 private: |
| 885 GrGLFragmentProcessor* onCreateGLInstance() const override; |
| 884 | 886 |
| 885 private: | |
| 886 GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture); | 887 GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture); |
| 887 | 888 |
| 888 virtual void onGetGLProcessorKey(const GrGLSLCaps& caps, | 889 virtual void onGetGLProcessorKey(const GrGLSLCaps& caps, |
| 889 GrProcessorKeyBuilder* b) const override; | 890 GrProcessorKeyBuilder* b) const override; |
| 890 | 891 |
| 891 bool onIsEqual(const GrFragmentProcessor& other) const override; | 892 bool onIsEqual(const GrFragmentProcessor& other) const override; |
| 892 | 893 |
| 893 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; | 894 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; |
| 894 | 895 |
| 895 SkRRect fRRect; | 896 SkRRect fRRect; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1007 } | 1008 } |
| 1008 | 1009 |
| 1009 ////////////////////////////////////////////////////////////////////////////// | 1010 ////////////////////////////////////////////////////////////////////////////// |
| 1010 | 1011 |
| 1011 class GrGLRRectBlurEffect : public GrGLFragmentProcessor { | 1012 class GrGLRRectBlurEffect : public GrGLFragmentProcessor { |
| 1012 public: | 1013 public: |
| 1013 GrGLRRectBlurEffect(const GrProcessor&) {} | 1014 GrGLRRectBlurEffect(const GrProcessor&) {} |
| 1014 | 1015 |
| 1015 virtual void emitCode(EmitArgs&) override; | 1016 virtual void emitCode(EmitArgs&) override; |
| 1016 | 1017 |
| 1017 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1018 protected: |
| 1019 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; |
| 1018 | 1020 |
| 1019 private: | 1021 private: |
| 1020 GrGLProgramDataManager::UniformHandle fProxyRectUniform; | 1022 GrGLProgramDataManager::UniformHandle fProxyRectUniform; |
| 1021 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; | 1023 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; |
| 1022 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; | 1024 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; |
| 1023 typedef GrGLFragmentProcessor INHERITED; | 1025 typedef GrGLFragmentProcessor INHERITED; |
| 1024 }; | 1026 }; |
| 1025 | 1027 |
| 1026 void GrGLRRectBlurEffect::emitCode(EmitArgs& args) { | 1028 void GrGLRRectBlurEffect::emitCode(EmitArgs& args) { |
| 1027 const char *rectName; | 1029 const char *rectName; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1070 fsBuilder->codeAppendf("\t\t}\n"); | 1072 fsBuilder->codeAppendf("\t\t}\n"); |
| 1071 | 1073 |
| 1072 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n"); | 1074 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n"); |
| 1073 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n
"); | 1075 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n
"); |
| 1074 | 1076 |
| 1075 fsBuilder->codeAppendf("\t%s = ", args.fOutputColor); | 1077 fsBuilder->codeAppendf("\t%s = ", args.fOutputColor); |
| 1076 fsBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0
], "texCoord"); | 1078 fsBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0
], "texCoord"); |
| 1077 fsBuilder->codeAppend(";\n"); | 1079 fsBuilder->codeAppend(";\n"); |
| 1078 } | 1080 } |
| 1079 | 1081 |
| 1080 void GrGLRRectBlurEffect::setData(const GrGLProgramDataManager& pdman, | 1082 void GrGLRRectBlurEffect::onSetData(const GrGLProgramDataManager& pdman, |
| 1081 const GrProcessor& proc) { | 1083 const GrProcessor& proc) { |
| 1082 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); | 1084 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); |
| 1083 SkRRect rrect = brre.getRRect(); | 1085 SkRRect rrect = brre.getRRect(); |
| 1084 | 1086 |
| 1085 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); | 1087 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); |
| 1086 pdman.set1f(fBlurRadiusUniform, blurRadius); | 1088 pdman.set1f(fBlurRadiusUniform, blurRadius); |
| 1087 | 1089 |
| 1088 SkRect rect = rrect.getBounds(); | 1090 SkRect rect = rrect.getBounds(); |
| 1089 rect.outset(blurRadius, blurRadius); | 1091 rect.outset(blurRadius, blurRadius); |
| 1090 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot
tom); | 1092 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot
tom); |
| 1091 | 1093 |
| 1092 SkScalar radius = 0; | 1094 SkScalar radius = 0; |
| 1093 SkASSERT(rrect.isSimpleCircular() || rrect.isRect()); | 1095 SkASSERT(rrect.isSimpleCircular() || rrect.isRect()); |
| 1094 radius = rrect.getSimpleRadii().fX; | 1096 radius = rrect.getSimpleRadii().fX; |
| 1095 pdman.set1f(fCornerRadiusUniform, radius); | 1097 pdman.set1f(fCornerRadiusUniform, radius); |
| 1096 } | 1098 } |
| 1097 | 1099 |
| 1098 void GrRRectBlurEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorK
eyBuilder* b) const { | 1100 void GrRRectBlurEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorK
eyBuilder* b) const { |
| 1099 GrGLRRectBlurEffect::GenKey(*this, caps, b); | 1101 GrGLRRectBlurEffect::GenKey(*this, caps, b); |
| 1100 } | 1102 } |
| 1101 | 1103 |
| 1102 GrGLFragmentProcessor* GrRRectBlurEffect::createGLInstance() const { | 1104 GrGLFragmentProcessor* GrRRectBlurEffect::onCreateGLInstance() const { |
| 1103 return SkNEW_ARGS(GrGLRRectBlurEffect, (*this)); | 1105 return SkNEW_ARGS(GrGLRRectBlurEffect, (*this)); |
| 1104 } | 1106 } |
| 1105 | 1107 |
| 1106 bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrTextureProvider* texProvid
er, | 1108 bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrTextureProvider* texProvid
er, |
| 1107 GrDrawContext* drawContext, | 1109 GrDrawContext* drawContext, |
| 1108 GrRenderTarget* rt, | 1110 GrRenderTarget* rt, |
| 1109 GrPaint* grp, | 1111 GrPaint* grp, |
| 1110 const GrClip& clip, | 1112 const GrClip& clip, |
| 1111 const SkMatrix& viewMatrix, | 1113 const SkMatrix& viewMatrix, |
| 1112 const SkStrokeRec& strokeRec
, | 1114 const SkStrokeRec& strokeRec
, |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1264 } else { | 1266 } else { |
| 1265 str->append("None"); | 1267 str->append("None"); |
| 1266 } | 1268 } |
| 1267 str->append("))"); | 1269 str->append("))"); |
| 1268 } | 1270 } |
| 1269 #endif | 1271 #endif |
| 1270 | 1272 |
| 1271 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1273 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
| 1272 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1274 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
| 1273 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1275 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |