xorg: minor change to capture
This commit is contained in:
parent
e65c237503
commit
30375962d6
@ -33,6 +33,7 @@
|
|||||||
#include "rdpDraw.h"
|
#include "rdpDraw.h"
|
||||||
#include "rdpClientCon.h"
|
#include "rdpClientCon.h"
|
||||||
#include "rdpReg.h"
|
#include "rdpReg.h"
|
||||||
|
#include "rdpMisc.h"
|
||||||
|
|
||||||
#define LOG_LEVEL 1
|
#define LOG_LEVEL 1
|
||||||
#define LLOGLN(_level, _args) \
|
#define LLOGLN(_level, _args) \
|
||||||
@ -40,13 +41,13 @@
|
|||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
static Bool
|
static Bool
|
||||||
rdpCapture0(RegionPtr in_reg, RegionPtr out_reg,
|
rdpCapture0(RegionPtr in_reg, BoxPtr *out_rects, int *num_out_rects,
|
||||||
void *src, int src_width, int src_height,
|
void *src, int src_width, int src_height,
|
||||||
int src_stride, int src_format,
|
int src_stride, int src_format,
|
||||||
void *dst, int dst_width, int dst_height,
|
void *dst, int dst_width, int dst_height,
|
||||||
int dst_stride, int dst_format, int max_rects)
|
int dst_stride, int dst_format, int max_rects)
|
||||||
{
|
{
|
||||||
BoxPtr prects;
|
BoxPtr psrc_rects;
|
||||||
BoxRec rect;
|
BoxRec rect;
|
||||||
RegionRec reg;
|
RegionRec reg;
|
||||||
char *src_rect;
|
char *src_rect;
|
||||||
@ -88,14 +89,25 @@ rdpCapture0(RegionPtr in_reg, RegionPtr out_reg,
|
|||||||
if (num_regions > max_rects)
|
if (num_regions > max_rects)
|
||||||
{
|
{
|
||||||
num_regions = 1;
|
num_regions = 1;
|
||||||
prects = rdpRegionExtents(®);
|
psrc_rects = rdpRegionExtents(®);
|
||||||
rdpRegionUninit(out_reg);
|
|
||||||
rdpRegionInit(out_reg, prects, 0);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
prects = REGION_RECTS(®);
|
psrc_rects = REGION_RECTS(®);
|
||||||
rdpRegionCopy(out_reg, ®);
|
}
|
||||||
|
|
||||||
|
if (num_regions < 1)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*num_out_rects = num_regions;
|
||||||
|
|
||||||
|
*out_rects = (BoxPtr) g_malloc(sizeof(BoxRec) * num_regions, 0);
|
||||||
|
for (i = 0; i < num_regions; i++)
|
||||||
|
{
|
||||||
|
rect = psrc_rects[i];
|
||||||
|
(*out_rects)[i] = rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((src_format == XRDP_a8r8g8b8) && (dst_format == XRDP_a8r8g8b8))
|
if ((src_format == XRDP_a8r8g8b8) && (dst_format == XRDP_a8r8g8b8))
|
||||||
@ -105,7 +117,7 @@ rdpCapture0(RegionPtr in_reg, RegionPtr out_reg,
|
|||||||
for (i = 0; i < num_regions; i++)
|
for (i = 0; i < num_regions; i++)
|
||||||
{
|
{
|
||||||
/* get rect to copy */
|
/* get rect to copy */
|
||||||
rect = prects[i];
|
rect = (*out_rects)[i];
|
||||||
|
|
||||||
/* get rect dimensions */
|
/* get rect dimensions */
|
||||||
width = rect.x2 - rect.x1;
|
width = rect.x2 - rect.x1;
|
||||||
@ -137,7 +149,7 @@ rdpCapture0(RegionPtr in_reg, RegionPtr out_reg,
|
|||||||
for (i = 0; i < num_regions; i++)
|
for (i = 0; i < num_regions; i++)
|
||||||
{
|
{
|
||||||
/* get rect to copy */
|
/* get rect to copy */
|
||||||
rect = prects[i];
|
rect = (*out_rects)[i];
|
||||||
|
|
||||||
/* get rect dimensions */
|
/* get rect dimensions */
|
||||||
width = rect.x2 - rect.x1;
|
width = rect.x2 - rect.x1;
|
||||||
@ -174,7 +186,7 @@ rdpCapture0(RegionPtr in_reg, RegionPtr out_reg,
|
|||||||
for (i = 0; i < num_regions; i++)
|
for (i = 0; i < num_regions; i++)
|
||||||
{
|
{
|
||||||
/* get rect to copy */
|
/* get rect to copy */
|
||||||
rect = prects[i];
|
rect = (*out_rects)[i];
|
||||||
|
|
||||||
/* get rect dimensions */
|
/* get rect dimensions */
|
||||||
width = rect.x2 - rect.x1;
|
width = rect.x2 - rect.x1;
|
||||||
@ -211,7 +223,7 @@ rdpCapture0(RegionPtr in_reg, RegionPtr out_reg,
|
|||||||
for (i = 0; i < num_regions; i++)
|
for (i = 0; i < num_regions; i++)
|
||||||
{
|
{
|
||||||
/* get rect to copy */
|
/* get rect to copy */
|
||||||
rect = prects[i];
|
rect = (*out_rects)[i];
|
||||||
|
|
||||||
/* get rect dimensions */
|
/* get rect dimensions */
|
||||||
width = rect.x2 - rect.x1;
|
width = rect.x2 - rect.x1;
|
||||||
@ -248,7 +260,7 @@ rdpCapture0(RegionPtr in_reg, RegionPtr out_reg,
|
|||||||
for (i = 0; i < num_regions; i++)
|
for (i = 0; i < num_regions; i++)
|
||||||
{
|
{
|
||||||
/* get rect to copy */
|
/* get rect to copy */
|
||||||
rect = prects[i];
|
rect = (*out_rects)[i];
|
||||||
|
|
||||||
/* get rect dimensions */
|
/* get rect dimensions */
|
||||||
width = rect.x2 - rect.x1;
|
width = rect.x2 - rect.x1;
|
||||||
@ -285,11 +297,22 @@ rdpCapture0(RegionPtr in_reg, RegionPtr out_reg,
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
static Bool
|
||||||
|
rdpCapture1(RegionPtr in_reg, BoxPtr *out_rects, int *num_out_rects,
|
||||||
|
void *src, int src_width, int src_height,
|
||||||
|
int src_stride, int src_format,
|
||||||
|
void *dst, int dst_width, int dst_height,
|
||||||
|
int dst_stride, int dst_format, int max_rects)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copy an array of rectangles from one memory area to another
|
* Copy an array of rectangles from one memory area to another
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
Bool
|
Bool
|
||||||
rdpCapture(RegionPtr in_reg, RegionPtr out_reg,
|
rdpCapture(RegionPtr in_reg, BoxPtr *out_rects, int *num_out_rects,
|
||||||
void *src, int src_width, int src_height,
|
void *src, int src_width, int src_height,
|
||||||
int src_stride, int src_format,
|
int src_stride, int src_format,
|
||||||
void *dst, int dst_width, int dst_height,
|
void *dst, int dst_width, int dst_height,
|
||||||
@ -299,7 +322,13 @@ rdpCapture(RegionPtr in_reg, RegionPtr out_reg,
|
|||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
return rdpCapture0(in_reg, out_reg,
|
return rdpCapture0(in_reg, out_rects, num_out_rects,
|
||||||
|
src, src_width, src_height,
|
||||||
|
src_stride, src_format,
|
||||||
|
dst, dst_width, dst_height,
|
||||||
|
dst_stride, dst_format, 15);
|
||||||
|
case 1:
|
||||||
|
return rdpCapture1(in_reg, out_rects, num_out_rects,
|
||||||
src, src_width, src_height,
|
src, src_width, src_height,
|
||||||
src_stride, src_format,
|
src_stride, src_format,
|
||||||
dst, dst_width, dst_height,
|
dst, dst_width, dst_height,
|
||||||
@ -308,5 +337,5 @@ rdpCapture(RegionPtr in_reg, RegionPtr out_reg,
|
|||||||
LLOGLN(0, ("rdpCapture: unimp mode"));
|
LLOGLN(0, ("rdpCapture: unimp mode"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -19,9 +19,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
rdpCapture(RegionPtr in_reg, RegionPtr out_reg,
|
rdpCapture(RegionPtr in_reg, BoxPtr *out_rects, int *num_out_rects,
|
||||||
void *src, int src_width, int src_height,
|
void *src, int src_width, int src_height,
|
||||||
int src_stride, int src_format,
|
int src_stride, int src_format,
|
||||||
void *dst, int dst_width, int dst_height,
|
void *dst, int dst_width, int dst_height,
|
||||||
int dst_stride, int dst_format,
|
int dst_stride, int dst_format, int mode);
|
||||||
int mode);
|
|
||||||
|
@ -1874,7 +1874,8 @@ rdpClientConCheckDirtyScreen(rdpPtr dev, rdpClientCon *clientCon)
|
|||||||
static int
|
static int
|
||||||
rdpClientConSendPaintRectShmEx(rdpPtr dev, rdpClientCon *clientCon,
|
rdpClientConSendPaintRectShmEx(rdpPtr dev, rdpClientCon *clientCon,
|
||||||
struct image_data *id,
|
struct image_data *id,
|
||||||
RegionPtr dirtyReg, RegionPtr copyReg)
|
RegionPtr dirtyReg,
|
||||||
|
BoxPtr copyRects, int numCopyRects)
|
||||||
{
|
{
|
||||||
int index;
|
int index;
|
||||||
int size;
|
int size;
|
||||||
@ -1890,7 +1891,7 @@ rdpClientConSendPaintRectShmEx(rdpPtr dev, rdpClientCon *clientCon,
|
|||||||
rdpClientConBeginUpdate(dev, clientCon);
|
rdpClientConBeginUpdate(dev, clientCon);
|
||||||
|
|
||||||
num_rects_d = REGION_NUM_RECTS(dirtyReg);
|
num_rects_d = REGION_NUM_RECTS(dirtyReg);
|
||||||
num_rects_c = REGION_NUM_RECTS(copyReg);
|
num_rects_c = numCopyRects;
|
||||||
if ((num_rects_c < 1) || (num_rects_d < 1))
|
if ((num_rects_c < 1) || (num_rects_d < 1))
|
||||||
{
|
{
|
||||||
LLOGLN(0, ("rdpClientConSendPaintRectShmEx: nothing to send"));
|
LLOGLN(0, ("rdpClientConSendPaintRectShmEx: nothing to send"));
|
||||||
@ -1922,7 +1923,7 @@ rdpClientConSendPaintRectShmEx(rdpPtr dev, rdpClientCon *clientCon,
|
|||||||
out_uint16_le(s, num_rects_c);
|
out_uint16_le(s, num_rects_c);
|
||||||
for (index = 0; index < num_rects_c; index++)
|
for (index = 0; index < num_rects_c; index++)
|
||||||
{
|
{
|
||||||
box = REGION_RECTS(copyReg)[index];
|
box = copyRects[index];
|
||||||
x = box.x1;
|
x = box.x1;
|
||||||
y = box.y1;
|
y = box.y1;
|
||||||
cx = box.x2 - box.x1;
|
cx = box.x2 - box.x1;
|
||||||
@ -1951,7 +1952,8 @@ static CARD32
|
|||||||
rdpDeferredUpdateCallback(OsTimerPtr timer, CARD32 now, pointer arg)
|
rdpDeferredUpdateCallback(OsTimerPtr timer, CARD32 now, pointer arg)
|
||||||
{
|
{
|
||||||
rdpClientCon *clientCon;
|
rdpClientCon *clientCon;
|
||||||
RegionRec reg;
|
BoxPtr rects;
|
||||||
|
int num_rects;
|
||||||
struct image_data id;
|
struct image_data id;
|
||||||
|
|
||||||
LLOGLN(10, ("rdpDeferredUpdateCallback:"));
|
LLOGLN(10, ("rdpDeferredUpdateCallback:"));
|
||||||
@ -1977,18 +1979,26 @@ rdpDeferredUpdateCallback(OsTimerPtr timer, CARD32 now, pointer arg)
|
|||||||
clientCon->rdp_width, clientCon->rdp_height, clientCon->rdp_Bpp,
|
clientCon->rdp_width, clientCon->rdp_height, clientCon->rdp_Bpp,
|
||||||
id.width, id.height));
|
id.width, id.height));
|
||||||
clientCon->updateSchedualed = FALSE;
|
clientCon->updateSchedualed = FALSE;
|
||||||
rdpRegionInit(®, NullBox, 0);
|
rects = 0;
|
||||||
rdpCapture(clientCon->dirtyRegion, ®,
|
num_rects = 0;
|
||||||
id.pixels, id.width, id.height,
|
if (rdpCapture(clientCon->dirtyRegion, &rects, &num_rects,
|
||||||
id.lineBytes, XRDP_a8r8g8b8, id.shmem_pixels,
|
id.pixels, id.width, id.height,
|
||||||
clientCon->rdp_width, clientCon->rdp_height,
|
id.lineBytes, XRDP_a8r8g8b8, id.shmem_pixels,
|
||||||
clientCon->rdp_width * clientCon->rdp_Bpp,
|
clientCon->rdp_width, clientCon->rdp_height,
|
||||||
clientCon->rdp_format, 0);
|
clientCon->rdp_width * clientCon->rdp_Bpp,
|
||||||
rdpClientConSendPaintRectShmEx(clientCon->dev, clientCon, &id,
|
clientCon->rdp_format, 0))
|
||||||
clientCon->dirtyRegion, ®);
|
{
|
||||||
|
rdpClientConSendPaintRectShmEx(clientCon->dev, clientCon, &id,
|
||||||
|
clientCon->dirtyRegion,
|
||||||
|
rects, num_rects);
|
||||||
|
g_free(rects);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LLOGLN(0, ("rdpDeferredUpdateCallback: rdpCapture failed"));
|
||||||
|
}
|
||||||
rdpRegionDestroy(clientCon->dirtyRegion);
|
rdpRegionDestroy(clientCon->dirtyRegion);
|
||||||
clientCon->dirtyRegion = rdpRegionCreate(NullBox, 0);
|
clientCon->dirtyRegion = rdpRegionCreate(NullBox, 0);
|
||||||
rdpRegionUninit(®);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user