Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(598)

Side by Side Diff: core/src/fxcodec/codec/fx_codec_jpeg.cpp

Issue 1172793002: Merge to XFA: Use stdint.h types throughout PDFium. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/src/fxcodec/codec/fx_codec_jbig.cpp ('k') | core/src/fxcodec/codec/fx_codec_jpx_opj.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include <setjmp.h> 7 #include <setjmp.h>
8 8
9 #include "../../../include/fxcodec/fx_codec.h" 9 #include "../../../include/fxcodec/fx_codec.h"
10 #include "../../../include/fxcrt/fx_safe_types.h" 10 #include "../../../include/fxcrt/fx_safe_types.h"
11 #include "../../../include/fxge/fx_dib.h" 11 #include "../../../include/fxge/fx_dib.h"
12 #include "codec_int.h" 12 #include "codec_int.h"
13 13
14 extern "C" { 14 extern "C" {
15 static void _JpegScanSOI(const FX_BYTE*& src_buf, FX_DWORD& src_size) 15 static void _JpegScanSOI(const uint8_t*& src_buf, FX_DWORD& src_size)
16 { 16 {
17 if (src_size == 0) { 17 if (src_size == 0) {
18 return; 18 return;
19 } 19 }
20 FX_DWORD offset = 0; 20 FX_DWORD offset = 0;
21 while (offset < src_size - 1) { 21 while (offset < src_size - 1) {
22 if (src_buf[offset] == 0xff && src_buf[offset + 1] == 0xd8) { 22 if (src_buf[offset] == 0xff && src_buf[offset + 1] == 0xd8) {
23 src_buf += offset; 23 src_buf += offset;
24 src_size -= offset; 24 src_size -= offset;
25 return; 25 return;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 } 88 }
89 static FX_BOOL _JpegLoadIccProfile(j_decompress_ptr cinfo, FX_LPBYTE* icc_buf_p tr, FX_DWORD* icc_length) 89 static FX_BOOL _JpegLoadIccProfile(j_decompress_ptr cinfo, FX_LPBYTE* icc_buf_p tr, FX_DWORD* icc_length)
90 { 90 {
91 if(icc_buf_ptr == NULL || icc_length == NULL) { 91 if(icc_buf_ptr == NULL || icc_length == NULL) {
92 return FALSE; 92 return FALSE;
93 } 93 }
94 *icc_buf_ptr = NULL; 94 *icc_buf_ptr = NULL;
95 *icc_length = 0; 95 *icc_length = 0;
96 FX_LPBYTE icc_data_ptr = NULL; 96 FX_LPBYTE icc_data_ptr = NULL;
97 FX_DWORD icc_data_len = 0; 97 FX_DWORD icc_data_len = 0;
98 FX_BYTE count_icc_marker = 0; 98 uint8_t count_icc_marker = 0;
99 FX_BYTE num_icc_marker = 0; 99 uint8_t num_icc_marker = 0;
100 jpeg_saved_marker_ptr marker_list[256] = {NULL}; 100 jpeg_saved_marker_ptr marker_list[256] = {NULL};
101 for (jpeg_saved_marker_ptr cur_marker = cinfo->marker_list; 101 for (jpeg_saved_marker_ptr cur_marker = cinfo->marker_list;
102 cur_marker != NULL; 102 cur_marker != NULL;
103 cur_marker = cur_marker->next) { 103 cur_marker = cur_marker->next) {
104 if(_JpegIsIccMarker(cur_marker)) { 104 if(_JpegIsIccMarker(cur_marker)) {
105 if(count_icc_marker == 0) { 105 if(count_icc_marker == 0) {
106 num_icc_marker = cur_marker->data[13]; 106 num_icc_marker = cur_marker->data[13];
107 } else if(num_icc_marker != cur_marker->data[13]) { 107 } else if(num_icc_marker != cur_marker->data[13]) {
108 return FALSE; 108 return FALSE;
109 } 109 }
110 int sn = cur_marker->data[12] - 1; 110 int sn = cur_marker->data[12] - 1;
111 if(sn < 0 || sn >= num_icc_marker) { 111 if(sn < 0 || sn >= num_icc_marker) {
112 return FALSE; 112 return FALSE;
113 } 113 }
114 if(marker_list[sn] == NULL) { 114 if(marker_list[sn] == NULL) {
115 marker_list[sn] = cur_marker; 115 marker_list[sn] = cur_marker;
116 } else { 116 } else {
117 return FALSE; 117 return FALSE;
118 } 118 }
119 count_icc_marker ++; 119 count_icc_marker ++;
120 icc_data_len += (cur_marker->data_length - JPEG_OVERHEAD_LEN); 120 icc_data_len += (cur_marker->data_length - JPEG_OVERHEAD_LEN);
121 } 121 }
122 } 122 }
123 if(count_icc_marker != num_icc_marker) { 123 if(count_icc_marker != num_icc_marker) {
124 return FALSE; 124 return FALSE;
125 } 125 }
126 if(num_icc_marker == 0) { 126 if(num_icc_marker == 0) {
127 return TRUE; 127 return TRUE;
128 } 128 }
129 icc_data_ptr = FX_Alloc(FX_BYTE, icc_data_len); 129 icc_data_ptr = FX_Alloc(uint8_t, icc_data_len);
130 if(icc_buf_ptr == NULL) { 130 if(icc_buf_ptr == NULL) {
131 return FALSE; 131 return FALSE;
132 } 132 }
133 *icc_buf_ptr = icc_data_ptr; 133 *icc_buf_ptr = icc_data_ptr;
134 *icc_length = icc_data_len; 134 *icc_length = icc_data_len;
135 for (int idx = 0; idx < num_icc_marker; idx++) { 135 for (int idx = 0; idx < num_icc_marker; idx++) {
136 icc_data_len = marker_list[idx]->data_length - JPEG_OVERHEAD_LEN; 136 icc_data_len = marker_list[idx]->data_length - JPEG_OVERHEAD_LEN;
137 FXSYS_memcpy32(icc_data_ptr, marker_list[idx]->data + JPEG_OVERHEAD_LEN, icc_data_len); 137 FXSYS_memcpy32(icc_data_ptr, marker_list[idx]->data + JPEG_OVERHEAD_LEN, icc_data_len);
138 icc_data_ptr += icc_data_len; 138 icc_data_ptr += icc_data_len;
139 } 139 }
140 return TRUE; 140 return TRUE;
141 } 141 }
142 static FX_BOOL _JpegEmbedIccProfile(j_compress_ptr cinfo, FX_LPCBYTE icc_buf_pt r, FX_DWORD icc_length) 142 static FX_BOOL _JpegEmbedIccProfile(j_compress_ptr cinfo, FX_LPCBYTE icc_buf_pt r, FX_DWORD icc_length)
143 { 143 {
144 if(icc_buf_ptr == NULL || icc_length == 0) { 144 if(icc_buf_ptr == NULL || icc_length == 0) {
145 return FALSE; 145 return FALSE;
146 } 146 }
147 FX_DWORD icc_segment_size = (JPEG_MARKER_MAXSIZE - 2 - JPEG_OVERHEAD_LEN); 147 FX_DWORD icc_segment_size = (JPEG_MARKER_MAXSIZE - 2 - JPEG_OVERHEAD_LEN);
148 FX_DWORD icc_segment_num = (icc_length / icc_segment_size) + 1; 148 FX_DWORD icc_segment_num = (icc_length / icc_segment_size) + 1;
149 if (icc_segment_num > 255) { 149 if (icc_segment_num > 255) {
150 return FALSE; 150 return FALSE;
151 } 151 }
152 FX_DWORD icc_data_length = JPEG_OVERHEAD_LEN + (icc_segment_num > 1 ? icc_se gment_size : icc_length); 152 FX_DWORD icc_data_length = JPEG_OVERHEAD_LEN + (icc_segment_num > 1 ? icc_se gment_size : icc_length);
153 FX_LPBYTE icc_data = FX_Alloc(FX_BYTE, icc_data_length); 153 FX_LPBYTE icc_data = FX_Alloc(uint8_t, icc_data_length);
154 FXSYS_memcpy32(icc_data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", 12); 154 FXSYS_memcpy32(icc_data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", 12);
155 icc_data[13] = (FX_BYTE)icc_segment_num; 155 icc_data[13] = (uint8_t)icc_segment_num;
156 for (FX_BYTE i = 0; i < (icc_segment_num - 1); i++) { 156 for (uint8_t i = 0; i < (icc_segment_num - 1); i++) {
157 icc_data[12] = i + 1; 157 icc_data[12] = i + 1;
158 FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + i * icc_segme nt_size, icc_segment_size); 158 FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + i * icc_segme nt_size, icc_segment_size);
159 jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, icc_data_length); 159 jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, icc_data_length);
160 } 160 }
161 icc_data[12] = (FX_BYTE)icc_segment_num; 161 icc_data[12] = (uint8_t)icc_segment_num;
162 FX_DWORD icc_size = (icc_segment_num - 1) * icc_segment_size; 162 FX_DWORD icc_size = (icc_segment_num - 1) * icc_segment_size;
163 FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + icc_size, icc_len gth - icc_size); 163 FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + icc_size, icc_len gth - icc_size);
164 jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, JPEG_OVERHEAD_LEN + icc_ length - icc_size); 164 jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, JPEG_OVERHEAD_LEN + icc_ length - icc_size);
165 FX_Free(icc_data); 165 FX_Free(icc_data);
166 return TRUE; 166 return TRUE;
167 } 167 }
168 extern "C" { 168 extern "C" {
169 static void _dest_do_nothing(j_compress_ptr cinfo) {} 169 static void _dest_do_nothing(j_compress_ptr cinfo) {}
170 }; 170 };
171 extern "C" { 171 extern "C" {
(...skipping 27 matching lines...) Expand all
199 safe_buf_len += 1024; 199 safe_buf_len += 1024;
200 if (icc_length) { 200 if (icc_length) {
201 safe_buf_len += 255 * 18; 201 safe_buf_len += 255 * 18;
202 safe_buf_len += icc_length; 202 safe_buf_len += icc_length;
203 } 203 }
204 FX_DWORD dest_buf_length = 0; 204 FX_DWORD dest_buf_length = 0;
205 if (!safe_buf_len.IsValid()) { 205 if (!safe_buf_len.IsValid()) {
206 dest_buf = nullptr; 206 dest_buf = nullptr;
207 } else { 207 } else {
208 dest_buf_length = safe_buf_len.ValueOrDie(); 208 dest_buf_length = safe_buf_len.ValueOrDie();
209 dest_buf = FX_TryAlloc(FX_BYTE, dest_buf_length); 209 dest_buf = FX_TryAlloc(uint8_t, dest_buf_length);
210 const int MIN_TRY_BUF_LEN = 1024; 210 const int MIN_TRY_BUF_LEN = 1024;
211 while (!dest_buf && dest_buf_length > MIN_TRY_BUF_LEN) { 211 while (!dest_buf && dest_buf_length > MIN_TRY_BUF_LEN) {
212 dest_buf_length >>= 1; 212 dest_buf_length >>= 1;
213 dest_buf = FX_TryAlloc(FX_BYTE, dest_buf_length); 213 dest_buf = FX_TryAlloc(uint8_t, dest_buf_length);
214 } 214 }
215 } 215 }
216 if (!dest_buf) { 216 if (!dest_buf) {
217 FX_OutOfMemoryTerminate(); 217 FX_OutOfMemoryTerminate();
218 } 218 }
219 struct jpeg_destination_mgr dest; 219 struct jpeg_destination_mgr dest;
220 dest.init_destination = _dest_do_nothing; 220 dest.init_destination = _dest_do_nothing;
221 dest.term_destination = _dest_do_nothing; 221 dest.term_destination = _dest_do_nothing;
222 dest.empty_output_buffer = _dest_empty; 222 dest.empty_output_buffer = _dest_empty;
223 dest.next_output_byte = dest_buf; 223 dest.next_output_byte = dest_buf;
224 dest.free_in_buffer = dest_buf_length; 224 dest.free_in_buffer = dest_buf_length;
225 cinfo.dest = &dest; 225 cinfo.dest = &dest;
226 cinfo.image_width = width; 226 cinfo.image_width = width;
227 cinfo.image_height = height; 227 cinfo.image_height = height;
228 cinfo.input_components = nComponents; 228 cinfo.input_components = nComponents;
229 if (nComponents == 1) { 229 if (nComponents == 1) {
230 cinfo.in_color_space = JCS_GRAYSCALE; 230 cinfo.in_color_space = JCS_GRAYSCALE;
231 } else if (nComponents == 3) { 231 } else if (nComponents == 3) {
232 cinfo.in_color_space = JCS_RGB; 232 cinfo.in_color_space = JCS_RGB;
233 } else { 233 } else {
234 cinfo.in_color_space = JCS_CMYK; 234 cinfo.in_color_space = JCS_CMYK;
235 } 235 }
236 FX_LPBYTE line_buf = NULL; 236 FX_LPBYTE line_buf = NULL;
237 if (nComponents > 1) { 237 if (nComponents > 1) {
238 line_buf = FX_Alloc2D(FX_BYTE, width, nComponents); 238 line_buf = FX_Alloc2D(uint8_t, width, nComponents);
239 } 239 }
240 jpeg_set_defaults(&cinfo); 240 jpeg_set_defaults(&cinfo);
241 if(quality != 75) { 241 if(quality != 75) {
242 jpeg_set_quality(&cinfo, quality, TRUE); 242 jpeg_set_quality(&cinfo, quality, TRUE);
243 } 243 }
244 jpeg_start_compress(&cinfo, TRUE); 244 jpeg_start_compress(&cinfo, TRUE);
245 _JpegEmbedIccProfile(&cinfo, icc_buf, icc_length); 245 _JpegEmbedIccProfile(&cinfo, icc_buf, icc_length);
246 JSAMPROW row_pointer[1]; 246 JSAMPROW row_pointer[1];
247 JDIMENSION row; 247 JDIMENSION row;
248 while (cinfo.next_scanline < cinfo.image_height) { 248 while (cinfo.next_scanline < cinfo.image_height) {
(...skipping 13 matching lines...) Expand all
262 *dest_scan++ = ~*src_scan++; 262 *dest_scan++ = ~*src_scan++;
263 } 263 }
264 } 264 }
265 row_pointer[0] = line_buf; 265 row_pointer[0] = line_buf;
266 } else { 266 } else {
267 row_pointer[0] = (FX_LPBYTE)src_scan; 267 row_pointer[0] = (FX_LPBYTE)src_scan;
268 } 268 }
269 row = cinfo.next_scanline; 269 row = cinfo.next_scanline;
270 jpeg_write_scanlines(&cinfo, row_pointer, 1); 270 jpeg_write_scanlines(&cinfo, row_pointer, 1);
271 if (cinfo.next_scanline == row) { 271 if (cinfo.next_scanline == row) {
272 dest_buf = FX_Realloc(FX_BYTE, dest_buf, dest_buf_length + JPEG_BLOC K_SIZE); 272 dest_buf = FX_Realloc(uint8_t, dest_buf, dest_buf_length + JPEG_BLOC K_SIZE);
273 dest.next_output_byte = dest_buf + dest_buf_length - dest.free_in_bu ffer; 273 dest.next_output_byte = dest_buf + dest_buf_length - dest.free_in_bu ffer;
274 dest_buf_length += JPEG_BLOCK_SIZE; 274 dest_buf_length += JPEG_BLOCK_SIZE;
275 dest.free_in_buffer += JPEG_BLOCK_SIZE; 275 dest.free_in_buffer += JPEG_BLOCK_SIZE;
276 } 276 }
277 } 277 }
278 jpeg_finish_compress(&cinfo); 278 jpeg_finish_compress(&cinfo);
279 jpeg_destroy_compress(&cinfo); 279 jpeg_destroy_compress(&cinfo);
280 if (line_buf) { 280 if (line_buf) {
281 FX_Free(line_buf); 281 FX_Free(line_buf);
282 } 282 }
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 if (!InitDecode()) { 470 if (!InitDecode()) {
471 return FALSE; 471 return FALSE;
472 } 472 }
473 if (cinfo.num_components < nComps) { 473 if (cinfo.num_components < nComps) {
474 return FALSE; 474 return FALSE;
475 } 475 }
476 if ((int)cinfo.image_width < width) { 476 if ((int)cinfo.image_width < width) {
477 return FALSE; 477 return FALSE;
478 } 478 }
479 m_Pitch = (cinfo.image_width * cinfo.num_components + 3) / 4 * 4; 479 m_Pitch = (cinfo.image_width * cinfo.num_components + 3) / 4 * 4;
480 m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch); 480 m_pScanlineBuf = FX_Alloc(uint8_t, m_Pitch);
481 m_nComps = cinfo.num_components; 481 m_nComps = cinfo.num_components;
482 m_bpc = 8; 482 m_bpc = 8;
483 m_bColorTransformed = FALSE; 483 m_bColorTransformed = FALSE;
484 m_bStarted = FALSE; 484 m_bStarted = FALSE;
485 return TRUE; 485 return TRUE;
486 } 486 }
487 extern "C" { 487 extern "C" {
488 FX_INT32 FX_GetDownsampleRatio(FX_INT32 originWidth, FX_INT32 originHeight, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight) 488 int32_t FX_GetDownsampleRatio(int32_t originWidth, int32_t originHeight, int 32_t downsampleWidth, int32_t downsampleHeight)
489 { 489 {
490 int iratio_w = originWidth / downsampleWidth; 490 int iratio_w = originWidth / downsampleWidth;
491 int iratio_h = originHeight / downsampleHeight; 491 int iratio_h = originHeight / downsampleHeight;
492 int ratio = (iratio_w > iratio_h) ? iratio_h : iratio_w; 492 int ratio = (iratio_w > iratio_h) ? iratio_h : iratio_w;
493 if (ratio >= 8) { 493 if (ratio >= 8) {
494 return 8; 494 return 8;
495 } else if (ratio >= 4) { 495 } else if (ratio >= 4) {
496 return 4; 496 return 4;
497 } else if (ratio >= 2) { 497 } else if (ratio >= 2) {
498 return 2; 498 return 2;
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 } 630 }
631 static void jpeg_free_func(void* p) 631 static void jpeg_free_func(void* p)
632 { 632 {
633 FX_Free(p); 633 FX_Free(p);
634 } 634 }
635 void* CCodec_JpegModule::Start() 635 void* CCodec_JpegModule::Start()
636 { 636 {
637 if (m_pExtProvider) { 637 if (m_pExtProvider) {
638 return m_pExtProvider->Start(); 638 return m_pExtProvider->Start();
639 } 639 }
640 FXJPEG_Context* p = (FXJPEG_Context*)FX_Alloc(FX_BYTE, sizeof(FXJPEG_Context )); 640 FXJPEG_Context* p = (FXJPEG_Context*)FX_Alloc(uint8_t, sizeof(FXJPEG_Context ));
641 p->m_AllocFunc = jpeg_alloc_func; 641 p->m_AllocFunc = jpeg_alloc_func;
642 p->m_FreeFunc = jpeg_free_func; 642 p->m_FreeFunc = jpeg_free_func;
643 p->m_ErrMgr.error_exit = _error_fatal1; 643 p->m_ErrMgr.error_exit = _error_fatal1;
644 p->m_ErrMgr.emit_message = _error_do_nothing1; 644 p->m_ErrMgr.emit_message = _error_do_nothing1;
645 p->m_ErrMgr.output_message = _error_do_nothing; 645 p->m_ErrMgr.output_message = _error_do_nothing;
646 p->m_ErrMgr.format_message = _error_do_nothing2; 646 p->m_ErrMgr.format_message = _error_do_nothing2;
647 p->m_ErrMgr.reset_error_mgr = _error_do_nothing; 647 p->m_ErrMgr.reset_error_mgr = _error_do_nothing;
648 p->m_SrcMgr.init_source = _src_do_nothing; 648 p->m_SrcMgr.init_source = _src_do_nothing;
649 p->m_SrcMgr.term_source = _src_do_nothing; 649 p->m_SrcMgr.term_source = _src_do_nothing;
650 p->m_SrcMgr.skip_input_data = _src_skip_data1; 650 p->m_SrcMgr.skip_input_data = _src_skip_data1;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 return m_pExtProvider->GetAvailInput(pContext, avail_buf_ptr); 742 return m_pExtProvider->GetAvailInput(pContext, avail_buf_ptr);
743 } 743 }
744 if(avail_buf_ptr != NULL) { 744 if(avail_buf_ptr != NULL) {
745 *avail_buf_ptr = NULL; 745 *avail_buf_ptr = NULL;
746 if(((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer > 0) { 746 if(((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer > 0) {
747 *avail_buf_ptr = (FX_LPBYTE)((FXJPEG_Context*)pContext)->m_SrcMgr.ne xt_input_byte; 747 *avail_buf_ptr = (FX_LPBYTE)((FXJPEG_Context*)pContext)->m_SrcMgr.ne xt_input_byte;
748 } 748 }
749 } 749 }
750 return (FX_DWORD)((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer; 750 return (FX_DWORD)((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer;
751 } 751 }
OLDNEW
« no previous file with comments | « core/src/fxcodec/codec/fx_codec_jbig.cpp ('k') | core/src/fxcodec/codec/fx_codec_jpx_opj.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698