diff --git a/src/plugins/platforms/eglfs/cursor.json b/src/plugins/platforms/eglfs/cursor.json new file mode 100644 index 0000000000..7b6b6d95fa --- /dev/null +++ b/src/plugins/platforms/eglfs/cursor.json @@ -0,0 +1,28 @@ +{ + "image": ":/cursor-atlas.png", + "cursorsPerRow": 8, + "hotSpots": [ + [7, 2], + [13, 3], + [13, 13], + [13, 13], + [14, 15], + [13, 13], + [13, 13], + [13, 13], + [13, 13], + [13, 13], + [13, 13], + [13, 13], + [13, 13], + [13, 13], + [13, 13], + [10, 1], + [13, 13], + [0, 0], + [0, 0], + [13, 13], + [13, 13] + ] +} + diff --git a/src/plugins/platforms/eglfs/cursor.qrc b/src/plugins/platforms/eglfs/cursor.qrc index 64d9b2b478..8ea6e86587 100644 --- a/src/plugins/platforms/eglfs/cursor.qrc +++ b/src/plugins/platforms/eglfs/cursor.qrc @@ -1,6 +1,7 @@ cursor-atlas.png + cursor.json diff --git a/src/plugins/platforms/eglfs/qeglfscursor.cpp b/src/plugins/platforms/eglfs/qeglfscursor.cpp index 20cd7b978b..0d068f38c0 100644 --- a/src/plugins/platforms/eglfs/qeglfscursor.cpp +++ b/src/plugins/platforms/eglfs/qeglfscursor.cpp @@ -43,12 +43,13 @@ #include #include #include +#include +#include +#include #include QT_BEGIN_NAMESPACE -#define CURSORS_PER_ROW 8 - QEglFSCursor::QEglFSCursor(QEglFSScreen *screen) : m_screen(screen), m_pos(0, 0), m_program(0), m_vertexCoordEntry(0), m_textureCoordEntry(0), m_textureEntry(0) { @@ -114,13 +115,32 @@ void QEglFSCursor::createCursorTexture(uint *texture, const QImage &image) void QEglFSCursor::initCursorAtlas() { - static QByteArray atlas = qgetenv("QT_QPA_EGLFS_CURSORATLAS"); - if (atlas.isEmpty()) - atlas = ":/cursor-atlas.png"; + static QByteArray json = qgetenv("QT_QPA_EGLFS_CURSOR"); + if (json.isEmpty()) + json = ":/cursor.json"; + + QFile file(json); + file.open(QFile::ReadOnly); + QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); + QJsonObject object = doc.object(); + + QString atlas = object.value("image").toString(); + Q_ASSERT(!atlas.isEmpty()); + + const int cursorsPerRow = object.value("cursorsPerRow").toDouble(); + Q_ASSERT(cursorsPerRow); + m_cursorAtlas.cursorsPerRow = cursorsPerRow; + + const QJsonArray hotSpots = object.value("hotSpots").toArray(); + Q_ASSERT(hotSpots.count() == Qt::LastCursor); + for (int i = 0; i < hotSpots.count(); i++) { + QPoint hotSpot(hotSpots[i].toArray()[0].toDouble(), hotSpots[i].toArray()[1].toDouble()); + m_cursorAtlas.hotSpots << hotSpot; + } + QImage image = QImage(atlas).convertToFormat(QImage::Format_ARGB32_Premultiplied); - m_cursorAtlas.cursorWidth = image.width() / CURSORS_PER_ROW; - m_cursorAtlas.cursorHeight = image.height() / ((Qt::LastCursor + CURSORS_PER_ROW - 1) / CURSORS_PER_ROW); - m_cursorAtlas.hotSpot = QPoint(m_cursorAtlas.cursorWidth/2, m_cursorAtlas.cursorHeight/2); // ## be smarter + m_cursorAtlas.cursorWidth = image.width() / m_cursorAtlas.cursorsPerRow; + m_cursorAtlas.cursorHeight = image.height() / ((Qt::LastCursor + cursorsPerRow - 1) / cursorsPerRow); m_cursorAtlas.width = image.width(); m_cursorAtlas.height = image.height(); createCursorTexture(&m_cursorAtlas.texture, image); @@ -137,10 +157,10 @@ void QEglFSCursor::changeCursor(QCursor *cursor, QWindow *window) if (cursor->shape() != Qt::BitmapCursor) { // standard cursor const float ws = (float)m_cursorAtlas.cursorWidth / m_cursorAtlas.width, hs = (float)m_cursorAtlas.cursorHeight / m_cursorAtlas.height; - m_cursor.textureRect = QRectF(ws * (m_cursor.shape % CURSORS_PER_ROW), - hs * (m_cursor.shape / CURSORS_PER_ROW), + m_cursor.textureRect = QRectF(ws * (m_cursor.shape % m_cursorAtlas.cursorsPerRow), + hs * (m_cursor.shape / m_cursorAtlas.cursorsPerRow), ws, hs); - m_cursor.hotSpot = m_cursorAtlas.hotSpot; + m_cursor.hotSpot = m_cursorAtlas.hotSpots[m_cursor.shape]; m_cursor.texture = m_cursorAtlas.texture; m_cursor.size = QSize(m_cursorAtlas.cursorWidth, m_cursorAtlas.cursorHeight); } else { @@ -155,6 +175,11 @@ void QEglFSCursor::changeCursor(QCursor *cursor, QWindow *window) QWindowSystemInterface::handleSynchronousExposeEvent(window, rgn); } +QRect QEglFSCursor::cursorRect() const +{ + return QRect(m_pos - m_cursor.hotSpot, m_cursor.size); +} + QPoint QEglFSCursor::pos() const { return m_pos; diff --git a/src/plugins/platforms/eglfs/qeglfscursor.h b/src/plugins/platforms/eglfs/qeglfscursor.h index a580404ab8..43f6b681a8 100644 --- a/src/plugins/platforms/eglfs/qeglfscursor.h +++ b/src/plugins/platforms/eglfs/qeglfscursor.h @@ -61,7 +61,7 @@ public: QPoint pos() const; void setPos(const QPoint &pos); - QRect cursorRect() const { return QRect(m_pos, m_cursor.size); } + QRect cursorRect() const; void render(); @@ -74,11 +74,12 @@ private: // cursor atlas information struct CursorAtlas { - CursorAtlas() : texture(0), cursorWidth(0), cursorHeight(0) { } + CursorAtlas() : cursorsPerRow(0), texture(0), cursorWidth(0), cursorHeight(0) { } + int cursorsPerRow; uint texture; int width, height; // width and height of the the atlas int cursorWidth, cursorHeight; // width and height of cursors inside the atlas - QPoint hotSpot; + QList hotSpots; } m_cursorAtlas; // current cursor information