Imported from libpng-1.0.1a.tar

This commit is contained in:
Glenn Randers-Pehrson 1998-04-21 15:03:57 -05:00
parent f9f2fe0ce7
commit 896239be20
35 changed files with 1412 additions and 769 deletions

26
ANNOUNCE Normal file
View File

@ -0,0 +1,26 @@
Libpng 1.0.1a April 21, 1998
This is not intended to be a public release. It will be replaced
within a few weeks by a public version or by another test version.
Changes since the last release:
Optimized Paeth calculations by replacing abs() function calls with intrinsics
plus other loop optimizations. Improves avg decoding speed by about 20 percent.
Commented out i386istic "align" compiler flags in makefile.lnx.
Reduced the default warning level in some makefiles, to make them consistent.
Removed references to IJG and JPEG in the ansi2knr.c copyright statement.
Fixed a bug in png_do_strip_filler with XXRRGGBB => RRGGBB transformation.
Added grayscale and 16-bit capability to png_do_read_filler().
Fixed a bug in pngset.c, introduced in version 0.99c, that sets rowbytes
too large when writing an image with bit_depth < 8 (Bob Dellaca).
Corrected some bugs in the experimental weighted filtering heuristics.
Moved a misplaced pngrutil code block that truncates tRNS if it has more
than num_palette entries -- test was done before num_palette was defined.
Fixed a png_convert_to_rfc1123() bug that converts day 31 to 0 (Steve Eddins).
Send comments/corrections/commendations to
png-implement@dworkin.wustl.edu or to randeg@alumni.rpi.edu
Glenn R-P

17
CHANGES
View File

@ -283,6 +283,21 @@ version 1.0.0b [March 13, 1998]
Minor changes to makefile.s2x Minor changes to makefile.s2x
Removed #ifdef/#endif around a png_free() in pngread.c Removed #ifdef/#endif around a png_free() in pngread.c
version 1.0.1 [March 14, 1998] version 1.0.1 [March 14, 1998]
Changes makefile.s2x to reduce security risk of using a relative pathname Changed makefile.s2x to reduce security risk of using a relative pathname
Fixed some typos in the documentation (Greg). Fixed some typos in the documentation (Greg).
Fixed a problem with value of "channels" returned by png_read_update_info() Fixed a problem with value of "channels" returned by png_read_update_info()
version 1.0.1a [April 21, 1998]
Optimized Paeth calculations by replacing abs() function calls with intrinsics
plus other loop optimizations. Improves avg decoding speed by about 20%.
Commented out i386istic "align" compiler flags in makefile.lnx.
Reduced the default warning level in some makefiles, to make them consistent.
Removed references to IJG and JPEG in the ansi2knr.c copyright statement.
Fixed a bug in png_do_strip_filler with XXRRGGBB => RRGGBB transformation.
Added grayscale and 16-bit capability to png_do_read_filler().
Fixed a bug in pngset.c, introduced in version 0.99c, that sets rowbytes
too large when writing an image with bit_depth < 8 (Bob Dellaca).
Corrected some bugs in the experimental weighted filtering heuristics.
Moved a misplaced pngrutil code block that truncates tRNS if it has more
than num_palette entries -- test was done before num_palette was defined.
Fixed a png_convert_to_rfc1123() bug that converts day 31 to 0 (Steve Eddins).
Changed compiler flags in makefile.wat for better optimization (Pawel Mrochen)

View File

@ -1,5 +1,5 @@
Installing libpng version 1.0.1 March 15, 1998 Installing libpng version %VER% %DATE%
Before installing libpng, you must first install zlib. zlib Before installing libpng, you must first install zlib. zlib
can usually be found wherever you got libpng. zlib can be can usually be found wherever you got libpng. zlib can be
@ -10,7 +10,7 @@ zlib.h and zconf.h include files that correspond to the
version of zlib that's installed. version of zlib that's installed.
You can rename the directories that you downloaded (they You can rename the directories that you downloaded (they
might be called "libpng-1.0.1 or "lpng100" and "zlib-1.1.1" might be called "libpng-%VER% or "lpng100" and "zlib-1.1.1"
or "zlib111") so that you have directories called "zlib" and "libpng". or "zlib111") so that you have directories called "zlib" and "libpng".
Your directory structure should look like this: Your directory structure should look like this:

113
KNOWNBUG Normal file
View File

@ -0,0 +1,113 @@
Known bugs and suggested enhancements in libpng-1.0.1
1. March 13, 1998 -- BUG -- pngtrans.c:
row_info->channels should be updated --
row_info->color_type should be updated --
STATUS: I think this is all fixed in libpng-1.0.1a but needs
to be tested.
2. March 14, 1998 -- ENHANCEMENT -- Glenn
We should add the G>GA, G>GX, G>AG, and G>XG transformations
in png_do_read_filler()
STATUS: Implemented in libpng-1.0.1a
3. March 14, 1998 -- BUG? -- Greg Roelofs
pngrtran.c: if-test for channels/FILLER may be incorrect
STATUS: Under investigation
4. March 15, 1998 -- BUG -- Kevin Bracey
pngwtran.c:
line 306: loop should count to row_info->width, not to
row_info->width*row_info->channnels
STATUS: Fixed in libpng-1.0.1a
5. March 15, 1998 -- OPTIMIZATION -- Kevin Bracey
Loops need to be optimized everywhere
a. Make them count down instead of up -- Kevin Bracey
Optimizing compilers don't need this, and making
the change would be error prone -- Tom Lane, Glenn R-P
Question whether i-- or --i is better.
STATUS: Under investigation.
b. Remove products and structure members from loop tests -- Glenn R-P
Can be accomplished without messing with loop guts. This
was shown to be effective on optimized SGI compiler:
replace
png_uint_32 i;
for(i=0; i < s->a*s->b; i++)
with
png_uint_32 i, count;
istop = s->a*s->b;
for(i=0; i<istop; i++)
STATUS: Mostly done in libpng-1.0.1a, done for all important loops.
c. Replace abs() with intrinsic ternary operations in Paeth
filtering -- Glenn R-P
STATUS: Done in libpng-1.0.1a
(can be restored to original behavior with #define PNG_USE_ABS)
d. In pngwutil.c, make separate simple loops to use when filter
heuristic sums aren't needed. -- Glenn R-P
STATUS: Done in libpng-1.0.1a
6. April 6, 1998 -- BUG -- bug in pngset.c (rowbytes too large) -- Bob Dellaca
pngset.c has a bug, introduced in version 0.99c, that sets rowbytes
too large when writing an image with bit_depth < 8
STATUS: Fixed in libpng-1.0.1a
7. April 10, 1998 -- BUG -- pngwutil weighted filtering bugs -- Glenn R-P
pngwutil.c has some bugs in the experimental weighted filter
algorithm (PNG_FILTER_XXX should be PNG_FILTER_VALUE_XXX in
several places)
STATUS: Andreas concurs. Fixed in libpng-1.0.1a
8. April 10, 1998 -- ENHANCEMENT -- run-time selection of malloc function
-- Bob Dellaca
pngmem.c currently provides a compile-time option to replace
png_malloc() and png_free(). It's been requested that these
be made possible at run time, via calls to new png_set_malloc_fn()
and png_set_free_fn() functions.
STATUS: Will do in libpng-1.0.1b
9. April 11, 1998 -- BUG -- incorrect truncation of tRNS data in
illegal PNG file where tRNS precedes PLTE -- Larry Reeve
There is a misplaced pngrutil code block that truncates tRNS if it has
more than num_palette entries -- test was done before num_palette was
defined. Although the PNG file is illegal, it shouldn't crash apps.
There is a simple fix; just moving the test to the point after
num_palette has been defined.
STATUS: Fixed in libpng-1.0.1a
10. April 16, 1998 -- BUG -- incorrect operation of png_convert_to_rfc1123
with 31st day of the month -- Steve Eddins
The "ptime->date % 31" is wrong, should be "ptime->date % 32".
STATUS: Fixed in libpng-1.0.1a

2
README
View File

@ -1,4 +1,4 @@
README for libpng 1.0.1 (shared library 2.1) README for libpng %VER% (shared library 2.1)
See the note about version numbers near the top of png.h See the note about version numbers near the top of png.h
See INSTALL for instructions on how to install libpng. See INSTALL for instructions on how to install libpng.

1
TODO
View File

@ -2,7 +2,6 @@ TODO - list of things to do for libpng
fix problem with C++ and EXTERN "C" fix problem with C++ and EXTERN "C"
add "grayscale->palette" transformation and "palette->grayscale" detection add "grayscale->palette" transformation and "palette->grayscale" detection
add "grayscale" -> "grayscale+alpha" and "grayscale+FILLER" transformations
improved dithering improved dithering
multi-lingual error and warning message support multi-lingual error and warning message support
sPLT chunk handling sPLT chunk handling

View File

@ -1,7 +1,9 @@
/* ansi2knr.c */ /* ansi2knr.c */
/* Convert ANSI C function definitions to K&R ("traditional C") syntax */
/* /* Convert ANSI C function definitions to K&R ("traditional C") syntax
Copyright (C) 1989 Aladdin Enterprises. All rights reserved.
Copyright (C) 1988 Richard M. Stallman
ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY. No author or distributor accepts responsibility to anyone for the WARRANTY. No author or distributor accepts responsibility to anyone for the
consequences of using it or for whether it serves any particular purpose or consequences of using it or for whether it serves any particular purpose or
@ -12,12 +14,12 @@ Everyone is granted permission to copy, modify and redistribute ansi2knr,
but only under the conditions described in the GPL. A copy of this license but only under the conditions described in the GPL. A copy of this license
is supposed to have been given to you along with ansi2knr so you can know is supposed to have been given to you along with ansi2knr so you can know
your rights and responsibilities. It should be in a file named COPYLEFT. your rights and responsibilities. It should be in a file named COPYLEFT.
[In the IJG distribution, the GPL appears below, not in a separate file.] [In the LIBPNG distribution, the GPL appears below, not in a separate file.]
Among other things, the copyright notice and this notice must be preserved Among other things, the copyright notice and this notice must be preserved
on all copies. on all copies.
We explicitly state here what we believe is already implied by the GPL: if We explicitly state here what we believe is already implied by the GPL: if
the ansi2knr program is distributed as a separate set of sources and a the ansi2knr program is distributed as a separate source file and a
separate executable file which are aggregated on a storage medium together separate executable file which are aggregated on a storage medium together
with another program, this in itself does not bring the other program under with another program, this in itself does not bring the other program under
the GPL, nor does the mere fact that such a program or the procedures for the GPL, nor does the mere fact that such a program or the procedures for
@ -27,7 +29,7 @@ program under the GPL.
/* /*
---------- Here is the GNU GPL file COPYLEFT, referred to above ---------- ---------- Here is the GNU GPL file COPYLEFT, referred to above ----------
----- These terms do NOT apply to the JPEG software itself; see README ------ ----- These terms do NOT apply to the LIBPNG software itself; see README ------
GHOSTSCRIPT GENERAL PUBLIC LICENSE GHOSTSCRIPT GENERAL PUBLIC LICENSE
(Clarified 11 Feb 1988) (Clarified 11 Feb 1988)

View File

@ -1,4 +1,4 @@
.TH LIBPNG 3 "March 15, 1998" .TH LIBPNG 3 "April 21, 1998"
.SH NAME .SH NAME
libpng \- Portable Network Graphics (PNG) Reference Library libpng \- Portable Network Graphics (PNG) Reference Library
.SH SYNOPSIS .SH SYNOPSIS
@ -396,7 +396,7 @@ Following is a copy of the libpng.txt file that accompanies libpng.
.SH LIBPNG.TXT .SH LIBPNG.TXT
libpng.txt - A description on how to use and modify libpng libpng.txt - A description on how to use and modify libpng
libpng version 1.0.1 March 15, 1998 libpng version 1.0.1a April 21, 1998
Updated and distributed by Glenn Randers-Pehrson Updated and distributed by Glenn Randers-Pehrson
<randeg@alumni.rpi.edu> <randeg@alumni.rpi.edu>
Copyright (c) 1998, Glenn Randers-Pehrson Copyright (c) 1998, Glenn Randers-Pehrson
@ -876,7 +876,10 @@ in RGBRGBRGB format unless png_set_filler() is called to insert filler
bytes, either before or after each RGB triplet. 16-bit RGB data will bytes, either before or after each RGB triplet. 16-bit RGB data will
be returned RRGGBB RRGGBB, with the most significant byte of the color be returned RRGGBB RRGGBB, with the most significant byte of the color
value first, unless png_set_strip_16() is called to transform it to value first, unless png_set_strip_16() is called to transform it to
regular RGBRGB triplets. regular RGB RGB triplets, or png_set_filler() is called to insert
filler bytes, either before or after each RRGGBB triplet. Similarly,
8-bit or 16-bit grayscale data can be modified with png_set_filler()
or png_set_strip_16().
The following code transforms grayscale images of less than 8 to 8 bits, The following code transforms grayscale images of less than 8 to 8 bits,
changes paletted images to RGB, and adds a full alpha channel if there is changes paletted images to RGB, and adds a full alpha channel if there is
@ -952,7 +955,7 @@ into 4 bytes for windowing systems that need them in this format:
PNG_COLOR_TYPE_RGB) png_set_filler(png_ptr, PNG_COLOR_TYPE_RGB) png_set_filler(png_ptr,
filler, PNG_FILLER_BEFORE); filler, PNG_FILLER_BEFORE);
where "filler" is the number to fill with, and the location is where "filler" is the 8 or 16-bit number to fill with, and the location is
either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
you want the filler before the RGB or after. This transformation you want the filler before the RGB or after. This transformation
does not affect images that already have full alpha channels. does not affect images that already have full alpha channels.
@ -1412,6 +1415,8 @@ png_infop info_ptr;
*/ */
} }
.SH IV. Writing .SH IV. Writing
Much of this is very similar to reading. However, everything of Much of this is very similar to reading. However, everything of
@ -1504,9 +1509,9 @@ not calling this function at all, as it has been tuned to deliver a good
speed/compression ratio. The second parameter to png_set_filter() is speed/compression ratio. The second parameter to png_set_filter() is
the filter method, for which the only valid value is '0' (as of the the filter method, for which the only valid value is '0' (as of the
October 1996 PNG specification, version 1.0). The third parameter is a October 1996 PNG specification, version 1.0). The third parameter is a
flag that indicates flag that indicates which filter type(s) are to be tested for each
which filter type(s) are to be tested for each scanline. See the scanline. See the Compression Library for details on the specific filter
Compression Library for details on the specific filter types. types.
/* turn on or off filtering, and/or choose /* turn on or off filtering, and/or choose
@ -1780,8 +1785,9 @@ checks to see if it has data that it can do something with, you should
make sure to only enable a transformation if it will be valid for the make sure to only enable a transformation if it will be valid for the
data. For example, don't swap red and blue on grayscale data. data. For example, don't swap red and blue on grayscale data.
PNG files store RGB pixels packed into 3 bytes. This code tells PNG files store RGB pixels packed into 3 or 6 bytes. This code tells
the library to expect input data with 4 bytes per pixel the library to expand the input data to 4 or 8 bytes per pixel
(or expand 1 or 2-byte grayscale data to 2 or 4 bytes per pixel).
png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
@ -1899,11 +1905,11 @@ times, or any of that other stuff necessary with png_write_rows().
where row_pointers is: where row_pointers is:
png_bytef *row_pointers[height]; png_byte *row_pointers[height];
You can point to void or char or whatever you use for pixels. You can point to void or char or whatever you use for pixels.
If you can't want to write the whole image at once, you can If you don't want to write the whole image at once, you can
use png_write_rows() instead. If the file is not interlaced, use png_write_rows() instead. If the file is not interlaced,
this is simple: this is simple:
@ -2366,7 +2372,7 @@ possible without all of you.
Thanks to Frank J. T. Wojcik for helping with the documentation. Thanks to Frank J. T. Wojcik for helping with the documentation.
Libpng version 1.0.1 March 15, 1998: Libpng version 1.0.1a April 21, 1998:
Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc. Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc.
Currently maintained by Glenn Randers-Pehrson (randeg@alumni.rpi.edu). Currently maintained by Glenn Randers-Pehrson (randeg@alumni.rpi.edu).

View File

@ -1,6 +1,6 @@
libpng.txt - A description on how to use and modify libpng libpng.txt - A description on how to use and modify libpng
libpng version 1.0.1 March 15, 1998 libpng version 1.0.1a April 21, 1998
Updated and distributed by Glenn Randers-Pehrson Updated and distributed by Glenn Randers-Pehrson
<randeg@alumni.rpi.edu> <randeg@alumni.rpi.edu>
Copyright (c) 1998, Glenn Randers-Pehrson Copyright (c) 1998, Glenn Randers-Pehrson
@ -22,7 +22,7 @@ libpng.txt - A description on how to use and modify libpng
Copyright (c) 1995 Frank J. T. Wojcik Copyright (c) 1995 Frank J. T. Wojcik
December 18, 1995 && January 20, 1996 December 18, 1995 && January 20, 1996
Introduction I. Introduction
This file describes how to use and modify the PNG reference library This file describes how to use and modify the PNG reference library
(known as libpng) for your own use. There are five sections to this (known as libpng) for your own use. There are five sections to this
@ -480,7 +480,10 @@ in RGBRGBRGB format unless png_set_filler() is called to insert filler
bytes, either before or after each RGB triplet. 16-bit RGB data will bytes, either before or after each RGB triplet. 16-bit RGB data will
be returned RRGGBB RRGGBB, with the most significant byte of the color be returned RRGGBB RRGGBB, with the most significant byte of the color
value first, unless png_set_strip_16() is called to transform it to value first, unless png_set_strip_16() is called to transform it to
regular RGBRGB triplets. regular RGB RGB triplets, or png_set_filler() is called to insert
filler bytes, either before or after each RRGGBB triplet. Similarly,
8-bit or 16-bit grayscale data can be modified with png_set_filler()
or png_set_strip_16().
The following code transforms grayscale images of less than 8 to 8 bits, The following code transforms grayscale images of less than 8 to 8 bits,
changes paletted images to RGB, and adds a full alpha channel if there is changes paletted images to RGB, and adds a full alpha channel if there is
@ -556,7 +559,7 @@ into 4 bytes for windowing systems that need them in this format:
PNG_COLOR_TYPE_RGB) png_set_filler(png_ptr, PNG_COLOR_TYPE_RGB) png_set_filler(png_ptr,
filler, PNG_FILLER_BEFORE); filler, PNG_FILLER_BEFORE);
where "filler" is the number to fill with, and the location is where "filler" is the 8 or 16-bit number to fill with, and the location is
either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
you want the filler before the RGB or after. This transformation you want the filler before the RGB or after. This transformation
does not affect images that already have full alpha channels. does not affect images that already have full alpha channels.
@ -1110,9 +1113,9 @@ not calling this function at all, as it has been tuned to deliver a good
speed/compression ratio. The second parameter to png_set_filter() is speed/compression ratio. The second parameter to png_set_filter() is
the filter method, for which the only valid value is '0' (as of the the filter method, for which the only valid value is '0' (as of the
October 1996 PNG specification, version 1.0). The third parameter is a October 1996 PNG specification, version 1.0). The third parameter is a
flag that indicates flag that indicates which filter type(s) are to be tested for each
which filter type(s) are to be tested for each scanline. See the scanline. See the Compression Library for details on the specific filter
Compression Library for details on the specific filter types. types.
/* turn on or off filtering, and/or choose /* turn on or off filtering, and/or choose
@ -1386,8 +1389,9 @@ checks to see if it has data that it can do something with, you should
make sure to only enable a transformation if it will be valid for the make sure to only enable a transformation if it will be valid for the
data. For example, don't swap red and blue on grayscale data. data. For example, don't swap red and blue on grayscale data.
PNG files store RGB pixels packed into 3 bytes. This code tells PNG files store RGB pixels packed into 3 or 6 bytes. This code tells
the library to expect input data with 4 bytes per pixel the library to expand the input data to 4 or 8 bytes per pixel
(or expand 1 or 2-byte grayscale data to 2 or 4 bytes per pixel).
png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
@ -1505,11 +1509,11 @@ times, or any of that other stuff necessary with png_write_rows().
where row_pointers is: where row_pointers is:
png_bytef *row_pointers[height]; png_byte *row_pointers[height];
You can point to void or char or whatever you use for pixels. You can point to void or char or whatever you use for pixels.
If you can't want to write the whole image at once, you can If you don't want to write the whole image at once, you can
use png_write_rows() instead. If the file is not interlaced, use png_write_rows() instead. If the file is not interlaced,
this is simple: this is simple:
@ -1886,4 +1890,3 @@ to set the error callbacks AFTER png_read_init(), or to change them with
png_set_error_fn(), which is essentially the same function, but with a png_set_error_fn(), which is essentially the same function, but with a
new name to force compilation errors with applications that try to use new name to force compilation errors with applications that try to use
the old method. the old method.

View File

@ -1,4 +1,4 @@
.TH LIBPNGPF 3 "March 15, 1998" .TH LIBPNGPF 3 "April 21, 1998"
.SH NAME .SH NAME
libpng \- Portable Network Graphics (PNG) Reference Library libpng \- Portable Network Graphics (PNG) Reference Library
(private functions) (private functions)

2
png.5
View File

@ -1,4 +1,4 @@
.TH PNG 5 "March 15, 1998" .TH PNG 5 "April 21, 1998"
.SH NAME .SH NAME
png \- Portable Network Graphics (PNG) format png \- Portable Network Graphics (PNG) format
.SH DESCRIPTION .SH DESCRIPTION

6
png.c
View File

@ -1,12 +1,12 @@
/* png.c - location for general purpose libpng functions /* png.c - location for general purpose libpng functions
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
*/ */
#define PNG_INTERNAL #define PNG_INTERNAL
@ -16,7 +16,7 @@
/* Version information for C files. This had better match the version /* Version information for C files. This had better match the version
* string defined in png.h. * string defined in png.h.
*/ */
char png_libpng_ver[12] = "1.0.1"; char png_libpng_ver[12] = "1.0.1a";
/* Place to hold the signature string for a PNG file. */ /* Place to hold the signature string for a PNG file. */
png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10}; png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};

18
png.h
View File

@ -1,12 +1,12 @@
/* png.h - header file for PNG reference library /* png.h - header file for PNG reference library
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see the COPYRIGHT NOTICE below. * For conditions of distribution and use, see the COPYRIGHT NOTICE below.
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998 Glenn Randers-Pehrson * Copyright (c) 1998 Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
* *
* Note about libpng version numbers: * Note about libpng version numbers:
* *
@ -31,6 +31,7 @@
* 1.00 1.00 100 2.1.0 [int should be 10000] * 1.00 1.00 100 2.1.0 [int should be 10000]
* 1.0.0 1.0.0 100 2.1.0 [int should be 10000] * 1.0.0 1.0.0 100 2.1.0 [int should be 10000]
* 1.0.1 1.0.1 10001 2.1.0 * 1.0.1 1.0.1 10001 2.1.0
* 1.0.1a 1.0.1a 10002 2.1.0
* *
* Henceforth the source version will match the shared-library minor * Henceforth the source version will match the shared-library minor
* and patch numbers; the shared-library major version number will be * and patch numbers; the shared-library major version number will be
@ -39,9 +40,8 @@
* is available for applications, is an unsigned integer of the form * is available for applications, is an unsigned integer of the form
* xyyzz corresponding to the source version x.y.z (leading zeros in y and z). * xyyzz corresponding to the source version x.y.z (leading zeros in y and z).
* *
* * See libpng.txt or libpng.3 for more information. The PNG specification is
* See libpng.txt for more information. The PNG specification is available * available as RFC 2083 <ftp://ftp.uu.net/graphics/png/documents/>
* as RFC 2083 <ftp://ftp.uu.net/graphics/png/documents/>
* and as a W3C Recommendation <http://www.w3.org/TR/REC.png.html> * and as a W3C Recommendation <http://www.w3.org/TR/REC.png.html>
* *
* Contributing Authors: * Contributing Authors:
@ -118,14 +118,14 @@ extern "C" {
*/ */
/* Version information for png.h - this should match the version in png.c */ /* Version information for png.h - this should match the version in png.c */
#define PNG_LIBPNG_VER_STRING "1.0.1" #define PNG_LIBPNG_VER_STRING "1.0.1a"
/* Careful here. At one time, Guy wanted to use 082, but that would be octal. /* Careful here. At one time, Guy wanted to use 082, but that would be octal.
* We must not include leading zeros. * We must not include leading zeros.
* Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only
* version 1.0.0 was mis-numbered 100 instead of 10000). From * version 1.0.0 was mis-numbered 100 instead of 10000). From
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=bugfix */ * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=bugfix */
#define PNG_LIBPNG_VER 10001 /* 1.0.1 */ #define PNG_LIBPNG_VER 10002 /* 1.0.2 */
/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ /* variables declared in png.c - only it needs to define PNG_NO_EXTERN */
#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
@ -589,7 +589,7 @@ struct png_struct_def
png_byte sig_bytes; /* magic bytes read/written from start of file */ png_byte sig_bytes; /* magic bytes read/written from start of file */
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
png_byte filler; /* filler byte for 24->32-bit pixel expansion */ png_uint_16 filler; /* filler bytes for pixel expansion */
#endif /* PNG_READ_FILLER_SUPPORTED */ #endif /* PNG_READ_FILLER_SUPPORTED */
#if defined(PNG_READ_bKGD_SUPPORTED) #if defined(PNG_READ_bKGD_SUPPORTED)
png_byte background_gamma_type; png_byte background_gamma_type;
@ -1590,7 +1590,7 @@ PNG_EXTERN png_int_32 png_get_int_32 PNGARG((png_bytep buf));
#endif /* PNG_READ_pCAL_SUPPORTED */ #endif /* PNG_READ_pCAL_SUPPORTED */
PNG_EXTERN png_uint_32 png_get_uint_32 PNGARG((png_bytep buf)); PNG_EXTERN png_uint_32 png_get_uint_32 PNGARG((png_bytep buf));
PNG_EXTERN png_uint_16 png_get_uint_16 PNGARG((png_bytep buf)); PNG_EXTERN png_uint_16 png_get_uint_16 PNGARG((png_bytep buf));
#endif /* PNG_BIG_ENDIAN_GET_SUPPORTED */ #endif /* PNG_READ_BIG_ENDIAN_SUPPORTED */
/* Initialize png_ptr struct for reading, and allocate any other memory. /* Initialize png_ptr struct for reading, and allocate any other memory.
* (old interface - NOT DLL EXPORTED). * (old interface - NOT DLL EXPORTED).

View File

@ -1,12 +1,12 @@
/* pngconf.h - machine configurable file for libpng /* pngconf.h - machine configurable file for libpng
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
*/ */
/* Any machine specific code is near the front of this file, so if you /* Any machine specific code is near the front of this file, so if you

View File

@ -1,12 +1,12 @@
/* pngerror.c - stub functions for i/o and memory allocation /* pngerror.c - stub functions for i/o and memory allocation
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
* *
* This file provides a location for all error handling. Users which * This file provides a location for all error handling. Users which
* need special error handling are expected to write replacement functions * need special error handling are expected to write replacement functions

View File

@ -1,12 +1,12 @@
/* pngget.c - retrieval of values from info struct /* pngget.c - retrieval of values from info struct
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
*/ */
#define PNG_INTERNAL #define PNG_INTERNAL

View File

@ -1,14 +1,14 @@
/* pngmem.c - stub functions for memory allocation /* pngmem.c - stub functions for memory allocation
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
* *
* This file provides a location for all memory allocation. Users which * This file provides a location for all memory allocation. Users who
* need special memory handling are expected to modify the code in this file * need special memory handling are expected to modify the code in this file
* to meet their needs. See the instructions at each function. * to meet their needs. See the instructions at each function.
*/ */

View File

@ -1,12 +1,12 @@
/* pngpread.c - read a png file in push mode /* pngpread.c - read a png file in push mode
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
*/ */
#define PNG_INTERNAL #define PNG_INTERNAL
@ -446,13 +446,13 @@ png_push_save_buffer(png_structp png_ptr)
{ {
if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
{ {
png_size_t i; png_size_t i,istop;
png_bytep sp; png_bytep sp;
png_bytep dp; png_bytep dp;
istop = png_ptr->save_buffer_size;
for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
i < png_ptr->save_buffer_size; i < istop; i++, sp++, dp++)
i++, sp++, dp++)
{ {
*dp = *sp; *dp = *sp;
} }

View File

@ -1,12 +1,12 @@
/* pngread.c - read a PNG file /* pngread.c - read a PNG file
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
* *
* This file contains routines that an application calls directly to * This file contains routines that an application calls directly to
* read a PNG file or stream. * read a PNG file or stream.
@ -125,7 +125,7 @@ png_read_init(png_structp png_ptr)
/* Read the information before the actual image data. This has been /* Read the information before the actual image data. This has been
* changed in v0.90 to allow reading a file that already has the magic * changed in v0.90 to allow reading a file that already has the magic
* bytes read from the stream. You can tell libpng how many bytes have * bytes read from the stream. You can tell libpng how many bytes have
* been read from the beginning of the stream (up to the maxumum of 8) * been read from the beginning of the stream (up to the maximum of 8)
* via png_set_sig_bytes(), and we will only check the remaining bytes * via png_set_sig_bytes(), and we will only check the remaining bytes
* here. The application can then have access to the signature bytes we * here. The application can then have access to the signature bytes we
* read if it is determined that this isn't a valid PNG file. * read if it is determined that this isn't a valid PNG file.
@ -522,7 +522,7 @@ png_read_rows(png_structp png_ptr, png_bytepp row,
void void
png_read_image(png_structp png_ptr, png_bytepp image) png_read_image(png_structp png_ptr, png_bytepp image)
{ {
png_uint_32 i; png_uint_32 i,image_height;
int pass, j; int pass, j;
png_bytepp rp; png_bytepp rp;
@ -530,12 +530,13 @@ png_read_image(png_structp png_ptr, png_bytepp image)
/* save jump buffer and error functions */ /* save jump buffer and error functions */
pass = png_set_interlace_handling(png_ptr); pass = png_set_interlace_handling(png_ptr);
png_ptr->num_rows = png_ptr->height; /* Make sure this is set correctly */ image_height=png_ptr->height;
png_ptr->num_rows = image_height; /* Make sure this is set correctly */
for (j = 0; j < pass; j++) for (j = 0; j < pass; j++)
{ {
rp = image; rp = image;
for (i = 0; i < png_ptr->height; i++) for (i = 0; i < image_height; i++)
{ {
png_read_row(png_ptr, *rp, NULL); png_read_row(png_ptr, *rp, NULL);
rp++; rp++;
@ -728,8 +729,9 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
#if defined(PNG_READ_GAMMA_SUPPORTED) #if defined(PNG_READ_GAMMA_SUPPORTED)
if (png_ptr->gamma_16_table != NULL) if (png_ptr->gamma_16_table != NULL)
{ {
int i; int i,istop;
for (i = 0; i < (1 << (8 - png_ptr->gamma_shift)); i++) istop = (1 << (8 - png_ptr->gamma_shift));
for (i = 0; i < istop; i++)
{ {
png_free(png_ptr, png_ptr->gamma_16_table[i]); png_free(png_ptr, png_ptr->gamma_16_table[i]);
} }
@ -739,8 +741,9 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
png_free(png_ptr, png_ptr->gamma_16_table); png_free(png_ptr, png_ptr->gamma_16_table);
if (png_ptr->gamma_16_from_1 != NULL) if (png_ptr->gamma_16_from_1 != NULL)
{ {
int i; int i,istop;
for (i = 0; i < (1 << (8 - png_ptr->gamma_shift)); i++) istop = (1 << (8 - png_ptr->gamma_shift));
for (i = 0; i < istop; i++)
{ {
png_free(png_ptr, png_ptr->gamma_16_from_1[i]); png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
} }
@ -748,8 +751,9 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
png_free(png_ptr, png_ptr->gamma_16_from_1); png_free(png_ptr, png_ptr->gamma_16_from_1);
if (png_ptr->gamma_16_to_1 != NULL) if (png_ptr->gamma_16_to_1 != NULL)
{ {
int i; int i,istop;
for (i = 0; i < (1 << (8 - png_ptr->gamma_shift)); i++) istop = (1 << (8 - png_ptr->gamma_shift));
for (i = 0; i < istop; i++)
{ {
png_free(png_ptr, png_ptr->gamma_16_to_1[i]); png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
} }

View File

@ -1,12 +1,12 @@
/* pngrio.c - functions for data input /* pngrio.c - functions for data input
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
* *
* This file provides a location for all input. Users which need * This file provides a location for all input. Users which need
* special handling are expected to write a function which has the same * special handling are expected to write a function which has the same

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
/* pngrutil.c - utilities to read a PNG file /* pngrutil.c - utilities to read a PNG file
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
* *
* This file contains routines which are only called from within * This file contains routines which are only called from within
* libpng itself during the course of reading an image. * libpng itself during the course of reading an image.
@ -76,9 +76,10 @@ png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length)
int int
png_crc_finish(png_structp png_ptr, png_uint_32 skip) png_crc_finish(png_structp png_ptr, png_uint_32 skip)
{ {
png_uint_32 i; png_uint_32 i,istop;
for (i = skip; i > (png_uint_32)png_ptr->zbuf_size; i -= png_ptr->zbuf_size) istop = (png_uint_32)png_ptr->zbuf_size;
for (i = skip; i > istop; i -= istop)
{ {
png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
} }
@ -258,20 +259,6 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_ptr->mode |= PNG_HAVE_PLTE; png_ptr->mode |= PNG_HAVE_PLTE;
#if defined (PNG_READ_tRNS_SUPPORTED)
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
if (info_ptr != NULL && info_ptr->valid & PNG_INFO_tRNS)
{
if (png_ptr->num_trans > png_ptr->num_palette)
{
png_warning(png_ptr, "Truncating incorrect tRNS chunk length");
png_ptr->num_trans = png_ptr->num_palette;
}
}
}
#endif
#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) #if !defined(PNG_READ_OPT_PLTE_SUPPORTED)
if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)
{ {
@ -349,6 +336,21 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_ptr->palette = palette; png_ptr->palette = palette;
png_ptr->num_palette = (png_uint_16)num; png_ptr->num_palette = (png_uint_16)num;
png_set_PLTE(png_ptr, info_ptr, palette, num); png_set_PLTE(png_ptr, info_ptr, palette, num);
#if defined (PNG_READ_tRNS_SUPPORTED)
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
if (info_ptr != NULL && info_ptr->valid & PNG_INFO_tRNS)
{
if (png_ptr->num_trans > png_ptr->num_palette)
{
png_warning(png_ptr, "Truncating incorrect tRNS chunk length");
png_ptr->num_trans = png_ptr->num_palette;
}
}
}
#endif
} }
void void
@ -758,6 +760,12 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_crc_finish(png_ptr, length); png_crc_finish(png_ptr, length);
return; return;
} }
if (length == 0)
{
png_warning(png_ptr, "Zero length tRNS chunk");
png_crc_finish(png_ptr, length);
return;
}
png_ptr->trans = (png_bytep)png_malloc(png_ptr, length); png_ptr->trans = (png_bytep)png_malloc(png_ptr, length);
png_ptr->flags |= PNG_FLAG_FREE_TRANS; png_ptr->flags |= PNG_FLAG_FREE_TRANS;
@ -1075,7 +1083,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
purpose[slength] = 0x00; /* null terminate the last string */ purpose[slength] = 0x00; /* null terminate the last string */
png_debug(3, "Finding end of pCAL purpose string\n"); png_debug(3, "Finding end of pCAL purpose string\n");
for (buf = purpose; *buf != '\0'; buf++) for (buf = purpose; *buf; buf++)
/* empty loop */ ; /* empty loop */ ;
endptr = purpose + slength; endptr = purpose + slength;
@ -1113,7 +1121,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");
} }
for (buf = units; *buf != 0x00; buf++) for (buf = units; *buf; buf++)
/* Empty loop to move past the units string. */ ; /* Empty loop to move past the units string. */ ;
png_debug(3, "Allocating pCAL parameters array\n"); png_debug(3, "Allocating pCAL parameters array\n");
@ -1497,7 +1505,7 @@ png_combine_row(png_structp png_ptr, png_bytep row,
int s_inc, s_start, s_end; int s_inc, s_start, s_end;
int m; int m;
int shift; int shift;
png_uint_32 i; png_uint_32 i, istop;
sp = png_ptr->row_buf + 1; sp = png_ptr->row_buf + 1;
dp = row; dp = row;
@ -1519,7 +1527,8 @@ png_combine_row(png_structp png_ptr, png_bytep row,
shift = s_start; shift = s_start;
for (i = 0; i < png_ptr->width; i++) istop = png_ptr->width;
for (i = 0; i < istop; i++)
{ {
if (m & mask) if (m & mask)
{ {
@ -1553,7 +1562,7 @@ png_combine_row(png_structp png_ptr, png_bytep row,
int s_start, s_end, s_inc; int s_start, s_end, s_inc;
int m; int m;
int shift; int shift;
png_uint_32 i; png_uint_32 i,istop;
int value; int value;
sp = png_ptr->row_buf + 1; sp = png_ptr->row_buf + 1;
@ -1576,7 +1585,8 @@ png_combine_row(png_structp png_ptr, png_bytep row,
shift = s_start; shift = s_start;
for (i = 0; i < png_ptr->width; i++) istop = png_ptr->width;
for (i = 0; i < istop; i++)
{ {
if (m & mask) if (m & mask)
{ {
@ -1607,7 +1617,7 @@ png_combine_row(png_structp png_ptr, png_bytep row,
int s_start, s_end, s_inc; int s_start, s_end, s_inc;
int m; int m;
int shift; int shift;
png_uint_32 i; png_uint_32 i,istop;
int value; int value;
sp = png_ptr->row_buf + 1; sp = png_ptr->row_buf + 1;
@ -1629,7 +1639,8 @@ png_combine_row(png_structp png_ptr, png_bytep row,
} }
shift = s_start; shift = s_start;
for (i = 0; i < png_ptr->width; i++) istop = png_ptr->width;
for (i = 0; i < istop; i++)
{ {
if (m & mask) if (m & mask)
{ {
@ -1658,7 +1669,7 @@ png_combine_row(png_structp png_ptr, png_bytep row,
png_bytep sp; png_bytep sp;
png_bytep dp; png_bytep dp;
png_size_t pixel_bytes; png_size_t pixel_bytes;
png_uint_32 i; png_uint_32 i, istop;
png_byte m; png_byte m;
pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);
@ -1666,7 +1677,8 @@ png_combine_row(png_structp png_ptr, png_bytep row,
sp = png_ptr->row_buf + 1; sp = png_ptr->row_buf + 1;
dp = row; dp = row;
m = 0x80; m = 0x80;
for (i = 0; i < png_ptr->width; i++) istop = png_ptr->width;
for (i = 0; i < istop; i++)
{ {
if (m & mask) if (m & mask)
{ {
@ -1708,7 +1720,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
int s_start, s_end, s_inc; int s_start, s_end, s_inc;
png_byte v; png_byte v;
png_uint_32 i; png_uint_32 i;
int j; int j, jstop;
sp = row + (png_size_t)((row_info->width - 1) >> 3); sp = row + (png_size_t)((row_info->width - 1) >> 3);
dp = row + (png_size_t)((final_width - 1) >> 3); dp = row + (png_size_t)((final_width - 1) >> 3);
@ -1731,10 +1743,11 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
s_inc = 1; s_inc = 1;
} }
jstop = png_pass_inc[pass];
for (i = row_info->width; i; i--) for (i = row_info->width; i; i--)
{ {
v = (png_byte)((*sp >> sshift) & 0x1); v = (png_byte)((*sp >> sshift) & 0x1);
for (j = 0; j < png_pass_inc[pass]; j++) for (j = 0; j < jstop; j++)
{ {
*dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff);
*dp |= (png_byte)(v << dshift); *dp |= (png_byte)(v << dshift);
@ -1762,6 +1775,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
int sshift, dshift; int sshift, dshift;
int s_start, s_end, s_inc; int s_start, s_end, s_inc;
png_uint_32 i; png_uint_32 i;
int jstop;
sp = row + (png_uint_32)((row_info->width - 1) >> 2); sp = row + (png_uint_32)((row_info->width - 1) >> 2);
dp = row + (png_uint_32)((final_width - 1) >> 2); dp = row + (png_uint_32)((final_width - 1) >> 2);
@ -1784,13 +1798,14 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
s_inc = 2; s_inc = 2;
} }
jstop = png_pass_inc[pass];
for (i = row_info->width; i; i--) for (i = row_info->width; i; i--)
{ {
png_byte v; png_byte v;
int j; int j;
v = (png_byte)((*sp >> sshift) & 0x3); v = (png_byte)((*sp >> sshift) & 0x3);
for (j = 0; j < png_pass_inc[pass]; j++) for (j = 0; j < jstop; j++)
{ {
*dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff);
*dp |= (png_byte)(v << dshift); *dp |= (png_byte)(v << dshift);
@ -1818,6 +1833,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
int sshift, dshift; int sshift, dshift;
int s_start, s_end, s_inc; int s_start, s_end, s_inc;
png_uint_32 i; png_uint_32 i;
int jstop;
sp = row + (png_size_t)((row_info->width - 1) >> 1); sp = row + (png_size_t)((row_info->width - 1) >> 1);
dp = row + (png_size_t)((final_width - 1) >> 1); dp = row + (png_size_t)((final_width - 1) >> 1);
@ -1840,13 +1856,14 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
s_inc = 4; s_inc = 4;
} }
jstop = png_pass_inc[pass];
for (i = row_info->width; i; i--) for (i = row_info->width; i; i--)
{ {
png_byte v; png_byte v;
int j; int j;
v = (png_byte)((*sp >> sshift) & 0xf); v = (png_byte)((*sp >> sshift) & 0xf);
for (j = 0; j < png_pass_inc[pass]; j++) for (j = 0; j < jstop; j++)
{ {
*dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff);
*dp |= (png_byte)(v << dshift); *dp |= (png_byte)(v << dshift);
@ -1872,19 +1889,21 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
{ {
png_bytep sp, dp; png_bytep sp, dp;
png_uint_32 i; png_uint_32 i;
int jstop;
png_size_t pixel_bytes; png_size_t pixel_bytes;
pixel_bytes = (row_info->pixel_depth >> 3); pixel_bytes = (row_info->pixel_depth >> 3);
sp = row + (png_size_t)(row_info->width - 1) * pixel_bytes; sp = row + (png_size_t)(row_info->width - 1) * pixel_bytes;
dp = row + (png_size_t)(final_width - 1) * pixel_bytes; dp = row + (png_size_t)(final_width - 1) * pixel_bytes;
jstop = png_pass_inc[pass];
for (i = row_info->width; i; i--) for (i = row_info->width; i; i--)
{ {
png_byte v[8]; png_byte v[8];
int j; int j;
png_memcpy(v, sp, pixel_bytes); png_memcpy(v, sp, pixel_bytes);
for (j = 0; j < png_pass_inc[pass]; j++) for (j = 0; j < jstop; j++)
{ {
png_memcpy(dp, v, pixel_bytes); png_memcpy(dp, v, pixel_bytes);
dp -= pixel_bytes; dp -= pixel_bytes;
@ -1901,6 +1920,165 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
} }
#endif #endif
#ifndef PNG_READ_SLOW_FILTERING
void
png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,
png_bytep prev_row, int filter)
{
png_debug(1, "in png_read_filter_row\n");
png_debug2(2,"row = %d, filter = %d\n", png_ptr->row_number, filter);
switch (filter)
{
case PNG_FILTER_VALUE_NONE:
break;
case PNG_FILTER_VALUE_SUB:
{
png_uint_32 i, istop;
int bpp;
png_bytep rp;
png_bytep lp;
bpp = (row_info->pixel_depth + 7) / 8;
istop = row_info->rowbytes;
for (i = (png_uint_32)bpp, rp = row + bpp, lp = row;
i < istop; i++, rp++, lp++)
{
*rp = (png_byte)(((int)(*rp) + (int)(*lp)) & 0xff);
}
break;
}
case PNG_FILTER_VALUE_UP:
{
png_uint_32 i, istop;
png_bytep rp;
png_bytep pp;
istop = row_info->rowbytes;
for (i = 0, rp = row, pp = prev_row; i < istop; i++, rp++, pp++)
{
*rp = (png_byte)(((int)(*rp) + (int)(*pp)) & 0xff);
}
break;
}
case PNG_FILTER_VALUE_AVG:
{
png_uint_32 i, istop;
int bpp;
png_bytep rp;
png_bytep pp;
png_bytep lp;
bpp = (row_info->pixel_depth + 7) / 8;
istop = (png_uint_32)bpp;
for (i = 0, rp = row, pp = prev_row; i < istop; i++, rp++, pp++)
{
*rp = (png_byte)(((int)(*rp) +
((int)(*pp) / 2)) & 0xff);
}
istop = row_info->rowbytes;
for (lp = row; i < istop; i++, rp++,
lp++, pp++)
{
*rp = (png_byte)(((int)(*rp) +
(int)(*pp + *lp) / 2) & 0xff);
}
break;
}
case PNG_FILTER_VALUE_PAETH:
{
int bpp;
png_uint_32 i, istop;
png_bytep rp;
png_bytep pp;
png_bytep lp;
png_bytep cp;
bpp = (row_info->pixel_depth + 7) / 8;
#ifndef PNG_SLOW_PAETH
istop=bpp;
for (i = 0, rp = row, pp = prev_row; i < istop;
i++, rp++, pp++)
{
*rp = (png_byte)(((int)(*rp) + (int)(*pp)) & 0xff);
}
istop=row_info->rowbytes;
for (lp = row, cp = prev_row; i < istop; /* use leftover i,rp,pp */
i++, rp++, pp++, lp++, cp++)
{
int a, b, c, pa, pb, pc, p;
a = *lp;
b = *pp;
c = *cp;
p = a + b - c;
#ifdef PNG_USE_ABS
pa = abs(p - a);
pb = abs(p - b);
pc = abs(p - c);
#else
pa = p > a ? p - a : a - p;
pb = p > b ? p - b : b - p;
pc = p > c ? p - c : c - p;
#endif
/*
if (pa <= pb && pa <= pc)
p = a;
else if (pb <= pc)
p = b;
else
p = c;
*/
p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
*rp = (png_byte)(((int)(*rp) + p) & 0xff);
}
#else /* PNG_SLOW_PAETH */
for (i = 0, rp = row, pp = prev_row,
lp = row - bpp, cp = prev_row - bpp,
istop = row_info->rowbytes; i < istop; i++, rp++, pp++, lp++, cp++)
{
int a, b, c, pa, pb, pc, p;
b = *pp;
if (i >= (png_uint_32)bpp)
{
c = *cp;
a = *lp;
}
else
{
a = c = 0;
}
p = a + b - c;
pa = abs(p - a);
pb = abs(p - b);
pc = abs(p - c);
if (pa <= pb && pa <= pc)
p = a;
else if (pb <= pc)
p = b;
else
p = c;
*rp = (png_byte)(((int)(*rp) + p) & 0xff);
}
#endif /* PNG_SLOW_PAETH */
break;
}
default:
png_error(png_ptr, "Bad adaptive filter type");
break;
}
}
#else /* PNG_READ_SLOW_FILTERING */
void void
png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,
png_bytep prev_row, int filter) png_bytep prev_row, int filter)
@ -2010,6 +2188,7 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,
break; break;
} }
} }
#endif /* PNG_READ_SLOW_FILTERING */
void void
png_read_finish_row(png_structp png_ptr) png_read_finish_row(png_structp png_ptr)
@ -2186,9 +2365,21 @@ png_read_start_row(png_structp png_ptr)
#if defined(PNG_READ_FILLER_SUPPORTED) #if defined(PNG_READ_FILLER_SUPPORTED)
if (png_ptr->transformations & (PNG_FILLER)) if (png_ptr->transformations & (PNG_FILLER))
{ {
if (max_pixel_depth < 32) if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
{
if (max_pixel_depth <= 8)
max_pixel_depth = 16;
else
max_pixel_depth = 32; max_pixel_depth = 32;
} }
else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
{
if (max_pixel_depth <= 32)
max_pixel_depth = 32;
else
max_pixel_depth = 64;
}
}
#endif #endif
#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
@ -2216,7 +2407,7 @@ png_read_start_row(png_structp png_ptr)
for interlacing */ for interlacing */
rowbytes = ((png_ptr->width + 7) & ~((png_uint_32)7)); rowbytes = ((png_ptr->width + 7) & ~((png_uint_32)7));
/* calculate the maximum bytes needed, adding a byte and a pixel /* calculate the maximum bytes needed, adding a byte and a pixel
for safety sake */ for safety's sake */
rowbytes = ((rowbytes * (png_uint_32)max_pixel_depth + 7) >> 3) + rowbytes = ((rowbytes * (png_uint_32)max_pixel_depth + 7) >> 3) +
1 + ((max_pixel_depth + 7) >> 3); 1 + ((max_pixel_depth + 7) >> 3);
#ifdef PNG_MAX_MALLOC_64K #ifdef PNG_MAX_MALLOC_64K

View File

@ -1,12 +1,12 @@
/* pngset.c - storage of image information into info struct /* pngset.c - storage of image information into info struct
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
* *
* The functions here are used during reads to store data from the file * The functions here are used during reads to store data from the file
* into the info struct, and during writes to store application data * into the info struct, and during writes to store application data
@ -108,13 +108,14 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
/* check for overflow */ /* check for overflow */
rowbytes_per_pixel = (info_ptr->pixel_depth + 7) >> 3; rowbytes_per_pixel = (info_ptr->pixel_depth + 7) >> 3;
info_ptr->rowbytes = info_ptr->width * rowbytes_per_pixel;
if (( width > (png_uint_32)2147483647L/rowbytes_per_pixel)) if (( width > (png_uint_32)2147483647L/rowbytes_per_pixel))
{ {
png_warning(png_ptr, png_warning(png_ptr,
"Width too large to process image data; rowbytes will overflow."); "Width too large to process image data; rowbytes will overflow.");
info_ptr->rowbytes = (png_size_t)0; info_ptr->rowbytes = (png_size_t)0;
} }
else
info_ptr->rowbytes = (info_ptr->width * info_ptr->pixel_depth + 7) >> 3;
} }
#if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED) #if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)

View File

@ -1,12 +1,12 @@
/* pngtest.c - a simple test program to test libpng /* pngtest.c - a simple test program to test libpng
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
* *
* This program reads in a PNG image, writes it out again, and then * This program reads in a PNG image, writes it out again, and then
* compares the two files. If the files are identical, this shows that * compares the two files. If the files are identical, this shows that
@ -81,12 +81,12 @@ write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
/* example of using user transform callback (we don't transform anything, /* example of using user transform callback (we don't transform anything,
but merely count the black pixels) */ but merely count the zero samples) */
static png_uint_32 black_pixels; static png_uint_32 zero_samples;
void void
count_black_pixels(png_structp png_ptr, png_row_infop row_info, png_bytep data) count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data)
{ {
png_bytep dp = data; png_bytep dp = data;
if(png_ptr == NULL)return; if(png_ptr == NULL)return;
@ -100,60 +100,66 @@ count_black_pixels(png_structp png_ptr, png_row_infop row_info, png_bytep data)
* png_byte pixel_depth bits per pixel (depth*channels) * png_byte pixel_depth bits per pixel (depth*channels)
*/ */
/* counts the number of black pixels (or zero pixels if color_type is 3 */ /* counts the number of zero samples (or zero pixels if color_type is 3 */
if(row_info->color_type == 0 || row_info->color_type == 3) if(row_info->color_type == 0 || row_info->color_type == 3)
{ {
int pos=0; int pos=0;
png_uint_32 n; png_uint_32 n, nstop;
for (n=0; n<row_info->width; n++) for (n=0, nstop=row_info->width; n<nstop; n++)
{ {
if(row_info->bit_depth == 1) if(row_info->bit_depth == 1)
if(((*dp << pos++ )& 0x80) == 0) black_pixels++; {
if(((*dp << pos++ )& 0x80) == 0) zero_samples++;
if(pos == 8) if(pos == 8)
{ {
pos = 0; pos = 0;
dp++; dp++;
} }
}
if(row_info->bit_depth == 2) if(row_info->bit_depth == 2)
if(((*dp << (pos+=2))& 0xc0) == 0) black_pixels++; {
if(((*dp << (pos+=2))& 0xc0) == 0) zero_samples++;
if(pos == 8) if(pos == 8)
{ {
pos = 0; pos = 0;
dp++; dp++;
} }
}
if(row_info->bit_depth == 4) if(row_info->bit_depth == 4)
if(((*dp << (pos+=4))& 0xf0) == 0) black_pixels++; {
if(((*dp << (pos+=4))& 0xf0) == 0) zero_samples++;
if(pos == 8) if(pos == 8)
{ {
pos = 0; pos = 0;
dp++; dp++;
} }
}
if(row_info->bit_depth == 8) if(row_info->bit_depth == 8)
if(*dp++ == 0) black_pixels++; if(*dp++ == 0) zero_samples++;
if(row_info->bit_depth == 16) if(row_info->bit_depth == 16)
{ {
if((*dp | *(dp+1)) == 0) black_pixels++; if((*dp | *(dp+1)) == 0) zero_samples++;
dp+=2; dp+=2;
} }
} }
} }
else /* other color types */ else /* other color types */
{ {
png_uint_32 n; png_uint_32 n, nstop;
int channel; int channel;
int color_channels = row_info->channels; int color_channels = row_info->channels;
if(row_info->color_type > 3)color_channels--; if(row_info->color_type > 3)color_channels--;
for (n=0; n<row_info->width; n++) for (n=0, nstop=row_info->width; n<nstop; n++)
{ {
for (channel = 0; channel < color_channels; channel++) for (channel = 0; channel < color_channels; channel++)
{ {
if(row_info->bit_depth == 8) if(row_info->bit_depth == 8)
if(*dp++ == 0) black_pixels++; if(*dp++ == 0) zero_samples++;
if(row_info->bit_depth == 16) if(row_info->bit_depth == 16)
{ {
if((*dp | *(dp+1)) == 0) black_pixels++; if((*dp | *(dp+1)) == 0) zero_samples++;
dp+=2; dp+=2;
} }
} }
@ -563,8 +569,8 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
} }
# if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) # if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
black_pixels=0; zero_samples=0;
png_set_write_user_transform_fn(write_ptr, count_black_pixels); png_set_write_user_transform_fn(write_ptr, count_zero_samples);
# endif # endif
png_debug(0, "Reading info struct\n"); png_debug(0, "Reading info struct\n");
@ -948,7 +954,7 @@ main(int argc, char *argv[])
kerror = test_one_file(argv[i], outname); kerror = test_one_file(argv[i], outname);
if (kerror == 0) if (kerror == 0)
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
fprintf(STDERR, " PASS (%lu black pixels)\n",black_pixels); fprintf(STDERR, " PASS (%lu zero samples)\n",zero_samples);
#else #else
fprintf(STDERR, " PASS\n"); fprintf(STDERR, " PASS\n");
#endif #endif
@ -994,7 +1000,7 @@ main(int argc, char *argv[])
{ {
if(verbose == 1 || i == 2) if(verbose == 1 || i == 2)
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
fprintf(STDERR, " PASS (%lu black pixels)\n",black_pixels); fprintf(STDERR, " PASS (%lu zero samples)\n",zero_samples);
#else #else
fprintf(STDERR, " PASS\n"); fprintf(STDERR, " PASS\n");
#endif #endif

View File

@ -1,12 +1,12 @@
/* pngtrans.c - transforms the data in a row (used by both readers and writers) /* pngtrans.c - transforms the data in a row (used by both readers and writers)
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
*/ */
#define PNG_INTERNAL #define PNG_INTERNAL
@ -100,12 +100,6 @@ png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
png_ptr->flags |= PNG_FLAG_FILLER_AFTER; png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
else else
png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
/* This should probably go in the "do_filler" routine */
if (png_ptr->color_type == PNG_COLOR_TYPE_RGB && png_ptr->bit_depth == 8)
{
png_ptr->usr_channels = 4;
}
} }
#endif #endif
@ -172,14 +166,13 @@ png_do_swap(png_row_infop row_info, png_bytep row)
row_info->bit_depth == 16) row_info->bit_depth == 16)
{ {
png_bytep rp; png_bytep rp;
png_byte t;
png_uint_32 i; png_uint_32 i;
for (i = 0, rp = row; for (i = 0, rp = row;
i < row_info->width * row_info->channels; i < row_info->width * row_info->channels;
i++, rp += 2) i++, rp += 2)
{ {
t = *rp; png_byte t = *rp;
*rp = *(rp + 1); *rp = *(rp + 1);
*(rp + 1) = t; *(rp + 1) = t;
} }
@ -338,6 +331,11 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
if (row_info->color_type == PNG_COLOR_TYPE_RGB || if (row_info->color_type == PNG_COLOR_TYPE_RGB ||
row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
*/ */
png_bytep sp=row;
png_bytep dp=row;
png_uint_32 width=row_info->width;
png_uint_32 i;
if (row_info->channels == 4) if (row_info->channels == 4)
{ {
if (row_info->bit_depth == 8) if (row_info->bit_depth == 8)
@ -345,10 +343,8 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
/* This converts from RGBX or RGBA to RGB */ /* This converts from RGBX or RGBA to RGB */
if (flags & PNG_FLAG_FILLER_AFTER) if (flags & PNG_FLAG_FILLER_AFTER)
{ {
png_bytep sp, dp; dp+=3; sp+=4;
png_uint_32 i; for (i = 1; i < width; i++)
for (i = 1, sp = row + 4, dp = row + 3; i < row_info->width; i++)
{ {
*dp++ = *sp++; *dp++ = *sp++;
*dp++ = *sp++; *dp++ = *sp++;
@ -359,10 +355,7 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
/* This converts from XRGB or ARGB to RGB */ /* This converts from XRGB or ARGB to RGB */
else else
{ {
png_bytep sp, dp; for (i = 0; i < width; i++)
png_uint_32 i;
for (i = 0, sp = row, dp = row; i < row_info->width; i++)
{ {
sp++; sp++;
*dp++ = *sp++; *dp++ = *sp++;
@ -371,17 +364,15 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
} }
} }
row_info->pixel_depth = 24; row_info->pixel_depth = 24;
row_info->rowbytes = row_info->width * 3; row_info->rowbytes = width * 3;
} }
else /* if (row_info->bit_depth == 16) */ else /* if (row_info->bit_depth == 16) */
{ {
if (flags & PNG_FLAG_FILLER_AFTER) if (flags & PNG_FLAG_FILLER_AFTER)
{ {
png_bytep sp, dp;
png_uint_32 i;
/* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
for (i = 1, sp = row + 8, dp = row + 6; i < row_info->width; i++) sp += 8; dp += 6;
for (i = 1; i < width; i++)
{ {
/* This could be (although memcpy is probably slower): /* This could be (although memcpy is probably slower):
png_memcpy(dp, sp, 6); png_memcpy(dp, sp, 6);
@ -399,17 +390,15 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
} }
else else
{ {
png_bytep sp, dp;
png_uint_32 i;
/* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
for (i = 0, sp = row + 2, dp = row; i < row_info->width; i++) for (i = 0; i < width; i++)
{ {
/* This could be (although memcpy is probably slower): /* This could be (although memcpy is probably slower):
png_memcpy(dp, sp, 6); png_memcpy(dp, sp, 6);
sp += 8; sp += 8;
dp += 6; dp += 6;
*/ */
sp+=2;
*dp++ = *sp++; *dp++ = *sp++;
*dp++ = *sp++; *dp++ = *sp++;
*dp++ = *sp++; *dp++ = *sp++;
@ -419,9 +408,10 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
} }
} }
row_info->pixel_depth = 48; row_info->pixel_depth = 48;
row_info->rowbytes = row_info->width * 6; row_info->rowbytes = width * 6;
} }
row_info->channels = 3; row_info->channels = 3;
row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
} }
/* /*
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY || else if (row_info->color_type == PNG_COLOR_TYPE_GRAY ||
@ -434,10 +424,7 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
/* This converts from GX or GA to G */ /* This converts from GX or GA to G */
if (flags & PNG_FLAG_FILLER_AFTER) if (flags & PNG_FLAG_FILLER_AFTER)
{ {
png_bytep sp, dp; for (i = 0; i < width; i++)
png_uint_32 i;
for (i = 1, sp = row + 2, dp = row + 1; i < row_info->width; i++)
{ {
*dp++ = *sp++; *dp++ = *sp++;
sp++; sp++;
@ -446,27 +433,22 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
/* This converts from XG or AG to G */ /* This converts from XG or AG to G */
else else
{ {
png_bytep sp, dp; for (i = 0; i < width; i++)
png_uint_32 i;
for (i = 0, sp = row, dp = row; i < row_info->width; i++)
{ {
sp++; sp++;
*dp++ = *sp++; *dp++ = *sp++;
} }
} }
row_info->pixel_depth = 8; row_info->pixel_depth = 8;
row_info->rowbytes = row_info->width; row_info->rowbytes = width;
} }
else /* if (row_info->bit_depth == 16) */ else /* if (row_info->bit_depth == 16) */
{ {
if (flags & PNG_FLAG_FILLER_AFTER) if (flags & PNG_FLAG_FILLER_AFTER)
{ {
png_bytep sp, dp;
png_uint_32 i;
/* This converts from GGXX or GGAA to GG */ /* This converts from GGXX or GGAA to GG */
for (i = 1, sp = row + 4, dp = row + 2; i < row_info->width; i++) sp += 4; dp += 2;
for (i = 1; i < width; i++)
{ {
*dp++ = *sp++; *dp++ = *sp++;
*dp++ = *sp++; *dp++ = *sp++;
@ -475,11 +457,8 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
} }
else else
{ {
png_bytep sp, dp;
png_uint_32 i;
/* This converts from XXGG or AAGG to GG */ /* This converts from XXGG or AAGG to GG */
for (i = 0, sp = row, dp = row; i < row_info->width; i++) for (i = 0; i < width; i++)
{ {
sp += 2; sp += 2;
*dp++ = *sp++; *dp++ = *sp++;
@ -487,9 +466,10 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
} }
} }
row_info->pixel_depth = 16; row_info->pixel_depth = 16;
row_info->rowbytes = row_info->width * 2; row_info->rowbytes = width * 2;
} }
row_info->channels = 1; row_info->channels = 1;
row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
} }
} }
} }
@ -507,17 +487,17 @@ png_do_bgr(png_row_infop row_info, png_bytep row)
#endif #endif
(row_info->color_type & PNG_COLOR_MASK_COLOR)) (row_info->color_type & PNG_COLOR_MASK_COLOR))
{ {
png_uint_32 width = row_info->width;
if (row_info->bit_depth == 8) if (row_info->bit_depth == 8)
{ {
if (row_info->color_type == PNG_COLOR_TYPE_RGB) if (row_info->color_type == PNG_COLOR_TYPE_RGB)
{ {
png_bytep rp; png_bytep rp;
png_byte save;
png_uint_32 i; png_uint_32 i;
for (i = 0, rp = row; i < row_info->width; i++, rp += 3) for (i = 0, rp = row; i < width; i++, rp += 3)
{ {
save = *rp; png_byte save = *rp;
*rp = *(rp + 2); *rp = *(rp + 2);
*(rp + 2) = save; *(rp + 2) = save;
} }
@ -525,12 +505,11 @@ png_do_bgr(png_row_infop row_info, png_bytep row)
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
{ {
png_bytep rp; png_bytep rp;
png_byte save;
png_uint_32 i; png_uint_32 i;
for (i = 0, rp = row; i < row_info->width; i++, rp += 4) for (i = 0, rp = row; i < width; i++, rp += 4)
{ {
save = *rp; png_byte save = *rp;
*rp = *(rp + 2); *rp = *(rp + 2);
*(rp + 2) = save; *(rp + 2) = save;
} }
@ -541,33 +520,31 @@ png_do_bgr(png_row_infop row_info, png_bytep row)
if (row_info->color_type == PNG_COLOR_TYPE_RGB) if (row_info->color_type == PNG_COLOR_TYPE_RGB)
{ {
png_bytep rp; png_bytep rp;
png_byte save[2];
png_uint_32 i; png_uint_32 i;
for (i = 0, rp = row; i < row_info->width; i++, rp += 6) for (i = 0, rp = row; i < width; i++, rp += 6)
{ {
save[0] = *rp; png_byte save = *rp;
save[1] = *(rp + 1);
*rp = *(rp + 4); *rp = *(rp + 4);
*(rp + 4) = save;
save = *(rp + 1);
*(rp + 1) = *(rp + 5); *(rp + 1) = *(rp + 5);
*(rp + 4) = save[0]; *(rp + 5) = save;
*(rp + 5) = save[1];
} }
} }
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
{ {
png_bytep rp; png_bytep rp;
png_byte save[2];
png_uint_32 i; png_uint_32 i;
for (i = 0, rp = row; i < row_info->width; i++, rp += 8) for (i = 0, rp = row; i < width; i++, rp += 8)
{ {
save[0] = *rp; png_byte save = *rp;
save[1] = *(rp + 1);
*rp = *(rp + 4); *rp = *(rp + 4);
*(rp + 4) = save;
save = *(rp + 1);
*(rp + 1) = *(rp + 5); *(rp + 1) = *(rp + 5);
*(rp + 4) = save[0]; *(rp + 5) = save;
*(rp + 5) = save[1];
} }
} }
} }

View File

@ -1,12 +1,12 @@
/* pngwio.c - functions for data output /* pngwio.c - functions for data output
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
* *
* This file provides a location for all output. Users which need * This file provides a location for all output. Users which need
* special handling are expected to write functions which have the same * special handling are expected to write functions which have the same

View File

@ -1,12 +1,12 @@
/* pngwrite.c - general routines to write a PNG file /* pngwrite.c - general routines to write a PNG file
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
*/ */
/* get internal access to png.h */ /* get internal access to png.h */
@ -239,7 +239,7 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
{ {
char near_time_buf[29]; char near_time_buf[29];
sprintf(near_time_buf, "%d %s %d %02d:%02d:%02d +0000", sprintf(near_time_buf, "%d %s %d %02d:%02d:%02d +0000",
ptime->day % 31, short_months[ptime->month - 1], ptime->day % 32, short_months[(ptime->month - 1) % 12],
ptime->year, ptime->hour % 24, ptime->minute % 60, ptime->year, ptime->hour % 24, ptime->minute % 60,
ptime->second % 61); ptime->second % 61);
png_memcpy(png_ptr->time_buffer, near_time_buf, png_memcpy(png_ptr->time_buffer, near_time_buf,
@ -247,7 +247,7 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
} }
#else #else
sprintf(png_ptr->time_buffer, "%d %s %d %02d:%02d:%02d +0000", sprintf(png_ptr->time_buffer, "%d %s %d %02d:%02d:%02d +0000",
ptime->day % 31, short_months[ptime->month - 1], ptime->day % 32, short_months[(ptime->month - 1) % 12],
ptime->year, ptime->hour % 24, ptime->minute % 60, ptime->year, ptime->hour % 24, ptime->minute % 60,
ptime->second % 61); ptime->second % 61);
#endif #endif

View File

@ -1,12 +1,12 @@
/* pngwtran.c - transforms the data in a row for PNG writers /* pngwtran.c - transforms the data in a row for PNG writers
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
*/ */
#define PNG_INTERNAL #define PNG_INTERNAL
@ -96,13 +96,15 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
{ {
png_bytep sp, dp; png_bytep sp, dp;
int mask, v; int mask, v;
png_uint_32 i; png_uint_32 i, istop;
sp = row; sp = row;
dp = row; dp = row;
mask = 0x80; mask = 0x80;
v = 0; v = 0;
for (i = 0; i < row_info->width; i++)
istop = row_info->width;
for (i = 0; i < istop; i++)
{ {
if (*sp != 0) if (*sp != 0)
v |= mask; v |= mask;
@ -125,13 +127,14 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
{ {
png_bytep sp, dp; png_bytep sp, dp;
int shift, v; int shift, v;
png_uint_32 i; png_uint_32 i, istop;
sp = row; sp = row;
dp = row; dp = row;
shift = 6; shift = 6;
v = 0; v = 0;
for (i = 0; i < row_info->width; i++) istop = row_info->width;
for (i = 0; i < istop; i++)
{ {
png_byte value; png_byte value;
@ -156,13 +159,14 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
{ {
png_bytep sp, dp; png_bytep sp, dp;
int shift, v; int shift, v;
png_uint_32 i; png_uint_32 i, istop;
sp = row; sp = row;
dp = row; dp = row;
shift = 4; shift = 4;
v = 0; v = 0;
for (i = 0; i < row_info->width; i++) istop = row_info->width;
for (i = 0; i < istop; i++)
{ {
png_byte value; png_byte value;
@ -246,7 +250,7 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
if (row_info->bit_depth < 8) if (row_info->bit_depth < 8)
{ {
png_bytep bp; png_bytep bp;
png_uint_32 i; png_uint_32 i, istop;
png_byte mask; png_byte mask;
if (bit_depth->gray == 1 && row_info->bit_depth == 2) if (bit_depth->gray == 1 && row_info->bit_depth == 2)
@ -256,7 +260,8 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
else else
mask = 0xff; mask = 0xff;
for (bp = row, i = 0; i < row_info->rowbytes; i++, bp++) istop = row_info->rowbytes;
for (bp = row, i = 0; i < istop; i++, bp++)
{ {
png_uint_16 v; png_uint_16 v;
int j; int j;
@ -275,9 +280,10 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
else if (row_info->bit_depth == 8) else if (row_info->bit_depth == 8)
{ {
png_bytep bp; png_bytep bp;
png_uint_32 i; png_uint_32 i, istop;
for (bp = row, i = 0; i < row_info->width; i++) istop = row_info->width;
for (bp = row, i = 0; i < istop; i++)
{ {
png_uint_32 c; png_uint_32 c;
@ -301,9 +307,10 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
else else
{ {
png_bytep bp; png_bytep bp;
png_uint_32 i; png_uint_32 i, istop;
for (bp = row, i = 0; i < row_info->width * row_info->channels; i++) istop = row_info->width;
for (bp = row, i = 0; i < istop; i++)
{ {
png_uint_32 c; png_uint_32 c;
@ -345,12 +352,12 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
if (row_info->bit_depth == 8) if (row_info->bit_depth == 8)
{ {
png_bytep sp, dp; png_bytep sp, dp;
png_byte save; png_uint_32 i, istop;
png_uint_32 i;
for (i = 0, sp = dp = row; i < row_info->width; i++) istop = row_info->width;
for (i = 0, sp = dp = row; i < istop; i++)
{ {
save = *(sp++); png_byte save = *(sp++);
*(dp++) = *(sp++); *(dp++) = *(sp++);
*(dp++) = *(sp++); *(dp++) = *(sp++);
*(dp++) = *(sp++); *(dp++) = *(sp++);
@ -361,11 +368,12 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
else else
{ {
png_bytep sp, dp; png_bytep sp, dp;
png_byte save[2]; png_uint_32 i, istop;
png_uint_32 i;
for (i = 0, sp = dp = row; i < row_info->width; i++) istop = row_info->width;
for (i = 0, sp = dp = row; i < istop; i++)
{ {
png_byte save[2];
save[0] = *(sp++); save[0] = *(sp++);
save[1] = *(sp++); save[1] = *(sp++);
*(dp++) = *(sp++); *(dp++) = *(sp++);
@ -385,12 +393,12 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
if (row_info->bit_depth == 8) if (row_info->bit_depth == 8)
{ {
png_bytep sp, dp; png_bytep sp, dp;
png_byte save;
png_uint_32 i; png_uint_32 i;
for (i = 0, sp = dp = row; i < row_info->width; i++) istop = row_info->width;
for (i = 0, sp = dp = row; i < istop; i++)
{ {
save = *(sp++); png_byte save = *(sp++);
*(dp++) = *(sp++); *(dp++) = *(sp++);
*(dp++) = save; *(dp++) = save;
} }
@ -399,11 +407,12 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
else else
{ {
png_bytep sp, dp; png_bytep sp, dp;
png_byte save[2];
png_uint_32 i; png_uint_32 i;
for (i = 0, sp = dp = row; i < row_info->width; i++) istop = row_info->width;
for (i = 0, sp = dp = row; i < istop; i++)
{ {
png_byte save[2];
save[0] = *(sp++); save[0] = *(sp++);
save[1] = *(sp++); save[1] = *(sp++);
*(dp++) = *(sp++); *(dp++) = *(sp++);
@ -432,9 +441,10 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
if (row_info->bit_depth == 8) if (row_info->bit_depth == 8)
{ {
png_bytep sp, dp; png_bytep sp, dp;
png_uint_32 i; png_uint_32 i, istop;
for (i = 0, sp = dp = row; i < row_info->width; i++) istop = row_info->width;
for (i = 0, sp = dp = row; i < istop; i++)
{ {
*(dp++) = *(sp++); *(dp++) = *(sp++);
*(dp++) = *(sp++); *(dp++) = *(sp++);
@ -446,9 +456,10 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
else else
{ {
png_bytep sp, dp; png_bytep sp, dp;
png_uint_32 i; png_uint_32 i, istop;
for (i = 0, sp = dp = row; i < row_info->width; i++) istop = row_info->width;
for (i = 0, sp = dp = row; i < istop; i++)
{ {
*(dp++) = *(sp++); *(dp++) = *(sp++);
*(dp++) = *(sp++); *(dp++) = *(sp++);
@ -467,9 +478,10 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
if (row_info->bit_depth == 8) if (row_info->bit_depth == 8)
{ {
png_bytep sp, dp; png_bytep sp, dp;
png_uint_32 i; png_uint_32 i, istop;
for (i = 0, sp = dp = row; i < row_info->width; i++) istop = row_info->width;
for (i = 0, sp = dp = row; i < istop; i++)
{ {
*(dp++) = *(sp++); *(dp++) = *(sp++);
*(dp++) = 255 - *(sp++); *(dp++) = 255 - *(sp++);
@ -479,9 +491,10 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
else else
{ {
png_bytep sp, dp; png_bytep sp, dp;
png_uint_32 i; png_uint_32 i, istop;
for (i = 0, sp = dp = row; i < row_info->width; i++) istop = row_info->width;
for (i = 0, sp = dp = row; i < istop; i++)
{ {
*(dp++) = *(sp++); *(dp++) = *(sp++);
*(dp++) = *(sp++); *(dp++) = *(sp++);

View File

@ -1,12 +1,12 @@
/* pngwutil.c - utilities to write a PNG file /* pngwutil.c - utilities to write a PNG file
* *
* libpng 1.0.1 * libpng 1.0.1a
* For conditions of distribution and use, see copyright notice in png.h * For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
* Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1996, 1997 Andreas Dilger
* Copyright (c) 1998, Glenn Randers-Pehrson * Copyright (c) 1998, Glenn Randers-Pehrson
* March 15, 1998 * April 21, 1998
*/ */
#define PNG_INTERNAL #define PNG_INTERNAL
@ -1241,7 +1241,7 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
if (pass < 6) if (pass < 6)
#endif #endif
{ {
/* each pixel depth is handled seperately */ /* each pixel depth is handled separately */
switch (row_info->pixel_depth) switch (row_info->pixel_depth)
{ {
case 1: case 1:
@ -1251,12 +1251,13 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
int shift; int shift;
int d; int d;
int value; int value;
png_uint_32 i; png_uint_32 i, istop;
dp = row; dp = row;
d = 0; d = 0;
shift = 7; shift = 7;
for (i = png_pass_start[pass]; i < row_info->width; istop = row_info->width;
for (i = png_pass_start[pass]; i < istop;
i += png_pass_inc[pass]) i += png_pass_inc[pass])
{ {
sp = row + (png_size_t)(i >> 3); sp = row + (png_size_t)(i >> 3);
@ -1284,12 +1285,13 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
int shift; int shift;
int d; int d;
int value; int value;
png_uint_32 i; png_uint_32 i, istop;
dp = row; dp = row;
shift = 6; shift = 6;
d = 0; d = 0;
for (i = png_pass_start[pass]; i < row_info->width; istop = row_info->width;
for (i = png_pass_start[pass]; i < istop;
i += png_pass_inc[pass]) i += png_pass_inc[pass])
{ {
sp = row + (png_size_t)(i >> 2); sp = row + (png_size_t)(i >> 2);
@ -1316,12 +1318,13 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
int shift; int shift;
int d; int d;
int value; int value;
png_uint_32 i; png_uint_32 i, istop;
dp = row; dp = row;
shift = 4; shift = 4;
d = 0; d = 0;
for (i = png_pass_start[pass]; i < row_info->width; istop = row_info->width;
for (i = png_pass_start[pass]; i < istop;
i += png_pass_inc[pass]) i += png_pass_inc[pass])
{ {
sp = row + (png_size_t)(i >> 1); sp = row + (png_size_t)(i >> 1);
@ -1345,7 +1348,7 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
{ {
png_bytep sp; png_bytep sp;
png_bytep dp; png_bytep dp;
png_uint_32 i; png_uint_32 i, istop;
png_size_t pixel_bytes; png_size_t pixel_bytes;
/* start at the beginning */ /* start at the beginning */
@ -1354,7 +1357,8 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
pixel_bytes = (row_info->pixel_depth >> 3); pixel_bytes = (row_info->pixel_depth >> 3);
/* loop through the row, only looking at the pixels that /* loop through the row, only looking at the pixels that
matter */ matter */
for (i = png_pass_start[pass]; i < row_info->width; istop = row_info->width;
for (i = png_pass_start[pass]; i < istop;
i += png_pass_inc[pass]) i += png_pass_inc[pass])
{ {
/* find out where the original pixel is */ /* find out where the original pixel is */
@ -1392,6 +1396,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
{ {
png_bytep prev_row, best_row, row_buf; png_bytep prev_row, best_row, row_buf;
png_uint_32 mins, bpp; png_uint_32 mins, bpp;
png_byte filter_to_do = png_ptr->do_filter;
png_debug(1, "in png_write_find_filter\n"); png_debug(1, "in png_write_find_filter\n");
/* find out how many bytes offset each pixel is */ /* find out how many bytes offset each pixel is */
@ -1405,7 +1410,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
* smallest value when summing the absolute values of the distances * smallest value when summing the absolute values of the distances
* from zero using anything >= 128 as negative numbers. This is known * from zero using anything >= 128 as negative numbers. This is known
* as the "minimum sum of absolute differences" heuristic. Other * as the "minimum sum of absolute differences" heuristic. Other
* heuristics are the "weighted minumum sum of absolute differences" * heuristics are the "weighted minimum sum of absolute differences"
* (experimental and can in theory improve compression), and the "zlib * (experimental and can in theory improve compression), and the "zlib
* predictive" method (not implemented in libpng 0.95), which does test * predictive" method (not implemented in libpng 0.95), which does test
* compressions of lines using different filter methods, and then chooses * compressions of lines using different filter methods, and then chooses
@ -1413,18 +1418,20 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
* computationally expensive). * computationally expensive).
*/ */
/* We don't need to test the 'no filter' case if this is the only filter /* We don't need to test the 'no filter' case if this is the only filter
* that has been chosen, as it doesn't actually do anything to the data. * that has been chosen, as it doesn't actually do anything to the data.
*/ */
if (png_ptr->do_filter & PNG_FILTER_NONE && if (filter_to_do & PNG_FILTER_NONE &&
png_ptr->do_filter != PNG_FILTER_NONE) filter_to_do != PNG_FILTER_NONE)
{ {
png_bytep rp; png_bytep rp;
png_uint_32 sum = 0; png_uint_32 sum = 0;
png_uint_32 i; png_uint_32 i,istop;
int v; int v;
for (i = 0, rp = row_buf + 1; i < row_info->rowbytes; i++, rp++) istop = row_info->rowbytes;
for (i = 0, rp = row_buf + 1; i < istop; i++, rp++)
{ {
v = *rp; v = *rp;
sum += (v < 128) ? v : 256 - v; sum += (v < 128) ? v : 256 - v;
@ -1438,9 +1445,10 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */ sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */
/* Reduce the sum if we match any of the previous rows */ /* Reduce the sum if we match any of the previous rows */
for (i = 0; i < (png_uint_32)png_ptr->num_prev_filters; i++) istop = (png_uint_32)png_ptr->num_prev_filters;
for (i = 0; i < istop; i++)
{ {
if (png_ptr->prev_filters[i] == PNG_FILTER_NONE) if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_NONE)
{ {
sumlo = (sumlo * png_ptr->filter_weights[i]) >> sumlo = (sumlo * png_ptr->filter_weights[i]) >>
PNG_WEIGHT_SHIFT; PNG_WEIGHT_SHIFT;
@ -1468,15 +1476,34 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
} }
/* sub filter */ /* sub filter */
if (png_ptr->do_filter & PNG_FILTER_SUB) if (filter_to_do == PNG_FILTER_SUB)
/* it's the only filter so no testing is needed */
{
png_bytep rp, lp, dp;
png_uint_32 i,istop;
for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp;
i++, rp++, dp++)
{
*dp = *rp;
}
istop = row_info->rowbytes;
for (lp = row_buf + 1; i < istop;
i++, rp++, lp++, dp++)
{
*dp = (png_byte)(((int)*rp - (int)*lp) & 0xff);
}
best_row = png_ptr->sub_row;
}
else if (filter_to_do & PNG_FILTER_SUB)
{ {
png_bytep rp, dp, lp; png_bytep rp, dp, lp;
png_uint_32 sum = 0, lmins = mins; png_uint_32 sum = 0, lmins = mins;
png_uint_32 i; png_uint_32 i, istop;
int v; int v;
#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
/* We temporarily increase the "minumum sum" by the factor we /* We temporarily increase the "minimum sum" by the factor we
* would reduce the sum of this filter, so that we can do the * would reduce the sum of this filter, so that we can do the
* early exit comparison without scaling the sum each time. * early exit comparison without scaling the sum each time.
*/ */
@ -1486,7 +1513,8 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
lmlo = lmins & PNG_LOMASK; lmlo = lmins & PNG_LOMASK;
lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
for (i = 0; i < (png_uint_32)png_ptr->num_prev_filters; i++) istop = (png_uint_32)png_ptr->num_prev_filters;
for (i = 0; i < istop; i++)
{ {
if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_SUB) if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_SUB)
{ {
@ -1534,7 +1562,8 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
sumlo = sum & PNG_LOMASK; sumlo = sum & PNG_LOMASK;
sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
for (i = 0; i < (png_uint_32)png_ptr->num_prev_filters; i++) istop = (png_uint_32)png_ptr->num_prev_filters;
for (i = 0; i < istop; i++)
{ {
if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_SUB) if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_SUB)
{ {
@ -1565,13 +1594,29 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
} }
/* up filter */ /* up filter */
if (png_ptr->do_filter & PNG_FILTER_UP) if (filter_to_do == PNG_FILTER_UP)
{
png_bytep rp, dp, pp;
png_uint_32 i, istop;
istop = row_info->rowbytes;
for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1,
pp = prev_row + 1; i < istop;
i++, rp++, pp++, dp++)
{
*dp = (png_byte)(((int)*rp - (int)*pp) & 0xff);
}
best_row = png_ptr->up_row;
}
else if (filter_to_do & PNG_FILTER_UP)
{ {
png_bytep rp, dp, pp; png_bytep rp, dp, pp;
png_uint_32 sum = 0, lmins = mins; png_uint_32 sum = 0, lmins = mins;
png_uint_32 i; png_uint_32 i, istop;
int v; int v;
#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
{ {
@ -1579,7 +1624,8 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
lmlo = lmins & PNG_LOMASK; lmlo = lmins & PNG_LOMASK;
lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
for (i = 0; i < (png_uint_32)png_ptr->num_prev_filters; i++) istop = (png_uint_32)png_ptr->num_prev_filters;
for (i = 0; i < istop; i++)
{ {
if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_UP) if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_UP)
{ {
@ -1602,8 +1648,9 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
} }
#endif #endif
istop = row_info->rowbytes;
for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1,
pp = prev_row + 1; i < row_info->rowbytes; pp = prev_row + 1; i < istop;
i++, rp++, pp++, dp++) i++, rp++, pp++, dp++)
{ {
v = *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff); v = *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff);
@ -1621,9 +1668,10 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
sumlo = sum & PNG_LOMASK; sumlo = sum & PNG_LOMASK;
sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
for (i = 0; i < (png_uint_32)png_ptr->num_prev_filters; i++) istop = (png_uint_32)png_ptr->num_prev_filters;
for (i = 0; i < istop; i++)
{ {
if (png_ptr->prev_filters[i] == PNG_FILTER_UP) if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_UP)
{ {
sumlo = (sumlo * png_ptr->filter_weights[i]) >> sumlo = (sumlo * png_ptr->filter_weights[i]) >>
PNG_WEIGHT_SHIFT; PNG_WEIGHT_SHIFT;
@ -1652,11 +1700,28 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
} }
/* avg filter */ /* avg filter */
if (png_ptr->do_filter & PNG_FILTER_AVG) if (filter_to_do == PNG_FILTER_AVG)
{
png_bytep rp, dp, pp, lp;
png_uint_32 i,istop;
for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1,
pp = prev_row + 1; i < bpp; i++, rp++, pp++, dp++)
{
*dp = (png_byte)(((int)*rp - ((int)*pp / 2)) & 0xff);
}
istop = row_info->rowbytes;
for (lp = row_buf + 1; i < istop; i++, rp++, pp++, lp++, dp++)
{
*dp = (png_byte)(((int)*rp - (((int)*pp + (int)*lp) / 2)) & 0xff);
}
best_row = png_ptr->avg_row;
}
else if (filter_to_do & PNG_FILTER_AVG)
{ {
png_bytep rp, dp, pp, lp; png_bytep rp, dp, pp, lp;
png_uint_32 sum = 0, lmins = mins; png_uint_32 sum = 0, lmins = mins;
png_uint_32 i; png_uint_32 i,istop;
int v; int v;
#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
@ -1666,7 +1731,8 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
lmlo = lmins & PNG_LOMASK; lmlo = lmins & PNG_LOMASK;
lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
for (i = 0; i < (png_uint_32)png_ptr->num_prev_filters; i++) istop = (png_uint_32)png_ptr->num_prev_filters;
for (i = 0; i < istop; i++)
{ {
if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_AVG) if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_AVG)
{ {
@ -1696,8 +1762,8 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
sum += (v < 128) ? v : 256 - v; sum += (v < 128) ? v : 256 - v;
} }
for (lp = row_buf + 1; i < row_info->rowbytes; istop = row_info->rowbytes;
i++, rp++, pp++, lp++, dp++) for (lp = row_buf + 1; i < istop; i++, rp++, pp++, lp++, dp++)
{ {
v = *dp = (png_byte)(((int)*rp - (((int)*pp + (int)*lp) / 2)) & 0xff); v = *dp = (png_byte)(((int)*rp - (((int)*pp + (int)*lp) / 2)) & 0xff);
@ -1714,9 +1780,10 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
sumlo = sum & PNG_LOMASK; sumlo = sum & PNG_LOMASK;
sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
for (i = 0; i < png_ptr->num_prev_filters; i++) istop = png_ptr->num_prev_filters;
for (i = 0; i < istop; i++)
{ {
if (png_ptr->prev_filters[i] == PNG_FILTER_NONE) if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_NONE)
{ {
sumlo = (sumlo * png_ptr->filter_weights[i]) >> sumlo = (sumlo * png_ptr->filter_weights[i]) >>
PNG_WEIGHT_SHIFT; PNG_WEIGHT_SHIFT;
@ -1745,11 +1812,50 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
} }
/* Paeth filter */ /* Paeth filter */
if (png_ptr->do_filter & PNG_FILTER_PAETH) if (filter_to_do == PNG_FILTER_PAETH)
{
png_bytep rp, dp, pp, cp, lp;
png_uint_32 i, istop;
for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1,
pp = prev_row + 1; i < bpp; i++, rp++, pp++, dp++)
{
*dp = (png_byte)(((int)*rp - (int)*pp) & 0xff);
}
istop = row_info->rowbytes;
for (lp = row_buf + 1, cp = prev_row + 1; i < istop;
i++, rp++, pp++, lp++, dp++, cp++)
{
int a, b, c, pa, pb, pc, p;
b = *pp;
c = *cp;
a = *lp;
p = a + b - c;
#ifdef PNG_USE_ABS
pa = abs(p - a);
pb = abs(p - b);
pc = abs(p - c);
#else
pa = p > a ? p - a : a - p;
pb = p > b ? p - b : b - p;
pc = p > c ? p - c : c - p;
#endif
p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
*dp = (png_byte)(((int)*rp - p) & 0xff);
}
best_row = png_ptr->paeth_row;
}
else if (filter_to_do & PNG_FILTER_PAETH)
{ {
png_bytep rp, dp, pp, cp, lp; png_bytep rp, dp, pp, cp, lp;
png_uint_32 sum = 0, lmins = mins; png_uint_32 sum = 0, lmins = mins;
png_uint_32 i; png_uint_32 i, istop;
int v; int v;
#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
@ -1759,7 +1865,8 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
lmlo = lmins & PNG_LOMASK; lmlo = lmins & PNG_LOMASK;
lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
for (i = 0; i < png_ptr->num_prev_filters; i++) istop = png_ptr->num_prev_filters;
for (i = 0; i < istop; i++)
{ {
if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_PAETH) if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_PAETH)
{ {
@ -1783,13 +1890,15 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
#endif #endif
for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1,
pp = prev_row + 1; (unsigned)i < bpp; i++, rp++, pp++, dp++) pp = prev_row + 1; i < bpp; i++, rp++, pp++, dp++)
{ {
v = *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff); v = *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff);
sum += (v < 128) ? v : 256 - v; sum += (v < 128) ? v : 256 - v;
} }
for (lp = row_buf + 1, cp = prev_row + 1; i < row_info->rowbytes;
istop = row_info->rowbytes;
for (lp = row_buf + 1, cp = prev_row + 1; i < istop;
i++, rp++, pp++, lp++, dp++, cp++) i++, rp++, pp++, lp++, dp++, cp++)
{ {
int a, b, c, pa, pb, pc, p; int a, b, c, pa, pb, pc, p;
@ -1799,16 +1908,30 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
a = *lp; a = *lp;
p = a + b - c; p = a + b - c;
#ifndef PNG_SLOW_PAETH
#ifdef PNG_USE_ABS
pa = abs(p - a); pa = abs(p - a);
pb = abs(p - b); pb = abs(p - b);
pc = abs(p - c); pc = abs(p - c);
#else
pa = p > a ? p - a : a - p;
pb = p > b ? p - b : b - p;
pc = p > c ? p - c : c - p;
#endif
p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
#else /* PNG_SLOW_PAETH */
pa = abs(p - a);
pb = abs(p - b);
pc = abs(p - c);
if (pa <= pb && pa <= pc) if (pa <= pb && pa <= pc)
p = a; p = a;
else if (pb <= pc) else if (pb <= pc)
p = b; p = b;
else else
p = c; p = c;
#endif /* PNG_SLOW_PAETH */
v = *dp = (png_byte)(((int)*rp - p) & 0xff); v = *dp = (png_byte)(((int)*rp - p) & 0xff);
@ -1825,9 +1948,10 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
sumlo = sum & PNG_LOMASK; sumlo = sum & PNG_LOMASK;
sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
for (i = 0; i < png_ptr->num_prev_filters; i++) istop = png_ptr->num_prev_filters;
for (i = 0; i < istop; i++)
{ {
if (png_ptr->prev_filters[i] == PNG_FILTER_PAETH) if (png_ptr->prev_filters[i] == PNG_FILTER_VALUE_PAETH)
{ {
sumlo = (sumlo * png_ptr->filter_weights[i]) >> sumlo = (sumlo * png_ptr->filter_weights[i]) >>
PNG_WEIGHT_SHIFT; PNG_WEIGHT_SHIFT;
@ -1855,15 +1979,17 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
} }
/* Do the actual writing of the filtered row data from the chosen filter. */ /* Do the actual writing of the filtered row data from the chosen filter. */
png_write_filtered_row(png_ptr, best_row); png_write_filtered_row(png_ptr, best_row);
#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
/* Save the type of filter we picked this time for future calculations */ /* Save the type of filter we picked this time for future calculations */
if (png_ptr->num_prev_filters > 0) if (png_ptr->num_prev_filters > 0)
{ {
int i; int i, istop;
for (i = 1; i < (int)png_ptr->num_prev_filters; i++) istop = (int)png_ptr->num_prev_filters;
for (i = 1; i < istop; i++)
{ {
png_ptr->prev_filters[i] = png_ptr->prev_filters[i - 1]; png_ptr->prev_filters[i] = png_ptr->prev_filters[i - 1];
} }

View File

@ -11,11 +11,16 @@ CC=gcc
ZLIBLIB=../zlib ZLIBLIB=../zlib
ZLIBINC=../zlib ZLIBINC=../zlib
ALIGN=
# For I-386:
#ALIGN=-malign-loops=2 -malign-functions=2
WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \ WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
-Wmissing-declarations -Wtraditional -Wcast-align \ -Wmissing-declarations -Wtraditional -Wcast-align \
-Wstrict-prototypes -Wmissing-prototypes #-Wconversion -Wstrict-prototypes -Wmissing-prototypes #-Wconversion
CFLAGS=-I$(ZLIBINC) -Wall -O3 -funroll-loops -malign-loops=2 \
-malign-functions=2 #$(WARNMORE) -g -DPNG_DEBUG=5 CFLAGS=-I$(ZLIBINC) -Wall -O3 -funroll-loops \
$(ALIGN) #$(WARNMORE) -g -DPNG_DEBUG=5
LDFLAGS=-L. -Wl,-rpath,. -L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) -lpng -lz -lm LDFLAGS=-L. -Wl,-rpath,. -L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) -lpng -lz -lm
RANLIB=ranlib RANLIB=ranlib
@ -24,7 +29,7 @@ RANLIB=ranlib
# read libpng.txt or png.h to see why PNGMAJ is 2. You should not # read libpng.txt or png.h to see why PNGMAJ is 2. You should not
# have to change it. # have to change it.
PNGMAJ = 2 PNGMAJ = 2
PNGMIN = 1.0 PNGMIN = 1.0.1a
PNGVER = $(PNGMAJ).$(PNGMIN) PNGVER = $(PNGMAJ).$(PNGMIN)
# where make install puts libpng.a, libpng.so*, and png.h # where make install puts libpng.a, libpng.so*, and png.h

View File

@ -29,7 +29,7 @@ RANLIB=echo
# read libpng.txt or png.h to see why PNGMAJ is 2. You should not # read libpng.txt or png.h to see why PNGMAJ is 2. You should not
# have to change it. # have to change it.
PNGMAJ = 2 PNGMAJ = 2
PNGMIN = 1.0 PNGMIN = 1.0.1a
PNGVER = $(PNGMAJ).$(PNGMIN) PNGVER = $(PNGMAJ).$(PNGMIN)
# where make install puts libpng.a, libpng.so*, and png.h # where make install puts libpng.a, libpng.so*, and png.h

View File

@ -10,7 +10,8 @@ ZLIBINC=../zlib
CC=cc CC=cc
CFLAGS=-I$(ZLIBINC) -O -fullwarn # -g -DPNG_DEBUG=1 WARNMORE=-fullwarn
CFLAGS=-I$(ZLIBINC) -O # $(WARNMORE) -g -DPNG_DEBUG=5
LDFLAGS=-L. -L$(ZLIBLIB) -lpng -lz -lm LDFLAGS=-L. -L$(ZLIBLIB) -lpng -lz -lm
RANLIB=echo RANLIB=echo

View File

@ -9,7 +9,7 @@ ZLIBLIB=../zlib
ZLIBINC=../zlib ZLIBINC=../zlib
CC=cc CC=cc
CFLAGS=-I$(ZLIBINC) -O # -g -DPNG_DEBUG=1 CFLAGS=-I$(ZLIBINC) -O # -g -DPNG_DEBUG=5
LDFLAGS=-L. -L$(ZLIBLIB) -lpng -lz -lm LDFLAGS=-L. -L$(ZLIBLIB) -lpng -lz -lm
#RANLIB=echo #RANLIB=echo

View File

@ -13,7 +13,7 @@ WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow -Wconversion \
-Wmissing-declarations -Wtraditional -Wcast-align \ -Wmissing-declarations -Wtraditional -Wcast-align \
-Wstrict-prototypes -Wmissing-prototypes -Wstrict-prototypes -Wmissing-prototypes
CC=gcc CC=gcc
CFLAGS=-I$(ZLIBINC) -O $(WARNMORE) -DPNG_DEBUG=4 CFLAGS=-I$(ZLIBINC) -O # $(WARNMORE) -DPNG_DEBUG=5
LDFLAGS=-L. -L$(ZLIBLIB) -lpng -lz -lm LDFLAGS=-L. -L$(ZLIBLIB) -lpng -lz -lm
RANLIB=ranlib RANLIB=ranlib

View File

@ -1,5 +1,5 @@
# Makefile for libpng # Makefile for libpng
# Watcom 10a and later 32-bit protected mode flat memory model # Watcom 10.0a and later 32-bit protected mode flat memory model
# Adapted by Pawel Mrochen, based on makefile.msc # Adapted by Pawel Mrochen, based on makefile.msc
# For conditions of distribution and use, see copyright notice in png.h # For conditions of distribution and use, see copyright notice in png.h
@ -7,9 +7,9 @@
# To use, do "wmake -f makefile.wat" # To use, do "wmake -f makefile.wat"
# ------------- Watcom 10a and later ------------- # ------------- Watcom 10.0a and later -------------
MODEL=-mf MODEL=-mf
CFLAGS= $(MODEL) -fpi87 -fp5 -5r -oaeilmnrt -s -zp4 -i=..\zlib CFLAGS= $(MODEL) -5r -fp5 -fpi87 -oneatx -zp8 -i=..\zlib
CC=wcc386 CC=wcc386
LD=wcl386 LD=wcl386
LIB=wlib -b -c LIB=wlib -b -c
@ -75,9 +75,9 @@ pngwutil$(O): png.h pngconf.h
$(CC) $(CFLAGS) $*.c $(ERRFILE) $(CC) $(CFLAGS) $*.c $(ERRFILE)
libpng.lib: $(OBJS1) $(OBJS2) $(OBJS3) libpng.lib: $(OBJS1) $(OBJS2) $(OBJS3)
$(LIB) -n libpng.lib +$(OBJS1) $(LIB) -n libpng.lib $(OBJS1)
$(LIB) libpng.lib +$(OBJS2) $(LIB) libpng.lib $(OBJS2)
$(LIB) libpng.lib +$(OBJS3) $(LIB) libpng.lib $(OBJS3)
pngtest.exe: pngtest.obj libpng.lib pngtest.exe: pngtest.obj libpng.lib
$(LD) $(LDFLAGS) pngtest.obj libpng.lib ..\zlib\zlib.lib $(LD) $(LDFLAGS) pngtest.obj libpng.lib ..\zlib\zlib.lib