CIMAGEB.CPP
上传用户:wep9318
上传日期:2007-01-07
资源大小:893k
文件大小:7k
源码类别:

图片显示

开发平台:

Visual C++

  1. /*
  2.  * File: cimageb.cc
  3.  * Purpose: Platform Independent Image Base Class (Windows version)
  4.  * Author: Alejandro Aguilar Sierra
  5.  * Created: 1995
  6.  * Copyright: (c) 1995 Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
  7.  */
  8. #include "stdafx.h"
  9. #include <windowsx.h>
  10. #include "cmap.h"
  11. #include "cimageb.h"
  12. #include "dibutils.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. void
  19. CImageImpl::Create(int width, int height, int depth, int colortype)
  20. {
  21.   Width = width; Height = height; Depth = depth;
  22.   ColorType = (colortype>=0) ? colortype: ((Depth>8) ? COLORTYPE_COLOR: 0);
  23.   if (lpbi)
  24.     GlobalFreePtr(lpbi);
  25.   RawImage = 0;
  26.   if (imagePalette)
  27.     delete imagePalette;
  28.   imagePalette = 0;
  29.   if (lpbi = DibCreate(Depth, Width, Height))  {
  30. RawImage = (ImagePointerType)DibPtr(lpbi);
  31. EffWidth = (long)(((long)Width*Depth + 31) / 32) * 4;
  32.   }
  33. }
  34. CImageImpl::~CImageImpl ( )
  35. {
  36.   if (lpbi)  {
  37.  GlobalFreePtr(lpbi);
  38.  delete imagePalette;
  39.   }
  40. }
  41. int CImageImpl::GetIndex(int x, int y)
  42. {
  43.   if (!Inside(x, y) || (Depth>8)) return -1;
  44.   ImagePointerType ImagePointer = RawImage + EffWidth*y + (x*Depth >> 3);
  45.   int index = (int)(*ImagePointer);
  46.   return index;
  47. }
  48. BOOL CImageImpl::GetRGB(int x, int y, byte* r, byte* g, byte* b)
  49. {
  50.   if (!Inside(x, y)) return FALSE;
  51.   if (imagePalette) {
  52.  return imagePalette->GetRGB(GetIndex(x, y), r, g, b);
  53. /*  PALETTEENTRY entry;
  54.  ::GetPaletteEntries((HPALETTE) (*imagePalette), GetIndex(x, y), 1, &entry);
  55.  *r = entry.peRed;
  56.  *g = entry.peGreen;
  57.  *b = entry.peBlue;  */
  58.   } else {
  59.  ImagePointerType ImagePointer = RawImage + EffWidth*y + (x*Depth >> 3);
  60.  *b = ImagePointer[0];
  61.  *g = ImagePointer[1];
  62.  *r = ImagePointer[2];
  63.   }
  64.   return TRUE;
  65. }
  66. BOOL CImageImpl::SetIndex(int x, int y, int index)
  67. {
  68.   if (!Inside(x, y) || (Depth>8)) return FALSE;
  69.   ImagePointerType ImagePointer = RawImage + EffWidth*y + (x*Depth >> 3);
  70.   *ImagePointer = index;
  71.   return TRUE;
  72. }
  73. BOOL CImageImpl::SetRGB(int x, int y, byte r, byte g, byte b)
  74. {
  75.   if (!Inside(x, y)) return FALSE;
  76.   if (ColorType & COLORTYPE_PALETTE)
  77.   {
  78.  if (!imagePalette) return FALSE;
  79.  SetIndex(x, y, imagePalette->GetPixel(r, g, b));
  80.   } else {
  81.  ImagePointerType ImagePointer = RawImage + EffWidth*y + (x*Depth >> 3);
  82.  ImagePointer[0] = b;
  83.  ImagePointer[1] = g;
  84.  ImagePointer[2] = r;
  85.   }
  86.   return TRUE;
  87. }
  88. BOOL CImageImpl::SetPalette(CImagePalette* colourmap)
  89. {
  90.   if (!colourmap)
  91.  return FALSE;
  92.   ColorType |= (COLORTYPE_PALETTE | COLORTYPE_COLOR);
  93.   imagePalette = colourmap;
  94.   return DibSetUsage(lpbi, (HPALETTE) (*imagePalette), CIMAGE_COLORS );
  95. }
  96. BOOL
  97. CImageImpl::SetPalette(int n, byte *r, byte *g, byte *b)
  98. {
  99.   imagePalette = new CImagePalette();
  100.   if (!imagePalette)
  101.  return FALSE;
  102.   if (!g) g = r;
  103.   if (!b) b = g;
  104.   imagePalette->Create(n, r, g, b);
  105.   ColorType |= (COLORTYPE_PALETTE | COLORTYPE_COLOR);
  106.   return DibSetUsage(lpbi, (HPALETTE) (*imagePalette), CIMAGE_COLORS );
  107. }
  108. BOOL
  109. CImageImpl::SetPalette(int n, rgb_color_struct *rgb_struct)
  110. {
  111.   if (imagePalette)
  112.     AfxMessageBox("CImageImpl::imagePalette already exists!");
  113.     
  114.   imagePalette = new CImagePalette();
  115.   if (!imagePalette)
  116.  return FALSE;
  117.   byte r[256], g[256], b[256];
  118.   for(int i=0; i<n; i++)
  119.   {
  120.  r[i] = rgb_struct[i].red;
  121.  g[i] = rgb_struct[i].green;
  122.  b[i] = rgb_struct[i].blue;
  123.   }
  124.   imagePalette->Create(n, r, g, b);
  125.   ColorType |= (COLORTYPE_PALETTE | COLORTYPE_COLOR);
  126.   return DibSetUsage(lpbi, (HPALETTE) (*imagePalette), CIMAGE_COLORS );
  127. }
  128. BOOL CImageImpl::Draw(CDC *cdc, int x, int y, int dx, int dy, int xs, int ys)
  129. {
  130.   if (lpbi)
  131.   {
  132.  HDC dc = cdc->GetSafeHdc();
  133.  if (dc)   {
  134. ::RealizePalette(dc);
  135. if (dx==-1)  dx = GetWidth();
  136. if (dy==-1)  dy = GetHeight();
  137. SetDIBitsToDevice(dc, x, y, dx, dy, xs, 0, ys, dy,
  138. RawImage, (BITMAPINFO *)lpbi, CIMAGE_COLORS );
  139.  }
  140.  return TRUE;
  141.   }
  142.   else
  143.  return FALSE;
  144. }
  145. BOOL CImageImpl::Stretch(CDC *cdc, int xd, int yd, int dxd, int dyd,
  146.  int xs, int ys, int dxs, int dys)
  147. {
  148.   if (lpbi)
  149.   {
  150. HDC dc =  cdc->GetSafeHdc();
  151.  if (dc)   {
  152. if (dxd==-1) dxd = GetWidth();
  153. if (dyd==-1) dyd = GetHeight();
  154. if (dxs==-1) dxs = Width - xs;
  155. if (dys==-1) dys = Height - ys;
  156. ::RealizePalette(dc);
  157. #ifdef WIN32       // Paul Shirley's patch
  158. SetStretchBltMode(dc, COLORONCOLOR);
  159. #else
  160. SetStretchBltMode(dc, STRETCH_DELETESCANS);
  161. #endif
  162.   if (bgindex == -1)
  163.   {
  164. StretchDIBits(dc, xd, yd, dxd, dyd, xs, ys, dxs, dys,
  165. RawImage, (BITMAPINFO *)lpbi, CIMAGE_COLORS, SRCCOPY);
  166. }
  167. else
  168. {
  169. //HDC tmpdc = CreateCompatibleDC(dc);
  170. //HBITMAP tmpbmp = CreateCompatibleBitmap(dc, dxd, dyd);
  171. //SelectObject(tmpdc, tmpbmp);
  172. //BitBlt(tmpdc, 0, 0, dxd, dyd, dc, xd, yd, SRCCOPY);
  173. unsigned char* save_index = new unsigned char[Height*Width];
  174. int black = imagePalette->GetPixel(0, 0, 0);
  175. int white = imagePalette->GetPixel(255, 255, 255);
  176. // Make background white and foreground black to use as mask...
  177. int x, y;
  178. for (y = 0; y < Height; y++)
  179. for (x = 0; x < Width; x++)
  180. {
  181. long i = ((long)y*Width)+x;
  182. save_index[i] = (unsigned char)GetIndex(x, y);
  183. if (GetIndex(x, y) == bgindex)
  184. SetIndex(x, y, white);
  185. else
  186. SetIndex(x, y, black);
  187. }
  188. // AND into the canvas, this will preserve the background but
  189. // turn the foreground white...
  190. //StretchDIBits(tmpdc, 0, 0, dxd, dyd, xs, ys, dxs, dys,
  191. StretchDIBits(dc, xd, yd, dxd, dyd, xs, ys, dxs, dys,
  192. RawImage, (BITMAPINFO *)lpbi, CIMAGE_COLORS, SRCAND);
  193. // Restore foreground & make background black...
  194. for (y = 0; y < Height; y++)
  195. for (x = 0; x < Width; x++)
  196. {
  197. long i = ((long)y*Width)+x;
  198. SetIndex(x, y, save_index[i]);
  199. if (GetIndex(x, y) == bgindex)
  200. SetIndex(x, y, black);
  201. }
  202. // OR into the canvas, this will preserve the background but
  203. // copy the foreground...
  204. //StretchDIBits(tmpdc, 0, 0, dxd, dyd, xs, ys, dxs, dys,
  205. StretchDIBits(dc, xd, yd, dxd, dyd, xs, ys, dxs, dys,
  206. RawImage, (BITMAPINFO *)lpbi, CIMAGE_COLORS, SRCPAINT);
  207. for (y = 0; y < Height; y++)
  208. for (x = 0; x < Width; x++)
  209. {
  210. long i = ((long)y*Width)+x;
  211. SetIndex(x, y, save_index[i]);
  212. }
  213. delete [] save_index;
  214. //BitBlt(dc, xd, yd, dxd, dyd, tmpdc, 0, 0, SRCCOPY);
  215. //DeleteDC(tmpdc);
  216. //DeleteObject(tmpbmp);
  217. }
  218.  }
  219.  return TRUE;
  220.   }
  221.   else
  222.  return FALSE;
  223. }
  224. void CImageImpl::TransferBits(CImageImpl *from)
  225. {
  226.   if (lpbi)
  227.   {
  228.     GlobalFreePtr(lpbi);
  229.     lpbi = NULL;
  230.   }
  231.   if (imagePalette)
  232.   {
  233.     delete imagePalette;
  234.     imagePalette = NULL;
  235.   }
  236.   lpbi = from->lpbi;
  237.   bgindex = from->bgindex;
  238.   imagePalette = from->imagePalette;
  239.   RawImage = from->RawImage;
  240.   Width = from->Width;
  241.   Height = from->Height;
  242.   Depth = from->Depth;
  243.   ColorType = from->ColorType;
  244.   EffWidth = from->EffWidth;
  245.   
  246.   from->RawImage = NULL;
  247.   from->lpbi = NULL;
  248.   from->imagePalette = NULL;
  249. }