diff options
author | fmalita <fmalita@chromium.org> | 2016-03-07 09:49:59 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-07 17:51:20 +0000 |
commit | a7a25f02e15c573216139fa6eaf26dfaa2977216 (patch) | |
tree | 597c868622f3da1418a1715ddc13b4aa590e5620 /skia | |
parent | 78fdadc2dfdd59934d9ce56bb8588b2fd11258a3 (diff) | |
download | chromium_src-a7a25f02e15c573216139fa6eaf26dfaa2977216.zip chromium_src-a7a25f02e15c573216139fa6eaf26dfaa2977216.tar.gz chromium_src-a7a25f02e15c573216139fa6eaf26dfaa2977216.tar.bz2 |
Allow sk_sp adoption/sharing into skia::RefPtr
Eventually sk_sp should replace skia::RefPtr, but during the API
transition it helps being able to adopt/share sk_sps.
R=mtklein@google.com,reed@google.com,bungeman@chromium.org,tomhudson@chromium.org
Review URL: https://codereview.chromium.org/1771443002
Cr-Commit-Position: refs/heads/master@{#379583}
Diffstat (limited to 'skia')
-rw-r--r-- | skia/ext/refptr.h | 12 | ||||
-rw-r--r-- | skia/ext/refptr_unittest.cc | 26 |
2 files changed, 38 insertions, 0 deletions
diff --git a/skia/ext/refptr.h b/skia/ext/refptr.h index f528930..a186033 100644 --- a/skia/ext/refptr.h +++ b/skia/ext/refptr.h @@ -139,8 +139,14 @@ class RefPtr { friend RefPtr<U> AdoptRef(U* ptr); template<typename U> + friend RefPtr<U> AdoptRef(sk_sp<U>&&); + + template<typename U> friend RefPtr<U> SharePtr(U* ptr); + template<typename U> + friend RefPtr<U> SharePtr(sk_sp<U>); + template <typename U> friend class RefPtr; }; @@ -149,11 +155,17 @@ class RefPtr { template<typename T> RefPtr<T> AdoptRef(T* ptr) { return RefPtr<T>(ptr); } +template<typename T> +RefPtr<T> AdoptRef(sk_sp<T>&& sp) { return RefPtr<T>(sp.release()); } + // For objects that are already owned. This doesn't take ownership of existing // references and adds a new one. template<typename T> RefPtr<T> SharePtr(T* ptr) { return RefPtr<T>(SkSafeRef(ptr)); } +template<typename T> +RefPtr<T> SharePtr(sk_sp<T> sp) { return RefPtr<T>(sp.release()); } + } // namespace skia #endif // SKIA_EXT_REFPTR_H_ diff --git a/skia/ext/refptr_unittest.cc b/skia/ext/refptr_unittest.cc index 237f439..cd25318 100644 --- a/skia/ext/refptr_unittest.cc +++ b/skia/ext/refptr_unittest.cc @@ -214,5 +214,31 @@ TEST(RefPtrTest, Nullptr) { EXPECT_FALSE(returned); } +TEST(RefPtrTest, SkSP) { + sk_sp<RefCountCounter> sp = sk_make_sp<RefCountCounter>(); + EXPECT_EQ(0, sp->ref_count_changes()); + + RefPtr<RefCountCounter> ref = skia::SharePtr(sp); + EXPECT_FALSE(ref->unique()); + EXPECT_EQ(1, ref->ref_count_changes()); + + sp = sk_make_sp<RefCountCounter>(); + EXPECT_TRUE(ref->unique()); + EXPECT_EQ(2, ref->ref_count_changes()); + + ref = skia::SharePtr(std::move(sp)); + EXPECT_TRUE(ref->unique()); + EXPECT_EQ(0, ref->ref_count_changes()); + + sp = sk_make_sp<RefCountCounter>(); + ref = skia::AdoptRef(std::move(sp)); + EXPECT_TRUE(ref->unique()); + EXPECT_EQ(0, ref->ref_count_changes()); + + ref = skia::AdoptRef(sk_make_sp<RefCountCounter>()); + EXPECT_TRUE(ref->unique()); + EXPECT_EQ(0, ref->ref_count_changes()); +} + } // namespace } // namespace skia |