With the premise that tessellation doesn't scare me... if ID3DXFont *really* uses textures, then it means it can be done, and it can be done fast.
And so it means that I want to do it as well.
If you just want to draw screen-space text, you should use GDI to draw each character into a texture, then use that as a texture atlas for drawing text. I believe this is what you originally intended, and I've also already explained how you can deal with your alpha-blending problem in my first reply.
And after investigating a bit, it seems that this is also how ID3DXFont works - it can only be used for screen-space fonts.
Done. See the attached picture below.
The top row is printed by me. The bottom row is from ID3DXFont.
The text you see is Arial, standard size (in Windows Wordpad this would be 24pt), no bold, no italic, all stock properties as enumerated by Windows.
The black shadow is because the text is printed twice. First time in Black (a255 r0 g0 b0), second time over it in Yellow (a255 r255 g255 b0) with a slight offset (1 pixel to the left, 1 to the top). The light blue background is: r127 g191 b255.
Transparency Alpha is no longer a concern. I'm just not showcasing it because it's pointless.
And now, for the problems...
Notice my characters' placement. The f and r are vertically misaligned. And my chars tend to offset to the right as the string length increases (see where my ! ended up).
Now let's speak of the offset between the black print and the yellow print. The difference is just 1 pixel for x and y. As you can see neither text is perfect.
My uppercase H shows perfect separation between Black and Yellow. ID3DXFont's H instead shows blurring.
But then look at my lowercase l (el). This time my font shows blurring, while ID3DXFont's is perfect. I believe this has to do with where the character picture ends up within the atlas texture, but it's hard to investigate because I can't replicate ID3DXFont's atlas. Might even be using multiple atlases for all I know (for example, I would if you asked me a font size 50 -- a single texture for it would be huge, whereas multiple smaller textures would more likely find a place in VRAM).
Finally, notice the extension of the f and r character glyphs to the right. My chars appear to be cut, while ID3DXFont's chars are not.
The cut (or clipping) obviously happens against the quad's boundary. Whatever ID3DXFont is doing with its characters, it isn't clipping them to the right.
However, ID3DXFont is still clipping them to the left. I can't show you this anymore, because my code has profoundly changed, but if you drawn the text using a single DrawText() call and a single textured quad to hold the whole string, you'd see how GDI extends the j glyph further to the left.
Or just launch Wordpad, pick Arial 24, write a lowercase j and observe it real good.
ID3DXFont clips the characters to the left just like my font does with the f and r to the right. We can say that not even ID3DXFont is perfect.
My main concern now is about the characters' misalignment. The smaller the size of the sampled text the stronger the misalignment becomes, on both axii. Do you know what I'm doing wrong?