Home | History | Annotate | Download | only in core
      1 /*
      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 
      8 #include "SkBuffer.h"
      9 #include "SkMalloc.h"
     10 #include <string.h>
     11 
     12 ///////////////////////////////////////////////////////////////////////////////////////////////////
     13 
     14 const void* SkRBuffer::skip(size_t size) {
     15     if (fValid && size <= this->available()) {
     16         const void* pos = fPos;
     17         fPos += size;
     18         return pos;
     19     }
     20     fValid = false;
     21     return nullptr;
     22 }
     23 
     24 bool SkRBuffer::read(void* buffer, size_t size) {
     25     if (const void* src = this->skip(size)) {
     26         sk_careful_memcpy(buffer, src, size);
     27         return true;
     28     }
     29     return false;
     30 }
     31 
     32 bool SkRBuffer::skipToAlign4() {
     33     intptr_t pos = reinterpret_cast<intptr_t>(fPos);
     34     size_t n = SkAlign4(pos) - pos;
     35     if (fValid && n <= this->available()) {
     36         fPos += n;
     37         return true;
     38     } else {
     39         fValid = false;
     40         return false;
     41     }
     42 }
     43 
     44 ///////////////////////////////////////////////////////////////////////////////////////////////////
     45 
     46 void* SkWBuffer::skip(size_t size) {
     47     void* result = fPos;
     48     writeNoSizeCheck(nullptr, size);
     49     return fData == nullptr ? nullptr : result;
     50 }
     51 
     52 void SkWBuffer::writeNoSizeCheck(const void* buffer, size_t size) {
     53     SkASSERT(fData == nullptr || fStop == nullptr || fPos + size <= fStop);
     54     if (fData && buffer) {
     55         sk_careful_memcpy(fPos, buffer, size);
     56     }
     57     fPos += size;
     58 }
     59 
     60 size_t SkWBuffer::padToAlign4() {
     61     size_t pos = this->pos();
     62     size_t n = SkAlign4(pos) - pos;
     63 
     64     if (n && fData)
     65     {
     66         char* p = fPos;
     67         char* stop = p + n;
     68         do {
     69             *p++ = 0;
     70         } while (p < stop);
     71     }
     72     fPos += n;
     73     return n;
     74 }
     75 
     76 #if 0
     77 #ifdef SK_DEBUG
     78     static void AssertBuffer32(const void* buffer)
     79     {
     80         SkASSERT(buffer);
     81         SkASSERT(((size_t)buffer & 3) == 0);
     82     }
     83 #else
     84     #define AssertBuffer32(buffer)
     85 #endif
     86 
     87 #endif
     88