static void draw_view(struct weston_view *ev, struct weston_output *output, pixman_region32_t *damage) /* in global coordinates */ { struct pixman_surface_state *ps = get_surface_state(ev->surface); /* repaint bounding region in global coordinates: */ pixman_region32_t repaint; /* non-opaque region in surface coordinates: */ pixman_region32_t surface_blend; /* No buffer attached */ if (!ps->image) return; pixman_region32_init(&repaint); pixman_region32_intersect(&repaint, &ev->transform.boundingbox, damage); pixman_region32_subtract(&repaint, &repaint, &ev->clip); if (!pixman_region32_not_empty(&repaint)) goto out; if (output->zoom.active) { weston_log("pixman renderer does not support zoom\n"); goto out; } /* TODO: Implement repaint_region_complex() using pixman_composite_trapezoids() */ if (ev->transform.enabled && ev->transform.matrix.type != WESTON_MATRIX_TRANSFORM_TRANSLATE) { repaint_region(ev, output, &repaint, NULL, PIXMAN_OP_OVER); } else { /* blended region is whole surface minus opaque region: */ pixman_region32_init_rect(&surface_blend, 0, 0, ev->surface->width, ev->surface->height); pixman_region32_subtract(&surface_blend, &surface_blend, &ev->surface->opaque); if (pixman_region32_not_empty(&ev->surface->opaque)) { repaint_region(ev, output, &repaint, &ev->surface->opaque, PIXMAN_OP_SRC); } if (pixman_region32_not_empty(&surface_blend)) { repaint_region(ev, output, &repaint, &surface_blend, PIXMAN_OP_OVER); } pixman_region32_fini(&surface_blend); } out: pixman_region32_fini(&repaint); }
static void draw_view_translated(struct weston_view *view, struct weston_output *output, pixman_region32_t *repaint_global) { struct weston_surface *surface = view->surface; /* non-opaque region in surface coordinates: */ pixman_region32_t surface_blend; /* region to be painted in output coordinates: */ pixman_region32_t repaint_output; pixman_region32_init(&repaint_output); /* Blended region is whole surface minus opaque region, * unless surface alpha forces us to blend all. */ pixman_region32_init_rect(&surface_blend, 0, 0, surface->width, surface->height); if (!(view->alpha < 1.0)) { pixman_region32_subtract(&surface_blend, &surface_blend, &surface->opaque); if (pixman_region32_not_empty(&surface->opaque)) { region_intersect_only_translation(&repaint_output, repaint_global, &surface->opaque, view); region_global_to_output(output, &repaint_output); repaint_region(view, output, &repaint_output, NULL, PIXMAN_OP_SRC); } } if (pixman_region32_not_empty(&surface_blend)) { region_intersect_only_translation(&repaint_output, repaint_global, &surface_blend, view); region_global_to_output(output, &repaint_output); repaint_region(view, output, &repaint_output, NULL, PIXMAN_OP_OVER); } pixman_region32_fini(&surface_blend); pixman_region32_fini(&repaint_output); }
/** * cairo_region_is_empty: * @region: a #cairo_region_t * * Checks whether @region is empty. * * Return value: %TRUE if @region is empty, %FALSE if it isn't. * * Since: 1.10 **/ cairo_bool_t cairo_region_is_empty (const cairo_region_t *region) { if (region->status) return TRUE; return ! pixman_region32_not_empty (CONST_CAST ®ion->rgn); }
static inline pixman_bool_t miClipPictureReg (pixman_region32_t * pRegion, pixman_region32_t * pClip, int dx, int dy) { if (pixman_region32_n_rects(pRegion) == 1 && pixman_region32_n_rects(pClip) == 1) { pixman_box32_t * pRbox = pixman_region32_rectangles(pRegion, NULL); pixman_box32_t * pCbox = pixman_region32_rectangles(pClip, NULL); int v; if (pRbox->x1 < (v = pCbox->x1 + dx)) pRbox->x1 = BOUND(v); if (pRbox->x2 > (v = pCbox->x2 + dx)) pRbox->x2 = BOUND(v); if (pRbox->y1 < (v = pCbox->y1 + dy)) pRbox->y1 = BOUND(v); if (pRbox->y2 > (v = pCbox->y2 + dy)) pRbox->y2 = BOUND(v); if (pRbox->x1 >= pRbox->x2 || pRbox->y1 >= pRbox->y2) { pixman_region32_init (pRegion); } } else if (!pixman_region32_not_empty (pClip)) return FALSE; else { if (dx || dy) pixman_region32_translate (pRegion, -dx, -dy); if (!pixman_region32_intersect (pRegion, pRegion, pClip)) return FALSE; if (dx || dy) pixman_region32_translate(pRegion, dx, dy); } return pixman_region32_not_empty(pRegion); }
static void draw_view(struct weston_view *ev, struct weston_output *output, pixman_region32_t *damage) /* in global coordinates */ { static int zoom_logged = 0; struct pixman_surface_state *ps = get_surface_state(ev->surface); /* repaint bounding region in global coordinates: */ pixman_region32_t repaint; /* No buffer attached */ if (!ps->image) return; pixman_region32_init(&repaint); pixman_region32_intersect(&repaint, &ev->transform.boundingbox, damage); pixman_region32_subtract(&repaint, &repaint, &ev->clip); if (!pixman_region32_not_empty(&repaint)) goto out; if (output->zoom.active && !zoom_logged) { weston_log("pixman renderer does not support zoom\n"); zoom_logged = 1; } if (view_transformation_is_translation(ev)) { /* The simple case: The surface regions opaque, non-opaque, * etc. are convertible to global coordinate space. * There is no need to use a source clip region. * It is possible to paint opaque region as PIXMAN_OP_SRC. * Also the boundingbox is accurate rather than an * approximation. */ draw_view_translated(ev, output, &repaint); } else { /* The complex case: the view transformation does not allow * converting opaque etc. regions into global coordinate space. * Therefore we need source clipping to avoid sampling from * unwanted source image areas, unless the source image is * to be used whole. Source clipping does not work with * PIXMAN_OP_SRC. */ draw_view_source_clipped(ev, output, &repaint); } out: pixman_region32_fini(&repaint); }
cairo_bool_t _cairo_region_not_empty (cairo_region_t *region) { return (cairo_bool_t) pixman_region32_not_empty (®ion->rgn); }
bool Region::isEmpty() const { return pixman_region32_not_empty(&m_region) ? false: true; }