Skip to content

Commit 2ad13d3

Browse files
committed
feat: move rendering logic to separated module
1 parent 4b959fe commit 2ad13d3

22 files changed

+448
-244
lines changed

example/QCefViewTest/MainWindow.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ MainWindow::createRightCefView()
9292
setting.setPlugins(false);
9393
#endif
9494
setting.setWindowlessFrameRate(60);
95+
setting.setHardwareAcceleration(false);
9596
//setting.setBackgroundColor(QColor::fromRgba(qRgba(255, 255, 220, 255)));
9697
//setting.setBackgroundColor(Qt::blue);
9798

example/QCefViewTest/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ main(int argc, char* argv[])
4141

4242
// WindowlessRenderingEnabled is set to true by default,
4343
// set to false to disable the OSR mode
44-
config.setWindowlessRenderingEnabled(false);
44+
config.setWindowlessRenderingEnabled(true);
4545

4646
// add command line args, you can any cef supported switches or parameters
4747
config.addCommandLineSwitch("use-mock-keychain");

include/CefVersion.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
#pragma once
1414

1515
// clang-format off
16-
#define CEF_VERSION "127.3.5+g114ea2a+chromium-127.0.6533.120"
17-
#define CEF_VERSION_MAJOR 127
18-
#define CEF_VERSION_MINOR 3
19-
#define CEF_VERSION_PATCH 5
20-
#define CEF_COMMIT_NUMBER 3037
21-
#define CEF_COMMIT_HASH "114ea2af1ba9da18c4ac5e599ccdbb17d01ba75a"
16+
#define CEF_VERSION "126.2.18+g3647d39+chromium-126.0.6478.183"
17+
#define CEF_VERSION_MAJOR 126
18+
#define CEF_VERSION_MINOR 2
19+
#define CEF_VERSION_PATCH 18
20+
#define CEF_COMMIT_NUMBER 3019
21+
#define CEF_COMMIT_HASH "3647d39e700c215bd78172c5964eb1c550950f0f"
2222
// clang-format on
2323

2424
#endif // CefVersion

include/QCefSetting.h

+14
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,20 @@ class QCEFVIEW_EXPORT QCefSetting
398398
/// </summary>
399399
/// <returns>The color</returns>
400400
const QVariant backgroundColor() const;
401+
402+
#if CEF_VERSION_MAJOR >= 125
403+
/// <summary>
404+
///
405+
/// </summary>
406+
/// <param name="value"></param>
407+
void setHardwareAcceleration(const bool value);
408+
409+
/// <summary>
410+
///
411+
/// </summary>
412+
/// <returns></returns>
413+
const bool hardwareAcceleration() const;
414+
#endif
401415
};
402416

403417
Q_DECLARE_METATYPE(QCefSetting);

src/QCefSetting.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -424,3 +424,19 @@ QCefSetting::backgroundColor() const
424424
Q_D(const QCefSetting);
425425
return d->backgroundColor_;
426426
}
427+
428+
#if CEF_VERSION_MAJOR >= 125
429+
void
430+
QCefSetting::setHardwareAcceleration(const bool value)
431+
{
432+
Q_D(QCefSetting);
433+
d->hardwareAcceleration_ = value;
434+
}
435+
436+
const bool
437+
QCefSetting::hardwareAcceleration() const
438+
{
439+
Q_D(const QCefSetting);
440+
return d->hardwareAcceleration_;
441+
}
442+
#endif]

src/QCefView.cpp

+8-9
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
#include <QCefView.h>
1+
#include <QCefView.h>
22

33
#pragma region qt_headers
44
#include <QPainter>
55
#include <QPoint>
66
#include <QResizeEvent>
77
#include <QVBoxLayout>
88
#include <QtDebug>
9-
#pragma endregion
9+
#pragma endregion
1010

1111
#include <QCefContext.h>
1212

@@ -167,8 +167,7 @@ QCefView::triggerEvent(const QCefEvent& event)
167167
{
168168
Q_D(QCefView);
169169

170-
return d->triggerEvent(
171-
event.eventName(), event.d_func()->args, QCefView::MainFrameID);
170+
return d->triggerEvent(event.eventName(), event.d_func()->args, QCefView::MainFrameID);
172171
}
173172

174173
bool
@@ -184,8 +183,7 @@ QCefView::broadcastEvent(const QCefEvent& event)
184183
{
185184
Q_D(QCefView);
186185

187-
return d->triggerEvent(
188-
event.eventName(), event.d_func()->args, QCefView::AllFrameID);
186+
return d->triggerEvent(event.eventName(), event.d_func()->args, QCefView::AllFrameID);
189187
}
190188

191189
bool
@@ -383,10 +381,11 @@ QCefView::paintEngine() const
383381
{
384382
Q_D(const QCefView);
385383

386-
auto engine = QWidget::paintEngine();
387-
d->onPaintEngine(engine);
384+
if (d->isOSRModeEnabled_ && d->osr.pRenderer_ && d->osr.pRenderer_->isHardware()) {
385+
return nullptr;
386+
}
388387

389-
return engine;
388+
return QWidget::paintEngine();
390389
}
391390

392391
void

src/details/QCefSettingPrivate.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ QCefSettingPrivate::CopyFromCefBrowserSettings(QCefSetting* qs, const CefBrowser
2626
qs->d_func()->copyFromCefBrowserSettings(cs);
2727
}
2828

29+
2930
void
3031
QCefSettingPrivate::CopyFromCefBrowserSettings(QCefSettingPrivate* qsp, const CefBrowserSettings* cs)
3132
{
@@ -51,6 +52,7 @@ QCefSettingPrivate::CopyToCefBrowserSettings(const QCefSetting* qs, CefBrowserSe
5152
}
5253
}
5354

55+
5456
void
5557
QCefSettingPrivate::CopyToCefBrowserSettings(const QCefSettingPrivate* qsp, CefBrowserSettings* cs)
5658
{
@@ -66,6 +68,7 @@ QCefSettingPrivate::CopyToCefBrowserSettings(const QCefSettingPrivate* qsp, CefB
6668
}
6769
}
6870

71+
6972
void
7073
QCefSettingPrivate::copyFromCefBrowserSettings(const CefBrowserSettings* cs)
7174
{

src/details/QCefSettingPrivate.h

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class QCefSettingPrivate
3737
//////////////////////////////////////////////////////////////////////////
3838
// Non CEF browser setting values
3939
QSize windowInitialSize_;
40+
bool hardwareAcceleration_ = false;
4041

4142
//////////////////////////////////////////////////////////////////////////
4243
// CEF browser setting values

src/details/QCefViewPrivate.cpp

+30-121
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,29 @@ QCefViewPrivate::~QCefViewPrivate()
6161
void
6262
QCefViewPrivate::createCefBrowser(QCefView* view, const QString& url, const QCefSettingPrivate* setting)
6363
{
64-
// create browser client handler delegate
64+
// 1. create browser client handler delegate
6565
auto pClientDelegate = std::make_shared<CCefClientDelegate>(this);
6666

67-
// create browser client handler
67+
// 2. create browser client handler
6868
auto pClient = new CefViewBrowserClient(pContextPrivate_->getCefApp(), pClientDelegate);
6969

70-
// Set window info
70+
// 3. set window info
7171
CefWindowInfo windowInfo;
72-
7372
if (isOSRModeEnabled_) {
7473
// OSR mode
7574
windowInfo.SetAsWindowless(0);
75+
76+
// set hardware acceleration
77+
if (setting && setting->hardwareAcceleration_) {
78+
osr.pRenderer_ = CefViewRendererFactory::createRenderer(true);
79+
// get window native handle
80+
void* wid = reinterpret_cast<void*>(view->winId());
81+
// enable hardware acceleration
82+
windowInfo.shared_texture_enabled = true;
83+
} else {
84+
osr.pRenderer_ = CefViewRendererFactory::createRenderer(false);
85+
windowInfo.shared_texture_enabled = false;
86+
}
7687
} else {
7788
#if CEF_VERSION_MAJOR >= 125
7889
// https://github.com/chromiumembedded/cef/issues/3685
@@ -103,17 +114,15 @@ QCefViewPrivate::createCefBrowser(QCefView* view, const QString& url, const QCef
103114
#endif
104115
}
105116

106-
// create the browser settings
117+
// 4. create the browser settings
107118
CefBrowserSettings browserSettings;
108119
QCefSettingPrivate::CopyToCefBrowserSettings(setting, &browserSettings);
109120

110-
if (isOSRModeEnabled_) {
111-
// OSR mode
112-
if (CefColorGetA(browserSettings.background_color) == 0)
113-
osr.transparentPaintingEnabled_ = true;
121+
if (isOSRModeEnabled_ && osr.pRenderer_) {
122+
osr.pRenderer_->setBackgroundColor(browserSettings.background_color);
114123
}
115124

116-
// create browser object
125+
// 5. create browser object
117126
bool success = CefBrowserHost::CreateBrowser(windowInfo, // window info
118127
pClient, // handler
119128
url.toStdString(), // url
@@ -363,29 +372,8 @@ QCefViewPrivate::render(QPainter* painter)
363372
opt.initFrom(q);
364373
q->style()->drawPrimitive(QStyle::PE_Widget, &opt, painter, q);
365374

366-
// 2. paint the CEF view and popup
367-
// get current scale factor
368-
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
369-
qreal scaleFactor = q->devicePixelRatioF();
370-
#else
371-
qreal scaleFactor = q->devicePixelRatio();
372-
#endif
373-
374-
// perform the painting
375-
{
376-
// paint cef view
377-
QMutexLocker lock(&(osr.qViewPaintLock_));
378-
int width = osr.qCefViewFrame_.width() / scaleFactor;
379-
int height = osr.qCefViewFrame_.height() / scaleFactor;
380-
painter->drawImage(QRect{ 0, 0, width, height }, osr.qCefViewFrame_);
381-
}
382-
{
383-
// paint cef popup
384-
QMutexLocker lock(&(osr.qPopupPaintLock_));
385-
if (osr.showPopup_) {
386-
painter->drawImage(osr.qPopupRect_, osr.qCefPopupFrame_);
387-
}
388-
}
375+
// 2. render cef view
376+
osr.pRenderer_->render(painter, q->width(), q->height());
389377
}
390378
}
391379

@@ -496,22 +484,6 @@ QCefViewPrivate::onOsrImeCursorRectChanged(const QRect& rc)
496484
}
497485
}
498486

499-
void
500-
QCefViewPrivate::onOsrShowPopup(bool show)
501-
{
502-
osr.showPopup_ = show;
503-
504-
// clear the previous popup frame data if exist
505-
osr.qCefPopupFrame_ = QImage();
506-
osr.qPopupRect_ = QRect();
507-
}
508-
509-
void
510-
QCefViewPrivate::onOsrResizePopup(const QRect& rc)
511-
{
512-
osr.qPopupRect_ = rc;
513-
}
514-
515487
void
516488
QCefViewPrivate::onContextMenuTriggered(QAction* action)
517489
{
@@ -543,78 +515,6 @@ QCefViewPrivate::onContextMenuDestroyed(QObject* obj)
543515
osr.isShowingContextMenu_ = false;
544516
}
545517

546-
void
547-
QCefViewPrivate::onOsrUpdateViewFrame(const QImage& frame, const QRegion& region)
548-
{
549-
// #if defined(QT_DEBUG)
550-
// qint64 elapsedMs = paintTimer_.restart();
551-
// // qDebug() << "===== CEF view frame update since last frame:" << elapsedMs;
552-
// if (elapsedMs >= 20)
553-
// qDebug() << "===== CEF view frame update stutter detected:" << elapsedMs;
554-
//
555-
// QElapsedTimer updateDurationTimer;
556-
// updateDurationTimer.start();
557-
// #endif
558-
559-
if (osr.qCefViewFrame_.size() != frame.size() || osr.transparentPaintingEnabled_) {
560-
// update full image
561-
QMutexLocker lock(&(osr.qViewPaintLock_));
562-
osr.qCefViewFrame_ = frame.copy();
563-
} else {
564-
QMutexLocker lock(&(osr.qViewPaintLock_));
565-
// update only dirty regions
566-
QPainter painter(&osr.qCefViewFrame_);
567-
for (auto& rc : region) {
568-
painter.drawImage(rc, frame, rc);
569-
}
570-
}
571-
emit updateOsrFrame();
572-
573-
// #if defined(QT_DEBUG)
574-
// qDebug() << "===== CEF frame update duration:" << elapsedMs;
575-
// #endif
576-
}
577-
578-
void
579-
QCefViewPrivate::onOsrUpdatePopupFrame(const QImage& frame, const QRegion& region)
580-
{
581-
if (osr.qCefPopupFrame_.size() == frame.size()) {
582-
QMutexLocker lock(&(osr.qPopupPaintLock_));
583-
// update region
584-
QPainter painter(&osr.qCefPopupFrame_);
585-
for (auto& rc : region) {
586-
painter.drawImage(rc, frame, rc);
587-
}
588-
} else {
589-
QMutexLocker lock(&(osr.qPopupPaintLock_));
590-
osr.qCefPopupFrame_ = frame.copy();
591-
}
592-
emit updateOsrFrame();
593-
}
594-
595-
#if CEF_VERSION_MAJOR < 124
596-
void
597-
QCefViewPrivate::onOsrUpdateViewTexture(void* shared_handle, const QRegion& region)
598-
{
599-
}
600-
void
601-
QCefViewPrivate::onOsrUpdatePopupTexture(void* shared_handle, const QRegion& region)
602-
{
603-
}
604-
605-
#else
606-
void
607-
QCefViewPrivate::onOsrUpdateViewTexture(const CefAcceleratedPaintInfo& info, const QRegion& region)
608-
{
609-
}
610-
611-
void
612-
QCefViewPrivate::onOsrUpdatePopupTexture(const CefAcceleratedPaintInfo& info, const QRegion& region)
613-
{
614-
}
615-
616-
#endif
617-
618518
void
619519
QCefViewPrivate::onBeforeCefContextMenu(const MenuBuilder::MenuData& data)
620520
{
@@ -851,13 +751,22 @@ QCefViewPrivate::onViewInputMethodQuery(Qt::InputMethodQuery query) const
851751
void
852752
QCefViewPrivate::onPaintEngine(QPaintEngine*& engine) const
853753
{
754+
// if hardware acceleration is available then disable Qt paint
755+
if (isOSRModeEnabled_ && osr.pRenderer_ && osr.pRenderer_->isHardware()) {
756+
engine = nullptr;
757+
}
854758
}
855759

856760
void
857761
QCefViewPrivate::onPaintEvent(QPaintEvent* event)
858762
{
859763
Q_Q(QCefView);
860764

765+
// if hardware acceleration is available then disable Qt paint
766+
if (isOSRModeEnabled_ && osr.pRenderer_ && osr.pRenderer_->isHardware()) {
767+
return;
768+
}
769+
861770
// 1. construct painter for current widget
862771
QPainter painter(q);
863772

0 commit comments

Comments
 (0)