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

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

Issue 2565323003: Move gif image decoder to SkCodec (Closed)
Patch Set: Fix build, mixImagesGif test, and verifyRepetitionCount test 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::move(long offset) {
73 long absolutePosition = m_position + offset;
74
75 // clamp inside the bounds of the buffer size
76 absolutePosition = std::max(absolutePosition, 0l);
77 absolutePosition =
78 std::min(static_cast<size_t>(absolutePosition), m_reader->size());
79
80 m_position = absolutePosition;
81 m_hasReadAllContents = m_position == m_reader->size();
82
83 return true;
84 }
85
86 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698