| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkStream.h" | 10 #include "SkStream.h" |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 if (size > dataSize - fOffset) { | 360 if (size > dataSize - fOffset) { |
| 361 size = dataSize - fOffset; | 361 size = dataSize - fOffset; |
| 362 } | 362 } |
| 363 if (buffer) { | 363 if (buffer) { |
| 364 memcpy(buffer, fData->bytes() + fOffset, size); | 364 memcpy(buffer, fData->bytes() + fOffset, size); |
| 365 } | 365 } |
| 366 fOffset += size; | 366 fOffset += size; |
| 367 return size; | 367 return size; |
| 368 } | 368 } |
| 369 | 369 |
| 370 bool SkMemoryStream::peek(void* buffer, size_t size) const { | 370 size_t SkMemoryStream::peek(void* buffer, size_t size) const { |
| 371 SkASSERT(buffer != nullptr); | 371 SkASSERT(buffer != nullptr); |
| 372 const size_t position = fOffset; | 372 |
| 373 if (size > fData->size() - position) { | 373 const size_t currentOffset = fOffset; |
| 374 // The stream is not large enough to satisfy this request. | |
| 375 return false; | |
| 376 } | |
| 377 SkMemoryStream* nonConstThis = const_cast<SkMemoryStream*>(this); | 374 SkMemoryStream* nonConstThis = const_cast<SkMemoryStream*>(this); |
| 378 SkDEBUGCODE(const size_t bytesRead =) nonConstThis->read(buffer, size); | 375 const size_t bytesRead = nonConstThis->read(buffer, size); |
| 379 SkASSERT(bytesRead == size); | 376 nonConstThis->fOffset = currentOffset; |
| 380 nonConstThis->fOffset = position; | 377 return bytesRead; |
| 381 return true; | |
| 382 } | 378 } |
| 383 | 379 |
| 384 bool SkMemoryStream::isAtEnd() const { | 380 bool SkMemoryStream::isAtEnd() const { |
| 385 return fOffset == fData->size(); | 381 return fOffset == fData->size(); |
| 386 } | 382 } |
| 387 | 383 |
| 388 bool SkMemoryStream::rewind() { | 384 bool SkMemoryStream::rewind() { |
| 389 fOffset = 0; | 385 fOffset = 0; |
| 390 return true; | 386 return true; |
| 391 } | 387 } |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 fCurrentOffset = 0; | 714 fCurrentOffset = 0; |
| 719 } | 715 } |
| 720 SkASSERT(false); | 716 SkASSERT(false); |
| 721 return 0; | 717 return 0; |
| 722 } | 718 } |
| 723 | 719 |
| 724 bool isAtEnd() const override { | 720 bool isAtEnd() const override { |
| 725 return fOffset == fSize; | 721 return fOffset == fSize; |
| 726 } | 722 } |
| 727 | 723 |
| 728 bool peek(void* buff, size_t size) const override { | 724 size_t peek(void* buff, size_t bytesToPeek) const override { |
| 729 SkASSERT(buff != nullptr); | 725 SkASSERT(buff != nullptr); |
| 730 if (fOffset + size > fSize) { | 726 |
| 731 return false; | 727 bytesToPeek = SkTMin(bytesToPeek, fSize - fOffset); |
| 732 } | 728 |
| 729 size_t bytesLeftToPeek = bytesToPeek; |
| 733 char* buffer = static_cast<char*>(buff); | 730 char* buffer = static_cast<char*>(buff); |
| 734 const SkDynamicMemoryWStream::Block* current = fCurrent; | 731 const SkDynamicMemoryWStream::Block* current = fCurrent; |
| 735 size_t currentOffset = fCurrentOffset; | 732 size_t currentOffset = fCurrentOffset; |
| 736 while (size) { | 733 while (bytesLeftToPeek) { |
| 737 SkASSERT(current); | 734 SkASSERT(current); |
| 738 size_t bytesFromCurrent = | 735 size_t bytesFromCurrent = |
| 739 SkTMin(current->written() - currentOffset, size); | 736 SkTMin(current->written() - currentOffset, bytesLeftToPeek); |
| 740 memcpy(buffer, current->start() + currentOffset, bytesFromCurrent); | 737 memcpy(buffer, current->start() + currentOffset, bytesFromCurrent); |
| 741 size -= bytesFromCurrent; | 738 bytesLeftToPeek -= bytesFromCurrent; |
| 742 buffer += bytesFromCurrent; | 739 buffer += bytesFromCurrent; |
| 743 current = current->fNext; | 740 current = current->fNext; |
| 744 currentOffset = 0; | 741 currentOffset = 0; |
| 745 } | 742 } |
| 746 return true; | 743 return bytesToPeek; |
| 747 } | 744 } |
| 748 | 745 |
| 749 bool rewind() override { | 746 bool rewind() override { |
| 750 fCurrent = fBlockMemory->fHead; | 747 fCurrent = fBlockMemory->fHead; |
| 751 fOffset = 0; | 748 fOffset = 0; |
| 752 fCurrentOffset = 0; | 749 fCurrentOffset = 0; |
| 753 return true; | 750 return true; |
| 754 } | 751 } |
| 755 | 752 |
| 756 SkBlockMemoryStream* duplicate() const override { | 753 SkBlockMemoryStream* duplicate() const override { |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 972 while (true) { | 969 while (true) { |
| 973 count = input->read(scratch, sizeof(scratch)); | 970 count = input->read(scratch, sizeof(scratch)); |
| 974 if (0 == count) { | 971 if (0 == count) { |
| 975 return true; | 972 return true; |
| 976 } | 973 } |
| 977 if (!out->write(scratch, count)) { | 974 if (!out->write(scratch, count)) { |
| 978 return false; | 975 return false; |
| 979 } | 976 } |
| 980 } | 977 } |
| 981 } | 978 } |
| OLD | NEW |