[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Аналог на GDK_INVERT при cairo/GTK 3
From: |
Kaloian Doganov |
Subject: |
Re: Аналог на GDK_INVERT при cairo/GTK 3 |
Date: |
Sun, 10 Nov 2019 13:44:52 +0200 |
User-agent: |
Evolution 3.30.5-1.1 |
Малко е неудобно да се чете функция без изрично упоменати входящи
параметри. :-)
Нищо не разбирам от GTK и Cairo, но поведението което описваш, е
напълно логично. Ние искаме селекцията да се изобразява върху
графиката, което означава, че ако тръгнем със стратегията да
прерисуваме всичко, трябва първо да изрисуваме графиката, а после
селекцията отгоре. А тук вместо това първо рисуваме селекцията, а
после нареждаме на опашката изрисуването на графиката.
Понеже изрисуването на графиката става асинхронно, минава известно
време в което все пак виждаме селекцията на екрана. Мине ли
изрисуването на графиката, обаче, селекцията бива затрита, затова
трябва да постоянно да движим мишката и да тригерираме същата функция.
Правилното изпълнение на тази стратегия (с прерисуване на всичко), е
движението на мишката да тригерира прерисуване на графиката, а веднага
след прерисуването на графиката да се рисува селекцията отгоре. Не
знам как това се прави с GTK и Cairo, но нещо такова трябва да се
организира. Представям си, че би могъл да се закачиш за ::draw и, ако
имаш активна селекция, да си рисуваш селекцията веднага след като
стандартния ::draw се изпълни, но това са хвърчащи фантазии.
Прерисуването на всичко навярно е тежко, и го има тоя проблем с
премигването. Не ми става ясно в какво се изразява премигването --
премигва само селекцията или цялата графика? Ако е само селекцията,
този ефект сигурно ще изчезне ако рисуваш селекцията веднага след
::draw на графиката. Ако премигва цялата графика, тогава сигурно
трябва да се търси друго решение.
Относно cairo_operator_t, това ми прилича на Porter-Duff оператор.
Струва ми се, че правилно си се насочил към _XOR, само че навярно има
още някакви други параметри, които трябва да се посочат при рисуване.
Най-доброто въведение в alpha compositing, което съм срещал, е статията
на Bartosz Ciechanowski [1]. Това няма нищо общо с Cairo, но ще ти
даде някаква теоретичната основа за да разбереш какво прави съответното
API на Cairo.
При всички положения, обаче, ми се струва добра идея да се закачиш за
::draw и да рисуваш селекцията веднага след "стандартния" ::draw на
графиката (по възможност синхронно, в същия пас на main queue-то). По
този начин, ако нещо друго в системата тригерира ::draw, ти ще си там
за да си нарисуваш селекцията отгоре.
[1] https://ciechanow.ski/alpha-compositing/