From 36fe60d19ad9412fe4b8d92ecd36bf6b59f5269a Mon Sep 17 00:00:00 2001 From: Ben Wagner Date: Tue, 10 Jul 2018 17:38:12 -0400 Subject: Move SkRefSet / pipe code to smart pointer. This clarifies the ownership and simplifies the code. Change-Id: I18ce981aaabfdd4749a344276bd19d62aa2c3210 Reviewed-on: https://skia-review.googlesource.com/140350 Reviewed-by: Herb Derby Commit-Queue: Ben Wagner --- gn/core.gni | 1 + src/pipe/SkPipeReader.cpp | 18 +++++++++--------- src/pipe/SkRefSet.h | 16 +++++++--------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/gn/core.gni b/gn/core.gni index b005c2c445..7881579e38 100644 --- a/gn/core.gni +++ b/gn/core.gni @@ -363,6 +363,7 @@ skia_core_sources = [ "$_src/pipe/SkPipeCanvas.cpp", "$_src/pipe/SkPipeReader.cpp", + "$_src/pipe/SkRefSet.h", "$_src/shaders/SkBitmapProcShader.cpp", "$_src/shaders/SkBitmapProcShader.h", diff --git a/src/pipe/SkPipeReader.cpp b/src/pipe/SkPipeReader.cpp index 312e3da4e8..a37af5532a 100644 --- a/src/pipe/SkPipeReader.cpp +++ b/src/pipe/SkPipeReader.cpp @@ -51,14 +51,14 @@ public: return index ? fFactories->getAt(index - 1) : nullptr; } - bool setImage(int index, SkImage* img) { - return fImages->set(index - 1, img); + bool setImage(int index, sk_sp img) { + return fImages->set(index - 1, std::move(img)); } - bool setPicture(int index, SkPicture* pic) { - return fPictures->set(index - 1, pic); + bool setPicture(int index, sk_sp pic) { + return fPictures->set(index - 1, std::move(pic)); } - bool setTypeface(int index, SkTypeface* face) { - return fTypefaces->set(index - 1, face); + bool setTypeface(int index, sk_sp face) { + return fTypefaces->set(index - 1, std::move(face)); } bool setFactory(int index, SkFlattenable::Factory factory) { SkASSERT(index > 0); @@ -645,7 +645,7 @@ static void defineImage_handler(SkPipeReader& reader, uint32_t packedVerb, SkCan if (!image) { SkDebugf("-- failed to decode\n"); } - inflator->setImage(index, image.get()); + inflator->setImage(index, std::move(image)); } } @@ -671,7 +671,7 @@ static void defineTypeface_handler(SkPipeReader& reader, uint32_t packedVerb, Sk sk_sp data = reader.readByteArrayAsData(); // TODO: seems like we could "peek" to see the array, and not need to copy it. sk_sp tf = data ? inflator->makeTypeface(data->data(), data->size()) : nullptr; - inflator->setTypeface(index, tf.get()); + inflator->setTypeface(index, std::move(tf)); } } @@ -707,7 +707,7 @@ static void definePicture_handler(SkPipeReader& reader, uint32_t packedVerb, SkC do_playback(reader, recorder.beginRecording(*cull), &pictureIndex); SkASSERT(pictureIndex > 0); sk_sp picture = recorder.finishRecordingAsPicture(); - inflator->setPicture(pictureIndex, picture.get()); + inflator->setPicture(pictureIndex, std::move(picture)); } } diff --git a/src/pipe/SkRefSet.h b/src/pipe/SkRefSet.h index 5f23ba2191..65fe7af1eb 100644 --- a/src/pipe/SkRefSet.h +++ b/src/pipe/SkRefSet.h @@ -9,24 +9,22 @@ #define SkRefSet_DEFINED #include "SkRefCnt.h" -#include "SkTDArray.h" +#include "SkTArray.h" template class SkRefSet { public: - ~SkRefSet() { fArray.unrefAll(); } - T* get(int index) const { SkASSERT((unsigned)index < (unsigned)fArray.count()); - return fArray[index]; + return fArray[index].get(); } - bool set(int index, T* value) { - if ((unsigned)index < (unsigned)fArray.count()) { - SkRefCnt_SafeAssign(fArray[index], value); + bool set(int index, sk_sp value) { + if (index < fArray.count()) { + fArray[index] = std::move(value); return true; } if (fArray.count() == index && value) { - *fArray.append() = SkRef(value); + fArray.emplace_back(std::move(value)); return true; } SkDebugf("SkRefSet: index [%d] out of range %d\n", index, fArray.count()); @@ -34,7 +32,7 @@ public: } private: - SkTDArray fArray; + SkTArray, true> fArray; }; #endif -- cgit v1.2.3