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