| 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 "../../../include/fxge/fx_dib.h" | 8 #include "../../../include/fxge/fx_dib.h" |
| 9 #include "codec_int.h" | 9 #include "codec_int.h" |
| 10 extern "C" { | 10 extern "C" { |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 TIFFGetField(tif_ctx, tag, &size, &buf); \ | 249 TIFFGetField(tif_ctx, tag, &size, &buf); \ |
| 250 if (size && buf) { \ | 250 if (size && buf) { \ |
| 251 (key) = FX_Alloc(uint8_t, size); \ | 251 (key) = FX_Alloc(uint8_t, size); \ |
| 252 if ((key)) { \ | 252 if ((key)) { \ |
| 253 FXSYS_memcpy((key), buf, size); \ | 253 FXSYS_memcpy((key), buf, size); \ |
| 254 pExif->m_TagVal.SetAt(tag, (key)); \ | 254 pExif->m_TagVal.SetAt(tag, (key)); \ |
| 255 } \ | 255 } \ |
| 256 } \ | 256 } \ |
| 257 } \ | 257 } \ |
| 258 (key) = NULL; | 258 (key) = NULL; |
| 259 |
| 260 namespace { |
| 261 |
| 259 template <class T> | 262 template <class T> |
| 260 static FX_BOOL Tiff_Exif_GetInfo(TIFF* tif_ctx, | 263 FX_BOOL Tiff_Exif_GetInfo(TIFF* tif_ctx, ttag_t tag, CFX_DIBAttribute* pAttr) { |
| 261 ttag_t tag, | 264 T val = 0; |
| 262 CFX_DIBAttributeExif* pExif) { | |
| 263 uint8_t* key = NULL; | |
| 264 T val = (T)0; | |
| 265 TIFFGetField(tif_ctx, tag, &val); | 265 TIFFGetField(tif_ctx, tag, &val); |
| 266 if (val) { | 266 if (!val) |
| 267 (key) = FX_Alloc(uint8_t, sizeof(T)); | 267 return FALSE; |
| 268 if ((key) == NULL) { | 268 T* ptr = FX_Alloc(T, 1); |
| 269 return FALSE; | 269 *ptr = val; |
| 270 } | 270 pAttr->m_Exif[tag] = (void*)ptr; |
| 271 T* ptr = (T*)(key); | 271 return TRUE; |
| 272 *ptr = val; | |
| 273 pExif->m_TagVal.SetAt(tag, (key)); | |
| 274 return TRUE; | |
| 275 } | |
| 276 return FALSE; | |
| 277 } | 272 } |
| 278 static void Tiff_Exif_GetStringInfo(TIFF* tif_ctx, | 273 void Tiff_Exif_GetStringInfo(TIFF* tif_ctx, |
| 279 ttag_t tag, | 274 ttag_t tag, |
| 280 CFX_DIBAttributeExif* pExif) { | 275 CFX_DIBAttribute* pAttr) { |
| 281 FX_CHAR* buf = NULL; | 276 FX_CHAR* buf = nullptr; |
| 282 uint8_t* key = NULL; | |
| 283 TIFFGetField(tif_ctx, tag, &buf); | 277 TIFFGetField(tif_ctx, tag, &buf); |
| 284 if (buf) { | 278 if (!buf) |
| 285 int32_t size = (int32_t)FXSYS_strlen(buf); | 279 return; |
| 286 (key) = FX_Alloc(uint8_t, size + 1); | 280 FX_STRSIZE size = FXSYS_strlen(buf); |
| 287 if ((key) == NULL) { | 281 uint8_t* ptr = FX_Alloc(uint8_t, size + 1); |
| 288 return; | 282 FXSYS_memcpy(ptr, buf, size); |
| 289 } | 283 ptr[size] = 0; |
| 290 FXSYS_memcpy((key), buf, size); | 284 pAttr->m_Exif[tag] = ptr; |
| 291 key[size] = 0; | |
| 292 pExif->m_TagVal.SetAt(tag, (key)); | |
| 293 } | |
| 294 } | 285 } |
| 286 |
| 287 } // namespace |
| 288 |
| 295 FX_BOOL CCodec_TiffContext::LoadFrameInfo(int32_t frame, | 289 FX_BOOL CCodec_TiffContext::LoadFrameInfo(int32_t frame, |
| 296 FX_DWORD& width, | 290 FX_DWORD& width, |
| 297 FX_DWORD& height, | 291 FX_DWORD& height, |
| 298 FX_DWORD& comps, | 292 FX_DWORD& comps, |
| 299 FX_DWORD& bpc, | 293 FX_DWORD& bpc, |
| 300 CFX_DIBAttribute* pAttribute) { | 294 CFX_DIBAttribute* pAttribute) { |
| 301 if (!TIFFSetDirectory(tif_ctx, (uint16)frame)) { | 295 if (!TIFFSetDirectory(tif_ctx, (uint16)frame)) { |
| 302 return FALSE; | 296 return FALSE; |
| 303 } | 297 } |
| 304 FX_WORD tif_cs; | 298 FX_WORD tif_cs; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 315 TIFFGetField(tif_ctx, TIFFTAG_PHOTOMETRIC, &tif_cs); | 309 TIFFGetField(tif_ctx, TIFFTAG_PHOTOMETRIC, &tif_cs); |
| 316 TIFFGetField(tif_ctx, TIFFTAG_COMPRESSION, &tif_cps); | 310 TIFFGetField(tif_ctx, TIFFTAG_COMPRESSION, &tif_cps); |
| 317 TIFFGetField(tif_ctx, TIFFTAG_ROWSPERSTRIP, &tif_rps); | 311 TIFFGetField(tif_ctx, TIFFTAG_ROWSPERSTRIP, &tif_rps); |
| 318 TIFFGetField(tif_ctx, TIFFTAG_ICCPROFILE, &tif_icc_size, &tif_icc_buf); | 312 TIFFGetField(tif_ctx, TIFFTAG_ICCPROFILE, &tif_icc_size, &tif_icc_buf); |
| 319 if (pAttribute) { | 313 if (pAttribute) { |
| 320 pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_INCH; | 314 pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_INCH; |
| 321 if (TIFFGetField(tif_ctx, TIFFTAG_RESOLUTIONUNIT, | 315 if (TIFFGetField(tif_ctx, TIFFTAG_RESOLUTIONUNIT, |
| 322 &pAttribute->m_wDPIUnit)) { | 316 &pAttribute->m_wDPIUnit)) { |
| 323 pAttribute->m_wDPIUnit -= 1; | 317 pAttribute->m_wDPIUnit -= 1; |
| 324 } | 318 } |
| 325 CFX_DIBAttributeExif* pExif = (CFX_DIBAttributeExif*)pAttribute->m_pExif; | 319 Tiff_Exif_GetInfo<FX_WORD>(tif_ctx, TIFFTAG_ORIENTATION, pAttribute); |
| 326 pExif->clear(); | 320 if (Tiff_Exif_GetInfo<FX_FLOAT>(tif_ctx, TIFFTAG_XRESOLUTION, pAttribute)) { |
| 327 Tiff_Exif_GetInfo<FX_WORD>(tif_ctx, TIFFTAG_ORIENTATION, pExif); | 321 void* val = pAttribute->m_Exif[TIFFTAG_XRESOLUTION]; |
| 328 if (Tiff_Exif_GetInfo<FX_FLOAT>(tif_ctx, TIFFTAG_XRESOLUTION, pExif)) { | 322 FX_FLOAT fDpi = val ? *reinterpret_cast<FX_FLOAT*>(val) : 0; |
| 329 FX_FLOAT fDpi = 0; | |
| 330 pExif->GetInfo(TIFFTAG_XRESOLUTION, &fDpi); | |
| 331 pAttribute->m_nXDPI = (int32_t)(fDpi + 0.5f); | 323 pAttribute->m_nXDPI = (int32_t)(fDpi + 0.5f); |
| 332 } | 324 } |
| 333 if (Tiff_Exif_GetInfo<FX_FLOAT>(tif_ctx, TIFFTAG_YRESOLUTION, pExif)) { | 325 if (Tiff_Exif_GetInfo<FX_FLOAT>(tif_ctx, TIFFTAG_YRESOLUTION, pAttribute)) { |
| 334 FX_FLOAT fDpi = 0; | 326 void* val = pAttribute->m_Exif[TIFFTAG_YRESOLUTION]; |
| 335 pExif->GetInfo(TIFFTAG_YRESOLUTION, &fDpi); | 327 FX_FLOAT fDpi = val ? *reinterpret_cast<FX_FLOAT*>(val) : 0; |
| 336 pAttribute->m_nYDPI = (int32_t)(fDpi + 0.5f); | 328 pAttribute->m_nYDPI = (int32_t)(fDpi + 0.5f); |
| 337 } | 329 } |
| 338 Tiff_Exif_GetStringInfo(tif_ctx, TIFFTAG_IMAGEDESCRIPTION, pExif); | 330 Tiff_Exif_GetStringInfo(tif_ctx, TIFFTAG_IMAGEDESCRIPTION, pAttribute); |
| 339 Tiff_Exif_GetStringInfo(tif_ctx, TIFFTAG_MAKE, pExif); | 331 Tiff_Exif_GetStringInfo(tif_ctx, TIFFTAG_MAKE, pAttribute); |
| 340 Tiff_Exif_GetStringInfo(tif_ctx, TIFFTAG_MODEL, pExif); | 332 Tiff_Exif_GetStringInfo(tif_ctx, TIFFTAG_MODEL, pAttribute); |
| 341 } | 333 } |
| 342 bpc = tif_bpc; | 334 bpc = tif_bpc; |
| 343 if (tif_rps > height) { | 335 if (tif_rps > height) { |
| 344 TIFFSetField(tif_ctx, TIFFTAG_ROWSPERSTRIP, tif_rps = height); | 336 TIFFSetField(tif_ctx, TIFFTAG_ROWSPERSTRIP, tif_rps = height); |
| 345 } | 337 } |
| 346 return TRUE; | 338 return TRUE; |
| 347 } | 339 } |
| 348 void _TiffBGRA2RGBA(uint8_t* pBuf, int32_t pixel, int32_t spp) { | 340 void _TiffBGRA2RGBA(uint8_t* pBuf, int32_t pixel, int32_t spp) { |
| 349 register uint8_t tmp; | |
| 350 for (int32_t n = 0; n < pixel; n++) { | 341 for (int32_t n = 0; n < pixel; n++) { |
| 351 tmp = pBuf[0]; | 342 uint8_t tmp = pBuf[0]; |
| 352 pBuf[0] = pBuf[2]; | 343 pBuf[0] = pBuf[2]; |
| 353 pBuf[2] = tmp; | 344 pBuf[2] = tmp; |
| 354 pBuf += spp; | 345 pBuf += spp; |
| 355 } | 346 } |
| 356 } | 347 } |
| 357 FX_BOOL CCodec_TiffContext::isSupport(CFX_DIBitmap* pDIBitmap) { | 348 FX_BOOL CCodec_TiffContext::isSupport(CFX_DIBitmap* pDIBitmap) { |
| 358 if (TIFFIsTiled(tif_ctx)) { | 349 if (TIFFIsTiled(tif_ctx)) { |
| 359 return FALSE; | 350 return FALSE; |
| 360 } | 351 } |
| 361 uint16_t photometric; | 352 uint16_t photometric; |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 return pDecoder->LoadFrameInfo(frame, width, height, comps, bpc, pAttribute); | 545 return pDecoder->LoadFrameInfo(frame, width, height, comps, bpc, pAttribute); |
| 555 } | 546 } |
| 556 FX_BOOL CCodec_TiffModule::Decode(void* ctx, class CFX_DIBitmap* pDIBitmap) { | 547 FX_BOOL CCodec_TiffModule::Decode(void* ctx, class CFX_DIBitmap* pDIBitmap) { |
| 557 CCodec_TiffContext* pDecoder = (CCodec_TiffContext*)ctx; | 548 CCodec_TiffContext* pDecoder = (CCodec_TiffContext*)ctx; |
| 558 return pDecoder->Decode(pDIBitmap); | 549 return pDecoder->Decode(pDIBitmap); |
| 559 } | 550 } |
| 560 void CCodec_TiffModule::DestroyDecoder(void* ctx) { | 551 void CCodec_TiffModule::DestroyDecoder(void* ctx) { |
| 561 CCodec_TiffContext* pDecoder = (CCodec_TiffContext*)ctx; | 552 CCodec_TiffContext* pDecoder = (CCodec_TiffContext*)ctx; |
| 562 delete pDecoder; | 553 delete pDecoder; |
| 563 } | 554 } |
| OLD | NEW |