void RedScreen::__show_full_screen() { if (!_monitor) { hide(); return; } SpicePoint position = _monitor->get_position(); SpicePoint monitor_size = _monitor->get_size(); _frame_area = false; region_clear(&_dirty_region); _window.set_type(RedWindow::TYPE_FULLSCREEN); _window.move_and_resize(position.x, position.y, monitor_size.x, monitor_size.y); if (!(_out_of_sync = _monitor->is_out_of_sync())) { ASSERT(monitor_size.x >= _size.x); ASSERT(monitor_size.y >= _size.y); _origin.x = (monitor_size.x - _size.x) / 2; _origin.y = (monitor_size.y - _size.y) / 2; _frame_area = monitor_size.x != _size.x || monitor_size.y != _size.y; } else { _origin.x = _origin.y = 0; } _window.set_origin(_origin.x, _origin.y); show(); }
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); } }
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; }
void RedScreen::exit_full_screen() { if (!_full_screen) { return; } RecurciveLock lock(_update_lock); _window.hide(); region_clear(&_dirty_region); _window.set_type(RedWindow::TYPE_NORMAL); adjust_window_rect(_save_pos.x, _save_pos.y); _origin.x = _origin.y = 0; _window.set_origin(0, 0); show(); _full_screen = false; _out_of_sync = false; _frame_area = false; }