aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkRWBuffer.h7
-rw-r--r--src/core/SkRWBuffer.cpp26
-rw-r--r--tests/DataRefTest.cpp27
3 files changed, 36 insertions, 24 deletions
diff --git a/include/core/SkRWBuffer.h b/include/core/SkRWBuffer.h
index 451933f353..512b61fed5 100644
--- a/include/core/SkRWBuffer.h
+++ b/include/core/SkRWBuffer.h
@@ -30,6 +30,7 @@ public:
class SK_API Iter {
public:
Iter(const SkROBuffer*);
+ Iter(const sk_sp<SkROBuffer>&);
void reset(const SkROBuffer*);
@@ -92,6 +93,12 @@ public:
SkROBuffer* newRBufferSnapshot() const;
SkStreamAsset* newStreamSnapshot() const;
+ sk_sp<SkROBuffer> makeROBufferSnapshot() const {
+ return sk_sp<SkROBuffer>(new SkROBuffer(fHead, fTotalUsed, fTail));
+ }
+
+ std::unique_ptr<SkStreamAsset> makeStreamSnapshot() const;
+
#ifdef SK_DEBUG
void validate() const;
#else
diff --git a/src/core/SkRWBuffer.cpp b/src/core/SkRWBuffer.cpp
index 7770b20769..53ae9147e3 100644
--- a/src/core/SkRWBuffer.cpp
+++ b/src/core/SkRWBuffer.cpp
@@ -9,6 +9,7 @@
#include "SkAtomics.h"
#include "SkMalloc.h"
+#include "SkMakeUnique.h"
#include "SkStream.h"
// Force small chunks to be a page's worth
@@ -145,6 +146,10 @@ SkROBuffer::Iter::Iter(const SkROBuffer* buffer) {
this->reset(buffer);
}
+SkROBuffer::Iter::Iter(const sk_sp<SkROBuffer>& buffer) {
+ this->reset(buffer.get());
+}
+
void SkROBuffer::Iter::reset(const SkROBuffer* buffer) {
fBuffer = buffer;
if (buffer && buffer->fHead) {
@@ -268,17 +273,15 @@ class SkROBufferStreamAsset : public SkStreamAsset {
#endif
public:
- SkROBufferStreamAsset(const SkROBuffer* buffer) : fBuffer(SkRef(buffer)), fIter(buffer) {
+ SkROBufferStreamAsset(sk_sp<SkROBuffer> buffer) : fBuffer(std::move(buffer)), fIter(fBuffer) {
fGlobalOffset = fLocalOffset = 0;
}
- ~SkROBufferStreamAsset() override { fBuffer->unref(); }
-
size_t getLength() const override { return fBuffer->size(); }
bool rewind() override {
AUTO_VALIDATE
- fIter.reset(fBuffer);
+ fIter.reset(fBuffer.get());
fGlobalOffset = fLocalOffset = 0;
return true;
}
@@ -350,13 +353,16 @@ public:
private:
- const SkROBuffer* fBuffer;
- SkROBuffer::Iter fIter;
- size_t fLocalOffset;
- size_t fGlobalOffset;
+ sk_sp<SkROBuffer> fBuffer;
+ SkROBuffer::Iter fIter;
+ size_t fLocalOffset;
+ size_t fGlobalOffset;
};
SkStreamAsset* SkRWBuffer::newStreamSnapshot() const {
- sk_sp<SkROBuffer> buffer(this->newRBufferSnapshot());
- return new SkROBufferStreamAsset(buffer.get());
+ return new SkROBufferStreamAsset(this->makeROBufferSnapshot());
+}
+
+std::unique_ptr<SkStreamAsset> SkRWBuffer::makeStreamSnapshot() const {
+ return skstd::make_unique<SkROBufferStreamAsset>(this->makeROBufferSnapshot());
}
diff --git a/tests/DataRefTest.cpp b/tests/DataRefTest.cpp
index d0cafc3dde..74d511cc28 100644
--- a/tests/DataRefTest.cpp
+++ b/tests/DataRefTest.cpp
@@ -12,6 +12,7 @@
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkStream.h"
+#include "SkTArray.h"
#include "Test.h"
static void test_is_equal(skiatest::Reporter* reporter,
@@ -255,16 +256,16 @@ static void check_alphabet_buffer(skiatest::Reporter* reporter, const SkROBuffer
DEF_TEST(RWBuffer, reporter) {
// Knowing that the default capacity is 4096, choose N large enough so we force it to use
// multiple buffers internally.
- const int N = 1000;
- SkROBuffer* readers[N];
- SkStream* streams[N];
+ static constexpr int N = 1000;
+ SkSTArray<N, sk_sp<SkROBuffer>> readers;
+ SkSTArray<N, std::unique_ptr<SkStream>> streams;
{
SkRWBuffer buffer;
for (int i = 0; i < N; ++i) {
buffer.append(gABC, 26);
- readers[i] = buffer.newRBufferSnapshot();
- streams[i] = buffer.newStreamSnapshot();
+ readers.push_back(buffer.makeROBufferSnapshot());
+ streams.push_back(buffer.makeStreamSnapshot());
}
REPORTER_ASSERT(reporter, N*26 == buffer.size());
}
@@ -272,10 +273,8 @@ DEF_TEST(RWBuffer, reporter) {
// Verify that although the SkRWBuffer's destructor has run, the readers are still valid.
for (int i = 0; i < N; ++i) {
REPORTER_ASSERT(reporter, (i + 1) * 26U == readers[i]->size());
- check_alphabet_buffer(reporter, readers[i]);
- check_alphabet_stream(reporter, streams[i]);
- readers[i]->unref();
- delete streams[i];
+ check_alphabet_buffer(reporter, readers[i].get());
+ check_alphabet_stream(reporter, streams[i].get());
}
}
@@ -287,8 +286,8 @@ DEF_TEST(RWBuffer_threaded, reporter) {
SkRWBuffer buffer;
for (int i = 0; i < N; ++i) {
buffer.append(gABC, 26);
- sk_sp<SkROBuffer> reader = sk_sp<SkROBuffer>(buffer.newRBufferSnapshot());
- SkStream* stream = buffer.newStreamSnapshot();
+ sk_sp<SkROBuffer> reader = buffer.makeROBufferSnapshot();
+ SkStream* stream = buffer.makeStreamSnapshot().release();
REPORTER_ASSERT(reporter, reader->size() == buffer.size());
REPORTER_ASSERT(reporter, stream->getLength() == buffer.size());
@@ -313,7 +312,7 @@ DEF_TEST(RWBuffer_size, r) {
SkRWBuffer buffer;
buffer.append(gABC, 26);
- sk_sp<SkROBuffer> roBuffer(buffer.newRBufferSnapshot());
+ sk_sp<SkROBuffer> roBuffer(buffer.makeROBufferSnapshot());
SkROBuffer::Iter iter(roBuffer.get());
REPORTER_ASSERT(r, iter.data());
REPORTER_ASSERT(r, iter.size() == 26);
@@ -329,7 +328,7 @@ DEF_TEST(RWBuffer_noAppend, r) {
SkRWBuffer buffer;
REPORTER_ASSERT(r, 0 == buffer.size());
- sk_sp<SkROBuffer> roBuffer = sk_sp<SkROBuffer>(buffer.newRBufferSnapshot());
+ sk_sp<SkROBuffer> roBuffer = buffer.makeROBufferSnapshot();
REPORTER_ASSERT(r, roBuffer);
if (roBuffer) {
REPORTER_ASSERT(r, roBuffer->size() == 0);
@@ -339,7 +338,7 @@ DEF_TEST(RWBuffer_noAppend, r) {
REPORTER_ASSERT(r, !iter.next());
}
- std::unique_ptr<SkStream> stream(buffer.newStreamSnapshot());
+ std::unique_ptr<SkStream> stream(buffer.makeStreamSnapshot());
REPORTER_ASSERT(r, stream);
if (stream) {
REPORTER_ASSERT(r, stream->hasLength());