size_t FrontBufferedStream::readDirectlyFromStream(char* dst, size_t size) { SkASSERT(size > 0); // If we get here, we have buffered all that can be buffered. SkASSERT(fBufferSize == fBufferedSoFar && fOffset >= fBufferSize); const size_t bytesReadDirectly = fStream->read(dst, size); fOffset += bytesReadDirectly; // If we have read past the end of the buffer, rewinding is no longer // supported, so we can go ahead and free the memory. if (bytesReadDirectly > 0) { sk_free(fBuffer.detach()); } return bytesReadDirectly; }
size_t FrontBufferedStream::bufferAndWriteTo(char* dst, size_t size) { SkASSERT(size > 0); SkASSERT(fOffset >= fBufferedSoFar); SkASSERT(fBuffer); // Data needs to be buffered. Buffer up to the lesser of the size requested // and the remainder of the max buffer size. const size_t bytesToBuffer = SkTMin(size, fBufferSize - fBufferedSoFar); char* buffer = fBuffer + fOffset; const size_t buffered = fStream->read(buffer, bytesToBuffer); fBufferedSoFar += buffered; fOffset = fBufferedSoFar; SkASSERT(fBufferedSoFar <= fBufferSize); // Copy the buffer to the destination buffer and update the amount read. if (dst != NULL) { memcpy(dst, buffer, buffered); } return buffered; }