michael@0: michael@0: /* michael@0: * Copyright 2006 The Android Open Source Project michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #include "SkBuffer.h" michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: void SkRBuffer::readNoSizeCheck(void* buffer, size_t size) michael@0: { michael@0: SkASSERT((fData != 0 && fStop == 0) || fPos + size <= fStop); michael@0: if (buffer) michael@0: memcpy(buffer, fPos, size); michael@0: fPos += size; michael@0: } michael@0: michael@0: const void* SkRBuffer::skip(size_t size) michael@0: { michael@0: const void* result = fPos; michael@0: readNoSizeCheck(NULL, size); michael@0: return result; michael@0: } michael@0: michael@0: size_t SkRBuffer::skipToAlign4() michael@0: { michael@0: size_t pos = this->pos(); michael@0: size_t n = SkAlign4(pos) - pos; michael@0: fPos += n; michael@0: return n; michael@0: } michael@0: michael@0: bool SkRBufferWithSizeCheck::read(void* buffer, size_t size) { michael@0: fError = fError || (fPos + size > fStop); michael@0: if (!fError && (size > 0)) { michael@0: readNoSizeCheck(buffer, size); michael@0: } michael@0: return !fError; michael@0: } michael@0: michael@0: void* SkWBuffer::skip(size_t size) michael@0: { michael@0: void* result = fPos; michael@0: writeNoSizeCheck(NULL, size); michael@0: return fData == NULL ? NULL : result; michael@0: } michael@0: michael@0: void SkWBuffer::writeNoSizeCheck(const void* buffer, size_t size) michael@0: { michael@0: SkASSERT(fData == 0 || fStop == 0 || fPos + size <= fStop); michael@0: if (fData && buffer) michael@0: memcpy(fPos, buffer, size); michael@0: fPos += size; michael@0: } michael@0: michael@0: size_t SkWBuffer::padToAlign4() michael@0: { michael@0: size_t pos = this->pos(); michael@0: size_t n = SkAlign4(pos) - pos; michael@0: michael@0: if (n && fData) michael@0: { michael@0: char* p = fPos; michael@0: char* stop = p + n; michael@0: do { michael@0: *p++ = 0; michael@0: } while (p < stop); michael@0: } michael@0: fPos += n; michael@0: return n; michael@0: } michael@0: michael@0: #if 0 michael@0: #ifdef SK_DEBUG michael@0: static void AssertBuffer32(const void* buffer) michael@0: { michael@0: SkASSERT(buffer); michael@0: SkASSERT(((size_t)buffer & 3) == 0); michael@0: } michael@0: #else michael@0: #define AssertBuffer32(buffer) michael@0: #endif michael@0: michael@0: void* sk_buffer_write_int32(void* buffer, int32_t value) michael@0: { michael@0: AssertBuffer32(buffer); michael@0: *(int32_t*)buffer = value; michael@0: return (char*)buffer + sizeof(int32_t); michael@0: } michael@0: michael@0: void* sk_buffer_write_int32(void* buffer, const int32_t values[], int count) michael@0: { michael@0: AssertBuffer32(buffer); michael@0: SkASSERT(count >= 0); michael@0: michael@0: memcpy((int32_t*)buffer, values, count * sizeof(int32_t)); michael@0: return (char*)buffer + count * sizeof(int32_t); michael@0: } michael@0: michael@0: const void* sk_buffer_read_int32(const void* buffer, int32_t* value) michael@0: { michael@0: AssertBuffer32(buffer); michael@0: if (value) michael@0: *value = *(const int32_t*)buffer; michael@0: return (const char*)buffer + sizeof(int32_t); michael@0: } michael@0: michael@0: const void* sk_buffer_read_int32(const void* buffer, int32_t values[], int count) michael@0: { michael@0: AssertBuffer32(buffer); michael@0: SkASSERT(count >= 0); michael@0: michael@0: if (values) michael@0: memcpy(values, (const int32_t*)buffer, count * sizeof(int32_t)); michael@0: return (const char*)buffer + count * sizeof(int32_t); michael@0: } michael@0: michael@0: void* sk_buffer_write_ptr(void* buffer, void* ptr) michael@0: { michael@0: AssertBuffer32(buffer); michael@0: *(void**)buffer = ptr; michael@0: return (char*)buffer + sizeof(void*); michael@0: } michael@0: michael@0: const void* sk_buffer_read_ptr(const void* buffer, void** ptr) michael@0: { michael@0: AssertBuffer32(buffer); michael@0: if (ptr) michael@0: *ptr = *(void**)buffer; michael@0: return (const char*)buffer + sizeof(void*); michael@0: } michael@0: michael@0: #endif