summaryrefslogtreecommitdiffstats
path: root/xorg/X11R7.6/rdp/rdpPolylines.c
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2012-08-15 15:40:17 -0700
committerJay Sorg <jay.sorg@gmail.com>2012-08-15 15:40:17 -0700
commitea98b503caf78170d5a1a94557cb1a6d98821645 (patch)
tree4a42432cefd8b6adca7151b21f7a665c86d9f93b /xorg/X11R7.6/rdp/rdpPolylines.c
parent68ef36cc0267dbb0515dd8d843c88807268577d7 (diff)
downloadxrdp-proprietary-ea98b503caf78170d5a1a94557cb1a6d98821645.tar.gz
xrdp-proprietary-ea98b503caf78170d5a1a94557cb1a6d98821645.zip
xorg: work on dirty updates for bandwidth
Diffstat (limited to 'xorg/X11R7.6/rdp/rdpPolylines.c')
-rw-r--r--xorg/X11R7.6/rdp/rdpPolylines.c143
1 files changed, 93 insertions, 50 deletions
diff --git a/xorg/X11R7.6/rdp/rdpPolylines.c b/xorg/X11R7.6/rdp/rdpPolylines.c
index f52e4a17..60c29e0c 100644
--- a/xorg/X11R7.6/rdp/rdpPolylines.c
+++ b/xorg/X11R7.6/rdp/rdpPolylines.c
@@ -58,6 +58,46 @@ rdpPolylinesOrg(DrawablePtr pDrawable, GCPtr pGC, int mode,
/******************************************************************************/
void
+RegionAroundSegs(RegionPtr reg, xSegment* segs, int nseg)
+{
+ int index;
+ BoxRec box;
+ RegionRec treg;
+
+ index = 0;
+ while (index < nseg)
+ {
+ if (segs[index].x1 < segs[index].x2)
+ {
+ box.x1 = segs[index].x1;
+ box.x2 = segs[index].x2;
+ }
+ else
+ {
+ box.x1 = segs[index].x2;
+ box.x2 = segs[index].x1;
+ }
+ box.x2++;
+ if (segs[index].y1 < segs[index].y2)
+ {
+ box.y1 = segs[index].y1;
+ box.y2 = segs[index].y2;
+ }
+ else
+ {
+ box.y1 = segs[index].y2;
+ box.y2 = segs[index].y1;
+ }
+ box.y2++;
+ RegionInit(&treg, &box, 0);
+ RegionUnion(reg, reg, &treg);
+ RegionUninit(&treg);
+ index++;
+ }
+}
+
+/******************************************************************************/
+void
rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
int npt, DDXPointPtr pptInit)
{
@@ -66,32 +106,58 @@ rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
int cd;
int i;
int j;
- int x1;
- int y1;
- int x2;
- int y2;
int got_id;
int dirty_type;
int post_process;
int reset_surface;
BoxRec box;
- DDXPointPtr ppts;
+ xSegment* segs;
+ int nseg;
struct image_data id;
WindowPtr pDstWnd;
PixmapPtr pDstPixmap;
rdpPixmapRec* pDstPriv;
rdpPixmapRec* pDirtyPriv;
- LLOGLN(10, ("rdpPolylines:"));
+ LLOGLN(0, ("rdpPolylines:"));
- ppts = 0;
- if (npt > 0)
+ /* convert lines to line segments */
+ nseg = npt - 1;
+ segs = 0;
+ if (npt > 1)
{
- ppts = (DDXPointPtr)g_malloc(sizeof(DDXPointRec) * npt, 0);
- for (i = 0; i < npt; i++)
+ segs = (xSegment*)g_malloc(sizeof(xSegment) * npt - 1, 0);
+ segs[0].x1 = pptInit[0].x + pDrawable->x;
+ segs[0].y1 = pptInit[0].y + pDrawable->y;
+ if (mode == CoordModeOrigin)
{
- ppts[i] = pptInit[i];
+ segs[0].x2 = pptInit[1].x + pDrawable->x;
+ segs[0].y2 = pptInit[1].y + pDrawable->y;
}
+ else
+ {
+ segs[0].x2 = segs[0].x1 + pptInit[1].x;
+ segs[0].y2 = segs[0].y1 + pptInit[1].y;
+ }
+ for (i = 2; i < npt; i++)
+ {
+ segs[i - 1].x1 = segs[i - 2].x2;
+ segs[i - 1].y1 = segs[i - 2].y2;
+ if (mode == CoordModeOrigin)
+ {
+ segs[i - 1].x2 = pptInit[i].x + pDrawable->x;
+ segs[i - 1].y2 = pptInit[i].x + pDrawable->x;
+ }
+ else
+ {
+ segs[i - 1].x2 = segs[i - 2].x2 + pptInit[i].x;
+ segs[i - 1].y2 = segs[i - 2].y2 + pptInit[i].y;
+ }
+ }
+ }
+ else
+ {
+ LLOGLN(10, ("rdpPolylines: weird npt [%d]", npt));
}
/* do original call */
@@ -114,7 +180,7 @@ rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
LLOGLN(10, ("rdpPolylines: gettig dirty"));
pDstPriv->is_dirty = 1;
pDirtyPriv = pDstPriv;
- dirty_type = RDI_IMGLL;
+ dirty_type = RDI_LINE;
}
else
{
@@ -140,7 +206,7 @@ rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
}
if (!post_process)
{
- g_free(ppts);
+ g_free(segs);
return;
}
@@ -148,11 +214,15 @@ rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
if (cd == 1)
{
- if (ppts != 0)
+ if (segs != 0)
{
if (dirty_type != 0)
{
- /* TODO */
+ RegionUninit(&clip_reg);
+ RegionInit(&clip_reg, NullBox, 0);
+ RegionAroundSegs(&clip_reg, segs, nseg);
+ draw_item_add_line_region(pDirtyPriv, &clip_reg, pGC->fgPixel,
+ pGC->alu, pGC->lineWidth, segs, nseg, 0);
}
else if (got_id)
{
@@ -160,23 +230,9 @@ rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
rdpup_set_fgcolor(pGC->fgPixel);
rdpup_set_opcode(pGC->alu);
rdpup_set_pen(0, pGC->lineWidth);
- x1 = ppts[0].x + pDrawable->x;
- y1 = ppts[0].y + pDrawable->y;
- for (i = 1; i < npt; i++)
+ for (i = 0; i < nseg; i++)
{
- if (mode == CoordModeOrigin)
- {
- x2 = pDrawable->x + ppts[i].x;
- y2 = pDrawable->y + ppts[i].y;
- }
- else
- {
- x2 = x1 + ppts[i].x;
- y2 = y1 + ppts[i].y;
- }
- rdpup_draw_line(x1, y1, x2, y2);
- x1 = x2;
- y1 = y2;
+ rdpup_draw_line(segs[i].x1, segs[i].y1, segs[i].x2, segs[i].y2);
}
rdpup_set_opcode(GXcopy);
rdpup_end_update();
@@ -186,11 +242,12 @@ rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
else if (cd == 2)
{
num_clips = REGION_NUM_RECTS(&clip_reg);
- if (ppts != 0 && num_clips > 0)
+ if (nseg != 0 && num_clips > 0)
{
if (dirty_type != 0)
{
- /* TODO */
+ draw_item_add_line_region(pDirtyPriv, &clip_reg, pGC->fgPixel,
+ pGC->alu, pGC->lineWidth, segs, nseg, 0);
}
else if (got_id)
{
@@ -202,23 +259,9 @@ rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
{
box = REGION_RECTS(&clip_reg)[j];
rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
- x1 = ppts[0].x + pDrawable->x;
- y1 = ppts[0].y + pDrawable->y;
- for (i = 1; i < npt; i++)
+ for (i = 0; i < nseg; i++)
{
- if (mode == CoordModeOrigin)
- {
- x2 = pDrawable->x + ppts[i].x;
- y2 = pDrawable->y + ppts[i].y;
- }
- else
- {
- x2 = x1 + ppts[i].x;
- y2 = y1 + ppts[i].y;
- }
- rdpup_draw_line(x1, y1, x2, y2);
- x1 = x2;
- y1 = y2;
+ rdpup_draw_line(segs[i].x1, segs[i].y1, segs[i].x2, segs[i].y2);
}
}
rdpup_reset_clip();
@@ -227,8 +270,8 @@ rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
}
}
}
+ g_free(segs);
RegionUninit(&clip_reg);
- g_free(ppts);
if (reset_surface)
{
rdpup_switch_os_surface(-1);