Merge to XFA: Kill FXSYS_mem{cpy,cmp,set.move}{32,8}.
[pdfium.git] / core / src / fxcodec / codec / fx_codec_bmp.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "../../../include/fxcodec/fx_codec.h"\r
8 #include "../../../include/fxge/fx_dib.h"\r
9 #include "codec_int.h"\r
10 #include "../lbmp/fx_bmp.h"\r
11 struct FXBMP_Context {\r
12     bmp_decompress_struct_p bmp_ptr;\r
13     void*               parent_ptr;\r
14     void*               child_ptr;\r
15 \r
16     void*               (*m_AllocFunc)(unsigned int);\r
17     void                (*m_FreeFunc)(void*);\r
18 };\r
19 extern "C" {\r
20     static void* _bmp_alloc_func(unsigned int size)\r
21     {\r
22         return FX_Alloc(char, size);\r
23     }\r
24     static void  _bmp_free_func(void* p)\r
25     {\r
26         if(p != NULL) {\r
27             FX_Free(p);\r
28         }\r
29     }\r
30 };\r
31 static void _bmp_error_data(bmp_decompress_struct_p bmp_ptr, const FX_CHAR* err_msg)\r
32 {\r
33     FXSYS_strncpy((char*)bmp_ptr->err_ptr, err_msg, BMP_MAX_ERROR_SIZE - 1);\r
34     longjmp(bmp_ptr->jmpbuf, 1);\r
35 }\r
36 static void _bmp_read_scanline(bmp_decompress_struct_p bmp_ptr, int32_t row_num, uint8_t* row_buf)\r
37 {\r
38     FXBMP_Context* p = (FXBMP_Context*)bmp_ptr->context_ptr;\r
39     CCodec_BmpModule* pModule = (CCodec_BmpModule*)p->parent_ptr;\r
40     pModule->ReadScanlineCallback(p->child_ptr, row_num, row_buf);\r
41 }\r
42 static FX_BOOL _bmp_get_data_position(bmp_decompress_struct_p bmp_ptr, FX_DWORD rcd_pos)\r
43 {\r
44     FXBMP_Context* p = (FXBMP_Context*)bmp_ptr->context_ptr;\r
45     CCodec_BmpModule* pModule = (CCodec_BmpModule*)p->parent_ptr;\r
46     return pModule->InputImagePositionBufCallback(p->child_ptr, rcd_pos);\r
47 }\r
48 void* CCodec_BmpModule::Start(void* pModule)\r
49 {\r
50     FXBMP_Context* p = (FXBMP_Context*)FX_Alloc(uint8_t, sizeof(FXBMP_Context));\r
51     if (p == NULL) {\r
52         return NULL;\r
53     }\r
54     FXSYS_memset(p, 0, sizeof(FXBMP_Context));\r
55     if(p == NULL) {\r
56         return NULL;\r
57     }\r
58     p->m_AllocFunc = _bmp_alloc_func;\r
59     p->m_FreeFunc = _bmp_free_func;\r
60     p->bmp_ptr = NULL;\r
61     p->parent_ptr = (void*)this;\r
62     p->child_ptr = pModule;\r
63     p->bmp_ptr = _bmp_create_decompress();\r
64     if (p->bmp_ptr == NULL) {\r
65         FX_Free(p);\r
66         return NULL;\r
67     }\r
68     p->bmp_ptr->context_ptr = (void*)p;\r
69     p->bmp_ptr->err_ptr = m_szLastError;\r
70     p->bmp_ptr->_bmp_error_fn = _bmp_error_data;\r
71     p->bmp_ptr->_bmp_get_row_fn = _bmp_read_scanline;\r
72     p->bmp_ptr->_bmp_get_data_position_fn = _bmp_get_data_position;\r
73     return p;\r
74 }\r
75 void CCodec_BmpModule::Finish(void* pContext)\r
76 {\r
77     FXBMP_Context* p = (FXBMP_Context*)pContext;\r
78     if(p != NULL) {\r
79         _bmp_destroy_decompress(&p->bmp_ptr);\r
80         p->m_FreeFunc(p);\r
81     }\r
82 }\r
83 int32_t CCodec_BmpModule::ReadHeader(void* pContext, int32_t* width, int32_t* height, FX_BOOL* tb_flag, int32_t* components, int32_t* pal_num, FX_DWORD** pal_pp, CFX_DIBAttribute* pAttribute)\r
84 {\r
85     FXBMP_Context* p = (FXBMP_Context*)pContext;\r
86     if(setjmp(p->bmp_ptr->jmpbuf)) {\r
87         return 0;\r
88     }\r
89     int32_t ret = _bmp_read_header(p->bmp_ptr);\r
90     if (ret != 1) {\r
91         return ret;\r
92     }\r
93     *width = p->bmp_ptr->width;\r
94     *height = p->bmp_ptr->height;\r
95     *tb_flag = p->bmp_ptr->imgTB_flag;\r
96     *components = p->bmp_ptr->components;\r
97     *pal_num = p->bmp_ptr->pal_num;\r
98     *pal_pp = p->bmp_ptr->pal_ptr;\r
99     if (pAttribute) {\r
100         pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_METER;\r
101         pAttribute->m_nXDPI = p->bmp_ptr->dpi_x;\r
102         pAttribute->m_nYDPI = p->bmp_ptr->dpi_y;\r
103         pAttribute->m_nBmpCompressType = p->bmp_ptr->compress_flag;\r
104     }\r
105     return 1;\r
106 }\r
107 int32_t CCodec_BmpModule::LoadImage(void* pContext)\r
108 {\r
109     FXBMP_Context* p = (FXBMP_Context*)pContext;\r
110     if(setjmp(p->bmp_ptr->jmpbuf)) {\r
111         return 0;\r
112     }\r
113     return _bmp_decode_image(p->bmp_ptr);\r
114 }\r
115 FX_DWORD CCodec_BmpModule::GetAvailInput(void* pContext, uint8_t** avial_buf_ptr)\r
116 {\r
117     FXBMP_Context* p = (FXBMP_Context*)pContext;\r
118     return _bmp_get_avail_input(p->bmp_ptr, avial_buf_ptr);\r
119 }\r
120 void CCodec_BmpModule::Input(void* pContext, const uint8_t* src_buf, FX_DWORD src_size)\r
121 {\r
122     FXBMP_Context* p = (FXBMP_Context*)pContext;\r
123     _bmp_input_buffer(p->bmp_ptr, (uint8_t*)src_buf, src_size);\r
124 }\r