aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-11 10:17:02 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-11 10:17:02 +0000
commit046f1f6ff4b2b3f4571a9562e74f41e82419a4a1 (patch)
treea7d3af90ac41718bf937e184bdd4a301ef721641 /src/core
parent1195a28892d37ae9632e81e1bc2407cf644522d2 (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.cpp18
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);
+}