mirror of
				https://git.code.sf.net/p/libpng/code.git
				synced 2025-07-10 18:04:09 +02:00 
			
		
		
		
	Fix rgb_to_gray graylo==0 errors, build issues
Fixes to pngvalid for various reduced build configurations (eliminate unused statics) and a fix for the case in rgb_to_gray when the digitize option reduces graylo to 0, producing a large error. Signed-off-by: John Bowler <jbowler@acm.org>
This commit is contained in:
		
							parent
							
								
									abe4a4f049
								
							
						
					
					
						commit
						4891f1a5a8
					
				| @ -302,6 +302,8 @@ static void r16(png_uint_16p p16, size_t count) | |||||||
| #define R16(this)\ | #define R16(this)\ | ||||||
|    r16(&(this), (sizeof (this))/(sizeof (png_uint_16))) |    r16(&(this), (sizeof (this))/(sizeof (png_uint_16))) | ||||||
| 
 | 
 | ||||||
|  | #if defined PNG_READ_RGB_TO_GRAY_SUPPORTED ||\ | ||||||
|  |     defined PNG_READ_FILLER_SUPPORTED | ||||||
| static void r32(png_uint_32p p32, size_t count) | static void r32(png_uint_32p p32, size_t count) | ||||||
| { | { | ||||||
|    size_t i; |    size_t i; | ||||||
| @ -316,10 +318,12 @@ static void r32(png_uint_32p p32, size_t count) | |||||||
| 
 | 
 | ||||||
| #define R32(this)\ | #define R32(this)\ | ||||||
|    r32(&(this), (sizeof (this))/(sizeof (png_uint_32))) |    r32(&(this), (sizeof (this))/(sizeof (png_uint_32))) | ||||||
|  | #endif /* READ_FILLER || READ_RGB_TO_GRAY */ | ||||||
| 
 | 
 | ||||||
| #endif /* READ || WRITE_tRNS || WRITE_FILTER */ | #endif /* READ || WRITE_tRNS || WRITE_FILTER */ | ||||||
| 
 | 
 | ||||||
| #ifdef PNG_READ_TRANSFORMS_SUPPORTED | #if defined PNG_READ_TRANSFORMS_SUPPORTED ||\ | ||||||
|  |     defined PNG_WRITE_FILTER_SUPPORTED | ||||||
| static unsigned int | static unsigned int | ||||||
| random_mod(unsigned int max) | random_mod(unsigned int max) | ||||||
| { | { | ||||||
| @ -329,6 +333,7 @@ random_mod(unsigned int max) | |||||||
| 
 | 
 | ||||||
|    return x % max; /* 0 .. max-1 */ |    return x % max; /* 0 .. max-1 */ | ||||||
| } | } | ||||||
|  | #endif /* READ_TRANSFORMS || WRITE_FILTER */ | ||||||
| 
 | 
 | ||||||
| #if (defined PNG_READ_RGB_TO_GRAY_SUPPORTED) ||\ | #if (defined PNG_READ_RGB_TO_GRAY_SUPPORTED) ||\ | ||||||
|     (defined PNG_READ_FILLER_SUPPORTED) |     (defined PNG_READ_FILLER_SUPPORTED) | ||||||
| @ -342,7 +347,6 @@ random_choice(void) | |||||||
|    return x & 1; |    return x & 1; | ||||||
| } | } | ||||||
| #endif /* READ_RGB_TO_GRAY || READ_FILLER */ | #endif /* READ_RGB_TO_GRAY || READ_FILLER */ | ||||||
| #endif /* READ_TRANSFORMS */ |  | ||||||
| 
 | 
 | ||||||
| /* A numeric ID based on PNG file characteristics.  The 'do_interlace' field
 | /* A numeric ID based on PNG file characteristics.  The 'do_interlace' field
 | ||||||
|  * simply records whether pngvalid did the interlace itself or whether it |  * simply records whether pngvalid did the interlace itself or whether it | ||||||
| @ -7662,25 +7666,32 @@ image_transform_png_set_rgb_to_gray_mod(const image_transform *this, | |||||||
| 
 | 
 | ||||||
|          else |          else | ||||||
|          { |          { | ||||||
|             err = fabs(grayhi-gray); |             double err_check = err = fabs(grayhi-gray); | ||||||
|  |             /* If graylo got reduced to 0 the errors escalate for low data.gamma
 | ||||||
|  |              * values, so ignore that case when digitizing: | ||||||
|  |              */ | ||||||
|             if (fabs(gray - graylo) > err) |             if (fabs(gray - graylo) > err) | ||||||
|  |             { | ||||||
|                err = fabs(graylo-gray); |                err = fabs(graylo-gray); | ||||||
|  |                if (graylo != 0) | ||||||
|  |                   err_check = err; | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             /* Check that this worked: */ |             /* Check that this worked: */ | ||||||
|             if (err > pm->limit) |             if (err_check > pm->limit) | ||||||
|             { |             { | ||||||
|                size_t pos = 0; |                size_t pos = 0; | ||||||
|                char buffer[128]; |                char buffer[128]; | ||||||
| 
 | 
 | ||||||
|                pos = safecat(buffer, sizeof buffer, pos, "rgb_to_gray error "); |                pos = safecat(buffer, sizeof buffer, pos, "rgb_to_gray error "); | ||||||
|                pos = safecatd(buffer, sizeof buffer, pos, err, 6); |                pos = safecatd(buffer, sizeof buffer, pos, err_check, 6); | ||||||
|                pos = safecat(buffer, sizeof buffer, pos, " exceeds limit "); |                pos = safecat(buffer, sizeof buffer, pos, " exceeds limit "); | ||||||
|                pos = safecatd(buffer, sizeof buffer, pos, pm->limit, 6); |                pos = safecatd(buffer, sizeof buffer, pos, pm->limit, 6); | ||||||
|                png_error(pp, buffer); |                png_error(pp, buffer); | ||||||
|             } |             } | ||||||
|          } |          } | ||||||
|       } |       } | ||||||
| #  else  /* DIGITIZE */ | #  else  /* !DIGITIZE */ | ||||||
|       { |       { | ||||||
|          double r = that->redf; |          double r = that->redf; | ||||||
|          double re = that->rede; |          double re = that->rede; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 John Bowler
						John Bowler