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
							
								
									c5e81c51d9
								
							
						
					
					
						commit
						6cc84b3c44
					
				@ -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