Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Installation and Deployment
  4. Custom image plugin testing difficulties
QtWS25 Last Chance

Custom image plugin testing difficulties

Scheduled Pinned Locked Moved Installation and Deployment
17 Posts 2 Posters 3.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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #4

    The most simple is to copy your plugin in Qt's plugin folder or you can tell your application to search in the folder containing your plugin with QCoreApplication::addLibraryPath

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    0
    • C Offline
      C Offline
      ChrisM87
      wrote on last edited by
      #5

      Well as I showed above, with the QT_DEBUG_PLUGINS variable set, the program is picking it up. However, it still refuses to load it. Is the IID or keys array invalid? I figured if it was choking on the plugin code itself, it would either error, segfault, or spit out a corrupt PNG.

      1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #6

        Without seeing your code, it's pretty much Crystal Ball Debugging (™) I can't say

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        0
        • C Offline
          C Offline
          ChrisM87
          wrote on last edited by ChrisM87
          #7

          Well, I had posted my code in the original post. However, my handler class was tweaked a bit after spotting some errors, so here's the updated class code:

          EDIT: I did a few tests on QImageReader that should fail with unsupported format error, but I keep getting "unknown error." I attempted to load my ".pro" qmake file to see which error it would get but still unknown error. However, I compiled qtraw from Github, dropped it into an imageformats subdirectory and it ran fine.

          #include <QDataStream>
          #include <QImage>
          #include <QIODevice>
          #include <QtGlobal>
          #include <QtMath>
          #include <QVariant>
          #include <QVector>
          #include <QImageIOHandler>
          
          class TimHandler final: public QImageIOHandler
          {
          public:
          	bool canRead() const;
          	bool read(QImage *img);
          	QVariant option(ImageOption op) const override;
          	bool supportsOption(ImageOption op) const override;
          };
          
          #define BIT16 0.121568627451
          
          bool TimHandler::canRead() const
          {
          	return device()->peek(4) == "\x10\x0\x0\x0";
          }
          
          static inline quint32 rgba5551ToArgb32(quint16 c)
          {
          	quint32 r = ((c & 0xf800) >> 11) / BIT16;
          	quint32 g = ((c & 0x7c0) >> 6) / BIT16;
          	quint32 b = ((c & 0x3e) >> 1) / BIT16;
          	quint32 a = c & 1 ? 0 : 0xff;
          	
          	return ((a << 24) | (r << 16) | (g << 8) | b);
          }
          
          bool TimHandler::read(QImage *img)
          {
          	QDataStream ds(device());
          	ds.setByteOrder(QDataStream::LittleEndian);
          	quint32 magic, flags;
          	
          	ds >> magic >> flags;
          	if (ds.status() != QDataStream::Ok || magic != 0x10)
          		return false;
          	bool hasClut = flags & 0x8 ? true : false;
          	quint8 pxlMode = flags & 0x7;
          	
          	quint8 bpp;
          	switch (pxlMode)
          	{
          		case 0: bpp = 4; break;
          		case 1: bpp = 8; break;
          		case 2: bpp = 16; break;
          		case 3: bpp = 24; break;
          		default: bpp = 4;
          	}
          	
          	QVector<QRgb> clut;
          	if (hasClut)
          	{
          		quint32 colors, npals;
          		ds.skipRawData(12);
          		ds >> colors >> npals;
          		
          		for (quint16 i = 0; i < (colors*npals); i++)
          		{
          			quint16 c;
          			ds >> c;
          			clut.append(rgba5551ToArgb32(c));
          		}
          	}
          	
          	ds.skipRawData(8);
          	quint16 w, h;
          	ds >> w >> h;
          	w = (w*16)/bpp;
          	
          	if (img) delete img;
          	img = new QImage(w, h, QImage::Format_ARGB32);
          	if (hasClut) img->setColorTable(clut);
          	
          	for (quint16 y = 0; y < h; y++)
          	{
          		for (quint16 x = 0; x < w; x++)
          		{
          			switch (bpp)
          			{
          				case 4:
          				{
          					quint8 p;
          					ds >> p;
          					img->setPixel(x++, y, p & 0xf0);
          					img->setPixel(x, y, p & 0xf);
          				}
          					break;
          				case 8:
          				{
          					quint8 p;
          					ds >> p;
          					img->setPixel(x, y, p);
          				}
          					break;
          				case 16:
          				{
          					quint16 p;
          					ds >> p;
          					img->setPixel(x, y, rgba5551ToArgb32(p));
          				}
          					break;
          			}
          		}
          	}
          	
          	return true;
          }
          
          bool TimHandler::supportsOption(ImageOption op) const
          {
          	switch (op)
          	{
          		case Size:
          			return true;
          		default:
          			return false;
          	}
          }
          
          QVariant TimHandler::option(ImageOption op) const
          {
          	switch (op)
          	{
          		case Size:
          		{
          			quint32 size;
          			quint16 w, h;
          			QDataStream ds(device());
          			ds.skipRawData(8);
          			ds >> size;
          			size -= 4; // 12 - image size - palette x - palette y
          			ds.skipRawData(size);
          			ds >> w >> h;
          			return QSize(w, h);
          		}
          		default:
          			return QVariant();
          	}
          }
          
          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #8

            Sorry about the code part, I had a problem when I read it first and only saw the end of it.
            What about a more simple json ?

            {
                "Keys": [ "tim" ],
                "MimeTypes": [ "image/x-tim" ]
            }
            
            

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            0
            • C Offline
              C Offline
              ChrisM87
              wrote on last edited by ChrisM87
              #9

              Well, while I could try that, I don't know if that's the mime type for TIM files. A Google search doesn't help either. My examination of qtraw shows that it too lacks a mime type entry. Thus, I thought it was unnecessary.

              EDIT: tried it anyway, still nothing

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #10

                Just thought of something… Your plugin code is correct but:

                img.load("0025.tim", "tim");

                "0025.tim" is a relative path, is that image in the same folder as your executable ? You should rather give the full path to it.

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply
                0
                • C Offline
                  C Offline
                  ChrisM87
                  wrote on last edited by ChrisM87
                  #11

                  Same directory, yep. Though of course in a real world scenario this would be different.

                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #12

                    I forgot a correction I made:

                    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QImageIOHandlerFactoryInterface" FILE "tim.json")

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    0
                    • C Offline
                      C Offline
                      ChrisM87
                      wrote on last edited by
                      #13

                      Yeah, I changed it to that in my progress trying to fix it, but no go. I booted up QtCreator and created a new project from Qt plugin template but I see nothing unusual in comparison with my code, aside from the constructor with QObject* parameter, which I skipped in my code because I saw no point for an empty constructor/destructor.

                      1 Reply Last reply
                      0
                      • C Offline
                        C Offline
                        ChrisM87
                        wrote on last edited by
                        #14

                        So after a little tinkering, I got qmake to generate main.moc which I thought was needed, but I'm still having issues with the plugin not being discovered. Additionally, the RGBA5551 conversion function was incorrect, which I fixed, but that shouldn't be the make-or-break factor.

                        1 Reply Last reply
                        0
                        • SGaistS Offline
                          SGaistS Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on last edited by
                          #15

                          Not being discovered or not loaded ? Did you put your plugin in a imageformats subfolder ?

                          Interested in AI ? www.idiap.ch
                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          0
                          • C Offline
                            C Offline
                            ChrisM87
                            wrote on last edited by ChrisM87
                            #16

                            Yep. Even set target.path in my .pro file thinking that was the issue. Qt seems very nitpicky.

                            EDIT: Just debugged again, found this gem of an error:

                            QLibraryPrivate::loadPlugin failed on "/home/admin/Documents/Qt-extra/imageformats/qtim/timtest/imageformats/libqtim.so" : "Cannot load library /home/admin/Documents/Qt-extra/imageformats/qtim/timtest/imageformats/libqtim.so: (/home/admin/Documents/Qt-extra/imageformats/qtim/timtest/imageformats/libqtim.so: undefined symbol: _ZN11QTimHandler9setOptionEN15QImageIOHandler11ImageOptionERK8QVariant)"
                            
                            1 Reply Last reply
                            0
                            • SGaistS Offline
                              SGaistS Offline
                              SGaist
                              Lifetime Qt Champion
                              wrote on last edited by
                              #17

                              Which version of Qt are you using ?
                              What happens if you try to load it by hand using QLibrary ?

                              Interested in AI ? www.idiap.ch
                              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                              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