Search code examples
c++windowsgdidirect2d

Direct2D interface and blurry text issue


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:

  1. 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?

  2. 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 BitBlted 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.


Solution

  • 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.

    1. 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.
    2. 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.
    3. 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.
    4. You just haven't gotten used to it yet.
    5. 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