Chromium Code Reviews| Index: Source/platform/image-decoders/FastSharedBufferReader.cpp |
| diff --git a/Source/platform/image-decoders/FastSharedBufferReader.cpp b/Source/platform/image-decoders/FastSharedBufferReader.cpp |
| index 4475960fdcb4a12dab70112a482d779630b558e4..ac026c76ac642c8afc0f1815db77e751bc0ee5b9 100644 |
| --- a/Source/platform/image-decoders/FastSharedBufferReader.cpp |
| +++ b/Source/platform/image-decoders/FastSharedBufferReader.cpp |
| @@ -35,9 +35,13 @@ namespace blink { |
| FastSharedBufferReader::FastSharedBufferReader(PassRefPtr<SharedBuffer> data) |
| : m_data(data) |
| - , m_segment(0) |
| - , m_segmentLength(0) |
| - , m_dataPosition(0) |
| +{ |
| +} |
| + |
| +FastSharedBufferReader::Cache::Cache() |
| + : segment(0) |
| + , segmentLength(0) |
| + , dataPosition(0) |
| { |
| } |
| @@ -46,36 +50,45 @@ const char* FastSharedBufferReader::getConsecutiveData(size_t dataPosition, size |
| RELEASE_ASSERT(dataPosition + length <= m_data->size()); |
| // Use the cached segment if it can serve the request. |
| - if (dataPosition >= m_dataPosition && dataPosition + length <= m_dataPosition + m_segmentLength) |
| - return m_segment + dataPosition - m_dataPosition; |
| + size_t cacheEndPosition = m_cache.dataPosition + m_cache.segmentLength; |
| + if (dataPosition >= m_cache.dataPosition && dataPosition + length <= cacheEndPosition) { |
| + size_t skip = dataPosition - m_cache.dataPosition; |
| + return m_cache.segment + skip; |
| + } |
|
Peter Kasting
2015/03/25 19:53:11
Nit: The old code was more readable than this more
|
| // Return a pointer into |m_data| if the request doesn't span segments. |
| - m_dataPosition = dataPosition; |
| - m_segmentLength = m_data->getSomeData(m_segment, m_dataPosition); |
| - ASSERT(m_segmentLength); |
| - if (length <= m_segmentLength) |
| - return m_segment; |
| + getSomeDataIntoCache(dataPosition); |
| + if (length <= m_cache.segmentLength) |
| + return m_cache.segment; |
| - for (char* tempBuffer = buffer; length;) { |
| - size_t copy = std::min(length, m_segmentLength); |
| - memcpy(tempBuffer, m_segment, copy); |
| - m_dataPosition += copy; |
| + for (const char* dest = buffer; ; ) { |
| + size_t copy = std::min(length, m_cache.segmentLength); |
| + memcpy(dest, m_cache.segment, copy); |
| length -= copy; |
| - tempBuffer += copy; |
| + if (!length) { |
| + // Done. |
|
Peter Kasting
2015/03/25 19:53:11
Nit: This comment adds nothing, remove it.
|
| + return buffer; |
| + } |
| - m_segmentLength = m_data->getSomeData(m_segment, m_dataPosition); |
| - ASSERT(m_segmentLength); |
| + // Continue reading the next segment. |
| + dest += copy; |
|
Peter Kasting
2015/03/25 19:53:11
Nit: Can place this into the for loop declaration.
kbalazs
2015/03/25 21:05:19
copy is local to the loop
Peter Kasting
2015/03/25 21:10:47
True. Ignore that.
|
| + dataPosition += copy; |
|
Peter Kasting
2015/03/25 19:53:11
Nit: Can omit this line and just pass (m_dataPosit
|
| + getSomeDataIntoCache(dataPosition); |
| } |
| - return buffer; |
| } |
| size_t FastSharedBufferReader::getSomeData(const char*& someData, size_t dataPosition) |
| { |
| - m_segmentLength = m_data->getSomeData(m_segment, dataPosition); |
| - someData = m_segment; |
| - m_dataPosition = dataPosition; |
| - ASSERT(m_segmentLength); |
| - return m_segmentLength; |
| + getSomeDataIntoCache(dataPosition); |
| + someData = m_cache.segment; |
| + return m_cache.segmentLength; |
| +} |
| + |
| +void FastSharedBufferReader::getSomeDataIntoCache(unsigned dataPosition) |
| +{ |
| + m_cache.dataPosition = dataPosition; |
| + m_cache.segmentLength = m_data->getSomeData(m_cache.segment, dataPosition); |
| + ASSERT(m_cache.segmentLength); |
| } |
| } // namespace blink |