Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: src/effects/SkBlurMaskFilter.cpp

Issue 1395693011: Fix for GM:bigblurs not actually blurring some of the rectangles on Nexus 10. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 static SkCachedData* add_cached_rects(SkMask* mask, SkScalar sigma, SkBlurStyle style, 297 static SkCachedData* add_cached_rects(SkMask* mask, SkScalar sigma, SkBlurStyle style,
298 SkBlurQuality quality, const SkRect rects[ ], int count) { 298 SkBlurQuality quality, const SkRect rects[ ], int count) {
299 SkCachedData* cache = copy_mask_to_cacheddata(mask); 299 SkCachedData* cache = copy_mask_to_cacheddata(mask);
300 if (cache) { 300 if (cache) {
301 SkMaskCache::Add(sigma, style, quality, rects, count, *mask, cache); 301 SkMaskCache::Add(sigma, style, quality, rects, count, *mask, cache);
302 } 302 }
303 return cache; 303 return cache;
304 } 304 }
305 305
306 #ifdef SK_IGNORE_FAST_RRECT_BLUR 306 #ifdef SK_IGNORE_FAST_RRECT_BLUR
307 SK_CONF_DECLARE( bool, c_analyticBlurRRect, "mask.filter.blur.analyticblurrrect" , false, "Use the faster analytic blur approach for ninepatch rects" ); 307 SK_CONF_DECLARE(bool, c_analyticBlurRRect, "mask.filter.blur.analyticblurrrect", false, "Use the faster analytic blur approach for ninepatch rects");
308 #else 308 #else
309 SK_CONF_DECLARE( bool, c_analyticBlurRRect, "mask.filter.blur.analyticblurrrect" , true, "Use the faster analytic blur approach for ninepatch round rects" ); 309 SK_CONF_DECLARE(bool, c_analyticBlurRRect, "mask.filter.blur.analyticblurrrect", true, "Use the faster analytic blur approach for ninepatch round rects");
310 #endif 310 #endif
311 311
312 SkMaskFilter::FilterReturn 312 SkMaskFilter::FilterReturn
313 SkBlurMaskFilterImpl::filterRRectToNine(const SkRRect& rrect, const SkMatrix& ma trix, 313 SkBlurMaskFilterImpl::filterRRectToNine(const SkRRect& rrect, const SkMatrix& ma trix,
314 const SkIRect& clipBounds, 314 const SkIRect& clipBounds,
315 NinePatch* patch) const { 315 NinePatch* patch) const {
316 SkASSERT(patch != nullptr); 316 SkASSERT(patch != nullptr);
317 switch (rrect.getType()) { 317 switch (rrect.getType()) {
318 case SkRRect::kEmpty_Type: 318 case SkRRect::kEmpty_Type:
319 // Nothing to draw. 319 // Nothing to draw.
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 437
438 patch->fMask.fBounds.offsetTo(0, 0); 438 patch->fMask.fBounds.offsetTo(0, 0);
439 patch->fOuterRect = dstM.fBounds; 439 patch->fOuterRect = dstM.fBounds;
440 patch->fCenter.fX = SkScalarCeilToInt(leftUnstretched) + 1; 440 patch->fCenter.fX = SkScalarCeilToInt(leftUnstretched) + 1;
441 patch->fCenter.fY = SkScalarCeilToInt(topUnstretched) + 1; 441 patch->fCenter.fY = SkScalarCeilToInt(topUnstretched) + 1;
442 SkASSERT(nullptr == patch->fCache); 442 SkASSERT(nullptr == patch->fCache);
443 patch->fCache = cache; // transfer ownership to patch 443 patch->fCache = cache; // transfer ownership to patch
444 return kTrue_FilterReturn; 444 return kTrue_FilterReturn;
445 } 445 }
446 446
447 SK_CONF_DECLARE( bool, c_analyticBlurNinepatch, "mask.filter.analyticNinePatch", true, "Use the faster analytic blur approach for ninepatch rects" ); 447 SK_CONF_DECLARE(bool, c_analyticBlurNinepatch, "mask.filter.analyticNinePatch", true, "Use the faster analytic blur approach for ninepatch rects");
448 448
449 SkMaskFilter::FilterReturn 449 SkMaskFilter::FilterReturn
450 SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count, 450 SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count,
451 const SkMatrix& matrix, 451 const SkMatrix& matrix,
452 const SkIRect& clipBounds, 452 const SkIRect& clipBounds,
453 NinePatch* patch) const { 453 NinePatch* patch) const {
454 if (count < 1 || count > 2) { 454 if (count < 1 || count > 2) {
455 return kUnimplemented_FilterReturn; 455 return kUnimplemented_FilterReturn;
456 } 456 }
457 457
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.heigh t()) { 615 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.heigh t()) {
616 // if the blur sigma is too large so the gaussian overlaps the whole 616 // if the blur sigma is too large so the gaussian overlaps the whole
617 // rect in either direction, fall back to CPU path for now. 617 // rect in either direction, fall back to CPU path for now.
618 return nullptr; 618 return nullptr;
619 } 619 }
620 620
621 SkAutoTUnref<GrTexture> blurProfile(CreateBlurProfileTexture(textureProv ider, sigma)); 621 SkAutoTUnref<GrTexture> blurProfile(CreateBlurProfileTexture(textureProv ider, sigma));
622 if (!blurProfile) { 622 if (!blurProfile) {
623 return nullptr; 623 return nullptr;
624 } 624 }
625 return new GrRectBlurEffect(rect, sigma, blurProfile); 625 // in OpenGL ES, mediump floats have a minimum range of 2^14. If we have coordinates bigger
626 // than that, the shader math will end up with infinities and result in the blur effect not
627 // working correctly. To avoid this, we switch into highp when the coord inates are too big.
628 // As 2^14 is the minimum range but the actual range can be bigger, we m ight end up
629 // switching to highp sooner than strictly necessary, but most devices t hat have a bigger
630 // range for mediump also have mediump being exactly the same as highp ( e.g. all non-OpenGL
631 // ES devices), and thus incur no additional penalty for the switch.
632 static const SkScalar kMAX_BLUR_COORD = SkIntToScalar(16000);
633 GrSLPrecision precision;
robertphillips 2015/10/19 15:17:54 Is this enough? Don't we also need to check for ne
634 if (rect.top() > kMAX_BLUR_COORD ||
635 rect.left() > kMAX_BLUR_COORD ||
636 rect.bottom() > kMAX_BLUR_COORD ||
637 rect.right() > kMAX_BLUR_COORD ||
638 rect.width() > kMAX_BLUR_COORD ||
639 rect.height() > kMAX_BLUR_COORD) {
640 precision = kHigh_GrSLPrecision;
641 }
642 else {
643 precision = kDefault_GrSLPrecision;
644 }
645 return new GrRectBlurEffect(rect, sigma, blurProfile, precision);
626 } 646 }
627 647
628 const SkRect& getRect() const { return fRect; } 648 const SkRect& getRect() const { return fRect; }
629 float getSigma() const { return fSigma; } 649 float getSigma() const { return fSigma; }
630 650
631 private: 651 private:
632 GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blurProfile); 652 GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blurProfile,
653 GrSLPrecision fPrecision);
633 654
634 GrGLFragmentProcessor* onCreateGLInstance() const override; 655 GrGLFragmentProcessor* onCreateGLInstance() const override;
635 656
636 void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c onst override; 657 void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) c onst override;
637 658
638 bool onIsEqual(const GrFragmentProcessor&) const override; 659 bool onIsEqual(const GrFragmentProcessor&) const override;
639 660
640 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; 661 void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
641 662
642 static GrTexture* CreateBlurProfileTexture(GrTextureProvider*, float sigma); 663 static GrTexture* CreateBlurProfileTexture(GrTextureProvider*, float sigma);
643 664
644 SkRect fRect; 665 SkRect fRect;
645 float fSigma; 666 float fSigma;
646 GrTextureAccess fBlurProfileAccess; 667 GrTextureAccess fBlurProfileAccess;
668 GrSLPrecision fPrecision;
647 669
648 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 670 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
649 671
650 typedef GrFragmentProcessor INHERITED; 672 typedef GrFragmentProcessor INHERITED;
651 }; 673 };
652 674
653 class GrGLRectBlurEffect : public GrGLFragmentProcessor { 675 class GrGLRectBlurEffect : public GrGLFragmentProcessor {
654 public: 676 public:
655 GrGLRectBlurEffect(const GrProcessor&) {} 677 GrGLRectBlurEffect(const GrProcessor&, GrSLPrecision precision)
678 : fPrecision(precision) {
679 }
656 void emitCode(EmitArgs&) override; 680 void emitCode(EmitArgs&) override;
657 681
682 static void GenKey(GrSLPrecision precision, GrProcessorKeyBuilder* b);
683
658 protected: 684 protected:
659 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; 685 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override;
660 686
661 private: 687 private:
662 typedef GrGLProgramDataManager::UniformHandle UniformHandle; 688 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
663 689
664 UniformHandle fProxyRectUniform; 690 UniformHandle fProxyRectUniform;
665 UniformHandle fProfileSizeUniform; 691 UniformHandle fProfileSizeUniform;
692 GrSLPrecision fPrecision;
666 693
667 typedef GrGLFragmentProcessor INHERITED; 694 typedef GrGLFragmentProcessor INHERITED;
668 }; 695 };
669 696
670 void OutputRectBlurProfileLookup(GrGLFragmentBuilder* fsBuilder, 697 void OutputRectBlurProfileLookup(GrGLFragmentBuilder* fsBuilder,
671 const GrGLShaderBuilder::TextureSampler& sample r, 698 const GrGLShaderBuilder::TextureSampler& sample r,
672 const char *output, 699 const char *output,
673 const char *profileSize, const char *loc, 700 const char *profileSize, const char *loc,
674 const char *blurred_width, 701 const char *blurred_width,
675 const char *sharp_width) { 702 const char *sharp_width) {
676 fsBuilder->codeAppendf("\tfloat %s;\n", output); 703 fsBuilder->codeAppendf("float %s;", output);
677 fsBuilder->codeAppendf("\t\t{\n"); 704 fsBuilder->codeAppendf("{");
678 fsBuilder->codeAppendf("\t\t\tfloat coord = (0.5 * (abs(2.0*%s - %s) - %s))/ %s;\n", 705 fsBuilder->codeAppendf("float coord = ((abs(%s - 0.5 * %s) - 0.5 * %s)) / %s ;",
679 loc, blurred_width, sharp_width, profileSize); 706 loc, blurred_width, sharp_width, profileSize);
680 fsBuilder->codeAppendf("\t\t\t%s = ", output); 707 fsBuilder->codeAppendf("%s = ", output);
681 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); 708 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)");
682 fsBuilder->codeAppend(".a;\n"); 709 fsBuilder->codeAppend(".a;");
683 fsBuilder->codeAppendf("\t\t}\n"); 710 fsBuilder->codeAppendf("}");
684 } 711 }
685 712
713
714 void GrGLRectBlurEffect::GenKey(GrSLPrecision precision, GrProcessorKeyBuilder* b) {
715 b->add32(precision);
716 }
717
718
686 void GrGLRectBlurEffect::emitCode(EmitArgs& args) { 719 void GrGLRectBlurEffect::emitCode(EmitArgs& args) {
687 720
688 const char *rectName; 721 const char *rectName;
689 const char *profileSizeName; 722 const char *profileSizeName;
690 723
724 const char* precisionString = GrGLShaderVar::PrecisionString(fPrecision, kGL ES_GrGLStandard);
691 fProxyRectUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_ Visibility, 725 fProxyRectUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_ Visibility,
692 kVec4f_GrSLType, 726 kVec4f_GrSLType,
693 kDefault_GrSLPrecision, 727 fPrecision,
694 "proxyRect", 728 "proxyRect",
695 &rectName); 729 &rectName);
696 fProfileSizeUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragmen t_Visibility, 730 fProfileSizeUniform = args.fBuilder->addUniform(GrGLProgramBuilder::kFragmen t_Visibility,
697 kFloat_GrSLType, 731 kFloat_GrSLType,
698 kDefault_GrSLPrecision, 732 kDefault_GrSLPrecision,
699 "profileSize", 733 "profileSize",
700 &profileSizeName); 734 &profileSizeName);
701 735
702 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); 736 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
703 const char *fragmentPos = fsBuilder->fragmentPosition(); 737 const char *fragmentPos = fsBuilder->fragmentPosition();
704 738
705 if (args.fInputColor) { 739 if (args.fInputColor) {
706 fsBuilder->codeAppendf("\tvec4 src=%s;\n", args.fInputColor); 740 fsBuilder->codeAppendf("vec4 src=%s;", args.fInputColor);
707 } else { 741 } else {
708 fsBuilder->codeAppendf("\tvec4 src=vec4(1)\n;"); 742 fsBuilder->codeAppendf("vec4 src=vec4(1);");
709 } 743 }
710 744
711 fsBuilder->codeAppendf("\tvec2 translatedPos = %s.xy - %s.xy;\n", fragmentPo s, rectName ); 745 fsBuilder->codeAppendf("%s vec2 translatedPos = %s.xy - %s.xy;", precisionSt ring, fragmentPos,
712 fsBuilder->codeAppendf("\tfloat width = %s.z - %s.x;\n", rectName, rectName) ; 746 rectName);
713 fsBuilder->codeAppendf("\tfloat height = %s.w - %s.y;\n", rectName, rectName ); 747 fsBuilder->codeAppendf("%s float width = %s.z - %s.x;", precisionString, rec tName, rectName);
748 fsBuilder->codeAppendf("%s float height = %s.w - %s.y;", precisionString, re ctName, rectName);
714 749
715 fsBuilder->codeAppendf("\tvec2 smallDims = vec2(width - %s, height-%s);\n", profileSizeName, profileSizeName); 750 fsBuilder->codeAppendf("%s vec2 smallDims = vec2(width - %s, height - %s);", precisionString,
716 fsBuilder->codeAppendf("\tfloat center = 2.0 * floor(%s/2.0 + .25) - 1.0;\n" , profileSizeName); 751 profileSizeName, profileSizeName);
717 fsBuilder->codeAppendf("\tvec2 wh = smallDims - vec2(center,center);\n"); 752 fsBuilder->codeAppendf("%s float center = 2.0 * floor(%s/2.0 + .25) - 1.0;", precisionString,
753 profileSizeName);
754 fsBuilder->codeAppendf("%s vec2 wh = smallDims - vec2(center,center);", prec isionString);
718 755
719 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "horiz_lookup", pr ofileSizeName, 756 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "horiz_lookup", pr ofileSizeName,
720 "translatedPos.x", "width", "wh.x"); 757 "translatedPos.x", "width", "wh.x");
721 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "vert_lookup", pro fileSizeName, 758 OutputRectBlurProfileLookup(fsBuilder, args.fSamplers[0], "vert_lookup", pro fileSizeName,
722 "translatedPos.y", "height", "wh.y"); 759 "translatedPos.y", "height", "wh.y");
723 760
724 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n"); 761 fsBuilder->codeAppendf("float final = horiz_lookup * vert_lookup;");
725 fsBuilder->codeAppendf("\t%s = src * final;\n", args.fOutputColor ); 762 fsBuilder->codeAppendf("%s = src * final;", args.fOutputColor);
726 } 763 }
727 764
728 void GrGLRectBlurEffect::onSetData(const GrGLProgramDataManager& pdman, 765 void GrGLRectBlurEffect::onSetData(const GrGLProgramDataManager& pdman,
729 const GrProcessor& proc) { 766 const GrProcessor& proc) {
730 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>(); 767 const GrRectBlurEffect& rbe = proc.cast<GrRectBlurEffect>();
731 SkRect rect = rbe.getRect(); 768 SkRect rect = rbe.getRect();
732 769
733 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom); 770 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom);
734 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); 771 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma()));
735 } 772 }
(...skipping 21 matching lines...) Expand all
757 794
758 blurProfile = textureProvider->createTexture(texDesc, true, profile.get( ), 0); 795 blurProfile = textureProvider->createTexture(texDesc, true, profile.get( ), 0);
759 if (blurProfile) { 796 if (blurProfile) {
760 textureProvider->assignUniqueKeyToTexture(key, blurProfile); 797 textureProvider->assignUniqueKeyToTexture(key, blurProfile);
761 } 798 }
762 } 799 }
763 800
764 return blurProfile; 801 return blurProfile;
765 } 802 }
766 803
767 GrRectBlurEffect::GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *b lurProfile) 804 GrRectBlurEffect::GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *b lurProfile,
805 GrSLPrecision precision)
768 : fRect(rect) 806 : fRect(rect)
769 , fSigma(sigma) 807 , fSigma(sigma)
770 , fBlurProfileAccess(blurProfile) { 808 , fBlurProfileAccess(blurProfile)
809 , fPrecision(precision) {
771 this->initClassID<GrRectBlurEffect>(); 810 this->initClassID<GrRectBlurEffect>();
772 this->addTextureAccess(&fBlurProfileAccess); 811 this->addTextureAccess(&fBlurProfileAccess);
773 this->setWillReadFragmentPosition(); 812 this->setWillReadFragmentPosition();
774 } 813 }
775 814
776 void GrRectBlurEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, 815 void GrRectBlurEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
777 GrProcessorKeyBuilder* b) const { 816 GrProcessorKeyBuilder* b) const {
778 GrGLRectBlurEffect::GenKey(*this, caps, b); 817 GrGLRectBlurEffect::GenKey(fPrecision, b);
779 } 818 }
780 819
781 GrGLFragmentProcessor* GrRectBlurEffect::onCreateGLInstance() const { 820 GrGLFragmentProcessor* GrRectBlurEffect::onCreateGLInstance() const {
782 return new GrGLRectBlurEffect(*this); 821 return new GrGLRectBlurEffect(*this, fPrecision);
783 } 822 }
784 823
785 bool GrRectBlurEffect::onIsEqual(const GrFragmentProcessor& sBase) const { 824 bool GrRectBlurEffect::onIsEqual(const GrFragmentProcessor& sBase) const {
786 const GrRectBlurEffect& s = sBase.cast<GrRectBlurEffect>(); 825 const GrRectBlurEffect& s = sBase.cast<GrRectBlurEffect>();
787 return this->getSigma() == s.getSigma() && this->getRect() == s.getRect(); 826 return this->getSigma() == s.getSigma() && this->getRect() == s.getRect();
788 } 827 }
789 828
790 void GrRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { 829 void GrRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
791 inout->mulByUnknownSingleComponent(); 830 inout->mulByUnknownSingleComponent();
792 } 831 }
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
933 972
934 memset(mask.fImage, 0, mask.computeTotalImageSize()); 973 memset(mask.fImage, 0, mask.computeTotalImageSize());
935 974
936 SkRect smallRect; 975 SkRect smallRect;
937 smallRect.setWH(SkIntToScalar(smallRectSide), SkIntToScalar(smallRectSid e)); 976 smallRect.setWH(SkIntToScalar(smallRectSide), SkIntToScalar(smallRectSid e));
938 977
939 SkRRect smallRRect; 978 SkRRect smallRRect;
940 smallRRect.setRectXY(smallRect, SkIntToScalar(cornerRadius), SkIntToScal ar(cornerRadius)); 979 smallRRect.setRectXY(smallRect, SkIntToScalar(cornerRadius), SkIntToScal ar(cornerRadius));
941 980
942 SkPath path; 981 SkPath path;
943 path.addRRect( smallRRect ); 982 path.addRRect(smallRRect);
944 983
945 SkDraw::DrawToMask(path, &mask.fBounds, nullptr, nullptr, &mask, 984 SkDraw::DrawToMask(path, &mask.fBounds, nullptr, nullptr, &mask,
946 SkMask::kJustRenderImage_CreateMode, SkPaint::kFill_S tyle); 985 SkMask::kJustRenderImage_CreateMode, SkPaint::kFill_S tyle);
947 986
948 SkMask blurredMask; 987 SkMask blurredMask;
949 SkBlurMask::BoxBlur(&blurredMask, mask, sigma, kNormal_SkBlurStyle, kHig h_SkBlurQuality, 988 SkBlurMask::BoxBlur(&blurredMask, mask, sigma, kNormal_SkBlurStyle, kHig h_SkBlurQuality,
950 nullptr, true ); 989 nullptr, true);
951 990
952 unsigned int texSide = smallRectSide + 2*blurRadius; 991 unsigned int texSide = smallRectSide + 2*blurRadius;
953 GrSurfaceDesc texDesc; 992 GrSurfaceDesc texDesc;
954 texDesc.fWidth = texSide; 993 texDesc.fWidth = texSide;
955 texDesc.fHeight = texSide; 994 texDesc.fHeight = texSide;
956 texDesc.fConfig = kAlpha_8_GrPixelConfig; 995 texDesc.fConfig = kAlpha_8_GrPixelConfig;
957 996
958 blurNinePatchTexture.reset( 997 blurNinePatchTexture.reset(
959 texProvider->createTexture(texDesc, true, blurredMask.fImage, 0)); 998 texProvider->createTexture(texDesc, true, blurredMask.fImage, 0));
960 SkMask::FreeImage(blurredMask.fImage); 999 SkMask::FreeImage(blurredMask.fImage);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 kFloat_GrSLType, 1077 kFloat_GrSLType,
1039 kDefault_GrSLPrecision, 1078 kDefault_GrSLPrecision,
1040 "blurRadius", 1079 "blurRadius",
1041 &blurRadiusName); 1080 &blurRadiusName);
1042 1081
1043 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); 1082 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
1044 const char* fragmentPos = fsBuilder->fragmentPosition(); 1083 const char* fragmentPos = fsBuilder->fragmentPosition();
1045 1084
1046 // warp the fragment position to the appropriate part of the 9patch blur tex ture 1085 // warp the fragment position to the appropriate part of the 9patch blur tex ture
1047 1086
1048 fsBuilder->codeAppendf("\t\tvec2 rectCenter = (%s.xy + %s.zw)/2.0;\n", rectN ame, rectName); 1087 fsBuilder->codeAppendf("vec2 rectCenter = (%s.xy + %s.zw)/2.0;", rectName, r ectName);
1049 fsBuilder->codeAppendf("\t\tvec2 translatedFragPos = %s.xy - %s.xy;\n", frag mentPos, rectName); 1088 fsBuilder->codeAppendf("vec2 translatedFragPos = %s.xy - %s.xy;", fragmentPo s, rectName);
1050 fsBuilder->codeAppendf("\t\tfloat threshold = %s + 2.0*%s;\n", cornerRadiusN ame, blurRadiusName ); 1089 fsBuilder->codeAppendf("float threshold = %s + 2.0*%s;", cornerRadiusName, b lurRadiusName);
1051 fsBuilder->codeAppendf("\t\tvec2 middle = %s.zw - %s.xy - 2.0*threshold;\n", rectName, rectName ); 1090 fsBuilder->codeAppendf("vec2 middle = %s.zw - %s.xy - 2.0*threshold;", rectN ame, rectName);
1052 1091
1053 fsBuilder->codeAppendf("\t\tif (translatedFragPos.x >= threshold && translat edFragPos.x < (middle.x+threshold)) {\n" ); 1092 fsBuilder->codeAppendf("if (translatedFragPos.x >= threshold && translatedFr agPos.x < (middle.x+threshold)) {");
1054 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x = threshold;\n"); 1093 fsBuilder->codeAppendf("translatedFragPos.x = threshold;\n");
1055 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.x >= (middle.x + th reshold)) {\n"); 1094 fsBuilder->codeAppendf("} else if (translatedFragPos.x >= (middle.x + thresh old)) {");
1056 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x -= middle.x - 1.0;\n"); 1095 fsBuilder->codeAppendf("translatedFragPos.x -= middle.x - 1.0;");
1057 fsBuilder->codeAppendf("\t\t}\n"); 1096 fsBuilder->codeAppendf("}");
1058 1097
1059 fsBuilder->codeAppendf("\t\tif (translatedFragPos.y > threshold && translate dFragPos.y < (middle.y+threshold)) {\n" ); 1098 fsBuilder->codeAppendf("if (translatedFragPos.y > threshold && translatedFra gPos.y < (middle.y+threshold)) {");
1060 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y = threshold;\n"); 1099 fsBuilder->codeAppendf("translatedFragPos.y = threshold;");
1061 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.y >= (middle.y + th reshold)) {\n"); 1100 fsBuilder->codeAppendf("} else if (translatedFragPos.y >= (middle.y + thresh old)) {");
1062 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y -= middle.y - 1.0;\n"); 1101 fsBuilder->codeAppendf("translatedFragPos.y -= middle.y - 1.0;");
1063 fsBuilder->codeAppendf("\t\t}\n"); 1102 fsBuilder->codeAppendf("}");
1064 1103
1065 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n"); 1104 fsBuilder->codeAppendf("vec2 proxyDims = vec2(2.0*threshold+1.0);");
1066 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n "); 1105 fsBuilder->codeAppendf("vec2 texCoord = translatedFragPos / proxyDims;");
1067 1106
1068 fsBuilder->codeAppendf("\t%s = ", args.fOutputColor); 1107 fsBuilder->codeAppendf("%s = ", args.fOutputColor);
1069 fsBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0 ], "texCoord"); 1108 fsBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0 ], "texCoord");
1070 fsBuilder->codeAppend(";\n"); 1109 fsBuilder->codeAppend(";");
1071 } 1110 }
1072 1111
1073 void GrGLRRectBlurEffect::onSetData(const GrGLProgramDataManager& pdman, 1112 void GrGLRRectBlurEffect::onSetData(const GrGLProgramDataManager& pdman,
1074 const GrProcessor& proc) { 1113 const GrProcessor& proc) {
1075 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>(); 1114 const GrRRectBlurEffect& brre = proc.cast<GrRRectBlurEffect>();
1076 SkRRect rrect = brre.getRRect(); 1115 SkRRect rrect = brre.getRRect();
1077 1116
1078 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); 1117 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f);
1079 pdman.set1f(fBlurRadiusUniform, blurRadius); 1118 pdman.set1f(fBlurRadiusUniform, blurRadius);
1080 1119
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1257 } else { 1296 } else {
1258 str->append("None"); 1297 str->append("None");
1259 } 1298 }
1260 str->append("))"); 1299 str->append("))");
1261 } 1300 }
1262 #endif 1301 #endif
1263 1302
1264 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) 1303 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter)
1265 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) 1304 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl)
1266 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1305 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698