inline void RedScreen::begin_update(QRegion& direct_rgn, QRegion& composit_rgn, QRegion& frame_rgn) { region_init(&composit_rgn); RecurciveLock lock(_update_lock); region_clone(&direct_rgn, &_dirty_region); region_clear(&_dirty_region); _update_mark++; lock.unlock(); QRegion rect_rgn; SpiceRect r; r.top = r.left = 0; r.right = _size.x; r.bottom = _size.y; region_init(&rect_rgn); region_add(&rect_rgn, &r); if (_frame_area) { region_clone(&frame_rgn, &direct_rgn); region_exclude(&frame_rgn, &rect_rgn); } region_and(&direct_rgn, &rect_rgn); region_destroy(&rect_rgn); for (int i = _layes.size() - 1; i >= 0; i--) { ScreenLayer* layer; if (!(layer = _layes[i])) { continue; } layer->begin_update(direct_rgn, composit_rgn); } }
bool RedScreen::_invalidate(const SpiceRect& rect, bool urgent, uint64_t& update_mark) { RecurciveLock lock(_update_lock); bool update_triger = !is_dirty() && (urgent || !_periodic_update); region_add(&_dirty_region, &rect); update_mark = _update_mark; return update_triger; }
static void cogland_region_add (struct wl_client *client, struct wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height) { CoglandSharedRegion *shared_region = wl_resource_get_user_data (resource); region_add (&shared_region->region, x, y, width, height); }
static void cogland_surface_damage (struct wl_client *client, struct wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height) { CoglandSurface *surface = wl_resource_get_user_data (resource); region_add (&surface->pending.damage, x, y, width, height); }
void VideoStream::set_clip(int type, uint32_t num_clip_rects, SpiceRect* clip_rects) { if (type == SPICE_CLIP_TYPE_NONE) { _clip = NULL; return; } ASSERT(type == SPICE_CLIP_TYPE_RECTS) region_clear(&_clip_region); for (unsigned int i = 0; i < num_clip_rects; i++) { region_add(&_clip_region, &clip_rects[i]); } _clip = &_clip_region; }