home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / XenonSource.exe / gamesystem / source / gs_colour.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-13  |  3.1 KB  |  168 lines

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    gsCColour
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    12/03/00
  8. //
  9. // Base:    gsCObject
  10. //
  11. // Derived:    None    
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "gamesystem.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. PALETTEENTRY *gsCColour::m_palette = 0;
  20.  
  21. int gsCColour::m_rshift = 0;
  22. int gsCColour::m_gshift = 0;
  23. int gsCColour::m_bshift = 0;
  24. int gsCColour::m_rbits = 0;
  25. int gsCColour::m_gbits = 0;
  26. int gsCColour::m_bbits = 0;
  27. int gsCColour::m_rmask = 0;
  28. int gsCColour::m_bmask = 0;
  29. int gsCColour::m_gmask = 0;
  30.  
  31. //-------------------------------------------------------------
  32.  
  33. gsCColour::gsCColour()
  34. {
  35.     m_r = m_g = m_b = 255;
  36.     updateRawColour();
  37. }
  38.  
  39. //-------------------------------------------------------------
  40.  
  41. gsCColour::gsCColour(int r,int g,int b)
  42. {
  43.     m_r = (gsUBYTE) r;
  44.     m_g = (gsUBYTE) g;
  45.     m_b = (gsUBYTE) b;
  46.     updateRawColour();
  47. }
  48.  
  49. //-------------------------------------------------------------
  50.  
  51. gsCColour::gsCColour(const gsCColour& colour)
  52. {
  53.     m_r = colour.m_r;
  54.     m_g = colour.m_g;
  55.     m_b = colour.m_b;
  56.     m_raw = colour.m_raw;
  57. }
  58.  
  59. //-------------------------------------------------------------
  60.  
  61. gsCColour::~gsCColour()
  62. {
  63. }
  64.  
  65. //-------------------------------------------------------------
  66.  
  67. void gsCColour::setupColourConversion(gsCScreen *screen)
  68. {
  69.     if (screen->m_bpp == 1)
  70.         m_palette = screen->m_palette_colours;
  71.     else {
  72.         m_palette = 0;
  73.  
  74.         DDPIXELFORMAT   pf;
  75.  
  76.         memset(&pf,0,sizeof(pf));
  77.         pf.dwSize = sizeof(pf);
  78.  
  79.         screen->getBackSurface()->GetPixelFormat(&pf);
  80.  
  81.         gsUDWORD i,j;
  82.  
  83.         j = pf.dwRBitMask;
  84.         m_rshift = 0;
  85.         i = 1;
  86.         while (!(i&j)) {
  87.             m_rshift++;
  88.             i<<=1;
  89.             }
  90.         
  91.         m_rbits = 8;
  92.         while (i&j) {
  93.             m_rbits--;
  94.             i<<=1;
  95.             }
  96.  
  97.         j = pf.dwGBitMask;
  98.         m_gshift = 0;
  99.         i = 1;
  100.         while (!(i&j)) {
  101.             m_gshift++;
  102.             i<<=1;
  103.             }
  104.  
  105.         m_gbits = 8;
  106.         while (i&j) {
  107.             m_gbits--;
  108.             i<<=1;
  109.             }
  110.  
  111.         j = pf.dwBBitMask;
  112.         m_bshift = 0;
  113.         i = 1;
  114.         while (!(i&j)) {
  115.             m_bshift++;
  116.             i<<=1;
  117.             }
  118.  
  119.         m_bbits = 8;
  120.         while (i&j) {
  121.             m_bbits--;
  122.             i<<=1;
  123.             }
  124.  
  125.         m_rmask = pf.dwRBitMask;
  126.         m_gmask = pf.dwGBitMask;
  127.         m_bmask = pf.dwBBitMask;
  128.         }
  129. }
  130.  
  131. //-------------------------------------------------------------
  132.  
  133. void gsCColour::updateRawColour()
  134. {
  135.     if (!m_palette) {
  136.         m_raw = (((((gsUDWORD) m_r) >> m_rbits) << (m_rshift)) & m_rmask) |
  137.                 (((((gsUDWORD) m_g) >> m_gbits) << (m_gshift)) & m_gmask) |
  138.                 (((((gsUDWORD) m_b) >> m_bbits) << (m_bshift)) & m_bmask);
  139.         }
  140.     else {
  141.         int nearest_i = 0;
  142.         int nearest_d = 0;
  143.  
  144.         PALETTEENTRY *p = m_palette;
  145.  
  146.         for (int i = 0; i < 256; i++) {
  147.             int dr = m_r - p->peRed;
  148.             int dg = m_g - p->peGreen;
  149.             int db = m_b - p->peBlue;
  150.             int d = dr * dr + dg * dg + db * db;
  151.             if (d == 0) {
  152.                 m_raw = i;
  153.                 return;
  154.                 }
  155.             if (nearest_i == 0 ||
  156.                 d < nearest_d) {
  157.                 nearest_i = i;
  158.                 nearest_d = d;
  159.                 }
  160.             p++;
  161.             }
  162.  
  163.         m_raw = nearest_i;
  164.         }
  165. }
  166.  
  167. //-------------------------------------------------------------
  168.