aboutsummaryrefslogtreecommitdiff
path: root/nxcomp/Pgn.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'nxcomp/Pgn.cpp')
-rw-r--r--nxcomp/Pgn.cpp805
1 files changed, 0 insertions, 805 deletions
diff --git a/nxcomp/Pgn.cpp b/nxcomp/Pgn.cpp
deleted file mode 100644
index 17e1702d4..000000000
--- a/nxcomp/Pgn.cpp
+++ /dev/null
@@ -1,805 +0,0 @@
-/**************************************************************************/
-/* */
-/* Copyright (c) 2001, 2011 NoMachine (http://www.nomachine.com) */
-/* Copyright (c) 2008-2014 Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> */
-/* Copyright (c) 2014-2016 Ulrich Sibiller <uli42@gmx.de> */
-/* Copyright (c) 2014-2016 Mihai Moldovan <ionic@ionic.de> */
-/* Copyright (c) 2011-2016 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>*/
-/* Copyright (c) 2015-2016 Qindel Group (http://www.qindel.com) */
-/* */
-/* NXCOMP, NX protocol compression and NX extensions to this software */
-/* are copyright of the aforementioned persons and companies. */
-/* */
-/* Redistribution and use of the present software is allowed according */
-/* to terms specified in the file LICENSE.nxcomp which comes in the */
-/* source distribution. */
-/* */
-/* All rights reserved. */
-/* */
-/* NOTE: This software has received contributions from various other */
-/* contributors, only the core maintainers and supporters are listed as */
-/* copyright holders. Please contact us, if you feel you should be listed */
-/* as copyright holder, as well. */
-/* */
-/**************************************************************************/
-
-//
-// This file obviously supports PNG
-// decompression. It was renamed to
-// avoid name clashes on Windows.
-//
-
-#include <X11/Xmd.h>
-
-#ifdef ANDROID
-#include <strings.h>
-#endif
-#include <unistd.h>
-#include <stdio.h>
-#include <png.h>
-
-#include "Unpack.h"
-#include "Pgn.h"
-
-#define PANIC
-#define WARNING
-#undef TEST
-#undef DEBUG
-
-#define RGB24_TO_PIXEL(bpp,r,g,b) \
- ((((CARD##bpp)(r) & 0xFF) * srcRedMax2 + 127) / 255 \
- << srcRedShift2 | \
- (((CARD##bpp)(g) & 0xFF) * srcGreenMax2 + 127) / 255 \
- << srcGreenShift2 | \
- (((CARD##bpp)(b) & 0xFF) * srcBlueMax2 + 127) / 255 \
- << srcBlueShift2)
-
-#define RGB24_TO_PIXEL32(r,g,b) \
- (((CARD32)(r) & 0xFF) << srcRedShift2 | \
- ((CARD32)(g) & 0xFF) << srcGreenShift2 | \
- ((CARD32)(b) & 0xFF) << srcBlueShift2)
-
-//
-// Functions from Unpack.cpp
-//
-
-extern int Unpack32To32(const T_colormask *colormask, const unsigned int *data,
- unsigned int *out, unsigned int *end);
-
-extern int Unpack24To24(const T_colormask *colormask, const unsigned char *data,
- unsigned char *out, unsigned char *end);
-
-extern int Unpack16To16(const T_colormask *colormask, const unsigned char *data,
- unsigned char *out, unsigned char *end);
-
-//
-// Local functions used for the png decompression.
-//
-
-static int DecompressPng16(unsigned char *compressedData, int compressedLen,
- unsigned int w, unsigned int h, unsigned char *dstBuf,
- int byteOrder);
-
-static int DecompressPng24(unsigned char *compressedData, int compressedLen,
- unsigned int w, unsigned int h, unsigned char *dstBuf,
- int byteOrder);
-
-static int DecompressPng32(unsigned char *compressedData, int compressedLen,
- unsigned int w, unsigned int h, unsigned char *dstBuf,
- int byteOrder);
-
-static void PngReadData(png_structp png_ptr, png_bytep data, png_size_t length);
-
-//
-// Colormap stuff.
-//
-
-CARD16 srcRedMax2, srcGreenMax2, srcBlueMax2;
-CARD8 srcRedShift2, srcGreenShift2, srcBlueShift2;
-
-//
-// Attributes used for the png decompression.
-//
-
-static char *tmpBuf;
-static int tmpBufSize = 0;
-static int streamPos;
-
-int UnpackPng(T_geometry *geometry, unsigned char method, unsigned char *srcData,
- int srcSize, int dstBpp, int dstWidth, int dstHeight,
- unsigned char *dstData, int dstSize)
-{
- int byteOrder = geometry -> image_byte_order;
-
- //
- // Check if data is coming from a failed unsplit.
- //
-
- if (srcSize < 2 || (srcData[0] == SPLIT_PATTERN &&
- srcData[1] == SPLIT_PATTERN))
- {
- #ifdef WARNING
- *logofs << "UnpackPng: WARNING! Skipping unpack of dummy data.\n"
- << logofs_flush;
- #endif
-
- return -1;
- }
-
- #ifdef DEBUG
- *logofs << "UnpackPng: Decompressing image with "
- << "srcSize " << srcSize << " and bpp "
- << dstBpp << ".\n" << logofs_flush;
- #endif
-
- srcRedShift2 = ffs(geometry -> red_mask) - 1;
- srcGreenShift2 = ffs(geometry -> green_mask) - 1;
- srcBlueShift2 = ffs(geometry -> blue_mask) - 1;
- srcRedMax2 = geometry -> red_mask >> srcRedShift2;
- srcGreenMax2 = geometry -> green_mask >> srcGreenShift2;
- srcBlueMax2 = geometry -> blue_mask >> srcBlueShift2;
-
- //
- // Make enough space in the temporary
- // buffer to have one complete row of
- // the image with 3 bytes per pixel.
- //
-
- tmpBufSize = dstWidth * 3;
- tmpBuf = new char [tmpBufSize];
-
- if (tmpBuf == NULL)
- {
- #ifdef PANIC
- *logofs << "UnpackPng: PANIC! Cannot allocate "
- << dstWidth * 3 << " bytes for PNG "
- << "decompressed data.\n" << logofs_flush;
- #endif
-
- delete [] tmpBuf;
-
- return -1;
- }
-
- int result = 1;
-
- switch (dstBpp)
- {
- case 8:
- {
- //
- // Simply move the data from srcData to dstData
- // taking into consideration the correct padding.
- //
-
- int row;
-
- unsigned char * dstBuff = dstData;
- unsigned char * srcBuff = srcData;
-
- for (row = 0; row < dstHeight; row++)
- {
- memcpy(dstBuff, srcBuff, dstWidth );
-
- dstBuff += RoundUp4(dstWidth);
- srcBuff += dstWidth;
- }
- }
- case 16:
- {
- result = DecompressPng16(srcData, srcSize, dstWidth,
- dstHeight, dstData, byteOrder);
- break;
- }
- case 24:
- {
- result = DecompressPng24(srcData, srcSize, dstWidth,
- dstHeight, dstData, byteOrder);
- break;
- }
- case 32:
- {
- result = DecompressPng32(srcData, srcSize, dstWidth,
- dstHeight, dstData, byteOrder);
- break;
- }
- default:
- {
- #ifdef PANIC
- *logofs << "UnpackPng: PANIC! Error in PNG compression. "
- << " Unsupported Bpp value " << dstBpp
- << " for the PNG compression"
- << ".\n" << logofs_flush;
- #endif
-
- delete [] tmpBuf;
-
- result = -1;
- }
- }
-
- if (result == -1)
- {
- delete [] tmpBuf;
-
- return result;
- }
-
- //
- // Apply the correction for the brightness
- //
-
- int maskMethod;
-
- switch (method)
- {
- case PACK_PNG_8_COLORS:
- {
- maskMethod = MASK_8_COLORS;
-
- break;
- }
- case PACK_PNG_64_COLORS:
- {
- maskMethod = MASK_64_COLORS;
-
- break;
- }
- case PACK_PNG_256_COLORS:
- {
- maskMethod = MASK_256_COLORS;
-
- break;
- }
- case PACK_PNG_512_COLORS:
- {
- maskMethod = MASK_512_COLORS;
-
- break;
- }
- case PACK_PNG_4K_COLORS:
- {
- maskMethod = MASK_4K_COLORS;
-
- break;
- }
- case PACK_PNG_32K_COLORS:
- {
- maskMethod = MASK_32K_COLORS;
-
- break;
- }
- case PACK_PNG_64K_COLORS:
- {
- maskMethod = MASK_64K_COLORS;
-
- break;
- }
- case PACK_PNG_256K_COLORS:
- {
- maskMethod = MASK_256K_COLORS;
-
- break;
- }
- case PACK_PNG_2M_COLORS:
- {
- maskMethod = MASK_2M_COLORS;
-
- break;
- }
- case PACK_PNG_16M_COLORS:
- {
- maskMethod = MASK_16M_COLORS;
-
- break;
- }
- default:
- {
- #ifdef PANIC
- *logofs << "DecompressPng16: PANIC! "
- << " No matching decompression method.\n"
- << logofs_flush;
- #endif
-
- delete [] tmpBuf;
-
- return -1;
- }
- }
-
- const T_colormask *colorMask = MethodColorMask(maskMethod);
-
- unsigned char *dstBuff = dstData;
-
- switch (dstBpp)
- {
- case 16:
- {
- Unpack16To16(colorMask, dstBuff, dstBuff, dstBuff + dstSize);
-
- break;
- }
- case 24:
- {
- break;
- }
- case 32:
- {
- Unpack32To32(colorMask, (unsigned int *)dstBuff, (unsigned int *)dstBuff,
- (unsigned int *)(dstBuff + dstSize));
- break;
- }
- default:
- {
- #ifdef PANIC
- *logofs << "DecompressPng16: PANIC! "
- << " No matching destination bits per plane.\n"
- << logofs_flush;
- #endif
-
- delete [] tmpBuf;
-
- return -1;
- }
- }
-
- delete [] tmpBuf;
-
- return 1;
-}
-
-
-//
-// Functions that actually do
-// the PNG decompression.
-//
-
-int DecompressPng16(unsigned char *compressedData, int compressedLen,
- unsigned int w, unsigned int h, unsigned char *dstBuf, int byteOrder)
-{
- unsigned char *data;
- unsigned int dx, dy;
-
- png_structp pngPtr;
- png_infop infoPtr;
- png_bytep rowPointers;
-
-
- streamPos = 0;
-
- pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-
- if (!pngPtr)
- {
- #ifdef PANIC
- *logofs << "DecompressPng16: PANIC! "
- << " Failed png_create_read_struct operation"
- << ".\n" << logofs_flush;
- #endif
-
- return -1;
- }
-
- infoPtr = png_create_info_struct(pngPtr);
-
- if (!infoPtr)
- {
- #ifdef PANIC
- *logofs << "DecompressPng16: PANIC! "
- << "Failed png_create_info_struct operation"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, NULL, NULL);
-
- return -1;
- }
-
- if (setjmp(png_jmpbuf(pngPtr)))
- {
- #ifdef PANIC
- *logofs << "DecompressPng16: PANIC! "
- << "Error during IO initialization"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, &infoPtr, NULL);
-
- return -1;
- }
-
- png_set_read_fn(pngPtr, (void *)compressedData, PngReadData);
-
- if (setjmp(png_jmpbuf(pngPtr)))
- {
- #ifdef PANIC
- *logofs << "DecompressPng16: PANIC! "
- << "Error during read of PNG header"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, &infoPtr, NULL);
-
- return -1;
- }
-
- png_read_info(pngPtr, infoPtr);
-
- if (png_get_color_type(pngPtr, infoPtr) == PNG_COLOR_TYPE_PALETTE)
- {
- png_set_expand(pngPtr);
- }
-
- //
- // data points to dstBuf which is
- // already padded correctly for the final
- // image to put
- //
-
- data = dstBuf;
- rowPointers = (png_byte *) tmpBuf;
-
- //
- // We use setjmp() to save our context.
- // The PNG library will call longjmp()
- // in case of error.
- //
-
- if (setjmp(png_jmpbuf(pngPtr)))
- {
- #ifdef PANIC
- *logofs << "DecompressPng16: PANIC! "
- << "Error during read of PNG rows"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, &infoPtr, NULL);
-
- return -1;
- }
-
- unsigned long pixel;
-
- for (dy = 0; dy < h; dy++)
- {
- png_read_row(pngPtr, rowPointers, NULL);
-
- for (dx = 0; dx < w; dx++)
- {
- pixel = RGB24_TO_PIXEL(16, tmpBuf[dx*3], tmpBuf[dx*3+1], tmpBuf[dx*3+2]);
-
- //
- // Follow the server byte order when arranging data.
- //
-
- if (byteOrder == LSBFirst)
- {
- data[0] = (unsigned char) (pixel & 0xff);
- data[1] = (unsigned char) ((pixel >> 8) & 0xff);
- }
- else
- {
- data[1] = (unsigned char) (pixel & 0xff);
- data[0] = (unsigned char) ((pixel >> 8) & 0xff);
- }
-
- data += 2;
- }
-
- //
- // Move pixelPtr at the beginning of the
- // next line.
- //
-
- data = data + (RoundUp4(w * 2) - w * 2);
- }
-
- png_destroy_read_struct(&pngPtr, &infoPtr,NULL);
-
- #ifdef DEBUG
- *logofs << "DecompressPng16: Decompression finished."
- << dy << " lines handled.\n"
- << logofs_flush;
- #endif
-
- return 1;
-}
-
-int DecompressPng24(unsigned char *compressedData, int compressedLen,
- unsigned int w, unsigned int h, unsigned char *dstBuf, int byteOrder)
-{
- static CARD8 *pixelPtr = NULL;
- unsigned int dx, dy;
-
- png_structp pngPtr;
- png_infop infoPtr;
- png_bytep rowPointers;
-
-
- streamPos = 0;
-
- pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-
- if (!pngPtr)
- {
- #ifdef PANIC
- *logofs << "DecompressPng24: PANIC! "
- << "Failed png_create_read_struct operation"
- << ".\n" << logofs_flush;
- #endif
-
- return -1;
- }
-
- infoPtr = png_create_info_struct(pngPtr);
-
- if (!infoPtr)
- {
- #ifdef PANIC
- *logofs << "DecompressPng24: PANIC! "
- << "Failed png_create_info_struct operation"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, NULL, NULL);
-
- return -1;
- }
-
- if (setjmp(png_jmpbuf(pngPtr)))
- {
- #ifdef PANIC
- *logofs << "DecompressPng24: PANIC! "
- << "Error during IO initialization"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, &infoPtr, NULL);
-
- return -1;
- }
-
- png_set_read_fn(pngPtr, (void *)compressedData, PngReadData);
-
- if (setjmp(png_jmpbuf(pngPtr)))
- {
- #ifdef PANIC
- *logofs << "DecompressPng24: PANIC! "
- << "Error during read of PNG header"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, &infoPtr, NULL);
-
- return -1;
- }
-
- png_read_info( pngPtr, infoPtr ) ;
-
- if (png_get_color_type(pngPtr, infoPtr) == PNG_COLOR_TYPE_PALETTE)
- {
- png_set_expand(pngPtr);
- }
-
- //
- // PixelPtr points to dstBuf which is
- // already padded correctly for the final
- // image to put
- //
-
- pixelPtr = (CARD8 *) dstBuf;
-
- rowPointers = (png_byte *)tmpBuf;
-
- if (setjmp(png_jmpbuf(pngPtr)))
- {
- #ifdef PANIC
- *logofs << "DecompressPng24: PANIC! "
- << "Error during read of PNG rows"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, &infoPtr, NULL);
-
- return -1;
- }
-
- for (dy = 0; dy < h; dy++)
- {
- png_read_row(pngPtr, rowPointers, NULL);
-
- for (dx = 0; dx < w; dx++)
- {
- //
- // Follow the server byte order when arranging data.
- //
-
- if (byteOrder == LSBFirst)
- {
- pixelPtr[0] = tmpBuf[dx * 3];
- pixelPtr[1] = tmpBuf[dx * 3 + 1];
- pixelPtr[2] = tmpBuf[dx * 3 + 2];
- }
- else
- {
- pixelPtr[2] = tmpBuf[dx * 3];
- pixelPtr[1] = tmpBuf[dx * 3 + 1];
- pixelPtr[0] = tmpBuf[dx * 3 + 2];
- }
-
- pixelPtr += 3;
- }
-
- //
- // Go to the next line.
- //
-
- pixelPtr = (CARD8 *) (((char *) pixelPtr) + (RoundUp4(w * 3) - w * 3));
- }
-
- png_destroy_read_struct(&pngPtr, &infoPtr,NULL);
-
- #ifdef DEBUG
- *logofs << "DecompressPng24: Decompression finished."
- << dy << " lines handled.\n"
- << logofs_flush;
- #endif
-
- return 1;
-}
-
-int DecompressPng32(unsigned char *compressedData, int compressedLen,
- unsigned int w, unsigned int h, unsigned char *dstBuf, int byteOrder)
-{
- unsigned char *data;
-
- unsigned int dx, dy;
-
- png_structp pngPtr;
- png_infop infoPtr;
- png_bytep rowPointers;
-
- streamPos = 0;
-
- pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-
- if (!pngPtr)
- {
- #ifdef PANIC
- *logofs << "DecompressPng32: PANIC! "
- << "Failed png_create_read_struct operation"
- << ".\n" << logofs_flush;
- #endif
-
- return -1;
- }
-
- infoPtr = png_create_info_struct(pngPtr);
-
- if (!infoPtr)
- {
- #ifdef PANIC
- *logofs << "DecompressPng32: PANIC! "
- << "Failed png_create_info_struct operation."
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, NULL, NULL);
-
- return -1;
- }
-
- if (setjmp(png_jmpbuf(pngPtr)))
- {
- #ifdef PANIC
- *logofs << "DecompressPng32: PANIC! "
- << "Error during IO initialization"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, &infoPtr, NULL);
-
- return -1;
- }
-
- png_set_read_fn(pngPtr, (void *)compressedData, PngReadData);
-
- if (setjmp(png_jmpbuf(pngPtr)))
- {
- #ifdef PANIC
- *logofs << "DecompressPng32: PANIC! "
- << "Error during read of PNG header"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, &infoPtr, NULL);
-
- return -1;
- }
-
- png_read_info(pngPtr, infoPtr) ;
-
-
- if (png_get_color_type(pngPtr, infoPtr) == PNG_COLOR_TYPE_PALETTE)
- {
- png_set_expand(pngPtr);
- }
-
- //
- // data points to dstBuf which is
- // already padded correctly for the final
- // image to put
- //
-
- data = dstBuf;
-
- rowPointers = (png_byte *) tmpBuf;
-
- if (setjmp(png_jmpbuf(pngPtr)))
- {
- #ifdef PANIC
- *logofs << "DecompressPng32: PANIC! "
- << "Error during read of PNG rows"
- << ".\n" << logofs_flush;
- #endif
-
- png_destroy_read_struct(&pngPtr, &infoPtr, NULL);
-
- return -1;
- }
-
- unsigned long pixel;
-
- int i;
-
- for (dy = 0; dy < h; dy++)
- {
- png_read_row(pngPtr, rowPointers, NULL);
-
- for (dx = 0; dx < w; dx++)
- {
- pixel = RGB24_TO_PIXEL(32, tmpBuf[dx * 3], tmpBuf[dx * 3 + 1],
- tmpBuf[dx * 3 + 2]);
-
- //
- // Follow the server byte order when arranging data.
- //
-
- if (byteOrder == LSBFirst)
- {
- for (i = 0; i < 4; i++)
- {
- data[i] = (unsigned char)(pixel & 0xff);
- pixel >>= 8;
- }
- }
- else
- {
- for (i = 3; i >= 0; i--)
- {
- data[i] = (unsigned char) (pixel & 0xff);
- pixel >>= 8;
- }
- }
-
- data += 4;
- }
- }
-
- png_destroy_read_struct(&pngPtr, &infoPtr,NULL);
-
- #ifdef DEBUG
- *logofs << "DecompressPng32: Decompression finished."
- << dy << " lines handled.\n"
- << logofs_flush;
- #endif
-
- return 1;
-}
-
-static void PngReadData(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- memcpy((char *) data, (char *) png_get_io_ptr(png_ptr) + streamPos, length);
-
- streamPos += length;
-}