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 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 299 static SkCachedData* add_cached_rects(SkMask* mask, SkScalar sigma, SkBlurStyle style, | 299 static SkCachedData* add_cached_rects(SkMask* mask, SkScalar sigma, SkBlurStyle style, |
| 300 SkBlurQuality quality, const SkRect rects[ ], int count) { | 300 SkBlurQuality quality, const SkRect rects[ ], int count) { |
| 301 SkCachedData* cache = copy_mask_to_cacheddata(mask); | 301 SkCachedData* cache = copy_mask_to_cacheddata(mask); |
| 302 if (cache) { | 302 if (cache) { |
| 303 SkMaskCache::Add(sigma, style, quality, rects, count, *mask, cache); | 303 SkMaskCache::Add(sigma, style, quality, rects, count, *mask, cache); |
| 304 } | 304 } |
| 305 return cache; | 305 return cache; |
| 306 } | 306 } |
| 307 | 307 |
| 308 #ifdef SK_IGNORE_FAST_RRECT_BLUR | 308 #ifdef SK_IGNORE_FAST_RRECT_BLUR |
| 309 SK_CONF_DECLARE( bool, c_analyticBlurRRect, "mask.filter.blur.analyticblurrrect" , false, "Use the faster analytic blur approach for ninepatch rects" ); | 309 SK_CONF_DECLARE(bool, c_analyticBlurRRect, "mask.filter.blur.analyticblurrrect", false, "Use the faster analytic blur approach for ninepatch rects"); |
| 310 #else | 310 #else |
| 311 SK_CONF_DECLARE( bool, c_analyticBlurRRect, "mask.filter.blur.analyticblurrrect" , true, "Use the faster analytic blur approach for ninepatch round rects" ); | 311 SK_CONF_DECLARE(bool, c_analyticBlurRRect, "mask.filter.blur.analyticblurrrect", true, "Use the faster analytic blur approach for ninepatch round rects"); |
| 312 #endif | 312 #endif |
| 313 | 313 |
| 314 SkMaskFilter::FilterReturn | 314 SkMaskFilter::FilterReturn |
| 315 SkBlurMaskFilterImpl::filterRRectToNine(const SkRRect& rrect, const SkMatrix& ma trix, | 315 SkBlurMaskFilterImpl::filterRRectToNine(const SkRRect& rrect, const SkMatrix& ma trix, |
| 316 const SkIRect& clipBounds, | 316 const SkIRect& clipBounds, |
| 317 NinePatch* patch) const { | 317 NinePatch* patch) const { |
| 318 SkASSERT(patch != nullptr); | 318 SkASSERT(patch != nullptr); |
| 319 switch (rrect.getType()) { | 319 switch (rrect.getType()) { |
| 320 case SkRRect::kEmpty_Type: | 320 case SkRRect::kEmpty_Type: |
| 321 // Nothing to draw. | 321 // Nothing to draw. |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 439 | 439 |
| 440 patch->fMask.fBounds.offsetTo(0, 0); | 440 patch->fMask.fBounds.offsetTo(0, 0); |
| 441 patch->fOuterRect = dstM.fBounds; | 441 patch->fOuterRect = dstM.fBounds; |
| 442 patch->fCenter.fX = SkScalarCeilToInt(leftUnstretched) + 1; | 442 patch->fCenter.fX = SkScalarCeilToInt(leftUnstretched) + 1; |
| 443 patch->fCenter.fY = SkScalarCeilToInt(topUnstretched) + 1; | 443 patch->fCenter.fY = SkScalarCeilToInt(topUnstretched) + 1; |
| 444 SkASSERT(nullptr == patch->fCache); | 444 SkASSERT(nullptr == patch->fCache); |
| 445 patch->fCache = cache; // transfer ownership to patch | 445 patch->fCache = cache; // transfer ownership to patch |
| 446 return kTrue_FilterReturn; | 446 return kTrue_FilterReturn; |
| 447 } | 447 } |
| 448 | 448 |
| 449 SK_CONF_DECLARE( bool, c_analyticBlurNinepatch, "mask.filter.analyticNinePatch", true, "Use the faster analytic blur approach for ninepatch rects" ); | 449 SK_CONF_DECLARE(bool, c_analyticBlurNinepatch, "mask.filter.analyticNinePatch", true, "Use the faster analytic blur approach for ninepatch rects"); |
| 450 | 450 |
| 451 SkMaskFilter::FilterReturn | 451 SkMaskFilter::FilterReturn |
| 452 SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count, | 452 SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count, |
| 453 const SkMatrix& matrix, | 453 const SkMatrix& matrix, |
| 454 const SkIRect& clipBounds, | 454 const SkIRect& clipBounds, |
| 455 NinePatch* patch) const { | 455 NinePatch* patch) const { |
| 456 if (count < 1 || count > 2) { | 456 if (count < 1 || count > 2) { |
| 457 return kUnimplemented_FilterReturn; | 457 return kUnimplemented_FilterReturn; |
| 458 } | 458 } |
| 459 | 459 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 616 | 616 |
| 617 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.heigh t()) { | 617 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.heigh t()) { |
| 618 // if the blur sigma is too large so the gaussian overlaps the whole | 618 // if the blur sigma is too large so the gaussian overlaps the whole |
| 619 // rect in either direction, fall back to CPU path for now. | 619 // rect in either direction, fall back to CPU path for now. |
| 620 return nullptr; | 620 return nullptr; |
| 621 } | 621 } |
| 622 | 622 |
| 623 SkAutoTUnref<GrTexture> blurProfile(CreateBlurProfileTexture(textureProv ider, sigma)); | 623 SkAutoTUnref<GrTexture> blurProfile(CreateBlurProfileTexture(textureProv ider, sigma)); |
| 624 if (!blurProfile) { | 624 if (!blurProfile) { |
| 625 return nullptr; | 625 return nullptr; |
| 626 } | 626 } |
|
robertphillips
2015/10/19 13:48:39
// why is this here ? how was the constant determi
ethannicholas
2015/10/19 14:11:41
It was originally determined by "this is the size
| |
| 627 return new GrRectBlurEffect(rect, sigma, blurProfile); | 627 static const SkScalar kMAX_BLUR_COORD = SkIntToScalar(32000); |
| 628 GrSLPrecision precision; | |
| 629 if (rect.top() > kMAX_BLUR_COORD || | |
| 630 rect.left() > kMAX_BLUR_COORD || | |
| 631 rect.bottom() > kMAX_BLUR_COORD || | |
| 632 rect.right() > kMAX_BLUR_COORD || | |
| 633 rect.width() > kMAX_BLUR_COORD || | |
| 634 rect.height() > kMAX_BLUR_COORD) { | |
| 635 precision = kHigh_GrSLPrecision; | |
| 636 } | |
| 637 else { | |
| 638 precision = kDefault_GrSLPrecision; | |
| 639 } | |
| 640 return new GrRectBlurEffect(rect, sigma, blurProfile, precision); | |
| 628 } | 641 } |
| 629 | 642 |
| 630 const SkRect& getRect() const { return fRect; } | 643 const SkRect& getRect() const { return fRect; } |
| 631 float getSigma() const { return fSigma; } | 644 float getSigma() const { return fSigma; } |
| 632 | 645 |
| 633 private: | 646 private: |
| 634 GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blurProfile); | 647 GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blurProfile, |
| 648 GrSLPrecision fPrecision); | |
| 635 | 649 |
| 636 GrGLFragmentProcessor* onCreateGLInstance() const override; | 650 GrGLFragmentProcessor* onCreateGLInstance() const override; |
| 637 | 651 |
| 638 void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c onst override; | 652 void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c onst override; |
| 639 | 653 |
| 640 bool onIsEqual(const GrFragmentProcessor&) const override; | 654 bool onIsEqual(const GrFragmentProcessor&) const override; |
| 641 | 655 |
| 642 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; | 656 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; |
| 643 | 657 |
| 644 static GrTexture* CreateBlurProfileTexture(GrTextureProvider*, float sigma); | 658 static GrTexture* CreateBlurProfileTexture(GrTextureProvider*, float sigma); |
| 645 | 659 |
| 646 SkRect fRect; | 660 SkRect fRect; |
| 647 float fSigma; | 661 float fSigma; |
| 648 GrTextureAccess fBlurProfileAccess; | 662 GrTextureAccess fBlurProfileAccess; |
| 663 GrSLPrecision fPrecision; | |
| 649 | 664 |
| 650 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 665 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 651 | 666 |
| 652 typedef GrFragmentProcessor INHERITED; | 667 typedef GrFragmentProcessor INHERITED; |
| 653 }; | 668 }; |
| 654 | 669 |
| 655 class GrGLRectBlurEffect : public GrGLFragmentProcessor { | 670 class GrGLRectBlurEffect : public GrGLFragmentProcessor { |
| 656 public: | 671 public: |
| 657 GrGLRectBlurEffect(const GrProcessor&) {} | 672 GrGLRectBlurEffect(const GrProcessor&, GrSLPrecision precision) |
| 673 : fPrecision(precision) { | |
| 674 } | |
| 658 void emitCode(EmitArgs&) override; | 675 void emitCode(EmitArgs&) override; |
| 659 | 676 |
| 677 static void GenKey(GrSLPrecision precision, GrProcessorKeyBuilder* b); | |
| 678 | |
| 660 protected: | 679 protected: |
| 661 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 680 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; |
| 662 | 681 |
| 663 private: | 682 private: |
| 664 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 683 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
| 665 | 684 |
| 666 UniformHandle fProxyRectUniform; | 685 UniformHandle fProxyRectUniform; |
| 667 UniformHandle fProfileSizeUniform; | 686 UniformHandle fProfileSizeUniform; |
| 687 GrSLPrecision fPrecision; | |
| 668 | 688 |
| 669 typedef GrGLFragmentProcessor INHERITED; | 689 typedef GrGLFragmentProcessor INHERITED; |
| 670 }; | 690 }; |
| 671 | 691 |
| 672 void OutputRectBlurProfileLookup(GrGLFragmentBuilder* fsBuilder, | 692 void OutputRectBlurProfileLookup(GrGLFragmentBuilder* fsBuilder, |
| 673 const GrGLShaderBuilder::TextureSampler& sample r, | 693 const GrGLShaderBuilder::TextureSampler& sample r, |
| 674 const char *output, | 694 const char *output, |
| 675 const char *profileSize, const char *loc, | 695 const char *profileSize, const char *loc, |
| 676 const char *blurred_width, | 696 const char *blurred_width, |
| 677 const char *sharp_width) { | 697 const char *sharp_width) { |
| 678 fsBuilder->codeAppendf("\tfloat %s;\n", output); | 698 fsBuilder->codeAppendf("float %s;", output); |
| 679 fsBuilder->codeAppendf("\t\t{\n"); | 699 fsBuilder->codeAppendf("{"); |
| 680 fsBuilder->codeAppendf("\t\t\tfloat coord = (0.5 * (abs(2.0*%s - %s) - %s))/ %s;\n", | 700 fsBuilder->codeAppendf("float coord = ((abs(%s - 0.5 * %s) - 0.5 * %s)) / %s ;", |
| 681 loc, blurred_width, sharp_width, profileSize); | 701 loc, blurred_width, sharp_width, profileSize); |
| 682 fsBuilder->codeAppendf("\t\t\t%s = ", output); | 702 fsBuilder->codeAppendf("%s = ", output); |
| 683 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); | 703 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); |
| 684 fsBuilder->codeAppend(".a;\n"); | 704 fsBuilder->codeAppend(".a;"); |
| 685 fsBuilder->codeAppendf("\t\t}\n"); | 705 fsBuilder->codeAppendf("}"); |
| 686 } | 706 } |
| 687 | 707 |
| 708 | |
|
joshualitt
2015/10/16 20:50:44
\n
| |
| 709 void GrGLRectBlurEffect::GenKey(GrSLPrecision precision, GrProcessorKeyBuilder* b) { | |
| 710 b->add32(precision); | |
| 711 } | |
| 712 | |
| 713 | |
|
joshualitt
2015/10/16 20:50:44
\n
| |
| 688 void GrGLRectBlurEffect::emitCode(EmitArgs& args) { | 714 void GrGLRectBlurEffect::emitCode(EmitArgs& args) { |
| 689 | 715 |
|
joshualitt
2015/10/16 20:50:44
\n
| |
| 690 const char *rectName; | 716 const char *rectName; |
| 691 const char *profileSizeName; | 717 const char *profileSizeName; |
| 692 | 718 |
| 719 const char* precisionString = GrGLShaderVar::PrecisionString(fPrecision, kGL ES_GrGLStandard); | |
| 693 fProxyRectUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_ Visibility, | 720 fProxyRectUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_ Visibility, |
| 694 kVec4f_GrSLType, | 721 kVec4f_GrSLType, |
| 695 kDefault_GrSLPrecision, | 722 fPrecision, |
| 696 "proxyRect", | 723 "proxyRect", |
| 697 &rectName); | 724 &rectName); |
| 698 fProfileSizeUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragmen t_Visibility, | 725 fProfileSizeUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragmen t_Visibility, |
| 699 kFloat_GrSLType, | 726 kFloat_GrSLType, |
| 700 kDefault_GrSLPrecision, | 727 kDefault_GrSLPrecision, |
| 701 "profileSize", | 728 "profileSize", |
| 702 &profileSizeName); | 729 &profileSizeName); |
| 703 | 730 |
| 704 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); | 731 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); |
| 705 const char *fragmentPos = fsBuilder->fragmentPosition(); | 732 const char *fragmentPos = fsBuilder->fragmentPosition(); |
| 706 | 733 |
| 707 if (args.fInputColor) { | 734 if (args.fInputColor) { |
| 708 fsBuilder->codeAppendf("\tvec4 src=%s;\n", args.fInputColor); | 735 fsBuilder->codeAppendf("vec4 src=%s;", args.fInputColor); |
| 709 } else { | 736 } else { |
| 710 fsBuilder->codeAppendf("\tvec4 src=vec4(1)\n;"); | 737 fsBuilder->codeAppendf("vec4 src=vec4(1);"); |
| 711 } | 738 } |
| 712 | 739 |
| 713 fsBuilder->codeAppendf("\tvec2 translatedPos = %s.xy - %s.xy;\n", fragmentPo s, rectName ); | 740 fsBuilder->codeAppendf("%s vec2 translatedPos = %s.xy - %s.xy;", precisionSt ring, fragmentPos, |
| 714 fsBuilder->codeAppendf("\tfloat width = %s.z - %s.x;\n", rectName, rectName) ; | 741 rectName); |
| 715 fsBuilder->codeAppendf("\tfloat height = %s.w - %s.y;\n", rectName, rectName ); | 742 fsBuilder->codeAppendf("%s float width = %s.z - %s.x;", precisionString, rec tName, rectName); |
| 743 fsBuilder->codeAppendf("%s float height = %s.w - %s.y;", precisionString, re ctName, rectName); | |
| 716 | 744 |
| 717 fsBuilder->codeAppendf("\tvec2 smallDims = vec2(width - %s, height-%s);\n", profileSizeName, profileSizeName); | 745 fsBuilder->codeAppendf("%s vec2 smallDims = vec2(width - %s, height - %s);", precisionString, |
| 718 fsBuilder->codeAppendf("\tfloat center = 2.0 * floor(%s/2.0 + .25) - 1.0;\n" , profileSizeName); | 746 profileSizeName, profileSizeName); |
| 719 fsBuilder->codeAppendf("\tvec2 wh = smallDims - vec2(center,center);\n"); | 747 fsBuilder->codeAppendf("%s float center = 2.0 * floor(%s/2.0 + .25) - 1.0;", precisionString, |
| 748 profileSizeName); | |
| 749 fsBuilder->codeAppendf("%s vec2 wh = smallDims - vec2(center,center);", prec isionString); | |
| 720 | 750 |
| 721 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "horiz_lookup", pr ofileSizeName, | 751 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "horiz_lookup", pr ofileSizeName, |
| 722 "translatedPos.x", "width", "wh.x"); | 752 "translatedPos.x", "width", "wh.x"); |
| 723 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "vert_lookup", pro fileSizeName, | 753 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "vert_lookup", pro fileSizeName, |
| 724 "translatedPos.y", "height", "wh.y"); | 754 "translatedPos.y", "height", "wh.y"); |
| 725 | 755 |
| 726 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n"); | 756 fsBuilder->codeAppendf("float final = horiz_lookup * vert_lookup;"); |
| 727 fsBuilder->codeAppendf("\t%s = src * final;\n", args.fOutputColor ); | 757 fsBuilder->codeAppendf("%s = src * final;", args.fOutputColor); |
| 728 } | 758 } |
| 729 | 759 |
| 730 void GrGLRectBlurEffect::onSetData(const GrGLProgramDataManager& pdman, | 760 void GrGLRectBlurEffect::onSetData(const GrGLProgramDataManager& pdman, |
| 731 const GrProcessor& proc) { | 761 const GrProcessor& proc) { |
| 732 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); | 762 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); |
| 733 SkRect rect = rbe.getRect(); | 763 SkRect rect = rbe.getRect(); |
| 734 | 764 |
| 735 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom); | 765 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom); |
| 736 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); | 766 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); |
| 737 } | 767 } |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 759 | 789 |
| 760 blurProfile = textureProvider->createTexture(texDesc, true, profile.get( ), 0); | 790 blurProfile = textureProvider->createTexture(texDesc, true, profile.get( ), 0); |
| 761 if (blurProfile) { | 791 if (blurProfile) { |
| 762 textureProvider->assignUniqueKeyToTexture(key, blurProfile); | 792 textureProvider->assignUniqueKeyToTexture(key, blurProfile); |
| 763 } | 793 } |
| 764 } | 794 } |
| 765 | 795 |
| 766 return blurProfile; | 796 return blurProfile; |
| 767 } | 797 } |
| 768 | 798 |
| 769 GrRectBlurEffect::GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *b lurProfile) | 799 GrRectBlurEffect::GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *b lurProfile, |
| 800 GrSLPrecision precision) | |
| 770 : fRect(rect) | 801 : fRect(rect) |
| 771 , fSigma(sigma) | 802 , fSigma(sigma) |
| 772 , fBlurProfileAccess(blurProfile) { | 803 , fBlurProfileAccess(blurProfile) |
| 804 , fPrecision(precision) { | |
| 773 this->initClassID<GrRectBlurEffect>(); | 805 this->initClassID<GrRectBlurEffect>(); |
| 774 this->addTextureAccess(&fBlurProfileAccess); | 806 this->addTextureAccess(&fBlurProfileAccess); |
| 775 this->setWillReadFragmentPosition(); | 807 this->setWillReadFragmentPosition(); |
| 776 } | 808 } |
| 777 | 809 |
| 778 void GrRectBlurEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, | 810 void GrRectBlurEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, |
| 779 GrProcessorKeyBuilder* b) const { | 811 GrProcessorKeyBuilder* b) const { |
| 780 GrGLRectBlurEffect::GenKey(*this, caps, b); | 812 GrGLRectBlurEffect::GenKey(fPrecision, b); |
|
joshualitt
2015/10/16 20:50:44
We typically add a getter to this, and then just
| |
| 781 } | 813 } |
| 782 | 814 |
| 783 GrGLFragmentProcessor* GrRectBlurEffect::onCreateGLInstance() const { | 815 GrGLFragmentProcessor* GrRectBlurEffect::onCreateGLInstance() const { |
| 784 return new GrGLRectBlurEffect(*this); | 816 return new GrGLRectBlurEffect(*this, fPrecision); |
| 785 } | 817 } |
| 786 | 818 |
| 787 bool GrRectBlurEffect::onIsEqual(const GrFragmentProcessor& sBase) const { | 819 bool GrRectBlurEffect::onIsEqual(const GrFragmentProcessor& sBase) const { |
| 788 const GrRectBlurEffect& s = sBase.cast<GrRectBlurEffect>(); | 820 const GrRectBlurEffect& s = sBase.cast<GrRectBlurEffect>(); |
| 789 return this->getSigma() == s.getSigma() && this->getRect() == s.getRect(); | 821 return this->getSigma() == s.getSigma() && this->getRect() == s.getRect(); |
| 790 } | 822 } |
| 791 | 823 |
| 792 void GrRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { | 824 void GrRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { |
| 793 inout->mulByUnknownSingleComponent(); | 825 inout->mulByUnknownSingleComponent(); |
| 794 } | 826 } |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 936 | 968 |
| 937 memset(mask.fImage, 0, mask.computeTotalImageSize()); | 969 memset(mask.fImage, 0, mask.computeTotalImageSize()); |
| 938 | 970 |
| 939 SkRect smallRect; | 971 SkRect smallRect; |
| 940 smallRect.setWH(SkIntToScalar(smallRectSide), SkIntToScalar(smallRectSid e)); | 972 smallRect.setWH(SkIntToScalar(smallRectSide), SkIntToScalar(smallRectSid e)); |
| 941 | 973 |
| 942 SkRRect smallRRect; | 974 SkRRect smallRRect; |
| 943 smallRRect.setRectXY(smallRect, SkIntToScalar(cornerRadius), SkIntToScal ar(cornerRadius)); | 975 smallRRect.setRectXY(smallRect, SkIntToScalar(cornerRadius), SkIntToScal ar(cornerRadius)); |
| 944 | 976 |
| 945 SkPath path; | 977 SkPath path; |
| 946 path.addRRect( smallRRect ); | 978 path.addRRect(smallRRect); |
| 947 | 979 |
| 948 SkDraw::DrawToMask(path, &mask.fBounds, nullptr, nullptr, &mask, | 980 SkDraw::DrawToMask(path, &mask.fBounds, nullptr, nullptr, &mask, |
| 949 SkMask::kJustRenderImage_CreateMode, SkPaint::kFill_S tyle); | 981 SkMask::kJustRenderImage_CreateMode, SkPaint::kFill_S tyle); |
| 950 | 982 |
| 951 SkMask blurredMask; | 983 SkMask blurredMask; |
| 952 SkBlurMask::BoxBlur(&blurredMask, mask, sigma, kNormal_SkBlurStyle, kHig h_SkBlurQuality, | 984 SkBlurMask::BoxBlur(&blurredMask, mask, sigma, kNormal_SkBlurStyle, kHig h_SkBlurQuality, |
| 953 nullptr, true ); | 985 nullptr, true); |
| 954 | 986 |
| 955 unsigned int texSide = smallRectSide + 2*blurRadius; | 987 unsigned int texSide = smallRectSide + 2*blurRadius; |
| 956 GrSurfaceDesc texDesc; | 988 GrSurfaceDesc texDesc; |
| 957 texDesc.fWidth = texSide; | 989 texDesc.fWidth = texSide; |
| 958 texDesc.fHeight = texSide; | 990 texDesc.fHeight = texSide; |
| 959 texDesc.fConfig = kAlpha_8_GrPixelConfig; | 991 texDesc.fConfig = kAlpha_8_GrPixelConfig; |
| 960 | 992 |
| 961 blurNinePatchTexture.reset( | 993 blurNinePatchTexture.reset( |
| 962 texProvider->createTexture(texDesc, true, blurredMask.fImage, 0)); | 994 texProvider->createTexture(texDesc, true, blurredMask.fImage, 0)); |
| 963 SkMask::FreeImage(blurredMask.fImage); | 995 SkMask::FreeImage(blurredMask.fImage); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1041 kFloat_GrSLType, | 1073 kFloat_GrSLType, |
| 1042 kDefault_GrSLPrecision, | 1074 kDefault_GrSLPrecision, |
| 1043 "blurRadius", | 1075 "blurRadius", |
| 1044 &blurRadiusName); | 1076 &blurRadiusName); |
| 1045 | 1077 |
| 1046 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); | 1078 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); |
| 1047 const char* fragmentPos = fsBuilder->fragmentPosition(); | 1079 const char* fragmentPos = fsBuilder->fragmentPosition(); |
| 1048 | 1080 |
| 1049 // warp the fragment position to the appropriate part of the 9patch blur tex ture | 1081 // warp the fragment position to the appropriate part of the 9patch blur tex ture |
| 1050 | 1082 |
| 1051 fsBuilder->codeAppendf("\t\tvec2 rectCenter = (%s.xy + %s.zw)/2.0;\n", rectN ame, rectName); | 1083 fsBuilder->codeAppendf("vec2 rectCenter = (%s.xy + %s.zw)/2.0;", rectName, r ectName); |
| 1052 fsBuilder->codeAppendf("\t\tvec2 translatedFragPos = %s.xy - %s.xy;\n", frag mentPos, rectName); | 1084 fsBuilder->codeAppendf("vec2 translatedFragPos = %s.xy - %s.xy;", fragmentPo s, rectName); |
| 1053 fsBuilder->codeAppendf("\t\tfloat threshold = %s + 2.0*%s;\n", cornerRadiusN ame, blurRadiusName ); | 1085 fsBuilder->codeAppendf("float threshold = %s + 2.0*%s;", cornerRadiusName, b lurRadiusName); |
| 1054 fsBuilder->codeAppendf("\t\tvec2 middle = %s.zw - %s.xy - 2.0*threshold;\n", rectName, rectName ); | 1086 fsBuilder->codeAppendf("vec2 middle = %s.zw - %s.xy - 2.0*threshold;", rectN ame, rectName); |
| 1055 | 1087 |
| 1056 fsBuilder->codeAppendf("\t\tif (translatedFragPos.x >= threshold && translat edFragPos.x < (middle.x+threshold)) {\n" ); | 1088 fsBuilder->codeAppendf("if (translatedFragPos.x >= threshold && translatedFr agPos.x < (middle.x+threshold)) {"); |
| 1057 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x = threshold;\n"); | 1089 fsBuilder->codeAppendf("translatedFragPos.x = threshold;\n"); |
| 1058 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.x >= (middle.x + th reshold)) {\n"); | 1090 fsBuilder->codeAppendf("} else if (translatedFragPos.x >= (middle.x + thresh old)) {"); |
| 1059 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x -= middle.x - 1.0;\n"); | 1091 fsBuilder->codeAppendf("translatedFragPos.x -= middle.x - 1.0;"); |
| 1060 fsBuilder->codeAppendf("\t\t}\n"); | 1092 fsBuilder->codeAppendf("}"); |
| 1061 | 1093 |
| 1062 fsBuilder->codeAppendf("\t\tif (translatedFragPos.y > threshold && translate dFragPos.y < (middle.y+threshold)) {\n" ); | 1094 fsBuilder->codeAppendf("if (translatedFragPos.y > threshold && translatedFra gPos.y < (middle.y+threshold)) {"); |
| 1063 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y = threshold;\n"); | 1095 fsBuilder->codeAppendf("translatedFragPos.y = threshold;"); |
| 1064 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.y >= (middle.y + th reshold)) {\n"); | 1096 fsBuilder->codeAppendf("} else if (translatedFragPos.y >= (middle.y + thresh old)) {"); |
| 1065 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y -= middle.y - 1.0;\n"); | 1097 fsBuilder->codeAppendf("translatedFragPos.y -= middle.y - 1.0;"); |
| 1066 fsBuilder->codeAppendf("\t\t}\n"); | 1098 fsBuilder->codeAppendf("}"); |
| 1067 | 1099 |
| 1068 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n"); | 1100 fsBuilder->codeAppendf("vec2 proxyDims = vec2(2.0*threshold+1.0);"); |
| 1069 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n "); | 1101 fsBuilder->codeAppendf("vec2 texCoord = translatedFragPos / proxyDims;"); |
| 1070 | 1102 |
| 1071 fsBuilder->codeAppendf("\t%s = ", args.fOutputColor); | 1103 fsBuilder->codeAppendf("%s = ", args.fOutputColor); |
| 1072 fsBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0 ], "texCoord"); | 1104 fsBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0 ], "texCoord"); |
| 1073 fsBuilder->codeAppend(";\n"); | 1105 fsBuilder->codeAppend(";"); |
| 1074 } | 1106 } |
| 1075 | 1107 |
| 1076 void GrGLRRectBlurEffect::onSetData(const GrGLProgramDataManager& pdman, | 1108 void GrGLRRectBlurEffect::onSetData(const GrGLProgramDataManager& pdman, |
| 1077 const GrProcessor& proc) { | 1109 const GrProcessor& proc) { |
| 1078 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); | 1110 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); |
| 1079 SkRRect rrect = brre.getRRect(); | 1111 SkRRect rrect = brre.getRRect(); |
| 1080 | 1112 |
| 1081 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); | 1113 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); |
| 1082 pdman.set1f(fBlurRadiusUniform, blurRadius); | 1114 pdman.set1f(fBlurRadiusUniform, blurRadius); |
| 1083 | 1115 |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1262 } else { | 1294 } else { |
| 1263 str->append("None"); | 1295 str->append("None"); |
| 1264 } | 1296 } |
| 1265 str->append("))"); | 1297 str->append("))"); |
| 1266 } | 1298 } |
| 1267 #endif | 1299 #endif |
| 1268 | 1300 |
| 1269 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1301 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
| 1270 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1302 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
| 1271 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1303 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |