Йо-хо-хо.
Я сделал кэширование ширин строк в дереве и это ускорило отрисовку текстов до приемлемого уровня! Памяти такой способ потребляет очень мало. Так что для своего проекта сразу в дело пущу.
Выкладываю исходники новой HostFonts для версии Центра.
Что при этом обнаружил!? GatherString из TextSetters обрабатывает кириллические тексты побуквенно, что с одной стороны хорошо — дерево получается маленькое, но с другой стороны — это явно косяк.
Может кому-то придет в голову как это вылечить?
Код:
PROCEDURE GatherString (rd: StdReader);
VAR i, len: INTEGER; ch: CHAR;
BEGIN
i := 1; len := LEN(rd.string) - 1; ch := rd.r.char;
WHILE (i < len)
& (rd.r.view = NIL) & (rd.r.attr = rd.attr)
& ( (" " < ch) & (ch <= "~") & (ch # "-")
OR (ch = digitspace)
OR (ch >= nbspace) & (ch < 100X) & (ch # softhyphen)
)
DO (* rd.r.char > " " => ~rd.eot *)
rd.string[i] := ch; INC(i);
rd.eot := rd.r.eot;
rd.r.Read; ch := rd.r.char; INC(rd.pos)
END;
rd.string[i] := 0X; rd.setterOpts := {wordJoin};
IF i = 1 THEN
IF WordPart(rd.string[0], 0X) THEN INCL(rd.setterOpts, wordPart) END
END;
rd.w := rd.attr.font.StringWidth(rd.string); rd.endW := rd.w
END GatherString;