| 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 "../../../include/fxcodec/fx_codec.h" | 7 #include "../../../include/fxcodec/fx_codec.h" |
| 8 #include "codec_int.h" | 8 #include "codec_int.h" |
| 9 CCodec_ModuleMgr::CCodec_ModuleMgr() | 9 CCodec_ModuleMgr::CCodec_ModuleMgr() |
| 10 { | 10 { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 m_NextLine = -1; | 40 m_NextLine = -1; |
| 41 m_pDataCache = NULL; | 41 m_pDataCache = NULL; |
| 42 m_pLastScanline = NULL; | 42 m_pLastScanline = NULL; |
| 43 } | 43 } |
| 44 CCodec_ScanlineDecoder::~CCodec_ScanlineDecoder() | 44 CCodec_ScanlineDecoder::~CCodec_ScanlineDecoder() |
| 45 { | 45 { |
| 46 if (m_pDataCache) { | 46 if (m_pDataCache) { |
| 47 FX_Free(m_pDataCache); | 47 FX_Free(m_pDataCache); |
| 48 } | 48 } |
| 49 } | 49 } |
| 50 FX_LPBYTE CCodec_ScanlineDecoder::GetScanline(int line) | 50 uint8_t* CCodec_ScanlineDecoder::GetScanline(int line) |
| 51 { | 51 { |
| 52 if (m_pDataCache && line < m_pDataCache->m_nCachedLines) { | 52 if (m_pDataCache && line < m_pDataCache->m_nCachedLines) { |
| 53 return &m_pDataCache->m_Data + line * m_Pitch; | 53 return &m_pDataCache->m_Data + line * m_Pitch; |
| 54 } | 54 } |
| 55 if (m_NextLine == line + 1) { | 55 if (m_NextLine == line + 1) { |
| 56 return m_pLastScanline; | 56 return m_pLastScanline; |
| 57 } | 57 } |
| 58 if (m_NextLine < 0 || m_NextLine > line) { | 58 if (m_NextLine < 0 || m_NextLine > line) { |
| 59 if (!v_Rewind()) { | 59 if (!v_Rewind()) { |
| 60 return NULL; | 60 return NULL; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 84 m_pLastScanline = NULL; | 84 m_pLastScanline = NULL; |
| 85 while (m_NextLine < line) { | 85 while (m_NextLine < line) { |
| 86 m_pLastScanline = ReadNextLine(); | 86 m_pLastScanline = ReadNextLine(); |
| 87 m_NextLine ++; | 87 m_NextLine ++; |
| 88 if (pPause && pPause->NeedToPauseNow()) { | 88 if (pPause && pPause->NeedToPauseNow()) { |
| 89 return TRUE; | 89 return TRUE; |
| 90 } | 90 } |
| 91 } | 91 } |
| 92 return FALSE; | 92 return FALSE; |
| 93 } | 93 } |
| 94 FX_LPBYTE CCodec_ScanlineDecoder::ReadNextLine() | 94 uint8_t* CCodec_ScanlineDecoder::ReadNextLine() |
| 95 { | 95 { |
| 96 FX_LPBYTE pLine = v_GetNextLine(); | 96 uint8_t* pLine = v_GetNextLine(); |
| 97 if (pLine == NULL) { | 97 if (pLine == NULL) { |
| 98 return NULL; | 98 return NULL; |
| 99 } | 99 } |
| 100 if (m_pDataCache && m_NextLine == m_pDataCache->m_nCachedLines) { | 100 if (m_pDataCache && m_NextLine == m_pDataCache->m_nCachedLines) { |
| 101 FXSYS_memcpy32(&m_pDataCache->m_Data + m_NextLine * m_Pitch, pLine, m_Pi
tch); | 101 FXSYS_memcpy32(&m_pDataCache->m_Data + m_NextLine * m_Pitch, pLine, m_Pi
tch); |
| 102 m_pDataCache->m_nCachedLines ++; | 102 m_pDataCache->m_nCachedLines ++; |
| 103 } | 103 } |
| 104 return pLine; | 104 return pLine; |
| 105 } | 105 } |
| 106 void CCodec_ScanlineDecoder::DownScale(int dest_width, int dest_height) | 106 void CCodec_ScanlineDecoder::DownScale(int dest_width, int dest_height) |
| (...skipping 13 matching lines...) Expand all Loading... |
| 120 m_pDataCache = NULL; | 120 m_pDataCache = NULL; |
| 121 } | 121 } |
| 122 m_pDataCache = (CCodec_ImageDataCache*)FX_TryAlloc(uint8_t, sizeof(CCodec_Im
ageDataCache) + m_Pitch * m_OutputHeight); | 122 m_pDataCache = (CCodec_ImageDataCache*)FX_TryAlloc(uint8_t, sizeof(CCodec_Im
ageDataCache) + m_Pitch * m_OutputHeight); |
| 123 if (m_pDataCache == NULL) { | 123 if (m_pDataCache == NULL) { |
| 124 return; | 124 return; |
| 125 } | 125 } |
| 126 m_pDataCache->m_Height = m_OutputHeight; | 126 m_pDataCache->m_Height = m_OutputHeight; |
| 127 m_pDataCache->m_Width = m_OutputWidth; | 127 m_pDataCache->m_Width = m_OutputWidth; |
| 128 m_pDataCache->m_nCachedLines = 0; | 128 m_pDataCache->m_nCachedLines = 0; |
| 129 } | 129 } |
| 130 FX_BOOL CCodec_BasicModule::RunLengthEncode(const uint8_t* src_buf, FX_DWORD src
_size, FX_LPBYTE& dest_buf, | 130 FX_BOOL CCodec_BasicModule::RunLengthEncode(const uint8_t* src_buf, FX_DWORD src
_size, uint8_t*& dest_buf, |
| 131 FX_DWORD& dest_size) | 131 FX_DWORD& dest_size) |
| 132 { | 132 { |
| 133 return FALSE; | 133 return FALSE; |
| 134 } | 134 } |
| 135 extern "C" double FXstrtod(const char* nptr, char** endptr) | 135 extern "C" double FXstrtod(const char* nptr, char** endptr) |
| 136 { | 136 { |
| 137 double ret = 0.0; | 137 double ret = 0.0; |
| 138 const char* ptr = nptr; | 138 const char* ptr = nptr; |
| 139 const char* exp_ptr = NULL; | 139 const char* exp_ptr = NULL; |
| 140 int e_number = 0, | 140 int e_number = 0, |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 while(exp_ret--) { | 229 while(exp_ret--) { |
| 230 ret *= 10.0; | 230 ret *= 10.0; |
| 231 } | 231 } |
| 232 } else { | 232 } else { |
| 233 while(exp_ret--) { | 233 while(exp_ret--) { |
| 234 ret /= 10.0; | 234 ret /= 10.0; |
| 235 } | 235 } |
| 236 } | 236 } |
| 237 return is_negative ? -ret : ret; | 237 return is_negative ? -ret : ret; |
| 238 } | 238 } |
| 239 FX_BOOL CCodec_BasicModule::A85Encode(const uint8_t* src_buf, FX_DWORD src_size,
FX_LPBYTE& dest_buf, | 239 FX_BOOL CCodec_BasicModule::A85Encode(const uint8_t* src_buf, FX_DWORD src_size,
uint8_t*& dest_buf, |
| 240 FX_DWORD& dest_size) | 240 FX_DWORD& dest_size) |
| 241 { | 241 { |
| 242 return FALSE; | 242 return FALSE; |
| 243 } | 243 } |
| 244 CCodec_ModuleMgr* CCodec_ModuleMgr::Create() | 244 CCodec_ModuleMgr* CCodec_ModuleMgr::Create() |
| 245 { | 245 { |
| 246 return new CCodec_ModuleMgr; | 246 return new CCodec_ModuleMgr; |
| 247 } | 247 } |
| 248 void CCodec_ModuleMgr::Destroy() | 248 void CCodec_ModuleMgr::Destroy() |
| 249 { | 249 { |
| 250 delete this; | 250 delete this; |
| 251 } | 251 } |
| 252 class CCodec_RLScanlineDecoder : public CCodec_ScanlineDecoder | 252 class CCodec_RLScanlineDecoder : public CCodec_ScanlineDecoder |
| 253 { | 253 { |
| 254 public: | 254 public: |
| 255 CCodec_RLScanlineDecoder(); | 255 CCodec_RLScanlineDecoder(); |
| 256 virtual ~CCodec_RLScanlineDecoder(); | 256 virtual ~CCodec_RLScanlineDecoder(); |
| 257 FX_BOOL» » » » Create(FX_LPCBYTE src_buf, FX_DWORD src_
size, int width, int height, int nComps, int bpc); | 257 FX_BOOL» » » » Create(const uint8_t* src_buf, FX_DWORD
src_size, int width, int height, int nComps, int bpc); |
| 258 virtual void v_DownScale(int dest_width, int dest_height) {} | 258 virtual void v_DownScale(int dest_width, int dest_height) {} |
| 259 virtual FX_BOOL v_Rewind(); | 259 virtual FX_BOOL v_Rewind(); |
| 260 virtual FX_LPBYTE» v_GetNextLine(); | 260 virtual uint8_t*» v_GetNextLine(); |
| 261 virtual FX_DWORD GetSrcOffset() | 261 virtual FX_DWORD GetSrcOffset() |
| 262 { | 262 { |
| 263 return m_SrcOffset; | 263 return m_SrcOffset; |
| 264 } | 264 } |
| 265 protected: | 265 protected: |
| 266 FX_BOOL CheckDestSize(); | 266 FX_BOOL CheckDestSize(); |
| 267 void GetNextOperator(); | 267 void GetNextOperator(); |
| 268 void UpdateOperator(uint8_t used_bytes); | 268 void UpdateOperator(uint8_t used_bytes); |
| 269 | 269 |
| 270 FX_LPBYTE» » » m_pScanline; | 270 uint8_t*» » » m_pScanline; |
| 271 FX_LPCBYTE» » » m_pSrcBuf; | 271 const uint8_t*» » » m_pSrcBuf; |
| 272 FX_DWORD m_SrcSize; | 272 FX_DWORD m_SrcSize; |
| 273 FX_DWORD m_dwLineBytes; | 273 FX_DWORD m_dwLineBytes; |
| 274 FX_DWORD m_SrcOffset; | 274 FX_DWORD m_SrcOffset; |
| 275 FX_BOOL m_bEOD; | 275 FX_BOOL m_bEOD; |
| 276 uint8_t m_Operator; | 276 uint8_t m_Operator; |
| 277 }; | 277 }; |
| 278 CCodec_RLScanlineDecoder::CCodec_RLScanlineDecoder() | 278 CCodec_RLScanlineDecoder::CCodec_RLScanlineDecoder() |
| 279 : m_pScanline(NULL) | 279 : m_pScanline(NULL) |
| 280 , m_pSrcBuf(NULL) | 280 , m_pSrcBuf(NULL) |
| 281 , m_SrcSize(0) | 281 , m_SrcSize(0) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 i += 2; | 313 i += 2; |
| 314 } else { | 314 } else { |
| 315 break; | 315 break; |
| 316 } | 316 } |
| 317 } | 317 } |
| 318 if (((FX_DWORD)m_OrigWidth * m_nComps * m_bpc * m_OrigHeight + 7) / 8 > dest
_size) { | 318 if (((FX_DWORD)m_OrigWidth * m_nComps * m_bpc * m_OrigHeight + 7) / 8 > dest
_size) { |
| 319 return FALSE; | 319 return FALSE; |
| 320 } | 320 } |
| 321 return TRUE; | 321 return TRUE; |
| 322 } | 322 } |
| 323 FX_BOOL CCodec_RLScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size,
int width, int height, int nComps, int bpc) | 323 FX_BOOL CCodec_RLScanlineDecoder::Create(const uint8_t* src_buf, FX_DWORD src_si
ze, int width, int height, int nComps, int bpc) |
| 324 { | 324 { |
| 325 m_pSrcBuf = src_buf; | 325 m_pSrcBuf = src_buf; |
| 326 m_SrcSize = src_size; | 326 m_SrcSize = src_size; |
| 327 m_OutputWidth = m_OrigWidth = width; | 327 m_OutputWidth = m_OrigWidth = width; |
| 328 m_OutputHeight = m_OrigHeight = height; | 328 m_OutputHeight = m_OrigHeight = height; |
| 329 m_nComps = nComps; | 329 m_nComps = nComps; |
| 330 m_bpc = bpc; | 330 m_bpc = bpc; |
| 331 m_bColorTransformed = FALSE; | 331 m_bColorTransformed = FALSE; |
| 332 m_DownScale = 1; | 332 m_DownScale = 1; |
| 333 m_Pitch = (width * nComps * bpc + 31) / 32 * 4; | 333 m_Pitch = (width * nComps * bpc + 31) / 32 * 4; |
| 334 m_dwLineBytes = (width * nComps * bpc + 7) / 8; | 334 m_dwLineBytes = (width * nComps * bpc + 7) / 8; |
| 335 m_pScanline = FX_Alloc(uint8_t, m_Pitch); | 335 m_pScanline = FX_Alloc(uint8_t, m_Pitch); |
| 336 return CheckDestSize(); | 336 return CheckDestSize(); |
| 337 } | 337 } |
| 338 FX_BOOL CCodec_RLScanlineDecoder::v_Rewind() | 338 FX_BOOL CCodec_RLScanlineDecoder::v_Rewind() |
| 339 { | 339 { |
| 340 FXSYS_memset32(m_pScanline, 0, m_Pitch); | 340 FXSYS_memset32(m_pScanline, 0, m_Pitch); |
| 341 m_SrcOffset = 0; | 341 m_SrcOffset = 0; |
| 342 m_bEOD = FALSE; | 342 m_bEOD = FALSE; |
| 343 m_Operator = 0; | 343 m_Operator = 0; |
| 344 return TRUE; | 344 return TRUE; |
| 345 } | 345 } |
| 346 FX_LPBYTE CCodec_RLScanlineDecoder::v_GetNextLine() | 346 uint8_t* CCodec_RLScanlineDecoder::v_GetNextLine() |
| 347 { | 347 { |
| 348 if (m_SrcOffset == 0) { | 348 if (m_SrcOffset == 0) { |
| 349 GetNextOperator(); | 349 GetNextOperator(); |
| 350 } else { | 350 } else { |
| 351 if (m_bEOD) { | 351 if (m_bEOD) { |
| 352 return NULL; | 352 return NULL; |
| 353 } | 353 } |
| 354 } | 354 } |
| 355 FXSYS_memset32(m_pScanline, 0, m_Pitch); | 355 FXSYS_memset32(m_pScanline, 0, m_Pitch); |
| 356 FX_DWORD col_pos = 0; | 356 FX_DWORD col_pos = 0; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 uint8_t count = 257 - m_Operator; | 420 uint8_t count = 257 - m_Operator; |
| 421 FXSYS_assert((FX_DWORD)count >= used_bytes); | 421 FXSYS_assert((FX_DWORD)count >= used_bytes); |
| 422 if (used_bytes == count) { | 422 if (used_bytes == count) { |
| 423 m_SrcOffset ++; | 423 m_SrcOffset ++; |
| 424 GetNextOperator(); | 424 GetNextOperator(); |
| 425 return; | 425 return; |
| 426 } | 426 } |
| 427 count -= used_bytes; | 427 count -= used_bytes; |
| 428 m_Operator = 257 - count; | 428 m_Operator = 257 - count; |
| 429 } | 429 } |
| 430 ICodec_ScanlineDecoder* CCodec_BasicModule::CreateRunLengthDecoder(FX_LPCBYTE sr
c_buf, FX_DWORD src_size, int width, int height, | 430 ICodec_ScanlineDecoder* CCodec_BasicModule::CreateRunLengthDecoder(const uint8_t
* src_buf, FX_DWORD src_size, int width, int height, |
| 431 int nComps, int bpc) | 431 int nComps, int bpc) |
| 432 { | 432 { |
| 433 CCodec_RLScanlineDecoder* pRLScanlineDecoder = new CCodec_RLScanlineDecoder; | 433 CCodec_RLScanlineDecoder* pRLScanlineDecoder = new CCodec_RLScanlineDecoder; |
| 434 if (!pRLScanlineDecoder->Create(src_buf, src_size, width, height, nComps, bp
c)) { | 434 if (!pRLScanlineDecoder->Create(src_buf, src_size, width, height, nComps, bp
c)) { |
| 435 delete pRLScanlineDecoder; | 435 delete pRLScanlineDecoder; |
| 436 return NULL; | 436 return NULL; |
| 437 } | 437 } |
| 438 return pRLScanlineDecoder; | 438 return pRLScanlineDecoder; |
| 439 } | 439 } |
| OLD | NEW |