Skip to content

Commit ade64c3

Browse files
Osiris-Teammagreenblatt
authored andcommitted
Add rendered image callback for CefBrowserOsr/CefRenderer (fixes chromiumembedded#432)
1 parent 566dc4e commit ade64c3

File tree

5 files changed

+106
-4
lines changed

5 files changed

+106
-4
lines changed

java/org/cef/SystemBootstrap.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ public class SystemBootstrap {
1313
/**
1414
* Simple interface for how a library by name should be loaded.
1515
*/
16-
static public interface Loader { public void loadLibrary(String libname); }
16+
static public interface Loader {
17+
public void loadLibrary(String libname);
18+
}
1719

1820
/**
1921
* Default implementation is to call System.loadLibrary

java/org/cef/browser/CefBrowserOsr.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,11 @@
6060
import java.util.Arrays;
6161
import java.util.concurrent.Callable;
6262
import java.util.concurrent.CompletableFuture;
63+
import java.util.concurrent.CopyOnWriteArrayList;
6364
import java.util.concurrent.ExecutionException;
6465
import java.util.concurrent.TimeUnit;
6566
import java.util.concurrent.TimeoutException;
67+
import java.util.function.Consumer;
6668

6769
import javax.swing.MenuSelectionManager;
6870
import javax.swing.SwingUtilities;
@@ -84,6 +86,9 @@ class CefBrowserOsr extends CefBrowser_N implements CefRenderHandler {
8486
private int depth_per_component = 8;
8587
private boolean isTransparent_;
8688

89+
private CopyOnWriteArrayList<Consumer<CefPaintEvent>> onPaintListeners =
90+
new CopyOnWriteArrayList<>();
91+
8792
CefBrowserOsr(CefClient client, String url, boolean transparent, CefRequestContext context) {
8893
this(client, url, transparent, context, null, null);
8994
}
@@ -354,6 +359,22 @@ public void onPopupSize(CefBrowser browser, Rectangle size) {
354359
renderer_.onPopupSize(size);
355360
}
356361

362+
@Override
363+
public void addOnPaintListener(Consumer<CefPaintEvent> listener) {
364+
onPaintListeners.add(listener);
365+
}
366+
367+
@Override
368+
public void setOnPaintListener(Consumer<CefPaintEvent> listener) {
369+
onPaintListeners.clear();
370+
onPaintListeners.add(listener);
371+
}
372+
373+
@Override
374+
public void removeOnPaintListener(Consumer<CefPaintEvent> listener) {
375+
onPaintListeners.remove(listener);
376+
}
377+
357378
@Override
358379
public void onPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects,
359380
ByteBuffer buffer, int width, int height) {
@@ -376,6 +397,13 @@ public void run() {
376397
canvas_.display();
377398
}
378399
});
400+
if (!onPaintListeners.isEmpty()) {
401+
CefPaintEvent paintEvent =
402+
new CefPaintEvent(browser, popup, dirtyRects, buffer, width, height);
403+
for (Consumer<CefPaintEvent> l : onPaintListeners) {
404+
l.accept(paintEvent);
405+
}
406+
}
379407
}
380408

381409
@Override
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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 java.awt.*;
8+
import java.nio.ByteBuffer;
9+
10+
public class CefPaintEvent {
11+
private final CefBrowser browser;
12+
private final boolean popup;
13+
private final Rectangle[] dirtyRects;
14+
private final ByteBuffer renderedFrame;
15+
private final int width;
16+
private final int height;
17+
18+
public CefPaintEvent(CefBrowser browser, boolean popup, Rectangle[] dirtyRects,
19+
ByteBuffer renderedFrame, int width, int height) {
20+
this.browser = browser;
21+
this.popup = popup;
22+
this.dirtyRects = dirtyRects;
23+
this.renderedFrame = renderedFrame;
24+
this.width = width;
25+
this.height = height;
26+
}
27+
28+
public CefBrowser getBrowser() {
29+
return browser;
30+
}
31+
32+
public boolean getPopup() {
33+
return popup;
34+
}
35+
36+
public Rectangle[] getDirtyRects() {
37+
return dirtyRects;
38+
}
39+
40+
public ByteBuffer getRenderedFrame() {
41+
return renderedFrame;
42+
}
43+
44+
public int getWidth() {
45+
return width;
46+
}
47+
48+
public int getHeight() {
49+
return height;
50+
}
51+
}

java/org/cef/handler/CefAppHandlerAdapter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ public void onBeforeCommandLineProcessing(String process_type, CefCommandLine co
3232
continue;
3333
}
3434
// Arguments with '--', '-' and, on Windows, '/' prefixes are considered switches.
35-
int switchCnt = arg.startsWith("--")
36-
? 2
37-
: arg.startsWith("/") ? 1 : arg.startsWith("-") ? 1 : 0;
35+
int switchCnt = arg.startsWith("--") ? 2
36+
: arg.startsWith("/") ? 1
37+
: arg.startsWith("-") ? 1
38+
: 0;
3839
switch (switchCnt) {
3940
case 2:
4041
// An argument of "--" will terminate switch parsing with all subsequent

java/org/cef/handler/CefRenderHandler.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
package org.cef.handler;
66

77
import org.cef.browser.CefBrowser;
8+
import org.cef.browser.CefPaintEvent;
89
import org.cef.callback.CefDragData;
910

1011
import java.awt.Point;
1112
import java.awt.Rectangle;
1213
import java.nio.ByteBuffer;
14+
import java.util.function.Consumer;
1315

1416
/**
1517
* Implement this interface to handle events when window rendering is disabled.
@@ -65,6 +67,24 @@ public interface CefRenderHandler {
6567
public void onPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects,
6668
ByteBuffer buffer, int width, int height);
6769

70+
/**
71+
* Add provided listener.
72+
* @param listener Code that gets executed after a frame was rendered.
73+
*/
74+
public void addOnPaintListener(Consumer<CefPaintEvent> listener);
75+
76+
/**
77+
* Remove existing listeners and replace with provided listener.
78+
* @param listener Code that gets executed after a frame was rendered.
79+
*/
80+
public void setOnPaintListener(Consumer<CefPaintEvent> listener);
81+
82+
/**
83+
* Remove provided listener.
84+
* @param listener Code that gets executed after a frame was rendered.
85+
*/
86+
public void removeOnPaintListener(Consumer<CefPaintEvent> listener);
87+
6888
/**
6989
* Handle cursor changes.
7090
* @param browser The browser generating the event.

0 commit comments

Comments
 (0)