1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- /*
- * Copyright (C) =USTC= Fu Li
- *
- * Author : Fu Li
- * Create : 2006-2-26
- * Home : http://www.crazy-bit.com/
- * Mail : crazybit@263.net
- * History :
- */
- #ifndef __FOO_FREEIMAGE_HELPER__2006_02_26__H__
- #define __FOO_FREEIMAGE_HELPER__2006_02_26__H__
- #include "ObjImage.h"
- //=============================================================================
- inline bool __pcl_FreeImage_to_PCLImage (FIBITMAP* pFIimg, FCObjImage& img)
- {
- if (!pFIimg)
- return false ;
- // prepare image info
- BYTE __bufImgInfo[sizeof(BITMAPINFOHEADER) + 16] = {0} ;
- BITMAPINFOHEADER * pInfo = (BITMAPINFOHEADER*)__bufImgInfo ;
- memcpy (pInfo, FreeImage_GetInfoHeader(pFIimg), sizeof(BITMAPINFOHEADER)) ;
- if (pInfo->biCompression == BI_BITFIELDS)
- {
- DWORD * pMask = (DWORD*)(pInfo + 1) ;
- pMask[0] = FreeImage_GetRedMask (pFIimg) ;
- pMask[1] = FreeImage_GetGreenMask (pFIimg) ;
- pMask[2] = FreeImage_GetBlueMask (pFIimg) ;
- }
- // create image
- if (!img.Create(pInfo))
- return false ;
- // set palette
- if (img.ColorBits() <= 8)
- img.SetColorTable (0, FreeImage_GetColorsUsed(pFIimg), FreeImage_GetPalette(pFIimg)) ;
- // set pixel
- assert (img.GetPitch() == FreeImage_GetPitch(pFIimg)) ;
- memcpy (img.GetMemStart(), FreeImage_GetBits(pFIimg), img.GetPitch()*img.Height()) ;
- // transparency
- if ((img.ColorBits() <= 8) && FreeImage_IsTransparent(pFIimg))
- {
- FCObjImage idxImg (img) ;
- int n = (int)FreeImage_GetTransparencyCount(pFIimg) ;
- BYTE * p = FreeImage_GetTransparencyTable(pFIimg) ;
- img.ConvertTo32Bit() ;
- for (int y=0 ; y < img.Height() ; y++)
- for (int x=0 ; x < img.Width() ; x++)
- {
- int nIndex = *idxImg.GetBits(x,y) ;
- if (nIndex < n)
- PCL_A(img.GetBits(x,y)) = p[nIndex] ;
- }
- }
- return true ;
- }
- //=============================================================================
- inline FIBITMAP* __pcl_AllocateFreeImage (const FCObjImage& img)
- {
- if (!img.IsValidImage())
- return 0 ;
- // create FreeImage object
- DWORD dwBitFields[3] = {0, 0, 0} ;
- if (img.ColorBits() == 16)
- {
- PCL_array<BITMAPINFOHEADER> info (img.NewImgInfoWithPalette()) ;
- memcpy (dwBitFields, info.get() + 1, 12) ;
- }
- FIBITMAP * pFIimg = FreeImage_AllocateT (FIT_BITMAP, img.Width(), img.Height(), img.ColorBits(), dwBitFields[0], dwBitFields[1], dwBitFields[2]) ;
- if (!pFIimg)
- return 0 ;
- // set pixel
- assert (img.GetPitch() == FreeImage_GetPitch(pFIimg)) ;
- memcpy (FreeImage_GetBits(pFIimg), img.GetMemStart(), img.GetPitch()*img.Height()) ;
- // set palette
- if (img.ColorBits() <= 8)
- {
- RGBQUAD pPal[256] = {0} ;
- img.GetColorTable (0, 1<<img.ColorBits(), pPal) ;
- memcpy (FreeImage_GetPalette(pFIimg), pPal, FreeImage_GetColorsUsed(pFIimg)*sizeof(RGBQUAD)) ;
- }
- return pFIimg ;
- }
- //=============================================================================
- #endif
|