diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-02-11 10:17:02 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-02-11 10:17:02 +0000 |
commit | 046f1f6ff4b2b3f4571a9562e74f41e82419a4a1 (patch) | |
tree | a7d3af90ac41718bf937e184bdd4a301ef721641 /src/core | |
parent | 1195a28892d37ae9632e81e1bc2407cf644522d2 (diff) |
Cleaner external buffer handling in SkWriter32
This unifies the internal and external buffer handling so that the difference only has to be noticed when growing.
Removing the branches from the common read and write cases gives a significant speedup.
BUG=skia:2125
R=tomhudson@google.com, mtklein@google.com, reed@google.com
Author: iancottrell@google.com
Review URL: https://codereview.chromium.org/156683004
git-svn-id: http://skia.googlecode.com/svn/trunk@13396 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkWriter32.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/core/SkWriter32.cpp b/src/core/SkWriter32.cpp index 5e89ed655b..7285459c3d 100644 --- a/src/core/SkWriter32.cpp +++ b/src/core/SkWriter32.cpp @@ -66,3 +66,21 @@ size_t SkWriter32::WriteStringSize(const char* str, size_t len) { // add 1 since we also write a terminating 0 return SkAlign4(lenBytes + len + 1); } + +void SkWriter32::growToAtLeast(size_t size) { + bool wasExternal = (fExternal != NULL) && (fData == fExternal); + // cause the buffer to grow + fInternal.setCount(size); + fData = fInternal.begin(); + if (wasExternal) { + // we were external, so copy in the data + memcpy(fData, fExternal, fUsed); + } + // Find out the size the buffer grew to, it may be more than we asked for. + fCapacity = fInternal.reserved(); + // Expand the array so all reserved space is "used", we maintain the + // amount we have written manually outside the array + fInternal.setCount(fCapacity); + SkASSERT(fInternal.count() == fCapacity); + SkASSERT(fInternal.reserved() == fCapacity); +} |