| 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 20 matching lines...) Expand all Loading... |
| 31 | 31 |
| 32 SkScalar SkBlurMaskFilter::ConvertRadiusToSigma(SkScalar radius) { | 32 SkScalar SkBlurMaskFilter::ConvertRadiusToSigma(SkScalar radius) { |
| 33 return SkBlurMask::ConvertRadiusToSigma(radius); | 33 return SkBlurMask::ConvertRadiusToSigma(radius); |
| 34 } | 34 } |
| 35 | 35 |
| 36 class SkBlurMaskFilterImpl : public SkMaskFilter { | 36 class SkBlurMaskFilterImpl : public SkMaskFilter { |
| 37 public: | 37 public: |
| 38 SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, uint32_t flags); | 38 SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, uint32_t flags); |
| 39 | 39 |
| 40 // overrides from SkMaskFilter | 40 // overrides from SkMaskFilter |
| 41 SkMask::Format getFormat() const SK_OVERRIDE; | 41 SkMask::Format getFormat() const override; |
| 42 virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, | 42 virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, |
| 43 SkIPoint* margin) const SK_OVERRIDE; | 43 SkIPoint* margin) const override; |
| 44 | 44 |
| 45 #if SK_SUPPORT_GPU | 45 #if SK_SUPPORT_GPU |
| 46 virtual bool canFilterMaskGPU(const SkRect& devBounds, | 46 virtual bool canFilterMaskGPU(const SkRect& devBounds, |
| 47 const SkIRect& clipBounds, | 47 const SkIRect& clipBounds, |
| 48 const SkMatrix& ctm, | 48 const SkMatrix& ctm, |
| 49 SkRect* maskRect) const SK_OVERRIDE; | 49 SkRect* maskRect) const override; |
| 50 virtual bool directFilterMaskGPU(GrContext* context, | 50 virtual bool directFilterMaskGPU(GrContext* context, |
| 51 GrRenderTarget* rt, | 51 GrRenderTarget* rt, |
| 52 GrPaint* grp, | 52 GrPaint* grp, |
| 53 const GrClip&, | 53 const GrClip&, |
| 54 const SkMatrix& viewMatrix, | 54 const SkMatrix& viewMatrix, |
| 55 const SkStrokeRec& strokeRec, | 55 const SkStrokeRec& strokeRec, |
| 56 const SkPath& path) const SK_OVERRIDE; | 56 const SkPath& path) const override; |
| 57 virtual bool directFilterRRectMaskGPU(GrContext* context, | 57 virtual bool directFilterRRectMaskGPU(GrContext* context, |
| 58 GrRenderTarget* rt, | 58 GrRenderTarget* rt, |
| 59 GrPaint* grp, | 59 GrPaint* grp, |
| 60 const GrClip&, | 60 const GrClip&, |
| 61 const SkMatrix& viewMatrix, | 61 const SkMatrix& viewMatrix, |
| 62 const SkStrokeRec& strokeRec, | 62 const SkStrokeRec& strokeRec, |
| 63 const SkRRect& rrect) const SK_OVERRID
E; | 63 const SkRRect& rrect) const override; |
| 64 | 64 |
| 65 virtual bool filterMaskGPU(GrTexture* src, | 65 virtual bool filterMaskGPU(GrTexture* src, |
| 66 const SkMatrix& ctm, | 66 const SkMatrix& ctm, |
| 67 const SkRect& maskRect, | 67 const SkRect& maskRect, |
| 68 GrTexture** result, | 68 GrTexture** result, |
| 69 bool canOverwriteSrc) const SK_OVERRIDE; | 69 bool canOverwriteSrc) const override; |
| 70 #endif | 70 #endif |
| 71 | 71 |
| 72 void computeFastBounds(const SkRect&, SkRect*) const SK_OVERRIDE; | 72 void computeFastBounds(const SkRect&, SkRect*) const override; |
| 73 bool asABlur(BlurRec*) const SK_OVERRIDE; | 73 bool asABlur(BlurRec*) const override; |
| 74 | 74 |
| 75 SK_TO_STRING_OVERRIDE() | 75 SK_TO_STRING_OVERRIDE() |
| 76 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurMaskFilterImpl) | 76 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurMaskFilterImpl) |
| 77 | 77 |
| 78 protected: | 78 protected: |
| 79 virtual FilterReturn filterRectsToNine(const SkRect[], int count, const SkMa
trix&, | 79 virtual FilterReturn filterRectsToNine(const SkRect[], int count, const SkMa
trix&, |
| 80 const SkIRect& clipBounds, | 80 const SkIRect& clipBounds, |
| 81 NinePatch*) const SK_OVERRIDE; | 81 NinePatch*) const override; |
| 82 | 82 |
| 83 virtual FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&, | 83 virtual FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&, |
| 84 const SkIRect& clipBounds, | 84 const SkIRect& clipBounds, |
| 85 NinePatch*) const SK_OVERRIDE; | 85 NinePatch*) const override; |
| 86 | 86 |
| 87 bool filterRectMask(SkMask* dstM, const SkRect& r, const SkMatrix& matrix, | 87 bool filterRectMask(SkMask* dstM, const SkRect& r, const SkMatrix& matrix, |
| 88 SkIPoint* margin, SkMask::CreateMode createMode) const; | 88 SkIPoint* margin, SkMask::CreateMode createMode) const; |
| 89 bool filterRRectMask(SkMask* dstM, const SkRRect& r, const SkMatrix& matrix, | 89 bool filterRRectMask(SkMask* dstM, const SkRRect& r, const SkMatrix& matrix, |
| 90 SkIPoint* margin, SkMask::CreateMode createMode) const; | 90 SkIPoint* margin, SkMask::CreateMode createMode) const; |
| 91 | 91 |
| 92 private: | 92 private: |
| 93 // To avoid unseemly allocation requests (esp. for finite platforms like | 93 // To avoid unseemly allocation requests (esp. for finite platforms like |
| 94 // handset) we limit the radius so something manageable. (as opposed to | 94 // handset) we limit the radius so something manageable. (as opposed to |
| 95 // a request like 10,000) | 95 // a request like 10,000) |
| 96 static const SkScalar kMAX_BLUR_SIGMA; | 96 static const SkScalar kMAX_BLUR_SIGMA; |
| 97 | 97 |
| 98 SkScalar fSigma; | 98 SkScalar fSigma; |
| 99 SkBlurStyle fBlurStyle; | 99 SkBlurStyle fBlurStyle; |
| 100 uint32_t fBlurFlags; | 100 uint32_t fBlurFlags; |
| 101 | 101 |
| 102 SkBlurQuality getQuality() const { | 102 SkBlurQuality getQuality() const { |
| 103 return (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? | 103 return (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? |
| 104 kHigh_SkBlurQuality : kLow_SkBlurQuality; | 104 kHigh_SkBlurQuality : kLow_SkBlurQuality; |
| 105 } | 105 } |
| 106 | 106 |
| 107 SkBlurMaskFilterImpl(SkReadBuffer&); | 107 SkBlurMaskFilterImpl(SkReadBuffer&); |
| 108 void flatten(SkWriteBuffer&) const SK_OVERRIDE; | 108 void flatten(SkWriteBuffer&) const override; |
| 109 | 109 |
| 110 SkScalar computeXformedSigma(const SkMatrix& ctm) const { | 110 SkScalar computeXformedSigma(const SkMatrix& ctm) const { |
| 111 bool ignoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTr
ansform_BlurFlag); | 111 bool ignoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTr
ansform_BlurFlag); |
| 112 | 112 |
| 113 SkScalar xformedSigma = ignoreTransform ? fSigma : ctm.mapRadius(fSigma)
; | 113 SkScalar xformedSigma = ignoreTransform ? fSigma : ctm.mapRadius(fSigma)
; |
| 114 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); | 114 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); |
| 115 } | 115 } |
| 116 | 116 |
| 117 friend class SkBlurMaskFilter; | 117 friend class SkBlurMaskFilter; |
| 118 | 118 |
| (...skipping 481 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 const char* name() const SK_OVERRIDE { return "RectBlur"; } | 610 const char* name() const 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 override; |
| 614 | 614 |
| 615 GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; | 615 GrGLFragmentProcessor* createGLInstance() const 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 bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; | 644 bool onIsEqual(const GrFragmentProcessor&) const override; |
| 645 | 645 |
| 646 void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE; | 646 void onComputeInvariantOutput(GrInvariantOutput* inout) const 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&) override; |
| 669 | 669 |
| 670 void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE; | 670 void setData(const GrGLProgramDataManager&, const GrProcessor&) 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(rt, clip, *grp, SkMatrix::I(), rect, i
nverse); | 869 context->drawNonAARectWithLocalMatrix(rt, clip, *grp, SkMatrix::I(), rect, i
nverse); |
| 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 const char* name() const SK_OVERRIDE { return "GrRRectBlur"; } | 879 const char* name() const 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 override; |
| 886 | 886 |
| 887 GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; | 887 GrGLFragmentProcessor* createGLInstance() const 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 bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE; | 892 bool onIsEqual(const GrFragmentProcessor& other) const override; |
| 893 | 893 |
| 894 void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE; | 894 void onComputeInvariantOutput(GrInvariantOutput* inout) const 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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 | 1013 |
| 1014 class GrGLRRectBlurEffect : public GrGLFragmentProcessor { | 1014 class GrGLRRectBlurEffect : public GrGLFragmentProcessor { |
| 1015 public: | 1015 public: |
| 1016 GrGLRRectBlurEffect(const GrProcessor&) {} | 1016 GrGLRRectBlurEffect(const GrProcessor&) {} |
| 1017 | 1017 |
| 1018 virtual void emitCode(GrGLFPBuilder*, | 1018 virtual void emitCode(GrGLFPBuilder*, |
| 1019 const GrFragmentProcessor&, | 1019 const GrFragmentProcessor&, |
| 1020 const char* outputColor, | 1020 const char* outputColor, |
| 1021 const char* inputColor, | 1021 const char* inputColor, |
| 1022 const TransformedCoordsArray&, | 1022 const TransformedCoordsArray&, |
| 1023 const TextureSamplerArray&) SK_OVERRIDE; | 1023 const TextureSamplerArray&) override; |
| 1024 | 1024 |
| 1025 void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE; | 1025 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |
| 1026 | 1026 |
| 1027 private: | 1027 private: |
| 1028 GrGLProgramDataManager::UniformHandle fProxyRectUniform; | 1028 GrGLProgramDataManager::UniformHandle fProxyRectUniform; |
| 1029 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; | 1029 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; |
| 1030 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; | 1030 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; |
| 1031 typedef GrGLFragmentProcessor INHERITED; | 1031 typedef GrGLFragmentProcessor INHERITED; |
| 1032 }; | 1032 }; |
| 1033 | 1033 |
| 1034 void GrGLRRectBlurEffect::emitCode(GrGLFPBuilder* builder, | 1034 void GrGLRRectBlurEffect::emitCode(GrGLFPBuilder* builder, |
| 1035 const GrFragmentProcessor&, | 1035 const GrFragmentProcessor&, |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1265 } else { | 1265 } else { |
| 1266 str->append("None"); | 1266 str->append("None"); |
| 1267 } | 1267 } |
| 1268 str->append("))"); | 1268 str->append("))"); |
| 1269 } | 1269 } |
| 1270 #endif | 1270 #endif |
| 1271 | 1271 |
| 1272 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1272 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
| 1273 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1273 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
| 1274 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1274 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |