// cairo_public cairo_status_t // cairo_region_xor (cairo_region_t *dst, const cairo_region_t *other); static int l_cairo_region_xor (lua_State* L) { cairo_region_t *dst = get_cairo_region_t (L, 1); const cairo_region_t *other = get_cairo_region_t (L, 2); cairo_status_t v = cairo_region_xor (dst, other); lua_pushinteger(L, v); return 1; }
bool wxRegion::DoXor( const wxRegion& region ) { if (region.m_refData == NULL) { } else if (m_refData == NULL) { // XOR-ing with an invalid region is the same as XOR-ing with an empty // one, i.e. it is simply a copy. m_refData = new wxRegionRefData(*M_REGIONDATA_OF(region)); } else { AllocExclusive(); #ifdef __WXGTK3__ cairo_region_xor(M_REGIONDATA->m_region, M_REGIONDATA_OF(region)->m_region); #else gdk_region_xor( M_REGIONDATA->m_region, region.GetRegion() ); #endif } return true; }
static void grab_screenshot (ClutterActor *stage, _screenshot_data *screenshot_data) { MetaScreen *screen = shell_global_get_screen (screenshot_data->screenshot->global); MetaCursorTracker *tracker; int width, height; GSimpleAsyncResult *result; GSettings *settings; meta_screen_get_size (screen, &width, &height); do_grab_screenshot (screenshot_data, 0, 0, width, height); if (meta_screen_get_n_monitors (screen) > 1) { cairo_region_t *screen_region = cairo_region_create (); cairo_region_t *stage_region; MetaRectangle monitor_rect; cairo_rectangle_int_t stage_rect; int i; cairo_t *cr; for (i = meta_screen_get_n_monitors (screen) - 1; i >= 0; i--) { meta_screen_get_monitor_geometry (screen, i, &monitor_rect); cairo_region_union_rectangle (screen_region, (const cairo_rectangle_int_t *) &monitor_rect); } stage_rect.x = 0; stage_rect.y = 0; stage_rect.width = width; stage_rect.height = height; stage_region = cairo_region_create_rectangle ((const cairo_rectangle_int_t *) &stage_rect); cairo_region_xor (stage_region, screen_region); cairo_region_destroy (screen_region); cr = cairo_create (screenshot_data->image); for (i = 0; i < cairo_region_num_rectangles (stage_region); i++) { cairo_rectangle_int_t rect; cairo_region_get_rectangle (stage_region, i, &rect); cairo_rectangle (cr, (double) rect.x, (double) rect.y, (double) rect.width, (double) rect.height); cairo_fill (cr); } cairo_destroy (cr); cairo_region_destroy (stage_region); } screenshot_data->screenshot_area.x = 0; screenshot_data->screenshot_area.y = 0; screenshot_data->screenshot_area.width = width; screenshot_data->screenshot_area.height = height; settings = g_settings_new (A11Y_APPS_SCHEMA); if (screenshot_data->include_cursor && !g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY)) { tracker = meta_cursor_tracker_get_for_screen (screen); _draw_cursor_image (tracker, screenshot_data->image, screenshot_data->screenshot_area); } g_object_unref (settings); g_signal_handlers_disconnect_by_func (stage, (void *)grab_screenshot, (gpointer)screenshot_data); result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, grab_screenshot); g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL); g_object_unref (result); }