OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 18:21

Часовой пояс: UTC + 3 часа




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Улучшение DrawSpace в Linux
СообщениеДобавлено: Среда, 01 Март, 2023 22:49 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Пятница, 03 Март, 2023 08:48 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Пятница, 03 Март, 2023 12:50 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
опечаточка копипасты: вы получаете ширину пробела в prect, а sw вычисляете по rect. ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Пятница, 03 Март, 2023 18:34 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
arisu писал(а):
опечаточка копипасты: вы получаете ширину пробела в prect, а sw вычисляете по rect. ;-)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Пятница, 03 Март, 2023 19:08 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
а, да. у меня просто весь bottleneck переведён на UC, я как-то прохлопал, по привычке везде умножаю уже. ;-)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB