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

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

Теперь растеризатор накапливает точное покрытие интервалов по оси X и покрытие по оси Y, вычисляемое по выборкам, а затем использует его при композиции через CairoBlendOver в формате ARGB без предумножения. CairoAaSamples задает число выборок по вертикали во время выполнения. Затраты почти линейно зависят от этого числа и в основном приходятся на ребра фигур. В результате получаются сглаженные границы, корректная композиция полупрозрачных фигур и возможность регулировать производительность.

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

В этой части мы введем значение покрытия и используем его на этапе композиции, чтобы сглаживание и альфа-смешивание выполнялись с помощью одних и тех же вычислений. Покрытие вычисляется точно по оси X (вычитанием интервалов) и приближенно по оси Y — с помощью N горизонтальных линий сканирования внутри строки пикселей (CairoAaSamples). Изменения в реализации невелики и локальны: в растеризатор добавляются накопитель покрытия и AddSpan для учета частично покрытых пикселей, в Color.mqh — CairoBlendOver для умножения альфа-значения источника на покрытие, а в Config.mqh — настройка качества, доступная во время выполнения. Измеримые цели: ребра должны стать гладкими без отдельного прохода сглаживания, перекрывающиеся полупрозрачные фигуры — корректно смешиваться, а настройка CairoAaSamples — обеспечивать понятное и измеримое соотношение качества и скорости.


Автор: Sandro Begashvili