Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: xokc от Март 16, 2010, 21:35



Название: QLinearGradient bugs?
Отправлено: xokc от Март 16, 2010, 21:35
При использовании следующего кода
Код:
    const int w = 64 * 1024;
    QImage img(w, 1, QImage::Format_RGB32);
    QLinearGradient gradient(0, 0, img.width() - 1, 1);
    gradient.setColorAt(0, Qt::blue);
    gradient.setColorAt(1, Qt::red);
    QPainter painter(&img);
    painter.fillRect(img.rect(), gradient);
    img.save("test.png");
Нормальный градиент отрисовывается только для w < 32*1024. Иначе, заполняются градиентом только те точки, чья х-координата меньше 32*1024.
Кроме того, даже для для случаев с w < 32 * 1024, цвет крайней правой точки равен не 0xFF0000 (Qt::red), а 0хFD0001 (для w = 32 * 1024 - 1).
Qt 4.6.0, WinXP, MSVS и MinGW.


Название: Re: QLinearGradient bugs?
Отправлено: Rcus от Март 17, 2010, 04:09
Все в порядке.
Цитировать
Limitations

If you are using coordinates with Qt's raster-based paint engine, it is important to note that, while coordinates greater than +/- 2^15 can be used, any painting performed with coordinates outside this range is not guaranteed to be shown; the drawing may be clipped. This is due to the use of short int in the implementation.


Название: Re: QLinearGradient bugs?
Отправлено: GreatSnake от Март 17, 2010, 10:32
Остается 2 выхода - либо самому заполнять image градиентом либо тупо создать image (2^15 x 1) и залить его как делаете вы и уже потом scale-нуть этот image в image нужного вам размера. Для плавности переходов можно задействовать Qt::SmoothTransformation.


Название: Re: QLinearGradient bugs?
Отправлено: xokc от Март 17, 2010, 19:41
Да я-то справлюсь и так. Просто как-то некрасиво получается - чем их short лимитирует? А по второй части вопроса мысли у кого-нибудь есть?


Название: Re: QLinearGradient bugs?
Отправлено: GreatSnake от Март 17, 2010, 20:04
Цитировать
Просто как-то некрасиво получается - чем их short лимитирует?
Мне тоже не понятно, т.к. для QImage тролли декларируют, что у них свой отдельный QPaintEngine, который по идее не должен быть завязан на оконную систему. Значит что-то не до конца сделали.

Цитировать
А по второй части вопроса мысли у кого-нибудь есть?
Похоже на баг либо на ошибку привидения. А для w = 32 * 1024 - 2 ?


Название: Re: QLinearGradient bugs?
Отправлено: xokc от Март 17, 2010, 20:15
Похоже на баг либо на ошибку привидения. А для w = 32 * 1024 - 2 ?
Да по-фигу ей размер. Последний пиксель градиента все равно не равен тому, который задается в setColorAt(1, Qt::red)


Название: Re: QLinearGradient bugs?
Отправлено: GreatSnake от Март 18, 2010, 09:32
Имхо, точная передача цвета при градиенте не важна.
К тому же, опять-таки имхо, человеческий глаз различий между 0xFF0000 и 0хFD0001 не заметит.


Название: Re: QLinearGradient bugs?
Отправлено: xokc от Март 18, 2010, 19:59
А не человеческий не глаз заметит? Я же заметил. Это что за подход такой - 2 приблизительно равно 3?