OLD | NEW |
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 "core/fxcodec/codec/codec_int.h" | 9 #include "core/fxcodec/codec/codec_int.h" |
10 #include "core/fxcrt/include/fx_safe_types.h" | 10 #include "core/fxcrt/include/fx_safe_types.h" |
11 #include "core/include/fxcodec/fx_codec.h" | 11 #include "core/include/fxcodec/fx_codec.h" |
12 #include "core/include/fxge/fx_dib.h" | 12 #include "core/include/fxge/fx_dib.h" |
13 | 13 |
14 extern "C" { | 14 extern "C" { |
15 #undef FAR | 15 #undef FAR |
16 #if defined(USE_SYSTEM_LIBJPEG) | 16 #if defined(USE_SYSTEM_LIBJPEG) |
17 #include <jpeglib.h> | 17 #include <jpeglib.h> |
18 #elif defined(USE_LIBJPEG_TURBO) | 18 #elif defined(USE_LIBJPEG_TURBO) |
19 #include "third_party/libjpeg_turbo/jpeglib.h" | 19 #include "third_party/libjpeg_turbo/jpeglib.h" |
20 #else | 20 #else |
21 #include "third_party/libjpeg/jpeglib.h" | 21 #include "third_party/libjpeg/jpeglib.h" |
22 #endif | 22 #endif |
23 } | 23 } |
24 | 24 |
25 extern "C" { | 25 extern "C" { |
26 static void _JpegScanSOI(const uint8_t*& src_buf, FX_DWORD& src_size) { | 26 static void _JpegScanSOI(const uint8_t*& src_buf, uint32_t& src_size) { |
27 if (src_size == 0) { | 27 if (src_size == 0) { |
28 return; | 28 return; |
29 } | 29 } |
30 FX_DWORD offset = 0; | 30 uint32_t offset = 0; |
31 while (offset < src_size - 1) { | 31 while (offset < src_size - 1) { |
32 if (src_buf[offset] == 0xff && src_buf[offset + 1] == 0xd8) { | 32 if (src_buf[offset] == 0xff && src_buf[offset + 1] == 0xd8) { |
33 src_buf += offset; | 33 src_buf += offset; |
34 src_size -= offset; | 34 src_size -= offset; |
35 return; | 35 return; |
36 } | 36 } |
37 offset++; | 37 offset++; |
38 } | 38 } |
39 } | 39 } |
40 }; | 40 }; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 extern "C" { | 74 extern "C" { |
75 static void _error_do_nothing2(j_common_ptr cinfo, char*) {} | 75 static void _error_do_nothing2(j_common_ptr cinfo, char*) {} |
76 }; | 76 }; |
77 #define JPEG_MARKER_EXIF (JPEG_APP0 + 1) | 77 #define JPEG_MARKER_EXIF (JPEG_APP0 + 1) |
78 #define JPEG_MARKER_ICC (JPEG_APP0 + 2) | 78 #define JPEG_MARKER_ICC (JPEG_APP0 + 2) |
79 #define JPEG_MARKER_AUTHORTIME (JPEG_APP0 + 3) | 79 #define JPEG_MARKER_AUTHORTIME (JPEG_APP0 + 3) |
80 #define JPEG_MARKER_MAXSIZE 0xFFFF | 80 #define JPEG_MARKER_MAXSIZE 0xFFFF |
81 #define JPEG_OVERHEAD_LEN 14 | 81 #define JPEG_OVERHEAD_LEN 14 |
82 static FX_BOOL _JpegEmbedIccProfile(j_compress_ptr cinfo, | 82 static FX_BOOL _JpegEmbedIccProfile(j_compress_ptr cinfo, |
83 const uint8_t* icc_buf_ptr, | 83 const uint8_t* icc_buf_ptr, |
84 FX_DWORD icc_length) { | 84 uint32_t icc_length) { |
85 if (!icc_buf_ptr || icc_length == 0) { | 85 if (!icc_buf_ptr || icc_length == 0) { |
86 return FALSE; | 86 return FALSE; |
87 } | 87 } |
88 FX_DWORD icc_segment_size = (JPEG_MARKER_MAXSIZE - 2 - JPEG_OVERHEAD_LEN); | 88 uint32_t icc_segment_size = (JPEG_MARKER_MAXSIZE - 2 - JPEG_OVERHEAD_LEN); |
89 FX_DWORD icc_segment_num = (icc_length / icc_segment_size) + 1; | 89 uint32_t icc_segment_num = (icc_length / icc_segment_size) + 1; |
90 if (icc_segment_num > 255) { | 90 if (icc_segment_num > 255) { |
91 return FALSE; | 91 return FALSE; |
92 } | 92 } |
93 FX_DWORD icc_data_length = | 93 uint32_t icc_data_length = |
94 JPEG_OVERHEAD_LEN + (icc_segment_num > 1 ? icc_segment_size : icc_length); | 94 JPEG_OVERHEAD_LEN + (icc_segment_num > 1 ? icc_segment_size : icc_length); |
95 uint8_t* icc_data = FX_Alloc(uint8_t, icc_data_length); | 95 uint8_t* icc_data = FX_Alloc(uint8_t, icc_data_length); |
96 FXSYS_memcpy(icc_data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", | 96 FXSYS_memcpy(icc_data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", |
97 12); | 97 12); |
98 icc_data[13] = (uint8_t)icc_segment_num; | 98 icc_data[13] = (uint8_t)icc_segment_num; |
99 for (uint8_t i = 0; i < (icc_segment_num - 1); i++) { | 99 for (uint8_t i = 0; i < (icc_segment_num - 1); i++) { |
100 icc_data[12] = i + 1; | 100 icc_data[12] = i + 1; |
101 FXSYS_memcpy(icc_data + JPEG_OVERHEAD_LEN, | 101 FXSYS_memcpy(icc_data + JPEG_OVERHEAD_LEN, |
102 icc_buf_ptr + i * icc_segment_size, icc_segment_size); | 102 icc_buf_ptr + i * icc_segment_size, icc_segment_size); |
103 jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, icc_data_length); | 103 jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, icc_data_length); |
104 } | 104 } |
105 icc_data[12] = (uint8_t)icc_segment_num; | 105 icc_data[12] = (uint8_t)icc_segment_num; |
106 FX_DWORD icc_size = (icc_segment_num - 1) * icc_segment_size; | 106 uint32_t icc_size = (icc_segment_num - 1) * icc_segment_size; |
107 FXSYS_memcpy(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + icc_size, | 107 FXSYS_memcpy(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + icc_size, |
108 icc_length - icc_size); | 108 icc_length - icc_size); |
109 jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, | 109 jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, |
110 JPEG_OVERHEAD_LEN + icc_length - icc_size); | 110 JPEG_OVERHEAD_LEN + icc_length - icc_size); |
111 FX_Free(icc_data); | 111 FX_Free(icc_data); |
112 return TRUE; | 112 return TRUE; |
113 } | 113 } |
114 extern "C" { | 114 extern "C" { |
115 static void _dest_do_nothing(j_compress_ptr cinfo) {} | 115 static void _dest_do_nothing(j_compress_ptr cinfo) {} |
116 }; | 116 }; |
117 extern "C" { | 117 extern "C" { |
118 static boolean _dest_empty(j_compress_ptr cinfo) { | 118 static boolean _dest_empty(j_compress_ptr cinfo) { |
119 return FALSE; | 119 return FALSE; |
120 } | 120 } |
121 }; | 121 }; |
122 #define JPEG_BLOCK_SIZE 1048576 | 122 #define JPEG_BLOCK_SIZE 1048576 |
123 static void _JpegEncode(const CFX_DIBSource* pSource, | 123 static void _JpegEncode(const CFX_DIBSource* pSource, |
124 uint8_t*& dest_buf, | 124 uint8_t*& dest_buf, |
125 FX_STRSIZE& dest_size, | 125 FX_STRSIZE& dest_size, |
126 int quality, | 126 int quality, |
127 const uint8_t* icc_buf, | 127 const uint8_t* icc_buf, |
128 FX_DWORD icc_length) { | 128 uint32_t icc_length) { |
129 struct jpeg_error_mgr jerr; | 129 struct jpeg_error_mgr jerr; |
130 jerr.error_exit = _error_do_nothing; | 130 jerr.error_exit = _error_do_nothing; |
131 jerr.emit_message = _error_do_nothing1; | 131 jerr.emit_message = _error_do_nothing1; |
132 jerr.output_message = _error_do_nothing; | 132 jerr.output_message = _error_do_nothing; |
133 jerr.format_message = _error_do_nothing2; | 133 jerr.format_message = _error_do_nothing2; |
134 jerr.reset_error_mgr = _error_do_nothing; | 134 jerr.reset_error_mgr = _error_do_nothing; |
135 | 135 |
136 struct jpeg_compress_struct cinfo; | 136 struct jpeg_compress_struct cinfo; |
137 memset(&cinfo, 0, sizeof(cinfo)); | 137 memset(&cinfo, 0, sizeof(cinfo)); |
138 cinfo.err = &jerr; | 138 cinfo.err = &jerr; |
139 jpeg_create_compress(&cinfo); | 139 jpeg_create_compress(&cinfo); |
140 int Bpp = pSource->GetBPP() / 8; | 140 int Bpp = pSource->GetBPP() / 8; |
141 FX_DWORD nComponents = Bpp >= 3 ? (pSource->IsCmykImage() ? 4 : 3) : 1; | 141 uint32_t nComponents = Bpp >= 3 ? (pSource->IsCmykImage() ? 4 : 3) : 1; |
142 FX_DWORD pitch = pSource->GetPitch(); | 142 uint32_t pitch = pSource->GetPitch(); |
143 FX_DWORD width = pdfium::base::checked_cast<FX_DWORD>(pSource->GetWidth()); | 143 uint32_t width = pdfium::base::checked_cast<uint32_t>(pSource->GetWidth()); |
144 FX_DWORD height = pdfium::base::checked_cast<FX_DWORD>(pSource->GetHeight()); | 144 uint32_t height = pdfium::base::checked_cast<uint32_t>(pSource->GetHeight()); |
145 FX_SAFE_DWORD safe_buf_len = width; | 145 FX_SAFE_DWORD safe_buf_len = width; |
146 safe_buf_len *= height; | 146 safe_buf_len *= height; |
147 safe_buf_len *= nComponents; | 147 safe_buf_len *= nComponents; |
148 safe_buf_len += 1024; | 148 safe_buf_len += 1024; |
149 if (icc_length) { | 149 if (icc_length) { |
150 safe_buf_len += 255 * 18; | 150 safe_buf_len += 255 * 18; |
151 safe_buf_len += icc_length; | 151 safe_buf_len += icc_length; |
152 } | 152 } |
153 FX_DWORD dest_buf_length = 0; | 153 uint32_t dest_buf_length = 0; |
154 if (!safe_buf_len.IsValid()) { | 154 if (!safe_buf_len.IsValid()) { |
155 dest_buf = nullptr; | 155 dest_buf = nullptr; |
156 } else { | 156 } else { |
157 dest_buf_length = safe_buf_len.ValueOrDie(); | 157 dest_buf_length = safe_buf_len.ValueOrDie(); |
158 dest_buf = FX_TryAlloc(uint8_t, dest_buf_length); | 158 dest_buf = FX_TryAlloc(uint8_t, dest_buf_length); |
159 const int MIN_TRY_BUF_LEN = 1024; | 159 const int MIN_TRY_BUF_LEN = 1024; |
160 while (!dest_buf && dest_buf_length > MIN_TRY_BUF_LEN) { | 160 while (!dest_buf && dest_buf_length > MIN_TRY_BUF_LEN) { |
161 dest_buf_length >>= 1; | 161 dest_buf_length >>= 1; |
162 dest_buf = FX_TryAlloc(uint8_t, dest_buf_length); | 162 dest_buf = FX_TryAlloc(uint8_t, dest_buf_length); |
163 } | 163 } |
(...skipping 28 matching lines...) Expand all Loading... |
192 } | 192 } |
193 jpeg_start_compress(&cinfo, TRUE); | 193 jpeg_start_compress(&cinfo, TRUE); |
194 _JpegEmbedIccProfile(&cinfo, icc_buf, icc_length); | 194 _JpegEmbedIccProfile(&cinfo, icc_buf, icc_length); |
195 JSAMPROW row_pointer[1]; | 195 JSAMPROW row_pointer[1]; |
196 JDIMENSION row; | 196 JDIMENSION row; |
197 while (cinfo.next_scanline < cinfo.image_height) { | 197 while (cinfo.next_scanline < cinfo.image_height) { |
198 const uint8_t* src_scan = pSource->GetScanline(cinfo.next_scanline); | 198 const uint8_t* src_scan = pSource->GetScanline(cinfo.next_scanline); |
199 if (nComponents > 1) { | 199 if (nComponents > 1) { |
200 uint8_t* dest_scan = line_buf; | 200 uint8_t* dest_scan = line_buf; |
201 if (nComponents == 3) { | 201 if (nComponents == 3) { |
202 for (FX_DWORD i = 0; i < width; i++) { | 202 for (uint32_t i = 0; i < width; i++) { |
203 dest_scan[0] = src_scan[2]; | 203 dest_scan[0] = src_scan[2]; |
204 dest_scan[1] = src_scan[1]; | 204 dest_scan[1] = src_scan[1]; |
205 dest_scan[2] = src_scan[0]; | 205 dest_scan[2] = src_scan[0]; |
206 dest_scan += 3; | 206 dest_scan += 3; |
207 src_scan += Bpp; | 207 src_scan += Bpp; |
208 } | 208 } |
209 } else { | 209 } else { |
210 for (FX_DWORD i = 0; i < pitch; i++) { | 210 for (uint32_t i = 0; i < pitch; i++) { |
211 *dest_scan++ = ~*src_scan++; | 211 *dest_scan++ = ~*src_scan++; |
212 } | 212 } |
213 } | 213 } |
214 row_pointer[0] = line_buf; | 214 row_pointer[0] = line_buf; |
215 } else { | 215 } else { |
216 row_pointer[0] = (uint8_t*)src_scan; | 216 row_pointer[0] = (uint8_t*)src_scan; |
217 } | 217 } |
218 row = cinfo.next_scanline; | 218 row = cinfo.next_scanline; |
219 jpeg_write_scanlines(&cinfo, row_pointer, 1); | 219 jpeg_write_scanlines(&cinfo, row_pointer, 1); |
220 if (cinfo.next_scanline == row) { | 220 if (cinfo.next_scanline == row) { |
(...skipping 18 matching lines...) Expand all Loading... |
239 } | 239 } |
240 if (pAttribute) { | 240 if (pAttribute) { |
241 pAttribute->m_nXDPI = pInfo->X_density; | 241 pAttribute->m_nXDPI = pInfo->X_density; |
242 pAttribute->m_nYDPI = pInfo->Y_density; | 242 pAttribute->m_nYDPI = pInfo->Y_density; |
243 pAttribute->m_wDPIUnit = pInfo->density_unit; | 243 pAttribute->m_wDPIUnit = pInfo->density_unit; |
244 } | 244 } |
245 } | 245 } |
246 #endif // PDF_ENABLE_XFA | 246 #endif // PDF_ENABLE_XFA |
247 | 247 |
248 static FX_BOOL _JpegLoadInfo(const uint8_t* src_buf, | 248 static FX_BOOL _JpegLoadInfo(const uint8_t* src_buf, |
249 FX_DWORD src_size, | 249 uint32_t src_size, |
250 int& width, | 250 int& width, |
251 int& height, | 251 int& height, |
252 int& num_components, | 252 int& num_components, |
253 int& bits_per_components, | 253 int& bits_per_components, |
254 FX_BOOL& color_transform, | 254 FX_BOOL& color_transform, |
255 uint8_t** icc_buf_ptr, | 255 uint8_t** icc_buf_ptr, |
256 FX_DWORD* icc_length) { | 256 uint32_t* icc_length) { |
257 _JpegScanSOI(src_buf, src_size); | 257 _JpegScanSOI(src_buf, src_size); |
258 struct jpeg_decompress_struct cinfo; | 258 struct jpeg_decompress_struct cinfo; |
259 struct jpeg_error_mgr jerr; | 259 struct jpeg_error_mgr jerr; |
260 jerr.error_exit = _error_fatal; | 260 jerr.error_exit = _error_fatal; |
261 jerr.emit_message = _error_do_nothing1; | 261 jerr.emit_message = _error_do_nothing1; |
262 jerr.output_message = _error_do_nothing; | 262 jerr.output_message = _error_do_nothing; |
263 jerr.format_message = _error_do_nothing2; | 263 jerr.format_message = _error_do_nothing2; |
264 jerr.reset_error_mgr = _error_do_nothing; | 264 jerr.reset_error_mgr = _error_do_nothing; |
265 jerr.trace_level = 0; | 265 jerr.trace_level = 0; |
266 cinfo.err = &jerr; | 266 cinfo.err = &jerr; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 jpeg_destroy_decompress(&cinfo); | 306 jpeg_destroy_decompress(&cinfo); |
307 return TRUE; | 307 return TRUE; |
308 } | 308 } |
309 | 309 |
310 class CCodec_JpegDecoder : public CCodec_ScanlineDecoder { | 310 class CCodec_JpegDecoder : public CCodec_ScanlineDecoder { |
311 public: | 311 public: |
312 CCodec_JpegDecoder(); | 312 CCodec_JpegDecoder(); |
313 ~CCodec_JpegDecoder() override; | 313 ~CCodec_JpegDecoder() override; |
314 | 314 |
315 FX_BOOL Create(const uint8_t* src_buf, | 315 FX_BOOL Create(const uint8_t* src_buf, |
316 FX_DWORD src_size, | 316 uint32_t src_size, |
317 int width, | 317 int width, |
318 int height, | 318 int height, |
319 int nComps, | 319 int nComps, |
320 FX_BOOL ColorTransform); | 320 FX_BOOL ColorTransform); |
321 void Destroy() { delete this; } | 321 void Destroy() { delete this; } |
322 | 322 |
323 // CCodec_ScanlineDecoder | 323 // CCodec_ScanlineDecoder |
324 void v_DownScale(int dest_width, int dest_height) override; | 324 void v_DownScale(int dest_width, int dest_height) override; |
325 FX_BOOL v_Rewind() override; | 325 FX_BOOL v_Rewind() override; |
326 uint8_t* v_GetNextLine() override; | 326 uint8_t* v_GetNextLine() override; |
327 FX_DWORD GetSrcOffset() override; | 327 uint32_t GetSrcOffset() override; |
328 | 328 |
329 FX_BOOL InitDecode(); | 329 FX_BOOL InitDecode(); |
330 | 330 |
331 jmp_buf m_JmpBuf; | 331 jmp_buf m_JmpBuf; |
332 struct jpeg_decompress_struct cinfo; | 332 struct jpeg_decompress_struct cinfo; |
333 struct jpeg_error_mgr jerr; | 333 struct jpeg_error_mgr jerr; |
334 struct jpeg_source_mgr src; | 334 struct jpeg_source_mgr src; |
335 const uint8_t* m_SrcBuf; | 335 const uint8_t* m_SrcBuf; |
336 FX_DWORD m_SrcSize; | 336 uint32_t m_SrcSize; |
337 uint8_t* m_pScanlineBuf; | 337 uint8_t* m_pScanlineBuf; |
338 | 338 |
339 FX_BOOL m_bInited; | 339 FX_BOOL m_bInited; |
340 FX_BOOL m_bStarted; | 340 FX_BOOL m_bStarted; |
341 FX_BOOL m_bJpegTransform; | 341 FX_BOOL m_bJpegTransform; |
342 | 342 |
343 protected: | 343 protected: |
344 FX_DWORD m_nDefaultScaleDenom; | 344 uint32_t m_nDefaultScaleDenom; |
345 }; | 345 }; |
346 | 346 |
347 CCodec_JpegDecoder::CCodec_JpegDecoder() { | 347 CCodec_JpegDecoder::CCodec_JpegDecoder() { |
348 m_pScanlineBuf = NULL; | 348 m_pScanlineBuf = NULL; |
349 m_DownScale = 1; | 349 m_DownScale = 1; |
350 m_bStarted = FALSE; | 350 m_bStarted = FALSE; |
351 m_bInited = FALSE; | 351 m_bInited = FALSE; |
352 FXSYS_memset(&cinfo, 0, sizeof(cinfo)); | 352 FXSYS_memset(&cinfo, 0, sizeof(cinfo)); |
353 FXSYS_memset(&jerr, 0, sizeof(jerr)); | 353 FXSYS_memset(&jerr, 0, sizeof(jerr)); |
354 FXSYS_memset(&src, 0, sizeof(src)); | 354 FXSYS_memset(&src, 0, sizeof(src)); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 cinfo.out_color_space = cinfo.jpeg_color_space; | 389 cinfo.out_color_space = cinfo.jpeg_color_space; |
390 } | 390 } |
391 m_OrigWidth = cinfo.image_width; | 391 m_OrigWidth = cinfo.image_width; |
392 m_OrigHeight = cinfo.image_height; | 392 m_OrigHeight = cinfo.image_height; |
393 m_OutputWidth = m_OrigWidth; | 393 m_OutputWidth = m_OrigWidth; |
394 m_OutputHeight = m_OrigHeight; | 394 m_OutputHeight = m_OrigHeight; |
395 m_nDefaultScaleDenom = cinfo.scale_denom; | 395 m_nDefaultScaleDenom = cinfo.scale_denom; |
396 return TRUE; | 396 return TRUE; |
397 } | 397 } |
398 FX_BOOL CCodec_JpegDecoder::Create(const uint8_t* src_buf, | 398 FX_BOOL CCodec_JpegDecoder::Create(const uint8_t* src_buf, |
399 FX_DWORD src_size, | 399 uint32_t src_size, |
400 int width, | 400 int width, |
401 int height, | 401 int height, |
402 int nComps, | 402 int nComps, |
403 FX_BOOL ColorTransform) { | 403 FX_BOOL ColorTransform) { |
404 _JpegScanSOI(src_buf, src_size); | 404 _JpegScanSOI(src_buf, src_size); |
405 m_SrcBuf = src_buf; | 405 m_SrcBuf = src_buf; |
406 m_SrcSize = src_size; | 406 m_SrcSize = src_size; |
407 jerr.error_exit = _error_fatal; | 407 jerr.error_exit = _error_fatal; |
408 jerr.emit_message = _error_do_nothing1; | 408 jerr.emit_message = _error_do_nothing1; |
409 jerr.output_message = _error_do_nothing; | 409 jerr.output_message = _error_do_nothing; |
(...skipping 15 matching lines...) Expand all Loading... |
425 if (!InitDecode()) { | 425 if (!InitDecode()) { |
426 return FALSE; | 426 return FALSE; |
427 } | 427 } |
428 if (cinfo.num_components < nComps) { | 428 if (cinfo.num_components < nComps) { |
429 return FALSE; | 429 return FALSE; |
430 } | 430 } |
431 if ((int)cinfo.image_width < width) { | 431 if ((int)cinfo.image_width < width) { |
432 return FALSE; | 432 return FALSE; |
433 } | 433 } |
434 m_Pitch = | 434 m_Pitch = |
435 (static_cast<FX_DWORD>(cinfo.image_width) * cinfo.num_components + 3) / | 435 (static_cast<uint32_t>(cinfo.image_width) * cinfo.num_components + 3) / |
436 4 * 4; | 436 4 * 4; |
437 m_pScanlineBuf = FX_Alloc(uint8_t, m_Pitch); | 437 m_pScanlineBuf = FX_Alloc(uint8_t, m_Pitch); |
438 m_nComps = cinfo.num_components; | 438 m_nComps = cinfo.num_components; |
439 m_bpc = 8; | 439 m_bpc = 8; |
440 m_bColorTransformed = FALSE; | 440 m_bColorTransformed = FALSE; |
441 m_bStarted = FALSE; | 441 m_bStarted = FALSE; |
442 return TRUE; | 442 return TRUE; |
443 } | 443 } |
444 extern "C" { | 444 extern "C" { |
445 int32_t FX_GetDownsampleRatio(int32_t originWidth, | 445 int32_t FX_GetDownsampleRatio(int32_t originWidth, |
(...skipping 14 matching lines...) Expand all Loading... |
460 } | 460 } |
461 return 1; | 461 return 1; |
462 } | 462 } |
463 } | 463 } |
464 void CCodec_JpegDecoder::v_DownScale(int dest_width, int dest_height) { | 464 void CCodec_JpegDecoder::v_DownScale(int dest_width, int dest_height) { |
465 int old_scale = m_DownScale; | 465 int old_scale = m_DownScale; |
466 m_DownScale = | 466 m_DownScale = |
467 FX_GetDownsampleRatio(m_OrigWidth, m_OrigHeight, dest_width, dest_height); | 467 FX_GetDownsampleRatio(m_OrigWidth, m_OrigHeight, dest_width, dest_height); |
468 m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale; | 468 m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale; |
469 m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale; | 469 m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale; |
470 m_Pitch = (static_cast<FX_DWORD>(m_OutputWidth) * m_nComps + 3) / 4 * 4; | 470 m_Pitch = (static_cast<uint32_t>(m_OutputWidth) * m_nComps + 3) / 4 * 4; |
471 if (old_scale != m_DownScale) { | 471 if (old_scale != m_DownScale) { |
472 m_NextLine = -1; | 472 m_NextLine = -1; |
473 } | 473 } |
474 } | 474 } |
475 FX_BOOL CCodec_JpegDecoder::v_Rewind() { | 475 FX_BOOL CCodec_JpegDecoder::v_Rewind() { |
476 if (m_bStarted) { | 476 if (m_bStarted) { |
477 jpeg_destroy_decompress(&cinfo); | 477 jpeg_destroy_decompress(&cinfo); |
478 if (!InitDecode()) { | 478 if (!InitDecode()) { |
479 return FALSE; | 479 return FALSE; |
480 } | 480 } |
(...skipping 18 matching lines...) Expand all Loading... |
499 uint8_t* CCodec_JpegDecoder::v_GetNextLine() { | 499 uint8_t* CCodec_JpegDecoder::v_GetNextLine() { |
500 if (setjmp(m_JmpBuf) == -1) | 500 if (setjmp(m_JmpBuf) == -1) |
501 return nullptr; | 501 return nullptr; |
502 | 502 |
503 int nlines = jpeg_read_scanlines(&cinfo, &m_pScanlineBuf, 1); | 503 int nlines = jpeg_read_scanlines(&cinfo, &m_pScanlineBuf, 1); |
504 if (nlines < 1) { | 504 if (nlines < 1) { |
505 return nullptr; | 505 return nullptr; |
506 } | 506 } |
507 return m_pScanlineBuf; | 507 return m_pScanlineBuf; |
508 } | 508 } |
509 FX_DWORD CCodec_JpegDecoder::GetSrcOffset() { | 509 uint32_t CCodec_JpegDecoder::GetSrcOffset() { |
510 return (FX_DWORD)(m_SrcSize - src.bytes_in_buffer); | 510 return (uint32_t)(m_SrcSize - src.bytes_in_buffer); |
511 } | 511 } |
512 ICodec_ScanlineDecoder* CCodec_JpegModule::CreateDecoder( | 512 ICodec_ScanlineDecoder* CCodec_JpegModule::CreateDecoder( |
513 const uint8_t* src_buf, | 513 const uint8_t* src_buf, |
514 FX_DWORD src_size, | 514 uint32_t src_size, |
515 int width, | 515 int width, |
516 int height, | 516 int height, |
517 int nComps, | 517 int nComps, |
518 FX_BOOL ColorTransform) { | 518 FX_BOOL ColorTransform) { |
519 if (!src_buf || src_size == 0) { | 519 if (!src_buf || src_size == 0) { |
520 return NULL; | 520 return NULL; |
521 } | 521 } |
522 CCodec_JpegDecoder* pDecoder = new CCodec_JpegDecoder; | 522 CCodec_JpegDecoder* pDecoder = new CCodec_JpegDecoder; |
523 if (!pDecoder->Create(src_buf, src_size, width, height, nComps, | 523 if (!pDecoder->Create(src_buf, src_size, width, height, nComps, |
524 ColorTransform)) { | 524 ColorTransform)) { |
525 delete pDecoder; | 525 delete pDecoder; |
526 return NULL; | 526 return NULL; |
527 } | 527 } |
528 return pDecoder; | 528 return pDecoder; |
529 } | 529 } |
530 FX_BOOL CCodec_JpegModule::LoadInfo(const uint8_t* src_buf, | 530 FX_BOOL CCodec_JpegModule::LoadInfo(const uint8_t* src_buf, |
531 FX_DWORD src_size, | 531 uint32_t src_size, |
532 int& width, | 532 int& width, |
533 int& height, | 533 int& height, |
534 int& num_components, | 534 int& num_components, |
535 int& bits_per_components, | 535 int& bits_per_components, |
536 FX_BOOL& color_transform, | 536 FX_BOOL& color_transform, |
537 uint8_t** icc_buf_ptr, | 537 uint8_t** icc_buf_ptr, |
538 FX_DWORD* icc_length) { | 538 uint32_t* icc_length) { |
539 return _JpegLoadInfo(src_buf, src_size, width, height, num_components, | 539 return _JpegLoadInfo(src_buf, src_size, width, height, num_components, |
540 bits_per_components, color_transform, icc_buf_ptr, | 540 bits_per_components, color_transform, icc_buf_ptr, |
541 icc_length); | 541 icc_length); |
542 } | 542 } |
543 FX_BOOL CCodec_JpegModule::Encode(const CFX_DIBSource* pSource, | 543 FX_BOOL CCodec_JpegModule::Encode(const CFX_DIBSource* pSource, |
544 uint8_t*& dest_buf, | 544 uint8_t*& dest_buf, |
545 FX_STRSIZE& dest_size, | 545 FX_STRSIZE& dest_size, |
546 int quality, | 546 int quality, |
547 const uint8_t* icc_buf, | 547 const uint8_t* icc_buf, |
548 FX_DWORD icc_length) { | 548 uint32_t icc_length) { |
549 if (pSource->GetBPP() < 8 || pSource->GetPalette()) | 549 if (pSource->GetBPP() < 8 || pSource->GetPalette()) |
550 return FALSE; | 550 return FALSE; |
551 | 551 |
552 _JpegEncode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length); | 552 _JpegEncode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length); |
553 return TRUE; | 553 return TRUE; |
554 } | 554 } |
555 struct FXJPEG_Context { | 555 struct FXJPEG_Context { |
556 jmp_buf m_JumpMark; | 556 jmp_buf m_JumpMark; |
557 jpeg_decompress_struct m_Info; | 557 jpeg_decompress_struct m_Info; |
558 jpeg_error_mgr m_ErrMgr; | 558 jpeg_error_mgr m_ErrMgr; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 p->m_SkipSize = 0; | 608 p->m_SkipSize = 0; |
609 return p; | 609 return p; |
610 } | 610 } |
611 void CCodec_JpegModule::Finish(void* pContext) { | 611 void CCodec_JpegModule::Finish(void* pContext) { |
612 FXJPEG_Context* p = (FXJPEG_Context*)pContext; | 612 FXJPEG_Context* p = (FXJPEG_Context*)pContext; |
613 jpeg_destroy_decompress(&p->m_Info); | 613 jpeg_destroy_decompress(&p->m_Info); |
614 p->m_FreeFunc(p); | 614 p->m_FreeFunc(p); |
615 } | 615 } |
616 void CCodec_JpegModule::Input(void* pContext, | 616 void CCodec_JpegModule::Input(void* pContext, |
617 const unsigned char* src_buf, | 617 const unsigned char* src_buf, |
618 FX_DWORD src_size) { | 618 uint32_t src_size) { |
619 FXJPEG_Context* p = (FXJPEG_Context*)pContext; | 619 FXJPEG_Context* p = (FXJPEG_Context*)pContext; |
620 if (p->m_SkipSize) { | 620 if (p->m_SkipSize) { |
621 if (p->m_SkipSize > src_size) { | 621 if (p->m_SkipSize > src_size) { |
622 p->m_SrcMgr.bytes_in_buffer = 0; | 622 p->m_SrcMgr.bytes_in_buffer = 0; |
623 p->m_SkipSize -= src_size; | 623 p->m_SkipSize -= src_size; |
624 return; | 624 return; |
625 } | 625 } |
626 src_size -= p->m_SkipSize; | 626 src_size -= p->m_SkipSize; |
627 src_buf += p->m_SkipSize; | 627 src_buf += p->m_SkipSize; |
628 p->m_SkipSize = 0; | 628 p->m_SkipSize = 0; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 } | 672 } |
673 FX_BOOL CCodec_JpegModule::ReadScanline(void* pContext, | 673 FX_BOOL CCodec_JpegModule::ReadScanline(void* pContext, |
674 unsigned char* dest_buf) { | 674 unsigned char* dest_buf) { |
675 FXJPEG_Context* p = (FXJPEG_Context*)pContext; | 675 FXJPEG_Context* p = (FXJPEG_Context*)pContext; |
676 if (setjmp(p->m_JumpMark) == -1) { | 676 if (setjmp(p->m_JumpMark) == -1) { |
677 return FALSE; | 677 return FALSE; |
678 } | 678 } |
679 int nlines = jpeg_read_scanlines(&p->m_Info, &dest_buf, 1); | 679 int nlines = jpeg_read_scanlines(&p->m_Info, &dest_buf, 1); |
680 return nlines == 1; | 680 return nlines == 1; |
681 } | 681 } |
682 FX_DWORD CCodec_JpegModule::GetAvailInput(void* pContext, | 682 uint32_t CCodec_JpegModule::GetAvailInput(void* pContext, |
683 uint8_t** avail_buf_ptr) { | 683 uint8_t** avail_buf_ptr) { |
684 if (avail_buf_ptr) { | 684 if (avail_buf_ptr) { |
685 *avail_buf_ptr = NULL; | 685 *avail_buf_ptr = NULL; |
686 if (((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer > 0) { | 686 if (((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer > 0) { |
687 *avail_buf_ptr = | 687 *avail_buf_ptr = |
688 (uint8_t*)((FXJPEG_Context*)pContext)->m_SrcMgr.next_input_byte; | 688 (uint8_t*)((FXJPEG_Context*)pContext)->m_SrcMgr.next_input_byte; |
689 } | 689 } |
690 } | 690 } |
691 return (FX_DWORD)((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer; | 691 return (uint32_t)((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer; |
692 } | 692 } |
OLD | NEW |