From: Mike Reed Date: Sun, 26 Feb 2017 03:34:32 +0000 (-0500) Subject: begin to hide details of SkPathEffect X-Git-Tag: accepted/tizen/5.0/unified/20181102.025319~55^2~72 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a07741a75aa694c0e7c00c2301c9de2daf9b5f9e;p=platform%2Fupstream%2FlibSkiaSharp.git begin to hide details of SkPathEffect BUG=skia: Change-Id: I155d2370ae894e6000b6a768d02cf06bf5b3de6e Reviewed-on: https://skia-review.googlesource.com/8977 Reviewed-by: Mike Reed Commit-Queue: Mike Reed --- diff --git a/fuzz/FilterFuzz.cpp b/fuzz/FilterFuzz.cpp index bd9e5fd..312f932 100644 --- a/fuzz/FilterFuzz.cpp +++ b/fuzz/FilterFuzz.cpp @@ -424,7 +424,7 @@ static sk_sp make_path_effect(bool canBeNull = true) { case 1: { sk_sp a = make_path_effect(false); sk_sp 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 make_path_effect(bool canBeNull = true) { default: { sk_sp a = make_path_effect(false); sk_sp 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 9a1f62d..744817a 100644 --- a/gm/patheffects.cpp +++ b/gm/patheffects.cpp @@ -20,7 +20,7 @@ static void compose_pe(SkPaint* paint) { sk_sp corner = SkCornerPathEffect::Make(25); sk_sp 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 386cba3..34f7899 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 ff3fa01..62f8993 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 MakeSum(sk_sp first, sk_sp second); + static sk_sp MakeCompose(sk_sp outer, sk_sp 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 f4b9ef9..2fa7a54 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 a098eb6..37a0c4b 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 shaderTest() { diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp index d90476a..5524f1e 100644 --- a/samplecode/SampleFilterFuzz.cpp +++ b/samplecode/SampleFilterFuzz.cpp @@ -422,7 +422,7 @@ static sk_sp 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 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 1f9915d..3d9ba9c 100644 --- a/samplecode/SamplePathEffects.cpp +++ b/samplecode/SamplePathEffects.cpp @@ -45,7 +45,7 @@ static sk_sp 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 make_warp_pe(SkScalar phase) { @@ -61,7 +61,7 @@ static sk_sp 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 c1c49b4..2322c24 100644 --- a/samplecode/SampleSlides.cpp +++ b/samplecode/SampleSlides.cpp @@ -34,7 +34,7 @@ static void compose_pe(SkPaint* paint) { sk_sp corner = SkCornerPathEffect::Make(25); sk_sp 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 6f8f8d6..298357e 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 1178348..6f953c5 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 pe0, sk_sp pe1); + + void flatten(SkWriteBuffer&) const override; + + // these are visible to our subclasses + sk_sp fPE0; + sk_sp 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 Make(sk_sp outer, sk_sp inner) { + if (!outer) { + return inner; + } + if (!inner) { + return outer; + } + return sk_sp(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 outer, sk_sp 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 Make(sk_sp first, sk_sp second) { + if (!first) { + return second; + } + if (!second) { + return first; + } + return sk_sp(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 first, sk_sp second) + : INHERITED(first, second) {} + +private: + // illegal + SkSumPathEffect(const SkSumPathEffect&); + SkSumPathEffect& operator=(const SkSumPathEffect&); + friend class SkPathEffect; + + typedef SkPairPathEffect INHERITED; +}; +#endif + SkPairPathEffect::SkPairPathEffect(sk_sp pe0, sk_sp 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::MakeSum(sk_sp first, sk_sp second) { + return SkSumPathEffect::Make(std::move(first), std::move(second)); +} + +sk_sp SkPathEffect::MakeCompose(sk_sp outer, + sk_sp 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 60213bd..97d3b67 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();