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

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 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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