1. png_voidp __cdecl PngAlloc( png_structp, png_alloc_size_t size )
  2. {
  3. return g_engineHeap.Alloc( size, __FILE__, __LINE__ );
  4. }
  5. void __cdecl PngFree( png_structp, png_voidp ptr )
  6. {
  7. wfHeap::Free( ptr );
  8. }
  9. void __cdecl PngRead( png_structp pngPtr, png_bytep data, png_size_t length )
  10. {
  11. u8* src = reinterpret_cast< u8* >( pngPtr->io_ptr );
  12. memcpy( data, src, length );
  13. pngPtr->io_ptr = src + length;
  14. }
  15.  
  16.  
  17.  
  18. u32* data = new( g_engineHeap )u32[ m_header.m_width * m_header.m_height ];
  19.  
  20. png_structp png = png_create_read_struct_2( PNG_LIBPNG_VER_STRING, NULL, NULL, NULL, NULL, PngAlloc, PngFree );
  21. png_infop pngInfo = png_create_info_struct( png );
  22. png_set_read_fn( png, rawData, PngRead );
  23.  
  24. u32* dst = data;
  25. png_bytepp rows = new( g_engineHeap )png_bytep[ m_header.m_height ];
  26. for( s32 rowIdx = 0; rowIdx != m_header.m_height; ++rowIdx )
  27. {
  28. rows[ rowIdx ] = reinterpret_cast< png_bytep >( dst );
  29. dst += m_header.m_width;
  30. }
  31. png_set_rows( png, pngInfo, rows );
  32. #ifdef WF_PC32
  33. png_read_png( png, pngInfo, PNG_TRANSFORM_BGR, NULL );
  34. #else
  35. png_read_png( png, pngInfo, PNG_TRANSFORM_SWAP_ALPHA, NULL );
  36. #endif
  37. delete[] rows;
  38.  
  39. png_destroy_read_struct( &png, &pngInfo, NULL );
  40.  
  41. return reinterpret_cast< u8* >( data );