blob: d328644f6bd730cc19c55cff91af02311db15ca5 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
reed@google.com5595af12012-12-21 15:36:33 +00007
reed@google.comdde09562011-05-23 12:21:05 +00008#include "SkReader32.h"
reed@google.comfd0ffcf2011-06-21 15:43:11 +00009#include "SkString.h"
commit-bot@chromium.org19382422014-01-14 20:51:26 +000010#include "SkWriter32.h"
reed@google.comfd0ffcf2011-06-21 15:43:11 +000011
12/*
13 * Strings are stored as: length[4-bytes] + string_data + '\0' + pad_to_mul_4
14 */
reed@google.comdde09562011-05-23 12:21:05 +000015
16const char* SkReader32::readString(size_t* outLen) {
commit-bot@chromium.org1ac99c82014-04-29 15:35:23 +000017 size_t len = this->readU32();
reed@google.comfd0ffcf2011-06-21 15:43:11 +000018 const void* ptr = this->peek();
reed@google.comdde09562011-05-23 12:21:05 +000019
commit-bot@chromium.org19382422014-01-14 20:51:26 +000020 // skip over the string + '\0' and then pad to a multiple of 4
reed@google.comfd0ffcf2011-06-21 15:43:11 +000021 size_t alignedSize = SkAlign4(len + 1);
reed@google.comdde09562011-05-23 12:21:05 +000022 this->skip(alignedSize);
23
24 if (outLen) {
25 *outLen = len;
26 }
27 return (const char*)ptr;
28}
29
reed@google.comfd0ffcf2011-06-21 15:43:11 +000030size_t SkReader32::readIntoString(SkString* copy) {
31 size_t len;
32 const char* ptr = this->readString(&len);
33 if (copy) {
34 copy->set(ptr, len);
35 }
36 return len;
37}
38
reed@google.comdde09562011-05-23 12:21:05 +000039void SkWriter32::writeString(const char str[], size_t len) {
halcanary96fcdcc2015-08-27 07:41:13 -070040 if (nullptr == str) {
mtklein@google.com0038c122013-08-15 21:01:32 +000041 str = "";
42 len = 0;
commit-bot@chromium.org47fa1362013-08-09 16:03:05 +000043 }
reed@google.comdde09562011-05-23 12:21:05 +000044 if ((long)len < 0) {
reed@google.comdde09562011-05-23 12:21:05 +000045 len = strlen(str);
46 }
commit-bot@chromium.org536ac5e2014-02-11 22:38:51 +000047
48 // [ 4 byte len ] [ str ... ] [1 - 4 \0s]
49 uint32_t* ptr = this->reservePad(sizeof(uint32_t) + len + 1);
commit-bot@chromium.orgf1177812014-04-23 19:19:44 +000050 *ptr = SkToU32(len);
commit-bot@chromium.org536ac5e2014-02-11 22:38:51 +000051 char* chars = (char*)(ptr + 1);
52 memcpy(chars, str, len);
53 chars[len] = '\0';
reed@google.comdde09562011-05-23 12:21:05 +000054}
55
56size_t SkWriter32::WriteStringSize(const char* str, size_t len) {
57 if ((long)len < 0) {
58 SkASSERT(str);
59 len = strlen(str);
60 }
reed@google.comfd0ffcf2011-06-21 15:43:11 +000061 const size_t lenBytes = 4; // we use 4 bytes to record the length
reed@google.comdde09562011-05-23 12:21:05 +000062 // add 1 since we also write a terminating 0
63 return SkAlign4(lenBytes + len + 1);
64}
commit-bot@chromium.org046f1f62014-02-11 10:17:02 +000065
66void SkWriter32::growToAtLeast(size_t size) {
halcanary96fcdcc2015-08-27 07:41:13 -070067 const bool wasExternal = (fExternal != nullptr) && (fData == fExternal);
commit-bot@chromium.orga87b21c2014-02-11 18:22:04 +000068
commit-bot@chromium.orgca21a002014-02-13 18:35:54 +000069 fCapacity = 4096 + SkTMax(size, fCapacity + (fCapacity / 2));
70 fInternal.realloc(fCapacity);
71 fData = fInternal.get();
72
commit-bot@chromium.org046f1f62014-02-11 10:17:02 +000073 if (wasExternal) {
74 // we were external, so copy in the data
75 memcpy(fData, fExternal, fUsed);
76 }
commit-bot@chromium.orgc30dcb92014-03-12 17:04:28 +000077}
78
reedfde05112016-03-11 13:02:28 -080079sk_sp<SkData> SkWriter32::snapshotAsData() const {
80 return SkData::MakeWithCopy(fData, fUsed);
commit-bot@chromium.org046f1f62014-02-11 10:17:02 +000081}