The Wine team is proud to announce that the stable release Wine 1.6
is now available.

This release represents 16 months of development effort and around
10,000 individual changes. The main highlights are the new Mac driver,
the full support for window transparency, and the new Mono package for
.NET applications support.

It also contains a lot of improvements across the board, as well as
support for many new applications and games. See the release notes
below for a summary of the major changes.

The source is available from the following locations:

  http://prdownloads.sourceforge.net/wine/wine-1.6.tar.bz2
  http://mirrors.ibiblio.org/wine/source/1.6/wine-1.6.tar.bz2

Binary packages for various distributions will be available from:

  http://www.winehq.org/download

You will find documentation on http://www.winehq.org/documentation

You can also get the current source directly from the git
repository. Check http://www.winehq.org/git for details.

Wine is available thanks to the work of many people. See the file
AUTHORS in the distribution for the complete list.

----------------------------------------------------------------

What's new in Wine 1.6
======================


*** User interface

- Window transparency is supported, including both color keying and
  alpha blending transparency.

- All window rendering is done on the client-side using the DIB engine
  (except for OpenGL rendering). This means that rendering to windows
  or bitmaps gives identical results.

- Common dialogs correctly scale with the screen DPI resolution.

- In virtual desktop mode, shortcuts placed in the Desktop folder are
  displayed on the desktop, and can be used to launch applications.

- The HTML Help control has better support for non-ASCII characters,
  and for multiple help windows.

- Custom painting and images are better supported in listview
  controls.

- Input validation is improved in the date and calendar controls.


*** Mac driver

- A native Mac OS X driver is implemented, for better integration with
  the Mac desktop environment. The full range of driver features are
  supported, including OpenGL, window management, clipboard, drag &
  drop, system tray, etc.

- X11 is no longer needed on Mac OS X, but the X11 driver is still
  supported, e.g. when running remotely.

Note: the Mac driver requires Mac OS X 10.6 or later, it cannot be
      built or used on 10.5.

- FontConfig is no longer needed on Mac OS X and is disabled by
  default, system fonts are enumerated using the Core Text API
  instead.


*** X11 driver

- X11 server-side font rendering is no longer supported. All fonts are
  rendered client-side using FreeType.

- The big lock around all X11 calls has been removed, we rely on the X
  libraries internal locking for thread safety.

- XRandR versions 1.2 and 1.3 are supported.


*** Graphics

- There are significant performance improvements in the DIB engine,
  particularly for text rendering, bitmap stretching, alpha blending,
  and gradients.

- Bounds tracking is supported for all graphics primitives, to enable
  copying only the modified portions of a bitmap.

- OpenGL rendering is supported in device-independent bitmaps using libOSMesa.

- Brush dithering is implemented in the DIB engine.

- Path gradients are implemented in GdiPlus.

- More image codecs features are implemented, including JPEG encoding,
  palette formats, and meta-data support for various image types.


*** Text and fonts

- Sub-pixel font anti-aliasing is supported in the DIB engine, using
  the system anti-aliasing configuration from FontConfig.

- Dynamic loading of scalable font resources is supported.

- Text layout in Uniscribe supports character-specific position
  adjustments. Right-to-left text handling is also improved.

- There is an initial implementation of the DirectWrite text layout
  engine.

- Built-in fonts are more complete, with the addition of FixedSys and
  Wingdings fonts, more high-resolution pixel fonts, and a wider range
  of glyphs in the existing fonts, notably Arabic glyphs in Tahoma.

- Bi-directional text support is improved in the RichEdit control.


*** Input devices

- The raw input API is supported for keyboard and mouse input.

- There is a joystick applet in the control panel, to allow
  configuring joysticks and testing their behavior.

- Force feedback is supported for Mac OS X joysticks.


*** Kernel

- DOSBox is tried first when running a DOS application. The Wine DOS
  support is only used as a fallback when DOSBox cannot be found, and
  will be removed in a future release.

- A monotonic time counter is used on platforms that support it, to
  make timers more robust against system time changes.

- File times are reported with nanosecond resolution.

- Wine can be configured to report the Windows version as 'Windows 8'.


*** .NET support

- The Mono runtime is packaged as an MSI file, and its installation
  can be managed from the "Add/Remove Programs" control panel. It is
  automatically installed on Wine prefix updates.

- .NET mixed mode assemblies are supported.

- The Microsoft .NET 4.0 runtime can be installed for cases where Mono
  is not good enough yet.


*** OLE / COM

- The typelib writer is reimplemented for better compatibility.

- OLE DB supports more data types and conversions.

- OLE automation manages a cache of string allocations for better
  performance and compatibility.


*** Internet and networking

- HTTPS connections use GnuTLS (or Secure Transport on Mac OS X).
  OpenSSL is no longer used.

- The TLS 1.1 and TLS 1.2 protocols are enabled by default, with
  automatic fallback to TLS 1.0. The SSL2 protocol is disabled by
  default.

- Security certificate validation errors are handled better.

- NTLM and Negotiate authentication protocols are supported.

- ActiveX controls can be downloaded and installed automatically.

- Internet proxy bypass is supported, and can be enabled either
  through the registry or with the no_proxy environment variable.

- Broadcast packets can be received on interface-bound sockets, which
  is needed for some networked multi-player games.

- The Server Name Indication TLS extension is supported.

- Persistent cookies are supported, and URL cache files are managed
  better. The Internet control panel allows clearing saved cookies and
  cache files.

- Punycode encoding for Internationalized Domain Names is supported.

- JavaScript performance is improved. The built-in JavaScript engine
  is preferred over the Gecko one in most cases.

- Many more built-in functions of VBScript are implemented. Regular
  expressions are also supported.

- The Gecko engine is updated to the version from Firefox 21.

- The Gecko and Mono installers are cached upon download, to allow
  installation in multiple Wine prefixes without additional downloads.


*** Direct3D

- The Direct3D 9Ex implementation is more complete. In particular:
  - IDirect3DDevice9Ex::PresentEx is implemented.
  - IDirect3DDevice9Ex::ResetEx is implemented.
  - Various Direct3D 9Ex display mode handling functions are implemented.
  - Direct3D 9Ex style video memory accounting is implemented.

- Like the X11 driver, WineD3D no longer uses the big X11 lock when
  making GL calls.

- The WineD3D graphics card database is updated to recognize more
  graphics cards.

- The fallback card detection code for unrecognized graphics cards is
  improved. This results in a more reasonable card being reported when
  the graphics card is not already in the WineD3D database.

- WineD3D has GLSL based implementations of Direct3D fixed-function
  vertex and fragment processing. In some cases this allows
  functionality that's not present in fixed-function OpenGL to be
  implemented, in other cases it allows functionality to be
  implemented in a more efficient way.

- On drivers that support it, GL_ARB_debug_output is used to get more
  detailed debugging output from the OpenGL driver.

- On drivers that support it, GL_ARB_framebuffer_sRGB is used for
  rendering to frame buffers in the sRGB color space.

- On drivers that support it, GL_ARB_instanced_arrays is used for more
  efficient instanced drawing.

- On drivers that support it, and return useful information,
  GL_ARB_internalformat_query2 is used for more accurate reporting of
  surface / texture format capabilities.

- There is an initial implementation of a HLSL compiler.

- Improvements to various parts of the D3DX9 implementation, including:
  - The surface and texture handling functions. This includes code for
    loading, saving, filling, and rendering to surfaces and textures.
  - The effects framework.
  - The constant table implementation.
  - A number of spherical harmonics functions have been implemented.
  - Support for .x files.

- Improvements to the Direct3D 10 implementation, including:
  - Support for more shader model 4 opcodes and register types.
  - Support for shader model 4 indirect addressing.
  - Initial geometry shader support.
  - Improved binary effect parsing.
  - Support for Direct3D 10 style instanced draws, using
    GL_ARB_draw_instanced.


*** DirectDraw

- Vertex buffers are created with WINED3DUSAGE_DYNAMIC when locked with
  DDLOCK_DISCARDCONTENTS, resulting in improved performance in some cases.

- The 2D-only fallback in WineD3D for using DirectDraw without a
  working OpenGL implementation is more robust. Note that this still
  isn't a recommended configuration.


*** Audio and video

- DirectSound has a better resampler.

- Audio device enumeration is improved, and multi-channel devices are
  better supported.

- VMR-9 video rendering is implemented.


*** Printer support

- The PPD files of already installed printers are automatically
  refreshed when needed.

- Printing resolution can be configured from the print dialog.

- Simulated italic fonts can be printed.

- On Mac OS X, the default paper size is retrieved from the system
  configuration.


*** Internationalization

- Japanese vertical text is correctly supported.

- Translated font names are used when there is a match for the current
  language.

- Wine is translated to French, German, Spanish, Italian, Dutch,
  Swedish, Finnish, Portuguese, Catalan, Hungarian, Polish, Danish,
  Russian, Slovenian, Lithuanian, Chinese, Japanese, Korean, and
  Arabic. It has partial translations for another fifteen languages.

- Various additional Mac OS code pages are supported, namely Japanese,
  Traditional Chinese, Korean, Simplified Chinese, Romanian,
  Ukrainian, Thai, and Croatian code pages. This improves support for
  loading translated font names from Mac OS font files.


*** Built-in applications

- The new 'netstat' application displays information about active
  network connections.

- The 'cabarc' application supports multi-cabinet archives.

- The 'attrib' application supports recursing in sub-directories.

- The 'ipconfig' application can display IPv6 addresses.

- The 'start' application allows setting process priority and affinity.

- The 'cmd' application support arithmetic variable expansion,
  comparison operators, and various extra features in 'for' loops.

- All graphical built-in applications have a 256x256 icon for use with
  the Mac driver.


*** Build environment

- The configure script uses pkg-config when possible to find library
  dependencies. Compiler and linker flags can be passed explicitly for
  each dependency to override pkg-config where necessary.

- The IDL compiler supports nameless structs and unions and generates
  portable C code for them.

- The IDL compiler generates the same header guards as the Microsoft
  one for better header compatibility.

- Generated assembler files are built by invoking the C compiler when
  possible, for better compatibility with the Clang tool chain.

- The Winedump tool can display the contents of typelib files.

- The Fnt2bdf tool has been removed since X11 server-side fonts are no
  longer used.


*** Platform-specific changes

- On Linux, dynamic device management supports the UDisks2 service.

- On Mac OS X, the Recycle Bin is mapped to the Mac OS Trash.

- Debugging support for ARM platforms is improved, including the
  ability to display ARM assembly in the Wine debugger, and support
  for relay tracing.

- Building Wine for the ARM64 platform is supported.

- There is preliminary support for building Wine for Android using the
  Android NDK.

- The DragonFly FreeBSD variant is supported.

- The Alpha and Sparc platforms are no longer supported.


*** Miscellaneous

- XML namespaces are better supported. XML parsing is also implemented
  in the XMLLite library.

- Windows Management Instrumentation (WMI) is implemented, with a wide
  range of WBEM system classes.

- A number of forwarding libraries are added to support the API Sets
  feature added in Windows 8.

- More of the latest functions of the C runtime are implemented,
  particularly the locale functions. Exception handling and RTTI are
  supported on 64-bit.

- The standard C++ class libraries are more complete, particularly the
  math functions and the stream classes.


*** New external dependencies

- LibOSMesa is used for OpenGL rendering to device-independent bitmaps.


*** Useful configuration options

Note: More details about these and other configuration options can be
      found at http://wiki.winehq.org/UsefulRegistryKeys

- Client-side window rendering can be disabled if necessary by setting
  "ClientSideGraphics" to "N" under HKCU\Software\Wine\X11 Driver.

- On Mac OS X, in case an application doesn't work properly with the
  Mac driver, it is possible to go back to the X11 driver by setting
  "Graphics" to "x11" under HKCU\Software\Wine\Drivers.

- Some X11 compositors do not cope properly with transparent windows
  that use non-rectangular shapes. In that case, window shaping can be
  disabled by setting "ShapeLayeredWindows" to "N" under
  HKCU\Software\Wine\X11 Driver.

- The "VertexShaderMode" and "PixelShaderMode" settings under
  HKCU\Software\Wine\Direct3D have been replaced by the "MaxShaderModelVS",
  "MaxShaderModelGS" and "MaxShaderModelPS" (DWORD) settings. These allow
  limiting the maximum supported shader model version. Setting these to 0
  disables support for the corresponding shader type, like "VertexShaderMode"
  and "PixelShaderMode" did.

- The default value for the "AlwaysOffscreen" setting under
  HKCU\Software\Wine\Direct3D is "enabled". It can still be disabled
  by setting it to "disabled".


*** Known issues

- The addition of DirectWrite causes Steam to be unable to display
  text. This can be fixed either by setting dwrite.dll to disabled for
  steam.exe using Winecfg, or by running Steam with the -no-dwrite
  option.

- The removal of the big X11 lock can reveal locking bugs in old Xlib
  versions, notably on RHEL 5. The only solution is to upgrade the X
  libraries.

--
Alexandre Julliard
julliard@winehq.org
