summaryrefslogtreecommitdiffstats
path: root/skia
diff options
context:
space:
mode:
authorfmalita <fmalita@chromium.org>2016-03-07 09:49:59 -0800
committerCommit bot <commit-bot@chromium.org>2016-03-07 17:51:20 +0000
commita7a25f02e15c573216139fa6eaf26dfaa2977216 (patch)
tree597c868622f3da1418a1715ddc13b4aa590e5620 /skia
parent78fdadc2dfdd59934d9ce56bb8588b2fd11258a3 (diff)
downloadchromium_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.h12
-rw-r--r--skia/ext/refptr_unittest.cc26
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