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 usingAlphaBlend
. 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:
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.
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.