Why does it take 40-50 ms to draw text, and especially set bold/italic...

master
Melroy van den Berg 2020-11-21 01:35:30 +01:00
parent 9a58be4e92
commit 4e8946034a
4 changed files with 42 additions and 18 deletions

View File

@ -67,6 +67,7 @@
"bit": "cpp",
"qsizepolicy": "cpp",
"qgraphicsscene": "cpp",
"qstring": "cpp"
"qstring": "cpp",
"qtglobal": "cpp"
}
}

View File

@ -3,6 +3,10 @@
#include "md-parser.h"
#include "md-render.h"
#include <chrono>
#include <iostream>
#ifdef LEGACY_CXX
#include <experimental/filesystem>
namespace n_fs = ::std::experimental::filesystem;
@ -64,17 +68,31 @@ void MainWindow::setupParser()
std::string filePath = exePath.append("/../../test.md");
printf("Path: %s\n", filePath.c_str());
typedef std::chrono::high_resolution_clock Time;
typedef std::chrono::milliseconds ms;
typedef std::chrono::duration<float> fsec;
cmark_node *root_node = parser->parseFile(filePath);
if (root_node != NULL) {
htmlOutput = parser->renderHTML(root_node);
auto t0 = Time::now();
// Render AST to scene
renderer->renderDocument(root_node);
auto t1 = Time::now();
fsec fs = t1 - t0;
ms d = std::chrono::duration_cast<ms>(fs);
printf("Duration\n");
std::cout << "ms: " << d.count() << std::endl;
cmark_node_free(root_node);
}
setOutputToTextEdit(QString::fromStdString(htmlOutput));
}
/**

View File

@ -11,6 +11,7 @@
Renderer::Renderer(Scene* scene) :
scene(scene),
defaultFontSize(12),
sceneMarginX(3.0),
sceneMarginY(3.0),
bold(false),
@ -26,6 +27,9 @@ Renderer::Renderer(Scene* scene) :
headingHeightOffset(10.0),
listXOffset(15.0),
bulletWithTemp(0.0) {
font = new QFont();
font->setPixelSize(defaultFontSize);
font->setFamily(fontFamilty);
}
/**
@ -207,49 +211,47 @@ QRectF const Renderer::drawText(const QString& text)
// We can still extend the QGraphicsSimpleTextItem class (or QAbstractGraphicsShapeItem) and override paint method.
// Or just use QPainter with a paint device (like QWidgets), to have maximal control.
QGraphicsSimpleTextItem *textItem = new QGraphicsSimpleTextItem(text);
QFont font;
if (bold)
font.setBold(true);
if (italic)
font.setItalic(true);
font->setBold(bold);
font->setItalic(italic);
if (headingLevel > 0) {
font.setBold(true);
font->setBold(true);
switch(headingLevel) {
case 1:
font.setPixelSize(24);
font->setPixelSize(24);
break;
case 2:
font.setPixelSize(20);
font->setPixelSize(20);
break;
case 3:
font.setPixelSize(16);
font->setPixelSize(16);
break;
case 4:
font.setPixelSize(14);
font->setPixelSize(14);
break;
case 5:
font.setPixelSize(12);
font->setPixelSize(12);
break;
default:
break;
}
}
font.setFamily(fontFamilty);
textItem->setFont(font);
textItem->setFont(*font);
textItem->setPos(currentX, currentY);
scene->addItem(textItem);
if (headingLevel > 0) {
font->setPixelSize(defaultFontSize);
}
return textItem->boundingRect();
}
QRectF const Renderer::drawBullet()
{
QGraphicsSimpleTextItem *bullet = new QGraphicsSimpleTextItem("\u2022");
QFont font;
font.setFamily(fontFamilty);
bullet->setFont(font);
bullet->setFont(*font);
bullet->setPos(currentX, currentY);
scene->addItem(bullet);
return bullet->boundingRect();

View File

@ -8,6 +8,7 @@
class Scene;
class QRectF;
class QFont;
/**
* The Renderer will use Qt to render AST directly to a QGraphicsScene
@ -20,6 +21,8 @@ public:
private:
Scene *scene;
QFont *font;
int defaultFontSize;
qreal sceneMarginX;
qreal sceneMarginY;
bool bold;