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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Заместител на gdk_draw_indexed_image в GTK 3


From: Yavor Doganov
Subject: Заместител на gdk_draw_indexed_image в GTK 3
Date: Sun, 14 Jan 2024 01:01:38 +0200
User-agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (Gojō) APEL-LB/10.8 EasyPG/1.0.0 Emacs/29.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO)

Здравейте и за много години!

Опитвам се да мигрирам alsaplayer към GTK 3 [1] и запецнах много
сериозно с gdk_draw_indexed_image.  Програмата има приставки, които
изобразяват разни щуротии в отделни прозорци докато се изпълнява
дадена песен, като щуротията се влияе от музиката (подобно на
диско-светлините едно време).  Например, приставката „blurscope“
изобразява нещо като съвкупност от хоризонтални свектавици като в
приложената снимка.  Оригиналният код на тази приставка е тук [2].

Друг проблем е (за по-късно), че дизайнът на програмата е да чертае в
нишки, което не е възможно при GTK 3.

По принцип не ми е съвсем ясно какво е „indexed image“, но
проследявайки кода на gdk_draw_indexed_image [3], следва
gdk_draw_rgb_image_core [4], където се генерира „scratch image“
(защо?) и се конвертира в две стъпки: в моя случай conv е
gdk_rgb_convert_indexed_generic [5], откъдето се извиква
gdk_rgb_indexed_to_stage [6], където се случва „кръвосмешението“ (или
индексирането) със зададения GdkRgbCmap, поне доколкото разбирам.
Следва gdk_rgb_convert_0888 [7] (установих го с gdb), където съгласно
коментара се извършва превръщане в 32-битов формат.  Тук GdkRgbCmap не
играе.

Въпросът е, как да се направи това с GTK 3?

Приложената примерна програма bar.c (за GTK 2) чертае хоризонтална
розово-виолетова линия на черен фон.  При запълване на буфера
audio_data се очаква да заиграе и да се получи търсения ефект.

Във втората примерна програма bazz.c (за GTK 3) използвам
cairo_pattern_create_raster_source, с надеждата във функцията за
обратна връзка acquire да добия горе-долу същото нещо.  Уви, чертае се
непълна пунктирана бледа линия неясно в какъв цвят.  Все пак,
чертането на нещо ми дава някаква плаха надежда, че може би има начин.

Забелязах, че в gdk_draw_rgb_image_core [4], gdk_draw_image се извиква
много пъти в рамките на вложения цикъл.  Опитах и този подход, но се
чертае само черен фон.  Очевидно нещо бъркам (сигурно много неща) --
с тези манипулации на пиксели на ниско ниво е много лесно да се объркаш.
Една променлива да не е наред и всичко се омазва.

По темата намерих само един обезсърчаващ материал [8], където
човечецът се е сблъскал със същия проблем, но ебаси му отговоря в
типичния си надменен стил.  Търсих и в Дебиан (codesearch.debian.net),
като се надявах да попадна на друга програма, която е използвала тази
функция и е мигрирала успешно, но нъц.

Срам ме е да кажа от колко време си блъскам главата с това нещо, в
задънена улица съм.  Всяка сутрин ставам уж с нови идеи как да
подходя, къде бъркам и т.н. и накрая нищо не се получава.  :(

[1] https://bugs.debian.org/967251
[2] 
https://sources.debian.org/src/alsaplayer/0.99.81-2/scopes2/blurscope/blurscope.c/
[3] https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-2-24/gdk/gdkrgb.c#L3626-3651
[4] https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-2-24/gdk/gdkrgb.c#L3292-3340
[5] https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-2-24/gdk/gdkrgb.c#L3032-3043
[6] https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-2-24/gdk/gdkrgb.c#L3000-3028
[7] https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-2-24/gdk/gdkrgb.c#L2125-2156
[8] 
https://discourse.gnome.org/t/gtk2-to-gtk3-migration-gdk-draw-indexed-image/4641

Attachment: bar.c
Description: Text document

Attachment: bazz.c
Description: Text document

PNG image


reply via email to

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