diff options
Diffstat (limited to 'krfb/libvncserver/translate.c')
-rw-r--r-- | krfb/libvncserver/translate.c | 484 |
1 files changed, 0 insertions, 484 deletions
diff --git a/krfb/libvncserver/translate.c b/krfb/libvncserver/translate.c deleted file mode 100644 index a690321f..00000000 --- a/krfb/libvncserver/translate.c +++ /dev/null @@ -1,484 +0,0 @@ -/* - * translate.c - translate between different pixel formats - */ - -/* - * OSXvnc Copyright (C) 2001 Dan McGuirk <[email protected]>. - * Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge. - * All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include "rfb.h" -#include "sraRegion.h" - -static void PrintPixelFormat(rfbPixelFormat *pf); -static Bool rfbSetClientColourMapBGR233(rfbClientPtr cl); - -Bool rfbEconomicTranslate = FALSE; - -/* - * Some standard pixel formats. - */ - -static const rfbPixelFormat BGR233Format = { - 8, 8, 0, 1, 7, 7, 3, 0, 3, 6, 0, 0 -}; - - -/* - * Macro to compare pixel formats. - */ - -#define PF_EQ(x,y) \ - ((x.bitsPerPixel == y.bitsPerPixel) && \ - (x.depth == y.depth) && \ - ((x.bigEndian == y.bigEndian) || (x.bitsPerPixel == 8)) && \ - (x.trueColour == y.trueColour) && \ - (!x.trueColour || ((x.redMax == y.redMax) && \ - (x.greenMax == y.greenMax) && \ - (x.blueMax == y.blueMax) && \ - (x.redShift == y.redShift) && \ - (x.greenShift == y.greenShift) && \ - (x.blueShift == y.blueShift)))) - -#define CONCAT2(a,b) a##b -#define CONCAT2E(a,b) CONCAT2(a,b) -#define CONCAT4(a,b,c,d) a##b##c##d -#define CONCAT4E(a,b,c,d) CONCAT4(a,b,c,d) - -#undef OUT -#undef IN - -#define OUT 8 -#include "tableinitcmtemplate.c" -#include "tableinittctemplate.c" -#define IN 8 -#include "tabletranstemplate.c" -#undef IN -#define IN 16 -#include "tabletranstemplate.c" -#undef IN -#define IN 32 -#include "tabletranstemplate.c" -#undef IN -#undef OUT - -#define OUT 16 -#include "tableinitcmtemplate.c" -#include "tableinittctemplate.c" -#define IN 8 -#include "tabletranstemplate.c" -#undef IN -#define IN 16 -#include "tabletranstemplate.c" -#undef IN -#define IN 32 -#include "tabletranstemplate.c" -#undef IN -#undef OUT - -#define OUT 32 -#include "tableinitcmtemplate.c" -#include "tableinittctemplate.c" -#define IN 8 -#include "tabletranstemplate.c" -#undef IN -#define IN 16 -#include "tabletranstemplate.c" -#undef IN -#define IN 32 -#include "tabletranstemplate.c" -#undef IN -#undef OUT - -#ifdef ALLOW24BPP -#define COUNT_OFFSETS 4 -#define BPP2OFFSET(bpp) ((bpp)/8-1) -#include "tableinit24.c" -#define BPP 8 -#include "tabletrans24template.c" -#undef BPP -#define BPP 16 -#include "tabletrans24template.c" -#undef BPP -#define BPP 24 -#include "tabletrans24template.c" -#undef BPP -#define BPP 32 -#include "tabletrans24template.c" -#undef BPP -#else -#define COUNT_OFFSETS 3 -#define BPP2OFFSET(bpp) ((int)(bpp)/16) -#endif - -typedef void (*rfbInitCMTableFnType)(char **table, rfbPixelFormat *in, - rfbPixelFormat *out,rfbColourMap* cm); -typedef void (*rfbInitTableFnType)(char **table, rfbPixelFormat *in, - rfbPixelFormat *out); - -rfbInitCMTableFnType rfbInitColourMapSingleTableFns[COUNT_OFFSETS] = { - rfbInitColourMapSingleTable8, - rfbInitColourMapSingleTable16, -#ifdef ALLOW24BPP - rfbInitColourMapSingleTable24, -#endif - rfbInitColourMapSingleTable32 -}; - -rfbInitTableFnType rfbInitTrueColourSingleTableFns[COUNT_OFFSETS] = { - rfbInitTrueColourSingleTable8, - rfbInitTrueColourSingleTable16, -#ifdef ALLOW24BPP - rfbInitTrueColourSingleTable24, -#endif - rfbInitTrueColourSingleTable32 -}; - -rfbInitTableFnType rfbInitTrueColourRGBTablesFns[COUNT_OFFSETS] = { - rfbInitTrueColourRGBTables8, - rfbInitTrueColourRGBTables16, -#ifdef ALLOW24BPP - rfbInitTrueColourRGBTables24, -#endif - rfbInitTrueColourRGBTables32 -}; - -rfbTranslateFnType rfbTranslateWithSingleTableFns[COUNT_OFFSETS][COUNT_OFFSETS] = { - { rfbTranslateWithSingleTable8to8, - rfbTranslateWithSingleTable8to16, -#ifdef ALLOW24BPP - rfbTranslateWithSingleTable8to24, -#endif - rfbTranslateWithSingleTable8to32 }, - { rfbTranslateWithSingleTable16to8, - rfbTranslateWithSingleTable16to16, -#ifdef ALLOW24BPP - rfbTranslateWithSingleTable16to24, -#endif - rfbTranslateWithSingleTable16to32 }, -#ifdef ALLOW24BPP - { rfbTranslateWithSingleTable24to8, - rfbTranslateWithSingleTable24to16, - rfbTranslateWithSingleTable24to24, - rfbTranslateWithSingleTable24to32 }, -#endif - { rfbTranslateWithSingleTable32to8, - rfbTranslateWithSingleTable32to16, -#ifdef ALLOW24BPP - rfbTranslateWithSingleTable32to24, -#endif - rfbTranslateWithSingleTable32to32 } -}; - -rfbTranslateFnType rfbTranslateWithRGBTablesFns[COUNT_OFFSETS][COUNT_OFFSETS] = { - { rfbTranslateWithRGBTables8to8, - rfbTranslateWithRGBTables8to16, -#ifdef ALLOW24BPP - rfbTranslateWithRGBTables8to24, -#endif - rfbTranslateWithRGBTables8to32 }, - { rfbTranslateWithRGBTables16to8, - rfbTranslateWithRGBTables16to16, -#ifdef ALLOW24BPP - rfbTranslateWithRGBTables16to24, -#endif - rfbTranslateWithRGBTables16to32 }, -#ifdef ALLOW24BPP - { rfbTranslateWithRGBTables24to8, - rfbTranslateWithRGBTables24to16, - rfbTranslateWithRGBTables24to24, - rfbTranslateWithRGBTables24to32 }, -#endif - { rfbTranslateWithRGBTables32to8, - rfbTranslateWithRGBTables32to16, -#ifdef ALLOW24BPP - rfbTranslateWithRGBTables32to24, -#endif - rfbTranslateWithRGBTables32to32 } -}; - - - -/* - * rfbTranslateNone is used when no translation is required. - */ - -void -rfbTranslateNone(char *table, rfbPixelFormat *in, rfbPixelFormat *out, - char *iptr, char *optr, int bytesBetweenInputLines, - int width, int height) -{ - int bytesPerOutputLine = width * (out->bitsPerPixel / 8); - - while (height > 0) { - memcpy(optr, iptr, bytesPerOutputLine); - iptr += bytesBetweenInputLines; - optr += bytesPerOutputLine; - height--; - } -} - - -/* - * rfbSetTranslateFunction sets the translation function. - */ - -Bool -rfbSetTranslateFunction(cl) - rfbClientPtr cl; -{ - rfbLog("Pixel format for client %s:\n",cl->host); - PrintPixelFormat(&cl->format); - - /* - * Check that bits per pixel values are valid - */ - - if ((cl->screen->rfbServerFormat.bitsPerPixel != 8) && - (cl->screen->rfbServerFormat.bitsPerPixel != 16) && -#ifdef ALLOW24BPP - (cl->screen->rfbServerFormat.bitsPerPixel != 24) && -#endif - (cl->screen->rfbServerFormat.bitsPerPixel != 32)) - { - rfbLog("%s: server bits per pixel not 8, 16 or 32 (is %d)\n", - "rfbSetTranslateFunction", - cl->screen->rfbServerFormat.bitsPerPixel); - rfbCloseClient(cl); - return FALSE; - } - - if ((cl->format.bitsPerPixel != 8) && - (cl->format.bitsPerPixel != 16) && -#ifdef ALLOW24BPP - (cl->format.bitsPerPixel != 24) && -#endif - (cl->format.bitsPerPixel != 32)) - { - rfbLog("%s: client bits per pixel not 8, 16 or 32\n", - "rfbSetTranslateFunction"); - rfbCloseClient(cl); - return FALSE; - } - - if (!cl->format.trueColour && (cl->format.bitsPerPixel != 8)) { - rfbLog("rfbSetTranslateFunction: client has colour map " - "but %d-bit - can only cope with 8-bit colour maps\n", - cl->format.bitsPerPixel); - rfbCloseClient(cl); - return FALSE; - } - - /* - * bpp is valid, now work out how to translate - */ - - if (!cl->format.trueColour) { - /* - * truecolour -> colour map - * - * Set client's colour map to BGR233, then effectively it's - * truecolour as well - */ - - if (!rfbSetClientColourMapBGR233(cl)) - return FALSE; - - cl->format = BGR233Format; - } - - /* truecolour -> truecolour */ - - if (PF_EQ(cl->format,cl->screen->rfbServerFormat)) { - - /* client & server the same */ - - rfbLog("no translation needed\n"); - cl->translateFn = rfbTranslateNone; - return TRUE; - } - - if ((cl->screen->rfbServerFormat.bitsPerPixel < 16) || - ((!cl->screen->rfbServerFormat.trueColour || !rfbEconomicTranslate) && - (cl->screen->rfbServerFormat.bitsPerPixel == 16))) { - - /* we can use a single lookup table for <= 16 bpp */ - - cl->translateFn = rfbTranslateWithSingleTableFns - [BPP2OFFSET(cl->screen->rfbServerFormat.bitsPerPixel)] - [BPP2OFFSET(cl->format.bitsPerPixel)]; - - if(cl->screen->rfbServerFormat.trueColour) - (*rfbInitTrueColourSingleTableFns - [BPP2OFFSET(cl->format.bitsPerPixel)]) (&cl->translateLookupTable, - &(cl->screen->rfbServerFormat), &cl->format); - else - (*rfbInitColourMapSingleTableFns - [BPP2OFFSET(cl->format.bitsPerPixel)]) (&cl->translateLookupTable, - &(cl->screen->rfbServerFormat), &cl->format,&cl->screen->colourMap); - - } else { - - /* otherwise we use three separate tables for red, green and blue */ - - cl->translateFn = rfbTranslateWithRGBTablesFns - [BPP2OFFSET(cl->screen->rfbServerFormat.bitsPerPixel)] - [BPP2OFFSET(cl->format.bitsPerPixel)]; - - (*rfbInitTrueColourRGBTablesFns - [BPP2OFFSET(cl->format.bitsPerPixel)]) (&cl->translateLookupTable, - &(cl->screen->rfbServerFormat), &cl->format); - } - - return TRUE; -} - - - -/* - * rfbSetClientColourMapBGR233 sets the client's colour map so that it's - * just like an 8-bit BGR233 true colour client. - */ - -static Bool -rfbSetClientColourMapBGR233(cl) - rfbClientPtr cl; -{ - char buf[sz_rfbSetColourMapEntriesMsg + 256 * 3 * 2]; - rfbSetColourMapEntriesMsg *scme = (rfbSetColourMapEntriesMsg *)buf; - CARD16 *rgb = (CARD16 *)(&buf[sz_rfbSetColourMapEntriesMsg]); - int i, len; - int r, g, b; - - if (cl->format.bitsPerPixel != 8 ) { - rfbLog("%s: client not 8 bits per pixel\n", - "rfbSetClientColourMapBGR233"); - rfbCloseClient(cl); - return FALSE; - } - - scme->type = rfbSetColourMapEntries; - - scme->firstColour = Swap16IfLE(0); - scme->nColours = Swap16IfLE(256); - - len = sz_rfbSetColourMapEntriesMsg; - - i = 0; - - for (b = 0; b < 4; b++) { - for (g = 0; g < 8; g++) { - for (r = 0; r < 8; r++) { - rgb[i++] = Swap16IfLE(r * 65535 / 7); - rgb[i++] = Swap16IfLE(g * 65535 / 7); - rgb[i++] = Swap16IfLE(b * 65535 / 3); - } - } - } - - len += 256 * 3 * 2; - - if (WriteExact(cl, buf, len) < 0) { - rfbLogPerror("rfbSetClientColourMapBGR233: write"); - rfbCloseClient(cl); - return FALSE; - } - return TRUE; -} - -/* this function is not called very often, so it needn't be - efficient. */ - -/* - * rfbSetClientColourMap is called to set the client's colour map. If the - * client is a true colour client, we simply update our own translation table - * and mark the whole screen as having been modified. - */ - -Bool -rfbSetClientColourMap(cl, firstColour, nColours) - rfbClientPtr cl; - int firstColour; - int nColours; -{ - if (cl->screen->rfbServerFormat.trueColour || !cl->readyForSetColourMapEntries) { - return TRUE; - } - - if (nColours == 0) { - nColours = cl->screen->colourMap.count; - } - - if (cl->format.trueColour) { - (*rfbInitColourMapSingleTableFns - [BPP2OFFSET(cl->format.bitsPerPixel)]) (&cl->translateLookupTable, - &cl->screen->rfbServerFormat, &cl->format,&cl->screen->colourMap); - - sraRgnDestroy(cl->modifiedRegion); - cl->modifiedRegion = - sraRgnCreateRect(0,0,cl->screen->width,cl->screen->height); - - return TRUE; - } - - return rfbSendSetColourMapEntries(cl, firstColour, nColours); -} - - -/* - * rfbSetClientColourMaps sets the colour map for each RFB client. - */ - -void -rfbSetClientColourMaps(rfbScreen, firstColour, nColours) - rfbScreenInfoPtr rfbScreen; - int firstColour; - int nColours; -{ - rfbClientIteratorPtr i; - rfbClientPtr cl; - - i = rfbGetClientIterator(rfbScreen); - while((cl = rfbClientIteratorNext(i))) - rfbSetClientColourMap(cl, firstColour, nColours); - rfbReleaseClientIterator(i); -} - -static void -PrintPixelFormat(pf) - rfbPixelFormat *pf; -{ - if (pf->bitsPerPixel == 1) { - rfbLog(" 1 bpp, %s sig bit in each byte is leftmost on the screen.\n", - (pf->bigEndian ? "most" : "least")); - } else { - rfbLog(" %d bpp, depth %d%s\n",pf->bitsPerPixel,pf->depth, - ((pf->bitsPerPixel == 8) ? "" - : (pf->bigEndian ? ", big endian" : ", little endian"))); - if (pf->trueColour) { - rfbLog(" true colour: max r %d g %d b %d, shift r %d g %d b %d\n", - pf->redMax, pf->greenMax, pf->blueMax, - pf->redShift, pf->greenShift, pf->blueShift); - } else { - rfbLog(" uses a colour map (not true colour).\n"); - } - } -} |