www.pudn.com > Cimage.zip > IMABMP.CPP


/* 
 * File:	wbimage.cc 
 * Purpose:	Platform Independent Image Base Class (Windows version) 
 * Author:	Alejandro Aguilar Sierra 
 * Created:	1995 
 * Copyright:	(c) 1995 Alejandro Aguilar Sierra  
 */ 
#include "imabmp.h" 
 
#if CIMAGE_SUPPORT_BMP 
#include "dibutils.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
CImageBMP::CImageBMP( const CBitmap* bmp) 
{ 
  bgindex = -1; 
  lpbi = 0; 
  RawImage = 0; 
  imagePalette = 0; 
  if (bmp) { 
          
      BITMAP bm; 
	  HBITMAP hBitmap = (HBITMAP)(bmp->GetSafeHandle()); 
      GetObject(hBitmap, sizeof(BITMAP), (LPSTR) &bm); 
      int width = bm.bmWidth; 
      int height = bm.bmHeight; 
//      int depth = bm.bmPlanes; 
	  int depth = bm.bmBitsPixel; 
      Create(width, height, depth); 
      HDC dc = ::GetDC(NULL); 
      if (GetDIBits(dc, hBitmap, 0, GetHeight(), 
		RawImage, (LPBITMAPINFO)lpbi, DIB_RGB_COLORS) == 0) 
      { 
        TRACE0("GetDIBits failed");        
      } 
      ::ReleaseDC(NULL, dc); 
  } 
} 
 
BOOL CImageBMP::ReadFile(const CString& imageFileName) 
{ 
  if (imageFileName != "") 
	 filename = imageFileName; 
 
  if (lpbi = DibOpenFile((char *)(const char *)filename))  { 
		Width =  DibWidth(lpbi); 
		Height = DibHeight(lpbi); 
		Depth = DibBitCount(lpbi); 
		RawImage = (ImagePointerType)DibPtr(lpbi); 
		EffWidth = (long)(((long)Width*Depth + 31) / 32) * 4; 
		HPALETTE palette; 
		if (palette = MakePalette((const BITMAPINFO FAR*)lpbi, 0)) 
		{ 
		  imagePalette = new CImagePalette; 
		  imagePalette->Attach(palette); 
		  DibSetUsage(lpbi, (HPALETTE) (*imagePalette), CIMAGE_COLORS); 
		  ColorType = (COLORTYPE_PALETTE | COLORTYPE_COLOR); 
		}  
 
		return TRUE; 
  } 
  return FALSE; 
} 
 
 
BOOL CImageBMP::SaveFile(const CString& imageFileName) 
{                          
  if (imageFileName != "") 
	 filename = imageFileName; 
 
  HPALETTE hPal = 0; 
  if (imagePalette) 
    hPal = (HPALETTE) (*imagePalette); 
     
  DibSetUsage(lpbi, hPal, DIB_RGB_COLORS); 
//  DibSetUsage(lpbi, hPal, DIB_PAL_COLORS); 
 
  return WriteDIB((const char *)imageFileName, lpbi); 
/* 
//  return WriteDIB(ImageFileName, HandleFromDib(lpbi)); 
  // This was the original code used in wxImage, but the resulting 
  // file isn't a valid BMP file. 
  DibSetUsage(lpbi, (HPALETTE) (*imagePalette), DIB_RGB_COLORS); 
  if (!DibWriteFile((char *)(const char *)filename, lpbi)) 
	return FALSE; 
	else return TRUE; 
*/ 
} 
 
#endif 	// CIMAGE_SUPPORT_BMP