Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. [Solved] Setting Qt for Embedded Pixel Type to 24bpp BGR
QtWS25 Last Chance

[Solved] Setting Qt for Embedded Pixel Type to 24bpp BGR

Scheduled Pinned Locked Moved Mobile and Embedded
4 Posts 3 Posters 7.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    mbarclaygmail.com
    wrote on last edited by
    #1

    I am trying to display my Qt for Embedded Linux application on a 24-bit framebuffer using BGR. I've been reading the QScreen docs:

    http://doc.qt.nokia.com/4.7-snapshot/qscreen.html#pixeltype-var

    It sounds like the only way to get BGR is to subclass QScreen in a custom screen driver plugin? Is that true? Is there an easier way to tell Qt to use 24-bit BGR?

    On my i.mx51 evaluation board, RGB 16 bit and 32 bit work fine. At 24 bit, the hardware wants BGR.

    Thanks in advance!

    Matt

    1 Reply Last reply
    0
    • M Offline
      M Offline
      mbarclaygmail.com
      wrote on last edited by
      #2

      After some more research, this looks like an issue with my framebuffer driver.

      Qt should auto detect and use BGR if the kernel reports BGR in use:

      struct fb_var_screeninfo is a kernel data structure that includes bitfields defining red, blue, green, and transparent.

      Qt calls ioctl FBIOGET_VSCREENINFO to populate fb_var_screeninfo

      Qt detects Pixel Type and Format using fb_var_screeninfo

      ./gui/embedded/qscreenlinuxfb_qws.cpp
      @
      1286 void QLinuxFbScreen::setPixelFormat(struct fb_var_screeninfo info)
      1287 {
      1288 const fb_bitfield rgba[4] = { info.red, info.green,
      1289 info.blue, info.transp };

      1309 case 24: {
      1310 const fb_bitfield rgb888[4] = {{16, 8, 0}, {8, 8, 0},
      1311 {0, 8, 0}, {0, 0, 0}};
      1312 const fb_bitfield bgr888[4] = {{0, 8, 0}, {8, 8, 0},
      1313 {16, 8, 0}, {0, 0, 0}};
      1314 if (memcmp(rgba, rgb888, 3 * sizeof(fb_bitfield)) == 0) {
      1315 format = QImage::Format_RGB888;
      1316 } else if (memcmp(rgba, bgr888, 3 * sizeof(fb_bitfield)) == 0) {
      1317 format = QImage::Format_RGB888;
      1318 pixeltype = QScreen::BGRPixel;
      1319 }
      1320 break;
      1321 }
      @

      format is set properly to QImage::Format_RGB888, so the branch at 1314 is taken. If the kernel were reporting a BGR bitfield, then the branch at 1316 would be taken instead and Qt would display BGR pixels.

      Any advice on where to look in the Kernel 2.6.35.3 is appreciated!

      Thanks,
      Matt

      1 Reply Last reply
      0
      • I Offline
        I Offline
        insert0003
        wrote on last edited by
        #3

        Matt:

        I am using imx6 with Qt 4.8.2.
        I have meet the same question.
        so, I start to read Qt opensource.
        please look at this source.

        ./gui/embedded/qscreen_qws.cpp
        Line 1208

        void qt_blit_setup(QScreen *screen, const QImage &image,
        const QPoint &topLeft, const QRegion &region)
        {
        switch (screen->depth()) {
        #ifdef QT_QWS_DEPTH_32
        case 32:
        if (screen->pixelType() == QScreen::NormalPixel)
        screen->d_ptr->blit = blit_32;
        else
        screen->d_ptr->blit = blit_template<qabgr8888, quint32>;
        break;
        #endif
        #ifdef QT_QWS_DEPTH_24
        case 24:
        if (screen->pixelType() == QScreen::NormalPixel)
        screen->d_ptr->blit = blit_qrgb888;
        else
        screen->d_ptr->blit = blit_24;
        break;
        #endif

        #ifdef QT_QWS_DEPTH_16
        case 16:
        #if Q_BYTE_ORDER == Q_BIG_ENDIAN
        if (screen->d_ptr->fb_is_littleEndian)
        screen->d_ptr->blit = blit_16_bigToLittleEndian;
        else
        #endif
        if (screen->pixelType() == QScreen::NormalPixel)
        screen->d_ptr->blit = blit_16;
        else
        screen->d_ptr->blit = blit_template<qbgr565, quint16>;
        break;
        #endif

        32bit, 16bit are same.
        24bit is different.
        why 24bit is different?
        I have modified 24bit to same as 32bit and 16bit.
        The color is all right.
        Is this a bug for Qt?
        modified code is
        #ifdef QT_QWS_DEPTH_24
        case 24:
        if (screen->pixelType() == QScreen::NormalPixel)
        screen->d_ptr->blit = blit_24;
        else
        screen->d_ptr->blit = blit_template<qrgb888, quint24>;
        break;
        #endif

        1 Reply Last reply
        0
        • S Offline
          S Offline
          Sidii
          wrote on last edited by
          #4

          Is this valid for Qt5.x also?? I am also facing the Color issue after cross compiling the QT from source code for powerpc.
          RGB is appearing as BRG.

          1 Reply Last reply
          0

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved