savepng.cpp
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:2k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #include "fonted.h"
  2. #include "libPNGpng.h"
  3. class PNGError {};
  4. void WarningCallback(png_structp png_ptr,
  5.  png_const_charp msg)
  6. {
  7. hge->System_Log("LIBPNG Warning: %s", msg);
  8. }
  9. void ErrorCallback(png_structp png_ptr,
  10.    png_const_charp msg)
  11. {
  12. hge->System_Log("LIBPNG Error: %s", msg);
  13. throw PNGError();
  14. }
  15. bool Write32BitPNG(FILE* fp, void* pBits, bool bNeedAlpha, int nWidth, int nHeight)
  16. {
  17. png_structp png_ptr = 0;
  18. png_infop info_ptr = 0;
  19. try 
  20. {
  21. // create png structs
  22. png_ptr = png_create_write_struct
  23. (PNG_LIBPNG_VER_STRING, 0,
  24. ErrorCallback, WarningCallback);
  25. if (png_ptr == 0) return false;
  26. info_ptr = png_create_info_struct(png_ptr);
  27. if (info_ptr == 0) return false;
  28. // init i/o
  29. png_init_io(png_ptr, fp);
  30. // setup params
  31. if ( bNeedAlpha )
  32. {
  33. png_set_IHDR( png_ptr, info_ptr, nWidth, nHeight, 
  34. 8, 
  35. PNG_COLOR_TYPE_RGB_ALPHA, 
  36. PNG_INTERLACE_NONE,
  37. PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
  38. }
  39. else
  40. {
  41. png_set_IHDR( png_ptr, info_ptr, nWidth, nHeight, 
  42. 8, 
  43. PNG_COLOR_TYPE_RGB,
  44. PNG_INTERLACE_NONE,
  45. PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
  46. }
  47. png_write_info(png_ptr, info_ptr);
  48. if ( !bNeedAlpha )
  49. png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); // strip alpha
  50. png_set_bgr(png_ptr); // switch to little-endian notation
  51. // writing
  52. unsigned char* pSrc = (unsigned char*)pBits;
  53. for ( int i = 0; i < nHeight; i++, pSrc+= nWidth*4 )
  54. {
  55. png_write_row( png_ptr, pSrc );
  56. }
  57. png_write_end(png_ptr, info_ptr);
  58. catch(PNGError)
  59. {
  60. png_destroy_write_struct(&png_ptr, (info_ptr == 0) ? NULL : &info_ptr);
  61. return false;
  62. }
  63. // cleanup
  64. png_destroy_write_struct( &png_ptr, (info_ptr == 0) ? NULL : &info_ptr);
  65. return true;
  66. }
  67. bool SavePNG(HTEXTURE tex, char *filename)
  68. {
  69. FILE *fp=0;
  70. DWORD *pTexData=0;
  71. int nWidth, nHeight;
  72. try
  73. {
  74. fp=fopen(filename,"wb");
  75. if(!fp) throw PNGError();
  76. nWidth=hge->Texture_GetWidth(tex);
  77. nHeight=hge->Texture_GetHeight(tex);
  78. pTexData=hge->Texture_Lock(tex, true);
  79. if(!pTexData) throw PNGError();
  80. if(!Write32BitPNG(fp, pTexData, true, nWidth, nHeight)) throw PNGError();
  81. }
  82. catch(PNGError)
  83. {
  84. if(fp) fclose(fp);
  85. if(pTexData) hge->Texture_Unlock(tex);
  86. remove(filename);
  87. return false;
  88. }
  89. fclose(fp);
  90. hge->Texture_Unlock(tex);
  91. return true;
  92. }