Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Март 29, 2015, 10:07



Название: Изменение базовых данных
Отправлено: Igors от Март 29, 2015, 10:07
Добрый день

"Архитектурный" вопрос, ну наверное (полагаю) паттерны и все такое :) Есть громадный QImage ARGB32 (грубо говоря) размер которого нередко гигабайты. Расчеты выполняются во флотах, рез-т сохраняется в ARGB32. Точка имеджа unsigned int, читается/пишется с помощью ф-ций типа qRgba.

И вот в один прекрасный день оказалось что 8-бит на канал мало для продвинутых пользователей. Подавай им 16, причем всяко-разно, 16 может быть unsigned short  или "пол-флота" (half).  При этом 8-бит никто не отменял, те 16 нужны относительно редко - но нужны. Т.е. юзер поставил бубочку - вывод 16-битный, иначе 8-битный (ну это он так хочет).

Проблема в том что unsigned int рассыпаны по всему коду, масса адресной арифметики использует sizeof(uint). Заменить прямолинейно на 4 ushort - уже работа на недели, но это просто не годится т.к. 8-бит тоже должно поддерживаться. Начинать городить if'ы - выглядит как верный путь к слабоумию.

Что бы Вы предложили?
Спасибо


Название: Re: Изменение базовых данных
Отправлено: Igors от Март 31, 2015, 08:26
Пугающая активность :) Хотя я сам пока не знаю что делать - нужен какой-то план. Решил выделить типичные использования данных ARGB32 в коде. Случай первый: ARGB32 хранится в структуре данных
Код
C++ (Qt)
struct CBigStruct {
 ...
 ...
 ARGB32 mColor;
 ARGB32 mAlpha;
 ...
 ...
};
Как это должно выглядеть с "универсальным" цветом (8/16 на канал)?
По ходу дела заметим: если есть прозрачность - нужны 4 буфера вместо одного.


Название: Re: Изменение базовых данных
Отправлено: Racheengel от Август 20, 2015, 23:55
Может баяню уже... но мы для подобной задачи 2 класса сделали с методами для их обработки, один класс для 8 битов, другой для 16.