@@ -61,18 +61,29 @@ QCefViewPrivate::~QCefViewPrivate()
61
61
void
62
62
QCefViewPrivate::createCefBrowser (QCefView* view, const QString& url, const QCefSettingPrivate* setting)
63
63
{
64
- // create browser client handler delegate
64
+ // 1. create browser client handler delegate
65
65
auto pClientDelegate = std::make_shared<CCefClientDelegate>(this );
66
66
67
- // create browser client handler
67
+ // 2. create browser client handler
68
68
auto pClient = new CefViewBrowserClient (pContextPrivate_->getCefApp (), pClientDelegate);
69
69
70
- // Set window info
70
+ // 3. set window info
71
71
CefWindowInfo windowInfo;
72
-
73
72
if (isOSRModeEnabled_) {
74
73
// OSR mode
75
74
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
+ }
76
87
} else {
77
88
#if CEF_VERSION_MAJOR >= 125
78
89
// https://github.com/chromiumembedded/cef/issues/3685
@@ -103,17 +114,15 @@ QCefViewPrivate::createCefBrowser(QCefView* view, const QString& url, const QCef
103
114
#endif
104
115
}
105
116
106
- // create the browser settings
117
+ // 4. create the browser settings
107
118
CefBrowserSettings browserSettings;
108
119
QCefSettingPrivate::CopyToCefBrowserSettings (setting, &browserSettings);
109
120
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 );
114
123
}
115
124
116
- // create browser object
125
+ // 5. create browser object
117
126
bool success = CefBrowserHost::CreateBrowser (windowInfo, // window info
118
127
pClient, // handler
119
128
url.toStdString (), // url
@@ -363,29 +372,8 @@ QCefViewPrivate::render(QPainter* painter)
363
372
opt.initFrom (q);
364
373
q->style ()->drawPrimitive (QStyle::PE_Widget, &opt, painter, q);
365
374
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 ());
389
377
}
390
378
}
391
379
@@ -496,22 +484,6 @@ QCefViewPrivate::onOsrImeCursorRectChanged(const QRect& rc)
496
484
}
497
485
}
498
486
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
-
515
487
void
516
488
QCefViewPrivate::onContextMenuTriggered (QAction* action)
517
489
{
@@ -543,78 +515,6 @@ QCefViewPrivate::onContextMenuDestroyed(QObject* obj)
543
515
osr.isShowingContextMenu_ = false ;
544
516
}
545
517
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
-
618
518
void
619
519
QCefViewPrivate::onBeforeCefContextMenu (const MenuBuilder::MenuData& data)
620
520
{
@@ -851,13 +751,22 @@ QCefViewPrivate::onViewInputMethodQuery(Qt::InputMethodQuery query) const
851
751
void
852
752
QCefViewPrivate::onPaintEngine (QPaintEngine*& engine) const
853
753
{
754
+ // if hardware acceleration is available then disable Qt paint
755
+ if (isOSRModeEnabled_ && osr.pRenderer_ && osr.pRenderer_ ->isHardware ()) {
756
+ engine = nullptr ;
757
+ }
854
758
}
855
759
856
760
void
857
761
QCefViewPrivate::onPaintEvent (QPaintEvent* event)
858
762
{
859
763
Q_Q (QCefView);
860
764
765
+ // if hardware acceleration is available then disable Qt paint
766
+ if (isOSRModeEnabled_ && osr.pRenderer_ && osr.pRenderer_ ->isHardware ()) {
767
+ return ;
768
+ }
769
+
861
770
// 1. construct painter for current widget
862
771
QPainter painter (q);
863
772
0 commit comments