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