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
|
||||
is now available.
|
||||
The Wine maintenance release 5.0.1 is now available.
|
||||
|
||||
This release represents a year of development effort and over 7,400
|
||||
individual changes. It contains a large number of improvements that
|
||||
are listed in the release notes below. The main highlights are:
|
||||
|
||||
- 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.
|
||||
What's new in this release (see below for details):
|
||||
- Fix compilation with gcc 10
|
||||
- Add some timezones
|
||||
- Various bug fixes
|
||||
|
||||
The source is available from the following locations:
|
||||
|
||||
https://dl.winehq.org/wine/source/5.0/wine-5.0.tar.xz
|
||||
http://mirrors.ibiblio.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.1.tar.xz
|
||||
|
||||
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
|
||||
======================
|
||||
|
||||
|
||||
*** PE modules
|
||||
|
||||
- Most modules are built in PE format (Portable Executable, the
|
||||
Windows binary format) instead of ELF when the MinGW compiler is
|
||||
available. This helps various copy protection schemes that check
|
||||
that the on-disk and in-memory contents of system modules are
|
||||
identical.
|
||||
|
||||
- The actual PE binaries are copied into the Wine prefix instead of
|
||||
the fake DLL files. This makes the prefix look more like a real
|
||||
Windows installation, at the cost of some extra disk space.
|
||||
|
||||
- Modules that have been converted to PE can use standard wide-char C
|
||||
functions, as well as wide-char character constants like L"abc".
|
||||
This makes the code easier to read.
|
||||
|
||||
- Not all modules have been converted to PE yet; this is an ongoing
|
||||
process that will continue during the Wine 5.x development series.
|
||||
|
||||
- The Wine C runtime is updated to support linking to MinGW-compiled
|
||||
binaries; it is used by default instead of the MinGW runtime when
|
||||
building DLLs.
|
||||
|
||||
|
||||
*** Graphics
|
||||
|
||||
- Multiple display adapters and monitors are properly supported,
|
||||
including dynamic configuration changes.
|
||||
|
||||
- The Vulkan driver supports up to version 1.1.126 of the Vulkan spec.
|
||||
|
||||
- The WindowsCodecs library is able to convert more bitmap formats,
|
||||
including palette-indexed formats.
|
||||
|
||||
|
||||
*** Direct3D
|
||||
|
||||
- Fullscreen Direct3D applications inhibit the screensaver.
|
||||
|
||||
- DXGI swapchain presents inform the application when the
|
||||
corresponding window is minimized. This typically allows
|
||||
applications to reduce CPU usage while minimized, and is in some
|
||||
cases required to allow the application window to be restored again.
|
||||
|
||||
- Switching between fullscreen and windowed modes using the standard
|
||||
Alt+Enter combination is implemented for DXGI applications.
|
||||
|
||||
- The following features are implemented for Direct3D 12 applications:
|
||||
- Switching between fullscreen and windowed.
|
||||
- Changing display modes.
|
||||
- Scaled presents.
|
||||
- Swap intervals.
|
||||
These features were previously already implemented for earlier
|
||||
versions of the Direct3D API.
|
||||
|
||||
- The handling of various edge cases is improved. Among others:
|
||||
- Out of range reference values for the alpha and stencil tests.
|
||||
- Sampling 2D resources with 3D samplers and vice versa.
|
||||
- Drawing with mapped textures and buffers.
|
||||
- Usage of invalid DirectDraw clipper objects.
|
||||
- Creating Direct3D devices on invalid Windows, like the desktop
|
||||
window.
|
||||
- Viewports with a minimum Z larger than or equal to the maximum Z.
|
||||
- Resources bound through both shader-resource views and
|
||||
render-target or depth-stencil views at the same time.
|
||||
- Blits between formats with and without alpha components.
|
||||
Since well-behaved applications don't rely on these edge cases, they
|
||||
typically only affect one or two applications each. There are
|
||||
nevertheless quite a number of them.
|
||||
|
||||
- Dirty texture regions are tracked more accurately for Direct3D 8 and 9
|
||||
texture uploads.
|
||||
|
||||
- Uploads of S3TC-compressed 3D textures require less address space.
|
||||
Since 3D textures can be potentially large, and address space
|
||||
exhaustion is a concern for 32-bit applications, S3TC-compressed 3D
|
||||
textures are uploaded per-slice, instead of in a single upload.
|
||||
|
||||
- The ID3D11Multithread interface is implemented.
|
||||
|
||||
- Various lighting calculation fixes and improvements for older
|
||||
DirectDraw applications have been made.
|
||||
|
||||
- Limited support for blits across swapchains is implemented.
|
||||
|
||||
- More shader reflection APIs are implemented.
|
||||
|
||||
- The wined3d CPU blitter can handle compressed source resources.
|
||||
Support for compressed destination resources was already implemented
|
||||
in a previous release.
|
||||
|
||||
- The Direct3D graphics card database recognizes more graphics cards.
|
||||
|
||||
- New HKEY_CURRENT_USER\Software\Wine\Direct3D registry keys:
|
||||
- "shader_backend" (REG_SZ)
|
||||
The shader backend to use. Possible values are "glsl" (default)
|
||||
for GLSL, "arb" for ARB vertex/fragment programs and "none" to
|
||||
disable shader support.
|
||||
- "strict_shader_math" (REG_DWORD)
|
||||
Enable (0x1) or disable (0x0, default) stricter translation of
|
||||
Direct3D shaders, potentially at a performance cost. This
|
||||
currently only makes a difference with the default GLSL shader
|
||||
backend in combination with the proprietary NVIDIA drivers.
|
||||
|
||||
- Deprecated HKEY_CURRENT_USER\Software\Wine\Direct3D registry key:
|
||||
- "UseGLSL"
|
||||
This has been superseded by the "shader_backend" setting above.
|
||||
|
||||
|
||||
*** D3DX
|
||||
|
||||
- Support for compressing textures using S3TC-compression is
|
||||
implemented.
|
||||
|
||||
- Various operations, like e.g. texture fills, on unmappable surfaces
|
||||
are implemented more correctly. Previously their implementation
|
||||
relied on the underlying Direct3D implementation not enforcing
|
||||
mapping restrictions.
|
||||
|
||||
- Various improvements and fixes have been made to the effect
|
||||
framework.
|
||||
|
||||
|
||||
*** Kernel
|
||||
|
||||
- Most of the functions that used to be in Kernel32 are moved to
|
||||
KernelBase, to follow the architecture of recent Windows versions.
|
||||
|
||||
- Libraries of the wrong 32/64-bitness are ignored when found in the
|
||||
search path, to enable loading the correct one if it's found further
|
||||
in the path.
|
||||
|
||||
- Kernel objects are better emulated for device drivers that expect to
|
||||
manipulate objects from the kernel side.
|
||||
|
||||
- The kernel-level synchronization objects like spin locks, fast
|
||||
mutexes, remove locks, and resource variables are implemented.
|
||||
|
||||
- The system battery state is properly reported to applications.
|
||||
|
||||
|
||||
*** User interface
|
||||
|
||||
- Minimized windows are displayed using their title bar instead of the
|
||||
old Windows 3.1-style icons.
|
||||
|
||||
- The new button styles Split Buttons and Command Links are
|
||||
implemented.
|
||||
|
||||
- The Edit control sets margins correctly also for CJK fonts.
|
||||
|
||||
|
||||
*** Desktop integration
|
||||
|
||||
- Symbolic links to the corresponding Unix directories are created for
|
||||
the 'Downloads' and 'Templates' folders.
|
||||
|
||||
|
||||
*** Input devices
|
||||
|
||||
- Plug & Play device drivers can be installed and loaded on startup.
|
||||
|
||||
- Game controllers are better supported, including proper support for
|
||||
hat switch, wheel, gas and brake controls.
|
||||
|
||||
- The old joystick API of Linux versions earlier than 2.2 is no longer
|
||||
supported.
|
||||
|
||||
|
||||
*** .NET
|
||||
|
||||
- The Mono engine is updated to version 4.9.4, including parts of the
|
||||
Windows Presentation Foundation (WPF) framework.
|
||||
|
||||
- The Gecko and Mono add-ons support shared installation, where the
|
||||
files are used directly from a global location under /usr/share/wine
|
||||
instead of being copied into every new prefix.
|
||||
|
||||
|
||||
*** Internet and networking
|
||||
|
||||
- The Gecko engine is refreshed to support recent toolchains.
|
||||
|
||||
- A number of new HTML APIs are implemented.
|
||||
|
||||
- MSHTML supports some SVG elements.
|
||||
|
||||
- Error object and exception propagation are supported in VBScript.
|
||||
|
||||
- A number of VBScript builtin functions are implemented.
|
||||
|
||||
- JScript EcmaScript compliant mode is extended to support more
|
||||
features.
|
||||
|
||||
- JScript and VBScript script objects expose type info interfaces.
|
||||
|
||||
- The HTTP proxy configuration can be retrieved through DHCP.
|
||||
|
||||
- Passport HTTP redirects are supported.
|
||||
|
||||
- The HTTP service and corresponding client-side library (HTTPAPI) are
|
||||
partially implemented.
|
||||
|
||||
|
||||
*** Cryptography
|
||||
|
||||
- ECC (elliptic-curve) keys are supported when using GnuTLS.
|
||||
|
||||
- Importing keys and certificates from PFX blobs is implemented.
|
||||
|
||||
- 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.
|
||||
|
||||
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)
|
||||
42585 Final Fantasy V Corrupt Fonts
|
||||
45049 Multiple programs need d2d1 CreateRoundedRectangleGeometry (playchessV7, Paint.Net 4.*)
|
||||
45481 Spintires: MudRunner crashes at launch
|
||||
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)
|
||||
46735 Multiple applications need Direct3DShaderValidatorCreate9() implementation (The Sims 2 demo, Armed Assault)
|
||||
47288 Gaea 1.0.19 (.NET 4.7 WPF app) diagnostic tool 'Watson.exe' crashes due to 'kernel32.SetConsoleScreenBufferInfoEx' stub
|
||||
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
|
||||
48338 DIB images with bpp <= 8 get wrong palette when converted to GpBitmap
|
||||
48371 Home Designer Suite 21.3.1.1x64 reports "Error #272000009 A serious error occurred (SEH)."
|
||||
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)
|
||||
48480 dlls/krnl386.exe16 - thunk.c argument logic incorrect for CallProcEx32W16
|
||||
48484 winecfg doesn't allow disabling Desktop Integration for Downloads
|
||||
48491 _searchenv & co do not understand quoted directories
|
||||
48510 Lotus Organizer 97 crashes when selecting a Backup folder using 'Browse' button
|
||||
48549 Arma Cold War Assault: Cursor stuck at low fps since Wine 5.0-rc6
|
||||
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
|
||||
48569 Infinite drag & drop loop crashes WinSCP
|
||||
48571 Firefox 72.0.* crashes on every tab (unless dwrite is disabled)
|
||||
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)
|
||||
48635 Asuka 120% Return BURNING Fest: Crashes after character selection.
|
||||
48639 Shrew Soft VPN client needs setupapi.dll.SetupDiGetSelectedDriverA()
|
||||
48646 QQMusicAgent crashes when started after installation
|
||||
48648 Gothic II Night of the Raven:unhandled exception in Wine 5.2
|
||||
48664 kernel32:process - Intermittent test_Toolhelp() failure
|
||||
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
|
||||
48706 Wineconsole freezes when restoring from minimized to maximized window
|
||||
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
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
Changes since 5.0:
|
||||
|
||||
Aaro Altonen (3):
|
||||
kernel32/tests: Add tests for SetConsoleScreenBufferInfoEx().
|
||||
kernelbase: Implement SetConsoleScreenBufferInfoEx().
|
||||
urlmon: Add URLOpenPullStreamW() stub.
|
||||
|
||||
Akihiro Sagawa (3):
|
||||
dsound/tests: Add a test whether the buffer is a valid global memory.
|
||||
dsound: Make GlobalHandle() for the sound buffer failed.
|
||||
po: Update Japanese translation.
|
||||
|
||||
Alexandre Julliard (2):
|
||||
rundll32: Add wrapper to call entry point on i386.
|
||||
ver: Use the 16-bit resource function in GetFileVersionInfo16().
|
||||
|
||||
Alistair Leslie-Hughes (3):
|
||||
d3dx9: Implement D3DXCreateKeyframedAnimationSet.
|
||||
dmstyle: IDirectMusicStyle8 GetDefaultBand return S_FALSE.
|
||||
qwave: Add QOSAddSocketToFlow stub.
|
||||
|
||||
Aurimas Fišeras (3):
|
||||
po: Update Lithuanian translation.
|
||||
po: Update Lithuanian translation.
|
||||
po: Update Lithuanian translation.
|
||||
|
||||
Brendan Shanks (4):
|
||||
include: Fix size of DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY enum.
|
||||
include: Fix size of tomConstants enum.
|
||||
include: Fix size of RecordCreateOptionsEnum.
|
||||
wined3d: Add GPU information for NVIDIA GeForce GTX 1060 3GB.
|
||||
|
||||
Charles Davis (1):
|
||||
msvcrt: Correct return value of ___mb_cur_max_l_func().
|
||||
|
||||
Damjan Jovanovic (1):
|
||||
gdiplus: In CompositingModeSourceCopy, fully transparent pixels are drawn black.
|
||||
|
||||
Daniel Lehman (5):
|
||||
tzres: Add Haiti Time Zone.
|
||||
tzres: Add Aleutian Time Zone.
|
||||
loader: Add Chatham Islands Standard Time Zone.
|
||||
loader: Add Bougainville Standard Time Zone.
|
||||
loader: Add Marquesas Standard Time Zone.
|
||||
|
||||
Dirk Niggemann (1):
|
||||
krnl386.exe: Make CallProcEx32W16 clear CPEX_DEST_CDECL flag before looping over arguments.
|
||||
|
||||
Dmitry Timoshkov (4):
|
||||
schedsvc/tests: Fix compilation with recent gcc/clang versions.
|
||||
gdiplus: Reimplement GdipCreateBitmapFromGdiDib by using GdipCreateBitmapFromHBITMAP.
|
||||
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.
|
||||
|
||||
François Gouget (1):
|
||||
kernel32/tests: Fix test_Toolhelp()'s nested process lookup.
|
||||
|
||||
Gerald Pfeifer (2):
|
||||
winedump: Add a default case to numeric_leaf().
|
||||
msi: Properly declare variables in msi/tests/utils.h as extern.
|
||||
|
||||
Gijs Vermeulen (1):
|
||||
kernelbase: Set req->mask in SetConsoleScreenBufferInfoEx.
|
||||
|
||||
Giovanni Mascellani (1):
|
||||
d2d1: Implement rounded rectangle drawing.
|
||||
|
||||
Hans Leidekker (1):
|
||||
wbemprox: Implement Win32_DesktopMonitor.Name.
|
||||
|
||||
Henri Verbeet (1):
|
||||
wined3d: Properly validate the stage index in wined3d_stateblock_set_texture_stage_state() (Coverity).
|
||||
|
||||
Jacek Caban (1):
|
||||
rpcrt4: Use MustFree for all non-base types in get_param_pointer_info.
|
||||
|
||||
Jefferson Carpenter (1):
|
||||
services: Initialize OVERLAPPED Offset and OffsetHigh.
|
||||
|
||||
Kevin Puetz (1):
|
||||
rpcrt4: Fix ITypeInfo leak in get_iface_info.
|
||||
|
||||
Lauri Kenttä (2):
|
||||
po: Update Finnish translation.
|
||||
po: Update Finnish translation.
|
||||
|
||||
Lukáš Horáček (1):
|
||||
wined3d: Add GTX 1660 SUPER as a card.
|
||||
|
||||
Matteo Bruni (1):
|
||||
maintainers: Drop Józef Kucia.
|
||||
|
||||
Michael Cronenworth (12):
|
||||
crypt32: Global variable compatibility update for gcc 10.
|
||||
dsound: Global variable compatibility update for gcc 10.
|
||||
mshtml: Global variable compatibility update for gcc 10.
|
||||
secur32: Global variable compatibility update for gcc 10.
|
||||
winebus: Global variable compatibility update for gcc 10.
|
||||
wbemprox: Global variable compatibility update for gcc 10.
|
||||
xinput: Global variable compatibility update for gcc 10.
|
||||
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.
|
||||
gphoto2.ds: Global variable compatibility update for gcc 10.
|
||||
sane.ds: Global variable compatibility update for gcc 10.
|
||||
|
||||
Michael Müller (1):
|
||||
setupapi: Implement SP_COPY_IN_USE_NEEDS_REBOOT.
|
||||
|
||||
Michael Stefaniuc (1):
|
||||
tools: Get the ANNOUNCE bug list from the stable-notes git notes.
|
||||
|
||||
Mingcong Bai (1):
|
||||
po: Update Simplified Chinese translation.
|
||||
|
||||
Nikolay Sivov (5):
|
||||
ucrtbase: Add _query_new_handler() and _query_new_mode().
|
||||
dwrite: Add partial implementation for IDWriteFontFaceReference1::CreateFontFace().
|
||||
user32: Improve window state handling in SetScrollInfo().
|
||||
ole32: Fix a leak when creating pointer moniker through activation.
|
||||
ole32: Fix a leak when creating antimoniker through activation.
|
||||
|
||||
Olivier F. R. Dierick (1):
|
||||
winecfg: Add Downloads and Templates to shell folders UI interface.
|
||||
|
||||
Paul Gofman (6):
|
||||
ntdll: Fill NumberOfPhysicalPages field in user shared data area.
|
||||
ntdll: Report rdtsc processor feature if 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.
|
||||
wined3d: Support sRGB reads for WINED3DFMT_B5G6R5_UNORM.
|
||||
|
||||
Piotr Caban (11):
|
||||
msvcrt: Add support for quoted paths in _searchenv.
|
||||
msvcrt: Add support for quoted paths in _searchenv_s.
|
||||
msvcrt: Don't duplicate _searchenv_s code in _searchenv.
|
||||
msvcrt: Add support for quoted paths in _wsearchenv_s.
|
||||
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.
|
||||
msvcr90/tests: Fix swscanf tests compilation on arm.
|
||||
winemac: Fix leaks in macdrv_surface_destroy.
|
||||
gdiplus: Fix gdi handles leak in GdipMeasureCharacterRanges.
|
||||
gdiplus: Fix leak in SOFTWARE_GdipDrawDriverString.
|
||||
|
||||
Roman Pišl (3):
|
||||
shell32: Avoid crash on WM_WINDOWPOSCHANGING in BrsFolderDlgProc.
|
||||
ole32: Avoid calling QueryContinueDrag recursively.
|
||||
wineconsole: Allow maximization.
|
||||
|
||||
Rémi Bernon (1):
|
||||
dinput: Increase device buffer size to 1024.
|
||||
|
||||
Sven Baars (1):
|
||||
wined3d: Avoid accessing freed memory in wined3d_view_gl_destroy() (Valgrind).
|
||||
|
||||
Vijay Kiran Kamuju (3):
|
||||
include: Add missing defines to icm.h.
|
||||
mscms: Add stub for WcsGetDefaultColorProfileSize.
|
||||
mscms: Add stub for WcsGetDefaultRenderingIntent.
|
||||
|
||||
Zebediah Figura (5):
|
||||
widl: Output a registry script for all interfaces written into the typelib.
|
||||
kernelbase: Implement ReOpenFile().
|
||||
d3d9: Return a stub interface from Direct3DShaderValidatorCreate9().
|
||||
setupapi: Implement SetupDiGetSelectedDriver().
|
||||
ddraw: Avoid leaking the primary stateblock.
|
||||
|
||||
Zhiyi Zhang (1):
|
||||
wined3d: Add GPU information for NVIDIA GeForce GTX 1650 SUPER.
|
||||
|
||||
--
|
||||
Alexandre Julliard
|
||||
julliard@winehq.org
|
||||
Michael Stefaniuc
|
||||
mstefani@winehq.org
|
||||
|
|
3
AUTHORS
3
AUTHORS
|
@ -1,5 +1,6 @@
|
|||
Wine is available thanks to the work of:
|
||||
|
||||
Aaro Altonen
|
||||
Aaron Arvey
|
||||
Aaron Barnes
|
||||
Aaron Brazener
|
||||
|
@ -399,6 +400,7 @@ Diego Nieto Cid
|
|||
Diego Pettenò
|
||||
Dietmar Kling
|
||||
Dimitrie O. Paun
|
||||
Dirk Niggemann
|
||||
Dirk Thierbach
|
||||
Divan Burger
|
||||
Dmitrij Sinukov
|
||||
|
@ -980,6 +982,7 @@ Luis Javier Merino
|
|||
Luis Sahagun
|
||||
Luiz Otavio L. Zorzella
|
||||
Lu Jiashu
|
||||
Lukáš Horáček
|
||||
Lukáš Krejčí
|
||||
Łukasz Wojniłowicz
|
||||
Luke Benstead
|
||||
|
|
|
@ -64,7 +64,6 @@ F: dlls/d2d*/
|
|||
Direct3D
|
||||
M: Henri Verbeet <hverbeet@codeweavers.com>
|
||||
P: Stefan Dösinger <stefan@codeweavers.com>
|
||||
P: Józef Kucia <jkucia@codeweavers.com>
|
||||
P: Matteo Bruni <mbruni@codeweavers.com>
|
||||
F: dlls/d3d10*/
|
||||
F: dlls/d3d11/
|
||||
|
@ -80,7 +79,6 @@ Direct3D helper libraries
|
|||
M: Matteo Bruni <mbruni@codeweavers.com>
|
||||
P: Henri Verbeet <hverbeet@codeweavers.com>
|
||||
P: Stefan Dösinger <stefan@codeweavers.com>
|
||||
P: Józef Kucia <jkucia@codeweavers.com>
|
||||
F: dlls/d3dcompiler*/
|
||||
F: dlls/d3dx10*/
|
||||
F: dlls/d3dx11*/
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# 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>.
|
||||
#
|
||||
|
@ -580,8 +580,8 @@ MAKEFLAGS=
|
|||
# Identity of this package.
|
||||
PACKAGE_NAME='Wine'
|
||||
PACKAGE_TARNAME='wine'
|
||||
PACKAGE_VERSION='5.0'
|
||||
PACKAGE_STRING='Wine 5.0'
|
||||
PACKAGE_VERSION='5.0.1'
|
||||
PACKAGE_STRING='Wine 5.0.1'
|
||||
PACKAGE_BUGREPORT='wine-devel@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.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
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]...
|
||||
|
||||
|
@ -2515,7 +2515,7 @@ fi
|
|||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of Wine 5.0:";;
|
||||
short | recursive ) echo "Configuration of Wine 5.0.1:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
|
@ -2764,7 +2764,7 @@ fi
|
|||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
Wine configure 5.0
|
||||
Wine configure 5.0.1
|
||||
generated by GNU Autoconf 2.69
|
||||
|
||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
|
@ -3448,7 +3448,7 @@ cat >config.log <<_ACEOF
|
|||
This file contains any messages produced by compilers while
|
||||
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
|
||||
|
||||
$ $0 $@
|
||||
|
@ -21783,7 +21783,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
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
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
|
@ -21854,7 +21854,7 @@ _ACEOF
|
|||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||
ac_cs_version="\\
|
||||
Wine config.status 5.0
|
||||
Wine config.status 5.0.1
|
||||
configured by $0, generated by GNU Autoconf 2.69,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
@ cdecl _heapwalk(ptr) ucrtbase._heapwalk
|
||||
@ cdecl _malloc_base(long) ucrtbase._malloc_base
|
||||
@ cdecl _msize(ptr) ucrtbase._msize
|
||||
@ stub _query_new_handler
|
||||
@ stub _query_new_mode
|
||||
@ cdecl _query_new_handler() ucrtbase._query_new_handler
|
||||
@ cdecl _query_new_mode() ucrtbase._query_new_mode
|
||||
@ cdecl _realloc_base(ptr long) ucrtbase._realloc_base
|
||||
@ cdecl _recalloc(ptr long long) ucrtbase._recalloc
|
||||
@ 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);
|
||||
|
||||
HINSTANCE hInstance DECLSPEC_HIDDEN;
|
||||
extern HINSTANCE hInstance DECLSPEC_HIDDEN;
|
||||
|
||||
void crypt_oid_init(void) DECLSPEC_HIDDEN;
|
||||
void crypt_oid_free(void) DECLSPEC_HIDDEN;
|
||||
|
|
|
@ -440,6 +440,7 @@ struct d2d_geometry
|
|||
size_t face_count;
|
||||
|
||||
struct d2d_bezier_vertex *bezier_vertices;
|
||||
size_t bezier_vertices_size;
|
||||
size_t bezier_vertex_count;
|
||||
} fill;
|
||||
|
||||
|
@ -483,6 +484,10 @@ struct d2d_geometry
|
|||
D2D1_RECT_F rect;
|
||||
} rectangle;
|
||||
struct
|
||||
{
|
||||
D2D1_ROUNDED_RECT rounded_rect;
|
||||
} rounded_rectangle;
|
||||
struct
|
||||
{
|
||||
ID2D1Geometry *src_geometry;
|
||||
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;
|
||||
HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry,
|
||||
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,
|
||||
ID2D1Geometry *src_geometry, const D2D_MATRIX_3X2_F *transform) DECLSPEC_HIDDEN;
|
||||
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)
|
||||
{
|
||||
if (!rect) return "(null)";
|
||||
return wine_dbg_sprintf("(%.8e,%.8e)-(%.8e,%.8e)", rect->left, rect->top, rect->right, rect->bottom );
|
||||
if (!rect)
|
||||
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 */
|
||||
|
|
|
@ -152,11 +152,27 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_CreateRectangleGeometry(ID2D1Factor
|
|||
}
|
||||
|
||||
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,
|
||||
|
|
|
@ -2257,6 +2257,14 @@ static BOOL d2d_geometry_outline_add_bezier_segment(struct d2d_geometry *geometr
|
|||
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,
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
heap_free(geometry->outline.bezier_faces);
|
||||
|
@ -3831,6 +3859,302 @@ fail:
|
|||
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)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, struct d2d_geometry, ID2D1Geometry_iface);
|
||||
|
@ -4376,6 +4700,7 @@ struct d2d_geometry *unsafe_impl_from_ID2D1Geometry(ID2D1Geometry *iface)
|
|||
return NULL;
|
||||
assert(iface->lpVtbl == (const ID2D1GeometryVtbl *)&d2d_path_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_geometry_group_vtbl);
|
||||
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);
|
||||
hr = ID2D1Factory_CreateRoundedRectangleGeometry(factory, &rect, &geometry);
|
||||
todo_wine
|
||||
ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
ID2D1Factory_Release(factory);
|
||||
return;
|
||||
}
|
||||
|
||||
ID2D1RoundedRectangleGeometry_GetRoundedRect(geometry, &rect2);
|
||||
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;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
* Direct3DShaderValidatorCreate9 (D3D9.@)
|
||||
/* The callback is called on any error encountered during validation, including
|
||||
* 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.
|
||||
* SDK only says it is internal and shouldn't be used.
|
||||
*/
|
||||
void* WINAPI Direct3DShaderValidatorCreate9(void)
|
||||
{
|
||||
static int once;
|
||||
* Improper calls to IDirect3DShaderValidator9 methods, or other errors not
|
||||
* generated by specific Instruction() calls, yield NULL as the file, and
|
||||
* either 0 or -1 as the line.
|
||||
*
|
||||
* The callback return type is not known, but programs (fxc.exe, The Sims 2)
|
||||
* 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");
|
||||
return NULL;
|
||||
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;
|
||||
};
|
||||
|
||||
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 void *(WINAPI *Direct3DShaderValidatorCreate9)(void);
|
||||
|
||||
static const DWORD simple_vs[] =
|
||||
{
|
||||
0xfffe0101, /* vs_1_1 */
|
||||
|
@ -13405,8 +13407,69 @@ static void test_get_display_mode(void)
|
|||
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)
|
||||
{
|
||||
HMODULE d3d9_handle = GetModuleHandleA("d3d9.dll");
|
||||
WNDCLASSA wc = {0};
|
||||
IDirect3D9 *d3d9;
|
||||
DEVMODEW current_mode;
|
||||
|
@ -13434,6 +13497,8 @@ START_TEST(device)
|
|||
wc.lpszClassName = "d3d9_test_wc";
|
||||
RegisterClassA(&wc);
|
||||
|
||||
Direct3DShaderValidatorCreate9 = (void *)GetProcAddress(d3d9_handle, "Direct3DShaderValidatorCreate9");
|
||||
|
||||
test_get_set_vertex_declaration();
|
||||
test_get_declaration();
|
||||
test_fvf_decl_conversion();
|
||||
|
@ -13532,6 +13597,7 @@ START_TEST(device)
|
|||
test_multiply_transform();
|
||||
test_vertex_buffer_read_write();
|
||||
test_get_display_mode();
|
||||
test_shader_validator();
|
||||
|
||||
UnregisterClassA("d3d9_test_wc", GetModuleHandleA(NULL));
|
||||
}
|
||||
|
|
|
@ -468,14 +468,427 @@ HRESULT WINAPI D3DXCreateAnimationController(UINT max_outputs, UINT max_sets,
|
|||
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,
|
||||
D3DXPLAYBACK_TYPE playback_type, UINT animation_count, UINT callback_key_count,
|
||||
const D3DXKEY_CALLBACK *callback_keys, ID3DXKeyframedAnimationSet **animation_set)
|
||||
{
|
||||
FIXME("name %s, ticks_per_second %.16e, playback_type %u, animation_count %u, "
|
||||
"callback_key_count %u, callback_keys %p, animation_set %p stub.\n",
|
||||
struct d3dx9_keyframed_animation_set *object;
|
||||
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,
|
||||
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);
|
||||
}
|
||||
|
||||
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 char n1[] = "name1";
|
||||
|
@ -11387,6 +11413,7 @@ START_TEST(mesh)
|
|||
D3DXCreateTextTest();
|
||||
D3DXCreateTorusTest();
|
||||
D3DXCreateAnimationControllerTest();
|
||||
D3DXCreateKeyframedAnimationSetTest();
|
||||
test_get_decl_length();
|
||||
test_get_decl_vertex_size();
|
||||
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_stateblock_decref(This->state);
|
||||
if (This->recording)
|
||||
wined3d_stateblock_decref(This->recording);
|
||||
|
||||
|
|
|
@ -1398,7 +1398,7 @@ HRESULT WINAPI IDirectInputDevice2WImpl_SetProperty(
|
|||
EnterCriticalSection(&This->crit);
|
||||
|
||||
This->buffersize = pd->dwData;
|
||||
This->queue_len = min(This->buffersize, 20);
|
||||
This->queue_len = min(This->buffersize, 1024);
|
||||
HeapFree(GetProcessHeap(), 0, This->data_queue);
|
||||
|
||||
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,
|
||||
IDirectMusicBand **ppBand)
|
||||
IDirectMusicBand **band)
|
||||
{
|
||||
IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface);
|
||||
FIXME("(%p, %p): stub\n", This, ppBand);
|
||||
return S_OK;
|
||||
IDirectMusicStyle8Impl *This = impl_from_IDirectMusicStyle8(iface);
|
||||
FIXME("(%p, %p): stub\n", This, band);
|
||||
|
||||
if (!band)
|
||||
return E_POINTER;
|
||||
|
||||
*band = NULL;
|
||||
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
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;
|
||||
HRESULT err = DS_OK;
|
||||
DWORD capf = 0;
|
||||
size_t bufsize;
|
||||
|
||||
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);
|
||||
|
||||
/* 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) {
|
||||
IDirectSoundBuffer8_Release(&dsb->IDirectSoundBuffer8_iface);
|
||||
return DSERR_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
/* Allocate system memory for buffer */
|
||||
dsb->buffer->memory = HeapAlloc(GetProcessHeap(),0,dsb->buflen);
|
||||
if (!dsb->buffer->memory) {
|
||||
WARN("out of memory\n");
|
||||
IDirectSoundBuffer8_Release(&dsb->IDirectSoundBuffer8_iface);
|
||||
return DSERR_OUTOFMEMORY;
|
||||
}
|
||||
dsb->buffer->memory = (BYTE *)dsb->buffer + bufsize;
|
||||
|
||||
dsb->buffer->ref = 1;
|
||||
dsb->buffer->lockedbytes = 0;
|
||||
|
@ -1152,10 +1149,8 @@ void secondarybuffer_destroy(IDirectSoundBufferImpl *This)
|
|||
|
||||
This->buffer->ref--;
|
||||
list_remove(&This->entry);
|
||||
if (This->buffer->ref == 0) {
|
||||
HeapFree(GetProcessHeap(), 0, This->buffer->memory);
|
||||
if (This->buffer->ref == 0)
|
||||
HeapFree(GetProcessHeap(), 0, This->buffer);
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, This->notifies);
|
||||
HeapFree(GetProcessHeap(), 0, This->pwfx);
|
||||
|
|
|
@ -188,9 +188,9 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
|
|||
IDirectSoundBufferImpl **ppdsb,
|
||||
IDirectSoundBufferImpl *pdsb) DECLSPEC_HIDDEN;
|
||||
void secondarybuffer_destroy(IDirectSoundBufferImpl *This) DECLSPEC_HIDDEN;
|
||||
const IDirectSound3DListenerVtbl ds3dlvt DECLSPEC_HIDDEN;
|
||||
const IDirectSound3DBufferVtbl ds3dbvt DECLSPEC_HIDDEN;
|
||||
const IKsPropertySetVtbl iksbvt DECLSPEC_HIDDEN;
|
||||
extern const IDirectSound3DListenerVtbl ds3dlvt DECLSPEC_HIDDEN;
|
||||
extern const IDirectSound3DBufferVtbl ds3dbvt DECLSPEC_HIDDEN;
|
||||
extern const IKsPropertySetVtbl iksbvt 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,
|
||||
"IDirectSoundBuffer_Lock failed to lock the buffer %08x\n",rc);
|
||||
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);
|
||||
rc=IDirectSoundBuffer_Unlock(original,buf,bufsize,
|
||||
NULL,0);
|
||||
|
|
|
@ -6263,9 +6263,21 @@ static HRESULT WINAPI fontfacereference_EnqueueFileFragmentDownloadRequest(IDWri
|
|||
|
||||
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)
|
||||
|
|
|
@ -9537,6 +9537,10 @@ static void test_font_resource(void)
|
|||
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");
|
||||
|
||||
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);
|
||||
|
||||
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];
|
||||
|
||||
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
|
||||
{
|
||||
if (!(src_color & 0xff000000))
|
||||
|
@ -5359,7 +5364,13 @@ GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics,
|
|||
{
|
||||
stat = GdipSetEmpty(regions[i]);
|
||||
if (stat != Ok)
|
||||
{
|
||||
SelectObject(hdc, oldfont);
|
||||
DeleteObject(gdifont);
|
||||
if (temp_hdc)
|
||||
DeleteDC(temp_hdc);
|
||||
return stat;
|
||||
}
|
||||
}
|
||||
|
||||
args.regions = regions;
|
||||
|
@ -7204,8 +7215,13 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI
|
|||
}
|
||||
|
||||
if (max_glyphsize == 0)
|
||||
{
|
||||
/* Nothing to draw. */
|
||||
heap_free(pti);
|
||||
DeleteDC(hdc);
|
||||
DeleteObject(hfont);
|
||||
return Ok;
|
||||
}
|
||||
|
||||
glyph_mask = heap_alloc_zero(max_glyphsize);
|
||||
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)
|
||||
{
|
||||
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)
|
||||
return InvalidParameter;
|
||||
|
||||
hbm = CreateDIBSection(0, info, DIB_RGB_COLORS, &bmbits, NULL, 0);
|
||||
if (!hbm)
|
||||
return InvalidParameter;
|
||||
|
||||
height = abs(info->bmiHeader.biHeight);
|
||||
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 */
|
||||
{
|
||||
bits = (BYTE*)bits + (height - 1) * stride;
|
||||
stride = -stride;
|
||||
}
|
||||
memcpy(bmbits, bits, height * stride);
|
||||
|
||||
switch(info->bmiHeader.biBitCount) {
|
||||
case 1:
|
||||
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);
|
||||
status = GdipCreateBitmapFromHBITMAP(hbm, NULL, bitmap);
|
||||
DeleteObject(hbm);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/* FIXME: no icm */
|
||||
|
|
|
@ -4208,7 +4208,7 @@ static void test_DrawImage_SourceCopy(void)
|
|||
expect(0, dst_pixels[0]);
|
||||
expect(0xffff0000, dst_pixels[1]);
|
||||
expect(0, dst_pixels[2]);
|
||||
todo_wine expect(0, dst_pixels[3]);
|
||||
expect(0, dst_pixels[3]);
|
||||
|
||||
status = GdipDeleteGraphics(graphics);
|
||||
expect(Ok, status);
|
||||
|
|
|
@ -100,7 +100,9 @@ struct tagActiveDS
|
|||
struct jpeg_decompress_struct jd;
|
||||
struct jpeg_error_mgr jerr;
|
||||
#endif
|
||||
} activeDS DECLSPEC_HIDDEN;
|
||||
};
|
||||
|
||||
extern struct tagActiveDS activeDS DECLSPEC_HIDDEN;
|
||||
|
||||
/* Helper functions */
|
||||
extern TW_UINT16 GPHOTO2_SaneCapability (pTW_CAPABILITY pCapability, TW_UINT16 action) DECLSPEC_HIDDEN;
|
||||
|
|
|
@ -33,6 +33,8 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(twain);
|
||||
|
||||
struct tagActiveDS activeDS;
|
||||
|
||||
DSMENTRYPROC GPHOTO2_dsmentry;
|
||||
|
||||
#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,
|
||||
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);
|
||||
if (handle) *handle = NULL;
|
||||
|
||||
if (init_notify)
|
||||
callback(context, NULL, MibInitialNotification);
|
||||
|
||||
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 *pConvertLengthToIpv4Mask)(ULONG,ULONG*);
|
||||
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 NET_IFINDEX (WINAPI *pif_nametoindex)(const char*);
|
||||
|
@ -158,6 +161,8 @@ static void loadIPHlpApi(void)
|
|||
pParseNetworkString = (void *)GetProcAddress(hLibrary, "ParseNetworkString");
|
||||
pif_indextoname = (void *)GetProcAddress(hLibrary, "if_indextoname");
|
||||
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)
|
||||
{
|
||||
|
||||
|
@ -2411,6 +2451,7 @@ START_TEST(iphlpapi)
|
|||
test_ConvertLengthToIpv4Mask();
|
||||
test_GetUdp6Table();
|
||||
test_ParseNetworkString();
|
||||
test_NotifyUnicastIpAddressChange();
|
||||
freeIPHlpApi();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3142,6 +3142,53 @@ static void test_GetConsoleScreenBufferInfoEx(HANDLE std_output)
|
|||
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)
|
||||
{
|
||||
HANDLE pipe_in, pipe_out;
|
||||
|
@ -3398,5 +3445,6 @@ START_TEST(console)
|
|||
test_GetConsoleFontInfo(hConOut);
|
||||
test_SetConsoleFont(hConOut);
|
||||
test_GetConsoleScreenBufferInfoEx(hConOut);
|
||||
test_SetConsoleScreenBufferInfoEx(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 BOOL (WINAPI *pSetFileInformationByHandle)(HANDLE, FILE_INFO_BY_HANDLE_CLASS, void*, DWORD);
|
||||
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 *pRtlFreeUnicodeString)(PUNICODE_STRING);
|
||||
static BOOL (WINAPI *pSetFileCompletionNotificationModes)(HANDLE, UCHAR);
|
||||
|
@ -111,6 +112,7 @@ static void InitFunctionPointers(void)
|
|||
pGetFinalPathNameByHandleW = (void *) GetProcAddress(hkernel32, "GetFinalPathNameByHandleW");
|
||||
pSetFileInformationByHandle = (void *) GetProcAddress(hkernel32, "SetFileInformationByHandle");
|
||||
pGetQueuedCompletionStatusEx = (void *) GetProcAddress(hkernel32, "GetQueuedCompletionStatusEx");
|
||||
pReOpenFile = (void *) GetProcAddress(hkernel32, "ReOpenFile");
|
||||
pSetFileCompletionNotificationModes = (void *)GetProcAddress(hkernel32, "SetFileCompletionNotificationModes");
|
||||
pFindFirstStreamW = (void *)GetProcAddress(hkernel32, "FindFirstStreamW");
|
||||
}
|
||||
|
@ -4410,6 +4412,104 @@ static void test_SetFileValidData(void)
|
|||
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)
|
||||
{
|
||||
char temp_path[MAX_PATH], filename[MAX_PATH];
|
||||
|
@ -5483,4 +5583,5 @@ START_TEST(file)
|
|||
test_file_readonly_access();
|
||||
test_find_file_stream();
|
||||
test_SetFileTime();
|
||||
test_ReOpenFile();
|
||||
}
|
||||
|
|
|
@ -1141,6 +1141,7 @@ static void test_Toolhelp(void)
|
|||
STARTUPINFOA startup;
|
||||
PROCESS_INFORMATION info;
|
||||
HANDLE process, thread, snapshot;
|
||||
DWORD nested_pid;
|
||||
PROCESSENTRY32 pe;
|
||||
THREADENTRY32 te;
|
||||
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 */
|
||||
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);
|
||||
ok(snapshot != INVALID_HANDLE_VALUE, "CreateToolhelp32Snapshot failed %u\n", GetLastError());
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
pe.dwSize = sizeof(pe);
|
||||
if (pProcess32First(snapshot, &pe))
|
||||
{
|
||||
while (pe.th32ParentProcessID != info.dwProcessId)
|
||||
while (pe.th32ProcessID != nested_pid)
|
||||
if (!pProcess32Next(snapshot, &pe)) break;
|
||||
}
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
|
||||
WritePrivateProfileStringA(NULL, NULL, NULL, resfile);
|
||||
|
@ -4037,6 +4046,7 @@ START_TEST(process)
|
|||
char buffer[MAX_PATH];
|
||||
STARTUPINFOA startup;
|
||||
PROCESS_INFORMATION info;
|
||||
HANDLE hFile;
|
||||
|
||||
memset(&startup, 0, 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");
|
||||
CloseHandle(info.hProcess);
|
||||
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;
|
||||
}
|
||||
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,
|
||||
CONSOLE_SCREEN_BUFFER_INFOEX *info )
|
||||
{
|
||||
FIXME( "(%p %p): stub!\n", handle, info );
|
||||
SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
|
||||
return FALSE;
|
||||
BOOL ret;
|
||||
|
||||
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 );
|
||||
}
|
||||
|
||||
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.@)
|
||||
|
@ -441,7 +461,6 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
|
|||
DWORD attributes, HANDLE template )
|
||||
{
|
||||
NTSTATUS status;
|
||||
UINT options;
|
||||
OBJECT_ATTRIBUTES attr;
|
||||
UNICODE_STRING nameW;
|
||||
IO_STATUS_BLOCK io;
|
||||
|
@ -543,25 +562,8 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
|
|||
|
||||
/* 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)
|
||||
{
|
||||
options |= FILE_DELETE_ON_CLOSE;
|
||||
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.RootDirectory = 0;
|
||||
|
@ -582,8 +584,9 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
|
|||
if (sa && sa->bInheritHandle) attr.Attributes |= OBJ_INHERIT;
|
||||
|
||||
status = NtCreateFile( &ret, access | SYNCHRONIZE | FILE_READ_ATTRIBUTES, &attr, &io,
|
||||
NULL, attributes, sharing, nt_disposition[creation - CREATE_NEW],
|
||||
options, NULL, 0 );
|
||||
NULL, attributes & FILE_ATTRIBUTE_VALID_FLAGS, sharing,
|
||||
nt_disposition[creation - CREATE_NEW],
|
||||
get_nt_file_options( attributes ), NULL, 0 );
|
||||
if (status)
|
||||
{
|
||||
if (vxd_name && vxd_name[0])
|
||||
|
@ -2550,10 +2553,41 @@ HANDLE WINAPI DECLSPEC_HOTPATCH OpenFileById( HANDLE handle, LPFILE_ID_DESCRIPTO
|
|||
/***********************************************************************
|
||||
* 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 );
|
||||
return INVALID_HANDLE_VALUE;
|
||||
SECURITY_QUALITY_OF_SERVICE qos;
|
||||
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 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))
|
||||
{
|
||||
|
|
|
@ -92,8 +92,8 @@
|
|||
@ stdcall WcsEnumColorProfilesSize(long ptr ptr)
|
||||
@ stub WcsGetCalibrationManagementState
|
||||
@ stub WcsGetDefaultColorProfile
|
||||
@ stub WcsGetDefaultColorProfileSize
|
||||
@ stub WcsGetDefaultRenderingIntent
|
||||
@ stdcall WcsGetDefaultColorProfileSize(long wstr long long long ptr)
|
||||
@ stdcall WcsGetDefaultRenderingIntent(long ptr)
|
||||
@ stdcall WcsGetUsePerUserProfiles(wstr long ptr)
|
||||
@ stub WcsGpCanInstallOrUninstallProfiles
|
||||
@ stdcall WcsOpenColorProfileA(ptr ptr ptr long long long long)
|
||||
|
|
|
@ -1552,6 +1552,28 @@ BOOL WINAPI WcsEnumColorProfilesSize( WCS_PROFILE_MANAGEMENT_SCOPE scope, ENUMTY
|
|||
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.@]
|
||||
*/
|
||||
|
|
|
@ -142,7 +142,7 @@ void init_css_style(CSSStyle*,nsIDOMCSSStyleDeclaration*,style_qi_t,
|
|||
dispex_static_data_t*,compat_mode_t) 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_var(CSSStyle*,styleid_t,VARIANT*) DECLSPEC_HIDDEN;
|
||||
|
|
|
@ -51,6 +51,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
|
|||
HINSTANCE hInst;
|
||||
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 WCHAR *status_strings[IDS_STATUS_LAST-IDS_STATUS_FIRST+1];
|
||||
static IMultiLanguage2 *mlang;
|
||||
|
|
|
@ -355,12 +355,12 @@ typedef struct {
|
|||
|
||||
DEFINE_GUID(IID_nsXPCOMCycleCollectionParticipant, 0x9674489b,0x1f6f,0x4550,0xa7,0x30, 0xcc,0xae,0xdd,0x10,0x4c,0xf9);
|
||||
|
||||
nsrefcnt (__cdecl *ccref_incr)(nsCycleCollectingAutoRefCnt*,nsISupports*) DECLSPEC_HIDDEN;
|
||||
nsrefcnt (__cdecl *ccref_decr)(nsCycleCollectingAutoRefCnt*,nsISupports*,ExternalCycleCollectionParticipant*) DECLSPEC_HIDDEN;
|
||||
void (__cdecl *ccref_init)(nsCycleCollectingAutoRefCnt*,nsrefcnt) DECLSPEC_HIDDEN;
|
||||
void (__cdecl *ccp_init)(ExternalCycleCollectionParticipant*,const CCObjCallback*) DECLSPEC_HIDDEN;
|
||||
void (__cdecl *describe_cc_node)(nsCycleCollectingAutoRefCnt*,const char*,nsCycleCollectionTraversalCallback*) DECLSPEC_HIDDEN;
|
||||
void (__cdecl *note_cc_edge)(nsISupports*,const char*,nsCycleCollectionTraversalCallback*) DECLSPEC_HIDDEN;
|
||||
extern nsrefcnt (__cdecl *ccref_incr)(nsCycleCollectingAutoRefCnt*,nsISupports*) DECLSPEC_HIDDEN;
|
||||
extern nsrefcnt (__cdecl *ccref_decr)(nsCycleCollectingAutoRefCnt*,nsISupports*,ExternalCycleCollectionParticipant*) DECLSPEC_HIDDEN;
|
||||
extern void (__cdecl *ccref_init)(nsCycleCollectingAutoRefCnt*,nsrefcnt) DECLSPEC_HIDDEN;
|
||||
extern void (__cdecl *ccp_init)(ExternalCycleCollectionParticipant*,const CCObjCallback*) DECLSPEC_HIDDEN;
|
||||
extern void (__cdecl *describe_cc_node)(nsCycleCollectingAutoRefCnt*,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 release_dispex(DispatchEx*) DECLSPEC_HIDDEN;
|
||||
|
|
|
@ -51,6 +51,8 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(msi);
|
||||
|
||||
BOOL is_wow64;
|
||||
|
||||
static const WCHAR installerW[] = {'\\','I','n','s','t','a','l','l','e','r',0};
|
||||
|
||||
UINT msi_locate_product(LPCWSTR szProduct, MSIINSTALLCONTEXT *context)
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
#include "winemsi.h"
|
||||
|
||||
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 MSITYPE_VALID 0x0100
|
||||
|
|
|
@ -16,12 +16,12 @@
|
|||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
char PROG_FILES_DIR[MAX_PATH];
|
||||
char PROG_FILES_DIR_NATIVE[MAX_PATH];
|
||||
char COMMON_FILES_DIR[MAX_PATH];
|
||||
char APP_DATA_DIR[MAX_PATH];
|
||||
char WINDOWS_DIR[MAX_PATH];
|
||||
char CURR_DIR[MAX_PATH];
|
||||
extern char PROG_FILES_DIR[MAX_PATH];
|
||||
extern char PROG_FILES_DIR_NATIVE[MAX_PATH];
|
||||
extern char COMMON_FILES_DIR[MAX_PATH];
|
||||
extern char APP_DATA_DIR[MAX_PATH];
|
||||
extern char WINDOWS_DIR[MAX_PATH];
|
||||
extern char CURR_DIR[MAX_PATH];
|
||||
|
||||
BOOL get_system_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
|
||||
MSVCP_exception_ctor(&this->e, "");
|
||||
#else
|
||||
MSVCP_exception_ctor(&this->e, NULL);
|
||||
MSVCP_exception_default_ctor(&this->e);
|
||||
#endif
|
||||
MSVCP_basic_string_char_ctor_cstr(&this->str, EXCEPTION_STR(name));
|
||||
#else
|
||||
|
@ -560,7 +560,7 @@ static runtime_error* MSVCP_runtime_error_ctor( runtime_error *this, exception_n
|
|||
#if _MSVCP_VER == 60
|
||||
MSVCP_exception_ctor(&this->e, "");
|
||||
#else
|
||||
MSVCP_exception_ctor(&this->e, NULL);
|
||||
MSVCP_exception_default_ctor(&this->e);
|
||||
#endif
|
||||
MSVCP_basic_string_char_ctor_cstr(&this->str, EXCEPTION_STR(name));
|
||||
#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__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 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 */
|
||||
#undef errno
|
||||
|
@ -402,6 +405,9 @@ static BOOL init(void)
|
|||
SET(p__vsnwprintf, "_vsnwprintf");
|
||||
SET(p___strncnt, "__strncnt");
|
||||
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)
|
||||
{
|
||||
|
@ -1936,6 +1942,25 @@ static void test_swscanf(void)
|
|||
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)
|
||||
{
|
||||
if(!init())
|
||||
|
@ -1975,4 +2000,5 @@ START_TEST(msvcr90)
|
|||
#endif
|
||||
test___strncnt();
|
||||
test_swscanf();
|
||||
test____mb_cur_max_l_func();
|
||||
}
|
||||
|
|
|
@ -1640,73 +1640,6 @@ range:
|
|||
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.@)
|
||||
*/
|
||||
|
@ -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))
|
||||
{
|
||||
end = penv;
|
||||
while(*end && *end != ';') end++; /* Find end of next path */
|
||||
path_len = end - penv;
|
||||
path_len = 0;
|
||||
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)
|
||||
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)
|
||||
|
@ -1778,61 +1726,11 @@ int CDECL MSVCRT__searchenv_s(const char* file, const char* env, char *buf, MSVC
|
|||
}
|
||||
|
||||
/*********************************************************************
|
||||
* _wsearchenv (MSVCRT.@)
|
||||
*
|
||||
* Unicode version of _searchenv
|
||||
* _searchenv (MSVCRT.@)
|
||||
*/
|
||||
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_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;
|
||||
MSVCRT__searchenv_s(file, env, buf, MAX_PATH);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
@ -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))
|
||||
{
|
||||
end = penv;
|
||||
while(*end && *end != ';') end++; /* Find end of next path */
|
||||
path_len = end - penv;
|
||||
path_len = 0;
|
||||
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)
|
||||
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)
|
||||
|
@ -1905,3 +1818,11 @@ int CDECL MSVCRT__wsearchenv_s(const MSVCRT_wchar_t* file, const MSVCRT_wchar_t*
|
|||
*MSVCRT__errno() = 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.@)
|
||||
*/
|
||||
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;
|
||||
|
||||
|
@ -193,7 +193,7 @@ int* CDECL ___mb_cur_max_l_func(MSVCRT__locale_t locale)
|
|||
else
|
||||
locinfo = locale->locinfo;
|
||||
|
||||
return &locinfo->mb_cur_max;
|
||||
return locinfo->mb_cur_max;
|
||||
}
|
||||
#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,
|
||||
MSVCRT_size_t count, MSVCRT__locale_t locale)
|
||||
{
|
||||
MSVCRT_pthreadlocinfo locinfo;
|
||||
int c1, c2;
|
||||
|
||||
if(s1==NULL || s2==NULL)
|
||||
|
@ -2318,9 +2319,26 @@ int __cdecl MSVCRT__strnicmp_l(const char *s1, const char *s2,
|
|||
if(!count)
|
||||
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 {
|
||||
c1 = MSVCRT__tolower_l(*s1++, locale);
|
||||
c2 = MSVCRT__tolower_l(*s2++, locale);
|
||||
c1 = MSVCRT__tolower_l((unsigned char)*s1++, locale);
|
||||
c2 = MSVCRT__tolower_l((unsigned char)*s2++, locale);
|
||||
}while(--count && c1 && 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);
|
||||
}
|
||||
|
||||
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=");
|
||||
|
||||
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_NX_ENABLED] = (regs2[3] >> 20) & 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;
|
||||
}
|
||||
}
|
||||
|
@ -1143,6 +1144,7 @@ static inline void get_cpuinfo(SYSTEM_CPU_INFORMATION* info)
|
|||
{
|
||||
do_cpuid(0x80000001, regs2); /* get vendor features */
|
||||
user_shared_data->ProcessorFeatures[PF_NX_ENABLED] = (regs2[3] >> 20) & 1;
|
||||
user_shared_data->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] = (regs2[3] >> 27) & 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "windef.h"
|
||||
#include "winternl.h"
|
||||
#include "wine/test.h"
|
||||
#include "ddk/wdm.h"
|
||||
|
||||
static unsigned int page_size;
|
||||
|
||||
|
@ -33,6 +34,8 @@ static NTSTATUS (WINAPI *pRtlFreeUserStack)(void *);
|
|||
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
|
||||
static const BOOL is_win64 = sizeof(void*) != sizeof(int);
|
||||
|
||||
static SYSTEM_BASIC_INFORMATION sbi;
|
||||
|
||||
static HANDLE create_target_process(const char *arg)
|
||||
{
|
||||
char **argv;
|
||||
|
@ -513,9 +516,22 @@ static void test_NtMapViewOfSection(void)
|
|||
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)
|
||||
{
|
||||
SYSTEM_BASIC_INFORMATION sbi;
|
||||
HMODULE mod;
|
||||
|
||||
int argc;
|
||||
|
@ -546,4 +562,5 @@ START_TEST(virtual)
|
|||
test_NtAllocateVirtualMemory();
|
||||
test_RtlCreateUserStack();
|
||||
test_NtMapViewOfSection();
|
||||
test_user_shared_data();
|
||||
}
|
||||
|
|
|
@ -222,6 +222,7 @@ static void set_process_name( int argc, char *argv[] )
|
|||
*/
|
||||
TEB *thread_init(void)
|
||||
{
|
||||
SYSTEM_BASIC_INFORMATION sbi;
|
||||
TEB *teb;
|
||||
void *addr;
|
||||
SIZE_T size;
|
||||
|
@ -310,6 +311,9 @@ TEB *thread_init(void)
|
|||
user_shared_data->TickCountMultiplier = 1 << 24;
|
||||
fill_cpu_info();
|
||||
|
||||
virtual_get_system_info( &sbi );
|
||||
user_shared_data->NumberOfPhysicalPages = sbi.MmNumberOfPhysicalPages;
|
||||
|
||||
return teb;
|
||||
}
|
||||
|
||||
|
|
|
@ -797,6 +797,8 @@ static void find_reg_tz_info(RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi, const char*
|
|||
continue; \
|
||||
}
|
||||
|
||||
memset(®_tzi, 0, sizeof(reg_tzi));
|
||||
|
||||
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));
|
||||
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;
|
||||
|
||||
hr = IMoniker_QueryInterface(pMoniker, riid, ppv);
|
||||
|
||||
if (FAILED(hr))
|
||||
IMoniker_Release(pMoniker);
|
||||
IMoniker_Release(pMoniker);
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
|
|
@ -62,6 +62,7 @@ typedef struct tagTrackerWindowInfo
|
|||
DWORD dwOKEffect;
|
||||
DWORD* pdwEffect;
|
||||
BOOL trackingDone;
|
||||
BOOL inTrackCall;
|
||||
HRESULT returnValue;
|
||||
|
||||
BOOL escPressed;
|
||||
|
@ -766,6 +767,7 @@ HRESULT WINAPI DoDragDrop (
|
|||
trackerInfo.dwOKEffect = dwOKEffect;
|
||||
trackerInfo.pdwEffect = pdwEffect;
|
||||
trackerInfo.trackingDone = FALSE;
|
||||
trackerInfo.inTrackCall = FALSE;
|
||||
trackerInfo.escPressed = FALSE;
|
||||
trackerInfo.curTargetHWND = 0;
|
||||
trackerInfo.curDragTarget = 0;
|
||||
|
@ -2284,6 +2286,13 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
|
|||
HWND hwndNewTarget = 0;
|
||||
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
|
||||
*/
|
||||
|
@ -2329,6 +2338,8 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
|
|||
}
|
||||
else
|
||||
drag_end( trackerInfo );
|
||||
|
||||
trackerInfo->inTrackCall = FALSE;
|
||||
}
|
||||
|
||||
/***
|
||||
|
|
|
@ -606,9 +606,7 @@ HRESULT WINAPI PointerMoniker_CreateInstance(IClassFactory *iface,
|
|||
return hr;
|
||||
|
||||
hr = IMoniker_QueryInterface(pMoniker, riid, ppv);
|
||||
|
||||
if (FAILED(hr))
|
||||
IMoniker_Release(pMoniker);
|
||||
IMoniker_Release(pMoniker);
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
|
|
@ -260,6 +260,7 @@ struct method_call call_lists[][30] =
|
|||
};
|
||||
|
||||
static int droptarget_refs;
|
||||
static int test_reentrance;
|
||||
|
||||
/* 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)
|
||||
|
@ -359,7 +360,34 @@ static HRESULT WINAPI DropSource_QueryContinueDrag(
|
|||
BOOL fEscapePressed,
|
||||
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(
|
||||
|
@ -701,17 +729,20 @@ static void test_DoDragDrop(void)
|
|||
GetWindowRect(hwnd, &rect);
|
||||
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;
|
||||
trace("%d\n", seq);
|
||||
call_ptr = call_lists[seq];
|
||||
effect_in = call_ptr->set_param;
|
||||
call_ptr++;
|
||||
for (seq = 0; seq < ARRAY_SIZE(call_lists); seq++)
|
||||
{
|
||||
DWORD effect_in;
|
||||
trace("%d\n", seq);
|
||||
call_ptr = call_lists[seq];
|
||||
effect_in = call_ptr->set_param;
|
||||
call_ptr++;
|
||||
|
||||
hr = DoDragDrop(&DataObject, &DropSource, effect_in, &effect);
|
||||
check_expect(DoDragDrop_ret, hr, NULL);
|
||||
check_expect(DoDragDrop_effect_out, effect, NULL);
|
||||
hr = DoDragDrop(&DataObject, &DropSource, effect_in, &effect);
|
||||
check_expect(DoDragDrop_ret, hr, NULL);
|
||||
check_expect(DoDragDrop_effect_out, effect, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
OleUninitialize();
|
||||
|
|
|
@ -50,3 +50,11 @@ BOOL WINAPI QOSCreateHandle(PQOS_VERSION version, PHANDLE handle)
|
|||
SetLastError(ERROR_SERVICE_ALREADY_RUNNING);
|
||||
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 QDLHStartDiagnosingPath
|
||||
@ stub QOSAddSocketToFlow
|
||||
@ stdcall QOSAddSocketToFlow(ptr long ptr long long ptr)
|
||||
@ stub QOSCancel
|
||||
@ stub QOSCloseHandle
|
||||
@ stdcall QOSCreateHandle(ptr ptr)
|
||||
|
|
|
@ -925,12 +925,6 @@ static HRESULT get_param_pointer_info(ITypeInfo *typeinfo, TYPEDESC *tdesc, int
|
|||
ITypeInfo_ReleaseTypeAttr(refinfo, attr);
|
||||
ITypeInfo_Release(refinfo);
|
||||
break;
|
||||
case VT_BSTR:
|
||||
*flags |= IsSimpleRef | MustFree;
|
||||
*tfs_tdesc = tdesc;
|
||||
if (!is_in && is_out)
|
||||
*server_size = sizeof(void *);
|
||||
break;
|
||||
default:
|
||||
*flags |= IsSimpleRef;
|
||||
*tfs_tdesc = tdesc;
|
||||
|
@ -938,6 +932,8 @@ static HRESULT get_param_pointer_info(ITypeInfo *typeinfo, TYPEDESC *tdesc, int
|
|||
*server_size = type_memsize(typeinfo, tdesc);
|
||||
if ((*basetype = get_basetype(typeinfo, tdesc)))
|
||||
*flags |= IsBasetype;
|
||||
else
|
||||
*flags |= MustFree;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1265,14 +1261,16 @@ static HRESULT get_iface_info(ITypeInfo *typeinfo, WORD *funcs, WORD *parentfunc
|
|||
if (FAILED(hr))
|
||||
goto err;
|
||||
hr = ITypeInfo_GetRefTypeInfo(*real_typeinfo, reftype, &parentinfo);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = ITypeInfo_GetTypeAttr(parentinfo, &typeattr);
|
||||
ITypeInfo_Release(parentinfo);
|
||||
}
|
||||
if (FAILED(hr))
|
||||
goto err;
|
||||
hr = ITypeInfo_GetTypeAttr(parentinfo, &typeattr);
|
||||
if (FAILED(hr))
|
||||
goto err;
|
||||
|
||||
*parentiid = typeattr->guid;
|
||||
ITypeInfo_ReleaseTypeAttr(parentinfo, typeattr);
|
||||
ITypeInfo_Release(parentinfo);
|
||||
|
||||
return S_OK;
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#include "twain.h"
|
||||
|
||||
#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_exit)
|
||||
MAKE_FUNCPTR(sane_get_devices)
|
||||
|
@ -84,7 +84,9 @@ struct tagActiveDS
|
|||
TW_FIX32 defaultXResolution;
|
||||
BOOL YResolutionSet;
|
||||
TW_FIX32 defaultYResolution;
|
||||
} activeDS DECLSPEC_HIDDEN;
|
||||
};
|
||||
|
||||
extern struct tagActiveDS activeDS DECLSPEC_HIDDEN;
|
||||
|
||||
/* Helper functions */
|
||||
extern TW_UINT16 SANE_SaneCapability (pTW_CAPABILITY pCapability, TW_UINT16 action) DECLSPEC_HIDDEN;
|
||||
|
|
|
@ -30,9 +30,27 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(twain);
|
||||
|
||||
struct tagActiveDS activeDS;
|
||||
|
||||
DSMENTRYPROC SANE_dsmentry;
|
||||
|
||||
#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;
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#define JOB_ADD_CURRENT_DATE 0x08
|
||||
#define JOB_NONINTERACTIVE 0x10
|
||||
|
||||
extern handle_t rpc_handle;
|
||||
extern handle_t atsvc_handle;
|
||||
|
||||
static int test_failures, test_skipped;
|
||||
|
||||
|
@ -69,7 +69,7 @@ START_TEST(atsvcapi)
|
|||
|
||||
hr = RpcStringBindingComposeA(NULL, ncalrpc, NULL, NULL, NULL, &binding_str);
|
||||
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);
|
||||
hr = RpcStringFreeA(&binding_str);
|
||||
ok(hr == RPC_S_OK, "RpcStringFree error %#x\n", hr);
|
||||
|
@ -173,7 +173,7 @@ skip_tests_delete:
|
|||
skip_tests:
|
||||
SetUnhandledExceptionFilter(old_exception_filter);
|
||||
|
||||
hr = RpcBindingFree(&rpc_handle);
|
||||
hr = RpcBindingFree(&atsvc_handle);
|
||||
ok(hr == RPC_S_OK, "RpcBindingFree error %#x\n", hr);
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
#include "wine/test.h"
|
||||
|
||||
extern handle_t rpc_handle;
|
||||
extern handle_t schrpc_handle;
|
||||
|
||||
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);
|
||||
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);
|
||||
hr = RpcStringFreeA(&binding_str);
|
||||
ok(hr == RPC_S_OK, "RpcStringFree error %#x\n", hr);
|
||||
|
@ -537,7 +537,7 @@ todo_wine
|
|||
MIDL_user_free(path);
|
||||
}
|
||||
|
||||
hr = RpcBindingFree(&rpc_handle);
|
||||
hr = RpcBindingFree(&schrpc_handle);
|
||||
ok(hr == RPC_S_OK, "RpcBindingFree error %#x\n", hr);
|
||||
}
|
||||
|
||||
|
|
|
@ -1387,8 +1387,8 @@ static const SecPkgInfoA infoA = {
|
|||
ntlm_comment_A
|
||||
};
|
||||
|
||||
SecPkgInfoA *ntlm_package_infoA = (SecPkgInfoA *)&infoA;
|
||||
SecPkgInfoW *ntlm_package_infoW = (SecPkgInfoW *)&infoW;
|
||||
static SecPkgInfoA *ntlm_package_infoA = (SecPkgInfoA *)&infoA;
|
||||
static SecPkgInfoW *ntlm_package_infoW = (SecPkgInfoW *)&infoW;
|
||||
|
||||
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
|
||||
|
||||
|
||||
SecPkgInfoW *ntlm_package_infoW DECLSPEC_HIDDEN;
|
||||
SecPkgInfoA *ntlm_package_infoA DECLSPEC_HIDDEN;
|
||||
|
||||
/* schannel internal interface */
|
||||
typedef struct schan_imp_session_opaque *schan_imp_session;
|
||||
|
||||
|
|
|
@ -4570,16 +4570,42 @@ BOOL WINAPI SetupDiBuildDriverInfoList(HDEVINFO devinfo, SP_DEVINFO_DATA *device
|
|||
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.@)
|
||||
*/
|
||||
BOOL WINAPI SetupDiEnumDriverInfoW(HDEVINFO devinfo, SP_DEVINFO_DATA *device_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;
|
||||
INFCONTEXT ctx;
|
||||
HINF hinf;
|
||||
|
||||
TRACE("devinfo %p, device_data %p, type %#x, index %u, driver_data %p.\n",
|
||||
devinfo, device_data, type, index, driver_data);
|
||||
|
@ -4600,19 +4626,7 @@ BOOL WINAPI SetupDiEnumDriverInfoW(HDEVINFO devinfo, SP_DEVINFO_DATA *device_dat
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if ((hinf = SetupOpenInfFileW(device->drivers[index].inf_path, NULL, INF_STYLE_WIN4, NULL)) == INVALID_HANDLE_VALUE)
|
||||
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;
|
||||
return copy_driver_data(driver_data, &device->drivers[index]);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -4626,14 +4640,7 @@ BOOL WINAPI SetupDiEnumDriverInfoA(HDEVINFO devinfo, SP_DEVINFO_DATA *device_dat
|
|||
|
||||
driver_dataW.cbSize = sizeof(driver_dataW);
|
||||
ret = SetupDiEnumDriverInfoW(devinfo, device_data, type, index, &driver_dataW);
|
||||
driver_data->DriverType = driver_dataW.DriverType;
|
||||
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);
|
||||
driver_data_wtoa(driver_data, &driver_dataW);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -4663,6 +4670,41 @@ BOOL WINAPI SetupDiSelectBestCompatDrv(HDEVINFO devinfo, SP_DEVINFO_DATA *device
|
|||
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.@)
|
||||
*/
|
||||
|
|
|
@ -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 |
|
||||
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);
|
||||
}
|
||||
|
@ -1140,6 +1140,22 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style,
|
|||
if (docopy)
|
||||
{
|
||||
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() );
|
||||
}
|
||||
else
|
||||
|
|
|
@ -359,8 +359,8 @@
|
|||
@ stdcall SetupDiGetINFClassA(str ptr ptr long ptr)
|
||||
@ stdcall SetupDiGetINFClassW(wstr ptr ptr long ptr)
|
||||
@ stub SetupDiGetSelectedDevice
|
||||
@ stub SetupDiGetSelectedDriverA
|
||||
@ stub SetupDiGetSelectedDriverW
|
||||
@ stdcall SetupDiGetSelectedDriverA(ptr ptr ptr)
|
||||
@ stdcall SetupDiGetSelectedDriverW(ptr ptr ptr)
|
||||
@ stub SetupDiGetWizardPage
|
||||
@ stdcall SetupDiInstallClassA(long str long ptr)
|
||||
@ stub SetupDiInstallClassExA
|
||||
|
|
|
@ -2374,6 +2374,20 @@ static void test_driver_list(void)
|
|||
ok(!ret, "Expected failure.\n");
|
||||
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);
|
||||
ret = DeleteFileA(inf_path);
|
||||
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 );
|
||||
|
||||
info = GetPropW( hWnd, szBrowseFolderInfo );
|
||||
if (!info)
|
||||
return FALSE;
|
||||
|
||||
switch (msg)
|
||||
{
|
||||
|
|
|
@ -3843,7 +3843,7 @@ static HRESULT WINAPI TaskService_Connect(ITaskService *iface, VARIANT server, V
|
|||
DWORD len;
|
||||
HRESULT hr;
|
||||
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),
|
||||
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);
|
||||
if (hr != RPC_S_OK) return hr;
|
||||
hr = RpcBindingFromStringBindingW(binding_str, &rpc_handle);
|
||||
hr = RpcBindingFromStringBindingW(binding_str, &schrpc_handle);
|
||||
RpcStringFreeW(&binding_str);
|
||||
if (hr != RPC_S_OK) return hr;
|
||||
|
||||
|
|
|
@ -29,7 +29,9 @@
|
|||
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -45,11 +45,11 @@ typedef struct tagActiveDS
|
|||
HWND event_window;
|
||||
} 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) */
|
||||
extern TW_UINT16 TWAIN_CloseDS
|
||||
|
|
|
@ -30,6 +30,8 @@ STRINGTABLE
|
|||
39617 "Afghanistan Daylight Time"
|
||||
50192 "Alaskan Standard Time"
|
||||
50193 "Alaskan Daylight Time"
|
||||
55200 "Aleutian Standard Time"
|
||||
55201 "Aleutian Daylight Time"
|
||||
41968 "Arab Standard Time"
|
||||
41969 "Arab Daylight Time"
|
||||
42704 "Arabian Standard Time"
|
||||
|
@ -54,6 +56,8 @@ STRINGTABLE
|
|||
48721 "Bangladesh Daylight Time"
|
||||
56576 "Belarus Standard Time"
|
||||
56577 "Belarus Daylight Time"
|
||||
51968 "Bougainville Standard Time"
|
||||
51969 "Bougainville Daylight Time"
|
||||
25712 "Canada Central Standard Time"
|
||||
25713 "Canada Central Daylight Time"
|
||||
2000 "Cape Verde Standard Time"
|
||||
|
@ -78,6 +82,8 @@ STRINGTABLE
|
|||
17457 "Central Daylight Time"
|
||||
32800 "Central Standard Time (Mexico)"
|
||||
32801 "Central Daylight Time (Mexico)"
|
||||
62304 "Chatham Islands Standard Time"
|
||||
62305 "Chatham Islands Daylight Time"
|
||||
160 "China Standard Time"
|
||||
161 "China Daylight Time"
|
||||
50384 "Dateline Standard Time"
|
||||
|
@ -110,6 +116,8 @@ STRINGTABLE
|
|||
47169 "Greenwich Daylight Time"
|
||||
24192 "GTB Standard Time"
|
||||
24193 "GTB Daylight Time"
|
||||
2896 "Haiti Standard Time"
|
||||
2897 "Haiti Daylight Time"
|
||||
53376 "Hawaiian Standard Time"
|
||||
53377 "Hawaiian Daylight Time"
|
||||
22400 "India Standard Time"
|
||||
|
@ -130,6 +138,8 @@ STRINGTABLE
|
|||
16769 "Line Islands Daylight Time"
|
||||
8832 "Magadan Standard Time"
|
||||
8833 "Magadan Daylight Time"
|
||||
20736 "Marquesas Standard Time"
|
||||
20737 "Marquesas Daylight Time"
|
||||
60896 "Mauritius Standard Time"
|
||||
60897 "Mauritius Daylight Time"
|
||||
15968 "Middle East Standard Time"
|
||||
|
|
|
@ -1856,8 +1856,8 @@
|
|||
@ cdecl _putwch_nolock(long)
|
||||
@ cdecl _putws(wstr) MSVCRT__putws
|
||||
@ stub _query_app_type
|
||||
@ stub _query_new_handler
|
||||
@ stub _query_new_mode
|
||||
@ cdecl _query_new_handler() MSVCRT__query_new_handler
|
||||
@ cdecl _query_new_mode() MSVCRT__query_new_mode
|
||||
@ cdecl _read(long ptr long) MSVCRT__read
|
||||
@ cdecl _realloc_base(ptr long)
|
||||
@ cdecl _recalloc(ptr long long)
|
||||
|
|
|
@ -358,3 +358,13 @@ HRESULT WINAPI URLOpenStreamW(LPUNKNOWN pCaller, LPCWSTR szURL, DWORD dwReserved
|
|||
|
||||
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 URLOpenBlockingStreamW(ptr wstr ptr long ptr)
|
||||
@ stub URLOpenPullStreamA
|
||||
@ stub URLOpenPullStreamW
|
||||
@ stdcall URLOpenPullStreamW(ptr wstr long ptr)
|
||||
@ stdcall URLOpenStreamA(ptr str long ptr)
|
||||
@ stdcall URLOpenStreamW(ptr wstr long ptr)
|
||||
@ stub UrlMkBuildVersion
|
||||
|
|
|
@ -1750,6 +1750,12 @@ static INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar, LPCSCROLLINFO info, BOOL b
|
|||
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 */
|
||||
{
|
||||
infoPtr->flags = new_flags;
|
||||
|
|
|
@ -98,6 +98,7 @@ static void ClassTest(HINSTANCE hInstance, BOOL global)
|
|||
LONG i;
|
||||
WCHAR str[20];
|
||||
ATOM classatom;
|
||||
HINSTANCE hInstance2;
|
||||
|
||||
cls.style = CS_HREDRAW | CS_VREDRAW | (global?CS_GLOBALCLASS:0);
|
||||
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");
|
||||
|
||||
/* 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,
|
||||
WS_OVERLAPPEDWINDOW + WS_HSCROLL + WS_VSCROLL,
|
||||
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((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 */
|
||||
for(i=0; i<NUMCLASSWORDS; i++)
|
||||
{
|
||||
|
@ -1491,6 +1517,8 @@ START_TEST(class)
|
|||
|
||||
ClassTest(hInstance,FALSE);
|
||||
ClassTest(hInstance,TRUE);
|
||||
ClassTest((HANDLE)((ULONG_PTR)hInstance | 0x1234), FALSE);
|
||||
ClassTest((HANDLE)((ULONG_PTR)hInstance | 0x1234), TRUE);
|
||||
CreateDialogParamTest(hInstance);
|
||||
test_styles();
|
||||
test_builtinproc();
|
||||
|
|
|
@ -634,7 +634,6 @@ static void test_SetScrollInfo(void)
|
|||
si.nPage = 50;
|
||||
SetScrollInfo(hScroll, SB_CTL, &si, TRUE);
|
||||
ret = IsWindowEnabled(hScroll);
|
||||
todo_wine
|
||||
ok(ret, "Unexpected enabled state.\n");
|
||||
|
||||
si.fMask = SIF_POS|SIF_RANGE|SIF_PAGE|SIF_DISABLENOSCROLL;
|
||||
|
@ -657,7 +656,6 @@ todo_wine
|
|||
si.nPage = 100;
|
||||
SetScrollInfo(hScroll, SB_CTL, &si, TRUE);
|
||||
ret = IsWindowEnabled(hScroll);
|
||||
todo_wine
|
||||
ok(!ret, "Unexpected enabled state.\n");
|
||||
|
||||
EnableScrollBar(hScroll, SB_CTL, ESB_DISABLE_BOTH);
|
||||
|
@ -671,7 +669,6 @@ todo_wine
|
|||
si.nPage = 41;
|
||||
SetScrollInfo(hScroll, SB_CTL, &si, TRUE);
|
||||
ret = IsWindowEnabled(hScroll);
|
||||
todo_wine
|
||||
ok(ret, "Unexpected enabled state.\n");
|
||||
|
||||
DestroyWindow(hScroll);
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include "windef.h"
|
||||
#include "wine/winbase16.h"
|
||||
#include "winternl.h"
|
||||
#include "winuser.h"
|
||||
#include "winver.h"
|
||||
#include "lzexpand.h"
|
||||
#include "wine/debug.h"
|
||||
|
@ -461,22 +462,23 @@ DWORD WINAPI GetFileResource16( LPCSTR lpszFileName, LPCSTR lpszResType,
|
|||
/*************************************************************************
|
||||
* 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 );
|
||||
return GetFileVersionInfoSizeA( lpszFileName, lpdwHandle );
|
||||
DWORD offset;
|
||||
|
||||
TRACE("(%s, %p)\n", debugstr_a(filename), handle );
|
||||
|
||||
return GetFileResourceSize16( filename, (LPCSTR)RT_VERSION, (LPCSTR)VS_VERSION_INFO, &offset );
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* GetFileVersionInfo [VER.7]
|
||||
*/
|
||||
DWORD WINAPI GetFileVersionInfo16( LPCSTR lpszFileName, DWORD handle,
|
||||
DWORD cbBuf, LPVOID lpvData )
|
||||
DWORD WINAPI GetFileVersionInfo16( LPCSTR filename, DWORD handle, DWORD datasize, LPVOID data )
|
||||
{
|
||||
TRACE("(%s, %08x, %d, %p)\n",
|
||||
debugstr_a(lpszFileName), handle, cbBuf, lpvData );
|
||||
TRACE("(%s, %08x, %d, %p)\n", debugstr_a(filename), handle, datasize, data );
|
||||
|
||||
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[] =
|
||||
{
|
||||
{ prop_nameW, CIM_STRING },
|
||||
{ prop_pixelsperxlogicalinchW, CIM_UINT32 }
|
||||
};
|
||||
static const struct column col_directory[] =
|
||||
|
@ -1022,6 +1023,7 @@ struct record_datafile
|
|||
};
|
||||
struct record_desktopmonitor
|
||||
{
|
||||
const WCHAR *name;
|
||||
UINT32 pixelsperxlogicalinch;
|
||||
};
|
||||
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;
|
||||
|
||||
rec = (struct record_desktopmonitor *)table->data;
|
||||
rec->name = L"Generic Non-PnP Monitor";
|
||||
rec->pixelsperxlogicalinch = get_pixelsperxlogicalinch();
|
||||
|
||||
if (match_row( table, row, cond, &status )) row++;
|
||||
|
|
|
@ -35,6 +35,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(wbemprox);
|
|||
|
||||
static HINSTANCE instance;
|
||||
|
||||
struct list *table_list;
|
||||
|
||||
typedef HRESULT (*fnCreateInstance)( LPVOID *ppObj );
|
||||
|
||||
typedef struct
|
||||
|
|
|
@ -1710,6 +1710,32 @@ static void test_Win32_WinSAT( IWbemServices *services )
|
|||
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 const WCHAR bitsperpixelW[] =
|
||||
|
@ -1835,6 +1861,7 @@ START_TEST(query)
|
|||
test_Win32_ComputerSystem( services );
|
||||
test_Win32_ComputerSystemProduct( services );
|
||||
test_Win32_Bios( services );
|
||||
test_Win32_DesktopMonitor( services );
|
||||
test_Win32_DisplayControllerConfiguration( services );
|
||||
test_Win32_IP4RouteTable( services );
|
||||
test_Win32_OperatingSystem( services );
|
||||
|
|
|
@ -20,8 +20,8 @@
|
|||
#include "wine/heap.h"
|
||||
#include "wine/list.h"
|
||||
|
||||
IClientSecurity client_security DECLSPEC_HIDDEN;
|
||||
struct list *table_list DECLSPEC_HIDDEN;
|
||||
extern IClientSecurity client_security DECLSPEC_HIDDEN;
|
||||
extern struct list *table_list DECLSPEC_HIDDEN;
|
||||
|
||||
enum param_direction
|
||||
{
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#include "winhttp.h"
|
||||
|
||||
_locale_t c_locale DECLSPEC_HIDDEN;
|
||||
extern _locale_t c_locale DECLSPEC_HIDDEN;
|
||||
|
||||
#define STREAM_BUFSIZE 4096
|
||||
|
||||
|
@ -50,8 +50,8 @@ struct dictionary
|
|||
ULONG current_sequence;
|
||||
ULONG *sequence;
|
||||
};
|
||||
struct dictionary dict_builtin DECLSPEC_HIDDEN;
|
||||
const struct dictionary dict_builtin_static DECLSPEC_HIDDEN;
|
||||
extern struct dictionary dict_builtin DECLSPEC_HIDDEN;
|
||||
extern const struct dictionary dict_builtin_static 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;
|
||||
|
|
|
@ -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;
|
||||
BOOL is_xbox_gamepad(WORD vid, WORD pid) DECLSPEC_HIDDEN;
|
||||
|
||||
HANDLE driver_key DECLSPEC_HIDDEN;
|
||||
DEVICE_OBJECT *bus_pdo DECLSPEC_HIDDEN;
|
||||
extern HANDLE driver_key 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 2060", CARD_NVIDIA_GEFORCE_RTX2060}, /* GeForce 2000 - 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 X (Pascal)", CARD_NVIDIA_TITANX_PASCAL}, /* GeForce 1000 - highend */
|
||||
{"GTX 1080 Ti", CARD_NVIDIA_GEFORCE_GTX1080TI}, /* GeForce 1000 - highend */
|
||||
{"GTX 1080", CARD_NVIDIA_GEFORCE_GTX1080}, /* 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 1050 Ti", CARD_NVIDIA_GEFORCE_GTX1050TI}, /* 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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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_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_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_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_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_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_RTX2060, "NVIDIA GeForce RTX 2060", DRIVER_NVIDIA_GEFORCE8, 6144},
|
||||
{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;
|
||||
}
|
||||
|
||||
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",
|
||||
stage, WINED3D_MAX_TEXTURES);
|
||||
stage, WINED3D_MAX_TEXTURES - 1);
|
||||
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_RENDERTARGET | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE,
|
||||
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,
|
||||
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},
|
||||
{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,
|
||||
WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
|
||||
| WINED3DFMT_FLAG_RENDERTARGET,
|
||||
| WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_SRGB_READ,
|
||||
ARB_ES2_COMPATIBILITY, NULL},
|
||||
{WINED3DFMT_B5G5R5X1_UNORM, GL_RGB5, GL_RGB5, 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_GTX1050 = 0x1c81,
|
||||
CARD_NVIDIA_GEFORCE_GTX1050TI = 0x1c82,
|
||||
CARD_NVIDIA_GEFORCE_GTX1060_3GB = 0x1c02,
|
||||
CARD_NVIDIA_GEFORCE_GTX1060 = 0x1c03,
|
||||
CARD_NVIDIA_GEFORCE_GTX1070 = 0x1b81,
|
||||
CARD_NVIDIA_GEFORCE_GTX1080 = 0x1b80,
|
||||
CARD_NVIDIA_GEFORCE_GTX1080TI = 0x1b06,
|
||||
CARD_NVIDIA_TITANX_PASCAL = 0x1b00,
|
||||
CARD_NVIDIA_TITANV = 0x1d81,
|
||||
CARD_NVIDIA_GEFORCE_GTX1650SUPER= 0x2187,
|
||||
CARD_NVIDIA_GEFORCE_GTX1660SUPER= 0x21c4,
|
||||
CARD_NVIDIA_GEFORCE_GTX1660TI = 0x2182,
|
||||
CARD_NVIDIA_GEFORCE_RTX2060 = 0x1f08,
|
||||
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);
|
||||
|
||||
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);
|
||||
pthread_mutex_destroy(&surface->mutex);
|
||||
HeapFree(GetProcessHeap(), 0, surface);
|
||||
|
|
|
@ -26,8 +26,8 @@ typedef struct _xinput_controller
|
|||
XINPUT_VIBRATION vibration;
|
||||
} xinput_controller;
|
||||
|
||||
CRITICAL_SECTION xinput_crit;
|
||||
xinput_controller controllers[XUSER_MAX_COUNT];
|
||||
extern CRITICAL_SECTION xinput_crit;
|
||||
extern xinput_controller controllers[XUSER_MAX_COUNT];
|
||||
|
||||
void HID_find_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
|
||||
{
|
||||
BM_x555RGB = 0x00,
|
||||
BM_565RGB = 0x01,
|
||||
BM_RGBTRIPLETS = 0x02,
|
||||
BM_BGRTRIPLETS = 0x04,
|
||||
BM_xRGBQUADS = 0x08,
|
||||
BM_10b_RGB = 0x09,
|
||||
BM_16b_RGB = 0x0a,
|
||||
BM_xBGRQUADS = 0x10,
|
||||
BM_CMYKQUADS = 0x20,
|
||||
BM_x555XYZ = 0x101,
|
||||
BM_x555RGB = 0x0000,
|
||||
BM_565RGB = 0x0001,
|
||||
BM_RGBTRIPLETS = 0x0002,
|
||||
BM_BGRTRIPLETS = 0x0004,
|
||||
BM_xRGBQUADS = 0x0008,
|
||||
BM_10b_RGB = 0x0009,
|
||||
BM_16b_RGB = 0x000a,
|
||||
BM_xBGRQUADS = 0x0010,
|
||||
BM_CMYKQUADS = 0x0020,
|
||||
BM_x555XYZ = 0x0101,
|
||||
BM_x555Yxz,
|
||||
BM_x555Lab,
|
||||
BM_x555G3CH,
|
||||
BM_XYZTRIPLETS = 0x201,
|
||||
BM_XYZTRIPLETS = 0x0201,
|
||||
BM_YxyTRIPLETS,
|
||||
BM_LabTRIPLETS,
|
||||
BM_G3CHTRIPLETS,
|
||||
|
@ -159,21 +159,28 @@ typedef enum
|
|||
BM_7CHANNEL,
|
||||
BM_8CHANNEL,
|
||||
BM_GRAY,
|
||||
BM_xXYZQUADS = 0x301,
|
||||
BM_xXYZQUADS = 0x0301,
|
||||
BM_xYxyQUADS,
|
||||
BM_xLabQUADS,
|
||||
BM_xG3CHQUADS,
|
||||
BM_KYMCQUADS,
|
||||
BM_10b_XYZ = 0x401,
|
||||
BM_10b_XYZ = 0x0401,
|
||||
BM_10b_Yxy,
|
||||
BM_10b_Lab,
|
||||
BM_10b_G3CH,
|
||||
BM_NAMED_INDEX,
|
||||
BM_16b_XYZ = 0x501,
|
||||
BM_16b_XYZ = 0x0501,
|
||||
BM_16b_Yxy,
|
||||
BM_16b_Lab,
|
||||
BM_16b_G3CH,
|
||||
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;
|
||||
|
||||
typedef enum
|
||||
|
@ -182,6 +189,36 @@ typedef enum
|
|||
WCS_PROFILE_MANAGEMENT_SCOPE_CURRENT_USER
|
||||
} 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 PBMCALLBACKFN LPPBMCALLBACKFN;
|
||||
|
||||
|
@ -190,6 +227,38 @@ typedef PBMCALLBACKFN LPPBMCALLBACKFN;
|
|||
#define INTENT_SATURATION 2
|
||||
#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
|
||||
{
|
||||
DWORD phSize;
|
||||
|
@ -268,23 +337,43 @@ typedef struct tagENUMTYPEW
|
|||
DWORD dwDeviceClass;
|
||||
} ENUMTYPEW, *PENUMTYPEW, *LPENUMTYPEW;
|
||||
|
||||
#define ET_DEVICENAME 0x00000001
|
||||
#define ET_MEDIATYPE 0x00000002
|
||||
#define ET_DITHERMODE 0x00000004
|
||||
#define ET_RESOLUTION 0x00000008
|
||||
#define ET_CMMTYPE 0x00000010
|
||||
#define ET_CLASS 0x00000020
|
||||
#define ET_DATACOLORSPACE 0x00000040
|
||||
#define ET_CONNECTIONSPACE 0x00000080
|
||||
#define ET_SIGNATURE 0x00000100
|
||||
#define ET_PLATFORM 0x00000200
|
||||
#define ET_PROFILEFLAGS 0x00000400
|
||||
#define ET_MANUFACTURER 0x00000800
|
||||
#define ET_MODEL 0x00001000
|
||||
#define ET_ATTRIBUTES 0x00002000
|
||||
#define ET_RENDERINGINTENT 0x00004000
|
||||
#define ET_CREATOR 0x00008000
|
||||
#define ET_DEVICECLASS 0x00010000
|
||||
#define ET_DEVICENAME 0x00000001
|
||||
#define ET_MEDIATYPE 0x00000002
|
||||
#define ET_DITHERMODE 0x00000004
|
||||
#define ET_RESOLUTION 0x00000008
|
||||
#define ET_CMMTYPE 0x00000010
|
||||
#define ET_CLASS 0x00000020
|
||||
#define ET_DATACOLORSPACE 0x00000040
|
||||
#define ET_CONNECTIONSPACE 0x00000080
|
||||
#define ET_SIGNATURE 0x00000100
|
||||
#define ET_PLATFORM 0x00000200
|
||||
#define ET_PROFILEFLAGS 0x00000400
|
||||
#define ET_MANUFACTURER 0x00000800
|
||||
#define ET_MODEL 0x00001000
|
||||
#define ET_ATTRIBUTES 0x00002000
|
||||
#define ET_RENDERINGINTENT 0x00004000
|
||||
#define ET_CREATOR 0x00008000
|
||||
#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 _tagCOLORMATCHSETUPW;
|
||||
|
@ -410,6 +499,8 @@ BOOL WINAPI UnregisterCMMA(PCSTR,DWORD);
|
|||
BOOL WINAPI UnregisterCMMW(PCWSTR,DWORD);
|
||||
#define UnregisterCMM WINELIB_NAME_AW(UnregisterCMM)
|
||||
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*);
|
||||
HPROFILE WINAPI WcsOpenColorProfileA(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_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_Lab 0x4C616220 /* 'Lab ' */
|
||||
#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
|
||||
{
|
||||
adCreateCollection = 0x00002000,
|
||||
adCreateStructDoc = 0x80000000,
|
||||
adCreateNonCollection = 0x00000000,
|
||||
adOpenIfExists = 0x02000000,
|
||||
adCreateOverwrite = 0x04000000,
|
||||
adFailIfNotExists = -1
|
||||
adCreateCollection = (int) 0x00002000,
|
||||
adCreateStructDoc = (int) 0x80000000,
|
||||
adCreateNonCollection = (int) 0x00000000,
|
||||
adOpenIfExists = (int) 0x02000000,
|
||||
adCreateOverwrite = (int) 0x04000000,
|
||||
adFailIfNotExists = (int) -1
|
||||
} RecordCreateOptionsEnum;
|
||||
|
||||
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
|
||||
{
|
||||
tomFalse = 0,
|
||||
tomTrue = -1,
|
||||
tomUndefined = -9999999,
|
||||
tomToggle = -9999998,
|
||||
tomAutoColor = -9999997,
|
||||
tomDefault = -9999996,
|
||||
tomSuspend = -9999995,
|
||||
tomResume = -9999994,
|
||||
tomFalse = (int) 0,
|
||||
tomTrue = (int) -1,
|
||||
tomUndefined = (int) -9999999,
|
||||
tomToggle = (int) -9999998,
|
||||
tomAutoColor = (int) -9999997,
|
||||
tomDefault = (int) -9999996,
|
||||
tomSuspend = (int) -9999995,
|
||||
tomResume = (int) -9999994,
|
||||
|
||||
/* ITextFont::Reset() modes */
|
||||
tomApplyNow = 0,
|
||||
tomApplyLater = 1,
|
||||
tomTrackParms = 2,
|
||||
tomCacheParms = 3,
|
||||
tomApplyTmp = 4,
|
||||
tomDisableSmartFont = 8,
|
||||
tomEnableSmartFont = 9,
|
||||
tomUsePoints = 10,
|
||||
tomUseTwips = 11,
|
||||
tomApplyNow = (int) 0,
|
||||
tomApplyLater = (int) 1,
|
||||
tomTrackParms = (int) 2,
|
||||
tomCacheParms = (int) 3,
|
||||
tomApplyTmp = (int) 4,
|
||||
tomDisableSmartFont = (int) 8,
|
||||
tomEnableSmartFont = (int) 9,
|
||||
tomUsePoints = (int) 10,
|
||||
tomUseTwips = (int) 11,
|
||||
|
||||
tomBackward = 0xc0000001,
|
||||
tomForward = 0x3fffffff,
|
||||
tomMove = 0,
|
||||
tomExtend = 1,
|
||||
tomNoSelection = 0,
|
||||
tomSelectionIP = 1,
|
||||
tomSelectionNormal = 2,
|
||||
tomSelectionFrame = 3,
|
||||
tomSelectionColumn = 4,
|
||||
tomSelectionRow = 5,
|
||||
tomSelectionBlock = 6,
|
||||
tomSelectionInlineShape = 7,
|
||||
tomSelectionShape = 8,
|
||||
tomSelStartActive = 1,
|
||||
tomSelAtEOL = 2,
|
||||
tomSelOvertype = 4,
|
||||
tomSelActive = 8,
|
||||
tomSelReplace = 16,
|
||||
tomEnd = 0,
|
||||
tomStart = 32,
|
||||
tomCollapseEnd = 0,
|
||||
tomCollapseStart = 1,
|
||||
tomClientCoord = 256,
|
||||
tomNone = 0,
|
||||
tomSingle = 1,
|
||||
tomWords = 2,
|
||||
tomDouble = 3,
|
||||
tomDotted = 4,
|
||||
tomDash = 5,
|
||||
tomDashDot = 6,
|
||||
tomDashDotDot = 7,
|
||||
tomWave = 8,
|
||||
tomThick = 9,
|
||||
tomHair = 10,
|
||||
tomLineSpaceSingle = 0,
|
||||
tomLineSpace1pt5 = 1,
|
||||
tomLineSpaceDouble = 2,
|
||||
tomLineSpaceAtLeast = 3,
|
||||
tomLineSpaceExactly = 4,
|
||||
tomLineSpaceMultiple = 5,
|
||||
tomAlignLeft = 0,
|
||||
tomAlignCenter = 1,
|
||||
tomAlignRight = 2,
|
||||
tomAlignJustify = 3,
|
||||
tomAlignDecimal = 3,
|
||||
tomAlignBar = 4,
|
||||
tomAlignInterWord = 3,
|
||||
tomAlignInterLetter = 4,
|
||||
tomAlignScaled = 5,
|
||||
tomAlignGlyphs = 6,
|
||||
tomAlignSnapGrid = 7,
|
||||
tomSpaces = 0,
|
||||
tomDots = 1,
|
||||
tomDashes = 2,
|
||||
tomLines = 3,
|
||||
tomThickLines = 4,
|
||||
tomEquals = 5,
|
||||
tomTabBack = -3,
|
||||
tomTabNext = -2,
|
||||
tomTabHere = -1,
|
||||
tomListBullet = 1,
|
||||
tomListNumberAsArabic = 2,
|
||||
tomListNumberAsLCLetter = 3,
|
||||
tomListNumberAsUCLetter = 4,
|
||||
tomListNumberAsLCRoman = 5,
|
||||
tomListNumberAsUCRoman = 6,
|
||||
tomListNumberAsSequence = 7,
|
||||
tomListParentheses = 0x10000,
|
||||
tomListPeriod = 0x20000,
|
||||
tomListPlain = 0x30000,
|
||||
tomCharacter = 1,
|
||||
tomWord = 2,
|
||||
tomSentence = 3,
|
||||
tomParagraph = 4,
|
||||
tomLine = 5,
|
||||
tomStory = 6,
|
||||
tomScreen = 7,
|
||||
tomSection = 8,
|
||||
tomColumn = 9,
|
||||
tomRow = 10,
|
||||
tomWindow = 11,
|
||||
tomCell = 12,
|
||||
tomCharFormat = 13,
|
||||
tomParaFormat = 14,
|
||||
tomTable = 15,
|
||||
tomObject = 16,
|
||||
tomMatchWord = 2,
|
||||
tomMatchCase = 4,
|
||||
tomMatchPattern = 8,
|
||||
tomBackward = (int) 0xc0000001,
|
||||
tomForward = (int) 0x3fffffff,
|
||||
tomMove = (int) 0,
|
||||
tomExtend = (int) 1,
|
||||
tomNoSelection = (int) 0,
|
||||
tomSelectionIP = (int) 1,
|
||||
tomSelectionNormal = (int) 2,
|
||||
tomSelectionFrame = (int) 3,
|
||||
tomSelectionColumn = (int) 4,
|
||||
tomSelectionRow = (int) 5,
|
||||
tomSelectionBlock = (int) 6,
|
||||
tomSelectionInlineShape = (int) 7,
|
||||
tomSelectionShape = (int) 8,
|
||||
tomSelStartActive = (int) 1,
|
||||
tomSelAtEOL = (int) 2,
|
||||
tomSelOvertype = (int) 4,
|
||||
tomSelActive = (int) 8,
|
||||
tomSelReplace = (int) 16,
|
||||
tomEnd = (int) 0,
|
||||
tomStart = (int) 32,
|
||||
tomCollapseEnd = (int) 0,
|
||||
tomCollapseStart = (int) 1,
|
||||
tomClientCoord = (int) 256,
|
||||
tomNone = (int) 0,
|
||||
tomSingle = (int) 1,
|
||||
tomWords = (int) 2,
|
||||
tomDouble = (int) 3,
|
||||
tomDotted = (int) 4,
|
||||
tomDash = (int) 5,
|
||||
tomDashDot = (int) 6,
|
||||
tomDashDotDot = (int) 7,
|
||||
tomWave = (int) 8,
|
||||
tomThick = (int) 9,
|
||||
tomHair = (int) 10,
|
||||
tomLineSpaceSingle = (int) 0,
|
||||
tomLineSpace1pt5 = (int) 1,
|
||||
tomLineSpaceDouble = (int) 2,
|
||||
tomLineSpaceAtLeast = (int) 3,
|
||||
tomLineSpaceExactly = (int) 4,
|
||||
tomLineSpaceMultiple = (int) 5,
|
||||
tomAlignLeft = (int) 0,
|
||||
tomAlignCenter = (int) 1,
|
||||
tomAlignRight = (int) 2,
|
||||
tomAlignJustify = (int) 3,
|
||||
tomAlignDecimal = (int) 3,
|
||||
tomAlignBar = (int) 4,
|
||||
tomAlignInterWord = (int) 3,
|
||||
tomAlignInterLetter = (int) 4,
|
||||
tomAlignScaled = (int) 5,
|
||||
tomAlignGlyphs = (int) 6,
|
||||
tomAlignSnapGrid = (int) 7,
|
||||
tomSpaces = (int) 0,
|
||||
tomDots = (int) 1,
|
||||
tomDashes = (int) 2,
|
||||
tomLines = (int) 3,
|
||||
tomThickLines = (int) 4,
|
||||
tomEquals = (int) 5,
|
||||
tomTabBack = (int) -3,
|
||||
tomTabNext = (int) -2,
|
||||
tomTabHere = (int) -1,
|
||||
tomListBullet = (int) 1,
|
||||
tomListNumberAsArabic = (int) 2,
|
||||
tomListNumberAsLCLetter = (int) 3,
|
||||
tomListNumberAsUCLetter = (int) 4,
|
||||
tomListNumberAsLCRoman = (int) 5,
|
||||
tomListNumberAsUCRoman = (int) 6,
|
||||
tomListNumberAsSequence = (int) 7,
|
||||
tomListParentheses = (int) 0x10000,
|
||||
tomListPeriod = (int) 0x20000,
|
||||
tomListPlain = (int) 0x30000,
|
||||
tomCharacter = (int) 1,
|
||||
tomWord = (int) 2,
|
||||
tomSentence = (int) 3,
|
||||
tomParagraph = (int) 4,
|
||||
tomLine = (int) 5,
|
||||
tomStory = (int) 6,
|
||||
tomScreen = (int) 7,
|
||||
tomSection = (int) 8,
|
||||
tomColumn = (int) 9,
|
||||
tomRow = (int) 10,
|
||||
tomWindow = (int) 11,
|
||||
tomCell = (int) 12,
|
||||
tomCharFormat = (int) 13,
|
||||
tomParaFormat = (int) 14,
|
||||
tomTable = (int) 15,
|
||||
tomObject = (int) 16,
|
||||
tomMatchWord = (int) 2,
|
||||
tomMatchCase = (int) 4,
|
||||
tomMatchPattern = (int) 8,
|
||||
|
||||
/* ITextRange story type values */
|
||||
tomUnknownStory = 0,
|
||||
tomMainTextStory = 1,
|
||||
tomFootnotesStory = 2,
|
||||
tomEndnotesStory = 3,
|
||||
tomCommentsStory = 4,
|
||||
tomTextFrameStory = 5,
|
||||
tomEvenPagesHeaderStory = 6,
|
||||
tomPrimaryHeaderStory = 7,
|
||||
tomEvenPagesFooterStory = 8,
|
||||
tomPrimaryFooterStory = 9,
|
||||
tomFirstPageHeaderStory = 10,
|
||||
tomFirstPageFooterStory = 11,
|
||||
tomUnknownStory = (int) 0,
|
||||
tomMainTextStory = (int) 1,
|
||||
tomFootnotesStory = (int) 2,
|
||||
tomEndnotesStory = (int) 3,
|
||||
tomCommentsStory = (int) 4,
|
||||
tomTextFrameStory = (int) 5,
|
||||
tomEvenPagesHeaderStory = (int) 6,
|
||||
tomPrimaryHeaderStory = (int) 7,
|
||||
tomEvenPagesFooterStory = (int) 8,
|
||||
tomPrimaryFooterStory = (int) 9,
|
||||
tomFirstPageHeaderStory = (int) 10,
|
||||
tomFirstPageFooterStory = (int) 11,
|
||||
|
||||
/* ITextFont animation property */
|
||||
tomNoAnimation = 0,
|
||||
tomLasVegasLights = 1,
|
||||
tomBlinkingBackground = 2,
|
||||
tomSparkleText = 3,
|
||||
tomMarchingBlackAnts = 4,
|
||||
tomMarchingRedAnts = 5,
|
||||
tomShimmer = 6,
|
||||
tomWipeDown = 7,
|
||||
tomWipeRight = 8,
|
||||
tomAnimationMax = 8,
|
||||
tomNoAnimation = (int) 0,
|
||||
tomLasVegasLights = (int) 1,
|
||||
tomBlinkingBackground = (int) 2,
|
||||
tomSparkleText = (int) 3,
|
||||
tomMarchingBlackAnts = (int) 4,
|
||||
tomMarchingRedAnts = (int) 5,
|
||||
tomShimmer = (int) 6,
|
||||
tomWipeDown = (int) 7,
|
||||
tomWipeRight = (int) 8,
|
||||
tomAnimationMax = (int) 8,
|
||||
|
||||
tomLowerCase = 0,
|
||||
tomUpperCase = 1,
|
||||
tomTitleCase = 2,
|
||||
tomSentenceCase = 4,
|
||||
tomToggleCase = 5,
|
||||
tomReadOnly = 0x100,
|
||||
tomShareDenyRead = 0x200,
|
||||
tomShareDenyWrite = 0x400,
|
||||
tomPasteFile = 0x1000,
|
||||
tomCreateNew = 0x10,
|
||||
tomCreateAlways = 0x20,
|
||||
tomOpenExisting = 0x30,
|
||||
tomOpenAlways = 0x40,
|
||||
tomTruncateExisting = 0x50,
|
||||
tomRTF = 0x1,
|
||||
tomText = 0x2,
|
||||
tomHTML = 0x3,
|
||||
tomWordDocument = 0x4,
|
||||
tomBold = 0x80000001,
|
||||
tomItalic = 0x80000002,
|
||||
tomUnderline = 0x80000004,
|
||||
tomStrikeout = 0x80000008,
|
||||
tomProtected = 0x80000010,
|
||||
tomLink = 0x80000020,
|
||||
tomSmallCaps = 0x80000040,
|
||||
tomAllCaps = 0x80000080,
|
||||
tomHidden = 0x80000100,
|
||||
tomOutline = 0x80000200,
|
||||
tomShadow = 0x80000400,
|
||||
tomEmboss = 0x80000800,
|
||||
tomImprint = 0x80001000,
|
||||
tomDisabled = 0x80002000,
|
||||
tomRevised = 0x80004000,
|
||||
tomNormalCaret = 0,
|
||||
tomKoreanBlockCaret = 0x1,
|
||||
tomIncludeInset = 0x1,
|
||||
tomIgnoreCurrentFont = 0,
|
||||
tomMatchFontCharset = 0x1,
|
||||
tomMatchFontSignature = 0x2,
|
||||
tomCharset = 0x80000000,
|
||||
tomRE10Mode = 0x1,
|
||||
tomNoIME = 0x80000,
|
||||
tomSelfIME = 0x40000
|
||||
tomLowerCase = (int) 0,
|
||||
tomUpperCase = (int) 1,
|
||||
tomTitleCase = (int) 2,
|
||||
tomSentenceCase = (int) 4,
|
||||
tomToggleCase = (int) 5,
|
||||
tomReadOnly = (int) 0x100,
|
||||
tomShareDenyRead = (int) 0x200,
|
||||
tomShareDenyWrite = (int) 0x400,
|
||||
tomPasteFile = (int) 0x1000,
|
||||
tomCreateNew = (int) 0x10,
|
||||
tomCreateAlways = (int) 0x20,
|
||||
tomOpenExisting = (int) 0x30,
|
||||
tomOpenAlways = (int) 0x40,
|
||||
tomTruncateExisting = (int) 0x50,
|
||||
tomRTF = (int) 0x1,
|
||||
tomText = (int) 0x2,
|
||||
tomHTML = (int) 0x3,
|
||||
tomWordDocument = (int) 0x4,
|
||||
tomBold = (int) 0x80000001,
|
||||
tomItalic = (int) 0x80000002,
|
||||
tomUnderline = (int) 0x80000004,
|
||||
tomStrikeout = (int) 0x80000008,
|
||||
tomProtected = (int) 0x80000010,
|
||||
tomLink = (int) 0x80000020,
|
||||
tomSmallCaps = (int) 0x80000040,
|
||||
tomAllCaps = (int) 0x80000080,
|
||||
tomHidden = (int) 0x80000100,
|
||||
tomOutline = (int) 0x80000200,
|
||||
tomShadow = (int) 0x80000400,
|
||||
tomEmboss = (int) 0x80000800,
|
||||
tomImprint = (int) 0x80001000,
|
||||
tomDisabled = (int) 0x80002000,
|
||||
tomRevised = (int) 0x80004000,
|
||||
tomNormalCaret = (int) 0,
|
||||
tomKoreanBlockCaret = (int) 0x1,
|
||||
tomIncludeInset = (int) 0x1,
|
||||
tomIgnoreCurrentFont = (int) 0,
|
||||
tomMatchFontCharset = (int) 0x1,
|
||||
tomMatchFontSignature = (int) 0x2,
|
||||
tomCharset = (int) 0x80000000,
|
||||
tomRE10Mode = (int) 0x1,
|
||||
tomNoIME = (int) 0x80000,
|
||||
tomSelfIME = (int) 0x40000
|
||||
} tomConstants;
|
||||
|
||||
interface ITextRange;
|
||||
|
|
|
@ -23,7 +23,7 @@ import "ocidl.idl";
|
|||
|
||||
[
|
||||
uuid(1ff70682-0a51-30e8-076d-740be8cee98b),
|
||||
implicit_handle(handle_t rpc_handle),
|
||||
implicit_handle(handle_t atsvc_handle),
|
||||
version(1.0),
|
||||
pointer_default(unique)
|
||||
]
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue