Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
October 2020
- 82 participants
- 799 discussions
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
v2: Supersede 194121 and 194123. Make wined3d_swapchain_state_register/unregister
private in wined3d.
v3: Supersede 194316.
dlls/dxgi/swapchain.c | 32 +++++++++--
dlls/dxgi/tests/dxgi.c | 1 -
dlls/dxgi/utils.c | 2 +-
dlls/wined3d/swapchain.c | 19 +++----
dlls/wined3d/wined3d.spec | 2 +-
dlls/wined3d/wined3d_main.c | 99 +++++++++++++++++-----------------
dlls/wined3d/wined3d_private.h | 5 +-
include/wine/wined3d.h | 4 +-
8 files changed, 95 insertions(+), 69 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index f3b74389d29..36beb84aa28 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -2272,18 +2272,37 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetFullscreenState(IDXGISwapCha
BOOL *fullscreen, IDXGIOutput **target)
{
struct d3d12_swapchain *swapchain = d3d12_swapchain_from_IDXGISwapChain4(iface);
+ BOOL windowed;
+ HRESULT hr;
TRACE("iface %p, fullscreen %p, target %p.\n", iface, fullscreen, target);
- if (fullscreen)
+ if (fullscreen || target)
{
wined3d_mutex_lock();
- *fullscreen = !wined3d_swapchain_state_is_windowed(swapchain->state);
+ windowed = wined3d_swapchain_state_is_windowed(swapchain->state);
wined3d_mutex_unlock();
}
- if (target && (*target = swapchain->target))
- IDXGIOutput_AddRef(*target);
+ if (fullscreen)
+ *fullscreen = !windowed;
+
+ if (target)
+ {
+ if (!windowed)
+ {
+ if (!swapchain->target && FAILED(hr = IDXGISwapChain4_GetContainingOutput(iface,
+ &swapchain->target)))
+ return hr;
+
+ *target = swapchain->target;
+ IDXGIOutput_AddRef(*target);
+ }
+ else
+ {
+ *target = NULL;
+ }
+ }
return S_OK;
}
@@ -2927,6 +2946,7 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
struct wined3d_swapchain_desc wined3d_desc;
VkWin32SurfaceCreateInfoKHR surface_desc;
VkPhysicalDevice vk_physical_device;
+ struct dxgi_factory *dxgi_factory;
VkFenceCreateInfo fence_desc;
uint32_t queue_family_index;
VkSurfaceKHR vk_surface;
@@ -3002,7 +3022,9 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
return hr;
}
- if (FAILED(hr = wined3d_swapchain_state_create(&wined3d_desc, window, &swapchain->state)))
+ dxgi_factory = unsafe_impl_from_IDXGIFactory((IDXGIFactory *)factory);
+ if (FAILED(hr = wined3d_swapchain_state_create(&wined3d_desc, window, dxgi_factory->wined3d,
+ &swapchain->state)))
{
IDXGIOutput_Release(output);
return hr;
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index f747e236f31..2838a025e57 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -6272,7 +6272,6 @@ static void test_window_association(IUnknown *device, BOOL is_d3d12)
output = NULL;
hr = IDXGISwapChain_GetFullscreenState(swapchain, &fullscreen, &output);
ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
- todo_wine_if(is_d3d12 && tests[i].todo_on_d3d12)
ok(fullscreen == tests[i].expect_fullscreen
|| broken(tests[i].broken_d3d10 && fullscreen),
"Test %u: Got unexpected fullscreen %#x.\n", i, fullscreen);
diff --git a/dlls/dxgi/utils.c b/dlls/dxgi/utils.c
index 665413e4c62..af72f83b6b0 100644
--- a/dlls/dxgi/utils.c
+++ b/dlls/dxgi/utils.c
@@ -520,7 +520,7 @@ unsigned int wined3d_bind_flags_from_dxgi_usage(DXGI_USAGE dxgi_usage)
#define DXGI_WINED3D_SWAPCHAIN_FLAGS \
(WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE | WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT \
- | WINED3D_SWAPCHAIN_HOOK | WINED3D_SWAPCHAIN_RESTORE_WINDOW_STATE)
+ | WINED3D_SWAPCHAIN_REGISTER_STATE | WINED3D_SWAPCHAIN_RESTORE_WINDOW_STATE)
unsigned int dxgi_swapchain_flags_from_wined3d(unsigned int wined3d_flags)
{
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index d0d93417a18..b35fb5af65a 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -34,7 +34,7 @@ void wined3d_swapchain_cleanup(struct wined3d_swapchain *swapchain)
TRACE("Destroying swapchain %p.\n", swapchain);
- wined3d_unhook_swapchain(swapchain);
+ wined3d_swapchain_state_unregister(&swapchain->state);
wined3d_swapchain_set_gamma_ramp(swapchain, 0, &swapchain->orig_gamma);
/* Release the swapchain's draw buffers. Make sure swapchain->back_buffers[0]
@@ -1288,7 +1288,7 @@ static enum wined3d_format_id adapter_format_from_backbuffer_format(const struct
}
static HRESULT wined3d_swapchain_state_init(struct wined3d_swapchain_state *state,
- const struct wined3d_swapchain_desc *desc, HWND window)
+ const struct wined3d_swapchain_desc *desc, HWND window, struct wined3d *wined3d)
{
HRESULT hr;
@@ -1320,6 +1320,9 @@ static HRESULT wined3d_swapchain_state_init(struct wined3d_swapchain_state *stat
GetWindowRect(window, &state->original_window_rect);
state->device_window = window;
+ if (desc->flags & WINED3D_SWAPCHAIN_REGISTER_STATE)
+ wined3d_swapchain_state_register(state, wined3d);
+
return hr;
}
@@ -1350,7 +1353,7 @@ static HRESULT wined3d_swapchain_init(struct wined3d_swapchain *swapchain, struc
FIXME("Unimplemented swap effect %#x.\n", desc->swap_effect);
window = desc->device_window ? desc->device_window : device->create_parms.focus_window;
- if (FAILED(hr = wined3d_swapchain_state_init(&swapchain->state, desc, window)))
+ if (FAILED(hr = wined3d_swapchain_state_init(&swapchain->state, desc, window, device->wined3d)))
{
ERR("Failed to initialise swapchain state, hr %#x.\n", hr);
goto err;
@@ -1627,9 +1630,6 @@ HRESULT CDECL wined3d_swapchain_create(struct wined3d_device *device, struct win
desc, parent, parent_ops, &object)))
return hr;
- if (desc->flags & WINED3D_SWAPCHAIN_HOOK)
- wined3d_hook_swapchain(object);
-
if (desc->flags & WINED3D_SWAPCHAIN_IMPLICIT)
{
wined3d_mutex_lock();
@@ -2275,21 +2275,22 @@ BOOL CDECL wined3d_swapchain_state_is_windowed(const struct wined3d_swapchain_st
void CDECL wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state)
{
+ wined3d_swapchain_state_unregister(state);
heap_free(state);
}
HRESULT CDECL wined3d_swapchain_state_create(const struct wined3d_swapchain_desc *desc,
- HWND window, struct wined3d_swapchain_state **state)
+ HWND window, struct wined3d *wined3d, struct wined3d_swapchain_state **state)
{
struct wined3d_swapchain_state *s;
HRESULT hr;
- TRACE("desc %p, window %p, state %p.\n", desc, window, state);
+ TRACE("desc %p, window %p, wined3d %p, state %p.\n", desc, window, wined3d, state);
if (!(s = heap_alloc_zero(sizeof(*s))))
return E_OUTOFMEMORY;
- if (FAILED(hr = wined3d_swapchain_state_init(s, desc, window)))
+ if (FAILED(hr = wined3d_swapchain_state_init(s, desc, window, wined3d)))
{
heap_free(s);
return hr;
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index d11e06d0c34..77b22b3c907 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -289,7 +289,7 @@
@ cdecl wined3d_swapchain_set_palette(ptr ptr)
@ cdecl wined3d_swapchain_set_window(ptr ptr)
-@ cdecl wined3d_swapchain_state_create(ptr ptr ptr)
+@ cdecl wined3d_swapchain_state_create(ptr ptr ptr ptr)
@ cdecl wined3d_swapchain_state_destroy(ptr)
@ cdecl wined3d_swapchain_state_is_windowed(ptr)
@ cdecl wined3d_swapchain_state_resize_target(ptr ptr)
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index c98aee18bdd..001b7dd1255 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -56,25 +56,26 @@ struct wined3d_window_hook
unsigned int count;
};
-struct wined3d_hooked_swapchain
+struct wined3d_registered_swapchain_state
{
- struct wined3d_swapchain *swapchain;
+ struct wined3d_swapchain_state *state;
+ struct wined3d *wined3d;
DWORD thread_id;
};
-struct wined3d_hook_table
+struct wined3d_swapchain_state_table
{
struct wined3d_window_hook *hooks;
SIZE_T hooks_size;
SIZE_T hook_count;
- struct wined3d_hooked_swapchain *swapchains;
- SIZE_T swapchains_size;
- SIZE_T swapchain_count;
+ struct wined3d_registered_swapchain_state *states;
+ SIZE_T states_size;
+ SIZE_T state_count;
};
static struct wined3d_wndproc_table wndproc_table;
-static struct wined3d_hook_table hook_table;
+static struct wined3d_swapchain_state_table swapchain_state_table;
static CRITICAL_SECTION wined3d_cs;
static CRITICAL_SECTION_DEBUG wined3d_cs_debug =
@@ -425,13 +426,13 @@ static BOOL wined3d_dll_destroy(HINSTANCE hInstDLL)
}
heap_free(wndproc_table.entries);
- heap_free(hook_table.swapchains);
- for (i = 0; i < hook_table.hook_count; ++i)
+ heap_free(swapchain_state_table.states);
+ for (i = 0; i < swapchain_state_table.hook_count; ++i)
{
- WARN("Leftover hook table entry %p.\n", &hook_table.hooks[i]);
- UnhookWindowsHookEx(hook_table.hooks[i].hook);
+ WARN("Leftover swapchain state hook %p.\n", &swapchain_state_table.hooks[i]);
+ UnhookWindowsHookEx(swapchain_state_table.hooks[i].hook);
}
- heap_free(hook_table.hooks);
+ heap_free(swapchain_state_table.hooks);
heap_free(wined3d_settings.logo);
UnregisterClassA(WINED3D_OPENGL_WINDOW_CLASS_NAME, hInstDLL);
@@ -573,8 +574,8 @@ static LRESULT CALLBACK wined3d_wndproc(HWND window, UINT message, WPARAM wparam
static LRESULT CALLBACK wined3d_hook_proc(int code, WPARAM wparam, LPARAM lparam)
{
+ struct wined3d_registered_swapchain_state *registered_state;
struct wined3d_swapchain_desc swapchain_desc;
- struct wined3d_swapchain *swapchain;
struct wined3d_wndproc *entry;
struct wined3d_output *output;
MSG *msg = (MSG *)lparam;
@@ -586,28 +587,28 @@ static LRESULT CALLBACK wined3d_hook_proc(int code, WPARAM wparam, LPARAM lparam
{
wined3d_wndproc_mutex_lock();
- for (i = 0; i < hook_table.swapchain_count; ++i)
+ for (i = 0; i < swapchain_state_table.state_count; ++i)
{
- swapchain = hook_table.swapchains[i].swapchain;
+ registered_state = &swapchain_state_table.states[i];
- if (swapchain->state.device_window != msg->hwnd)
+ if (registered_state->state->device_window != msg->hwnd)
continue;
- if ((entry = wined3d_find_wndproc(msg->hwnd, swapchain->device->wined3d))
+ if ((entry = wined3d_find_wndproc(msg->hwnd, registered_state->wined3d))
&& (entry->flags & (WINED3D_REGISTER_WINDOW_NO_WINDOW_CHANGES
| WINED3D_REGISTER_WINDOW_NO_ALT_ENTER)))
continue;
- wined3d_swapchain_get_desc(swapchain, &swapchain_desc);
+ swapchain_desc = registered_state->state->desc;
swapchain_desc.windowed = !swapchain_desc.windowed;
- if (!(output = wined3d_get_output_from_window(swapchain->device->wined3d,
- swapchain->state.device_window)))
+ if (!(output = wined3d_get_output_from_window(registered_state->wined3d,
+ registered_state->state->device_window)))
{
- ERR("Failed to get output from window %p.\n", swapchain->state.device_window);
+ ERR("Failed to get output from window %p.\n", registered_state->state->device_window);
break;
}
swapchain_desc.output = output;
- wined3d_swapchain_state_set_fullscreen(&swapchain->state, &swapchain_desc, NULL);
+ wined3d_swapchain_state_set_fullscreen(registered_state->state, &swapchain_desc, NULL);
wined3d_wndproc_mutex_unlock();
@@ -764,82 +765,84 @@ static struct wined3d_window_hook *wined3d_find_hook(DWORD thread_id)
{
unsigned int i;
- for (i = 0; i < hook_table.hook_count; ++i)
+ for (i = 0; i < swapchain_state_table.hook_count; ++i)
{
- if (hook_table.hooks[i].thread_id == thread_id)
- return &hook_table.hooks[i];
+ if (swapchain_state_table.hooks[i].thread_id == thread_id)
+ return &swapchain_state_table.hooks[i];
}
return NULL;
}
-void wined3d_hook_swapchain(struct wined3d_swapchain *swapchain)
+void wined3d_swapchain_state_register(struct wined3d_swapchain_state *state,
+ struct wined3d *wined3d)
{
- struct wined3d_hooked_swapchain *swapchain_entry;
+ struct wined3d_registered_swapchain_state *state_entry;
struct wined3d_window_hook *hook;
wined3d_wndproc_mutex_lock();
- if (!wined3d_array_reserve((void **)&hook_table.swapchains, &hook_table.swapchains_size,
- hook_table.swapchain_count + 1, sizeof(*swapchain_entry)))
+ if (!wined3d_array_reserve((void **)&swapchain_state_table.states, &swapchain_state_table.states_size,
+ swapchain_state_table.state_count + 1, sizeof(*state_entry)))
{
wined3d_wndproc_mutex_unlock();
return;
}
- swapchain_entry = &hook_table.swapchains[hook_table.swapchain_count++];
- swapchain_entry->swapchain = swapchain;
- swapchain_entry->thread_id = GetWindowThreadProcessId(swapchain->state.device_window, NULL);
+ state_entry = &swapchain_state_table.states[swapchain_state_table.state_count++];
+ state_entry->state = state;
+ state_entry->wined3d = wined3d;
+ state_entry->thread_id = GetWindowThreadProcessId(state->device_window, NULL);
- if ((hook = wined3d_find_hook(swapchain_entry->thread_id)))
+ if ((hook = wined3d_find_hook(state_entry->thread_id)))
{
++hook->count;
wined3d_wndproc_mutex_unlock();
return;
}
- if (!wined3d_array_reserve((void **)&hook_table.hooks, &hook_table.hooks_size,
- hook_table.hook_count + 1, sizeof(*hook)))
+ if (!wined3d_array_reserve((void **)&swapchain_state_table.hooks, &swapchain_state_table.hooks_size,
+ swapchain_state_table.hook_count + 1, sizeof(*hook)))
{
- --hook_table.swapchain_count;
+ --swapchain_state_table.state_count;
wined3d_wndproc_mutex_unlock();
return;
}
- hook = &hook_table.hooks[hook_table.hook_count++];
- hook->thread_id = swapchain_entry->thread_id;
+ hook = &swapchain_state_table.hooks[swapchain_state_table.hook_count++];
+ hook->thread_id = state_entry->thread_id;
hook->hook = SetWindowsHookExW(WH_GETMESSAGE, wined3d_hook_proc, 0, hook->thread_id);
hook->count = 1;
wined3d_wndproc_mutex_unlock();
}
-void wined3d_unhook_swapchain(struct wined3d_swapchain *swapchain)
+void wined3d_swapchain_state_unregister(struct wined3d_swapchain_state *state)
{
- struct wined3d_hooked_swapchain *swapchain_entry, *last_swapchain_entry;
+ struct wined3d_registered_swapchain_state *state_entry, *last_state_entry;
struct wined3d_window_hook *hook, *last_hook;
unsigned int i;
wined3d_wndproc_mutex_lock();
- for (i = 0; i < hook_table.swapchain_count; ++i)
+ for (i = 0; i < swapchain_state_table.state_count; ++i)
{
- swapchain_entry = &hook_table.swapchains[i];
+ state_entry = &swapchain_state_table.states[i];
- if (swapchain_entry->swapchain != swapchain)
+ if (state_entry->state != state)
continue;
- if ((hook = wined3d_find_hook(swapchain_entry->thread_id)) && !--hook->count)
+ if ((hook = wined3d_find_hook(state_entry->thread_id)) && !--hook->count)
{
UnhookWindowsHookEx(hook->hook);
- last_hook = &hook_table.hooks[--hook_table.hook_count];
+ last_hook = &swapchain_state_table.hooks[--swapchain_state_table.hook_count];
if (hook != last_hook)
*hook = *last_hook;
}
- last_swapchain_entry = &hook_table.swapchains[--hook_table.swapchain_count];
- if (swapchain_entry != last_swapchain_entry)
- *swapchain_entry = *last_swapchain_entry;
+ last_state_entry = &swapchain_state_table.states[--swapchain_state_table.state_count];
+ if (state_entry != last_state_entry)
+ *state_entry = *last_state_entry;
break;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d932f60fa95..bbb0a60d7bb 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3522,9 +3522,7 @@ struct wined3d
};
BOOL wined3d_filter_messages(HWND window, BOOL filter) DECLSPEC_HIDDEN;
-void wined3d_hook_swapchain(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
HRESULT wined3d_init(struct wined3d *wined3d, DWORD flags) DECLSPEC_HIDDEN;
-void wined3d_unhook_swapchain(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
void wined3d_unregister_window(HWND window) DECLSPEC_HIDDEN;
BOOL wined3d_get_app_name(char *app_name, unsigned int app_name_size) DECLSPEC_HIDDEN;
@@ -5082,10 +5080,13 @@ struct wined3d_swapchain_state
HWND device_window;
};
+void wined3d_swapchain_state_register(struct wined3d_swapchain_state *state,
+ struct wined3d *wined3d) DECLSPEC_HIDDEN;
void wined3d_swapchain_state_restore_from_fullscreen(struct wined3d_swapchain_state *state,
HWND window, const RECT *window_rect) DECLSPEC_HIDDEN;
HRESULT wined3d_swapchain_state_setup_fullscreen(struct wined3d_swapchain_state *state,
HWND window, int x, int y, int width, int height) DECLSPEC_HIDDEN;
+void wined3d_swapchain_state_unregister(struct wined3d_swapchain_state *state) DECLSPEC_HIDDEN;
struct wined3d_swapchain_ops
{
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 238961006a0..61ab0e90953 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -904,7 +904,7 @@ enum wined3d_shader_type
#define WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT 0x00004000u
#define WINED3D_SWAPCHAIN_GDI_COMPATIBLE 0x00008000u
#define WINED3D_SWAPCHAIN_IMPLICIT 0x00010000u
-#define WINED3D_SWAPCHAIN_HOOK 0x00020000u
+#define WINED3D_SWAPCHAIN_REGISTER_STATE 0x00020000u
#define WINED3D_SWAPCHAIN_NO_WINDOW_CHANGES 0x00040000u
#define WINED3D_SWAPCHAIN_RESTORE_WINDOW_STATE 0x00080000u
@@ -2804,7 +2804,7 @@ void __cdecl wined3d_swapchain_set_palette(struct wined3d_swapchain *swapchain,
void __cdecl wined3d_swapchain_set_window(struct wined3d_swapchain *swapchain, HWND window);
HRESULT __cdecl wined3d_swapchain_state_create(const struct wined3d_swapchain_desc *desc,
- HWND window, struct wined3d_swapchain_state **state);
+ HWND window, struct wined3d *wined3d, struct wined3d_swapchain_state **state);
void __cdecl wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state);
BOOL __cdecl wined3d_swapchain_state_is_windowed(const struct wined3d_swapchain_state *state);
HRESULT __cdecl wined3d_swapchain_state_resize_target(struct wined3d_swapchain_state *state,
--
2.25.1
2
1
[PATCH vkd3d v2 1/3] vkd3d-shader: Pass the output pointer to vkd3d_shader_message_context_copy_messages().
by Zebediah Figura 09 Oct '20
by Zebediah Figura 09 Oct '20
09 Oct '20
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/dxbc.c | 4 ++--
libs/vkd3d-shader/vkd3d_shader_main.c | 20 +++++++++++++-------
libs/vkd3d-shader/vkd3d_shader_private.h | 3 ++-
3 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index 93e7eaf5..3ddca1e9 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -2786,7 +2786,7 @@ int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc,
ret = parse_dxbc(dxbc->code, dxbc->size, &message_context, rts0_handler, root_signature);
vkd3d_shader_message_context_trace_messages(&message_context);
- if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context)))
+ if (!vkd3d_shader_message_context_copy_messages(&message_context, messages))
ret = VKD3D_ERROR_OUT_OF_MEMORY;
vkd3d_shader_message_context_cleanup(&message_context);
@@ -3390,7 +3390,7 @@ int vkd3d_shader_serialize_root_signature(const struct vkd3d_shader_versioned_ro
done:
vkd3d_shader_message_context_trace_messages(&context.message_context);
- if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&context.message_context)))
+ if (!vkd3d_shader_message_context_copy_messages(&context.message_context, messages))
ret = VKD3D_ERROR_OUT_OF_MEMORY;
vkd3d_shader_message_context_cleanup(&context.message_context);
return ret;
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index c2fe2c8e..d3d86ed7 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -140,14 +140,20 @@ void vkd3d_shader_message_context_trace_messages_(const struct vkd3d_shader_mess
vkd3d_string_buffer_trace_(&context->messages, function);
}
-char *vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context)
+bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context, char **out)
{
char *messages;
- if ((messages = vkd3d_malloc(context->messages.content_size + 1)))
- memcpy(messages, context->messages.buffer, context->messages.content_size + 1);
+ if (!out)
+ return true;
- return messages;
+ *out = NULL;
+
+ if (!(messages = vkd3d_malloc(context->messages.content_size + 1)))
+ return false;
+ memcpy(messages, context->messages.buffer, context->messages.content_size + 1);
+ *out = messages;
+ return true;
}
void vkd3d_shader_verror(struct vkd3d_shader_message_context *context,
@@ -842,7 +848,7 @@ int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char
ret = scan_dxbc(compile_info, &message_context);
vkd3d_shader_message_context_trace_messages(&message_context);
- if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context)))
+ if (!vkd3d_shader_message_context_copy_messages(&message_context, messages))
ret = VKD3D_ERROR_OUT_OF_MEMORY;
vkd3d_shader_message_context_cleanup(&message_context);
return ret;
@@ -956,7 +962,7 @@ int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info,
}
vkd3d_shader_message_context_trace_messages(&message_context);
- if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context)))
+ if (!vkd3d_shader_message_context_copy_messages(&message_context, messages))
ret = VKD3D_ERROR_OUT_OF_MEMORY;
vkd3d_shader_message_context_cleanup(&message_context);
return ret;
@@ -1046,7 +1052,7 @@ int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
ret = shader_parse_input_signature(dxbc->code, dxbc->size, &message_context, signature);
vkd3d_shader_message_context_trace_messages(&message_context);
- if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context)))
+ if (!vkd3d_shader_message_context_copy_messages(&message_context, messages))
ret = VKD3D_ERROR_OUT_OF_MEMORY;
vkd3d_shader_message_context_cleanup(&message_context);
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index f88ea69a..98b5fbc4 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -848,7 +848,8 @@ struct vkd3d_shader_message_context
};
void vkd3d_shader_message_context_cleanup(struct vkd3d_shader_message_context *context) DECLSPEC_HIDDEN;
-char *vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context) DECLSPEC_HIDDEN;
+bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context,
+ char **out) DECLSPEC_HIDDEN;
bool vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context,
enum vkd3d_shader_log_level log_level, const char *source_name) DECLSPEC_HIDDEN;
void vkd3d_shader_message_context_trace_messages_(const struct vkd3d_shader_message_context *context,
--
2.28.0
2
5
[PATCH 1/3] ntdll: Support AVX registers for other thread in Nt{Get|Set}ContextThread().
by Paul Gofman 09 Oct '20
by Paul Gofman 09 Oct '20
09 Oct '20
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
dlls/ntdll/unix/server.c | 7 +++++
dlls/ntdll/unix/signal_i386.c | 31 +++++++++++-------
dlls/ntdll/unix/signal_x86_64.c | 35 ++++++++++++++-------
dlls/ntdll/unix/thread.c | 36 ++++++++++++++++++---
dlls/ntdll/unix/unix_private.h | 56 ++++++++++++++++++++++++++++-----
include/wine/server_protocol.h | 5 +++
server/protocol.def | 5 +++
server/thread.c | 1 +
server/trace.c | 6 ++++
9 files changed, 148 insertions(+), 34 deletions(-)
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
index 81a903ca77a..7236f0acb83 100644
--- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -631,8 +631,15 @@ unsigned int server_select( const select_op_t *select_op, data_size_t size, UINT
if (wine_server_reply_size( reply ))
{
DWORD context_flags = context->ContextFlags; /* unchanged registers are still available */
+ XSTATE *xs = xstate_from_context( context );
+ ULONG64 mask;
+
+ if (xs)
+ mask = xs->Mask;
context_from_server( context, &server_context );
context->ContextFlags |= context_flags;
+ if (xs)
+ xs->Mask |= mask;
}
}
SERVER_END_REQ;
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
index e0ba27d3e94..4d8eeb2072c 100644
--- a/dlls/ntdll/unix/signal_i386.c
+++ b/dlls/ntdll/unix/signal_i386.c
@@ -886,14 +886,16 @@ static inline void save_context( struct xcontext *xcontext, const ucontext_t *si
}
if (fpux)
{
+ XSTATE *xs;
+
context->ContextFlags |= CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS;
memcpy( context->ExtendedRegisters, fpux, sizeof(*fpux) );
if (!fpu) fpux_to_fpu( &context->FloatSave, fpux );
- xcontext->xstate = XState_sig(fpux);
- }
- else
- {
- xcontext->xstate = NULL;
+ if ((xs = XState_sig(fpux)))
+ {
+ context_init_xstate( context, xs );
+ xcontext->host_compaction_mask = xs->CompactionMask;
+ }
}
if (!fpu && !fpux) save_fpu( context );
}
@@ -944,6 +946,7 @@ static inline void restore_context( const struct xcontext *xcontext, ucontext_t
{
memcpy( &dst_xs->YmmContext, &src_xs->YmmContext, sizeof(dst_xs->YmmContext) );
dst_xs->Mask |= src_xs->Mask;
+ dst_xs->CompactionMask = xcontext->host_compaction_mask;
}
}
if (!fpu && !fpux) restore_fpu( context );
@@ -1023,6 +1026,7 @@ static unsigned int get_server_context_flags( DWORD flags )
if (flags & CONTEXT_FLOATING_POINT) ret |= SERVER_CTX_FLOATING_POINT;
if (flags & CONTEXT_DEBUG_REGISTERS) ret |= SERVER_CTX_DEBUG_REGISTERS;
if (flags & CONTEXT_EXTENDED_REGISTERS) ret |= SERVER_CTX_EXTENDED_REGISTERS;
+ if (flags & CONTEXT_XSTATE) ret |= SERVER_CTX_YMM_REGISTERS;
return ret;
}
@@ -1095,6 +1099,7 @@ NTSTATUS context_to_server( context_t *to, const CONTEXT *from )
to->flags |= SERVER_CTX_EXTENDED_REGISTERS;
memcpy( to->ext.i386_regs, from->ExtendedRegisters, sizeof(to->ext.i386_regs) );
}
+ xstate_to_server( to, xstate_from_context( from ) );
return STATUS_SUCCESS;
}
@@ -1108,7 +1113,7 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
{
if (from->cpu != CPU_x86) return STATUS_INVALID_PARAMETER;
- to->ContextFlags = CONTEXT_i386;
+ to->ContextFlags = CONTEXT_i386 | (to->ContextFlags & 0x40);
if (from->flags & SERVER_CTX_CONTROL)
{
to->ContextFlags |= CONTEXT_CONTROL;
@@ -1165,6 +1170,7 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
to->ContextFlags |= CONTEXT_EXTENDED_REGISTERS;
memcpy( to->ExtendedRegisters, from->ext.i386_regs, sizeof(to->ExtendedRegisters) );
}
+ xstate_from_server( xstate_from_context( to ), from );
return STATUS_SUCCESS;
}
@@ -1246,7 +1252,7 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
/* Save xstate before any calls which can potentially change volatile ymm registers.
* E. g., debug output will clobber ymm registers. */
- xsave_status = self ? save_xstate( context ) : STATUS_SUCCESS; /* FIXME: other thread. */
+ xsave_status = self ? save_xstate( context ) : STATUS_SUCCESS;
/* debug registers require a server call */
if (needed_flags & CONTEXT_DEBUG_REGISTERS) self = FALSE;
@@ -1293,7 +1299,6 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
}
if (needed_flags & CONTEXT_FLOATING_POINT) save_fpu( context );
if (needed_flags & CONTEXT_EXTENDED_REGISTERS) save_fpux( context );
- /* FIXME: xstate */
/* update the cached version of the debug registers */
if (context->ContextFlags & (CONTEXT_DEBUG_REGISTERS & ~CONTEXT_i386))
{
@@ -1579,6 +1584,7 @@ static void setup_raise_exception( ucontext_t *sigcontext, void *stack_ptr,
{
CONTEXT *context = &xcontext->c;
size_t stack_size;
+ XSTATE *src_xs;
struct stack_layout
{
@@ -1606,7 +1612,7 @@ C_ASSERT( (offsetof(struct stack_layout, xstate) == sizeof(struct stack_layout))
if (rec->ExceptionCode == EXCEPTION_BREAKPOINT) context->Eip--;
stack_size = sizeof(*stack);
- if (xcontext->xstate)
+ if ((src_xs = xstate_from_context( context )))
{
stack_size += (ULONG_PTR)stack_ptr - (((ULONG_PTR)stack_ptr
- sizeof(XSTATE)) & ~(ULONG_PTR)63);
@@ -1616,17 +1622,18 @@ C_ASSERT( (offsetof(struct stack_layout, xstate) == sizeof(struct stack_layout))
stack->rec = *rec;
stack->context = *context;
- if (xcontext->xstate)
+ if (src_xs)
{
XSTATE *dst_xs = (XSTATE *)stack->xstate;
assert(!((ULONG_PTR)dst_xs & 63));
context_init_xstate( &stack->context, stack->xstate );
+ memset( dst_xs, 0, offsetof(XSTATE, YmmContext) );
dst_xs->CompactionMask = user_shared_data->XState.CompactionEnabled ? 0x8000000000000004 : 0;
- if (xcontext->xstate->Mask & 4)
+ if (src_xs->Mask & 4)
{
dst_xs->Mask = 4;
- memcpy( &dst_xs->YmmContext, &xcontext->xstate->YmmContext, sizeof(dst_xs->YmmContext) );
+ memcpy( &dst_xs->YmmContext, &src_xs->YmmContext, sizeof(dst_xs->YmmContext) );
}
}
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index e11b2c70b59..030f8cc6feb 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -1461,14 +1461,19 @@ static void save_context( struct xcontext *xcontext, const ucontext_t *sigcontex
context->Dr7 = amd64_thread_data()->dr7;
if (FPU_sig(sigcontext))
{
+ XSTATE *xs;
+
context->ContextFlags |= CONTEXT_FLOATING_POINT;
context->u.FltSave = *FPU_sig(sigcontext);
context->MxCsr = context->u.FltSave.MxCsr;
- xcontext->xstate = XState_sig(FPU_sig(sigcontext));
- }
- else
- {
- xcontext->xstate = NULL;
+ if ((xs = XState_sig(FPU_sig(sigcontext))))
+ {
+ /* xcontext and sigcontext are both on the signal stack, so we can
+ * just reference sigcontext without overflowing 32 bit XState.Offset */
+ context_init_xstate( context, xs );
+ assert( xcontext->c_ex.XState.Offset == (BYTE *)xs - (BYTE *)&xcontext->c_ex );
+ xcontext->host_compaction_mask = xs->CompactionMask;
+ }
}
}
@@ -1531,6 +1536,7 @@ static inline NTSTATUS save_xstate( CONTEXT *context )
static void restore_context( const struct xcontext *xcontext, ucontext_t *sigcontext )
{
const CONTEXT *context = &xcontext->c;
+ XSTATE *xs;
amd64_thread_data()->dr0 = context->Dr0;
amd64_thread_data()->dr1 = context->Dr1;
@@ -1540,6 +1546,8 @@ static void restore_context( const struct xcontext *xcontext, ucontext_t *sigcon
amd64_thread_data()->dr7 = context->Dr7;
set_sigcontext( context, sigcontext );
if (FPU_sig(sigcontext)) *FPU_sig(sigcontext) = context->u.FltSave;
+ if ((xs = XState_sig(FPU_sig(sigcontext))))
+ xs->CompactionMask = xcontext->host_compaction_mask;
}
@@ -1628,6 +1636,7 @@ static unsigned int get_server_context_flags( DWORD flags )
if (flags & CONTEXT_SEGMENTS) ret |= SERVER_CTX_SEGMENTS;
if (flags & CONTEXT_FLOATING_POINT) ret |= SERVER_CTX_FLOATING_POINT;
if (flags & CONTEXT_DEBUG_REGISTERS) ret |= SERVER_CTX_DEBUG_REGISTERS;
+ if (flags & CONTEXT_XSTATE) ret |= SERVER_CTX_YMM_REGISTERS;
return ret;
}
@@ -1695,6 +1704,7 @@ NTSTATUS context_to_server( context_t *to, const CONTEXT *from )
to->debug.x86_64_regs.dr6 = from->Dr6;
to->debug.x86_64_regs.dr7 = from->Dr7;
}
+ xstate_to_server( to, xstate_from_context( from ) );
return STATUS_SUCCESS;
}
@@ -1708,7 +1718,7 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
{
if (from->cpu != CPU_x86_64) return STATUS_INVALID_PARAMETER;
- to->ContextFlags = CONTEXT_AMD64;
+ to->ContextFlags = CONTEXT_AMD64 | (to->ContextFlags & 0x40);
if (from->flags & SERVER_CTX_CONTROL)
{
to->ContextFlags |= CONTEXT_CONTROL;
@@ -1762,6 +1772,7 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
to->Dr6 = from->debug.x86_64_regs.dr6;
to->Dr7 = from->debug.x86_64_regs.dr7;
}
+ xstate_from_server( xstate_from_context( to ), from );
return STATUS_SUCCESS;
}
@@ -1831,7 +1842,7 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
/* Save xstate before any calls which can potentially change volatile ymm registers.
* E. g., debug output will clobber ymm registers. */
- xsave_status = self ? save_xstate( context ) : STATUS_SUCCESS; /* FIXME: other thread. */
+ xsave_status = self ? save_xstate( context ) : STATUS_SUCCESS;
needed_flags = context->ContextFlags & ~CONTEXT_AMD64;
@@ -1924,6 +1935,7 @@ static void setup_raise_exception( ucontext_t *sigcontext, EXCEPTION_RECORD *rec
struct stack_layout *stack;
size_t stack_size;
NTSTATUS status;
+ XSTATE *src_xs;
if (rec->ExceptionCode == EXCEPTION_SINGLE_STEP)
{
@@ -1953,7 +1965,7 @@ static void setup_raise_exception( ucontext_t *sigcontext, EXCEPTION_RECORD *rec
if (rec->ExceptionCode == EXCEPTION_BREAKPOINT) context->Rip--;
stack_size = sizeof(*stack);
- if (xcontext->xstate)
+ if ((src_xs = xstate_from_context( context )))
{
stack_size += (ULONG_PTR)stack_ptr - (((ULONG_PTR)stack_ptr
- sizeof(XSTATE)) & ~(ULONG_PTR)63);
@@ -1962,17 +1974,18 @@ static void setup_raise_exception( ucontext_t *sigcontext, EXCEPTION_RECORD *rec
stack = virtual_setup_exception( stack_ptr, stack_size, rec );
stack->rec = *rec;
stack->context = *context;
- if (xcontext->xstate)
+ if (src_xs)
{
XSTATE *dst_xs = (XSTATE *)stack->xstate;
assert( !((ULONG_PTR)dst_xs & 63) );
context_init_xstate( &stack->context, stack->xstate );
+ memset( dst_xs, 0, offsetof(XSTATE, YmmContext) );
dst_xs->CompactionMask = user_shared_data->XState.CompactionEnabled ? 0x8000000000000004 : 0;
- if (xcontext->xstate->Mask & 4)
+ if (src_xs->Mask & 4)
{
dst_xs->Mask = 4;
- memcpy( &dst_xs->YmmContext, &xcontext->xstate->YmmContext, sizeof(dst_xs->YmmContext) );
+ memcpy( &dst_xs->YmmContext, &src_xs->YmmContext, sizeof(dst_xs->YmmContext) );
}
}
diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
index ded4b33eb01..a161c5d1c90 100644
--- a/dlls/ntdll/unix/thread.c
+++ b/dlls/ntdll/unix/thread.c
@@ -344,7 +344,6 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL first_c
DWORD i;
obj_handle_t handle = 0;
client_ptr_t params[EXCEPTION_MAXIMUM_PARAMETERS];
- CONTEXT exception_context = *context;
select_op_t select_op;
sigset_t old_set;
@@ -370,10 +369,22 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL first_c
if (handle)
{
+ struct xcontext exception_context;
+ DECLSPEC_ALIGN(64) XSTATE xs;
+ XSTATE *src_xs;
+
select_op.wait.op = SELECT_WAIT;
select_op.wait.handles[0] = handle;
+
+ exception_context.c = *context;
+ if ((src_xs = xstate_from_context( context )))
+ {
+ context_init_xstate( &exception_context.c, &xs );
+ memcpy( &xs, src_xs, sizeof(xs) );
+ }
+
server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), SELECT_INTERRUPTIBLE,
- TIMEOUT_INFINITE, &exception_context, NULL, NULL );
+ TIMEOUT_INFINITE, &exception_context.c, NULL, NULL );
SERVER_START_REQ( get_exception_status )
{
@@ -381,7 +392,12 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL first_c
ret = wine_server_call( req );
}
SERVER_END_REQ;
- if (ret >= 0) *context = exception_context;
+ if (ret >= 0)
+ {
+ *context = exception_context.c;
+ if (src_xs)
+ memcpy( src_xs, &xs, sizeof(xs) );
+ }
}
pthread_sigmask( SIG_SETMASK, &old_set, NULL );
@@ -632,7 +648,7 @@ static NTSTATUS wow64_context_from_server( WOW64_CONTEXT *to, const context_t *f
{
if (from->cpu != CPU_x86) return STATUS_INVALID_PARAMETER;
- to->ContextFlags = WOW64_CONTEXT_i386;
+ to->ContextFlags = WOW64_CONTEXT_i386 | (to->ContextFlags & 0x40);
if (from->flags & SERVER_CTX_CONTROL)
{
to->ContextFlags |= WOW64_CONTEXT_CONTROL;
@@ -689,6 +705,12 @@ static NTSTATUS wow64_context_from_server( WOW64_CONTEXT *to, const context_t *f
to->ContextFlags |= WOW64_CONTEXT_EXTENDED_REGISTERS;
memcpy( to->ExtendedRegisters, from->ext.i386_regs, sizeof(to->ExtendedRegisters) );
}
+ if ((to->ContextFlags & WOW64_CONTEXT_XSTATE) == WOW64_CONTEXT_XSTATE)
+ {
+ CONTEXT_EX *c_ex = (CONTEXT_EX *)(to + 1);
+
+ xstate_from_server( (XSTATE *)((BYTE *)c_ex + c_ex->XState.Offset), from );
+ }
return STATUS_SUCCESS;
}
@@ -758,6 +780,12 @@ static void wow64_context_to_server( context_t *to, const WOW64_CONTEXT *from )
to->flags |= SERVER_CTX_EXTENDED_REGISTERS;
memcpy( to->ext.i386_regs, from->ExtendedRegisters, sizeof(to->ext.i386_regs) );
}
+ if (flags & WOW64_CONTEXT_XSTATE)
+ {
+ CONTEXT_EX *c_ex = (CONTEXT_EX *)(from + 1);
+
+ xstate_to_server( to, (XSTATE *)((BYTE *)c_ex + c_ex->XState.Offset) );
+ }
}
#endif /* __x86_64__ */
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index f99c13fe2ad..c3ad0a41098 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -288,13 +288,14 @@ static inline void mutex_unlock( pthread_mutex_t *mutex )
static inline TEB64 *NtCurrentTeb64(void) { return (TEB64 *)NtCurrentTeb()->GdiBatchCount; }
#endif
-#if defined(__i386__) || defined(__x86_64__)
struct xcontext
{
CONTEXT c;
- XSTATE *xstate; /* points to xstate in sigcontext */
+ CONTEXT_EX c_ex;
+ ULONG64 host_compaction_mask;
};
+#if defined(__i386__) || defined(__x86_64__)
static inline XSTATE *xstate_from_context( const CONTEXT *context )
{
CONTEXT_EX *xctx = (CONTEXT_EX *)(context + 1);
@@ -308,21 +309,62 @@ static inline XSTATE *xstate_from_context( const CONTEXT *context )
static inline void context_init_xstate( CONTEXT *context, void *xstate_buffer )
{
CONTEXT_EX *xctx;
- XSTATE *xs;
xctx = (CONTEXT_EX *)(context + 1);
xctx->Legacy.Length = sizeof(CONTEXT);
xctx->Legacy.Offset = -(LONG)sizeof(CONTEXT);
xctx->XState.Length = sizeof(XSTATE);
- xctx->XState.Offset = xstate_buffer ? (((ULONG_PTR)xstate_buffer + 63) & ~63) - (ULONG_PTR)xctx
- : (((ULONG_PTR)context + sizeof(CONTEXT) + sizeof(CONTEXT_EX) + 63) & ~63) - (ULONG_PTR)xctx;
+ xctx->XState.Offset = (BYTE *)xstate_buffer - (BYTE *)xctx;
+
xctx->All.Length = sizeof(CONTEXT) + xctx->XState.Offset + xctx->XState.Length;
xctx->All.Offset = -(LONG)sizeof(CONTEXT);
context->ContextFlags |= 0x40;
+}
- xs = xstate_from_context(context);
- memset( xs, 0, offsetof(XSTATE, YmmContext) );
+static inline void xstate_to_server( context_t *to, const XSTATE *xs )
+{
+ if (!xs)
+ return;
+
+ to->flags |= SERVER_CTX_YMM_REGISTERS;
+ if (xs->Mask & 4)
+ memcpy(&to->ymm.ymm_high_regs.ymm_high, &xs->YmmContext, sizeof(xs->YmmContext));
+ else
+ memset(&to->ymm.ymm_high_regs.ymm_high, 0, sizeof(xs->YmmContext));
+}
+
+static inline void xstate_from_server_( XSTATE *xs, const context_t *from, BOOL compaction_enabled)
+{
+ if (!xs)
+ return;
+
+ xs->Mask = 0;
+ xs->CompactionMask = compaction_enabled ? 0x8000000000000004 : 0;
+
+ if (from->flags & SERVER_CTX_YMM_REGISTERS)
+ {
+ unsigned long *src = (unsigned long *)&from->ymm.ymm_high_regs.ymm_high;
+ unsigned int i;
+
+ for (i = 0; i < sizeof(xs->YmmContext) / sizeof(unsigned long); ++i)
+ if (src[i])
+ {
+ memcpy( &xs->YmmContext, &from->ymm.ymm_high_regs.ymm_high, sizeof(xs->YmmContext) );
+ xs->Mask = 4;
+ break;
+ }
+ }
+}
+#define xstate_from_server( xs, from ) xstate_from_server_( xs, from, user_shared_data->XState.CompactionEnabled )
+
+#else
+static inline XSTATE *xstate_from_context( const CONTEXT *context )
+{
+ return NULL;
+}
+static inline void context_init_xstate( CONTEXT *context, void *xstate_buffer )
+{
}
#endif
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 751ca59ad6b..5e267195f20 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -170,6 +170,10 @@ typedef struct
{
unsigned char i386_regs[512];
} ext;
+ union
+ {
+ struct { struct { unsigned __int64 low, high; } ymm_high[16]; } ymm_high_regs;
+ } ymm;
} context_t;
#define SERVER_CTX_CONTROL 0x01
@@ -178,6 +182,7 @@ typedef struct
#define SERVER_CTX_FLOATING_POINT 0x08
#define SERVER_CTX_DEBUG_REGISTERS 0x10
#define SERVER_CTX_EXTENDED_REGISTERS 0x20
+#define SERVER_CTX_YMM_REGISTERS 0x40
struct send_fd
diff --git a/server/protocol.def b/server/protocol.def
index 16c0b936743..305a1d0186f 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -186,6 +186,10 @@ typedef struct
{
unsigned char i386_regs[512];
} ext; /* selected by SERVER_CTX_EXTENDED_REGISTERS */
+ union
+ {
+ struct { struct { unsigned __int64 low, high; } ymm_high[16]; } ymm_high_regs;
+ } ymm; /* selected by SERVER_CTX_YMM_REGISTERS */
} context_t;
#define SERVER_CTX_CONTROL 0x01
@@ -194,6 +198,7 @@ typedef struct
#define SERVER_CTX_FLOATING_POINT 0x08
#define SERVER_CTX_DEBUG_REGISTERS 0x10
#define SERVER_CTX_EXTENDED_REGISTERS 0x20
+#define SERVER_CTX_YMM_REGISTERS 0x40
/* structure used in sending an fd from client to server */
struct send_fd
diff --git a/server/thread.c b/server/thread.c
index eb138079739..942a8ff8389 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1285,6 +1285,7 @@ static void copy_context( context_t *to, const context_t *from, unsigned int fla
if (flags & SERVER_CTX_FLOATING_POINT) to->fp = from->fp;
if (flags & SERVER_CTX_DEBUG_REGISTERS) to->debug = from->debug;
if (flags & SERVER_CTX_EXTENDED_REGISTERS) to->ext = from->ext;
+ if (flags & SERVER_CTX_YMM_REGISTERS) to->ymm = from->ymm;
}
/* return the context flags that correspond to system regs */
diff --git a/server/trace.c b/server/trace.c
index 17dd415b958..8ee0bc8c3e3 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -620,6 +620,9 @@ static void dump_varargs_context( const char *prefix, data_size_t size )
if (ctx.flags & SERVER_CTX_EXTENDED_REGISTERS)
dump_uints( ",extended=", (const unsigned int *)ctx.ext.i386_regs,
sizeof(ctx.ext.i386_regs) / sizeof(int) );
+ if (ctx.flags & SERVER_CTX_YMM_REGISTERS)
+ dump_uints( ",ymm_high=", (const unsigned int *)ctx.ymm.ymm_high_regs.ymm_high,
+ sizeof(ctx.ymm.ymm_high_regs) / sizeof(int) );
break;
case CPU_x86_64:
if (ctx.flags & SERVER_CTX_CONTROL)
@@ -669,6 +672,9 @@ static void dump_varargs_context( const char *prefix, data_size_t size )
(unsigned int)(ctx.fp.x86_64_regs.fpregs[i].low >> 32),
(unsigned int)ctx.fp.x86_64_regs.fpregs[i].low );
}
+ if (ctx.flags & SERVER_CTX_YMM_REGISTERS)
+ dump_uints( ",ymm_high=", (const unsigned int *)ctx.ymm.ymm_high_regs.ymm_high,
+ sizeof(ctx.ymm.ymm_high_regs) / sizeof(int) );
break;
case CPU_POWERPC:
if (ctx.flags & SERVER_CTX_CONTROL)
--
2.26.2
1
2
09 Oct '20
Wine-bug: https://bugs.winehq.org/show_bug.cgi?id=48861
Signed-off-by: Myah Caron <qsniyg(a)protonmail.com>
---
dlls/kernelbase/process.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c
index d5fedb4495c..0f707f82d11 100644
--- a/dlls/kernelbase/process.c
+++ b/dlls/kernelbase/process.c
@@ -1278,7 +1278,7 @@ BOOL WINAPI BaseFlushAppcompatCache(void)
/***********************************************************************
* GetCommandLineA (kernelbase.@)
*/
-LPSTR WINAPI DECLSPEC_HOTPATCH GetCommandLineA(void)
+LPSTR WINAPI GetCommandLineA(void)
{
return command_lineA;
}
@@ -1287,7 +1287,7 @@ LPSTR WINAPI DECLSPEC_HOTPATCH GetCommandLineA(void)
/***********************************************************************
* GetCommandLineW (kernelbase.@)
*/
-LPWSTR WINAPI DECLSPEC_HOTPATCH GetCommandLineW(void)
+LPWSTR WINAPI GetCommandLineW(void)
{
return command_lineW;
}
--
2.28.0
1
0
[PATCH 5/5] riched20: Use ME_Paragraph ptrs in a few of the table functions.
by Huw Davies 09 Oct '20
by Huw Davies 09 Oct '20
09 Oct '20
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/caret.c | 6 ++---
dlls/riched20/editor.h | 8 +++---
dlls/riched20/paint.c | 4 +--
dlls/riched20/para.c | 13 ++++++++++
dlls/riched20/table.c | 57 ++++++++++++++++++------------------------
dlls/riched20/wrap.c | 9 +++----
dlls/riched20/writer.c | 4 +--
7 files changed, 54 insertions(+), 47 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 89fd9d7326c..e9ea64ed1bc 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -1033,7 +1033,7 @@ static BOOL ME_FindPixelPos(ME_TextEditor *editor, int x, int y,
}
else if (p->member.para.nFlags & MEPF_ROWSTART)
{
- p = ME_GetTableRowEnd(p);
+ p = para_get_di( table_row_end( &p->member.para ) );
}
}
/* find row */
@@ -1304,7 +1304,7 @@ ME_MoveCursorLines(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs, BOOL
pOldPara->member.para.pCell != pNewPara->member.para.pCell))
{
/* Brought out of a cell */
- pNewPara = ME_GetTableRowStart(pOldPara)->member.para.prev_para;
+ pNewPara = table_row_start( &pOldPara->member.para )->prev_para;
if (pNewPara->type == diTextStart)
return; /* At the top, so don't go anywhere. */
pItem = ME_FindItemFwd(pNewPara, diStartRow);
@@ -1335,7 +1335,7 @@ ME_MoveCursorLines(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs, BOOL
pOldPara->member.para.pCell != pNewPara->member.para.pCell))
{
/* Brought out of a cell */
- pNewPara = ME_GetTableRowEnd(pOldPara)->member.para.next_para;
+ pNewPara = table_row_end( &pOldPara->member.para )->next_para;
if (pNewPara->type == diTextEnd)
return; /* At the bottom, so don't go anywhere. */
pItem = ME_FindItemFwd(pNewPara, diStartRow);
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index e7687272510..910a87c33c4 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -211,6 +211,8 @@ int get_total_width(ME_TextEditor *editor) DECLSPEC_HIDDEN;
void para_mark_rewrap( ME_TextEditor *editor, ME_Paragraph *para ) DECLSPEC_HIDDEN;
void para_mark_add( ME_TextEditor *editor, ME_Paragraph *para ) DECLSPEC_HIDDEN;
void para_mark_remove( ME_TextEditor *editor, ME_Paragraph *para ) DECLSPEC_HIDDEN;
+ME_Paragraph *para_next( ME_Paragraph *para ) DECLSPEC_HIDDEN;
+ME_Paragraph *para_prev( ME_Paragraph *para ) DECLSPEC_HIDDEN;
ME_Run *para_first_run( ME_Paragraph *para ) DECLSPEC_HIDDEN;
static inline ME_DisplayItem *para_get_di(ME_Paragraph *para)
{
@@ -273,9 +275,9 @@ ME_DisplayItem *ME_InsertTableRowStartAtParagraph(ME_TextEditor *editor,
ME_DisplayItem *para) DECLSPEC_HIDDEN;
ME_DisplayItem *ME_InsertTableCellFromCursor(ME_TextEditor *editor) DECLSPEC_HIDDEN;
ME_DisplayItem *ME_InsertTableRowEndFromCursor(ME_TextEditor *editor) DECLSPEC_HIDDEN;
-ME_DisplayItem *ME_GetTableRowEnd(ME_DisplayItem *para) DECLSPEC_HIDDEN;
-ME_DisplayItem *ME_GetTableRowStart(ME_DisplayItem *para) DECLSPEC_HIDDEN;
-ME_DisplayItem *ME_GetOuterParagraph(ME_DisplayItem *para) DECLSPEC_HIDDEN;
+ME_Paragraph *table_row_end( ME_Paragraph *para ) DECLSPEC_HIDDEN;
+ME_Paragraph *table_row_start( ME_Paragraph *para ) DECLSPEC_HIDDEN;
+ME_Paragraph *table_outer_para( ME_Paragraph *para ) DECLSPEC_HIDDEN;
void ME_CheckTablesForCorruption(ME_TextEditor *editor) DECLSPEC_HIDDEN;
void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nChars) DECLSPEC_HIDDEN;
ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, ME_DisplayItem *table_row) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index 72128072380..53583de21ce 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -778,10 +778,10 @@ static void ME_DrawTableBorders(ME_Context *c, ME_DisplayItem *paragraph)
if (atBottom) {
int oldLeft = rc.left;
width = max(ME_twips2pointsY(c, cell->border.bottom.width), 1);
- paraAfterRow = ME_GetTableRowEnd(paragraph)->member.para.next_para;
+ paraAfterRow = table_row_end( ¶graph->member.para )->next_para;
if (paraAfterRow->member.para.nFlags & MEPF_ROWSTART) {
ME_DisplayItem *nextEndCell;
- nextEndCell = ME_FindItemBack(ME_GetTableRowEnd(paraAfterRow), diCell);
+ nextEndCell = ME_FindItemBack( para_get_di( table_row_end( ¶AfterRow->member.para ) ), diCell );
assert(nextEndCell && !nextEndCell->member.cell.next_cell);
rc.left = c->pt.x + nextEndCell->member.cell.pt.x;
/* FIXME: Native draws FROM the bottom of the table rather than
diff --git a/dlls/riched20/para.c b/dlls/riched20/para.c
index 58dcfc8e712..0f8b76f76d0 100644
--- a/dlls/riched20/para.c
+++ b/dlls/riched20/para.c
@@ -55,6 +55,19 @@ void destroy_para(ME_TextEditor *editor, ME_DisplayItem *item)
ME_DestroyDisplayItem(item);
}
+/* Note para_next/prev will return the start and end doc nodes */
+ME_Paragraph *para_next( ME_Paragraph *para )
+{
+ if (para->next_para) return ¶->next_para->member.para;
+ return NULL;
+}
+
+ME_Paragraph *para_prev( ME_Paragraph *para )
+{
+ if (para->prev_para) return ¶->prev_para->member.para;
+ return NULL;
+}
+
int get_total_width(ME_TextEditor *editor)
{
ME_Paragraph *para;
diff --git a/dlls/riched20/table.c b/dlls/riched20/table.c
index 1b4b9143d16..615145b85e8 100644
--- a/dlls/riched20/table.c
+++ b/dlls/riched20/table.c
@@ -133,52 +133,46 @@ ME_DisplayItem* ME_InsertTableRowEndFromCursor(ME_TextEditor *editor)
return para->member.para.prev_para;
}
-ME_DisplayItem* ME_GetTableRowEnd(ME_DisplayItem *para)
+ME_Paragraph* table_row_end( ME_Paragraph *para )
{
ME_DisplayItem *cell;
- assert(para);
- if (para->member.para.nFlags & MEPF_ROWEND)
- return para;
- if (para->member.para.nFlags & MEPF_ROWSTART)
- para = para->member.para.next_para;
- cell = para->member.para.pCell;
+ assert( para );
+ if (para->nFlags & MEPF_ROWEND) return para;
+ if (para->nFlags & MEPF_ROWSTART) para = para_next( para );
+ cell = para->pCell;
assert(cell && cell->type == diCell);
while (cell->member.cell.next_cell)
cell = cell->member.cell.next_cell;
- para = ME_FindItemFwd(cell, diParagraph);
- assert(para && para->member.para.nFlags & MEPF_ROWEND);
+ para = &ME_FindItemFwd( cell, diParagraph )->member.para;
+ assert( para && para->nFlags & MEPF_ROWEND );
return para;
}
-ME_DisplayItem* ME_GetTableRowStart(ME_DisplayItem *para)
+ME_Paragraph* table_row_start( ME_Paragraph *para )
{
ME_DisplayItem *cell;
- assert(para);
- if (para->member.para.nFlags & MEPF_ROWSTART)
- return para;
- if (para->member.para.nFlags & MEPF_ROWEND)
- para = para->member.para.prev_para;
- cell = para->member.para.pCell;
+ assert( para );
+ if (para->nFlags & MEPF_ROWSTART) return para;
+ if (para->nFlags & MEPF_ROWEND) para = para_prev( para );
+ cell = para->pCell;
assert(cell && cell->type == diCell);
while (cell->member.cell.prev_cell)
cell = cell->member.cell.prev_cell;
- para = ME_FindItemBack(cell, diParagraph);
- assert(para && para->member.para.nFlags & MEPF_ROWSTART);
+ para = &ME_FindItemBack( cell, diParagraph )->member.para;
+ assert( para && para->nFlags & MEPF_ROWSTART );
return para;
}
-ME_DisplayItem* ME_GetOuterParagraph(ME_DisplayItem *para)
+ME_Paragraph* table_outer_para( ME_Paragraph *para )
{
- if (para->member.para.nFlags & MEPF_ROWEND)
- para = para->member.para.prev_para;
- while (para->member.para.pCell)
+ if (para->nFlags & MEPF_ROWEND) para = para_prev( para );
+ while (para->pCell)
{
- para = ME_GetTableRowStart(para);
- if (!para->member.para.pCell)
- break;
- para = ME_FindItemBack(para->member.para.pCell, diParagraph);
+ para = table_row_start( para );
+ if (!para->pCell) break;
+ para = &ME_FindItemBack( para->pCell, diParagraph )->member.para;
}
return para;
}
@@ -330,7 +324,7 @@ void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nC
while (!bTruancateDeletion &&
next_para->member.para.nFlags & MEPF_ROWSTART)
{
- next_para = ME_GetTableRowEnd(next_para)->member.para.next_para;
+ next_para = table_row_end( &next_para->member.para )->next_para;
if (next_para->member.para.nCharOfs > nOfs + *nChars)
{
/* End of deletion is not past the end of the table row. */
@@ -416,8 +410,8 @@ ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor,
assert(table_row->type == diParagraph);
if (!editor->bEmulateVersion10) { /* v4.1 */
ME_DisplayItem *insertedCell, *para, *cell, *prevTableEnd;
- cell = ME_FindItemFwd(ME_GetTableRowStart(table_row), diCell);
- prevTableEnd = ME_GetTableRowEnd(table_row);
+ cell = ME_FindItemFwd( para_get_di( table_row_start( &table_row->member.para ) ), diCell );
+ prevTableEnd = para_get_di( table_row_end( &table_row->member.para ) );
para = prevTableEnd->member.para.next_para;
run = ME_FindItemFwd(para, diRun);
editor->pCursors[0].pPara = para;
@@ -484,15 +478,14 @@ static void ME_SelectOrInsertNextCell(ME_TextEditor *editor,
{
cell = cell->member.cell.next_cell;
} else {
- para = ME_GetTableRowEnd(ME_FindItemFwd(cell, diParagraph));
- para = para->member.para.next_para;
+ para = table_row_end( &ME_FindItemFwd( cell, diParagraph )->member.para )->next_para;
assert(para);
if (para->member.para.nFlags & MEPF_ROWSTART) {
cell = para->member.para.next_para->member.para.pCell;
} else {
/* Insert row */
para = para->member.para.prev_para;
- para = ME_AppendTableRow(editor, ME_GetTableRowStart(para));
+ para = ME_AppendTableRow( editor, para_get_di( table_row_start( ¶->member.para ) ) );
/* Put cursor at the start of the new table row */
para = para->member.para.next_para;
editor->pCursors[0].pPara = para;
diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c
index 5ff9623e336..a84f738e925 100644
--- a/dlls/riched20/wrap.c
+++ b/dlls/riched20/wrap.c
@@ -209,7 +209,7 @@ static void ME_BeginRow(ME_WrapContext *wc)
width -= cell->prev_cell->member.cell.nRightBoundary;
if (!cell->prev_cell)
{
- int rowIndent = ME_GetTableRowEnd( para_get_di( wc->para ) )->member.para.fmt.dxStartIndent;
+ int rowIndent = table_row_end( wc->para )->fmt.dxStartIndent;
width -= rowIndent;
}
cell->nWidth = max(ME_twips2pointsX(wc->context, width), 0);
@@ -843,8 +843,7 @@ static void ME_WrapTextParagraph( ME_TextEditor *editor, ME_Context *c, ME_Parag
else
{
int dxStartIndent = para->fmt.dxStartIndent;
- if (para->pCell)
- dxStartIndent += ME_GetTableRowEnd( para_get_di( para ) )->member.para.fmt.dxOffset;
+ if (para->pCell) dxStartIndent += table_row_end( para )->fmt.dxOffset;
wc.nLeftMargin = ME_twips2pointsX( c, dxStartIndent + para->fmt.dxOffset );
wc.nFirstMargin = ME_twips2pointsX( c, dxStartIndent );
@@ -1101,8 +1100,8 @@ void ME_InvalidateParagraphRange(ME_TextEditor *editor,
if (start_para)
{
- start_para = ME_GetOuterParagraph(start_para);
- last_para = ME_GetOuterParagraph(last_para);
+ start_para = para_get_di( table_outer_para( &start_para->member.para ) );
+ last_para = para_get_di( table_outer_para( &last_para->member.para ) );
rc.top += start_para->member.para.pt.y - ofs;
} else {
rc.top += editor->nTotalLength - ofs;
diff --git a/dlls/riched20/writer.c b/dlls/riched20/writer.c
index 94001ee44b2..6f5bb4e1f83 100644
--- a/dlls/riched20/writer.c
+++ b/dlls/riched20/writer.c
@@ -400,8 +400,8 @@ ME_StreamOutRTFTableProps(ME_TextEditor *editor, ME_OutStream *pStream,
if (!ME_StreamOutPrint(pStream, "\\trowd"))
return FALSE;
if (!editor->bEmulateVersion10) { /* v4.1 */
- PARAFORMAT2 *pFmt = &ME_GetTableRowEnd(para)->member.para.fmt;
- para = ME_GetTableRowStart(para);
+ PARAFORMAT2 *pFmt = &table_row_end( ¶->member.para )->fmt;
+ para = para_get_di( table_row_start( ¶->member.para ) );
cell = para->member.para.next_para->member.para.pCell;
assert(cell);
if (pFmt->dxOffset)
--
2.23.0
1
0
[PATCH 4/5] riched20: Don't create a display context in InvalidateParagraphRange().
by Huw Davies 09 Oct '20
by Huw Davies 09 Oct '20
09 Oct '20
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/wrap.c | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c
index 819915d4c09..5ff9623e336 100644
--- a/dlls/riched20/wrap.c
+++ b/dlls/riched20/wrap.c
@@ -1093,28 +1093,25 @@ void ME_InvalidateParagraphRange(ME_TextEditor *editor,
ME_DisplayItem *start_para,
ME_DisplayItem *last_para)
{
- ME_Context c;
RECT rc;
int ofs;
- ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost));
- rc = c.rcView;
+ rc = editor->rcFormat;
ofs = editor->vert_si.nPos;
- if (start_para) {
+ if (start_para)
+ {
start_para = ME_GetOuterParagraph(start_para);
last_para = ME_GetOuterParagraph(last_para);
- rc.top = c.rcView.top + start_para->member.para.pt.y - ofs;
+ rc.top += start_para->member.para.pt.y - ofs;
} else {
- rc.top = c.rcView.top + editor->nTotalLength - ofs;
+ rc.top += editor->nTotalLength - ofs;
}
if (editor->nTotalLength < editor->nLastTotalLength)
- rc.bottom = c.rcView.top + editor->nLastTotalLength - ofs;
+ rc.bottom = editor->rcFormat.top + editor->nLastTotalLength - ofs;
else
- rc.bottom = c.rcView.top + last_para->member.para.pt.y + last_para->member.para.nHeight - ofs;
+ rc.bottom = editor->rcFormat.top + last_para->member.para.pt.y + last_para->member.para.nHeight - ofs;
ITextHost_TxInvalidateRect(editor->texthost, &rc, TRUE);
-
- ME_DestroyContext(&c);
}
--
2.23.0
1
0
09 Oct '20
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/editor.c | 1 -
dlls/riched20/editstr.h | 5 +--
dlls/riched20/para.c | 73 ++++++-----------------------------------
dlls/riched20/wrap.c | 39 +++++++++-------------
4 files changed, 28 insertions(+), 90 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 2fb7e3650d4..e7e33c27585 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -3062,7 +3062,6 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
ed->bEmulateVersion10 = bEmulateVersion10;
ed->styleFlags = 0;
ed->exStyleFlags = 0;
- ed->first_marked_para = NULL;
ed->total_rows = 0;
ITextHost_TxGetPropertyBits(texthost,
(TXTBIT_RICHTEXT|TXTBIT_MULTILINE|
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h
index 2c5737f3e93..fd5c9bc3df8 100644
--- a/dlls/riched20/editstr.h
+++ b/dlls/riched20/editstr.h
@@ -47,6 +47,7 @@
#include "wine/debug.h"
#include "wine/heap.h"
#include "wine/list.h"
+#include "wine/rbtree.h"
#ifdef __ASM_USE_THISCALL_WRAPPER
extern const struct ITextHostVtbl itextHostStdcallVtbl DECLSPEC_HIDDEN;
@@ -216,7 +217,7 @@ typedef struct tagME_Paragraph
struct para_num para_num;
ME_Run *eop_run; /* ptr to the end-of-para run */
struct tagME_DisplayItem *prev_para, *next_para;
- struct tagME_DisplayItem *prev_marked, *next_marked;
+ struct wine_rb_entry marked_entry;
} ME_Paragraph;
typedef struct tagME_Cell /* v4.1 */
@@ -431,7 +432,6 @@ typedef struct tagME_TextEditor
int imeStartIndex;
DWORD selofs; /* The size of the selection bar on the left side of control */
ME_SelectionType nSelectionType;
- ME_DisplayItem *first_marked_para;
/* Track previous notified selection */
CHARRANGE notified_cr;
@@ -445,6 +445,7 @@ typedef struct tagME_TextEditor
int wheel_remain;
struct list style_list;
struct list reobj_list;
+ struct wine_rb_tree marked_paras;
} ME_TextEditor;
typedef struct tagME_Context
diff --git a/dlls/riched20/para.c b/dlls/riched20/para.c
index 9d8693ed411..58dcfc8e712 100644
--- a/dlls/riched20/para.c
+++ b/dlls/riched20/para.c
@@ -35,7 +35,6 @@ static ME_DisplayItem *make_para(ME_TextEditor *editor)
ME_SetDefaultParaFormat(editor, &item->member.para.fmt);
item->member.para.nFlags = MEPF_REWRAP;
- item->member.para.next_marked = item->member.para.prev_marked = NULL;
return item;
}
@@ -74,74 +73,21 @@ int get_total_width(ME_TextEditor *editor)
return total_width;
}
-void para_mark_remove( ME_TextEditor *editor, ME_Paragraph *para )
+static int para_mark_compare( const void *key, const struct wine_rb_entry *entry )
{
- ME_DisplayItem *di = para_get_di( para );
- ME_DisplayItem *head = editor->first_marked_para;
+ ME_Paragraph *para = WINE_RB_ENTRY_VALUE( entry, ME_Paragraph, marked_entry );
- if (!di->member.para.next_marked && !di->member.para.prev_marked)
- {
- if (di == head)
- editor->first_marked_para = NULL;
- }
- else if (di->member.para.next_marked && di->member.para.prev_marked)
- {
- di->member.para.prev_marked->member.para.next_marked = di->member.para.next_marked;
- di->member.para.next_marked->member.para.prev_marked = di->member.para.prev_marked;
- di->member.para.prev_marked = di->member.para.next_marked = NULL;
- }
- else if (di->member.para.next_marked)
- {
- assert(di == editor->first_marked_para);
- editor->first_marked_para = di->member.para.next_marked;
- di->member.para.next_marked->member.para.prev_marked = NULL;
- di->member.para.next_marked = NULL;
- }
- else
- {
- di->member.para.prev_marked->member.para.next_marked = NULL;
- di->member.para.prev_marked = NULL;
- }
+ return *(int *)key - para->nCharOfs;
}
-void para_mark_add( ME_TextEditor *editor, ME_Paragraph *para )
+void para_mark_remove( ME_TextEditor *editor, ME_Paragraph *para )
{
- ME_DisplayItem *di = para_get_di( para );
- ME_DisplayItem *iter = editor->first_marked_para;
+ wine_rb_remove_key( &editor->marked_paras, ¶->nCharOfs );
+}
- if (!iter)
- {
- editor->first_marked_para = di;
- return;
- }
- while (iter)
- {
- if (iter == di)
- return;
- else if (di->member.para.nCharOfs < iter->member.para.nCharOfs)
- {
- if (iter == editor->first_marked_para)
- editor->first_marked_para = di;
- di->member.para.next_marked = iter;
- iter->member.para.prev_marked = di;
- break;
- }
- else if (di->member.para.nCharOfs >= iter->member.para.nCharOfs)
- {
- if (!iter->member.para.next_marked || di->member.para.nCharOfs < iter->member.para.next_marked->member.para.nCharOfs)
- {
- if (iter->member.para.next_marked)
- {
- di->member.para.next_marked = iter->member.para.next_marked;
- iter->member.para.next_marked->member.para.prev_marked = di;
- }
- di->member.para.prev_marked = iter;
- iter->member.para.next_marked = di;
- break;
- }
- }
- iter = iter->member.para.next_marked;
- }
+void para_mark_add( ME_TextEditor *editor, ME_Paragraph *para )
+{
+ wine_rb_put( &editor->marked_paras, ¶->nCharOfs, ¶->marked_entry );
}
ME_Run *para_first_run( ME_Paragraph *para )
@@ -229,6 +175,7 @@ void ME_MakeFirstParagraph(ME_TextEditor *editor)
text->pLast->member.para.nCharOfs = editor->bEmulateVersion10 ? 2 : 1;
+ wine_rb_init( &editor->marked_paras, para_mark_compare );
para_mark_add( editor, ¶->member.para );
ME_DestroyContext(&c);
}
diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c
index cb17f2963b0..819915d4c09 100644
--- a/dlls/riched20/wrap.c
+++ b/dlls/riched20/wrap.c
@@ -1029,19 +1029,22 @@ static void adjust_para_y(ME_Paragraph *para, ME_Context *c, ME_DisplayItem *rep
BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
{
ME_Paragraph *para, *next;
+ struct wine_rb_entry *entry, *next_entry;
ME_Context c;
- int totalWidth = editor->nTotalWidth, diff = 0, prev_width;
+ int totalWidth = editor->nTotalWidth, prev_width;
ME_DisplayItem *repaint_start = NULL, *repaint_end = NULL;
- if (!editor->first_marked_para)
- return FALSE;
+ if (!editor->marked_paras.root) return FALSE;
ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost));
- para = &editor->first_marked_para->member.para;
- c.pt = para->pt;
- while (para_get_di( para ) != editor->pBuffer->pLast)
+ entry = wine_rb_head( editor->marked_paras.root );
+ while (entry)
{
+ para = WINE_RB_ENTRY_VALUE( entry, ME_Paragraph, marked_entry );
+ next_entry = wine_rb_next( entry );
+
+ c.pt = para->pt;
prev_width = para->nWidth;
ME_WrapTextParagraph( editor, &c, para );
if (prev_width == totalWidth && para->nWidth < totalWidth)
@@ -1056,11 +1059,10 @@ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
if (para->next_para)
{
- diff = c.pt.y - para->next_para->member.para.pt.y;
- if (diff)
+ if (c.pt.y != para->next_para->member.para.pt.y)
{
next = para;
- while (next->next_para && next != ¶->next_marked->member.para &&
+ while (next->next_para && &next->marked_entry != next_entry &&
next != &editor->pBuffer->pLast->member.para)
{
ME_MarkRepaintEnd(next->next_para, &repaint_start, &repaint_end);
@@ -1070,26 +1072,15 @@ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
}
}
}
- if (para->next_marked)
- {
- ME_Paragraph *tmp = para;
- para = ¶->next_marked->member.para;
- para_mark_remove( editor, tmp );
- }
- else
- {
- para_mark_remove( editor, para );
- para = &editor->pBuffer->pLast->member.para;
- }
- c.pt.y = para->pt.y;
+ entry = next_entry;
}
+ wine_rb_clear( &editor->marked_paras, NULL, NULL );
+
editor->sizeWindow.cx = c.rcView.right-c.rcView.left;
editor->sizeWindow.cy = c.rcView.bottom-c.rcView.top;
- editor->nTotalLength = c.pt.y;
+ editor->nTotalLength = editor->pBuffer->pLast->member.para.pt.y;
editor->nTotalWidth = totalWidth;
- editor->pBuffer->pLast->member.para.pt.x = 0;
- editor->pBuffer->pLast->member.para.pt.y = c.pt.y;
ME_DestroyContext(&c);
--
2.23.0
1
0
[PATCH 2/5] riched20: Use ME_Paragraph ptrs to iterate in WrapMarkedParagraphs().
by Huw Davies 09 Oct '20
by Huw Davies 09 Oct '20
09 Oct '20
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/wrap.c | 98 +++++++++++++++++++++-----------------------
1 file changed, 47 insertions(+), 51 deletions(-)
diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c
index c0c9c8f07e1..cb17f2963b0 100644
--- a/dlls/riched20/wrap.c
+++ b/dlls/riched20/wrap.c
@@ -913,11 +913,11 @@ static void ME_MarkRepaintEnd(ME_DisplayItem *para,
*repaint_end = para;
}
-static void adjust_para_y(ME_DisplayItem *item, ME_Context *c, ME_DisplayItem *repaint_start, ME_DisplayItem *repaint_end)
+static void adjust_para_y(ME_Paragraph *para, ME_Context *c, ME_DisplayItem *repaint_start, ME_DisplayItem *repaint_end)
{
- if (item->member.para.nFlags & MEPF_ROWSTART)
+ if (para->nFlags & MEPF_ROWSTART)
{
- ME_DisplayItem *cell = ME_FindItemFwd(item, diCell);
+ ME_DisplayItem *cell = ME_FindItemFwd( para_get_di( para ), diCell);
ME_DisplayItem *endRowPara;
int borderWidth = 0;
cell->member.cell.pt = c->pt;
@@ -942,19 +942,19 @@ static void adjust_para_y(ME_DisplayItem *item, ME_Context *c, ME_DisplayItem *r
if (endRowPara->member.para.fmt.dxStartIndent > 0)
{
int dxStartIndent = endRowPara->member.para.fmt.dxStartIndent;
- cell = ME_FindItemFwd(item, diCell);
+ cell = ME_FindItemFwd( para_get_di( para ), diCell);
cell->member.cell.pt.x += ME_twips2pointsX(c, dxStartIndent);
c->pt.x = cell->member.cell.pt.x;
}
}
- else if (item->member.para.nFlags & MEPF_ROWEND)
+ else if (para->nFlags & MEPF_ROWEND)
{
/* Set all the cells to the height of the largest cell */
ME_DisplayItem *startRowPara;
int prevHeight, nHeight, bottomBorder = 0;
- ME_DisplayItem *cell = ME_FindItemBack(item, diCell);
- item->member.para.nWidth = cell->member.cell.pt.x + cell->member.cell.nWidth;
- if (!(item->member.para.next_para->member.para.nFlags & MEPF_ROWSTART))
+ ME_DisplayItem *cell = ME_FindItemBack( para_get_di( para ), diCell );
+ para->nWidth = cell->member.cell.pt.x + cell->member.cell.nWidth;
+ if (!(para->next_para->member.para.nFlags & MEPF_ROWSTART))
{
/* Last row, the bottom border is added to the height. */
cell = cell->member.cell.prev_cell;
@@ -964,12 +964,12 @@ static void adjust_para_y(ME_DisplayItem *item, ME_Context *c, ME_DisplayItem *r
cell = cell->member.cell.prev_cell;
}
bottomBorder = ME_twips2pointsY(c, bottomBorder);
- cell = ME_FindItemBack(item, diCell);
+ cell = ME_FindItemBack( para_get_di( para ), diCell );
}
prevHeight = cell->member.cell.nHeight;
nHeight = cell->member.cell.prev_cell->member.cell.nHeight + bottomBorder;
cell->member.cell.nHeight = nHeight;
- item->member.para.nHeight = nHeight;
+ para->nHeight = nHeight;
cell = cell->member.cell.prev_cell;
cell->member.cell.nHeight = nHeight;
while (cell->member.cell.prev_cell)
@@ -986,8 +986,8 @@ static void adjust_para_y(ME_DisplayItem *item, ME_Context *c, ME_DisplayItem *r
{
/* The height of the cells has grown, so invalidate the bottom of
* the cells. */
- ME_MarkRepaintEnd(item, &repaint_start, &repaint_end);
- cell = ME_FindItemBack(item, diCell);
+ ME_MarkRepaintEnd( para_get_di( para ) , &repaint_start, &repaint_end );
+ cell = ME_FindItemBack( para_get_di( para ), diCell );
while (cell)
{
ME_MarkRepaintEnd(ME_FindItemBack(cell, diParagraph), &repaint_start, &repaint_end);
@@ -995,12 +995,11 @@ static void adjust_para_y(ME_DisplayItem *item, ME_Context *c, ME_DisplayItem *r
}
}
}
- else if (item->member.para.pCell &&
- item->member.para.pCell != item->member.para.next_para->member.para.pCell)
+ else if (para->pCell && para->pCell != para->next_para->member.para.pCell)
{
/* The next paragraph is in the next cell in the table row. */
- ME_Cell *cell = &item->member.para.pCell->member.cell;
- cell->nHeight = c->pt.y + item->member.para.nHeight - cell->pt.y;
+ ME_Cell *cell = ¶->pCell->member.cell;
+ cell->nHeight = c->pt.y + para->nHeight - cell->pt.y;
/* Propagate the largest height to the end so that it can be easily
* sent back to all the cells at the end of the row. */
@@ -1010,82 +1009,79 @@ static void adjust_para_y(ME_DisplayItem *item, ME_Context *c, ME_DisplayItem *r
c->pt.x = cell->pt.x + cell->nWidth;
c->pt.y = cell->pt.y;
cell->next_cell->member.cell.pt = c->pt;
- if (!(item->member.para.next_para->member.para.nFlags & MEPF_ROWEND))
+ if (!(para->next_para->member.para.nFlags & MEPF_ROWEND))
c->pt.y += cell->yTextOffset;
}
else
{
- if (item->member.para.pCell)
+ if (para->pCell)
{
/* Next paragraph in the same cell. */
- c->pt.x = item->member.para.pCell->member.cell.pt.x;
+ c->pt.x = para->pCell->member.cell.pt.x;
}
else
/* Normal paragraph */
c->pt.x = 0;
- c->pt.y += item->member.para.nHeight;
+ c->pt.y += para->nHeight;
}
}
BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
{
- ME_DisplayItem *item;
+ ME_Paragraph *para, *next;
ME_Context c;
int totalWidth = editor->nTotalWidth, diff = 0, prev_width;
ME_DisplayItem *repaint_start = NULL, *repaint_end = NULL;
- ME_Paragraph *para;
if (!editor->first_marked_para)
return FALSE;
ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost));
- item = editor->first_marked_para;
- c.pt = item->member.para.pt;
- while (item != editor->pBuffer->pLast)
+ para = &editor->first_marked_para->member.para;
+ c.pt = para->pt;
+ while (para_get_di( para ) != editor->pBuffer->pLast)
{
- assert(item->type == diParagraph);
-
- prev_width = item->member.para.nWidth;
- ME_WrapTextParagraph( editor, &c, &item->member.para );
- if (prev_width == totalWidth && item->member.para.nWidth < totalWidth)
+ prev_width = para->nWidth;
+ ME_WrapTextParagraph( editor, &c, para );
+ if (prev_width == totalWidth && para->nWidth < totalWidth)
totalWidth = get_total_width(editor);
else
- totalWidth = max(totalWidth, item->member.para.nWidth);
+ totalWidth = max(totalWidth, para->nWidth);
- if (!item->member.para.nCharOfs)
- ME_MarkRepaintEnd(item->member.para.prev_para, &repaint_start, &repaint_end);
- ME_MarkRepaintEnd(item, &repaint_start, &repaint_end);
- adjust_para_y(item, &c, repaint_start, repaint_end);
+ if (!para->nCharOfs)
+ ME_MarkRepaintEnd( para->prev_para, &repaint_start, &repaint_end );
+ ME_MarkRepaintEnd( para_get_di( para ), &repaint_start, &repaint_end );
+ adjust_para_y( para, &c, repaint_start, repaint_end );
- if (item->member.para.next_para)
+ if (para->next_para)
{
- diff = c.pt.y - item->member.para.next_para->member.para.pt.y;
+ diff = c.pt.y - para->next_para->member.para.pt.y;
if (diff)
{
- para = &item->member.para;
- while (para->next_para && para != &item->member.para.next_marked->member.para &&
- para != &editor->pBuffer->pLast->member.para)
+ next = para;
+ while (next->next_para && next != ¶->next_marked->member.para &&
+ next != &editor->pBuffer->pLast->member.para)
{
- ME_MarkRepaintEnd(para->next_para, &repaint_start, &repaint_end);
- para->next_para->member.para.pt.y = c.pt.y;
- adjust_para_y(para->next_para, &c, repaint_start, repaint_end);
- para = ¶->next_para->member.para;
+ ME_MarkRepaintEnd(next->next_para, &repaint_start, &repaint_end);
+ next->next_para->member.para.pt.y = c.pt.y;
+ adjust_para_y( &next->next_para->member.para, &c, repaint_start, repaint_end );
+ next = &next->next_para->member.para;
}
}
}
- if (item->member.para.next_marked)
+ if (para->next_marked)
{
- ME_DisplayItem *rem = item;
- item = item->member.para.next_marked;
- para_mark_remove( editor, &rem->member.para );
+ ME_Paragraph *tmp = para;
+ para = ¶->next_marked->member.para;
+ para_mark_remove( editor, tmp );
}
else
{
- para_mark_remove( editor, &item->member.para );
- item = editor->pBuffer->pLast;
+ para_mark_remove( editor, para );
+ para = &editor->pBuffer->pLast->member.para;
}
- c.pt.y = item->member.para.pt.y;
+ c.pt.y = para->pt.y;
}
editor->sizeWindow.cx = c.rcView.right-c.rcView.left;
editor->sizeWindow.cy = c.rcView.bottom-c.rcView.top;
--
2.23.0
1
0
09 Oct '20
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/caret.c | 2 +-
dlls/riched20/editor.c | 2 +-
dlls/riched20/editor.h | 6 +++---
dlls/riched20/para.c | 31 ++++++++++++++++---------------
dlls/riched20/run.c | 8 ++++----
dlls/riched20/undo.c | 2 +-
dlls/riched20/wrap.c | 4 ++--
7 files changed, 28 insertions(+), 27 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 0ed34372e38..89fd9d7326c 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -394,7 +394,7 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start,
c.nOffset -= nCharsToDelete;
- mark_para_rewrap(editor, ME_FindItemBack(c.pRun, diParagraph));
+ para_mark_rewrap( editor, &ME_FindItemBack( c.pRun, diParagraph )->member.para );
cursor = c;
/* nChars is the number of characters that should be deleted from the
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index abc45920878..2fb7e3650d4 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -2509,7 +2509,7 @@ static BOOL handle_enter(ME_TextEditor *editor)
para = editor->pBuffer->pFirst->member.para.next_para;
ME_SetDefaultParaFormat(editor, ¶->member.para.fmt);
para->member.para.nFlags = 0;
- mark_para_rewrap(editor, para);
+ para_mark_rewrap( editor, ¶->member.para );
editor->pCursors[0].pPara = para;
editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun);
editor->pCursors[1] = editor->pCursors[0];
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index 47e822c2d34..e7687272510 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -208,9 +208,9 @@ void ME_SetDefaultParaFormat(ME_TextEditor *editor, PARAFORMAT2 *pFmt) DECLSPEC_
void para_num_init( ME_Context *c, ME_Paragraph *para ) DECLSPEC_HIDDEN;
void para_num_clear( struct para_num *pn ) DECLSPEC_HIDDEN;
int get_total_width(ME_TextEditor *editor) DECLSPEC_HIDDEN;
-void mark_para_rewrap(ME_TextEditor *editor, ME_DisplayItem *para) DECLSPEC_HIDDEN;
-void add_marked_para(ME_TextEditor *editor, ME_DisplayItem *para) DECLSPEC_HIDDEN;
-void remove_marked_para(ME_TextEditor *editor, ME_DisplayItem *para) DECLSPEC_HIDDEN;
+void para_mark_rewrap( ME_TextEditor *editor, ME_Paragraph *para ) DECLSPEC_HIDDEN;
+void para_mark_add( ME_TextEditor *editor, ME_Paragraph *para ) DECLSPEC_HIDDEN;
+void para_mark_remove( ME_TextEditor *editor, ME_Paragraph *para ) DECLSPEC_HIDDEN;
ME_Run *para_first_run( ME_Paragraph *para ) DECLSPEC_HIDDEN;
static inline ME_DisplayItem *para_get_di(ME_Paragraph *para)
{
diff --git a/dlls/riched20/para.c b/dlls/riched20/para.c
index fb994506bea..9d8693ed411 100644
--- a/dlls/riched20/para.c
+++ b/dlls/riched20/para.c
@@ -23,10 +23,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(richedit);
-void mark_para_rewrap(ME_TextEditor *editor, ME_DisplayItem *para)
+void para_mark_rewrap( ME_TextEditor *editor, ME_Paragraph *para )
{
- para->member.para.nFlags |= MEPF_REWRAP;
- add_marked_para(editor, para);
+ para->nFlags |= MEPF_REWRAP;
+ para_mark_add( editor, para );
}
static ME_DisplayItem *make_para(ME_TextEditor *editor)
@@ -52,7 +52,7 @@ void destroy_para(ME_TextEditor *editor, ME_DisplayItem *item)
editor->total_rows -= item->member.para.nRows;
ME_DestroyString(item->member.para.text);
para_num_clear( &item->member.para.para_num );
- remove_marked_para(editor, item);
+ para_mark_remove( editor, &item->member.para );
ME_DestroyDisplayItem(item);
}
@@ -74,11 +74,11 @@ int get_total_width(ME_TextEditor *editor)
return total_width;
}
-void remove_marked_para(ME_TextEditor *editor, ME_DisplayItem *di)
+void para_mark_remove( ME_TextEditor *editor, ME_Paragraph *para )
{
+ ME_DisplayItem *di = para_get_di( para );
ME_DisplayItem *head = editor->first_marked_para;
- assert(di->type == diParagraph);
if (!di->member.para.next_marked && !di->member.para.prev_marked)
{
if (di == head)
@@ -104,8 +104,9 @@ void remove_marked_para(ME_TextEditor *editor, ME_DisplayItem *di)
}
}
-void add_marked_para(ME_TextEditor *editor, ME_DisplayItem *di)
+void para_mark_add( ME_TextEditor *editor, ME_Paragraph *para )
{
+ ME_DisplayItem *di = para_get_di( para );
ME_DisplayItem *iter = editor->first_marked_para;
if (!iter)
@@ -228,7 +229,7 @@ void ME_MakeFirstParagraph(ME_TextEditor *editor)
text->pLast->member.para.nCharOfs = editor->bEmulateVersion10 ? 2 : 1;
- add_marked_para(editor, para);
+ para_mark_add( editor, ¶->member.para );
ME_DestroyContext(&c);
}
@@ -236,7 +237,7 @@ static void ME_MarkForWrapping(ME_TextEditor *editor, ME_DisplayItem *first, con
{
while(first != last)
{
- mark_para_rewrap(editor, first);
+ para_mark_rewrap( editor, &first->member.para );
first = first->member.para.next_para;
}
}
@@ -462,7 +463,7 @@ static void para_num_clear_list( ME_TextEditor *editor, ME_Paragraph *para, cons
{
do
{
- mark_para_rewrap( editor, para_get_di( para ) );
+ para_mark_rewrap( editor, para );
para_num_clear( ¶->para_num );
if (para->next_para->type != diParagraph) break;
para = ¶->next_para->member.para;
@@ -537,7 +538,7 @@ static BOOL ME_SetParaFormat(ME_TextEditor *editor, ME_Paragraph *para, const PA
if (memcmp(©, ¶->fmt, sizeof(PARAFORMAT2)))
{
- mark_para_rewrap( editor, para_get_di( para ) );
+ para_mark_rewrap( editor, para );
if (((dwMask & PFM_NUMBERING) && (copy.wNumbering != para->fmt.wNumbering)) ||
((dwMask & PFM_NUMBERINGSTART) && (copy.wNumberingStart != para->fmt.wNumberingStart)) ||
((dwMask & PFM_NUMBERINGSTYLE) && (copy.wNumberingStyle != para->fmt.wNumberingStyle)))
@@ -612,7 +613,7 @@ ME_DisplayItem *ME_SplitParagraph(ME_TextEditor *editor, ME_DisplayItem *run,
new_para->member.para.nCharOfs = run_para->member.para.nCharOfs + ofs;
new_para->member.para.nCharOfs += eol_len;
new_para->member.para.nFlags = 0;
- mark_para_rewrap(editor, new_para);
+ para_mark_rewrap( editor, &new_para->member.para );
/* FIXME initialize format style and call ME_SetParaFormat blah blah */
new_para->member.para.fmt = run_para->member.para.fmt;
@@ -679,9 +680,9 @@ ME_DisplayItem *ME_SplitParagraph(ME_TextEditor *editor, ME_DisplayItem *run,
/* force rewrap of the */
if (run_para->member.para.prev_para->type == diParagraph)
- mark_para_rewrap(editor, run_para->member.para.prev_para);
+ para_mark_rewrap( editor, &run_para->member.para.prev_para->member.para );
- mark_para_rewrap(editor, new_para->member.para.prev_para);
+ para_mark_rewrap( editor, &new_para->member.para.prev_para->member.para );
/* we've added the end run, so we need to modify nCharOfs in the next paragraphs */
ME_PropagateCharOffset(next_para, eol_len);
@@ -816,7 +817,7 @@ ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp,
ME_CheckCharOffsets(editor);
editor->nParagraphs--;
- mark_para_rewrap(editor, tp);
+ para_mark_rewrap( editor, &tp->member.para );
return tp;
}
diff --git a/dlls/riched20/run.c b/dlls/riched20/run.c
index f98288a94a2..c3bc7f50b39 100644
--- a/dlls/riched20/run.c
+++ b/dlls/riched20/run.c
@@ -247,7 +247,7 @@ void ME_JoinRuns(ME_TextEditor *editor, ME_DisplayItem *p)
int i;
assert(p->type == diRun && pNext->type == diRun);
assert(p->member.run.nCharOfs != -1);
- mark_para_rewrap(editor, ME_GetParagraph(p));
+ para_mark_rewrap( editor, &ME_GetParagraph( p )->member.para );
/* Update all cursors so that they don't contain the soon deleted run */
for (i=0; i<editor->nCursors; i++) {
@@ -299,7 +299,7 @@ ME_DisplayItem *ME_SplitRunSimple(ME_TextEditor *editor, ME_Cursor *cursor)
editor->pCursors[i].nOffset -= nOffset;
}
}
- mark_para_rewrap(editor, cursor->pPara);
+ para_mark_rewrap( editor, &cursor->pPara->member.para );
return run;
}
@@ -367,7 +367,7 @@ ME_InsertRunAtCursor(ME_TextEditor *editor, ME_Cursor *cursor, ME_Style *style,
ME_InsertBefore( insert_before, pDI );
TRACE("Shift length:%d\n", len);
ME_PropagateCharOffset( insert_before, len );
- mark_para_rewrap( editor, para_get_di( insert_before->member.run.para ) );
+ para_mark_rewrap( editor, insert_before->member.run.para );
/* Move any cursors that were at the end of the previous run to the end of the inserted run */
prev = ME_FindItemBack( pDI, diRun );
@@ -787,7 +787,7 @@ void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, C
ME_ReleaseStyle(para->para_num.style);
para->para_num.style = NULL;
}
- mark_para_rewrap( editor, para_get_di( para ) );
+ para_mark_rewrap( editor, para );
}
}
diff --git a/dlls/riched20/undo.c b/dlls/riched20/undo.c
index 2f18fc78bb3..c6b898b2ddc 100644
--- a/dlls/riched20/undo.c
+++ b/dlls/riched20/undo.c
@@ -341,7 +341,7 @@ static void ME_PlayUndoItem(ME_TextEditor *editor, struct undo_item *undo)
add_undo_set_para_fmt( editor, ¶->member.para );
para->member.para.fmt = undo->u.set_para_fmt.fmt;
para->member.para.border = undo->u.set_para_fmt.border;
- mark_para_rewrap(editor, para);
+ para_mark_rewrap( editor, ¶->member.para );
break;
}
case undo_set_char_fmt:
diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c
index 4853eefcabb..c0c9c8f07e1 100644
--- a/dlls/riched20/wrap.c
+++ b/dlls/riched20/wrap.c
@@ -1078,11 +1078,11 @@ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
{
ME_DisplayItem *rem = item;
item = item->member.para.next_marked;
- remove_marked_para(editor, rem);
+ para_mark_remove( editor, &rem->member.para );
}
else
{
- remove_marked_para(editor, item);
+ para_mark_remove( editor, &item->member.para );
item = editor->pBuffer->pLast;
}
c.pt.y = item->member.para.pt.y;
--
2.23.0
1
0
Signed-off-by: Myah Caron <qsniyg(a)protonmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 9 +++++++++
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
dlls/ntoskrnl.exe/tests/driver.c | 9 +++++++++
include/ddk/wdm.h | 1 +
4 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index e94feabc826..177816a2239 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2399,6 +2399,15 @@ HANDLE WINAPI PsGetThreadProcessId( PETHREAD thread )
return thread->kthread.id.UniqueProcess;
}
+/*********************************************************************
+ * PsGetProcessDebugPort (NTOSKRNL.@)
+ */
+PVOID WINAPI PsGetProcessDebugPort(PEPROCESS process)
+{
+ FIXME( "stub: %p\n", process );
+ return NULL;
+}
+
/***********************************************************************
* KeInsertQueue (NTOSKRNL.EXE.@)
*/
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 8892fde5054..8ca0f652f1d 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -896,7 +896,7 @@
@ stub PsGetJobSessionId
@ stub PsGetJobUIRestrictionsClass
@ stub PsGetProcessCreateTimeQuadPart
-@ stub PsGetProcessDebugPort
+@ stdcall PsGetProcessDebugPort(ptr)
@ stub PsGetProcessExitProcessCalled
@ stub PsGetProcessExitStatus
@ stub PsGetProcessExitTime
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index dfc742eec3b..e712ecf2f84 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -2103,6 +2103,14 @@ static void test_permanence(void)
ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "got %#x\n", status);
}
+static void test_debug(void)
+{
+ PVOID debug_port;
+
+ debug_port = PsGetProcessDebugPort( PsGetCurrentProcess() );
+ ok(!debug_port, "got %p\n", debug_port);
+}
+
static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack)
{
ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
@@ -2160,6 +2168,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
test_dpc();
test_process_memory(test_input);
test_permanence();
+ test_debug();
if (main_test_work_item) return STATUS_UNEXPECTED_IO_ERROR;
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 6885de1cf89..40f1d9754c0 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1834,6 +1834,7 @@ HANDLE WINAPI PsGetCurrentProcessId(void);
HANDLE WINAPI PsGetCurrentThreadId(void);
HANDLE WINAPI PsGetProcessInheritedFromUniqueProcessId(PEPROCESS);
BOOLEAN WINAPI PsGetVersion(ULONG*,ULONG*,ULONG*,UNICODE_STRING*);
+PVOID WINAPI PsGetProcessDebugPort(PEPROCESS process);
NTSTATUS WINAPI PsTerminateSystemThread(NTSTATUS);
#if defined(__x86_64__) || defined(__i386__)
--
2.28.0
2
1