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

图片显示

开发平台:

Visual C++

  1. /*
  2.  * Colour map class
  3.  *
  4.  */
  5. #include "stdafx.h"
  6. #include "cmap.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. CImagePalette::CImagePalette(const int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue)
  13. {
  14.   Create(n, red, green, blue);
  15. }
  16. CImagePalette::CImagePalette(const CImagePalette *pal)
  17. {
  18.   int count = ((CImagePalette *)pal)->GetEntryCount();
  19.   
  20.  LOGPALETTE* logPal = (LOGPALETTE*)
  21.  new BYTE[sizeof(LOGPALETTE) + count*sizeof(PALETTEENTRY)];
  22.   logPal->palVersion = 0x300;
  23.   logPal->palNumEntries = count;
  24.   pal->GetPaletteEntries(0, count, logPal->palPalEntry);
  25.   
  26.   CPalette::CreatePalette(logPal);
  27.   
  28.   delete logPal;
  29. }
  30. CImagePalette::~CImagePalette(void)
  31. {
  32.   HPALETTE pal = (HPALETTE) (*this);
  33.   Detach();
  34.   ::DeleteObject(pal);
  35. }
  36. BOOL CImagePalette::Create(const int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue)
  37. {
  38.   if ((HPALETTE) *this)
  39.     return FALSE;
  40.     
  41.   NPLOGPALETTE npPal = (NPLOGPALETTE)LocalAlloc(LMEM_FIXED, sizeof(LOGPALETTE) + 
  42.                         (WORD)n * sizeof(PALETTEENTRY));
  43.   if (!npPal)
  44.     return(FALSE);
  45.   npPal->palVersion = 0x300;
  46.   npPal->palNumEntries = n;
  47.   int i;
  48.   for (i = 0; i < n; i ++)
  49.   {
  50.     npPal->palPalEntry[i].peRed = red[i];
  51.     npPal->palPalEntry[i].peGreen = green[i];
  52.     npPal->palPalEntry[i].peBlue = blue[i];
  53.     npPal->palPalEntry[i].peFlags = 0;
  54.   }
  55.   HPALETTE ms_palette = ::CreatePalette((LPLOGPALETTE)npPal);
  56.   LocalFree((HANDLE)npPal);
  57.   Attach(ms_palette);
  58.   
  59.   return TRUE;
  60. }
  61. int CImagePalette::GetPixel(const unsigned char red, const unsigned char green, const unsigned char blue)
  62. {
  63.   return ::GetNearestPaletteIndex((HPALETTE) (*this), RGB(red, green, blue));
  64. }
  65. BOOL CImagePalette::GetRGB(const int index, unsigned char *red, unsigned char *green, unsigned char *blue)
  66. {
  67.   if (index < 0 || index > 255)
  68.          return FALSE;
  69.   PALETTEENTRY entry;
  70.   if (::GetPaletteEntries((HPALETTE) (*this), index, 1, &entry))
  71.   {
  72.          *red = entry.peRed;
  73.          *green = entry.peGreen;
  74.          *blue = entry.peBlue;
  75.          return TRUE;
  76.   } else
  77.          return FALSE;
  78. }