@@ -91,6 +91,9 @@ class CefBrowserOsr extends CefBrowser_N implements CefRenderHandler {
9191 private CopyOnWriteArrayList <Consumer <CefPaintEvent >> onPaintListeners =
9292 new CopyOnWriteArrayList <>();
9393
94+ private CopyOnWriteArrayList <Consumer <CefAcceleratedPaintEvent >> onAcceleratedPaintListeners =
95+ new CopyOnWriteArrayList <>();
96+
9497 CefBrowserOsr (CefClient client , String url , boolean transparent , CefRequestContext context ,
9598 CefBrowserSettings settings ) {
9699 this (client , url , transparent , context , null , null , settings );
@@ -379,6 +382,22 @@ public void removeOnPaintListener(Consumer<CefPaintEvent> listener) {
379382 onPaintListeners .remove (listener );
380383 }
381384
385+ @ Override
386+ public void addOnAcceleratedPaintListener (Consumer <CefAcceleratedPaintEvent > listener ) {
387+ onAcceleratedPaintListeners .add (listener );
388+ }
389+
390+ @ Override
391+ public void setOnAcceleratedPaintListener (Consumer <CefAcceleratedPaintEvent > listener ) {
392+ onAcceleratedPaintListeners .clear ();
393+ onAcceleratedPaintListeners .add (listener );
394+ }
395+
396+ @ Override
397+ public void removeOnAcceleratedPaintListener (Consumer <CefAcceleratedPaintEvent > listener ) {
398+ onAcceleratedPaintListeners .remove (listener );
399+ }
400+
382401 @ Override
383402 public void onPaint (CefBrowser browser , boolean popup , Rectangle [] dirtyRects ,
384403 ByteBuffer buffer , int width , int height ) {
@@ -412,7 +431,36 @@ public void run() {
412431
413432 @ Override
414433 public void onAcceleratedPaint (CefBrowser browser , boolean popup , Rectangle [] dirtyRects , CefAcceleratedPaintInfo info ) {
415- // TODO: Implement example for accelerated paint
434+ // If window is closing, canvas_ or opengl context could be null
435+ final GLContext context = canvas_ != null ? canvas_ .getContext () : null ;
436+
437+ if (context == null ) {
438+ return ;
439+ }
440+
441+ // This result can occur due to GLContext re-initialization when changing displays.
442+ if (context .makeCurrent () == GLContext .CONTEXT_NOT_CURRENT ) {
443+ return ;
444+ }
445+
446+ // TODO: Implement renderer handling for accelerated paint
447+ // On Windows, convert the D3D11 shared texture handle using ImportMemoryWin32HandleEXT
448+ // through OpenGL's EXT_external_objects_win32. LWJGL supports it, but I am not familiar with JOGL's API.
449+ // renderer_.onAcceleratedPaint(canvas_.getGL().getGL2(), popup, dirtyRects, info);
450+
451+ context .release ();
452+ SwingUtilities .invokeLater (new Runnable () {
453+ public void run () {
454+ canvas_ .display ();
455+ }
456+ });
457+ if (!onAcceleratedPaintListeners .isEmpty ()) {
458+ CefAcceleratedPaintEvent paintEvent =
459+ new CefAcceleratedPaintEvent (browser , popup , dirtyRects , info );
460+ for (Consumer <CefAcceleratedPaintEvent > l : onAcceleratedPaintListeners ) {
461+ l .accept (paintEvent );
462+ }
463+ }
416464 }
417465
418466 @ Override
0 commit comments