aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-02-25 22:34:32 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-02-26 18:36:11 +0000
commita07741a75aa694c0e7c00c2301c9de2daf9b5f9e (patch)
tree88b0e9edea463244040c89a91587c9db57165c73
parenteb090ef4569dcd73dfd49e64ca2f4f733fbf27bc (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.cpp4
-rw-r--r--gm/patheffects.cpp2
-rw-r--r--gn/android_framework_defines.gni1
-rw-r--r--include/core/SkPathEffect.h12
-rw-r--r--public.bzl1
-rw-r--r--samplecode/SampleAll.cpp2
-rw-r--r--samplecode/SampleFilterFuzz.cpp4
-rw-r--r--samplecode/SamplePathEffects.cpp4
-rw-r--r--samplecode/SampleSlides.cpp2
-rw-r--r--src/core/SkGlobalInitialization_core.cpp7
-rw-r--r--src/core/SkPathEffect.cpp131
-rw-r--r--src/ports/SkGlobalInitialization_default.cpp1
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();