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: 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


reply via email to

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