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); }
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); }
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); }
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); }
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); } }
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); } }