remove unused dynamicwstream.snapshotAsData()

Checking to invalidate this on every write() call has a measurable cost, so removing it both simplifies the class and speeds it up.

BUG=skia:

Change-Id: Idf0baa265c9a0b5d26d82fce948c61ed9b0810b1
Reviewed-on: https://skia-review.googlesource.com/6096
Reviewed-by: Ben Wagner <bungeman@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
This commit is contained in:
Mike Reed 2016-12-15 13:02:33 -05:00 committed by Skia Commit-Bot
parent eaef5493ca
commit 5adaf8bf24
4 changed files with 29 additions and 60 deletions

View File

@ -385,7 +385,6 @@ public:
void copyTo(void* dst) const;
void writeToStream(SkWStream* dst) const;
sk_sp<SkData> snapshotAsData() const;
// Return the contents as SkData, and then reset the stream.
sk_sp<SkData> detachAsData();
@ -400,9 +399,6 @@ private:
Block* fHead;
Block* fTail;
size_t fBytesWritten;
mutable sk_sp<SkData> fCopy; // is invalidated if we write after it is created
void invalidateCopy();
// For access to the Block type.
friend class SkBlockMemoryStream;

View File

@ -504,12 +504,8 @@ SkDynamicMemoryWStream::~SkDynamicMemoryWStream()
reset();
}
void SkDynamicMemoryWStream::reset()
{
this->invalidateCopy();
void SkDynamicMemoryWStream::reset() {
Block* block = fHead;
while (block != nullptr) {
Block* next = block->fNext;
sk_free(block);
@ -519,11 +515,8 @@ void SkDynamicMemoryWStream::reset()
fBytesWritten = 0;
}
bool SkDynamicMemoryWStream::write(const void* buffer, size_t count)
{
bool SkDynamicMemoryWStream::write(const void* buffer, size_t count) {
if (count > 0) {
this->invalidateCopy();
fBytesWritten += count;
size_t size;
@ -572,19 +565,13 @@ bool SkDynamicMemoryWStream::read(void* buffer, size_t offset, size_t count)
return false;
}
void SkDynamicMemoryWStream::copyTo(void* dst) const
{
if (fCopy) {
memcpy(dst, fCopy->data(), fBytesWritten);
} else {
Block* block = fHead;
while (block != nullptr) {
size_t size = block->written();
memcpy(dst, block->start(), size);
dst = (void*)((char*)dst + size);
block = block->fNext;
}
void SkDynamicMemoryWStream::copyTo(void* dst) const {
Block* block = fHead;
while (block != nullptr) {
size_t size = block->written();
memcpy(dst, block->start(), size);
dst = (void*)((char*)dst + size);
block = block->fNext;
}
}
@ -604,24 +591,16 @@ void SkDynamicMemoryWStream::padToAlign4()
write(&zero, padBytes);
}
sk_sp<SkData> SkDynamicMemoryWStream::snapshotAsData() const {
if (nullptr == fCopy) {
auto data = SkData::MakeUninitialized(fBytesWritten);
// be sure to call copyTo() before we assign to fCopy
this->copyTo(data->writable_data());
fCopy = std::move(data);
}
return fCopy;
}
sk_sp<SkData> SkDynamicMemoryWStream::detachAsData() {
sk_sp<SkData> data = this->snapshotAsData();
this->reset();
return data;
}
const size_t size = this->bytesWritten();
if (0 == size) {
return SkData::MakeEmpty();
}
void SkDynamicMemoryWStream::invalidateCopy() {
fCopy = nullptr;
sk_sp<SkData> data = SkData::MakeUninitialized(size);
this->copyTo(data->writable_data());
this->reset(); // this is the "detach" part
return data;
}
class SkBlockMemoryRefCnt : public SkRefCnt {
@ -770,13 +749,8 @@ private:
};
SkStreamAsset* SkDynamicMemoryWStream::detachAsStream() {
if (fCopy) {
SkMemoryStream* stream = new SkMemoryStream(fCopy);
this->reset();
return stream;
}
SkBlockMemoryStream* stream = new SkBlockMemoryStream(fHead, fBytesWritten);
fHead = 0;
SkBlockMemoryStream* stream = new SkBlockMemoryStream(fHead, this->bytesWritten());
fHead = nullptr; // signal reset() to not free anything
this->reset();
return stream;
}

View File

@ -15,14 +15,19 @@ static const int kMaximumGlyphCount = SK_MaxU16 + 1;
static bool stream_equals(const SkDynamicMemoryWStream& stream, size_t offset,
const char* buffer, size_t len) {
sk_sp<SkData> data = stream.snapshotAsData();
if (offset + len > data->size()) {
return false;
}
if (len != strlen(buffer)) {
return false;
}
return memcmp(data->bytes() + offset, buffer, len) == 0;
const size_t streamSize = stream.bytesWritten();
if (offset + len > streamSize) {
return false;
}
SkAutoTMalloc<char> data(streamSize);
stream.copyTo(data.get());
return memcmp(data.get() + offset, buffer, len) == 0;
}
DEF_TEST(SkPDF_ToUnicode, reporter) {

View File

@ -117,12 +117,6 @@ static void TestWStream(skiatest::Reporter* reporter) {
}
REPORTER_ASSERT(reporter, ds.getOffset() == 100 * 26);
{
sk_sp<SkData> data = ds.snapshotAsData();
REPORTER_ASSERT(reporter, 100 * 26 == data->size());
REPORTER_ASSERT(reporter, memcmp(dst, data->data(), data->size()) == 0);
}
{
// Test that this works after a snapshot.
std::unique_ptr<SkStreamAsset> stream(ds.detachAsStream());