Home | History | Annotate | Download | only in libvncserver
      1 /*
      2   24 bit
      3  */
      4 
      5 /*
      6  *  OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk (at) incompleteness.net>.
      7  *  Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge.
      8  *  All Rights Reserved.
      9  *
     10  *  This is free software; you can redistribute it and/or modify
     11  *  it under the terms of the GNU General Public License as published by
     12  *  the Free Software Foundation; either version 2 of the License, or
     13  *  (at your option) any later version.
     14  *
     15  *  This software is distributed in the hope that it will be useful,
     16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18  *  GNU General Public License for more details.
     19  *
     20  *  You should have received a copy of the GNU General Public License
     21  *  along with this software; if not, write to the Free Software
     22  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
     23  *  USA.
     24  */
     25 
     26 static void
     27 rfbInitOneRGBTable24 (uint8_t *table, int inMax, int outMax, int outShift,int swap);
     28 
     29 
     30 static void
     31 rfbInitColourMapSingleTable24(char **table, rfbPixelFormat *in,
     32                             rfbPixelFormat *out,rfbColourMap* colourMap)
     33 {
     34     uint32_t i, r, g, b, outValue;
     35     uint8_t *t;
     36     uint8_t c;
     37     unsigned int nEntries = 1 << in->bitsPerPixel;
     38     int shift = colourMap->is16?16:8;
     39 
     40     if (*table) free(*table);
     41     *table = (char *)malloc(nEntries * 3 + 1);
     42     t = (uint8_t *)*table;
     43 
     44     for (i = 0; i < nEntries; i++) {
     45         r = g = b = 0;
     46 	if(i < colourMap->count) {
     47 	  if(colourMap->is16) {
     48 	    r = colourMap->data.shorts[3*i+0];
     49 	    g = colourMap->data.shorts[3*i+1];
     50 	    b = colourMap->data.shorts[3*i+2];
     51 	  } else {
     52 	    r = colourMap->data.bytes[3*i+0];
     53 	    g = colourMap->data.bytes[3*i+1];
     54 	    b = colourMap->data.bytes[3*i+2];
     55 	  }
     56 	}
     57         outValue = ((((r * (1 + out->redMax)) >> shift) << out->redShift) |
     58                 (((g * (1 + out->greenMax)) >> shift) << out->greenShift) |
     59                 (((b * (1 + out->blueMax)) >> shift) << out->blueShift));
     60 	*(uint32_t*)&t[3*i] = outValue;
     61 	if(!rfbEndianTest)
     62 	  memmove(t+3*i,t+3*i+1,3);
     63         if (out->bigEndian != in->bigEndian) {
     64 	  c = t[3*i]; t[3*i] = t[3*i+2]; t[3*i+2] = c;
     65         }
     66     }
     67 }
     68 
     69 /*
     70  * rfbInitTrueColourSingleTable sets up a single lookup table for truecolour
     71  * translation.
     72  */
     73 
     74 static void
     75 rfbInitTrueColourSingleTable24 (char **table, rfbPixelFormat *in,
     76                                  rfbPixelFormat *out)
     77 {
     78     int i,outValue;
     79     int inRed, inGreen, inBlue, outRed, outGreen, outBlue;
     80     uint8_t *t;
     81     uint8_t c;
     82     int nEntries = 1 << in->bitsPerPixel;
     83 
     84     if (*table) free(*table);
     85     *table = (char *)malloc(nEntries * 3 + 1);
     86     t = (uint8_t *)*table;
     87 
     88     for (i = 0; i < nEntries; i++) {
     89         inRed   = (i >> in->redShift)   & in->redMax;
     90         inGreen = (i >> in->greenShift) & in->greenMax;
     91         inBlue  = (i >> in->blueShift)  & in->blueMax;
     92 
     93         outRed   = (inRed   * out->redMax   + in->redMax / 2)   / in->redMax;
     94         outGreen = (inGreen * out->greenMax + in->greenMax / 2) / in->greenMax;
     95         outBlue  = (inBlue  * out->blueMax  + in->blueMax / 2)  / in->blueMax;
     96 
     97 	outValue = ((outRed   << out->redShift)   |
     98                 (outGreen << out->greenShift) |
     99                 (outBlue  << out->blueShift));
    100 	*(uint32_t*)&t[3*i] = outValue;
    101 	if(!rfbEndianTest)
    102 	  memmove(t+3*i,t+3*i+1,3);
    103         if (out->bigEndian != in->bigEndian) {
    104 	  c = t[3*i]; t[3*i] = t[3*i+2]; t[3*i+2] = c;
    105         }
    106     }
    107 }
    108 
    109 
    110 /*
    111  * rfbInitTrueColourRGBTables sets up three separate lookup tables for the
    112  * red, green and blue values.
    113  */
    114 
    115 static void
    116 rfbInitTrueColourRGBTables24 (char **table, rfbPixelFormat *in,
    117                                rfbPixelFormat *out)
    118 {
    119     uint8_t *redTable;
    120     uint8_t *greenTable;
    121     uint8_t *blueTable;
    122 
    123     if (*table) free(*table);
    124     *table = (char *)malloc((in->redMax + in->greenMax + in->blueMax + 3)
    125                             * 3 + 1);
    126     redTable = (uint8_t *)*table;
    127     greenTable = redTable + 3*(in->redMax + 1);
    128     blueTable = greenTable + 3*(in->greenMax + 1);
    129 
    130     rfbInitOneRGBTable24 (redTable, in->redMax, out->redMax,
    131                            out->redShift, (out->bigEndian != in->bigEndian));
    132     rfbInitOneRGBTable24 (greenTable, in->greenMax, out->greenMax,
    133                            out->greenShift, (out->bigEndian != in->bigEndian));
    134     rfbInitOneRGBTable24 (blueTable, in->blueMax, out->blueMax,
    135                            out->blueShift, (out->bigEndian != in->bigEndian));
    136 }
    137 
    138 static void
    139 rfbInitOneRGBTable24 (uint8_t *table, int inMax, int outMax, int outShift,
    140                        int swap)
    141 {
    142     int i;
    143     int nEntries = inMax + 1;
    144     uint32_t outValue;
    145     uint8_t c;
    146 
    147     for (i = 0; i < nEntries; i++) {
    148       outValue = ((i * outMax + inMax / 2) / inMax) << outShift;
    149       *(uint32_t *)&table[3*i] = outValue;
    150       if(!rfbEndianTest)
    151 	memmove(table+3*i,table+3*i+1,3);
    152         if (swap) {
    153 	  c = table[3*i]; table[3*i] = table[3*i+2];
    154 	  table[3*i+2] = c;
    155         }
    156     }
    157 }
    158