14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann#include "core/fxcodec/codec/ccodec_gifmodule.h" 833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/codec/codec_int.h" 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/fx_codec.h" 11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcodec/gif/cfx_gif.h" 12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcodec/gif/cfx_gifcontext.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fx_dib.h" 14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/ptr_util.h" 1533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann 16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCCodec_GifModule::CCodec_GifModule() {} 1733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann 1833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCCodec_GifModule::~CCodec_GifModule() {} 1933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann 20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::unique_ptr<CCodec_GifModule::Context> CCodec_GifModule::Start( 21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Delegate* pDelegate) { 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pdfium::MakeUnique<CFX_GifContext>(this, pDelegate); 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_GifDecodeStatus CCodec_GifModule::ReadHeader(Context* pContext, 26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int* width, 27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int* height, 28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int* pal_num, 29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void** pal_pp, 30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int* bg_index, 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_DIBAttribute* pAttribute) { 32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto* context = static_cast<CFX_GifContext*>(pContext); 33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_GifDecodeStatus ret = context->ReadHeader(); 34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (ret != CFX_GifDecodeStatus::Success) 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ret; 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *width = context->width_; 38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *height = context->height_; 39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *pal_num = (2 << context->global_pal_exp_); 40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *pal_pp = context->global_palette_.empty() ? nullptr 41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann : context->global_palette_.data(); 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *bg_index = context->bc_index_; 43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return CFX_GifDecodeStatus::Success; 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::pair<CFX_GifDecodeStatus, size_t> CCodec_GifModule::LoadFrameInfo( 47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Context* pContext) { 48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto* context = static_cast<CFX_GifContext*>(pContext); 49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_GifDecodeStatus ret = context->GetFrame(); 50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (ret != CFX_GifDecodeStatus::Success) 51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {ret, 0}; 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return {CFX_GifDecodeStatus::Success, context->GetFrameNum()}; 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_GifDecodeStatus CCodec_GifModule::LoadFrame(Context* pContext, 56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t frame_num, 57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_DIBAttribute* pAttribute) { 58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto* context = static_cast<CFX_GifContext*>(pContext); 59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_GifDecodeStatus ret = context->LoadFrame(frame_num); 60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (ret != CFX_GifDecodeStatus::Success || !pAttribute) 61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ret; 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAttribute->m_nGifLeft = context->images_[frame_num]->image_info.left; 64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAttribute->m_nGifTop = context->images_[frame_num]->image_info.top; 65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAttribute->m_fAspectRatio = context->pixel_aspect_; 66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const uint8_t* buf = 67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann reinterpret_cast<const uint8_t*>(context->cmt_data_.GetBuffer(0)); 68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t len = context->cmt_data_.GetLength(); 69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (len > 21) { 70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint8_t size = *buf++; 71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (size != 0) 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAttribute->m_strAuthor = ByteString(buf, size); 73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann else 74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAttribute->m_strAuthor.clear(); 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return CFX_GifDecodeStatus::Success; 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannuint32_t CCodec_GifModule::GetAvailInput(Context* pContext, 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t** avail_buf_ptr) { 81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto* context = static_cast<CFX_GifContext*>(pContext); 82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return context->GetAvailInput(avail_buf_ptr); 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CCodec_GifModule::Input(Context* pContext, 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* src_buf, 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t src_size) { 88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto* context = static_cast<CFX_GifContext*>(pContext); 89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann context->SetInputBuffer((uint8_t*)src_buf, src_size); 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 91