[EMAIL PROTECTED] writes: > Quoting David Abrahams <[EMAIL PROTECTED]>: > >> When ClearType >> (http://www.microsoft.com/typography/cleartype/tuner/Step1.aspx) is >> enabled on an NT build of Emacs, it's very common for emacs to "slice >> off" a few antialiased pixels on either side of a character's vertical >> member. It happens especially in lines that are being typed. You can >> see examples in this sentence of characters whose vertical members >> appear to be thin, red lines (image enclosed). > > This happens because Windows tells lies about the width of characters when > sub-pixel antialiasing is in effect. > > You are welcome to investigate a way around this if you want.
Fantastic; it turned out to be easy. I have enclosed a patch that works for me. The use of those strange #defines #define W32_spi_getfontsmoothing 0x4A #define W32_spi_getfontsmoothingtype 0x0200A #define W32_fe_fontsmoothingcleartype 0x2 is because the use of -D_WIN32_WINNT=0x0400 on the compiler command-line makes the corresponding MS constants unavailable through <windows.h>. I wasn't sure what the best way to handle this stuff might be -- i.e. what's most consistent with regular Emacs coding practice. I would be happy to change the approach in whatever way is deemed necessary. I also release all rights to my patch to the FSF. Incidentally, it seemed to work just fine for me if I remove the checks for whether cleartype is enabled altogether, and just make the width adjustments unconditionally. That would eliminate the issue with those constants described above and probably make a small difference in speed. Seems like a viable option to me.
--- w32term.c 25 Mar 2005 19:19:53 -0500 1.224 +++ w32term.c 03 Jun 2005 11:21:29 -0400 @@ -903,6 +903,29 @@ int real_width; GetCharWidth (hdc, *char2b, *char2b, &real_width); #endif + + BOOL smoothing_enabled; + UINT smoothing_type; + + /* Attempt to account for ClearType antialiasing. + * GetCharABCWidths fails to report the fractional pixels + * used for subpixel antialiasing + */ +#define W32_spi_getfontsmoothing 0x4A +#define W32_spi_getfontsmoothingtype 0x0200A +#define W32_fe_fontsmoothingcleartype 0x2 + + if (SystemParametersInfo(W32_spi_getfontsmoothing, 0, &smoothing_enabled, 0) + && smoothing_enabled + && SystemParametersInfo(W32_spi_getfontsmoothingtype, 0, &smoothing_type, 0) + && smoothing_type == W32_fe_fontsmoothingcleartype + ) + { + char_widths.abcA -=1; + char_widths.abcB +=2; + char_widths.abcC -= 1; + } + pcm->width = char_widths.abcA + char_widths.abcB + char_widths.abcC; #if 0 /* As far as I can tell, this is the best way to determine what
-- Dave Abrahams Boost Consulting www.boost-consulting.com
_______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel