/* gfx_gdi_lock: */ static void gfx_gdi_lock(struct BITMAP *bmp) { /* to prevent the drawing threads and the rendering proc * from concurrently accessing the dirty lines array */ _enter_gfx_critical(); /* arrange for drawing requests to pause when we are in the background */ if (!_win_app_foreground) { /* stop timer */ remove_int(render_proc); _exit_gfx_critical(); if (GFX_CRITICAL_RELEASED) _win_thread_switch_out(); _enter_gfx_critical(); /* restart timer */ install_int(render_proc, RENDER_DELAY); } lock_nesting++; bmp->id |= BMP_ID_LOCKED; }
/* gfx_directx_switch_out: * Arranges for drawing requests to pause when we are in the background. */ static void gfx_directx_switch_out(void) { _exit_gfx_critical(); if (GFX_CRITICAL_RELEASED) _win_thread_switch_out(); _enter_gfx_critical(); }
/* flip_with_forefront_bitmap: * Worker function for DirectDraw page flipping. */ static int flip_with_forefront_bitmap(BITMAP *bmp, int wait) { DDRAW_SURFACE *surf; HRESULT hr; /* flip only in the foreground */ if (!_win_app_foreground) { _win_thread_switch_out(); return 0; } /* retrieve the underlying surface */ surf = DDRAW_SURFACE_OF(bmp); if (surf == flipping_page[0]) return 0; ASSERT((surf == flipping_page[1]) || (surf == flipping_page[2])); /* flip the contents of the surfaces */ hr = IDirectDrawSurface2_Flip(flipping_page[0]->id, surf->id, wait ? DDFLIP_WAIT : 0); /* if the surface has been lost, try to restore all surfaces */ if (hr == DDERR_SURFACELOST) { if (restore_all_ddraw_surfaces() == 0) hr = IDirectDrawSurface2_Flip(flipping_page[0]->id, surf->id, wait ? DDFLIP_WAIT : 0); } if (FAILED(hr)) { _TRACE(PREFIX_E "Can't flip (%s)\n", dd_err(hr)); return -1; } /* attach the surface to the former forefront bitmap */ surf->parent_bmp = flipping_page[0]->parent_bmp; surf->parent_bmp->extra = surf; /* make the bitmap point to the forefront surface */ flipping_page[0]->parent_bmp = bmp; bmp->extra = flipping_page[0]; return 0; }