PageRenderTime 51ms CodeModel.GetById 29ms app.highlight 15ms RepoModel.GetById 1ms app.codeStats 0ms

/apps/desktop/libvncserver/tabletranstemplate.c

http://ftk.googlecode.com/
C | 117 lines | 61 code | 14 blank | 42 comment | 5 complexity | 50362bf1dd062effce254fb9b274cb6a MD5 | raw file
  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
 16/*
 17 *  OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk@incompleteness.net>.
 18 *  Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge.  
 19 *  All Rights Reserved.
 20 *
 21 *  This is free software; you can redistribute it and/or modify
 22 *  it under the terms of the GNU General Public License as published by
 23 *  the Free Software Foundation; either version 2 of the License, or
 24 *  (at your option) any later version.
 25 *
 26 *  This software is distributed in the hope that it will be useful,
 27 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 28 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 29 *  GNU General Public License for more details.
 30 *
 31 *  You should have received a copy of the GNU General Public License
 32 *  along with this software; if not, write to the Free Software
 33 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
 34 *  USA.
 35 */
 36
 37#if !defined(IN) || !defined(OUT)
 38#error "This file shouldn't be compiled."
 39#error "It is included as part of translate.c"
 40#endif
 41
 42#define IN_T CONCAT3E(uint,IN,_t)
 43#define OUT_T CONCAT3E(uint,OUT,_t)
 44#define rfbTranslateWithSingleTableINtoOUT \
 45                                CONCAT4E(rfbTranslateWithSingleTable,IN,to,OUT)
 46#define rfbTranslateWithRGBTablesINtoOUT \
 47                                CONCAT4E(rfbTranslateWithRGBTables,IN,to,OUT)
 48
 49/*
 50 * rfbTranslateWithSingleTableINtoOUT translates a rectangle of pixel data
 51 * using a single lookup table.
 52 */
 53
 54static void
 55rfbTranslateWithSingleTableINtoOUT (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 *t = (OUT_T *)table;
 66
 67    while (height > 0) {
 68        opLineEnd = op + width;
 69
 70        while (op < opLineEnd) {
 71            *(op++) = t[*(ip++)];
 72        }
 73
 74        ip += ipextra;
 75        height--;
 76    }
 77}
 78
 79
 80/*
 81 * rfbTranslateWithRGBTablesINtoOUT translates a rectangle of pixel data
 82 * using three separate lookup tables for the red, green and blue values.
 83 */
 84
 85static void
 86rfbTranslateWithRGBTablesINtoOUT (char *table, rfbPixelFormat *in,
 87                                  rfbPixelFormat *out,
 88                                  char *iptr, char *optr,
 89                                  int bytesBetweenInputLines,
 90                                  int width, int height)
 91{
 92    IN_T *ip = (IN_T *)iptr;
 93    OUT_T *op = (OUT_T *)optr;
 94    int ipextra = bytesBetweenInputLines / sizeof(IN_T) - width;
 95    OUT_T *opLineEnd;
 96    OUT_T *redTable = (OUT_T *)table;
 97    OUT_T *greenTable = redTable + in->redMax + 1;
 98    OUT_T *blueTable = greenTable + in->greenMax + 1;
 99
100    while (height > 0) {
101        opLineEnd = &op[width];
102
103        while (op < opLineEnd) {
104            *(op++) = (redTable[(*ip >> in->redShift) & in->redMax] |
105                       greenTable[(*ip >> in->greenShift) & in->greenMax] |
106                       blueTable[(*ip >> in->blueShift) & in->blueMax]);
107            ip++;
108        }
109        ip += ipextra;
110        height--;
111    }
112}
113
114#undef IN_T
115#undef OUT_T
116#undef rfbTranslateWithSingleTableINtoOUT
117#undef rfbTranslateWithRGBTablesINtoOUT