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