Home | History | Annotate | Download | only in codec
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #include "core/fxcodec/codec/ccodec_bmpmodule.h"
      8 
      9 #include "core/fxcodec/codec/codec_int.h"
     10 #include "core/fxcodec/fx_codec.h"
     11 #include "core/fxcodec/lbmp/fx_bmp.h"
     12 #include "core/fxcrt/unowned_ptr.h"
     13 #include "core/fxge/fx_dib.h"
     14 #include "third_party/base/ptr_util.h"
     15 
     16 CBmpContext::CBmpContext(CCodec_BmpModule* pModule,
     17                          CCodec_BmpModule::Delegate* pDelegate)
     18     : m_pModule(pModule), m_pDelegate(pDelegate) {
     19 }
     20 
     21 CBmpContext::~CBmpContext() {}
     22 
     23 CCodec_BmpModule::CCodec_BmpModule() {}
     24 
     25 CCodec_BmpModule::~CCodec_BmpModule() {}
     26 
     27 std::unique_ptr<CCodec_BmpModule::Context> CCodec_BmpModule::Start(
     28     Delegate* pDelegate) {
     29   auto p = pdfium::MakeUnique<CBmpContext>(this, pDelegate);
     30   p->m_Bmp.context_ptr = p.get();
     31   return p;
     32 }
     33 
     34 int32_t CCodec_BmpModule::ReadHeader(Context* pContext,
     35                                      int32_t* width,
     36                                      int32_t* height,
     37                                      bool* tb_flag,
     38                                      int32_t* components,
     39                                      int32_t* pal_num,
     40                                      std::vector<uint32_t>* palette,
     41                                      CFX_DIBAttribute* pAttribute) {
     42   auto* ctx = static_cast<CBmpContext*>(pContext);
     43   if (setjmp(ctx->m_Bmp.jmpbuf))
     44     return 0;
     45 
     46   int32_t ret = ctx->m_Bmp.ReadHeader();
     47   if (ret != 1)
     48     return ret;
     49 
     50   *width = ctx->m_Bmp.width;
     51   *height = ctx->m_Bmp.height;
     52   *tb_flag = ctx->m_Bmp.imgTB_flag;
     53   *components = ctx->m_Bmp.components;
     54   *pal_num = ctx->m_Bmp.pal_num;
     55   *palette = ctx->m_Bmp.palette;
     56   if (pAttribute) {
     57     pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_METER;
     58     pAttribute->m_nXDPI = ctx->m_Bmp.dpi_x;
     59     pAttribute->m_nYDPI = ctx->m_Bmp.dpi_y;
     60     pAttribute->m_nBmpCompressType = ctx->m_Bmp.compress_flag;
     61   }
     62   return 1;
     63 }
     64 
     65 int32_t CCodec_BmpModule::LoadImage(Context* pContext) {
     66   auto* ctx = static_cast<CBmpContext*>(pContext);
     67   if (setjmp(ctx->m_Bmp.jmpbuf))
     68     return 0;
     69 
     70   return ctx->m_Bmp.DecodeImage();
     71 }
     72 
     73 uint32_t CCodec_BmpModule::GetAvailInput(Context* pContext,
     74                                          uint8_t** avail_buf_ptr) {
     75   auto* ctx = static_cast<CBmpContext*>(pContext);
     76   return ctx->m_Bmp.GetAvailInput(avail_buf_ptr);
     77 }
     78 
     79 void CCodec_BmpModule::Input(Context* pContext,
     80                              const uint8_t* src_buf,
     81                              uint32_t src_size) {
     82   auto* ctx = static_cast<CBmpContext*>(pContext);
     83   ctx->m_Bmp.SetInputBuffer(const_cast<uint8_t*>(src_buf), src_size);
     84 }
     85