1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 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/SkTo.h" 9cb93a386Sopenharmony_ci#include "src/core/SkMatrixPriv.h" 10cb93a386Sopenharmony_ci#include "src/core/SkWriter32.h" 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_civoid SkWriter32::writeMatrix(const SkMatrix& matrix) { 13cb93a386Sopenharmony_ci size_t size = SkMatrixPriv::WriteToMemory(matrix, nullptr); 14cb93a386Sopenharmony_ci SkASSERT(SkAlign4(size) == size); 15cb93a386Sopenharmony_ci SkMatrixPriv::WriteToMemory(matrix, this->reserve(size)); 16cb93a386Sopenharmony_ci} 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_civoid SkWriter32::writeString(const char str[], size_t len) { 19cb93a386Sopenharmony_ci if (nullptr == str) { 20cb93a386Sopenharmony_ci str = ""; 21cb93a386Sopenharmony_ci len = 0; 22cb93a386Sopenharmony_ci } 23cb93a386Sopenharmony_ci if ((long)len < 0) { 24cb93a386Sopenharmony_ci len = strlen(str); 25cb93a386Sopenharmony_ci } 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci // [ 4 byte len ] [ str ... ] [1 - 4 \0s] 28cb93a386Sopenharmony_ci uint32_t* ptr = this->reservePad(sizeof(uint32_t) + len + 1); 29cb93a386Sopenharmony_ci *ptr = SkToU32(len); 30cb93a386Sopenharmony_ci char* chars = (char*)(ptr + 1); 31cb93a386Sopenharmony_ci memcpy(chars, str, len); 32cb93a386Sopenharmony_ci chars[len] = '\0'; 33cb93a386Sopenharmony_ci} 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_cisize_t SkWriter32::WriteStringSize(const char* str, size_t len) { 36cb93a386Sopenharmony_ci if ((long)len < 0) { 37cb93a386Sopenharmony_ci SkASSERT(str); 38cb93a386Sopenharmony_ci len = strlen(str); 39cb93a386Sopenharmony_ci } 40cb93a386Sopenharmony_ci const size_t lenBytes = 4; // we use 4 bytes to record the length 41cb93a386Sopenharmony_ci // add 1 since we also write a terminating 0 42cb93a386Sopenharmony_ci return SkAlign4(lenBytes + len + 1); 43cb93a386Sopenharmony_ci} 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_civoid SkWriter32::growToAtLeast(size_t size) { 46cb93a386Sopenharmony_ci const bool wasExternal = (fExternal != nullptr) && (fData == fExternal); 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci fCapacity = 4096 + std::max(size, fCapacity + (fCapacity / 2)); 49cb93a386Sopenharmony_ci fInternal.realloc(fCapacity); 50cb93a386Sopenharmony_ci fData = fInternal.get(); 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci if (wasExternal) { 53cb93a386Sopenharmony_ci // we were external, so copy in the data 54cb93a386Sopenharmony_ci memcpy(fData, fExternal, fUsed); 55cb93a386Sopenharmony_ci } 56cb93a386Sopenharmony_ci} 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_cisk_sp<SkData> SkWriter32::snapshotAsData() const { 59cb93a386Sopenharmony_ci return SkData::MakeWithCopy(fData, fUsed); 60cb93a386Sopenharmony_ci} 61