diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-11-20 15:06:40 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-11-22 11:48:58 +0000 |
commit | daa093eea7c773db06799a13bd7e4e2e2a9f8f14 (patch) | |
tree | 96cc5e7b9194c1b29eab927730bfa419e7111c25 /chromium/pdf/chunk_stream.h | |
parent | be59a35641616a4cf23c4a13fa0632624b021c1b (diff) | |
download | qtwebengine-chromium-daa093eea7c773db06799a13bd7e4e2e2a9f8f14.tar.gz |
BASELINE: Update Chromium to 63.0.3239.58
Change-Id: Ia93b322a00ba4dd4004f3bcf1254063ba90e1605
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/pdf/chunk_stream.h')
-rw-r--r-- | chromium/pdf/chunk_stream.h | 119 |
1 files changed, 86 insertions, 33 deletions
diff --git a/chromium/pdf/chunk_stream.h b/chromium/pdf/chunk_stream.h index 762bc3925dd..b8b3c831e90 100644 --- a/chromium/pdf/chunk_stream.h +++ b/chromium/pdf/chunk_stream.h @@ -6,50 +6,103 @@ #define PDF_CHUNK_STREAM_H_ #include <stddef.h> +#include <string.h> -#include <map> -#include <utility> +#include <algorithm> +#include <array> +#include <memory> #include <vector> +#include "pdf/range_set.h" + namespace chrome_pdf { // This class collects a chunks of data into one data stream. Client can check // if data in certain range is available, and get missing chunks of data. +template <uint32_t N> class ChunkStream { public: - ChunkStream(); - ~ChunkStream(); - - void Clear(); - - void Preallocate(size_t stream_size); - size_t GetSize() const; - - bool WriteData(size_t offset, void* buffer, size_t size); - bool ReadData(size_t offset, size_t size, void* buffer) const; - - // Returns vector of pairs where first is an offset, second is a size. - bool GetMissedRanges(size_t offset, - size_t size, - std::vector<std::pair<size_t, size_t>>* ranges) const; - bool IsRangeAvailable(size_t offset, size_t size) const; - size_t GetFirstMissingByte() const; - - // Finds the first byte of the missing byte interval that offset belongs to. - size_t GetFirstMissingByteInInterval(size_t offset) const; - // Returns the last byte of the missing byte interval that offset belongs to. - size_t GetLastMissingByteInInterval(size_t offset) const; + static constexpr uint32_t kChunkSize = N; + using ChunkData = typename std::array<unsigned char, N>; + + ChunkStream() {} + ~ChunkStream() {} + + void SetChunkData(uint32_t chunk_index, std::unique_ptr<ChunkData> data) { + if (!data) + return; + if (chunk_index >= data_.size()) { + data_.resize(chunk_index + 1); + } + if (!data_[chunk_index]) { + ++filled_chunks_count_; + } + data_[chunk_index] = std::move(data); + filled_chunks_.Union(gfx::Range(chunk_index, chunk_index + 1)); + } + + bool ReadData(const gfx::Range& range, void* buffer) const { + if (!IsRangeAvailable(range)) { + return false; + } + unsigned char* data_buffer = static_cast<unsigned char*>(buffer); + uint32_t start = range.start(); + while (start != range.end()) { + const uint32_t chunk_index = GetChunkIndex(start); + const uint32_t chunk_start = start % kChunkSize; + const uint32_t len = + std::min(kChunkSize - chunk_start, range.end() - start); + memcpy(data_buffer, data_[chunk_index]->data() + chunk_start, len); + data_buffer += len; + start += len; + } + return true; + } + + uint32_t GetChunkIndex(uint32_t offset) const { return offset / kChunkSize; } + + gfx::Range GetChunksRange(uint32_t offset, uint32_t size) const { + return gfx::Range(GetChunkIndex(offset), + GetChunkIndex(offset + size + kChunkSize - 1)); + } + + bool IsRangeAvailable(const gfx::Range& range) const { + if (!range.IsValid() || range.is_reversed() || + (eof_pos_ > 0 && eof_pos_ < range.end())) + return false; + if (range.is_empty()) + return true; + const gfx::Range chunks_range(GetChunkIndex(range.start()), + GetChunkIndex(range.end() + kChunkSize - 1)); + return filled_chunks_.Contains(chunks_range); + } + + void set_eof_pos(uint32_t eof_pos) { eof_pos_ = eof_pos; } + uint32_t eof_pos() const { return eof_pos_; } + + const RangeSet& filled_chunks() const { return filled_chunks_; } + + bool IsComplete() const { + return eof_pos_ > 0 && IsRangeAvailable(gfx::Range(0, eof_pos_)); + } + + void Clear() { + data_.clear(); + eof_pos_ = 0; + filled_chunks_.Clear(); + filled_chunks_count_ = 0; + } + + uint32_t filled_chunks_count() const { return filled_chunks_count_; } + uint32_t total_chunks_count() const { + return GetChunkIndex(eof_pos_ + kChunkSize - 1); + } private: - std::map<size_t, size_t>::const_iterator GetStartChunk(size_t offset) const; - - std::vector<unsigned char> data_; - - // Key: offset of the chunk. - // Value: size of the chunk. - std::map<size_t, size_t> chunks_; - - size_t stream_size_; + std::vector<std::unique_ptr<ChunkData>> data_; + uint32_t eof_pos_ = 0; + RangeSet filled_chunks_; + uint32_t filled_chunks_count_ = 0; }; }; // namespace chrome_pdf |