Обсуждение статьи "Создание графической библиотеки для MetaTrader 5 по образцу Cairo (Часть 5): Правила заливки, отверстия и рамки"

Опубликована статья Создание графической библиотеки для MetaTrader 5 по образцу Cairo (Часть 5): Правила заливки, отверстия и рамки:

В пятой части мы добавим в растеризатор правило заливки, а в путь — вспомогательную функцию для построения обводки. Теперь движок поддерживает заливку по правилу ненулевого числа обхода и по правилу "чет-нечет". Выбор задается одним параметром типа перечисления, что позволяет создавать кольца, полноценные рамки, не закрашивающие внутреннюю область, и внутренние просветы глифов. Функция AddThickLine() строит обводки из заливок в рамках одного пути и одного прохода, сохраняя равномерную непрозрачность на стыках. На ее примере показано, почему для таких обводок требуется правило ненулевого числа обхода.

После четвертой части движок уже хорошо справляется с отрисовкой. Рендерер уже умеет многое: выполняет заливку произвольных контуров, сглаживает их края и корректно выполняет альфа-композицию — и все это через единый метод Fill(). Но он не справляется, когда интерфейсу нужна по-настоящему пустая область внутри фигуры. Это не просто косметический недостаток — он мешает правильно отображать распространенные элементы интерфейса: рамки, кольца и кольцевые шкалы, внутренние просветы букв вроде "A" или "O", кнопки с контуром и дорожки полос прогресса. На практике это хуже, чем просто отсутствие нужной возможности: в вызывающем коде приходится задавать поведение рендерера через порядок вершин или прибегать к обходным приемам с непрозрачной заливкой, которая закрашивает все под ней.

Нам нужен небольшой управляемый механизм, который отвечает на один четкий вопрос: что считать внутренней областью фигуры при данной заливке? Если этот выбор доступен в месте вызова, одна и та же геометрия позволяет получить либо сплошное объединение фигур, либо гарантированно сформировать отверстия. При этом обводки можно строить с помощью заливки без швов и артефактов повторного смешивания. В этой статье показано, как добавить такую возможность с минимальным изменением API и почему именно выбор правила заливки позволяет и создавать отверстия, и строить обводки с помощью заливки.


Автор: Sandro Begashvili