| 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 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 GrTextureAccess fBlurProfileAccess; | 602 GrTextureAccess fBlurProfileAccess; |
| 603 | 603 |
| 604 GR_DECLARE_EFFECT_TEST; | 604 GR_DECLARE_EFFECT_TEST; |
| 605 | 605 |
| 606 typedef GrEffect INHERITED; | 606 typedef GrEffect INHERITED; |
| 607 }; | 607 }; |
| 608 | 608 |
| 609 class GrGLRectBlurEffect : public GrGLEffect { | 609 class GrGLRectBlurEffect : public GrGLEffect { |
| 610 public: | 610 public: |
| 611 GrGLRectBlurEffect(const GrBackendEffectFactory& factory, | 611 GrGLRectBlurEffect(const GrBackendEffectFactory& factory, |
| 612 const GrEffect&); | 612 const GrDrawEffect&); |
| 613 virtual void emitCode(GrGLProgramBuilder*, | 613 virtual void emitCode(GrGLProgramBuilder*, |
| 614 const GrEffect&, | 614 const GrDrawEffect&, |
| 615 const GrEffectKey&, | 615 const GrEffectKey&, |
| 616 const char* outputColor, | 616 const char* outputColor, |
| 617 const char* inputColor, | 617 const char* inputColor, |
| 618 const TransformedCoordsArray&, | 618 const TransformedCoordsArray&, |
| 619 const TextureSamplerArray&) SK_OVERRIDE; | 619 const TextureSamplerArray&) SK_OVERRIDE; |
| 620 | 620 |
| 621 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER
RIDE; | 621 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_
OVERRIDE; |
| 622 | 622 |
| 623 private: | 623 private: |
| 624 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 624 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
| 625 | 625 |
| 626 UniformHandle fProxyRectUniform; | 626 UniformHandle fProxyRectUniform; |
| 627 UniformHandle fProfileSizeUniform; | 627 UniformHandle fProfileSizeUniform; |
| 628 | 628 |
| 629 typedef GrGLEffect INHERITED; | 629 typedef GrGLEffect INHERITED; |
| 630 }; | 630 }; |
| 631 | 631 |
| 632 | 632 |
| 633 | 633 |
| 634 GrGLRectBlurEffect::GrGLRectBlurEffect(const GrBackendEffectFactory& factory, co
nst GrEffect&) | 634 GrGLRectBlurEffect::GrGLRectBlurEffect(const GrBackendEffectFactory& factory, co
nst GrDrawEffect&) |
| 635 : INHERITED(factory) { | 635 : INHERITED(factory) { |
| 636 } | 636 } |
| 637 | 637 |
| 638 void OutputRectBlurProfileLookup(GrGLFragmentShaderBuilder* fsBuilder, | 638 void OutputRectBlurProfileLookup(GrGLFragmentShaderBuilder* fsBuilder, |
| 639 const GrGLShaderBuilder::TextureSampler& sample
r, | 639 const GrGLShaderBuilder::TextureSampler& sample
r, |
| 640 const char *output, | 640 const char *output, |
| 641 const char *profileSize, const char *loc, | 641 const char *profileSize, const char *loc, |
| 642 const char *blurred_width, | 642 const char *blurred_width, |
| 643 const char *sharp_width) { | 643 const char *sharp_width) { |
| 644 fsBuilder->codeAppendf("\tfloat %s;\n", output); | 644 fsBuilder->codeAppendf("\tfloat %s;\n", output); |
| 645 fsBuilder->codeAppendf("\t\t{\n"); | 645 fsBuilder->codeAppendf("\t\t{\n"); |
| 646 fsBuilder->codeAppendf("\t\t\tfloat coord = (0.5 * (abs(2.0*%s - %s) - %s))/
%s;\n", | 646 fsBuilder->codeAppendf("\t\t\tfloat coord = (0.5 * (abs(2.0*%s - %s) - %s))/
%s;\n", |
| 647 loc, blurred_width, sharp_width, profileSize); | 647 loc, blurred_width, sharp_width, profileSize); |
| 648 fsBuilder->codeAppendf("\t\t\t%s = ", output); | 648 fsBuilder->codeAppendf("\t\t\t%s = ", output); |
| 649 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); | 649 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)"); |
| 650 fsBuilder->codeAppend(".a;\n"); | 650 fsBuilder->codeAppend(".a;\n"); |
| 651 fsBuilder->codeAppendf("\t\t}\n"); | 651 fsBuilder->codeAppendf("\t\t}\n"); |
| 652 } | 652 } |
| 653 | 653 |
| 654 void GrGLRectBlurEffect::emitCode(GrGLProgramBuilder* builder, | 654 void GrGLRectBlurEffect::emitCode(GrGLProgramBuilder* builder, |
| 655 const GrEffect&, | 655 const GrDrawEffect&, |
| 656 const GrEffectKey& key, | 656 const GrEffectKey& key, |
| 657 const char* outputColor, | 657 const char* outputColor, |
| 658 const char* inputColor, | 658 const char* inputColor, |
| 659 const TransformedCoordsArray& coords, | 659 const TransformedCoordsArray& coords, |
| 660 const TextureSamplerArray& samplers) { | 660 const TextureSamplerArray& samplers) { |
| 661 | 661 |
| 662 const char *rectName; | 662 const char *rectName; |
| 663 const char *profileSizeName; | 663 const char *profileSizeName; |
| 664 | 664 |
| 665 fProxyRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi
lity, | 665 fProxyRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi
lity, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 689 fsBuilder->codeAppendf("\tvec2 wh = smallDims - vec2(center,center);\n"); | 689 fsBuilder->codeAppendf("\tvec2 wh = smallDims - vec2(center,center);\n"); |
| 690 | 690 |
| 691 OutputRectBlurProfileLookup(fsBuilder, samplers[0], "horiz_lookup", profileS
izeName, "translatedPos.x", "width", "wh.x"); | 691 OutputRectBlurProfileLookup(fsBuilder, samplers[0], "horiz_lookup", profileS
izeName, "translatedPos.x", "width", "wh.x"); |
| 692 OutputRectBlurProfileLookup(fsBuilder, samplers[0], "vert_lookup", profileSi
zeName, "translatedPos.y", "height", "wh.y"); | 692 OutputRectBlurProfileLookup(fsBuilder, samplers[0], "vert_lookup", profileSi
zeName, "translatedPos.y", "height", "wh.y"); |
| 693 | 693 |
| 694 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n"); | 694 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n"); |
| 695 fsBuilder->codeAppendf("\t%s = src * vec4(final);\n", outputColor ); | 695 fsBuilder->codeAppendf("\t%s = src * vec4(final);\n", outputColor ); |
| 696 } | 696 } |
| 697 | 697 |
| 698 void GrGLRectBlurEffect::setData(const GrGLProgramDataManager& pdman, | 698 void GrGLRectBlurEffect::setData(const GrGLProgramDataManager& pdman, |
| 699 const GrEffect& effect) { | 699 const GrDrawEffect& drawEffect) { |
| 700 const GrRectBlurEffect& rbe = effect.cast<GrRectBlurEffect>(); | 700 const GrRectBlurEffect& rbe = drawEffect.castEffect<GrRectBlurEffect>(); |
| 701 SkRect rect = rbe.getRect(); | 701 SkRect rect = rbe.getRect(); |
| 702 | 702 |
| 703 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot
tom); | 703 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot
tom); |
| 704 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); | 704 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); |
| 705 } | 705 } |
| 706 | 706 |
| 707 bool GrRectBlurEffect::CreateBlurProfileTexture(GrContext *context, float sigma, | 707 bool GrRectBlurEffect::CreateBlurProfileTexture(GrContext *context, float sigma, |
| 708 GrTexture **blurProfileTexture) { | 708 GrTexture **blurProfileTexture) { |
| 709 GrTextureParams params; | 709 GrTextureParams params; |
| 710 GrTextureDesc texDesc; | 710 GrTextureDesc texDesc; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 } | 754 } |
| 755 | 755 |
| 756 GrRectBlurEffect::~GrRectBlurEffect() { | 756 GrRectBlurEffect::~GrRectBlurEffect() { |
| 757 } | 757 } |
| 758 | 758 |
| 759 const GrBackendEffectFactory& GrRectBlurEffect::getFactory() const { | 759 const GrBackendEffectFactory& GrRectBlurEffect::getFactory() const { |
| 760 return GrTBackendEffectFactory<GrRectBlurEffect>::getInstance(); | 760 return GrTBackendEffectFactory<GrRectBlurEffect>::getInstance(); |
| 761 } | 761 } |
| 762 | 762 |
| 763 bool GrRectBlurEffect::onIsEqual(const GrEffect& sBase) const { | 763 bool GrRectBlurEffect::onIsEqual(const GrEffect& sBase) const { |
| 764 const GrRectBlurEffect& s = sBase.cast<GrRectBlurEffect>(); | 764 const GrRectBlurEffect& s = CastEffect<GrRectBlurEffect>(sBase); |
| 765 return this->getSigma() == s.getSigma() && this->getRect() == s.getRect(); | 765 return this->getSigma() == s.getSigma() && this->getRect() == s.getRect(); |
| 766 } | 766 } |
| 767 | 767 |
| 768 void GrRectBlurEffect::getConstantColorComponents(GrColor* color, uint32_t* vali
dFlags) const { | 768 void GrRectBlurEffect::getConstantColorComponents(GrColor* color, uint32_t* vali
dFlags) const { |
| 769 *validFlags = 0; | 769 *validFlags = 0; |
| 770 return; | 770 return; |
| 771 } | 771 } |
| 772 | 772 |
| 773 GR_DEFINE_EFFECT_TEST(GrRectBlurEffect); | 773 GR_DEFINE_EFFECT_TEST(GrRectBlurEffect); |
| 774 | 774 |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 938 | 938 |
| 939 GrRRectBlurEffect::GrRRectBlurEffect(float sigma, const SkRRect& rrect, GrTextur
e *ninePatchTexture) | 939 GrRRectBlurEffect::GrRRectBlurEffect(float sigma, const SkRRect& rrect, GrTextur
e *ninePatchTexture) |
| 940 : fRRect(rrect), | 940 : fRRect(rrect), |
| 941 fSigma(sigma), | 941 fSigma(sigma), |
| 942 fNinePatchAccess(ninePatchTexture) { | 942 fNinePatchAccess(ninePatchTexture) { |
| 943 this->addTextureAccess(&fNinePatchAccess); | 943 this->addTextureAccess(&fNinePatchAccess); |
| 944 this->setWillReadFragmentPosition(); | 944 this->setWillReadFragmentPosition(); |
| 945 } | 945 } |
| 946 | 946 |
| 947 bool GrRRectBlurEffect::onIsEqual(const GrEffect& other) const { | 947 bool GrRRectBlurEffect::onIsEqual(const GrEffect& other) const { |
| 948 const GrRRectBlurEffect& rrbe = other.cast<GrRRectBlurEffect>(); | 948 const GrRRectBlurEffect& rrbe = CastEffect<GrRRectBlurEffect>(other); |
| 949 return fRRect.getSimpleRadii().fX == rrbe.fRRect.getSimpleRadii().fX && fSig
ma == rrbe.fSigma; | 949 return fRRect.getSimpleRadii().fX == rrbe.fRRect.getSimpleRadii().fX && fSig
ma == rrbe.fSigma; |
| 950 } | 950 } |
| 951 | 951 |
| 952 ////////////////////////////////////////////////////////////////////////////// | 952 ////////////////////////////////////////////////////////////////////////////// |
| 953 | 953 |
| 954 GR_DEFINE_EFFECT_TEST(GrRRectBlurEffect); | 954 GR_DEFINE_EFFECT_TEST(GrRRectBlurEffect); |
| 955 | 955 |
| 956 GrEffect* GrRRectBlurEffect::TestCreate(SkRandom* random, | 956 GrEffect* GrRRectBlurEffect::TestCreate(SkRandom* random, |
| 957 GrContext* context, | 957 GrContext* context, |
| 958 const GrDrawTargetCaps& caps, | 958 const GrDrawTargetCaps& caps, |
| 959 GrTexture*[]) { | 959 GrTexture*[]) { |
| 960 SkScalar w = random->nextRangeScalar(100.f, 1000.f); | 960 SkScalar w = random->nextRangeScalar(100.f, 1000.f); |
| 961 SkScalar h = random->nextRangeScalar(100.f, 1000.f); | 961 SkScalar h = random->nextRangeScalar(100.f, 1000.f); |
| 962 SkScalar r = random->nextRangeF(1.f, 9.f); | 962 SkScalar r = random->nextRangeF(1.f, 9.f); |
| 963 SkScalar sigma = random->nextRangeF(1.f,10.f); | 963 SkScalar sigma = random->nextRangeF(1.f,10.f); |
| 964 SkRRect rrect; | 964 SkRRect rrect; |
| 965 rrect.setRectXY(SkRect::MakeWH(w, h), r, r); | 965 rrect.setRectXY(SkRect::MakeWH(w, h), r, r); |
| 966 return GrRRectBlurEffect::Create(context, sigma, rrect); | 966 return GrRRectBlurEffect::Create(context, sigma, rrect); |
| 967 } | 967 } |
| 968 | 968 |
| 969 ////////////////////////////////////////////////////////////////////////////// | 969 ////////////////////////////////////////////////////////////////////////////// |
| 970 | 970 |
| 971 class GrGLRRectBlurEffect : public GrGLEffect { | 971 class GrGLRRectBlurEffect : public GrGLEffect { |
| 972 public: | 972 public: |
| 973 GrGLRRectBlurEffect(const GrBackendEffectFactory&, const GrEffect&); | 973 GrGLRRectBlurEffect(const GrBackendEffectFactory&, const GrDrawEffect&); |
| 974 | 974 |
| 975 virtual void emitCode(GrGLProgramBuilder* builder, | 975 virtual void emitCode(GrGLProgramBuilder* builder, |
| 976 const GrEffect& effect, | 976 const GrDrawEffect& drawEffect, |
| 977 const GrEffectKey& key, | 977 const GrEffectKey& key, |
| 978 const char* outputColor, | 978 const char* outputColor, |
| 979 const char* inputColor, | 979 const char* inputColor, |
| 980 const TransformedCoordsArray&, | 980 const TransformedCoordsArray&, |
| 981 const TextureSamplerArray&) SK_OVERRIDE; | 981 const TextureSamplerArray&) SK_OVERRIDE; |
| 982 | 982 |
| 983 virtual void setData(const GrGLProgramDataManager&, const GrEffect&) SK_OVER
RIDE; | 983 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_
OVERRIDE; |
| 984 | 984 |
| 985 private: | 985 private: |
| 986 GrGLProgramDataManager::UniformHandle fProxyRectUniform; | 986 GrGLProgramDataManager::UniformHandle fProxyRectUniform; |
| 987 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; | 987 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; |
| 988 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; | 988 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; |
| 989 typedef GrGLEffect INHERITED; | 989 typedef GrGLEffect INHERITED; |
| 990 }; | 990 }; |
| 991 | 991 |
| 992 GrGLRRectBlurEffect::GrGLRRectBlurEffect(const GrBackendEffectFactory& factory, | 992 GrGLRRectBlurEffect::GrGLRRectBlurEffect(const GrBackendEffectFactory& factory, |
| 993 const GrEffect& effect) | 993 const GrDrawEffect& drawEffect) |
| 994 : INHERITED (factory) { | 994 : INHERITED (factory) { |
| 995 } | 995 } |
| 996 | 996 |
| 997 void GrGLRRectBlurEffect::emitCode(GrGLProgramBuilder* builder, | 997 void GrGLRRectBlurEffect::emitCode(GrGLProgramBuilder* builder, |
| 998 const GrEffect& effect, | 998 const GrDrawEffect& drawEffect, |
| 999 const GrEffectKey& key, | 999 const GrEffectKey& key, |
| 1000 const char* outputColor, | 1000 const char* outputColor, |
| 1001 const char* inputColor, | 1001 const char* inputColor, |
| 1002 const TransformedCoordsArray&, | 1002 const TransformedCoordsArray&, |
| 1003 const TextureSamplerArray& samplers) { | 1003 const TextureSamplerArray& samplers) { |
| 1004 const char *rectName; | 1004 const char *rectName; |
| 1005 const char *cornerRadiusName; | 1005 const char *cornerRadiusName; |
| 1006 const char *blurRadiusName; | 1006 const char *blurRadiusName; |
| 1007 | 1007 |
| 1008 // The proxy rect has left, top, right, and bottom edges correspond to | 1008 // The proxy rect has left, top, right, and bottom edges correspond to |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 | 1045 |
| 1046 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n"); | 1046 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n"); |
| 1047 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n
"); | 1047 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n
"); |
| 1048 | 1048 |
| 1049 fsBuilder->codeAppendf("\t%s = ", outputColor); | 1049 fsBuilder->codeAppendf("\t%s = ", outputColor); |
| 1050 fsBuilder->appendTextureLookupAndModulate(inputColor, samplers[0], "texCoord
"); | 1050 fsBuilder->appendTextureLookupAndModulate(inputColor, samplers[0], "texCoord
"); |
| 1051 fsBuilder->codeAppend(";\n"); | 1051 fsBuilder->codeAppend(";\n"); |
| 1052 } | 1052 } |
| 1053 | 1053 |
| 1054 void GrGLRRectBlurEffect::setData(const GrGLProgramDataManager& pdman, | 1054 void GrGLRRectBlurEffect::setData(const GrGLProgramDataManager& pdman, |
| 1055 const GrEffect& effect) { | 1055 const GrDrawEffect& drawEffect) { |
| 1056 const GrRRectBlurEffect& brre = effect.cast<GrRRectBlurEffect>(); | 1056 const GrRRectBlurEffect& brre = drawEffect.castEffect<GrRRectBlurEffect>(); |
| 1057 SkRRect rrect = brre.getRRect(); | 1057 SkRRect rrect = brre.getRRect(); |
| 1058 | 1058 |
| 1059 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); | 1059 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); |
| 1060 pdman.set1f(fBlurRadiusUniform, blurRadius); | 1060 pdman.set1f(fBlurRadiusUniform, blurRadius); |
| 1061 | 1061 |
| 1062 SkRect rect = rrect.getBounds(); | 1062 SkRect rect = rrect.getBounds(); |
| 1063 rect.outset(blurRadius, blurRadius); | 1063 rect.outset(blurRadius, blurRadius); |
| 1064 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot
tom); | 1064 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot
tom); |
| 1065 | 1065 |
| 1066 SkScalar radius = 0; | 1066 SkScalar radius = 0; |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1219 } else { | 1219 } else { |
| 1220 str->append("None"); | 1220 str->append("None"); |
| 1221 } | 1221 } |
| 1222 str->append("))"); | 1222 str->append("))"); |
| 1223 } | 1223 } |
| 1224 #endif | 1224 #endif |
| 1225 | 1225 |
| 1226 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1226 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
| 1227 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1227 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
| 1228 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1228 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |