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 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 static const char* Name() { return "RectBlur"; } | 548 static const char* Name() { return "RectBlur"; } |
549 | 549 |
550 typedef GrGLRectBlurEffect GLEffect; | 550 typedef GrGLRectBlurEffect GLEffect; |
551 | 551 |
552 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; | 552 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; |
553 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags
) const SK_OVERRIDE; | 553 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags
) const SK_OVERRIDE; |
554 | 554 |
555 /** | 555 /** |
556 * Create a simple filter effect with custom bicubic coefficients. | 556 * Create a simple filter effect with custom bicubic coefficients. |
557 */ | 557 */ |
558 static GrEffectRef* Create(GrContext *context, const SkRect& rect, | 558 static GrEffect* Create(GrContext *context, const SkRect& rect, float sigma)
{ |
559 float sigma) { | |
560 GrTexture *blurProfileTexture = NULL; | 559 GrTexture *blurProfileTexture = NULL; |
561 int doubleProfileSize = SkScalarCeilToInt(12*sigma); | 560 int doubleProfileSize = SkScalarCeilToInt(12*sigma); |
562 | 561 |
563 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.heigh
t()) { | 562 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.heigh
t()) { |
564 // if the blur sigma is too large so the gaussian overlaps the whole | 563 // if the blur sigma is too large so the gaussian overlaps the whole |
565 // rect in either direction, fall back to CPU path for now. | 564 // rect in either direction, fall back to CPU path for now. |
566 | 565 |
567 return NULL; | 566 return NULL; |
568 } | 567 } |
569 | 568 |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 return this->getSigma() == s.getSigma() && this->getRect() == s.getRect(); | 751 return this->getSigma() == s.getSigma() && this->getRect() == s.getRect(); |
753 } | 752 } |
754 | 753 |
755 void GrRectBlurEffect::getConstantColorComponents(GrColor* color, uint32_t* vali
dFlags) const { | 754 void GrRectBlurEffect::getConstantColorComponents(GrColor* color, uint32_t* vali
dFlags) const { |
756 *validFlags = 0; | 755 *validFlags = 0; |
757 return; | 756 return; |
758 } | 757 } |
759 | 758 |
760 GR_DEFINE_EFFECT_TEST(GrRectBlurEffect); | 759 GR_DEFINE_EFFECT_TEST(GrRectBlurEffect); |
761 | 760 |
762 GrEffectRef* GrRectBlurEffect::TestCreate(SkRandom* random, | 761 GrEffect* GrRectBlurEffect::TestCreate(SkRandom* random, |
763 GrContext* context, | 762 GrContext* context, |
764 const GrDrawTargetCaps&, | 763 const GrDrawTargetCaps&, |
765 GrTexture**) { | 764 GrTexture**) { |
766 float sigma = random->nextRangeF(3,8); | 765 float sigma = random->nextRangeF(3,8); |
767 float width = random->nextRangeF(200,300); | 766 float width = random->nextRangeF(200,300); |
768 float height = random->nextRangeF(200,300); | 767 float height = random->nextRangeF(200,300); |
769 return GrRectBlurEffect::Create(context, SkRect::MakeWH(width, height), sigm
a); | 768 return GrRectBlurEffect::Create(context, SkRect::MakeWH(width, height), sigm
a); |
770 } | 769 } |
771 | 770 |
772 | 771 |
773 bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrContext* context, | 772 bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrContext* context, |
774 GrPaint* grp, | 773 GrPaint* grp, |
775 const SkStrokeRec& strokeRec, | 774 const SkStrokeRec& strokeRec, |
(...skipping 10 matching lines...) Expand all Loading... |
786 if (!strokeRec.isFillStyle()) { | 785 if (!strokeRec.isFillStyle()) { |
787 return false; | 786 return false; |
788 } | 787 } |
789 | 788 |
790 SkMatrix ctm = context->getMatrix(); | 789 SkMatrix ctm = context->getMatrix(); |
791 SkScalar xformedSigma = this->computeXformedSigma(ctm); | 790 SkScalar xformedSigma = this->computeXformedSigma(ctm); |
792 | 791 |
793 int pad=SkScalarCeilToInt(6*xformedSigma)/2; | 792 int pad=SkScalarCeilToInt(6*xformedSigma)/2; |
794 rect.outset(SkIntToScalar(pad), SkIntToScalar(pad)); | 793 rect.outset(SkIntToScalar(pad), SkIntToScalar(pad)); |
795 | 794 |
796 SkAutoTUnref<GrEffectRef> effect(GrRectBlurEffect::Create( | 795 SkAutoTUnref<GrEffect> effect(GrRectBlurEffect::Create(context, rect, xforme
dSigma)); |
797 context, rect, xformedSigma)); | |
798 if (!effect) { | 796 if (!effect) { |
799 return false; | 797 return false; |
800 } | 798 } |
801 | 799 |
802 GrContext::AutoMatrix am; | 800 GrContext::AutoMatrix am; |
803 if (!am.setIdentity(context, grp)) { | 801 if (!am.setIdentity(context, grp)) { |
804 return false; | 802 return false; |
805 } | 803 } |
806 | 804 |
807 grp->addCoverageEffect(effect); | 805 grp->addCoverageEffect(effect); |
808 | 806 |
809 context->drawRect(*grp, rect); | 807 context->drawRect(*grp, rect); |
810 return true; | 808 return true; |
811 } | 809 } |
812 | 810 |
813 class GrGLRRectBlurEffect; | 811 class GrGLRRectBlurEffect; |
814 | 812 |
815 class GrRRectBlurEffect : public GrEffect { | 813 class GrRRectBlurEffect : public GrEffect { |
816 public: | 814 public: |
817 | 815 |
818 static GrEffectRef* Create(GrContext* context, float sigma, const SkRRect&); | 816 static GrEffect* Create(GrContext* context, float sigma, const SkRRect&); |
819 | 817 |
820 virtual ~GrRRectBlurEffect() {}; | 818 virtual ~GrRRectBlurEffect() {}; |
821 static const char* Name() { return "GrRRectBlur"; } | 819 static const char* Name() { return "GrRRectBlur"; } |
822 | 820 |
823 const SkRRect& getRRect() const { return fRRect; } | 821 const SkRRect& getRRect() const { return fRRect; } |
824 float getSigma() const { return fSigma; } | 822 float getSigma() const { return fSigma; } |
825 | 823 |
826 typedef GrGLRRectBlurEffect GLEffect; | 824 typedef GrGLRRectBlurEffect GLEffect; |
827 | 825 |
828 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags
) const SK_OVERRIDE; | 826 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags
) const SK_OVERRIDE; |
829 | 827 |
830 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; | 828 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; |
831 | 829 |
832 private: | 830 private: |
833 GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture); | 831 GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture); |
834 | 832 |
835 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE; | 833 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE; |
836 | 834 |
837 SkRRect fRRect; | 835 SkRRect fRRect; |
838 float fSigma; | 836 float fSigma; |
839 GrTextureAccess fNinePatchAccess; | 837 GrTextureAccess fNinePatchAccess; |
840 | 838 |
841 GR_DECLARE_EFFECT_TEST; | 839 GR_DECLARE_EFFECT_TEST; |
842 | 840 |
843 typedef GrEffect INHERITED; | 841 typedef GrEffect INHERITED; |
844 }; | 842 }; |
845 | 843 |
846 | 844 |
847 GrEffectRef* GrRRectBlurEffect::Create(GrContext* context, float sigma, const Sk
RRect& rrect) { | 845 GrEffect* GrRRectBlurEffect::Create(GrContext* context, float sigma, const SkRRe
ct& rrect) { |
848 if (!rrect.isSimpleCircular()) { | 846 if (!rrect.isSimpleCircular()) { |
849 return NULL; | 847 return NULL; |
850 } | 848 } |
851 | 849 |
852 // Make sure we can successfully ninepatch this rrect -- the blur sigma has
to be | 850 // Make sure we can successfully ninepatch this rrect -- the blur sigma has
to be |
853 // sufficiently small relative to both the size of the corner radius and the | 851 // sufficiently small relative to both the size of the corner radius and the |
854 // width (and height) of the rrect. | 852 // width (and height) of the rrect. |
855 | 853 |
856 unsigned int blurRadius = 3*SkScalarCeilToInt(sigma-1/6.0f); | 854 unsigned int blurRadius = 3*SkScalarCeilToInt(sigma-1/6.0f); |
857 unsigned int cornerRadius = SkScalarCeilToInt(rrect.getSimpleRadii().x()); | 855 unsigned int cornerRadius = SkScalarCeilToInt(rrect.getSimpleRadii().x()); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
934 | 932 |
935 bool GrRRectBlurEffect::onIsEqual(const GrEffect& other) const { | 933 bool GrRRectBlurEffect::onIsEqual(const GrEffect& other) const { |
936 const GrRRectBlurEffect& rrbe = CastEffect<GrRRectBlurEffect>(other); | 934 const GrRRectBlurEffect& rrbe = CastEffect<GrRRectBlurEffect>(other); |
937 return fRRect.getSimpleRadii().fX == rrbe.fRRect.getSimpleRadii().fX && fSig
ma == rrbe.fSigma; | 935 return fRRect.getSimpleRadii().fX == rrbe.fRRect.getSimpleRadii().fX && fSig
ma == rrbe.fSigma; |
938 } | 936 } |
939 | 937 |
940 ////////////////////////////////////////////////////////////////////////////// | 938 ////////////////////////////////////////////////////////////////////////////// |
941 | 939 |
942 GR_DEFINE_EFFECT_TEST(GrRRectBlurEffect); | 940 GR_DEFINE_EFFECT_TEST(GrRRectBlurEffect); |
943 | 941 |
944 GrEffectRef* GrRRectBlurEffect::TestCreate(SkRandom* random, | 942 GrEffect* GrRRectBlurEffect::TestCreate(SkRandom* random, |
945 GrContext* context, | 943 GrContext* context, |
946 const GrDrawTargetCaps& caps, | 944 const GrDrawTargetCaps& caps, |
947 GrTexture*[]) { | 945 GrTexture*[]) { |
948 SkScalar w = random->nextRangeScalar(100.f, 1000.f); | 946 SkScalar w = random->nextRangeScalar(100.f, 1000.f); |
949 SkScalar h = random->nextRangeScalar(100.f, 1000.f); | 947 SkScalar h = random->nextRangeScalar(100.f, 1000.f); |
950 SkScalar r = random->nextRangeF(1.f, 9.f); | 948 SkScalar r = random->nextRangeF(1.f, 9.f); |
951 SkScalar sigma = random->nextRangeF(1.f,10.f); | 949 SkScalar sigma = random->nextRangeF(1.f,10.f); |
952 SkRRect rrect; | 950 SkRRect rrect; |
953 rrect.setRectXY(SkRect::MakeWH(w, h), r, r); | 951 rrect.setRectXY(SkRect::MakeWH(w, h), r, r); |
954 return GrRRectBlurEffect::Create(context, sigma, rrect); | 952 return GrRRectBlurEffect::Create(context, sigma, rrect); |
955 } | 953 } |
956 | 954 |
957 ////////////////////////////////////////////////////////////////////////////// | 955 ////////////////////////////////////////////////////////////////////////////// |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 if (!strokeRec.isFillStyle()) { | 1065 if (!strokeRec.isFillStyle()) { |
1068 return false; | 1066 return false; |
1069 } | 1067 } |
1070 | 1068 |
1071 SkRect proxy_rect = rrect.rect(); | 1069 SkRect proxy_rect = rrect.rect(); |
1072 SkMatrix ctm = context->getMatrix(); | 1070 SkMatrix ctm = context->getMatrix(); |
1073 SkScalar xformedSigma = this->computeXformedSigma(ctm); | 1071 SkScalar xformedSigma = this->computeXformedSigma(ctm); |
1074 float extra=3.f*SkScalarCeilToScalar(xformedSigma-1/6.0f); | 1072 float extra=3.f*SkScalarCeilToScalar(xformedSigma-1/6.0f); |
1075 proxy_rect.outset(extra, extra); | 1073 proxy_rect.outset(extra, extra); |
1076 | 1074 |
1077 SkAutoTUnref<GrEffectRef> effect(GrRRectBlurEffect::Create( | 1075 SkAutoTUnref<GrEffect> effect(GrRRectBlurEffect::Create( |
1078 context, xformedSigma, rrect)); | 1076 context, xformedSigma, rrect)); |
1079 if (!effect) { | 1077 if (!effect) { |
1080 return false; | 1078 return false; |
1081 } | 1079 } |
1082 | 1080 |
1083 GrContext::AutoMatrix am; | 1081 GrContext::AutoMatrix am; |
1084 if (!am.setIdentity(context, grp)) { | 1082 if (!am.setIdentity(context, grp)) { |
1085 return false; | 1083 return false; |
1086 } | 1084 } |
1087 | 1085 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1205 } else { | 1203 } else { |
1206 str->append("None"); | 1204 str->append("None"); |
1207 } | 1205 } |
1208 str->append("))"); | 1206 str->append("))"); |
1209 } | 1207 } |
1210 #endif | 1208 #endif |
1211 | 1209 |
1212 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1210 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
1213 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1211 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
1214 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1212 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |