575 lines
29 KiB
Diff
575 lines
29 KiB
Diff
diff -up texlive-2007/texk/web2c/pdftexdir/writeimg.c.png15 texlive-2007/texk/web2c/pdftexdir/writeimg.c
|
|
--- texlive-2007/texk/web2c/pdftexdir/writeimg.c.png15 2012-02-08 15:21:02.318911661 -0500
|
|
+++ texlive-2007/texk/web2c/pdftexdir/writeimg.c 2012-02-08 15:23:07.870843970 -0500
|
|
@@ -122,7 +122,11 @@ integer imagecolordepth(integer img)
|
|
{
|
|
switch (img_type(img)) {
|
|
case IMAGE_TYPE_PNG:
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ return png_get_bit_depth(png_ptr(img), png_info(img));
|
|
+#else
|
|
return png_info(img)->bit_depth;
|
|
+#endif
|
|
case IMAGE_TYPE_JPG:
|
|
return jpg_ptr(img)->bits_per_component;
|
|
case IMAGE_TYPE_JBIG2:
|
|
@@ -364,7 +368,11 @@ void deleteimage(integer img)
|
|
epdf_delete();
|
|
break;
|
|
case IMAGE_TYPE_PNG:
|
|
+#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4
|
|
+ xfclose((FILE *) png_get_io_ptr(png_ptr(img)), cur_file_name);
|
|
+#else
|
|
xfclose((FILE *) png_ptr(img)->io_ptr, cur_file_name);
|
|
+#endif
|
|
png_destroy_read_struct(&(png_ptr(img)), &(png_info(img)), NULL);
|
|
break;
|
|
case IMAGE_TYPE_JPG:
|
|
diff -up texlive-2007/texk/web2c/pdftexdir/writepng.c.png15 texlive-2007/texk/web2c/pdftexdir/writepng.c
|
|
--- texlive-2007/texk/web2c/pdftexdir/writepng.c.png15 2006-12-26 18:37:34.000000000 -0500
|
|
+++ texlive-2007/texk/web2c/pdftexdir/writepng.c 2012-02-08 15:17:11.411875292 -0500
|
|
@@ -33,7 +33,11 @@ void read_png_info(integer img)
|
|
pdftex_fail("libpng: png_create_read_struct() failed");
|
|
if ((png_info(img) = png_create_info_struct(png_ptr(img))) == NULL)
|
|
pdftex_fail("libpng: png_create_info_struct() failed");
|
|
+#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4
|
|
+ if (setjmp(png_jmpbuf(png_ptr(img))))
|
|
+#else
|
|
if (setjmp(png_ptr(img)->jmpbuf))
|
|
+#endif
|
|
pdftex_fail("libpng: internal error");
|
|
png_init_io(png_ptr(img), png_file);
|
|
png_read_info(png_ptr(img), png_info(img));
|
|
@@ -43,12 +47,20 @@ void read_png_info(integer img)
|
|
}
|
|
/* alpha channel support */
|
|
if (fixedpdfminorversion < 4
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ && png_get_color_type(png_ptr(img), png_info(img)) | PNG_COLOR_MASK_ALPHA)
|
|
+#else
|
|
&& png_ptr(img)->color_type | PNG_COLOR_MASK_ALPHA)
|
|
+#endif
|
|
png_set_strip_alpha(png_ptr(img));
|
|
/* 16bit depth support */
|
|
if (fixedpdfminorversion < 5)
|
|
fixedimagehicolor = 0;
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_bit_depth(png_ptr(img), png_info(img)) == 16 && !fixedimagehicolor)
|
|
+#else
|
|
if (png_info(img)->bit_depth == 16 && !fixedimagehicolor)
|
|
+#endif
|
|
png_set_strip_16(png_ptr(img));
|
|
/* gamma support */
|
|
if (fixedimageapplygamma) {
|
|
@@ -61,9 +73,18 @@ void read_png_info(integer img)
|
|
/* reset structure */
|
|
png_read_update_info(png_ptr(img), png_info(img));
|
|
/* resolution support */
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ img_width(img) = png_get_image_width(png_ptr(img), png_info(img));
|
|
+ img_height(img) = png_get_image_height(png_ptr(img), png_info(img));
|
|
+#else
|
|
img_width(img) = png_info(img)->width;
|
|
img_height(img) = png_info(img)->height;
|
|
+#endif
|
|
+#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4
|
|
+ if (png_get_valid(png_ptr(img), png_info(img), PNG_INFO_pHYs)) {
|
|
+#else
|
|
if (png_info(img)->valid & PNG_INFO_pHYs) {
|
|
+#endif
|
|
img_xres(img) =
|
|
round(0.0254 *
|
|
png_get_x_pixels_per_meter(png_ptr(img), png_info(img)));
|
|
@@ -71,7 +92,11 @@ void read_png_info(integer img)
|
|
round(0.0254 *
|
|
png_get_y_pixels_per_meter(png_ptr(img), png_info(img)));
|
|
}
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ switch (png_get_color_type(png_ptr(img), png_info(img))) {
|
|
+#else
|
|
switch (png_info(img)->color_type) {
|
|
+#endif
|
|
case PNG_COLOR_TYPE_PALETTE:
|
|
img_color(img) = IMAGE_COLOR_C | IMAGE_COLOR_I;
|
|
break;
|
|
@@ -85,7 +110,11 @@ void read_png_info(integer img)
|
|
break;
|
|
default:
|
|
pdftex_fail("unsupported type of color_type <%i>",
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ png_get_color_type(png_ptr(img), png_info(img)));
|
|
+#else
|
|
png_info(img)->color_type);
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
@@ -109,7 +138,38 @@ void read_png_info(integer img)
|
|
|
|
#define write_simple_pixel(r) pdfbuf[pdfptr++] = *r++
|
|
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+#define write_noninterlaced(outmac) \
|
|
+ for (i = 0; i < (int)png_get_image_height(png_ptr(img), png_info(img)); i++) { \
|
|
+ png_read_row(png_ptr(img), row, NULL); \
|
|
+ r = row; \
|
|
+ k = png_get_rowbytes(png_ptr(img), png_info(img)); \
|
|
+ while(k > 0) { \
|
|
+ l = (k > pdfbufsize)? pdfbufsize : k; \
|
|
+ pdfroom(l); \
|
|
+ for (j = 0; j < l; j++) { \
|
|
+ outmac; \
|
|
+ } \
|
|
+ k -= l; \
|
|
+ } \
|
|
+ }
|
|
+
|
|
+#define write_interlaced(outmac) \
|
|
+ for (i = 0; i < (int)png_get_image_height(png_ptr(img), png_info(img)); i++) { \
|
|
+ row = rows[i]; \
|
|
+ k = png_get_rowbytes(png_ptr(img), png_info(img)); \
|
|
+ while(k > 0) { \
|
|
+ l = (k > pdfbufsize)? pdfbufsize : k; \
|
|
+ pdfroom(l); \
|
|
+ for (j = 0; j < l; j++) { \
|
|
+ outmac; \
|
|
+ } \
|
|
+ k -= l; \
|
|
+ } \
|
|
+ xfree(rows[i]); \
|
|
+ }
|
|
|
|
+#else
|
|
#define write_noninterlaced(outmac) \
|
|
for (i = 0; i < (int)png_info(img)->height; i++) { \
|
|
png_read_row(png_ptr(img), row, NULL); \
|
|
@@ -139,7 +199,7 @@ void read_png_info(integer img)
|
|
} \
|
|
xfree(rows[i]); \
|
|
}
|
|
-
|
|
+#endif
|
|
|
|
void write_png_palette(integer img)
|
|
{
|
|
@@ -148,25 +208,42 @@ void write_png_palette(integer img)
|
|
integer palette_objnum = 0;
|
|
pdfcreateobj(0, 0);
|
|
palette_objnum = objptr;
|
|
+ int num_palette;
|
|
+ png_colorp palette;
|
|
+ png_get_PLTE(png_ptr(img), png_info(img), &palette, &num_palette);
|
|
if (img_colorspace_ref(img) != 0) {
|
|
pdf_printf("%i 0 R\n", (int) img_colorspace_ref(img));
|
|
} else {
|
|
pdf_printf("[/Indexed /DeviceRGB %i %i 0 R]\n",
|
|
- (int) (png_info(img)->num_palette - 1),
|
|
+ (int) (num_palette - 1),
|
|
(int) palette_objnum);
|
|
}
|
|
pdfbeginstream();
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_interlace_type(png_ptr(img), png_info(img)) == PNG_INTERLACE_NONE) {
|
|
+ row = xtalloc(png_get_rowbytes(png_ptr(img), png_info(img)), png_byte);
|
|
+#else
|
|
if (png_info(img)->interlace_type == PNG_INTERLACE_NONE) {
|
|
row = xtalloc(png_info(img)->rowbytes, png_byte);
|
|
+#endif
|
|
write_noninterlaced(write_simple_pixel(r));
|
|
xfree(row);
|
|
} else {
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_image_height(png_ptr(img), png_info(img)) * png_get_rowbytes(png_ptr(img), png_info(img)) >= 10240000L)
|
|
+ pdftex_warn
|
|
+ ("large interlaced PNG might cause out of memory (use non-interlaced PNG to fix this)");
|
|
+ rows = xtalloc(png_get_image_height(png_ptr(img), png_info(img)), png_bytep);
|
|
+ for (i = 0; (unsigned) i < png_get_image_height(png_ptr(img), png_info(img)); i++)
|
|
+ rows[i] = xtalloc(png_get_rowbytes(png_ptr(img), png_info(img)), png_byte);
|
|
+#else
|
|
if (png_info(img)->height * png_info(img)->rowbytes >= 10240000L)
|
|
pdftex_warn
|
|
("large interlaced PNG might cause out of memory (use non-interlaced PNG to fix this)");
|
|
rows = xtalloc(png_info(img)->height, png_bytep);
|
|
for (i = 0; (unsigned) i < png_info(img)->height; i++)
|
|
rows[i] = xtalloc(png_info(img)->rowbytes, png_byte);
|
|
+#endif
|
|
png_read_image(png_ptr(img), rows);
|
|
write_interlaced(write_simple_pixel(row));
|
|
xfree(rows);
|
|
@@ -175,11 +252,12 @@ void write_png_palette(integer img)
|
|
if (palette_objnum > 0) {
|
|
pdfbegindict(palette_objnum, 0);
|
|
pdfbeginstream();
|
|
- for (i = 0; (unsigned) i < png_info(img)->num_palette; i++) {
|
|
+ png_get_PLTE(png_ptr(img), png_info(img), &palette, &num_palette);
|
|
+ for (i = 0; (unsigned) i < num_palette; i++) {
|
|
pdfroom(3);
|
|
- pdfbuf[pdfptr++] = png_info(img)->palette[i].red;
|
|
- pdfbuf[pdfptr++] = png_info(img)->palette[i].green;
|
|
- pdfbuf[pdfptr++] = png_info(img)->palette[i].blue;
|
|
+ pdfbuf[pdfptr++] = palette[i].red;
|
|
+ pdfbuf[pdfptr++] = palette[i].green;
|
|
+ pdfbuf[pdfptr++] = palette[i].blue;
|
|
}
|
|
pdfendstream();
|
|
}
|
|
@@ -195,17 +273,31 @@ void write_png_gray(integer img)
|
|
pdf_puts("/DeviceGray\n");
|
|
}
|
|
pdfbeginstream();
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_interlace_type(png_ptr(img), png_info(img)) == PNG_INTERLACE_NONE) {
|
|
+ row = xtalloc(png_get_rowbytes(png_ptr(img), png_info(img)), png_byte);
|
|
+#else
|
|
if (png_info(img)->interlace_type == PNG_INTERLACE_NONE) {
|
|
row = xtalloc(png_info(img)->rowbytes, png_byte);
|
|
+#endif
|
|
write_noninterlaced(write_simple_pixel(r));
|
|
xfree(row);
|
|
} else {
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_image_height(png_ptr(img), png_info(img)) * png_get_rowbytes(png_ptr(img), png_info(img)) >= 10240000L)
|
|
+ pdftex_warn
|
|
+ ("large interlaced PNG might cause out of memory (use non-interlaced PNG to fix this)");
|
|
+ rows = xtalloc(png_get_image_height(png_ptr(img), png_info(img)), png_bytep);
|
|
+ for (i = 0; (unsigned) i < png_get_image_height(png_ptr(img), png_info(img)); i++)
|
|
+ rows[i] = xtalloc(png_get_rowbytes(png_ptr(img), png_info(img)), png_byte);
|
|
+#else
|
|
if (png_info(img)->height * png_info(img)->rowbytes >= 10240000L)
|
|
pdftex_warn
|
|
("large interlaced PNG might cause out of memory (use non-interlaced PNG to fix this)");
|
|
rows = xtalloc(png_info(img)->height, png_bytep);
|
|
for (i = 0; (unsigned) i < png_info(img)->height; i++)
|
|
rows[i] = xtalloc(png_info(img)->rowbytes, png_byte);
|
|
+#endif
|
|
png_read_image(png_ptr(img), rows);
|
|
write_interlaced(write_simple_pixel(row));
|
|
xfree(rows);
|
|
@@ -232,26 +324,49 @@ void write_png_gray_alpha(integer img)
|
|
pdfcreateobj(0, 0);
|
|
smask_objnum = objptr;
|
|
pdf_printf("/SMask %i 0 R\n", (int) smask_objnum);
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ smask_size = (png_get_rowbytes(png_ptr(img), png_info(img)) / 2) * png_get_image_height(png_ptr(img), png_info(img));
|
|
+#else
|
|
smask_size = (png_info(img)->rowbytes / 2) * png_info(img)->height;
|
|
+#endif
|
|
smask = xtalloc(smask_size, png_byte);
|
|
pdfbeginstream();
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_interlace_type(png_ptr(img), png_info(img)) == PNG_INTERLACE_NONE) {
|
|
+ row = xtalloc(png_get_rowbytes(png_ptr(img), png_info(img)), png_byte);
|
|
+ if ((png_get_bit_depth(png_ptr(img), png_info(img)) == 16) && fixedimagehicolor) {
|
|
+#else
|
|
if (png_info(img)->interlace_type == PNG_INTERLACE_NONE) {
|
|
row = xtalloc(png_info(img)->rowbytes, png_byte);
|
|
if ((png_info(img)->bit_depth == 16) && fixedimagehicolor) {
|
|
+#endif
|
|
write_noninterlaced(write_gray_pixel_16(r));
|
|
} else {
|
|
write_noninterlaced(write_gray_pixel_8(r));
|
|
}
|
|
xfree(row);
|
|
} else {
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_image_height(png_ptr(img), png_info(img)) * png_get_rowbytes(png_ptr(img), png_info(img)) >= 10240000L)
|
|
+ pdftex_warn
|
|
+ ("large interlaced PNG might cause out of memory (use non-interlaced PNG to fix this)");
|
|
+ rows = xtalloc(png_get_image_height(png_ptr(img), png_info(img)), png_bytep);
|
|
+ for (i = 0; (unsigned) i < png_get_image_height(png_ptr(img), png_info(img)); i++)
|
|
+ rows[i] = xtalloc(png_get_rowbytes(png_ptr(img), png_info(img)), png_byte);
|
|
+#else
|
|
if (png_info(img)->height * png_info(img)->rowbytes >= 10240000L)
|
|
pdftex_warn
|
|
("large interlaced PNG might cause out of memory (use non-interlaced PNG to fix this)");
|
|
rows = xtalloc(png_info(img)->height, png_bytep);
|
|
for (i = 0; (unsigned) i < png_info(img)->height; i++)
|
|
rows[i] = xtalloc(png_info(img)->rowbytes, png_byte);
|
|
+#endif
|
|
png_read_image(png_ptr(img), rows);
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if ((png_get_bit_depth(png_ptr(img), png_info(img)) == 16) && fixedimagehicolor) {
|
|
+#else
|
|
if ((png_info(img)->bit_depth == 16) && fixedimagehicolor) {
|
|
+#endif
|
|
write_interlaced(write_gray_pixel_16(row));
|
|
} else {
|
|
write_interlaced(write_gray_pixel_8(row));
|
|
@@ -262,12 +377,21 @@ void write_png_gray_alpha(integer img)
|
|
pdfflush();
|
|
/* now write the Smask object */
|
|
if (smask_objnum > 0) {
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ bitdepth = (int) png_get_bit_depth(png_ptr(img), png_info(img));
|
|
+#else
|
|
bitdepth = (int) png_info(img)->bit_depth;
|
|
+#endif
|
|
pdfbegindict(smask_objnum, 0);
|
|
pdf_puts("/Type /XObject\n/Subtype /Image\n");
|
|
pdf_printf("/Width %i\n/Height %i\n/BitsPerComponent %i\n",
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ (int) png_get_image_width(png_ptr(img), png_info(img)),
|
|
+ (int) png_get_image_height(png_ptr(img), png_info(img)),
|
|
+#else
|
|
(int) png_info(img)->width,
|
|
(int) png_info(img)->height,
|
|
+#endif
|
|
(bitdepth == 16 ? 8 : bitdepth));
|
|
pdf_puts("/ColorSpace /DeviceGray\n");
|
|
pdfbeginstream();
|
|
@@ -293,17 +417,31 @@ void write_png_rgb(integer img)
|
|
pdf_puts("/DeviceRGB\n");
|
|
}
|
|
pdfbeginstream();
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_interlace_type(png_ptr(img), png_info(img)) == PNG_INTERLACE_NONE) {
|
|
+ row = xtalloc(png_get_rowbytes(png_ptr(img), png_info(img)), png_byte);
|
|
+#else
|
|
if (png_info(img)->interlace_type == PNG_INTERLACE_NONE) {
|
|
row = xtalloc(png_info(img)->rowbytes, png_byte);
|
|
+#endif
|
|
write_noninterlaced(write_simple_pixel(r));
|
|
xfree(row);
|
|
} else {
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_image_height(png_ptr(img), png_info(img)) * png_get_rowbytes(png_ptr(img), png_info(img)) >= 10240000L)
|
|
+ pdftex_warn
|
|
+ ("large interlaced PNG might cause out of memory (use non-interlaced PNG to fix this)");
|
|
+ rows = xtalloc(png_get_image_height(png_ptr(img), png_info(img)), png_bytep);
|
|
+ for (i = 0; (unsigned) i < png_get_image_height(png_ptr(img), png_info(img)); i++)
|
|
+ rows[i] = xtalloc(png_get_rowbytes(png_ptr(img), png_info(img)), png_byte);
|
|
+#else
|
|
if (png_info(img)->height * png_info(img)->rowbytes >= 10240000L)
|
|
pdftex_warn
|
|
("large interlaced PNG might cause out of memory (use non-interlaced PNG to fix this)");
|
|
rows = xtalloc(png_info(img)->height, png_bytep);
|
|
for (i = 0; (unsigned) i < png_info(img)->height; i++)
|
|
rows[i] = xtalloc(png_info(img)->rowbytes, png_byte);
|
|
+#endif
|
|
png_read_image(png_ptr(img), rows);
|
|
write_interlaced(write_simple_pixel(row));
|
|
xfree(rows);
|
|
@@ -328,26 +466,49 @@ void write_png_rgb_alpha(integer img)
|
|
pdfcreateobj(0, 0);
|
|
smask_objnum = objptr;
|
|
pdf_printf("/SMask %i 0 R\n", (int) smask_objnum);
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ smask_size = (png_get_rowbytes(png_ptr(img), png_info(img)) / 2) * png_get_image_height(png_ptr(img), png_info(img));
|
|
+#else
|
|
smask_size = (png_info(img)->rowbytes / 2) * png_info(img)->height;
|
|
+#endif
|
|
smask = xtalloc(smask_size, png_byte);
|
|
pdfbeginstream();
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_interlace_type(png_ptr(img), png_info(img)) == PNG_INTERLACE_NONE) {
|
|
+ row = xtalloc(png_get_rowbytes(png_ptr(img), png_info(img)), png_byte);
|
|
+ if ((png_get_bit_depth(png_ptr(img), png_info(img)) == 16) && fixedimagehicolor) {
|
|
+#else
|
|
if (png_info(img)->interlace_type == PNG_INTERLACE_NONE) {
|
|
row = xtalloc(png_info(img)->rowbytes, png_byte);
|
|
if ((png_info(img)->bit_depth == 16) && fixedimagehicolor) {
|
|
+#endif
|
|
write_noninterlaced(write_rgb_pixel_16(r));
|
|
} else {
|
|
write_noninterlaced(write_rgb_pixel_8(r));
|
|
}
|
|
xfree(row);
|
|
} else {
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_image_height(png_ptr(img), png_info(img)) * png_get_rowbytes(png_ptr(img), png_info(img)) >= 10240000L)
|
|
+ pdftex_warn
|
|
+ ("large interlaced PNG might cause out of memory (use non-interlaced PNG to fix this)");
|
|
+ rows = xtalloc(png_get_image_height(png_ptr(img), png_info(img)), png_bytep);
|
|
+ for (i = 0; (unsigned) i < png_get_image_height(png_ptr(img), png_info(img)); i++)
|
|
+ rows[i] = xtalloc(png_get_rowbytes(png_ptr(img), png_info(img)), png_byte);
|
|
+#else
|
|
if (png_info(img)->height * png_info(img)->rowbytes >= 10240000L)
|
|
pdftex_warn
|
|
("large interlaced PNG might cause out of memory (use non-interlaced PNG to fix this)");
|
|
rows = xtalloc(png_info(img)->height, png_bytep);
|
|
for (i = 0; (unsigned) i < png_info(img)->height; i++)
|
|
rows[i] = xtalloc(png_info(img)->rowbytes, png_byte);
|
|
+#endif
|
|
png_read_image(png_ptr(img), rows);
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if ((png_get_bit_depth(png_ptr(img), png_info(img)) == 16) && fixedimagehicolor) {
|
|
+#else
|
|
if ((png_info(img)->bit_depth == 16) && fixedimagehicolor) {
|
|
+#endif
|
|
write_interlaced(write_rgb_pixel_16(row));
|
|
} else {
|
|
write_interlaced(write_rgb_pixel_8(row));
|
|
@@ -358,12 +519,21 @@ void write_png_rgb_alpha(integer img)
|
|
pdfflush();
|
|
/* now write the Smask object */
|
|
if (smask_objnum > 0) {
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ bitdepth = (int) png_get_bit_depth(png_ptr(img), png_info(img));
|
|
+#else
|
|
bitdepth = (int) png_info(img)->bit_depth;
|
|
+#endif
|
|
pdfbegindict(smask_objnum, 0);
|
|
pdf_puts("/Type /XObject\n/Subtype /Image\n");
|
|
pdf_printf("/Width %i\n/Height %i\n/BitsPerComponent %i\n",
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ (int) png_get_image_width(png_ptr(img), png_info(img)),
|
|
+ (int) png_get_image_height(png_ptr(img), png_info(img)),
|
|
+#else
|
|
(int) png_info(img)->width,
|
|
(int) png_info(img)->height,
|
|
+#endif
|
|
(bitdepth == 16 ? 8 : bitdepth));
|
|
pdf_puts("/ColorSpace /DeviceGray\n");
|
|
pdfbeginstream();
|
|
@@ -406,7 +576,11 @@ static int spng_getint(FILE * fp)
|
|
|
|
void copy_png(integer img)
|
|
{
|
|
+#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4
|
|
+ FILE *fp = (FILE *) png_get_io_ptr(png_ptr(img));
|
|
+#else
|
|
FILE *fp = (FILE *) png_ptr(img)->io_ptr;
|
|
+#endif
|
|
int i, len, type, streamlength = 0;
|
|
boolean endflag = false;
|
|
int idat = 0; /* flag to check continuous IDAT chunks sequence */
|
|
@@ -430,9 +604,15 @@ void copy_png(integer img)
|
|
pdf_printf("/Length %d\n", streamlength);
|
|
pdf_printf("/Filter /FlateDecode\n");
|
|
pdf_printf("/DecodeParms << ");
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ pdf_printf("/Colors %d ", png_get_color_type(png_ptr(img), png_info(img)) == 2 ? 3 : 1);
|
|
+ pdf_printf("/Columns %d ", (int) png_get_image_width(png_ptr(img), png_info(img)));
|
|
+ pdf_printf("/BitsPerComponent %i ", (int) png_get_bit_depth(png_ptr(img), png_info(img)));
|
|
+#else
|
|
pdf_printf("/Colors %d ", png_info(img)->color_type == 2 ? 3 : 1);
|
|
pdf_printf("/Columns %d ", (int) png_info(img)->width);
|
|
pdf_printf("/BitsPerComponent %i ", (int) png_info(img)->bit_depth);
|
|
+#endif
|
|
pdf_printf("/Predictor %d ", 10); /* actual predictor defined on line basis */
|
|
pdf_printf(">>\n>>\nstream\n");
|
|
/* 2nd pass to copy data */
|
|
@@ -481,8 +661,13 @@ void write_png(integer img)
|
|
|
|
pdf_puts("/Type /XObject\n/Subtype /Image\n");
|
|
pdf_printf("/Width %i\n/Height %i\n/BitsPerComponent %i\n",
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ (int) png_get_image_width(png_ptr(img), png_info(img)),
|
|
+ (int) png_get_image_height(png_ptr(img), png_info(img)), (int) png_get_bit_depth(png_ptr(img), png_info(img)));
|
|
+#else
|
|
(int) png_info(img)->width,
|
|
(int) png_info(img)->height, (int) png_info(img)->bit_depth);
|
|
+#endif
|
|
pdf_puts("/ColorSpace ");
|
|
checked_gamma = 1.0;
|
|
if (fixedimageapplygamma) {
|
|
@@ -492,23 +677,37 @@ void write_png(integer img)
|
|
checked_gamma = (fixedgamma / 1000.0) * (1000.0 / fixedimagegamma);
|
|
}
|
|
}
|
|
+ int num_palette;
|
|
+ png_colorp palette;
|
|
+ png_get_PLTE(png_ptr(img), png_info(img), &palette, &num_palette);
|
|
/* the switching between |png_info| and |png_ptr| queries has been trial and error.
|
|
*/
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (fixedpdfminorversion > 1 && png_get_interlace_type(png_ptr(img), png_info(img)) == PNG_INTERLACE_NONE /* gamma */
|
|
+ &&!(png_get_color_type(png_ptr(img), png_info(img)) == PNG_COLOR_TYPE_GRAY_ALPHA ||
|
|
+ png_get_color_type(png_ptr(img), png_info(img)) == PNG_COLOR_TYPE_RGB_ALPHA)
|
|
+ && (fixedimagehicolor || (png_get_bit_depth(png_ptr(img), png_info(img)) <= 8))
|
|
+#else
|
|
if (fixedpdfminorversion > 1 && png_info(img)->interlace_type == PNG_INTERLACE_NONE && (png_ptr(img)->transformations == 0 || png_ptr(img)->transformations == 0x2000) /* gamma */
|
|
&&!(png_ptr(img)->color_type == PNG_COLOR_TYPE_GRAY_ALPHA ||
|
|
png_ptr(img)->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
|
&& (fixedimagehicolor || (png_ptr(img)->bit_depth <= 8))
|
|
+#endif
|
|
&& (checked_gamma <= 1.01 && checked_gamma > 0.99)
|
|
) {
|
|
if (img_colorspace_ref(img) != 0) {
|
|
pdf_printf("%i 0 R\n", (int) img_colorspace_ref(img));
|
|
} else {
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ switch (png_get_color_type(png_ptr(img), png_info(img))) {
|
|
+#else
|
|
switch (png_info(img)->color_type) {
|
|
+#endif
|
|
case PNG_COLOR_TYPE_PALETTE:
|
|
pdfcreateobj(0, 0);
|
|
palette_objnum = objptr;
|
|
pdf_printf("[/Indexed /DeviceRGB %i %i 0 R]\n",
|
|
- (int) (png_info(img)->num_palette - 1),
|
|
+ (int) (num_palette - 1),
|
|
(int) palette_objnum);
|
|
break;
|
|
case PNG_COLOR_TYPE_GRAY:
|
|
@@ -523,11 +722,12 @@ void write_png(integer img)
|
|
if (palette_objnum > 0) {
|
|
pdfbegindict(palette_objnum, 0);
|
|
pdfbeginstream();
|
|
- for (i = 0; i < png_info(img)->num_palette; i++) {
|
|
+ png_get_PLTE(png_ptr(img), png_info(img), &palette, &num_palette);
|
|
+ for (i = 0; i < num_palette; i++) {
|
|
pdfroom(3);
|
|
- pdfbuf[pdfptr++] = png_info(img)->palette[i].red;
|
|
- pdfbuf[pdfptr++] = png_info(img)->palette[i].green;
|
|
- pdfbuf[pdfptr++] = png_info(img)->palette[i].blue;
|
|
+ pdfbuf[pdfptr++] = palette[i].red;
|
|
+ pdfbuf[pdfptr++] = palette[i].green;
|
|
+ pdfbuf[pdfptr++] = palette[i].blue;
|
|
}
|
|
pdfendstream();
|
|
}
|
|
@@ -537,23 +737,37 @@ void write_png(integer img)
|
|
if (fixedimageapplygamma &&
|
|
(checked_gamma > 1.01 || checked_gamma < 0.99))
|
|
tex_printf("gamma delta=%lf ", checked_gamma);
|
|
- if (png_ptr(img)->transformations != PNG_TRANSFORM_IDENTITY)
|
|
- tex_printf("transform=%lu",
|
|
- (long) png_ptr(img)->transformations);
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if ((png_get_color_type(png_ptr(img), png_info(img)) != PNG_COLOR_TYPE_GRAY)
|
|
+ && (png_get_color_type(png_ptr(img), png_info(img)) != PNG_COLOR_TYPE_RGB)
|
|
+ && (png_get_color_type(png_ptr(img), png_info(img)) != PNG_COLOR_TYPE_PALETTE))
|
|
+#else
|
|
if ((png_info(img)->color_type != PNG_COLOR_TYPE_GRAY)
|
|
&& (png_info(img)->color_type != PNG_COLOR_TYPE_RGB)
|
|
&& (png_info(img)->color_type != PNG_COLOR_TYPE_PALETTE))
|
|
+#endif
|
|
tex_printf("colortype ");
|
|
if (fixedpdfminorversion <= 1)
|
|
tex_printf("version=%d ", (int) fixedpdfminorversion);
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ if (png_get_interlace_type(png_ptr(img), png_info(img)) != PNG_INTERLACE_NONE)
|
|
+ tex_printf("interlaced ");
|
|
+ if (png_get_bit_depth(png_ptr(img), png_info(img)) > 8)
|
|
+ tex_printf("bitdepth=%d ", png_get_bit_depth(png_ptr(img), png_info(img)));
|
|
+#else
|
|
if (png_info(img)->interlace_type != PNG_INTERLACE_NONE)
|
|
tex_printf("interlaced ");
|
|
if (png_info(img)->bit_depth > 8)
|
|
tex_printf("bitdepth=%d ", png_info(img)->bit_depth);
|
|
+#endif
|
|
if (png_get_valid(png_ptr(img), png_info(img), PNG_INFO_tRNS))
|
|
tex_printf("simple transparancy ");
|
|
}
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ switch (png_get_color_type(png_ptr(img), png_info(img))) {
|
|
+#else
|
|
switch (png_info(img)->color_type) {
|
|
+#endif
|
|
case PNG_COLOR_TYPE_PALETTE:
|
|
write_png_palette(img);
|
|
break;
|
|
@@ -577,7 +791,11 @@ void write_png(integer img)
|
|
break;
|
|
default:
|
|
pdftex_fail("unsupported type of color_type <%i>",
|
|
+#if (PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4) && defined(PNG_EASY_ACCESS_SUPPORTED)
|
|
+ png_get_color_type(png_ptr(img), png_info(img)));
|
|
+#else
|
|
png_info(img)->color_type);
|
|
+#endif
|
|
}
|
|
}
|
|
pdfflush();
|