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

远程控制编程

开发平台:

Visual C++

  1. /*
  2.  * tabletranstemplate.c - template for translation using lookup tables.
  3.  *
  4.  * This file shouldn't be compiled.  It is included multiple times by
  5.  * translate.c, each time with different definitions of the macros IN and OUT.
  6.  *
  7.  * For each pair of values IN and OUT, this file defines two functions for
  8.  * translating a given rectangle of pixel data.  One uses a single lookup
  9.  * table, and the other uses three separate lookup tables for the red, green
  10.  * and blue values.
  11.  *
  12.  * I know this code isn't nice to read because of all the macros, but
  13.  * efficiency is important here.
  14.  */
  15. #if !defined(IN) || !defined(OUT)
  16. #error "This file shouldn't be compiled."
  17. #error "It is included as part of translate.c"
  18. #endif
  19. #define IN_T CONCAT2E(CARD,IN)
  20. #define OUT_T CONCAT2E(CARD,OUT)
  21. #define rfbTranslateWithSingleTableINtoOUT 
  22. CONCAT4E(rfbTranslateWithSingleTable,IN,to,OUT)
  23. #define rfbTranslateWithRGBTablesINtoOUT 
  24. CONCAT4E(rfbTranslateWithRGBTables,IN,to,OUT)
  25. /*
  26.  * rfbTranslateWithSingleTableINtoOUT translates a rectangle of pixel data
  27.  * using a single lookup table.
  28.  */
  29. static void
  30. rfbTranslateWithSingleTableINtoOUT (char *table, rfbPixelFormat *in,
  31.     rfbPixelFormat *out,
  32.     char *iptr, char *optr,
  33.     int bytesBetweenInputLines,
  34.     int width, int height)
  35. {
  36.     IN_T *ip = (IN_T *)iptr;
  37.     OUT_T *op = (OUT_T *)optr;
  38.     int ipextra = bytesBetweenInputLines / sizeof(IN_T) - width;
  39.     OUT_T *opLineEnd;
  40.     OUT_T *t = (OUT_T *)table;
  41.     while (height > 0) {
  42. opLineEnd = op + width;
  43. while (op < opLineEnd) {
  44.     *(op++) = t[*(ip++)];
  45. }
  46. ip += ipextra;
  47. height--;
  48.     }
  49. }
  50. /*
  51.  * rfbTranslateWithRGBTablesINtoOUT translates a rectangle of pixel data
  52.  * using three separate lookup tables for the red, green and blue values.
  53.  */
  54. static void
  55. rfbTranslateWithRGBTablesINtoOUT (char *table, rfbPixelFormat *in,
  56.   rfbPixelFormat *out,
  57.   char *iptr, char *optr,
  58.   int bytesBetweenInputLines,
  59.   int width, int height)
  60. {
  61.     IN_T *ip = (IN_T *)iptr;
  62.     OUT_T *op = (OUT_T *)optr;
  63.     int ipextra = bytesBetweenInputLines / sizeof(IN_T) - width;
  64.     OUT_T *opLineEnd;
  65.     OUT_T *redTable = (OUT_T *)table;
  66.     OUT_T *greenTable = redTable + in->redMax + 1;
  67.     OUT_T *blueTable = greenTable + in->greenMax + 1;
  68.     while (height > 0) {
  69. opLineEnd = op + width;
  70. while (op < opLineEnd) {
  71.     *(op++) = (redTable[(*ip >> in->redShift) & in->redMax] |
  72.        greenTable[(*ip >> in->greenShift) & in->greenMax] |
  73.        blueTable[(*ip >> in->blueShift) & in->blueMax]);
  74.     ip++;
  75. }
  76. ip += ipextra;
  77. height--;
  78.     }
  79. }
  80. #undef IN_T
  81. #undef OUT_T
  82. #undef rfbTranslateWithSingleTableINtoOUT
  83. #undef rfbTranslateWithRGBTablesINtoOUT