DrawingArea: заполнить область за пределами области - PullRequest
0 голосов
/ 11 мая 2018

Я следовал этому уроку gtkmm о том, как рисовать фигуры и заливать их цветами (например, красный диск на прозрачном фоне). Из этого примера я также смог вывести еще один пример с красным диском на синем фоне.

Однако мне действительно нужен прозрачный диск с синим фоном, который заполняет все минус область диска , которая должна оставаться прозрачной.

Таким образом, в Каире обычный рабочий процесс:

  1. Создать поверхность
  2. Нарисуйте фигуру (например, нарисуйте круг)
  3. Заполните круг, чтобы он стал диском.

Мне нужен какой-то рабочий процесс, который вместо этого достигает чего-то подобного:

  1. Создать поверхность
  2. Нарисуйте фигуру (например, нарисуйте круг)
  3. Заполните область за пределами круга, чтобы у меня был цветной фон с прозрачной "дырой" в середине.

Я провел некоторое исследование по этому вопросу в Интернете, но все примеры, похоже, предполагают, что мы хотим заполнить внутреннюю область фигуры (что, я должен признать, более типично).

Как я мог это сделать?

P.S. Я добавил тег C, потому что я не против, если вы предпочитаете использовать C (или даже Python).

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Нарисуйте свой круг и нарисуйте прямоугольник, содержащий все видимые области.Установите правило заполнения Каира четным / нечетным.Заполните.Готово.

cairo_save(cr); // Save the state
cairo_arc(cr, 42, 42, 21, 0, 2*M_PI); // Draw circle
cairo_rectangle(cr, 0, 0, width, height); // Rectangle containing everything
cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
cairo_fill(cr);
cairo_restore(cr); // Restore default fill rule (optional; pairs with save above)
0 голосов
/ 11 мая 2018

ИМХО, функция «Рисовать вне круга» сложна для графического каркаса.Это также может быть неоднозначным, если вы рисуете более одного круга, заполненного снаружи.

Поскольку графические фигуры, нарисованные позже, помещаются «на» нарисованные ранее.Для этого нужно нарисовать прямоугольник, чтобы заполнить весь графический контекст, прежде чем рисовать другие фигуры.Это определено как clear с фоновым цветом в некоторых платформах.

рабочий процесс будет выглядеть следующим образом:
1. Создайте поверхность.
2. Нарисуйте фон, окрашенный тем, что находится за пределами круга.
3. Нарисуйте круг, заполненный определенным цветом, например белым.
В результате круг закроет фон.

Если настаиватьСначала нарисуйте круг, пожалуйста, поищите Алгоритм заливки , который используется для рисования на изображениях.Тем не менее, не нужно и дорого получать пиксели экрана и воспроизводить такие алгоритмы при рисовании на экране.


Я считаю Пример приложения: Создание часов с Cairo в следующем разделекниги, которую вы предоставляете.Это похоже на помощь.

...