forked from Mirrors/wine-wine
Compare commits
97 Commits
Author | SHA1 | Date |
---|---|---|
Michael Stefaniuc | 6ed1d04b13 | |
Gijs Vermeulen | 515c1f7cb2 | |
Michael Stefaniuc | 23cb4f7942 | |
Matteo Bruni | 7ee7bb0430 | |
Akihiro Sagawa | 3fbf668ae2 | |
Mingcong Bai | bdee4b1ec2 | |
Lauri Kenttä | f8ecc7fa65 | |
Aurimas Fišeras | eb491f23cb | |
Daniel Lehman | 668fd9f4b6 | |
Daniel Lehman | 59f58f02a4 | |
Daniel Lehman | dff634c8cf | |
Lauri Kenttä | 98ea3e0df1 | |
Aurimas Fišeras | 29413a5461 | |
Daniel Lehman | c71785db01 | |
Aurimas Fišeras | 8d251f02df | |
Daniel Lehman | 627f01947d | |
Henri Verbeet | 0813ec9c91 | |
Sven Baars | 1653bff666 | |
Piotr Caban | 37a1205885 | |
Piotr Caban | 3b2dc114fb | |
Piotr Caban | 7c113aff87 | |
Zebediah Figura | f35542ec2e | |
Jacek Caban | 663cbd7fd5 | |
Nikolay Sivov | 61eb313094 | |
Nikolay Sivov | ba06f2fb19 | |
Kevin Puetz | 37d3edf9c9 | |
Aaro Altonen | fd6fe42003 | |
Paul Gofman | aa74261560 | |
Paul Gofman | 1a4eba2353 | |
Piotr Caban | b728f57616 | |
Chip Davis | bac4e49570 | |
Lukáš Horáček | f952d8ab10 | |
Brendan Shanks | c6bdad85e3 | |
Zhiyi Zhang | 9b35837e37 | |
Jefferson Carpenter | 40e27f9836 | |
Piotr Caban | 7db96d3e14 | |
Roman Pišl | b3da036c2e | |
Paul Gofman | ff4fc1c862 | |
Francois Gouget | ad4516ff51 | |
Zebediah Figura | d133d9c820 | |
Akihiro Sagawa | 0a0bdbf1dc | |
Akihiro Sagawa | db754f0f18 | |
Alistair Leslie-Hughes | eb510fa5aa | |
Aaro Altonen | 4e884779ff | |
Aaro Altonen | a7549d9df7 | |
Damjan Jovanovic | 79b2c4a97d | |
Paul Gofman | 3020b07c4b | |
Alistair Leslie-Hughes | b4c777d165 | |
Hans Leidekker | 6fc30a3235 | |
Dmitry Timoshkov | 6961e627c1 | |
Dmitry Timoshkov | 9e2ca4bae5 | |
Brendan Shanks | c2a28685d9 | |
Brendan Shanks | 4aaa9196cd | |
Brendan Shanks | c683d7dcea | |
Roman Pišl | 0d85e007b9 | |
Alexandre Julliard | d715810b3f | |
Rémi Bernon | 2fc491c389 | |
Roman Pišl | afba948ba9 | |
Olivier F. R. Dierick | 30453bc1b1 | |
Paul Gofman | ca227f4770 | |
Paul Gofman | 1ac99798f4 | |
Nikolay Sivov | 8ba69d9a02 | |
Nikolay Sivov | 5d489c26e4 | |
Piotr Caban | 81cca6bb78 | |
Vijay Kiran Kamuju | 797c80adff | |
Vijay Kiran Kamuju | 4227dcb721 | |
Vijay Kiran Kamuju | 4b7e8339b2 | |
Dirk Niggemann | c7befdbcc7 | |
Zebediah Figura | 09e9cf281c | |
Alistair Leslie-Hughes | c8044aef1f | |
Michael Müller | b7958fb0a8 | |
Piotr Caban | 446daec1f5 | |
Piotr Caban | 99c683af96 | |
Piotr Caban | ea66b05c2b | |
Piotr Caban | 1cd091e6c1 | |
Piotr Caban | bfd41ed7a9 | |
Nikolay Sivov | 51c7d18007 | |
Dmitry Timoshkov | fb1f78d982 | |
Alexandre Julliard | d2582c1d66 | |
Zebediah Figura | 84fb913dd1 | |
Zebediah Figura | 5b2a6414ae | |
Giovanni Mascellani | 1a985ae8d6 | |
Dmitry Timoshkov | a5d8012e3d | |
Gerald Pfeifer | 80df6fed6a | |
Michael Cronenworth | a01ae837f8 | |
Michael Cronenworth | 0c934a8474 | |
Michael Cronenworth | 8405a5ebba | |
Michael Cronenworth | d03186481f | |
Michael Cronenworth | 0503b5835b | |
Michael Cronenworth | d42cb277d0 | |
Michael Cronenworth | 5f11f35ad0 | |
Michael Cronenworth | df434090e3 | |
Michael Cronenworth | b80892d1f0 | |
Michael Cronenworth | d36e0fa240 | |
Michael Cronenworth | e1e1c7ed4c | |
Michael Cronenworth | 94b6a19772 | |
Gerald Pfeifer | 483e26259b |
628
ANNOUNCE
628
ANNOUNCE
|
@ -1,25 +1,14 @@
|
||||||
The Wine team is proud to announce that the stable release Wine 5.0
|
The Wine maintenance release 5.0.1 is now available.
|
||||||
is now available.
|
|
||||||
|
|
||||||
This release represents a year of development effort and over 7,400
|
What's new in this release (see below for details):
|
||||||
individual changes. It contains a large number of improvements that
|
- Fix compilation with gcc 10
|
||||||
are listed in the release notes below. The main highlights are:
|
- Add some timezones
|
||||||
|
- Various bug fixes
|
||||||
- Builtin modules in PE format.
|
|
||||||
- Multi-monitor support.
|
|
||||||
- XAudio2 reimplementation.
|
|
||||||
- Vulkan 1.1 support.
|
|
||||||
|
|
||||||
This release is dedicated to the memory of Józef Kucia, who passed
|
|
||||||
away in August 2019 at the young age of 30. Józef was a major
|
|
||||||
contributor to Wine's Direct3D implementation, and the lead developer
|
|
||||||
of the vkd3d project. His skills and his kindness are sorely missed by
|
|
||||||
all of us.
|
|
||||||
|
|
||||||
The source is available from the following locations:
|
The source is available from the following locations:
|
||||||
|
|
||||||
https://dl.winehq.org/wine/source/5.0/wine-5.0.tar.xz
|
https://dl.winehq.org/wine/source/5.0/wine-5.0.1.tar.xz
|
||||||
http://mirrors.ibiblio.org/wine/source/5.0/wine-5.0.tar.xz
|
http://mirrors.ibiblio.org/wine/source/5.0/wine-5.0.1.tar.xz
|
||||||
|
|
||||||
Binary packages for various distributions will be available from:
|
Binary packages for various distributions will be available from:
|
||||||
|
|
||||||
|
@ -35,393 +24,220 @@ AUTHORS in the distribution for the complete list.
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
What's new in Wine 5.0
|
Bugs fixed in 5.0.1 (total 37):
|
||||||
======================
|
|
||||||
|
36059 Multiple Steam games fail to install DirectX runtime prerequisite, resulting in repeated install attempt on startup ('xinput1_3.dll' locked by client)
|
||||||
|
42038 Cannot scroll documents being compared in winmerge (Followup to bug 20695)
|
||||||
*** PE modules
|
42585 Final Fantasy V Corrupt Fonts
|
||||||
|
45049 Multiple programs need d2d1 CreateRoundedRectangleGeometry (playchessV7, Paint.Net 4.*)
|
||||||
- Most modules are built in PE format (Portable Executable, the
|
45481 Spintires: MudRunner crashes at launch
|
||||||
Windows binary format) instead of ELF when the MinGW compiler is
|
46005 Multiple games and applications fail due to missing interface proxy information in registry (oleautomation/dual interfaces referenced in coclass section inside of library block)
|
||||||
available. This helps various copy protection schemes that check
|
46735 Multiple applications need Direct3DShaderValidatorCreate9() implementation (The Sims 2 demo, Armed Assault)
|
||||||
that the on-disk and in-memory contents of system modules are
|
47288 Gaea 1.0.19 (.NET 4.7 WPF app) diagnostic tool 'Watson.exe' crashes due to 'kernel32.SetConsoleScreenBufferInfoEx' stub
|
||||||
identical.
|
47668 Logos 8 (.NET/WPF 4.7.2 application) fails to download resources (needs ReOpenFile implementation)
|
||||||
|
48018 QuickTime 7.0.x installer fails, 'rundll32.exe "C:\Program Files (x86)\QuickTime\QTSystem\QTJava.dll,QTPostInstallProc"' crashes due to invalid cdecl dll entry
|
||||||
- The actual PE binaries are copied into the Wine prefix instead of
|
48338 DIB images with bpp <= 8 get wrong palette when converted to GpBitmap
|
||||||
the fake DLL files. This makes the prefix look more like a real
|
48371 Home Designer Suite 21.3.1.1x64 reports "Error #272000009 A serious error occurred (SEH)."
|
||||||
Windows installation, at the cost of some extra disk space.
|
48386 Some CPU features are not reported for Intel CPU (Detroit: Become Human is affected)
|
||||||
|
48387 User shared data area should have NumberOfPhysicalPages field filled in (used by Detroit: Become Human)
|
||||||
- Modules that have been converted to PE can use standard wide-char C
|
48480 dlls/krnl386.exe16 - thunk.c argument logic incorrect for CallProcEx32W16
|
||||||
functions, as well as wide-char character constants like L"abc".
|
48484 winecfg doesn't allow disabling Desktop Integration for Downloads
|
||||||
This makes the code easier to read.
|
48491 _searchenv & co do not understand quoted directories
|
||||||
|
48510 Lotus Organizer 97 crashes when selecting a Backup folder using 'Browse' button
|
||||||
- Not all modules have been converted to PE yet; this is an ongoing
|
48549 Arma Cold War Assault: Cursor stuck at low fps since Wine 5.0-rc6
|
||||||
process that will continue during the Wine 5.x development series.
|
48557 Multiple installers crash (Hot Wired, Croc installer) : Setup is unable to initialize the language dialogbox: Error 106
|
||||||
|
48561 Cadence Allegro Professional 16.6 crashes at startup
|
||||||
- The Wine C runtime is updated to support linking to MinGW-compiled
|
48569 Infinite drag & drop loop crashes WinSCP
|
||||||
binaries; it is used by default instead of the MinGW runtime when
|
48571 Firefox 72.0.* crashes on every tab (unless dwrite is disabled)
|
||||||
building DLLs.
|
48577 DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY and other enums are the wrong size
|
||||||
|
48580 Discord connecting to voice needs unimplemented function qwave.dll.QOSAddSocketToFlow
|
||||||
|
48594 AnyDesk crashes directly on startup (low WORD of instance handle must be ignored when looking up window classes)
|
||||||
*** Graphics
|
48635 Asuka 120% Return BURNING Fest: Crashes after character selection.
|
||||||
|
48639 Shrew Soft VPN client needs setupapi.dll.SetupDiGetSelectedDriverA()
|
||||||
- Multiple display adapters and monitors are properly supported,
|
48646 QQMusicAgent crashes when started after installation
|
||||||
including dynamic configuration changes.
|
48648 Gothic II Night of the Raven:unhandled exception in Wine 5.2
|
||||||
|
48664 kernel32:process - Intermittent test_Toolhelp() failure
|
||||||
- The Vulkan driver supports up to version 1.1.126 of the Vulkan spec.
|
48669 iphlpapi.NotifyUnicastIpAddressChange() should call the callback initially if requested (required for Far Cry 5 online mode)
|
||||||
|
48694 The Bat! (64bit) crashes right after start
|
||||||
- The WindowsCodecs library is able to convert more bitmap formats,
|
48706 Wineconsole freezes when restoring from minimized to maximized window
|
||||||
including palette-indexed formats.
|
48723 Torchlight - Loading times are excessively long
|
||||||
|
48735 Wine builtin services.exe process_send_command: OVERLAPPED struct for control pipe has uninitialized Offset and OffsetHigh fields
|
||||||
|
48846 msvcr90/tests/msvcr90.c: error: variadic functions must use the base AAPCS variant
|
||||||
*** Direct3D
|
|
||||||
|
----------------------------------------------------------------
|
||||||
- Fullscreen Direct3D applications inhibit the screensaver.
|
|
||||||
|
Changes since 5.0:
|
||||||
- DXGI swapchain presents inform the application when the
|
|
||||||
corresponding window is minimized. This typically allows
|
Aaro Altonen (3):
|
||||||
applications to reduce CPU usage while minimized, and is in some
|
kernel32/tests: Add tests for SetConsoleScreenBufferInfoEx().
|
||||||
cases required to allow the application window to be restored again.
|
kernelbase: Implement SetConsoleScreenBufferInfoEx().
|
||||||
|
urlmon: Add URLOpenPullStreamW() stub.
|
||||||
- Switching between fullscreen and windowed modes using the standard
|
|
||||||
Alt+Enter combination is implemented for DXGI applications.
|
Akihiro Sagawa (3):
|
||||||
|
dsound/tests: Add a test whether the buffer is a valid global memory.
|
||||||
- The following features are implemented for Direct3D 12 applications:
|
dsound: Make GlobalHandle() for the sound buffer failed.
|
||||||
- Switching between fullscreen and windowed.
|
po: Update Japanese translation.
|
||||||
- Changing display modes.
|
|
||||||
- Scaled presents.
|
Alexandre Julliard (2):
|
||||||
- Swap intervals.
|
rundll32: Add wrapper to call entry point on i386.
|
||||||
These features were previously already implemented for earlier
|
ver: Use the 16-bit resource function in GetFileVersionInfo16().
|
||||||
versions of the Direct3D API.
|
|
||||||
|
Alistair Leslie-Hughes (3):
|
||||||
- The handling of various edge cases is improved. Among others:
|
d3dx9: Implement D3DXCreateKeyframedAnimationSet.
|
||||||
- Out of range reference values for the alpha and stencil tests.
|
dmstyle: IDirectMusicStyle8 GetDefaultBand return S_FALSE.
|
||||||
- Sampling 2D resources with 3D samplers and vice versa.
|
qwave: Add QOSAddSocketToFlow stub.
|
||||||
- Drawing with mapped textures and buffers.
|
|
||||||
- Usage of invalid DirectDraw clipper objects.
|
Aurimas Fišeras (3):
|
||||||
- Creating Direct3D devices on invalid Windows, like the desktop
|
po: Update Lithuanian translation.
|
||||||
window.
|
po: Update Lithuanian translation.
|
||||||
- Viewports with a minimum Z larger than or equal to the maximum Z.
|
po: Update Lithuanian translation.
|
||||||
- Resources bound through both shader-resource views and
|
|
||||||
render-target or depth-stencil views at the same time.
|
Brendan Shanks (4):
|
||||||
- Blits between formats with and without alpha components.
|
include: Fix size of DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY enum.
|
||||||
Since well-behaved applications don't rely on these edge cases, they
|
include: Fix size of tomConstants enum.
|
||||||
typically only affect one or two applications each. There are
|
include: Fix size of RecordCreateOptionsEnum.
|
||||||
nevertheless quite a number of them.
|
wined3d: Add GPU information for NVIDIA GeForce GTX 1060 3GB.
|
||||||
|
|
||||||
- Dirty texture regions are tracked more accurately for Direct3D 8 and 9
|
Charles Davis (1):
|
||||||
texture uploads.
|
msvcrt: Correct return value of ___mb_cur_max_l_func().
|
||||||
|
|
||||||
- Uploads of S3TC-compressed 3D textures require less address space.
|
Damjan Jovanovic (1):
|
||||||
Since 3D textures can be potentially large, and address space
|
gdiplus: In CompositingModeSourceCopy, fully transparent pixels are drawn black.
|
||||||
exhaustion is a concern for 32-bit applications, S3TC-compressed 3D
|
|
||||||
textures are uploaded per-slice, instead of in a single upload.
|
Daniel Lehman (5):
|
||||||
|
tzres: Add Haiti Time Zone.
|
||||||
- The ID3D11Multithread interface is implemented.
|
tzres: Add Aleutian Time Zone.
|
||||||
|
loader: Add Chatham Islands Standard Time Zone.
|
||||||
- Various lighting calculation fixes and improvements for older
|
loader: Add Bougainville Standard Time Zone.
|
||||||
DirectDraw applications have been made.
|
loader: Add Marquesas Standard Time Zone.
|
||||||
|
|
||||||
- Limited support for blits across swapchains is implemented.
|
Dirk Niggemann (1):
|
||||||
|
krnl386.exe: Make CallProcEx32W16 clear CPEX_DEST_CDECL flag before looping over arguments.
|
||||||
- More shader reflection APIs are implemented.
|
|
||||||
|
Dmitry Timoshkov (4):
|
||||||
- The wined3d CPU blitter can handle compressed source resources.
|
schedsvc/tests: Fix compilation with recent gcc/clang versions.
|
||||||
Support for compressed destination resources was already implemented
|
gdiplus: Reimplement GdipCreateBitmapFromGdiDib by using GdipCreateBitmapFromHBITMAP.
|
||||||
in a previous release.
|
user32/tests: Add some tests for classes with non-zero low word instance.
|
||||||
|
server: Ignore low word of a class instance when looking up for a window class.
|
||||||
- The Direct3D graphics card database recognizes more graphics cards.
|
|
||||||
|
François Gouget (1):
|
||||||
- New HKEY_CURRENT_USER\Software\Wine\Direct3D registry keys:
|
kernel32/tests: Fix test_Toolhelp()'s nested process lookup.
|
||||||
- "shader_backend" (REG_SZ)
|
|
||||||
The shader backend to use. Possible values are "glsl" (default)
|
Gerald Pfeifer (2):
|
||||||
for GLSL, "arb" for ARB vertex/fragment programs and "none" to
|
winedump: Add a default case to numeric_leaf().
|
||||||
disable shader support.
|
msi: Properly declare variables in msi/tests/utils.h as extern.
|
||||||
- "strict_shader_math" (REG_DWORD)
|
|
||||||
Enable (0x1) or disable (0x0, default) stricter translation of
|
Gijs Vermeulen (1):
|
||||||
Direct3D shaders, potentially at a performance cost. This
|
kernelbase: Set req->mask in SetConsoleScreenBufferInfoEx.
|
||||||
currently only makes a difference with the default GLSL shader
|
|
||||||
backend in combination with the proprietary NVIDIA drivers.
|
Giovanni Mascellani (1):
|
||||||
|
d2d1: Implement rounded rectangle drawing.
|
||||||
- Deprecated HKEY_CURRENT_USER\Software\Wine\Direct3D registry key:
|
|
||||||
- "UseGLSL"
|
Hans Leidekker (1):
|
||||||
This has been superseded by the "shader_backend" setting above.
|
wbemprox: Implement Win32_DesktopMonitor.Name.
|
||||||
|
|
||||||
|
Henri Verbeet (1):
|
||||||
*** D3DX
|
wined3d: Properly validate the stage index in wined3d_stateblock_set_texture_stage_state() (Coverity).
|
||||||
|
|
||||||
- Support for compressing textures using S3TC-compression is
|
Jacek Caban (1):
|
||||||
implemented.
|
rpcrt4: Use MustFree for all non-base types in get_param_pointer_info.
|
||||||
|
|
||||||
- Various operations, like e.g. texture fills, on unmappable surfaces
|
Jefferson Carpenter (1):
|
||||||
are implemented more correctly. Previously their implementation
|
services: Initialize OVERLAPPED Offset and OffsetHigh.
|
||||||
relied on the underlying Direct3D implementation not enforcing
|
|
||||||
mapping restrictions.
|
Kevin Puetz (1):
|
||||||
|
rpcrt4: Fix ITypeInfo leak in get_iface_info.
|
||||||
- Various improvements and fixes have been made to the effect
|
|
||||||
framework.
|
Lauri Kenttä (2):
|
||||||
|
po: Update Finnish translation.
|
||||||
|
po: Update Finnish translation.
|
||||||
*** Kernel
|
|
||||||
|
Lukáš Horáček (1):
|
||||||
- Most of the functions that used to be in Kernel32 are moved to
|
wined3d: Add GTX 1660 SUPER as a card.
|
||||||
KernelBase, to follow the architecture of recent Windows versions.
|
|
||||||
|
Matteo Bruni (1):
|
||||||
- Libraries of the wrong 32/64-bitness are ignored when found in the
|
maintainers: Drop Józef Kucia.
|
||||||
search path, to enable loading the correct one if it's found further
|
|
||||||
in the path.
|
Michael Cronenworth (12):
|
||||||
|
crypt32: Global variable compatibility update for gcc 10.
|
||||||
- Kernel objects are better emulated for device drivers that expect to
|
dsound: Global variable compatibility update for gcc 10.
|
||||||
manipulate objects from the kernel side.
|
mshtml: Global variable compatibility update for gcc 10.
|
||||||
|
secur32: Global variable compatibility update for gcc 10.
|
||||||
- The kernel-level synchronization objects like spin locks, fast
|
winebus: Global variable compatibility update for gcc 10.
|
||||||
mutexes, remove locks, and resource variables are implemented.
|
wbemprox: Global variable compatibility update for gcc 10.
|
||||||
|
xinput: Global variable compatibility update for gcc 10.
|
||||||
- The system battery state is properly reported to applications.
|
twain_32: Global variable compatibility update for gcc 10.
|
||||||
|
msi: Global variable compatibility update for gcc 10.
|
||||||
|
webservices: Global variable compatibility update for gcc 10.
|
||||||
*** User interface
|
gphoto2.ds: Global variable compatibility update for gcc 10.
|
||||||
|
sane.ds: Global variable compatibility update for gcc 10.
|
||||||
- Minimized windows are displayed using their title bar instead of the
|
|
||||||
old Windows 3.1-style icons.
|
Michael Müller (1):
|
||||||
|
setupapi: Implement SP_COPY_IN_USE_NEEDS_REBOOT.
|
||||||
- The new button styles Split Buttons and Command Links are
|
|
||||||
implemented.
|
Michael Stefaniuc (1):
|
||||||
|
tools: Get the ANNOUNCE bug list from the stable-notes git notes.
|
||||||
- The Edit control sets margins correctly also for CJK fonts.
|
|
||||||
|
Mingcong Bai (1):
|
||||||
|
po: Update Simplified Chinese translation.
|
||||||
*** Desktop integration
|
|
||||||
|
Nikolay Sivov (5):
|
||||||
- Symbolic links to the corresponding Unix directories are created for
|
ucrtbase: Add _query_new_handler() and _query_new_mode().
|
||||||
the 'Downloads' and 'Templates' folders.
|
dwrite: Add partial implementation for IDWriteFontFaceReference1::CreateFontFace().
|
||||||
|
user32: Improve window state handling in SetScrollInfo().
|
||||||
|
ole32: Fix a leak when creating pointer moniker through activation.
|
||||||
*** Input devices
|
ole32: Fix a leak when creating antimoniker through activation.
|
||||||
|
|
||||||
- Plug & Play device drivers can be installed and loaded on startup.
|
Olivier F. R. Dierick (1):
|
||||||
|
winecfg: Add Downloads and Templates to shell folders UI interface.
|
||||||
- Game controllers are better supported, including proper support for
|
|
||||||
hat switch, wheel, gas and brake controls.
|
Paul Gofman (6):
|
||||||
|
ntdll: Fill NumberOfPhysicalPages field in user shared data area.
|
||||||
- The old joystick API of Linux versions earlier than 2.2 is no longer
|
ntdll: Report rdtsc processor feature if supported.
|
||||||
supported.
|
iphlpapi: Support InitialNotification flag in NotifyUnicastIpAddressChange().
|
||||||
|
ntdll: Zero init reg_tzi in find_reg_tz_info().
|
||||||
|
include: Add Vista+ PEB_LDR_DATA structure fields.
|
||||||
*** .NET
|
wined3d: Support sRGB reads for WINED3DFMT_B5G6R5_UNORM.
|
||||||
|
|
||||||
- The Mono engine is updated to version 4.9.4, including parts of the
|
Piotr Caban (11):
|
||||||
Windows Presentation Foundation (WPF) framework.
|
msvcrt: Add support for quoted paths in _searchenv.
|
||||||
|
msvcrt: Add support for quoted paths in _searchenv_s.
|
||||||
- The Gecko and Mono add-ons support shared installation, where the
|
msvcrt: Don't duplicate _searchenv_s code in _searchenv.
|
||||||
files are used directly from a global location under /usr/share/wine
|
msvcrt: Add support for quoted paths in _wsearchenv_s.
|
||||||
instead of being copied into every new prefix.
|
msvcrt: Don't duplicate _wsearchenv_s code in _wsearchenv.
|
||||||
|
msvcp90: Don't pass NULL as reference in runtime_error and logic_error constructors.
|
||||||
|
msvcrt: Optimize _strnicmp_l implementation.
|
||||||
*** Internet and networking
|
msvcr90/tests: Fix swscanf tests compilation on arm.
|
||||||
|
winemac: Fix leaks in macdrv_surface_destroy.
|
||||||
- The Gecko engine is refreshed to support recent toolchains.
|
gdiplus: Fix gdi handles leak in GdipMeasureCharacterRanges.
|
||||||
|
gdiplus: Fix leak in SOFTWARE_GdipDrawDriverString.
|
||||||
- A number of new HTML APIs are implemented.
|
|
||||||
|
Roman Pišl (3):
|
||||||
- MSHTML supports some SVG elements.
|
shell32: Avoid crash on WM_WINDOWPOSCHANGING in BrsFolderDlgProc.
|
||||||
|
ole32: Avoid calling QueryContinueDrag recursively.
|
||||||
- Error object and exception propagation are supported in VBScript.
|
wineconsole: Allow maximization.
|
||||||
|
|
||||||
- A number of VBScript builtin functions are implemented.
|
Rémi Bernon (1):
|
||||||
|
dinput: Increase device buffer size to 1024.
|
||||||
- JScript EcmaScript compliant mode is extended to support more
|
|
||||||
features.
|
Sven Baars (1):
|
||||||
|
wined3d: Avoid accessing freed memory in wined3d_view_gl_destroy() (Valgrind).
|
||||||
- JScript and VBScript script objects expose type info interfaces.
|
|
||||||
|
Vijay Kiran Kamuju (3):
|
||||||
- The HTTP proxy configuration can be retrieved through DHCP.
|
include: Add missing defines to icm.h.
|
||||||
|
mscms: Add stub for WcsGetDefaultColorProfileSize.
|
||||||
- Passport HTTP redirects are supported.
|
mscms: Add stub for WcsGetDefaultRenderingIntent.
|
||||||
|
|
||||||
- The HTTP service and corresponding client-side library (HTTPAPI) are
|
Zebediah Figura (5):
|
||||||
partially implemented.
|
widl: Output a registry script for all interfaces written into the typelib.
|
||||||
|
kernelbase: Implement ReOpenFile().
|
||||||
|
d3d9: Return a stub interface from Direct3DShaderValidatorCreate9().
|
||||||
*** Cryptography
|
setupapi: Implement SetupDiGetSelectedDriver().
|
||||||
|
ddraw: Avoid leaking the primary stateblock.
|
||||||
- ECC (elliptic-curve) keys are supported when using GnuTLS.
|
|
||||||
|
Zhiyi Zhang (1):
|
||||||
- Importing keys and certificates from PFX blobs is implemented.
|
wined3d: Add GPU information for NVIDIA GeForce GTX 1650 SUPER.
|
||||||
|
|
||||||
- The PBKDF2 key derivation algorithm is supported.
|
|
||||||
|
|
||||||
|
|
||||||
*** Text and fonts
|
|
||||||
|
|
||||||
- OpenType positioning features are supported in DirectWrite, and
|
|
||||||
enabled for Latin script by default, including kerning.
|
|
||||||
|
|
||||||
- Font data access is made safer by validating the various data tables
|
|
||||||
before using them.
|
|
||||||
|
|
||||||
- DirectWrite interfaces are updated to a recent SDK, implementing
|
|
||||||
some of the latest API additions.
|
|
||||||
|
|
||||||
|
|
||||||
*** Audio / Video
|
|
||||||
|
|
||||||
- The XAudio2 libraries are reimplemented to use the external FAudio
|
|
||||||
library, for better compatibility.
|
|
||||||
|
|
||||||
- The Media Foundation libraries are fleshed out, including:
|
|
||||||
- Support for builtin and user async work queues.
|
|
||||||
- Ability to submit periodic callbacks, waiting, scheduled, and
|
|
||||||
regular work items, with support for item priority.
|
|
||||||
- Support for media event queues.
|
|
||||||
- Various core API to handle media type objects, stream and
|
|
||||||
presentation descriptors, object attributes, byte stream objects,
|
|
||||||
samples and buffers.
|
|
||||||
- Initial Source Resolver implementation.
|
|
||||||
- Initial implementation of Source Reader API.
|
|
||||||
- Implementation for Sample Grabber object.
|
|
||||||
- Core support for building topology objects.
|
|
||||||
- Builtin presentation clock implementation, started implementing
|
|
||||||
Media Session functionality.
|
|
||||||
|
|
||||||
- The video capture filter has been ported to use v4l2 instead of the
|
|
||||||
deprecated v4l1 API, allowing the use of some cameras which do not
|
|
||||||
support v4l1.
|
|
||||||
|
|
||||||
- Support for YUV to RGB translation and reading from v4l2 devices
|
|
||||||
using mmap() has been removed; we now depend on libv4l2 for both of
|
|
||||||
these things.
|
|
||||||
|
|
||||||
- The builtin AVI, MPEG-I, and WAVE decoders have been removed; we now
|
|
||||||
depend on GStreamer or the Mac QuickTime Toolkit to decode such
|
|
||||||
media files.
|
|
||||||
|
|
||||||
- Some more VMR7 configuration APIs are implemented.
|
|
||||||
|
|
||||||
- The sound drivers support per-channel volume adjustments.
|
|
||||||
|
|
||||||
|
|
||||||
*** Internationalization
|
|
||||||
|
|
||||||
- Unicode character tables are based on version 12.1.0 of the Unicode
|
|
||||||
Standard.
|
|
||||||
|
|
||||||
- Unicode normalization is implemented.
|
|
||||||
|
|
||||||
- The geographic region id is automatically set in the registry based
|
|
||||||
on the current locale. It can be modified if necessary under
|
|
||||||
HKEY_CURRENT_USER\Control Panel\International\Geo.
|
|
||||||
|
|
||||||
- The Sinhalese and Asturian locales are supported.
|
|
||||||
|
|
||||||
- Codepage 28601 (Latin/Thai) is supported.
|
|
||||||
|
|
||||||
|
|
||||||
*** RPC/COM
|
|
||||||
|
|
||||||
- The typelib marshaller supports complex structs and arrays.
|
|
||||||
|
|
||||||
- There is an initial implementation of the Windows Script runtime
|
|
||||||
library.
|
|
||||||
|
|
||||||
- There is an initial implementation of the Microsoft ActiveX Data
|
|
||||||
Objects (ADO) library.
|
|
||||||
|
|
||||||
|
|
||||||
*** Installers
|
|
||||||
|
|
||||||
- Microsoft Installer (MSI) Patch Files are supported.
|
|
||||||
|
|
||||||
- The WUSA tool (Windows Update Standalone Installer) supports
|
|
||||||
installing .MSU update files.
|
|
||||||
|
|
||||||
|
|
||||||
*** ARM platforms
|
|
||||||
|
|
||||||
- Exception unwinding is implemented for ARM64, using the libunwind
|
|
||||||
library.
|
|
||||||
|
|
||||||
- OLE stubless proxies are supported on ARM64.
|
|
||||||
|
|
||||||
|
|
||||||
*** Development tools / Winelib
|
|
||||||
|
|
||||||
- The Visual Studio remote debugger can be used to debug applications
|
|
||||||
running under Wine.
|
|
||||||
|
|
||||||
- The Debug Engine library (DBGENG) is partially implemented.
|
|
||||||
|
|
||||||
- Binaries built for a Windows target no longer depend on the libwine
|
|
||||||
library, to enable them to run on Windows without any extra
|
|
||||||
dependencies. The libwine library is no longer built for Windows at
|
|
||||||
all.
|
|
||||||
|
|
||||||
- The Resource Compiler and IDL Compiler support a '--sysroot' option
|
|
||||||
to allow locating header files in cross-compile environments.
|
|
||||||
|
|
||||||
- Winegcc supports the options '--target', '--wine-objdir',
|
|
||||||
'--winebuild' and '-fuse-ld' that make it easier to use as a
|
|
||||||
cross-compiler, or with custom toolchains.
|
|
||||||
|
|
||||||
- The wine/unicode.h header is no longer available to applications,
|
|
||||||
since the functions will ultimately be removed and replaced by the
|
|
||||||
standard C runtime wide character functions.
|
|
||||||
|
|
||||||
|
|
||||||
*** Build infrastructure
|
|
||||||
|
|
||||||
- Test binaries are built in PE format if MinGW is available, so the
|
|
||||||
same test binary can run on both Wine and Windows. The 'crosstest'
|
|
||||||
make target is no longer needed or supported.
|
|
||||||
|
|
||||||
- The 'fastcall' calling convention is supported in spec files. It
|
|
||||||
uses the correct name mangling for Windows builds.
|
|
||||||
|
|
||||||
- A '-import' entry point flag is supported in spec files, to mark
|
|
||||||
functions that need a hotpatch code prefix to be generated for their
|
|
||||||
import thunks.
|
|
||||||
|
|
||||||
- Winebuild supports a '--builtin' option to add a special signature
|
|
||||||
to PE binaries to mark them as Wine builtins.
|
|
||||||
|
|
||||||
|
|
||||||
*** Builtin applications
|
|
||||||
|
|
||||||
- The CHCP tool is implemented. It allows setting the console codepage.
|
|
||||||
|
|
||||||
- The MSIDB tool is implemented. It allows manipulating MSI databases.
|
|
||||||
|
|
||||||
|
|
||||||
*** Performance improvements
|
|
||||||
|
|
||||||
- The various time functions use higher performance system clocks if
|
|
||||||
available, to reduce the overhead in the rendering loop of many
|
|
||||||
games.
|
|
||||||
|
|
||||||
- File lookups take advantage of the ext4 filesystem case folding
|
|
||||||
support if it's enabled on the directory being searched.
|
|
||||||
|
|
||||||
- No-data style listboxes (LBS_NODATA) have better performance for
|
|
||||||
large numbers of items.
|
|
||||||
|
|
||||||
- Slim Reader/Writer locks, keyed events, and condition variables use
|
|
||||||
futexes on Linux to avoid wineserver round trips.
|
|
||||||
|
|
||||||
|
|
||||||
*** New external dependencies
|
|
||||||
|
|
||||||
- The MinGW-w64 cross-compiler is used to build modules in PE format.
|
|
||||||
|
|
||||||
- The FAudio library is used to implement XAudio2.
|
|
||||||
|
|
||||||
- The Inotify library is used for file change notifications on BSD
|
|
||||||
platforms.
|
|
||||||
|
|
||||||
- The Unwind library is used for exception handling on ARM64.
|
|
||||||
|
|
||||||
- The Video4Linux version 2 library is used instead of version 1.
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
Alexandre Julliard
|
Michael Stefaniuc
|
||||||
julliard@winehq.org
|
mstefani@winehq.org
|
||||||
|
|
3
AUTHORS
3
AUTHORS
|
@ -1,5 +1,6 @@
|
||||||
Wine is available thanks to the work of:
|
Wine is available thanks to the work of:
|
||||||
|
|
||||||
|
Aaro Altonen
|
||||||
Aaron Arvey
|
Aaron Arvey
|
||||||
Aaron Barnes
|
Aaron Barnes
|
||||||
Aaron Brazener
|
Aaron Brazener
|
||||||
|
@ -399,6 +400,7 @@ Diego Nieto Cid
|
||||||
Diego Pettenò
|
Diego Pettenò
|
||||||
Dietmar Kling
|
Dietmar Kling
|
||||||
Dimitrie O. Paun
|
Dimitrie O. Paun
|
||||||
|
Dirk Niggemann
|
||||||
Dirk Thierbach
|
Dirk Thierbach
|
||||||
Divan Burger
|
Divan Burger
|
||||||
Dmitrij Sinukov
|
Dmitrij Sinukov
|
||||||
|
@ -980,6 +982,7 @@ Luis Javier Merino
|
||||||
Luis Sahagun
|
Luis Sahagun
|
||||||
Luiz Otavio L. Zorzella
|
Luiz Otavio L. Zorzella
|
||||||
Lu Jiashu
|
Lu Jiashu
|
||||||
|
Lukáš Horáček
|
||||||
Lukáš Krejčí
|
Lukáš Krejčí
|
||||||
Łukasz Wojniłowicz
|
Łukasz Wojniłowicz
|
||||||
Luke Benstead
|
Luke Benstead
|
||||||
|
|
|
@ -64,7 +64,6 @@ F: dlls/d2d*/
|
||||||
Direct3D
|
Direct3D
|
||||||
M: Henri Verbeet <hverbeet@codeweavers.com>
|
M: Henri Verbeet <hverbeet@codeweavers.com>
|
||||||
P: Stefan Dösinger <stefan@codeweavers.com>
|
P: Stefan Dösinger <stefan@codeweavers.com>
|
||||||
P: Józef Kucia <jkucia@codeweavers.com>
|
|
||||||
P: Matteo Bruni <mbruni@codeweavers.com>
|
P: Matteo Bruni <mbruni@codeweavers.com>
|
||||||
F: dlls/d3d10*/
|
F: dlls/d3d10*/
|
||||||
F: dlls/d3d11/
|
F: dlls/d3d11/
|
||||||
|
@ -80,7 +79,6 @@ Direct3D helper libraries
|
||||||
M: Matteo Bruni <mbruni@codeweavers.com>
|
M: Matteo Bruni <mbruni@codeweavers.com>
|
||||||
P: Henri Verbeet <hverbeet@codeweavers.com>
|
P: Henri Verbeet <hverbeet@codeweavers.com>
|
||||||
P: Stefan Dösinger <stefan@codeweavers.com>
|
P: Stefan Dösinger <stefan@codeweavers.com>
|
||||||
P: Józef Kucia <jkucia@codeweavers.com>
|
|
||||||
F: dlls/d3dcompiler*/
|
F: dlls/d3dcompiler*/
|
||||||
F: dlls/d3dx10*/
|
F: dlls/d3dx10*/
|
||||||
F: dlls/d3dx11*/
|
F: dlls/d3dx11*/
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.69 for Wine 5.0.
|
# Generated by GNU Autoconf 2.69 for Wine 5.0.1.
|
||||||
#
|
#
|
||||||
# Report bugs to <wine-devel@winehq.org>.
|
# Report bugs to <wine-devel@winehq.org>.
|
||||||
#
|
#
|
||||||
|
@ -580,8 +580,8 @@ MAKEFLAGS=
|
||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='Wine'
|
PACKAGE_NAME='Wine'
|
||||||
PACKAGE_TARNAME='wine'
|
PACKAGE_TARNAME='wine'
|
||||||
PACKAGE_VERSION='5.0'
|
PACKAGE_VERSION='5.0.1'
|
||||||
PACKAGE_STRING='Wine 5.0'
|
PACKAGE_STRING='Wine 5.0.1'
|
||||||
PACKAGE_BUGREPORT='wine-devel@winehq.org'
|
PACKAGE_BUGREPORT='wine-devel@winehq.org'
|
||||||
PACKAGE_URL='https://www.winehq.org'
|
PACKAGE_URL='https://www.winehq.org'
|
||||||
|
|
||||||
|
@ -2445,7 +2445,7 @@ if test "$ac_init_help" = "long"; then
|
||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures Wine 5.0 to adapt to many kinds of systems.
|
\`configure' configures Wine 5.0.1 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
|
@ -2515,7 +2515,7 @@ fi
|
||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of Wine 5.0:";;
|
short | recursive ) echo "Configuration of Wine 5.0.1:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
|
@ -2764,7 +2764,7 @@ fi
|
||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
Wine configure 5.0
|
Wine configure 5.0.1
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
|
@ -3448,7 +3448,7 @@ cat >config.log <<_ACEOF
|
||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by Wine $as_me 5.0, which was
|
It was created by Wine $as_me 5.0.1, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
|
@ -21783,7 +21783,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by Wine $as_me 5.0, which was
|
This file was extended by Wine $as_me 5.0.1, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
|
@ -21854,7 +21854,7 @@ _ACEOF
|
||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
Wine config.status 5.0
|
Wine config.status 5.0.1
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@
|
||||||
@ cdecl _heapwalk(ptr) ucrtbase._heapwalk
|
@ cdecl _heapwalk(ptr) ucrtbase._heapwalk
|
||||||
@ cdecl _malloc_base(long) ucrtbase._malloc_base
|
@ cdecl _malloc_base(long) ucrtbase._malloc_base
|
||||||
@ cdecl _msize(ptr) ucrtbase._msize
|
@ cdecl _msize(ptr) ucrtbase._msize
|
||||||
@ stub _query_new_handler
|
@ cdecl _query_new_handler() ucrtbase._query_new_handler
|
||||||
@ stub _query_new_mode
|
@ cdecl _query_new_mode() ucrtbase._query_new_mode
|
||||||
@ cdecl _realloc_base(ptr long) ucrtbase._realloc_base
|
@ cdecl _realloc_base(ptr long) ucrtbase._realloc_base
|
||||||
@ cdecl _recalloc(ptr long long) ucrtbase._recalloc
|
@ cdecl _recalloc(ptr long long) ucrtbase._recalloc
|
||||||
@ cdecl _set_new_mode(long) ucrtbase._set_new_mode
|
@ cdecl _set_new_mode(long) ucrtbase._set_new_mode
|
||||||
|
|
|
@ -152,7 +152,7 @@ BOOL WINAPI CRYPT_AsnEncodePubKeyInfoNoNull(DWORD dwCertEncodingType,
|
||||||
*/
|
*/
|
||||||
HCRYPTPROV WINAPI I_CryptGetDefaultCryptProv(ALG_ID);
|
HCRYPTPROV WINAPI I_CryptGetDefaultCryptProv(ALG_ID);
|
||||||
|
|
||||||
HINSTANCE hInstance DECLSPEC_HIDDEN;
|
extern HINSTANCE hInstance DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
void crypt_oid_init(void) DECLSPEC_HIDDEN;
|
void crypt_oid_init(void) DECLSPEC_HIDDEN;
|
||||||
void crypt_oid_free(void) DECLSPEC_HIDDEN;
|
void crypt_oid_free(void) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -440,6 +440,7 @@ struct d2d_geometry
|
||||||
size_t face_count;
|
size_t face_count;
|
||||||
|
|
||||||
struct d2d_bezier_vertex *bezier_vertices;
|
struct d2d_bezier_vertex *bezier_vertices;
|
||||||
|
size_t bezier_vertices_size;
|
||||||
size_t bezier_vertex_count;
|
size_t bezier_vertex_count;
|
||||||
} fill;
|
} fill;
|
||||||
|
|
||||||
|
@ -483,6 +484,10 @@ struct d2d_geometry
|
||||||
D2D1_RECT_F rect;
|
D2D1_RECT_F rect;
|
||||||
} rectangle;
|
} rectangle;
|
||||||
struct
|
struct
|
||||||
|
{
|
||||||
|
D2D1_ROUNDED_RECT rounded_rect;
|
||||||
|
} rounded_rectangle;
|
||||||
|
struct
|
||||||
{
|
{
|
||||||
ID2D1Geometry *src_geometry;
|
ID2D1Geometry *src_geometry;
|
||||||
D2D_MATRIX_3X2_F transform;
|
D2D_MATRIX_3X2_F transform;
|
||||||
|
@ -499,6 +504,8 @@ struct d2d_geometry
|
||||||
void d2d_path_geometry_init(struct d2d_geometry *geometry, ID2D1Factory *factory) DECLSPEC_HIDDEN;
|
void d2d_path_geometry_init(struct d2d_geometry *geometry, ID2D1Factory *factory) DECLSPEC_HIDDEN;
|
||||||
HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry,
|
HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry,
|
||||||
ID2D1Factory *factory, const D2D1_RECT_F *rect) DECLSPEC_HIDDEN;
|
ID2D1Factory *factory, const D2D1_RECT_F *rect) DECLSPEC_HIDDEN;
|
||||||
|
HRESULT d2d_rounded_rectangle_geometry_init(struct d2d_geometry *geometry,
|
||||||
|
ID2D1Factory *factory, const D2D1_ROUNDED_RECT *rounded_rect) DECLSPEC_HIDDEN;
|
||||||
void d2d_transformed_geometry_init(struct d2d_geometry *geometry, ID2D1Factory *factory,
|
void d2d_transformed_geometry_init(struct d2d_geometry *geometry, ID2D1Factory *factory,
|
||||||
ID2D1Geometry *src_geometry, const D2D_MATRIX_3X2_F *transform) DECLSPEC_HIDDEN;
|
ID2D1Geometry *src_geometry, const D2D_MATRIX_3X2_F *transform) DECLSPEC_HIDDEN;
|
||||||
HRESULT d2d_geometry_group_init(struct d2d_geometry *geometry, ID2D1Factory *factory,
|
HRESULT d2d_geometry_group_init(struct d2d_geometry *geometry, ID2D1Factory *factory,
|
||||||
|
@ -616,8 +623,17 @@ static inline const char *debug_d2d_point_2f(const D2D1_POINT_2F *point)
|
||||||
|
|
||||||
static inline const char *debug_d2d_rect_f(const D2D1_RECT_F *rect)
|
static inline const char *debug_d2d_rect_f(const D2D1_RECT_F *rect)
|
||||||
{
|
{
|
||||||
if (!rect) return "(null)";
|
if (!rect)
|
||||||
return wine_dbg_sprintf("(%.8e,%.8e)-(%.8e,%.8e)", rect->left, rect->top, rect->right, rect->bottom );
|
return "(null)";
|
||||||
|
return wine_dbg_sprintf("(%.8e, %.8e)-(%.8e, %.8e)", rect->left, rect->top, rect->right, rect->bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const char *debug_d2d_rounded_rect(const D2D1_ROUNDED_RECT *rounded_rect)
|
||||||
|
{
|
||||||
|
if (!rounded_rect)
|
||||||
|
return "(null)";
|
||||||
|
return wine_dbg_sprintf("(%.8e, %.8e)-(%.8e, %.8e)[%.8e, %.8e]", rounded_rect->rect.left, rounded_rect->rect.top,
|
||||||
|
rounded_rect->rect.right, rounded_rect->rect.bottom, rounded_rect->radiusX, rounded_rect->radiusY);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __WINE_D2D1_PRIVATE_H */
|
#endif /* __WINE_D2D1_PRIVATE_H */
|
||||||
|
|
|
@ -152,11 +152,27 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_CreateRectangleGeometry(ID2D1Factor
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE d2d_factory_CreateRoundedRectangleGeometry(ID2D1Factory2 *iface,
|
static HRESULT STDMETHODCALLTYPE d2d_factory_CreateRoundedRectangleGeometry(ID2D1Factory2 *iface,
|
||||||
const D2D1_ROUNDED_RECT *rect, ID2D1RoundedRectangleGeometry **geometry)
|
const D2D1_ROUNDED_RECT *rounded_rect, ID2D1RoundedRectangleGeometry **geometry)
|
||||||
{
|
{
|
||||||
FIXME("iface %p, rect %p, geometry %p stub!\n", iface, rect, geometry);
|
struct d2d_geometry *object;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
return E_NOTIMPL;
|
TRACE("iface %p, rounded_rect %s, geometry %p.\n", iface, debug_d2d_rounded_rect(rounded_rect), geometry);
|
||||||
|
|
||||||
|
if (!(object = heap_alloc_zero(sizeof(*object))))
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
if (FAILED(hr = d2d_rounded_rectangle_geometry_init(object, (ID2D1Factory *)iface, rounded_rect)))
|
||||||
|
{
|
||||||
|
WARN("Failed to initialize rounded rectangle geometry, hr %#x.\n", hr);
|
||||||
|
heap_free(object);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("Created rounded rectangle geometry %p.\n", object);
|
||||||
|
*geometry = (ID2D1RoundedRectangleGeometry *)&object->ID2D1Geometry_iface;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE d2d_factory_CreateEllipseGeometry(ID2D1Factory2 *iface,
|
static HRESULT STDMETHODCALLTYPE d2d_factory_CreateEllipseGeometry(ID2D1Factory2 *iface,
|
||||||
|
|
|
@ -2257,6 +2257,14 @@ static BOOL d2d_geometry_outline_add_bezier_segment(struct d2d_geometry *geometr
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL d2d_geometry_outline_add_arc_quadrant(struct d2d_geometry *geometry,
|
||||||
|
const D2D1_POINT_2F *p0, const D2D1_POINT_2F *p1, const D2D1_POINT_2F *p2)
|
||||||
|
{
|
||||||
|
FIXME("Approximating arc quadrant with Bezier curve.\n");
|
||||||
|
|
||||||
|
return d2d_geometry_outline_add_bezier_segment(geometry, p0, p1, p2);
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL d2d_geometry_add_figure_outline(struct d2d_geometry *geometry,
|
static BOOL d2d_geometry_add_figure_outline(struct d2d_geometry *geometry,
|
||||||
struct d2d_figure *figure, D2D1_FIGURE_END figure_end)
|
struct d2d_figure *figure, D2D1_FIGURE_END figure_end)
|
||||||
{
|
{
|
||||||
|
@ -2329,6 +2337,26 @@ static BOOL d2d_geometry_add_figure_outline(struct d2d_geometry *geometry,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL d2d_geometry_fill_add_arc_triangle(struct d2d_geometry *geometry,
|
||||||
|
const D2D1_POINT_2F *p0, const D2D1_POINT_2F *p1, const D2D1_POINT_2F *p2)
|
||||||
|
{
|
||||||
|
struct d2d_bezier_vertex *b;
|
||||||
|
|
||||||
|
FIXME("Approximating arc triangle with Bezier triangle.\n");
|
||||||
|
|
||||||
|
if (!d2d_array_reserve((void **)&geometry->fill.bezier_vertices, &geometry->fill.bezier_vertices_size,
|
||||||
|
geometry->fill.bezier_vertex_count + 3, sizeof(*geometry->fill.bezier_vertices)))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
b = &geometry->fill.bezier_vertices[geometry->fill.bezier_vertex_count];
|
||||||
|
d2d_bezier_vertex_set(&b[0], p0, 0.0f, 0.0f, -1.0f);
|
||||||
|
d2d_bezier_vertex_set(&b[1], p1, 0.5f, 0.0f, -1.0f);
|
||||||
|
d2d_bezier_vertex_set(&b[2], p2, 1.0f, 1.0f, -1.0f);
|
||||||
|
geometry->fill.bezier_vertex_count += 3;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void d2d_geometry_cleanup(struct d2d_geometry *geometry)
|
static void d2d_geometry_cleanup(struct d2d_geometry *geometry)
|
||||||
{
|
{
|
||||||
heap_free(geometry->outline.bezier_faces);
|
heap_free(geometry->outline.bezier_faces);
|
||||||
|
@ -3831,6 +3859,302 @@ fail:
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct d2d_geometry *impl_from_ID2D1RoundedRectangleGeometry(ID2D1RoundedRectangleGeometry *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, struct d2d_geometry, ID2D1Geometry_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_QueryInterface(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
REFIID iid, void **out)
|
||||||
|
{
|
||||||
|
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
|
||||||
|
|
||||||
|
if (IsEqualGUID(iid, &IID_ID2D1RoundedRectangleGeometry)
|
||||||
|
|| IsEqualGUID(iid, &IID_ID2D1Geometry)
|
||||||
|
|| IsEqualGUID(iid, &IID_ID2D1Resource)
|
||||||
|
|| IsEqualGUID(iid, &IID_IUnknown))
|
||||||
|
{
|
||||||
|
ID2D1RoundedRectangleGeometry_AddRef(iface);
|
||||||
|
*out = iface;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
|
||||||
|
|
||||||
|
*out = NULL;
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_AddRef(ID2D1RoundedRectangleGeometry *iface)
|
||||||
|
{
|
||||||
|
struct d2d_geometry *geometry = impl_from_ID2D1RoundedRectangleGeometry(iface);
|
||||||
|
ULONG refcount = InterlockedIncrement(&geometry->refcount);
|
||||||
|
|
||||||
|
TRACE("%p increasing refcount to %u.\n", iface, refcount);
|
||||||
|
|
||||||
|
return refcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_Release(ID2D1RoundedRectangleGeometry *iface)
|
||||||
|
{
|
||||||
|
struct d2d_geometry *geometry = impl_from_ID2D1RoundedRectangleGeometry(iface);
|
||||||
|
ULONG refcount = InterlockedDecrement(&geometry->refcount);
|
||||||
|
|
||||||
|
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
|
||||||
|
|
||||||
|
if (!refcount)
|
||||||
|
{
|
||||||
|
d2d_geometry_cleanup(geometry);
|
||||||
|
heap_free(geometry);
|
||||||
|
}
|
||||||
|
|
||||||
|
return refcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_GetFactory(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
ID2D1Factory **factory)
|
||||||
|
{
|
||||||
|
struct d2d_geometry *geometry = impl_from_ID2D1RoundedRectangleGeometry(iface);
|
||||||
|
|
||||||
|
TRACE("iface %p, factory %p.\n", iface, factory);
|
||||||
|
|
||||||
|
ID2D1Factory_AddRef(*factory = geometry->factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_GetBounds(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
const D2D1_MATRIX_3X2_F *transform, D2D1_RECT_F *bounds)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, transform %p, bounds %p stub!\n", iface, transform, bounds);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_GetWidenedBounds(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
float stroke_width, ID2D1StrokeStyle *stroke_style, const D2D1_MATRIX_3X2_F *transform,
|
||||||
|
float tolerance, D2D1_RECT_F *bounds)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, stroke_width %.8e, stroke_style %p, transform %p, tolerance %.8e, bounds %p stub!\n",
|
||||||
|
iface, stroke_width, stroke_style, transform, tolerance, bounds);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_StrokeContainsPoint(
|
||||||
|
ID2D1RoundedRectangleGeometry *iface, D2D1_POINT_2F point, float stroke_width,
|
||||||
|
ID2D1StrokeStyle *stroke_style, const D2D1_MATRIX_3X2_F *transform, float tolerance, BOOL *contains)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, point %s, stroke_width %.8e, stroke_style %p, transform %p, tolerance %.8e, contains %p stub!\n",
|
||||||
|
iface, debug_d2d_point_2f(&point), stroke_width, stroke_style, transform, tolerance, contains);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_FillContainsPoint(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
D2D1_POINT_2F point, const D2D1_MATRIX_3X2_F *transform, float tolerance, BOOL *contains)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, point %s, transform %p, tolerance %.8e, contains %p stub!\n",
|
||||||
|
iface, debug_d2d_point_2f(&point), transform, tolerance, contains);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_CompareWithGeometry(
|
||||||
|
ID2D1RoundedRectangleGeometry *iface, ID2D1Geometry *geometry,
|
||||||
|
const D2D1_MATRIX_3X2_F *transform, float tolerance, D2D1_GEOMETRY_RELATION *relation)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, geometry %p, transform %p, tolerance %.8e, relation %p stub!\n",
|
||||||
|
iface, geometry, transform, tolerance, relation);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_Simplify(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
D2D1_GEOMETRY_SIMPLIFICATION_OPTION option, const D2D1_MATRIX_3X2_F *transform, float tolerance,
|
||||||
|
ID2D1SimplifiedGeometrySink *sink)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, option %#x, transform %p, tolerance %.8e, sink %p stub!\n",
|
||||||
|
iface, option, transform, tolerance, sink);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_Tessellate(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
const D2D1_MATRIX_3X2_F *transform, float tolerance, ID2D1TessellationSink *sink)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, transform %p, tolerance %.8e, sink %p stub!\n", iface, transform, tolerance, sink);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_CombineWithGeometry(
|
||||||
|
ID2D1RoundedRectangleGeometry *iface, ID2D1Geometry *geometry, D2D1_COMBINE_MODE combine_mode,
|
||||||
|
const D2D1_MATRIX_3X2_F *transform, float tolerance, ID2D1SimplifiedGeometrySink *sink)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, geometry %p, combine_mode %#x, transform %p, tolerance %.8e, sink %p stub!\n",
|
||||||
|
iface, geometry, combine_mode, transform, tolerance, sink);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_Outline(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
const D2D1_MATRIX_3X2_F *transform, float tolerance, ID2D1SimplifiedGeometrySink *sink)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, transform %p, tolerance %.8e, sink %p stub!\n", iface, transform, tolerance, sink);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_ComputeArea(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
const D2D1_MATRIX_3X2_F *transform, float tolerance, float *area)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, transform %p, tolerance %.8e, area %p stub!\n", iface, transform, tolerance, area);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_ComputeLength(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
const D2D1_MATRIX_3X2_F *transform, float tolerance, float *length)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, transform %p, tolerance %.8e, length %p stub!\n", iface, transform, tolerance, length);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_ComputePointAtLength(
|
||||||
|
ID2D1RoundedRectangleGeometry *iface, float length, const D2D1_MATRIX_3X2_F *transform,
|
||||||
|
float tolerance, D2D1_POINT_2F *point, D2D1_POINT_2F *tangent)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, length %.8e, transform %p, tolerance %.8e, point %p, tangent %p stub!\n",
|
||||||
|
iface, length, transform, tolerance, point, tangent);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_Widen(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
float stroke_width, ID2D1StrokeStyle *stroke_style, const D2D1_MATRIX_3X2_F *transform,
|
||||||
|
float tolerance, ID2D1SimplifiedGeometrySink *sink)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, stroke_width %.8e, stroke_style %p, transform %p, tolerance %.8e, sink %p stub!\n",
|
||||||
|
iface, stroke_width, stroke_style, transform, tolerance, sink);
|
||||||
|
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void STDMETHODCALLTYPE d2d_rounded_rectangle_geometry_GetRoundedRect(ID2D1RoundedRectangleGeometry *iface,
|
||||||
|
D2D1_ROUNDED_RECT *rounded_rect)
|
||||||
|
{
|
||||||
|
struct d2d_geometry *geometry = impl_from_ID2D1RoundedRectangleGeometry(iface);
|
||||||
|
|
||||||
|
TRACE("iface %p, rounded_rect %p.\n", iface, rounded_rect);
|
||||||
|
|
||||||
|
*rounded_rect = geometry->u.rounded_rectangle.rounded_rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct ID2D1RoundedRectangleGeometryVtbl d2d_rounded_rectangle_geometry_vtbl =
|
||||||
|
{
|
||||||
|
d2d_rounded_rectangle_geometry_QueryInterface,
|
||||||
|
d2d_rounded_rectangle_geometry_AddRef,
|
||||||
|
d2d_rounded_rectangle_geometry_Release,
|
||||||
|
d2d_rounded_rectangle_geometry_GetFactory,
|
||||||
|
d2d_rounded_rectangle_geometry_GetBounds,
|
||||||
|
d2d_rounded_rectangle_geometry_GetWidenedBounds,
|
||||||
|
d2d_rounded_rectangle_geometry_StrokeContainsPoint,
|
||||||
|
d2d_rounded_rectangle_geometry_FillContainsPoint,
|
||||||
|
d2d_rounded_rectangle_geometry_CompareWithGeometry,
|
||||||
|
d2d_rounded_rectangle_geometry_Simplify,
|
||||||
|
d2d_rounded_rectangle_geometry_Tessellate,
|
||||||
|
d2d_rounded_rectangle_geometry_CombineWithGeometry,
|
||||||
|
d2d_rounded_rectangle_geometry_Outline,
|
||||||
|
d2d_rounded_rectangle_geometry_ComputeArea,
|
||||||
|
d2d_rounded_rectangle_geometry_ComputeLength,
|
||||||
|
d2d_rounded_rectangle_geometry_ComputePointAtLength,
|
||||||
|
d2d_rounded_rectangle_geometry_Widen,
|
||||||
|
d2d_rounded_rectangle_geometry_GetRoundedRect,
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT d2d_rounded_rectangle_geometry_init(struct d2d_geometry *geometry,
|
||||||
|
ID2D1Factory *factory, const D2D1_ROUNDED_RECT *rounded_rect)
|
||||||
|
{
|
||||||
|
D2D1_POINT_2F *v, v1, v2, v3, v4;
|
||||||
|
struct d2d_face *f;
|
||||||
|
float l, r, t, b;
|
||||||
|
float rx, ry;
|
||||||
|
|
||||||
|
d2d_geometry_init(geometry, factory, &identity, (ID2D1GeometryVtbl *)&d2d_rounded_rectangle_geometry_vtbl);
|
||||||
|
geometry->u.rounded_rectangle.rounded_rect = *rounded_rect;
|
||||||
|
|
||||||
|
if (!(geometry->fill.vertices = heap_alloc(8 * sizeof(*geometry->fill.vertices))))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_array_reserve((void **)&geometry->fill.faces,
|
||||||
|
&geometry->fill.faces_size, 6, sizeof(*geometry->fill.faces)))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
l = min(rounded_rect->rect.left, rounded_rect->rect.right);
|
||||||
|
r = max(rounded_rect->rect.left, rounded_rect->rect.right);
|
||||||
|
t = min(rounded_rect->rect.top, rounded_rect->rect.bottom);
|
||||||
|
b = max(rounded_rect->rect.top, rounded_rect->rect.bottom);
|
||||||
|
|
||||||
|
rx = min(rounded_rect->radiusX, 0.5f * (r - l));
|
||||||
|
ry = min(rounded_rect->radiusY, 0.5f * (b - t));
|
||||||
|
|
||||||
|
d2d_point_set(&v1, r, t);
|
||||||
|
d2d_point_set(&v2, r, b);
|
||||||
|
d2d_point_set(&v3, l, b);
|
||||||
|
d2d_point_set(&v4, l, t);
|
||||||
|
|
||||||
|
v = geometry->fill.vertices;
|
||||||
|
d2d_point_set(&v[0], l + rx, t);
|
||||||
|
d2d_point_set(&v[1], r - rx, t);
|
||||||
|
d2d_point_set(&v[2], r, t + ry);
|
||||||
|
d2d_point_set(&v[3], r, b - ry);
|
||||||
|
d2d_point_set(&v[4], r - rx, b);
|
||||||
|
d2d_point_set(&v[5], l + rx, b);
|
||||||
|
d2d_point_set(&v[6], l, b - ry);
|
||||||
|
d2d_point_set(&v[7], l, t + ry);
|
||||||
|
geometry->fill.vertex_count = 8;
|
||||||
|
|
||||||
|
f = geometry->fill.faces;
|
||||||
|
d2d_face_set(&f[0], 0, 7, 6);
|
||||||
|
d2d_face_set(&f[1], 0, 6, 5);
|
||||||
|
d2d_face_set(&f[2], 0, 5, 4);
|
||||||
|
d2d_face_set(&f[3], 0, 4, 1);
|
||||||
|
d2d_face_set(&f[4], 1, 4, 3);
|
||||||
|
d2d_face_set(&f[5], 1, 3, 2);
|
||||||
|
geometry->fill.face_count = 6;
|
||||||
|
|
||||||
|
if (!d2d_geometry_fill_add_arc_triangle(geometry, &v[1], &v1, &v[2]))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_geometry_fill_add_arc_triangle(geometry, &v[3], &v2, &v[4]))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_geometry_fill_add_arc_triangle(geometry, &v[5], &v3, &v[6]))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_geometry_fill_add_arc_triangle(geometry, &v[7], &v4, &v[0]))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (!d2d_geometry_outline_add_line_segment(geometry, &v[0], &v[1]))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_geometry_outline_add_arc_quadrant(geometry, &v[1], &v1, &v[2]))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_geometry_outline_add_line_segment(geometry, &v[2], &v[3]))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_geometry_outline_add_arc_quadrant(geometry, &v[3], &v2, &v[4]))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_geometry_outline_add_line_segment(geometry, &v[4], &v[5]))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_geometry_outline_add_arc_quadrant(geometry, &v[5], &v3, &v[6]))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_geometry_outline_add_line_segment(geometry, &v[6], &v[7]))
|
||||||
|
goto fail;
|
||||||
|
if (!d2d_geometry_outline_add_arc_quadrant(geometry, &v[7], &v4, &v[0]))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
d2d_geometry_cleanup(geometry);
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct d2d_geometry *impl_from_ID2D1TransformedGeometry(ID2D1TransformedGeometry *iface)
|
static inline struct d2d_geometry *impl_from_ID2D1TransformedGeometry(ID2D1TransformedGeometry *iface)
|
||||||
{
|
{
|
||||||
return CONTAINING_RECORD(iface, struct d2d_geometry, ID2D1Geometry_iface);
|
return CONTAINING_RECORD(iface, struct d2d_geometry, ID2D1Geometry_iface);
|
||||||
|
@ -4376,6 +4700,7 @@ struct d2d_geometry *unsafe_impl_from_ID2D1Geometry(ID2D1Geometry *iface)
|
||||||
return NULL;
|
return NULL;
|
||||||
assert(iface->lpVtbl == (const ID2D1GeometryVtbl *)&d2d_path_geometry_vtbl
|
assert(iface->lpVtbl == (const ID2D1GeometryVtbl *)&d2d_path_geometry_vtbl
|
||||||
|| iface->lpVtbl == (const ID2D1GeometryVtbl *)&d2d_rectangle_geometry_vtbl
|
|| iface->lpVtbl == (const ID2D1GeometryVtbl *)&d2d_rectangle_geometry_vtbl
|
||||||
|
|| iface->lpVtbl == (const ID2D1GeometryVtbl *)&d2d_rounded_rectangle_geometry_vtbl
|
||||||
|| iface->lpVtbl == (const ID2D1GeometryVtbl *)&d2d_transformed_geometry_vtbl
|
|| iface->lpVtbl == (const ID2D1GeometryVtbl *)&d2d_transformed_geometry_vtbl
|
||||||
|| iface->lpVtbl == (const ID2D1GeometryVtbl *)&d2d_geometry_group_vtbl);
|
|| iface->lpVtbl == (const ID2D1GeometryVtbl *)&d2d_geometry_group_vtbl);
|
||||||
return CONTAINING_RECORD(iface, struct d2d_geometry, ID2D1Geometry_iface);
|
return CONTAINING_RECORD(iface, struct d2d_geometry, ID2D1Geometry_iface);
|
||||||
|
|
|
@ -3790,13 +3790,7 @@ static void test_rounded_rectangle_geometry(void)
|
||||||
|
|
||||||
set_rounded_rect(&rect, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
|
set_rounded_rect(&rect, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
hr = ID2D1Factory_CreateRoundedRectangleGeometry(factory, &rect, &geometry);
|
hr = ID2D1Factory_CreateRoundedRectangleGeometry(factory, &rect, &geometry);
|
||||||
todo_wine
|
|
||||||
ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
|
ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
|
||||||
if (FAILED(hr))
|
|
||||||
{
|
|
||||||
ID2D1Factory_Release(factory);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ID2D1RoundedRectangleGeometry_GetRoundedRect(geometry, &rect2);
|
ID2D1RoundedRectangleGeometry_GetRoundedRect(geometry, &rect2);
|
||||||
ok(!memcmp(&rect, &rect2, sizeof(rect)), "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n",
|
ok(!memcmp(&rect, &rect2, sizeof(rect)), "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n",
|
||||||
|
|
|
@ -75,18 +75,124 @@ HRESULT WINAPI DECLSPEC_HOTPATCH Direct3DCreate9Ex(UINT sdk_version, IDirect3D9E
|
||||||
return D3D_OK;
|
return D3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/* The callback is called on any error encountered during validation, including
|
||||||
* Direct3DShaderValidatorCreate9 (D3D9.@)
|
* improper IDirect3DShaderValidator9 method calls.
|
||||||
|
* - "file" and "line" are passed through directly from Instruction(). "line"
|
||||||
|
* is provably 32-bit, as 64-bit values passed to Instruction() will be
|
||||||
|
* truncated.
|
||||||
|
* - "arg3" has been observed to be at least 0, 2, and 6. The integer size is
|
||||||
|
* not known.
|
||||||
|
* - "message_id" is a numeric error code. fxc.exe adds 5000 before printing
|
||||||
|
* it. The integer size is not known.
|
||||||
|
* - "context" is passed through directly from Begin().
|
||||||
*
|
*
|
||||||
* No documentation available for this function.
|
* Improper calls to IDirect3DShaderValidator9 methods, or other errors not
|
||||||
* SDK only says it is internal and shouldn't be used.
|
* generated by specific Instruction() calls, yield NULL as the file, and
|
||||||
*/
|
* either 0 or -1 as the line.
|
||||||
void* WINAPI Direct3DShaderValidatorCreate9(void)
|
*
|
||||||
{
|
* The callback return type is not known, but programs (fxc.exe, The Sims 2)
|
||||||
static int once;
|
* seem to consistently return 0.
|
||||||
|
*
|
||||||
|
* The interface and method names below are derived from the messages that
|
||||||
|
* native d3d9 prints on said improper method calls.
|
||||||
|
*
|
||||||
|
* Calls to Begin(), Instruction(), End() have been observed to return S_OK and
|
||||||
|
* E_FAIL. E_FAIL is not always returned if an error message is handed to the
|
||||||
|
* callback. */
|
||||||
|
|
||||||
if (!once++) FIXME("stub\n");
|
typedef HRESULT (WINAPI *shader_validator_cb)(const char *file, int line,
|
||||||
return NULL;
|
DWORD_PTR arg3, DWORD_PTR message_id, const char *message, void *context);
|
||||||
|
|
||||||
|
typedef struct IDirect3DShaderValidator9 IDirect3DShaderValidator9;
|
||||||
|
|
||||||
|
struct IDirect3DShaderValidator9Vtbl
|
||||||
|
{
|
||||||
|
HRESULT (WINAPI *QueryInterface)(IDirect3DShaderValidator9 *iface, REFIID iid, void **out);
|
||||||
|
ULONG (WINAPI *AddRef)(IDirect3DShaderValidator9 *iface);
|
||||||
|
ULONG (WINAPI *Release)(IDirect3DShaderValidator9 *iface);
|
||||||
|
HRESULT (WINAPI *Begin)(IDirect3DShaderValidator9 *iface,
|
||||||
|
shader_validator_cb callback, void *context, DWORD_PTR arg3);
|
||||||
|
HRESULT (WINAPI *Instruction)(IDirect3DShaderValidator9 *iface,
|
||||||
|
const char *file, int line, const DWORD *tokens, DWORD token_count);
|
||||||
|
HRESULT (WINAPI *End)(IDirect3DShaderValidator9 *iface);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IDirect3DShaderValidator9
|
||||||
|
{
|
||||||
|
const struct IDirect3DShaderValidator9Vtbl *vtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
static HRESULT WINAPI shader_validator_QueryInterface(IDirect3DShaderValidator9 *iface, REFIID iid, void **out)
|
||||||
|
{
|
||||||
|
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
|
||||||
|
|
||||||
|
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
|
||||||
|
*out = NULL;
|
||||||
|
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI shader_validator_AddRef(IDirect3DShaderValidator9 *iface)
|
||||||
|
{
|
||||||
|
TRACE("iface %p.\n", iface);
|
||||||
|
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI shader_validator_Release(IDirect3DShaderValidator9 *iface)
|
||||||
|
{
|
||||||
|
TRACE("iface %p.\n", iface);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The size and type of the third argument is not known. The Sims 2 passes 0;
|
||||||
|
* fxc.exe passes 1. */
|
||||||
|
static HRESULT WINAPI shader_validator_Begin(IDirect3DShaderValidator9 *iface,
|
||||||
|
shader_validator_cb callback, void *context, DWORD_PTR arg3)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, callback %p, context %p, arg3 %#Ix, stub!\n", iface, callback, context, arg3);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* - "file" and "line" are passed directly through to the callback.
|
||||||
|
* - "tokens" comprises a single instruction; the caller must determine its
|
||||||
|
* length.
|
||||||
|
* - "token_count" is in DWORDs. */
|
||||||
|
static HRESULT WINAPI shader_validator_Instruction(IDirect3DShaderValidator9 *iface,
|
||||||
|
const char *file, int line, const DWORD *tokens, DWORD token_count)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, file %s, line %u, tokens %p, token_count %u, stub!\n",
|
||||||
|
iface, debugstr_a(file), line, tokens, token_count);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI shader_validator_End(IDirect3DShaderValidator9 *iface)
|
||||||
|
{
|
||||||
|
FIXME("iface %p, stub!\n", iface);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct IDirect3DShaderValidator9Vtbl shader_validator_vtbl =
|
||||||
|
{
|
||||||
|
shader_validator_QueryInterface,
|
||||||
|
shader_validator_AddRef,
|
||||||
|
shader_validator_Release,
|
||||||
|
shader_validator_Begin,
|
||||||
|
shader_validator_Instruction,
|
||||||
|
shader_validator_End,
|
||||||
|
};
|
||||||
|
|
||||||
|
static IDirect3DShaderValidator9 shader_validator = {&shader_validator_vtbl};
|
||||||
|
|
||||||
|
IDirect3DShaderValidator9 * WINAPI Direct3DShaderValidatorCreate9(void)
|
||||||
|
{
|
||||||
|
TRACE("Returning validator %p.\n", &shader_validator);
|
||||||
|
|
||||||
|
return &shader_validator;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
|
@ -53,6 +53,8 @@ struct device_desc
|
||||||
|
|
||||||
static DEVMODEW registry_mode;
|
static DEVMODEW registry_mode;
|
||||||
|
|
||||||
|
static void *(WINAPI *Direct3DShaderValidatorCreate9)(void);
|
||||||
|
|
||||||
static const DWORD simple_vs[] =
|
static const DWORD simple_vs[] =
|
||||||
{
|
{
|
||||||
0xfffe0101, /* vs_1_1 */
|
0xfffe0101, /* vs_1_1 */
|
||||||
|
@ -13405,8 +13407,69 @@ static void test_get_display_mode(void)
|
||||||
DestroyWindow(window);
|
DestroyWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef HRESULT (WINAPI *shader_validator_cb)(const char *file, int line,
|
||||||
|
DWORD_PTR arg3, DWORD_PTR message_id, const char *message, void *context);
|
||||||
|
|
||||||
|
typedef struct IDirect3DShaderValidator9 IDirect3DShaderValidator9;
|
||||||
|
|
||||||
|
struct IDirect3DShaderValidator9Vtbl
|
||||||
|
{
|
||||||
|
HRESULT (WINAPI *QueryInterface)(IDirect3DShaderValidator9 *iface, REFIID iid, void **out);
|
||||||
|
ULONG (WINAPI *AddRef)(IDirect3DShaderValidator9 *iface);
|
||||||
|
ULONG (WINAPI *Release)(IDirect3DShaderValidator9 *iface);
|
||||||
|
HRESULT (WINAPI *Begin)(IDirect3DShaderValidator9 *iface,
|
||||||
|
shader_validator_cb callback, void *context, DWORD_PTR arg3);
|
||||||
|
HRESULT (WINAPI *Instruction)(IDirect3DShaderValidator9 *iface,
|
||||||
|
const char *file, int line, const DWORD *tokens, DWORD token_count);
|
||||||
|
HRESULT (WINAPI *End)(IDirect3DShaderValidator9 *iface);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IDirect3DShaderValidator9
|
||||||
|
{
|
||||||
|
const struct IDirect3DShaderValidator9Vtbl *vtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT WINAPI test_shader_validator_cb(const char *file, int line, DWORD_PTR arg3,
|
||||||
|
DWORD_PTR message_id, const char *message, void *context)
|
||||||
|
{
|
||||||
|
ok(0, "Unexpected call.\n");
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_shader_validator(void)
|
||||||
|
{
|
||||||
|
IDirect3DShaderValidator9 *validator;
|
||||||
|
ULONG refcount;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
validator = Direct3DShaderValidatorCreate9();
|
||||||
|
|
||||||
|
hr = validator->vtbl->Begin(validator, test_shader_validator_cb, NULL, 0);
|
||||||
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
hr = validator->vtbl->Instruction(validator, NULL, 0, &simple_vs[0], 1);
|
||||||
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
hr = validator->vtbl->Instruction(validator, NULL, 0, &simple_vs[1], 3);
|
||||||
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
hr = validator->vtbl->Instruction(validator, NULL, 0, &simple_vs[4], 4);
|
||||||
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
hr = validator->vtbl->Instruction(validator, NULL, 0, &simple_vs[8], 4);
|
||||||
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
hr = validator->vtbl->Instruction(validator, NULL, 0, &simple_vs[12], 4);
|
||||||
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
hr = validator->vtbl->Instruction(validator, NULL, 0, &simple_vs[16], 4);
|
||||||
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
hr = validator->vtbl->Instruction(validator, NULL, 0, &simple_vs[20], 1);
|
||||||
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
hr = validator->vtbl->End(validator);
|
||||||
|
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
refcount = validator->vtbl->Release(validator);
|
||||||
|
todo_wine ok(!refcount, "Validator has %u references left.\n", refcount);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(device)
|
START_TEST(device)
|
||||||
{
|
{
|
||||||
|
HMODULE d3d9_handle = GetModuleHandleA("d3d9.dll");
|
||||||
WNDCLASSA wc = {0};
|
WNDCLASSA wc = {0};
|
||||||
IDirect3D9 *d3d9;
|
IDirect3D9 *d3d9;
|
||||||
DEVMODEW current_mode;
|
DEVMODEW current_mode;
|
||||||
|
@ -13434,6 +13497,8 @@ START_TEST(device)
|
||||||
wc.lpszClassName = "d3d9_test_wc";
|
wc.lpszClassName = "d3d9_test_wc";
|
||||||
RegisterClassA(&wc);
|
RegisterClassA(&wc);
|
||||||
|
|
||||||
|
Direct3DShaderValidatorCreate9 = (void *)GetProcAddress(d3d9_handle, "Direct3DShaderValidatorCreate9");
|
||||||
|
|
||||||
test_get_set_vertex_declaration();
|
test_get_set_vertex_declaration();
|
||||||
test_get_declaration();
|
test_get_declaration();
|
||||||
test_fvf_decl_conversion();
|
test_fvf_decl_conversion();
|
||||||
|
@ -13532,6 +13597,7 @@ START_TEST(device)
|
||||||
test_multiply_transform();
|
test_multiply_transform();
|
||||||
test_vertex_buffer_read_write();
|
test_vertex_buffer_read_write();
|
||||||
test_get_display_mode();
|
test_get_display_mode();
|
||||||
|
test_shader_validator();
|
||||||
|
|
||||||
UnregisterClassA("d3d9_test_wc", GetModuleHandleA(NULL));
|
UnregisterClassA("d3d9_test_wc", GetModuleHandleA(NULL));
|
||||||
}
|
}
|
||||||
|
|
|
@ -468,14 +468,427 @@ HRESULT WINAPI D3DXCreateAnimationController(UINT max_outputs, UINT max_sets,
|
||||||
return D3D_OK;
|
return D3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct d3dx9_keyframed_animation_set
|
||||||
|
{
|
||||||
|
ID3DXKeyframedAnimationSet ID3DXKeyframedAnimationSet_iface;
|
||||||
|
LONG ref;
|
||||||
|
|
||||||
|
const char *name;
|
||||||
|
double ticks_per_second;
|
||||||
|
D3DXPLAYBACK_TYPE playback_type;
|
||||||
|
unsigned int animation_count;
|
||||||
|
unsigned int callback_key_count;
|
||||||
|
const D3DXKEY_CALLBACK *callback_keys;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline struct d3dx9_keyframed_animation_set *impl_from_ID3DXKeyframedAnimationSet(ID3DXKeyframedAnimationSet *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, struct d3dx9_keyframed_animation_set, ID3DXKeyframedAnimationSet_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_QueryInterface(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
REFIID riid, void **obj)
|
||||||
|
{
|
||||||
|
TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), obj);
|
||||||
|
|
||||||
|
if (IsEqualGUID(riid, &IID_IUnknown)
|
||||||
|
|| IsEqualGUID(riid, &IID_ID3DXAnimationSet)
|
||||||
|
|| IsEqualGUID(riid, &IID_ID3DXKeyframedAnimationSet))
|
||||||
|
{
|
||||||
|
iface->lpVtbl->AddRef(iface);
|
||||||
|
*obj = iface;
|
||||||
|
return D3D_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
|
||||||
|
*obj = NULL;
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI d3dx9_keyframed_animation_AddRef(ID3DXKeyframedAnimationSet *iface)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
ULONG refcount = InterlockedIncrement(&set->ref);
|
||||||
|
|
||||||
|
TRACE("%p increasing refcount to %u.\n", set, refcount);
|
||||||
|
|
||||||
|
return refcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI d3dx9_keyframed_animation_Release(ID3DXKeyframedAnimationSet *iface)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
ULONG refcount = InterlockedDecrement(&set->ref);
|
||||||
|
|
||||||
|
TRACE("%p decreasing refcount to %u.\n", set, refcount);
|
||||||
|
|
||||||
|
if (!refcount)
|
||||||
|
{
|
||||||
|
heap_free((char *)set->name);
|
||||||
|
heap_free(set);
|
||||||
|
}
|
||||||
|
|
||||||
|
return refcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char * WINAPI d3dx9_keyframed_animation_GetName(ID3DXKeyframedAnimationSet *iface)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
TRACE("set %p.\n", set);
|
||||||
|
return set->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double WINAPI d3dx9_keyframed_animation_GetPeriod(ID3DXKeyframedAnimationSet *iface)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p stub.\n", set);
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double WINAPI d3dx9_keyframed_animation_GetPeriodicPosition(ID3DXKeyframedAnimationSet *iface, double position)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, position %.16e stub.\n", set, position);
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT WINAPI d3dx9_keyframed_animation_GetNumAnimations(ID3DXKeyframedAnimationSet *iface)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p stub.\n", set);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetAnimationNameByIndex(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT index, const char **name)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, index %u, name %p stub.\n", set, index, name);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetAnimationIndexByName(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
const char *name, UINT *index)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, name %s, index %p stub.\n", set, debugstr_a(name), index);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetSRT(ID3DXKeyframedAnimationSet *iface, double periodic_position,
|
||||||
|
UINT animation, D3DXVECTOR3 *scale, D3DXQUATERNION *rotation, D3DXVECTOR3 *translation)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, periodic_position %.16e, animation %u, scale %p, rotation %p, translation %p stub.\n",
|
||||||
|
set, periodic_position, animation, scale, rotation, translation);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetCallback(ID3DXKeyframedAnimationSet *iface, double position,
|
||||||
|
DWORD flags, double *callback_position, void **callback_data)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, position %.16e, flags %#x, callback_position %p, callback_data %p stub.\n",
|
||||||
|
set, position, flags, callback_position, callback_data);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static D3DXPLAYBACK_TYPE WINAPI d3dx9_keyframed_animation_GetPlaybackType(ID3DXKeyframedAnimationSet *iface)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
TRACE("set %p.\n", set);
|
||||||
|
return set->playback_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double WINAPI d3dx9_keyframed_animation_GetSourceTicksPerSecond(ID3DXKeyframedAnimationSet *iface)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
TRACE("set %p.\n", set);
|
||||||
|
return set->ticks_per_second;
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT WINAPI d3dx9_keyframed_animation_GetNumScaleKeys(ID3DXKeyframedAnimationSet *iface, UINT keys)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, keys %u stub.\n", set, keys);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetScaleKeys(ID3DXKeyframedAnimationSet *iface, UINT animation,
|
||||||
|
D3DXKEY_VECTOR3 *scale_keys)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, scale_keys %p stub.\n", set, animation, scale_keys);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetScaleKey(ID3DXKeyframedAnimationSet *iface, UINT animation,
|
||||||
|
UINT key, D3DXKEY_VECTOR3 *scale_key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, key %u, scale_key %p stub.\n", set, animation, key, scale_key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_SetScaleKey(ID3DXKeyframedAnimationSet *iface, UINT animation,
|
||||||
|
UINT key, D3DXKEY_VECTOR3 *scale_key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, key %u, scale_key %p stub.\n", set, animation, key, scale_key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT WINAPI d3dx9_keyframed_animation_GetNumRotationKeys(ID3DXKeyframedAnimationSet *iface, UINT animation)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u stub.\n", set, animation);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetRotationKeys(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT animation, D3DXKEY_QUATERNION *rotation_keys)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, rotation_keys %p stub.\n", set, animation, rotation_keys);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetRotationKey(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT animation, UINT key, D3DXKEY_QUATERNION *rotation_key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, key %u, rotation_key %p stub.\n", set, animation, key, rotation_key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_SetRotationKey(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT animation, UINT key, D3DXKEY_QUATERNION *rotation_key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, key %u, rotation_key %p stub.\n", set, animation, key, rotation_key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT WINAPI d3dx9_keyframed_animation_GetNumTranslationKeys(ID3DXKeyframedAnimationSet *iface, UINT animation)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u stub.\n", set, animation);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetTranslationKeys(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT animation, D3DXKEY_VECTOR3 *translation_keys)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, translation_keys %p stub.\n", set, animation, translation_keys);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetTranslationKey(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT animation, UINT key, D3DXKEY_VECTOR3 *translation_key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, key %u, translation_key %p stub.\n", set, animation, key, translation_key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_SetTranslationKey(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT animation, UINT key, D3DXKEY_VECTOR3 *translation_key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, key %u, translation_key %p stub.\n", set, animation, key, translation_key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT WINAPI d3dx9_keyframed_animation_GetNumCallbackKeys(ID3DXKeyframedAnimationSet *iface)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p stub.\n", set);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetCallbackKeys(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
D3DXKEY_CALLBACK *callback_keys)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, callback_keys %p stub.\n", set, callback_keys);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_GetCallbackKey(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT key, D3DXKEY_CALLBACK *callback_key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, key %u, callback_key %p stub.\n", set, key, callback_key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_SetCallbackKey(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT key, D3DXKEY_CALLBACK *callback_key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, key %u, callback_key %p stub.\n", set, key, callback_key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_UnregisterScaleKey(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT animation, UINT key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, key %u stub.\n", set, animation, key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_UnregisterRotationKey(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT animation, UINT key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, key %u stub.\n", set, animation, key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_UnregisterTranslationKey(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
UINT animation, UINT key)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, animation %u, key %u stub.\n", set, animation, key);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_RegisterAnimationSRTKeys(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
const char *name, UINT scale_keys_count, UINT rotation_keys_count, UINT translation_keys_count,
|
||||||
|
const D3DXKEY_VECTOR3 *scale_keys, const D3DXKEY_QUATERNION *rotation_keys,
|
||||||
|
const D3DXKEY_VECTOR3 *translation_keys, DWORD *animation_index)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, name %s, scale_keys_count %u, rotation_keys_count %u, translation_keys_count %u, "
|
||||||
|
"scale_keys %p, rotation_keys %p, translation_keys %p, animation_index %p stub.\n",
|
||||||
|
set, debugstr_a(name), scale_keys_count, rotation_keys_count, translation_keys_count,
|
||||||
|
scale_keys, rotation_keys, translation_keys, animation_index);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_Compress(ID3DXKeyframedAnimationSet *iface,
|
||||||
|
DWORD flags, float lossiness, D3DXFRAME *hierarchy, ID3DXBuffer **compressed_data)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, flags %#x, lossiness %.8e, hierarchy %p, compressed_data %p stub.\n",
|
||||||
|
set, flags, lossiness, hierarchy, compressed_data);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI d3dx9_keyframed_animation_UnregisterAnimation(ID3DXKeyframedAnimationSet *iface, UINT index)
|
||||||
|
{
|
||||||
|
struct d3dx9_keyframed_animation_set *set = impl_from_ID3DXKeyframedAnimationSet(iface);
|
||||||
|
|
||||||
|
FIXME("set %p, index %u stub.\n", set, index);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct ID3DXKeyframedAnimationSetVtbl d3dx9_keyframed_animation_vtbl =
|
||||||
|
{
|
||||||
|
d3dx9_keyframed_animation_QueryInterface,
|
||||||
|
d3dx9_keyframed_animation_AddRef,
|
||||||
|
d3dx9_keyframed_animation_Release,
|
||||||
|
d3dx9_keyframed_animation_GetName,
|
||||||
|
d3dx9_keyframed_animation_GetPeriod,
|
||||||
|
d3dx9_keyframed_animation_GetPeriodicPosition,
|
||||||
|
d3dx9_keyframed_animation_GetNumAnimations,
|
||||||
|
d3dx9_keyframed_animation_GetAnimationNameByIndex,
|
||||||
|
d3dx9_keyframed_animation_GetAnimationIndexByName,
|
||||||
|
d3dx9_keyframed_animation_GetSRT,
|
||||||
|
d3dx9_keyframed_animation_GetCallback,
|
||||||
|
d3dx9_keyframed_animation_GetPlaybackType,
|
||||||
|
d3dx9_keyframed_animation_GetSourceTicksPerSecond,
|
||||||
|
d3dx9_keyframed_animation_GetNumScaleKeys,
|
||||||
|
d3dx9_keyframed_animation_GetScaleKeys,
|
||||||
|
d3dx9_keyframed_animation_GetScaleKey,
|
||||||
|
d3dx9_keyframed_animation_SetScaleKey,
|
||||||
|
d3dx9_keyframed_animation_GetNumRotationKeys,
|
||||||
|
d3dx9_keyframed_animation_GetRotationKeys,
|
||||||
|
d3dx9_keyframed_animation_GetRotationKey,
|
||||||
|
d3dx9_keyframed_animation_SetRotationKey,
|
||||||
|
d3dx9_keyframed_animation_GetNumTranslationKeys,
|
||||||
|
d3dx9_keyframed_animation_GetTranslationKeys,
|
||||||
|
d3dx9_keyframed_animation_GetTranslationKey,
|
||||||
|
d3dx9_keyframed_animation_SetTranslationKey,
|
||||||
|
d3dx9_keyframed_animation_GetNumCallbackKeys,
|
||||||
|
d3dx9_keyframed_animation_GetCallbackKeys,
|
||||||
|
d3dx9_keyframed_animation_GetCallbackKey,
|
||||||
|
d3dx9_keyframed_animation_SetCallbackKey,
|
||||||
|
d3dx9_keyframed_animation_UnregisterScaleKey,
|
||||||
|
d3dx9_keyframed_animation_UnregisterRotationKey,
|
||||||
|
d3dx9_keyframed_animation_UnregisterTranslationKey,
|
||||||
|
d3dx9_keyframed_animation_RegisterAnimationSRTKeys,
|
||||||
|
d3dx9_keyframed_animation_Compress,
|
||||||
|
d3dx9_keyframed_animation_UnregisterAnimation
|
||||||
|
};
|
||||||
|
|
||||||
HRESULT WINAPI D3DXCreateKeyframedAnimationSet(const char *name, double ticks_per_second,
|
HRESULT WINAPI D3DXCreateKeyframedAnimationSet(const char *name, double ticks_per_second,
|
||||||
D3DXPLAYBACK_TYPE playback_type, UINT animation_count, UINT callback_key_count,
|
D3DXPLAYBACK_TYPE playback_type, UINT animation_count, UINT callback_key_count,
|
||||||
const D3DXKEY_CALLBACK *callback_keys, ID3DXKeyframedAnimationSet **animation_set)
|
const D3DXKEY_CALLBACK *callback_keys, ID3DXKeyframedAnimationSet **animation_set)
|
||||||
{
|
{
|
||||||
FIXME("name %s, ticks_per_second %.16e, playback_type %u, animation_count %u, "
|
struct d3dx9_keyframed_animation_set *object;
|
||||||
"callback_key_count %u, callback_keys %p, animation_set %p stub.\n",
|
char *string;
|
||||||
|
|
||||||
|
TRACE("name %s, ticks_per_second %.16e, playback_type %u, animation_count %u, "
|
||||||
|
"callback_key_count %u, callback_keys %p, animation_set %p.\n",
|
||||||
debugstr_a(name), ticks_per_second, playback_type, animation_count,
|
debugstr_a(name), ticks_per_second, playback_type, animation_count,
|
||||||
callback_key_count, callback_keys, animation_set);
|
callback_key_count, callback_keys, animation_set);
|
||||||
|
|
||||||
return E_NOTIMPL;
|
if (!animation_count)
|
||||||
|
return D3DERR_INVALIDCALL;
|
||||||
|
|
||||||
|
if (!(object = heap_alloc(sizeof(*object))))
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
object->ID3DXKeyframedAnimationSet_iface.lpVtbl = &d3dx9_keyframed_animation_vtbl;
|
||||||
|
object->ref = 1;
|
||||||
|
if (!(string = heap_alloc(strlen(name) + 1)))
|
||||||
|
{
|
||||||
|
heap_free(object);
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
strcpy(string, name);
|
||||||
|
object->name = string;
|
||||||
|
object->ticks_per_second = ticks_per_second;
|
||||||
|
object->playback_type = playback_type;
|
||||||
|
object->animation_count = animation_count;
|
||||||
|
object->callback_key_count = callback_key_count;
|
||||||
|
object->callback_keys = callback_keys;
|
||||||
|
|
||||||
|
*animation_set = &object->ID3DXKeyframedAnimationSet_iface;
|
||||||
|
|
||||||
|
return D3D_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11119,6 +11119,32 @@ static void D3DXCreateAnimationControllerTest(void)
|
||||||
animation->lpVtbl->Release(animation);
|
animation->lpVtbl->Release(animation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void D3DXCreateKeyframedAnimationSetTest(void)
|
||||||
|
{
|
||||||
|
ID3DXKeyframedAnimationSet *set;
|
||||||
|
D3DXPLAYBACK_TYPE type;
|
||||||
|
unsigned int count;
|
||||||
|
const char *name;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
hr = D3DXCreateKeyframedAnimationSet("wine_bottle", 5.0, D3DXPLAY_LOOP, 0, 0, NULL, &set);
|
||||||
|
ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = D3DXCreateKeyframedAnimationSet("wine_bottle", 5.0, D3DXPLAY_LOOP, 10, 0, NULL, &set);
|
||||||
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
name = set->lpVtbl->GetName(set);
|
||||||
|
ok(!strcmp(name, "wine_bottle"), "Got unexpected name %s.\n", debugstr_a(name));
|
||||||
|
|
||||||
|
type = set->lpVtbl->GetPlaybackType(set);
|
||||||
|
ok(type == D3DXPLAY_LOOP, "Got unexpected value %u.\n", type);
|
||||||
|
|
||||||
|
count = set->lpVtbl->GetNumAnimations(set);
|
||||||
|
ok(!count, "Got unexpected value %u.\n", count);
|
||||||
|
|
||||||
|
set->lpVtbl->Release(set);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_D3DXFrameFind(void)
|
static void test_D3DXFrameFind(void)
|
||||||
{
|
{
|
||||||
static char n1[] = "name1";
|
static char n1[] = "name1";
|
||||||
|
@ -11387,6 +11413,7 @@ START_TEST(mesh)
|
||||||
D3DXCreateTextTest();
|
D3DXCreateTextTest();
|
||||||
D3DXCreateTorusTest();
|
D3DXCreateTorusTest();
|
||||||
D3DXCreateAnimationControllerTest();
|
D3DXCreateAnimationControllerTest();
|
||||||
|
D3DXCreateKeyframedAnimationSetTest();
|
||||||
test_get_decl_length();
|
test_get_decl_length();
|
||||||
test_get_decl_vertex_size();
|
test_get_decl_vertex_size();
|
||||||
test_fvf_decl_conversion();
|
test_fvf_decl_conversion();
|
||||||
|
|
|
@ -245,6 +245,7 @@ static ULONG WINAPI d3d_device_inner_Release(IUnknown *iface)
|
||||||
|
|
||||||
wined3d_device_set_rendertarget_view(This->wined3d_device, 0, NULL, FALSE);
|
wined3d_device_set_rendertarget_view(This->wined3d_device, 0, NULL, FALSE);
|
||||||
|
|
||||||
|
wined3d_stateblock_decref(This->state);
|
||||||
if (This->recording)
|
if (This->recording)
|
||||||
wined3d_stateblock_decref(This->recording);
|
wined3d_stateblock_decref(This->recording);
|
||||||
|
|
||||||
|
|
|
@ -1398,7 +1398,7 @@ HRESULT WINAPI IDirectInputDevice2WImpl_SetProperty(
|
||||||
EnterCriticalSection(&This->crit);
|
EnterCriticalSection(&This->crit);
|
||||||
|
|
||||||
This->buffersize = pd->dwData;
|
This->buffersize = pd->dwData;
|
||||||
This->queue_len = min(This->buffersize, 20);
|
This->queue_len = min(This->buffersize, 1024);
|
||||||
HeapFree(GetProcessHeap(), 0, This->data_queue);
|
HeapFree(GetProcessHeap(), 0, This->data_queue);
|
||||||
|
|
||||||
This->data_queue = !This->queue_len ? NULL : HeapAlloc(GetProcessHeap(), 0,
|
This->data_queue = !This->queue_len ? NULL : HeapAlloc(GetProcessHeap(), 0,
|
||||||
|
|
|
@ -151,11 +151,17 @@ static HRESULT WINAPI IDirectMusicStyle8Impl_EnumBand(IDirectMusicStyle8 *iface,
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI IDirectMusicStyle8Impl_GetDefaultBand(IDirectMusicStyle8 *iface,
|
static HRESULT WINAPI IDirectMusicStyle8Impl_GetDefaultBand(IDirectMusicStyle8 *iface,
|
||||||
IDirectMusicBand **ppBand)
|
IDirectMusicBand **band)
|
||||||
{
|
{
|
||||||
IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface);
|
IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface);
|
||||||
FIXME("(%p, %p): stub\n", This, ppBand);
|
FIXME("(%p, %p): stub\n", This, band);
|
||||||
return S_OK;
|
|
||||||
|
if (!band)
|
||||||
|
return E_POINTER;
|
||||||
|
|
||||||
|
*band = NULL;
|
||||||
|
|
||||||
|
return S_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI IDirectMusicStyle8Impl_EnumMotif(IDirectMusicStyle8 *iface, DWORD index,
|
static HRESULT WINAPI IDirectMusicStyle8Impl_EnumMotif(IDirectMusicStyle8 *iface, DWORD index,
|
||||||
|
|
|
@ -1014,6 +1014,7 @@ HRESULT secondarybuffer_create(DirectSoundDevice *device, const DSBUFFERDESC *ds
|
||||||
LPWAVEFORMATEX wfex = dsbd->lpwfxFormat;
|
LPWAVEFORMATEX wfex = dsbd->lpwfxFormat;
|
||||||
HRESULT err = DS_OK;
|
HRESULT err = DS_OK;
|
||||||
DWORD capf = 0;
|
DWORD capf = 0;
|
||||||
|
size_t bufsize;
|
||||||
|
|
||||||
TRACE("(%p,%p,%p)\n", device, dsbd, buffer);
|
TRACE("(%p,%p,%p)\n", device, dsbd, buffer);
|
||||||
|
|
||||||
|
@ -1069,19 +1070,15 @@ HRESULT secondarybuffer_create(DirectSoundDevice *device, const DSBUFFERDESC *ds
|
||||||
TRACE("capf = 0x%08x, device->drvcaps.dwFlags = 0x%08x\n", capf, device->drvcaps.dwFlags);
|
TRACE("capf = 0x%08x, device->drvcaps.dwFlags = 0x%08x\n", capf, device->drvcaps.dwFlags);
|
||||||
|
|
||||||
/* Allocate an empty buffer */
|
/* Allocate an empty buffer */
|
||||||
dsb->buffer = HeapAlloc(GetProcessHeap(),0,sizeof(*(dsb->buffer)));
|
bufsize = (sizeof(*(dsb->buffer)) + sizeof(void *) - 1) & ~(sizeof(void *) - 1);
|
||||||
|
dsb->buffer = HeapAlloc(GetProcessHeap(),0,bufsize + dsb->buflen);
|
||||||
if (!dsb->buffer) {
|
if (!dsb->buffer) {
|
||||||
IDirectSoundBuffer8_Release(&dsb->IDirectSoundBuffer8_iface);
|
IDirectSoundBuffer8_Release(&dsb->IDirectSoundBuffer8_iface);
|
||||||
return DSERR_OUTOFMEMORY;
|
return DSERR_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate system memory for buffer */
|
/* Allocate system memory for buffer */
|
||||||
dsb->buffer->memory = HeapAlloc(GetProcessHeap(),0,dsb->buflen);
|
dsb->buffer->memory = (BYTE *)dsb->buffer + bufsize;
|
||||||
if (!dsb->buffer->memory) {
|
|
||||||
WARN("out of memory\n");
|
|
||||||
IDirectSoundBuffer8_Release(&dsb->IDirectSoundBuffer8_iface);
|
|
||||||
return DSERR_OUTOFMEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
dsb->buffer->ref = 1;
|
dsb->buffer->ref = 1;
|
||||||
dsb->buffer->lockedbytes = 0;
|
dsb->buffer->lockedbytes = 0;
|
||||||
|
@ -1152,10 +1149,8 @@ void secondarybuffer_destroy(IDirectSoundBufferImpl *This)
|
||||||
|
|
||||||
This->buffer->ref--;
|
This->buffer->ref--;
|
||||||
list_remove(&This->entry);
|
list_remove(&This->entry);
|
||||||
if (This->buffer->ref == 0) {
|
if (This->buffer->ref == 0)
|
||||||
HeapFree(GetProcessHeap(), 0, This->buffer->memory);
|
|
||||||
HeapFree(GetProcessHeap(), 0, This->buffer);
|
HeapFree(GetProcessHeap(), 0, This->buffer);
|
||||||
}
|
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, This->notifies);
|
HeapFree(GetProcessHeap(), 0, This->notifies);
|
||||||
HeapFree(GetProcessHeap(), 0, This->pwfx);
|
HeapFree(GetProcessHeap(), 0, This->pwfx);
|
||||||
|
|
|
@ -188,9 +188,9 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
|
||||||
IDirectSoundBufferImpl **ppdsb,
|
IDirectSoundBufferImpl **ppdsb,
|
||||||
IDirectSoundBufferImpl *pdsb) DECLSPEC_HIDDEN;
|
IDirectSoundBufferImpl *pdsb) DECLSPEC_HIDDEN;
|
||||||
void secondarybuffer_destroy(IDirectSoundBufferImpl *This) DECLSPEC_HIDDEN;
|
void secondarybuffer_destroy(IDirectSoundBufferImpl *This) DECLSPEC_HIDDEN;
|
||||||
const IDirectSound3DListenerVtbl ds3dlvt DECLSPEC_HIDDEN;
|
extern const IDirectSound3DListenerVtbl ds3dlvt DECLSPEC_HIDDEN;
|
||||||
const IDirectSound3DBufferVtbl ds3dbvt DECLSPEC_HIDDEN;
|
extern const IDirectSound3DBufferVtbl ds3dbvt DECLSPEC_HIDDEN;
|
||||||
const IKsPropertySetVtbl iksbvt DECLSPEC_HIDDEN;
|
extern const IKsPropertySetVtbl iksbvt DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
HRESULT IKsPrivatePropertySetImpl_Create(REFIID riid, void **ppv) DECLSPEC_HIDDEN;
|
HRESULT IKsPrivatePropertySetImpl_Create(REFIID riid, void **ppv) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
|
|
@ -1157,6 +1157,13 @@ static HRESULT test_duplicate(LPGUID lpGuid)
|
||||||
ok(rc==DS_OK && buf!=NULL,
|
ok(rc==DS_OK && buf!=NULL,
|
||||||
"IDirectSoundBuffer_Lock failed to lock the buffer %08x\n",rc);
|
"IDirectSoundBuffer_Lock failed to lock the buffer %08x\n",rc);
|
||||||
if (rc==DS_OK && buf!=NULL) {
|
if (rc==DS_OK && buf!=NULL) {
|
||||||
|
if (sizeof(void*)==4) { /* crashes on 64-bit */
|
||||||
|
/* broken apps like Asuka 120% Return BURNING Fest,
|
||||||
|
pass the pointer to GlobalHandle. */
|
||||||
|
HGLOBAL hmem = GlobalHandle(buf);
|
||||||
|
ok(!hmem,"GlobalHandle should return NULL "
|
||||||
|
"for buffer %p, got %p\n",buf,hmem);
|
||||||
|
}
|
||||||
ZeroMemory(buf,bufsize);
|
ZeroMemory(buf,bufsize);
|
||||||
rc=IDirectSoundBuffer_Unlock(original,buf,bufsize,
|
rc=IDirectSoundBuffer_Unlock(original,buf,bufsize,
|
||||||
NULL,0);
|
NULL,0);
|
||||||
|
|
|
@ -6263,9 +6263,21 @@ static HRESULT WINAPI fontfacereference_EnqueueFileFragmentDownloadRequest(IDWri
|
||||||
|
|
||||||
static HRESULT WINAPI fontfacereference1_CreateFontFace(IDWriteFontFaceReference1 *iface, IDWriteFontFace5 **fontface)
|
static HRESULT WINAPI fontfacereference1_CreateFontFace(IDWriteFontFaceReference1 *iface, IDWriteFontFace5 **fontface)
|
||||||
{
|
{
|
||||||
FIXME("%p, %p.\n", iface, fontface);
|
struct dwrite_fontfacereference *reference = impl_from_IDWriteFontFaceReference1(iface);
|
||||||
|
IDWriteFontFace3 *fontface3;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
return E_NOTIMPL;
|
TRACE("%p, %p.\n", iface, fontface);
|
||||||
|
|
||||||
|
/* FIXME: created instance should likely respect given axis. */
|
||||||
|
if (SUCCEEDED(hr = IDWriteFontFaceReference1_CreateFontFaceWithSimulations(iface, reference->simulations,
|
||||||
|
&fontface3)))
|
||||||
|
{
|
||||||
|
hr = IDWriteFontFace3_QueryInterface(fontface3, &IID_IDWriteFontFace5, (void **)fontface);
|
||||||
|
IDWriteFontFace3_Release(fontface3);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT32 WINAPI fontfacereference1_GetFontAxisValueCount(IDWriteFontFaceReference1 *iface)
|
static UINT32 WINAPI fontfacereference1_GetFontAxisValueCount(IDWriteFontFaceReference1 *iface)
|
||||||
|
|
|
@ -9537,6 +9537,10 @@ static void test_font_resource(void)
|
||||||
ok(hr == S_OK, "Failed to get axis values, hr %#x.\n", hr);
|
ok(hr == S_OK, "Failed to get axis values, hr %#x.\n", hr);
|
||||||
ok(axis_values[0].axisTag == DWRITE_FONT_AXIS_TAG_WEIGHT, "Unexpected axis tag.\n");
|
ok(axis_values[0].axisTag == DWRITE_FONT_AXIS_TAG_WEIGHT, "Unexpected axis tag.\n");
|
||||||
|
|
||||||
|
hr = IDWriteFontFaceReference1_CreateFontFace(reference, &fontface5);
|
||||||
|
ok(hr == S_OK, "Failed to create a font face, hr %#x.\n", hr);
|
||||||
|
IDWriteFontFace5_Release(fontface5);
|
||||||
|
|
||||||
IDWriteFontFaceReference1_Release(reference);
|
IDWriteFontFaceReference1_Release(reference);
|
||||||
|
|
||||||
IDWriteFontFile_Release(fontfile);
|
IDWriteFontFile_Release(fontfile);
|
||||||
|
|
|
@ -384,7 +384,12 @@ static GpStatus alpha_blend_bmp_pixels(GpGraphics *graphics, INT dst_x, INT dst_
|
||||||
src_color = ((ARGB*)(src + src_stride * y))[x];
|
src_color = ((ARGB*)(src + src_stride * y))[x];
|
||||||
|
|
||||||
if (comp_mode == CompositingModeSourceCopy)
|
if (comp_mode == CompositingModeSourceCopy)
|
||||||
GdipBitmapSetPixel(dst_bitmap, x+dst_x, y+dst_y, src_color);
|
{
|
||||||
|
if (!(src_color & 0xff000000))
|
||||||
|
GdipBitmapSetPixel(dst_bitmap, x+dst_x, y+dst_y, 0);
|
||||||
|
else
|
||||||
|
GdipBitmapSetPixel(dst_bitmap, x+dst_x, y+dst_y, src_color);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!(src_color & 0xff000000))
|
if (!(src_color & 0xff000000))
|
||||||
|
@ -5359,7 +5364,13 @@ GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics,
|
||||||
{
|
{
|
||||||
stat = GdipSetEmpty(regions[i]);
|
stat = GdipSetEmpty(regions[i]);
|
||||||
if (stat != Ok)
|
if (stat != Ok)
|
||||||
|
{
|
||||||
|
SelectObject(hdc, oldfont);
|
||||||
|
DeleteObject(gdifont);
|
||||||
|
if (temp_hdc)
|
||||||
|
DeleteDC(temp_hdc);
|
||||||
return stat;
|
return stat;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
args.regions = regions;
|
args.regions = regions;
|
||||||
|
@ -7204,8 +7215,13 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_glyphsize == 0)
|
if (max_glyphsize == 0)
|
||||||
|
{
|
||||||
/* Nothing to draw. */
|
/* Nothing to draw. */
|
||||||
|
heap_free(pti);
|
||||||
|
DeleteDC(hdc);
|
||||||
|
DeleteObject(hfont);
|
||||||
return Ok;
|
return Ok;
|
||||||
|
}
|
||||||
|
|
||||||
glyph_mask = heap_alloc_zero(max_glyphsize);
|
glyph_mask = heap_alloc_zero(max_glyphsize);
|
||||||
text_mask = heap_alloc_zero((max_x - min_x) * (max_y - min_y));
|
text_mask = heap_alloc_zero((max_x - min_x) * (max_y - min_y));
|
||||||
|
|
|
@ -1381,50 +1381,29 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO* info,
|
||||||
VOID *bits, GpBitmap **bitmap)
|
VOID *bits, GpBitmap **bitmap)
|
||||||
{
|
{
|
||||||
DWORD height, stride;
|
DWORD height, stride;
|
||||||
PixelFormat format;
|
HBITMAP hbm;
|
||||||
|
void *bmbits;
|
||||||
|
GpStatus status;
|
||||||
|
|
||||||
FIXME("(%p, %p, %p) - partially implemented\n", info, bits, bitmap);
|
TRACE("(%p, %p, %p)\n", info, bits, bitmap);
|
||||||
|
|
||||||
if (!info || !bits || !bitmap)
|
if (!info || !bits || !bitmap)
|
||||||
return InvalidParameter;
|
return InvalidParameter;
|
||||||
|
|
||||||
|
hbm = CreateDIBSection(0, info, DIB_RGB_COLORS, &bmbits, NULL, 0);
|
||||||
|
if (!hbm)
|
||||||
|
return InvalidParameter;
|
||||||
|
|
||||||
height = abs(info->bmiHeader.biHeight);
|
height = abs(info->bmiHeader.biHeight);
|
||||||
stride = ((info->bmiHeader.biWidth * info->bmiHeader.biBitCount + 31) >> 3) & ~3;
|
stride = ((info->bmiHeader.biWidth * info->bmiHeader.biBitCount + 31) >> 3) & ~3;
|
||||||
|
TRACE("height %u, stride %u, image size %u\n", height, stride, height * stride);
|
||||||
|
|
||||||
if(info->bmiHeader.biHeight > 0) /* bottom-up */
|
memcpy(bmbits, bits, height * stride);
|
||||||
{
|
|
||||||
bits = (BYTE*)bits + (height - 1) * stride;
|
|
||||||
stride = -stride;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(info->bmiHeader.biBitCount) {
|
status = GdipCreateBitmapFromHBITMAP(hbm, NULL, bitmap);
|
||||||
case 1:
|
DeleteObject(hbm);
|
||||||
format = PixelFormat1bppIndexed;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
format = PixelFormat4bppIndexed;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
format = PixelFormat8bppIndexed;
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
format = PixelFormat16bppRGB555;
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
format = PixelFormat24bppRGB;
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
format = PixelFormat32bppRGB;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
FIXME("don't know how to handle %d bpp\n", info->bmiHeader.biBitCount);
|
|
||||||
*bitmap = NULL;
|
|
||||||
return InvalidParameter;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GdipCreateBitmapFromScan0(info->bmiHeader.biWidth, height, stride, format,
|
|
||||||
bits, bitmap);
|
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: no icm */
|
/* FIXME: no icm */
|
||||||
|
|
|
@ -4208,7 +4208,7 @@ static void test_DrawImage_SourceCopy(void)
|
||||||
expect(0, dst_pixels[0]);
|
expect(0, dst_pixels[0]);
|
||||||
expect(0xffff0000, dst_pixels[1]);
|
expect(0xffff0000, dst_pixels[1]);
|
||||||
expect(0, dst_pixels[2]);
|
expect(0, dst_pixels[2]);
|
||||||
todo_wine expect(0, dst_pixels[3]);
|
expect(0, dst_pixels[3]);
|
||||||
|
|
||||||
status = GdipDeleteGraphics(graphics);
|
status = GdipDeleteGraphics(graphics);
|
||||||
expect(Ok, status);
|
expect(Ok, status);
|
||||||
|
|
|
@ -100,7 +100,9 @@ struct tagActiveDS
|
||||||
struct jpeg_decompress_struct jd;
|
struct jpeg_decompress_struct jd;
|
||||||
struct jpeg_error_mgr jerr;
|
struct jpeg_error_mgr jerr;
|
||||||
#endif
|
#endif
|
||||||
} activeDS DECLSPEC_HIDDEN;
|
};
|
||||||
|
|
||||||
|
extern struct tagActiveDS activeDS DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/* Helper functions */
|
/* Helper functions */
|
||||||
extern TW_UINT16 GPHOTO2_SaneCapability (pTW_CAPABILITY pCapability, TW_UINT16 action) DECLSPEC_HIDDEN;
|
extern TW_UINT16 GPHOTO2_SaneCapability (pTW_CAPABILITY pCapability, TW_UINT16 action) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(twain);
|
WINE_DEFAULT_DEBUG_CHANNEL(twain);
|
||||||
|
|
||||||
|
struct tagActiveDS activeDS;
|
||||||
|
|
||||||
DSMENTRYPROC GPHOTO2_dsmentry;
|
DSMENTRYPROC GPHOTO2_dsmentry;
|
||||||
|
|
||||||
#ifdef HAVE_GPHOTO2
|
#ifdef HAVE_GPHOTO2
|
||||||
|
|
|
@ -2791,9 +2791,13 @@ DWORD WINAPI NotifyRouteChange(PHANDLE Handle, LPOVERLAPPED overlapped)
|
||||||
DWORD WINAPI NotifyUnicastIpAddressChange(ADDRESS_FAMILY family, PUNICAST_IPADDRESS_CHANGE_CALLBACK callback,
|
DWORD WINAPI NotifyUnicastIpAddressChange(ADDRESS_FAMILY family, PUNICAST_IPADDRESS_CHANGE_CALLBACK callback,
|
||||||
PVOID context, BOOLEAN init_notify, PHANDLE handle)
|
PVOID context, BOOLEAN init_notify, PHANDLE handle)
|
||||||
{
|
{
|
||||||
FIXME("(family %d, callback %p, context %p, init_notify %d, handle %p): stub\n",
|
FIXME("(family %d, callback %p, context %p, init_notify %d, handle %p): semi-stub\n",
|
||||||
family, callback, context, init_notify, handle);
|
family, callback, context, init_notify, handle);
|
||||||
if (handle) *handle = NULL;
|
if (handle) *handle = NULL;
|
||||||
|
|
||||||
|
if (init_notify)
|
||||||
|
callback(context, NULL, MibInitialNotification);
|
||||||
|
|
||||||
return ERROR_NOT_SUPPORTED;
|
return ERROR_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -100,6 +100,9 @@ static DWORD (WINAPI *pConvertInterfaceNameToLuidA)(const char*,NET_LUID*);
|
||||||
static DWORD (WINAPI *pConvertInterfaceNameToLuidW)(const WCHAR*,NET_LUID*);
|
static DWORD (WINAPI *pConvertInterfaceNameToLuidW)(const WCHAR*,NET_LUID*);
|
||||||
static DWORD (WINAPI *pConvertLengthToIpv4Mask)(ULONG,ULONG*);
|
static DWORD (WINAPI *pConvertLengthToIpv4Mask)(ULONG,ULONG*);
|
||||||
static DWORD (WINAPI *pParseNetworkString)(const WCHAR*,DWORD,NET_ADDRESS_INFO*,USHORT*,BYTE*);
|
static DWORD (WINAPI *pParseNetworkString)(const WCHAR*,DWORD,NET_ADDRESS_INFO*,USHORT*,BYTE*);
|
||||||
|
static DWORD (WINAPI *pNotifyUnicastIpAddressChange)(ADDRESS_FAMILY, PUNICAST_IPADDRESS_CHANGE_CALLBACK,
|
||||||
|
PVOID, BOOLEAN, HANDLE *);
|
||||||
|
static DWORD (WINAPI *pCancelMibChangeNotify2)(HANDLE);
|
||||||
|
|
||||||
static PCHAR (WINAPI *pif_indextoname)(NET_IFINDEX,PCHAR);
|
static PCHAR (WINAPI *pif_indextoname)(NET_IFINDEX,PCHAR);
|
||||||
static NET_IFINDEX (WINAPI *pif_nametoindex)(const char*);
|
static NET_IFINDEX (WINAPI *pif_nametoindex)(const char*);
|
||||||
|
@ -158,6 +161,8 @@ static void loadIPHlpApi(void)
|
||||||
pParseNetworkString = (void *)GetProcAddress(hLibrary, "ParseNetworkString");
|
pParseNetworkString = (void *)GetProcAddress(hLibrary, "ParseNetworkString");
|
||||||
pif_indextoname = (void *)GetProcAddress(hLibrary, "if_indextoname");
|
pif_indextoname = (void *)GetProcAddress(hLibrary, "if_indextoname");
|
||||||
pif_nametoindex = (void *)GetProcAddress(hLibrary, "if_nametoindex");
|
pif_nametoindex = (void *)GetProcAddress(hLibrary, "if_nametoindex");
|
||||||
|
pNotifyUnicastIpAddressChange = (void *)GetProcAddress(hLibrary, "NotifyUnicastIpAddressChange");
|
||||||
|
pCancelMibChangeNotify2 = (void *)GetProcAddress(hLibrary, "CancelMibChangeNotify2");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2381,6 +2386,41 @@ static void test_ParseNetworkString(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void WINAPI test_ipaddtess_change_callback(PVOID context, PMIB_UNICASTIPADDRESS_ROW row,
|
||||||
|
MIB_NOTIFICATION_TYPE notification_type)
|
||||||
|
{
|
||||||
|
BOOL *callback_called = context;
|
||||||
|
|
||||||
|
*callback_called = TRUE;
|
||||||
|
|
||||||
|
ok(notification_type == MibInitialNotification, "Unexpected notification_type %#x.\n",
|
||||||
|
notification_type);
|
||||||
|
ok(!row, "Unexpected row %p.\n", row);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_NotifyUnicastIpAddressChange(void)
|
||||||
|
{
|
||||||
|
BOOL callback_called;
|
||||||
|
HANDLE handle;
|
||||||
|
DWORD ret;
|
||||||
|
|
||||||
|
if (!pNotifyUnicastIpAddressChange)
|
||||||
|
{
|
||||||
|
win_skip("NotifyUnicastIpAddressChange not available.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
callback_called = FALSE;
|
||||||
|
ret = pNotifyUnicastIpAddressChange(AF_INET, test_ipaddtess_change_callback,
|
||||||
|
&callback_called, TRUE, &handle);
|
||||||
|
todo_wine ok(ret == NO_ERROR, "Unexpected ret %#x.\n", ret);
|
||||||
|
ok(callback_called, "Callback was not called.\n");
|
||||||
|
|
||||||
|
ret = pCancelMibChangeNotify2(handle);
|
||||||
|
ok(ret == NO_ERROR, "Unexpected ret %#x.\n", ret);
|
||||||
|
ok(!CloseHandle(handle), "CloseHandle() succeded.\n");
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(iphlpapi)
|
START_TEST(iphlpapi)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -2411,6 +2451,7 @@ START_TEST(iphlpapi)
|
||||||
test_ConvertLengthToIpv4Mask();
|
test_ConvertLengthToIpv4Mask();
|
||||||
test_GetUdp6Table();
|
test_GetUdp6Table();
|
||||||
test_ParseNetworkString();
|
test_ParseNetworkString();
|
||||||
|
test_NotifyUnicastIpAddressChange();
|
||||||
freeIPHlpApi();
|
freeIPHlpApi();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3142,6 +3142,53 @@ static void test_GetConsoleScreenBufferInfoEx(HANDLE std_output)
|
||||||
ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError());
|
ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_SetConsoleScreenBufferInfoEx(HANDLE std_output)
|
||||||
|
{
|
||||||
|
BOOL ret;
|
||||||
|
HANDLE hmod;
|
||||||
|
HANDLE std_input = CreateFileA("CONIN$", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
|
||||||
|
BOOL (WINAPI *pSetConsoleScreenBufferInfoEx)(HANDLE, CONSOLE_SCREEN_BUFFER_INFOEX *);
|
||||||
|
BOOL (WINAPI *pGetConsoleScreenBufferInfoEx)(HANDLE, CONSOLE_SCREEN_BUFFER_INFOEX *);
|
||||||
|
CONSOLE_SCREEN_BUFFER_INFOEX info;
|
||||||
|
|
||||||
|
hmod = GetModuleHandleA("kernel32.dll");
|
||||||
|
pSetConsoleScreenBufferInfoEx = (void *)GetProcAddress(hmod, "SetConsoleScreenBufferInfoEx");
|
||||||
|
pGetConsoleScreenBufferInfoEx = (void *)GetProcAddress(hmod, "GetConsoleScreenBufferInfoEx");
|
||||||
|
if (!pSetConsoleScreenBufferInfoEx || !pGetConsoleScreenBufferInfoEx)
|
||||||
|
{
|
||||||
|
win_skip("SetConsoleScreenBufferInfoEx is not available\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&info, 0, sizeof(CONSOLE_SCREEN_BUFFER_INFOEX));
|
||||||
|
info.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
|
||||||
|
pGetConsoleScreenBufferInfoEx(std_output, &info);
|
||||||
|
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
ret = pSetConsoleScreenBufferInfoEx(NULL, &info);
|
||||||
|
ok(!ret, "got %d, expected zero\n", ret);
|
||||||
|
ok(GetLastError() == ERROR_INVALID_HANDLE, "got %u, expected 6\n", GetLastError());
|
||||||
|
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
ret = pSetConsoleScreenBufferInfoEx(std_output, &info);
|
||||||
|
ok(ret, "got %d, expected one\n", ret);
|
||||||
|
ok(GetLastError() == 0xdeadbeef, "got %u, expected 0xdeadbeef\n", GetLastError());
|
||||||
|
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
ret = pSetConsoleScreenBufferInfoEx(std_input, &info);
|
||||||
|
ok(!ret, "got %d, expected zero\n", ret);
|
||||||
|
ok(GetLastError() == ERROR_INVALID_HANDLE || GetLastError() == ERROR_ACCESS_DENIED,
|
||||||
|
"got %u, expected 5 or 6\n", GetLastError());
|
||||||
|
|
||||||
|
info.cbSize = 0;
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
ret = pSetConsoleScreenBufferInfoEx(std_output, &info);
|
||||||
|
ok(!ret, "got %d, expected zero\n", ret);
|
||||||
|
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %u, expected 87\n", GetLastError());
|
||||||
|
|
||||||
|
CloseHandle(std_input);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_AttachConsole_child(DWORD console_pid)
|
static void test_AttachConsole_child(DWORD console_pid)
|
||||||
{
|
{
|
||||||
HANDLE pipe_in, pipe_out;
|
HANDLE pipe_in, pipe_out;
|
||||||
|
@ -3398,5 +3445,6 @@ START_TEST(console)
|
||||||
test_GetConsoleFontInfo(hConOut);
|
test_GetConsoleFontInfo(hConOut);
|
||||||
test_SetConsoleFont(hConOut);
|
test_SetConsoleFont(hConOut);
|
||||||
test_GetConsoleScreenBufferInfoEx(hConOut);
|
test_GetConsoleScreenBufferInfoEx(hConOut);
|
||||||
|
test_SetConsoleScreenBufferInfoEx(hConOut);
|
||||||
test_AttachConsole(hConOut);
|
test_AttachConsole(hConOut);
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,7 @@ static BOOL (WINAPI *pRtlDosPathNameToNtPathName_U)(LPCWSTR, PUNICODE_STRING, PW
|
||||||
static NTSTATUS (WINAPI *pRtlAnsiStringToUnicodeString)(PUNICODE_STRING, PCANSI_STRING, BOOLEAN);
|
static NTSTATUS (WINAPI *pRtlAnsiStringToUnicodeString)(PUNICODE_STRING, PCANSI_STRING, BOOLEAN);
|
||||||
static BOOL (WINAPI *pSetFileInformationByHandle)(HANDLE, FILE_INFO_BY_HANDLE_CLASS, void*, DWORD);
|
static BOOL (WINAPI *pSetFileInformationByHandle)(HANDLE, FILE_INFO_BY_HANDLE_CLASS, void*, DWORD);
|
||||||
static BOOL (WINAPI *pGetQueuedCompletionStatusEx)(HANDLE, OVERLAPPED_ENTRY*, ULONG, ULONG*, DWORD, BOOL);
|
static BOOL (WINAPI *pGetQueuedCompletionStatusEx)(HANDLE, OVERLAPPED_ENTRY*, ULONG, ULONG*, DWORD, BOOL);
|
||||||
|
static HANDLE (WINAPI *pReOpenFile)(HANDLE, DWORD, DWORD, DWORD);
|
||||||
static void (WINAPI *pRtlInitAnsiString)(PANSI_STRING,PCSZ);
|
static void (WINAPI *pRtlInitAnsiString)(PANSI_STRING,PCSZ);
|
||||||
static void (WINAPI *pRtlFreeUnicodeString)(PUNICODE_STRING);
|
static void (WINAPI *pRtlFreeUnicodeString)(PUNICODE_STRING);
|
||||||
static BOOL (WINAPI *pSetFileCompletionNotificationModes)(HANDLE, UCHAR);
|
static BOOL (WINAPI *pSetFileCompletionNotificationModes)(HANDLE, UCHAR);
|
||||||
|
@ -111,6 +112,7 @@ static void InitFunctionPointers(void)
|
||||||
pGetFinalPathNameByHandleW = (void *) GetProcAddress(hkernel32, "GetFinalPathNameByHandleW");
|
pGetFinalPathNameByHandleW = (void *) GetProcAddress(hkernel32, "GetFinalPathNameByHandleW");
|
||||||
pSetFileInformationByHandle = (void *) GetProcAddress(hkernel32, "SetFileInformationByHandle");
|
pSetFileInformationByHandle = (void *) GetProcAddress(hkernel32, "SetFileInformationByHandle");
|
||||||
pGetQueuedCompletionStatusEx = (void *) GetProcAddress(hkernel32, "GetQueuedCompletionStatusEx");
|
pGetQueuedCompletionStatusEx = (void *) GetProcAddress(hkernel32, "GetQueuedCompletionStatusEx");
|
||||||
|
pReOpenFile = (void *) GetProcAddress(hkernel32, "ReOpenFile");
|
||||||
pSetFileCompletionNotificationModes = (void *)GetProcAddress(hkernel32, "SetFileCompletionNotificationModes");
|
pSetFileCompletionNotificationModes = (void *)GetProcAddress(hkernel32, "SetFileCompletionNotificationModes");
|
||||||
pFindFirstStreamW = (void *)GetProcAddress(hkernel32, "FindFirstStreamW");
|
pFindFirstStreamW = (void *)GetProcAddress(hkernel32, "FindFirstStreamW");
|
||||||
}
|
}
|
||||||
|
@ -4410,6 +4412,104 @@ static void test_SetFileValidData(void)
|
||||||
DeleteFileA(filename);
|
DeleteFileA(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_ReOpenFile(void)
|
||||||
|
{
|
||||||
|
char path[MAX_PATH], filename[MAX_PATH], buffer[4];
|
||||||
|
HANDLE file, new;
|
||||||
|
unsigned int i;
|
||||||
|
DWORD size;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
|
static const DWORD invalid_attributes[] =
|
||||||
|
{
|
||||||
|
FILE_ATTRIBUTE_ARCHIVE,
|
||||||
|
FILE_ATTRIBUTE_ENCRYPTED,
|
||||||
|
FILE_ATTRIBUTE_HIDDEN,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
FILE_ATTRIBUTE_OFFLINE,
|
||||||
|
FILE_ATTRIBUTE_READONLY,
|
||||||
|
FILE_ATTRIBUTE_SYSTEM,
|
||||||
|
FILE_ATTRIBUTE_TEMPORARY,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DWORD valid_attributes[] =
|
||||||
|
{
|
||||||
|
FILE_FLAG_BACKUP_SEMANTICS,
|
||||||
|
FILE_FLAG_NO_BUFFERING,
|
||||||
|
FILE_FLAG_OVERLAPPED,
|
||||||
|
FILE_FLAG_RANDOM_ACCESS,
|
||||||
|
FILE_FLAG_SEQUENTIAL_SCAN,
|
||||||
|
FILE_FLAG_WRITE_THROUGH,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!pReOpenFile)
|
||||||
|
{
|
||||||
|
win_skip("ReOpenFile() is not available\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GetTempPathA(sizeof(path), path);
|
||||||
|
GetTempFileNameA(path, "tst", 0, filename);
|
||||||
|
|
||||||
|
file = CreateFileA(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL,
|
||||||
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
ok(file != INVALID_HANDLE_VALUE, "failed to create file, error %u\n", GetLastError());
|
||||||
|
ret = WriteFile(file, "foo", 4, &size, NULL);
|
||||||
|
ok(ret, "failed to write file, error %u\n", GetLastError());
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(invalid_attributes); ++i)
|
||||||
|
{
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
new = pReOpenFile(file, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, invalid_attributes[i]);
|
||||||
|
ok(new == INVALID_HANDLE_VALUE, "got %p\n", new);
|
||||||
|
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %u\n", GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
|
new = pReOpenFile(file, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0);
|
||||||
|
ok(new != INVALID_HANDLE_VALUE, "got error %u\n", GetLastError());
|
||||||
|
|
||||||
|
ret = ReadFile(new, buffer, sizeof(buffer), &size, NULL);
|
||||||
|
ok(ret, "failed to read file, error %u\n", GetLastError());
|
||||||
|
ok(size == 4, "got size %u\n", size);
|
||||||
|
ok(!strcmp(buffer, "foo"), "got wrong data\n");
|
||||||
|
CloseHandle(new);
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(valid_attributes); ++i)
|
||||||
|
{
|
||||||
|
new = pReOpenFile(file, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, valid_attributes[i]);
|
||||||
|
ok(new != INVALID_HANDLE_VALUE, "got error %u\n", GetLastError());
|
||||||
|
CloseHandle(new);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
new = pReOpenFile(file, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0);
|
||||||
|
ok(new == INVALID_HANDLE_VALUE, "got %p\n", new);
|
||||||
|
ok(GetLastError() == ERROR_SHARING_VIOLATION, "got error %u\n", GetLastError());
|
||||||
|
|
||||||
|
CloseHandle(file);
|
||||||
|
ret = DeleteFileA(filename);
|
||||||
|
ok(ret, "failed to delete file, error %u\n", GetLastError());
|
||||||
|
|
||||||
|
file = CreateNamedPipeA("\\\\.\\pipe\\test_pipe", PIPE_ACCESS_DUPLEX, 0, 1, 1000, 1000, 1000, NULL);
|
||||||
|
ok(file != INVALID_HANDLE_VALUE, "failed to create pipe, error %u\n", GetLastError());
|
||||||
|
|
||||||
|
new = pReOpenFile(file, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0);
|
||||||
|
todo_wine ok(new != INVALID_HANDLE_VALUE, "got error %u\n", GetLastError());
|
||||||
|
|
||||||
|
ret = WriteFile(file, "foo", 4, &size, NULL);
|
||||||
|
todo_wine ok(ret, "failed to write file, error %u\n", GetLastError());
|
||||||
|
ret = ReadFile(new, buffer, sizeof(buffer), &size, NULL);
|
||||||
|
todo_wine ok(ret, "failed to read file, error %u\n", GetLastError());
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
ok(size == 4, "got size %u\n", size);
|
||||||
|
ok(!strcmp(buffer, "foo"), "got wrong data\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(new);
|
||||||
|
CloseHandle(file);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_WriteFileGather(void)
|
static void test_WriteFileGather(void)
|
||||||
{
|
{
|
||||||
char temp_path[MAX_PATH], filename[MAX_PATH];
|
char temp_path[MAX_PATH], filename[MAX_PATH];
|
||||||
|
@ -5483,4 +5583,5 @@ START_TEST(file)
|
||||||
test_file_readonly_access();
|
test_file_readonly_access();
|
||||||
test_find_file_stream();
|
test_find_file_stream();
|
||||||
test_SetFileTime();
|
test_SetFileTime();
|
||||||
|
test_ReOpenFile();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1141,6 +1141,7 @@ static void test_Toolhelp(void)
|
||||||
STARTUPINFOA startup;
|
STARTUPINFOA startup;
|
||||||
PROCESS_INFORMATION info;
|
PROCESS_INFORMATION info;
|
||||||
HANDLE process, thread, snapshot;
|
HANDLE process, thread, snapshot;
|
||||||
|
DWORD nested_pid;
|
||||||
PROCESSENTRY32 pe;
|
PROCESSENTRY32 pe;
|
||||||
THREADENTRY32 te;
|
THREADENTRY32 te;
|
||||||
DWORD ret;
|
DWORD ret;
|
||||||
|
@ -1193,17 +1194,24 @@ static void test_Toolhelp(void)
|
||||||
/* The following test fails randomly on some Windows versions, but Gothic 2 depends on it */
|
/* The following test fails randomly on some Windows versions, but Gothic 2 depends on it */
|
||||||
ok(i < 20 || broken(i == 20), "process object not released\n");
|
ok(i < 20 || broken(i == 20), "process object not released\n");
|
||||||
|
|
||||||
|
/* Look for the nested process by pid */
|
||||||
|
WritePrivateProfileStringA(NULL, NULL, NULL, resfile);
|
||||||
|
nested_pid = GetPrivateProfileIntA("Nested", "Pid", 0, resfile);
|
||||||
|
DeleteFileA(resfile);
|
||||||
|
|
||||||
snapshot = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
snapshot = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||||
ok(snapshot != INVALID_HANDLE_VALUE, "CreateToolhelp32Snapshot failed %u\n", GetLastError());
|
ok(snapshot != INVALID_HANDLE_VALUE, "CreateToolhelp32Snapshot failed %u\n", GetLastError());
|
||||||
memset(&pe, 0, sizeof(pe));
|
memset(&pe, 0, sizeof(pe));
|
||||||
pe.dwSize = sizeof(pe);
|
pe.dwSize = sizeof(pe);
|
||||||
if (pProcess32First(snapshot, &pe))
|
if (pProcess32First(snapshot, &pe))
|
||||||
{
|
{
|
||||||
while (pe.th32ParentProcessID != info.dwProcessId)
|
while (pe.th32ProcessID != nested_pid)
|
||||||
if (!pProcess32Next(snapshot, &pe)) break;
|
if (!pProcess32Next(snapshot, &pe)) break;
|
||||||
}
|
}
|
||||||
CloseHandle(snapshot);
|
CloseHandle(snapshot);
|
||||||
ok(pe.th32ParentProcessID == info.dwProcessId, "failed to find nested child process\n");
|
ok(pe.th32ProcessID == nested_pid, "failed to find nested child process\n");
|
||||||
|
ok(pe.th32ParentProcessID == info.dwProcessId, "nested child process has parent %u instead of %u\n", pe.th32ParentProcessID, info.dwProcessId);
|
||||||
|
ok(stricmp(pe.szExeFile, exename) == 0, "nested executable is %s instead of %s\n", pe.szExeFile, exename);
|
||||||
|
|
||||||
process = OpenProcess(PROCESS_ALL_ACCESS_NT4, FALSE, pe.th32ProcessID);
|
process = OpenProcess(PROCESS_ALL_ACCESS_NT4, FALSE, pe.th32ProcessID);
|
||||||
ok(process != NULL, "OpenProcess failed %u\n", GetLastError());
|
ok(process != NULL, "OpenProcess failed %u\n", GetLastError());
|
||||||
|
@ -1226,7 +1234,8 @@ static void test_Toolhelp(void)
|
||||||
ok(ret == 1, "expected 1, got %u\n", ret);
|
ok(ret == 1, "expected 1, got %u\n", ret);
|
||||||
CloseHandle(thread);
|
CloseHandle(thread);
|
||||||
|
|
||||||
ok(WaitForSingleObject(process, 30000) == WAIT_OBJECT_0, "Child process termination\n");
|
ret = WaitForSingleObject(process, 30000);
|
||||||
|
ok(ret == WAIT_OBJECT_0, "Child process termination got %u le=%u\n", ret, GetLastError());
|
||||||
CloseHandle(process);
|
CloseHandle(process);
|
||||||
|
|
||||||
WritePrivateProfileStringA(NULL, NULL, NULL, resfile);
|
WritePrivateProfileStringA(NULL, NULL, NULL, resfile);
|
||||||
|
@ -4037,6 +4046,7 @@ START_TEST(process)
|
||||||
char buffer[MAX_PATH];
|
char buffer[MAX_PATH];
|
||||||
STARTUPINFOA startup;
|
STARTUPINFOA startup;
|
||||||
PROCESS_INFORMATION info;
|
PROCESS_INFORMATION info;
|
||||||
|
HANDLE hFile;
|
||||||
|
|
||||||
memset(&startup, 0, sizeof(startup));
|
memset(&startup, 0, sizeof(startup));
|
||||||
startup.cb = sizeof(startup);
|
startup.cb = sizeof(startup);
|
||||||
|
@ -4047,6 +4057,14 @@ START_TEST(process)
|
||||||
ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &startup, &info), "CreateProcess failed\n");
|
ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &startup, &info), "CreateProcess failed\n");
|
||||||
CloseHandle(info.hProcess);
|
CloseHandle(info.hProcess);
|
||||||
CloseHandle(info.hThread);
|
CloseHandle(info.hThread);
|
||||||
|
|
||||||
|
/* The nested process is suspended so we can use the same resource
|
||||||
|
* file and it's up to the parent to read it before resuming the
|
||||||
|
* nested process.
|
||||||
|
*/
|
||||||
|
hFile = CreateFileA(myARGV[3], GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
|
||||||
|
childPrintf(hFile, "[Nested]\nPid=%08u\n", info.dwProcessId);
|
||||||
|
CloseHandle(hFile);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (!strcmp(myARGV[2], "parent") && myARGC >= 5)
|
else if (!strcmp(myARGV[2], "parent") && myARGC >= 5)
|
||||||
|
|
|
@ -1146,9 +1146,39 @@ BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleOutputCP( UINT cp )
|
||||||
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleScreenBufferInfoEx( HANDLE handle,
|
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleScreenBufferInfoEx( HANDLE handle,
|
||||||
CONSOLE_SCREEN_BUFFER_INFOEX *info )
|
CONSOLE_SCREEN_BUFFER_INFOEX *info )
|
||||||
{
|
{
|
||||||
FIXME( "(%p %p): stub!\n", handle, info );
|
BOOL ret;
|
||||||
SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
|
|
||||||
return FALSE;
|
TRACE("(%p, %p)\n", handle, info);
|
||||||
|
|
||||||
|
if (info->cbSize != sizeof(CONSOLE_SCREEN_BUFFER_INFOEX))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SERVER_START_REQ( set_console_output_info )
|
||||||
|
{
|
||||||
|
req->handle = console_handle_unmap( handle );
|
||||||
|
req->mask = SET_CONSOLE_OUTPUT_INFO_CURSOR_POS | SET_CONSOLE_OUTPUT_INFO_SIZE |
|
||||||
|
SET_CONSOLE_OUTPUT_INFO_ATTR | SET_CONSOLE_OUTPUT_INFO_POPUP_ATTR |
|
||||||
|
SET_CONSOLE_OUTPUT_INFO_DISPLAY_WINDOW | SET_CONSOLE_OUTPUT_INFO_MAX_SIZE;
|
||||||
|
req->width = info->dwSize.X;
|
||||||
|
req->height = info->dwSize.Y;
|
||||||
|
req->cursor_x = info->dwCursorPosition.X;
|
||||||
|
req->cursor_y = info->dwCursorPosition.Y;
|
||||||
|
req->attr = info->wAttributes;
|
||||||
|
req->win_left = info->srWindow.Left;
|
||||||
|
req->win_top = info->srWindow.Top;
|
||||||
|
req->win_right = info->srWindow.Right;
|
||||||
|
req->win_bottom = info->srWindow.Bottom;
|
||||||
|
req->popup_attr = info->wPopupAttributes;
|
||||||
|
req->max_width = min( info->dwMaximumWindowSize.X, info->dwSize.X );
|
||||||
|
req->max_height = min( info->dwMaximumWindowSize.Y, info->dwSize.Y );
|
||||||
|
ret = !wine_server_call_err( req );
|
||||||
|
}
|
||||||
|
SERVER_END_REQ;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -432,6 +432,26 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileA( LPCSTR name, DWORD access, DWORD sh
|
||||||
return CreateFileW( nameW, access, sharing, sa, creation, attributes, template );
|
return CreateFileW( nameW, access, sharing, sa, creation, attributes, template );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UINT get_nt_file_options( DWORD attributes )
|
||||||
|
{
|
||||||
|
UINT options = 0;
|
||||||
|
|
||||||
|
if (attributes & FILE_FLAG_BACKUP_SEMANTICS)
|
||||||
|
options |= FILE_OPEN_FOR_BACKUP_INTENT;
|
||||||
|
else
|
||||||
|
options |= FILE_NON_DIRECTORY_FILE;
|
||||||
|
if (attributes & FILE_FLAG_DELETE_ON_CLOSE)
|
||||||
|
options |= FILE_DELETE_ON_CLOSE;
|
||||||
|
if (attributes & FILE_FLAG_NO_BUFFERING)
|
||||||
|
options |= FILE_NO_INTERMEDIATE_BUFFERING;
|
||||||
|
if (!(attributes & FILE_FLAG_OVERLAPPED))
|
||||||
|
options |= FILE_SYNCHRONOUS_IO_NONALERT;
|
||||||
|
if (attributes & FILE_FLAG_RANDOM_ACCESS)
|
||||||
|
options |= FILE_RANDOM_ACCESS;
|
||||||
|
if (attributes & FILE_FLAG_WRITE_THROUGH)
|
||||||
|
options |= FILE_WRITE_THROUGH;
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* CreateFileW (kernelbase.@)
|
* CreateFileW (kernelbase.@)
|
||||||
|
@ -441,7 +461,6 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
|
||||||
DWORD attributes, HANDLE template )
|
DWORD attributes, HANDLE template )
|
||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
UINT options;
|
|
||||||
OBJECT_ATTRIBUTES attr;
|
OBJECT_ATTRIBUTES attr;
|
||||||
UNICODE_STRING nameW;
|
UNICODE_STRING nameW;
|
||||||
IO_STATUS_BLOCK io;
|
IO_STATUS_BLOCK io;
|
||||||
|
@ -543,25 +562,8 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
|
||||||
|
|
||||||
/* now call NtCreateFile */
|
/* now call NtCreateFile */
|
||||||
|
|
||||||
options = 0;
|
|
||||||
if (attributes & FILE_FLAG_BACKUP_SEMANTICS)
|
|
||||||
options |= FILE_OPEN_FOR_BACKUP_INTENT;
|
|
||||||
else
|
|
||||||
options |= FILE_NON_DIRECTORY_FILE;
|
|
||||||
if (attributes & FILE_FLAG_DELETE_ON_CLOSE)
|
if (attributes & FILE_FLAG_DELETE_ON_CLOSE)
|
||||||
{
|
|
||||||
options |= FILE_DELETE_ON_CLOSE;
|
|
||||||
access |= DELETE;
|
access |= DELETE;
|
||||||
}
|
|
||||||
if (attributes & FILE_FLAG_NO_BUFFERING)
|
|
||||||
options |= FILE_NO_INTERMEDIATE_BUFFERING;
|
|
||||||
if (!(attributes & FILE_FLAG_OVERLAPPED))
|
|
||||||
options |= FILE_SYNCHRONOUS_IO_NONALERT;
|
|
||||||
if (attributes & FILE_FLAG_RANDOM_ACCESS)
|
|
||||||
options |= FILE_RANDOM_ACCESS;
|
|
||||||
if (attributes & FILE_FLAG_WRITE_THROUGH)
|
|
||||||
options |= FILE_WRITE_THROUGH;
|
|
||||||
attributes &= FILE_ATTRIBUTE_VALID_FLAGS;
|
|
||||||
|
|
||||||
attr.Length = sizeof(attr);
|
attr.Length = sizeof(attr);
|
||||||
attr.RootDirectory = 0;
|
attr.RootDirectory = 0;
|
||||||
|
@ -582,8 +584,9 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
|
||||||
if (sa && sa->bInheritHandle) attr.Attributes |= OBJ_INHERIT;
|
if (sa && sa->bInheritHandle) attr.Attributes |= OBJ_INHERIT;
|
||||||
|
|
||||||
status = NtCreateFile( &ret, access | SYNCHRONIZE | FILE_READ_ATTRIBUTES, &attr, &io,
|
status = NtCreateFile( &ret, access | SYNCHRONIZE | FILE_READ_ATTRIBUTES, &attr, &io,
|
||||||
NULL, attributes, sharing, nt_disposition[creation - CREATE_NEW],
|
NULL, attributes & FILE_ATTRIBUTE_VALID_FLAGS, sharing,
|
||||||
options, NULL, 0 );
|
nt_disposition[creation - CREATE_NEW],
|
||||||
|
get_nt_file_options( attributes ), NULL, 0 );
|
||||||
if (status)
|
if (status)
|
||||||
{
|
{
|
||||||
if (vxd_name && vxd_name[0])
|
if (vxd_name && vxd_name[0])
|
||||||
|
@ -2550,10 +2553,41 @@ HANDLE WINAPI DECLSPEC_HOTPATCH OpenFileById( HANDLE handle, LPFILE_ID_DESCRIPTO
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* ReOpenFile (kernelbase.@)
|
* ReOpenFile (kernelbase.@)
|
||||||
*/
|
*/
|
||||||
HANDLE WINAPI /* DECLSPEC_HOTPATCH */ ReOpenFile( HANDLE handle, DWORD access, DWORD sharing, DWORD flags )
|
HANDLE WINAPI DECLSPEC_HOTPATCH ReOpenFile( HANDLE handle, DWORD access, DWORD sharing, DWORD attributes )
|
||||||
{
|
{
|
||||||
FIXME( "(%p, %d, %d, %d): stub\n", handle, access, sharing, flags );
|
SECURITY_QUALITY_OF_SERVICE qos;
|
||||||
return INVALID_HANDLE_VALUE;
|
OBJECT_ATTRIBUTES attr;
|
||||||
|
UNICODE_STRING empty = { 0 };
|
||||||
|
IO_STATUS_BLOCK io;
|
||||||
|
NTSTATUS status;
|
||||||
|
HANDLE file;
|
||||||
|
|
||||||
|
TRACE("handle %p, access %#x, sharing %#x, attributes %#x.\n", handle, access, sharing, attributes);
|
||||||
|
|
||||||
|
if (attributes & 0x7ffff) /* FILE_ATTRIBUTE_* flags are invalid */
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attributes & FILE_FLAG_DELETE_ON_CLOSE)
|
||||||
|
access |= DELETE;
|
||||||
|
|
||||||
|
InitializeObjectAttributes( &attr, &empty, OBJ_CASE_INSENSITIVE, handle, NULL );
|
||||||
|
if (attributes & SECURITY_SQOS_PRESENT)
|
||||||
|
{
|
||||||
|
qos.Length = sizeof(qos);
|
||||||
|
qos.ImpersonationLevel = (attributes >> 16) & 0x3;
|
||||||
|
qos.ContextTrackingMode = attributes & SECURITY_CONTEXT_TRACKING ? SECURITY_DYNAMIC_TRACKING : SECURITY_STATIC_TRACKING;
|
||||||
|
qos.EffectiveOnly = (attributes & SECURITY_EFFECTIVE_ONLY) != 0;
|
||||||
|
attr.SecurityQualityOfService = &qos;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = NtCreateFile( &file, access | SYNCHRONIZE | FILE_READ_ATTRIBUTES, &attr, &io, NULL,
|
||||||
|
0, sharing, FILE_OPEN, get_nt_file_options( attributes ), NULL, 0 );
|
||||||
|
if (!set_ntstatus( status ))
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2475,11 +2475,12 @@ DWORD WINAPIV CallProc32W16( DWORD nrofargs, DWORD argconvmask, FARPROC proc32,
|
||||||
DWORD WINAPIV CallProcEx32W16( DWORD nrofargs, DWORD argconvmask, FARPROC proc32, VA_LIST16 valist )
|
DWORD WINAPIV CallProcEx32W16( DWORD nrofargs, DWORD argconvmask, FARPROC proc32, VA_LIST16 valist )
|
||||||
{
|
{
|
||||||
DWORD args[32];
|
DWORD args[32];
|
||||||
unsigned int i;
|
unsigned int i, count = min( 32, nrofargs & ~CPEX_DEST_CDECL );
|
||||||
|
|
||||||
TRACE("(%d,%d,%p args[",nrofargs,argconvmask,proc32);
|
TRACE("(%s,%d,%d,%p args[", nrofargs & CPEX_DEST_CDECL ? "cdecl": "stdcall",
|
||||||
|
nrofargs & ~CPEX_DEST_CDECL, argconvmask, proc32);
|
||||||
|
|
||||||
for (i=0;i<nrofargs;i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
if (argconvmask & (1<<i))
|
if (argconvmask & (1<<i))
|
||||||
{
|
{
|
||||||
|
|
|
@ -92,8 +92,8 @@
|
||||||
@ stdcall WcsEnumColorProfilesSize(long ptr ptr)
|
@ stdcall WcsEnumColorProfilesSize(long ptr ptr)
|
||||||
@ stub WcsGetCalibrationManagementState
|
@ stub WcsGetCalibrationManagementState
|
||||||
@ stub WcsGetDefaultColorProfile
|
@ stub WcsGetDefaultColorProfile
|
||||||
@ stub WcsGetDefaultColorProfileSize
|
@ stdcall WcsGetDefaultColorProfileSize(long wstr long long long ptr)
|
||||||
@ stub WcsGetDefaultRenderingIntent
|
@ stdcall WcsGetDefaultRenderingIntent(long ptr)
|
||||||
@ stdcall WcsGetUsePerUserProfiles(wstr long ptr)
|
@ stdcall WcsGetUsePerUserProfiles(wstr long ptr)
|
||||||
@ stub WcsGpCanInstallOrUninstallProfiles
|
@ stub WcsGpCanInstallOrUninstallProfiles
|
||||||
@ stdcall WcsOpenColorProfileA(ptr ptr ptr long long long long)
|
@ stdcall WcsOpenColorProfileA(ptr ptr ptr long long long long)
|
||||||
|
|
|
@ -1552,6 +1552,28 @@ BOOL WINAPI WcsEnumColorProfilesSize( WCS_PROFILE_MANAGEMENT_SCOPE scope, ENUMTY
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* WcsGetDefaultColorProfileSize [MSCMS.@]
|
||||||
|
*/
|
||||||
|
BOOL WINAPI WcsGetDefaultColorProfileSize( WCS_PROFILE_MANAGEMENT_SCOPE scope, PCWSTR device_name,
|
||||||
|
COLORPROFILETYPE type, COLORPROFILESUBTYPE subtype,
|
||||||
|
DWORD profile_id, PDWORD profile_size)
|
||||||
|
{
|
||||||
|
FIXME( "%d %s %d %d %d %p\n", scope, debugstr_w(device_name), type, subtype, profile_id, profile_size );
|
||||||
|
SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* WcsGetDefaultRednderingIntent [MSCMS.@]
|
||||||
|
*/
|
||||||
|
BOOL WINAPI WcsGetDefaultRenderingIntent( WCS_PROFILE_MANAGEMENT_SCOPE scope, PDWORD intent)
|
||||||
|
{
|
||||||
|
FIXME( "%d %p\n", scope, intent );
|
||||||
|
SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* WcsOpenColorProfileA [MSCMS.@]
|
* WcsOpenColorProfileA [MSCMS.@]
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -142,7 +142,7 @@ void init_css_style(CSSStyle*,nsIDOMCSSStyleDeclaration*,style_qi_t,
|
||||||
dispex_static_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
|
dispex_static_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
void CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode) DECLSPEC_HIDDEN;
|
void CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode) DECLSPEC_HIDDEN;
|
||||||
const dispex_static_data_vtbl_t CSSStyle_dispex_vtbl DECLSPEC_HIDDEN;
|
extern const dispex_static_data_vtbl_t CSSStyle_dispex_vtbl DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
HRESULT get_style_property(CSSStyle*,styleid_t,BSTR*) DECLSPEC_HIDDEN;
|
HRESULT get_style_property(CSSStyle*,styleid_t,BSTR*) DECLSPEC_HIDDEN;
|
||||||
HRESULT get_style_property_var(CSSStyle*,styleid_t,VARIANT*) DECLSPEC_HIDDEN;
|
HRESULT get_style_property_var(CSSStyle*,styleid_t,VARIANT*) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -51,6 +51,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
|
||||||
HINSTANCE hInst;
|
HINSTANCE hInst;
|
||||||
DWORD mshtml_tls = TLS_OUT_OF_INDEXES;
|
DWORD mshtml_tls = TLS_OUT_OF_INDEXES;
|
||||||
|
|
||||||
|
void (__cdecl *ccp_init)(ExternalCycleCollectionParticipant*,const CCObjCallback*);
|
||||||
|
nsrefcnt (__cdecl *ccref_decr)(nsCycleCollectingAutoRefCnt*,nsISupports*,ExternalCycleCollectionParticipant*);
|
||||||
|
nsrefcnt (__cdecl *ccref_incr)(nsCycleCollectingAutoRefCnt*,nsISupports*);
|
||||||
|
void (__cdecl *ccref_init)(nsCycleCollectingAutoRefCnt*,nsrefcnt);
|
||||||
|
void (__cdecl *describe_cc_node)(nsCycleCollectingAutoRefCnt*,const char*,nsCycleCollectionTraversalCallback*);
|
||||||
|
void (__cdecl *note_cc_edge)(nsISupports*,const char*,nsCycleCollectionTraversalCallback*);
|
||||||
|
|
||||||
static HINSTANCE shdoclc = NULL;
|
static HINSTANCE shdoclc = NULL;
|
||||||
static WCHAR *status_strings[IDS_STATUS_LAST-IDS_STATUS_FIRST+1];
|
static WCHAR *status_strings[IDS_STATUS_LAST-IDS_STATUS_FIRST+1];
|
||||||
static IMultiLanguage2 *mlang;
|
static IMultiLanguage2 *mlang;
|
||||||
|
|
|
@ -355,12 +355,12 @@ typedef struct {
|
||||||
|
|
||||||
DEFINE_GUID(IID_nsXPCOMCycleCollectionParticipant, 0x9674489b,0x1f6f,0x4550,0xa7,0x30, 0xcc,0xae,0xdd,0x10,0x4c,0xf9);
|
DEFINE_GUID(IID_nsXPCOMCycleCollectionParticipant, 0x9674489b,0x1f6f,0x4550,0xa7,0x30, 0xcc,0xae,0xdd,0x10,0x4c,0xf9);
|
||||||
|
|
||||||
nsrefcnt (__cdecl *ccref_incr)(nsCycleCollectingAutoRefCnt*,nsISupports*) DECLSPEC_HIDDEN;
|
extern nsrefcnt (__cdecl *ccref_incr)(nsCycleCollectingAutoRefCnt*,nsISupports*) DECLSPEC_HIDDEN;
|
||||||
nsrefcnt (__cdecl *ccref_decr)(nsCycleCollectingAutoRefCnt*,nsISupports*,ExternalCycleCollectionParticipant*) DECLSPEC_HIDDEN;
|
extern nsrefcnt (__cdecl *ccref_decr)(nsCycleCollectingAutoRefCnt*,nsISupports*,ExternalCycleCollectionParticipant*) DECLSPEC_HIDDEN;
|
||||||
void (__cdecl *ccref_init)(nsCycleCollectingAutoRefCnt*,nsrefcnt) DECLSPEC_HIDDEN;
|
extern void (__cdecl *ccref_init)(nsCycleCollectingAutoRefCnt*,nsrefcnt) DECLSPEC_HIDDEN;
|
||||||
void (__cdecl *ccp_init)(ExternalCycleCollectionParticipant*,const CCObjCallback*) DECLSPEC_HIDDEN;
|
extern void (__cdecl *ccp_init)(ExternalCycleCollectionParticipant*,const CCObjCallback*) DECLSPEC_HIDDEN;
|
||||||
void (__cdecl *describe_cc_node)(nsCycleCollectingAutoRefCnt*,const char*,nsCycleCollectionTraversalCallback*) DECLSPEC_HIDDEN;
|
extern void (__cdecl *describe_cc_node)(nsCycleCollectingAutoRefCnt*,const char*,nsCycleCollectionTraversalCallback*) DECLSPEC_HIDDEN;
|
||||||
void (__cdecl *note_cc_edge)(nsISupports*,const char*,nsCycleCollectionTraversalCallback*) DECLSPEC_HIDDEN;
|
extern void (__cdecl *note_cc_edge)(nsISupports*,const char*,nsCycleCollectionTraversalCallback*) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
void init_dispex_with_compat_mode(DispatchEx*,IUnknown*,dispex_static_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
|
void init_dispex_with_compat_mode(DispatchEx*,IUnknown*,dispex_static_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
|
||||||
void release_dispex(DispatchEx*) DECLSPEC_HIDDEN;
|
void release_dispex(DispatchEx*) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -51,6 +51,8 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(msi);
|
WINE_DEFAULT_DEBUG_CHANNEL(msi);
|
||||||
|
|
||||||
|
BOOL is_wow64;
|
||||||
|
|
||||||
static const WCHAR installerW[] = {'\\','I','n','s','t','a','l','l','e','r',0};
|
static const WCHAR installerW[] = {'\\','I','n','s','t','a','l','l','e','r',0};
|
||||||
|
|
||||||
UINT msi_locate_product(LPCWSTR szProduct, MSIINSTALLCONTEXT *context)
|
UINT msi_locate_product(LPCWSTR szProduct, MSIINSTALLCONTEXT *context)
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
#include "winemsi.h"
|
#include "winemsi.h"
|
||||||
|
|
||||||
static const BOOL is_64bit = sizeof(void *) > sizeof(int);
|
static const BOOL is_64bit = sizeof(void *) > sizeof(int);
|
||||||
BOOL is_wow64 DECLSPEC_HIDDEN;
|
extern BOOL is_wow64 DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
#define MSI_DATASIZEMASK 0x00ff
|
#define MSI_DATASIZEMASK 0x00ff
|
||||||
#define MSITYPE_VALID 0x0100
|
#define MSITYPE_VALID 0x0100
|
||||||
|
|
|
@ -16,12 +16,12 @@
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char PROG_FILES_DIR[MAX_PATH];
|
extern char PROG_FILES_DIR[MAX_PATH];
|
||||||
char PROG_FILES_DIR_NATIVE[MAX_PATH];
|
extern char PROG_FILES_DIR_NATIVE[MAX_PATH];
|
||||||
char COMMON_FILES_DIR[MAX_PATH];
|
extern char COMMON_FILES_DIR[MAX_PATH];
|
||||||
char APP_DATA_DIR[MAX_PATH];
|
extern char APP_DATA_DIR[MAX_PATH];
|
||||||
char WINDOWS_DIR[MAX_PATH];
|
extern char WINDOWS_DIR[MAX_PATH];
|
||||||
char CURR_DIR[MAX_PATH];
|
extern char CURR_DIR[MAX_PATH];
|
||||||
|
|
||||||
BOOL get_system_dirs(void);
|
BOOL get_system_dirs(void);
|
||||||
BOOL get_user_dirs(void);
|
BOOL get_user_dirs(void);
|
||||||
|
|
|
@ -314,7 +314,7 @@ logic_error* __thiscall MSVCP_logic_error_ctor( logic_error *this, exception_nam
|
||||||
#if _MSVCP_VER == 60
|
#if _MSVCP_VER == 60
|
||||||
MSVCP_exception_ctor(&this->e, "");
|
MSVCP_exception_ctor(&this->e, "");
|
||||||
#else
|
#else
|
||||||
MSVCP_exception_ctor(&this->e, NULL);
|
MSVCP_exception_default_ctor(&this->e);
|
||||||
#endif
|
#endif
|
||||||
MSVCP_basic_string_char_ctor_cstr(&this->str, EXCEPTION_STR(name));
|
MSVCP_basic_string_char_ctor_cstr(&this->str, EXCEPTION_STR(name));
|
||||||
#else
|
#else
|
||||||
|
@ -560,7 +560,7 @@ static runtime_error* MSVCP_runtime_error_ctor( runtime_error *this, exception_n
|
||||||
#if _MSVCP_VER == 60
|
#if _MSVCP_VER == 60
|
||||||
MSVCP_exception_ctor(&this->e, "");
|
MSVCP_exception_ctor(&this->e, "");
|
||||||
#else
|
#else
|
||||||
MSVCP_exception_ctor(&this->e, NULL);
|
MSVCP_exception_default_ctor(&this->e);
|
||||||
#endif
|
#endif
|
||||||
MSVCP_basic_string_char_ctor_cstr(&this->str, EXCEPTION_STR(name));
|
MSVCP_basic_string_char_ctor_cstr(&this->str, EXCEPTION_STR(name));
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -135,7 +135,10 @@ static int (__cdecl *p__memicmp)(const char*, const char*, size_t);
|
||||||
static int (__cdecl *p__memicmp_l)(const char*, const char*, size_t, _locale_t);
|
static int (__cdecl *p__memicmp_l)(const char*, const char*, size_t, _locale_t);
|
||||||
static int (__cdecl *p__vsnwprintf)(wchar_t *buffer,size_t count, const wchar_t *format, __ms_va_list valist);
|
static int (__cdecl *p__vsnwprintf)(wchar_t *buffer,size_t count, const wchar_t *format, __ms_va_list valist);
|
||||||
static size_t (__cdecl *p___strncnt)(const char *str, size_t count);
|
static size_t (__cdecl *p___strncnt)(const char *str, size_t count);
|
||||||
static int (__cdecl *p_swscanf)(const wchar_t *str, const wchar_t* format, ...);
|
static int (WINAPIV *p_swscanf)(const wchar_t *str, const wchar_t* format, ...);
|
||||||
|
static int (__cdecl *p____mb_cur_max_l_func)(_locale_t locale);
|
||||||
|
static _locale_t (__cdecl *p__create_locale)(int, const char*);
|
||||||
|
static void (__cdecl *p__free_locale)(_locale_t);
|
||||||
|
|
||||||
/* make sure we use the correct errno */
|
/* make sure we use the correct errno */
|
||||||
#undef errno
|
#undef errno
|
||||||
|
@ -402,6 +405,9 @@ static BOOL init(void)
|
||||||
SET(p__vsnwprintf, "_vsnwprintf");
|
SET(p__vsnwprintf, "_vsnwprintf");
|
||||||
SET(p___strncnt, "__strncnt");
|
SET(p___strncnt, "__strncnt");
|
||||||
SET(p_swscanf, "swscanf");
|
SET(p_swscanf, "swscanf");
|
||||||
|
SET(p____mb_cur_max_l_func, "___mb_cur_max_l_func");
|
||||||
|
SET(p__create_locale, "_create_locale");
|
||||||
|
SET(p__free_locale, "_free_locale");
|
||||||
|
|
||||||
if (sizeof(void *) == 8)
|
if (sizeof(void *) == 8)
|
||||||
{
|
{
|
||||||
|
@ -1936,6 +1942,25 @@ static void test_swscanf(void)
|
||||||
ok( ret == (short)WEOF, "ret = %d\n", ret );
|
ok( ret == (short)WEOF, "ret = %d\n", ret );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test____mb_cur_max_l_func(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
_locale_t l;
|
||||||
|
|
||||||
|
ret = p____mb_cur_max_l_func(NULL);
|
||||||
|
ok( ret == 1, "MB_CUR_MAX_L(NULL) = %d\n", ret );
|
||||||
|
|
||||||
|
l = p__create_locale(LC_ALL, "chinese-traditional");
|
||||||
|
if (!l)
|
||||||
|
{
|
||||||
|
skip("DBCS locale not available\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ret = p____mb_cur_max_l_func(l);
|
||||||
|
ok( ret == 2, "MB_CUR_MAX_L(cht) = %d\n", ret );
|
||||||
|
p__free_locale(l);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(msvcr90)
|
START_TEST(msvcr90)
|
||||||
{
|
{
|
||||||
if(!init())
|
if(!init())
|
||||||
|
@ -1975,4 +2000,5 @@ START_TEST(msvcr90)
|
||||||
#endif
|
#endif
|
||||||
test___strncnt();
|
test___strncnt();
|
||||||
test_swscanf();
|
test_swscanf();
|
||||||
|
test____mb_cur_max_l_func();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1640,73 +1640,6 @@ range:
|
||||||
return MSVCRT_ERANGE;
|
return MSVCRT_ERANGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* _searchenv (MSVCRT.@)
|
|
||||||
*
|
|
||||||
* Search for a file in a list of paths from an environment variable.
|
|
||||||
*
|
|
||||||
* PARAMS
|
|
||||||
* file [I] Name of the file to search for.
|
|
||||||
* env [I] Name of the environment variable containing a list of paths.
|
|
||||||
* buf [O] Destination for the found file path.
|
|
||||||
*
|
|
||||||
* RETURNS
|
|
||||||
* Nothing. If the file is not found, buf will contain an empty string
|
|
||||||
* and errno is set.
|
|
||||||
*/
|
|
||||||
void CDECL MSVCRT__searchenv(const char* file, const char* env, char *buf)
|
|
||||||
{
|
|
||||||
char*envVal, *penv, *end;
|
|
||||||
char path[MAX_PATH];
|
|
||||||
MSVCRT_size_t path_len, fname_len = strlen(file);
|
|
||||||
|
|
||||||
*buf = '\0';
|
|
||||||
|
|
||||||
/* Try CWD first */
|
|
||||||
if (GetFileAttributesA( file ) != INVALID_FILE_ATTRIBUTES)
|
|
||||||
{
|
|
||||||
GetFullPathNameA( file, MAX_PATH, buf, NULL );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Search given environment variable */
|
|
||||||
envVal = MSVCRT_getenv(env);
|
|
||||||
if (!envVal)
|
|
||||||
{
|
|
||||||
msvcrt_set_errno(ERROR_FILE_NOT_FOUND);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
penv = envVal;
|
|
||||||
TRACE(":searching for %s in paths %s\n", file, envVal);
|
|
||||||
|
|
||||||
for(; *penv; penv = (*end ? end + 1 : end))
|
|
||||||
{
|
|
||||||
end = penv;
|
|
||||||
while(*end && *end != ';') end++; /* Find end of next path */
|
|
||||||
path_len = end - penv;
|
|
||||||
if (!path_len || path_len >= MAX_PATH)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
memcpy(path, penv, path_len);
|
|
||||||
if (path[path_len - 1] != '/' && path[path_len - 1] != '\\')
|
|
||||||
path[path_len++] = '\\';
|
|
||||||
if (path_len + fname_len >= MAX_PATH)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
memcpy(path + path_len, file, fname_len + 1);
|
|
||||||
TRACE("Checking for file %s\n", path);
|
|
||||||
if (GetFileAttributesA( path ) != INVALID_FILE_ATTRIBUTES)
|
|
||||||
{
|
|
||||||
memcpy(buf, path, path_len + fname_len + 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
msvcrt_set_errno(ERROR_FILE_NOT_FOUND);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* _searchenv_s (MSVCRT.@)
|
* _searchenv_s (MSVCRT.@)
|
||||||
*/
|
*/
|
||||||
|
@ -1748,12 +1681,27 @@ int CDECL MSVCRT__searchenv_s(const char* file, const char* env, char *buf, MSVC
|
||||||
for(; *penv; penv = (*end ? end + 1 : end))
|
for(; *penv; penv = (*end ? end + 1 : end))
|
||||||
{
|
{
|
||||||
end = penv;
|
end = penv;
|
||||||
while(*end && *end != ';') end++; /* Find end of next path */
|
path_len = 0;
|
||||||
path_len = end - penv;
|
while(*end && *end != ';' && path_len < MAX_PATH)
|
||||||
|
{
|
||||||
|
if (*end == '"')
|
||||||
|
{
|
||||||
|
end++;
|
||||||
|
while(*end && *end != '"' && path_len < MAX_PATH)
|
||||||
|
{
|
||||||
|
path[path_len++] = *end;
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
if (*end == '"') end++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
path[path_len++] = *end;
|
||||||
|
end++;
|
||||||
|
}
|
||||||
if (!path_len || path_len >= MAX_PATH)
|
if (!path_len || path_len >= MAX_PATH)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
memcpy(path, penv, path_len);
|
|
||||||
if (path[path_len - 1] != '/' && path[path_len - 1] != '\\')
|
if (path[path_len - 1] != '/' && path[path_len - 1] != '\\')
|
||||||
path[path_len++] = '\\';
|
path[path_len++] = '\\';
|
||||||
if (path_len + fname_len >= MAX_PATH)
|
if (path_len + fname_len >= MAX_PATH)
|
||||||
|
@ -1778,61 +1726,11 @@ int CDECL MSVCRT__searchenv_s(const char* file, const char* env, char *buf, MSVC
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* _wsearchenv (MSVCRT.@)
|
* _searchenv (MSVCRT.@)
|
||||||
*
|
|
||||||
* Unicode version of _searchenv
|
|
||||||
*/
|
*/
|
||||||
void CDECL MSVCRT__wsearchenv(const MSVCRT_wchar_t* file, const MSVCRT_wchar_t* env, MSVCRT_wchar_t *buf)
|
void CDECL MSVCRT__searchenv(const char* file, const char* env, char *buf)
|
||||||
{
|
{
|
||||||
MSVCRT_wchar_t *envVal, *penv, *end;
|
MSVCRT__searchenv_s(file, env, buf, MAX_PATH);
|
||||||
MSVCRT_wchar_t path[MAX_PATH];
|
|
||||||
MSVCRT_size_t path_len, fname_len = strlenW(file);
|
|
||||||
|
|
||||||
*buf = '\0';
|
|
||||||
|
|
||||||
/* Try CWD first */
|
|
||||||
if (GetFileAttributesW( file ) != INVALID_FILE_ATTRIBUTES)
|
|
||||||
{
|
|
||||||
GetFullPathNameW( file, MAX_PATH, buf, NULL );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Search given environment variable */
|
|
||||||
envVal = MSVCRT__wgetenv(env);
|
|
||||||
if (!envVal)
|
|
||||||
{
|
|
||||||
msvcrt_set_errno(ERROR_FILE_NOT_FOUND);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
penv = envVal;
|
|
||||||
TRACE(":searching for %s in paths %s\n", debugstr_w(file), debugstr_w(envVal));
|
|
||||||
|
|
||||||
for(; *penv; penv = (*end ? end + 1 : end))
|
|
||||||
{
|
|
||||||
end = penv;
|
|
||||||
while(*end && *end != ';') end++; /* Find end of next path */
|
|
||||||
path_len = end - penv;
|
|
||||||
if (!path_len || path_len >= MAX_PATH)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
memcpy(path, penv, path_len * sizeof(MSVCRT_wchar_t));
|
|
||||||
if (path[path_len - 1] != '/' && path[path_len - 1] != '\\')
|
|
||||||
path[path_len++] = '\\';
|
|
||||||
if (path_len + fname_len >= MAX_PATH)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
memcpy(path + path_len, file, (fname_len + 1) * sizeof(MSVCRT_wchar_t));
|
|
||||||
TRACE("Checking for file %s\n", debugstr_w(path));
|
|
||||||
if (GetFileAttributesW( path ) != INVALID_FILE_ATTRIBUTES)
|
|
||||||
{
|
|
||||||
memcpy(buf, path, (path_len + fname_len + 1) * sizeof(MSVCRT_wchar_t));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
msvcrt_set_errno(ERROR_FILE_NOT_FOUND);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
|
@ -1877,12 +1775,27 @@ int CDECL MSVCRT__wsearchenv_s(const MSVCRT_wchar_t* file, const MSVCRT_wchar_t*
|
||||||
for(; *penv; penv = (*end ? end + 1 : end))
|
for(; *penv; penv = (*end ? end + 1 : end))
|
||||||
{
|
{
|
||||||
end = penv;
|
end = penv;
|
||||||
while(*end && *end != ';') end++; /* Find end of next path */
|
path_len = 0;
|
||||||
path_len = end - penv;
|
while(*end && *end != ';' && path_len < MAX_PATH)
|
||||||
|
{
|
||||||
|
if (*end == '"')
|
||||||
|
{
|
||||||
|
end++;
|
||||||
|
while(*end && *end != '"' && path_len < MAX_PATH)
|
||||||
|
{
|
||||||
|
path[path_len++] = *end;
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
if (*end == '"') end++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
path[path_len++] = *end;
|
||||||
|
end++;
|
||||||
|
}
|
||||||
if (!path_len || path_len >= MAX_PATH)
|
if (!path_len || path_len >= MAX_PATH)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
memcpy(path, penv, path_len * sizeof(MSVCRT_wchar_t));
|
|
||||||
if (path[path_len - 1] != '/' && path[path_len - 1] != '\\')
|
if (path[path_len - 1] != '/' && path[path_len - 1] != '\\')
|
||||||
path[path_len++] = '\\';
|
path[path_len++] = '\\';
|
||||||
if (path_len + fname_len >= MAX_PATH)
|
if (path_len + fname_len >= MAX_PATH)
|
||||||
|
@ -1905,3 +1818,11 @@ int CDECL MSVCRT__wsearchenv_s(const MSVCRT_wchar_t* file, const MSVCRT_wchar_t*
|
||||||
*MSVCRT__errno() = MSVCRT_ENOENT;
|
*MSVCRT__errno() = MSVCRT_ENOENT;
|
||||||
return MSVCRT_ENOENT;
|
return MSVCRT_ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
* _wsearchenv (MSVCRT.@)
|
||||||
|
*/
|
||||||
|
void CDECL MSVCRT__wsearchenv(const MSVCRT_wchar_t* file, const MSVCRT_wchar_t* env, MSVCRT_wchar_t *buf)
|
||||||
|
{
|
||||||
|
MSVCRT__wsearchenv_s(file, env, buf, MAX_PATH);
|
||||||
|
}
|
||||||
|
|
|
@ -184,7 +184,7 @@ int CDECL MSVCRT____mb_cur_max_func(void)
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* ___mb_cur_max_l_func (MSVCR80.@)
|
* ___mb_cur_max_l_func (MSVCR80.@)
|
||||||
*/
|
*/
|
||||||
int* CDECL ___mb_cur_max_l_func(MSVCRT__locale_t locale)
|
int CDECL ___mb_cur_max_l_func(MSVCRT__locale_t locale)
|
||||||
{
|
{
|
||||||
MSVCRT_pthreadlocinfo locinfo;
|
MSVCRT_pthreadlocinfo locinfo;
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ int* CDECL ___mb_cur_max_l_func(MSVCRT__locale_t locale)
|
||||||
else
|
else
|
||||||
locinfo = locale->locinfo;
|
locinfo = locale->locinfo;
|
||||||
|
|
||||||
return &locinfo->mb_cur_max;
|
return locinfo->mb_cur_max;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -2310,6 +2310,7 @@ int __cdecl MSVCRT_strncmp(const char *str1, const char *str2, MSVCRT_size_t len
|
||||||
int __cdecl MSVCRT__strnicmp_l(const char *s1, const char *s2,
|
int __cdecl MSVCRT__strnicmp_l(const char *s1, const char *s2,
|
||||||
MSVCRT_size_t count, MSVCRT__locale_t locale)
|
MSVCRT_size_t count, MSVCRT__locale_t locale)
|
||||||
{
|
{
|
||||||
|
MSVCRT_pthreadlocinfo locinfo;
|
||||||
int c1, c2;
|
int c1, c2;
|
||||||
|
|
||||||
if(s1==NULL || s2==NULL)
|
if(s1==NULL || s2==NULL)
|
||||||
|
@ -2318,9 +2319,26 @@ int __cdecl MSVCRT__strnicmp_l(const char *s1, const char *s2,
|
||||||
if(!count)
|
if(!count)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if(!locale)
|
||||||
|
locinfo = get_locinfo();
|
||||||
|
else
|
||||||
|
locinfo = locale->locinfo;
|
||||||
|
|
||||||
|
if(!locinfo->lc_handle[MSVCRT_LC_CTYPE])
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
if ((c1 = *s1++) >= 'A' && c1 <= 'Z')
|
||||||
|
c1 -= 'A' - 'a';
|
||||||
|
if ((c2 = *s2++) >= 'A' && c2 <= 'Z')
|
||||||
|
c2 -= 'A' - 'a';
|
||||||
|
}while(--count && c1 && c1==c2);
|
||||||
|
|
||||||
|
return c1-c2;
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
c1 = MSVCRT__tolower_l(*s1++, locale);
|
c1 = MSVCRT__tolower_l((unsigned char)*s1++, locale);
|
||||||
c2 = MSVCRT__tolower_l(*s2++, locale);
|
c2 = MSVCRT__tolower_l((unsigned char)*s2++, locale);
|
||||||
}while(--count && c1 && c1==c2);
|
}while(--count && c1 && c1==c2);
|
||||||
|
|
||||||
return c1-c2;
|
return c1-c2;
|
||||||
|
|
|
@ -597,6 +597,20 @@ static void test_searchenv(void)
|
||||||
ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp);
|
ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
strcpy(env1, "TEST_PATH=");
|
||||||
|
strcat(env1, tmppath);
|
||||||
|
strcat(env1, "\"\\search_env_test\\\"d\"i\"r\"1");
|
||||||
|
putenv(env1);
|
||||||
|
strcpy(exp, tmppath);
|
||||||
|
strcat(exp, files[0]);
|
||||||
|
_searchenv("1.dat", "TEST_PATH", result);
|
||||||
|
ok(!strcmp(result, exp), "got %s, expected '%s'\n", result, exp);
|
||||||
|
|
||||||
|
strcat(env1, ";");
|
||||||
|
putenv(env1);
|
||||||
|
_searchenv("1.dat", "TEST_PATH", result);
|
||||||
|
ok(!result[0], "got %s, expected ''\n", result);
|
||||||
|
|
||||||
putenv("TEST_PATH=");
|
putenv("TEST_PATH=");
|
||||||
|
|
||||||
for (i=ARRAY_SIZE(files)-1; i>=0; i--) {
|
for (i=ARRAY_SIZE(files)-1; i>=0; i--) {
|
||||||
|
|
|
@ -1122,6 +1122,7 @@ static inline void get_cpuinfo(SYSTEM_CPU_INFORMATION* info)
|
||||||
user_shared_data->ProcessorFeatures[PF_VIRT_FIRMWARE_ENABLED] = (regs2[2] >> 2) & 1;
|
user_shared_data->ProcessorFeatures[PF_VIRT_FIRMWARE_ENABLED] = (regs2[2] >> 2) & 1;
|
||||||
user_shared_data->ProcessorFeatures[PF_NX_ENABLED] = (regs2[3] >> 20) & 1;
|
user_shared_data->ProcessorFeatures[PF_NX_ENABLED] = (regs2[3] >> 20) & 1;
|
||||||
user_shared_data->ProcessorFeatures[PF_3DNOW_INSTRUCTIONS_AVAILABLE] = (regs2[3] >> 31) & 1;
|
user_shared_data->ProcessorFeatures[PF_3DNOW_INSTRUCTIONS_AVAILABLE] = (regs2[3] >> 31) & 1;
|
||||||
|
user_shared_data->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] = (regs2[3] >> 27) & 1;
|
||||||
if (regs2[3] >> 31) info->FeatureSet |= CPU_FEATURE_3DNOW;
|
if (regs2[3] >> 31) info->FeatureSet |= CPU_FEATURE_3DNOW;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1143,6 +1144,7 @@ static inline void get_cpuinfo(SYSTEM_CPU_INFORMATION* info)
|
||||||
{
|
{
|
||||||
do_cpuid(0x80000001, regs2); /* get vendor features */
|
do_cpuid(0x80000001, regs2); /* get vendor features */
|
||||||
user_shared_data->ProcessorFeatures[PF_NX_ENABLED] = (regs2[3] >> 20) & 1;
|
user_shared_data->ProcessorFeatures[PF_NX_ENABLED] = (regs2[3] >> 20) & 1;
|
||||||
|
user_shared_data->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] = (regs2[3] >> 27) & 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winternl.h"
|
#include "winternl.h"
|
||||||
#include "wine/test.h"
|
#include "wine/test.h"
|
||||||
|
#include "ddk/wdm.h"
|
||||||
|
|
||||||
static unsigned int page_size;
|
static unsigned int page_size;
|
||||||
|
|
||||||
|
@ -33,6 +34,8 @@ static NTSTATUS (WINAPI *pRtlFreeUserStack)(void *);
|
||||||
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
|
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
|
||||||
static const BOOL is_win64 = sizeof(void*) != sizeof(int);
|
static const BOOL is_win64 = sizeof(void*) != sizeof(int);
|
||||||
|
|
||||||
|
static SYSTEM_BASIC_INFORMATION sbi;
|
||||||
|
|
||||||
static HANDLE create_target_process(const char *arg)
|
static HANDLE create_target_process(const char *arg)
|
||||||
{
|
{
|
||||||
char **argv;
|
char **argv;
|
||||||
|
@ -513,9 +516,22 @@ static void test_NtMapViewOfSection(void)
|
||||||
CloseHandle(process);
|
CloseHandle(process);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_user_shared_data(void)
|
||||||
|
{
|
||||||
|
const KSHARED_USER_DATA *user_shared_data = (void *)0x7ffe0000;
|
||||||
|
|
||||||
|
ok(user_shared_data->NumberOfPhysicalPages == sbi.MmNumberOfPhysicalPages,
|
||||||
|
"Got number of physical pages %#x, expected %#x.\n",
|
||||||
|
user_shared_data->NumberOfPhysicalPages, sbi.MmNumberOfPhysicalPages);
|
||||||
|
|
||||||
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
|
ok(user_shared_data->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] /* Supported since Pentium CPUs. */,
|
||||||
|
"_RDTSC not available.\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(virtual)
|
START_TEST(virtual)
|
||||||
{
|
{
|
||||||
SYSTEM_BASIC_INFORMATION sbi;
|
|
||||||
HMODULE mod;
|
HMODULE mod;
|
||||||
|
|
||||||
int argc;
|
int argc;
|
||||||
|
@ -546,4 +562,5 @@ START_TEST(virtual)
|
||||||
test_NtAllocateVirtualMemory();
|
test_NtAllocateVirtualMemory();
|
||||||
test_RtlCreateUserStack();
|
test_RtlCreateUserStack();
|
||||||
test_NtMapViewOfSection();
|
test_NtMapViewOfSection();
|
||||||
|
test_user_shared_data();
|
||||||
}
|
}
|
||||||
|
|
|
@ -222,6 +222,7 @@ static void set_process_name( int argc, char *argv[] )
|
||||||
*/
|
*/
|
||||||
TEB *thread_init(void)
|
TEB *thread_init(void)
|
||||||
{
|
{
|
||||||
|
SYSTEM_BASIC_INFORMATION sbi;
|
||||||
TEB *teb;
|
TEB *teb;
|
||||||
void *addr;
|
void *addr;
|
||||||
SIZE_T size;
|
SIZE_T size;
|
||||||
|
@ -310,6 +311,9 @@ TEB *thread_init(void)
|
||||||
user_shared_data->TickCountMultiplier = 1 << 24;
|
user_shared_data->TickCountMultiplier = 1 << 24;
|
||||||
fill_cpu_info();
|
fill_cpu_info();
|
||||||
|
|
||||||
|
virtual_get_system_info( &sbi );
|
||||||
|
user_shared_data->NumberOfPhysicalPages = sbi.MmNumberOfPhysicalPages;
|
||||||
|
|
||||||
return teb;
|
return teb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -797,6 +797,8 @@ static void find_reg_tz_info(RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi, const char*
|
||||||
continue; \
|
continue; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(®_tzi, 0, sizeof(reg_tzi));
|
||||||
|
|
||||||
if (!reg_query_value(hSubkey, mui_stdW, REG_SZ, reg_tzi.StandardName, sizeof(reg_tzi.StandardName)))
|
if (!reg_query_value(hSubkey, mui_stdW, REG_SZ, reg_tzi.StandardName, sizeof(reg_tzi.StandardName)))
|
||||||
get_value(hSubkey, stdW, REG_SZ, reg_tzi.StandardName, sizeof(reg_tzi.StandardName));
|
get_value(hSubkey, stdW, REG_SZ, reg_tzi.StandardName, sizeof(reg_tzi.StandardName));
|
||||||
if (!reg_query_value(hSubkey, mui_dltW, REG_SZ, reg_tzi.DaylightName, sizeof(reg_tzi.DaylightName)))
|
if (!reg_query_value(hSubkey, mui_dltW, REG_SZ, reg_tzi.DaylightName, sizeof(reg_tzi.DaylightName)))
|
||||||
|
|
|
@ -646,9 +646,7 @@ HRESULT WINAPI AntiMoniker_CreateInstance(IClassFactory *iface,
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = IMoniker_QueryInterface(pMoniker, riid, ppv);
|
hr = IMoniker_QueryInterface(pMoniker, riid, ppv);
|
||||||
|
IMoniker_Release(pMoniker);
|
||||||
if (FAILED(hr))
|
|
||||||
IMoniker_Release(pMoniker);
|
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,7 @@ typedef struct tagTrackerWindowInfo
|
||||||
DWORD dwOKEffect;
|
DWORD dwOKEffect;
|
||||||
DWORD* pdwEffect;
|
DWORD* pdwEffect;
|
||||||
BOOL trackingDone;
|
BOOL trackingDone;
|
||||||
|
BOOL inTrackCall;
|
||||||
HRESULT returnValue;
|
HRESULT returnValue;
|
||||||
|
|
||||||
BOOL escPressed;
|
BOOL escPressed;
|
||||||
|
@ -766,6 +767,7 @@ HRESULT WINAPI DoDragDrop (
|
||||||
trackerInfo.dwOKEffect = dwOKEffect;
|
trackerInfo.dwOKEffect = dwOKEffect;
|
||||||
trackerInfo.pdwEffect = pdwEffect;
|
trackerInfo.pdwEffect = pdwEffect;
|
||||||
trackerInfo.trackingDone = FALSE;
|
trackerInfo.trackingDone = FALSE;
|
||||||
|
trackerInfo.inTrackCall = FALSE;
|
||||||
trackerInfo.escPressed = FALSE;
|
trackerInfo.escPressed = FALSE;
|
||||||
trackerInfo.curTargetHWND = 0;
|
trackerInfo.curTargetHWND = 0;
|
||||||
trackerInfo.curDragTarget = 0;
|
trackerInfo.curDragTarget = 0;
|
||||||
|
@ -2284,6 +2286,13 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
|
||||||
HWND hwndNewTarget = 0;
|
HWND hwndNewTarget = 0;
|
||||||
POINT pt;
|
POINT pt;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This method may be called from QueryContinueDrag again,
|
||||||
|
* (i.e. by running message loop) so avoid recursive call chain.
|
||||||
|
*/
|
||||||
|
if (trackerInfo->inTrackCall) return;
|
||||||
|
trackerInfo->inTrackCall = TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the handle of the window under the mouse
|
* Get the handle of the window under the mouse
|
||||||
*/
|
*/
|
||||||
|
@ -2329,6 +2338,8 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
drag_end( trackerInfo );
|
drag_end( trackerInfo );
|
||||||
|
|
||||||
|
trackerInfo->inTrackCall = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
|
|
|
@ -606,9 +606,7 @@ HRESULT WINAPI PointerMoniker_CreateInstance(IClassFactory *iface,
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = IMoniker_QueryInterface(pMoniker, riid, ppv);
|
hr = IMoniker_QueryInterface(pMoniker, riid, ppv);
|
||||||
|
IMoniker_Release(pMoniker);
|
||||||
if (FAILED(hr))
|
|
||||||
IMoniker_Release(pMoniker);
|
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -260,6 +260,7 @@ struct method_call call_lists[][30] =
|
||||||
};
|
};
|
||||||
|
|
||||||
static int droptarget_refs;
|
static int droptarget_refs;
|
||||||
|
static int test_reentrance;
|
||||||
|
|
||||||
/* helper macros to make tests a bit leaner */
|
/* helper macros to make tests a bit leaner */
|
||||||
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
|
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
|
||||||
|
@ -359,7 +360,34 @@ static HRESULT WINAPI DropSource_QueryContinueDrag(
|
||||||
BOOL fEscapePressed,
|
BOOL fEscapePressed,
|
||||||
DWORD grfKeyState)
|
DWORD grfKeyState)
|
||||||
{
|
{
|
||||||
return check_expect(DS_QueryContinueDrag, 0, NULL);
|
HRESULT hr = check_expect(DS_QueryContinueDrag, 0, NULL);
|
||||||
|
if (test_reentrance)
|
||||||
|
{
|
||||||
|
MSG msg;
|
||||||
|
BOOL r;
|
||||||
|
int num = 0;
|
||||||
|
|
||||||
|
HWND hwnd = GetCapture();
|
||||||
|
ok(hwnd != 0, "Expected capture window\n");
|
||||||
|
|
||||||
|
/* send some fake events that should be ignored */
|
||||||
|
r = PostMessageA(hwnd, WM_MOUSEMOVE, 0, 0);
|
||||||
|
r &= PostMessageA(hwnd, WM_LBUTTONDOWN, 0, 0);
|
||||||
|
r &= PostMessageA(hwnd, WM_LBUTTONUP, 0, 0);
|
||||||
|
r &= PostMessageA(hwnd, WM_KEYDOWN, VK_ESCAPE, 0);
|
||||||
|
ok(r, "Unable to post messages\n");
|
||||||
|
|
||||||
|
/* run the message loop for this thread */
|
||||||
|
while (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE))
|
||||||
|
{
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessageA(&msg);
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ok(num >= 4, "Expected at least 4 messages but %d were processed\n", num);
|
||||||
|
}
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI DropSource_GiveFeedback(
|
static HRESULT WINAPI DropSource_GiveFeedback(
|
||||||
|
@ -701,17 +729,20 @@ static void test_DoDragDrop(void)
|
||||||
GetWindowRect(hwnd, &rect);
|
GetWindowRect(hwnd, &rect);
|
||||||
ok(SetCursorPos(rect.left+50, rect.top+50), "SetCursorPos failed\n");
|
ok(SetCursorPos(rect.left+50, rect.top+50), "SetCursorPos failed\n");
|
||||||
|
|
||||||
for (seq = 0; seq < ARRAY_SIZE(call_lists); seq++)
|
for (test_reentrance = 0; test_reentrance < 2; test_reentrance++)
|
||||||
{
|
{
|
||||||
DWORD effect_in;
|
for (seq = 0; seq < ARRAY_SIZE(call_lists); seq++)
|
||||||
trace("%d\n", seq);
|
{
|
||||||
call_ptr = call_lists[seq];
|
DWORD effect_in;
|
||||||
effect_in = call_ptr->set_param;
|
trace("%d\n", seq);
|
||||||
call_ptr++;
|
call_ptr = call_lists[seq];
|
||||||
|
effect_in = call_ptr->set_param;
|
||||||
|
call_ptr++;
|
||||||
|
|
||||||
hr = DoDragDrop(&DataObject, &DropSource, effect_in, &effect);
|
hr = DoDragDrop(&DataObject, &DropSource, effect_in, &effect);
|
||||||
check_expect(DoDragDrop_ret, hr, NULL);
|
check_expect(DoDragDrop_ret, hr, NULL);
|
||||||
check_expect(DoDragDrop_effect_out, effect, NULL);
|
check_expect(DoDragDrop_effect_out, effect, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
OleUninitialize();
|
OleUninitialize();
|
||||||
|
|
|
@ -50,3 +50,11 @@ BOOL WINAPI QOSCreateHandle(PQOS_VERSION version, PHANDLE handle)
|
||||||
SetLastError(ERROR_SERVICE_ALREADY_RUNNING);
|
SetLastError(ERROR_SERVICE_ALREADY_RUNNING);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI QOSAddSocketToFlow(HANDLE handle, SOCKET socket, PSOCKADDR addr,
|
||||||
|
QOS_TRAFFIC_TYPE traffictype, DWORD flags, PQOS_FLOWID flowid)
|
||||||
|
{
|
||||||
|
FIXME("%p, %lx, %p, %d, 0x%08x, %p stub!\n", handle, socket, addr, traffictype, flags, flowid);
|
||||||
|
SetLastError(ERROR_NOT_SUPPORTED);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
@ stub QDLHPathDiagnostics
|
@ stub QDLHPathDiagnostics
|
||||||
@ stub QDLHStartDiagnosingPath
|
@ stub QDLHStartDiagnosingPath
|
||||||
@ stub QOSAddSocketToFlow
|
@ stdcall QOSAddSocketToFlow(ptr long ptr long long ptr)
|
||||||
@ stub QOSCancel
|
@ stub QOSCancel
|
||||||
@ stub QOSCloseHandle
|
@ stub QOSCloseHandle
|
||||||
@ stdcall QOSCreateHandle(ptr ptr)
|
@ stdcall QOSCreateHandle(ptr ptr)
|
||||||
|
|
|
@ -925,12 +925,6 @@ static HRESULT get_param_pointer_info(ITypeInfo *typeinfo, TYPEDESC *tdesc, int
|
||||||
ITypeInfo_ReleaseTypeAttr(refinfo, attr);
|
ITypeInfo_ReleaseTypeAttr(refinfo, attr);
|
||||||
ITypeInfo_Release(refinfo);
|
ITypeInfo_Release(refinfo);
|
||||||
break;
|
break;
|
||||||
case VT_BSTR:
|
|
||||||
*flags |= IsSimpleRef | MustFree;
|
|
||||||
*tfs_tdesc = tdesc;
|
|
||||||
if (!is_in && is_out)
|
|
||||||
*server_size = sizeof(void *);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
*flags |= IsSimpleRef;
|
*flags |= IsSimpleRef;
|
||||||
*tfs_tdesc = tdesc;
|
*tfs_tdesc = tdesc;
|
||||||
|
@ -938,6 +932,8 @@ static HRESULT get_param_pointer_info(ITypeInfo *typeinfo, TYPEDESC *tdesc, int
|
||||||
*server_size = type_memsize(typeinfo, tdesc);
|
*server_size = type_memsize(typeinfo, tdesc);
|
||||||
if ((*basetype = get_basetype(typeinfo, tdesc)))
|
if ((*basetype = get_basetype(typeinfo, tdesc)))
|
||||||
*flags |= IsBasetype;
|
*flags |= IsBasetype;
|
||||||
|
else
|
||||||
|
*flags |= MustFree;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1265,14 +1261,16 @@ static HRESULT get_iface_info(ITypeInfo *typeinfo, WORD *funcs, WORD *parentfunc
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
goto err;
|
goto err;
|
||||||
hr = ITypeInfo_GetRefTypeInfo(*real_typeinfo, reftype, &parentinfo);
|
hr = ITypeInfo_GetRefTypeInfo(*real_typeinfo, reftype, &parentinfo);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
hr = ITypeInfo_GetTypeAttr(parentinfo, &typeattr);
|
||||||
|
ITypeInfo_Release(parentinfo);
|
||||||
|
}
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
goto err;
|
goto err;
|
||||||
hr = ITypeInfo_GetTypeAttr(parentinfo, &typeattr);
|
|
||||||
if (FAILED(hr))
|
|
||||||
goto err;
|
|
||||||
*parentiid = typeattr->guid;
|
*parentiid = typeattr->guid;
|
||||||
ITypeInfo_ReleaseTypeAttr(parentinfo, typeattr);
|
ITypeInfo_ReleaseTypeAttr(parentinfo, typeattr);
|
||||||
ITypeInfo_Release(parentinfo);
|
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include "twain.h"
|
#include "twain.h"
|
||||||
|
|
||||||
#ifdef SONAME_LIBSANE
|
#ifdef SONAME_LIBSANE
|
||||||
#define MAKE_FUNCPTR(f) typeof(f) * p##f DECLSPEC_HIDDEN;
|
#define MAKE_FUNCPTR(f) extern typeof(f) * p##f DECLSPEC_HIDDEN;
|
||||||
MAKE_FUNCPTR(sane_init)
|
MAKE_FUNCPTR(sane_init)
|
||||||
MAKE_FUNCPTR(sane_exit)
|
MAKE_FUNCPTR(sane_exit)
|
||||||
MAKE_FUNCPTR(sane_get_devices)
|
MAKE_FUNCPTR(sane_get_devices)
|
||||||
|
@ -84,7 +84,9 @@ struct tagActiveDS
|
||||||
TW_FIX32 defaultXResolution;
|
TW_FIX32 defaultXResolution;
|
||||||
BOOL YResolutionSet;
|
BOOL YResolutionSet;
|
||||||
TW_FIX32 defaultYResolution;
|
TW_FIX32 defaultYResolution;
|
||||||
} activeDS DECLSPEC_HIDDEN;
|
};
|
||||||
|
|
||||||
|
extern struct tagActiveDS activeDS DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/* Helper functions */
|
/* Helper functions */
|
||||||
extern TW_UINT16 SANE_SaneCapability (pTW_CAPABILITY pCapability, TW_UINT16 action) DECLSPEC_HIDDEN;
|
extern TW_UINT16 SANE_SaneCapability (pTW_CAPABILITY pCapability, TW_UINT16 action) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -30,9 +30,27 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(twain);
|
WINE_DEFAULT_DEBUG_CHANNEL(twain);
|
||||||
|
|
||||||
|
struct tagActiveDS activeDS;
|
||||||
|
|
||||||
DSMENTRYPROC SANE_dsmentry;
|
DSMENTRYPROC SANE_dsmentry;
|
||||||
|
|
||||||
#ifdef SONAME_LIBSANE
|
#ifdef SONAME_LIBSANE
|
||||||
|
#define MAKE_FUNCPTR(f) typeof(f) * p##f;
|
||||||
|
MAKE_FUNCPTR(sane_init)
|
||||||
|
MAKE_FUNCPTR(sane_exit)
|
||||||
|
MAKE_FUNCPTR(sane_get_devices)
|
||||||
|
MAKE_FUNCPTR(sane_open)
|
||||||
|
MAKE_FUNCPTR(sane_close)
|
||||||
|
MAKE_FUNCPTR(sane_get_option_descriptor)
|
||||||
|
MAKE_FUNCPTR(sane_control_option)
|
||||||
|
MAKE_FUNCPTR(sane_get_parameters)
|
||||||
|
MAKE_FUNCPTR(sane_start)
|
||||||
|
MAKE_FUNCPTR(sane_read)
|
||||||
|
MAKE_FUNCPTR(sane_cancel)
|
||||||
|
MAKE_FUNCPTR(sane_set_io_mode)
|
||||||
|
MAKE_FUNCPTR(sane_get_select_fd)
|
||||||
|
MAKE_FUNCPTR(sane_strstatus)
|
||||||
|
#undef MAKE_FUNCPTR
|
||||||
|
|
||||||
HINSTANCE SANE_instance;
|
HINSTANCE SANE_instance;
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#define JOB_ADD_CURRENT_DATE 0x08
|
#define JOB_ADD_CURRENT_DATE 0x08
|
||||||
#define JOB_NONINTERACTIVE 0x10
|
#define JOB_NONINTERACTIVE 0x10
|
||||||
|
|
||||||
extern handle_t rpc_handle;
|
extern handle_t atsvc_handle;
|
||||||
|
|
||||||
static int test_failures, test_skipped;
|
static int test_failures, test_skipped;
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ START_TEST(atsvcapi)
|
||||||
|
|
||||||
hr = RpcStringBindingComposeA(NULL, ncalrpc, NULL, NULL, NULL, &binding_str);
|
hr = RpcStringBindingComposeA(NULL, ncalrpc, NULL, NULL, NULL, &binding_str);
|
||||||
ok(hr == RPC_S_OK, "RpcStringBindingCompose error %#x\n", hr);
|
ok(hr == RPC_S_OK, "RpcStringBindingCompose error %#x\n", hr);
|
||||||
hr = RpcBindingFromStringBindingA(binding_str, &rpc_handle);
|
hr = RpcBindingFromStringBindingA(binding_str, &atsvc_handle);
|
||||||
ok(hr == RPC_S_OK, "RpcBindingFromStringBinding error %#x\n", hr);
|
ok(hr == RPC_S_OK, "RpcBindingFromStringBinding error %#x\n", hr);
|
||||||
hr = RpcStringFreeA(&binding_str);
|
hr = RpcStringFreeA(&binding_str);
|
||||||
ok(hr == RPC_S_OK, "RpcStringFree error %#x\n", hr);
|
ok(hr == RPC_S_OK, "RpcStringFree error %#x\n", hr);
|
||||||
|
@ -173,7 +173,7 @@ skip_tests_delete:
|
||||||
skip_tests:
|
skip_tests:
|
||||||
SetUnhandledExceptionFilter(old_exception_filter);
|
SetUnhandledExceptionFilter(old_exception_filter);
|
||||||
|
|
||||||
hr = RpcBindingFree(&rpc_handle);
|
hr = RpcBindingFree(&atsvc_handle);
|
||||||
ok(hr == RPC_S_OK, "RpcBindingFree error %#x\n", hr);
|
ok(hr == RPC_S_OK, "RpcBindingFree error %#x\n", hr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
#include "wine/test.h"
|
#include "wine/test.h"
|
||||||
|
|
||||||
extern handle_t rpc_handle;
|
extern handle_t schrpc_handle;
|
||||||
|
|
||||||
static LONG CALLBACK rpc_exception_filter(EXCEPTION_POINTERS *ptrs)
|
static LONG CALLBACK rpc_exception_filter(EXCEPTION_POINTERS *ptrs)
|
||||||
{
|
{
|
||||||
|
@ -103,7 +103,7 @@ START_TEST(rpcapi)
|
||||||
|
|
||||||
hr = RpcStringBindingComposeA(NULL, ncalrpc, NULL, NULL, NULL, &binding_str);
|
hr = RpcStringBindingComposeA(NULL, ncalrpc, NULL, NULL, NULL, &binding_str);
|
||||||
ok(hr == RPC_S_OK, "RpcStringBindingCompose error %#x\n", hr);
|
ok(hr == RPC_S_OK, "RpcStringBindingCompose error %#x\n", hr);
|
||||||
hr = RpcBindingFromStringBindingA(binding_str, &rpc_handle);
|
hr = RpcBindingFromStringBindingA(binding_str, &schrpc_handle);
|
||||||
ok(hr == RPC_S_OK, "RpcBindingFromStringBinding error %#x\n", hr);
|
ok(hr == RPC_S_OK, "RpcBindingFromStringBinding error %#x\n", hr);
|
||||||
hr = RpcStringFreeA(&binding_str);
|
hr = RpcStringFreeA(&binding_str);
|
||||||
ok(hr == RPC_S_OK, "RpcStringFree error %#x\n", hr);
|
ok(hr == RPC_S_OK, "RpcStringFree error %#x\n", hr);
|
||||||
|
@ -537,7 +537,7 @@ todo_wine
|
||||||
MIDL_user_free(path);
|
MIDL_user_free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = RpcBindingFree(&rpc_handle);
|
hr = RpcBindingFree(&schrpc_handle);
|
||||||
ok(hr == RPC_S_OK, "RpcBindingFree error %#x\n", hr);
|
ok(hr == RPC_S_OK, "RpcBindingFree error %#x\n", hr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1387,8 +1387,8 @@ static const SecPkgInfoA infoA = {
|
||||||
ntlm_comment_A
|
ntlm_comment_A
|
||||||
};
|
};
|
||||||
|
|
||||||
SecPkgInfoA *ntlm_package_infoA = (SecPkgInfoA *)&infoA;
|
static SecPkgInfoA *ntlm_package_infoA = (SecPkgInfoA *)&infoA;
|
||||||
SecPkgInfoW *ntlm_package_infoW = (SecPkgInfoW *)&infoW;
|
static SecPkgInfoW *ntlm_package_infoW = (SecPkgInfoW *)&infoW;
|
||||||
|
|
||||||
static SecPkgInfoW *build_package_infoW( const SecPkgInfoW *info )
|
static SecPkgInfoW *build_package_infoW( const SecPkgInfoW *info )
|
||||||
{
|
{
|
||||||
|
|
|
@ -190,9 +190,6 @@ void SECUR32_arc4Cleanup(arc4_info *a4i) DECLSPEC_HIDDEN;
|
||||||
#define NTLMSSP_NEGOTIATE_56 0x80000000
|
#define NTLMSSP_NEGOTIATE_56 0x80000000
|
||||||
|
|
||||||
|
|
||||||
SecPkgInfoW *ntlm_package_infoW DECLSPEC_HIDDEN;
|
|
||||||
SecPkgInfoA *ntlm_package_infoA DECLSPEC_HIDDEN;
|
|
||||||
|
|
||||||
/* schannel internal interface */
|
/* schannel internal interface */
|
||||||
typedef struct schan_imp_session_opaque *schan_imp_session;
|
typedef struct schan_imp_session_opaque *schan_imp_session;
|
||||||
|
|
||||||
|
|
|
@ -4570,16 +4570,42 @@ BOOL WINAPI SetupDiBuildDriverInfoList(HDEVINFO devinfo, SP_DEVINFO_DATA *device
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL copy_driver_data(SP_DRVINFO_DATA_W *data, const struct driver *driver)
|
||||||
|
{
|
||||||
|
INFCONTEXT ctx;
|
||||||
|
HINF hinf;
|
||||||
|
|
||||||
|
if ((hinf = SetupOpenInfFileW(driver->inf_path, NULL, INF_STYLE_WIN4, NULL)) == INVALID_HANDLE_VALUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
data->ProviderName[0] = 0;
|
||||||
|
if (SetupFindFirstLineW(hinf, L"Version", L"Provider", &ctx))
|
||||||
|
SetupGetStringFieldW(&ctx, 1, data->ProviderName, ARRAY_SIZE(data->ProviderName), NULL);
|
||||||
|
wcscpy(data->Description, driver->description);
|
||||||
|
wcscpy(data->MfgName, driver->manufacturer);
|
||||||
|
data->DriverType = SPDIT_COMPATDRIVER;
|
||||||
|
|
||||||
|
SetupCloseInfFile(hinf);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void driver_data_wtoa(SP_DRVINFO_DATA_A *a, const SP_DRVINFO_DATA_W *w)
|
||||||
|
{
|
||||||
|
a->DriverType = w->DriverType;
|
||||||
|
a->Reserved = w->Reserved;
|
||||||
|
WideCharToMultiByte(CP_ACP, 0, w->Description, -1, a->Description, sizeof(a->Description), NULL, NULL);
|
||||||
|
WideCharToMultiByte(CP_ACP, 0, w->MfgName, -1, a->MfgName, sizeof(a->MfgName), NULL, NULL);
|
||||||
|
WideCharToMultiByte(CP_ACP, 0, w->ProviderName, -1, a->ProviderName, sizeof(a->ProviderName), NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetupDiEnumDriverInfoW (SETUPAPI.@)
|
* SetupDiEnumDriverInfoW (SETUPAPI.@)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI SetupDiEnumDriverInfoW(HDEVINFO devinfo, SP_DEVINFO_DATA *device_data,
|
BOOL WINAPI SetupDiEnumDriverInfoW(HDEVINFO devinfo, SP_DEVINFO_DATA *device_data,
|
||||||
DWORD type, DWORD index, SP_DRVINFO_DATA_W *driver_data)
|
DWORD type, DWORD index, SP_DRVINFO_DATA_W *driver_data)
|
||||||
{
|
{
|
||||||
static const WCHAR providerW[] = {'P','r','o','v','i','d','e','r',0};
|
|
||||||
struct device *device;
|
struct device *device;
|
||||||
INFCONTEXT ctx;
|
|
||||||
HINF hinf;
|
|
||||||
|
|
||||||
TRACE("devinfo %p, device_data %p, type %#x, index %u, driver_data %p.\n",
|
TRACE("devinfo %p, device_data %p, type %#x, index %u, driver_data %p.\n",
|
||||||
devinfo, device_data, type, index, driver_data);
|
devinfo, device_data, type, index, driver_data);
|
||||||
|
@ -4600,19 +4626,7 @@ BOOL WINAPI SetupDiEnumDriverInfoW(HDEVINFO devinfo, SP_DEVINFO_DATA *device_dat
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((hinf = SetupOpenInfFileW(device->drivers[index].inf_path, NULL, INF_STYLE_WIN4, NULL)) == INVALID_HANDLE_VALUE)
|
return copy_driver_data(driver_data, &device->drivers[index]);
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
driver_data->ProviderName[0] = 0;
|
|
||||||
if (SetupFindFirstLineW(hinf, Version, providerW, &ctx))
|
|
||||||
SetupGetStringFieldW(&ctx, 1, driver_data->ProviderName, ARRAY_SIZE(driver_data->ProviderName), NULL);
|
|
||||||
lstrcpyW(driver_data->Description, device->drivers[index].description);
|
|
||||||
lstrcpyW(driver_data->MfgName, device->drivers[index].manufacturer);
|
|
||||||
driver_data->DriverType = SPDIT_COMPATDRIVER;
|
|
||||||
|
|
||||||
SetupCloseInfFile(hinf);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -4626,14 +4640,7 @@ BOOL WINAPI SetupDiEnumDriverInfoA(HDEVINFO devinfo, SP_DEVINFO_DATA *device_dat
|
||||||
|
|
||||||
driver_dataW.cbSize = sizeof(driver_dataW);
|
driver_dataW.cbSize = sizeof(driver_dataW);
|
||||||
ret = SetupDiEnumDriverInfoW(devinfo, device_data, type, index, &driver_dataW);
|
ret = SetupDiEnumDriverInfoW(devinfo, device_data, type, index, &driver_dataW);
|
||||||
driver_data->DriverType = driver_dataW.DriverType;
|
driver_data_wtoa(driver_data, &driver_dataW);
|
||||||
driver_data->Reserved = driver_dataW.Reserved;
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, driver_dataW.Description, -1, driver_data->Description,
|
|
||||||
sizeof(driver_data->Description), NULL, NULL);
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, driver_dataW.MfgName, -1, driver_data->MfgName,
|
|
||||||
sizeof(driver_data->MfgName), NULL, NULL);
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, driver_dataW.ProviderName, -1, driver_data->ProviderName,
|
|
||||||
sizeof(driver_data->ProviderName), NULL, NULL);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4663,6 +4670,41 @@ BOOL WINAPI SetupDiSelectBestCompatDrv(HDEVINFO devinfo, SP_DEVINFO_DATA *device
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetupDiGetSelectedDriverW (SETUPAPI.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI SetupDiGetSelectedDriverW(HDEVINFO devinfo, SP_DEVINFO_DATA *device_data, SP_DRVINFO_DATA_W *driver_data)
|
||||||
|
{
|
||||||
|
struct device *device;
|
||||||
|
|
||||||
|
TRACE("devinfo %p, device_data %p, driver_data %p.\n", devinfo, device_data, driver_data);
|
||||||
|
|
||||||
|
if (!(device = get_device(devinfo, device_data)))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!device->selected_driver)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NO_DRIVER_SELECTED);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return copy_driver_data(driver_data, device->selected_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetupDiGetSelectedDriverA (SETUPAPI.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI SetupDiGetSelectedDriverA(HDEVINFO devinfo, SP_DEVINFO_DATA *device_data, SP_DRVINFO_DATA_A *driver_data)
|
||||||
|
{
|
||||||
|
SP_DRVINFO_DATA_W driver_dataW;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
|
driver_dataW.cbSize = sizeof(driver_dataW);
|
||||||
|
if ((ret = SetupDiGetSelectedDriverW(devinfo, device_data, &driver_dataW)))
|
||||||
|
driver_data_wtoa(driver_data, &driver_dataW);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetupDiInstallDriverFiles (SETUPAPI.@)
|
* SetupDiInstallDriverFiles (SETUPAPI.@)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1132,7 +1132,7 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (style & (SP_COPY_NODECOMP | SP_COPY_LANGUAGEAWARE | SP_COPY_FORCE_IN_USE |
|
if (style & (SP_COPY_NODECOMP | SP_COPY_LANGUAGEAWARE | SP_COPY_FORCE_IN_USE |
|
||||||
SP_COPY_IN_USE_NEEDS_REBOOT | SP_COPY_NOSKIP | SP_COPY_WARNIFSKIP))
|
SP_COPY_NOSKIP | SP_COPY_WARNIFSKIP))
|
||||||
{
|
{
|
||||||
ERR("Unsupported style(s) 0x%x\n",style);
|
ERR("Unsupported style(s) 0x%x\n",style);
|
||||||
}
|
}
|
||||||
|
@ -1140,6 +1140,22 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style,
|
||||||
if (docopy)
|
if (docopy)
|
||||||
{
|
{
|
||||||
rc = CopyFileW(source,target,FALSE);
|
rc = CopyFileW(source,target,FALSE);
|
||||||
|
if (!rc && GetLastError() == ERROR_SHARING_VIOLATION &&
|
||||||
|
(style & SP_COPY_IN_USE_NEEDS_REBOOT))
|
||||||
|
{
|
||||||
|
WCHAR temp_file[MAX_PATH];
|
||||||
|
WCHAR temp[MAX_PATH];
|
||||||
|
|
||||||
|
if (GetTempPathW(MAX_PATH, temp) &&
|
||||||
|
GetTempFileNameW(temp, L"SET", 0, temp_file))
|
||||||
|
{
|
||||||
|
rc = CopyFileW(source, temp_file, FALSE);
|
||||||
|
if (rc)
|
||||||
|
rc = MoveFileExW(temp_file, target, MOVEFILE_DELAY_UNTIL_REBOOT);
|
||||||
|
else
|
||||||
|
DeleteFileW(temp_file);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!rc) WARN( "failed to copy, err %u\n", GetLastError() );
|
if (!rc) WARN( "failed to copy, err %u\n", GetLastError() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -359,8 +359,8 @@
|
||||||
@ stdcall SetupDiGetINFClassA(str ptr ptr long ptr)
|
@ stdcall SetupDiGetINFClassA(str ptr ptr long ptr)
|
||||||
@ stdcall SetupDiGetINFClassW(wstr ptr ptr long ptr)
|
@ stdcall SetupDiGetINFClassW(wstr ptr ptr long ptr)
|
||||||
@ stub SetupDiGetSelectedDevice
|
@ stub SetupDiGetSelectedDevice
|
||||||
@ stub SetupDiGetSelectedDriverA
|
@ stdcall SetupDiGetSelectedDriverA(ptr ptr ptr)
|
||||||
@ stub SetupDiGetSelectedDriverW
|
@ stdcall SetupDiGetSelectedDriverW(ptr ptr ptr)
|
||||||
@ stub SetupDiGetWizardPage
|
@ stub SetupDiGetWizardPage
|
||||||
@ stdcall SetupDiInstallClassA(long str long ptr)
|
@ stdcall SetupDiInstallClassA(long str long ptr)
|
||||||
@ stub SetupDiInstallClassExA
|
@ stub SetupDiInstallClassExA
|
||||||
|
|
|
@ -2374,6 +2374,20 @@ static void test_driver_list(void)
|
||||||
ok(!ret, "Expected failure.\n");
|
ok(!ret, "Expected failure.\n");
|
||||||
ok(GetLastError() == ERROR_NO_MORE_ITEMS, "Got unexpected error %#x.\n", GetLastError());
|
ok(GetLastError() == ERROR_NO_MORE_ITEMS, "Got unexpected error %#x.\n", GetLastError());
|
||||||
|
|
||||||
|
ret = SetupDiGetSelectedDriverA(set, &device, &driver);
|
||||||
|
ok(ret /* Win10 1809 */ || GetLastError() == ERROR_NO_DRIVER_SELECTED,
|
||||||
|
"Got unexpected error %#x.\n", GetLastError());
|
||||||
|
|
||||||
|
ret = SetupDiSelectBestCompatDrv(set, &device);
|
||||||
|
ok(ret, "Failed to select driver, error %#x.\n", GetLastError());
|
||||||
|
|
||||||
|
ret = SetupDiGetSelectedDriverA(set, &device, &driver);
|
||||||
|
ok(ret, "Failed to get selected driver, error %#x.\n", GetLastError());
|
||||||
|
ok(driver.DriverType == SPDIT_COMPATDRIVER, "Got wrong type %#x.\n", driver.DriverType);
|
||||||
|
ok(!strcmp(driver.Description, "desc1"), "Got wrong description '%s'.\n", driver.Description);
|
||||||
|
ok(!strcmp(driver.MfgName, wow64 ? "mfg1_wow" : "mfg1"), "Got wrong manufacturer '%s'.\n", driver.MfgName);
|
||||||
|
ok(!strcmp(driver.ProviderName, ""), "Got wrong provider '%s'.\n", driver.ProviderName);
|
||||||
|
|
||||||
SetupDiDestroyDeviceInfoList(set);
|
SetupDiDestroyDeviceInfoList(set);
|
||||||
ret = DeleteFileA(inf_path);
|
ret = DeleteFileA(inf_path);
|
||||||
ok(ret, "Failed to delete %s, error %u.\n", inf_path, GetLastError());
|
ok(ret, "Failed to delete %s, error %u.\n", inf_path, GetLastError());
|
||||||
|
|
|
@ -1109,6 +1109,8 @@ static INT_PTR CALLBACK BrsFolderDlgProc( HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
return BrsFolder_OnCreate( hWnd, (browse_info*) lParam );
|
return BrsFolder_OnCreate( hWnd, (browse_info*) lParam );
|
||||||
|
|
||||||
info = GetPropW( hWnd, szBrowseFolderInfo );
|
info = GetPropW( hWnd, szBrowseFolderInfo );
|
||||||
|
if (!info)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
switch (msg)
|
switch (msg)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3843,7 +3843,7 @@ static HRESULT WINAPI TaskService_Connect(ITaskService *iface, VARIANT server, V
|
||||||
DWORD len;
|
DWORD len;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
RPC_WSTR binding_str;
|
RPC_WSTR binding_str;
|
||||||
extern handle_t rpc_handle;
|
extern handle_t schrpc_handle;
|
||||||
|
|
||||||
TRACE("%p,%s,%s,%s,%s\n", iface, debugstr_variant(&server), debugstr_variant(&user),
|
TRACE("%p,%s,%s,%s,%s\n", iface, debugstr_variant(&server), debugstr_variant(&user),
|
||||||
debugstr_variant(&domain), debugstr_variant(&password));
|
debugstr_variant(&domain), debugstr_variant(&password));
|
||||||
|
@ -3882,7 +3882,7 @@ static HRESULT WINAPI TaskService_Connect(ITaskService *iface, VARIANT server, V
|
||||||
|
|
||||||
hr = RpcStringBindingComposeW(NULL, ncalrpc, NULL, NULL, NULL, &binding_str);
|
hr = RpcStringBindingComposeW(NULL, ncalrpc, NULL, NULL, NULL, &binding_str);
|
||||||
if (hr != RPC_S_OK) return hr;
|
if (hr != RPC_S_OK) return hr;
|
||||||
hr = RpcBindingFromStringBindingW(binding_str, &rpc_handle);
|
hr = RpcBindingFromStringBindingW(binding_str, &schrpc_handle);
|
||||||
RpcStringFreeW(&binding_str);
|
RpcStringFreeW(&binding_str);
|
||||||
if (hr != RPC_S_OK) return hr;
|
if (hr != RPC_S_OK) return hr;
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,9 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(twain);
|
WINE_DEFAULT_DEBUG_CHANNEL(twain);
|
||||||
|
|
||||||
extern HINSTANCE DSM_hinstance;
|
TW_UINT16 DSM_twCC;
|
||||||
|
activeDS *activeSources;
|
||||||
|
HINSTANCE DSM_hinstance;
|
||||||
|
|
||||||
BOOL WINAPI DllMain (HINSTANCE hinstance, DWORD reason, LPVOID reserved)
|
BOOL WINAPI DllMain (HINSTANCE hinstance, DWORD reason, LPVOID reserved)
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,11 +45,11 @@ typedef struct tagActiveDS
|
||||||
HWND event_window;
|
HWND event_window;
|
||||||
} activeDS;
|
} activeDS;
|
||||||
|
|
||||||
TW_UINT16 DSM_twCC DECLSPEC_HIDDEN; /* current condition code of Source Manager */
|
extern TW_UINT16 DSM_twCC DECLSPEC_HIDDEN; /* current condition code of Source Manager */
|
||||||
|
|
||||||
activeDS *activeSources DECLSPEC_HIDDEN; /* list of active data sources */
|
extern activeDS *activeSources DECLSPEC_HIDDEN; /* list of active data sources */
|
||||||
|
|
||||||
HINSTANCE DSM_hinstance DECLSPEC_HIDDEN;
|
extern HINSTANCE DSM_hinstance DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/* Implementation of operation triplets (From Application to Source Manager) */
|
/* Implementation of operation triplets (From Application to Source Manager) */
|
||||||
extern TW_UINT16 TWAIN_CloseDS
|
extern TW_UINT16 TWAIN_CloseDS
|
||||||
|
|
|
@ -30,6 +30,8 @@ STRINGTABLE
|
||||||
39617 "Afghanistan Daylight Time"
|
39617 "Afghanistan Daylight Time"
|
||||||
50192 "Alaskan Standard Time"
|
50192 "Alaskan Standard Time"
|
||||||
50193 "Alaskan Daylight Time"
|
50193 "Alaskan Daylight Time"
|
||||||
|
55200 "Aleutian Standard Time"
|
||||||
|
55201 "Aleutian Daylight Time"
|
||||||
41968 "Arab Standard Time"
|
41968 "Arab Standard Time"
|
||||||
41969 "Arab Daylight Time"
|
41969 "Arab Daylight Time"
|
||||||
42704 "Arabian Standard Time"
|
42704 "Arabian Standard Time"
|
||||||
|
@ -54,6 +56,8 @@ STRINGTABLE
|
||||||
48721 "Bangladesh Daylight Time"
|
48721 "Bangladesh Daylight Time"
|
||||||
56576 "Belarus Standard Time"
|
56576 "Belarus Standard Time"
|
||||||
56577 "Belarus Daylight Time"
|
56577 "Belarus Daylight Time"
|
||||||
|
51968 "Bougainville Standard Time"
|
||||||
|
51969 "Bougainville Daylight Time"
|
||||||
25712 "Canada Central Standard Time"
|
25712 "Canada Central Standard Time"
|
||||||
25713 "Canada Central Daylight Time"
|
25713 "Canada Central Daylight Time"
|
||||||
2000 "Cape Verde Standard Time"
|
2000 "Cape Verde Standard Time"
|
||||||
|
@ -78,6 +82,8 @@ STRINGTABLE
|
||||||
17457 "Central Daylight Time"
|
17457 "Central Daylight Time"
|
||||||
32800 "Central Standard Time (Mexico)"
|
32800 "Central Standard Time (Mexico)"
|
||||||
32801 "Central Daylight Time (Mexico)"
|
32801 "Central Daylight Time (Mexico)"
|
||||||
|
62304 "Chatham Islands Standard Time"
|
||||||
|
62305 "Chatham Islands Daylight Time"
|
||||||
160 "China Standard Time"
|
160 "China Standard Time"
|
||||||
161 "China Daylight Time"
|
161 "China Daylight Time"
|
||||||
50384 "Dateline Standard Time"
|
50384 "Dateline Standard Time"
|
||||||
|
@ -110,6 +116,8 @@ STRINGTABLE
|
||||||
47169 "Greenwich Daylight Time"
|
47169 "Greenwich Daylight Time"
|
||||||
24192 "GTB Standard Time"
|
24192 "GTB Standard Time"
|
||||||
24193 "GTB Daylight Time"
|
24193 "GTB Daylight Time"
|
||||||
|
2896 "Haiti Standard Time"
|
||||||
|
2897 "Haiti Daylight Time"
|
||||||
53376 "Hawaiian Standard Time"
|
53376 "Hawaiian Standard Time"
|
||||||
53377 "Hawaiian Daylight Time"
|
53377 "Hawaiian Daylight Time"
|
||||||
22400 "India Standard Time"
|
22400 "India Standard Time"
|
||||||
|
@ -130,6 +138,8 @@ STRINGTABLE
|
||||||
16769 "Line Islands Daylight Time"
|
16769 "Line Islands Daylight Time"
|
||||||
8832 "Magadan Standard Time"
|
8832 "Magadan Standard Time"
|
||||||
8833 "Magadan Daylight Time"
|
8833 "Magadan Daylight Time"
|
||||||
|
20736 "Marquesas Standard Time"
|
||||||
|
20737 "Marquesas Daylight Time"
|
||||||
60896 "Mauritius Standard Time"
|
60896 "Mauritius Standard Time"
|
||||||
60897 "Mauritius Daylight Time"
|
60897 "Mauritius Daylight Time"
|
||||||
15968 "Middle East Standard Time"
|
15968 "Middle East Standard Time"
|
||||||
|
|
|
@ -1856,8 +1856,8 @@
|
||||||
@ cdecl _putwch_nolock(long)
|
@ cdecl _putwch_nolock(long)
|
||||||
@ cdecl _putws(wstr) MSVCRT__putws
|
@ cdecl _putws(wstr) MSVCRT__putws
|
||||||
@ stub _query_app_type
|
@ stub _query_app_type
|
||||||
@ stub _query_new_handler
|
@ cdecl _query_new_handler() MSVCRT__query_new_handler
|
||||||
@ stub _query_new_mode
|
@ cdecl _query_new_mode() MSVCRT__query_new_mode
|
||||||
@ cdecl _read(long ptr long) MSVCRT__read
|
@ cdecl _read(long ptr long) MSVCRT__read
|
||||||
@ cdecl _realloc_base(ptr long)
|
@ cdecl _realloc_base(ptr long)
|
||||||
@ cdecl _recalloc(ptr long long)
|
@ cdecl _recalloc(ptr long long)
|
||||||
|
|
|
@ -358,3 +358,13 @@ HRESULT WINAPI URLOpenStreamW(LPUNKNOWN pCaller, LPCWSTR szURL, DWORD dwReserved
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* URLOpenPullStreamW (URLMON.@)
|
||||||
|
*/
|
||||||
|
HRESULT WINAPI URLOpenPullStreamW(IUnknown *caller, const WCHAR *url, DWORD reserved,
|
||||||
|
IBindStatusCallback *callback)
|
||||||
|
{
|
||||||
|
FIXME("%p %s %u %p, stub!\n", caller, debugstr_w(url), reserved, callback);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
|
@ -88,7 +88,7 @@
|
||||||
@ stdcall URLOpenBlockingStreamA(ptr str ptr long ptr)
|
@ stdcall URLOpenBlockingStreamA(ptr str ptr long ptr)
|
||||||
@ stdcall URLOpenBlockingStreamW(ptr wstr ptr long ptr)
|
@ stdcall URLOpenBlockingStreamW(ptr wstr ptr long ptr)
|
||||||
@ stub URLOpenPullStreamA
|
@ stub URLOpenPullStreamA
|
||||||
@ stub URLOpenPullStreamW
|
@ stdcall URLOpenPullStreamW(ptr wstr long ptr)
|
||||||
@ stdcall URLOpenStreamA(ptr str long ptr)
|
@ stdcall URLOpenStreamA(ptr str long ptr)
|
||||||
@ stdcall URLOpenStreamW(ptr wstr long ptr)
|
@ stdcall URLOpenStreamW(ptr wstr long ptr)
|
||||||
@ stub UrlMkBuildVersion
|
@ stub UrlMkBuildVersion
|
||||||
|
|
|
@ -1750,6 +1750,12 @@ static INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar, LPCSCROLLINFO info, BOOL b
|
||||||
action |= SA_SSI_SHOW;
|
action |= SA_SSI_SHOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nBar == SB_CTL && bRedraw && IsWindowVisible(hwnd) &&
|
||||||
|
(new_flags == ESB_ENABLE_BOTH || new_flags == ESB_DISABLE_BOTH))
|
||||||
|
{
|
||||||
|
EnableWindow(hwnd, new_flags == ESB_ENABLE_BOTH);
|
||||||
|
}
|
||||||
|
|
||||||
if (infoPtr->flags != new_flags) /* check arrow flags */
|
if (infoPtr->flags != new_flags) /* check arrow flags */
|
||||||
{
|
{
|
||||||
infoPtr->flags = new_flags;
|
infoPtr->flags = new_flags;
|
||||||
|
|
|
@ -98,6 +98,7 @@ static void ClassTest(HINSTANCE hInstance, BOOL global)
|
||||||
LONG i;
|
LONG i;
|
||||||
WCHAR str[20];
|
WCHAR str[20];
|
||||||
ATOM classatom;
|
ATOM classatom;
|
||||||
|
HINSTANCE hInstance2;
|
||||||
|
|
||||||
cls.style = CS_HREDRAW | CS_VREDRAW | (global?CS_GLOBALCLASS:0);
|
cls.style = CS_HREDRAW | CS_VREDRAW | (global?CS_GLOBALCLASS:0);
|
||||||
cls.lpfnWndProc = ClassTest_WndProc;
|
cls.lpfnWndProc = ClassTest_WndProc;
|
||||||
|
@ -121,6 +122,23 @@ static void ClassTest(HINSTANCE hInstance, BOOL global)
|
||||||
"RegisterClass of the same class should fail for the second time\n");
|
"RegisterClass of the same class should fail for the second time\n");
|
||||||
|
|
||||||
/* Setup windows */
|
/* Setup windows */
|
||||||
|
hInstance2 = (HINSTANCE)(((ULONG_PTR)hInstance & ~0xffff) | 0xdead);
|
||||||
|
|
||||||
|
hTestWnd = CreateWindowW (className, winName,
|
||||||
|
WS_OVERLAPPEDWINDOW + WS_HSCROLL + WS_VSCROLL,
|
||||||
|
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0,
|
||||||
|
0, hInstance2, 0);
|
||||||
|
ok(hTestWnd != 0, "Failed to create window for hInstance %p\n", hInstance2);
|
||||||
|
|
||||||
|
ok((HINSTANCE)GetClassLongPtrA(hTestWnd, GCLP_HMODULE) == hInstance,
|
||||||
|
"Wrong GCL instance %p != %p\n",
|
||||||
|
(HINSTANCE)GetClassLongPtrA(hTestWnd, GCLP_HMODULE), hInstance);
|
||||||
|
ok((HINSTANCE)GetWindowLongPtrA(hTestWnd, GWLP_HINSTANCE) == hInstance2,
|
||||||
|
"Wrong GWL instance %p != %p\n",
|
||||||
|
(HINSTANCE)GetWindowLongPtrA(hTestWnd, GWLP_HINSTANCE), hInstance2);
|
||||||
|
|
||||||
|
DestroyWindow(hTestWnd);
|
||||||
|
|
||||||
hTestWnd = CreateWindowW (className, winName,
|
hTestWnd = CreateWindowW (className, winName,
|
||||||
WS_OVERLAPPEDWINDOW + WS_HSCROLL + WS_VSCROLL,
|
WS_OVERLAPPEDWINDOW + WS_HSCROLL + WS_VSCROLL,
|
||||||
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0,
|
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0,
|
||||||
|
@ -128,6 +146,14 @@ static void ClassTest(HINSTANCE hInstance, BOOL global)
|
||||||
|
|
||||||
ok(hTestWnd!=0, "Failed to create window\n");
|
ok(hTestWnd!=0, "Failed to create window\n");
|
||||||
|
|
||||||
|
ok((HINSTANCE)GetClassLongPtrA(hTestWnd, GCLP_HMODULE) == hInstance,
|
||||||
|
"Wrong GCL instance %p/%p\n",
|
||||||
|
(HINSTANCE)GetClassLongPtrA(hTestWnd, GCLP_HMODULE), hInstance);
|
||||||
|
ok((HINSTANCE)GetWindowLongPtrA(hTestWnd, GWLP_HINSTANCE) == hInstance,
|
||||||
|
"Wrong GWL instance %p/%p\n",
|
||||||
|
(HINSTANCE)GetWindowLongPtrA(hTestWnd, GWLP_HINSTANCE), hInstance);
|
||||||
|
|
||||||
|
|
||||||
/* test initial values of valid classwords */
|
/* test initial values of valid classwords */
|
||||||
for(i=0; i<NUMCLASSWORDS; i++)
|
for(i=0; i<NUMCLASSWORDS; i++)
|
||||||
{
|
{
|
||||||
|
@ -1491,6 +1517,8 @@ START_TEST(class)
|
||||||
|
|
||||||
ClassTest(hInstance,FALSE);
|
ClassTest(hInstance,FALSE);
|
||||||
ClassTest(hInstance,TRUE);
|
ClassTest(hInstance,TRUE);
|
||||||
|
ClassTest((HANDLE)((ULONG_PTR)hInstance | 0x1234), FALSE);
|
||||||
|
ClassTest((HANDLE)((ULONG_PTR)hInstance | 0x1234), TRUE);
|
||||||
CreateDialogParamTest(hInstance);
|
CreateDialogParamTest(hInstance);
|
||||||
test_styles();
|
test_styles();
|
||||||
test_builtinproc();
|
test_builtinproc();
|
||||||
|
|
|
@ -634,7 +634,6 @@ static void test_SetScrollInfo(void)
|
||||||
si.nPage = 50;
|
si.nPage = 50;
|
||||||
SetScrollInfo(hScroll, SB_CTL, &si, TRUE);
|
SetScrollInfo(hScroll, SB_CTL, &si, TRUE);
|
||||||
ret = IsWindowEnabled(hScroll);
|
ret = IsWindowEnabled(hScroll);
|
||||||
todo_wine
|
|
||||||
ok(ret, "Unexpected enabled state.\n");
|
ok(ret, "Unexpected enabled state.\n");
|
||||||
|
|
||||||
si.fMask = SIF_POS|SIF_RANGE|SIF_PAGE|SIF_DISABLENOSCROLL;
|
si.fMask = SIF_POS|SIF_RANGE|SIF_PAGE|SIF_DISABLENOSCROLL;
|
||||||
|
@ -657,7 +656,6 @@ todo_wine
|
||||||
si.nPage = 100;
|
si.nPage = 100;
|
||||||
SetScrollInfo(hScroll, SB_CTL, &si, TRUE);
|
SetScrollInfo(hScroll, SB_CTL, &si, TRUE);
|
||||||
ret = IsWindowEnabled(hScroll);
|
ret = IsWindowEnabled(hScroll);
|
||||||
todo_wine
|
|
||||||
ok(!ret, "Unexpected enabled state.\n");
|
ok(!ret, "Unexpected enabled state.\n");
|
||||||
|
|
||||||
EnableScrollBar(hScroll, SB_CTL, ESB_DISABLE_BOTH);
|
EnableScrollBar(hScroll, SB_CTL, ESB_DISABLE_BOTH);
|
||||||
|
@ -671,7 +669,6 @@ todo_wine
|
||||||
si.nPage = 41;
|
si.nPage = 41;
|
||||||
SetScrollInfo(hScroll, SB_CTL, &si, TRUE);
|
SetScrollInfo(hScroll, SB_CTL, &si, TRUE);
|
||||||
ret = IsWindowEnabled(hScroll);
|
ret = IsWindowEnabled(hScroll);
|
||||||
todo_wine
|
|
||||||
ok(ret, "Unexpected enabled state.\n");
|
ok(ret, "Unexpected enabled state.\n");
|
||||||
|
|
||||||
DestroyWindow(hScroll);
|
DestroyWindow(hScroll);
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "wine/winbase16.h"
|
#include "wine/winbase16.h"
|
||||||
#include "winternl.h"
|
#include "winternl.h"
|
||||||
|
#include "winuser.h"
|
||||||
#include "winver.h"
|
#include "winver.h"
|
||||||
#include "lzexpand.h"
|
#include "lzexpand.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
@ -461,22 +462,23 @@ DWORD WINAPI GetFileResource16( LPCSTR lpszFileName, LPCSTR lpszResType,
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GetFileVersionInfoSize [VER.6]
|
* GetFileVersionInfoSize [VER.6]
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI GetFileVersionInfoSize16( LPCSTR lpszFileName, LPDWORD lpdwHandle )
|
DWORD WINAPI GetFileVersionInfoSize16( LPCSTR filename, LPDWORD handle )
|
||||||
{
|
{
|
||||||
TRACE("(%s, %p)\n", debugstr_a(lpszFileName), lpdwHandle );
|
DWORD offset;
|
||||||
return GetFileVersionInfoSizeA( lpszFileName, lpdwHandle );
|
|
||||||
|
TRACE("(%s, %p)\n", debugstr_a(filename), handle );
|
||||||
|
|
||||||
|
return GetFileResourceSize16( filename, (LPCSTR)RT_VERSION, (LPCSTR)VS_VERSION_INFO, &offset );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GetFileVersionInfo [VER.7]
|
* GetFileVersionInfo [VER.7]
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI GetFileVersionInfo16( LPCSTR lpszFileName, DWORD handle,
|
DWORD WINAPI GetFileVersionInfo16( LPCSTR filename, DWORD handle, DWORD datasize, LPVOID data )
|
||||||
DWORD cbBuf, LPVOID lpvData )
|
|
||||||
{
|
{
|
||||||
TRACE("(%s, %08x, %d, %p)\n",
|
TRACE("(%s, %08x, %d, %p)\n", debugstr_a(filename), handle, datasize, data );
|
||||||
debugstr_a(lpszFileName), handle, cbBuf, lpvData );
|
|
||||||
|
|
||||||
return GetFileVersionInfoA( lpszFileName, handle, cbBuf, lpvData );
|
return GetFileResource16( filename, (LPCSTR)RT_VERSION, (LPCSTR)VS_VERSION_INFO, 0, datasize, data );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|
|
@ -543,6 +543,7 @@ static const struct column col_datafile[] =
|
||||||
};
|
};
|
||||||
static const struct column col_desktopmonitor[] =
|
static const struct column col_desktopmonitor[] =
|
||||||
{
|
{
|
||||||
|
{ prop_nameW, CIM_STRING },
|
||||||
{ prop_pixelsperxlogicalinchW, CIM_UINT32 }
|
{ prop_pixelsperxlogicalinchW, CIM_UINT32 }
|
||||||
};
|
};
|
||||||
static const struct column col_directory[] =
|
static const struct column col_directory[] =
|
||||||
|
@ -1022,6 +1023,7 @@ struct record_datafile
|
||||||
};
|
};
|
||||||
struct record_desktopmonitor
|
struct record_desktopmonitor
|
||||||
{
|
{
|
||||||
|
const WCHAR *name;
|
||||||
UINT32 pixelsperxlogicalinch;
|
UINT32 pixelsperxlogicalinch;
|
||||||
};
|
};
|
||||||
struct record_directory
|
struct record_directory
|
||||||
|
@ -2413,6 +2415,7 @@ static enum fill_status fill_desktopmonitor( struct table *table, const struct e
|
||||||
if (!resize_table( table, 1, sizeof(*rec) )) return FILL_STATUS_FAILED;
|
if (!resize_table( table, 1, sizeof(*rec) )) return FILL_STATUS_FAILED;
|
||||||
|
|
||||||
rec = (struct record_desktopmonitor *)table->data;
|
rec = (struct record_desktopmonitor *)table->data;
|
||||||
|
rec->name = L"Generic Non-PnP Monitor";
|
||||||
rec->pixelsperxlogicalinch = get_pixelsperxlogicalinch();
|
rec->pixelsperxlogicalinch = get_pixelsperxlogicalinch();
|
||||||
|
|
||||||
if (match_row( table, row, cond, &status )) row++;
|
if (match_row( table, row, cond, &status )) row++;
|
||||||
|
|
|
@ -35,6 +35,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(wbemprox);
|
||||||
|
|
||||||
static HINSTANCE instance;
|
static HINSTANCE instance;
|
||||||
|
|
||||||
|
struct list *table_list;
|
||||||
|
|
||||||
typedef HRESULT (*fnCreateInstance)( LPVOID *ppObj );
|
typedef HRESULT (*fnCreateInstance)( LPVOID *ppObj );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|
|
@ -1710,6 +1710,32 @@ static void test_Win32_WinSAT( IWbemServices *services )
|
||||||
SysFreeString( wql );
|
SysFreeString( wql );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_Win32_DesktopMonitor( IWbemServices *services )
|
||||||
|
{
|
||||||
|
BSTR wql = SysAllocString( wqlW ), query = SysAllocString( L"SELECT * FROM Win32_DesktopMonitor" );
|
||||||
|
IEnumWbemClassObject *result;
|
||||||
|
IWbemClassObject *obj;
|
||||||
|
HRESULT hr;
|
||||||
|
DWORD count;
|
||||||
|
|
||||||
|
hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
|
||||||
|
ok( hr == S_OK, "got %08x\n", hr );
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
|
||||||
|
if (hr != S_OK) break;
|
||||||
|
|
||||||
|
check_property( obj, L"Name", VT_BSTR, CIM_STRING );
|
||||||
|
check_property( obj, L"PixelsPerXlogicalInch", VT_I4, CIM_UINT32 );
|
||||||
|
IWbemClassObject_Release( obj );
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumWbemClassObject_Release( result );
|
||||||
|
SysFreeString( query );
|
||||||
|
SysFreeString( wql );
|
||||||
|
}
|
||||||
|
|
||||||
static void test_Win32_DisplayControllerConfiguration( IWbemServices *services )
|
static void test_Win32_DisplayControllerConfiguration( IWbemServices *services )
|
||||||
{
|
{
|
||||||
static const WCHAR bitsperpixelW[] =
|
static const WCHAR bitsperpixelW[] =
|
||||||
|
@ -1835,6 +1861,7 @@ START_TEST(query)
|
||||||
test_Win32_ComputerSystem( services );
|
test_Win32_ComputerSystem( services );
|
||||||
test_Win32_ComputerSystemProduct( services );
|
test_Win32_ComputerSystemProduct( services );
|
||||||
test_Win32_Bios( services );
|
test_Win32_Bios( services );
|
||||||
|
test_Win32_DesktopMonitor( services );
|
||||||
test_Win32_DisplayControllerConfiguration( services );
|
test_Win32_DisplayControllerConfiguration( services );
|
||||||
test_Win32_IP4RouteTable( services );
|
test_Win32_IP4RouteTable( services );
|
||||||
test_Win32_OperatingSystem( services );
|
test_Win32_OperatingSystem( services );
|
||||||
|
|
|
@ -20,8 +20,8 @@
|
||||||
#include "wine/heap.h"
|
#include "wine/heap.h"
|
||||||
#include "wine/list.h"
|
#include "wine/list.h"
|
||||||
|
|
||||||
IClientSecurity client_security DECLSPEC_HIDDEN;
|
extern IClientSecurity client_security DECLSPEC_HIDDEN;
|
||||||
struct list *table_list DECLSPEC_HIDDEN;
|
extern struct list *table_list DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
enum param_direction
|
enum param_direction
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
#include "winhttp.h"
|
#include "winhttp.h"
|
||||||
|
|
||||||
_locale_t c_locale DECLSPEC_HIDDEN;
|
extern _locale_t c_locale DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
#define STREAM_BUFSIZE 4096
|
#define STREAM_BUFSIZE 4096
|
||||||
|
|
||||||
|
@ -50,8 +50,8 @@ struct dictionary
|
||||||
ULONG current_sequence;
|
ULONG current_sequence;
|
||||||
ULONG *sequence;
|
ULONG *sequence;
|
||||||
};
|
};
|
||||||
struct dictionary dict_builtin DECLSPEC_HIDDEN;
|
extern struct dictionary dict_builtin DECLSPEC_HIDDEN;
|
||||||
const struct dictionary dict_builtin_static DECLSPEC_HIDDEN;
|
extern const struct dictionary dict_builtin_static DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
int find_string( const struct dictionary *, const unsigned char *, ULONG, ULONG * ) DECLSPEC_HIDDEN;
|
int find_string( const struct dictionary *, const unsigned char *, ULONG, ULONG * ) DECLSPEC_HIDDEN;
|
||||||
HRESULT insert_string( struct dictionary *, unsigned char *, ULONG, int, ULONG * ) DECLSPEC_HIDDEN;
|
HRESULT insert_string( struct dictionary *, unsigned char *, ULONG, int, ULONG * ) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -54,5 +54,5 @@ DEVICE_OBJECT* bus_enumerate_hid_devices(const platform_vtbl *vtbl, enum_func fu
|
||||||
DWORD check_bus_option(const UNICODE_STRING *option, DWORD default_value) DECLSPEC_HIDDEN;
|
DWORD check_bus_option(const UNICODE_STRING *option, DWORD default_value) DECLSPEC_HIDDEN;
|
||||||
BOOL is_xbox_gamepad(WORD vid, WORD pid) DECLSPEC_HIDDEN;
|
BOOL is_xbox_gamepad(WORD vid, WORD pid) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
HANDLE driver_key DECLSPEC_HIDDEN;
|
extern HANDLE driver_key DECLSPEC_HIDDEN;
|
||||||
DEVICE_OBJECT *bus_pdo DECLSPEC_HIDDEN;
|
extern DEVICE_OBJECT *bus_pdo DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -1359,11 +1359,14 @@ cards_nvidia_binary[] =
|
||||||
{"RTX 2070", CARD_NVIDIA_GEFORCE_RTX2070}, /* GeForce 2000 - highend */
|
{"RTX 2070", CARD_NVIDIA_GEFORCE_RTX2070}, /* GeForce 2000 - highend */
|
||||||
{"RTX 2060", CARD_NVIDIA_GEFORCE_RTX2060}, /* GeForce 2000 - highend */
|
{"RTX 2060", CARD_NVIDIA_GEFORCE_RTX2060}, /* GeForce 2000 - highend */
|
||||||
{"GTX 1660 Ti", CARD_NVIDIA_GEFORCE_GTX1660TI}, /* GeForce 1600 - highend */
|
{"GTX 1660 Ti", CARD_NVIDIA_GEFORCE_GTX1660TI}, /* GeForce 1600 - highend */
|
||||||
|
{"GTX 1660 SUPER", CARD_NVIDIA_GEFORCE_GTX1660SUPER}, /* GeForce 1600 - highend */
|
||||||
|
{"GTX 1650 SUPER", CARD_NVIDIA_GEFORCE_GTX1650SUPER}, /* GeForce 1600 - midend high */
|
||||||
{"TITAN V", CARD_NVIDIA_TITANV}, /* GeForce 1000 - highend */
|
{"TITAN V", CARD_NVIDIA_TITANV}, /* GeForce 1000 - highend */
|
||||||
{"TITAN X (Pascal)", CARD_NVIDIA_TITANX_PASCAL}, /* GeForce 1000 - highend */
|
{"TITAN X (Pascal)", CARD_NVIDIA_TITANX_PASCAL}, /* GeForce 1000 - highend */
|
||||||
{"GTX 1080 Ti", CARD_NVIDIA_GEFORCE_GTX1080TI}, /* GeForce 1000 - highend */
|
{"GTX 1080 Ti", CARD_NVIDIA_GEFORCE_GTX1080TI}, /* GeForce 1000 - highend */
|
||||||
{"GTX 1080", CARD_NVIDIA_GEFORCE_GTX1080}, /* GeForce 1000 - highend */
|
{"GTX 1080", CARD_NVIDIA_GEFORCE_GTX1080}, /* GeForce 1000 - highend */
|
||||||
{"GTX 1070", CARD_NVIDIA_GEFORCE_GTX1070}, /* GeForce 1000 - highend */
|
{"GTX 1070", CARD_NVIDIA_GEFORCE_GTX1070}, /* GeForce 1000 - highend */
|
||||||
|
{"GTX 1060 3GB", CARD_NVIDIA_GEFORCE_GTX1060_3GB},/* GeForce 1000 - midend high */
|
||||||
{"GTX 1060", CARD_NVIDIA_GEFORCE_GTX1060}, /* GeForce 1000 - midend high */
|
{"GTX 1060", CARD_NVIDIA_GEFORCE_GTX1060}, /* GeForce 1000 - midend high */
|
||||||
{"GTX 1050 Ti", CARD_NVIDIA_GEFORCE_GTX1050TI}, /* GeForce 1000 - midend */
|
{"GTX 1050 Ti", CARD_NVIDIA_GEFORCE_GTX1050TI}, /* GeForce 1000 - midend */
|
||||||
{"GTX 1050", CARD_NVIDIA_GEFORCE_GTX1050}, /* GeForce 1000 - midend */
|
{"GTX 1050", CARD_NVIDIA_GEFORCE_GTX1050}, /* GeForce 1000 - midend */
|
||||||
|
@ -4848,7 +4851,7 @@ static void wined3d_view_gl_destroy(struct wined3d_device *device,
|
||||||
ctx->free = ctx != &c ? ctx : NULL;
|
ctx->free = ctx != &c ? ctx : NULL;
|
||||||
|
|
||||||
wined3d_cs_destroy_object(device->cs, wined3d_view_gl_destroy_object, ctx);
|
wined3d_cs_destroy_object(device->cs, wined3d_view_gl_destroy_object, ctx);
|
||||||
if (!ctx->free)
|
if (ctx == &c)
|
||||||
device->cs->ops->finish(device->cs, WINED3D_CS_QUEUE_DEFAULT);
|
device->cs->ops->finish(device->cs, WINED3D_CS_QUEUE_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -414,12 +414,15 @@ static const struct wined3d_gpu_description gpu_description_table[] =
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX980TI, "NVIDIA GeForce GTX 980 Ti", DRIVER_NVIDIA_GEFORCE8, 6144},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX980TI, "NVIDIA GeForce GTX 980 Ti", DRIVER_NVIDIA_GEFORCE8, 6144},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1050, "NVIDIA GeForce GTX 1050", DRIVER_NVIDIA_GEFORCE8, 2048},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1050, "NVIDIA GeForce GTX 1050", DRIVER_NVIDIA_GEFORCE8, 2048},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1050TI, "NVIDIA GeForce GTX 1050 Ti", DRIVER_NVIDIA_GEFORCE8, 4096},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1050TI, "NVIDIA GeForce GTX 1050 Ti", DRIVER_NVIDIA_GEFORCE8, 4096},
|
||||||
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1060_3GB,"NVIDIA GeForce GTX 1060 3GB", DRIVER_NVIDIA_GEFORCE8, 3072},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1060, "NVIDIA GeForce GTX 1060", DRIVER_NVIDIA_GEFORCE8, 6144},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1060, "NVIDIA GeForce GTX 1060", DRIVER_NVIDIA_GEFORCE8, 6144},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1070, "NVIDIA GeForce GTX 1070", DRIVER_NVIDIA_GEFORCE8, 8192},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1070, "NVIDIA GeForce GTX 1070", DRIVER_NVIDIA_GEFORCE8, 8192},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1080, "NVIDIA GeForce GTX 1080", DRIVER_NVIDIA_GEFORCE8, 8192},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1080, "NVIDIA GeForce GTX 1080", DRIVER_NVIDIA_GEFORCE8, 8192},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1080TI, "NVIDIA GeForce GTX 1080 Ti", DRIVER_NVIDIA_GEFORCE8, 11264},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1080TI, "NVIDIA GeForce GTX 1080 Ti", DRIVER_NVIDIA_GEFORCE8, 11264},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_TITANX_PASCAL, "NVIDIA TITAN X (Pascal)", DRIVER_NVIDIA_GEFORCE8, 12288},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_TITANX_PASCAL, "NVIDIA TITAN X (Pascal)", DRIVER_NVIDIA_GEFORCE8, 12288},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_TITANV, "NVIDIA TITAN V", DRIVER_NVIDIA_GEFORCE8, 12288},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_TITANV, "NVIDIA TITAN V", DRIVER_NVIDIA_GEFORCE8, 12288},
|
||||||
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1650SUPER,"NVIDIA GeForce GTX 1650 SUPER", DRIVER_NVIDIA_GEFORCE8, 4096},
|
||||||
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1660SUPER,"NVIDIA GeForce GTX 1660 SUPER", DRIVER_NVIDIA_GEFORCE8, 6144},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1660TI, "NVIDIA GeForce GTX 1660 Ti", DRIVER_NVIDIA_GEFORCE8, 6144},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX1660TI, "NVIDIA GeForce GTX 1660 Ti", DRIVER_NVIDIA_GEFORCE8, 6144},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_RTX2060, "NVIDIA GeForce RTX 2060", DRIVER_NVIDIA_GEFORCE8, 6144},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_RTX2060, "NVIDIA GeForce RTX 2060", DRIVER_NVIDIA_GEFORCE8, 6144},
|
||||||
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_RTX2070, "NVIDIA GeForce RTX 2070", DRIVER_NVIDIA_GEFORCE8, 8192},
|
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_RTX2070, "NVIDIA GeForce RTX 2070", DRIVER_NVIDIA_GEFORCE8, 8192},
|
||||||
|
|
|
@ -1459,10 +1459,10 @@ void CDECL wined3d_stateblock_set_texture_stage_state(struct wined3d_stateblock
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stage > WINED3D_MAX_TEXTURES)
|
if (stage >= WINED3D_MAX_TEXTURES)
|
||||||
{
|
{
|
||||||
WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring.\n",
|
WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring.\n",
|
||||||
stage, WINED3D_MAX_TEXTURES);
|
stage, WINED3D_MAX_TEXTURES - 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1490,15 +1490,15 @@ static const struct wined3d_format_texture_info format_texture_info[] =
|
||||||
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
|
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
|
||||||
| WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE,
|
| WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE,
|
||||||
WINED3D_GL_EXT_NONE, NULL},
|
WINED3D_GL_EXT_NONE, NULL},
|
||||||
{WINED3DFMT_B5G6R5_UNORM, GL_RGB5, GL_RGB5, GL_RGB8,
|
{WINED3DFMT_B5G6R5_UNORM, GL_RGB5, GL_SRGB8_EXT, GL_RGB8,
|
||||||
GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0,
|
GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0,
|
||||||
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
|
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
|
||||||
| WINED3DFMT_FLAG_RENDERTARGET,
|
| WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_SRGB_READ,
|
||||||
WINED3D_GL_EXT_NONE, NULL},
|
WINED3D_GL_EXT_NONE, NULL},
|
||||||
{WINED3DFMT_B5G6R5_UNORM, GL_RGB565, GL_RGB565, GL_RGB8,
|
{WINED3DFMT_B5G6R5_UNORM, GL_RGB565, GL_SRGB8_EXT, GL_RGB8,
|
||||||
GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0,
|
GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0,
|
||||||
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
|
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
|
||||||
| WINED3DFMT_FLAG_RENDERTARGET,
|
| WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_SRGB_READ,
|
||||||
ARB_ES2_COMPATIBILITY, NULL},
|
ARB_ES2_COMPATIBILITY, NULL},
|
||||||
{WINED3DFMT_B5G5R5X1_UNORM, GL_RGB5, GL_RGB5, 0,
|
{WINED3DFMT_B5G5R5X1_UNORM, GL_RGB5, GL_RGB5, 0,
|
||||||
GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0,
|
GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0,
|
||||||
|
|
|
@ -2540,12 +2540,15 @@ enum wined3d_pci_device
|
||||||
CARD_NVIDIA_GEFORCE_GTX980TI = 0x17c8,
|
CARD_NVIDIA_GEFORCE_GTX980TI = 0x17c8,
|
||||||
CARD_NVIDIA_GEFORCE_GTX1050 = 0x1c81,
|
CARD_NVIDIA_GEFORCE_GTX1050 = 0x1c81,
|
||||||
CARD_NVIDIA_GEFORCE_GTX1050TI = 0x1c82,
|
CARD_NVIDIA_GEFORCE_GTX1050TI = 0x1c82,
|
||||||
|
CARD_NVIDIA_GEFORCE_GTX1060_3GB = 0x1c02,
|
||||||
CARD_NVIDIA_GEFORCE_GTX1060 = 0x1c03,
|
CARD_NVIDIA_GEFORCE_GTX1060 = 0x1c03,
|
||||||
CARD_NVIDIA_GEFORCE_GTX1070 = 0x1b81,
|
CARD_NVIDIA_GEFORCE_GTX1070 = 0x1b81,
|
||||||
CARD_NVIDIA_GEFORCE_GTX1080 = 0x1b80,
|
CARD_NVIDIA_GEFORCE_GTX1080 = 0x1b80,
|
||||||
CARD_NVIDIA_GEFORCE_GTX1080TI = 0x1b06,
|
CARD_NVIDIA_GEFORCE_GTX1080TI = 0x1b06,
|
||||||
CARD_NVIDIA_TITANX_PASCAL = 0x1b00,
|
CARD_NVIDIA_TITANX_PASCAL = 0x1b00,
|
||||||
CARD_NVIDIA_TITANV = 0x1d81,
|
CARD_NVIDIA_TITANV = 0x1d81,
|
||||||
|
CARD_NVIDIA_GEFORCE_GTX1650SUPER= 0x2187,
|
||||||
|
CARD_NVIDIA_GEFORCE_GTX1660SUPER= 0x21c4,
|
||||||
CARD_NVIDIA_GEFORCE_GTX1660TI = 0x2182,
|
CARD_NVIDIA_GEFORCE_GTX1660TI = 0x2182,
|
||||||
CARD_NVIDIA_GEFORCE_RTX2060 = 0x1f08,
|
CARD_NVIDIA_GEFORCE_RTX2060 = 0x1f08,
|
||||||
CARD_NVIDIA_GEFORCE_RTX2070 = 0x1f07,
|
CARD_NVIDIA_GEFORCE_RTX2070 = 0x1f07,
|
||||||
|
|
|
@ -208,6 +208,9 @@ static void macdrv_surface_destroy(struct window_surface *window_surface)
|
||||||
struct macdrv_window_surface *surface = get_mac_surface(window_surface);
|
struct macdrv_window_surface *surface = get_mac_surface(window_surface);
|
||||||
|
|
||||||
TRACE("freeing %p bits %p\n", surface, surface->bits);
|
TRACE("freeing %p bits %p\n", surface, surface->bits);
|
||||||
|
if (surface->region) DeleteObject(surface->region);
|
||||||
|
if (surface->drawn) DeleteObject(surface->drawn);
|
||||||
|
HeapFree(GetProcessHeap(), 0, surface->blit_data);
|
||||||
HeapFree(GetProcessHeap(), 0, surface->bits);
|
HeapFree(GetProcessHeap(), 0, surface->bits);
|
||||||
pthread_mutex_destroy(&surface->mutex);
|
pthread_mutex_destroy(&surface->mutex);
|
||||||
HeapFree(GetProcessHeap(), 0, surface);
|
HeapFree(GetProcessHeap(), 0, surface);
|
||||||
|
|
|
@ -26,8 +26,8 @@ typedef struct _xinput_controller
|
||||||
XINPUT_VIBRATION vibration;
|
XINPUT_VIBRATION vibration;
|
||||||
} xinput_controller;
|
} xinput_controller;
|
||||||
|
|
||||||
CRITICAL_SECTION xinput_crit;
|
extern CRITICAL_SECTION xinput_crit;
|
||||||
xinput_controller controllers[XUSER_MAX_COUNT];
|
extern xinput_controller controllers[XUSER_MAX_COUNT];
|
||||||
|
|
||||||
void HID_find_gamepads(xinput_controller *devices) DECLSPEC_HIDDEN;
|
void HID_find_gamepads(xinput_controller *devices) DECLSPEC_HIDDEN;
|
||||||
void HID_destroy_gamepads(xinput_controller *devices) DECLSPEC_HIDDEN;
|
void HID_destroy_gamepads(xinput_controller *devices) DECLSPEC_HIDDEN;
|
||||||
|
|
170
include/icm.h
170
include/icm.h
|
@ -137,20 +137,20 @@ typedef enum
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
BM_x555RGB = 0x00,
|
BM_x555RGB = 0x0000,
|
||||||
BM_565RGB = 0x01,
|
BM_565RGB = 0x0001,
|
||||||
BM_RGBTRIPLETS = 0x02,
|
BM_RGBTRIPLETS = 0x0002,
|
||||||
BM_BGRTRIPLETS = 0x04,
|
BM_BGRTRIPLETS = 0x0004,
|
||||||
BM_xRGBQUADS = 0x08,
|
BM_xRGBQUADS = 0x0008,
|
||||||
BM_10b_RGB = 0x09,
|
BM_10b_RGB = 0x0009,
|
||||||
BM_16b_RGB = 0x0a,
|
BM_16b_RGB = 0x000a,
|
||||||
BM_xBGRQUADS = 0x10,
|
BM_xBGRQUADS = 0x0010,
|
||||||
BM_CMYKQUADS = 0x20,
|
BM_CMYKQUADS = 0x0020,
|
||||||
BM_x555XYZ = 0x101,
|
BM_x555XYZ = 0x0101,
|
||||||
BM_x555Yxz,
|
BM_x555Yxz,
|
||||||
BM_x555Lab,
|
BM_x555Lab,
|
||||||
BM_x555G3CH,
|
BM_x555G3CH,
|
||||||
BM_XYZTRIPLETS = 0x201,
|
BM_XYZTRIPLETS = 0x0201,
|
||||||
BM_YxyTRIPLETS,
|
BM_YxyTRIPLETS,
|
||||||
BM_LabTRIPLETS,
|
BM_LabTRIPLETS,
|
||||||
BM_G3CHTRIPLETS,
|
BM_G3CHTRIPLETS,
|
||||||
|
@ -159,21 +159,28 @@ typedef enum
|
||||||
BM_7CHANNEL,
|
BM_7CHANNEL,
|
||||||
BM_8CHANNEL,
|
BM_8CHANNEL,
|
||||||
BM_GRAY,
|
BM_GRAY,
|
||||||
BM_xXYZQUADS = 0x301,
|
BM_xXYZQUADS = 0x0301,
|
||||||
BM_xYxyQUADS,
|
BM_xYxyQUADS,
|
||||||
BM_xLabQUADS,
|
BM_xLabQUADS,
|
||||||
BM_xG3CHQUADS,
|
BM_xG3CHQUADS,
|
||||||
BM_KYMCQUADS,
|
BM_KYMCQUADS,
|
||||||
BM_10b_XYZ = 0x401,
|
BM_10b_XYZ = 0x0401,
|
||||||
BM_10b_Yxy,
|
BM_10b_Yxy,
|
||||||
BM_10b_Lab,
|
BM_10b_Lab,
|
||||||
BM_10b_G3CH,
|
BM_10b_G3CH,
|
||||||
BM_NAMED_INDEX,
|
BM_NAMED_INDEX,
|
||||||
BM_16b_XYZ = 0x501,
|
BM_16b_XYZ = 0x0501,
|
||||||
BM_16b_Yxy,
|
BM_16b_Yxy,
|
||||||
BM_16b_Lab,
|
BM_16b_Lab,
|
||||||
BM_16b_G3CH,
|
BM_16b_G3CH,
|
||||||
BM_16b_GRAY,
|
BM_16b_GRAY,
|
||||||
|
BM_32b_scRGB = 0x0601,
|
||||||
|
BM_32b_scARGB,
|
||||||
|
BM_S2DOT13FIXED_scRGB,
|
||||||
|
BM_S2DOT13FIXED_scARGB,
|
||||||
|
BM_R10G10B10A2 = 0x0701,
|
||||||
|
BM_R10G10B10A2_XR,
|
||||||
|
BM_R16G16B16A16_FLOAT
|
||||||
} BMFORMAT, *PBMFORMAT, *LPBMFORMAT;
|
} BMFORMAT, *PBMFORMAT, *LPBMFORMAT;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
@ -182,6 +189,36 @@ typedef enum
|
||||||
WCS_PROFILE_MANAGEMENT_SCOPE_CURRENT_USER
|
WCS_PROFILE_MANAGEMENT_SCOPE_CURRENT_USER
|
||||||
} WCS_PROFILE_MANAGEMENT_SCOPE;
|
} WCS_PROFILE_MANAGEMENT_SCOPE;
|
||||||
|
|
||||||
|
#define DONT_USE_EMBEDDED_WCS_PROFILES 0x00000001
|
||||||
|
|
||||||
|
#define PROOF_MODE 0x00000001
|
||||||
|
#define NORMAL_MODE 0x00000002
|
||||||
|
#define BEST_MODE 0x00000003
|
||||||
|
#define ENABLE_GAMUT_CHECKING 0x00010000
|
||||||
|
#define USE_RELATIVE_COLORIMETRIC 0x00020000
|
||||||
|
#define FAST_TRANSLATE 0x00040000
|
||||||
|
#define PRESERVEBLACK 0x00100000
|
||||||
|
#define WCS_ALWAYS 0x00200000
|
||||||
|
#define RESERVED 0x80000000
|
||||||
|
#define SEQUENTIAL_TRANSFORM 0x80800000
|
||||||
|
|
||||||
|
#define CSA_A 1
|
||||||
|
#define CSA_ABC 2
|
||||||
|
#define CSA_DEF 3
|
||||||
|
#define CSA_DEFG 4
|
||||||
|
#define CSA_GRAY 5
|
||||||
|
#define CSA_RGB 6
|
||||||
|
#define CSA_CMYK 7
|
||||||
|
#define CSA_Lab 8
|
||||||
|
|
||||||
|
#define CMM_WIN_VERSION 0
|
||||||
|
#define CMM_IDENT 1
|
||||||
|
#define CMM_DRIVER_VERSION 2
|
||||||
|
#define CMM_DLL_VERSION 3
|
||||||
|
#define CMM_VERSION 4
|
||||||
|
#define CMM_DESCRIPTION 5
|
||||||
|
#define CMM_LOGOICON 6
|
||||||
|
|
||||||
typedef BOOL (CALLBACK *PBMCALLBACKFN)(ULONG,ULONG,LPARAM);
|
typedef BOOL (CALLBACK *PBMCALLBACKFN)(ULONG,ULONG,LPARAM);
|
||||||
typedef PBMCALLBACKFN LPPBMCALLBACKFN;
|
typedef PBMCALLBACKFN LPPBMCALLBACKFN;
|
||||||
|
|
||||||
|
@ -190,6 +227,38 @@ typedef PBMCALLBACKFN LPPBMCALLBACKFN;
|
||||||
#define INTENT_SATURATION 2
|
#define INTENT_SATURATION 2
|
||||||
#define INTENT_ABSOLUTE_COLORIMETRIC 3
|
#define INTENT_ABSOLUTE_COLORIMETRIC 3
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
CPT_ICC,
|
||||||
|
CPT_DMP,
|
||||||
|
CPT_CAMP,
|
||||||
|
CPT_GMMP
|
||||||
|
} COLORPROFILETYPE, *PCOLORPROFILETYPE, *LPCOLORPROFILETYPE;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
CPST_PERCEPTUAL = INTENT_PERCEPTUAL,
|
||||||
|
CPST_RELATIVE_COLORIMETRIC = INTENT_RELATIVE_COLORIMETRIC,
|
||||||
|
CPST_SATURATION = INTENT_SATURATION,
|
||||||
|
CPST_ABSOLUTE_COLORIMETRIC = INTENT_ABSOLUTE_COLORIMETRIC,
|
||||||
|
CPST_NONE,
|
||||||
|
CPST_RGB_WORKING_SPACE,
|
||||||
|
CPST_CUSTOM_WORKING_SPACE,
|
||||||
|
CPST_STANDARD_DISPLAY_COLOR_MODE,
|
||||||
|
CPST_EXTENDED_DISPLAY_COLOR_MODE
|
||||||
|
} COLORPROFILESUBTYPE, *PCOLORPROFILESUBTYPE, *LPCOLORPROFILESUBTYPE;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
COLOR_BYTE = 1,
|
||||||
|
COLOR_WORD,
|
||||||
|
COLOR_FLOAT,
|
||||||
|
COLOR_S2DOT13FIXED,
|
||||||
|
COLOR_10b_R10G10B10A2,
|
||||||
|
COLOR_10b_R10G10B10A2_XR,
|
||||||
|
COLOR_FLOAT16
|
||||||
|
} COLORDATATYPE, *PCOLORDATATYPE, *LPCOLORDATATYPE;
|
||||||
|
|
||||||
typedef struct tagPROFILEHEADER
|
typedef struct tagPROFILEHEADER
|
||||||
{
|
{
|
||||||
DWORD phSize;
|
DWORD phSize;
|
||||||
|
@ -268,23 +337,43 @@ typedef struct tagENUMTYPEW
|
||||||
DWORD dwDeviceClass;
|
DWORD dwDeviceClass;
|
||||||
} ENUMTYPEW, *PENUMTYPEW, *LPENUMTYPEW;
|
} ENUMTYPEW, *PENUMTYPEW, *LPENUMTYPEW;
|
||||||
|
|
||||||
#define ET_DEVICENAME 0x00000001
|
#define ET_DEVICENAME 0x00000001
|
||||||
#define ET_MEDIATYPE 0x00000002
|
#define ET_MEDIATYPE 0x00000002
|
||||||
#define ET_DITHERMODE 0x00000004
|
#define ET_DITHERMODE 0x00000004
|
||||||
#define ET_RESOLUTION 0x00000008
|
#define ET_RESOLUTION 0x00000008
|
||||||
#define ET_CMMTYPE 0x00000010
|
#define ET_CMMTYPE 0x00000010
|
||||||
#define ET_CLASS 0x00000020
|
#define ET_CLASS 0x00000020
|
||||||
#define ET_DATACOLORSPACE 0x00000040
|
#define ET_DATACOLORSPACE 0x00000040
|
||||||
#define ET_CONNECTIONSPACE 0x00000080
|
#define ET_CONNECTIONSPACE 0x00000080
|
||||||
#define ET_SIGNATURE 0x00000100
|
#define ET_SIGNATURE 0x00000100
|
||||||
#define ET_PLATFORM 0x00000200
|
#define ET_PLATFORM 0x00000200
|
||||||
#define ET_PROFILEFLAGS 0x00000400
|
#define ET_PROFILEFLAGS 0x00000400
|
||||||
#define ET_MANUFACTURER 0x00000800
|
#define ET_MANUFACTURER 0x00000800
|
||||||
#define ET_MODEL 0x00001000
|
#define ET_MODEL 0x00001000
|
||||||
#define ET_ATTRIBUTES 0x00002000
|
#define ET_ATTRIBUTES 0x00002000
|
||||||
#define ET_RENDERINGINTENT 0x00004000
|
#define ET_RENDERINGINTENT 0x00004000
|
||||||
#define ET_CREATOR 0x00008000
|
#define ET_CREATOR 0x00008000
|
||||||
#define ET_DEVICECLASS 0x00010000
|
#define ET_DEVICECLASS 0x00010000
|
||||||
|
#define ET_STANDARDDISPLAYCOLOR 0x00020000
|
||||||
|
#define ET_EXTENDEDDISPLAYCOLOR 0x00040000
|
||||||
|
|
||||||
|
#define COLOR_MATCH_VERSION 0x0200
|
||||||
|
|
||||||
|
#define CMS_DISABLEICM 0x00000001
|
||||||
|
#define CMS_ENABLEPROOFING 0x00000002
|
||||||
|
#define CMS_SETRENDERINTENT 0x00000004
|
||||||
|
#define CMS_SETPROOFINTENT 0x00000008
|
||||||
|
#define CMS_SETMONITORPROFILE 0x00000010
|
||||||
|
#define CMS_SETPRINTERPROFILE 0x00000020
|
||||||
|
#define CMS_SETTARGETPROFILE 0x00000040
|
||||||
|
#define CMS_USEHOOK 0x00000080
|
||||||
|
#define CMS_USEAPPLYCALLBACK 0x00000100
|
||||||
|
#define CMS_USEDESCRIPTION 0x00000200
|
||||||
|
#define CMS_DISABLEINTENT 0x00000400
|
||||||
|
#define CMS_DISABLERENDERINTENT 0x00000800
|
||||||
|
#define CMS_TARGETOVERFLOW 0x20000000
|
||||||
|
#define CMS_PRINTERROVERFLOW 0x40000000
|
||||||
|
#define CMS_MONITOROVERFLOW 0x80000000
|
||||||
|
|
||||||
struct _tagCOLORMATCHSETUPA;
|
struct _tagCOLORMATCHSETUPA;
|
||||||
struct _tagCOLORMATCHSETUPW;
|
struct _tagCOLORMATCHSETUPW;
|
||||||
|
@ -410,6 +499,8 @@ BOOL WINAPI UnregisterCMMA(PCSTR,DWORD);
|
||||||
BOOL WINAPI UnregisterCMMW(PCWSTR,DWORD);
|
BOOL WINAPI UnregisterCMMW(PCWSTR,DWORD);
|
||||||
#define UnregisterCMM WINELIB_NAME_AW(UnregisterCMM)
|
#define UnregisterCMM WINELIB_NAME_AW(UnregisterCMM)
|
||||||
BOOL WINAPI WcsEnumColorProfilesSize(WCS_PROFILE_MANAGEMENT_SCOPE,ENUMTYPEW*,DWORD*);
|
BOOL WINAPI WcsEnumColorProfilesSize(WCS_PROFILE_MANAGEMENT_SCOPE,ENUMTYPEW*,DWORD*);
|
||||||
|
BOOL WINAPI WcsGetDefaultColorProfileSize(WCS_PROFILE_MANAGEMENT_SCOPE,const WCHAR*,COLORPROFILETYPE,COLORPROFILESUBTYPE,DWORD,DWORD*);
|
||||||
|
BOOL WINAPI WcsGetDefaultRenderingIntent(WCS_PROFILE_MANAGEMENT_SCOPE,DWORD*);
|
||||||
BOOL WINAPI WcsGetUsePerUserProfiles(const WCHAR*,DWORD,BOOL*);
|
BOOL WINAPI WcsGetUsePerUserProfiles(const WCHAR*,DWORD,BOOL*);
|
||||||
HPROFILE WINAPI WcsOpenColorProfileA(PROFILE*,PROFILE*,PROFILE*,DWORD,DWORD,DWORD,DWORD);
|
HPROFILE WINAPI WcsOpenColorProfileA(PROFILE*,PROFILE*,PROFILE*,DWORD,DWORD,DWORD,DWORD);
|
||||||
HPROFILE WINAPI WcsOpenColorProfileW(PROFILE*,PROFILE*,PROFILE*,DWORD,DWORD,DWORD,DWORD);
|
HPROFILE WINAPI WcsOpenColorProfileW(PROFILE*,PROFILE*,PROFILE*,DWORD,DWORD,DWORD,DWORD);
|
||||||
|
@ -420,6 +511,23 @@ HPROFILE WINAPI WcsOpenColorProfileW(PROFILE*,PROFILE*,PROFILE*,DWORD,DWORD,DW
|
||||||
#define PROFILE_READ 1
|
#define PROFILE_READ 1
|
||||||
#define PROFILE_READWRITE 2
|
#define PROFILE_READWRITE 2
|
||||||
|
|
||||||
|
#define FLAG_EMBEDDEDPROFILE 0x00000001
|
||||||
|
#define FLAG_DEPENDENTONDATA 0x00000002
|
||||||
|
#define FLAG_ENABLE_CHROMATIC_ADAPTATION 0x02000000
|
||||||
|
|
||||||
|
#define ATTRIB_TRANSPARENCY 0x00000001
|
||||||
|
#define ATTRIB_MATTE 0x00000002
|
||||||
|
|
||||||
|
#define CLASS_MONITOR 0x6D6E7472 /* 'mntr' */
|
||||||
|
#define CLASS_PRINTER 0x70727472 /* 'prtr' */
|
||||||
|
#define CLASS_SCANNER 0x73636E72 /* 'scnr' */
|
||||||
|
#define CLASS_LINK 0x6C696E6B /* 'link' */
|
||||||
|
#define CLASS_ABSTRACT 0x61627374 /* 'abst' */
|
||||||
|
#define CLASS_COLORSPACE 0x73617063 /* 'spac' */
|
||||||
|
#define CLASS_NAMED 0x6E6D636C /* 'nmcl' */
|
||||||
|
#define CLASS_CAMP 0x63616D70 /* 'camp' */
|
||||||
|
#define CLASS_GMMP 0x676D6D70 /* 'gmmp' */
|
||||||
|
|
||||||
#define SPACE_XYZ 0x58595A20 /* 'XYZ ' */
|
#define SPACE_XYZ 0x58595A20 /* 'XYZ ' */
|
||||||
#define SPACE_Lab 0x4C616220 /* 'Lab ' */
|
#define SPACE_Lab 0x4C616220 /* 'Lab ' */
|
||||||
#define SPACE_Luv 0x4C757620 /* 'Luv ' */
|
#define SPACE_Luv 0x4C757620 /* 'Luv ' */
|
||||||
|
|
|
@ -430,12 +430,12 @@ typedef [uuid(00000574-0000-0010-8000-00aa006d2ea4)] enum CopyRecordOptionsEnum
|
||||||
|
|
||||||
typedef [uuid(00000570-0000-0010-8000-00aa006d2ea4)] enum RecordCreateOptionsEnum
|
typedef [uuid(00000570-0000-0010-8000-00aa006d2ea4)] enum RecordCreateOptionsEnum
|
||||||
{
|
{
|
||||||
adCreateCollection = 0x00002000,
|
adCreateCollection = (int) 0x00002000,
|
||||||
adCreateStructDoc = 0x80000000,
|
adCreateStructDoc = (int) 0x80000000,
|
||||||
adCreateNonCollection = 0x00000000,
|
adCreateNonCollection = (int) 0x00000000,
|
||||||
adOpenIfExists = 0x02000000,
|
adOpenIfExists = (int) 0x02000000,
|
||||||
adCreateOverwrite = 0x04000000,
|
adCreateOverwrite = (int) 0x04000000,
|
||||||
adFailIfNotExists = -1
|
adFailIfNotExists = (int) -1
|
||||||
} RecordCreateOptionsEnum;
|
} RecordCreateOptionsEnum;
|
||||||
|
|
||||||
typedef [uuid(00000571-0000-0010-8000-00aa006d2ea4)] enum RecordOpenOptionsEnum
|
typedef [uuid(00000571-0000-0010-8000-00aa006d2ea4)] enum RecordOpenOptionsEnum
|
||||||
|
|
342
include/tom.idl
342
include/tom.idl
|
@ -25,185 +25,185 @@ cpp_quote("#endif")
|
||||||
|
|
||||||
typedef enum tagTomConstants
|
typedef enum tagTomConstants
|
||||||
{
|
{
|
||||||
tomFalse = 0,
|
tomFalse = (int) 0,
|
||||||
tomTrue = -1,
|
tomTrue = (int) -1,
|
||||||
tomUndefined = -9999999,
|
tomUndefined = (int) -9999999,
|
||||||
tomToggle = -9999998,
|
tomToggle = (int) -9999998,
|
||||||
tomAutoColor = -9999997,
|
tomAutoColor = (int) -9999997,
|
||||||
tomDefault = -9999996,
|
tomDefault = (int) -9999996,
|
||||||
tomSuspend = -9999995,
|
tomSuspend = (int) -9999995,
|
||||||
tomResume = -9999994,
|
tomResume = (int) -9999994,
|
||||||
|
|
||||||
/* ITextFont::Reset() modes */
|
/* ITextFont::Reset() modes */
|
||||||
tomApplyNow = 0,
|
tomApplyNow = (int) 0,
|
||||||
tomApplyLater = 1,
|
tomApplyLater = (int) 1,
|
||||||
tomTrackParms = 2,
|
tomTrackParms = (int) 2,
|
||||||
tomCacheParms = 3,
|
tomCacheParms = (int) 3,
|
||||||
tomApplyTmp = 4,
|
tomApplyTmp = (int) 4,
|
||||||
tomDisableSmartFont = 8,
|
tomDisableSmartFont = (int) 8,
|
||||||
tomEnableSmartFont = 9,
|
tomEnableSmartFont = (int) 9,
|
||||||
tomUsePoints = 10,
|
tomUsePoints = (int) 10,
|
||||||
tomUseTwips = 11,
|
tomUseTwips = (int) 11,
|
||||||
|
|
||||||
tomBackward = 0xc0000001,
|
tomBackward = (int) 0xc0000001,
|
||||||
tomForward = 0x3fffffff,
|
tomForward = (int) 0x3fffffff,
|
||||||
tomMove = 0,
|
tomMove = (int) 0,
|
||||||
tomExtend = 1,
|
tomExtend = (int) 1,
|
||||||
tomNoSelection = 0,
|
tomNoSelection = (int) 0,
|
||||||
tomSelectionIP = 1,
|
tomSelectionIP = (int) 1,
|
||||||
tomSelectionNormal = 2,
|
tomSelectionNormal = (int) 2,
|
||||||
tomSelectionFrame = 3,
|
tomSelectionFrame = (int) 3,
|
||||||
tomSelectionColumn = 4,
|
tomSelectionColumn = (int) 4,
|
||||||
tomSelectionRow = 5,
|
tomSelectionRow = (int) 5,
|
||||||
tomSelectionBlock = 6,
|
tomSelectionBlock = (int) 6,
|
||||||
tomSelectionInlineShape = 7,
|
tomSelectionInlineShape = (int) 7,
|
||||||
tomSelectionShape = 8,
|
tomSelectionShape = (int) 8,
|
||||||
tomSelStartActive = 1,
|
tomSelStartActive = (int) 1,
|
||||||
tomSelAtEOL = 2,
|
tomSelAtEOL = (int) 2,
|
||||||
tomSelOvertype = 4,
|
tomSelOvertype = (int) 4,
|
||||||
tomSelActive = 8,
|
tomSelActive = (int) 8,
|
||||||
tomSelReplace = 16,
|
tomSelReplace = (int) 16,
|
||||||
tomEnd = 0,
|
tomEnd = (int) 0,
|
||||||
tomStart = 32,
|
tomStart = (int) 32,
|
||||||
tomCollapseEnd = 0,
|
tomCollapseEnd = (int) 0,
|
||||||
tomCollapseStart = 1,
|
tomCollapseStart = (int) 1,
|
||||||
tomClientCoord = 256,
|
tomClientCoord = (int) 256,
|
||||||
tomNone = 0,
|
tomNone = (int) 0,
|
||||||
tomSingle = 1,
|
tomSingle = (int) 1,
|
||||||
tomWords = 2,
|
tomWords = (int) 2,
|
||||||
tomDouble = 3,
|
tomDouble = (int) 3,
|
||||||
tomDotted = 4,
|
tomDotted = (int) 4,
|
||||||
tomDash = 5,
|
tomDash = (int) 5,
|
||||||
tomDashDot = 6,
|
tomDashDot = (int) 6,
|
||||||
tomDashDotDot = 7,
|
tomDashDotDot = (int) 7,
|
||||||
tomWave = 8,
|
tomWave = (int) 8,
|
||||||
tomThick = 9,
|
tomThick = (int) 9,
|
||||||
tomHair = 10,
|
tomHair = (int) 10,
|
||||||
tomLineSpaceSingle = 0,
|
tomLineSpaceSingle = (int) 0,
|
||||||
tomLineSpace1pt5 = 1,
|
tomLineSpace1pt5 = (int) 1,
|
||||||
tomLineSpaceDouble = 2,
|
tomLineSpaceDouble = (int) 2,
|
||||||
tomLineSpaceAtLeast = 3,
|
tomLineSpaceAtLeast = (int) 3,
|
||||||
tomLineSpaceExactly = 4,
|
tomLineSpaceExactly = (int) 4,
|
||||||
tomLineSpaceMultiple = 5,
|
tomLineSpaceMultiple = (int) 5,
|
||||||
tomAlignLeft = 0,
|
tomAlignLeft = (int) 0,
|
||||||
tomAlignCenter = 1,
|
tomAlignCenter = (int) 1,
|
||||||
tomAlignRight = 2,
|
tomAlignRight = (int) 2,
|
||||||
tomAlignJustify = 3,
|
tomAlignJustify = (int) 3,
|
||||||
tomAlignDecimal = 3,
|
tomAlignDecimal = (int) 3,
|
||||||
tomAlignBar = 4,
|
tomAlignBar = (int) 4,
|
||||||
tomAlignInterWord = 3,
|
tomAlignInterWord = (int) 3,
|
||||||
tomAlignInterLetter = 4,
|
tomAlignInterLetter = (int) 4,
|
||||||
tomAlignScaled = 5,
|
tomAlignScaled = (int) 5,
|
||||||
tomAlignGlyphs = 6,
|
tomAlignGlyphs = (int) 6,
|
||||||
tomAlignSnapGrid = 7,
|
tomAlignSnapGrid = (int) 7,
|
||||||
tomSpaces = 0,
|
tomSpaces = (int) 0,
|
||||||
tomDots = 1,
|
tomDots = (int) 1,
|
||||||
tomDashes = 2,
|
tomDashes = (int) 2,
|
||||||
tomLines = 3,
|
tomLines = (int) 3,
|
||||||
tomThickLines = 4,
|
tomThickLines = (int) 4,
|
||||||
tomEquals = 5,
|
tomEquals = (int) 5,
|
||||||
tomTabBack = -3,
|
tomTabBack = (int) -3,
|
||||||
tomTabNext = -2,
|
tomTabNext = (int) -2,
|
||||||
tomTabHere = -1,
|
tomTabHere = (int) -1,
|
||||||
tomListBullet = 1,
|
tomListBullet = (int) 1,
|
||||||
tomListNumberAsArabic = 2,
|
tomListNumberAsArabic = (int) 2,
|
||||||
tomListNumberAsLCLetter = 3,
|
tomListNumberAsLCLetter = (int) 3,
|
||||||
tomListNumberAsUCLetter = 4,
|
tomListNumberAsUCLetter = (int) 4,
|
||||||
tomListNumberAsLCRoman = 5,
|
tomListNumberAsLCRoman = (int) 5,
|
||||||
tomListNumberAsUCRoman = 6,
|
tomListNumberAsUCRoman = (int) 6,
|
||||||
tomListNumberAsSequence = 7,
|
tomListNumberAsSequence = (int) 7,
|
||||||
tomListParentheses = 0x10000,
|
tomListParentheses = (int) 0x10000,
|
||||||
tomListPeriod = 0x20000,
|
tomListPeriod = (int) 0x20000,
|
||||||
tomListPlain = 0x30000,
|
tomListPlain = (int) 0x30000,
|
||||||
tomCharacter = 1,
|
tomCharacter = (int) 1,
|
||||||
tomWord = 2,
|
tomWord = (int) 2,
|
||||||
tomSentence = 3,
|
tomSentence = (int) 3,
|
||||||
tomParagraph = 4,
|
tomParagraph = (int) 4,
|
||||||
tomLine = 5,
|
tomLine = (int) 5,
|
||||||
tomStory = 6,
|
tomStory = (int) 6,
|
||||||
tomScreen = 7,
|
tomScreen = (int) 7,
|
||||||
tomSection = 8,
|
tomSection = (int) 8,
|
||||||
tomColumn = 9,
|
tomColumn = (int) 9,
|
||||||
tomRow = 10,
|
tomRow = (int) 10,
|
||||||
tomWindow = 11,
|
tomWindow = (int) 11,
|
||||||
tomCell = 12,
|
tomCell = (int) 12,
|
||||||
tomCharFormat = 13,
|
tomCharFormat = (int) 13,
|
||||||
tomParaFormat = 14,
|
tomParaFormat = (int) 14,
|
||||||
tomTable = 15,
|
tomTable = (int) 15,
|
||||||
tomObject = 16,
|
tomObject = (int) 16,
|
||||||
tomMatchWord = 2,
|
tomMatchWord = (int) 2,
|
||||||
tomMatchCase = 4,
|
tomMatchCase = (int) 4,
|
||||||
tomMatchPattern = 8,
|
tomMatchPattern = (int) 8,
|
||||||
|
|
||||||
/* ITextRange story type values */
|
/* ITextRange story type values */
|
||||||
tomUnknownStory = 0,
|
tomUnknownStory = (int) 0,
|
||||||
tomMainTextStory = 1,
|
tomMainTextStory = (int) 1,
|
||||||
tomFootnotesStory = 2,
|
tomFootnotesStory = (int) 2,
|
||||||
tomEndnotesStory = 3,
|
tomEndnotesStory = (int) 3,
|
||||||
tomCommentsStory = 4,
|
tomCommentsStory = (int) 4,
|
||||||
tomTextFrameStory = 5,
|
tomTextFrameStory = (int) 5,
|
||||||
tomEvenPagesHeaderStory = 6,
|
tomEvenPagesHeaderStory = (int) 6,
|
||||||
tomPrimaryHeaderStory = 7,
|
tomPrimaryHeaderStory = (int) 7,
|
||||||
tomEvenPagesFooterStory = 8,
|
tomEvenPagesFooterStory = (int) 8,
|
||||||
tomPrimaryFooterStory = 9,
|
tomPrimaryFooterStory = (int) 9,
|
||||||
tomFirstPageHeaderStory = 10,
|
tomFirstPageHeaderStory = (int) 10,
|
||||||
tomFirstPageFooterStory = 11,
|
tomFirstPageFooterStory = (int) 11,
|
||||||
|
|
||||||
/* ITextFont animation property */
|
/* ITextFont animation property */
|
||||||
tomNoAnimation = 0,
|
tomNoAnimation = (int) 0,
|
||||||
tomLasVegasLights = 1,
|
tomLasVegasLights = (int) 1,
|
||||||
tomBlinkingBackground = 2,
|
tomBlinkingBackground = (int) 2,
|
||||||
tomSparkleText = 3,
|
tomSparkleText = (int) 3,
|
||||||
tomMarchingBlackAnts = 4,
|
tomMarchingBlackAnts = (int) 4,
|
||||||
tomMarchingRedAnts = 5,
|
tomMarchingRedAnts = (int) 5,
|
||||||
tomShimmer = 6,
|
tomShimmer = (int) 6,
|
||||||
tomWipeDown = 7,
|
tomWipeDown = (int) 7,
|
||||||
tomWipeRight = 8,
|
tomWipeRight = (int) 8,
|
||||||
tomAnimationMax = 8,
|
tomAnimationMax = (int) 8,
|
||||||
|
|
||||||
tomLowerCase = 0,
|
tomLowerCase = (int) 0,
|
||||||
tomUpperCase = 1,
|
tomUpperCase = (int) 1,
|
||||||
tomTitleCase = 2,
|
tomTitleCase = (int) 2,
|
||||||
tomSentenceCase = 4,
|
tomSentenceCase = (int) 4,
|
||||||
tomToggleCase = 5,
|
tomToggleCase = (int) 5,
|
||||||
tomReadOnly = 0x100,
|
tomReadOnly = (int) 0x100,
|
||||||
tomShareDenyRead = 0x200,
|
tomShareDenyRead = (int) 0x200,
|
||||||
tomShareDenyWrite = 0x400,
|
tomShareDenyWrite = (int) 0x400,
|
||||||
tomPasteFile = 0x1000,
|
tomPasteFile = (int) 0x1000,
|
||||||
tomCreateNew = 0x10,
|
tomCreateNew = (int) 0x10,
|
||||||
tomCreateAlways = 0x20,
|
tomCreateAlways = (int) 0x20,
|
||||||
tomOpenExisting = 0x30,
|
tomOpenExisting = (int) 0x30,
|
||||||
tomOpenAlways = 0x40,
|
tomOpenAlways = (int) 0x40,
|
||||||
tomTruncateExisting = 0x50,
|
tomTruncateExisting = (int) 0x50,
|
||||||
tomRTF = 0x1,
|
tomRTF = (int) 0x1,
|
||||||
tomText = 0x2,
|
tomText = (int) 0x2,
|
||||||
tomHTML = 0x3,
|
tomHTML = (int) 0x3,
|
||||||
tomWordDocument = 0x4,
|
tomWordDocument = (int) 0x4,
|
||||||
tomBold = 0x80000001,
|
tomBold = (int) 0x80000001,
|
||||||
tomItalic = 0x80000002,
|
tomItalic = (int) 0x80000002,
|
||||||
tomUnderline = 0x80000004,
|
tomUnderline = (int) 0x80000004,
|
||||||
tomStrikeout = 0x80000008,
|
tomStrikeout = (int) 0x80000008,
|
||||||
tomProtected = 0x80000010,
|
tomProtected = (int) 0x80000010,
|
||||||
tomLink = 0x80000020,
|
tomLink = (int) 0x80000020,
|
||||||
tomSmallCaps = 0x80000040,
|
tomSmallCaps = (int) 0x80000040,
|
||||||
tomAllCaps = 0x80000080,
|
tomAllCaps = (int) 0x80000080,
|
||||||
tomHidden = 0x80000100,
|
tomHidden = (int) 0x80000100,
|
||||||
tomOutline = 0x80000200,
|
tomOutline = (int) 0x80000200,
|
||||||
tomShadow = 0x80000400,
|
tomShadow = (int) 0x80000400,
|
||||||
tomEmboss = 0x80000800,
|
tomEmboss = (int) 0x80000800,
|
||||||
tomImprint = 0x80001000,
|
tomImprint = (int) 0x80001000,
|
||||||
tomDisabled = 0x80002000,
|
tomDisabled = (int) 0x80002000,
|
||||||
tomRevised = 0x80004000,
|
tomRevised = (int) 0x80004000,
|
||||||
tomNormalCaret = 0,
|
tomNormalCaret = (int) 0,
|
||||||
tomKoreanBlockCaret = 0x1,
|
tomKoreanBlockCaret = (int) 0x1,
|
||||||
tomIncludeInset = 0x1,
|
tomIncludeInset = (int) 0x1,
|
||||||
tomIgnoreCurrentFont = 0,
|
tomIgnoreCurrentFont = (int) 0,
|
||||||
tomMatchFontCharset = 0x1,
|
tomMatchFontCharset = (int) 0x1,
|
||||||
tomMatchFontSignature = 0x2,
|
tomMatchFontSignature = (int) 0x2,
|
||||||
tomCharset = 0x80000000,
|
tomCharset = (int) 0x80000000,
|
||||||
tomRE10Mode = 0x1,
|
tomRE10Mode = (int) 0x1,
|
||||||
tomNoIME = 0x80000,
|
tomNoIME = (int) 0x80000,
|
||||||
tomSelfIME = 0x40000
|
tomSelfIME = (int) 0x40000
|
||||||
} tomConstants;
|
} tomConstants;
|
||||||
|
|
||||||
interface ITextRange;
|
interface ITextRange;
|
||||||
|
|
|
@ -23,7 +23,7 @@ import "ocidl.idl";
|
||||||
|
|
||||||
[
|
[
|
||||||
uuid(1ff70682-0a51-30e8-076d-740be8cee98b),
|
uuid(1ff70682-0a51-30e8-076d-740be8cee98b),
|
||||||
implicit_handle(handle_t rpc_handle),
|
implicit_handle(handle_t atsvc_handle),
|
||||||
version(1.0),
|
version(1.0),
|
||||||
pointer_default(unique)
|
pointer_default(unique)
|
||||||
]
|
]
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue