LINUX.ORG.RU
Ответ на: комментарий от bormant

то есть

В данной случае при:

+    outbuffer[(i<<2)+Alpha] = srcAlpha >= 0 ? inbuffer[i*4+srcAlpha] : 0;

srcAlpha будет равняться 3. И каждый inbuffer[i*4+srcAlpha] будет возвращать 0xFF, и снова получим пустое изображение.

Тут либо избавляемся от прозрачности(без разницы 0x00 с инверсией или 0xFF без инверсии). Либо находим способ узнать что в данном конкретном framebuffer-е подразумевается под alpha: transparency или opacity, и уже в зависимости от этого устанавливаем или нет инверсию.

Я бы просто добавил-бы опцию:

--skip-alpha
V1KT0P ★★
()
Последнее исправление: V1KT0P (всего исправлений: 3)
Ответ на: комментарий от V1KT0P

По общей логике выходит, что инверсия затеяна только ради значений inbuffer[i*4+srcAlpha]...

А srcAlpha как раз выставляется только при наличии альфаканала, иначе -1, см. от строки 181:

static int srcAlpha = 3; // сбивает с толку ;-)

...

    if (fb_varinfo_p->transp.length > 0) {
        srcAlpha = fb_varinfo_p->transp.offset >> 3;
    } else {
        srcAlpha = -1; // not used
    }

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 2)
Ответ на: комментарий от bormant

что инверсия затеяна только ради значений inbuffer[i*4+srcAlpha]

Дело в том что я не особо разбираюсь в framebuffer-ах, если у всех реализаций framebuffer-ов имеется ввиду либо только transparency либо только opacity, тогда то что ты предлагаешь легко исправить и я с тобой согласен.

Но если часть реализаций подразумевает transparency а часть opacity, то без дополнительного определения что именно имеется ввиду под alpha, то fbgrab сломается либо для первых framebuffer-ов либо для вторых.

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

Предлагаю решать проблемы по мере поступления ;-) — пока нет жалоб на инверсную прозрачность, не стоит чинить то, что пока не сломано ;-)

bormant ★★★★★
()
Ответ на: комментарий от bormant

пока нет жалоб на инверсную прозрачность

В том-то и дело что эта тема и есть эта жалоба. Я очень сомневаюсь что за все время существования никто не тестировал fbgrab в 32bit с alpha каналом, а значит это тестировали и там 0x00 был в качестве непрозрачности иначе это исправили бы. И вот тут появляется автор топика с framebuffer-ом у которого другое мнение насчет alpha и логика fbgrab ломается.

Из чего я делаю выводы что одни framebuffer-ы под alpha понимают transparency а другие opacity.

Хотя я могу ошибаться и просто ни программисты fbgrab ни его пользователи за все эти годы ни разу не запускали его для framebuffer-а в 32bit с alpha каналом.

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

Неверная интерпретация.

У ТС нет альфаканала:

alpha: ... length: 0 ...

Значит:
static void get_framebufferdata(
...
    if (/*fb_varinfo_p->transp.length > 0*/ false) {
        ...
    } else {
        srcAlpha = -1; // not used
    }
...
static void convert8888to32(
...
    outbuffer[(i<<2)+Alpha] = /*srcAlpha >= 0*/ false ? /*...*/ : 0;

А 0 тут нужен, поскольку во всех остальных convert*
static void convert1555to32(
...
	outbuffer[(i<<1)+Alpha] = '\0';
...
static void convert565to32(
...
	outbuffer[(i<<1)+Alpha] = '\0';

Выходит, что вызов png_set_invert_alpha(png_ptr) нужен только ради единственного отличия в convert8888to32() — когда альфаканал есть, проинвертировать inbuffer[i*4+srcAlpha]; иначе вместо тех нулей можно было сразу писать 0xff и не дергать инверсию альфаканала.

То есть 0xff (исправленный на 0 в ходе обсуждения) как раз и выбивается из этой общей схемы, и именно он и являлся явной ошибкой.

А на неправильность с альфаканалом (который физически есть, т.е. при выводе alpha: ... length: не_ноль ...) жалоб не было.

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 4)
Ответ на: комментарий от bormant

Неверная интерпретация.

Да, ты прав. Так что согласен, достаточно заменить 0xFF на 0x00.

V1KT0P ★★
()
Последнее исправление: V1KT0P (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.