63 if ( png_sig_cmp (
static_cast<uint8_t *
> (
const_cast<void *
> ( aBuffer ) ), 0, 8 ) != 0 )
70 png_create_read_struct ( PNG_LIBPNG_VER_STRING,
71 nullptr,
nullptr,
nullptr );
72 if ( png_ptr ==
nullptr )
74 std::cout <<
LogLevel::Error <<
"png_create_read_struct failed." << std::endl;
75 throw std::runtime_error (
"png_create_read_struct failed." );
77 png_infop info_ptr = png_create_info_struct ( png_ptr );
78 if ( info_ptr ==
nullptr )
80 std::cout <<
LogLevel::Error <<
"png_create_info_struct failed." << std::endl;
81 throw std::runtime_error (
"png_create_info_struct failed." );
83 if ( setjmp ( png_jmpbuf ( png_ptr ) ) )
86 throw std::runtime_error (
"Error during init_io." );
88 png_read_memory_struct read_memory_struct = {
static_cast<const uint8_t*
> ( aBuffer ),
static_cast<const uint8_t*
> ( aBuffer ) + 8,
89 static_cast<png_size_t
> ( aBufferSize *
sizeof ( uint8_t ) )
91 png_set_read_fn ( png_ptr, &read_memory_struct, png_read_memory_data );
92 png_set_sig_bytes ( png_ptr, 8 );
94 png_read_info ( png_ptr, info_ptr );
96 uint32_t width = png_get_image_width ( png_ptr, info_ptr );
97 uint32_t height = png_get_image_height ( png_ptr, info_ptr );
98 png_byte color_type = png_get_color_type ( png_ptr, info_ptr );
99 png_byte bit_depth = png_get_bit_depth ( png_ptr, info_ptr );
103 if ( ( color_type == PNG_COLOR_TYPE_RGB ) || ( color_type == PNG_COLOR_TYPE_RGBA ) )
110 std::cout <<
LogLevel::Error <<
"PNG image color type not supported...yet" << std::endl;
111 throw std::runtime_error (
"PNG image color type not supported...yet" );
114 png_set_interlace_handling ( png_ptr );
115 png_read_update_info ( png_ptr, info_ptr );
118 if ( setjmp ( png_jmpbuf ( png_ptr ) ) )
120 std::cout <<
LogLevel::Error <<
"Error during read_image." << std::endl;
121 throw std::runtime_error (
"Error during read_image." );
124 png_size_t rowbytes = png_get_rowbytes ( png_ptr, info_ptr );
125 std::vector<uint8_t*> row_pointers (
sizeof ( png_bytep ) * height );
126 std::vector<uint8_t> pixels ( width * height * GetPixelSize ( format, type ) );
127 for ( png_uint_32 y = 0; y < height; ++y )
129 row_pointers[y] = pixels.data() + ( rowbytes * y );
132 png_read_image ( png_ptr, row_pointers.data() );
133 png_destroy_read_struct ( &png_ptr, &info_ptr, ( png_infopp )
nullptr );
134 aTexture.
Resize ( width, height, pixels.data(), format, type );
136 catch (
const std::runtime_error& e )
138 std::cout << e.what() << std::endl;
Represents a 2D texture image resource.
DLL void Resize(uint32_t aWidth, uint32_t aHeight, const uint8_t *aPixels=nullptr, Format aFormat=Format::Unknown, Type aType=Type::Unknown)
Resizes the texture and optionally replaces pixel data.
Type
Pixel component data type.
@ UNSIGNED_SHORT
16-bit unsigned integer per channel.
@ UNSIGNED_BYTE
8-bit unsigned integer per channel.
Format
Pixel channel layout format.
@ RGB
3-channel red, green, blue.
@ RGBA
4-channel red, green, blue, alpha.