Skip to content

Commit cf9e06b

Browse files
committed
feat: CefAcceleratedPaintEvent
1 parent aa83af8 commit cf9e06b

File tree

4 files changed

+125
-1
lines changed

4 files changed

+125
-1
lines changed

java/org/cef/CefClient.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,15 @@ public void setOnPaintListener(Consumer<CefPaintEvent> listener) {}
787787
@Override
788788
public void removeOnPaintListener(Consumer<CefPaintEvent> listener) {}
789789

790+
@Override
791+
public void addOnAcceleratedPaintListener(Consumer<CefAcceleratedPaintEvent> listener) {}
792+
793+
@Override
794+
public void setOnAcceleratedPaintListener(Consumer<CefAcceleratedPaintEvent> listener) {}
795+
796+
@Override
797+
public void removeOnAcceleratedPaintListener(Consumer<CefAcceleratedPaintEvent> listener) {}
798+
790799
@Override
791800
public boolean startDragging(CefBrowser browser, CefDragData dragData, int mask, int x, int y) {
792801
if (browser == null) return false;
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// Copyright (c) 2024 The Chromium Embedded Framework Authors. All rights
2+
// reserved. Use of this source code is governed by a BSD-style license that
3+
// can be found in the LICENSE file.
4+
5+
package org.cef.browser;
6+
7+
import org.cef.handler.CefAcceleratedPaintInfo;
8+
9+
import java.awt.*;
10+
11+
public class CefAcceleratedPaintEvent {
12+
private final CefBrowser browser;
13+
private final boolean popup;
14+
private final Rectangle[] dirtyRects;
15+
private final CefAcceleratedPaintInfo acceleratedPaintInfo;
16+
17+
public CefAcceleratedPaintEvent(CefBrowser browser, boolean popup, Rectangle[] dirtyRects,
18+
CefAcceleratedPaintInfo acceleratedPaintInfo) {
19+
this.browser = browser;
20+
this.popup = popup;
21+
this.dirtyRects = dirtyRects;
22+
this.acceleratedPaintInfo = acceleratedPaintInfo;
23+
}
24+
25+
public CefBrowser getBrowser() {
26+
return browser;
27+
}
28+
29+
public boolean getPopup() {
30+
return popup;
31+
}
32+
33+
public Rectangle[] getDirtyRects() {
34+
return dirtyRects;
35+
}
36+
37+
public CefAcceleratedPaintInfo getAcceleratedPaintInfo() {
38+
return acceleratedPaintInfo;
39+
}
40+
41+
public int getWidth() {
42+
return acceleratedPaintInfo.width;
43+
}
44+
45+
public int getHeight() {
46+
return acceleratedPaintInfo.height;
47+
}
48+
}

java/org/cef/browser/CefBrowserOsr.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

java/org/cef/handler/CefRenderHandler.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package org.cef.handler;
66

7+
import org.cef.browser.CefAcceleratedPaintEvent;
78
import org.cef.browser.CefBrowser;
89
import org.cef.browser.CefPaintEvent;
910
import org.cef.callback.CefDragData;
@@ -78,6 +79,24 @@ public void onPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects,
7879
public void onAcceleratedPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects,
7980
CefAcceleratedPaintInfo info);
8081

82+
/**
83+
* Add provided listener for accelerated paint events.
84+
* @param listener Code that gets executed after a frame was rendered with accelerated painting.
85+
*/
86+
public void addOnAcceleratedPaintListener(Consumer<CefAcceleratedPaintEvent> listener);
87+
88+
/**
89+
* Remove existing accelerated paint listeners and replace with provided listener.
90+
* @param listener Code that gets executed after a frame was rendered with accelerated painting.
91+
*/
92+
public void setOnAcceleratedPaintListener(Consumer<CefAcceleratedPaintEvent> listener);
93+
94+
/**
95+
* Remove provided accelerated paint listener.
96+
* @param listener Code that gets executed after a frame was rendered with accelerated painting.
97+
*/
98+
public void removeOnAcceleratedPaintListener(Consumer<CefAcceleratedPaintEvent> listener);
99+
81100
/**
82101
* Add provided listener.
83102
* @param listener Code that gets executed after a frame was rendered.

0 commit comments

Comments
 (0)