SIO2 PNG Loader Bug

View previous topic View next topic Go down

SIO2 PNG Loader Bug

Post  sio2interactive on Tue Jan 27, 2009 2:12 am

Please find the fix of the PNG loader... sorry for the inconvenience...


Code:


void sio2ImageLoadPNG( SIO2image  *_SIO2image,
                 SIO2stream *_SIO2stream )
{
   png_structp _png_structp;
   
   png_infop _png_infop;
   
   png_bytep *_png_bytep;

   int   i = 0,
      bits,
      type;

   _png_structp = png_create_read_struct( PNG_LIBPNG_VER_STRING,
                                ( png_voidp * )_SIO2stream->fname,
                                NULL, NULL );

   _png_infop = png_create_info_struct( _png_structp );
   
   png_set_read_fn( _png_structp, ( png_voidp * )_SIO2stream, sio2PngRead );
   
   png_read_info (_png_structp, _png_infop);


   bits = png_get_bit_depth ( _png_structp, _png_infop );
   type = png_get_color_type( _png_structp, _png_infop );


   if( type == PNG_COLOR_TYPE_PALETTE )
   { png_set_palette_to_rgb( _png_structp ); }
   
   if( type == PNG_COLOR_TYPE_GRAY && bits < 8 )
   { png_set_gray_1_2_4_to_8( _png_structp ); }

   if( png_get_valid( _png_structp, _png_infop, PNG_INFO_tRNS ) )
   { png_set_tRNS_to_alpha (_png_structp); }
   
   
   if( bits == 16 )
   { png_set_strip_16( _png_structp ); }
   
   else if( bits < 8 )
    { png_set_packing( _png_structp ); }

   png_read_update_info( _png_structp, _png_infop );

   png_get_IHDR( _png_structp,
              _png_infop,
              ( png_uint_32 * )( &_SIO2image->width  ),
              ( png_uint_32 * )( &_SIO2image->height ),
              &bits,
              &type,
              NULL, NULL, NULL );

   switch( type )
   {
      case PNG_COLOR_TYPE_GRAY:
      {
         _SIO2image->bits = 1;
         break;
      }

      case PNG_COLOR_TYPE_GRAY_ALPHA:
      {
         _SIO2image->bits = 2;
         break;
      }
            
      case PNG_COLOR_TYPE_RGB:
      {
         _SIO2image->bits = 3;
         break;
      }

      case PNG_COLOR_TYPE_RGB_ALPHA:
      {
         _SIO2image->bits = 4;
         break;
      }      
   }

   _SIO2image->tex = ( unsigned char * ) malloc( _SIO2image->width  *
                                      _SIO2image->height *
                                      _SIO2image->bits );

   _png_bytep = ( png_bytep * ) malloc( _SIO2image->height * sizeof( png_bytep ) );

   while( i < _SIO2image->height )
   {
      _png_bytep[ i ] = ( png_bytep )(  _SIO2image->tex    +
                               ( _SIO2image->height - ( i + 1 ) ) *
                                _SIO2image->width  *
                                _SIO2image->bits );
      ++i;
   }

   png_read_image( _png_structp,
               _png_bytep );

   png_read_end( _png_structp, NULL );

   png_destroy_read_struct( &_png_structp,
                      &_png_infop, NULL );
   free( _png_bytep );
   
   sio2ImageFlip( _SIO2image );
   
   if( _SIO2image->bits == 4 )
   { sio2ImageRGBAtoBGRA( _SIO2image ); }
}


avatar
sio2interactive

Posts : 1526
Join date : 2008-08-26
Age : 38
Location : Shanghai

View user profile http://sio2interactive.com

Back to top Go down

View previous topic View next topic Back to top

- Similar topics

 
Permissions in this forum:
You cannot reply to topics in this forum