issue-#96 Rendering unicode strings
Posted: Mon Jan 18, 2016 4:43 pm
http://redmine.blackboxframework.org/issues/96
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.You can see here, that any Unicode letter will raise the "exception" call (IF i = 1 THEN).
let words to come to HostFonts.StringWidth, however this is temporary solution.
The WordPart procedure should check for such case, but somehow algorithm is broken now.
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.