My new application will feature a rich interface which should be resizable on-the-fly uses transparent icons/images etc. For this application I'm trying to decide on using the new Direct2D API against the good old GDI. One of the downsides is of course it does not run on XP, although I've found a bit nastier issues to decide upon:
I noticed that outputting text in a Direct2D environment seems a bit blurry (although marketed as a feature). Just look at the text in Firefox 4 with hardware acceleration enabled (or IE9). It seems to be due to the fact that in Direct2D text does not adhere to the (pixel) grid like GDI does. Is there a way to force Direct2D to make it adhere to the pixel grid and thus fixing this issue?
Is there really such an improvement in speed? I tried to understand this article and what I make from it is that in Windows 7 and XP (not Vista?) the GDI is already hardware accelerated where it can. E.g. in my application I use a lot of memory DC's which are just BitBlt
ed into place and drawing transparent images/anti-aliased lines etc are being drawn using AlphaBlend
. And that last one is definitely hardware accelerated since I measured speed while testing my routines.
So where would you put your money? Is Direct2D worth the hassle or would you just stick to the good old GDI? Or would you suggest something else?
Note: I'm programming in C++ btw, no use of MFC.
The fix to your problem is very simple. Direct2D is highly configurable, and that includes text rendering and hinting. If you want to make it render text to match GDI's rendering (that is, very tight pixel alignment) just:
- Call the SetTextRenderingParams function on the render target http://msdn.microsoft.com/en-us/library/windows/desktop/dd316898%28v=vs.85%29.aspx
- Pass in an IDWriteRenderingParams on which you can call SetRenderingMode with the value of GDI_CLASSIC or GDI_NATURAL (natural is recommended). This object can also be configured in a variety of other ways, including variable ClearType, gamma, and contrast.
Since the other answer went out of its way to be most unhelpful and bash the rendering in Direct2D, let me provide another overview of Direct2D's text rendering. It is very, very good. Unlike on the Mac, where they basically do not hint fonts and the text actually comes out as blurry, Direct2D by default strongly hints in the Y direction only. This makes sense since your monitor probably has about 96 dpi vertically, but with sub-pixel anti-aliasing the horizontal resolution is beyond the range of reasonable human perception. It is also a lot more subtle in its ClearType usage and hinting than GDI was. The edges of GDI text tend to be very colorful compared to Direct2D. I find GDI text very harsh-looking nowadays and much prefer the Direct2D text in Firefox and IE for long reading sessions.
Therefore, there are several reasons that the default mode probably appears "blurry" to you.
- First of all, take the time to run the ClearType tuner program in the control panel. You will be amazed at the difference in Direct2D programs.
- No matter how good it is, it will always appear strange when you place it next to GDI-spaced text in your application. Try making everything in the UI one or the other, or clearly distinguish the content area from the other areas. If you decide to make everything GDI-spaced, just use the method I described above to set Direct2D to GDI-spaced text mode.
- You haven't installed all available updates from Windows Update. There have been several for DirectWrite and IE. Make sure you install them all and restart to see the improvements.
- You just haven't gotten used to it yet.
- It's in your head. Really. Once you start thinking about text rendering a lot, you'll probably find yourself noticing "problems" that aren't there. The other answer to this question is the perfect example. He states that he thinks the text in Visual Studio 2010 is blurrier than 2008, but they are actually pixel perfect copies. Don't believe me? The VS developers actually provided some comparisons yourself. I bet you can't tell the difference. http://blogs.msdn.com/b/text/archive/2010/03/05/additional-wpf-text-clarity-improvements.aspx
Just as much software relies on the inevitable march of Moore's law to offer more and more horsepower, GDI+ and Direct2D seem predicated on the fact that screen resolutions (pixel density) would continue to improve. But the fact is that pixel density has not increased significantly and, in face, has reached a plateau.
GDI text was designed with the assumption that resolutions suck. Pixel alignment, hinting, and later sub-pixel rendering (such as ClearType) are all well-engineered compromises that weighed the real-life constraint of readability at 75-100 pixels per inch against the generality of arbitrary transforms like scaling and rotation.
If our screens had pixel densities closer to what modern printers can produce, I'd be happy to surrender these compromises in favor of generality. But we're not there. We're not even close. Personally, I find the editor in VS 2010 far less readable than the one in VS 2008 for exactly these reasons.
Things to consider: Do you have to worry about devices other than the screen? Printers? Does Direct2D handle printers or do you have to implement a GDI solution anyway? How important is Windows XP? How future proof do you want to be? Direct2D is clearly the direction Microsoft is trying to move everyone.
Things not to consider: Speed. I've yet to see any modern application limited by the speed of rendering text to the screen, regardless of the technology. It's a highly optimized path. The actual layout is probably much more of a bottleneck than setting pixels values on the screen. If you're animating a zoom of a full screen, then maybe you need Direct2D--not for speed, but for the general transforms and smooth scaling.