[Delphi] Как управлять параметром "smooth font edges" ?

yolki

Требуется следующее: на некоторых канвасах рисовать со сглаженными краями, на некоторых - нет.
То есть рисовать так и сяк:


(Times New Roman, 24pt size)
Это рисовано в PaintBrush на цветной картинке (24bits) и на ч/б картинке (1bit)
Можно ли это делать программно (например, через какой-нибудь параметр объекта TFont)?
Я правильно понимаю, что это называется антиалиасинг?
Вопрос можно перефразировать так: Можно ли отключать/включать антиалиасинг при отрисовке фонтов программно?

psm-home

Вообще в WinAPI есть дивная функция с 14 параметрами:

HFONT CreateFont(
int nHeight, // height of font
int nWidth, // average character width
int nEscapement, // angle of escapement
int nOrientation, // base-line orientation angle
int fnWeight, // font weight
DWORD fdwItalic, // italic attribute option
DWORD fdwUnderline, // underline attribute option
DWORD fdwStrikeOut, // strikeout attribute option
DWORD fdwCharSet, // character set identifier
DWORD fdwOutputPrecision, // output precision
DWORD fdwClipPrecision, // clipping precision
DWORD fdwQuality, // output quality
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace // typeface name
);

И fdwQuality может принимать значение ANTIALIASED_QUALITY и даже CLEARTYPE_QUALITY (если дело происходит на WinXP). Наверное это оно самое. Беглый взгляд на сырцы VCL, особенно на TFont, подсказывает мне, что нету у TFont свойства, чтоб достучатся до fdwQuality. Так что придётся тебе, наверное, на уровень Win API тут опуститься.

yolki

Сенькс.
Корректно ли делать так?


Image.Canvas.Font.Handle := CreateFont(...);


Фонт удалять надо? или она сама позаботится?

psm-home


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
PaintBox1: TPaintBox;
PaintBox2: TPaintBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
const
CLEARTYPE_QUALITY = 5; // Delphi 7 dont care about XP
{$R *.dfm}
procedure MyTextOut(Canvas: TCanvas; lfQuality : Byte);
var
lf: LOGFONT;
begin
Canvas.Brush.Style := bsClear;
ZeroMemory(@lf, SizeOf(lf;
lf.lfQuality := lfQuality;
lf.lfHeight := 120;
lf.lfEscapement := 0;
lf.lfOrientation := 0;
lf.lfCharSet := DEFAULT_CHARSET;
//StrCopy(lf.lfFaceName, 'Tahoma');
Canvas.Font.Handle := CreateFontIndirect(lf);
Canvas.TextOut(10, 100, 'qwerty'); // output the rotated font
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// DEFAULT_QUALITY
// ANTIALIASED_QUALITY
// CLEARTYPE_QUALITY // XP only!
// DRAFT_QUALITY
// NONANTIALIASED_QUALITY
// PROOF_QUALITY
MyTextOut(PaintBox1.Canvas, NONANTIALIASED_QUALITY);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MyTextOut(PaintBox2.Canvas, CLEARTYPE_QUALITY);
end;
end.

Вот тест. На форму бросили два PaintBox'a и две кнопки ). Вроде так правильно, никаких телодвижений больше не надо.

yolki

Это-то понятно.
DeleteObject на сделанный фонт не надо делать?
Кстати, про cleartype.

Правильно ли я понимаю, что это корректно работает только на LCD мониторах?

psm-home

Смотрим в souces\vcl\graphics.pas
procedure TFont.SetHandle(Value: HFont);
begin
SetData(GetFontData(Value;
end;
вызывает SetData
procedure TFont.SetData(const FontData: TFontData); вызывает
FontManager.ChangeResource(Self, FontData);
ChangeResource вызывает
procedure TResourceManager.FreeResource(Resource: PResource);
а FreeResource вызывает DeleteObject(Handle);
То есть когда ты делаешь
Canvas.Font.Handle := CreateFontIndirect(lf);
дескриптор, созданный CreateFontIndirect корректно удаляется ф-цией API DeleteObject;
То есть удалять ничего руками не надо, всё уже украдено до нас. По моему так.

rosali

что это корректно работает только на LCD мониторах?

Вроде нет, кажись на всех мониторах RGB треугольник одинаково ориентирован...

psm-home

Вот что говорит сама MS:
Microsoft® ClearType™ antialiasing is a smoothing method that improves font display resolution over traditional anti-aliasing. It dramatically improves readability on color LCD monitors with a digital interface, such as those in laptops and high-quality flat desktop displays. Readability on CRT screens is also somewhat improved.
However, ClearType is dependent on the orientation and ordering of the LCD stripes. Currently, ClearType is implemented only for LCDs with vertical stripes that are ordered RGB. In particular, this affects tablet PCs, where the display can be oriented in any direction, and those screens that can be turned from landscape to portrait.

yolki

В том-то и дело, что на LCD мониторах это не треугольник!
Да и на некоторых CRT это тоже не треугольник.
Если бы был треугольник - то можно было бы увидеть и зелёные края, и вообще всех цветов по кругу
R->Y->G->C->B->M->R

rosali

то можно было бы увидеть и зелёные края, и вообще всех цветов по кругу

А их и можно увидеть...
Оставить комментарий
Имя или ник:
Комментарий: