Use span<uint8_t> in more fxcodec code. There are also small tweaks in tests to ensure strict order of stack variable lifetimes. Change-Id: Ic9d5c6a2bdd378b517be627f8e29f725bafdc2ad Reviewed-on: https://pdfium-review.googlesource.com/41310 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcodec/bmp/cfx_bmpdecompressor.cpp b/core/fxcodec/bmp/cfx_bmpdecompressor.cpp index 3839556..a25afdf 100644 --- a/core/fxcodec/bmp/cfx_bmpdecompressor.cpp +++ b/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
@@ -659,8 +659,8 @@ decode_status_ = status; } -void CFX_BmpDecompressor::SetInputBuffer(uint8_t* src_buf, uint32_t src_size) { - input_buffer_ = pdfium::MakeRetain<CFX_CodecMemory>(src_buf, src_size); +void CFX_BmpDecompressor::SetInputBuffer(pdfium::span<uint8_t> src_buf) { + input_buffer_ = pdfium::MakeRetain<CFX_CodecMemory>(src_buf); } FX_FILESIZE CFX_BmpDecompressor::GetAvailInput(uint8_t** avail_buf) {
diff --git a/core/fxcodec/bmp/cfx_bmpdecompressor.h b/core/fxcodec/bmp/cfx_bmpdecompressor.h index 5192978..ed013a2 100644 --- a/core/fxcodec/bmp/cfx_bmpdecompressor.h +++ b/core/fxcodec/bmp/cfx_bmpdecompressor.h
@@ -15,6 +15,7 @@ #include <vector> #include "core/fxcodec/codec/cfx_codec_memory.h" +#include "third_party/base/span.h" class CFX_BmpContext; @@ -26,7 +27,7 @@ void Error(); int32_t DecodeImage(); int32_t ReadHeader(); - void SetInputBuffer(uint8_t* src_buf, uint32_t src_size); + void SetInputBuffer(pdfium::span<uint8_t> src_buf); FX_FILESIZE GetAvailInput(uint8_t** avail_buf); jmp_buf jmpbuf_;
diff --git a/core/fxcodec/codec/ccodec_bmpmodule.cpp b/core/fxcodec/codec/ccodec_bmpmodule.cpp index f4bfa01..75e59ed 100644 --- a/core/fxcodec/codec/ccodec_bmpmodule.cpp +++ b/core/fxcodec/codec/ccodec_bmpmodule.cpp
@@ -69,9 +69,6 @@ return ctx->m_Bmp.GetAvailInput(avail_buf_ptr); } -void CCodec_BmpModule::Input(Context* pContext, - uint8_t* src_buf, - uint32_t src_size) { - auto* ctx = static_cast<CFX_BmpContext*>(pContext); - ctx->m_Bmp.SetInputBuffer(src_buf, src_size); +void CCodec_BmpModule::Input(Context* pContext, pdfium::span<uint8_t> src_buf) { + static_cast<CFX_BmpContext*>(pContext)->m_Bmp.SetInputBuffer(src_buf); }
diff --git a/core/fxcodec/codec/ccodec_bmpmodule.h b/core/fxcodec/codec/ccodec_bmpmodule.h index ca2340d..42d686e 100644 --- a/core/fxcodec/codec/ccodec_bmpmodule.h +++ b/core/fxcodec/codec/ccodec_bmpmodule.h
@@ -12,6 +12,7 @@ #include "core/fxcrt/fx_system.h" #include "core/fxcrt/unowned_ptr.h" +#include "third_party/base/span.h" class CFX_DIBAttribute; @@ -34,7 +35,7 @@ std::unique_ptr<Context> Start(Delegate* pDelegate); FX_FILESIZE GetAvailInput(Context* pContext, uint8_t** avail_buf_ptr); - void Input(Context* pContext, uint8_t* src_buf, uint32_t src_size); + void Input(Context* pContext, pdfium::span<uint8_t> src_buf); int32_t ReadHeader(Context* pContext, int32_t* width, int32_t* height,
diff --git a/core/fxcodec/codec/ccodec_gifmodule.cpp b/core/fxcodec/codec/ccodec_gifmodule.cpp index 7bf216e..872d90f 100644 --- a/core/fxcodec/codec/ccodec_gifmodule.cpp +++ b/core/fxcodec/codec/ccodec_gifmodule.cpp
@@ -72,9 +72,6 @@ return context->GetAvailInput(avail_buf_ptr); } -void CCodec_GifModule::Input(Context* pContext, - const uint8_t* src_buf, - uint32_t src_size) { - auto* context = static_cast<CFX_GifContext*>(pContext); - context->SetInputBuffer((uint8_t*)src_buf, src_size); +void CCodec_GifModule::Input(Context* pContext, pdfium::span<uint8_t> src_buf) { + static_cast<CFX_GifContext*>(pContext)->SetInputBuffer(src_buf); }
diff --git a/core/fxcodec/codec/ccodec_gifmodule.h b/core/fxcodec/codec/ccodec_gifmodule.h index cbc8fc6..f14665b 100644 --- a/core/fxcodec/codec/ccodec_gifmodule.h +++ b/core/fxcodec/codec/ccodec_gifmodule.h
@@ -13,6 +13,7 @@ #include "core/fxcodec/gif/cfx_gif.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_system.h" +#include "third_party/base/span.h" class CFX_DIBAttribute; @@ -43,7 +44,7 @@ std::unique_ptr<Context> Start(Delegate* pDelegate); uint32_t GetAvailInput(Context* context, uint8_t** avail_buf_ptr); - void Input(Context* context, const uint8_t* src_buf, uint32_t src_size); + void Input(Context* context, pdfium::span<uint8_t> src_buf); CFX_GifDecodeStatus ReadHeader(Context* context, int* width, int* height,
diff --git a/core/fxcodec/codec/cfx_codec_memory.cpp b/core/fxcodec/codec/cfx_codec_memory.cpp index 8eac02c..b8cf97b 100644 --- a/core/fxcodec/codec/cfx_codec_memory.cpp +++ b/core/fxcodec/codec/cfx_codec_memory.cpp
@@ -6,13 +6,13 @@ #include <algorithm> -CFX_CodecMemory::CFX_CodecMemory(uint8_t* buffer, size_t size) - : buffer_(buffer), size_(size) {} +CFX_CodecMemory::CFX_CodecMemory(pdfium::span<uint8_t> buffer) + : buffer_(buffer) {} CFX_CodecMemory::~CFX_CodecMemory() = default; bool CFX_CodecMemory::Seek(size_t pos) { - if (pos > size_) + if (pos > buffer_.size()) return false; pos_ = pos; @@ -23,7 +23,7 @@ if (!buffer || !size || IsEOF()) return 0; - size_t bytes_to_read = std::min(size, size_ - pos_); + size_t bytes_to_read = std::min(size, buffer_.size() - pos_); memcpy(buffer, &buffer_[pos_], bytes_to_read); pos_ += bytes_to_read; return bytes_to_read;
diff --git a/core/fxcodec/codec/cfx_codec_memory.h b/core/fxcodec/codec/cfx_codec_memory.h index 6eee72a..e726dc5 100644 --- a/core/fxcodec/codec/cfx_codec_memory.h +++ b/core/fxcodec/codec/cfx_codec_memory.h
@@ -6,27 +6,27 @@ #define CORE_FXCODEC_CODEC_CFX_CODEC_MEMORY_H_ #include "core/fxcrt/retain_ptr.h" +#include "third_party/base/span.h" class CFX_CodecMemory : public Retainable { public: template <typename T, typename... Args> friend RetainPtr<T> pdfium::MakeRetain(Args&&... args); - uint8_t* GetBuffer() { return buffer_; } - size_t GetSize() const { return size_; } + uint8_t* GetBuffer() { return buffer_.data(); } + size_t GetSize() const { return buffer_.size(); } size_t GetPosition() const { return pos_; } - bool IsEOF() const { return pos_ >= size_; } + bool IsEOF() const { return pos_ >= buffer_.size(); } size_t ReadBlock(void* buffer, size_t size); // Sets the cursor position to |pos| if possible. bool Seek(size_t pos); private: - CFX_CodecMemory(uint8_t* buffer, size_t size); + explicit CFX_CodecMemory(pdfium::span<uint8_t> buffer); ~CFX_CodecMemory() override; - uint8_t* const buffer_; - const size_t size_; + pdfium::span<uint8_t> const buffer_; size_t pos_ = 0; };
diff --git a/core/fxcodec/codec/fx_codec_progress.cpp b/core/fxcodec/codec/fx_codec_progress.cpp index 8ebb119..c5fb1e3 100644 --- a/core/fxcodec/codec/fx_codec_progress.cpp +++ b/core/fxcodec/codec/fx_codec_progress.cpp
@@ -765,7 +765,7 @@ } m_offSet += size; - pBmpModule->Input(m_pBmpContext.get(), m_pSrcBuf, size); + pBmpModule->Input(m_pBmpContext.get(), {m_pSrcBuf, size}); std::vector<uint32_t> palette; int32_t readResult = pBmpModule->ReadHeader( m_pBmpContext.get(), &m_SrcWidth, &m_SrcHeight, &m_BmpIsTopBottom, @@ -873,7 +873,7 @@ return false; } m_offSet += dwSize; - pBmpModule->Input(m_pBmpContext.get(), m_pSrcBuf, dwSize + dwAvail); + pBmpModule->Input(m_pBmpContext.get(), {m_pSrcBuf, dwSize + dwAvail}); return true; } @@ -969,8 +969,8 @@ } m_offSet += dwAmountToFetchFromFile; - pGifModule->Input(m_pGifContext.get(), m_pSrcBuf, - dwAmountToFetchFromFile + dwUnusedBuffer); + pGifModule->Input(m_pGifContext.get(), + {m_pSrcBuf, dwAmountToFetchFromFile + dwUnusedBuffer}); m_InvalidateGifBuffer = false; return true; } @@ -989,7 +989,7 @@ return false; } m_offSet += size; - pGifModule->Input(m_pGifContext.get(), m_pSrcBuf, size); + pGifModule->Input(m_pGifContext.get(), {m_pSrcBuf, size}); m_SrcComponents = 1; CFX_GifDecodeStatus readResult = pGifModule->ReadHeader( m_pGifContext.get(), &m_SrcWidth, &m_SrcHeight, &m_GifPltNumber,
diff --git a/core/fxcodec/gif/cfx_gifcontext.cpp b/core/fxcodec/gif/cfx_gifcontext.cpp index 4083072..f746bc1 100644 --- a/core/fxcodec/gif/cfx_gifcontext.cpp +++ b/core/fxcodec/gif/cfx_gifcontext.cpp
@@ -342,8 +342,8 @@ return CFX_GifDecodeStatus::Error; } -void CFX_GifContext::SetInputBuffer(uint8_t* src_buf, uint32_t src_size) { - input_buffer_ = pdfium::MakeRetain<CFX_CodecMemory>(src_buf, src_size); +void CFX_GifContext::SetInputBuffer(pdfium::span<uint8_t> src_buf) { + input_buffer_ = pdfium::MakeRetain<CFX_CodecMemory>(src_buf); } uint32_t CFX_GifContext::GetAvailInput(uint8_t** avail_buf) const {
diff --git a/core/fxcodec/gif/cfx_gifcontext.h b/core/fxcodec/gif/cfx_gifcontext.h index f96cf05..90657b0 100644 --- a/core/fxcodec/gif/cfx_gifcontext.h +++ b/core/fxcodec/gif/cfx_gifcontext.h
@@ -16,6 +16,7 @@ #include "core/fxcodec/gif/cfx_lzwdecompressor.h" #include "core/fxcrt/fx_string.h" #include "core/fxcrt/unowned_ptr.h" +#include "third_party/base/span.h" class CFX_GifContext : public CCodec_GifModule::Context { public: @@ -40,7 +41,7 @@ CFX_GifDecodeStatus ReadHeader(); CFX_GifDecodeStatus GetFrame(); CFX_GifDecodeStatus LoadFrame(int32_t frame_num); - void SetInputBuffer(uint8_t* src_buf, uint32_t src_size); + void SetInputBuffer(pdfium::span<uint8_t> src_buf); uint32_t GetAvailInput(uint8_t** avail_buf) const; size_t GetFrameNum() const { return images_.size(); }
diff --git a/core/fxcodec/gif/cfx_gifcontext_unittest.cpp b/core/fxcodec/gif/cfx_gifcontext_unittest.cpp index d6cfa1f..0d8941f 100644 --- a/core/fxcodec/gif/cfx_gifcontext_unittest.cpp +++ b/core/fxcodec/gif/cfx_gifcontext_unittest.cpp
@@ -22,122 +22,134 @@ }; TEST(CFX_GifContext, SetInputBuffer) { - CFX_GifContextForTest context(nullptr, nullptr); - - context.SetInputBuffer(nullptr, 0); - EXPECT_EQ(nullptr, context.InputBuffer()->GetBuffer()); - EXPECT_EQ(0u, context.InputBuffer()->GetSize()); - EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); - - context.SetInputBuffer(nullptr, 100); - EXPECT_EQ(nullptr, context.InputBuffer()->GetBuffer()); - EXPECT_EQ(100u, context.InputBuffer()->GetSize()); - EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); - uint8_t buffer[] = {0x00, 0x01, 0x02}; - context.SetInputBuffer(buffer, 0); - EXPECT_EQ(buffer, context.InputBuffer()->GetBuffer()); - EXPECT_EQ(0u, context.InputBuffer()->GetSize()); - EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + { + // Context must not outlive its buffers. + CFX_GifContextForTest context(nullptr, nullptr); - context.SetInputBuffer(buffer, 3); - EXPECT_EQ(buffer, context.InputBuffer()->GetBuffer()); - EXPECT_EQ(3u, context.InputBuffer()->GetSize()); - EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + context.SetInputBuffer({nullptr, 0}); + EXPECT_EQ(nullptr, context.InputBuffer()->GetBuffer()); + EXPECT_EQ(0u, context.InputBuffer()->GetSize()); + EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); - context.SetInputBuffer(buffer, 100); - EXPECT_EQ(buffer, context.InputBuffer()->GetBuffer()); - EXPECT_EQ(100u, context.InputBuffer()->GetSize()); - EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + context.SetInputBuffer({nullptr, 100}); + EXPECT_EQ(nullptr, context.InputBuffer()->GetBuffer()); + EXPECT_EQ(100u, context.InputBuffer()->GetSize()); + EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + + context.SetInputBuffer({buffer, 0}); + EXPECT_EQ(buffer, context.InputBuffer()->GetBuffer()); + EXPECT_EQ(0u, context.InputBuffer()->GetSize()); + EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + + context.SetInputBuffer({buffer, 3}); + EXPECT_EQ(buffer, context.InputBuffer()->GetBuffer()); + EXPECT_EQ(3u, context.InputBuffer()->GetSize()); + EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + + context.SetInputBuffer({buffer, 100}); + EXPECT_EQ(buffer, context.InputBuffer()->GetBuffer()); + EXPECT_EQ(100u, context.InputBuffer()->GetSize()); + EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + } } TEST(CFX_GifContext, ReadData) { - CFX_GifContextForTest context(nullptr, nullptr); - - context.SetInputBuffer(nullptr, 0); - EXPECT_FALSE(context.ReadData(nullptr, 0)); - EXPECT_FALSE(context.ReadData(nullptr, 10)); - std::vector<uint8_t> dest_buffer; - EXPECT_FALSE(context.ReadData(dest_buffer.data(), 0)); - EXPECT_FALSE(context.ReadData(dest_buffer.data(), 10)); - uint8_t src_buffer[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; - context.SetInputBuffer(src_buffer, 0); - dest_buffer.resize(sizeof(src_buffer)); - EXPECT_FALSE(context.ReadData(dest_buffer.data(), sizeof(src_buffer))); + { + // Context must not outlive its buffers. + CFX_GifContextForTest context(nullptr, nullptr); - context.SetInputBuffer(src_buffer, 1); - EXPECT_FALSE(context.ReadData(dest_buffer.data(), sizeof(src_buffer))); - EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); - EXPECT_FALSE(context.ReadData(nullptr, sizeof(src_buffer))); - EXPECT_FALSE(context.ReadData(nullptr, 1)); - EXPECT_TRUE(context.ReadData(dest_buffer.data(), 1)); - EXPECT_EQ(src_buffer[0], dest_buffer[0]); + context.SetInputBuffer({nullptr, 0}); + EXPECT_FALSE(context.ReadData(nullptr, 0)); + EXPECT_FALSE(context.ReadData(nullptr, 10)); - context.SetInputBuffer(src_buffer, sizeof(src_buffer)); - EXPECT_FALSE(context.ReadData(nullptr, sizeof(src_buffer))); - EXPECT_TRUE(context.ReadData(dest_buffer.data(), sizeof(src_buffer))); - for (size_t i = 0; i < sizeof(src_buffer); i++) - EXPECT_EQ(src_buffer[i], dest_buffer[i]); + EXPECT_FALSE(context.ReadData(dest_buffer.data(), 0)); + EXPECT_FALSE(context.ReadData(dest_buffer.data(), 10)); - context.SetInputBuffer(src_buffer, sizeof(src_buffer)); - for (size_t i = 0; i < sizeof(src_buffer); i++) { + context.SetInputBuffer({src_buffer, 0}); + dest_buffer.resize(sizeof(src_buffer)); + EXPECT_FALSE(context.ReadData(dest_buffer.data(), sizeof(src_buffer))); + + context.SetInputBuffer({src_buffer, 1}); + EXPECT_FALSE(context.ReadData(dest_buffer.data(), sizeof(src_buffer))); + EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + EXPECT_FALSE(context.ReadData(nullptr, sizeof(src_buffer))); + EXPECT_FALSE(context.ReadData(nullptr, 1)); EXPECT_TRUE(context.ReadData(dest_buffer.data(), 1)); - EXPECT_EQ(src_buffer[i], dest_buffer[0]); + EXPECT_EQ(src_buffer[0], dest_buffer[0]); + + context.SetInputBuffer(src_buffer); + EXPECT_FALSE(context.ReadData(nullptr, sizeof(src_buffer))); + EXPECT_TRUE(context.ReadData(dest_buffer.data(), sizeof(src_buffer))); + for (size_t i = 0; i < sizeof(src_buffer); i++) + EXPECT_EQ(src_buffer[i], dest_buffer[i]); + + context.SetInputBuffer(src_buffer); + for (size_t i = 0; i < sizeof(src_buffer); i++) { + EXPECT_TRUE(context.ReadData(dest_buffer.data(), 1)); + EXPECT_EQ(src_buffer[i], dest_buffer[0]); + } } } TEST(CFX_GifContext, ReadGifSignature) { CFX_GifContextForTest context(nullptr, nullptr); - { uint8_t data[1]; - context.SetInputBuffer(data, 0); + context.SetInputBuffer({data, 0}); EXPECT_EQ(CFX_GifDecodeStatus::Unfinished, context.ReadGifSignature()); EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } // Make sure testing the entire signature { uint8_t data[] = {'G', 'I', 'F'}; - context.SetInputBuffer(data, sizeof(data)); + context.SetInputBuffer(data); EXPECT_EQ(CFX_GifDecodeStatus::Unfinished, context.ReadGifSignature()); EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } { uint8_t data[] = {'N', 'O', 'T', 'G', 'I', 'F'}; - context.SetInputBuffer(data, sizeof(data)); + context.SetInputBuffer(data); EXPECT_EQ(CFX_GifDecodeStatus::Error, context.ReadGifSignature()); EXPECT_EQ(6u, context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } // Make sure not matching GIF8*a { uint8_t data[] = {'G', 'I', 'F', '8', '0', 'a'}; - context.SetInputBuffer(data, sizeof(data)); + context.SetInputBuffer(data); EXPECT_EQ(CFX_GifDecodeStatus::Error, context.ReadGifSignature()); EXPECT_EQ(6u, context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } // Make sure not matching GIF**a { uint8_t data[] = {'G', 'I', 'F', '9', '2', 'a'}; - context.SetInputBuffer(data, sizeof(data)); + context.SetInputBuffer(data); EXPECT_EQ(CFX_GifDecodeStatus::Error, context.ReadGifSignature()); EXPECT_EQ(6u, context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } // One valid signature { uint8_t data[] = {'G', 'I', 'F', '8', '7', 'a'}; - context.SetInputBuffer(data, sizeof(data)); + context.SetInputBuffer(data); EXPECT_EQ(CFX_GifDecodeStatus::Success, context.ReadGifSignature()); EXPECT_EQ(6u, context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } // The other valid signature { uint8_t data[] = {'G', 'I', 'F', '8', '9', 'a'}; - context.SetInputBuffer(data, sizeof(data)); + context.SetInputBuffer(data); EXPECT_EQ(CFX_GifDecodeStatus::Success, context.ReadGifSignature()); EXPECT_EQ(6u, context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } } @@ -145,15 +157,16 @@ CFX_GifContextForTest context(nullptr, nullptr); { uint8_t data[1]; - context.SetInputBuffer(data, 0); + context.SetInputBuffer({data, 0}); EXPECT_EQ(CFX_GifDecodeStatus::Unfinished, context.ReadLogicalScreenDescriptor()); + context.SetInputBuffer({}); } // LSD with all the values zero'd { uint8_t lsd[sizeof(CFX_GifLocalScreenDescriptor)]; memset(&lsd, 0, sizeof(CFX_GifLocalScreenDescriptor)); - context.SetInputBuffer(lsd, sizeof(CFX_GifLocalScreenDescriptor)); + context.SetInputBuffer(lsd); EXPECT_EQ(CFX_GifDecodeStatus::Success, context.ReadLogicalScreenDescriptor()); @@ -164,12 +177,13 @@ EXPECT_EQ(0, context.height_); EXPECT_EQ(0u, context.bc_index_); EXPECT_EQ(0u, context.pixel_aspect_); + context.SetInputBuffer({}); } // LSD with no global palette { uint8_t lsd[sizeof(CFX_GifLocalScreenDescriptor)] = {0x0A, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x02}; - context.SetInputBuffer(lsd, sizeof(CFX_GifLocalScreenDescriptor)); + context.SetInputBuffer(lsd); EXPECT_EQ(CFX_GifDecodeStatus::Success, context.ReadLogicalScreenDescriptor()); @@ -180,17 +194,19 @@ EXPECT_EQ(0x0F00, context.height_); EXPECT_EQ(0u, context.bc_index_); // bc_index_ is 0 if no global palette EXPECT_EQ(2u, context.pixel_aspect_); + context.SetInputBuffer({}); } // LSD with global palette bit set, but no global palette { uint8_t lsd[sizeof(CFX_GifLocalScreenDescriptor)] = {0x0A, 0x00, 0x00, 0x0F, 0x80, 0x01, 0x02}; - context.SetInputBuffer(lsd, sizeof(CFX_GifLocalScreenDescriptor)); + context.SetInputBuffer(lsd); EXPECT_EQ(CFX_GifDecodeStatus::Unfinished, context.ReadLogicalScreenDescriptor()); EXPECT_EQ(0u, context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } // LSD with global palette { @@ -199,7 +215,7 @@ uint8_t palette[4 * sizeof(CFX_GifPalette)]; } data = {{0x0A, 0x00, 0x00, 0x0F, 0xA9, 0x01, 0x02}, {0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1}}; - context.SetInputBuffer(reinterpret_cast<uint8_t*>(&data), sizeof(data)); + context.SetInputBuffer({reinterpret_cast<uint8_t*>(&data), sizeof(data)}); EXPECT_EQ(CFX_GifDecodeStatus::Success, context.ReadLogicalScreenDescriptor()); @@ -209,12 +225,12 @@ EXPECT_EQ(0x0F00, context.height_); EXPECT_EQ(1u, context.bc_index_); EXPECT_EQ(2u, context.pixel_aspect_); - EXPECT_EQ(1u, context.global_pal_exp_); EXPECT_EQ(1, context.global_sort_flag_); EXPECT_EQ(2, context.global_color_resolution_); EXPECT_EQ(0, memcmp(data.palette, context.global_palette_.data(), sizeof(data.palette))); + context.SetInputBuffer({}); } } @@ -227,21 +243,21 @@ uint8_t lsd[sizeof(CFX_GifLocalScreenDescriptor)]; } data = {{'N', 'O', 'T', 'G', 'I', 'F'}, {0x0A, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x02}}; - context.SetInputBuffer(reinterpret_cast<uint8_t*>(&data), sizeof(data)); + context.SetInputBuffer({reinterpret_cast<uint8_t*>(&data), sizeof(data)}); EXPECT_EQ(CFX_GifDecodeStatus::Error, context.ReadHeader()); - EXPECT_EQ(sizeof(data.signature), context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } // Short after signature { uint8_t signature[] = {'G', 'I', 'F', '8', '7', 'a'}; - context.SetInputBuffer(reinterpret_cast<uint8_t*>(&signature), - sizeof(signature)); + context.SetInputBuffer( + {reinterpret_cast<uint8_t*>(&signature), sizeof(signature)}); EXPECT_EQ(CFX_GifDecodeStatus::Unfinished, context.ReadHeader()); - EXPECT_EQ(sizeof(signature), context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } // Success without global palette { @@ -250,15 +266,15 @@ uint8_t lsd[sizeof(CFX_GifLocalScreenDescriptor)]; } data = {{'G', 'I', 'F', '8', '7', 'a'}, {0x0A, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x02}}; - context.SetInputBuffer(reinterpret_cast<uint8_t*>(&data), sizeof(data)); + context.SetInputBuffer({reinterpret_cast<uint8_t*>(&data), sizeof(data)}); EXPECT_EQ(CFX_GifDecodeStatus::Success, context.ReadHeader()); - EXPECT_EQ(sizeof(data), context.InputBuffer()->GetPosition()); EXPECT_EQ(0x000A, context.width_); EXPECT_EQ(0x0F00, context.height_); EXPECT_EQ(0u, context.bc_index_); // bc_index_ is 0 if no global palette EXPECT_EQ(2u, context.pixel_aspect_); + context.SetInputBuffer({}); } // Missing Global Palette { @@ -267,11 +283,11 @@ uint8_t lsd[sizeof(CFX_GifLocalScreenDescriptor)]; } data = {{'G', 'I', 'F', '8', '7', 'a'}, {0x0A, 0x00, 0x00, 0x0F, 0x80, 0x01, 0x02}}; - context.SetInputBuffer(reinterpret_cast<uint8_t*>(&data), sizeof(data)); + context.SetInputBuffer({reinterpret_cast<uint8_t*>(&data), sizeof(data)}); EXPECT_EQ(CFX_GifDecodeStatus::Unfinished, context.ReadHeader()); - EXPECT_EQ(sizeof(data.signature), context.InputBuffer()->GetPosition()); + context.SetInputBuffer({}); } // Success with global palette { @@ -282,10 +298,9 @@ } data = {{'G', 'I', 'F', '8', '7', 'a'}, {0x0A, 0x00, 0x00, 0x0F, 0xA9, 0x01, 0x02}, {0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1}}; - context.SetInputBuffer(reinterpret_cast<uint8_t*>(&data), sizeof(data)); + context.SetInputBuffer({reinterpret_cast<uint8_t*>(&data), sizeof(data)}); EXPECT_EQ(CFX_GifDecodeStatus::Success, context.ReadHeader()); - EXPECT_EQ(sizeof(data), context.InputBuffer()->GetPosition()); EXPECT_EQ(0x000A, context.width_); EXPECT_EQ(0x0F00, context.height_); @@ -296,5 +311,6 @@ EXPECT_EQ(2, context.global_color_resolution_); EXPECT_EQ(0, memcmp(data.palette, context.global_palette_.data(), sizeof(data.palette))); + context.SetInputBuffer({}); } }