• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
CBmpContext(CCodec_BmpModule * pModule,CCodec_BmpModule::Delegate * pDelegate)16 CBmpContext::CBmpContext(CCodec_BmpModule* pModule,
17                          CCodec_BmpModule::Delegate* pDelegate)
18     : m_pModule(pModule), m_pDelegate(pDelegate) {
19 }
20 
~CBmpContext()21 CBmpContext::~CBmpContext() {}
22 
CCodec_BmpModule()23 CCodec_BmpModule::CCodec_BmpModule() {}
24 
~CCodec_BmpModule()25 CCodec_BmpModule::~CCodec_BmpModule() {}
26 
Start(Delegate * pDelegate)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 
ReadHeader(Context * pContext,int32_t * width,int32_t * height,bool * tb_flag,int32_t * components,int32_t * pal_num,std::vector<uint32_t> * palette,CFX_DIBAttribute * pAttribute)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 
LoadImage(Context * pContext)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 
GetAvailInput(Context * pContext,uint8_t ** avail_buf_ptr)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 
Input(Context * pContext,const uint8_t * src_buf,uint32_t src_size)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