Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions java/org/cef/CefBrowserSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,29 @@ public class CefBrowserSettings {
*/
public int windowless_frame_rate = 0;

/**
* Set to true to enable shared texture rendering. When enabled, the browser
* will render to a shared texture that can be accessed by the host application
* for hardware-accelerated compositing. This is supported on Windows via D3D11,
* macOS via Metal/OpenGL, and Linux via native buffers.
*/
public boolean shared_texture_enabled = false;

/**
* Set to true to enable external begin frame scheduling. When enabled, the
* client must call CefBrowserHost::SendExternalBeginFrame to trigger frame
* rendering at the specified frame rate.
*/
public boolean external_begin_frame_enabled = false;

public CefBrowserSettings() {}

@Override
public CefBrowserSettings clone() {
CefBrowserSettings tmp = new CefBrowserSettings();
tmp.windowless_frame_rate = windowless_frame_rate;
tmp.shared_texture_enabled = shared_texture_enabled;
tmp.external_begin_frame_enabled = external_begin_frame_enabled;
return tmp;
}
}
42 changes: 30 additions & 12 deletions java/org/cef/CefClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public CefBrowser createBrowser(String url, boolean isTransparent,
}

public CefBrowser createBrowser(String url, boolean isTransparent,
CefRequestContext context, CefBrowserSettings settings) {
CefRequestContext context, CefBrowserSettings settings) {
if (isDisposed_)
throw new IllegalStateException("Can't create browser. CefClient is disposed");
return CefBrowserFactory.create(
Expand Down Expand Up @@ -122,7 +122,7 @@ protected CefDialogHandler getDialogHandler() {
protected CefDisplayHandler getDisplayHandler() {
return this;
}

@Override
protected CefAudioHandler getAudioHandler() {
return this;
Expand Down Expand Up @@ -230,7 +230,7 @@ public void removeDialogHandler() {
@Override
public boolean onFileDialog(CefBrowser browser, FileDialogMode mode, String title,
String defaultFilePath, Vector<String> acceptFilters, Vector<String> acceptExtensions,
Vector<String> acceptDescriptions, CefFileDialogCallback callback) {
Vector<String> acceptDescriptions, CefFileDialogCallback callback) {
if (dialogHandler_ != null && browser != null) {
return dialogHandler_.onFileDialog(browser, mode, title, defaultFilePath, acceptFilters,
acceptExtensions, acceptDescriptions, callback);
Expand Down Expand Up @@ -322,7 +322,7 @@ public void removeDownloadHandler() {

@Override
public boolean onBeforeDownload(CefBrowser browser, CefDownloadItem downloadItem,
String suggestedName, CefBeforeDownloadCallback callback) {
String suggestedName, CefBeforeDownloadCallback callback) {
if (downloadHandler_ != null && browser != null)
return downloadHandler_.onBeforeDownload(
browser, downloadItem, suggestedName, callback);
Expand Down Expand Up @@ -693,6 +693,15 @@ public void onPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects,
realHandler.onPaint(browser, popup, dirtyRects, buffer, width, height);
}

@Override
public void onAcceleratedPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, CefAcceleratedPaintInfo info) {
if (browser == null) return;

CefRenderHandler realHandler = browser.getRenderHandler();
if (realHandler != null)
realHandler.onAcceleratedPaint(browser, popup, dirtyRects, info);
}

@Override
public void addOnPaintListener(Consumer<CefPaintEvent> listener) {}

Expand All @@ -702,6 +711,15 @@ public void setOnPaintListener(Consumer<CefPaintEvent> listener) {}
@Override
public void removeOnPaintListener(Consumer<CefPaintEvent> listener) {}

@Override
public void addOnAcceleratedPaintListener(Consumer<CefAcceleratedPaintEvent> listener) {}

@Override
public void setOnAcceleratedPaintListener(Consumer<CefAcceleratedPaintEvent> listener) {}

@Override
public void removeOnAcceleratedPaintListener(Consumer<CefAcceleratedPaintEvent> listener) {}

@Override
public boolean startDragging(CefBrowser browser, CefDragData dragData, int mask, int x, int y) {
if (browser == null) return false;
Expand Down Expand Up @@ -808,39 +826,39 @@ public void onMouseEvent(
public boolean getScreenInfo(CefBrowser arg0, CefScreenInfo arg1) {
return false;
}

// CefAudioHandler

public CefClient addAudioHandler(CefAudioHandler handler) {
if (audioHandler_ == null) audioHandler_ = handler;
return this;
}

public void removeAudioHandler() {
audioHandler_ = null;
}

@Override
public boolean getAudioParameters(CefBrowser browser, CefAudioParameters params) {
if (audioHandler_ != null) return audioHandler_.getAudioParameters(browser, params);
return false;
}

@Override
public void onAudioStreamStarted(CefBrowser browser, CefAudioParameters params, int channels) {
if (audioHandler_ != null) audioHandler_.onAudioStreamStarted(browser, params, channels);
}

@Override
public void onAudioStreamPacket(CefBrowser browser, DataPointer data, int frames, long pts) {
if (audioHandler_ != null) audioHandler_.onAudioStreamPacket(browser, data, frames, pts);
}

@Override
public void onAudioStreamStopped(CefBrowser browser) {
if (audioHandler_ != null) audioHandler_.onAudioStreamStopped(browser);
}

@Override
public void onAudioStreamError(CefBrowser browser, String text) {
if (audioHandler_ != null) audioHandler_.onAudioStreamError(browser, text);
Expand Down
48 changes: 48 additions & 0 deletions java/org/cef/browser/CefAcceleratedPaintEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright (c) 2024 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.

package org.cef.browser;

import org.cef.handler.CefAcceleratedPaintInfo;

import java.awt.*;

public class CefAcceleratedPaintEvent {
private final CefBrowser browser;
private final boolean popup;
private final Rectangle[] dirtyRects;
private final CefAcceleratedPaintInfo acceleratedPaintInfo;

public CefAcceleratedPaintEvent(CefBrowser browser, boolean popup, Rectangle[] dirtyRects,
CefAcceleratedPaintInfo acceleratedPaintInfo) {
this.browser = browser;
this.popup = popup;
this.dirtyRects = dirtyRects;
this.acceleratedPaintInfo = acceleratedPaintInfo;
}

public CefBrowser getBrowser() {
return browser;
}

public boolean getPopup() {
return popup;
}

public Rectangle[] getDirtyRects() {
return dirtyRects;
}

public CefAcceleratedPaintInfo getAcceleratedPaintInfo() {
return acceleratedPaintInfo;
}

public int getWidth() {
return acceleratedPaintInfo.width;
}

public int getHeight() {
return acceleratedPaintInfo.height;
}
}
9 changes: 9 additions & 0 deletions java/org/cef/browser/CefBrowser.java
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,15 @@ public void runFileDialog(FileDialogMode mode, String title, String defaultFileP
*/
public void setWindowlessFrameRate(int frameRate);

/**
* Send an external begin frame to trigger frame rendering when external begin frame
* scheduling is enabled. This method should be called at the desired frame rate when
* CefBrowserSettings.external_begin_frame_enabled is set to true.
*
* @throws UnsupportedOperationException if not supported
*/
public void sendExternalBeginFrame();

/**
* Returns the maximum rate in frames per second (fps) that {@code CefRenderHandler::onPaint}
* will be called for a windowless browser. The actual fps may be lower if the browser cannot
Expand Down
Loading
Loading