| 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 "../../../../third_party/base/nonstd_unique_ptr.h" | 7 #include "../../../../third_party/base/nonstd_unique_ptr.h" |
| 8 #include "../../../include/fxcodec/fx_codec.h" | 8 #include "../../../include/fxcodec/fx_codec.h" |
| 9 #include "../../fx_zlib.h" | 9 #include "../../fx_zlib.h" |
| 10 #include "codec_int.h" | 10 #include "codec_int.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 ((z_stream*)context)->zfree(0, context); | 72 ((z_stream*)context)->zfree(0, context); |
| 73 } | 73 } |
| 74 void FPDFAPI_FlateCompress(unsigned char* dest_buf, unsigned long* dest_size
, const unsigned char* src_buf, unsigned long src_size) | 74 void FPDFAPI_FlateCompress(unsigned char* dest_buf, unsigned long* dest_size
, const unsigned char* src_buf, unsigned long src_size) |
| 75 { | 75 { |
| 76 compress(dest_buf, dest_size, src_buf, src_size); | 76 compress(dest_buf, dest_size, src_buf, src_size); |
| 77 } | 77 } |
| 78 } | 78 } |
| 79 class CLZWDecoder | 79 class CLZWDecoder |
| 80 { | 80 { |
| 81 public: | 81 public: |
| 82 FX_BOOL Decode(FX_LPBYTE output, FX_DWORD& outlen, const uint8_t* input, FX_
DWORD& size, FX_BOOL bEarlyChange); | 82 FX_BOOL Decode(uint8_t* output, FX_DWORD& outlen, const uint8_t* input, FX_D
WORD& size, FX_BOOL bEarlyChange); |
| 83 private: | 83 private: |
| 84 FX_DWORD m_InPos; | 84 FX_DWORD m_InPos; |
| 85 FX_DWORD m_OutPos; | 85 FX_DWORD m_OutPos; |
| 86 FX_LPBYTE» m_pOutput; | 86 uint8_t*» m_pOutput; |
| 87 const uint8_t* m_pInput; | 87 const uint8_t* m_pInput; |
| 88 FX_BOOL m_Early; | 88 FX_BOOL m_Early; |
| 89 void AddCode(FX_DWORD prefix_code, uint8_t append_char); | 89 void AddCode(FX_DWORD prefix_code, uint8_t append_char); |
| 90 FX_DWORD m_CodeArray[5021]; | 90 FX_DWORD m_CodeArray[5021]; |
| 91 FX_DWORD m_nCodes; | 91 FX_DWORD m_nCodes; |
| 92 uint8_t m_DecodeStack[4000]; | 92 uint8_t m_DecodeStack[4000]; |
| 93 FX_DWORD m_StackLen; | 93 FX_DWORD m_StackLen; |
| 94 void DecodeString(FX_DWORD code); | 94 void DecodeString(FX_DWORD code); |
| 95 int m_CodeLen; | 95 int m_CodeLen; |
| 96 }; | 96 }; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 120 return; | 120 return; |
| 121 } | 121 } |
| 122 m_DecodeStack[m_StackLen++] = (uint8_t)data; | 122 m_DecodeStack[m_StackLen++] = (uint8_t)data; |
| 123 code = data >> 16; | 123 code = data >> 16; |
| 124 } | 124 } |
| 125 if (m_StackLen >= sizeof(m_DecodeStack)) { | 125 if (m_StackLen >= sizeof(m_DecodeStack)) { |
| 126 return; | 126 return; |
| 127 } | 127 } |
| 128 m_DecodeStack[m_StackLen++] = (uint8_t)code; | 128 m_DecodeStack[m_StackLen++] = (uint8_t)code; |
| 129 } | 129 } |
| 130 int CLZWDecoder::Decode(FX_LPBYTE dest_buf, FX_DWORD& dest_size, const uint8_t*
src_buf, FX_DWORD& src_size, FX_BOOL bEarlyChange) | 130 int CLZWDecoder::Decode(uint8_t* dest_buf, FX_DWORD& dest_size, const uint8_t* s
rc_buf, FX_DWORD& src_size, FX_BOOL bEarlyChange) |
| 131 { | 131 { |
| 132 m_CodeLen = 9; | 132 m_CodeLen = 9; |
| 133 m_InPos = 0; | 133 m_InPos = 0; |
| 134 m_OutPos = 0; | 134 m_OutPos = 0; |
| 135 m_pInput = src_buf; | 135 m_pInput = src_buf; |
| 136 m_pOutput = dest_buf; | 136 m_pOutput = dest_buf; |
| 137 m_Early = bEarlyChange ? 1 : 0; | 137 m_Early = bEarlyChange ? 1 : 0; |
| 138 m_nCodes = 0; | 138 m_nCodes = 0; |
| 139 FX_DWORD old_code = (FX_DWORD) - 1; | 139 FX_DWORD old_code = (FX_DWORD) - 1; |
| 140 uint8_t last_char; | 140 uint8_t last_char; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 int pb = FXSYS_abs(p - b); | 224 int pb = FXSYS_abs(p - b); |
| 225 int pc = FXSYS_abs(p - c); | 225 int pc = FXSYS_abs(p - c); |
| 226 if (pa <= pb && pa <= pc) { | 226 if (pa <= pb && pa <= pc) { |
| 227 return (uint8_t)a; | 227 return (uint8_t)a; |
| 228 } | 228 } |
| 229 if (pb <= pc) { | 229 if (pb <= pc) { |
| 230 return (uint8_t)b; | 230 return (uint8_t)b; |
| 231 } | 231 } |
| 232 return (uint8_t)c; | 232 return (uint8_t)c; |
| 233 } | 233 } |
| 234 static FX_BOOL PNG_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size, | 234 static FX_BOOL PNG_PredictorEncode(uint8_t*& data_buf, FX_DWORD& data_size, |
| 235 int predictor, int Colors, | 235 int predictor, int Colors, |
| 236 int BitsPerComponent, int Columns) | 236 int BitsPerComponent, int Columns) |
| 237 { | 237 { |
| 238 const int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8; | 238 const int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8; |
| 239 const int row_size = (Colors * BitsPerComponent * Columns + 7) / 8; | 239 const int row_size = (Colors * BitsPerComponent * Columns + 7) / 8; |
| 240 if (row_size <= 0) | 240 if (row_size <= 0) |
| 241 return FALSE; | 241 return FALSE; |
| 242 const int row_count = (data_size + row_size - 1) / row_size; | 242 const int row_count = (data_size + row_size - 1) / row_size; |
| 243 const int last_row_size = data_size % row_size; | 243 const int last_row_size = data_size % row_size; |
| 244 FX_LPBYTE dest_buf = FX_Alloc2D(uint8_t, row_size + 1, row_count); | 244 uint8_t* dest_buf = FX_Alloc2D(uint8_t, row_size + 1, row_count); |
| 245 int byte_cnt = 0; | 245 int byte_cnt = 0; |
| 246 FX_LPBYTE pSrcData = data_buf; | 246 uint8_t* pSrcData = data_buf; |
| 247 FX_LPBYTE pDestData = dest_buf; | 247 uint8_t* pDestData = dest_buf; |
| 248 for (int row = 0; row < row_count; row++) { | 248 for (int row = 0; row < row_count; row++) { |
| 249 if (predictor == 10) { | 249 if (predictor == 10) { |
| 250 pDestData[0] = 0; | 250 pDestData[0] = 0; |
| 251 int move_size = row_size; | 251 int move_size = row_size; |
| 252 if (move_size * (row + 1) > (int)data_size) { | 252 if (move_size * (row + 1) > (int)data_size) { |
| 253 move_size = data_size - (move_size * row); | 253 move_size = data_size - (move_size * row); |
| 254 } | 254 } |
| 255 FXSYS_memmove32(pDestData + 1, pSrcData, move_size); | 255 FXSYS_memmove32(pDestData + 1, pSrcData, move_size); |
| 256 pDestData += (move_size + 1); | 256 pDestData += (move_size + 1); |
| 257 pSrcData += move_size; | 257 pSrcData += move_size; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 byte_cnt++; | 316 byte_cnt++; |
| 317 } | 317 } |
| 318 pDestData += (row_size + 1); | 318 pDestData += (row_size + 1); |
| 319 pSrcData += row_size; | 319 pSrcData += row_size; |
| 320 } | 320 } |
| 321 FX_Free(data_buf); | 321 FX_Free(data_buf); |
| 322 data_buf = dest_buf; | 322 data_buf = dest_buf; |
| 323 data_size = (row_size + 1) * row_count - (last_row_size > 0 ? (row_size - la
st_row_size) : 0); | 323 data_size = (row_size + 1) * row_count - (last_row_size > 0 ? (row_size - la
st_row_size) : 0); |
| 324 return TRUE; | 324 return TRUE; |
| 325 } | 325 } |
| 326 static void PNG_PredictLine(FX_LPBYTE pDestData, FX_LPCBYTE pSrcData, FX_LPCBYTE
pLastLine, | 326 static void PNG_PredictLine(uint8_t* pDestData, const uint8_t* pSrcData, const u
int8_t* pLastLine, |
| 327 int bpc, int nColors, int nPixels) | 327 int bpc, int nColors, int nPixels) |
| 328 { | 328 { |
| 329 int row_size = (nPixels * bpc * nColors + 7) / 8; | 329 int row_size = (nPixels * bpc * nColors + 7) / 8; |
| 330 int BytesPerPixel = (bpc * nColors + 7) / 8; | 330 int BytesPerPixel = (bpc * nColors + 7) / 8; |
| 331 uint8_t tag = pSrcData[0]; | 331 uint8_t tag = pSrcData[0]; |
| 332 if (tag == 0) { | 332 if (tag == 0) { |
| 333 FXSYS_memmove32(pDestData, pSrcData + 1, row_size); | 333 FXSYS_memmove32(pDestData, pSrcData + 1, row_size); |
| 334 return; | 334 return; |
| 335 } | 335 } |
| 336 for (int byte = 0; byte < row_size; byte ++) { | 336 for (int byte = 0; byte < row_size; byte ++) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 } | 379 } |
| 380 pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_
left); | 380 pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_
left); |
| 381 break; | 381 break; |
| 382 } | 382 } |
| 383 default: | 383 default: |
| 384 pDestData[byte] = raw_byte; | 384 pDestData[byte] = raw_byte; |
| 385 break; | 385 break; |
| 386 } | 386 } |
| 387 } | 387 } |
| 388 } | 388 } |
| 389 static FX_BOOL PNG_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size, | 389 static FX_BOOL PNG_Predictor(uint8_t*& data_buf, FX_DWORD& data_size, |
| 390 int Colors, int BitsPerComponent, int Columns) | 390 int Colors, int BitsPerComponent, int Columns) |
| 391 { | 391 { |
| 392 const int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8; | 392 const int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8; |
| 393 const int row_size = (Colors * BitsPerComponent * Columns + 7) / 8; | 393 const int row_size = (Colors * BitsPerComponent * Columns + 7) / 8; |
| 394 if (row_size <= 0) | 394 if (row_size <= 0) |
| 395 return FALSE; | 395 return FALSE; |
| 396 const int row_count = (data_size + row_size) / (row_size + 1); | 396 const int row_count = (data_size + row_size) / (row_size + 1); |
| 397 const int last_row_size = data_size % (row_size + 1); | 397 const int last_row_size = data_size % (row_size + 1); |
| 398 FX_LPBYTE dest_buf = FX_Alloc2D(uint8_t, row_size, row_count); | 398 uint8_t* dest_buf = FX_Alloc2D(uint8_t, row_size, row_count); |
| 399 int byte_cnt = 0; | 399 int byte_cnt = 0; |
| 400 FX_LPBYTE pSrcData = data_buf; | 400 uint8_t* pSrcData = data_buf; |
| 401 FX_LPBYTE pDestData = dest_buf; | 401 uint8_t* pDestData = dest_buf; |
| 402 for (int row = 0; row < row_count; row ++) { | 402 for (int row = 0; row < row_count; row ++) { |
| 403 uint8_t tag = pSrcData[0]; | 403 uint8_t tag = pSrcData[0]; |
| 404 byte_cnt++; | 404 byte_cnt++; |
| 405 if (tag == 0) { | 405 if (tag == 0) { |
| 406 int move_size = row_size; | 406 int move_size = row_size; |
| 407 if ((row + 1) * (move_size + 1) > (int)data_size) { | 407 if ((row + 1) * (move_size + 1) > (int)data_size) { |
| 408 move_size = last_row_size - 1; | 408 move_size = last_row_size - 1; |
| 409 } | 409 } |
| 410 FXSYS_memmove32(pDestData, pSrcData + 1, move_size); | 410 FXSYS_memmove32(pDestData, pSrcData + 1, move_size); |
| 411 pSrcData += move_size + 1; | 411 pSrcData += move_size + 1; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 byte_cnt++; | 467 byte_cnt++; |
| 468 } | 468 } |
| 469 pSrcData += row_size + 1; | 469 pSrcData += row_size + 1; |
| 470 pDestData += row_size; | 470 pDestData += row_size; |
| 471 } | 471 } |
| 472 FX_Free(data_buf); | 472 FX_Free(data_buf); |
| 473 data_buf = dest_buf; | 473 data_buf = dest_buf; |
| 474 data_size = row_size * row_count - (last_row_size > 0 ? (row_size + 1 - last
_row_size) : 0); | 474 data_size = row_size * row_count - (last_row_size > 0 ? (row_size + 1 - last
_row_size) : 0); |
| 475 return TRUE; | 475 return TRUE; |
| 476 } | 476 } |
| 477 static void TIFF_PredictorEncodeLine(FX_LPBYTE dest_buf, int row_size, int BitsP
erComponent, int Colors, int Columns) | 477 static void TIFF_PredictorEncodeLine(uint8_t* dest_buf, int row_size, int BitsPe
rComponent, int Colors, int Columns) |
| 478 { | 478 { |
| 479 int BytesPerPixel = BitsPerComponent * Colors / 8; | 479 int BytesPerPixel = BitsPerComponent * Colors / 8; |
| 480 if (BitsPerComponent < 8) { | 480 if (BitsPerComponent < 8) { |
| 481 uint8_t mask = 0x01; | 481 uint8_t mask = 0x01; |
| 482 if (BitsPerComponent == 2) { | 482 if (BitsPerComponent == 2) { |
| 483 mask = 0x03; | 483 mask = 0x03; |
| 484 } else if (BitsPerComponent == 4) { | 484 } else if (BitsPerComponent == 4) { |
| 485 mask = 0x0F; | 485 mask = 0x0F; |
| 486 } | 486 } |
| 487 int row_bits = Colors * BitsPerComponent * Columns; | 487 int row_bits = Colors * BitsPerComponent * Columns; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 504 } | 504 } |
| 505 } else { | 505 } else { |
| 506 for (int i = row_size - BytesPerPixel; i >= BytesPerPixel; i -= BytesPer
Pixel) { | 506 for (int i = row_size - BytesPerPixel; i >= BytesPerPixel; i -= BytesPer
Pixel) { |
| 507 FX_WORD pixel = (dest_buf[i] << 8) | dest_buf[i + 1]; | 507 FX_WORD pixel = (dest_buf[i] << 8) | dest_buf[i + 1]; |
| 508 pixel -= (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerP
ixel + 1]; | 508 pixel -= (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerP
ixel + 1]; |
| 509 dest_buf[i] = pixel >> 8; | 509 dest_buf[i] = pixel >> 8; |
| 510 dest_buf[i + 1] = (uint8_t)pixel; | 510 dest_buf[i + 1] = (uint8_t)pixel; |
| 511 } | 511 } |
| 512 } | 512 } |
| 513 } | 513 } |
| 514 static FX_BOOL TIFF_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size, | 514 static FX_BOOL TIFF_PredictorEncode(uint8_t*& data_buf, FX_DWORD& data_size, |
| 515 int Colors, int BitsPerComponent, int Column
s) | 515 int Colors, int BitsPerComponent, int Column
s) |
| 516 { | 516 { |
| 517 int row_size = (Colors * BitsPerComponent * Columns + 7) / 8; | 517 int row_size = (Colors * BitsPerComponent * Columns + 7) / 8; |
| 518 if (row_size == 0) | 518 if (row_size == 0) |
| 519 return FALSE; | 519 return FALSE; |
| 520 const int row_count = (data_size + row_size - 1) / row_size; | 520 const int row_count = (data_size + row_size - 1) / row_size; |
| 521 const int last_row_size = data_size % row_size; | 521 const int last_row_size = data_size % row_size; |
| 522 for (int row = 0; row < row_count; row++) { | 522 for (int row = 0; row < row_count; row++) { |
| 523 FX_LPBYTE scan_line = data_buf + row * row_size; | 523 uint8_t* scan_line = data_buf + row * row_size; |
| 524 if ((row + 1) * row_size > (int)data_size) { | 524 if ((row + 1) * row_size > (int)data_size) { |
| 525 row_size = last_row_size; | 525 row_size = last_row_size; |
| 526 } | 526 } |
| 527 TIFF_PredictorEncodeLine(scan_line, row_size, BitsPerComponent, Colors,
Columns); | 527 TIFF_PredictorEncodeLine(scan_line, row_size, BitsPerComponent, Colors,
Columns); |
| 528 } | 528 } |
| 529 return TRUE; | 529 return TRUE; |
| 530 } | 530 } |
| 531 static void TIFF_PredictLine(FX_LPBYTE dest_buf, int row_size, int BitsPerCompon
ent, int Colors, int Columns) | 531 static void TIFF_PredictLine(uint8_t* dest_buf, int row_size, int BitsPerCompone
nt, int Colors, int Columns) |
| 532 { | 532 { |
| 533 if (BitsPerComponent == 1) { | 533 if (BitsPerComponent == 1) { |
| 534 int row_bits = FX_MIN(BitsPerComponent * Colors * Columns, row_size * 8)
; | 534 int row_bits = FX_MIN(BitsPerComponent * Colors * Columns, row_size * 8)
; |
| 535 int index_pre = 0; | 535 int index_pre = 0; |
| 536 int col_pre = 0; | 536 int col_pre = 0; |
| 537 for(int i = 1; i < row_bits; i ++) { | 537 for(int i = 1; i < row_bits; i ++) { |
| 538 int col = i % 8; | 538 int col = i % 8; |
| 539 int index = i / 8; | 539 int index = i / 8; |
| 540 if( ((dest_buf[index] >> (7 - col)) & 1) ^ ((dest_buf[index_pre] >>
(7 - col_pre)) & 1) ) { | 540 if( ((dest_buf[index] >> (7 - col)) & 1) ^ ((dest_buf[index_pre] >>
(7 - col_pre)) & 1) ) { |
| 541 dest_buf[index] |= 1 << (7 - col); | 541 dest_buf[index] |= 1 << (7 - col); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 554 pixel += (dest_buf[i] << 8) | dest_buf[i + 1]; | 554 pixel += (dest_buf[i] << 8) | dest_buf[i + 1]; |
| 555 dest_buf[i] = pixel >> 8; | 555 dest_buf[i] = pixel >> 8; |
| 556 dest_buf[i + 1] = (uint8_t)pixel; | 556 dest_buf[i + 1] = (uint8_t)pixel; |
| 557 } | 557 } |
| 558 } else { | 558 } else { |
| 559 for (int i = BytesPerPixel; i < row_size; i ++) { | 559 for (int i = BytesPerPixel; i < row_size; i ++) { |
| 560 dest_buf[i] += dest_buf[i - BytesPerPixel]; | 560 dest_buf[i] += dest_buf[i - BytesPerPixel]; |
| 561 } | 561 } |
| 562 } | 562 } |
| 563 } | 563 } |
| 564 static FX_BOOL TIFF_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size, | 564 static FX_BOOL TIFF_Predictor(uint8_t*& data_buf, FX_DWORD& data_size, |
| 565 int Colors, int BitsPerComponent, int Columns) | 565 int Colors, int BitsPerComponent, int Columns) |
| 566 { | 566 { |
| 567 int row_size = (Colors * BitsPerComponent * Columns + 7) / 8; | 567 int row_size = (Colors * BitsPerComponent * Columns + 7) / 8; |
| 568 if (row_size == 0) | 568 if (row_size == 0) |
| 569 return FALSE; | 569 return FALSE; |
| 570 const int row_count = (data_size + row_size - 1) / row_size; | 570 const int row_count = (data_size + row_size - 1) / row_size; |
| 571 const int last_row_size = data_size % row_size; | 571 const int last_row_size = data_size % row_size; |
| 572 for (int row = 0; row < row_count; row ++) { | 572 for (int row = 0; row < row_count; row ++) { |
| 573 FX_LPBYTE scan_line = data_buf + row * row_size; | 573 uint8_t* scan_line = data_buf + row * row_size; |
| 574 if ((row + 1) * row_size > (int)data_size) { | 574 if ((row + 1) * row_size > (int)data_size) { |
| 575 row_size = last_row_size; | 575 row_size = last_row_size; |
| 576 } | 576 } |
| 577 TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns)
; | 577 TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns)
; |
| 578 } | 578 } |
| 579 return TRUE; | 579 return TRUE; |
| 580 } | 580 } |
| 581 class CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder | 581 class CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder |
| 582 { | 582 { |
| 583 public: | 583 public: |
| 584 CCodec_FlateScanlineDecoder(); | 584 CCodec_FlateScanlineDecoder(); |
| 585 ~CCodec_FlateScanlineDecoder(); | 585 ~CCodec_FlateScanlineDecoder(); |
| 586 void Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, in
t nComps, int bpc, | 586 void Create(const uint8_t* src_buf, FX_DWORD src_size, int width, int height
, int nComps, int bpc, |
| 587 int predictor, int Colors, int BitsPerComponent, int Columns); | 587 int predictor, int Colors, int BitsPerComponent, int Columns); |
| 588 virtual void Destroy() | 588 virtual void Destroy() |
| 589 { | 589 { |
| 590 delete this; | 590 delete this; |
| 591 } | 591 } |
| 592 virtual void v_DownScale(int dest_width, int dest_height) {} | 592 virtual void v_DownScale(int dest_width, int dest_height) {} |
| 593 virtual FX_BOOL v_Rewind(); | 593 virtual FX_BOOL v_Rewind(); |
| 594 virtual FX_LPBYTE» v_GetNextLine(); | 594 virtual uint8_t*» v_GetNextLine(); |
| 595 virtual FX_DWORD GetSrcOffset(); | 595 virtual FX_DWORD GetSrcOffset(); |
| 596 void* m_pFlate; | 596 void* m_pFlate; |
| 597 FX_LPCBYTE» » » m_SrcBuf; | 597 const uint8_t*» » » m_SrcBuf; |
| 598 FX_DWORD m_SrcSize; | 598 FX_DWORD m_SrcSize; |
| 599 FX_LPBYTE» » » m_pScanline; | 599 uint8_t*» » » m_pScanline; |
| 600 FX_LPBYTE» » » m_pLastLine; | 600 uint8_t*» » » m_pLastLine; |
| 601 FX_LPBYTE» » » m_pPredictBuffer; | 601 uint8_t*» » » m_pPredictBuffer; |
| 602 FX_LPBYTE» » » m_pPredictRaw; | 602 uint8_t*» » » m_pPredictRaw; |
| 603 int m_Predictor; | 603 int m_Predictor; |
| 604 int m_Colors, m_BitsPerComponent, m_Columns,
m_PredictPitch, m_LeftOver; | 604 int m_Colors, m_BitsPerComponent, m_Columns,
m_PredictPitch, m_LeftOver; |
| 605 }; | 605 }; |
| 606 CCodec_FlateScanlineDecoder::CCodec_FlateScanlineDecoder() | 606 CCodec_FlateScanlineDecoder::CCodec_FlateScanlineDecoder() |
| 607 { | 607 { |
| 608 m_pFlate = NULL; | 608 m_pFlate = NULL; |
| 609 m_pScanline = NULL; | 609 m_pScanline = NULL; |
| 610 m_pLastLine = NULL; | 610 m_pLastLine = NULL; |
| 611 m_pPredictBuffer = NULL; | 611 m_pPredictBuffer = NULL; |
| 612 m_pPredictRaw = NULL; | 612 m_pPredictRaw = NULL; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 623 if (m_pPredictBuffer) { | 623 if (m_pPredictBuffer) { |
| 624 FX_Free(m_pPredictBuffer); | 624 FX_Free(m_pPredictBuffer); |
| 625 } | 625 } |
| 626 if (m_pPredictRaw) { | 626 if (m_pPredictRaw) { |
| 627 FX_Free(m_pPredictRaw); | 627 FX_Free(m_pPredictRaw); |
| 628 } | 628 } |
| 629 if (m_pFlate) { | 629 if (m_pFlate) { |
| 630 FPDFAPI_FlateEnd(m_pFlate); | 630 FPDFAPI_FlateEnd(m_pFlate); |
| 631 } | 631 } |
| 632 } | 632 } |
| 633 void CCodec_FlateScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size,
int width, int height, | 633 void CCodec_FlateScanlineDecoder::Create(const uint8_t* src_buf, FX_DWORD src_si
ze, int width, int height, |
| 634 int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, in
t Columns) | 634 int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, in
t Columns) |
| 635 { | 635 { |
| 636 m_SrcBuf = src_buf; | 636 m_SrcBuf = src_buf; |
| 637 m_SrcSize = src_size; | 637 m_SrcSize = src_size; |
| 638 m_OutputWidth = m_OrigWidth = width; | 638 m_OutputWidth = m_OrigWidth = width; |
| 639 m_OutputHeight = m_OrigHeight = height; | 639 m_OutputHeight = m_OrigHeight = height; |
| 640 m_nComps = nComps; | 640 m_nComps = nComps; |
| 641 m_bpc = bpc; | 641 m_bpc = bpc; |
| 642 m_bColorTransformed = FALSE; | 642 m_bColorTransformed = FALSE; |
| 643 m_Pitch = (width * nComps * bpc + 7) / 8; | 643 m_Pitch = (width * nComps * bpc + 7) / 8; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 671 FPDFAPI_FlateEnd(m_pFlate); | 671 FPDFAPI_FlateEnd(m_pFlate); |
| 672 } | 672 } |
| 673 m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func); | 673 m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func); |
| 674 if (m_pFlate == NULL) { | 674 if (m_pFlate == NULL) { |
| 675 return FALSE; | 675 return FALSE; |
| 676 } | 676 } |
| 677 FPDFAPI_FlateInput(m_pFlate, m_SrcBuf, m_SrcSize); | 677 FPDFAPI_FlateInput(m_pFlate, m_SrcBuf, m_SrcSize); |
| 678 m_LeftOver = 0; | 678 m_LeftOver = 0; |
| 679 return TRUE; | 679 return TRUE; |
| 680 } | 680 } |
| 681 FX_LPBYTE CCodec_FlateScanlineDecoder::v_GetNextLine() | 681 uint8_t* CCodec_FlateScanlineDecoder::v_GetNextLine() |
| 682 { | 682 { |
| 683 if (m_Predictor) { | 683 if (m_Predictor) { |
| 684 if (m_Pitch == m_PredictPitch) { | 684 if (m_Pitch == m_PredictPitch) { |
| 685 if (m_Predictor == 2) { | 685 if (m_Predictor == 2) { |
| 686 FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1)
; | 686 FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1)
; |
| 687 PNG_PredictLine(m_pScanline, m_pPredictRaw, m_pLastLine, m_BitsP
erComponent, m_Colors, m_Columns); | 687 PNG_PredictLine(m_pScanline, m_pPredictRaw, m_pLastLine, m_BitsP
erComponent, m_Colors, m_Columns); |
| 688 FXSYS_memcpy32(m_pLastLine, m_pScanline, m_PredictPitch); | 688 FXSYS_memcpy32(m_pLastLine, m_pScanline, m_PredictPitch); |
| 689 } else { | 689 } else { |
| 690 FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch); | 690 FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch); |
| 691 TIFF_PredictLine(m_pScanline, m_PredictPitch, m_bpc, m_nComps, m
_OutputWidth); | 691 TIFF_PredictLine(m_pScanline, m_PredictPitch, m_bpc, m_nComps, m
_OutputWidth); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 715 } | 715 } |
| 716 } else { | 716 } else { |
| 717 FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch); | 717 FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch); |
| 718 } | 718 } |
| 719 return m_pScanline; | 719 return m_pScanline; |
| 720 } | 720 } |
| 721 FX_DWORD CCodec_FlateScanlineDecoder::GetSrcOffset() | 721 FX_DWORD CCodec_FlateScanlineDecoder::GetSrcOffset() |
| 722 { | 722 { |
| 723 return FPDFAPI_FlateGetTotalIn(m_pFlate); | 723 return FPDFAPI_FlateGetTotalIn(m_pFlate); |
| 724 } | 724 } |
| 725 static void FlateUncompress(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_DWORD orig
_size, | 725 static void FlateUncompress(const uint8_t* src_buf, FX_DWORD src_size, FX_DWORD
orig_size, |
| 726 FX_LPBYTE& dest_buf, FX_DWORD& dest_size, FX_DWORD&
offset) | 726 uint8_t*& dest_buf, FX_DWORD& dest_size, FX_DWORD& o
ffset) |
| 727 { | 727 { |
| 728 const FX_BOOL useOldImpl = src_size < 10240; | 728 const FX_BOOL useOldImpl = src_size < 10240; |
| 729 FX_DWORD guess_size = orig_size ? orig_size : src_size * 2; | 729 FX_DWORD guess_size = orig_size ? orig_size : src_size * 2; |
| 730 FX_DWORD alloc_step = orig_size ? 10240 : (src_size < 10240 ? 10240 : src_si
ze); | 730 FX_DWORD alloc_step = orig_size ? 10240 : (src_size < 10240 ? 10240 : src_si
ze); |
| 731 static const FX_DWORD kMaxInitialAllocSize = 10000000; | 731 static const FX_DWORD kMaxInitialAllocSize = 10000000; |
| 732 if (guess_size > kMaxInitialAllocSize) { | 732 if (guess_size > kMaxInitialAllocSize) { |
| 733 guess_size = kMaxInitialAllocSize; | 733 guess_size = kMaxInitialAllocSize; |
| 734 alloc_step = kMaxInitialAllocSize; | 734 alloc_step = kMaxInitialAllocSize; |
| 735 } | 735 } |
| 736 FX_DWORD buf_size = guess_size; | 736 FX_DWORD buf_size = guess_size; |
| 737 FX_DWORD last_buf_size = buf_size; | 737 FX_DWORD last_buf_size = buf_size; |
| 738 void* context = nullptr; | 738 void* context = nullptr; |
| 739 | 739 |
| 740 FX_LPBYTE guess_buf = FX_Alloc(uint8_t, guess_size + 1); | 740 uint8_t* guess_buf = FX_Alloc(uint8_t, guess_size + 1); |
| 741 FX_LPBYTE cur_buf = guess_buf; | 741 uint8_t* cur_buf = guess_buf; |
| 742 guess_buf[guess_size] = '\0'; | 742 guess_buf[guess_size] = '\0'; |
| 743 context = FPDFAPI_FlateInit(my_alloc_func, my_free_func); | 743 context = FPDFAPI_FlateInit(my_alloc_func, my_free_func); |
| 744 if (!context) | 744 if (!context) |
| 745 goto fail; | 745 goto fail; |
| 746 FPDFAPI_FlateInput(context, src_buf, src_size); | 746 FPDFAPI_FlateInput(context, src_buf, src_size); |
| 747 if (useOldImpl) { | 747 if (useOldImpl) { |
| 748 while (1) { | 748 while (1) { |
| 749 int32_t ret = FPDFAPI_FlateOutput(context, cur_buf, buf_size); | 749 int32_t ret = FPDFAPI_FlateOutput(context, cur_buf, buf_size); |
| 750 if (ret != Z_OK) | 750 if (ret != Z_OK) |
| 751 break; | 751 break; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 769 offset = FPDFAPI_FlateGetTotalIn(context); | 769 offset = FPDFAPI_FlateGetTotalIn(context); |
| 770 if (guess_size / 2 > dest_size) { | 770 if (guess_size / 2 > dest_size) { |
| 771 guess_buf = FX_Realloc(uint8_t, guess_buf, dest_size + 1); | 771 guess_buf = FX_Realloc(uint8_t, guess_buf, dest_size + 1); |
| 772 if (!guess_buf) | 772 if (!guess_buf) |
| 773 goto fail; | 773 goto fail; |
| 774 guess_size = dest_size; | 774 guess_size = dest_size; |
| 775 guess_buf[guess_size] = '\0'; | 775 guess_buf[guess_size] = '\0'; |
| 776 } | 776 } |
| 777 dest_buf = guess_buf; | 777 dest_buf = guess_buf; |
| 778 } else { | 778 } else { |
| 779 CFX_ArrayTemplate<FX_LPBYTE> result_tmp_bufs; | 779 CFX_ArrayTemplate<uint8_t*> result_tmp_bufs; |
| 780 while (1) { | 780 while (1) { |
| 781 int32_t ret = FPDFAPI_FlateOutput(context, cur_buf, buf_size); | 781 int32_t ret = FPDFAPI_FlateOutput(context, cur_buf, buf_size); |
| 782 int32_t avail_buf_size = FPDFAPI_FlateGetAvailOut(context); | 782 int32_t avail_buf_size = FPDFAPI_FlateGetAvailOut(context); |
| 783 if (ret != Z_OK) { | 783 if (ret != Z_OK) { |
| 784 last_buf_size = buf_size - avail_buf_size; | 784 last_buf_size = buf_size - avail_buf_size; |
| 785 result_tmp_bufs.Add(cur_buf); | 785 result_tmp_bufs.Add(cur_buf); |
| 786 break; | 786 break; |
| 787 } | 787 } |
| 788 if (avail_buf_size != 0) { | 788 if (avail_buf_size != 0) { |
| 789 last_buf_size = buf_size - avail_buf_size; | 789 last_buf_size = buf_size - avail_buf_size; |
| 790 result_tmp_bufs.Add(cur_buf); | 790 result_tmp_bufs.Add(cur_buf); |
| 791 break; | 791 break; |
| 792 } | 792 } |
| 793 | 793 |
| 794 // |avail_buf_size| == 0 case. | 794 // |avail_buf_size| == 0 case. |
| 795 result_tmp_bufs.Add(cur_buf); | 795 result_tmp_bufs.Add(cur_buf); |
| 796 cur_buf = FX_Alloc(uint8_t, buf_size + 1); | 796 cur_buf = FX_Alloc(uint8_t, buf_size + 1); |
| 797 cur_buf[buf_size] = '\0'; | 797 cur_buf[buf_size] = '\0'; |
| 798 } | 798 } |
| 799 dest_size = FPDFAPI_FlateGetTotalOut(context); | 799 dest_size = FPDFAPI_FlateGetTotalOut(context); |
| 800 offset = FPDFAPI_FlateGetTotalIn(context); | 800 offset = FPDFAPI_FlateGetTotalIn(context); |
| 801 if (result_tmp_bufs.GetSize() == 1) { | 801 if (result_tmp_bufs.GetSize() == 1) { |
| 802 dest_buf = result_tmp_bufs[0]; | 802 dest_buf = result_tmp_bufs[0]; |
| 803 } else { | 803 } else { |
| 804 FX_LPBYTE result_buf = FX_Alloc(uint8_t, dest_size); | 804 uint8_t* result_buf = FX_Alloc(uint8_t, dest_size); |
| 805 FX_DWORD result_pos = 0; | 805 FX_DWORD result_pos = 0; |
| 806 for (int32_t i = 0; i < result_tmp_bufs.GetSize(); i++) { | 806 for (int32_t i = 0; i < result_tmp_bufs.GetSize(); i++) { |
| 807 FX_LPBYTE tmp_buf = result_tmp_bufs[i]; | 807 uint8_t* tmp_buf = result_tmp_bufs[i]; |
| 808 FX_DWORD tmp_buf_size = buf_size; | 808 FX_DWORD tmp_buf_size = buf_size; |
| 809 if (i == result_tmp_bufs.GetSize() - 1) { | 809 if (i == result_tmp_bufs.GetSize() - 1) { |
| 810 tmp_buf_size = last_buf_size; | 810 tmp_buf_size = last_buf_size; |
| 811 } | 811 } |
| 812 FXSYS_memcpy32(result_buf + result_pos, tmp_buf, tmp_buf_size); | 812 FXSYS_memcpy32(result_buf + result_pos, tmp_buf, tmp_buf_size); |
| 813 result_pos += tmp_buf_size; | 813 result_pos += tmp_buf_size; |
| 814 FX_Free(result_tmp_bufs[i]); | 814 FX_Free(result_tmp_bufs[i]); |
| 815 } | 815 } |
| 816 dest_buf = result_buf; | 816 dest_buf = result_buf; |
| 817 } | 817 } |
| 818 } | 818 } |
| 819 FPDFAPI_FlateEnd(context); | 819 FPDFAPI_FlateEnd(context); |
| 820 return; | 820 return; |
| 821 | 821 |
| 822 fail: | 822 fail: |
| 823 FX_Free(guess_buf); | 823 FX_Free(guess_buf); |
| 824 dest_buf = nullptr; | 824 dest_buf = nullptr; |
| 825 dest_size = 0; | 825 dest_size = 0; |
| 826 return; | 826 return; |
| 827 } | 827 } |
| 828 ICodec_ScanlineDecoder*»CCodec_FlateModule::CreateDecoder(FX_LPCBYTE src_buf, FX
_DWORD src_size, int width, int height, | 828 ICodec_ScanlineDecoder*»CCodec_FlateModule::CreateDecoder(const uint8_t* src_buf
, FX_DWORD src_size, int width, int height, |
| 829 int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, in
t Columns) | 829 int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, in
t Columns) |
| 830 { | 830 { |
| 831 CCodec_FlateScanlineDecoder* pDecoder = new CCodec_FlateScanlineDecoder; | 831 CCodec_FlateScanlineDecoder* pDecoder = new CCodec_FlateScanlineDecoder; |
| 832 pDecoder->Create(src_buf, src_size, width, height, nComps, bpc, predictor, C
olors, BitsPerComponent, Columns); | 832 pDecoder->Create(src_buf, src_size, width, height, nComps, bpc, predictor, C
olors, BitsPerComponent, Columns); |
| 833 return pDecoder; | 833 return pDecoder; |
| 834 } | 834 } |
| 835 FX_DWORD CCodec_FlateModule::FlateOrLZWDecode(FX_BOOL bLZW, const uint8_t* src_b
uf, FX_DWORD src_size, FX_BOOL bEarlyChange, | 835 FX_DWORD CCodec_FlateModule::FlateOrLZWDecode(FX_BOOL bLZW, const uint8_t* src_b
uf, FX_DWORD src_size, FX_BOOL bEarlyChange, |
| 836 int predictor, int Colors, int BitsPerComponent, int Columns, | 836 int predictor, int Colors, int BitsPerComponent, int Columns, |
| 837 FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) | 837 FX_DWORD estimated_size, uint8_t*& dest_buf, FX_DWORD& dest_size) |
| 838 { | 838 { |
| 839 dest_buf = NULL; | 839 dest_buf = NULL; |
| 840 FX_DWORD offset = 0; | 840 FX_DWORD offset = 0; |
| 841 int predictor_type = 0; | 841 int predictor_type = 0; |
| 842 if (predictor) { | 842 if (predictor) { |
| 843 if (predictor >= 10) { | 843 if (predictor >= 10) { |
| 844 predictor_type = 2; | 844 predictor_type = 2; |
| 845 } else if (predictor == 2) { | 845 } else if (predictor == 2) { |
| 846 predictor_type = 1; | 846 predictor_type = 1; |
| 847 } | 847 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 874 ret = PNG_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, | 874 ret = PNG_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, |
| 875 Columns); | 875 Columns); |
| 876 } else if (predictor_type == 1) { | 876 } else if (predictor_type == 1) { |
| 877 ret = TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, | 877 ret = TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, |
| 878 Columns); | 878 Columns); |
| 879 } | 879 } |
| 880 return ret ? offset : -1; | 880 return ret ? offset : -1; |
| 881 } | 881 } |
| 882 FX_BOOL CCodec_FlateModule::Encode(const uint8_t* src_buf, FX_DWORD src_size, | 882 FX_BOOL CCodec_FlateModule::Encode(const uint8_t* src_buf, FX_DWORD src_size, |
| 883 int predictor, int Colors, int BitsPerCompone
nt, int Columns, | 883 int predictor, int Colors, int BitsPerCompone
nt, int Columns, |
| 884 FX_LPBYTE& dest_buf, FX_DWORD& dest_size) | 884 uint8_t*& dest_buf, FX_DWORD& dest_size) |
| 885 { | 885 { |
| 886 if (predictor != 2 && predictor < 10) { | 886 if (predictor != 2 && predictor < 10) { |
| 887 return Encode(src_buf, src_size, dest_buf, dest_size); | 887 return Encode(src_buf, src_size, dest_buf, dest_size); |
| 888 } | 888 } |
| 889 FX_LPBYTE pSrcBuf = NULL; | 889 uint8_t* pSrcBuf = NULL; |
| 890 pSrcBuf = FX_Alloc(uint8_t, src_size); | 890 pSrcBuf = FX_Alloc(uint8_t, src_size); |
| 891 FXSYS_memcpy32(pSrcBuf, src_buf, src_size); | 891 FXSYS_memcpy32(pSrcBuf, src_buf, src_size); |
| 892 FX_BOOL ret = TRUE; | 892 FX_BOOL ret = TRUE; |
| 893 if (predictor == 2) { | 893 if (predictor == 2) { |
| 894 ret = TIFF_PredictorEncode(pSrcBuf, src_size, Colors, BitsPerComponent, | 894 ret = TIFF_PredictorEncode(pSrcBuf, src_size, Colors, BitsPerComponent, |
| 895 Columns); | 895 Columns); |
| 896 } else if (predictor >= 10) { | 896 } else if (predictor >= 10) { |
| 897 ret = PNG_PredictorEncode(pSrcBuf, src_size, predictor, Colors, | 897 ret = PNG_PredictorEncode(pSrcBuf, src_size, predictor, Colors, |
| 898 BitsPerComponent, Columns); | 898 BitsPerComponent, Columns); |
| 899 } | 899 } |
| 900 if (ret) | 900 if (ret) |
| 901 ret = Encode(pSrcBuf, src_size, dest_buf, dest_size); | 901 ret = Encode(pSrcBuf, src_size, dest_buf, dest_size); |
| 902 FX_Free(pSrcBuf); | 902 FX_Free(pSrcBuf); |
| 903 return ret; | 903 return ret; |
| 904 } | 904 } |
| 905 FX_BOOL CCodec_FlateModule::Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPB
YTE& dest_buf, FX_DWORD& dest_size) | 905 FX_BOOL CCodec_FlateModule::Encode(const uint8_t* src_buf, FX_DWORD src_size, ui
nt8_t*& dest_buf, FX_DWORD& dest_size) |
| 906 { | 906 { |
| 907 dest_size = src_size + src_size / 1000 + 12; | 907 dest_size = src_size + src_size / 1000 + 12; |
| 908 dest_buf = FX_Alloc( uint8_t, dest_size); | 908 dest_buf = FX_Alloc( uint8_t, dest_size); |
| 909 unsigned long temp_size = dest_size; | 909 unsigned long temp_size = dest_size; |
| 910 FPDFAPI_FlateCompress(dest_buf, &temp_size, src_buf, src_size); | 910 FPDFAPI_FlateCompress(dest_buf, &temp_size, src_buf, src_size); |
| 911 dest_size = (FX_DWORD)temp_size; | 911 dest_size = (FX_DWORD)temp_size; |
| 912 return TRUE; | 912 return TRUE; |
| 913 } | 913 } |
| OLD | NEW |