home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / owlsrc.pak / PALETTE.CPP < prev    next >
C/C++ Source or Header  |  1997-07-23  |  6KB  |  199 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // (C) Copyright 1992, 1994 by Borland International, All Rights Reserved
  4. //
  5. //   Implementation of GDI Palette object class
  6. //----------------------------------------------------------------------------
  7. #include <owl/owlpch.h>
  8. #include <owl/gdiobjec.h>
  9. #include <owl/clipboar.h>
  10. #include <memory.h>
  11.  
  12. DIAG_DECLARE_GROUP(OwlGDI);        // General GDI diagnostic group
  13. DIAG_DECLARE_GROUP(OwlGDIOrphan);  // Orphan control tracing group
  14.  
  15. //
  16. // Constructors
  17. //
  18. TPalette::TPalette(HPALETTE handle, TAutoDelete autoDelete)
  19. :
  20.   TGdiObject(handle, autoDelete)
  21. {
  22.   #if !defined(NO_GDI_ORPHAN_CONTROL)
  23.     if (ShouldDelete)
  24.       OBJ_REF_ADD(Handle, Palette);
  25.   #endif
  26. }
  27.  
  28. TPalette::TPalette(const TClipboard& clipboard)
  29. :
  30.   TGdiObject(clipboard.GetClipboardData(CF_PALETTE))
  31. {
  32.   OBJ_REF_ADD(Handle, Palette);
  33.   OBJ_REF_INC(Handle);
  34. }
  35.  
  36. TPalette::TPalette(const LOGPALETTE far* logPalette)
  37. {
  38.   PRECONDITION(logPalette);
  39.   Handle = ::CreatePalette(logPalette);
  40.   WARNX(OwlGDI, !Handle, 0, "Cannot create palette from logPalette @" << 
  41.         hex << uint32(LPVOID(logPalette)));
  42.   CheckValid();
  43.   OBJ_REF_ADD(Handle, Palette);
  44. }
  45.  
  46. TPalette::TPalette(const TPalette& palette)
  47. {
  48.   uint16  nColors;
  49.   palette.GetObject(nColors);
  50.   if (nColors) {
  51.     LOGPALETTE* logPal = (LOGPALETTE*) new
  52.       uint8[sizeof(LOGPALETTE)+(nColors-1)*sizeof(PALETTEENTRY)];
  53.  
  54.     logPal->palVersion = 0x300;
  55.     logPal->palNumEntries = nColors;
  56.     palette.GetPaletteEntries(0, nColors, logPal->palPalEntry);
  57.     Handle = ::CreatePalette(logPal);
  58.     delete [] logPal;
  59.   }
  60.   else
  61.     Handle = 0;
  62.  
  63.   WARNX(OwlGDI, !Handle, 0, "Cannot create palette from palette " << 
  64.         uint(HPALETTE(palette)));
  65.   CheckValid();
  66.   OBJ_REF_ADD(Handle, Palette);
  67. }
  68.  
  69. TPalette::TPalette(const BITMAPINFO far* info, uint flags)
  70. {
  71.   Create(info, flags);
  72. }
  73.  
  74. TPalette::TPalette(const BITMAPCOREINFO far* core, uint flags)
  75. {
  76.   Create(core, flags);
  77. }
  78.  
  79. TPalette::TPalette(const TDib& dib, uint flags)
  80. {
  81.   if (dib.IsPM())
  82.     Create((const BITMAPCOREINFO far*)dib.GetInfo(), flags);
  83.   else
  84.     Create(dib.GetInfo(), flags);
  85. }
  86.  
  87. TPalette::TPalette(const PALETTEENTRY far* entries, int count)
  88. {
  89.   LOGPALETTE* logPal = (LOGPALETTE*)new uint8[
  90.      sizeof(LOGPALETTE)+(count-1)*sizeof(PALETTEENTRY) ];
  91.  
  92.   logPal->palVersion  = 0x300;
  93.   logPal->palNumEntries = (uint16)count;
  94.   memcpy(logPal->palPalEntry, entries, count*sizeof(PALETTEENTRY));
  95.   Handle = ::CreatePalette(logPal);
  96.   delete [] logPal;
  97.  
  98.   WARNX(OwlGDI, !Handle, 0, "Cannot create palette from " << count <<
  99.         "palette entries @" << hex << uint32(LPVOID(entries)));
  100.   CheckValid();
  101.   OBJ_REF_ADD(Handle, Palette);
  102. }
  103.  
  104. //
  105. // Accept a pointer to a BITMAPINFO structure and create a GDI logical
  106. // palette from the color table which follows it, for 2, 16 and 256 color
  107. // bitmaps. Fail for all others, including 24-bit DIB's
  108. //
  109. void
  110. TPalette::Create(const BITMAPINFO far* info, uint flags)
  111. {
  112.   const RGBQUAD far* rgb = info->bmiColors;
  113.  
  114.   // if the ClrUsed field of the header is non-zero,
  115.   // it means that we could have have a short color table.
  116.   //
  117.   uint16 nColors = uint16(info->bmiHeader.biClrUsed ?
  118.            info->bmiHeader.biClrUsed :
  119.            NColors(info->bmiHeader.biBitCount));
  120.  
  121.   if (nColors) {
  122.     LOGPALETTE* logPal = (LOGPALETTE*)
  123.        new uint8[sizeof(LOGPALETTE) + (nColors-1)*sizeof(PALETTEENTRY)];
  124.  
  125.     logPal->palVersion  = 0x300;      // Windows 3.0 version
  126.     logPal->palNumEntries = nColors;
  127.     for (uint16 n = 0; n < nColors; n++) {
  128.       logPal->palPalEntry[n].peRed   = rgb[n].rgbRed;
  129.       logPal->palPalEntry[n].peGreen = rgb[n].rgbGreen;
  130.       logPal->palPalEntry[n].peBlue  = rgb[n].rgbBlue;
  131.       logPal->palPalEntry[n].peFlags = (uint8)flags;
  132.     }
  133.     Handle = ::CreatePalette(logPal);
  134.     delete [] logPal;
  135.   }
  136.   else
  137.     Handle = 0;
  138.  
  139.   WARNX(OwlGDI, !Handle, 0, "Cannot create palette from bitmapinfo @" << 
  140.         hex << uint32(LPVOID(info)));
  141.   CheckValid();
  142.   OBJ_REF_ADD(Handle, Palette);
  143. }
  144.  
  145. //
  146. // Accept a pointer to a BITMAPCORE structure and create a GDI logical
  147. // palette from the color table which follows it, for 2, 16 and 256 color
  148. // bitmaps. Fail for all others, including 24-bit DIB's
  149. //
  150. // It differs from the windows DIB routine in two respects:
  151. //
  152. //   1) The PM 1.x DIB must have complete color tables, since there is no
  153. //      ClrUsed field in the header
  154. //
  155. //   2) The size of the color table entries is 3 bytes, not 4 bytes.
  156. //
  157. void
  158. TPalette::Create(const BITMAPCOREINFO far* coreInfo, uint flags)
  159. {
  160.   const RGBTRIPLE far* rgb = coreInfo->bmciColors;
  161.  
  162.   uint16 nColors = (uint16)NColors(coreInfo->bmciHeader.bcBitCount);
  163.   if (nColors) {
  164.     LOGPALETTE* logPal = (LOGPALETTE*)
  165.        new uint8[sizeof(LOGPALETTE) + (nColors-1)*sizeof(PALETTEENTRY)];
  166.  
  167.     logPal->palVersion  = 0x300; // Windows 3.0 version
  168.     logPal->palNumEntries = nColors;
  169.     for (short n = 0; n < nColors; n++) {
  170.       logPal->palPalEntry[n].peRed   = rgb[n].rgbtRed;
  171.       logPal->palPalEntry[n].peGreen = rgb[n].rgbtGreen;
  172.       logPal->palPalEntry[n].peBlue  = rgb[n].rgbtBlue;
  173.       logPal->palPalEntry[n].peFlags = (uint8)flags;
  174.     }
  175.     Handle = ::CreatePalette(logPal);
  176.     delete [] logPal;
  177.   }
  178.   else
  179.     Handle = 0;
  180.  
  181.   WARNX(OwlGDI, !Handle, 0, "Cannot create palette from coreinfo @" << 
  182.         hex << uint32(LPVOID(coreInfo)));
  183.   CheckValid();
  184.   OBJ_REF_ADD(Handle, Palette);
  185. }
  186.  
  187. //
  188. // Move this logical palette to the clipboard.  Clipboard assumes ownership
  189. //
  190. void
  191. TPalette::ToClipboard(TClipboard& clipboard)
  192. {
  193.   if (Handle) {
  194.     clipboard.SetClipboardData(CF_PALETTE, Handle);
  195.     ShouldDelete = false; // GDI object now owned by Clipboard
  196.     OBJ_REF_REMOVE(Handle);
  197.   }
  198. }
  199.