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