static inline pixman_bool_t miClipPictureReg(pixman_region16_t * pRegion, pixman_region16_t * pClip, int dx, int dy) { if (pixman_region_n_rects(pRegion) == 1 && pixman_region_n_rects(pClip) == 1) { pixman_box16_t *pRbox = pixman_region_rectangles(pRegion, NULL); pixman_box16_t *pCbox = pixman_region_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_region_init(pRegion); } } else if (!pixman_region_not_empty(pClip)) return FALSE; else { if (dx || dy) pixman_region_translate(pRegion, -dx, -dy); if (!pixman_region_intersect(pRegion, pRegion, pClip)) return FALSE; if (dx || dy) pixman_region_translate(pRegion, dx, dy); } return pixman_region_not_empty(pRegion); }
EAPI int ecore_x_xregion_set(Ecore_X_XRegion *region, Ecore_X_GC gc) { xcb_rectangle_t *rects; pixman_box16_t *boxes; int num; int i; if (!region) return 0; boxes = pixman_region_rectangles ((pixman_region16_t *)region, &num); if (!boxes || (num == 0)) return 0; rects = (xcb_rectangle_t *)malloc(sizeof(xcb_rectangle_t) * num); if (!rects) return 0; for (i = 0; i < num; i++) { rects[i].x = boxes[i].x1; rects[i].y = boxes[i].y1; rects[i].width = boxes[i].x2 - boxes[i].x1 + 1; rects[i].height = boxes[i].y2 - boxes[i].y1 + 1; } xcb_set_clip_rectangles(_ecore_xcb_conn, XCB_CLIP_ORDERING_YX_BANDED, gc, 0, 0, num, rects); return 1; }
static void sdlShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf) { KdScreenPriv(pScreen); KdScreenInfo *screen = pScreenPriv->screen; SdlDriver *driver = screen->driver; pixman_box16_t * rects; int amount, i; int updateRectsPixelCount = 0; //printf("sdlShadowUpdate: time %d", SDL_GetTicks()); if (driver->shadow) { ShadowUpdateProc update; if (driver->randr) { /* if (driver->screen->format->BitsPerPixel == 16) { switch (driver->randr) { case RR_Rotate_90: update = shadowUpdateRotate16_90YX; break; case RR_Rotate_180: update = shadowUpdateRotate16_180; break; case RR_Rotate_270: update = shadowUpdateRotate16_270YX; break; default: update = shadowUpdateRotate16; break; } } else */ update = shadowUpdateRotatePacked; } else update = shadowUpdatePacked; update(pScreen, pBuf); } rects = pixman_region_rectangles(&pBuf->pDamage->damage, &amount); for ( i = 0; i < amount; i++ ) { updateRectsPixelCount += (pBuf->pDamage->damage.extents.x2 - pBuf->pDamage->damage.extents.x1) * (pBuf->pDamage->damage.extents.y2 - pBuf->pDamage->damage.extents.y1); } // Each subrect is copied into temp buffer before uploading to OpenGL texture, // so if total area of pixels copied is more than 1/3 of the whole screen area, // there will be performance hit instead of optimization. if ( amount > NUMRECTS || updateRectsPixelCount * 3 > driver->screen->w * driver->screen->h ) { //printf("SDL_Flip\n"); SDL_Flip(driver->screen); //nextFullScreenRefresh = 0; } else { SDL_Rect updateRects[NUMRECTS]; //if ( ! nextFullScreenRefresh ) // nextFullScreenRefresh = SDL_GetTicks() + FULLSCREEN_REFRESH_TIME; for ( i = 0; i < amount; i++ ) { updateRects[i].x = rects[i].x1; updateRects[i].y = rects[i].y1; updateRects[i].w = rects[i].x2 - rects[i].x1; updateRects[i].h = rects[i].y2 - rects[i].y1; //printf("sdlShadowUpdate: rect %d: %04d:%04d:%04d:%04d", i, rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2); } //printf("SDL_UpdateRects %d\n", amount); SDL_UpdateRects(driver->screen, amount, updateRects); } }