bitmap.c revision a180a41bba1d50822df23fff0099e90b86638b89
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* -*- c-basic-offset: 8 -*-
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdesktop: A Remote Desktop Protocol client.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Bitmap decompression routines
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Copyright (C) Matthew Chapman <matthewc.unsw.edu.au> 1999-2008
a180a41bba1d50822df23fff0099e90b86638b89vboxsync This program is free software: you can redistribute it and/or modify
a180a41bba1d50822df23fff0099e90b86638b89vboxsync it under the terms of the GNU General Public License as published by
a180a41bba1d50822df23fff0099e90b86638b89vboxsync the Free Software Foundation, either version 3 of the License, or
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (at your option) any later version.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync This program is distributed in the hope that it will be useful,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync but WITHOUT ANY WARRANTY; without even the implied warranty of
a180a41bba1d50822df23fff0099e90b86638b89vboxsync MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a180a41bba1d50822df23fff0099e90b86638b89vboxsync GNU General Public License for more details.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync You should have received a copy of the GNU General Public License
a180a41bba1d50822df23fff0099e90b86638b89vboxsync along with this program. If not, see <http://www.gnu.org/licenses/>.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* three seperate function for speed when decompressing the bitmaps
a180a41bba1d50822df23fff0099e90b86638b89vboxsync when modifing one function make the change in the others
a180a41bba1d50822df23fff0099e90b86638b89vboxsync jay.sorg@gmail.com */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* indent is confused by this file */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* *INDENT-OFF* */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define CVAL(p) (*(p++))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define CVAL2(p, v) { v = (*(p++)); v |= (*(p++)) << 8; }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define CVAL2(p, v) { v = (*(p++)) << 8; v |= (*(p++)); }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif /* L_ENDIAN */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define CVAL2(p, v) { v = (*((uint16*)p)); p += 2; }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif /* NEED_ALIGN */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define UNROLL8(exp) { exp exp exp exp exp exp exp exp }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* 1 byte bitmap decompress */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncbitmap_decompress1(uint8 * output, int width, int height, uint8 * input, int size)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int lastopcode = -1, insertmix = False, bicolour = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Handle different opcode forms */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Handle strange cases for counts */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Read preliminary data */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case 0: /* Fill */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((lastopcode == opcode) && !((x == width) && (prevline == NULL)))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Output body */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case 0: /* Fill */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* 2 byte bitmap decompress */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncbitmap_decompress2(uint8 * output, int width, int height, uint8 * input, int size)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int lastopcode = -1, insertmix = False, bicolour = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Handle different opcode forms */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Handle strange cases for counts */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Read preliminary data */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case 0: /* Fill */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((lastopcode == opcode) && !((x == width) && (prevline == NULL)))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Output body */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case 0: /* Fill */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* 3 byte bitmap decompress */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncbitmap_decompress3(uint8 * output, int width, int height, uint8 * input, int size)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int lastopcode = -1, insertmix = False, bicolour = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 colour1[3] = {0, 0, 0}, colour2[3] = {0, 0, 0};
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Handle different opcode forms */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Handle strange cases for counts */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Read preliminary data */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case 0: /* Fill */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((lastopcode == opcode) && !((x == width) && (prevline == NULL)))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Output body */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case 0: /* Fill */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* decompress a colour plane */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_plane(uint8 * in, int width, int height, uint8 * out, int size)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out = (org_out + width * height * 4) - ((indexh + 1) * width * 4);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync x = x >> 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync x = x >> 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* 4 byte bitmap decompress */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncbitmap_decompress4(uint8 * output, int width, int height, uint8 * input, int size)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync bytes_pro = process_plane(input, width, height, output + 3, size - total_pro);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync bytes_pro = process_plane(input, width, height, output + 2, size - total_pro);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync bytes_pro = process_plane(input, width, height, output + 1, size - total_pro);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync bytes_pro = process_plane(input, width, height, output + 0, size - total_pro);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* main decompress function */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncbitmap_decompress(uint8 * output, int width, int height, uint8 * input, int size, int Bpp)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rv = bitmap_decompress1(output, width, height, input, size);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rv = bitmap_decompress2(output, width, height, input, size);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rv = bitmap_decompress3(output, width, height, input, size);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rv = bitmap_decompress4(output, width, height, input, size);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* *INDENT-ON* */