Software development

Kenny Kerr Windows with C++: Introducing Direct2D

Direct2D allows full interoperability with GDI, GDI+, and permits rendering to and from a Direct3D surface, as well as to and from a GDI/GDI+ device context . It can be used effectively together with Windows Imaging Component for image encoding/decoding, and with DirectWrite for text formatting and font processing. Such interoperability allows developers to gradually replace critical code paths with Direct2D code without the need to overhaul their entire source code. In Windows 10 timeframe, an Open Source project called Win2D was developed by Microsoft to further simplify the usage of Direct2D and DirectWrite in Universal Windows Platform application. Win2D is a highly-efficient WinRT wrapper of Direct2D and DirectWrite designed from the ground up to integrate seamlessly with XAML Canvas control while preserving the power of the underlying graphics subsystem. The issue is now that I create a separate memory DC for every control instance, which I later draw to using the code above.

windows direct2d

This printing API has limited Xojo’s resolution setting among other things. Also, even though Direct2D can interoperate with GDI, this is not without some effort as Plugin developers have come to realize, especially when it comes to printing. Other differences in rendering may be noticeable but these are likely just a difference in the graphics rendering APIs. While some consequences may be solved as time/features permit, some may be here to stay. We’ve fully embraced Direct2D/DirectWrite as our new graphics rendering engine and hope you will too. While I find the result visually pleasing and its rendering procedure relatively simple, I think it’s slow.


They are using the old GDI-based Vcl.Graphics.TCanvas object. To use the new technology, you must explicitly add support for Vcl.Direct2D.TDirect2DCanvas to your controls. Until now we have just used a fairly arbitrary demo level that was hard-wired into our game code. It’s hard to create levels, and we also can’t offload that task to other members of our team. The solution, of course, is to make a level editor application which can save levels into files that the game can load.

I have not noticed any performance issues yet; therefore, I have measured the time it takes to complete an entire draw call. Note that this is done every time the slider’s appearance changes due to user input. I have also found that when I move the mouse slowly, the draw calls are way slower than Difference between IAAS, PAAS and SAAS when I move the mouse quickly. Microsoft Windows 7 introduced a new feature that allows creating canvas objects that use the Direct2D technology for rendering and drawing. Using Direct2D may be beneficial in certain circumstances where you have an application that does a lot of custom drawing.

  • It checks whether the Direct2D support is available and returns the appropriate canvas object.
  • For a few types it must also be passed a device and/or DPI value.
  • They do not share a common ancestor; but you can assign a GDI pen to a Direct2D pen, for example.
  • I have heard that I can only use 10k GDI objects per process.

The original version of Direct2D was tied to DirectX 11 (in hardware, up to Direct3D 10.1 is used), whereas this version of Direct2D integrates with DirectX 11.1. Windows 8 also added interoperability between XAML and Direct2D 10 Top Cloud Security Companies along with Direct3D components, which can be all mixed in an application. The issues with WPF and Direct2D however are not about managed vs. native. It’s about immediate-mode graphics vs. retained-mode graphics.

Platform Games Part 8: Pass-through Platforms

Downloadsource code and compiled EXEfor the code in this article as well as the complete source code and compiled EXE for the level editor. If you want to get the performance of Direct2D/Direct3D with managed code you’ll have to use the managed Direct3D wrapper libraries. Of course that will 12 Tips When Designing for Fintech Companies be more complex than Direct2D even though you’re using managed code since Direct2D is much simpler than Direct3D. #r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.

The CreateD2DCanvas method attempts to create a TDirect2DCanvas instance and returns a Boolean value indicating whether this went fine or failed. CreateD2DCanvas is later used to initialize the Direct2D canvas. Both TCanvas and TDirect2DCanvas derive from a common ancestor, TCustomCanvas, that defines the high-level functionality that both canvas implementations must support. In some cases though, TDirect2DCanvas does not implement some functions–for example, the TCustomCanvas.Pixels property; there is no way to obtain pixel information for Direct2D canvases. You should consult the API documentation for Vcl.Direct2D.TDirect2DCanvas to see the functions that are supported and those that are not. Sharing the drawing surface between the original GDI canvas and the new Direct2D canvas.

windows direct2d

Direct2D support was added in the alpha version of Firefox 3.7, roughly doubling its rendering speed. The Paint method basically replicates the TPaintBox.Paint method’s behavior. It prepares the canvas object for painting and invokes the user-supplied event handler that will do the actual drawing. One thing to note in this implementation is that it verifies whether the Direct2D is enabled and uses the D2DCanvas property, falling back to GDICanvas if Direct2D is not supported. Direct2D takes advantage of hardware acceleration via the graphics processing unit found in compatible graphics cards within personal computer, tablet, smartphone and modern graphical device. It offers high visual quality and fast rendering performance while maintaining full interoperability with classic Win32 graphics APIs such as GDI/GDI+ and modern graphics APIs such as Direct3D.

I now have a dilemma because I want to be both fast but also not using more GDI objects than I absolutely have to. So not using a separate memory buffer is an option if the draw described above is in-fact not slow objectively. The WMSize method is used to process the WM_SIZE Windows message.

“Give us DX11.1 driver support on DX11 cards. no new hardware is required for dx11.1”. Ars Technica’s Peter Bright noted in the summer of 2012 that “most desktop applications don’t use Direct2D.”

It’s basically reinventing the wheel and implementing many controls found in Windows’ common controls, QT and other frameworks. The FUseD2D Boolean field is used later in the component to select either the GDI or the Direct2D canvas. The new Direct2D interfaces are supported on Windows 7 with the Platform Update for Windows 7 installed. This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

It’s been going quite well for now and I have managed to implement quite a few important and trivial controls. Right now, I am building my slider control that can be a rotary slider , or a horizontal or vertical bar slider. While there are no obvious bugs that I have noticed during my testing, I am questioning the way I am rendering the control . In the previous example, we had to set the color of the Pen object.

[feature request] Windows: Use Direct2D instead of GDI

Immediate-mode will almost always be faster in practice regardless of whether it’s native or managed. WPF just happens to be a retained-mode graphics API and thus it will be slower by design. GetOrCreate returns an existing wrapper instance if one already exists, or creates a new wrapper if one does not. Calling it repeatedly on the same native object will return the same wrapper each time, as long as that wrapper instance continues to exist. If all references to the wrapper are released such that its reference count goes to zero and it is destroyed, any later call to GetOrCreate will have to create a new wrapper. GDI is another Graphics API that was present in the initial release of Windows and to this day remains an integral part of the OS.

This release also introduced a brand-new API extension to support digital ink, which is highly leveraged by the Microsoft Edge browser as well as the ink canvas XAML control. Direct2D is a native code API based on C++ that can be called by managed code and uses a “lightweight COM” approach just like Direct3D, with minimal amount of abstraction. While new technology solves many immediate and future problems, it can also introduce some growing pains. For example, Microsoft didn’t introduce a printing API for Direct2D until Windows 8 .

windows direct2d

Main Direct2D page at MSDN with links to the programming guide, new features in Windows 8.1, interoperability with Direct3D, etc. In Windows 8.1, Direct2D can use the Direct3D11 hardware tesselators, but only in conjunction with D2D1_FILL_MODE_ALTERNATE. If another fill mode is used (e.g. D2D1_FILL_MODE_WINDING) then Direct2D falls back to tessellation on the CPU, but still uses TIR for anti-aliasing . Since hardware tessellation is available in base Direct3D11 (not necessarily 11.1), Microsoft claimed significant performance improvements with Direct2D in Windows 8.1 (vs. Windows 8) on non-TIR hardware. Direct2D is a 2D vector graphics application programming interface designed by Microsoft and implemented in Windows 10, Windows 8, Windows 7 and Windows Server 2008 R2, and also Windows Vista and Windows Server 2008 . In this issue I introduce a new technology that I’m very excited about.

Support for JPEG YCbCr images

I have heard that I can only use 10k GDI objects per process. What if I have a really large GUI project with a lot going on? That’s why I was thinking of moving the paint code entirely into WM_PAINT and using the DC I get from “BeginPaint()” . That’s where the speed issue comes into play as WM_PAINT can be sent really frequently. I know I can smartly repaint only what’s needed, but the atomic primitive draw calls do not do a lot when it comes to performance. Internet Explorer 9 and later versions use Direct2D and DirectWrite for improved performance and visual quality.

Improved support for color fonts

Interop allows you to mix and match Win2D with native DirectX APIs. You can write an app that mostly uses Win2D, but drop down to native DirectX at any point – perhaps to call into some other API or 3rd party component that requires native interfaces. Or your app can be mostly native DirectX, yet you can switch over to Win2D in specific places where you want its extra convenience or C# support.

For projects that support PackageReference, copy this XML node into the project file to reference the package. The interface has the following functions which you can use to perform interop. When a CanvasSvgDocument is produced from an ID2D1SvgDocument using native C++ interop, the ID2D1SvgDocument’s viewport size is ignored. This applies when calling GetWrappedResource on an effect, or on a CanvasImageBrush that has an effect as its source image. The best approach depends on requirements and target hardware.

However, since GDI is such old technology it lacks basic anti-aliasing support, alpha channel support, and still deals in integer coordinates. GDI+ was introduced in Windows XP and included everything missing from GDI, with one glaring issue, text rendering. In Xojo 2016 Release 4 we switched our main graphics rendering engine on Windows from GDI and GDI+ to Direct2D/DirectWrite.