[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: |
Tue, 12 Nov 2019 18:15:47 +0200 |
User-agent: |
Evolution 3.30.5-1.1 |
On Tue, 2019-11-12 at 11:56 +0200, Yavor Doganov wrote:
> Страхотна функция си използвал, много ми помогна да
> вникна в нещата, сякаш задейства дремещи когнитивни способности :-).
Знаех си, че ще я оцениш. :-)
> Вече сигурно над 20 програми съм портнал, почти всяка
> по-сложна от тях си позволява да рисува извън expose_event. API-то
> го
> позволява, дори и при GTK 3 с gdk_cairo_create и по-новите функции
> като gdk_window_begin_draw_frame.
Пак казвам, понякога се налага да се правят такива неща от съображения
за производителност. Но всяко рисуване извън ::draw трябва да бъде
внимателно организирано така, че да се кооперира с ::draw, а не да си
пречат взаимно. И, разбира се, винаги трябва да се спазва поведението
::draw да рисува целия widget, а не само някакъв аспект от него.
> Притеснява ме малко gtk_plot_canvas_button_release, където не съм
> сигурен дали едно от условията
>
> if (canvas->action != GTK_PLOT_CANVAS_ACTION_INACTIVE && veto)
>
> ще пасне на логиката в ::draw.
Да си призная, не съумявам да проследя внимателно как GtkPlotCanvas
менажира вътрешното си състояние. Например разбирам, че това veto е
булева стойност, която signal handler-а може да върне, но не разбирам
каква му е сементиката, защото не виждам къде има signal handler, който
връща такъв резултат. Навярно става дума за някаква известна на всички
конвенция в GTK, която не съм чувал, защото нямам и хабер от GTK.
> Единственият недостатък е, че се прерисува всичко
> доста пъти. Но по-важното е, че работи.
Ако открием функционален аналог на GDK_INVERT в Cairo, можем да намалим
прерисуванията по време селекция (запазвайки приличното поведение на
::draw), но не знам дали си струва.
Между другото, как рисуваш селекцията сега с Cairo? Получаваш ли
(нежелания) ефект на antialiasing на селекцията? Ако да, пробвай да
прибавиш 0.5 към x и y:
cairo_rectangle (cr, area.x + 0.5, area.y + 0.5, area.width,
area.height);
Причините за този ефект са обяснени във FAQ-а [1].
> Благодаря за насоките.
Добре си дошъл. :-)
[1] https://www.cairographics.org/FAQ/#sharp_lines