// Note: if the newSize == kReadToEnd (0), this function will read to the end of stream. bool bufferMoreData(size_t newSize) { if (newSize == kReadToEnd) { if (fWholeStreamRead) { // already read-to-end. return true; } // TODO: optimize for the special case when the input is SkMemoryStream. return SkStreamCopy(&fStreamBuffer, fStream.get()); } if (newSize <= fStreamBuffer.bytesWritten()) { // already buffered to newSize return true; } if (fWholeStreamRead) { // newSize is larger than the whole stream. return false; } // Try to read at least 8192 bytes to avoid to many small reads. const size_t kMinSizeToRead = 8192; const size_t sizeRequested = newSize - fStreamBuffer.bytesWritten(); const size_t sizeToRead = SkTMax(kMinSizeToRead, sizeRequested); SkAutoSTMalloc<kMinSizeToRead, uint8> tempBuffer(sizeToRead); const size_t bytesRead = fStream->read(tempBuffer.get(), sizeToRead); if (bytesRead < sizeRequested) { return false; } return fStreamBuffer.write(tempBuffer.get(), bytesRead); }
static void stream_copy_test(skiatest::Reporter* reporter, const void* srcData, size_t N, SkStream* stream) { SkDynamicMemoryWStream tgt; if (!SkStreamCopy(&tgt, stream)) { ERRORF(reporter, "SkStreamCopy failed"); return; } sk_sp<SkData> data(tgt.detachAsData()); if (data->size() != N) { ERRORF(reporter, "SkStreamCopy incorrect size"); return; } if (0 != memcmp(data->data(), srcData, N)) { ERRORF(reporter, "SkStreamCopy bad copy"); } }