1 #include <QLibrary> |
1 #include <QLibrary> |
2 #include <QtQml> |
2 #include <QtQml> |
3 #include <QDebug> |
3 #include <QDebug> |
|
4 #include <QPainter> |
4 |
5 |
5 #include "hwengine.h" |
6 #include "hwengine.h" |
|
7 #include "previewimageprovider.h" |
6 |
8 |
7 extern "C" { |
9 extern "C" { |
8 RunEngine_t *RunEngine; |
10 RunEngine_t *RunEngine; |
9 registerIPCCallback_t *registerIPCCallback; |
11 registerIPCCallback_t *registerIPCCallback; |
10 ipcToEngine_t *ipcToEngine; |
12 ipcToEngine_t *ipcToEngine; |
11 flibInit_t *flibInit; |
13 flibInit_t *flibInit; |
12 } |
14 } |
13 HWEngine::HWEngine(QObject *parent) : |
15 |
14 QObject(parent) |
16 HWEngine::HWEngine(QQmlEngine *engine, QObject *parent) : |
|
17 QObject(parent), |
|
18 m_engine(engine) |
15 { |
19 { |
16 QLibrary hwlib("./libhwengine.so"); |
20 QLibrary hwlib("./libhwengine.so"); |
17 |
21 |
18 if(!hwlib.load()) |
22 if(!hwlib.load()) |
19 qWarning() << "Engine library not found" << hwlib.errorString(); |
23 qWarning() << "Engine library not found" << hwlib.errorString(); |
46 m_args.resize(m_argsList.size()); |
50 m_args.resize(m_argsList.size()); |
47 for(int i = m_argsList.size() - 1; i >=0; --i) |
51 for(int i = m_argsList.size() - 1; i >=0; --i) |
48 m_args[i] = m_argsList[i].constData(); |
52 m_args[i] = m_argsList[i].constData(); |
49 |
53 |
50 RunEngine(m_args.size(), m_args.data()); |
54 RunEngine(m_args.size(), m_args.data()); |
|
55 sendIPC("eseed helloworld"); |
|
56 sendIPC("e$mapgen 0"); |
51 sendIPC("!"); |
57 sendIPC("!"); |
52 } |
58 } |
53 |
59 |
54 static QObject *hwengine_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) |
60 static QObject *hwengine_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) |
55 { |
61 { |
56 Q_UNUSED(engine) |
|
57 Q_UNUSED(scriptEngine) |
62 Q_UNUSED(scriptEngine) |
58 |
63 |
59 HWEngine *hwengine = new HWEngine(); |
64 HWEngine *hwengine = new HWEngine(engine); |
60 return hwengine; |
65 return hwengine; |
61 } |
66 } |
62 |
67 |
63 void HWEngine::exposeToQML() |
68 void HWEngine::exposeToQML() |
64 { |
69 { |
69 void HWEngine::sendIPC(const QByteArray & b) |
74 void HWEngine::sendIPC(const QByteArray & b) |
70 { |
75 { |
71 quint8 len = b.size() > 255 ? 255 : b.size(); |
76 quint8 len = b.size() > 255 ? 255 : b.size(); |
72 qDebug() << "sendIPC: len = " << len; |
77 qDebug() << "sendIPC: len = " << len; |
73 |
78 |
74 ipcToEngine(len, b.constData()); |
79 ipcToEngine(b.constData(), len); |
75 } |
80 } |
76 |
81 |
77 void HWEngine::engineMessageCallback(void *context, quint8 len, const char *msg) |
82 void HWEngine::engineMessageCallback(void *context, const char * msg, quint32 len) |
78 { |
83 { |
|
84 HWEngine * obj = (HWEngine *)context; |
79 QByteArray b = QByteArray::fromRawData(msg, len); |
85 QByteArray b = QByteArray::fromRawData(msg, len); |
80 |
86 |
81 qDebug() << "FLIPC in" << b; |
87 qDebug() << "FLIPC in" << b.size() << b; |
|
88 |
|
89 QMetaObject::invokeMethod(obj, "engineMessageHandler", Qt::QueuedConnection, Q_ARG(QByteArray, b)); |
82 } |
90 } |
|
91 |
|
92 void HWEngine::engineMessageHandler(const QByteArray &msg) |
|
93 { |
|
94 if(msg.size() == 128 * 256) |
|
95 { |
|
96 QVector<QRgb> colorTable; |
|
97 colorTable.resize(256); |
|
98 for(int i = 0; i < 256; ++i) |
|
99 colorTable[i] = qRgba(255, 255, 0, i); |
|
100 |
|
101 const quint8 *buf = (const quint8*) msg.constData(); |
|
102 QImage im(buf, 256, 128, QImage::Format_Indexed8); |
|
103 im.setColorTable(colorTable); |
|
104 |
|
105 QPixmap px = QPixmap::fromImage(im, Qt::ColorOnly); |
|
106 //QPixmap pxres(px.size()); |
|
107 //QPainter p(&pxres); |
|
108 |
|
109 //p.fillRect(pxres.rect(), linearGrad); |
|
110 //p.drawPixmap(0, 0, px); |
|
111 |
|
112 PreviewImageProvider * preview = (PreviewImageProvider *)m_engine->imageProvider(QLatin1String("preview")); |
|
113 preview->setPixmap(px); |
|
114 emit previewImageChanged(); |
|
115 } |
|
116 } |