Page 1 of 1

issue-#96 Rendering unicode strings

PostPosted: Mon Jan 18, 2016 4:43 pm
by Ivan Denisov

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;
      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)
      rd.string[i] := 0X; rd.setterOpts := {wordJoin};
      IF i = 1 THEN
         IF WordPart(rd.string[0], 0X) THEN INCL(rd.setterOpts, wordPart) END
      rd.w := rd.attr.font.StringWidth(rd.string); rd.endW := rd.w
   END GatherString;
You can see here, that any Unicode letter will raise the "exception" call (IF i = 1 THEN).

Code: Select all
Oleg N. Cher has found, that replacing the "~" to 0FFFFX
& (    (" " < ch) & (ch <= 0FFFFX) & (ch # "-")
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.

Re: issue-#96 Rendering unicode strings

PostPosted: Tue Feb 02, 2016 5:26 pm
by Zinn
I can't see any change in the save set. So what would you like to do?
- Helmut

Re: issue-#96 Rendering unicode strings

PostPosted: Tue Feb 02, 2016 5:48 pm
by Ivan Denisov
Yesterday with Oleg N. Cher. we had found the solution!
We should add one string, please, take a look on this diff ... 73062d3201

This is test version: ...

I also prepared DevProfiler test. I opened big document with Russian text and scrolled it from top to bottom and then back to the top.
I had started profiler before scrolling and stopped after. Visually after the fix text moving much faster and smoother.
There is the result of profiler, where you can see that "picture" is changing drastically.

compare.png (44.79 KiB) Viewed 4021 times

Reader.ReadPrevView is also an bottleneck, however I do not know how to fix this. And it is not related to this issue-#96.

Re: issue-#96 Rendering unicode strings

PostPosted: Wed Feb 03, 2016 8:51 am
by Josef Templ
looks good to me. I didn't test it, though.
Hopefully, it does not affect the word and line breaking behavior.

TextSetters docu: we should remove sString because it does no longer exist.

- Josef