xorg: work on xrdp xorg driver
This commit is contained in:
parent
57a2cef697
commit
d985dd5fda
@ -95,6 +95,8 @@ struct _rdpRec
|
||||
int sizeInBytes;
|
||||
int num_modes;
|
||||
int bitsPerPixel;
|
||||
int Bpp;
|
||||
int Bpp_mask;
|
||||
char *pfbMemory;
|
||||
ScreenPtr pScreen;
|
||||
rdpDevPrivateKey privateKeyRecGC;
|
||||
|
@ -333,6 +333,293 @@ rdpClientConPreCheck(rdpPtr dev, rdpClientCon *clientCon, int in_size)
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpClientConFillRect(rdpPtr dev, rdpClientCon *clientCon,
|
||||
short x, short y, int cx, int cy)
|
||||
{
|
||||
if (clientCon->connected)
|
||||
{
|
||||
LLOGLN(10, ("rdpClientConFillRect:"));
|
||||
rdpClientConPreCheck(dev, clientCon, 12);
|
||||
out_uint16_le(clientCon->out_s, 3); /* fill rect */
|
||||
out_uint16_le(clientCon->out_s, 12); /* size */
|
||||
clientCon->count++;
|
||||
out_uint16_le(clientCon->out_s, x);
|
||||
out_uint16_le(clientCon->out_s, y);
|
||||
out_uint16_le(clientCon->out_s, cx);
|
||||
out_uint16_le(clientCon->out_s, cy);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpClientConScreenBlt(rdpPtr dev, rdpClientCon *clientCon,
|
||||
short x, short y, int cx, int cy, short srcx, short srcy)
|
||||
{
|
||||
if (clientCon->connected)
|
||||
{
|
||||
LLOGLN(10, ("rdpClientConScreenBlt: x %d y %d cx %d cy %d "
|
||||
"srcx %d srcy %d",
|
||||
x, y, cx, cy, srcx, srcy));
|
||||
rdpClientConPreCheck(dev, clientCon, 16);
|
||||
out_uint16_le(clientCon->out_s, 4); /* screen blt */
|
||||
out_uint16_le(clientCon->out_s, 16); /* size */
|
||||
clientCon->count++;
|
||||
out_uint16_le(clientCon->out_s, x);
|
||||
out_uint16_le(clientCon->out_s, y);
|
||||
out_uint16_le(clientCon->out_s, cx);
|
||||
out_uint16_le(clientCon->out_s, cy);
|
||||
out_uint16_le(clientCon->out_s, srcx);
|
||||
out_uint16_le(clientCon->out_s, srcy);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpClientConSetClip(rdpPtr dev, rdpClientCon *clientCon,
|
||||
short x, short y, int cx, int cy)
|
||||
{
|
||||
if (clientCon->connected)
|
||||
{
|
||||
LLOGLN(10, ("rdpClientConSetClip:"));
|
||||
rdpClientConPreCheck(dev, clientCon, 12);
|
||||
out_uint16_le(clientCon->out_s, 10); /* set clip */
|
||||
out_uint16_le(clientCon->out_s, 12); /* size */
|
||||
clientCon->count++;
|
||||
out_uint16_le(clientCon->out_s, x);
|
||||
out_uint16_le(clientCon->out_s, y);
|
||||
out_uint16_le(clientCon->out_s, cx);
|
||||
out_uint16_le(clientCon->out_s, cy);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpClientConResetClip(rdpPtr dev, rdpClientCon *clientCon)
|
||||
{
|
||||
if (clientCon->connected)
|
||||
{
|
||||
LLOGLN(10, ("rdpClientConResetClip:"));
|
||||
rdpClientConPreCheck(dev, clientCon, 4);
|
||||
out_uint16_le(clientCon->out_s, 11); /* reset clip */
|
||||
out_uint16_le(clientCon->out_s, 4); /* size */
|
||||
clientCon->count++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define COLOR8(r, g, b) \
|
||||
((((r) >> 5) << 0) | (((g) >> 5) << 3) | (((b) >> 6) << 6))
|
||||
#define COLOR15(r, g, b) \
|
||||
((((r) >> 3) << 10) | (((g) >> 3) << 5) | (((b) >> 3) << 0))
|
||||
#define COLOR16(r, g, b) \
|
||||
((((r) >> 3) << 11) | (((g) >> 2) << 5) | (((b) >> 3) << 0))
|
||||
#define COLOR24(r, g, b) \
|
||||
((((r) >> 0) << 0) | (((g) >> 0) << 8) | (((b) >> 0) << 16))
|
||||
#define SPLITCOLOR32(r, g, b, c) \
|
||||
{ \
|
||||
r = ((c) >> 16) & 0xff; \
|
||||
g = ((c) >> 8) & 0xff; \
|
||||
b = (c) & 0xff; \
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpClientConConvertPixel(rdpPtr dev, rdpClientCon *clientCon, int in_pixel)
|
||||
{
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
int rv;
|
||||
|
||||
rv = 0;
|
||||
|
||||
if (dev->depth == 24)
|
||||
{
|
||||
if (clientCon->rdp_bpp == 24)
|
||||
{
|
||||
rv = in_pixel;
|
||||
SPLITCOLOR32(red, green, blue, rv);
|
||||
rv = COLOR24(red, green, blue);
|
||||
}
|
||||
else if (clientCon->rdp_bpp == 16)
|
||||
{
|
||||
rv = in_pixel;
|
||||
SPLITCOLOR32(red, green, blue, rv);
|
||||
rv = COLOR16(red, green, blue);
|
||||
}
|
||||
else if (clientCon->rdp_bpp == 15)
|
||||
{
|
||||
rv = in_pixel;
|
||||
SPLITCOLOR32(red, green, blue, rv);
|
||||
rv = COLOR15(red, green, blue);
|
||||
}
|
||||
else if (clientCon->rdp_bpp == 8)
|
||||
{
|
||||
rv = in_pixel;
|
||||
SPLITCOLOR32(red, green, blue, rv);
|
||||
rv = COLOR8(red, green, blue);
|
||||
}
|
||||
}
|
||||
else if (dev->depth == clientCon->rdp_bpp)
|
||||
{
|
||||
return in_pixel;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpClientConConvertPixels(rdpPtr dev, rdpClientCon *clientCon,
|
||||
void *src, void *dst, int num_pixels)
|
||||
{
|
||||
unsigned int pixel;
|
||||
unsigned int red;
|
||||
unsigned int green;
|
||||
unsigned int blue;
|
||||
unsigned int *src32;
|
||||
unsigned int *dst32;
|
||||
unsigned short *dst16;
|
||||
unsigned char *dst8;
|
||||
int index;
|
||||
|
||||
if (dev->depth == clientCon->rdp_bpp)
|
||||
{
|
||||
memcpy(dst, src, num_pixels * dev->Bpp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (dev->depth == 24)
|
||||
{
|
||||
src32 = (unsigned int *)src;
|
||||
|
||||
if (clientCon->rdp_bpp == 24)
|
||||
{
|
||||
dst32 = (unsigned int *)dst;
|
||||
|
||||
for (index = 0; index < num_pixels; index++)
|
||||
{
|
||||
pixel = *src32;
|
||||
*dst32 = pixel;
|
||||
dst32++;
|
||||
src32++;
|
||||
}
|
||||
}
|
||||
else if (clientCon->rdp_bpp == 16)
|
||||
{
|
||||
dst16 = (unsigned short *)dst;
|
||||
|
||||
for (index = 0; index < num_pixels; index++)
|
||||
{
|
||||
pixel = *src32;
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
*dst16 = pixel;
|
||||
dst16++;
|
||||
src32++;
|
||||
}
|
||||
}
|
||||
else if (clientCon->rdp_bpp == 15)
|
||||
{
|
||||
dst16 = (unsigned short *)dst;
|
||||
|
||||
for (index = 0; index < num_pixels; index++)
|
||||
{
|
||||
pixel = *src32;
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR15(red, green, blue);
|
||||
*dst16 = pixel;
|
||||
dst16++;
|
||||
src32++;
|
||||
}
|
||||
}
|
||||
else if (clientCon->rdp_bpp == 8)
|
||||
{
|
||||
dst8 = (unsigned char *)dst;
|
||||
|
||||
for (index = 0; index < num_pixels; index++)
|
||||
{
|
||||
pixel = *src32;
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR8(red, green, blue);
|
||||
*dst8 = pixel;
|
||||
dst8++;
|
||||
src32++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpClientConAlphaPixels(void* src, void* dst, int num_pixels)
|
||||
{
|
||||
unsigned int* src32;
|
||||
unsigned char* dst8;
|
||||
int index;
|
||||
|
||||
src32 = (unsigned int*)src;
|
||||
dst8 = (unsigned char*)dst;
|
||||
for (index = 0; index < num_pixels; index++)
|
||||
{
|
||||
*dst8 = (*src32) >> 24;
|
||||
dst8++;
|
||||
src32++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpClientConSetFgcolor(rdpPtr dev, rdpClientCon *clientCon, int fgcolor)
|
||||
{
|
||||
if (clientCon->connected)
|
||||
{
|
||||
LLOGLN(10, ("rdpClientConSetFgcolor:"));
|
||||
rdpClientConPreCheck(dev, clientCon, 8);
|
||||
out_uint16_le(clientCon->out_s, 12); /* set fgcolor */
|
||||
out_uint16_le(clientCon->out_s, 8); /* size */
|
||||
clientCon->count++;
|
||||
fgcolor = fgcolor & dev->Bpp_mask;
|
||||
fgcolor = rdpClientConConvertPixel(dev, clientCon, fgcolor) &
|
||||
clientCon->rdp_Bpp_mask;
|
||||
out_uint32_le(clientCon->out_s, fgcolor);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpClientConSetBgcolor(rdpPtr dev, rdpClientCon *clientCon, int bgcolor)
|
||||
{
|
||||
if (clientCon->connected)
|
||||
{
|
||||
LLOGLN(10, ("rdpClientConSetBgcolor:"));
|
||||
rdpClientConPreCheck(dev, clientCon, 8);
|
||||
out_uint16_le(clientCon->out_s, 13); /* set bg color */
|
||||
out_uint16_le(clientCon->out_s, 8); /* size */
|
||||
clientCon->count++;
|
||||
bgcolor = bgcolor & dev->Bpp_mask;
|
||||
bgcolor = rdpClientConConvertPixel(dev, clientCon, bgcolor) &
|
||||
clientCon->rdp_Bpp_mask;
|
||||
out_uint32_le(clientCon->out_s, bgcolor);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int
|
||||
rdpClientConDeleteOsSurface(rdpPtr dev, rdpClientCon *clientCon, int rdpindex)
|
||||
|
@ -53,6 +53,9 @@ struct _rdpClientCon
|
||||
int osBitmapAllocSize;
|
||||
int osBitmapNumUsed;
|
||||
|
||||
int rdp_bpp; /* client depth */
|
||||
int rdp_Bpp_mask;
|
||||
|
||||
struct _rdpClientCon *next;
|
||||
};
|
||||
|
||||
|
@ -42,6 +42,7 @@ misc draw calls
|
||||
#include "rdpClientCon.h"
|
||||
#include "rdpMisc.h"
|
||||
#include "rdpGlyphs.h"
|
||||
#include "rdpReg.h"
|
||||
|
||||
#define LOG_LEVEL 1
|
||||
#define LLOGLN(_level, _args) \
|
||||
@ -110,7 +111,7 @@ rdpDrawItemRemove(rdpPtr dev, rdpPixmapRec *priv, struct rdp_draw_item *di)
|
||||
rdpGlyphDeleteRdpText(di->u.text.rtext);
|
||||
}
|
||||
|
||||
RegionDestroy(di->reg);
|
||||
rdpRegionDestroy(di->reg);
|
||||
g_free(di);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user