diff options
author | Mike Reed <reed@google.com> | 2017-02-25 22:34:32 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-02-26 18:36:11 +0000 |
commit | a07741a75aa694c0e7c00c2301c9de2daf9b5f9e (patch) | |
tree | 88b0e9edea463244040c89a91587c9db57165c73 | |
parent | eb090ef4569dcd73dfd49e64ca2f4f733fbf27bc (diff) |
begin to hide details of SkPathEffect
BUG=skia:
Change-Id: I155d2370ae894e6000b6a768d02cf06bf5b3de6e
Reviewed-on: https://skia-review.googlesource.com/8977
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
-rw-r--r-- | fuzz/FilterFuzz.cpp | 4 | ||||
-rw-r--r-- | gm/patheffects.cpp | 2 | ||||
-rw-r--r-- | gn/android_framework_defines.gni | 1 | ||||
-rw-r--r-- | include/core/SkPathEffect.h | 12 | ||||
-rw-r--r-- | public.bzl | 1 | ||||
-rw-r--r-- | samplecode/SampleAll.cpp | 2 | ||||
-rw-r--r-- | samplecode/SampleFilterFuzz.cpp | 4 | ||||
-rw-r--r-- | samplecode/SamplePathEffects.cpp | 4 | ||||
-rw-r--r-- | samplecode/SampleSlides.cpp | 2 | ||||
-rw-r--r-- | src/core/SkGlobalInitialization_core.cpp | 7 | ||||
-rw-r--r-- | src/core/SkPathEffect.cpp | 131 | ||||
-rw-r--r-- | src/ports/SkGlobalInitialization_default.cpp | 1 |
12 files changed, 153 insertions, 18 deletions
diff --git a/fuzz/FilterFuzz.cpp b/fuzz/FilterFuzz.cpp index bd9e5fde8f..312f9321d4 100644 --- a/fuzz/FilterFuzz.cpp +++ b/fuzz/FilterFuzz.cpp @@ -424,7 +424,7 @@ static sk_sp<SkPathEffect> make_path_effect(bool canBeNull = true) { case 1: { sk_sp<SkPathEffect> a = make_path_effect(false); sk_sp<SkPathEffect> b = make_path_effect(false); - pathEffect = SkComposePathEffect::Make(a, b); + pathEffect = SkPathEffect::MakeCompose(a, b); break; } case 2: { @@ -473,7 +473,7 @@ static sk_sp<SkPathEffect> make_path_effect(bool canBeNull = true) { default: { sk_sp<SkPathEffect> a = make_path_effect(false); sk_sp<SkPathEffect> b = make_path_effect(false); - pathEffect = SkSumPathEffect::Make(a, b); + pathEffect = SkPathEffect::MakeCompose(a, b); break; } } diff --git a/gm/patheffects.cpp b/gm/patheffects.cpp index 9a1f62d7c8..744817a489 100644 --- a/gm/patheffects.cpp +++ b/gm/patheffects.cpp @@ -20,7 +20,7 @@ static void compose_pe(SkPaint* paint) { sk_sp<SkPathEffect> corner = SkCornerPathEffect::Make(25); sk_sp<SkPathEffect> compose; if (pe) { - compose = SkComposePathEffect::Make(sk_ref_sp(pe), corner); + compose = SkPathEffect::MakeCompose(sk_ref_sp(pe), corner); } else { compose = corner; } diff --git a/gn/android_framework_defines.gni b/gn/android_framework_defines.gni index 386cba35d8..34f78992b3 100644 --- a/gn/android_framework_defines.gni +++ b/gn/android_framework_defines.gni @@ -18,4 +18,5 @@ android_framework_defines = [ "SK_SUPPORT_EXOTIC_CLIPOPS", "SK_SUPPORT_LEGACY_CANVAS_HELPERS", "SK_SUPPORT_LEGACY_PAINT_TEXTDECORATION", + "SK_SUPPORT_LEGACY_PATHEFFECT_SUBCLASSES", ] diff --git a/include/core/SkPathEffect.h b/include/core/SkPathEffect.h index ff3fa01f36..62f8993354 100644 --- a/include/core/SkPathEffect.h +++ b/include/core/SkPathEffect.h @@ -1,4 +1,3 @@ - /* * Copyright 2006 The Android Open Source Project * @@ -6,7 +5,6 @@ * found in the LICENSE file. */ - #ifndef SkPathEffect_DEFINED #define SkPathEffect_DEFINED @@ -28,6 +26,9 @@ class SkStrokeRec; */ class SK_API SkPathEffect : public SkFlattenable { public: + static sk_sp<SkPathEffect> MakeSum(sk_sp<SkPathEffect> first, sk_sp<SkPathEffect> second); + static sk_sp<SkPathEffect> MakeCompose(sk_sp<SkPathEffect> outer, sk_sp<SkPathEffect> inner); + /** * Given a src path (input) and a stroke-rec (input and output), apply * this effect to the src path, returning the new path in dst, and return @@ -138,6 +139,8 @@ public: virtual bool exposedInAndroidJavaAPI() const { return false; } #endif + SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() + protected: SkPathEffect() {} @@ -149,6 +152,8 @@ private: typedef SkFlattenable INHERITED; }; +#ifdef SK_SUPPORT_LEGACY_PATHEFFECT_SUBCLASSES + /** \class SkPairPathEffect Common baseclass for Compose and Sum. This subclass manages two pathEffects, @@ -211,6 +216,7 @@ private: // illegal SkComposePathEffect(const SkComposePathEffect&); SkComposePathEffect& operator=(const SkComposePathEffect&); + friend class SkPathEffect; typedef SkPairPathEffect INHERITED; }; @@ -255,8 +261,10 @@ private: // illegal SkSumPathEffect(const SkSumPathEffect&); SkSumPathEffect& operator=(const SkSumPathEffect&); + friend class SkPathEffect; typedef SkPairPathEffect INHERITED; }; +#endif #endif diff --git a/public.bzl b/public.bzl index f4b9ef9b00..2fa7a54573 100644 --- a/public.bzl +++ b/public.bzl @@ -599,6 +599,7 @@ DEFINES_ALL = [ "SK_NO_ANALYTIC_AA", "SK_SUPPORT_LEGACY_BITMAP_SETPIXELREF", "SK_SUPPORT_LEGACY_CLIPOP_EXOTIC_NAMES", + "SK_SUPPORT_LEGACY_PATHEFFECT_SUBCLASSES", ] ################################################################################ diff --git a/samplecode/SampleAll.cpp b/samplecode/SampleAll.cpp index a098eb6c16..37a0c4b871 100644 --- a/samplecode/SampleAll.cpp +++ b/samplecode/SampleAll.cpp @@ -490,7 +490,7 @@ protected: gPhase, SkPath1DPathEffect::kRotate_Style); auto inner = SkDiscretePathEffect::Make(SkIntToScalar(2), SkIntToScalar(1)/10); // SkCornerPathEffect(SkIntToScalar(2)); - return SkComposePathEffect::Make(outer, inner); + return SkPathEffect::MakeCompose(outer, inner); } sk_sp<SkShader> shaderTest() { diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp index d90476aef7..5524f1e852 100644 --- a/samplecode/SampleFilterFuzz.cpp +++ b/samplecode/SampleFilterFuzz.cpp @@ -422,7 +422,7 @@ static sk_sp<SkPathEffect> make_path_effect(bool canBeNull = true) { pathEffect = SkArcToPathEffect::Make(make_scalar(true)); break; case 1: - pathEffect = SkComposePathEffect::Make(make_path_effect(false), + pathEffect = SkPathEffect::MakeCompose(make_path_effect(false), make_path_effect(false)); break; case 2: @@ -452,7 +452,7 @@ static sk_sp<SkPathEffect> make_path_effect(bool canBeNull = true) { break; case 8: default: - pathEffect = SkSumPathEffect::Make(make_path_effect(false), + pathEffect = SkPathEffect::MakeSum(make_path_effect(false), make_path_effect(false)); break; } diff --git a/samplecode/SamplePathEffects.cpp b/samplecode/SamplePathEffects.cpp index 1f9915d378..3d9ba9cb36 100644 --- a/samplecode/SamplePathEffects.cpp +++ b/samplecode/SamplePathEffects.cpp @@ -45,7 +45,7 @@ static sk_sp<SkPathEffect> make_pe(int flags, SkScalar phase) { auto inner = SkCornerPathEffect::Make(SkIntToScalar(CORNER_RADIUS)); - return SkComposePathEffect::Make(outer, inner); + return SkPathEffect::MakeCompose(outer, inner); } static sk_sp<SkPathEffect> make_warp_pe(SkScalar phase) { @@ -61,7 +61,7 @@ static sk_sp<SkPathEffect> make_warp_pe(SkScalar phase) { path, 12, phase, SkPath1DPathEffect::kMorph_Style); auto inner = SkCornerPathEffect::Make(SkIntToScalar(CORNER_RADIUS)); - return SkComposePathEffect::Make(outer, inner); + return SkPathEffect::MakeCompose(outer, inner); } /////////////////////////////////////////////////////////// diff --git a/samplecode/SampleSlides.cpp b/samplecode/SampleSlides.cpp index c1c49b4ab1..2322c24446 100644 --- a/samplecode/SampleSlides.cpp +++ b/samplecode/SampleSlides.cpp @@ -34,7 +34,7 @@ static void compose_pe(SkPaint* paint) { sk_sp<SkPathEffect> corner = SkCornerPathEffect::Make(25); sk_sp<SkPathEffect> compose; if (pe) { - compose = SkComposePathEffect::Make(sk_ref_sp(pe), corner); + compose = SkPathEffect::MakeCompose(sk_ref_sp(pe), corner); } else { compose = corner; } diff --git a/src/core/SkGlobalInitialization_core.cpp b/src/core/SkGlobalInitialization_core.cpp index 6f8f8d67b2..298357eb78 100644 --- a/src/core/SkGlobalInitialization_core.cpp +++ b/src/core/SkGlobalInitialization_core.cpp @@ -36,18 +36,13 @@ void SkFlattenable::PrivateInitializer::InitCore() { SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLocalMatrixShader) SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPictureShader) - // PathEffect - SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkComposePathEffect) // ImageFilter SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkMatrixImageFilter) - // ColorFilter SkColorFilter::InitializeFlattenables(); - + SkPathEffect::InitializeFlattenables(); SkShader::InitializeFlattenables(); - - // Xfermode SkXfermode::InitializeFlattenables(); // Drawable diff --git a/src/core/SkPathEffect.cpp b/src/core/SkPathEffect.cpp index 1178348af5..6f953c5934 100644 --- a/src/core/SkPathEffect.cpp +++ b/src/core/SkPathEffect.cpp @@ -27,6 +27,121 @@ SkPathEffect::DashType SkPathEffect::asADash(DashInfo* info) const { /////////////////////////////////////////////////////////////////////////////// +#ifndef SK_SUPPORT_LEGACY_PATHEFFECT_SUBCLASSES + +/** \class SkPairPathEffect + + Common baseclass for Compose and Sum. This subclass manages two pathEffects, + including flattening them. It does nothing in filterPath, and is only useful + for managing the lifetimes of its two arguments. + */ +class SK_API SkPairPathEffect : public SkPathEffect { +protected: + SkPairPathEffect(sk_sp<SkPathEffect> pe0, sk_sp<SkPathEffect> pe1); + + void flatten(SkWriteBuffer&) const override; + + // these are visible to our subclasses + sk_sp<SkPathEffect> fPE0; + sk_sp<SkPathEffect> fPE1; + + SK_TO_STRING_OVERRIDE() + +private: + typedef SkPathEffect INHERITED; +}; + +/** \class SkComposePathEffect + + This subclass of SkPathEffect composes its two arguments, to create + a compound pathEffect. + */ +class SK_API SkComposePathEffect : public SkPairPathEffect { +public: + /** Construct a pathEffect whose effect is to apply first the inner pathEffect + and the the outer pathEffect (e.g. outer(inner(path))) + The reference counts for outer and inner are both incremented in the constructor, + and decremented in the destructor. + */ + static sk_sp<SkPathEffect> Make(sk_sp<SkPathEffect> outer, sk_sp<SkPathEffect> inner) { + if (!outer) { + return inner; + } + if (!inner) { + return outer; + } + return sk_sp<SkPathEffect>(new SkComposePathEffect(outer, inner)); + } + + virtual bool filterPath(SkPath* dst, const SkPath& src, + SkStrokeRec*, const SkRect*) const override; + + SK_TO_STRING_OVERRIDE() + SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposePathEffect) + +#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK + bool exposedInAndroidJavaAPI() const override { return true; } +#endif + +protected: + SkComposePathEffect(sk_sp<SkPathEffect> outer, sk_sp<SkPathEffect> inner) + : INHERITED(outer, inner) {} + +private: + // illegal + SkComposePathEffect(const SkComposePathEffect&); + SkComposePathEffect& operator=(const SkComposePathEffect&); + friend class SkPathEffect; + + typedef SkPairPathEffect INHERITED; +}; + +/** \class SkSumPathEffect + + This subclass of SkPathEffect applies two pathEffects, one after the other. + Its filterPath() returns true if either of the effects succeeded. + */ +class SK_API SkSumPathEffect : public SkPairPathEffect { +public: + /** Construct a pathEffect whose effect is to apply two effects, in sequence. + (e.g. first(path) + second(path)) + The reference counts for first and second are both incremented in the constructor, + and decremented in the destructor. + */ + static sk_sp<SkPathEffect> Make(sk_sp<SkPathEffect> first, sk_sp<SkPathEffect> second) { + if (!first) { + return second; + } + if (!second) { + return first; + } + return sk_sp<SkPathEffect>(new SkSumPathEffect(first, second)); + } + + virtual bool filterPath(SkPath* dst, const SkPath& src, + SkStrokeRec*, const SkRect*) const override; + + SK_TO_STRING_OVERRIDE() + SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSumPathEffect) + +#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK + bool exposedInAndroidJavaAPI() const override { return true; } +#endif + +protected: + SkSumPathEffect(sk_sp<SkPathEffect> first, sk_sp<SkPathEffect> second) + : INHERITED(first, second) {} + +private: + // illegal + SkSumPathEffect(const SkSumPathEffect&); + SkSumPathEffect& operator=(const SkSumPathEffect&); + friend class SkPathEffect; + + typedef SkPairPathEffect INHERITED; +}; +#endif + SkPairPathEffect::SkPairPathEffect(sk_sp<SkPathEffect> pe0, sk_sp<SkPathEffect> pe1) : fPE0(std::move(pe0)), fPE1(std::move(pe1)) { @@ -106,3 +221,19 @@ void SkSumPathEffect::toString(SkString* str) const { str->appendf(")"); } #endif + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +sk_sp<SkPathEffect> SkPathEffect::MakeSum(sk_sp<SkPathEffect> first, sk_sp<SkPathEffect> second) { + return SkSumPathEffect::Make(std::move(first), std::move(second)); +} + +sk_sp<SkPathEffect> SkPathEffect::MakeCompose(sk_sp<SkPathEffect> outer, + sk_sp<SkPathEffect> inner) { + return SkComposePathEffect::Make(std::move(outer), std::move(inner)); +} + +SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkPathEffect) + SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkComposePathEffect) + SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSumPathEffect) +SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END diff --git a/src/ports/SkGlobalInitialization_default.cpp b/src/ports/SkGlobalInitialization_default.cpp index 60213bdb3a..97d3b671e6 100644 --- a/src/ports/SkGlobalInitialization_default.cpp +++ b/src/ports/SkGlobalInitialization_default.cpp @@ -104,7 +104,6 @@ void SkFlattenable::PrivateInitializer::InitEffects() { SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPath1DPathEffect) SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLine2DPathEffect) SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPath2DPathEffect) - SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSumPathEffect) // ImageFilter SkImageFilter::InitializeFlattenables(); |