の中でExpression:_CrtIsValidHeapPointerのエラーが起きてしまいます。
どこがおかしいのか教えてください。
libpng1.6.5 とzlib1.2.8を使っています。
Visual studio2013 を使っています。
OSは Windows7 Professionalです。
bool PngLoad::loadPngFileTexture( Texture* texture, const char* fileName )
{
FILE *fp;
png_structp png_ptr;
png_infop info_ptr;
png_uint_32 width;
png_uint_32 height;
int bit_depth;
int color_type;
int interlace_type;
png_byte** image;
png_bytep tex_image;
//ファイルを開く
fopen_s( &fp, fileName, "rb" );
if( !fp )
{
DEBUG_LOG("%s ファイルが開けませんでした。",fileName);
return ERROR;
}
//png_ptr構造体を確保・初期化
png_ptr = png_create_read_struct( PNG_LIBPNG_VER_STRING, NULL, NULL, NULL );
//確保・初期化に失敗したら
if( !png_ptr )
{
//ファイルを閉じる
fclose( fp );
return false;
}
//info_ptr構造体を確保・初期化
info_ptr = png_create_info_struct( png_ptr );
//確保・初期化に失敗したら
if( !info_ptr )
{
//構造体のメモリを解放
png_destroy_read_struct( &png_ptr, (png_infopp)NULL, (png_infopp)NULL);
//ファイルを閉じる
fclose( fp );
return false;
}
//libpngにfpを知らせる
png_init_io( png_ptr, fp );
//PNGファイルのヘッダを読み込む
png_read_info( png_ptr, info_ptr );
//IHDRチャンク情報を取得
png_get_IHDR( png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL );
float screen_gamma = 2.2f;
double image_gamma;
int intent;
if( png_get_sRGB( png_ptr, info_ptr, &intent ) )
{
png_set_gamma( png_ptr, screen_gamma, 0.45455 );
}
else if( png_get_gAMA( png_ptr, info_ptr, &image_gamma ) )
{
png_set_gamma( png_ptr, screen_gamma, image_gamma );
}
if( color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
{
//グレイスケール画像をRGB形式に変換
png_set_gray_to_rgb(png_ptr);
}
if( color_type == PNG_COLOR_TYPE_PALETTE )
{
//パレット付き画像をRGB形式に変換
png_set_palette_to_rgb(png_ptr);
}
if( bit_depth < 8 )
{
//各要素8ビットに拡張
png_set_packing( png_ptr );
}
if( bit_depth < 8 )
{
//各要素8ビットに縮小
png_set_strip_16( png_ptr );
}
//tRNSチャンクがあれば
if( png_get_valid( png_ptr, info_ptr, PNG_INFO_tRNS ) )
{
//tRNSチャンクをアルファチャンネルに変換
png_set_tRNS_to_alpha( png_ptr );
}
else if( !( color_type & PNG_COLOR_MASK_ALPHA ) )
{
// 不透明で埋めた完全なアルファチャンネルを追加
png_set_add_alpha( png_ptr, 0xff, PNG_FILLER_AFTER);
}
png_read_update_info( png_ptr, info_ptr );
//メモリを確保する
texture->inisialize( TEX_RGBA, width, height );
tex_image = (png_bytep)texture->lockTexture();
image = (png_bytep*)malloc( sizeof( unsigned int ) * height * width );
for( unsigned int i = 0 ; i < height ; i++ )
{
image[i] = &tex_image[i * width * sizeof(unsigned int)];
}
png_read_image( png_ptr, image );
free( image );
png_read_end(png_ptr, info_ptr);
//構造体のメモリを解放
png_destroy_read_struct( &png_ptr, &info_ptr, (png_infopp)NULL);
//ファイルを閉じる
fclose( fp );
return true;
}