Пример #1
0
static RegionPtr
rdpCopyAreaWndToPixmap(WindowPtr pSrcWnd,
                       PixmapPtr pDstPixmap, rdpPixmapRec *pDstPriv,
                       GCPtr pGC, int srcx, int srcy, int w, int h,
                       int dstx, int dsty)
{
    int cd;
    int lsrcx;
    int lsrcy;
    int ldstx;
    int ldsty;
    int num_clips;
    int j;
    BoxRec box;
    RegionPtr rv;
    RegionRec clip_reg;

    LLOGLN(10, ("rdpCopyAreaWndToPixmap:"));
    RegionInit(&clip_reg, NullBox, 0);
    cd = rdp_get_clip(&clip_reg, &(pDstPixmap->drawable), pGC);
    lsrcx = pSrcWnd->drawable.x + srcx;
    lsrcy = pSrcWnd->drawable.y + srcy;
    ldstx = pDstPixmap->drawable.x + dstx;
    ldsty = pDstPixmap->drawable.y + dsty;

    if (cd == 1)
    {
        rdpup_switch_os_surface(pDstPriv->rdpindex);
        rdpup_begin_update();
        rdpup_screen_blt(ldstx, ldsty, w, h, lsrcx, lsrcy);
        rdpup_end_update();
        rdpup_switch_os_surface(-1);
    }
    else if (cd == 2)
    {
        num_clips = REGION_NUM_RECTS(&clip_reg);

        if (num_clips > 0)
        {
            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_screen_blt(ldstx, ldsty, w, h, lsrcx, lsrcy);
            }

            rdpup_reset_clip();
            rdpup_end_update();
            rdpup_switch_os_surface(-1);
        }
    }

    RegionUninit(&clip_reg);
    rv = rdpCopyAreaOrg(&(pSrcWnd->drawable), &(pDstPixmap->drawable),
                        pGC, srcx, srcy, w, h, dstx, dsty);
    return rv;
}
Пример #2
0
/* draw from an off screen pixmap to a visible window */
static RegionPtr
rdpCopyAreaPixmapToWnd(PixmapPtr pSrcPixmap, rdpPixmapRec *pSrcPriv,
                       WindowPtr pDstWnd, GCPtr pGC,
                       int srcx, int srcy, int w, int h,
                       int dstx, int dsty)
{
    int lsrcx;
    int lsrcy;
    int ldstx;
    int ldsty;
    int cd;
    int j;
    int num_clips;
    RegionPtr rv;
    RegionRec clip_reg;
    BoxRec box;

    LLOGLN(10, ("rdpCopyAreaPixmapToWnd:"));
    RegionInit(&clip_reg, NullBox, 0);
    cd = rdp_get_clip(&clip_reg, &(pDstWnd->drawable), pGC);
    ldstx = pDstWnd->drawable.x + dstx;
    ldsty = pDstWnd->drawable.y + dsty;
    lsrcx = pSrcPixmap->drawable.x + srcx;
    lsrcy = pSrcPixmap->drawable.y + srcy;

    if (cd == 1)
    {
        rdpup_begin_update();
        rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpindex, lsrcx, lsrcy);
        rdpup_end_update();
    }
    else if (cd == 2)
    {
        num_clips = REGION_NUM_RECTS(&clip_reg);

        if (num_clips > 0)
        {
            rdpup_begin_update();
            LLOGLN(10, ("rdpCopyAreaPixmapToWnd: num_clips %d", num_clips));

            for (j = 0; j < num_clips; j++)
            {
                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);
                LLOGLN(10, ("rdpCopyAreaPixmapToWnd: %d %d", w, h));
                rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpindex, lsrcx, lsrcy);
            }

            rdpup_reset_clip();
            rdpup_end_update();
        }
    }

    RegionUninit(&clip_reg);
    rv = rdpCopyAreaOrg(&(pSrcPixmap->drawable), &(pDstWnd->drawable),
                        pGC, srcx, srcy, w, h, dstx, dsty);
    return rv;
}
Пример #3
0
void
rdpPutImage(DrawablePtr pDst, GCPtr pGC, int depth, int x, int y,
            int w, int h, int leftPad, int format, char *pBits)
{
    RegionRec clip_reg;
    int cd;
    int j;
    int reset_surface;
    int post_process;
    int got_id;
    int dirty_type;
    BoxRec box;
    struct image_data id;

    WindowPtr pDstWnd;
    PixmapPtr pDstPixmap;
    rdpPixmapRec *pDstPriv;
    rdpPixmapRec *pDirtyPriv;
    RegionRec reg1;
    RegionRec reg2;

    LLOGLN(10, ("rdpPutImage:"));
    LLOGLN(10, ("rdpPutImage: drawable id 0x%x", (int)(pDst->id)));
    LLOGLN(10, ("rdpPutImage: x %d y %d w %d h %d is_window %d", x, y, w, h,
           pDst->type == DRAWABLE_WINDOW));

    /* do original call */
    rdpPutImageOrg(pDst, pGC, depth, x, y, w, h, leftPad, format, pBits);

    dirty_type = 0;
    pDirtyPriv = 0;
    post_process = 0;
    reset_surface = 0;
    got_id = 0;

    if (pDst->type == DRAWABLE_PIXMAP)
    {
        pDstPixmap = (PixmapPtr)pDst;
        pDstPriv = GETPIXPRIV(pDstPixmap);

        if (xrdp_is_os(pDstPixmap, pDstPriv))
        {
            post_process = 1;

            if (g_do_dirty_os)
            {
                LLOGLN(10, ("rdpPutImage: gettig dirty"));
                pDstPriv->is_dirty = 1;
                pDirtyPriv = pDstPriv;
                dirty_type = RDI_IMGLY;
            }
            else
            {
                rdpup_switch_os_surface(pDstPriv->rdpindex);
                reset_surface = 1;
                rdpup_get_pixmap_image_rect(pDstPixmap, &id);
                got_id = 1;
            }
        }
    }
    else
    {
        if (pDst->type == DRAWABLE_WINDOW)
        {
            pDstWnd = (WindowPtr)pDst;

            if (pDstWnd->viewable)
            {
                post_process = 1;

                if (g_do_dirty_ons)
                {
                    LLOGLN(10, ("rdpPutImage: gettig dirty"));
                    g_screenPriv.is_dirty = 1;
                    pDirtyPriv = &g_screenPriv;
                    dirty_type = RDI_IMGLL;
                }
                else
                {
                    rdpup_get_screen_image_rect(&id);
                    got_id = 1;
                }
            }
        }
    }

    if (!post_process)
    {
        return;
    }

    RegionInit(&clip_reg, NullBox, 0);
    cd = rdp_get_clip(&clip_reg, pDst, pGC);

    if (cd == 1)
    {
        if (dirty_type != 0)
        {
            box.x1 = pDst->x + x;
            box.y1 = pDst->y + y;
            box.x2 = box.x1 + w;
            box.y2 = box.y1 + h;
            RegionInit(&reg1, &box, 0);
            draw_item_add_img_region(pDirtyPriv, &reg1, GXcopy, dirty_type, TAG_PUTIMAGE);
            RegionUninit(&reg1);
        }
        else if (got_id)
        {
            rdpup_begin_update();
            rdpup_send_area(&id, pDst->x + x, pDst->y + y, w, h);
            rdpup_end_update();
        }
    }
    else if (cd == 2)
    {
        if (dirty_type != 0)
        {
            box.x1 = pDst->x + x;
            box.y1 = pDst->y + y;
            box.x2 = box.x1 + w;
            box.y2 = box.y1 + h;
            RegionInit(&reg1, &box, 0);
            RegionInit(&reg2, NullBox, 0);
            RegionCopy(&reg2, &clip_reg);
            RegionIntersect(&reg1, &reg1, &reg2);
            draw_item_add_img_region(pDirtyPriv, &reg1, GXcopy, dirty_type, TAG_PUTIMAGE);
            RegionUninit(&reg1);
            RegionUninit(&reg2);
        }
        else if (got_id)
        {
            rdpup_begin_update();

            for (j = REGION_NUM_RECTS(&clip_reg) - 1; j >= 0; j--)
            {
                box = REGION_RECTS(&clip_reg)[j];
                rdpup_set_clip(box.x1, box.y1, (box.x2 - box.x1), (box.y2 - box.y1));
                rdpup_send_area(&id, pDst->x + x, pDst->y + y, w, h);
            }

            rdpup_reset_clip();
            rdpup_end_update();
        }
    }

    RegionUninit(&clip_reg);

    if (reset_surface)
    {
        rdpup_switch_os_surface(-1);
    }
}
Пример #4
0
void
rdpPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment* pSegs)
{
  RegionRec clip_reg;
  int cd;
  int i;
  int j;
  int got_id;
  xSegment* segs;
  BoxRec box;
  struct image_data id;
  WindowPtr pDstWnd;
  PixmapPtr pDstPixmap;
  rdpPixmapRec* pDstPriv;

  LLOGLN(10, ("rdpPolySegment:"));

  segs = 0;
  if (nseg) /* get the rects */
  {
    segs = (xSegment*)g_malloc(nseg * sizeof(xSegment), 0);
    for (i = 0; i < nseg; i++)
    {
      segs[i].x1 = pSegs[i].x1 + pDrawable->x;
      segs[i].y1 = pSegs[i].y1 + pDrawable->y;
      segs[i].x2 = pSegs[i].x2 + pDrawable->x;
      segs[i].y2 = pSegs[i].y2 + pDrawable->y;
    }
  }

  /* do original call */
  rdpPolySegmentOrg(pDrawable, pGC, nseg, pSegs);

  got_id = 0;
  if (pDrawable->type == DRAWABLE_PIXMAP)
  {
    pDstPixmap = (PixmapPtr)pDrawable;
    pDstPriv = GETPIXPRIV(pDstPixmap);
    if (XRDP_IS_OS(pDstPriv))
    {
      rdpup_switch_os_surface(pDstPriv->rdpindex);
      rdpup_get_pixmap_image_rect(pDstPixmap, &id);
      got_id = 1;
    }
  }
  else
  {
    if (pDrawable->type == DRAWABLE_WINDOW)
    {
      pDstWnd = (WindowPtr)pDrawable;
      if (pDstWnd->viewable)
      {
        rdpup_get_screen_image_rect(&id);
        got_id = 1;
      }
    }
  }
  if (!got_id)
  {
    g_free(segs);
    return;
  }

  RegionInit(&clip_reg, NullBox, 0);
  cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
  if (cd == 1) /* no clip */
  {
    if (segs != 0)
    {
      rdpup_begin_update();
      rdpup_set_fgcolor(pGC->fgPixel);
      rdpup_set_opcode(pGC->alu);
      rdpup_set_pen(0, pGC->lineWidth);
      for (i = 0; i < nseg; i++)
      {
        rdpup_draw_line(segs[i].x1, segs[i].y1, segs[i].x2, segs[i].y2);
      }
      rdpup_set_opcode(GXcopy);
      rdpup_end_update();
    }
  }
  else if (cd == 2) /* clip */
  {
    if (segs != 0)
    {
      rdpup_begin_update();
      rdpup_set_fgcolor(pGC->fgPixel);
      rdpup_set_opcode(pGC->alu);
      rdpup_set_pen(0, pGC->lineWidth);
      for (j = REGION_NUM_RECTS(&clip_reg) - 1; j >= 0; j--)
      {
        box = REGION_RECTS(&clip_reg)[j];
        rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
        for (i = 0; i < nseg; i++)
        {
          rdpup_draw_line(segs[i].x1, segs[i].y1, segs[i].x2, segs[i].y2);
        }
      }
      rdpup_reset_clip();
      rdpup_set_opcode(GXcopy);
      rdpup_end_update();
    }
  }
  g_free(segs);
  RegionUninit(&clip_reg);
  rdpup_switch_os_surface(-1);
}
Пример #5
0
void rdpPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment *pSegs)
{
	RegionRec clip_reg;
	int cd;
	int i;
	int j;
	int post_process;
	xSegment *segs;
	BoxRec box;
	WindowPtr pDstWnd;
	PixmapPtr pDstPixmap;
	rdpPixmapRec *pDstPriv;

	LLOGLN(10, ("rdpPolySegment:"));
	LLOGLN(10, ("  nseg %d", nseg));

	segs = 0;

	if (nseg) /* get the rects */
	{
		segs = (xSegment*) g_malloc(nseg * sizeof(xSegment), 0);

		for (i = 0; i < nseg; i++)
		{
			segs[i].x1 = pSegs[i].x1 + pDrawable->x;
			segs[i].y1 = pSegs[i].y1 + pDrawable->y;
			segs[i].x2 = pSegs[i].x2 + pDrawable->x;
			segs[i].y2 = pSegs[i].y2 + pDrawable->y;
		}
	}

	/* do original call */
	rdpPolySegmentOrg(pDrawable, pGC, nseg, pSegs);

	post_process = 0;

	if (pDrawable->type == DRAWABLE_PIXMAP)
	{
		pDstPixmap = (PixmapPtr) pDrawable;
		pDstPriv = GETPIXPRIV(pDstPixmap);
	}
	else
	{
		if (pDrawable->type == DRAWABLE_WINDOW)
		{
			pDstWnd = (WindowPtr) pDrawable;

			if (pDstWnd->viewable)
			{
				post_process = 1;
			}
		}
	}

	if (!post_process)
	{
		free(segs);
		return;
	}

	RegionInit(&clip_reg, NullBox, 0);
	cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
	LLOGLN(10, ("rdpPolySegment: cd %d", cd));

	if (cd == 1) /* no clip */
	{
		if (segs != 0)
		{
			XRDP_MSG_LINE_TO msg;

			rdpup_begin_update();

			msg.bRop2 = rdpup_convert_opcode(pGC->alu);
			msg.penColor = rdpup_convert_color(pGC->fgPixel);
			msg.penWidth = pGC->lineWidth;
			msg.penStyle = 0;

			for (i = 0; i < nseg; i++)
			{
				msg.nXStart = segs[i].x1;
				msg.nYStart = segs[i].y1;
				msg.nXEnd = segs[i].x2;
				msg.nYEnd = segs[i].y2;
				rdpup_draw_line(&msg);
			}

			rdpup_end_update();
		}
	}
	else if (cd == 2) /* clip */
	{
		if (segs != 0)
		{
			XRDP_MSG_LINE_TO msg;

			rdpup_begin_update();

			msg.bRop2 = rdpup_convert_opcode(pGC->alu);
			msg.penColor = rdpup_convert_color(pGC->fgPixel);
			msg.penWidth = pGC->lineWidth;
			msg.penStyle = 0;

			for (j = REGION_NUM_RECTS(&clip_reg) - 1; j >= 0; j--)
			{
				box = REGION_RECTS(&clip_reg)[j];
				rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);

				for (i = 0; i < nseg; i++)
				{
					msg.nXStart = segs[i].x1;
					msg.nYStart = segs[i].y1;
					msg.nXEnd = segs[i].x2;
					msg.nYEnd = segs[i].y2;
					rdpup_draw_line(&msg);
				}
			}

			rdpup_reset_clip();
			rdpup_end_update();
		}
	}

	free(segs);
	RegionUninit(&clip_reg);
}
Пример #6
0
static RegionPtr
rdpCopyAreaWndToWnd(WindowPtr pSrcWnd, WindowPtr pDstWnd, GCPtr pGC,
                    int srcx, int srcy, int w, int h,
                    int dstx, int dsty)
{
    int cd;
    int lsrcx;
    int lsrcy;
    int ldstx;
    int ldsty;
    int num_clips;
    int dx;
    int dy;
    int j;
    BoxRec box;
    RegionPtr rv;
    RegionRec clip_reg;

    LLOGLN(10, ("rdpCopyAreaWndToWnd:"));
    RegionInit(&clip_reg, NullBox, 0);
    cd = rdp_get_clip(&clip_reg, &(pDstWnd->drawable), pGC);
    lsrcx = pSrcWnd->drawable.x + srcx;
    lsrcy = pSrcWnd->drawable.y + srcy;
    ldstx = pDstWnd->drawable.x + dstx;
    ldsty = pDstWnd->drawable.y + dsty;

    if (cd == 1)
    {
        rdpup_begin_update();
        rdpup_screen_blt(ldstx, ldsty, w, h, lsrcx, lsrcy);
        rdpup_end_update();
    }
    else if (cd == 2)
    {
        num_clips = REGION_NUM_RECTS(&clip_reg);

        if (num_clips > 0)
        {
            rdpup_begin_update();
            dx = ldstx - lsrcx;
            dy = ldsty - lsrcy;

            if ((dy < 0) || ((dy == 0) && (dx < 0)))
            {
                for (j = 0; j < num_clips; j++)
                {
                    box = REGION_RECTS(&clip_reg)[j];
                    LLOGLN(10, ("  index %d x1 %d y1 %d x2 %d y2 %d", j,
                           box.x1, box.y1, box.x2, box.y2));
                    rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
                    rdpup_screen_blt(ldstx, ldsty, w, h, lsrcx, lsrcy);
                }
            }
            else
            {
                for (j = num_clips - 1; j >= 0; j--)
                {
                    box = REGION_RECTS(&clip_reg)[j];
                    LLOGLN(10, ("  index %d x1 %d y1 %d x2 %d y2 %d", j,
                           box.x1, box.y1, box.x2, box.y2));
                    rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);
                    rdpup_screen_blt(ldstx, ldsty, w, h, lsrcx, lsrcy);
                }
            }

            rdpup_reset_clip();
            rdpup_end_update();
        }
    }

    RegionUninit(&clip_reg);
    rv = rdpCopyAreaOrg(&(pSrcWnd->drawable), &(pDstWnd->drawable),
                        pGC, srcx, srcy, w, h, dstx, dsty);
    return rv;
}
Пример #7
0
/* draw from an off screen pixmap to an off screen pixmap */
static RegionPtr
rdpCopyAreaPixmapToPixmap(PixmapPtr pSrcPixmap, rdpPixmapRec *pSrcPriv,
                          PixmapPtr pDstPixmap, rdpPixmapRec *pDstPriv,
                          GCPtr pGC, int srcx, int srcy, int w, int h,
                          int dstx, int dsty)
{
    int lsrcx;
    int lsrcy;
    int ldstx;
    int ldsty;
    int cd;
    int j;
    int num_clips;
    int dx;
    int dy;
    RegionPtr rv;
    RegionRec clip_reg;
    BoxRec box;

    LLOGLN(10, ("rdpCopyAreaPixmapToPixmap:"));
    RegionInit(&clip_reg, NullBox, 0);
    cd = rdp_get_clip(&clip_reg, &(pDstPixmap->drawable), pGC);
    LLOGLN(10, ("rdpCopyAreaPixmapToPixmap: cd %d", cd));
    ldstx = pDstPixmap->drawable.x + dstx;
    ldsty = pDstPixmap->drawable.y + dsty;
    lsrcx = pSrcPixmap->drawable.x + srcx;
    lsrcy = pSrcPixmap->drawable.y + srcy;

    if (cd == 1)
    {
        rdpup_switch_os_surface(pDstPriv->rdpindex);
        rdpup_begin_update();
        rdpup_paint_rect_os(ldstx, ldsty, w, h, pSrcPriv->rdpindex, lsrcx, lsrcy);
        LLOGLN(10, ("%d %d %d %d %d %d", ldstx, ldsty, w, h, lsrcx, lsrcy));
        rdpup_end_update();
        rdpup_switch_os_surface(-1);
    }
    else if (cd == 2)
    {
        num_clips = REGION_NUM_RECTS(&clip_reg);

        if (num_clips > 0)
        {
            rdpup_switch_os_surface(pDstPriv->rdpindex);
            rdpup_begin_update();
            dx = ldstx - lsrcx;
            dy = ldsty - lsrcy;

            LLOGLN(10, ("rdpCopyAreaPixmapToPixmap: num_clips %d", num_clips));

            if ((dy < 0) || ((dy == 0) && (dx < 0)))
            {
                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->rdpindex, lsrcx, lsrcy);
                    LLOGLN(10, ("%d %d %d %d %d %d", ldstx, ldsty, w, h, lsrcx, lsrcy));
                }
            }
            else
            {
                for (j = num_clips - 1; j >= 0; 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->rdpindex, lsrcx, lsrcy);
                    LLOGLN(10, ("%d %d %d %d %d %d", ldstx, ldsty, w, h, lsrcx, lsrcy));
                }
            }

            rdpup_reset_clip();
            rdpup_end_update();
            rdpup_switch_os_surface(-1);
        }
    }

    RegionUninit(&clip_reg);
    rv = rdpCopyAreaOrg(&(pSrcPixmap->drawable), &(pDstPixmap->drawable),
                        pGC, srcx, srcy, w, h, dstx, dsty);
    return rv;
}
Пример #8
0
void rdpPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, DDXPointPtr in_pts)
{
	RegionRec clip_reg;
	int num_clips;
	int cd;
	int i;
	int j;
	int post_process;
	BoxRec box;
	BoxRec total_box;
	DDXPointPtr pts;
	DDXPointRec stack_pts[32];
	WindowPtr pDstWnd;
	PixmapPtr pDstPixmap;
	rdpPixmapRec *pDstPriv;

	LLOGLN(10, ("rdpPolyPoint:"));
	LLOGLN(10, ("rdpPolyPoint:  npt %d", npt));

	if (npt > 32)
	{
		pts = (DDXPointPtr) g_malloc(sizeof(DDXPointRec) * npt, 0);
	}
	else
	{
		pts = stack_pts;
	}

	for (i = 0; i < npt; i++)
	{
		pts[i].x = pDrawable->x + in_pts[i].x;
		pts[i].y = pDrawable->y + in_pts[i].y;

		if (i == 0)
		{
			total_box.x1 = pts[0].x;
			total_box.y1 = pts[0].y;
			total_box.x2 = pts[0].x;
			total_box.y2 = pts[0].y;
		}
		else
		{
			if (pts[i].x < total_box.x1)
			{
				total_box.x1 = pts[i].x;
			}

			if (pts[i].y < total_box.y1)
			{
				total_box.y1 = pts[i].y;
			}

			if (pts[i].x > total_box.x2)
			{
				total_box.x2 = pts[i].x;
			}

			if (pts[i].y > total_box.y2)
			{
				total_box.y2 = pts[i].y;
			}
		}

		/* todo, use this total_box */
	}

	/* do original call */
	rdpPolyPointOrg(pDrawable, pGC, mode, npt, in_pts);

	post_process = 0;

	if (pDrawable->type == DRAWABLE_PIXMAP)
	{
		pDstPixmap = (PixmapPtr) pDrawable;
		pDstPriv = GETPIXPRIV(pDstPixmap);
	}
	else
	{
		if (pDrawable->type == DRAWABLE_WINDOW)
		{
			pDstWnd = (WindowPtr) pDrawable;

			if (pDstWnd->viewable)
			{
				post_process = 1;
			}
		}
	}

	if (!post_process)
		return;

	RegionInit(&clip_reg, NullBox, 0);
	cd = rdp_get_clip(&clip_reg, pDrawable, pGC);

	if (cd == 1)
	{
		if (npt > 0)
		{
			XRDP_MSG_OPAQUE_RECT msg;

			rdpup_begin_update();

			for (i = 0; i < npt; i++)
			{
				msg.nLeftRect = pts[i].x;
				msg.nTopRect = pts[i].y;
				msg.nWidth = 1;
				msg.nHeight = 1;
				msg.color = rdpup_convert_color(pGC->fgPixel);

				rdpup_opaque_rect(&msg);
			}

			rdpup_end_update();
		}
	}
	else if (cd == 2)
	{
		num_clips = REGION_NUM_RECTS(&clip_reg);

		if (npt > 0 && num_clips > 0)
		{
			XRDP_MSG_OPAQUE_RECT msg;

			rdpup_begin_update();

			for (j = num_clips - 1; j >= 0; j--)
			{
				box = REGION_RECTS(&clip_reg)[j];
				rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);

				for (i = 0; i < npt; i++)
				{
					msg.nLeftRect = pts[i].x;
					msg.nTopRect = pts[i].y;
					msg.nWidth = 1;
					msg.nHeight = 1;
					msg.color = rdpup_convert_color(pGC->fgPixel);

					rdpup_opaque_rect(&msg);
				}
			}

			rdpup_reset_clip();
			rdpup_end_update();
		}
	}

	RegionUninit(&clip_reg);

	if (pts != stack_pts)
	{
		free(pts);
	}
}
Пример #9
0
void
rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
             int npt, DDXPointPtr pptInit)
{
  RegionRec clip_reg;
  int num_clips;
  int cd;
  int i;
  int j;
  int x1;
  int y1;
  int x2;
  int y2;
  int got_id;
  BoxRec box;
  DDXPointPtr ppts;
  struct image_data id;
  WindowPtr pDstWnd;
  PixmapPtr pDstPixmap;
  rdpPixmapRec* pDstPriv;

  LLOGLN(10, ("rdpPolylines:"));

  ppts = 0;
  if (npt > 0)
  {
    ppts = (DDXPointPtr)g_malloc(sizeof(DDXPointRec) * npt, 0);
    for (i = 0; i < npt; i++)
    {
      ppts[i] = pptInit[i];
    }
  }

  /* do original call */
  rdpPolylinesOrg(pDrawable, pGC, mode, npt, pptInit);

  got_id = 0;
  if (pDrawable->type == DRAWABLE_PIXMAP)
  {
    pDstPixmap = (PixmapPtr)pDrawable;
    pDstPriv = GETPIXPRIV(pDstPixmap);
    if (XRDP_IS_OS(pDstPriv))
    {
      rdpup_switch_os_surface(pDstPriv->rdpindex);
      rdpup_get_pixmap_image_rect(pDstPixmap, &id);
      got_id = 1;
    }
  }
  else
  {
    if (pDrawable->type == DRAWABLE_WINDOW)
    {
      pDstWnd = (WindowPtr)pDrawable;
      if (pDstWnd->viewable)
      {
        rdpup_get_screen_image_rect(&id);
        got_id = 1;
      }
    }
  }
  if (!got_id)
  {
    g_free(ppts);
    return;
  }

  RegionInit(&clip_reg, NullBox, 0);
  cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
  if (cd == 1)
  {
    if (ppts != 0)
    {
      rdpup_begin_update();
      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++)
      {
        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_set_opcode(GXcopy);
      rdpup_end_update();
    }
  }
  else if (cd == 2)
  {
    num_clips = REGION_NUM_RECTS(&clip_reg);
    if (ppts != 0 && num_clips > 0)
    {
      rdpup_begin_update();
      rdpup_set_fgcolor(pGC->fgPixel);
      rdpup_set_opcode(pGC->alu);
      rdpup_set_pen(0, pGC->lineWidth);
      for (j = num_clips - 1; j >= 0; j--)
      {
        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++)
        {
          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_reset_clip();
      rdpup_set_opcode(GXcopy);
      rdpup_end_update();
    }
  }
  RegionUninit(&clip_reg);
  g_free(ppts);
  rdpup_switch_os_surface(-1);
}
Пример #10
0
void
rdpCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr pOldRegion)
{
  RegionRec reg;
  RegionRec clip;
  int dx;
  int dy;
  int i;
  int j;
  int num_clip_rects;
  int num_reg_rects;
  BoxRec box1;
  BoxRec box2;

  DEBUG_OUT_OPS(("in rdpCopyWindow\n"));
  RegionInit(&reg, NullBox, 0);
  RegionCopy(&reg, pOldRegion);
  g_pScreen->CopyWindow = g_rdpScreen.CopyWindow;
  g_pScreen->CopyWindow(pWin, ptOldOrg, pOldRegion);
  RegionInit(&clip, NullBox, 0);
  RegionCopy(&clip, &pWin->borderClip);
  dx = pWin->drawable.x - ptOldOrg.x;
  dy = pWin->drawable.y - ptOldOrg.y;
  rdpup_begin_update();
  num_clip_rects = REGION_NUM_RECTS(&clip);
  num_reg_rects = REGION_NUM_RECTS(&reg);
  /* should maybe sort the rects instead of checking dy < 0 */
  /* If we can depend on the rects going from top to bottom, left
     to right we are ok */
  if (dy < 0 || (dy == 0 && dx < 0))
  {
    for (j = 0; j < num_clip_rects; j++)
    {
      box1 = REGION_RECTS(&clip)[j];
      rdpup_set_clip(box1.x1, box1.y1, box1.x2 - box1.x1, box1.y2 - box1.y1);
      for (i = 0; i < num_reg_rects; i++)
      {
        box2 = REGION_RECTS(&reg)[i];
        rdpup_screen_blt(box2.x1 + dx, box2.y1 + dy, box2.x2 - box2.x1,
                         box2.y2 - box2.y1, box2.x1, box2.y1);
      }
    }
  }
  else
  {
    for (j = num_clip_rects - 1; j >= 0; j--)
    {
      box1 = REGION_RECTS(&clip)[j];
      rdpup_set_clip(box1.x1, box1.y1, box1.x2 - box1.x1, box1.y2 - box1.y1);
      for (i = num_reg_rects - 1; i >= 0; i--)
      {
        box2 = REGION_RECTS(&reg)[i];
        rdpup_screen_blt(box2.x1 + dx, box2.y1 + dy, box2.x2 - box2.x1,
                         box2.y2 - box2.y1, box2.x1, box2.y1);
      }
    }
  }
  rdpup_reset_clip();
  rdpup_end_update();
  RegionUninit(&reg);
  RegionUninit(&clip);
  g_pScreen->CopyWindow = rdpCopyWindow;
}
Пример #11
0
void rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, DDXPointPtr pptInit)
{
	RegionRec clip_reg;
	int num_clips;
	int cd;
	int i;
	int j;
	int post_process;
	BoxRec box;
	xSegment *segs;
	int nseg;
	WindowPtr pDstWnd;
	PixmapPtr pDstPixmap;
	rdpPixmapRec *pDstPriv;

	LLOGLN(10, ("rdpPolylines:"));
	LLOGLN(10, ("  npt %d mode %d x %d y %d", npt, mode,
			pDrawable->x, pDrawable->y));

	/* convert lines to line segments */
	nseg = npt - 1;
	segs = 0;

	if (npt > 1)
	{
		segs = (xSegment*) g_malloc(sizeof(xSegment) * nseg, 0);
		segs[0].x1 = pptInit[0].x + pDrawable->x;
		segs[0].y1 = pptInit[0].y + pDrawable->y;

		if (mode == CoordModeOrigin)
		{
			segs[0].x2 = pptInit[1].x + pDrawable->x;
			segs[0].y2 = pptInit[1].y + pDrawable->y;

			for (i = 2; i < npt; i++)
			{
				segs[i - 1].x1 = segs[i - 2].x2;
				segs[i - 1].y1 = segs[i - 2].y2;
				segs[i - 1].x2 = pptInit[i].x + pDrawable->x;
				segs[i - 1].y2 = pptInit[i].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;
				segs[i - 1].x2 = segs[i - 1].x1 + pptInit[i].x;
				segs[i - 1].y2 = segs[i - 1].y1 + pptInit[i].y;
			}
		}
	}
	else
	{
		LLOGLN(0, ("rdpPolylines: weird npt [%d]", npt));
	}

	/* do original call */
	rdpPolylinesOrg(pDrawable, pGC, mode, npt, pptInit);

	post_process = 0;

	if (pDrawable->type == DRAWABLE_PIXMAP)
	{
		pDstPixmap = (PixmapPtr) pDrawable;
		pDstPriv = GETPIXPRIV(pDstPixmap);
	}
	else
	{
		if (pDrawable->type == DRAWABLE_WINDOW)
		{
			pDstWnd = (WindowPtr) pDrawable;

			if (pDstWnd->viewable)
			{
				post_process = 1;
			}
		}
	}

	if (!post_process)
	{
		free(segs);
		return;
	}

	RegionInit(&clip_reg, NullBox, 0);
	cd = rdp_get_clip(&clip_reg, pDrawable, pGC);

	if (cd == 1)
	{
		if (segs != 0)
		{
			XRDP_MSG_LINE_TO msg;

			rdpup_begin_update();

			msg.bRop2 = rdpup_convert_opcode(pGC->alu);
			msg.penColor = rdpup_convert_color(pGC->fgPixel);
			msg.penWidth = pGC->lineWidth;
			msg.penStyle = 0;

			for (i = 0; i < nseg; i++)
			{
				msg.nXStart = segs[i].x1;
				msg.nYStart = segs[i].y1;
				msg.nXEnd = segs[i].x2;
				msg.nYEnd = segs[i].y2;

				rdpup_draw_line(&msg);
			}

			rdpup_end_update();
		}
	}
	else if (cd == 2)
	{
		num_clips = REGION_NUM_RECTS(&clip_reg);

		if (nseg != 0 && num_clips > 0)
		{
			XRDP_MSG_LINE_TO msg;

			rdpup_begin_update();

			msg.bRop2 = rdpup_convert_opcode(pGC->alu);
			msg.penColor = rdpup_convert_color(pGC->fgPixel);
			msg.penWidth = pGC->lineWidth;
			msg.penStyle = 0;

			for (j = num_clips - 1; j >= 0; j--)
			{
				box = REGION_RECTS(&clip_reg)[j];
				rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);

				for (i = 0; i < nseg; i++)
				{
					msg.nXStart = segs[i].x1;
					msg.nYStart = segs[i].y1;
					msg.nXEnd = segs[i].x2;
					msg.nYEnd = segs[i].y2;

					rdpup_draw_line(&msg);
				}
			}

			rdpup_reset_clip();
			rdpup_end_update();
		}
	}

	free(segs);
	RegionUninit(&clip_reg);
}
Пример #12
0
void rdpPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment *pSegs)
{
	RegionRec clip_reg;
	int cd;
	int i;
	int j;
	int got_id;
	int dirty_type;
	int post_process;
	int reset_surface;
	xSegment *segs;
	BoxRec box;
	struct image_data id;
	WindowPtr pDstWnd;
	PixmapPtr pDstPixmap;
	rdpPixmapRec *pDstPriv;
	rdpPixmapRec *pDirtyPriv;

	LLOGLN(10, ("rdpPolySegment:"));
	LLOGLN(10, ("  nseg %d", nseg));

	segs = 0;

	if (nseg) /* get the rects */
	{
		segs = (xSegment *)g_malloc(nseg * sizeof(xSegment), 0);

		for (i = 0; i < nseg; i++)
		{
			segs[i].x1 = pSegs[i].x1 + pDrawable->x;
			segs[i].y1 = pSegs[i].y1 + pDrawable->y;
			segs[i].x2 = pSegs[i].x2 + pDrawable->x;
			segs[i].y2 = pSegs[i].y2 + pDrawable->y;
		}
	}

	/* do original call */
	rdpPolySegmentOrg(pDrawable, pGC, nseg, pSegs);

	dirty_type = 0;
	pDirtyPriv = 0;
	post_process = 0;
	reset_surface = 0;
	got_id = 0;

	if (pDrawable->type == DRAWABLE_PIXMAP)
	{
		pDstPixmap = (PixmapPtr)pDrawable;
		pDstPriv = GETPIXPRIV(pDstPixmap);

		if (xrdp_is_os(pDstPixmap, pDstPriv))
		{
			post_process = 1;

			if (g_do_dirty_os)
			{
				LLOGLN(10, ("rdpPolySegment: gettig dirty"));
				pDstPriv->is_dirty = 1;
				pDirtyPriv = pDstPriv;
				dirty_type = RDI_IMGLL;
			}
			else
			{
				rdpup_switch_os_surface(pDstPriv->rdpindex);
				reset_surface = 1;
				rdpup_get_pixmap_image_rect(pDstPixmap, &id);
				got_id = 1;
			}
		}
	}
	else
	{
		if (pDrawable->type == DRAWABLE_WINDOW)
		{
			pDstWnd = (WindowPtr)pDrawable;

			if (pDstWnd->viewable)
			{
				post_process = 1;

				if (g_do_dirty_ons)
				{
					LLOGLN(0, ("rdpPolySegment: gettig dirty"));
					g_screenPriv.is_dirty = 1;
					pDirtyPriv = &g_screenPriv;
					dirty_type = RDI_IMGLL;
				}
				else
				{
					rdpup_get_screen_image_rect(&id);
					got_id = 1;
				}
			}
		}
	}

	if (!post_process)
	{
		g_free(segs);
		return;
	}

	RegionInit(&clip_reg, NullBox, 0);
	cd = rdp_get_clip(&clip_reg, pDrawable, pGC);
	LLOGLN(10, ("rdpPolySegment: cd %d", cd));

	if (cd == 1) /* no clip */
	{
		if (segs != 0)
		{
			if (dirty_type != 0)
			{
				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, 1);
			}
			else if (got_id)
			{
				rdpup_begin_update();
				rdpup_set_fgcolor(pGC->fgPixel);
				rdpup_set_opcode(pGC->alu);
				rdpup_set_pen(0, pGC->lineWidth);

				for (i = 0; i < nseg; i++)
				{
					rdpup_draw_line(segs[i].x1, segs[i].y1, segs[i].x2, segs[i].y2);
				}

				rdpup_set_opcode(GXcopy);
				rdpup_end_update();
			}
		}
	}
	else if (cd == 2) /* clip */
	{
		if (segs != 0)
		{
			if (dirty_type != 0)
			{
				draw_item_add_line_region(pDirtyPriv, &clip_reg, pGC->fgPixel,
						pGC->alu, pGC->lineWidth, segs, nseg, 1);
			}
			else if (got_id)
			{
				rdpup_begin_update();
				rdpup_set_fgcolor(pGC->fgPixel);
				rdpup_set_opcode(pGC->alu);
				rdpup_set_pen(0, pGC->lineWidth);

				for (j = REGION_NUM_RECTS(&clip_reg) - 1; j >= 0; j--)
				{
					box = REGION_RECTS(&clip_reg)[j];
					rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);

					for (i = 0; i < nseg; i++)
					{
						rdpup_draw_line(segs[i].x1, segs[i].y1, segs[i].x2, segs[i].y2);
						LLOGLN(10, ("  %d %d %d %d", segs[i].x1, segs[i].y1,
								segs[i].x2, segs[i].y2));
					}
				}

				rdpup_reset_clip();
				rdpup_set_opcode(GXcopy);
				rdpup_end_update();
			}
		}
	}

	g_free(segs);
	RegionUninit(&clip_reg);

	if (reset_surface)
	{
		rdpup_switch_os_surface(-1);
	}
}
Пример #13
0
void
rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
             int npt, DDXPointPtr pptInit)
{
    RegionRec clip_reg;
    int num_clips;
    int cd;
    int i;
    int j;
    int got_id;
    int dirty_type;
    int post_process;
    int reset_surface;
    BoxRec box;
    xSegment *segs;
    int nseg;
    struct image_data id;
    WindowPtr pDstWnd;
    PixmapPtr pDstPixmap;
    rdpPixmapRec *pDstPriv;
    rdpPixmapRec *pDirtyPriv;

    LLOGLN(10, ("rdpPolylines:"));
    LLOGLN(10, ("  npt %d mode %d x %d y %d", npt, mode,
                pDrawable->x, pDrawable->y));
#if 0
    LLOGLN(0, ("  points"));

    for (i = 0; i < npt; i++)
    {
        LLOGLN(0, ("    %d %d", pptInit[i].x, pptInit[i].y));
    }

#endif
    /* convert lines to line segments */
    nseg = npt - 1;
    segs = 0;

    if (npt > 1)
    {
        segs = (xSegment *)g_malloc(sizeof(xSegment) * nseg, 0);
        segs[0].x1 = pptInit[0].x + pDrawable->x;
        segs[0].y1 = pptInit[0].y + pDrawable->y;

        if (mode == CoordModeOrigin)
        {
            segs[0].x2 = pptInit[1].x + pDrawable->x;
            segs[0].y2 = pptInit[1].y + pDrawable->y;

            for (i = 2; i < npt; i++)
            {
                segs[i - 1].x1 = segs[i - 2].x2;
                segs[i - 1].y1 = segs[i - 2].y2;
                segs[i - 1].x2 = pptInit[i].x + pDrawable->x;
                segs[i - 1].y2 = pptInit[i].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;
                segs[i - 1].x2 = segs[i - 1].x1 + pptInit[i].x;
                segs[i - 1].y2 = segs[i - 1].y1 + pptInit[i].y;
            }
        }
    }
    else
    {
        LLOGLN(0, ("rdpPolylines: weird npt [%d]", npt));
    }

#if 0
    LLOGLN(0, ("  segments"));

    for (i = 0; i < nseg; i++)
    {
        LLOGLN(0, ("    %d %d %d %d", segs[i].x1, segs[i].y1,
                   segs[i].x2, segs[i].y2));
    }

#endif

    /* do original call */
    rdpPolylinesOrg(pDrawable, pGC, mode, npt, pptInit);

    dirty_type = 0;
    pDirtyPriv = 0;
    post_process = 0;
    reset_surface = 0;
    got_id = 0;

    if (pDrawable->type == DRAWABLE_PIXMAP)
    {
        pDstPixmap = (PixmapPtr)pDrawable;
        pDstPriv = GETPIXPRIV(pDstPixmap);

        if (xrdp_is_os(pDstPixmap, pDstPriv))
        {
            post_process = 1;

            if (g_do_dirty_os)
            {
                LLOGLN(10, ("rdpPolylines: gettig dirty"));
                pDstPriv->is_dirty = 1;
                pDirtyPriv = pDstPriv;
                dirty_type = RDI_IMGLL;
            }
            else
            {
                rdpup_switch_os_surface(pDstPriv->rdpindex);
                reset_surface = 1;
                rdpup_get_pixmap_image_rect(pDstPixmap, &id);
                got_id = 1;
            }
        }
    }
    else
    {
        if (pDrawable->type == DRAWABLE_WINDOW)
        {
            pDstWnd = (WindowPtr)pDrawable;

            if (pDstWnd->viewable)
            {
                post_process = 1;

                if (g_do_dirty_ons)
                {
                    LLOGLN(0, ("rdpPolylines: gettig dirty"));
                    g_screenPriv.is_dirty = 1;
                    pDirtyPriv = &g_screenPriv;
                    dirty_type = RDI_IMGLL;
                }
                else
                {
                    rdpup_get_screen_image_rect(&id);
                    got_id = 1;
                }
            }
        }
    }

    if (!post_process)
    {
        g_free(segs);
        return;
    }

    RegionInit(&clip_reg, NullBox, 0);
    cd = rdp_get_clip(&clip_reg, pDrawable, pGC);

    if (cd == 1)
    {
        if (segs != 0)
        {
            if (dirty_type != 0)
            {
                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)
            {
                rdpup_begin_update();
                rdpup_set_fgcolor(pGC->fgPixel);
                rdpup_set_opcode(pGC->alu);
                rdpup_set_pen(0, pGC->lineWidth);

                for (i = 0; i < nseg; i++)
                {
                    rdpup_draw_line(segs[i].x1, segs[i].y1, segs[i].x2, segs[i].y2);
                }

                rdpup_set_opcode(GXcopy);
                rdpup_end_update();
            }
        }
    }
    else if (cd == 2)
    {
        num_clips = REGION_NUM_RECTS(&clip_reg);

        if (nseg != 0 && num_clips > 0)
        {
            if (dirty_type != 0)
            {
                draw_item_add_line_region(pDirtyPriv, &clip_reg, pGC->fgPixel,
                                          pGC->alu, pGC->lineWidth, segs, nseg, 0);
            }
            else if (got_id)
            {
                rdpup_begin_update();
                rdpup_set_fgcolor(pGC->fgPixel);
                rdpup_set_opcode(pGC->alu);
                rdpup_set_pen(0, pGC->lineWidth);

                for (j = num_clips - 1; j >= 0; j--)
                {
                    box = REGION_RECTS(&clip_reg)[j];
                    rdpup_set_clip(box.x1, box.y1, box.x2 - box.x1, box.y2 - box.y1);

                    for (i = 0; i < nseg; i++)
                    {
                        rdpup_draw_line(segs[i].x1, segs[i].y1, segs[i].x2, segs[i].y2);
                    }
                }

                rdpup_reset_clip();
                rdpup_set_opcode(GXcopy);
                rdpup_end_update();
            }
        }
    }

    g_free(segs);
    RegionUninit(&clip_reg);

    if (reset_surface)
    {
        rdpup_switch_os_surface(-1);
    }
}