gug-bg-herd
[Top][All Lists]
Advanced

[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/

reply via email to

[Prev in Thread] Current Thread [Next in Thread]