Group :: Sistema/Bibliotecas
RPM: libgdiplus
Main Changelog Spec Patches Sources Download Gear Bugs e FR Repocop
Patch: libgdiplus-2.10.9-alt2.patch
Download
Download
configure.in | 5 ++++
libgdiplus.pc.in | 6 ++---
src/pngcodec.c | 76 +++++++++++++++++++++++++++++++++----------------------
tests/Makefile.am | 2 +-
4 files changed, 55 insertions(+), 34 deletions(-)
diff --git a/configure.in b/configure.in
index 6a0b10e..b4e5de1 100644
--- a/configure.in
+++ b/configure.in
@@ -76,10 +76,12 @@ if test "x$FONTCONFIG" = "xno"; then
if test "x$FONTCONFIG_CONFIG" = "xyes"; then
FONTCONFIG_CFLAGS="`fontconfig-config --cflags`"
FONTCONFIG_LIBS="`fontconfig-config --libs`"
+
fi
fi
AC_CHECK_LIB(fontconfig, FcInit)
AC_CHECK_FUNCS(FcFini)
+GDIPLUS_PKG_REQ="$GDIPLUS_PKG_REQ fontconfig"
PKG_CHECK_MODULES(FREETYPE2, freetype2,
[freetype2_pkgconfig=yes], freetype2_pkgconfig=no])
@@ -93,6 +95,7 @@ fi
GDIPLUS_LIBS="$GDIPLUS_LIBS $FONTCONFIG_LIBS $FREETYPE2_LIBS"
GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS $FONTCONFIG_CFLAGS $FREETYPE2_CFLAGS"
+GDIPLUS_PKG_REQ="$GDIPLUS_PKG_REQ freetype2"
AC_CHECK_HEADERS(byteswap.h)
@@ -146,6 +149,7 @@ esac
if test "x$no_x" != "xyes"; then
GDIPLUS_LIBS="$GDIPLUS_LIBS `pkg-config --libs xrender `"
GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS `pkg-config --cflags xrender `"
+ GDIPLUS_PKG_REQ="$GDIPLUS_PKG_REQ xrender"
fi
# Apparently for BSD special handling needs to happen
@@ -376,6 +380,7 @@ if test x$with_libexif != xno && test -z "$LIBEXIF"; then
if test x$libexif_pkgconfig = xyes ; then
GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS $LIBEXIF_CFLAGS"
GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBEXIF_LIBS"
+ GDIPLUS_PKG_REQ="$GDIPLUS_PKG_REQ libexif"
AC_DEFINE(HAVE_LIBEXIF, 1, Define if libexif is available.)
else
libexif_pkgconfig="No. Get it from http://libexif.sourceforge.net/"
diff --git a/libgdiplus.pc.in b/libgdiplus.pc.in
index 437b6d1..dea5069 100644
--- a/libgdiplus.pc.in
+++ b/libgdiplus.pc.in
@@ -7,6 +7,6 @@ includedir=@includedir@
Name: libgdiplus
Description: GDI+ implementation
Version: @VERSION@
-Requires: glib-2.0 gmodule-2.0 gthread-2.0
-Libs: -L${libdir} -lgdiplus @GDIPLUS_PKG_LIBS@
-Cflags: -I${includedir} @GDIPLUS_PKG_CFLAGS@
+Requires: glib-2.0 gmodule-2.0 gthread-2.0 @GDIPLUS_PKG_REQ@
+Libs: -L${libdir} -lgdiplus
+Cflags: -I${includedir}
diff --git a/src/pngcodec.c b/src/pngcodec.c
index 0038f82..13438cf 100644
--- a/src/pngcodec.c
+++ b/src/pngcodec.c
@@ -116,10 +116,15 @@ gdip_load_png_properties (png_structp png_ptr, png_infop info_ptr, png_infop end
bitmap_data->dpi_horz = png_get_x_pixels_per_inch(png_ptr, info_ptr);
bitmap_data->dpi_vert = png_get_y_pixels_per_inch(png_ptr, info_ptr);
#elif defined(PNG_pHYs_SUPPORTED)
- if ((info_ptr->valid & PNG_INFO_pHYs) && (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)) {
- bitmap_data->image_flags |= ImageFlagsHasRealDPI;
- bitmap_data->dpi_horz = info_ptr->x_pixels_per_unit * 0.0254;
- bitmap_data->dpi_vert = info_ptr->y_pixels_per_unit * 0.0254;
+ if (png_get_valid (png_ptr, info_ptr, PNG_INFO_pHYs)) {
+ png_uint_32 res_x, res_y;
+ int unit_type;
+ png_get_pHYs (png_ptr, info_ptr, &res_x, &res_y, &unit_type);
+ if (unit_type == PNG_RESOLUTION_METER) {
+ bitmap_data->image_flags |= ImageFlagsHasRealDPI;
+ bitmap_data->dpi_horz = res_x * 0.0254;
+ bitmap_data->dpi_vert = res_y * 0.0254;
+ }
}
#endif
/* default to screen resolution (if nothing was provided or available) */
@@ -130,7 +135,7 @@ gdip_load_png_properties (png_structp png_ptr, png_infop info_ptr, png_infop end
#if defined(PNG_iCCP_SUPPORTED)
{
png_charp name;
- png_charp profile;
+ png_bytep profile;
png_uint_32 proflen;
int compression_type;
@@ -292,6 +297,11 @@ gdip_load_png_image_from_file_or_stream (FILE *fp, GetBytesDelegate getBytesFunc
ImageFlags colourspace_flag;
int i;
int j;
+ png_colorp png_palette;
+ int png_num_palette;
+ png_bytep trans_alpha;
+ int num_trans;
+ png_color_16p trans_color;
width = png_get_image_width (png_ptr, info_ptr);
height = png_get_image_height (png_ptr, info_ptr);
@@ -309,6 +319,8 @@ gdip_load_png_image_from_file_or_stream (FILE *fp, GetBytesDelegate getBytesFunc
}
/* Copy palette. */
+ png_get_PLTE (png_ptr, info_ptr, &png_palette, &png_num_palette);
+
num_colours = 1 << bit_depth;
if (png_get_color_type (png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY) {
@@ -321,8 +333,8 @@ gdip_load_png_image_from_file_or_stream (FILE *fp, GetBytesDelegate getBytesFunc
colourspace_flag = ImageFlagsColorSpaceRGB;
palette_entries = num_colours;
- if (palette_entries > info_ptr->num_palette) {
- palette_entries = info_ptr->num_palette;
+ if (palette_entries > png_num_palette) {
+ palette_entries = png_num_palette;
}
palette = GdipAlloc (sizeof(ColorPalette) + (num_colours - 1) * sizeof(ARGB));
@@ -331,29 +343,30 @@ gdip_load_png_image_from_file_or_stream (FILE *fp, GetBytesDelegate getBytesFunc
for (i=0; i < palette_entries; i++) {
set_pixel_bgra (&palette->Entries[i], 0,
- info_ptr->palette[i].blue,
- info_ptr->palette[i].green,
- info_ptr->palette[i].red,
+ png_palette[i].blue,
+ png_palette[i].green,
+ png_palette[i].red,
0xFF); /* alpha */
}
}
+ png_get_tRNS (png_ptr, info_ptr, &trans_alpha, &num_trans, &trans_color);
/* Make sure transparency is respected. */
- if (info_ptr->num_trans > 0) {
+ if (num_trans > 0) {
palette->Flags |= PaletteFlagsHasAlpha;
colourspace_flag |= ImageFlagsHasAlpha;
- if (info_ptr->num_trans > info_ptr->num_palette) {
- info_ptr->num_trans = info_ptr->num_palette;
+ if (num_trans > png_num_palette) {
+ num_trans = png_num_palette;
}
- for (i=0; i < info_ptr->num_trans; i++) {
+ for (i=0; i < num_trans; i++) {
set_pixel_bgra(&palette->Entries[i], 0,
- info_ptr->palette[i].blue,
- info_ptr->palette[i].green,
- info_ptr->palette[i].red,
+ png_palette[i].blue,
+ png_palette[i].green,
+ png_palette[i].red,
#if PNG_LIBPNG_VER > 10399
- info_ptr->trans_alpha [i]); /* alpha */
+ trans_alpha [i]); /* alpha */
#else
info_ptr->trans[i]); /* alpha */
#endif
@@ -398,6 +411,8 @@ gdip_load_png_image_from_file_or_stream (FILE *fp, GetBytesDelegate getBytesFunc
BYTE bit_depth;
int stride;
int interlace;
+ png_colorp png_palette;
+ int png_num_palette;
png_bytep *row_pointers;
BYTE *rawptr;
int i, j;
@@ -490,32 +505,33 @@ gdip_load_png_image_from_file_or_stream (FILE *fp, GetBytesDelegate getBytesFunc
png_byte palette = 0;
png_byte pix = *rowp++;
+ png_get_PLTE (png_ptr, info_ptr, &png_palette, &png_num_palette);
palette = (pix >> 6) & 0x03;
set_pixel_bgra (rawptr, 0,
- info_ptr->palette[palette].blue,
- info_ptr->palette[palette].green,
- info_ptr->palette[palette].red,
+ png_palette[palette].blue,
+ png_palette[palette].green,
+ png_palette[palette].red,
0xFF); /* alpha */
palette = (pix >> 4) & 0x03;
set_pixel_bgra (rawptr, 4,
- info_ptr->palette[palette].blue,
- info_ptr->palette[palette].green,
- info_ptr->palette[palette].red,
+ png_palette[palette].blue,
+ png_palette[palette].green,
+ png_palette[palette].red,
0xFF); /* alpha */
palette = (pix >> 2) & 0x03;
set_pixel_bgra (rawptr, 8,
- info_ptr->palette[palette].blue,
- info_ptr->palette[palette].green,
- info_ptr->palette[palette].red,
+ png_palette[palette].blue,
+ png_palette[palette].green,
+ png_palette[palette].red,
0xFF); /* alpha */
palette = pix & 0x03;
set_pixel_bgra (rawptr, 12,
- info_ptr->palette[palette].blue,
- info_ptr->palette[palette].green,
- info_ptr->palette[palette].red,
+ png_palette[palette].blue,
+ png_palette[palette].green,
+ png_palette[palette].red,
0xFF); /* alpha */
rawptr += 16;
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 5b8c67c..a84cb68 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -17,7 +17,7 @@ noinst_PROGRAMS = \
testgdi testbits testclip testreversepath
testgdi_DEPENDENCIES = $(TEST_DEPS)
-testgdi_LDADD = $(LDADDS)
+testgdi_LDADD = $(LDADDS) $(GDIPLUS_LIBS)
testgdi_SOURCES = \
testgdi.c