4231
|
Qt / 2D и 3D графика / Re: Сложить 2 QColor
|
: Январь 27, 2013, 12:38
|
Чисто с точки зрения техники программирования - удачна ли реализация оператора + для класса QColor? Да, она корректна в том смысле что дает нужный результат, но хорошее ли это "архитектурное" решение? Мне кажется что нет, а Вы как думаете?
Еще раз, мы что обсуждаем "технику" или "архитектуру"? Это как спросить: А как вам, с точки зрения архитектуры, шипы на балконных ограждениях? Издали смотрятся очень эффектно, а вот перелазить - больно.
|
|
|
4233
|
Qt / 2D и 3D графика / Re: Сложить 2 QColor
|
: Январь 26, 2013, 14:48
|
- (cosmetic) Вместо qBound лучше смотрится qMin
qBound это по сути qMax и qMin. - (bug) Вы подрезаете альфу ДО деления на нее, а надо после. Напр я складываю белый + черный. Если обе альфы = 255, должен получиться серый
Это спорно. Возможно это баг именно в вашей модели. - (performance) пусть один QColor или оба хранятся напр в HSV. Тогда обращение к каждой компоненте вызывает конверсию HSV->RGB, что весьма недешево.
Мы говорим только о: Складывать ARGB. При переполнении обрезать (клиппить). Словом: ARGB модель Исправьте пожалуйста, пипл любит текст для copy/paste
Так велком.
|
|
|
4234
|
Qt / Вопросы новичков / Re: extern "C" и создание динамической либы, из книги Шлее
|
: Январь 26, 2013, 14:42
|
Библиотека подключается, но функция которая в библиотеке не выполняется. Помогите разобраться, раз Шлее вместо того что бы просвятить - запутывает новичков Боюсь, что имя у этой функции теперь не такое простое. Ладно, если хочешь иметь не мангленное имя, то возвращай extern "C" и вместо QString используй char*.
|
|
|
4235
|
Qt / Вопросы новичков / Re: extern "C" и создание динамической либы, из книги Шлее
|
: Январь 26, 2013, 14:03
|
Суть проблемы в том, что при компилировании происходит ошибка: предупреждение: C4190: для "oddUpper" задана С-компоновка, но возвращаемый тип UDT "QString" несовместим с языком Си Шлее пишет, что при заключении в extern "C {...} компилятор не будет прикреплять информацию о типе к символьной сигнатуре функции. Без этого спецификатора компилятор может подставить вместо имени функции совсем другое имя, в котором будет закодирована дополнительная информация. Подскажите как решить это дело Компилятор тебя предупреждает, что функцию oddUpper ты декларируешь как С-функцию, но в качестве параметра и типа возвращаемого значения указываешь классы. Эта функция oddUpper не сможет работать с объектами классов. Либо не используй классы для этой функции, либо убери extern "C" и компилятор заманглит имя этой функции.
|
|
|
4236
|
Qt / 2D и 3D графика / Re: Сложить 2 QColor
|
: Январь 26, 2013, 13:58
|
C++ (Qt) static inline qreal c_to_f( int v ) { return qreal( v ) / 255.; } QColor operator+( const QColor &c1, const QColor &c2 ) { if( !c1.alpha() && !c2.alpha() ) return QColor( 0, 0, 0, 0 ); qreal a1 = c_to_f( c1.alpha() ); qreal a2 = c_to_f( c2.alpha() ); qreal a = qBound( 0., a1 + a2, 1. ); qreal r = qBound( 0., ( ( c_to_f( c1.red() ) * a1 + c_to_f( c2.red() ) * a2 ) / a, 1. ); qreal g = qBound( 0., ( ( c_to_f( c1.green() ) * a1 + c_to_f( c2.green() ) * a2 ) / a, 1. ); qreal b = qBound( 0., ( ( c_to_f( c1.blue() ) * a1 + c_to_f( c2.blue() ) * a2 ) / a, 1. );; return QColor::fromRgbF( r, g, b, a ); }
Писал прямо здесь, могут быть опечатки. От c_to_f можно отказаться, значения компонентов для вещественных чисел уже возвращаются приведенные к отрезку 0...1. C++ (Qt) QColor operator+( const QColor &c1, const QColor &c2 ) { if( !c1.alpha() && !c2.alpha() ) return QColor( 0, 0, 0, 0 ); qreal a1 = c1.alphaF(); qreal a2 = c2.alphaF(); qreal a = qBound( 0., a1 + a2, 1. ); qreal r = qBound( 0., ( c1.redF() * a1 + c2.redF() * a2 ) / a, 1. ); qreal g = qBound( 0., ( c1.greenF() * a1 + c2.greenF() * a2 ) / a, 1. ); qreal b = qBound( 0., ( c1.blueF() * a1 + c2.blueF() * a2 ) / a, 1. ); return QColor::fromRgbF( r, g, b, a ); }
|
|
|
4237
|
Qt / 2D и 3D графика / Re: Сложить 2 QColor
|
: Январь 26, 2013, 13:36
|
Такие коллизии надо решать самостоятельно, здесь уже предметная часть здесь ни при чем.
Не в вашем случае... Здесь лучше переспросить.
|
|
|
4238
|
Qt / 2D и 3D графика / Re: Сложить 2 QColor
|
: Январь 26, 2013, 13:22
|
А оператор за Вами
Итоговая альфа? Для этой формулы есть ограничения: два цвета не могут одновременно иметь alpha = 0.
|
|
|
4241
|
Qt / 2D и 3D графика / Re: Сложить 2 QColor
|
: Январь 26, 2013, 13:11
|
Ну интересно, а мне кто ее даст? А проверить можем Что проверить? Давайте математику. А если у вас ее нет, то почему вы решили, что она есть у разработчиков Qt или вообще есть? Как это делает фотошоп, нужно спрашивать у его разработчиков. Как это сделано в gimp можно посмотреть в его исходниках, но я сильно сомневаюсь что это одинаковые алгоритмы.
|
|
|
4242
|
Qt / 2D и 3D графика / Re: Сложить 2 QColor
|
: Январь 26, 2013, 12:49
|
Я намекаю что если проверить предложенный оператор на 2 цветах - получите чепуху
Дайте формула абсолютного топлива для расчета суммы цветов, будем проверять.
|
|
|
4243
|
Qt / 2D и 3D графика / Re: Сложить 2 QColor
|
: Январь 26, 2013, 12:36
|
Вот оказывается как все просто! А сомнений у Вас никаких не возникает? У меня вообще возникает сомнение в целесообразности "складывания цветов".
|
|
|
4244
|
Qt / 2D и 3D графика / Re: Сложить 2 QColor
|
: Январь 26, 2013, 12:29
|
Альфа выходного цвета должна быть равна сумме альф слагаемых.
C++ (Qt) QColor operator+( const QColor &a, const &b ) { return QColor( qBound( 0, a.red() + b.red(), 255 ), qBound( 0, a.green() + b.green(), 255 ), qBound( 0, a.blue() + b.blue(), 255 ), qBound( 0, a.alpha() + b.alpha(), 255 ) ); }
|
|
|
4245
|
Qt / 2D и 3D графика / Re: Сложить 2 QColor
|
: Январь 26, 2013, 12:21
|
Прошу исполнить C++ (Qt) QColor operator+( const QColor &a, const &b ) { return QColor( qBound( 0, a.red() + b.red(), 255 ), qBound( 0, a.green() + b.green(), 255 ), qBound( 0, a.blue() + b.blue(), 255 ) ); }
Что делать с альфой пока не знаю, если вы мне скажете какая она должна быть для "вашей суммы цветов", то я ее обязательно учту.
|
|
|
|
|