82 if (!input_buffer_->IsEOF()) {
111 SaveDecodingStatus(status);
117 ret = DecodeImageInfo();
124 uint8_t img_data_size;
125 size_t read_marker = input_buffer_->GetPosition();
131 if (!input_buffer_->Seek(input_buffer_->GetPosition() +
133 input_buffer_->Seek(read_marker);
140 read_marker = input_buffer_->GetPosition();
149 ret = DecodeExtension();
159 if (frame_num >= images_.size())
167 if (gif_img_row_bytes == 0)
171 gif_image->row_buffer.resize(gif_img_row_bytes);
173 int32_t loc_pal_num =
179 : gif_image->local_palettes.data();
187 gif_image->row_buffer.clear();
195 gif_image->image_GCE->gce_flags.transparency
196 ?
static_cast<int32_t>(gif_image->image_GCE->trans_index)
200 gif_image->row_buffer.clear();
206 gif_image->row_buffer.clear();
217 uint8_t img_data_size;
218 DataVector<uint8_t> img_data;
219 size_t read_marker = input_buffer_->GetPosition();
228 img_data.resize(img_data_size);
230 input_buffer_->Seek(read_marker);
234 if (!lzw_decompressor_) {
235 lzw_decompressor_ = LZWDecompressor::Create(GetPaletteExp(gif_image),
236 gif_image->code_exp);
237 if (!lzw_decompressor_) {
238 DecodingFailureAtTailCleanup(gif_image);
242 lzw_decompressor_->SetSource(img_data.data(), img_data_size);
248 gif_image->row_buffer.data() + img_row_offset_, &img_row_avail_size_);
250 DecodingFailureAtTailCleanup(gif_image);
257 gif_image->row_buffer.clear();
263 read_marker = input_buffer_->GetPosition();
268 img_data.resize(img_data_size);
270 input_buffer_->Seek(read_marker);
274 lzw_decompressor_->SetSource(img_data.data(), img_data_size);
279 ret = lzw_decompressor_->Decode(
280 gif_image->row_buffer.data() + img_row_offset_,
281 &img_row_avail_size_);
293 DecodingFailureAtTailCleanup(gif_image);
304 ret = lzw_decompressor_->Decode(
305 gif_image->row_buffer.data() + img_row_offset_,
306 &img_row_avail_size_);
310 DecodingFailureAtTailCleanup(gif_image);
321 input_buffer_ = std::move(codec_memory);
328 return pdfium::base::checked_cast<uint32_t>(input_buffer_->GetSize() -
329 input_buffer_->GetPosition());
333 if (!input_buffer_ || !dest)
336 size_t read_marker = input_buffer_->GetPosition();
337 size_t read = input_buffer_->ReadBlock({dest, size});
339 input_buffer_->Seek(read_marker);
351 if (strncmp(header.signature, kGifSignature87, 6) != 0 &&
352 strncmp(header.signature, kGifSignature89, 6) != 0) {
361 size_t read_marker = input_buffer_->GetPosition();
372 std::vector<CFX_GifPalette> palette(palette_count);
373 auto bytes = pdfium::as_writable_bytes(pdfium::make_span(palette));
375 pdfium::base::checked_cast<uint32_t>(bytes.size())
)) {
377 input_buffer_->Seek(read_marker);
384 std::swap(global_palette_, palette);
387 width_ =
static_cast<
int>(
388 FXSYS_UINT16_GET_LSBFIRST(
reinterpret_cast<uint8_t*>(&lsd
.width)));
390 FXSYS_UINT16_GET_LSBFIRST(
reinterpret_cast<uint8_t*>(&lsd
.height)));
400 size_t read_marker = input_buffer_->GetPosition();
404 if (!ScanForTerminalMarker()) {
405 input_buffer_->Seek(read_marker);
415 graphic_control_extension_ =
nullptr;
416 if (!ScanForTerminalMarker()) {
417 input_buffer_->Seek(read_marker);
427 if (!graphic_control_extension_.get())
428 graphic_control_extension_ =
429 std::make_unique<CFX_GifGraphicControlExtension>();
430 graphic_control_extension_->block_size = gif_gce.block_size;
431 graphic_control_extension_->gce_flags = gif_gce.gce_flags;
432 graphic_control_extension_->delay_time = FXSYS_UINT16_GET_LSBFIRST(
433 reinterpret_cast<uint8_t*>(&gif_gce.delay_time));
434 graphic_control_extension_->trans_index = gif_gce.trans_index;
439 graphic_control_extension_ =
nullptr;
440 if (!ScanForTerminalMarker()) {
441 input_buffer_->Seek(read_marker);
455 size_t read_marker = input_buffer_->GetPosition();
457 if (!
ReadAllOrNone(reinterpret_cast<uint8_t*>(&img_info)
, sizeof(img_info)
))
461 gif_image->image_info.left =
462 FXSYS_UINT16_GET_LSBFIRST(
reinterpret_cast<uint8_t*>(&img_info
.left));
463 gif_image->image_info.top =
464 FXSYS_UINT16_GET_LSBFIRST(
reinterpret_cast<uint8_t*>(&img_info
.top));
465 gif_image->image_info.width =
466 FXSYS_UINT16_GET_LSBFIRST(
reinterpret_cast<uint8_t*>(&img_info
.width));
467 gif_image->image_info.height =
468 FXSYS_UINT16_GET_LSBFIRST(
reinterpret_cast<uint8_t*>(&img_info
.height));
469 gif_image->image_info.local_flags = img_info
.local_flags;
470 if (gif_image->image_info.left + gif_image->image_info.width >
width_ ||
471 gif_image->image_info.top + gif_image->image_info.height >
height_)
476 gif_image->local_palette_exp = gif_img_info_lf
->pal_bits;
477 uint32_t loc_pal_count =
unsigned(2 << gif_img_info_lf
->pal_bits);
478 std::vector<CFX_GifPalette> loc_pal(loc_pal_count);
479 auto bytes = pdfium::as_writable_bytes(pdfium::make_span(loc_pal));
481 pdfium::base::checked_cast<uint32_t>(bytes.size())
)) {
482 input_buffer_->Seek(read_marker);
486 gif_image->local_palettes =
std::move(loc_pal);
491 input_buffer_->Seek(read_marker);
495 gif_image->code_exp = code_size;
496 gif_image->data_pos = delegate_->GifCurrentPosition();
497 gif_image->image_GCE =
nullptr;
498 if (graphic_control_extension_.get()) {
499 if (graphic_control_extension_->gce_flags.transparency) {
502 if (graphic_control_extension_->trans_index >=
503 (2 << GetPaletteExp(gif_image.get()))) {
507 gif_image->image_GCE = std::move(graphic_control_extension_);
508 graphic_control_extension_ =
nullptr;
511 images_.push_back(std::move(gif_image));
517 gif_image->row_buffer.clear();
528 if (!input_buffer_->Seek(input_buffer_->GetPosition() + data_size) ||
529 !ReadAllOrNone(&data_size,
sizeof(data_size))) {