Skip to content

Commit

Permalink
Add image fetching from HTML template (#96)
Browse files Browse the repository at this point in the history
  • Loading branch information
royshil committed May 17, 2024
1 parent 17e1319 commit 802803c
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 4 deletions.
5 changes: 3 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ if(ENABLE_FRONTEND_API)
endif()

if(ENABLE_QT)
find_qt(COMPONENTS Widgets Core)
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt::Core Qt::Widgets)
find_qt(COMPONENTS Widgets Core Network)
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt::Core Qt::Widgets Qt::Network)
target_compile_options(
${CMAKE_PROJECT_NAME} PRIVATE $<$<C_COMPILER_ID:Clang,AppleClang>:-Wno-quoted-include-in-framework-header
-Wno-comma>)
Expand Down Expand Up @@ -76,6 +76,7 @@ target_sources(
src/obs-source-util.cpp
src/mapping-data.cpp
src/request-data.cpp
src/ui/CustomTextDocument.cpp
src/ui/RequestBuilder.cpp
src/ui/text-render-helper.cpp
src/ui/outputmapping.cpp
Expand Down
45 changes: 45 additions & 0 deletions src/ui/CustomTextDocument.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#include "CustomTextDocument.h"

#include "plugin-support.h"
#include "request-data.h"

#include <QImageReader>
#include <QPixmap>
#include <QByteArray>
#include <QPainter>

#include <obs.h>

// Initialize the static member
QHash<QUrl, QImage> CustomTextDocument::imageCache;

CustomTextDocument::CustomTextDocument(QObject *parent) : QTextDocument(parent) {}

QVariant CustomTextDocument::loadResource(int type, const QUrl &name)
{
if (type == QTextDocument::ImageResource) {
if (imageCache.contains(name)) {
return QVariant(imageCache.value(name));
}
obs_log(LOG_INFO, "fetch %s", name.toString().toStdString().c_str());
std::string mime_type;
std::vector<uint8_t> image_bytes =
fetch_image(name.toString().toStdString(), mime_type);
// Create a QByteArray from the std::vector<uint8_t>
QByteArray imageData(reinterpret_cast<const char *>(image_bytes.data()),
image_bytes.size());
QBuffer buffer(&imageData);
buffer.open(QIODevice::ReadOnly);
QImageReader reader(&buffer);
reader.setDecideFormatFromContent(true);
QImage image = reader.read();
if (!image.isNull()) {
imageCache[name] = image;
return image;
}
obs_log(LOG_ERROR, "Unable to load image from: %s",
name.toString().toStdString().c_str());
return QVariant();
}
return QTextDocument::loadResource(type, name);
}
22 changes: 22 additions & 0 deletions src/ui/CustomTextDocument.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#ifndef CUSTOMTEXTDOCUMENT_H
#define CUSTOMTEXTDOCUMENT_H

#include <QtWidgets>
#include <QTextDocument>
#include <QUrl>
#include <QHash>

class CustomTextDocument : public QTextDocument {
Q_OBJECT

public:
CustomTextDocument(QObject *parent = nullptr);

protected:
QVariant loadResource(int type, const QUrl &name) override;

private:
static QHash<QUrl, QImage> imageCache; // Static member for the cache
};

#endif // CUSTOMTEXTDOCUMENT_H
4 changes: 2 additions & 2 deletions src/ui/text-render-helper.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include <QtWidgets>
#include "CustomTextDocument.h"
#include <util/bmem.h>

const QString template_text = R"(
Expand Down Expand Up @@ -108,7 +108,7 @@ void render_text_with_qtextdocument(const std::string &text, uint32_t &width, ui
QString html = QString(template_text)
.replace("{{text}}", QString::fromStdString(text))
.replace("{{css_props}}", QString::fromStdString(css_props));
QTextDocument textDocument;
CustomTextDocument textDocument;
textDocument.setHtml(html);
textDocument.setTextWidth(width);

Expand Down

0 comments on commit 802803c

Please sign in to comment.