11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkStream.h" 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkData.h" 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFixed.h" 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkString.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkOSFile.h" 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkStream::~SkStream() {} 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkStream::getFileName() 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // override in subclass if you represent a file 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst void* SkStream::getMemoryBase() 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // override in subclass if you represent a memory block 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectsize_t SkStream::skip(size_t size) 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /* Check for size == 0, and just return 0. If we passed that 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project to read(), it would interpret it as a request for the entire 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size of the stream. 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return size ? this->read(NULL, size) : 0; 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint8_t SkStream::readS8() { 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int8_t value; 41aa4832adcc7eba085987357591bcfeb530ba7b0dMike Reed SkDEBUGCODE(size_t len =) this->read(&value, 1); 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(1 == len); 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return value; 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint16_t SkStream::readS16() { 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int16_t value; 48aa4832adcc7eba085987357591bcfeb530ba7b0dMike Reed SkDEBUGCODE(size_t len =) this->read(&value, 2); 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(2 == len); 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return value; 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t SkStream::readS32() { 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int32_t value; 55aa4832adcc7eba085987357591bcfeb530ba7b0dMike Reed SkDEBUGCODE(size_t len =) this->read(&value, 4); 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(4 == len); 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return value; 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkScalar SkStream::readScalar() { 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar value; 62aa4832adcc7eba085987357591bcfeb530ba7b0dMike Reed SkDEBUGCODE(size_t len =) this->read(&value, sizeof(SkScalar)); 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(sizeof(SkScalar) == len); 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return value; 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SK_MAX_BYTE_FOR_U8 0xFD 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SK_BYTE_SENTINEL_FOR_U16 0xFE 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SK_BYTE_SENTINEL_FOR_U32 0xFF 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectsize_t SkStream::readPackedUInt() { 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint8_t byte; 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!this->read(&byte, 1)) { 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (SK_BYTE_SENTINEL_FOR_U16 == byte) { 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return this->readU16(); 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } else if (SK_BYTE_SENTINEL_FOR_U32 == byte) { 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return this->readU32(); 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } else { 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return byte; 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////// 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkWStream::~SkWStream() 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkWStream::newline() 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->write("\n", 1); 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkWStream::flush() 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkWStream::writeText(const char text[]) 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(text); 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->write(text, strlen(text)); 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkWStream::writeDecAsText(int32_t dec) 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkString tmp; 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp.appendS32(dec); 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->write(tmp.c_str(), tmp.size()); 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 11340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergerbool SkWStream::writeBigDecAsText(int64_t dec, int minDigits) 11440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger{ 11540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkString tmp; 11640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger tmp.appendS64(dec, minDigits); 11740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger return this->write(tmp.c_str(), tmp.size()); 11840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 11940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkWStream::writeHexAsText(uint32_t hex, int digits) 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkString tmp; 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp.appendHex(hex, digits); 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->write(tmp.c_str(), tmp.size()); 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkWStream::writeScalarAsText(SkScalar value) 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkString tmp; 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tmp.appendScalar(value); 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->write(tmp.c_str(), tmp.size()); 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkWStream::write8(U8CPU value) { 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint8_t v = SkToU8(value); 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->write(&v, 1); 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkWStream::write16(U16CPU value) { 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint16_t v = SkToU16(value); 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->write(&v, 2); 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkWStream::write32(uint32_t value) { 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->write(&value, 4); 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkWStream::writeScalar(SkScalar value) { 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return this->write(&value, sizeof(value)); 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkWStream::writePackedUInt(size_t value) { 1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint8_t data[5]; 1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger size_t len = 1; 1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (value <= SK_MAX_BYTE_FOR_U8) { 1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger data[0] = value; 1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger len = 1; 1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } else if (value <= 0xFFFF) { 1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint16_t value16 = value; 1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger data[0] = SK_BYTE_SENTINEL_FOR_U16; 1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger memcpy(&data[1], &value16, 2); 1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger len = 3; 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint32_t value32 = value; 1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger data[0] = SK_BYTE_SENTINEL_FOR_U32; 1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger memcpy(&data[1], &value32, 4); 1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger len = 5; 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return this->write(data, len); 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkWStream::writeStream(SkStream* stream, size_t length) { 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project char scratch[1024]; 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const size_t MAX = sizeof(scratch); 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (length != 0) { 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t n = length; 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (n > MAX) { 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project n = MAX; 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project stream->read(scratch, n); 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!this->write(scratch, n)) { 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project length -= n; 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkWStream::writeData(const SkData* data) { 1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (data) { 1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->write(data->data(), data->size()); 1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return true; 1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkFILEStream::SkFILEStream(const char file[]) : fName(file) 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fFILE = file ? sk_fopen(fName.c_str(), kRead_SkFILE_Flag) : NULL; 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkFILEStream::~SkFILEStream() 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fFILE) 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_fclose(fFILE); 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkFILEStream::setPath(const char path[]) 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fName.set(path); 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fFILE) 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_fclose(fFILE); 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fFILE = NULL; 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (path) 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fFILE = sk_fopen(fName.c_str(), kRead_SkFILE_Flag); 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkFILEStream::getFileName() 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fName.c_str(); 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkFILEStream::rewind() 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fFILE) 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (sk_frewind(fFILE)) 2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // we hit an error 2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_fclose(fFILE); 2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fFILE = NULL; 2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectsize_t SkFILEStream::read(void* buffer, size_t size) 2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fFILE) 2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (buffer == NULL && size == 0) // special signature, they want the total size 2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return sk_fgetsize(fFILE); 2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return sk_fread(buffer, size, fFILE); 2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkData* newFromParams(const void* src, size_t size, bool copyData) { 2551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (copyData) { 2561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkData::NewWithCopy(src, size); 2571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } else { 2581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkData::NewWithProc(src, size, NULL, NULL); 2591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2621cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkMemoryStream::SkMemoryStream() { 2631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fData = SkData::NewEmpty(); 2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fOffset = 0; 2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2671cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkMemoryStream::SkMemoryStream(size_t size) { 2681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fData = SkData::NewFromMalloc(sk_malloc_throw(size), size); 2691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fOffset = 0; 2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2721cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkMemoryStream::SkMemoryStream(const void* src, size_t size, bool copyData) { 2731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fData = newFromParams(src, size, copyData); 2741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fOffset = 0; 2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2771cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkMemoryStream::~SkMemoryStream() { 2781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fData->unref(); 2791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 2803a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen 2811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkMemoryStream::setMemoryOwned(const void* src, size_t size) { 2821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fData->unref(); 2831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fData = SkData::NewFromMalloc(src, size); 2843a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen fOffset = 0; 2853a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen} 2863a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen 2871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkMemoryStream::setMemory(const void* src, size_t size, bool copyData) { 2881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fData->unref(); 2891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fData = newFromParams(src, size, copyData); 2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fOffset = 0; 2911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2931cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkData* SkMemoryStream::copyToData() const { 2941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fData->ref(); 2951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return fData; 2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2981cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkData* SkMemoryStream::setData(SkData* data) { 2991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRefCnt_SafeAssign(fData, data); 3001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return data; 3011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 3021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 3031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkMemoryStream::skipToAlign4() { 3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // cast to remove unary-minus warning 3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fOffset += -(int)fOffset & 0x03; 3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkMemoryStream::rewind() { 3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fOffset = 0; 3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergersize_t SkMemoryStream::read(void* buffer, size_t size) { 3141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger size_t dataSize = fData->size(); 3151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (buffer == NULL && size == 0) // special signature, they want the total size 3171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return dataSize; 3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // if buffer is NULL, seek ahead by size 3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (size == 0) { 3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 3231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 3241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (size > dataSize - fOffset) { 3251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger size = dataSize - fOffset; 3261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (buffer) { 3281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger memcpy(buffer, fData->bytes() + fOffset, size); 3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fOffset += size; 3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return size; 3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerconst void* SkMemoryStream::getMemoryBase() { 3351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return fData->data(); 3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerconst void* SkMemoryStream::getAtPos() { 3391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return fData->bytes() + fOffset; 3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergersize_t SkMemoryStream::seek(size_t offset) { 3431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (offset > fData->size()) { 3441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger offset = fData->size(); 3451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fOffset = offset; 3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return offset; 3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBufferStream::SkBufferStream(SkStream* proxy, size_t bufferSize) 3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project : fProxy(proxy) 3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(proxy != NULL); 3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project proxy->ref(); 3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->init(NULL, bufferSize); 3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBufferStream::SkBufferStream(SkStream* proxy, void* buffer, size_t bufferSize) 3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project : fProxy(proxy) 3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(proxy != NULL); 3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(buffer == NULL || bufferSize != 0); // init(addr, 0) makes no sense, we must know how big their buffer is 3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project proxy->ref(); 3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->init(buffer, bufferSize); 3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkBufferStream::init(void* buffer, size_t bufferSize) 3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (bufferSize == 0) 3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bufferSize = kDefaultBufferSize; 3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fOrigBufferSize = bufferSize; 3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBufferSize = bufferSize; 3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBufferOffset = bufferSize; // to trigger a reload on the first read() 3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (buffer == NULL) 3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBuffer = (char*)sk_malloc_throw(fBufferSize); 3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fWeOwnTheBuffer = true; 3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBuffer = (char*)buffer; 3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fWeOwnTheBuffer = false; 3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBufferStream::~SkBufferStream() 3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fProxy->unref(); 3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fWeOwnTheBuffer) 3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_free(fBuffer); 3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkBufferStream::rewind() 3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBufferOffset = fBufferSize = fOrigBufferSize; 4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fProxy->rewind(); 4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkBufferStream::getFileName() 4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fProxy->getFileName(); 4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// #define SK_TRACE_BUFFERSTREAM 4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectsize_t SkBufferStream::read(void* buffer, size_t size) { 4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_TRACE_BUFFERSTREAM 4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("Request %d", size); 4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (buffer == NULL && size == 0) { 4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fProxy->read(buffer, size); // requesting total size 4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (0 == size) { 4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // skip size bytes 4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (NULL == buffer) { 4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t remaining = fBufferSize - fBufferOffset; 4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (remaining >= size) { 4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBufferOffset += size; 4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return size; 4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // if we get here, we are being asked to skip beyond our current buffer 4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // so reset our offset to force a read next time, and skip the diff 4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // in our proxy 4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBufferOffset = fOrigBufferSize; 4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return remaining + fProxy->read(NULL, size - remaining); 4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t s = size; 4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t actuallyRead = 0; 4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // flush what we can from our fBuffer 4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fBufferOffset < fBufferSize) 4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (s > fBufferSize - fBufferOffset) 4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project s = fBufferSize - fBufferOffset; 4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(buffer, fBuffer + fBufferOffset, s); 4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_TRACE_BUFFERSTREAM 4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf(" flush %d", s); 4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size -= s; 4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBufferOffset += s; 4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project buffer = (char*)buffer + s; 4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project actuallyRead = s; 4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // check if there is more to read 4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (size) 4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(fBufferOffset >= fBufferSize); // need to refill our fBuffer 4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (size < fBufferSize) // lets try to read more than the request 4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project s = fProxy->read(fBuffer, fBufferSize); 4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_TRACE_BUFFERSTREAM 4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf(" read %d into fBuffer", s); 4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (size > s) // they asked for too much 4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size = s; 4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (size) 4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(buffer, fBuffer, size); 4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project actuallyRead += size; 4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_TRACE_BUFFERSTREAM 4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf(" memcpy %d into dst", size); 4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBufferOffset = size; 4800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBufferSize = s; // record the (possibly smaller) size for the buffer 4810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else // just do a direct read 4830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 4840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project actuallyRead += fProxy->read(buffer, size); 4850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_TRACE_BUFFERSTREAM 4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf(" direct read %d", size); 4870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_TRACE_BUFFERSTREAM 4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("\n"); 4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return actuallyRead; 4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst void* SkBufferStream::getMemoryBase() 4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fProxy->getMemoryBase(); 4990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////////////////////////////// 5020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////////////////////////////// 5030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkFILEWStream::SkFILEWStream(const char path[]) 5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fFILE = sk_fopen(path, kWrite_SkFILE_Flag); 5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkFILEWStream::~SkFILEWStream() 5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fFILE) 5120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_fclose(fFILE); 5130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkFILEWStream::write(const void* buffer, size_t size) 5160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fFILE == NULL) 5180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 5190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (sk_fwrite(buffer, size, fFILE) != size) 5210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 5220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDEBUGCODE(SkDebugf("SkFILEWStream failed writing %d bytes\n", size);) 5230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_fclose(fFILE); 5240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fFILE = NULL; 5250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 5260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 5270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 5280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkFILEWStream::flush() 5310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fFILE) 5330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_fflush(fFILE); 5340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//////////////////////////////////////////////////////////////////////// 5370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkMemoryWStream::SkMemoryWStream(void* buffer, size_t size) 5390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project : fBuffer((char*)buffer), fMaxLength(size), fBytesWritten(0) 5400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkMemoryWStream::write(const void* buffer, size_t size) 5440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size = SkMin32(size, fMaxLength - fBytesWritten); 5460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (size > 0) 5470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 5480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(fBuffer + fBytesWritten, buffer, size); 5490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBytesWritten += size; 5500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 5510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 5520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 5530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//////////////////////////////////////////////////////////////////////// 5560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkDynamicMemoryWStream_MinBlockSize 256 5580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstruct SkDynamicMemoryWStream::Block { 5600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Block* fNext; 5610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project char* fCurr; 5620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project char* fStop; 5630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* start() const { return (const char*)(this + 1); } 5650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project char* start() { return (char*)(this + 1); } 5660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t avail() const { return fStop - fCurr; } 5670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t written() const { return fCurr - this->start(); } 5680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void init(size_t size) 5700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 5710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fNext = NULL; 5720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCurr = this->start(); 5730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fStop = this->start() + size; 5740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 5750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const void* append(const void* data, size_t size) 5770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 5780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT((size_t)(fStop - fCurr) >= size); 5790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(fCurr, data, size); 5800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fCurr += size; 5810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (const void*)((const char*)data + size); 5820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 5830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 5840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5851cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkDynamicMemoryWStream::SkDynamicMemoryWStream() 5861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger : fHead(NULL), fTail(NULL), fBytesWritten(0), fCopy(NULL) 5870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDynamicMemoryWStream::~SkDynamicMemoryWStream() 5910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project reset(); 5930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDynamicMemoryWStream::reset() 5960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->invalidateCopy(); 5981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 5990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Block* block = fHead; 6000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (block != NULL) { 6020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Block* next = block->fNext; 6030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project sk_free(block); 6040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project block = next; 6050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 6060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fHead = fTail = NULL; 6070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBytesWritten = 0; 6080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDynamicMemoryWStream::write(const void* buffer, size_t count) 6110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 6120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (count > 0) { 6131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->invalidateCopy(); 6140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBytesWritten += count; 6160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t size; 6180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fTail != NULL && fTail->avail() > 0) { 6200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size = SkMin32(fTail->avail(), count); 6210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project buffer = fTail->append(buffer, size); 6220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(count >= size); 6230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project count -= size; 6240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (count == 0) 6250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 6260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 6270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size = SkMax32(count, SkDynamicMemoryWStream_MinBlockSize); 6290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Block* block = (Block*)sk_malloc_throw(sizeof(Block) + size); 6300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project block->init(size); 6310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project block->append(buffer, count); 6320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fTail != NULL) 6340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fTail->fNext = block; 6350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 6360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fHead = fTail = block; 6370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fTail = block; 6380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 6390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 6400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDynamicMemoryWStream::write(const void* buffer, size_t offset, size_t count) 6430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 6441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (offset + count > fBytesWritten) { 6450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; // test does not partially modify 6461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 6471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 6481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->invalidateCopy(); 6491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 6500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Block* block = fHead; 6510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (block != NULL) { 6520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t size = block->written(); 6530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (offset < size) { 6540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t part = offset + count > size ? size - offset : count; 6550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(block->start() + offset, buffer, part); 6560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (count <= part) 6570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 6580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project count -= part; 6590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project buffer = (const void*) ((char* ) buffer + part); 6600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 6610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project offset = offset > size ? offset - size : 0; 6620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project block = block->fNext; 6630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 6640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 6650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDynamicMemoryWStream::read(void* buffer, size_t offset, size_t count) 6680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 6690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (offset + count > fBytesWritten) 6700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; // test does not partially modify 6710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Block* block = fHead; 6720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (block != NULL) { 6730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t size = block->written(); 6740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (offset < size) { 6750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t part = offset + count > size ? size - offset : count; 6760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(buffer, block->start() + offset, part); 6770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (count <= part) 6780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 6790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project count -= part; 6800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project buffer = (void*) ((char* ) buffer + part); 6810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 6820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project offset = offset > size ? offset - size : 0; 6830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project block = block->fNext; 6840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 6850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 6860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDynamicMemoryWStream::copyTo(void* dst) const 6890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 6901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (fCopy) { 6911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger memcpy(dst, fCopy->data(), fBytesWritten); 6921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } else { 6931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger Block* block = fHead; 6941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 6951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger while (block != NULL) { 6961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger size_t size = block->written(); 6971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger memcpy(dst, block->start(), size); 6981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger dst = (void*)((char*)dst + size); 6991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger block = block->fNext; 7001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 7010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 7020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 7030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDynamicMemoryWStream::padToAlign4() 7050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 7060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // cast to remove unary-minus warning 7070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int padBytes = -(int)fBytesWritten & 0x03; 7080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (padBytes == 0) 7090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 7100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int zero = 0; 7110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project write(&zero, padBytes); 7120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 7130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7141cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkData* SkDynamicMemoryWStream::copyToData() const { 7151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (NULL == fCopy) { 7161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void* buffer = sk_malloc_throw(fBytesWritten); 7171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->copyTo(buffer); 7181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fCopy = SkData::NewFromMalloc(buffer, fBytesWritten); 7191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 7201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fCopy->ref(); 7211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return fCopy; 7221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 7231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 7241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkDynamicMemoryWStream::invalidateCopy() { 7251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (fCopy) { 7261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fCopy->unref(); 7271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fCopy = NULL; 7281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 7291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 7301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 7311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 7320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDebugWStream::newline() 7340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 7350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 7360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("\n"); 7370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 7380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 7390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDebugWStream::write(const void* buffer, size_t size) 7410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 7420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 7430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project char* s = new char[size+1]; 7440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memcpy(s, buffer, size); 7450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project s[size] = 0; 7460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("%s", s); 7470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project delete[] s; 7480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 7490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 7500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 751