/*********************************************************************** * clip_visrect * * Clip a rectangle to the DC visible rect. */ BOOL clip_visrect( DC *dc, RECT *dst, const RECT *src ) { RECT clip; if (!clip_device_rect( dc, dst, src )) return FALSE; if (GetRgnBox( get_dc_region(dc), &clip )) return intersect_rect( dst, dst, &clip ); return TRUE; }
static BOOL get_vis_rectangles( DC *dc_dst, struct bitblt_coords *dst, DC *dc_src, struct bitblt_coords *src ) { RECT rect; /* get the destination visible rectangle */ rect.left = dst->log_x; rect.top = dst->log_y; rect.right = dst->log_x + dst->log_width; rect.bottom = dst->log_y + dst->log_height; LPtoDP( dc_dst->hSelf, (POINT *)&rect, 2 ); dst->x = rect.left; dst->y = rect.top; dst->width = rect.right - rect.left; dst->height = rect.bottom - rect.top; if (dst->layout & LAYOUT_RTL && dst->layout & LAYOUT_BITMAPORIENTATIONPRESERVED) { dst->x += dst->width; dst->width = -dst->width; } get_bounding_rect( &rect, dst->x, dst->y, dst->width, dst->height ); clip_visrect( dc_dst, &dst->visrect, &rect ); /* get the source visible rectangle */ if (!src) return !is_rect_empty( &dst->visrect ); rect.left = src->log_x; rect.top = src->log_y; rect.right = src->log_x + src->log_width; rect.bottom = src->log_y + src->log_height; LPtoDP( dc_src->hSelf, (POINT *)&rect, 2 ); src->x = rect.left; src->y = rect.top; src->width = rect.right - rect.left; src->height = rect.bottom - rect.top; if (src->layout & LAYOUT_RTL && src->layout & LAYOUT_BITMAPORIENTATIONPRESERVED) { src->x += src->width; src->width = -src->width; } get_bounding_rect( &rect, src->x, src->y, src->width, src->height ); if (!clip_device_rect( dc_src, &src->visrect, &rect )) return FALSE; if (is_rect_empty( &dst->visrect )) return FALSE; return intersect_vis_rectangles( dst, src ); }