diff options
Diffstat (limited to 'core/fxcodec/gif/cfx_gifcontext.cpp')
-rw-r--r-- | core/fxcodec/gif/cfx_gifcontext.cpp | 269 |
1 files changed, 128 insertions, 141 deletions
diff --git a/core/fxcodec/gif/cfx_gifcontext.cpp b/core/fxcodec/gif/cfx_gifcontext.cpp index 267098aad..e7fc432f2 100644 --- a/core/fxcodec/gif/cfx_gifcontext.cpp +++ b/core/fxcodec/gif/cfx_gifcontext.cpp @@ -1,4 +1,4 @@ -// Copyright 2017 PDFium Authors. All rights reserved. +// Copyright 2017 The PDFium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -6,14 +6,16 @@ #include "core/fxcodec/gif/cfx_gifcontext.h" +#include <stdint.h> + #include <algorithm> +#include <iterator> #include <utility> #include "core/fxcodec/cfx_codec_memory.h" -#include "core/fxcodec/gif/cfx_gif.h" -#include "core/fxcodec/gif/gifmodule.h" -#include "third_party/base/ptr_util.h" -#include "third_party/base/stl_util.h" +#include "core/fxcrt/data_vector.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxcrt/stl_util.h" namespace fxcodec { @@ -23,17 +25,13 @@ constexpr int32_t kGifInterlaceStep[4] = {8, 8, 4, 2}; } // namespace -CFX_GifContext::CFX_GifContext(GifModule* gif_module, - GifModule::Delegate* delegate) - : gif_module_(gif_module), delegate_(delegate) {} +CFX_GifContext::CFX_GifContext(GifDecoder::Delegate* delegate) + : delegate_(delegate) {} CFX_GifContext::~CFX_GifContext() = default; -void CFX_GifContext::RecordCurrentPosition(uint32_t* cur_pos) { - delegate_->GifRecordCurrentPosition(*cur_pos); -} - -void CFX_GifContext::ReadScanline(int32_t row_num, uint8_t* row_buf) { +void CFX_GifContext::ReadScanline(int32_t row_num, + pdfium::span<uint8_t> row_buf) { delegate_->GifReadScanline(row_num, row_buf); } @@ -44,33 +42,30 @@ bool CFX_GifContext::GetRecordPosition(uint32_t cur_pos, int32_t height, int32_t pal_num, CFX_GifPalette* pal, - int32_t delay_time, - bool user_input, int32_t trans_index, - int32_t disposal_method, bool interlace) { return delegate_->GifInputRecordPositionBuf( cur_pos, FX_RECT(left, top, left + width, top + height), pal_num, pal, - delay_time, user_input, trans_index, disposal_method, interlace); + trans_index, interlace); } -CFX_GifDecodeStatus CFX_GifContext::ReadHeader() { - CFX_GifDecodeStatus status = ReadGifSignature(); - if (status != CFX_GifDecodeStatus::Success) +GifDecoder::Status CFX_GifContext::ReadHeader() { + GifDecoder::Status status = ReadGifSignature(); + if (status != GifDecoder::Status::kSuccess) return status; return ReadLogicalScreenDescriptor(); } -CFX_GifDecodeStatus CFX_GifContext::GetFrame() { - CFX_GifDecodeStatus ret = CFX_GifDecodeStatus::Success; +GifDecoder::Status CFX_GifContext::GetFrame() { + GifDecoder::Status ret = GifDecoder::Status::kSuccess; while (true) { switch (decode_status_) { case GIF_D_STATUS_TAIL: - return CFX_GifDecodeStatus::Success; + return GifDecoder::Status::kSuccess; case GIF_D_STATUS_SIG: { uint8_t signature; if (!ReadAllOrNone(&signature, sizeof(signature))) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; switch (signature) { case GIF_SIG_EXTENSION: @@ -81,7 +76,7 @@ CFX_GifDecodeStatus CFX_GifContext::GetFrame() { continue; case GIF_SIG_TRAILER: SaveDecodingStatus(GIF_D_STATUS_TAIL); - return CFX_GifDecodeStatus::Success; + return GifDecoder::Status::kSuccess; default: if (!input_buffer_->IsEOF()) { // The Gif File has non_standard Tag! @@ -89,13 +84,13 @@ CFX_GifDecodeStatus CFX_GifContext::GetFrame() { continue; } // The Gif File Doesn't have Trailer Tag! - return CFX_GifDecodeStatus::Success; + return GifDecoder::Status::kSuccess; } } case GIF_D_STATUS_EXT: { uint8_t extension; if (!ReadAllOrNone(&extension, sizeof(extension))) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; switch (extension) { case GIF_BLOCK_CE: @@ -119,7 +114,7 @@ CFX_GifDecodeStatus CFX_GifContext::GetFrame() { } case GIF_D_STATUS_IMG_INFO: { ret = DecodeImageInfo(); - if (ret != CFX_GifDecodeStatus::Success) + if (ret != GifDecoder::Status::kSuccess) return ret; continue; @@ -129,13 +124,13 @@ CFX_GifDecodeStatus CFX_GifContext::GetFrame() { size_t read_marker = input_buffer_->GetPosition(); if (!ReadAllOrNone(&img_data_size, sizeof(img_data_size))) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; while (img_data_size != GIF_BLOCK_TERMINAL) { if (!input_buffer_->Seek(input_buffer_->GetPosition() + img_data_size)) { input_buffer_->Seek(read_marker); - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; } // This saving of the scan state on partial reads is why @@ -143,7 +138,7 @@ CFX_GifDecodeStatus CFX_GifContext::GetFrame() { SaveDecodingStatus(GIF_D_STATUS_IMG_DATA); read_marker = input_buffer_->GetPosition(); if (!ReadAllOrNone(&img_data_size, sizeof(img_data_size))) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; } SaveDecodingStatus(GIF_D_STATUS_SIG); @@ -151,26 +146,25 @@ CFX_GifDecodeStatus CFX_GifContext::GetFrame() { } default: { ret = DecodeExtension(); - if (ret != CFX_GifDecodeStatus::Success) + if (ret != GifDecoder::Status::kSuccess) return ret; break; } } } - return CFX_GifDecodeStatus::Success; } -CFX_GifDecodeStatus CFX_GifContext::LoadFrame(int32_t frame_num) { - if (!pdfium::IndexInBounds(images_, frame_num)) - return CFX_GifDecodeStatus::Error; +GifDecoder::Status CFX_GifContext::LoadFrame(size_t frame_num) { + if (frame_num >= images_.size()) + return GifDecoder::Status::kError; - CFX_GifImage* gif_image = images_[static_cast<size_t>(frame_num)].get(); + CFX_GifImage* gif_image = images_[frame_num].get(); if (gif_image->image_info.height == 0) - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; uint32_t gif_img_row_bytes = gif_image->image_info.width; if (gif_img_row_bytes == 0) - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; if (decode_status_ == GIF_D_STATUS_TAIL) { gif_image->row_buffer.resize(gif_img_row_bytes); @@ -186,33 +180,30 @@ CFX_GifDecodeStatus CFX_GifContext::LoadFrame(int32_t frame_num) { bool bRes = GetRecordPosition( gif_image->data_pos, gif_image->image_info.left, gif_image->image_info.top, gif_image->image_info.width, - gif_image->image_info.height, loc_pal_num, pLocalPalette, 0, 0, -1, 0, + gif_image->image_info.height, loc_pal_num, pLocalPalette, -1, gif_image->image_info.local_flags.interlace); if (!bRes) { gif_image->row_buffer.clear(); - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; } } else { bool bRes = GetRecordPosition( gif_image->data_pos, gif_image->image_info.left, gif_image->image_info.top, gif_image->image_info.width, gif_image->image_info.height, loc_pal_num, pLocalPalette, - static_cast<int32_t>(gif_image->image_GCE->delay_time), - gif_image->image_GCE->gce_flags.user_input, gif_image->image_GCE->gce_flags.transparency ? static_cast<int32_t>(gif_image->image_GCE->trans_index) : -1, - static_cast<int32_t>(gif_image->image_GCE->gce_flags.disposal_method), gif_image->image_info.local_flags.interlace); if (!bRes) { gif_image->row_buffer.clear(); - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; } } if (gif_image->code_exp > GIF_MAX_LZW_EXP) { gif_image->row_buffer.clear(); - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; } img_row_offset_ = 0; @@ -223,114 +214,106 @@ CFX_GifDecodeStatus CFX_GifContext::LoadFrame(int32_t frame_num) { } uint8_t img_data_size; - std::vector<uint8_t, FxAllocAllocator<uint8_t>> img_data; + DataVector<uint8_t> img_data; size_t read_marker = input_buffer_->GetPosition(); + // TODO(crbug.com/pdfium/1793): This logic can be simplified a lot, but it + // probably makes more sense to switch to a different GIF decoder altogether. if (decode_status_ == GIF_D_STATUS_IMG_DATA) { if (!ReadAllOrNone(&img_data_size, sizeof(img_data_size))) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; if (img_data_size != GIF_BLOCK_TERMINAL) { img_data.resize(img_data_size); if (!ReadAllOrNone(img_data.data(), img_data_size)) { input_buffer_->Seek(read_marker); - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; + } + + if (!lzw_decompressor_) { + lzw_decompressor_ = LZWDecompressor::Create(GetPaletteExp(gif_image), + gif_image->code_exp); + if (!lzw_decompressor_) { + DecodingFailureAtTailCleanup(gif_image); + return GifDecoder::Status::kError; + } } + lzw_decompressor_->SetSource(img_data.data(), img_data_size); - if (!lzw_decompressor_.get()) - lzw_decompressor_ = CFX_LZWDecompressor::Create( - !gif_image->local_palettes.empty() ? gif_image->local_pallette_exp - : global_pal_exp_, - gif_image->code_exp); SaveDecodingStatus(GIF_D_STATUS_IMG_DATA); img_row_offset_ += img_row_avail_size_; img_row_avail_size_ = gif_img_row_bytes - img_row_offset_; - CFX_GifDecodeStatus ret = - lzw_decompressor_.get() - ? lzw_decompressor_->Decode( - img_data.data(), img_data_size, - gif_image->row_buffer.data() + img_row_offset_, - &img_row_avail_size_) - : CFX_GifDecodeStatus::Error; - if (ret == CFX_GifDecodeStatus::Error) { + LZWDecompressor::Status ret = lzw_decompressor_->Decode( + gif_image->row_buffer.data() + img_row_offset_, &img_row_avail_size_); + if (ret == LZWDecompressor::Status::kError) { DecodingFailureAtTailCleanup(gif_image); - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; } - while (ret != CFX_GifDecodeStatus::Error) { - if (ret == CFX_GifDecodeStatus::Success) { - ReadScanline(gif_image->row_num, gif_image->row_buffer.data()); + while (ret != LZWDecompressor::Status::kError) { + if (ret == LZWDecompressor::Status::kSuccess) { + ReadScanline(gif_image->row_num, gif_image->row_buffer); gif_image->row_buffer.clear(); SaveDecodingStatus(GIF_D_STATUS_TAIL); - return CFX_GifDecodeStatus::Success; + return GifDecoder::Status::kSuccess; } - if (ret == CFX_GifDecodeStatus::Unfinished) { + if (ret == LZWDecompressor::Status::kUnfinished) { read_marker = input_buffer_->GetPosition(); if (!ReadAllOrNone(&img_data_size, sizeof(img_data_size))) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; if (img_data_size != GIF_BLOCK_TERMINAL) { img_data.resize(img_data_size); if (!ReadAllOrNone(img_data.data(), img_data_size)) { input_buffer_->Seek(read_marker); - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; } - if (!lzw_decompressor_.get()) - lzw_decompressor_ = CFX_LZWDecompressor::Create( - !gif_image->local_palettes.empty() - ? gif_image->local_pallette_exp - : global_pal_exp_, - gif_image->code_exp); + lzw_decompressor_->SetSource(img_data.data(), img_data_size); + SaveDecodingStatus(GIF_D_STATUS_IMG_DATA); img_row_offset_ += img_row_avail_size_; img_row_avail_size_ = gif_img_row_bytes - img_row_offset_; - ret = lzw_decompressor_.get() - ? lzw_decompressor_->Decode( - img_data.data(), img_data_size, - gif_image->row_buffer.data() + img_row_offset_, - &img_row_avail_size_) - : CFX_GifDecodeStatus::Error; + ret = lzw_decompressor_->Decode( + gif_image->row_buffer.data() + img_row_offset_, + &img_row_avail_size_); } } - if (ret == CFX_GifDecodeStatus::InsufficientDestSize) { + if (ret == LZWDecompressor::Status::kInsufficientDestSize) { if (gif_image->image_info.local_flags.interlace) { - ReadScanline(gif_image->row_num, gif_image->row_buffer.data()); + ReadScanline(gif_image->row_num, gif_image->row_buffer); gif_image->row_num += kGifInterlaceStep[img_pass_num_]; if (gif_image->row_num >= static_cast<int32_t>(gif_image->image_info.height)) { img_pass_num_++; - if (img_pass_num_ == FX_ArraySize(kGifInterlaceStep)) { + if (img_pass_num_ == std::size(kGifInterlaceStep)) { DecodingFailureAtTailCleanup(gif_image); - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; } gif_image->row_num = kGifInterlaceStep[img_pass_num_] / 2; } } else { - ReadScanline(gif_image->row_num++, gif_image->row_buffer.data()); + ReadScanline(gif_image->row_num++, gif_image->row_buffer); } + img_row_offset_ = 0; img_row_avail_size_ = gif_img_row_bytes; - ret = lzw_decompressor_.get() - ? lzw_decompressor_->Decode( - img_data.data(), img_data_size, - gif_image->row_buffer.data() + img_row_offset_, - &img_row_avail_size_) - : CFX_GifDecodeStatus::Error; + ret = lzw_decompressor_->Decode( + gif_image->row_buffer.data() + img_row_offset_, + &img_row_avail_size_); } - if (ret == CFX_GifDecodeStatus::InsufficientDestSize || - ret == CFX_GifDecodeStatus::Error) { + if (ret == LZWDecompressor::Status::kError) { DecodingFailureAtTailCleanup(gif_image); - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; } } } SaveDecodingStatus(GIF_D_STATUS_TAIL); } - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; } void CFX_GifContext::SetInputBuffer(RetainPtr<CFX_CodecMemory> codec_memory) { @@ -341,7 +324,8 @@ uint32_t CFX_GifContext::GetAvailInput() const { if (!input_buffer_) return 0; - return input_buffer_->GetSize() - input_buffer_->GetPosition(); + return pdfium::base::checked_cast<uint32_t>(input_buffer_->GetSize() - + input_buffer_->GetPosition()); } bool CFX_GifContext::ReadAllOrNone(uint8_t* dest, uint32_t size) { @@ -349,7 +333,7 @@ bool CFX_GifContext::ReadAllOrNone(uint8_t* dest, uint32_t size) { return false; size_t read_marker = input_buffer_->GetPosition(); - size_t read = input_buffer_->ReadBlock(dest, size); + size_t read = input_buffer_->ReadBlock({dest, size}); if (read < size) { input_buffer_->Seek(read_marker); return false; @@ -358,30 +342,30 @@ bool CFX_GifContext::ReadAllOrNone(uint8_t* dest, uint32_t size) { return true; } -CFX_GifDecodeStatus CFX_GifContext::ReadGifSignature() { +GifDecoder::Status CFX_GifContext::ReadGifSignature() { CFX_GifHeader header; if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(&header), 6)) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; if (strncmp(header.signature, kGifSignature87, 6) != 0 && strncmp(header.signature, kGifSignature89, 6) != 0) { - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; } - return CFX_GifDecodeStatus::Success; + return GifDecoder::Status::kSuccess; } -CFX_GifDecodeStatus CFX_GifContext::ReadLogicalScreenDescriptor() { +GifDecoder::Status CFX_GifContext::ReadLogicalScreenDescriptor() { CFX_GifLocalScreenDescriptor lsd; size_t read_marker = input_buffer_->GetPosition(); if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(&lsd), sizeof(lsd))) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; if (lsd.global_flags.global_pal) { uint32_t palette_count = unsigned(2 << lsd.global_flags.pal_bits); if (lsd.bc_index >= palette_count) - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; bc_index_ = lsd.bc_index; uint32_t palette_size = palette_count * sizeof(CFX_GifPalette); @@ -390,62 +374,62 @@ CFX_GifDecodeStatus CFX_GifContext::ReadLogicalScreenDescriptor() { palette_size)) { // Roll back the read for the LSD input_buffer_->Seek(read_marker); - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; } - global_pal_exp_ = lsd.global_flags.pal_bits; + global_palette_exp_ = lsd.global_flags.pal_bits; global_sort_flag_ = lsd.global_flags.sort_flag; global_color_resolution_ = lsd.global_flags.color_resolution; std::swap(global_palette_, palette); } width_ = static_cast<int>( - FXWORD_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&lsd.width))); + FXSYS_UINT16_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&lsd.width))); height_ = static_cast<int>( - FXWORD_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&lsd.height))); + FXSYS_UINT16_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&lsd.height))); - return CFX_GifDecodeStatus::Success; + return GifDecoder::Status::kSuccess; } void CFX_GifContext::SaveDecodingStatus(int32_t status) { decode_status_ = status; } -CFX_GifDecodeStatus CFX_GifContext::DecodeExtension() { +GifDecoder::Status CFX_GifContext::DecodeExtension() { size_t read_marker = input_buffer_->GetPosition(); switch (decode_status_) { case GIF_D_STATUS_EXT_CE: { if (!ScanForTerminalMarker()) { input_buffer_->Seek(read_marker); - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; } break; } case GIF_D_STATUS_EXT_PTE: { CFX_GifPlainTextExtension gif_pte; if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(&gif_pte), sizeof(gif_pte))) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; graphic_control_extension_ = nullptr; if (!ScanForTerminalMarker()) { input_buffer_->Seek(read_marker); - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; } break; } case GIF_D_STATUS_EXT_GCE: { CFX_GifGraphicControlExtension gif_gce; if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(&gif_gce), sizeof(gif_gce))) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; if (!graphic_control_extension_.get()) graphic_control_extension_ = - pdfium::MakeUnique<CFX_GifGraphicControlExtension>(); + std::make_unique<CFX_GifGraphicControlExtension>(); graphic_control_extension_->block_size = gif_gce.block_size; graphic_control_extension_->gce_flags = gif_gce.gce_flags; - graphic_control_extension_->delay_time = - FXWORD_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&gif_gce.delay_time)); + graphic_control_extension_->delay_time = FXSYS_UINT16_GET_LSBFIRST( + reinterpret_cast<uint8_t*>(&gif_gce.delay_time)); graphic_control_extension_->trans_index = gif_gce.trans_index; break; } @@ -454,47 +438,47 @@ CFX_GifDecodeStatus CFX_GifContext::DecodeExtension() { graphic_control_extension_ = nullptr; if (!ScanForTerminalMarker()) { input_buffer_->Seek(read_marker); - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; } } } SaveDecodingStatus(GIF_D_STATUS_SIG); - return CFX_GifDecodeStatus::Success; + return GifDecoder::Status::kSuccess; } -CFX_GifDecodeStatus CFX_GifContext::DecodeImageInfo() { +GifDecoder::Status CFX_GifContext::DecodeImageInfo() { if (width_ <= 0 || height_ <= 0) - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; size_t read_marker = input_buffer_->GetPosition(); - CFX_CFX_GifImageInfo img_info; + CFX_GifImageInfo img_info; if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(&img_info), sizeof(img_info))) - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; - auto gif_image = pdfium::MakeUnique<CFX_GifImage>(); + auto gif_image = std::make_unique<CFX_GifImage>(); gif_image->image_info.left = - FXWORD_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&img_info.left)); + FXSYS_UINT16_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&img_info.left)); gif_image->image_info.top = - FXWORD_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&img_info.top)); + FXSYS_UINT16_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&img_info.top)); gif_image->image_info.width = - FXWORD_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&img_info.width)); + FXSYS_UINT16_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&img_info.width)); gif_image->image_info.height = - FXWORD_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&img_info.height)); + FXSYS_UINT16_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&img_info.height)); gif_image->image_info.local_flags = img_info.local_flags; if (gif_image->image_info.left + gif_image->image_info.width > width_ || gif_image->image_info.top + gif_image->image_info.height > height_) - return CFX_GifDecodeStatus::Error; + return GifDecoder::Status::kError; CFX_GifLocalFlags* gif_img_info_lf = &img_info.local_flags; if (gif_img_info_lf->local_pal) { - gif_image->local_pallette_exp = gif_img_info_lf->pal_bits; + gif_image->local_palette_exp = gif_img_info_lf->pal_bits; uint32_t loc_pal_count = unsigned(2 << gif_img_info_lf->pal_bits); std::vector<CFX_GifPalette> loc_pal(loc_pal_count); if (!ReadAllOrNone(reinterpret_cast<uint8_t*>(loc_pal.data()), loc_pal_count * sizeof(CFX_GifPalette))) { input_buffer_->Seek(read_marker); - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; } gif_image->local_palettes = std::move(loc_pal); @@ -503,22 +487,20 @@ CFX_GifDecodeStatus CFX_GifContext::DecodeImageInfo() { uint8_t code_size; if (!ReadAllOrNone(&code_size, sizeof(code_size))) { input_buffer_->Seek(read_marker); - return CFX_GifDecodeStatus::Unfinished; + return GifDecoder::Status::kUnfinished; } gif_image->code_exp = code_size; - RecordCurrentPosition(&gif_image->data_pos); - gif_image->data_pos += input_buffer_->GetPosition(); + gif_image->data_pos = delegate_->GifCurrentPosition(); gif_image->image_GCE = nullptr; if (graphic_control_extension_.get()) { if (graphic_control_extension_->gce_flags.transparency) { // Need to test that the color that is going to be transparent is actually // in the palette being used. if (graphic_control_extension_->trans_index >= - 2 << (gif_image->local_palettes.empty() - ? global_pal_exp_ - : gif_image->local_pallette_exp)) - return CFX_GifDecodeStatus::Error; + (2 << GetPaletteExp(gif_image.get()))) { + return GifDecoder::Status::kError; + } } gif_image->image_GCE = std::move(graphic_control_extension_); graphic_control_extension_ = nullptr; @@ -526,7 +508,7 @@ CFX_GifDecodeStatus CFX_GifContext::DecodeImageInfo() { images_.push_back(std::move(gif_image)); SaveDecodingStatus(GIF_D_STATUS_IMG_DATA); - return CFX_GifDecodeStatus::Success; + return GifDecoder::Status::kSuccess; } void CFX_GifContext::DecodingFailureAtTailCleanup(CFX_GifImage* gif_image) { @@ -550,4 +532,9 @@ bool CFX_GifContext::ScanForTerminalMarker() { return true; } +uint8_t CFX_GifContext::GetPaletteExp(CFX_GifImage* gif_image) const { + return !gif_image->local_palettes.empty() ? gif_image->local_palette_exp + : global_palette_exp_; +} + } // namespace fxcodec |