الكشف عن خطوط محسّنة
سؤال
سؤال:
هل هناك طريقة للتحقق مما إذا كان الخط المعطى أحد Microsoft خطوط ClearType المحسنة?
أظن أنه يمكنني ببساطة أن أتعامل مع قائمة أسماء الخطوط ، لأنها قائمة قصيرة نسبيًا ، لكن هذا يبدو قبيحًا بعض الشيء. هل ستكون أسماء الخطوط هي نفسها بغض النظر عن إعدادات لغة Windows وإعدادات اللغة؟
خلفية:
المعجون يبدو قبيحًا حقًا مع نص Consolas Bold و ClearType. قررت أن ألعب مع المصدر ومعرفة ما إذا كان بإمكاني معرفة المشكلة ، وأعتقد أنني قمت بتتبعها إلى رمز (مختصر) التالي:
font_height = cfg.font.height;
if (font_height > 0) {
font_height =
-MulDiv(font_height, GetDeviceCaps(hdc, LOGPIXELSY), 72);
}
}
font_width = 0;
#define f(i,c,w,u) \
fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \
c, OUT_DEFAULT_PRECIS, \
CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \
FIXED_PITCH | FF_DONTCARE, cfg.font.name)
f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);
SelectObject(hdc, fonts[FONT_NORMAL]);
GetTextMetrics(hdc, &tm);
font_height = tm.tmHeight;
font_width = tm.tmAveCharWidth;
f(FONT_BOLD, cfg.font.charset, fw_bold, FALSE);
القصد من ذلك هو اختيار خط جريء يناسب نفس الأبعاد مثل الخط العادي. أفترض أن نص Consolas الخاص بـ Putty يبدو قبيحًا لأنه ، نظرًا لأن Consolas تم تحسينه بشدة ليتم وضعه على حدود محددة من البكسل ، فإن محاولة التغلب عليها في أبعاد تعسفية تنتج نتائج سيئة.
لذلك ، يبدو أن الإصلاح المناسب هو اكتشاف الخطوط المحسّنة التي تحسنتها ClearType ومحاولة إنشاء إصدارات جريئة من تلك الخطوط باستخدام نفس العرض والارتفاع مثل مكالمة CreateFont الأولية.
المحلول
لست متأكدًا من أنني أتابع تمامًا ما هو المقصود بـ "تعقبه وصولاً إلى الكود التالي (المختصر)" ، ولكن من المؤكد أن كافيًا يبدو أن Consolas Bold سيئ في المعجون. فيما يلي مصدر معجون لنظام التشغيل Windows/Window.C (المراجعة 8914 تم الحصول عليها مع Subversion "SVN CO SVN: //svn.tartarus.org/sgt/putty" ، في 5 أبريل 2010).
1386 fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \ 1387 c, OUT_DEFAULT_PRECIS, \ 1388 CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \ 1389 FIXED_PITCH | FF_DONTCARE, cfg.font.name) 1390 1391 f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE); 1392 1393 SelectObject(hdc, fonts[FONT_NORMAL]); 1394 GetTextMetrics(hdc, &tm); 1395 1396 GetObject(fonts[FONT_NORMAL], sizeof(LOGFONT), &lfont); 1397 1398 if (pick_width == 0 || pick_height == 0) { 1399 font_height = tm.tmHeight; 1400 font_width = tm.tmAveCharWidth; 1401 } ... 1477 if (bold_mode == BOLD_FONT) { 1478 f(FONT_BOLD, cfg.font.charset, fw_bold, FALSE); 1479 }
بالنسبة إلى 10 pt consolas ، كانت قيم font_height و font_width -13 و 0 عندما تم استدعاء CreateFont لـ font_normal (عبر الماكرو F) ، ولكن 15 و 7 عندما تم استدعاؤه لـ FONT_BOLD (يتم تغيير القيم على الأسطر 1399،1400) . إن تحديد قيمة العرض بشكل صريح لا يتفق جيدًا مع خط Consolas Bold. إذا تم تعديل Window.c بحيث يتم نقل الخطوط 1477-1479 ليأتي بعد السطر 1391 ، يتم الحصول على خط Consolas Bold Tower كثيرًا (لقد جربت أيضًا جميع الخطوط الأخرى المتاحة (Courier ، Bitstream ، Lucida وما إلى ذلك) ولم تكن سلبًا تأثرت. لقد أرسلت هذا الاقتراح إلى فريق المعجون. إليك شخصية توضح الفرق:
تمت إضافة في 16 يناير 2011: لا يزال "الخطأ" موجودًا ، ولا يزال الإصلاح يعمل. الآن ، يجب نقل خطوط الخط في النافذة.
أضيفت في يناير. 13 ، 2012: لا يزال الخطأ في الإصدار 0.62 من المعجون (صدر في 10 ديسمبر 2011). إن الكتان الذي يجب الانتقال إليه الآن 1532-1534 ليأتي بعد عام 1439. لاكتمال هنا هي الخطوات التي أجريتها في Cygwin:
$ svn co svn://svn.tartarus.org/sgt/putty2
$ cd putty
$ perl mkfiles.pl
$ cd windows
$ --- edit window.c and move the 3 lines---
$ make CC=gcc-3 -f Makefile.cyg
$ --- move resulting executable files (including putty.exe) to a suitable folder
$ --- add shortcuts to the executables to Windows start menu
كريستجان
نصائح أخرى
لست متأكدًا مما إذا كان هذا إجابة لك ، ولكن التأكد من أن عرض الخط هو عرض بكسل عدد صحيح دقيق ، سيجعل خطوط TrueType ذات العرض الثابت تبدو جيدة تحت ClearType.
لتحقيق ذلك ، ستحتاج إلى "توصيل" ارتفاع الخط مع بعض التجربة والخطأ.