Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: src/core/SkStream.cpp

Issue 1490923005: Allow SkStream::peek() to partially succeed (Closed) Base URL: https://skia.googlesource.com/skia.git@wbmp
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/core/SkStream.h ('k') | src/utils/SkFrontBufferedStream.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
373 if (this->isAtEnd()) {
bungeman-skia 2015/12/07 16:17:36 This block seems redundant, though maybe an optimi
scroggo 2015/12/07 16:52:02 Removed.
374 return 0;
375 }
376
377 SkASSERT(fData->size() > fOffset);
bungeman-skia 2015/12/07 16:17:36 This assert depends on the above block to remove t
scroggo 2015/12/07 16:52:02 Removed.
372 const size_t position = fOffset; 378 const size_t position = fOffset;
bungeman-skia 2015/12/07 16:17:36 It seems this be clearer (or at least more consist
scroggo 2015/12/07 16:52:02 Done.
373 if (size > fData->size() - position) { 379 size = SkTMin(size, fData->size() - position);
bungeman-skia 2015/12/07 16:17:36 Is there a reason to calculate this? This is what
scroggo 2015/12/07 16:52:02 Done.
374 // The stream is not large enough to satisfy this request. 380
375 return false;
376 }
377 SkMemoryStream* nonConstThis = const_cast<SkMemoryStream*>(this); 381 SkMemoryStream* nonConstThis = const_cast<SkMemoryStream*>(this);
378 SkDEBUGCODE(const size_t bytesRead =) nonConstThis->read(buffer, size); 382 SkDEBUGCODE(const size_t bytesRead =) nonConstThis->read(buffer, size);
379 SkASSERT(bytesRead == size); 383 SkASSERT(bytesRead == size);
380 nonConstThis->fOffset = position; 384 nonConstThis->fOffset = position;
381 return true; 385 return size;
382 } 386 }
383 387
384 bool SkMemoryStream::isAtEnd() const { 388 bool SkMemoryStream::isAtEnd() const {
385 return fOffset == fData->size(); 389 return fOffset == fData->size();
386 } 390 }
387 391
388 bool SkMemoryStream::rewind() { 392 bool SkMemoryStream::rewind() {
389 fOffset = 0; 393 fOffset = 0;
390 return true; 394 return true;
391 } 395 }
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 fCurrentOffset = 0; 722 fCurrentOffset = 0;
719 } 723 }
720 SkASSERT(false); 724 SkASSERT(false);
721 return 0; 725 return 0;
722 } 726 }
723 727
724 bool isAtEnd() const override { 728 bool isAtEnd() const override {
725 return fOffset == fSize; 729 return fOffset == fSize;
726 } 730 }
727 731
728 bool peek(void* buff, size_t size) const override { 732 size_t peek(void* buff, size_t size) const override {
729 SkASSERT(buff != nullptr); 733 SkASSERT(buff != nullptr);
730 if (fOffset + size > fSize) { 734
731 return false; 735 if (this->isAtEnd()) {
bungeman-skia 2015/12/07 16:17:36 As above, this appears to be unneeded.
scroggo 2015/12/07 16:52:02 Removed
736 return 0;
732 } 737 }
738
739 SkASSERT(fSize > fOffset);
bungeman-skia 2015/12/07 16:17:36 And 'SkASSERT(fSize >= fOffset);' should be a gene
scroggo 2015/12/07 16:52:02 Removed
740 size = SkTMin(size, fSize - fOffset);
741
742 const size_t totalBytesToPeek = size;
bungeman-skia 2015/12/07 16:17:36 Since we have to maintain size now to return it, I
scroggo 2015/12/07 16:52:02 Changed. I think I did as you requested; let me kn
733 char* buffer = static_cast<char*>(buff); 743 char* buffer = static_cast<char*>(buff);
734 const SkDynamicMemoryWStream::Block* current = fCurrent; 744 const SkDynamicMemoryWStream::Block* current = fCurrent;
735 size_t currentOffset = fCurrentOffset; 745 size_t currentOffset = fCurrentOffset;
736 while (size) { 746 while (size) {
737 SkASSERT(current); 747 SkASSERT(current);
738 size_t bytesFromCurrent = 748 size_t bytesFromCurrent =
739 SkTMin(current->written() - currentOffset, size); 749 SkTMin(current->written() - currentOffset, size);
740 memcpy(buffer, current->start() + currentOffset, bytesFromCurrent); 750 memcpy(buffer, current->start() + currentOffset, bytesFromCurrent);
741 size -= bytesFromCurrent; 751 size -= bytesFromCurrent;
742 buffer += bytesFromCurrent; 752 buffer += bytesFromCurrent;
743 current = current->fNext; 753 current = current->fNext;
744 currentOffset = 0; 754 currentOffset = 0;
745 } 755 }
746 return true; 756 return totalBytesToPeek;
747 } 757 }
748 758
749 bool rewind() override { 759 bool rewind() override {
750 fCurrent = fBlockMemory->fHead; 760 fCurrent = fBlockMemory->fHead;
751 fOffset = 0; 761 fOffset = 0;
752 fCurrentOffset = 0; 762 fCurrentOffset = 0;
753 return true; 763 return true;
754 } 764 }
755 765
756 SkBlockMemoryStream* duplicate() const override { 766 SkBlockMemoryStream* duplicate() const override {
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 while (true) { 982 while (true) {
973 count = input->read(scratch, sizeof(scratch)); 983 count = input->read(scratch, sizeof(scratch));
974 if (0 == count) { 984 if (0 == count) {
975 return true; 985 return true;
976 } 986 }
977 if (!out->write(scratch, count)) { 987 if (!out->write(scratch, count)) {
978 return false; 988 return false;
979 } 989 }
980 } 990 }
981 } 991 }
OLDNEW
« no previous file with comments | « include/core/SkStream.h ('k') | src/utils/SkFrontBufferedStream.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698