I had tried to optimize output of Cyrillic text and found that all the texts go to HostFonts.StringWidth letter by letter. This makes the output slow and not accurate.
During the text output the GatherString procedure from TextSetters extensively used. So I am thinking that it is the location of problem.
Code: Select all
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;
Code: Select all
Oleg N. Cher has found, that replacing the "~" to 0FFFFX
& ( (" " < ch) & (ch <= 0FFFFX) & (ch # "-")
The WordPart procedure should check for such case, but somehow algorithm is broken now.