| 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 21 matching lines...) Expand all Loading... |
| 32 | 32 |
| 33 SkScalar SkBlurMaskFilter::ConvertRadiusToSigma(SkScalar radius) { | 33 SkScalar SkBlurMaskFilter::ConvertRadiusToSigma(SkScalar radius) { |
| 34 return SkBlurMask::ConvertRadiusToSigma(radius); | 34 return SkBlurMask::ConvertRadiusToSigma(radius); |
| 35 } | 35 } |
| 36 | 36 |
| 37 class SkBlurMaskFilterImpl : public SkMaskFilter { | 37 class SkBlurMaskFilterImpl : public SkMaskFilter { |
| 38 public: | 38 public: |
| 39 SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, uint32_t flags); | 39 SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, uint32_t flags); |
| 40 | 40 |
| 41 // overrides from SkMaskFilter | 41 // overrides from SkMaskFilter |
| 42 virtual SkMask::Format getFormat() const SK_OVERRIDE; | 42 SkMask::Format getFormat() const SK_OVERRIDE; |
| 43 virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, | 43 virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, |
| 44 SkIPoint* margin) const SK_OVERRIDE; | 44 SkIPoint* margin) const SK_OVERRIDE; |
| 45 | 45 |
| 46 #if SK_SUPPORT_GPU | 46 #if SK_SUPPORT_GPU |
| 47 virtual bool canFilterMaskGPU(const SkRect& devBounds, | 47 virtual bool canFilterMaskGPU(const SkRect& devBounds, |
| 48 const SkIRect& clipBounds, | 48 const SkIRect& clipBounds, |
| 49 const SkMatrix& ctm, | 49 const SkMatrix& ctm, |
| 50 SkRect* maskRect) const SK_OVERRIDE; | 50 SkRect* maskRect) const SK_OVERRIDE; |
| 51 virtual bool directFilterMaskGPU(GrContext* context, | 51 virtual bool directFilterMaskGPU(GrContext* context, |
| 52 GrPaint* grp, | 52 GrPaint* grp, |
| 53 const SkMatrix& viewMatrix, | 53 const SkMatrix& viewMatrix, |
| 54 const SkStrokeRec& strokeRec, | 54 const SkStrokeRec& strokeRec, |
| 55 const SkPath& path) const SK_OVERRIDE; | 55 const SkPath& path) const SK_OVERRIDE; |
| 56 virtual bool directFilterRRectMaskGPU(GrContext* context, | 56 virtual bool directFilterRRectMaskGPU(GrContext* context, |
| 57 GrPaint* grp, | 57 GrPaint* grp, |
| 58 const SkMatrix& viewMatrix, | 58 const SkMatrix& viewMatrix, |
| 59 const SkStrokeRec& strokeRec, | 59 const SkStrokeRec& strokeRec, |
| 60 const SkRRect& rrect) const SK_OVERRID
E; | 60 const SkRRect& rrect) const SK_OVERRID
E; |
| 61 | 61 |
| 62 virtual bool filterMaskGPU(GrTexture* src, | 62 virtual bool filterMaskGPU(GrTexture* src, |
| 63 const SkMatrix& ctm, | 63 const SkMatrix& ctm, |
| 64 const SkRect& maskRect, | 64 const SkRect& maskRect, |
| 65 GrTexture** result, | 65 GrTexture** result, |
| 66 bool canOverwriteSrc) const SK_OVERRIDE; | 66 bool canOverwriteSrc) const SK_OVERRIDE; |
| 67 #endif | 67 #endif |
| 68 | 68 |
| 69 virtual void computeFastBounds(const SkRect&, SkRect*) const SK_OVERRIDE; | 69 void computeFastBounds(const SkRect&, SkRect*) const SK_OVERRIDE; |
| 70 virtual bool asABlur(BlurRec*) const SK_OVERRIDE; | 70 bool asABlur(BlurRec*) const SK_OVERRIDE; |
| 71 | 71 |
| 72 SK_TO_STRING_OVERRIDE() | 72 SK_TO_STRING_OVERRIDE() |
| 73 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurMaskFilterImpl) | 73 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurMaskFilterImpl) |
| 74 | 74 |
| 75 protected: | 75 protected: |
| 76 virtual FilterReturn filterRectsToNine(const SkRect[], int count, const SkMa
trix&, | 76 virtual FilterReturn filterRectsToNine(const SkRect[], int count, const SkMa
trix&, |
| 77 const SkIRect& clipBounds, | 77 const SkIRect& clipBounds, |
| 78 NinePatch*) const SK_OVERRIDE; | 78 NinePatch*) const SK_OVERRIDE; |
| 79 | 79 |
| 80 virtual FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&, | 80 virtual FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 95 SkScalar fSigma; | 95 SkScalar fSigma; |
| 96 SkBlurStyle fBlurStyle; | 96 SkBlurStyle fBlurStyle; |
| 97 uint32_t fBlurFlags; | 97 uint32_t fBlurFlags; |
| 98 | 98 |
| 99 SkBlurQuality getQuality() const { | 99 SkBlurQuality getQuality() const { |
| 100 return (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? | 100 return (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? |
| 101 kHigh_SkBlurQuality : kLow_SkBlurQuality; | 101 kHigh_SkBlurQuality : kLow_SkBlurQuality; |
| 102 } | 102 } |
| 103 | 103 |
| 104 SkBlurMaskFilterImpl(SkReadBuffer&); | 104 SkBlurMaskFilterImpl(SkReadBuffer&); |
| 105 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; | 105 void flatten(SkWriteBuffer&) const SK_OVERRIDE; |
| 106 | 106 |
| 107 SkScalar computeXformedSigma(const SkMatrix& ctm) const { | 107 SkScalar computeXformedSigma(const SkMatrix& ctm) const { |
| 108 bool ignoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTr
ansform_BlurFlag); | 108 bool ignoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTr
ansform_BlurFlag); |
| 109 | 109 |
| 110 SkScalar xformedSigma = ignoreTransform ? fSigma : ctm.mapRadius(fSigma)
; | 110 SkScalar xformedSigma = ignoreTransform ? fSigma : ctm.mapRadius(fSigma)
; |
| 111 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); | 111 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); |
| 112 } | 112 } |
| 113 | 113 |
| 114 friend class SkBlurMaskFilter; | 114 friend class SkBlurMaskFilter; |
| 115 | 115 |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 } | 600 } |
| 601 | 601 |
| 602 #if SK_SUPPORT_GPU | 602 #if SK_SUPPORT_GPU |
| 603 | 603 |
| 604 class GrGLRectBlurEffect; | 604 class GrGLRectBlurEffect; |
| 605 | 605 |
| 606 class GrRectBlurEffect : public GrFragmentProcessor { | 606 class GrRectBlurEffect : public GrFragmentProcessor { |
| 607 public: | 607 public: |
| 608 virtual ~GrRectBlurEffect(); | 608 virtual ~GrRectBlurEffect(); |
| 609 | 609 |
| 610 virtual const char* name() const SK_OVERRIDE { return "RectBlur"; } | 610 const char* name() const SK_OVERRIDE { return "RectBlur"; } |
| 611 | 611 |
| 612 virtual void getGLProcessorKey(const GrGLCaps& caps, | 612 virtual void getGLProcessorKey(const GrGLCaps& caps, |
| 613 GrProcessorKeyBuilder* b) const SK_OVERRIDE; | 613 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
| 614 | 614 |
| 615 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; | 615 GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
| 616 | 616 |
| 617 /** | 617 /** |
| 618 * Create a simple filter effect with custom bicubic coefficients. | 618 * Create a simple filter effect with custom bicubic coefficients. |
| 619 */ | 619 */ |
| 620 static GrFragmentProcessor* Create(GrContext *context, const SkRect& rect, f
loat sigma) { | 620 static GrFragmentProcessor* Create(GrContext *context, const SkRect& rect, f
loat sigma) { |
| 621 GrTexture *blurProfileTexture = NULL; | 621 GrTexture *blurProfileTexture = NULL; |
| 622 int doubleProfileSize = SkScalarCeilToInt(12*sigma); | 622 int doubleProfileSize = SkScalarCeilToInt(12*sigma); |
| 623 | 623 |
| 624 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.heigh
t()) { | 624 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.heigh
t()) { |
| 625 // if the blur sigma is too large so the gaussian overlaps the whole | 625 // if the blur sigma is too large so the gaussian overlaps the whole |
| 626 // rect in either direction, fall back to CPU path for now. | 626 // rect in either direction, fall back to CPU path for now. |
| 627 | 627 |
| 628 return NULL; | 628 return NULL; |
| 629 } | 629 } |
| 630 | 630 |
| 631 bool createdBlurProfileTexture = CreateBlurProfileTexture(context, sigma
, &blurProfileTexture); | 631 bool createdBlurProfileTexture = CreateBlurProfileTexture(context, sigma
, &blurProfileTexture); |
| 632 SkAutoTUnref<GrTexture> hunref(blurProfileTexture); | 632 SkAutoTUnref<GrTexture> hunref(blurProfileTexture); |
| 633 if (!createdBlurProfileTexture) { | 633 if (!createdBlurProfileTexture) { |
| 634 return NULL; | 634 return NULL; |
| 635 } | 635 } |
| 636 return SkNEW_ARGS(GrRectBlurEffect, (rect, sigma, blurProfileTexture)); | 636 return SkNEW_ARGS(GrRectBlurEffect, (rect, sigma, blurProfileTexture)); |
| 637 } | 637 } |
| 638 | 638 |
| 639 const SkRect& getRect() const { return fRect; } | 639 const SkRect& getRect() const { return fRect; } |
| 640 float getSigma() const { return fSigma; } | 640 float getSigma() const { return fSigma; } |
| 641 | 641 |
| 642 private: | 642 private: |
| 643 GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blur_profile); | 643 GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blur_profile); |
| 644 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; | 644 bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; |
| 645 | 645 |
| 646 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; | 646 void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE; |
| 647 | 647 |
| 648 static bool CreateBlurProfileTexture(GrContext *context, float sigma, | 648 static bool CreateBlurProfileTexture(GrContext *context, float sigma, |
| 649 GrTexture **blurProfileTexture); | 649 GrTexture **blurProfileTexture); |
| 650 | 650 |
| 651 SkRect fRect; | 651 SkRect fRect; |
| 652 float fSigma; | 652 float fSigma; |
| 653 GrTextureAccess fBlurProfileAccess; | 653 GrTextureAccess fBlurProfileAccess; |
| 654 | 654 |
| 655 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 655 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 656 | 656 |
| 657 typedef GrFragmentProcessor INHERITED; | 657 typedef GrFragmentProcessor INHERITED; |
| 658 }; | 658 }; |
| 659 | 659 |
| 660 class GrGLRectBlurEffect : public GrGLFragmentProcessor { | 660 class GrGLRectBlurEffect : public GrGLFragmentProcessor { |
| 661 public: | 661 public: |
| 662 GrGLRectBlurEffect(const GrProcessor&) {} | 662 GrGLRectBlurEffect(const GrProcessor&) {} |
| 663 virtual void emitCode(GrGLFPBuilder*, | 663 virtual void emitCode(GrGLFPBuilder*, |
| 664 const GrFragmentProcessor&, | 664 const GrFragmentProcessor&, |
| 665 const char* outputColor, | 665 const char* outputColor, |
| 666 const char* inputColor, | 666 const char* inputColor, |
| 667 const TransformedCoordsArray&, | 667 const TransformedCoordsArray&, |
| 668 const TextureSamplerArray&) SK_OVERRIDE; | 668 const TextureSamplerArray&) SK_OVERRIDE; |
| 669 | 669 |
| 670 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 670 void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE; |
| 671 | 671 |
| 672 private: | 672 private: |
| 673 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 673 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
| 674 | 674 |
| 675 UniformHandle fProxyRectUniform; | 675 UniformHandle fProxyRectUniform; |
| 676 UniformHandle fProfileSizeUniform; | 676 UniformHandle fProfileSizeUniform; |
| 677 | 677 |
| 678 typedef GrGLFragmentProcessor INHERITED; | 678 typedef GrGLFragmentProcessor INHERITED; |
| 679 }; | 679 }; |
| 680 | 680 |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 context->drawNonAARectWithLocalMatrix(*grp, SkMatrix::I(), rect, inverse); | 869 context->drawNonAARectWithLocalMatrix(*grp, SkMatrix::I(), rect, inverse); |
| 870 return true; | 870 return true; |
| 871 } | 871 } |
| 872 | 872 |
| 873 class GrRRectBlurEffect : public GrFragmentProcessor { | 873 class GrRRectBlurEffect : public GrFragmentProcessor { |
| 874 public: | 874 public: |
| 875 | 875 |
| 876 static GrFragmentProcessor* Create(GrContext* context, float sigma, const Sk
RRect&); | 876 static GrFragmentProcessor* Create(GrContext* context, float sigma, const Sk
RRect&); |
| 877 | 877 |
| 878 virtual ~GrRRectBlurEffect() {}; | 878 virtual ~GrRRectBlurEffect() {}; |
| 879 virtual const char* name() const SK_OVERRIDE { return "GrRRectBlur"; } | 879 const char* name() const SK_OVERRIDE { return "GrRRectBlur"; } |
| 880 | 880 |
| 881 const SkRRect& getRRect() const { return fRRect; } | 881 const SkRRect& getRRect() const { return fRRect; } |
| 882 float getSigma() const { return fSigma; } | 882 float getSigma() const { return fSigma; } |
| 883 | 883 |
| 884 virtual void getGLProcessorKey(const GrGLCaps& caps, | 884 virtual void getGLProcessorKey(const GrGLCaps& caps, |
| 885 GrProcessorKeyBuilder* b) const SK_OVERRIDE; | 885 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
| 886 | 886 |
| 887 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; | 887 GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
| 888 | 888 |
| 889 private: | 889 private: |
| 890 GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture); | 890 GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture); |
| 891 | 891 |
| 892 virtual bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE; | 892 bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE; |
| 893 | 893 |
| 894 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; | 894 void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE; |
| 895 | 895 |
| 896 SkRRect fRRect; | 896 SkRRect fRRect; |
| 897 float fSigma; | 897 float fSigma; |
| 898 GrTextureAccess fNinePatchAccess; | 898 GrTextureAccess fNinePatchAccess; |
| 899 | 899 |
| 900 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 900 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 901 | 901 |
| 902 typedef GrFragmentProcessor INHERITED; | 902 typedef GrFragmentProcessor INHERITED; |
| 903 }; | 903 }; |
| 904 | 904 |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1017 public: | 1017 public: |
| 1018 GrGLRRectBlurEffect(const GrProcessor&) {} | 1018 GrGLRRectBlurEffect(const GrProcessor&) {} |
| 1019 | 1019 |
| 1020 virtual void emitCode(GrGLFPBuilder*, | 1020 virtual void emitCode(GrGLFPBuilder*, |
| 1021 const GrFragmentProcessor&, | 1021 const GrFragmentProcessor&, |
| 1022 const char* outputColor, | 1022 const char* outputColor, |
| 1023 const char* inputColor, | 1023 const char* inputColor, |
| 1024 const TransformedCoordsArray&, | 1024 const TransformedCoordsArray&, |
| 1025 const TextureSamplerArray&) SK_OVERRIDE; | 1025 const TextureSamplerArray&) SK_OVERRIDE; |
| 1026 | 1026 |
| 1027 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 1027 void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE; |
| 1028 | 1028 |
| 1029 private: | 1029 private: |
| 1030 GrGLProgramDataManager::UniformHandle fProxyRectUniform; | 1030 GrGLProgramDataManager::UniformHandle fProxyRectUniform; |
| 1031 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; | 1031 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; |
| 1032 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; | 1032 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; |
| 1033 typedef GrGLFragmentProcessor INHERITED; | 1033 typedef GrGLFragmentProcessor INHERITED; |
| 1034 }; | 1034 }; |
| 1035 | 1035 |
| 1036 void GrGLRRectBlurEffect::emitCode(GrGLFPBuilder* builder, | 1036 void GrGLRRectBlurEffect::emitCode(GrGLFPBuilder* builder, |
| 1037 const GrFragmentProcessor&, | 1037 const GrFragmentProcessor&, |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 } else { | 1267 } else { |
| 1268 str->append("None"); | 1268 str->append("None"); |
| 1269 } | 1269 } |
| 1270 str->append("))"); | 1270 str->append("))"); |
| 1271 } | 1271 } |
| 1272 #endif | 1272 #endif |
| 1273 | 1273 |
| 1274 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1274 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
| 1275 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1275 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
| 1276 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1276 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |