Skip to content

Commit

Permalink
test: add configuration tests and fix bugs
Browse files Browse the repository at this point in the history
The two new configuation tests, fixed.dfa and float-fixed.dfa verify
that the 'standard' configuration of libpng works without floating point
arithmetic.

Signed-off-by: John Bowler <[email protected]>
  • Loading branch information
jbowler committed Jan 27, 2025
1 parent a8242dd commit c4b20d0
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 0 deletions.
15 changes: 15 additions & 0 deletions contrib/conftest/fixed.dfa
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# fixed.dfa
# Build time configuration of libpng
#
# Author: John Bowler
# Copyright: (c) John Bowler, 2025
# Usage rights:
# To the extent possible under law, the author has waived all copyright and
# related or neighboring rights to this work. This work is published from:
# United States.
#
# Test the standard libpng configuration without floating point (the internal
# fixed point implementations are used instead).
#
option FLOATING_ARITHMETIC off
option FLOATING_POINT off
14 changes: 14 additions & 0 deletions contrib/conftest/float-fixed.dfa
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# fixed-float.dfa
# Build time configuration of libpng
#
# Author: John Bowler
# Copyright: (c) John Bowler, 2025
# Usage rights:
# To the extent possible under law, the author has waived all copyright and
# related or neighboring rights to this work. This work is published from:
# United States.
#
# Test the standard libpng configuration with the fixed point internal
# implementation in place of the default floating point
#
option FLOATING_ARITHMETIC off
24 changes: 24 additions & 0 deletions png.c
Original file line number Diff line number Diff line change
Expand Up @@ -2931,6 +2931,30 @@ png_gamma_significant(png_fixed_point gamma_val)
gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED;
}

#ifndef PNG_FLOATING_ARITHMETIC_SUPPORTED
/* A local convenience routine. */
static png_fixed_point
png_product2(png_fixed_point a, png_fixed_point b)
{
/* The required result is a * b; the following preserves accuracy. */
#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED /* Should now be unused */
double r = a * 1E-5;
r *= b;
r = floor(r+.5);

if (r <= 2147483647. && r >= -2147483648.)
return (png_fixed_point)r;
#else
png_fixed_point res;

if (png_muldiv(&res, a, b, 100000) != 0)
return res;
#endif

return 0; /* overflow */
}
#endif /* FLOATING_ARITHMETIC */

png_fixed_point
png_reciprocal2(png_fixed_point a, png_fixed_point b)
{
Expand Down

0 comments on commit c4b20d0

Please sign in to comment.