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 |