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/ |