FreeImage_Helper.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * Copyright (C) =USTC= Fu Li
  3. *
  4. * Author : Fu Li
  5. * Create : 2006-2-26
  6. * Home : http://www.crazy-bit.com/
  7. * Mail : crazybit@263.net
  8. * History :
  9. */
  10. #ifndef __FOO_FREEIMAGE_HELPER__2006_02_26__H__
  11. #define __FOO_FREEIMAGE_HELPER__2006_02_26__H__
  12. #include "ObjImage.h"
  13. //=============================================================================
  14. inline bool __pcl_FreeImage_to_PCLImage (FIBITMAP* pFIimg, FCObjImage& img)
  15. {
  16. if (!pFIimg)
  17. return false ;
  18. // prepare image info
  19. BYTE __bufImgInfo[sizeof(BITMAPINFOHEADER) + 16] = {0} ;
  20. BITMAPINFOHEADER * pInfo = (BITMAPINFOHEADER*)__bufImgInfo ;
  21. memcpy (pInfo, FreeImage_GetInfoHeader(pFIimg), sizeof(BITMAPINFOHEADER)) ;
  22. if (pInfo->biCompression == BI_BITFIELDS)
  23. {
  24. DWORD * pMask = (DWORD*)(pInfo + 1) ;
  25. pMask[0] = FreeImage_GetRedMask (pFIimg) ;
  26. pMask[1] = FreeImage_GetGreenMask (pFIimg) ;
  27. pMask[2] = FreeImage_GetBlueMask (pFIimg) ;
  28. }
  29. // create image
  30. if (!img.Create(pInfo))
  31. return false ;
  32. // set palette
  33. if (img.ColorBits() <= 8)
  34. img.SetColorTable (0, FreeImage_GetColorsUsed(pFIimg), FreeImage_GetPalette(pFIimg)) ;
  35. // set pixel
  36. assert (img.GetPitch() == FreeImage_GetPitch(pFIimg)) ;
  37. memcpy (img.GetMemStart(), FreeImage_GetBits(pFIimg), img.GetPitch()*img.Height()) ;
  38. // transparency
  39. if ((img.ColorBits() <= 8) && FreeImage_IsTransparent(pFIimg))
  40. {
  41. FCObjImage idxImg (img) ;
  42. int n = (int)FreeImage_GetTransparencyCount(pFIimg) ;
  43. BYTE * p = FreeImage_GetTransparencyTable(pFIimg) ;
  44. img.ConvertTo32Bit() ;
  45. for (int y=0 ; y < img.Height() ; y++)
  46. for (int x=0 ; x < img.Width() ; x++)
  47. {
  48. int nIndex = *idxImg.GetBits(x,y) ;
  49. if (nIndex < n)
  50. PCL_A(img.GetBits(x,y)) = p[nIndex] ;
  51. }
  52. }
  53. return true ;
  54. }
  55. //=============================================================================
  56. inline FIBITMAP* __pcl_AllocateFreeImage (const FCObjImage& img)
  57. {
  58. if (!img.IsValidImage())
  59. return 0 ;
  60. // create FreeImage object
  61. DWORD dwBitFields[3] = {0, 0, 0} ;
  62. if (img.ColorBits() == 16)
  63. {
  64. PCL_array<BITMAPINFOHEADER> info (img.NewImgInfoWithPalette()) ;
  65. memcpy (dwBitFields, info.get() + 1, 12) ;
  66. }
  67. FIBITMAP * pFIimg = FreeImage_AllocateT (FIT_BITMAP, img.Width(), img.Height(), img.ColorBits(), dwBitFields[0], dwBitFields[1], dwBitFields[2]) ;
  68. if (!pFIimg)
  69. return 0 ;
  70. // set pixel
  71. assert (img.GetPitch() == FreeImage_GetPitch(pFIimg)) ;
  72. memcpy (FreeImage_GetBits(pFIimg), img.GetMemStart(), img.GetPitch()*img.Height()) ;
  73. // set palette
  74. if (img.ColorBits() <= 8)
  75. {
  76. RGBQUAD pPal[256] = {0} ;
  77. img.GetColorTable (0, 1<<img.ColorBits(), pPal) ;
  78. memcpy (FreeImage_GetPalette(pFIimg), pPal, FreeImage_GetColorsUsed(pFIimg)*sizeof(RGBQUAD)) ;
  79. }
  80. return pFIimg ;
  81. }
  82. //=============================================================================
  83. #endif