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

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

Issue 2565323003: Move gif image decoder to SkCodec (Closed)
Patch Set: Rename variable. Return last-known frame count upon error / clearing 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() = default;
19
20 SegmentStream& SegmentStream::operator=(SegmentStream&& rhs) {
21 reader_ = std::move(rhs.reader_);
22 position_ = rhs.position_;
23 has_read_all_contents_ = rhs.has_read_all_contents_;
24 is_cleared_ = rhs.is_cleared_;
25
26 return *this;
27 }
28
29 void SegmentStream::SetReader(WTF::RefPtr<SegmentReader> reader) {
30 reader_ = std::move(reader);
31 SetPositionState(position_);
32 }
33
34 size_t SegmentStream::read(void* buffer, size_t size) {
35 if (is_cleared_)
36 return 0;
37
38 size = std::min(size, reader_->size() - position_);
39
40 size_t bytes_advanced = 0;
41 if (!buffer) { // skipping, not reading
42 bytes_advanced = size;
43 } else {
44 bytes_advanced = peek(buffer, size);
45 }
46
47 SetPositionState(position_ + bytes_advanced);
48
49 return bytes_advanced;
50 }
51
52 size_t SegmentStream::peek(void* buffer, size_t size) const {
53 if (is_cleared_)
54 return 0;
55
56 size = std::min(size, reader_->size() - position_);
57
58 size_t total_bytes_peeked = 0;
59 char* buffer_as_char_ptr = reinterpret_cast<char*>(buffer);
60 while (size) {
61 const char* segment = nullptr;
62 size_t bytes_peeked =
63 reader_->GetSomeData(segment, position_ + total_bytes_peeked);
64 if (!bytes_peeked)
65 break;
66 if (bytes_peeked > size)
67 bytes_peeked = size;
68
69 memcpy(buffer_as_char_ptr, segment, bytes_peeked);
70 buffer_as_char_ptr += bytes_peeked;
71 size -= bytes_peeked;
72 total_bytes_peeked += bytes_peeked;
73 }
74
75 return total_bytes_peeked;
76 }
77
78 bool SegmentStream::rewind() {
79 SetPositionState(0);
80 return true;
81 }
82
83 bool SegmentStream::seek(size_t position) {
84 SetPositionState(position);
85 return true;
86 }
87
88 bool SegmentStream::move(long offset) {
89 DCHECK_GT(offset, 0);
90 SetPositionState(position_ + offset);
91 return true;
92 }
93
94 void SegmentStream::SetPositionState(size_t new_position) {
95 position_ = new_position;
96 if (reader_) {
97 const size_t reader_size = reader_->size();
98 has_read_all_contents_ = position_ >= reader_size;
scroggo_chromium 2017/08/15 15:19:44 Instead of computing this value each time we chang
cblume 2017/08/15 18:03:33 Done.
99 is_cleared_ = position_ > reader_size;
100 } else {
101 has_read_all_contents_ = true;
102 is_cleared_ = true;
103 }
104 }
105
106 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698