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;