~ubuntu-docviewer-dev/ubuntu-docviewer-app/lo-viewer

« back to all changes in this revision

Viewing changes to src/plugin/libreofficetoolkit-qml-plugin/renderengine.cpp

New method of multithreaded rendering.

Approved by Stefano Verzegnassi, Ubuntu Phone Apps Jenkins Bot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "renderengine.h"
 
2
#include <QtConcurrent/QtConcurrent>
 
3
#include <QThread>
 
4
 
 
5
RenderEngine* RenderEngine::s_instance = nullptr;
 
6
 
 
7
RenderEngine::RenderEngine():
 
8
    QObject(nullptr),
 
9
    m_activeTaskCount(0)
 
10
{
 
11
    int itc = QThread::idealThreadCount();
 
12
    m_idealThreadCount = itc == -1 ? DefaultIdealThreadCount : itc;
 
13
}
 
14
 
 
15
void RenderEngine::enqueueTask(const QSharedPointer<LODocument>& doc, const QRect& area, int id)
 
16
{
 
17
    Q_ASSERT(doc != nullptr);
 
18
 
 
19
    m_queue.enqueue(EngineTask(doc, area, id));
 
20
 
 
21
    doNextTask();
 
22
}
 
23
 
 
24
void RenderEngine::dequeueTask(int id)
 
25
{
 
26
    for (int i = 0; i < m_queue.size(); i++)
 
27
        if (m_queue.at(i).id == id) {
 
28
            m_queue.removeAt(i);
 
29
            break;
 
30
        }
 
31
}
 
32
 
 
33
void RenderEngine::internalRenderCallback(int id, QImage img)
 
34
{
 
35
    m_activeTaskCount--;
 
36
    Q_EMIT renderFinished(id, img);
 
37
    doNextTask();
 
38
}
 
39
 
 
40
void RenderEngine::doNextTask()
 
41
{
 
42
#ifdef DEBUG_VERBOSE
 
43
    qDebug() << " ---- doNextTask" << m_activeTaskCount << m_queue.count();
 
44
#endif
 
45
 
 
46
    if (m_activeTaskCount >= m_idealThreadCount || !m_queue.count())
 
47
        return;
 
48
 
 
49
    m_activeTaskCount++;
 
50
    auto task = m_queue.dequeue();
 
51
 
 
52
    QtConcurrent::run( [=] {
 
53
        QImage img = task.document->paintTile(task.area.size(), task.area);
 
54
        QMetaObject::invokeMethod(this, "internalRenderCallback", Q_ARG(int, task.id), Q_ARG(QImage, img));
 
55
    });
 
56
}