xorg: work on offscreen bitmaps

This commit is contained in:
Jay Sorg 2012-05-19 19:25:08 -07:00
parent cc3754a2bd
commit aa3fad894d
30 changed files with 267 additions and 190 deletions

View File

@ -173,7 +173,7 @@ typedef rdpWindowRec* rdpWindowPtr;
struct _rdpPixmapRec
{
int status;
int rdpid; /* unique id for xrdp */
int rdpindex;
int allocBytes;
int con_number;
};
@ -182,8 +182,7 @@ typedef rdpPixmapRec* rdpPixmapPtr;
#define GETPIXPRIV(_pPixmap) \
(rdpPixmapPtr)dixGetPrivateAddr(&(_pPixmap->devPrivates), &g_rdpPixmapIndex)
#define XRDP_IS_OS(_priv) ((_priv->status != 0) && \
(_priv->con_number == g_con_number))
#define XRDP_IS_OS(_priv) (_priv->status != 0)
/* rdpmisc.c */
void
@ -336,6 +335,10 @@ void
KbdSync(int param1);
/* rdpup.c */
int
rdpup_add_os_bitmap(PixmapPtr pixmap, rdpPixmapPtr priv);
int
rdpup_remove_os_bitmap(int rdpindex);
void
rdpup_get_screen_image_rect(struct image_data* id);
void
@ -375,15 +378,15 @@ rdpup_send_area(struct image_data* id, int x, int y, int w, int h);
int
rdpup_set_cursor(short x, short y, char* cur_data, char* cur_mask);
int
rdpup_create_os_surface(int rdpid, int width, int height);
rdpup_create_os_surface(int rdpindexd, int width, int height);
int
rdpup_switch_os_surface(int rdpid);
rdpup_switch_os_surface(int rdpindex);
int
rdpup_delete_os_surface(int rdpid);
rdpup_delete_os_surface(int rdpindex);
void
rdpup_paint_rect_os(int x, int y, int cx, int cy,
int rdpid, int srcx, int srcy);
int rdpindex, int srcx, int srcy);
void
rdpup_set_hints(int hints, int mask);

View File

@ -158,7 +158,7 @@ rdpCopyAreaWndToPixmap(WindowPtr pSrcWnd,
ldsty = pDstPixmap->drawable.y + dsty;
if (cd == 1)
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_begin_update();
rdpup_screen_blt(ldstx, ldsty, w, h, lsrcx, lsrcy);
rdpup_end_update();
@ -169,7 +169,7 @@ rdpCopyAreaWndToPixmap(WindowPtr pSrcWnd,
num_clips = REGION_NUM_RECTS(&clip_reg);
if (num_clips > 0)
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_begin_update();
dx = dstx - srcx;
dy = dsty - srcy;
@ -232,7 +232,7 @@ rdpCopyAreaPixmapToWnd(PixmapPtr pSrcPixmap, rdpPixmapRec* pSrcPriv,
if (cd == 1)
{
rdpup_begin_update();
rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpid, lsrcx, lsrcy);
rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpindex, lsrcx, lsrcy);
rdpup_end_update();
}
else if (cd == 2)
@ -246,7 +246,7 @@ rdpCopyAreaPixmapToWnd(PixmapPtr pSrcPixmap, rdpPixmapRec* pSrcPriv,
box = REGION_RECTS(&clip_reg)[j];
LLOGLN(10, ("rdpCopyAreaPixmapToWnd: %d %d %d %d", box.x1, box.y1, box.x2, box.y2));
rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpid, lsrcx, lsrcy);
rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpindex, lsrcx, lsrcy);
}
rdpup_reset_clip();
rdpup_end_update();
@ -287,9 +287,9 @@ rdpCopyAreaPixmapToPixmap(PixmapPtr pSrcPixmap, rdpPixmapRec* pSrcPriv,
lsrcy = pSrcPixmap->drawable.y + srcy;
if (cd == 1)
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_begin_update();
rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpid, lsrcx, lsrcy);
rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpindex, lsrcx, lsrcy);
rdpup_end_update();
rdpup_switch_os_surface(-1);
}
@ -298,13 +298,13 @@ rdpCopyAreaPixmapToPixmap(PixmapPtr pSrcPixmap, rdpPixmapRec* pSrcPriv,
num_clips = REGION_NUM_RECTS(&clip_reg);
if (num_clips > 0)
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_begin_update();
for (j = 0; j < num_clips; j++)
{
box = REGION_RECTS(&clip_reg)[j];
rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpid, lsrcx, lsrcy);
rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpindex, lsrcx, lsrcy);
}
rdpup_reset_clip();
rdpup_end_update();
@ -414,7 +414,7 @@ rdpCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -91,7 +91,7 @@ rdpCopyPlane(DrawablePtr pSrc, DrawablePtr pDst,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -91,7 +91,7 @@ rdpFillPolygon(DrawablePtr pDrawable, GCPtr pGC,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -80,7 +80,7 @@ rdpFillSpans(DrawablePtr pDrawable, GCPtr pGC, int nInit,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -91,7 +91,7 @@ rdpImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -89,7 +89,7 @@ rdpImageText16(DrawablePtr pDrawable, GCPtr pGC,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -89,7 +89,7 @@ rdpImageText8(DrawablePtr pDrawable, GCPtr pGC,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -104,7 +104,7 @@ rdpPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc* parcs)
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -104,7 +104,7 @@ rdpPolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc* parcs)
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -88,7 +88,7 @@ rdpPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrectFill,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -91,7 +91,7 @@ rdpPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -130,7 +130,7 @@ rdpPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -100,7 +100,7 @@ rdpPolyRectangle(DrawablePtr pDrawable, GCPtr pGC, int nrects,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -95,7 +95,7 @@ rdpPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment* pSegs)
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -92,7 +92,7 @@ rdpPolyText16(DrawablePtr pDrawable, GCPtr pGC,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -92,7 +92,7 @@ rdpPolyText8(DrawablePtr pDrawable, GCPtr pGC,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -99,7 +99,7 @@ rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -84,7 +84,7 @@ rdpPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -73,7 +73,7 @@ rdpPutImage(DrawablePtr pDst, GCPtr pGC, int depth, int x, int y,
rdpPixmapRec* pDstPriv;
LLOGLN(10, ("rdpPutImage:"));
LLOGLN(10, ("rdpPutImage: drawable id 0x%x", pDst->id));
LLOGLN(10, ("rdpPutImage: drawable id 0x%x", (int)(pDst->id)));
/* do original call */
rdpPutImageOrg(pDst, pGC, depth, x, y, w, h, leftPad, format, pBits);
@ -84,7 +84,7 @@ rdpPutImage(DrawablePtr pDst, GCPtr pGC, int depth, int x, int y,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -81,7 +81,7 @@ rdpSetSpans(DrawablePtr pDrawable, GCPtr pGC, char* psrc,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}

View File

@ -68,15 +68,8 @@ extern int g_Bpp; /* from rdpmain.c */
extern ScreenPtr g_pScreen; /* from rdpmain.c */
extern Bool g_wrapPixmap; /* from rdpmain.c */
extern int g_con_number; /* in rdpup.c */
extern int g_connected; /* in rdpup.c */
ColormapPtr g_rdpInstalledColormap;
static int g_pixmap_rdpid = 1;
int g_pixmap_byte_total = 0;
int g_pixmap_num_used = 0;
GCFuncs g_rdpGCFuncs =
{
rdpValidateGC, rdpChangeGC, rdpCopyGC, rdpDestroyGC, rdpChangeClip,
@ -408,20 +401,17 @@ rdpCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
pScreen->CreatePixmap = g_rdpScreen.CreatePixmap;
rv = pScreen->CreatePixmap(pScreen, width, height, depth, usage_hint);
priv = GETPIXPRIV(rv);
if ((g_rdpScreen.client_info.offscreen_support_level > 0) &&
(rv->drawable.depth == g_rdpScreen.depth) &&
(org_width > 1) && (height > 1) && g_connected)
priv->rdpindex = -1;
if ((rv->drawable.depth == g_rdpScreen.depth) &&
(org_width > 1) && (height > 1))
{
priv->allocBytes = width * height * 4;
g_pixmap_byte_total += priv->allocBytes;
g_pixmap_num_used++;
priv->status = 1;
priv->rdpid = g_pixmap_rdpid;
g_pixmap_rdpid++;
priv->con_number = g_con_number;
rdpup_create_os_surface(priv->rdpid, width, height);
LLOGLN(0, ("rdpCreatePixmap: g_pixmap_byte_total %d g_pixmap_num_used %d",
g_pixmap_byte_total, g_pixmap_num_used));
priv->allocBytes = width * height * g_Bpp;
priv->rdpindex = rdpup_add_os_bitmap(rv, priv);
if (priv->rdpindex >= 0)
{
priv->status = 1;
rdpup_create_os_surface(priv->rdpindex, width, height);
}
}
pScreen->ModifyPixmapHeader(rv, org_width, 0, 0, 0, 0, 0);
pScreen->CreatePixmap = rdpCreatePixmap;
@ -441,15 +431,10 @@ rdpDestroyPixmap(PixmapPtr pPixmap)
LLOGLN(10, ("status %d refcnt %d", priv->status, pPixmap->refcnt));
if (pPixmap->refcnt < 2)
{
if (XRDP_IS_OS(priv) && g_connected)
if (XRDP_IS_OS(priv))
{
g_pixmap_byte_total -= priv->allocBytes;
g_pixmap_num_used--;
LLOGLN(0, ("rdpDestroyPixmap: id 0x%x "
"rdpid 0x%x g_pixmap_byte_total %d g_pixmap_num_used %d",
pPixmap->drawable.id, priv->rdpid,
g_pixmap_byte_total, g_pixmap_num_used));
rdpup_delete_os_surface(priv->rdpid);
rdpup_remove_os_bitmap(priv->rdpindex);
rdpup_delete_os_surface(priv->rdpindex);
}
}
pScreen = pPixmap->drawable.pScreen;
@ -748,7 +733,7 @@ rdpComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst,
pDstPriv = GETPIXPRIV(pDstPixmap);
if (XRDP_IS_OS(pDstPriv))
{
rdpup_switch_os_surface(pDstPriv->rdpid);
rdpup_switch_os_surface(pDstPriv->rdpindex);
rdpup_get_pixmap_image_rect(pDstPixmap, &id);
got_id = 1;
}
@ -828,7 +813,7 @@ rdpGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
for (index = 0; index < lists->len; index++)
{
LLOGLN(10, (" index %d size %d refcnt %d width %d height %d",
index, glyphs[index]->size, glyphs[index]->refcnt,
index, (int)(glyphs[index]->size), (int)(glyphs[index]->refcnt),
glyphs[index]->info.width, glyphs[index]->info.height));
}
ps = GetPictureScreen(g_pScreen);

View File

@ -123,7 +123,7 @@ rdpRRScreenSetSize(ScreenPtr pScreen, CARD16 width, CARD16 height,
BoxRec box;
ErrorF("rdpRRScreenSetSize: width %d height %d mmWidth %d mmHeight %d\n",
width, height, mmWidth, mmHeight);
width, height, (int)mmWidth, (int)mmHeight);
if ((width < 1) || (height < 1))
{

View File

@ -38,9 +38,7 @@ int g_con_number = 0; /* increments for each connection */
static int g_listen_sck = 0;
static int g_sck = 0;
static int g_sck_closed = 0;
int g_connected = 0;
static int g_connected = 0;
static int g_dis_listen_sck = 0;
//static int g_dis_sck = 0;
//static int g_dis_sck_closed = 0;
@ -55,7 +53,7 @@ static int g_cursor_y = 0;
static OsTimerPtr g_timer = 0;
static int g_scheduled = 0;
static int g_count = 0;
static int g_rdpid = -1;
static int g_rdpindex = -1;
extern ScreenPtr g_pScreen; /* from rdpmain.c */
extern int g_Bpp; /* from rdpmain.c */
@ -69,6 +67,21 @@ extern char g_uds_data[]; /* in rdpmain.c */
extern int g_pixmap_byte_total; /* in rdpdraw.c */
extern int g_pixmap_num_used; /* in rdpdraw.c */
struct rdpup_os_bitmap
{
int used;
PixmapPtr pixmap;
rdpPixmapPtr priv;
int stamp;
};
static struct rdpup_os_bitmap* g_os_bitmaps = 0;
static int g_max_os_bitmaps = 0;
static int g_os_bitmap_stamp = 0;
int g_pixmap_byte_total = 0;
int g_pixmap_num_used = 0;
/*
0 GXclear, 0
1 GXnor, DPon
@ -108,6 +121,86 @@ static int g_rdp_opcodes[16] =
0xff /* GXset 0xf 1 */
};
/*****************************************************************************/
int
rdpup_add_os_bitmap(PixmapPtr pixmap, rdpPixmapPtr priv)
{
int index;
int rv;
int oldest;
int oldest_index;
if (!g_connected)
{
return -1;
}
rv = -1;
index = 0;
while (index < g_max_os_bitmaps)
{
if (g_os_bitmaps[index].used == 0)
{
g_os_bitmaps[index].used = 1;
g_os_bitmaps[index].pixmap = pixmap;
g_os_bitmaps[index].priv = priv;
g_os_bitmaps[index].stamp = g_os_bitmap_stamp;
g_os_bitmap_stamp++;
g_pixmap_num_used++;
rv = index;
break;
}
index++;
}
if (rv == -1)
{
/* find oldest */
oldest = 0x7fffffff;
oldest_index = 0;
index = 0;
while (index < g_max_os_bitmaps)
{
if (g_os_bitmaps[index].stamp < oldest)
{
oldest = g_os_bitmaps[index].stamp;
oldest_index = index;
}
index++;
}
LLOGLN(0, ("rdpup_add_os_bitmap: evicting old, oldest_index %d", oldest_index));
/* evict old */
g_os_bitmaps[oldest_index].priv->status = 0;
/* set new */
g_os_bitmaps[oldest_index].pixmap = pixmap;
g_os_bitmaps[oldest_index].priv = priv;
g_os_bitmaps[oldest_index].stamp = g_os_bitmap_stamp;
g_os_bitmap_stamp++;
rv = oldest_index;
}
LLOGLN(0, ("rdpup_add_os_bitmap: new bitmap index %d", rv));
LLOGLN(0, (" g_pixmap_num_used %d", g_pixmap_num_used));
return rv;
}
/*****************************************************************************/
int
rdpup_remove_os_bitmap(int rdpindex)
{
LLOGLN(0, ("rdpup_remove_os_bitmap: index %d", rdpindex));
if ((rdpindex < 0) && (rdpindex >= g_max_os_bitmaps))
{
return 1;
}
if (g_os_bitmaps[rdpindex].used)
{
g_os_bitmaps[rdpindex].used = 0;
g_os_bitmaps[rdpindex].pixmap = 0;
g_os_bitmaps[rdpindex].priv = 0;
g_pixmap_num_used--;
}
LLOGLN(0, (" g_pixmap_num_used %d", g_pixmap_num_used));
return 0;
}
/*****************************************************************************/
/* returns error */
static int
@ -250,8 +343,8 @@ rdpup_recv(char* data, int len)
g_tcp_close(g_sck);
g_sck = 0;
g_sck_closed = 1;
g_pixmap_byte_total = 0;
g_pixmap_num_used = 0;
//g_pixmap_byte_total = 0;
//g_pixmap_num_used = 0;
return 1;
}
}
@ -262,8 +355,8 @@ rdpup_recv(char* data, int len)
g_tcp_close(g_sck);
g_sck = 0;
g_sck_closed = 1;
g_pixmap_byte_total = 0;
g_pixmap_num_used = 0;
//g_pixmap_byte_total = 0;
//g_pixmap_num_used = 0;
return 1;
}
else
@ -540,6 +633,15 @@ param4 %d\n", msg, param1, param2, param3, param4));
g_rdpScreen.client_info.offscreen_cache_size);
ErrorF(" offscreen entries %d\n",
g_rdpScreen.client_info.offscreen_cache_entries);
if (g_rdpScreen.client_info.offscreen_support_level > 0)
{
if (g_rdpScreen.client_info.offscreen_cache_entries > 0)
{
g_max_os_bitmaps = g_rdpScreen.client_info.offscreen_cache_entries;
g_os_bitmaps = (struct rdpup_os_bitmap*)
g_malloc(sizeof(struct rdpup_os_bitmap) * g_max_os_bitmaps, 1);
}
}
}
else
{
@ -1085,7 +1187,7 @@ rdpup_set_cursor(short x, short y, char* cur_data, char* cur_mask)
/******************************************************************************/
int
rdpup_create_os_surface(int rdpid, int width, int height)
rdpup_create_os_surface(int rdpindex, int width, int height)
{
LLOGLN(10, ("rdpup_create_os_surface:"));
if (g_connected)
@ -1095,7 +1197,7 @@ rdpup_create_os_surface(int rdpid, int width, int height)
out_uint16_le(g_out_s, 20);
out_uint16_le(g_out_s, 12);
g_count++;
out_uint32_le(g_out_s, rdpid);
out_uint32_le(g_out_s, rdpindex);
out_uint16_le(g_out_s, width);
out_uint16_le(g_out_s, height);
}
@ -1104,53 +1206,40 @@ rdpup_create_os_surface(int rdpid, int width, int height)
/******************************************************************************/
int
rdpup_switch_os_surface(int rdpid)
rdpup_switch_os_surface(int rdpindex)
{
LLOGLN(10, ("rdpup_switch_os_surface:"));
if (g_connected)
{
if (g_rdpid == rdpid)
if (g_rdpindex == rdpindex)
{
return 0;
}
g_rdpid = rdpid;
rdpup_send_pending(); // TODO: do we need this ?
// the protocol allows switch the surface anytime
LLOGLN(10, ("rdpup_switch_os_surface: rdpid %d", rdpid));
g_rdpindex = rdpindex;
LLOGLN(10, ("rdpup_switch_os_surface: rdpindex %d", rdpindex));
/* switch surface */
rdpup_pre_check(8);
out_uint16_le(g_out_s, 21);
out_uint16_le(g_out_s, 8);
out_uint32_le(g_out_s, rdpid);
/* begin update */
out_uint16_le(g_out_s, 1);
out_uint16_le(g_out_s, 4);
g_begin = 1;
g_count = 2;
out_uint32_le(g_out_s, rdpindex);
g_count++;
}
return 0;
}
/******************************************************************************/
int
rdpup_delete_os_surface(int rdpid)
rdpup_delete_os_surface(int rdpindex)
{
LLOGLN(10, ("rdpup_delete_os_surface: rdpid %d", rdpid));
LLOGLN(10, ("rdpup_delete_os_surface: rdpindex %d", rdpindex));
if (g_connected)
{
LLOGLN(10, ("rdpup_delete_os_surface: rdpid %d", rdpid));
//if (g_current_surface == rdpid)
//{
// g_current_surface = -1;
//}
LLOGLN(10, ("rdpup_delete_os_surface: rdpindex %d", rdpindex));
rdpup_pre_check(8);
out_uint16_le(g_out_s, 22);
out_uint16_le(g_out_s, 8);
g_count++;
out_uint32_le(g_out_s, rdpid);
out_uint32_le(g_out_s, rdpindex);
}
return 0;
}
@ -1341,7 +1430,7 @@ rdpup_send_area(struct image_data* id, int x, int y, int w, int h)
/******************************************************************************/
void
rdpup_paint_rect_os(int x, int y, int cx, int cy,
int rdpid, int srcx, int srcy)
int rdpindex, int srcx, int srcy)
{
if (g_connected)
{
@ -1353,7 +1442,7 @@ rdpup_paint_rect_os(int x, int y, int cx, int cy,
out_uint16_le(g_out_s, y);
out_uint16_le(g_out_s, cx);
out_uint16_le(g_out_s, cy);
out_uint32_le(g_out_s, rdpid);
out_uint32_le(g_out_s, rdpindex);
out_uint16_le(g_out_s, srcx);
out_uint16_le(g_out_s, srcy);
}

View File

@ -83,11 +83,11 @@ xrdp_cache_add_brush(struct xrdp_cache* self,
char* brush_item_data);
int APP_CC
xrdp_cache_add_os_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap,
int id);
int rdpindex);
int APP_CC
xrdp_cache_remove_os_bitmap(struct xrdp_cache* self, int id);
xrdp_cache_remove_os_bitmap(struct xrdp_cache* self, int rdpindex);
struct xrdp_os_bitmap_item* APP_CC
xrdp_cache_get_os_bitmap(struct xrdp_cache* self, int id);
xrdp_cache_get_os_bitmap(struct xrdp_cache* self, int rdpindex);
/* xrdp_wm.c */
struct xrdp_wm* APP_CC
@ -240,6 +240,8 @@ xrdp_painter_create(struct xrdp_wm* wm, struct xrdp_session* session);
void APP_CC
xrdp_painter_delete(struct xrdp_painter* self);
int APP_CC
wm_painter_set_target(struct xrdp_painter* self);
int APP_CC
xrdp_painter_begin_update(struct xrdp_painter* self);
int APP_CC
xrdp_painter_end_update(struct xrdp_painter* self);

View File

@ -541,76 +541,49 @@ xrdp_cache_add_brush(struct xrdp_cache* self,
}
/*****************************************************************************/
/* returns index */
/* returns error */
int APP_CC
xrdp_cache_add_os_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap,
int id)
int rdpindex)
{
int index;
struct xrdp_os_bitmap_item* bi;
if (id < 1)
if ((rdpindex < 0) || (rdpindex >= 2000))
{
return -1;
return 1;
}
index = 0;
for (index = 0; index < 2000; index++)
{
bi = self->os_bitmap_items + index;
if (bi->bitmap == 0)
{
bi->id = id;
bi->bitmap = bitmap;
//g_writeln("xrdp_cache_add_os_bitmap: bitmap id 0x%x added at index %d", id, index);
return index;
}
}
g_writeln("xrdp_cache_add_os_bitmap: bitmap id 0x%x not added, full", id);
return -1;
bi = self->os_bitmap_items + rdpindex;
bi->bitmap = bitmap;
return 0;
}
/*****************************************************************************/
/* returns index */
/* returns error */
int APP_CC
xrdp_cache_remove_os_bitmap(struct xrdp_cache* self, int id)
xrdp_cache_remove_os_bitmap(struct xrdp_cache* self, int rdpindex)
{
int index;
struct xrdp_os_bitmap_item* bi;
if (id < 1)
if ((rdpindex < 0) || (rdpindex >= 2000))
{
return -1;
return 1;
}
for (index = 0; index < 2000; index++)
{
bi = self->os_bitmap_items + index;
if (bi->id == id)
{
xrdp_bitmap_delete(bi->bitmap);
g_memset(bi, 0, sizeof(struct xrdp_os_bitmap_item));
//g_writeln("xrdp_cache_remove_os_bitmap: bitmap id 0x%x removed from index %d", id, index);
return index;
}
}
return -1;
bi = self->os_bitmap_items + rdpindex;
xrdp_bitmap_delete(bi->bitmap);
g_memset(bi, 0, sizeof(struct xrdp_os_bitmap_item));
return 0;
}
/*****************************************************************************/
struct xrdp_os_bitmap_item* APP_CC
xrdp_cache_get_os_bitmap(struct xrdp_cache* self, int id)
xrdp_cache_get_os_bitmap(struct xrdp_cache* self, int rdpindex)
{
int index;
struct xrdp_os_bitmap_item* bi;
for (index = 0; index < 2000; index++)
if ((rdpindex < 0) || (rdpindex >= 2000))
{
bi = self->os_bitmap_items + index;
if (bi->id == id)
{
//g_writeln("xrdp_cache_get_os_bitmap: bitmap id 0x%x found at index %d", id, index);
return bi;
}
return 0;
}
g_writeln("xrdp_cache_get_os_bitmap: bitmap id 0x%x not found", id);
return 0;
bi = self->os_bitmap_items + rdpindex;
return bi;
}

View File

@ -1594,81 +1594,99 @@ server_send_to_channel(struct xrdp_mod* mod, int channel_id,
/*****************************************************************************/
int DEFAULT_CC
server_create_os_surface(struct xrdp_mod* mod, int id,
server_create_os_surface(struct xrdp_mod* mod, int rdpindex,
int width, int height)
{
struct xrdp_wm* wm;
struct xrdp_bitmap* bitmap;
int index;
int error;
//g_writeln("server_create_os_surface: id 0x%x, width %d height %d",
// id, width, height);
wm = (struct xrdp_wm*)(mod->wm);
bitmap = xrdp_bitmap_create(width, height, wm->screen->bpp,
WND_TYPE_OFFSCREEN, wm);
bitmap->id = id;
index = xrdp_cache_add_os_bitmap(wm->cache, bitmap, id);
if (index < 0)
error = xrdp_cache_add_os_bitmap(wm->cache, bitmap, rdpindex);
if (error != 0)
{
g_writeln("server_create_os_surface: xrdp_cache_add_os_bitmap failed");
return 1;
}
bitmap->item_index = index;
bitmap->item_index = rdpindex;
bitmap->id = rdpindex;
return 0;
}
/*****************************************************************************/
int DEFAULT_CC
server_switch_os_surface(struct xrdp_mod* mod, int id)
server_switch_os_surface(struct xrdp_mod* mod, int rdpindex)
{
struct xrdp_wm* wm;
struct xrdp_os_bitmap_item* bi;
struct xrdp_painter* p;
//g_writeln("server_switch_os_surface: id 0x%x", id);
wm = (struct xrdp_wm*)(mod->wm);
if (id == -1)
if (rdpindex == -1)
{
//g_writeln("server_switch_os_surface: setting target_surface to screen");
wm->target_surface = wm->screen;
p = (struct xrdp_painter*)(mod->painter);
if (p != 0)
{
//g_writeln("setting target");
wm_painter_set_target(p);
}
return 0;
}
bi = xrdp_cache_get_os_bitmap(wm->cache, id);
bi = xrdp_cache_get_os_bitmap(wm->cache, rdpindex);
if (bi != 0)
{
//g_writeln("server_switch_os_surface: setting target_surface to rdpid %d", id);
wm->target_surface = bi->bitmap;
p = (struct xrdp_painter*)(mod->painter);
if (p != 0)
{
//g_writeln("setting target");
wm_painter_set_target(p);
}
}
else
{
g_writeln("server_switch_os_surface: error finding id 0x%x", id);
g_writeln("server_switch_os_surface: error finding id %d", rdpindex);
}
return 0;
}
/*****************************************************************************/
int DEFAULT_CC
server_delete_os_surface(struct xrdp_mod* mod, int id)
server_delete_os_surface(struct xrdp_mod* mod, int rdpindex)
{
struct xrdp_wm* wm;
struct xrdp_painter* p;
//g_writeln("server_delete_os_surface: id 0x%x", id);
wm = (struct xrdp_wm*)(mod->wm);
if (wm->target_surface->type == WND_TYPE_OFFSCREEN)
{
if (wm->target_surface->id == id)
if (wm->target_surface->id == rdpindex)
{
g_writeln("server_delete_os_surface: setting target_surface to screen");
wm->target_surface = wm->screen;
p = (struct xrdp_painter*)(mod->painter);
if (p != 0)
{
//g_writeln("setting target");
wm_painter_set_target(p);
}
}
}
xrdp_cache_remove_os_bitmap(wm->cache, id);
xrdp_cache_remove_os_bitmap(wm->cache, rdpindex);
return 0;
}
/*****************************************************************************/
int DEFAULT_CC
server_paint_rect_os(struct xrdp_mod* mod, int x, int y, int cx, int cy,
int id, int srcx, int srcy)
int rdpindex, int srcx, int srcy)
{
struct xrdp_wm* wm;
struct xrdp_bitmap* b;
@ -1681,7 +1699,7 @@ server_paint_rect_os(struct xrdp_mod* mod, int x, int y, int cx, int cy,
return 0;
}
wm = (struct xrdp_wm*)(mod->wm);
bi = xrdp_cache_get_os_bitmap(wm->cache, id);
bi = xrdp_cache_get_os_bitmap(wm->cache, rdpindex);
if (bi != 0)
{
b = bi->bitmap;
@ -1689,7 +1707,7 @@ server_paint_rect_os(struct xrdp_mod* mod, int x, int y, int cx, int cy,
}
else
{
g_writeln("server_paint_rect_os: error finding id 0x%x", id);
g_writeln("server_paint_rect_os: error finding id %d", rdpindex);
}
return 0;
}

View File

@ -49,16 +49,10 @@ xrdp_painter_delete(struct xrdp_painter* self)
/*****************************************************************************/
int APP_CC
xrdp_painter_begin_update(struct xrdp_painter* self)
wm_painter_set_target(struct xrdp_painter* self)
{
int surface_index;
if (self == 0)
{
return 0;
}
libxrdp_orders_init(self->session);
if (self->wm->target_surface->type == WND_TYPE_SCREEN)
{
if (self->wm->current_surface_index != 0xffff)
@ -75,8 +69,8 @@ xrdp_painter_begin_update(struct xrdp_painter* self)
if (self->wm->target_surface->tab_stop == 0) /* tab_stop is hack */
{
libxrdp_orders_send_create_os_surface(self->session, surface_index,
self->wm->target_surface->width,
self->wm->target_surface->height);
self->wm->target_surface->width,
self->wm->target_surface->height);
self->wm->target_surface->tab_stop = 1;
}
libxrdp_orders_send_switch_os_surface(self->session, surface_index);
@ -90,6 +84,19 @@ xrdp_painter_begin_update(struct xrdp_painter* self)
return 0;
}
/*****************************************************************************/
int APP_CC
xrdp_painter_begin_update(struct xrdp_painter* self)
{
if (self == 0)
{
return 0;
}
libxrdp_orders_init(self->session);
wm_painter_set_target(self);
return 0;
}
/*****************************************************************************/
int APP_CC
xrdp_painter_end_update(struct xrdp_painter* self)
@ -667,13 +674,13 @@ xrdp_painter_copy(struct xrdp_painter* self,
region = xrdp_region_create(self->wm);
if (dst->type != WND_TYPE_OFFSCREEN)
{
g_writeln("off screen to screen");
//g_writeln("off screen to screen");
xrdp_wm_get_vis_region(self->wm, dst, x, y, cx, cy,
region, self->clip_children);
}
else
{
g_writeln("off screen to off screen");
//g_writeln("off screen to off screen");
xrdp_region_add_rect(region, &clip_rect);
}
x += dx;

View File

@ -80,13 +80,13 @@ struct xrdp_mod
char* data, int data_len,
int total_data_len, int flags);
int (*server_bell_trigger)(struct xrdp_mod* v);
int (*server_create_os_surface)(struct xrdp_mod* v, int id,
int (*server_create_os_surface)(struct xrdp_mod* v, int rdpindex,
int width, int height);
int (*server_switch_os_surface)(struct xrdp_mod* v, int id);
int (*server_delete_os_surface)(struct xrdp_mod* v, int id);
int (*server_switch_os_surface)(struct xrdp_mod* v, int rdpindex);
int (*server_delete_os_surface)(struct xrdp_mod* v, int rdpindex);
int (*server_paint_rect_os)(struct xrdp_mod* mod, int x, int y,
int cx, int cy,
int id, int srcx, int srcy);
int rdpindex, int srcx, int srcy);
int (*server_set_hints)(struct xrdp_mod* mod, int hints, int mask);
long server_dumby[100 - 30]; /* align, 100 minus the number of server
functions above */

View File

@ -88,13 +88,13 @@ struct mod
char* data, int data_len,
int total_data_len, int flags);
int (*server_bell_trigger)(struct mod* v);
int (*server_create_os_surface)(struct mod* v, int id,
int (*server_create_os_surface)(struct mod* v, int rdpindex,
int width, int height);
int (*server_switch_os_surface)(struct mod* v, int id);
int (*server_delete_os_surface)(struct mod* v, int id);
int (*server_switch_os_surface)(struct mod* v, int rdpindex);
int (*server_delete_os_surface)(struct mod* v, int rdpindex);
int (*server_paint_rect_os)(struct mod* v, int x, int y,
int cx, int cy,
int id, int srcx, int srcy);
int rdpindex, int srcx, int srcy);
int (*server_set_hints)(struct mod* v, int hints, int mask);
tbus server_dumby[100 - 30]; /* align, 100 minus the number of server
functions above */