diff --git a/bundles/org.eclipse.swt.svg/META-INF/MANIFEST.MF b/bundles/org.eclipse.swt.svg/META-INF/MANIFEST.MF index 7b905f69ddc..f2e365de682 100644 --- a/bundles/org.eclipse.swt.svg/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.swt.svg/META-INF/MANIFEST.MF @@ -8,8 +8,19 @@ Bundle-Vendor: %providerName Bundle-Localization: fragment Bundle-RequiredExecutionEnvironment: JavaSE-21 Fragment-Host: org.eclipse.swt -Import-Package: com.github.weisj.jsvg;version="[2.0.0,3.0.0)", - com.github.weisj.jsvg.parser;version="[2.0.0,3.0.0)", - com.github.weisj.jsvg.view;version="[2.0.0,3.0.0)" +Import-Package: com.github.weisj.jsvg;version="[2.1.0,3.0.0)", + com.github.weisj.jsvg.logging;version="[2.1.0,3.0.0)", + com.github.weisj.jsvg.parser;version="[2.1.0,3.0.0)", + com.github.weisj.jsvg.view;version="[2.1.0,3.0.0)" Export-Package: org.eclipse.swt.svg;x-internal:=true -Provide-Capability: eclipse.swt;image.format="svg";version:Version="1.0" +Provide-Capability: + eclipse.swt; + image.format="svg"; + version:Version="1.0", + osgi.service; + objectClass:List="com.github.weisj.jsvg.logging.LogManager"; + effective:=active, + osgi.serviceloader; + osgi.serviceloader="com.github.weisj.jsvg.logging.LogManager"; + register:="org.eclipse.swt.svg.logging.JVSGLoggerLogManager" + diff --git a/bundles/org.eclipse.swt.svg/resources/META-INF/services/com.github.weisj.jsvg.logging.LogManager b/bundles/org.eclipse.swt.svg/resources/META-INF/services/com.github.weisj.jsvg.logging.LogManager new file mode 100644 index 00000000000..c92939cdc71 --- /dev/null +++ b/bundles/org.eclipse.swt.svg/resources/META-INF/services/com.github.weisj.jsvg.logging.LogManager @@ -0,0 +1 @@ +org.eclipse.swt.svg.logging.JVSGLoggerLogManager \ No newline at end of file diff --git a/bundles/org.eclipse.swt.svg/src/org/eclipse/swt/svg/JSVGRasterizer.java b/bundles/org.eclipse.swt.svg/src/org/eclipse/swt/svg/JSVGRasterizer.java index 399e0fa564a..efa87970d90 100644 --- a/bundles/org.eclipse.swt.svg/src/org/eclipse/swt/svg/JSVGRasterizer.java +++ b/bundles/org.eclipse.swt.svg/src/org/eclipse/swt/svg/JSVGRasterizer.java @@ -55,7 +55,18 @@ */ public class JSVGRasterizer implements SVGRasterizer { - private static final SVGLoader SVG_LOADER = new SVGLoader(); + private static final SVGLoader SVG_LOADER; + + static { + Thread thread = Thread.currentThread(); + ClassLoader contextClassLoader = thread.getContextClassLoader(); + try { + thread.setContextClassLoader(JSVGRasterizer.class.getClassLoader()); + SVG_LOADER = new SVGLoader(); + } finally { + thread.setContextClassLoader(contextClassLoader); + } + } private final static Map RENDERING_HINTS = Map.of( // KEY_ANTIALIASING, VALUE_ANTIALIAS_ON, // diff --git a/bundles/org.eclipse.swt.svg/src/org/eclipse/swt/svg/logging/JVSGLoggerLogManager.java b/bundles/org.eclipse.swt.svg/src/org/eclipse/swt/svg/logging/JVSGLoggerLogManager.java new file mode 100644 index 00000000000..bbd57436e21 --- /dev/null +++ b/bundles/org.eclipse.swt.svg/src/org/eclipse/swt/svg/logging/JVSGLoggerLogManager.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2026 Eclipse contributors and others. + * + * This program and the accompanying materials are made available under the terms of the Eclipse + * Public License 2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + *******************************************************************************/ +package org.eclipse.swt.svg.logging; + +import java.util.function.Supplier; + +import com.github.weisj.jsvg.logging.LogManager; +import com.github.weisj.jsvg.logging.Logger; + +public class JVSGLoggerLogManager implements LogManager { + + private static final Logger.Level LEVEL = Logger.Level.valueOf(System.getProperty("org.eclipse.swt.svg.logging", "ERROR")); + + @Override + public Logger createLogger(String name) { + return new Logger() { + @Override + public void log(Logger.Level level, String message, Throwable e) { + if (level.compareTo(LEVEL) <= 0) { + return; + } + doLog(level, message); + e.printStackTrace(); + } + + @Override + public void log(Logger.Level level, Supplier messageSupplier) { + if (level.compareTo(LEVEL) < 0) { + return; + } + doLog(level, messageSupplier.get()); + } + + @Override + public void log(Logger.Level level, String message) { + if (level.compareTo(LEVEL) < 0) { + return; + } + doLog(level, message); + } + + private void doLog(Logger.Level level, String message) { + System.err.format("JSVGRasterizer: %s: %s: %s", level, name, message).println(); + } + }; + } +}