OberonCore
https://forum.oberoncore.ru/

Улучшение DrawSpace в Linux
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6941
Страница 1 из 1

Автор:  arisu [ Среда, 01 Март, 2023 22:49 ]
Заголовок сообщения:  Улучшение DrawSpace в Linux

и ещё возьмите у меня в HostPorts/Lin реализацию `DrawSpace()`. потому что то, что сейчас вместо неё — оно ни разу правильно не работает вообще. вкратце: там рисуется один пробел, а надо всю ширину забивать пробелами (с правильным отсечением, точно по нужной ширине). потому что эта штука используется чтобы рисовать подчёркивания и перечёркивания в том числе и для табуляторов, которые могут быть любой ширины.

Автор:  Иван Денисов [ Пятница, 03 Март, 2023 08:48 ]
Заголовок сообщения:  Re: BlackBox 2.0

arisu писал(а):
и ещё возьмите у меня в HostPorts/Lin реализацию `DrawSpace()`. потому что то, что сейчас вместо неё — оно ни разу правильно не работает вообще. вкратце: там рисуется один пробел, а надо всю ширину забивать пробелами (с правильным отсечением, точно по нужной ширине). потому что эта штука используется чтобы рисовать подчёркивания и перечёркивания в том числе и для табуляторов, которые могут быть любой ширины.


Попробовал вот так перенести, но желаемого эффекта нет. Может я что-то не заметил?
Код:
   PROCEDURE (rd: Rider) DrawSpace* (x, y, w: INTEGER; col: Ports.Color; font: Fonts.Font);
   VAR
      gdkColor: Gdk.GdkColor;
      map: Gdk.GdkDrawable;
      gc: Gdk.GdkGC;
      layout: Pango.PangoLayout;
      x1, sw: INTEGER;
      rect: Gdk.GdkRectangle;
      prect: Pango.PangoRectangle;
      (*undery, uthick: INTEGER;*)
   BEGIN
      ASSERT(rd.port # NIL, 20);
      rd.DrawingBuf(map, gc);
      AllocateColor(col, gdkColor);
      Gdk.gdk_gc_set_foreground(gc, gdkColor);
      x1 := x + w;
      IF x <= x1 THEN
         (* sadly, font underline info is not reliable due to rounding; so let's use the hack:
            shape one space, and draw it until we fill the whole area *)
         INC(x1);
         IF (x1 > rd.l) & (x < rd.r) THEN
            layout := HostFonts.layout;
            HostFonts.ShapeString(layout, " ", font); (* force underline *)
            rect.x := MAX(rd.l, x);
            rect.y := rd.t;
            rect.width := MIN(rd.r - rect.x, x1 - x);
            rect.height := rd.b - rd.t;
            IF rect.width > 0 THEN
               Gdk.gdk_gc_set_clip_rectangle(gc, SYSTEM.ADR(rect));
               Gdk.gdk_gc_set_clip_origin(gc, 0, 0);
               (* draw many spaces *)
               Pango.layout_line_get_pixel_extents(
                  Pango.layout_get_line(layout, 0), NIL, prect);
               sw := (rect.x + rect.width) * HostFonts.pixel;
               WHILE x < x1 DO
                  Gdk.gdk_draw_layout_line(map, gc, x, y, Pango.layout_get_line(layout, 0));
                  INC(x, sw)
               END
            END
         END
      END;
      Gdk.gdk_gc_unref(gc)
   END DrawSpace;

Автор:  arisu [ Пятница, 03 Март, 2023 12:50 ]
Заголовок сообщения:  Re: BlackBox 2.0

опечаточка копипасты: вы получаете ширину пробела в prect, а sw вычисляете по rect. ;-)

Автор:  Иван Денисов [ Пятница, 03 Март, 2023 18:34 ]
Заголовок сообщения:  Re: BlackBox 2.0

arisu писал(а):
опечаточка копипасты: вы получаете ширину пробела в prect, а sw вычисляете по rect. ;-)

Спасибо. Также выяснил, что на pixel не надо умножать
отправил в фиксацию 5835bdc66c08ff25f3bffe39a4beba044a8ab7c4

Автор:  arisu [ Пятница, 03 Март, 2023 19:08 ]
Заголовок сообщения:  Re: BlackBox 2.0

а, да. у меня просто весь bottleneck переведён на UC, я как-то прохлопал, по привычке везде умножаю уже. ;-)

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/