очередное предложение: добавить в bottleneck вместо DrawRect/DrawOval/DrawPath — универсальные пути с командами, как сделано во многих 2d рисовалках. то есть, что-то типа такого:
Код:
VAR
pt: ARRAY 128 OF INTEGER;
ppos: INTEGER;
x, y, w, h: INTEGER;
PROCEDURE Command (cmd: INTEGER);
BEGIN
pt[ppos] := cmd; INC(ppos)
END Command;
PROCEDURE Coords (x, y: REAL);
BEGIN
pt[ppos] := SHORT(ENTIER(x + 0.5)); INC(ppos);
pt[ppos] := SHORT(ENTIER(y + 0.5)); INC(ppos);
END Coords;
Command(pathMoveTo); Coords(x + rw, y);
Command(pathLineTo); Coords(x + w - rw, y);
Command(pathBezierTo);
Coords(x + w - rw*(1 - KAPPA90), y);
Coords(x + w, y + rh * (1 - KAPPA90));
Coords(x + w, y + rh);
Command(pathLineTo); Coords(x + w, y + h - rh);
Command(pathBezierTo);
Coords(x + w, y + h - rh * (1 - KAPPA90));
Coords(x + w - rw * (1 - KAPPA90), y + h);
Coords(x + w - rw, y + h);
Command(pathLineTo); Coords(x + rw, y + h);
Command(pathBezierTo);
Coords(x + rw * (1 - KAPPA90), y + h);
Coords(x, y + h - rh * (1 - KAPPA90));
Coords(x, y + h - rh);
Command(pathLineTo); Coords(x, y + rh);
Command(pathBezierTo);
Coords(x, y + rh * (1 - KAPPA90));
Coords(x + rw * (1 - KAPPA90), y);
Coords(x + rw, y);
Command(pathClose);
f.DrawPathComplex(pt, ppos, s, col)
остальное реализовать через этот интерфейс.
что даёт: возможность рисовать сложные фигуры, собирая их из единообразных кусочков. один интерфейс вместо кучи вызовов. упрощение портов на что-то типа AGG (там используется похожий механизм). возможность использовать пути повторно (например, для контура и заливки, без копипасты). возможность в будущем расширять пути новыми командами (например, задавать паттерны для заливок, без сочинения нового апи, просто складывая их в путь как данные команды.
предварительная версия — как обычно — реализована в
Lament Configuration, будет чиститься и допиливаться. кстати, вот вам и бинарный формат картинок заодно. ;-)
также (ещё не сделано, но будет) предлагаю передавать в райдер HostPorts hunit и vunit, вместо пересчёта координат в Frame. пусть bottleneck получает координаты с максимально возможной точностью, и пересчитывает их сам. полезно для реализации бэкэндов со сглаживанием, например, потому что такие бэкэнды могут хотеть координаты в REAL, например, и лучше их считать прямо на месте, чтобы терять как можно меньше точности. ну да, можно играть с unit, но я всё равно вижу смысл делать финальные пересчёты в bottleneck.
два юнита — на всякий случай и на будущее: горизонтальный и вертикальный. пока что они будут равны, но мало ли.
p.s.: рисовать сглажено, собирая из тех примитивов, что сейчас есть в BBCB — неправильно
технически. сглаживание делается не так, и работает иначе: рисовалка для корректной работы должна иметь полный путь. который может включать в себя безьерки, и безьерки эти надо переводить в линии уже на уровне bottleneck. так что если мы хотим нормальный aa-rendering — то рано или поздно придётся это сделать. лучше рано.