tableinitcmtemplate.cpp
上传用户:sbftbdw
上传日期:2007-01-03
资源大小:379k
文件大小:3k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. /*
  2.  * tableinitcmtemplate.c - template for initialising lookup tables for
  3.  * translation from a colour map to true colour.
  4.  *
  5.  * This file shouldn't be compiled.  It is included multiple times by
  6.  * translate.c, each time with a different definition of the macro OUT.
  7.  * For each value of OUT, this file defines a function which allocates an
  8.  * appropriately sized lookup table and initialises it.
  9.  *
  10.  * I know this code isn't nice to read because of all the macros, but
  11.  * efficiency is important here.
  12.  */
  13. #if !defined(OUT)
  14. #error "This file shouldn't be compiled."
  15. #error "It is included as part of translate.c"
  16. #endif
  17. #define OUT_T CONCAT2E(CARD,OUT)
  18. #define SwapOUT(x) CONCAT2E(Swap,OUT) (x)
  19. #define rfbInitColourMapSingleTableOUT 
  20. CONCAT2E(rfbInitColourMapSingleTable,OUT)
  21. // THIS CODE HAS BEEN MODIFIED FROM THE ORIGINAL UNIX SOURCE
  22. // TO WORK FOR WINVNC.  THE PALETTE SHOULD REALLY BE RETRIEVED
  23. // FROM THE VNCDESKTOP OBJECT, RATHER THAN FROM THE OS DIRECTLY
  24. static void
  25. rfbInitColourMapSingleTableOUT (char **table,
  26. rfbPixelFormat *in,
  27. rfbPixelFormat *out)
  28. {
  29. log.Print(LL_ALL, VNCLOG("rfbInitColourMapSingleTable calledn"));
  30. // ALLOCATE SPACE FOR COLOUR TABLE
  31.     int nEntries = 1 << in->bitsPerPixel;
  32. // Allocate the table
  33.     if (*table) free(*table);
  34.     *table = (char *)malloc(nEntries * sizeof(OUT_T));
  35. if (*table == NULL)
  36. {
  37. log.Print(LL_INTERR, VNCLOG("failed to allocate translation tablen"));
  38. return;
  39. }
  40. // Obtain the system palette
  41. HDC hDC = GetDC(NULL);
  42. PALETTEENTRY palette[256];
  43. if (GetSystemPaletteEntries(hDC,
  44. 0, 256, palette) == 0)
  45. {
  46. log.Print(LL_INTERR, VNCLOG("failed to get system palette (%d)n"), GetLastError());
  47. ReleaseDC(NULL, hDC);
  48. return;
  49. }
  50. ReleaseDC(NULL, hDC);
  51. // COLOUR TRANSLATION
  52. // We now have the colour table intact.  Map it into a translation table
  53.     int i, r, g, b;
  54.     OUT_T *t = (OUT_T *)*table;
  55.     for (i = 0; i < nEntries; i++)
  56. {
  57. // Split down the RGB data
  58. r = palette[i].peRed;
  59. g = palette[i].peGreen;
  60. b = palette[i].peBlue;
  61. // Now translate it
  62. t[i] = ((((r * out->redMax + 127) / 255) << out->redShift) |
  63. (((g * out->greenMax + 127) / 255) << out->greenShift) |
  64. (((b * out->blueMax + 127) / 255) << out->blueShift));
  65. #if (OUT != 8)
  66. if (out->bigEndian != in->bigEndian)
  67. {
  68. t[i] = SwapOUT(t[i]);
  69. }
  70. #endif
  71. }
  72. log.Print(LL_ALL, VNCLOG("rfbInitColourMapSingleTable donen"));
  73. }
  74. #undef OUT_T
  75. #undef SwapOUT
  76. #undef rfbInitColourMapSingleTableOUT