[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
bar.c
Description: Text document
bazz.c
Description: Text document
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Заместител на gdk_draw_indexed_image в GTK 3,
Yavor Doganov <=