/* * 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 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<