Index: core/src/fxcodec/codec/fx_codec_png.cpp |
diff --git a/core/src/fxcodec/codec/fx_codec_png.cpp b/core/src/fxcodec/codec/fx_codec_png.cpp |
index 9e0847333982b49977f33ad644aa7b959b44a973..32b0d3d48fb40b36dc489c6c4e4f0fcc061d3887 100644 |
--- a/core/src/fxcodec/codec/fx_codec_png.cpp |
+++ b/core/src/fxcodec/codec/fx_codec_png.cpp |
@@ -1,256 +1,256 @@ |
-// Copyright 2014 PDFium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
- |
-#include <algorithm> |
- |
-#include "core/include/fxcodec/fx_codec.h" |
-#include "core/include/fxge/fx_dib.h" |
-#include "codec_int.h" |
- |
-extern "C" { |
-#undef FAR |
-#include "third_party/libpng16/png.h" |
-} |
- |
-static void _png_error_data(png_structp png_ptr, png_const_charp error_msg) { |
- if (png_get_error_ptr(png_ptr)) { |
- FXSYS_strncpy((char*)png_get_error_ptr(png_ptr), error_msg, |
- PNG_ERROR_SIZE - 1); |
- } |
- longjmp(png_jmpbuf(png_ptr), 1); |
-} |
-static void _png_warning_data(png_structp png_ptr, png_const_charp error_msg) {} |
-static void _png_load_bmp_attribute(png_structp png_ptr, |
- png_infop info_ptr, |
- CFX_DIBAttribute* pAttribute) { |
- if (pAttribute) { |
-#if defined(PNG_pHYs_SUPPORTED) |
- pAttribute->m_nXDPI = png_get_x_pixels_per_meter(png_ptr, info_ptr); |
- pAttribute->m_nYDPI = png_get_y_pixels_per_meter(png_ptr, info_ptr); |
- png_uint_32 res_x, res_y; |
- int unit_type; |
- png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, &unit_type); |
- switch (unit_type) { |
- case PNG_RESOLUTION_METER: |
- pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_METER; |
- break; |
- default: |
- pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_NONE; |
- } |
-#endif |
-#if defined(PNG_iCCP_SUPPORTED) |
- png_charp icc_name; |
- png_bytep icc_profile; |
- png_uint_32 icc_proflen; |
- int compress_type; |
- png_get_iCCP(png_ptr, info_ptr, &icc_name, &compress_type, &icc_profile, |
- &icc_proflen); |
-#endif |
- int bTime = 0; |
-#if defined(PNG_tIME_SUPPORTED) |
- png_timep t = NULL; |
- png_get_tIME(png_ptr, info_ptr, &t); |
- if (t) { |
- FXSYS_memset(pAttribute->m_strTime, 0, sizeof(pAttribute->m_strTime)); |
- FXSYS_snprintf((FX_CHAR*)pAttribute->m_strTime, |
- sizeof(pAttribute->m_strTime), "%4d:%2d:%2d %2d:%2d:%2d", |
- t->year, t->month, t->day, t->hour, t->minute, t->second); |
- pAttribute->m_strTime[sizeof(pAttribute->m_strTime) - 1] = 0; |
- bTime = 1; |
- } |
-#endif |
-#if defined(PNG_TEXT_SUPPORTED) |
- int i; |
- FX_STRSIZE len; |
- const FX_CHAR* buf; |
- int num_text; |
- png_textp text = NULL; |
- png_get_text(png_ptr, info_ptr, &text, &num_text); |
- for (i = 0; i < num_text; i++) { |
- len = FXSYS_strlen(text[i].key); |
- buf = "Time"; |
- if (!FXSYS_memcmp(buf, text[i].key, std::min(len, FXSYS_strlen(buf)))) { |
- if (!bTime) { |
- FXSYS_memset(pAttribute->m_strTime, 0, sizeof(pAttribute->m_strTime)); |
- FXSYS_memcpy( |
- pAttribute->m_strTime, text[i].text, |
- std::min(sizeof(pAttribute->m_strTime) - 1, text[i].text_length)); |
- } |
- } else { |
- buf = "Author"; |
- if (!FXSYS_memcmp(buf, text[i].key, std::min(len, FXSYS_strlen(buf)))) { |
- pAttribute->m_strAuthor.Empty(); |
- pAttribute->m_strAuthor.Load((uint8_t*)text[i].text, |
- (FX_STRSIZE)text[i].text_length); |
- } |
- } |
- } |
-#endif |
- } |
-} |
-struct FXPNG_Context { |
- png_structp png_ptr; |
- png_infop info_ptr; |
- void* parent_ptr; |
- void* child_ptr; |
- |
- void* (*m_AllocFunc)(unsigned int); |
- void (*m_FreeFunc)(void*); |
-}; |
-extern "C" { |
-static void* _png_alloc_func(unsigned int size) { |
- return FX_Alloc(char, size); |
-} |
-static void _png_free_func(void* p) { |
- if (p != NULL) { |
- FX_Free(p); |
- } |
-} |
-}; |
-static void _png_get_header_func(png_structp png_ptr, png_infop info_ptr) { |
- FXPNG_Context* p = (FXPNG_Context*)png_get_progressive_ptr(png_ptr); |
- if (p == NULL) { |
- return; |
- } |
- CCodec_PngModule* pModule = (CCodec_PngModule*)p->parent_ptr; |
- if (pModule == NULL) { |
- return; |
- } |
- png_uint_32 width = 0, height = 0; |
- int bpc = 0, color_type = 0, color_type1 = 0, pass = 0; |
- double gamma = 1.0; |
- png_get_IHDR(png_ptr, info_ptr, &width, &height, &bpc, &color_type, NULL, |
- NULL, NULL); |
- color_type1 = color_type; |
- if (bpc > 8) { |
- png_set_strip_16(png_ptr); |
- } else if (bpc < 8) { |
- png_set_expand_gray_1_2_4_to_8(png_ptr); |
- } |
- bpc = 8; |
- if (color_type == PNG_COLOR_TYPE_PALETTE) { |
- png_set_palette_to_rgb(png_ptr); |
- } |
- pass = png_set_interlace_handling(png_ptr); |
- if (!pModule->ReadHeaderCallback(p->child_ptr, width, height, bpc, pass, |
- &color_type, &gamma)) { |
- png_error(p->png_ptr, "Read Header Callback Error"); |
- } |
- int intent; |
- if (png_get_sRGB(png_ptr, info_ptr, &intent)) { |
- png_set_gamma(png_ptr, gamma, 0.45455); |
- } else { |
- double image_gamma; |
- if (png_get_gAMA(png_ptr, info_ptr, &image_gamma)) { |
- png_set_gamma(png_ptr, gamma, image_gamma); |
- } else { |
- png_set_gamma(png_ptr, gamma, 0.45455); |
- } |
- } |
- switch (color_type) { |
- case PNG_COLOR_TYPE_GRAY: |
- case PNG_COLOR_TYPE_GRAY_ALPHA: { |
- if (color_type1 & PNG_COLOR_MASK_COLOR) { |
- png_set_rgb_to_gray(png_ptr, 1, 0.299, 0.587); |
- } |
- } break; |
- case PNG_COLOR_TYPE_PALETTE: |
- if (color_type1 != PNG_COLOR_TYPE_PALETTE) { |
- png_error(p->png_ptr, "Not Support Output Palette Now"); |
- } |
- case PNG_COLOR_TYPE_RGB: |
- case PNG_COLOR_TYPE_RGB_ALPHA: |
- if (!(color_type1 & PNG_COLOR_MASK_COLOR)) { |
- png_set_gray_to_rgb(png_ptr); |
- } |
- png_set_bgr(png_ptr); |
- break; |
- } |
- if (!(color_type & PNG_COLOR_MASK_ALPHA)) { |
- png_set_strip_alpha(png_ptr); |
- } |
- if (color_type & PNG_COLOR_MASK_ALPHA && |
- !(color_type1 & PNG_COLOR_MASK_ALPHA)) { |
- png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); |
- } |
- png_read_update_info(png_ptr, info_ptr); |
-} |
-static void _png_get_end_func(png_structp png_ptr, png_infop info_ptr) {} |
-static void _png_get_row_func(png_structp png_ptr, |
- png_bytep new_row, |
- png_uint_32 row_num, |
- int pass) { |
- FXPNG_Context* p = (FXPNG_Context*)png_get_progressive_ptr(png_ptr); |
- if (p == NULL) { |
- return; |
- } |
- CCodec_PngModule* pModule = (CCodec_PngModule*)p->parent_ptr; |
- uint8_t* src_buf = NULL; |
- if (!pModule->AskScanlineBufCallback(p->child_ptr, row_num, src_buf)) { |
- png_error(png_ptr, "Ask Scanline buffer Callback Error"); |
- } |
- if (src_buf != NULL) { |
- png_progressive_combine_row(png_ptr, src_buf, new_row); |
- } |
- pModule->FillScanlineBufCompletedCallback(p->child_ptr, pass, row_num); |
-} |
-void* CCodec_PngModule::Start(void* pModule) { |
- FXPNG_Context* p = (FXPNG_Context*)FX_Alloc(uint8_t, sizeof(FXPNG_Context)); |
- if (p == NULL) { |
- return NULL; |
- } |
- p->m_AllocFunc = _png_alloc_func; |
- p->m_FreeFunc = _png_free_func; |
- p->png_ptr = NULL; |
- p->info_ptr = NULL; |
- p->parent_ptr = (void*)this; |
- p->child_ptr = pModule; |
- p->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
- if (p->png_ptr == NULL) { |
- FX_Free(p); |
- return NULL; |
- } |
- p->info_ptr = png_create_info_struct(p->png_ptr); |
- if (p->info_ptr == NULL) { |
- png_destroy_read_struct(&(p->png_ptr), (png_infopp)NULL, (png_infopp)NULL); |
- FX_Free(p); |
- return NULL; |
- } |
- if (setjmp(png_jmpbuf(p->png_ptr))) { |
- if (p != NULL) { |
- png_destroy_read_struct(&(p->png_ptr), &(p->info_ptr), (png_infopp)NULL); |
- FX_Free(p); |
- } |
- return NULL; |
- } |
- png_set_progressive_read_fn(p->png_ptr, p, _png_get_header_func, |
- _png_get_row_func, _png_get_end_func); |
- png_set_error_fn(p->png_ptr, m_szLastError, (png_error_ptr)_png_error_data, |
- (png_error_ptr)_png_warning_data); |
- return p; |
-} |
-void CCodec_PngModule::Finish(void* pContext) { |
- FXPNG_Context* p = (FXPNG_Context*)pContext; |
- if (p != NULL) { |
- png_destroy_read_struct(&(p->png_ptr), &(p->info_ptr), (png_infopp)NULL); |
- p->m_FreeFunc(p); |
- } |
-} |
-FX_BOOL CCodec_PngModule::Input(void* pContext, |
- const uint8_t* src_buf, |
- FX_DWORD src_size, |
- CFX_DIBAttribute* pAttribute) { |
- FXPNG_Context* p = (FXPNG_Context*)pContext; |
- if (setjmp(png_jmpbuf(p->png_ptr))) { |
- if (pAttribute && |
- 0 == FXSYS_strcmp(m_szLastError, "Read Header Callback Error")) { |
- _png_load_bmp_attribute(p->png_ptr, p->info_ptr, pAttribute); |
- } |
- return FALSE; |
- } |
- png_process_data(p->png_ptr, p->info_ptr, (uint8_t*)src_buf, src_size); |
- return TRUE; |
-} |
+// Copyright 2014 PDFium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
+ |
+#include <algorithm> |
+ |
+#include "core/include/fxcodec/fx_codec.h" |
+#include "core/include/fxge/fx_dib.h" |
+#include "codec_int.h" |
+ |
+extern "C" { |
+#undef FAR |
+#include "third_party/libpng16/png.h" |
+} |
+ |
+static void _png_error_data(png_structp png_ptr, png_const_charp error_msg) { |
+ if (png_get_error_ptr(png_ptr)) { |
+ FXSYS_strncpy((char*)png_get_error_ptr(png_ptr), error_msg, |
+ PNG_ERROR_SIZE - 1); |
+ } |
+ longjmp(png_jmpbuf(png_ptr), 1); |
+} |
+static void _png_warning_data(png_structp png_ptr, png_const_charp error_msg) {} |
+static void _png_load_bmp_attribute(png_structp png_ptr, |
+ png_infop info_ptr, |
+ CFX_DIBAttribute* pAttribute) { |
+ if (pAttribute) { |
+#if defined(PNG_pHYs_SUPPORTED) |
+ pAttribute->m_nXDPI = png_get_x_pixels_per_meter(png_ptr, info_ptr); |
+ pAttribute->m_nYDPI = png_get_y_pixels_per_meter(png_ptr, info_ptr); |
+ png_uint_32 res_x, res_y; |
+ int unit_type; |
+ png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, &unit_type); |
+ switch (unit_type) { |
+ case PNG_RESOLUTION_METER: |
+ pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_METER; |
+ break; |
+ default: |
+ pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_NONE; |
+ } |
+#endif |
+#if defined(PNG_iCCP_SUPPORTED) |
+ png_charp icc_name; |
+ png_bytep icc_profile; |
+ png_uint_32 icc_proflen; |
+ int compress_type; |
+ png_get_iCCP(png_ptr, info_ptr, &icc_name, &compress_type, &icc_profile, |
+ &icc_proflen); |
+#endif |
+ int bTime = 0; |
+#if defined(PNG_tIME_SUPPORTED) |
+ png_timep t = NULL; |
+ png_get_tIME(png_ptr, info_ptr, &t); |
+ if (t) { |
+ FXSYS_memset(pAttribute->m_strTime, 0, sizeof(pAttribute->m_strTime)); |
+ FXSYS_snprintf((FX_CHAR*)pAttribute->m_strTime, |
+ sizeof(pAttribute->m_strTime), "%4d:%2d:%2d %2d:%2d:%2d", |
+ t->year, t->month, t->day, t->hour, t->minute, t->second); |
+ pAttribute->m_strTime[sizeof(pAttribute->m_strTime) - 1] = 0; |
+ bTime = 1; |
+ } |
+#endif |
+#if defined(PNG_TEXT_SUPPORTED) |
+ int i; |
+ FX_STRSIZE len; |
+ const FX_CHAR* buf; |
+ int num_text; |
+ png_textp text = NULL; |
+ png_get_text(png_ptr, info_ptr, &text, &num_text); |
+ for (i = 0; i < num_text; i++) { |
+ len = FXSYS_strlen(text[i].key); |
+ buf = "Time"; |
+ if (!FXSYS_memcmp(buf, text[i].key, std::min(len, FXSYS_strlen(buf)))) { |
+ if (!bTime) { |
+ FXSYS_memset(pAttribute->m_strTime, 0, sizeof(pAttribute->m_strTime)); |
+ FXSYS_memcpy( |
+ pAttribute->m_strTime, text[i].text, |
+ std::min(sizeof(pAttribute->m_strTime) - 1, text[i].text_length)); |
+ } |
+ } else { |
+ buf = "Author"; |
+ if (!FXSYS_memcmp(buf, text[i].key, std::min(len, FXSYS_strlen(buf)))) { |
+ pAttribute->m_strAuthor.Empty(); |
+ pAttribute->m_strAuthor.Load((uint8_t*)text[i].text, |
+ (FX_STRSIZE)text[i].text_length); |
+ } |
+ } |
+ } |
+#endif |
+ } |
+} |
+struct FXPNG_Context { |
+ png_structp png_ptr; |
+ png_infop info_ptr; |
+ void* parent_ptr; |
+ void* child_ptr; |
+ |
+ void* (*m_AllocFunc)(unsigned int); |
+ void (*m_FreeFunc)(void*); |
+}; |
+extern "C" { |
+static void* _png_alloc_func(unsigned int size) { |
+ return FX_Alloc(char, size); |
+} |
+static void _png_free_func(void* p) { |
+ if (p != NULL) { |
+ FX_Free(p); |
+ } |
+} |
+}; |
+static void _png_get_header_func(png_structp png_ptr, png_infop info_ptr) { |
+ FXPNG_Context* p = (FXPNG_Context*)png_get_progressive_ptr(png_ptr); |
+ if (p == NULL) { |
+ return; |
+ } |
+ CCodec_PngModule* pModule = (CCodec_PngModule*)p->parent_ptr; |
+ if (pModule == NULL) { |
+ return; |
+ } |
+ png_uint_32 width = 0, height = 0; |
+ int bpc = 0, color_type = 0, color_type1 = 0, pass = 0; |
+ double gamma = 1.0; |
+ png_get_IHDR(png_ptr, info_ptr, &width, &height, &bpc, &color_type, NULL, |
+ NULL, NULL); |
+ color_type1 = color_type; |
+ if (bpc > 8) { |
+ png_set_strip_16(png_ptr); |
+ } else if (bpc < 8) { |
+ png_set_expand_gray_1_2_4_to_8(png_ptr); |
+ } |
+ bpc = 8; |
+ if (color_type == PNG_COLOR_TYPE_PALETTE) { |
+ png_set_palette_to_rgb(png_ptr); |
+ } |
+ pass = png_set_interlace_handling(png_ptr); |
+ if (!pModule->ReadHeaderCallback(p->child_ptr, width, height, bpc, pass, |
+ &color_type, &gamma)) { |
+ png_error(p->png_ptr, "Read Header Callback Error"); |
+ } |
+ int intent; |
+ if (png_get_sRGB(png_ptr, info_ptr, &intent)) { |
+ png_set_gamma(png_ptr, gamma, 0.45455); |
+ } else { |
+ double image_gamma; |
+ if (png_get_gAMA(png_ptr, info_ptr, &image_gamma)) { |
+ png_set_gamma(png_ptr, gamma, image_gamma); |
+ } else { |
+ png_set_gamma(png_ptr, gamma, 0.45455); |
+ } |
+ } |
+ switch (color_type) { |
+ case PNG_COLOR_TYPE_GRAY: |
+ case PNG_COLOR_TYPE_GRAY_ALPHA: { |
+ if (color_type1 & PNG_COLOR_MASK_COLOR) { |
+ png_set_rgb_to_gray(png_ptr, 1, 0.299, 0.587); |
+ } |
+ } break; |
+ case PNG_COLOR_TYPE_PALETTE: |
+ if (color_type1 != PNG_COLOR_TYPE_PALETTE) { |
+ png_error(p->png_ptr, "Not Support Output Palette Now"); |
+ } |
+ case PNG_COLOR_TYPE_RGB: |
+ case PNG_COLOR_TYPE_RGB_ALPHA: |
+ if (!(color_type1 & PNG_COLOR_MASK_COLOR)) { |
+ png_set_gray_to_rgb(png_ptr); |
+ } |
+ png_set_bgr(png_ptr); |
+ break; |
+ } |
+ if (!(color_type & PNG_COLOR_MASK_ALPHA)) { |
+ png_set_strip_alpha(png_ptr); |
+ } |
+ if (color_type & PNG_COLOR_MASK_ALPHA && |
+ !(color_type1 & PNG_COLOR_MASK_ALPHA)) { |
+ png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); |
+ } |
+ png_read_update_info(png_ptr, info_ptr); |
+} |
+static void _png_get_end_func(png_structp png_ptr, png_infop info_ptr) {} |
+static void _png_get_row_func(png_structp png_ptr, |
+ png_bytep new_row, |
+ png_uint_32 row_num, |
+ int pass) { |
+ FXPNG_Context* p = (FXPNG_Context*)png_get_progressive_ptr(png_ptr); |
+ if (p == NULL) { |
+ return; |
+ } |
+ CCodec_PngModule* pModule = (CCodec_PngModule*)p->parent_ptr; |
+ uint8_t* src_buf = NULL; |
+ if (!pModule->AskScanlineBufCallback(p->child_ptr, row_num, src_buf)) { |
+ png_error(png_ptr, "Ask Scanline buffer Callback Error"); |
+ } |
+ if (src_buf != NULL) { |
+ png_progressive_combine_row(png_ptr, src_buf, new_row); |
+ } |
+ pModule->FillScanlineBufCompletedCallback(p->child_ptr, pass, row_num); |
+} |
+void* CCodec_PngModule::Start(void* pModule) { |
+ FXPNG_Context* p = (FXPNG_Context*)FX_Alloc(uint8_t, sizeof(FXPNG_Context)); |
+ if (p == NULL) { |
+ return NULL; |
+ } |
+ p->m_AllocFunc = _png_alloc_func; |
+ p->m_FreeFunc = _png_free_func; |
+ p->png_ptr = NULL; |
+ p->info_ptr = NULL; |
+ p->parent_ptr = (void*)this; |
+ p->child_ptr = pModule; |
+ p->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
+ if (p->png_ptr == NULL) { |
+ FX_Free(p); |
+ return NULL; |
+ } |
+ p->info_ptr = png_create_info_struct(p->png_ptr); |
+ if (p->info_ptr == NULL) { |
+ png_destroy_read_struct(&(p->png_ptr), (png_infopp)NULL, (png_infopp)NULL); |
+ FX_Free(p); |
+ return NULL; |
+ } |
+ if (setjmp(png_jmpbuf(p->png_ptr))) { |
+ if (p != NULL) { |
+ png_destroy_read_struct(&(p->png_ptr), &(p->info_ptr), (png_infopp)NULL); |
+ FX_Free(p); |
+ } |
+ return NULL; |
+ } |
+ png_set_progressive_read_fn(p->png_ptr, p, _png_get_header_func, |
+ _png_get_row_func, _png_get_end_func); |
+ png_set_error_fn(p->png_ptr, m_szLastError, (png_error_ptr)_png_error_data, |
+ (png_error_ptr)_png_warning_data); |
+ return p; |
+} |
+void CCodec_PngModule::Finish(void* pContext) { |
+ FXPNG_Context* p = (FXPNG_Context*)pContext; |
+ if (p != NULL) { |
+ png_destroy_read_struct(&(p->png_ptr), &(p->info_ptr), (png_infopp)NULL); |
+ p->m_FreeFunc(p); |
+ } |
+} |
+FX_BOOL CCodec_PngModule::Input(void* pContext, |
+ const uint8_t* src_buf, |
+ FX_DWORD src_size, |
+ CFX_DIBAttribute* pAttribute) { |
+ FXPNG_Context* p = (FXPNG_Context*)pContext; |
+ if (setjmp(png_jmpbuf(p->png_ptr))) { |
+ if (pAttribute && |
+ 0 == FXSYS_strcmp(m_szLastError, "Read Header Callback Error")) { |
+ _png_load_bmp_attribute(p->png_ptr, p->info_ptr, pAttribute); |
+ } |
+ return FALSE; |
+ } |
+ png_process_data(p->png_ptr, p->info_ptr, (uint8_t*)src_buf, src_size); |
+ return TRUE; |
+} |