work on freerdp

This commit is contained in:
Jay Sorg 2010-12-09 20:40:27 -08:00
parent 5ec2de96c5
commit e256550897
5 changed files with 381 additions and 8 deletions

View File

@ -13,7 +13,7 @@ INCLUDES = \
lib_LTLIBRARIES = \ lib_LTLIBRARIES = \
libxrdpfreerdp.la libxrdpfreerdp.la
libxrdpfreerdp_la_SOURCES = xrdp-freerdp.c libxrdpfreerdp_la_SOURCES = xrdp-freerdp.c xrdp-color.c
libxrdpfreerdp_la_LIBADD = \ libxrdpfreerdp_la_LIBADD = \
$(top_srcdir)/common/libcommon.la \ $(top_srcdir)/common/libcommon.la \

246
freerdp/xrdp-color.c Normal file
View File

@ -0,0 +1,246 @@
/*
This program 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 program 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 program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
xrdp: A Remote Desktop Protocol server.
Copyright (C) Jay Sorg 2010
freerdp wrapper
*/
#include "xrdp-freerdp.h"
char* APP_CC
convert_bitmap(int in_bpp, int out_bpp, char* bmpdata,
int width, int height, int* palette)
{
char* out;
char* src;
char* dst;
int i;
int j;
int red;
int green;
int blue;
int pixel;
if ((in_bpp == 8) && (out_bpp == 8))
{
out = (char*)g_malloc(width * height, 0);
src = bmpdata;
dst = out;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
pixel = *((tui8*)src);
pixel = palette[pixel];
SPLITCOLOR32(red, green, blue, pixel);
pixel = COLOR8(red, green, blue);
*dst = pixel;
src++;
dst++;
}
}
return out;
}
if ((in_bpp == 8) && (out_bpp == 16))
{
out = (char*)g_malloc(width * height * 2, 0);
src = bmpdata;
dst = out;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
pixel = *((tui8*)src);
pixel = palette[pixel];
SPLITCOLOR32(red, green, blue, pixel);
pixel = COLOR16(red, green, blue);
*((tui16*)dst) = pixel;
src++;
dst += 2;
}
}
return out;
}
if ((in_bpp == 8) && (out_bpp == 24))
{
out = (char*)g_malloc(width * height * 4, 0);
src = bmpdata;
dst = out;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
pixel = *((tui8*)src);
pixel = palette[pixel];
SPLITCOLOR32(red, green, blue, pixel);
pixel = COLOR24RGB(red, green, blue);
*((tui32*)dst) = pixel;
src++;
dst += 4;
}
}
return out;
}
if ((in_bpp == 15) && (out_bpp == 16))
{
out = (char*)g_malloc(width * height * 2, 0);
src = bmpdata;
dst = out;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
pixel = *((tui16*)src);
SPLITCOLOR15(red, green, blue, pixel);
pixel = COLOR16(red, green, blue);
*((tui16*)dst) = pixel;
src += 2;
dst += 2;
}
}
return out;
}
if ((in_bpp == 15) && (out_bpp == 24))
{
out = (char*)g_malloc(width * height * 4, 0);
src = bmpdata;
dst = out;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
pixel = *((tui16*)src);
SPLITCOLOR15(red, green, blue, pixel);
pixel = COLOR24RGB(red, green, blue);
*((tui32*)dst) = pixel;
src += 2;
dst += 4;
}
}
return out;
}
if ((in_bpp == 16) && (out_bpp == 16))
{
return bmpdata;
}
if ((in_bpp == 16) && (out_bpp == 24))
{
out = (char*)g_malloc(width * height * 4, 0);
src = bmpdata;
dst = out;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
pixel = *((tui16*)src);
SPLITCOLOR16(red, green, blue, pixel);
pixel = COLOR24RGB(red, green, blue);
*((tui32*)dst) = pixel;
src += 2;
dst += 4;
}
}
return out;
}
if ((in_bpp == 24) && (out_bpp == 24))
{
out = (char*)g_malloc(width * height * 4, 0);
src = bmpdata;
dst = out;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
blue = *((tui8*)src);
src++;
green = *((tui8*)src);
src++;
red = *((tui8*)src);
src++;
pixel = COLOR24RGB(red, green, blue);
*((tui32*)dst) = pixel;
dst += 4;
}
}
return out;
}
return 0;
}
/*****************************************************************************/
/* returns color or 0 */
int APP_CC
convert_color(int in_bpp, int out_bpp, int in_color, int* palette)
{
int pixel;
int red;
int green;
int blue;
if ((in_bpp == 8) && (out_bpp == 8))
{
pixel = palette[in_color];
SPLITCOLOR32(red, green, blue, pixel);
pixel = COLOR8(red, green, blue);
return pixel;
}
if ((in_bpp == 8) && (out_bpp == 16))
{
pixel = palette[in_color];
SPLITCOLOR32(red, green, blue, pixel);
pixel = COLOR16(red, green, blue);
return pixel;
}
if ((in_bpp == 8) && (out_bpp == 24))
{
pixel = palette[in_color];
SPLITCOLOR32(red, green, blue, pixel);
pixel = COLOR24BGR(red, green, blue);
return pixel;
}
if ((in_bpp == 15) && (out_bpp == 16))
{
pixel = in_color;
SPLITCOLOR15(red, green, blue, pixel);
pixel = COLOR16(red, green, blue);
return pixel;
}
if ((in_bpp == 15) && (out_bpp == 24))
{
pixel = in_color;
SPLITCOLOR15(red, green, blue, pixel);
pixel = COLOR24BGR(red, green, blue);
return pixel;
}
if ((in_bpp == 16) && (out_bpp == 16))
{
return in_color;
}
if ((in_bpp == 16) && (out_bpp == 24))
{
pixel = in_color;
SPLITCOLOR16(red, green, blue, pixel);
pixel = COLOR24BGR(red, green, blue);
return pixel;
}
if ((in_bpp == 24) && (out_bpp == 24))
{
return in_color;
}
return 0;
}

30
freerdp/xrdp-color.h Normal file
View File

@ -0,0 +1,30 @@
/*
This program 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 program 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 program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
xrdp: A Remote Desktop Protocol server.
Copyright (C) Jay Sorg 2010
*/
#ifndef __XRDP_COLOR_H
#define __XRDP_COLOR_H
char* APP_CC
convert_bitmap(int in_bpp, int out_bpp, char* bmpdata,
int width, int height, int* palette);
int APP_CC
convert_color(int in_bpp, int out_bpp, int in_color, int* palette);
#endif

View File

@ -21,6 +21,7 @@
*/ */
#include "xrdp-freerdp.h" #include "xrdp-freerdp.h"
#include "xrdp-color.h"
#define GET_MOD(_inst) ((struct mod*)((_inst)->param1)) #define GET_MOD(_inst) ((struct mod*)((_inst)->param1))
#define SET_MOD(_inst, _mod) ((_inst)->param1) = _mod #define SET_MOD(_inst, _mod) ((_inst)->param1) = _mod
@ -40,6 +41,18 @@ struct my_glyph
int height; int height;
}; };
struct my_cursor
{
char* andmask;
int andbpp;
char* xormask;
int xorbpp;
int width;
int height;
int hotx;
int hoty;
};
/*****************************************************************************/ /*****************************************************************************/
/* return error */ /* return error */
static int DEFAULT_CC static int DEFAULT_CC
@ -310,9 +323,19 @@ ui_paint_bitmap(rdpInst* inst, int x, int y, int cx, int cy, int width,
int height, uint8* data) int height, uint8* data)
{ {
struct mod* mod; struct mod* mod;
char* bmpdata;
mod = GET_MOD(inst); mod = GET_MOD(inst);
mod->server_paint_rect(mod, x, y, cx, cy, data, width, height, 0, 0); bmpdata = convert_bitmap(mod->settings->server_depth, mod->bpp,
data, width, height, mod->cmap);
if (bmpdata != 0)
{
mod->server_paint_rect(mod, x, y, cx, cy, bmpdata, width, height, 0, 0);
}
if (bmpdata != (char*)data)
{
g_free(bmpdata);
}
} }
/******************************************************************************/ /******************************************************************************/
@ -341,6 +364,8 @@ ui_rect(rdpInst* inst, int x, int y, int cx, int cy, int color)
struct mod* mod; struct mod* mod;
mod = GET_MOD(inst); mod = GET_MOD(inst);
color = convert_color(mod->settings->server_depth, mod->bpp,
color, mod->cmap);
mod->server_set_fgcolor(mod, color); mod->server_set_fgcolor(mod, color);
mod->server_fill_rect(mod, x, y, cx, cy); mod->server_fill_rect(mod, x, y, cx, cy);
} }
@ -428,7 +453,11 @@ ui_patblt(rdpInst* inst, uint8 opcode, int x, int y, int cx, int cy,
mod = GET_MOD(inst); mod = GET_MOD(inst);
mod->server_set_opcode(mod, opcode); mod->server_set_opcode(mod, opcode);
fgcolor = convert_color(mod->settings->server_depth, mod->bpp,
fgcolor, mod->cmap);
mod->server_set_fgcolor(mod, fgcolor); mod->server_set_fgcolor(mod, fgcolor);
bgcolor = convert_color(mod->settings->server_depth, mod->bpp,
bgcolor, mod->cmap);
mod->server_set_bgcolor(mod, bgcolor); mod->server_set_bgcolor(mod, bgcolor);
mod->server_set_mixmode(mod, 1); mod->server_set_mixmode(mod, 1);
if (brush->bd != 0) if (brush->bd != 0)
@ -471,13 +500,24 @@ static void DEFAULT_CC
ui_memblt(rdpInst* inst, uint8 opcode, int x, int y, int cx, int cy, ui_memblt(rdpInst* inst, uint8 opcode, int x, int y, int cx, int cy,
RD_HBITMAP src, int srcx, int srcy) RD_HBITMAP src, int srcx, int srcy)
{ {
struct my_bitmap* bm; struct my_bitmap* bitmap;
struct mod* mod; struct mod* mod;
char* bmpdata;
mod = GET_MOD(inst); mod = GET_MOD(inst);
bm = (struct my_bitmap*)src; bitmap = (struct my_bitmap*)src;
mod->server_paint_rect(mod, x, y, cx, cy, bm->data, bmpdata = convert_bitmap(mod->settings->server_depth, mod->bpp,
bm->width, bm->height, srcx, srcy); bitmap->data, bitmap->width,
bitmap->height, mod->cmap);
if (bmpdata != 0)
{
mod->server_paint_rect(mod, x, y, cx, cy, bmpdata,
bitmap->width, bitmap->height, srcx, srcy);
}
if (bmpdata != bitmap->data)
{
g_free(bmpdata);
}
} }
/******************************************************************************/ /******************************************************************************/
@ -556,14 +596,32 @@ ui_resize_window(rdpInst* inst)
static void DEFAULT_CC static void DEFAULT_CC
ui_set_cursor(rdpInst* inst, RD_HCURSOR cursor) ui_set_cursor(rdpInst* inst, RD_HCURSOR cursor)
{ {
struct mod* mod;
struct my_cursor* cur;
g_writeln("ui_set_cursor:"); g_writeln("ui_set_cursor:");
mod = GET_MOD(inst);
cur = (struct my_cursor*)cursor;
if (cur != 0)
{
//mod->server_set_cursor(mod, cur->hotx, cur->hoty, cur->
}
} }
/******************************************************************************/ /******************************************************************************/
static void DEFAULT_CC static void DEFAULT_CC
ui_destroy_cursor(rdpInst* inst, RD_HCURSOR cursor) ui_destroy_cursor(rdpInst* inst, RD_HCURSOR cursor)
{ {
struct my_cursor* cur;
g_writeln("ui_destroy_cursor:"); g_writeln("ui_destroy_cursor:");
cur = (struct my_cursor*)cursor;
if (cur != 0)
{
g_free(cur->andmask);
g_free(cur->xormask);
}
g_free(cur);
} }
/******************************************************************************/ /******************************************************************************/
@ -572,8 +630,15 @@ ui_create_cursor(rdpInst* inst, unsigned int x, unsigned int y,
int width, int height, uint8* andmask, int width, int height, uint8* andmask,
uint8* xormask, int bpp) uint8* xormask, int bpp)
{ {
struct my_cursor* cur;
g_writeln("ui_create_cursor:"); g_writeln("ui_create_cursor:");
return 0; cur = (struct my_cursor*)g_malloc(sizeof(struct my_cursor), 1);
cur->width = width;
cur->height = height;
cur->hotx = x;
cur->hoty = y;
return (RD_HCURSOR)cur;
} }
/******************************************************************************/ /******************************************************************************/
@ -594,8 +659,32 @@ ui_set_default_cursor(rdpInst* inst)
static RD_HPALETTE DEFAULT_CC static RD_HPALETTE DEFAULT_CC
ui_create_colormap(rdpInst* inst, RD_PALETTE* colors) ui_create_colormap(rdpInst* inst, RD_PALETTE* colors)
{ {
struct mod* mod;
int index;
int red;
int green;
int blue;
int pixel;
int count;
int* cmap;
mod = GET_MOD(inst);
g_writeln("ui_create_colormap:"); g_writeln("ui_create_colormap:");
return 0; count = 256;
if (count > colors->ncolors)
{
count = colors->ncolors;
}
cmap = (int*)g_malloc(256 * 4, 1);
for (index = 0; index < count; index++)
{
red = colors->colors[index].red;
green = colors->colors[index].green;
blue = colors->colors[index].blue;
pixel = COLOR24RGB(red, green, blue);
cmap[index] = pixel;
}
return (RD_HPALETTE)cmap;
} }
/******************************************************************************/ /******************************************************************************/
@ -609,7 +698,12 @@ ui_move_pointer(rdpInst* inst, int x, int y)
static void DEFAULT_CC static void DEFAULT_CC
ui_set_colormap(rdpInst* inst, RD_HPALETTE map) ui_set_colormap(rdpInst* inst, RD_HPALETTE map)
{ {
struct mod* mod;
mod = GET_MOD(inst);
g_writeln("ui_set_colormap:"); g_writeln("ui_set_colormap:");
g_memcpy(mod->cmap, map, 256 * 4);
g_free(map);
} }
/******************************************************************************/ /******************************************************************************/
@ -664,6 +758,8 @@ mod_init(void)
mod->mod_check_wait_objs = mod_check_wait_objs; mod->mod_check_wait_objs = mod_check_wait_objs;
mod->settings = (struct rdp_set*)g_malloc(sizeof(struct rdp_set), 1); mod->settings = (struct rdp_set*)g_malloc(sizeof(struct rdp_set), 1);
mod->settings->width = 1280;
mod->settings->height = 1024;
mod->settings->encryption = 1; mod->settings->encryption = 1;
mod->settings->server_depth = 16; mod->settings->server_depth = 16;
mod->settings->bitmap_cache = 1; mod->settings->bitmap_cache = 1;

View File

@ -103,4 +103,5 @@ struct mod
int bpp; int bpp;
struct rdp_set* settings; struct rdp_set* settings;
struct rdp_inst* inst; struct rdp_inst* inst;
int cmap[256];
}; };