123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /* Copyright 2009-2014 Pierre Ossman for Cendio AB
- *
- * 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.
- */
-
- namespace rfb {
-
-
- inline Pixel PixelFormat::pixelFromBuffer(const uint8_t* buffer) const
- {
- Pixel p;
-
- p = 0;
-
- if (bigEndian) {
- switch (bpp) {
- case 32:
- p |= ((Pixel)*(buffer++)) << 24;
- p |= ((Pixel)*(buffer++)) << 16;
- /* fall through */
- case 16:
- p |= ((Pixel)*(buffer++)) << 8;
- /* fall through */
- case 8:
- p |= *buffer;
- }
- } else {
- p |= buffer[0];
- if (bpp >= 16) {
- p |= ((Pixel)buffer[1]) << 8;
- if (bpp == 32) {
- p |= ((Pixel)buffer[2]) << 16;
- p |= ((Pixel)buffer[3]) << 24;
- }
- }
- }
-
- return p;
- }
-
-
- inline void PixelFormat::bufferFromPixel(uint8_t* buffer, Pixel p) const
- {
- if (bigEndian) {
- switch (bpp) {
- case 32:
- *(buffer++) = (p >> 24) & 0xff;
- *(buffer++) = (p >> 16) & 0xff;
- /* fall through */
- case 16:
- *(buffer++) = (p >> 8) & 0xff;
- /* fall through */
- case 8:
- *(buffer++) = (p >> 0) & 0xff;
- }
- } else {
- buffer[0] = (p >> 0) & 0xff;
- if (bpp >= 16) {
- buffer[1] = (p >> 8) & 0xff;
- if (bpp == 32) {
- buffer[2] = (p >> 16) & 0xff;
- buffer[3] = (p >> 24) & 0xff;
- }
- }
- }
- }
-
-
- inline Pixel PixelFormat::pixelFromRGB(uint16_t red, uint16_t green, uint16_t blue) const
- {
- Pixel p;
-
- p = (Pixel)downconvTable[(redBits-1)*256 + (red >> 8)] << redShift;
- p |= (Pixel)downconvTable[(greenBits-1)*256 + (green >> 8)] << greenShift;
- p |= (Pixel)downconvTable[(blueBits-1)*256 + (blue >> 8)] << blueShift;
-
- return p;
- }
-
-
- inline Pixel PixelFormat::pixelFromRGB(uint8_t red, uint8_t green, uint8_t blue) const
- {
- Pixel p;
-
- p = (Pixel)downconvTable[(redBits-1)*256 + red] << redShift;
- p |= (Pixel)downconvTable[(greenBits-1)*256 + green] << greenShift;
- p |= (Pixel)downconvTable[(blueBits-1)*256 + blue] << blueShift;
-
- return p;
- }
-
-
- inline void PixelFormat::rgbFromPixel(Pixel p, uint16_t *r, uint16_t *g, uint16_t *b) const
- {
- uint8_t _r, _g, _b;
-
- _r = p >> redShift;
- _g = p >> greenShift;
- _b = p >> blueShift;
-
- _r = upconvTable[(redBits-1)*256 + _r];
- _g = upconvTable[(greenBits-1)*256 + _g];
- _b = upconvTable[(blueBits-1)*256 + _b];
-
- *r = _r << 8 | _r;
- *g = _g << 8 | _g;
- *b = _b << 8 | _b;
- }
-
-
- inline void PixelFormat::rgbFromPixel(Pixel p, uint8_t *r, uint8_t *g, uint8_t *b) const
- {
- uint8_t _r, _g, _b;
-
- _r = p >> redShift;
- _g = p >> greenShift;
- _b = p >> blueShift;
-
- *r = upconvTable[(redBits-1)*256 + _r];
- *g = upconvTable[(greenBits-1)*256 + _g];
- *b = upconvTable[(blueBits-1)*256 + _b];
- }
-
-
- }
|