Commit Graph

3341 Commits

Author SHA1 Message Date
Zhiyi Zhang 04b4d0f380 gdi32: Partially implement HALFTONE stretch mode.
COLORONCOLOR(STRETCH_DELETESCANS) was used in place of HALFTONE. COLORONCOLOR mode may delete rows
of pixels without trying to preserve information so it will cause Wine to render poorly when the
destination rectangle is small.

According to tests, HALFTONE mode uses box filter when doing integer downscaling and nearest
neighbor interpolation when doing upscaling in both horizontally and vertically. In other cases,
HALFTONE mode uses a lanczos3 like algorithm to interpolate pixels. There are also other heuristics
involved. For example, shrinking a 2x2 image to 1x1 may not use box filter depending on image data.
Since this algorithm is undocumented, it's difficult to reverse engineer the original algorithm and
produce identical results. Instead, this patch uses a naive implementation of bilinear interpolation
to implement HALFTONE mode and it produces good quality images.

For 8-bit and lower color depth images, nulldrv_StretchBlt should resize the images first and then
converts color depth.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46375
Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-15 20:43:55 +02:00
Francois Gouget a21d4fb8e3 user32/tests: Use the caller line number for open_clipboard() & co.
In particular this stops the traces in open_clipboard() and
has_no_open_wnd() from clobbering the line number when used in
expressions such as ok(has_no_open_wnd(), ...).

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-11 18:45:44 +02:00
Francois Gouget 91a791e517 user32/tests: Preserve the initial GetLastError() value for test_ClipboardOwner().
One of the tests expects GetLastError() to still return 0xdeadbeef after
has_no_open_wnd(), which would not be the case if another process did
open the clipboard.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-11 18:45:44 +02:00
Stefan Dösinger efa52619af user32: Delete info.hbmColor and hbmMask after copying.
Signed-off-by: Stefan Dösinger <stefan@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-10 20:49:27 +02:00
Stefan Dösinger 7ec5a7e1b6 user32: Release the icon frame in CopyImage.
Signed-off-by: Stefan Dösinger <stefan@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-10 20:49:27 +02:00
Francois Gouget 222d2d94e0 user32/tests: Use winetest contexts to simplify set_clipboard_data_process().
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-08 22:28:44 +02:00
Zhiyi Zhang d171d11167 gdi32: Return correct color depth for display DCs in GetDeviceCaps().
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=29184
Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-07 21:31:54 +02:00
Francois Gouget f58505d1db user32/tests: Protect GetOpenClipboardWindow() from interference.
As for OpenClipboard(), if another application opened the clipboard,
GetOpenClipboardWindow() will not return the expected value.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-04 20:00:30 +02:00
Francois Gouget 316eec8f66 user32/tests: Protect OpenClipboard() from interference.
Applications using ole32's clipboard API (e.g. Radeon / QT5) end up
monitoring the content of the clipboard and calling OpenClipboard()
while user32:clipboard runs. This causes the test's own
OpenClipboard() calls to fail.
Similarly the KDE clipboard manager may query the Wine clipboard
content while the test runs, causing winex11.drv to call
OpenClipboard() with the same effect.
So call OpenClipboard() again when it fails due to the clipboard
already being open. If opening the clipboard still fails, trace who
opened the clipboard, particularly the window class name to help
identify the source of interference.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-04 20:00:30 +02:00
Rémi Bernon dc7547a84b hidclass.sys: Factor HIDP_BUTTON_CAPS with HIDP_VALUE_CAPS.
Buttons are really just values with BitSize == 1, and having a union for
that makes the code more complicated than it needs.

We'll simplify the code a lot using HIDP_VALUE_CAPS everywhere, as the
two structure types are compatible.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-04 20:00:30 +02:00
Rémi Bernon 3f3d445383 user32: Use nameless unions in rawinput.c.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-04 20:00:30 +02:00
Francois Gouget 76a027b75d user32/tests: Use winetest contexts to simplify test_string().
This ensures all traces have the relevant context information, in
particular the OpenClipboard() checks, and simplifies the ok() calls.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-03 21:54:41 +02:00
Francois Gouget c59cd90633 user32/tests: Use wine_{push,pop}_context() to simplify test_synthesized().
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-03 21:54:39 +02:00
Francois Gouget 031aef852e user32: Debugstr_format() should not modify the last error.
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-06-03 21:50:58 +02:00
Rémi Bernon fc64aa7e7c server: Send HID report data with the WM_INPUT messages.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-31 12:31:21 +02:00
Rémi Bernon 1128a37e77 user32: Implement WM_INPUT / RIM_TYPEHID message dispatch.
Without any HID report data for now.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-31 12:30:41 +02:00
Rémi Bernon ae7458aca6 user32: Inform rawinput_from_hardware_message of available buffer size.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-31 12:30:36 +02:00
Rémi Bernon e8498788e8 server: Add hardware_msg_data size for variable size messages.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-31 12:30:36 +02:00
Francois Gouget 35180d368a user32/tests: Trace GetLastError() when OpenClipboard() fails in edit.
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-28 21:54:19 +02:00
Francois Gouget 764e7d0854 user32/tests: Fix a typo in a comment.
Signed-off-by: Francois Gouget <fgouget@free.fr>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-28 21:54:08 +02:00
Piotr Caban a1ca90d68a user32: Depend on SetWindowPos to refresh window manager hints in SetWindowRgn.
Otherwise both on Linux and Mac, the window will not restore title bar
when it becomes non-shaped until it's e.g. moved.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-27 21:25:56 +02:00
Zebediah Figura d2259665b4 user32: Blit the right bitmap when stretching monochrome icons in CopyImage().
Fixes: beb70a79e1
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-25 09:30:05 +02:00
Zebediah Figura 0da35c26a1 user32: Implement InternalGetWindowIcon().
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47915
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-24 11:42:37 +02:00
Zebediah Figura 5df5972f9a user32: Reimplement CopyIcon() on top of CopyImage().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-24 11:42:37 +02:00
Zebediah Figura beb70a79e1 user32: Implement stretching of cursor and icon objects in CopyImage().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-24 11:42:37 +02:00
Zebediah Figura db2b266c57 user32: Handle monochrome icons in CreateIcon() and CreateCursor() instead of CreateIconIndirect().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-24 11:42:37 +02:00
Francois Gouget cf85253a9c user32/tests: Fix the clipboard format id vs. atom table checks.
One cannot assume that a random integer has zero chance of being a valid
atom.
Reenable the GlobalFindAtomA() check in a todo_wine.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-21 08:56:33 +02:00
Rémi Bernon ba7d543c5c user32/tests: Use int for wait_move_event delay type.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-20 22:05:32 +02:00
Francois Gouget 948f20312b user32/tests: Fix the clipboard CF_LOCALE test.
By default CF_LOCALE matches the current input language, not the default
user LCID.

Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-20 22:05:32 +02:00
Francois Gouget a5639d62b5 user32/tests: Avoid copying the clipboard buffer sizes everywhere.
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-20 22:05:32 +02:00
Rémi Bernon 454712a94d user32: Add a default WindowPosChanging implementation.
Which creates an off-screen window surface for top-level non-layered or
SLWA-layered windows.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-20 21:48:57 +02:00
Zhiyi Zhang 095bdc6c43 user32: Add a cache for EnumDisplayDevicesW().
Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-18 21:25:00 +02:00
Zhiyi Zhang 9b2f59cb94 user32: Use get_primary_monitor_rect() helper.
Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-18 21:25:00 +02:00
Zhiyi Zhang 59e5a8d055 user32: Optimize getting virtual screen rectangle with GetSystemMetrics().
This saves calls to GetMonitorInfo().

Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-18 21:25:00 +02:00
Zhiyi Zhang ab431c70b4 user32: Optimize getting primary monitor rectangle with GetSystemMetrics().
This saves calls to GetMonitorInfo() and return from EnumDisplayMonitors() immediately
after the primary monitor is found.

Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-18 21:25:00 +02:00
Zhiyi Zhang d7cd5587df user32: Optimize getting monitor count with GetSystemMetrics().
This saves calls to GetMonitorInfo().

Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-18 21:25:00 +02:00
Rémi Bernon 50ca64fcdf user32: Duplicate klid to HKL high word in LoadKeyboardLayoutW.
When high word is 0, and unless it has an explicit layout id.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-17 20:37:25 +02:00
Rémi Bernon 702b52fe13 user32: Return WAIT_TIMEOUT in nulldrv_MsgWaitForMultipleObjectsEx.
When there's nothing to wait for.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-17 20:37:22 +02:00
Rémi Bernon 60f6a37f95 user32: Add a default ShowWindow implementation.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-17 20:37:18 +02:00
Rémi Bernon 07b9f3f609 user32: Factor IsRectEmpty driver check in ShowWindow.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-17 20:37:04 +02:00
Zhiyi Zhang c5ed4893b3 user32/tests: Add display DC color depth tests.
Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-17 20:35:05 +02:00
Zhiyi Zhang a92ab08688 winex11.drv: Support reporting emulated display depth.
Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-17 20:35:01 +02:00
Zhiyi Zhang cad102465d user32/tests: Do not change adapters to every available modes.
This reduce the time to run the monitor test from 6 minutes to 25 seconds.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50086
Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-17 20:32:05 +02:00
Zhiyi Zhang ce72f9b426 user32: Use wait_graphics_driver_ready() in load_desktop_driver().
So that Wine doesn't have to send an extra WM_NULL message when
wait_graphics_driver_ready() is later called in
EnumDisplayDevicesW(). Also, it avoids a deadlock when
wait_graphics_driver_ready() is used in later patches.

Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-14 21:29:17 +02:00
Rémi Bernon acecfc6336 user32/tests: Recreate the window to make it more likely to have focus.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-14 20:56:10 +02:00
Rémi Bernon 516c7e0dd8 user32/tests: Initialize the cursor position in test_GetRawInputBuffer.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-14 20:56:08 +02:00
Rémi Bernon 1cfc34551e user32/tests: Skip inconsistent OemKeyScan tests on non-us keyboard.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-14 20:56:05 +02:00
Rémi Bernon 2735496872 user32: Update keyboard / mouse rawinput device paths.
Instead of just updating the info.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-13 10:49:14 +02:00
Rémi Bernon 4e956dc0fe server: Implement WM_INPUT_DEVICE_CHANGE message dispatch.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-11 21:51:46 +02:00
Rémi Bernon 371be0bc1c server: Add support for RIDEV_DEVNOTIFY rawinput flag.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2021-05-11 21:51:42 +02:00