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

Side by Side Diff: third_party/WebKit/Source/platform/image-decoders/SegmentStream.cpp

Issue 2565323003: Move gif image decoder to SkCodec (Closed)
Patch Set: Correct comments. Better variable names. Better DCHECK. Created 3 years, 4 months 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
OLDNEW
(Empty)
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "platform/image-decoders/SegmentStream.h"
6 #include <utility>
7
8 namespace blink {
9
10 SegmentStream::SegmentStream() = default;
11
12 SegmentStream::SegmentStream(SegmentStream&& rhs)
13 : reader_(std::move(rhs.reader_)),
14 position_(rhs.position_),
15 has_read_all_contents_(rhs.has_read_all_contents_),
16 is_cleared_(rhs.is_cleared_) {}
17
18 SegmentStream& SegmentStream::operator=(SegmentStream&& rhs) {
19 reader_ = std::move(rhs.reader_);
20 position_ = rhs.position_;
21 has_read_all_contents_ = rhs.has_read_all_contents_;
22 is_cleared_ = rhs.is_cleared_;
23
24 return *this;
25 }
26
27 void SegmentStream::SetReader(WTF::PassRefPtr<SegmentReader> reader) {
28 reader_ = std::move(reader);
29 SetPositionState(position_);
30 }
31
32 size_t SegmentStream::read(void* buffer, size_t size) {
33 if (is_cleared_)
34 return 0;
35
36 size = std::min(size, reader_->size() - position_);
37
38 size_t bytes_advanced = 0;
39 if (!buffer) { // skipping, not reading
40 bytes_advanced = size;
41 } else {
42 bytes_advanced = peek(buffer, size);
43 }
44
45 SetPositionState(position_ + bytes_advanced);
46
47 return bytes_advanced;
48 }
49
50 size_t SegmentStream::peek(void* buffer, size_t size) const {
51 if (is_cleared_)
52 return 0;
53
54 size = std::min(size, reader_->size() - position_);
55
56 size_t total_bytes_peeked = 0;
57 char* buffer_as_char_ptr = reinterpret_cast<char*>(buffer);
58 while (size) {
59 const char* segment = nullptr;
60 size_t bytes_peeked =
61 reader_->GetSomeData(segment, position_ + total_bytes_peeked);
62 if (!bytes_peeked)
63 break;
64 if (bytes_peeked > size)
65 bytes_peeked = size;
66
67 memcpy(buffer_as_char_ptr, segment, bytes_peeked);
68 buffer_as_char_ptr += bytes_peeked;
69 size -= bytes_peeked;
70 total_bytes_peeked += bytes_peeked;
71 }
72
73 return total_bytes_peeked;
74 }
75
76 bool SegmentStream::rewind() {
77 SetPositionState(0);
78 return true;
79 }
80
81 bool SegmentStream::seek(size_t position) {
82 SetPositionState(position);
83 return true;
84 }
85
86 bool SegmentStream::move(long offset) {
87 DCHECK_GT(offset, 0);
scroggo_chromium 2017/08/08 19:39:25 In [1], vmpstr@ suggested that you "DCHECK absolut
cblume 2017/08/09 17:29:29 position_ is a size_t and can never be negative. T
scroggo_chromium 2017/08/09 17:50:48 sgtm
88 SetPositionState(position_ + offset);
89 return true;
90 }
91
92 void SegmentStream::SetPositionState(size_t new_position) {
93 position_ = new_position;
94 if (reader_) {
95 const size_t reader_size = reader_->size();
96 has_read_all_contents_ = position_ >= reader_size;
97 is_cleared_ = position_ > reader_size;
98 } else {
99 has_read_all_contents_ = true;
100 is_cleared_ = true;
101 }
102 }
103
104 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698