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

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

Issue 2565323003: Move gif image decoder to SkCodec (Closed)
Patch Set: Adding SegmentStreamTest.cpp, more null checks, and updating m_hasReadAllContents more. Created 3 years, 8 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
7 namespace blink {
8
9 SegmentStream::SegmentStream()
10 : m_reader(),
11 m_position(0),
12 m_hasReadAllContents(true),
13 m_isCleared(true) {}
14
15 void SegmentStream::setReader(SegmentReader* reader, bool allContentsReceived) {
16 m_reader = reader;
17 if (reader) {
18 m_hasReadAllContents = reader->size() == m_position;
19 m_isCleared = m_position > m_reader->size();
20 } else {
21 m_hasReadAllContents = true;
22 m_isCleared = true;
23 }
24 }
25
26 size_t SegmentStream::read(void* buffer, size_t size) {
27 if (m_isCleared)
28 return 0;
29
30 size = std::min(size, m_reader->size() - m_position);
31
32 size_t bytesAdvanced = 0;
33 if (!buffer) { // skipping, not reading
34 bytesAdvanced = size;
35 } else {
36 bytesAdvanced = peek(buffer, size);
37 }
38
39 m_position += bytesAdvanced;
40 m_hasReadAllContents = m_position == m_reader->size();
41
42 return bytesAdvanced;
43 }
44
45 size_t SegmentStream::peek(void* buffer, size_t size) const {
46 if (m_isCleared)
47 return 0;
48
49 size = std::min(size, m_reader->size() - m_position);
50
51 size_t peekPosition = m_position;
52 size_t totalBytesPeeked = 0;
53 char* bufferAsCharPtr = reinterpret_cast<char*>(buffer);
54 while (size) {
55 const char* segment = nullptr;
56 size_t bytesPeeked = m_reader->getSomeData(segment, peekPosition);
57 if (!bytesPeeked)
58 break;
59 if (bytesPeeked > size)
60 bytesPeeked = size;
61
62 memcpy(bufferAsCharPtr, segment, bytesPeeked);
63 bufferAsCharPtr += bytesPeeked;
64 size -= bytesPeeked;
65 totalBytesPeeked += bytesPeeked;
66 peekPosition += bytesPeeked;
67 }
68
69 return totalBytesPeeked;
70 }
71
72 bool SegmentStream::rewind() {
73 m_position = 0;
74 m_hasReadAllContents = true;
75 if (m_reader)
76 m_hasReadAllContents = m_position == m_reader->size();
77
78 return true;
79 }
80
81 bool SegmentStream::seek(size_t position) {
82 m_hasReadAllContents = true;
83 if (m_reader) {
84 position = std::min(position, m_reader->size());
85 m_hasReadAllContents = position == m_reader->size();
86 }
87 m_position = position;
88
89 return true;
90 }
91
92 bool SegmentStream::move(long offset) {
93 long absolutePosition = m_position + offset;
94
95 // clamp inside the bounds of the buffer size
96 absolutePosition = std::max(absolutePosition, 0l);
97 absolutePosition =
98 std::min(static_cast<size_t>(absolutePosition), m_reader->size());
99
100 m_position = absolutePosition;
101 m_hasReadAllContents = m_position == m_reader->size();
102
103 return true;
104 }
105
106 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698