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