1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2006 The Android Open Source Project 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/private/SkMalloc.h" 9cb93a386Sopenharmony_ci#include "src/core/SkBuffer.h" 10cb93a386Sopenharmony_ci#include <string.h> 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////////// 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ciconst void* SkRBuffer::skip(size_t size) { 15cb93a386Sopenharmony_ci if (fValid && size <= this->available()) { 16cb93a386Sopenharmony_ci const void* pos = fPos; 17cb93a386Sopenharmony_ci fPos += size; 18cb93a386Sopenharmony_ci return pos; 19cb93a386Sopenharmony_ci } 20cb93a386Sopenharmony_ci fValid = false; 21cb93a386Sopenharmony_ci return nullptr; 22cb93a386Sopenharmony_ci} 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_cibool SkRBuffer::read(void* buffer, size_t size) { 25cb93a386Sopenharmony_ci if (const void* src = this->skip(size)) { 26cb93a386Sopenharmony_ci sk_careful_memcpy(buffer, src, size); 27cb93a386Sopenharmony_ci return true; 28cb93a386Sopenharmony_ci } 29cb93a386Sopenharmony_ci return false; 30cb93a386Sopenharmony_ci} 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_cibool SkRBuffer::skipToAlign4() { 33cb93a386Sopenharmony_ci intptr_t pos = reinterpret_cast<intptr_t>(fPos); 34cb93a386Sopenharmony_ci size_t n = SkAlign4(pos) - pos; 35cb93a386Sopenharmony_ci if (fValid && n <= this->available()) { 36cb93a386Sopenharmony_ci fPos += n; 37cb93a386Sopenharmony_ci return true; 38cb93a386Sopenharmony_ci } else { 39cb93a386Sopenharmony_ci fValid = false; 40cb93a386Sopenharmony_ci return false; 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci} 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////////// 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_civoid* SkWBuffer::skip(size_t size) { 47cb93a386Sopenharmony_ci void* result = fPos; 48cb93a386Sopenharmony_ci writeNoSizeCheck(nullptr, size); 49cb93a386Sopenharmony_ci return fData == nullptr ? nullptr : result; 50cb93a386Sopenharmony_ci} 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_civoid SkWBuffer::writeNoSizeCheck(const void* buffer, size_t size) { 53cb93a386Sopenharmony_ci SkASSERT(fData == nullptr || fStop == nullptr || fPos + size <= fStop); 54cb93a386Sopenharmony_ci if (fData && buffer) { 55cb93a386Sopenharmony_ci sk_careful_memcpy(fPos, buffer, size); 56cb93a386Sopenharmony_ci } 57cb93a386Sopenharmony_ci fPos += size; 58cb93a386Sopenharmony_ci} 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_cisize_t SkWBuffer::padToAlign4() { 61cb93a386Sopenharmony_ci size_t pos = this->pos(); 62cb93a386Sopenharmony_ci size_t n = SkAlign4(pos) - pos; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci if (n && fData) 65cb93a386Sopenharmony_ci { 66cb93a386Sopenharmony_ci char* p = fPos; 67cb93a386Sopenharmony_ci char* stop = p + n; 68cb93a386Sopenharmony_ci do { 69cb93a386Sopenharmony_ci *p++ = 0; 70cb93a386Sopenharmony_ci } while (p < stop); 71cb93a386Sopenharmony_ci } 72cb93a386Sopenharmony_ci fPos += n; 73cb93a386Sopenharmony_ci return n; 74cb93a386Sopenharmony_ci} 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci#if 0 77cb93a386Sopenharmony_ci#ifdef SK_DEBUG 78cb93a386Sopenharmony_ci static void AssertBuffer32(const void* buffer) 79cb93a386Sopenharmony_ci { 80cb93a386Sopenharmony_ci SkASSERT(buffer); 81cb93a386Sopenharmony_ci SkASSERT(((size_t)buffer & 3) == 0); 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci#else 84cb93a386Sopenharmony_ci #define AssertBuffer32(buffer) 85cb93a386Sopenharmony_ci#endif 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci#endif 88