transinittempl.h
来自「linux可以运行程序源码」· C头文件 代码 · 共 255 行
H
255 行
/* Copyright (C) 2002-2005 RealVNC Ltd. 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. *///// transInitTempl.h - templates for functions to initialise lookup tables for// the translation functions.//// This file is #included after having set the following macros:// BPPOUT - 8, 16 or 32#if !defined(BPPOUT)#error "transInitTempl.h: BPPOUT not defined"#endifnamespace rfb {// CONCAT2E concatenates its arguments, expanding them if they are macros#ifndef CONCAT2E#define CONCAT2(a,b) a##b#define CONCAT2E(a,b) CONCAT2(a,b)#endif#ifndef SWAP16#define SWAP16(n) ((((n) & 0xff) << 8) | (((n) >> 8) & 0xff))#endif#ifndef SWAP32#define SWAP32(n) (((n) >> 24) | (((n) & 0x00ff0000) >> 8) | \ (((n) & 0x0000ff00) << 8) | ((n) << 24))#endif#define OUTPIXEL rdr::CONCAT2E(U,BPPOUT)#define SWAPOUT CONCAT2E(SWAP,BPPOUT)#define initSimpleCMtoTCOUT CONCAT2E(initSimpleCMtoTC,BPPOUT)#define initSimpleTCtoTCOUT CONCAT2E(initSimpleTCtoTC,BPPOUT)#define initSimpleCMtoCubeOUT CONCAT2E(initSimpleCMtoCube,BPPOUT)#define initSimpleTCtoCubeOUT CONCAT2E(initSimpleTCtoCube,BPPOUT)#define initRGBTCtoTCOUT CONCAT2E(initRGBTCtoTC,BPPOUT)#define initRGBTCtoCubeOUT CONCAT2E(initRGBTCtoCube,BPPOUT)#define initOneRGBTableOUT CONCAT2E(initOneRGBTable,BPPOUT)#define initOneRGBCubeTableOUT CONCAT2E(initOneRGBCubeTable,BPPOUT)#ifndef TRANS_INIT_TEMPL_ENDIAN_TEST#define TRANS_INIT_TEMPL_ENDIAN_TEST static rdr::U32 endianTest = 1; static bool nativeBigEndian = *(rdr::U8*)(&endianTest) != 1;#endifvoid initSimpleCMtoTCOUT (rdr::U8** tablep, const PixelFormat& inPF, ColourMap* cm, const PixelFormat& outPF){ if (inPF.bpp != 8 && inPF.bigEndian != nativeBigEndian) throw Exception("Internal error: inPF is not native endian"); int size = 1 << inPF.bpp; delete [] *tablep; *tablep = new rdr::U8[size * sizeof(OUTPIXEL)]; OUTPIXEL* table = (OUTPIXEL*)*tablep; for (int i = 0; i < size; i++) { int r,g,b; cm->lookup(i,&r,&g,&b); table[i] = ((((r * outPF.redMax + 32767) / 65535) << outPF.redShift) | (((g * outPF.greenMax + 32767) / 65535) << outPF.greenShift) | (((b * outPF.blueMax + 32767) / 65535) << outPF.blueShift));#if (BPPOUT != 8) if (outPF.bigEndian != nativeBigEndian) table[i] = SWAPOUT (table[i]);#endif }}void initSimpleTCtoTCOUT (rdr::U8** tablep, const PixelFormat& inPF, const PixelFormat& outPF){ if (inPF.bpp != 8 && inPF.bigEndian != nativeBigEndian) throw Exception("Internal error: inPF is not native endian"); int size = 1 << inPF.bpp; delete [] *tablep; *tablep = new rdr::U8[size * sizeof(OUTPIXEL)]; OUTPIXEL* table = (OUTPIXEL*)*tablep; for (int i = 0; i < size; i++) { int r = (i >> inPF.redShift) & inPF.redMax; int g = (i >> inPF.greenShift) & inPF.greenMax; int b = (i >> inPF.blueShift) & inPF.blueMax; r = (r * outPF.redMax + inPF.redMax/2) / inPF.redMax; g = (g * outPF.greenMax + inPF.greenMax/2) / inPF.greenMax; b = (b * outPF.blueMax + inPF.blueMax/2) / inPF.blueMax; table[i] = ((r << outPF.redShift) | (g << outPF.greenShift) | (b << outPF.blueShift));#if (BPPOUT != 8) if (outPF.bigEndian != nativeBigEndian) table[i] = SWAPOUT (table[i]);#endif }}void initSimpleCMtoCubeOUT (rdr::U8** tablep, const PixelFormat& inPF, ColourMap* cm, ColourCube* cube){ if (inPF.bpp != 8 && inPF.bigEndian != nativeBigEndian) throw Exception("Internal error: inPF is not native endian"); int size = 1 << inPF.bpp; delete [] *tablep; *tablep = new rdr::U8[size * sizeof(OUTPIXEL)]; OUTPIXEL* table = (OUTPIXEL*)*tablep; for (int i = 0; i < size; i++) { int r,g,b; cm->lookup(i,&r,&g,&b); r = (r * (cube->nRed-1) + 32767) / 65535; g = (g * (cube->nGreen-1) + 32767) / 65535; b = (b * (cube->nBlue-1) + 32767) / 65535; table[i] = cube->lookup(r, g, b); }}void initSimpleTCtoCubeOUT (rdr::U8** tablep, const PixelFormat& inPF, ColourCube* cube){ if (inPF.bpp != 8 && inPF.bigEndian != nativeBigEndian) throw Exception("Internal error: inPF is not native endian"); int size = 1 << inPF.bpp; delete [] *tablep; *tablep = new rdr::U8[size * sizeof(OUTPIXEL)]; OUTPIXEL* table = (OUTPIXEL*)*tablep; for (int i = 0; i < size; i++) { int r = (i >> inPF.redShift) & inPF.redMax; int g = (i >> inPF.greenShift) & inPF.greenMax; int b = (i >> inPF.blueShift) & inPF.blueMax; r = (r * (cube->nRed-1) + inPF.redMax/2) / inPF.redMax; g = (g * (cube->nGreen-1) + inPF.greenMax/2) / inPF.greenMax; b = (b * (cube->nBlue-1) + inPF.blueMax/2) / inPF.blueMax; table[i] = cube->lookup(r, g, b); }}void initOneRGBTableOUT (OUTPIXEL* table, int inMax, int outMax, int outShift, bool swap){ int size = inMax + 1; for (int i = 0; i < size; i++) { table[i] = ((i * outMax + inMax / 2) / inMax) << outShift;#if (BPPOUT != 8) if (swap) table[i] = SWAPOUT (table[i]);#endif }}void initRGBTCtoTCOUT (rdr::U8** tablep, const PixelFormat& inPF, const PixelFormat& outPF){ if (inPF.bpp != 8 && inPF.bigEndian != nativeBigEndian) throw Exception("Internal error: inPF is not native endian"); int size = inPF.redMax + inPF.greenMax + inPF.blueMax + 3; delete [] *tablep; *tablep = new rdr::U8[size * sizeof(OUTPIXEL)]; OUTPIXEL* redTable = (OUTPIXEL*)*tablep; OUTPIXEL* greenTable = redTable + inPF.redMax + 1; OUTPIXEL* blueTable = greenTable + inPF.greenMax + 1; bool swap = (outPF.bigEndian != nativeBigEndian); initOneRGBTableOUT (redTable, inPF.redMax, outPF.redMax, outPF.redShift, swap); initOneRGBTableOUT (greenTable, inPF.greenMax, outPF.greenMax, outPF.greenShift, swap); initOneRGBTableOUT (blueTable, inPF.blueMax, outPF.blueMax, outPF.blueShift, swap);}void initOneRGBCubeTableOUT (OUTPIXEL* table, int inMax, int outMax, int outMult){ int size = inMax + 1; for (int i = 0; i < size; i++) { table[i] = ((i * outMax + inMax / 2) / inMax) * outMult; }}void initRGBTCtoCubeOUT (rdr::U8** tablep, const PixelFormat& inPF, ColourCube* cube){ if (inPF.bpp != 8 && inPF.bigEndian != nativeBigEndian) throw Exception("Internal error: inPF is not native endian"); int size = inPF.redMax + inPF.greenMax + inPF.blueMax + 3 + cube->size(); delete [] *tablep; *tablep = new rdr::U8[size * sizeof(OUTPIXEL)]; OUTPIXEL* redTable = (OUTPIXEL*)*tablep; OUTPIXEL* greenTable = redTable + inPF.redMax + 1; OUTPIXEL* blueTable = greenTable + inPF.greenMax + 1; OUTPIXEL* cubeTable = blueTable + inPF.blueMax + 1; initOneRGBCubeTableOUT (redTable, inPF.redMax, cube->nRed-1, cube->redMult()); initOneRGBCubeTableOUT (greenTable, inPF.greenMax, cube->nGreen-1, cube->greenMult()); initOneRGBCubeTableOUT (blueTable, inPF.blueMax, cube->nBlue-1, cube->blueMult()); for (int i = 0; i < cube->size(); i++) { cubeTable[i] = cube->table[i]; }}#undef OUTPIXEL#undef initSimpleCMtoTCOUT#undef initSimpleTCtoTCOUT#undef initSimpleCMtoCubeOUT#undef initSimpleTCtoCubeOUT#undef initRGBTCtoTCOUT#undef initRGBTCtoCubeOUT#undef initOneRGBTableOUT#undef initOneRGBCubeTableOUT}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?