blob: b7cf8b2b87aab78ddf014a2d8fdada948825ddcf [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2006 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
reedfb8c1fc2015-08-04 18:44:56 -07008#include "SkBuffer.h"
bungeman7403d872015-08-04 14:56:53 -07009
bungemand3ebb482015-08-05 13:57:49 -070010#include <string.h>
11
Mike Reed1026ccf2017-01-08 14:35:29 -050012///////////////////////////////////////////////////////////////////////////////////////////////////
reed@android.com8a1c16f2008-12-17 15:59:43 +000013
Mike Reed1026ccf2017-01-08 14:35:29 -050014bool SkRBuffer::read(void* buffer, size_t size) {
15 if (fValid && size <= this->available()) {
16 if (buffer) {
17 memcpy(buffer, fPos, size);
18 }
19 fPos += size;
20 return true;
21 } else {
22 fValid = false;
23 return false;
commit-bot@chromium.org4faa8692013-11-05 15:46:56 +000024 }
25}
26
Mike Reed1026ccf2017-01-08 14:35:29 -050027bool SkRBuffer::skipToAlign4() {
28 intptr_t pos = reinterpret_cast<intptr_t>(fPos);
29 size_t n = SkAlign4(pos) - pos;
30 if (fValid && n <= this->available()) {
31 fPos += n;
32 return true;
33 } else {
34 fValid = false;
35 return false;
36 }
37}
38
39///////////////////////////////////////////////////////////////////////////////////////////////////
40
41void* SkWBuffer::skip(size_t size) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000042 void* result = fPos;
halcanary96fcdcc2015-08-27 07:41:13 -070043 writeNoSizeCheck(nullptr, size);
44 return fData == nullptr ? nullptr : result;
reed@android.com8a1c16f2008-12-17 15:59:43 +000045}
46
Mike Reed1026ccf2017-01-08 14:35:29 -050047void SkWBuffer::writeNoSizeCheck(const void* buffer, size_t size) {
Ben Wagnera93a14a2017-08-28 10:34:05 -040048 SkASSERT(fData == nullptr || fStop == nullptr || fPos + size <= fStop);
reed@android.com8a1c16f2008-12-17 15:59:43 +000049 if (fData && buffer)
50 memcpy(fPos, buffer, size);
51 fPos += size;
52}
53
Mike Reed1026ccf2017-01-08 14:35:29 -050054size_t SkWBuffer::padToAlign4() {
reed@android.com8a1c16f2008-12-17 15:59:43 +000055 size_t pos = this->pos();
56 size_t n = SkAlign4(pos) - pos;
57
58 if (n && fData)
59 {
60 char* p = fPos;
61 char* stop = p + n;
62 do {
63 *p++ = 0;
64 } while (p < stop);
65 }
66 fPos += n;
67 return n;
68}
69
70#if 0
71#ifdef SK_DEBUG
72 static void AssertBuffer32(const void* buffer)
73 {
74 SkASSERT(buffer);
75 SkASSERT(((size_t)buffer & 3) == 0);
76 }
77#else
78 #define AssertBuffer32(buffer)
79#endif
80
reed@android.com8a1c16f2008-12-17 15:59:43 +000081#endif