aboutsummaryrefslogtreecommitdiff
path: root/core/fxcodec/gif/cfx_gifcontext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fxcodec/gif/cfx_gifcontext.cpp')
-rw-r--r--core/fxcodec/gif/cfx_gifcontext.cpp269
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