HRESULT __stdcall DDRAWSURFACE4_HOOK_Flip(LPVOID *ppvOut, LPDIRECTDRAWSURFACE4 lpDDSurfaceTargetOverride, DWORD dwFlags) {
	const unsigned int hpos = 11;

	HRESULT ret;
	if(!g_config.fullscreen && ((LPDIRECTDRAWSURFACE4)ppvOut) == g_frontbuffer) {
		RECT rect;
		POINT p1, p2;
		GetClientRect(g_hwnd, &rect);

		p1.x = rect.left;
		p1.y = rect.top;
		p2.x = rect.right;
		p2.y = rect.bottom;

		ClientToScreen(g_hwnd, &p1);
		ClientToScreen(g_hwnd, &p2);

		rect.left = p1.x;
		rect.top = p1.y;
		rect.right = p2.x;
		rect.bottom = p2.y;

		ret = ((LPDIRECTDRAWSURFACE4)ppvOut)->Blt(&rect, g_backbuffer, NULL, DDBLT_WAIT, NULL);

		Log("BLIT FLIP\n");
	} else {
		DDRAWSURFACE4_Flip_Type ofn = (DDRAWSURFACE4_Flip_Type)ddrawsurface4_hooks[hpos].oldFunc;
		HRESULT ret = ofn(ppvOut, lpDDSurfaceTargetOverride, dwFlags);
		LogDXError(ret);

		Log("IDirectDrawSurface4::%s(this=%#010lx, lpDDSurfaceTargetOverride=%#010lx, dwFlags=%#010lx)\n", ddrawsurface4_hooks[hpos].name, ppvOut, lpDDSurfaceTargetOverride, dwFlags);
		if(g_d3ddevice != NULL && g_binkActive == FALSE) {
			LPDIRECT3DVIEWPORT3 lpVP = NULL;
			D3DVIEWPORT2 d3dvp_old, d3dvp_new;
			D3DRECT rect[4];
			memset(&rect, 0, sizeof(rect));
			memset(&d3dvp_old, 0, sizeof(d3dvp_old));
			d3dvp_old.dwSize = sizeof(d3dvp_old);

			((LPDIRECT3DDEVICE3)g_d3ddevice)->GetCurrentViewport(&lpVP);
			lpVP->GetViewport2(&d3dvp_old);

			memcpy(&d3dvp_new, &d3dvp_old, sizeof(d3dvp_new));
			d3dvp_new.dwSize = 0; //special case for internal call
			d3dvp_old.dwSize = 0;
			d3dvp_new.dwX = d3dvp_new.dwY = 0;
			d3dvp_new.dwWidth = displaymode_options[g_config.displaymode].resX;
			d3dvp_new.dwHeight = displaymode_options[g_config.displaymode].resY;

			lpVP->SetViewport2(&d3dvp_new);

			SetD3DRect(rect[0], 0, displaymode_options[g_config.displaymode].resX, 0, g_currentviewport.y);
			SetD3DRect(rect[1], 0, displaymode_options[g_config.displaymode].resX, g_currentviewport.y+g_game.height, displaymode_options[g_config.displaymode].resY);
			SetD3DRect(rect[2], 0, g_currentviewport.x, 0, displaymode_options[g_config.displaymode].resY);
			SetD3DRect(rect[3], g_currentviewport.x+g_game.width, displaymode_options[g_config.displaymode].resX, 0, displaymode_options[g_config.displaymode].resY);

			lpVP->Clear2(4, (LPD3DRECT)&rect, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 0, 0);
			lpVP->SetViewport2(&d3dvp_old);
		}
	}

	return ret;
}