summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorMikael Urankar <mikael@FreeBSD.org>2020-10-28 17:15:33 +0000
committerMikael Urankar <mikael@FreeBSD.org>2020-10-28 17:15:33 +0000
commit119b9927c5eb137e708eeabff49f3092a32abb98 (patch)
tree8e568161ffc63c534dcebabd6bc14bdd0e94b63b /java
parentdevel/py-oci: update to 2.23.2 (diff)
java/openjfx14: add new port
OpenJFX is an open source, next generation client application platform for desktop and embedded systems based on JavaSE. It is a collaborative effort by many individuals and companies with the goal of producing a modern, efficient, and fully featured toolkit for developing rich client applications. PR: 248248
Notes
Notes: svn path=/head/; revision=553555
Diffstat (limited to 'java')
-rw-r--r--java/Makefile1
-rw-r--r--java/openjfx14/Makefile165
-rw-r--r--java/openjfx14/distinfo15
-rw-r--r--java/openjfx14/files/gstsndio.c396
-rw-r--r--java/openjfx14/files/gstsndio.h78
-rw-r--r--java/openjfx14/files/patch-build.gradle303
-rw-r--r--java/openjfx14/files/patch-buildSrc_bsd.gradle332
-rw-r--r--java/openjfx14/files/patch-modules_javafx.base_src_main_java_com_sun_javafx_PlatformUtil.java37
-rw-r--r--java/openjfx14/files/patch-modules_javafx.controls_src_main_java_com_sun_javafx_scene_TextInputControlBehavior.java36
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_glass_ui_Platform.java20
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_glass_utils_NativeLibLoader.java20
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_font_LogicalFont.java11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_font_PrismFontFactory.java45
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_Toolkit.java11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_quantum_GlassSystemMenu.java35
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_quantum_WindowStage.java11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_prism_impl_PrismSettings.java29
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_fontpath__linux.c11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_freetype.c15
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_pango.c15
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_GlassApplication.cpp10
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_glass__evloop.cpp11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_glass__window.h16
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_launcher.c10
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_wrapped.c10
-rw-r--r--java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-prism-es2_PrismES2Defs.h11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.media_src_main_java_com_sun_media_jfxmediaimpl_HostUtils.java13
-rw-r--r--java/openjfx14/files/patch-modules_javafx.media_src_main_java_com_sun_media_jfxmediaimpl_NativeMediaManager.java11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.media_src_main_native_gstreamer_gstreamer-lite_gstreamer_gst_gst__private.h86
-rw-r--r--java/openjfx14/files/patch-modules_javafx.media_src_main_native_gstreamer_projects_build_linux_common_config.h11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_platform_gstreamer_GstAudioSpectrum.cpp11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_platform_gstreamer_GstPipelineFactory.cpp11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_projects_bsd_Makefile42
-rw-r--r--java/openjfx14/files/patch-modules_javafx.swing_src_main_java_javafx_embed_swing_JFXPanel.java20
-rw-r--r--java/openjfx14/files/patch-modules_javafx.swing_src_main_java_javafx_embed_swing_SwingNode.java11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_JavaScriptCore_assembler_ARM64Assembler.h11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_JavaScriptCore_offlineasm_arm64.rb11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_PlatformJava.cmake8
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_MemoryPressureHandler.cpp11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_MemoryPressureHandler.h20
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_Platform.h15
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_PlatformJava.cmake14
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_RAMSize.cpp28
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_generic_MemoryFootprintGeneric.cpp22
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_linux_MemoryPressureHandlerLinux.cpp54
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_unicode_java_UnicodeJava.h24
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_unix_MemoryPressureHandlerUnix.cpp168
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WebCore_css_StyleResolver.cpp11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_AvailableMemory.cpp45
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_AvailableMemory.h20
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_bmalloc.h11
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_OptionsJava.cmake21
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_WebKitCommon.cmake12
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_WebKitCompilerFlags.cmake13
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Tools_DumpRenderTree_TestRunner.cpp18
-rw-r--r--java/openjfx14/files/patch-modules_javafx.web_src_main_native_Tools_DumpRenderTree_java_CMakeLists.txt12
-rw-r--r--java/openjfx14/files/sndiosink.c226
-rw-r--r--java/openjfx14/files/sndiosink.h57
-rw-r--r--java/openjfx14/pkg-descr6
-rw-r--r--java/openjfx14/pkg-plist34
60 files changed, 2742 insertions, 0 deletions
diff --git a/java/Makefile b/java/Makefile
index 50f34e68b0cb..eadb525ccec8 100644
--- a/java/Makefile
+++ b/java/Makefile
@@ -102,6 +102,7 @@
SUBDIR += openjdk8-jre
SUBDIR += openjfx8-devel
SUBDIR += openjfx8-scenebuilder
+ SUBDIR += openjfx14
SUBDIR += phpeclipse
SUBDIR += proguard
SUBDIR += sablevm
diff --git a/java/openjfx14/Makefile b/java/openjfx14/Makefile
new file mode 100644
index 000000000000..2d237cdd9ebb
--- /dev/null
+++ b/java/openjfx14/Makefile
@@ -0,0 +1,165 @@
+# $FreeBSD$
+
+PORTNAME= openjfx
+DISTVERSION= 14.0.2.1+1
+CATEGORIES= java x11-toolkits devel
+MASTER_SITES= https://repo.maven.apache.org/maven2/org/apache/lucene/lucene-core/7.7.1/:core \
+ https://repo.maven.apache.org/maven2/org/apache/lucene/lucene-grouping/7.7.1/:grouping \
+ https://repo.maven.apache.org/maven2/org/apache/lucene/lucene-queries/7.7.1/:queries \
+ https://repo.maven.apache.org/maven2/org/apache/lucene/lucene-queryparser/7.7.1/:queryparser \
+ https://repo.maven.apache.org/maven2/org/apache/lucene/lucene-sandbox/7.7.1/:sandbox \
+ https://repo1.maven.org/maven2/org/antlr/antlr4/4.7.2/:antlr
+PKGNAMESUFFIX= 14
+DISTFILES= lucene-core-7.7.1.jar:core \
+ lucene-grouping-7.7.1.jar:grouping \
+ lucene-queries-7.7.1.jar:queries \
+ lucene-queryparser-7.7.1.jar:queryparser \
+ lucene-sandbox-7.7.1.jar:sandbox \
+ antlr4-4.7.2-complete.jar:antlr
+
+MAINTAINER= mikael@FreeBSD.org
+COMMENT= JavaFX SDK overlay for OpenJDK 11
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+ONLY_FOR_ARCHS= aarch64 amd64 powerpc64
+
+BUILD_DEPENDS= zip:archivers/zip \
+ apache-ant>0:devel/apache-ant \
+ gradle62>=6.2:devel/gradle62 \
+ ${JAVALIBDIR}/junit.jar:java/junit
+LIB_DEPENDS= libasound.so:audio/alsa-lib \
+ libfontconfig.so:x11-fonts/fontconfig \
+ libfreetype.so:print/freetype2
+
+USES= gettext-runtime gl gnome jpeg localbase:ldflags ninja pkgconfig \
+ sqlite xorg
+
+USE_GITHUB= yes
+GH_ACCOUNT= openjdk
+GH_PROJECT= jfx
+USE_GL= gl
+USE_GNOME= atk cairo gdkpixbuf2 glib20 gtk20 gtk30 pango
+USE_JAVA= yes
+JAVA_VERSION= 11
+USE_LDCONFIG= yes
+USE_XORG= x11 xtst xxf86vm
+
+CFLAGS+= -Wno-unused-command-line-argument
+
+PLIST_SUB= INSTALLDIR=${_INSTALLDIR}
+
+OPTIONS_DEFINE= MEDIA SWT TEST WEBKIT
+OPTIONS_DEFAULT= MEDIA WEBKIT
+OPTIONS_SUB= yes
+
+MEDIA_DESC= Media module
+SWT_DESC= SWT support
+
+MEDIA_LIB_DEPENDS= libavcodec.so:multimedia/ffmpeg \
+ libsndio.so:audio/sndio
+MEDIA_USES= gmake
+MEDIA_VARS= COMPILE_MEDIA=true
+
+SWT_BUILD_DEPENDS= swt>0:x11-toolkits/swt
+SWT_RUN_DEPENDS= swt>0:x11-toolkits/swt
+SWT_VARS= COMPILE_SWT=true
+
+TEST_USES= display:test
+TEST_VARS= AWT_TEST=true FULL_TEST=true
+
+# Gradle calls CMake during the build
+WEBKIT_IMPLIES= MEDIA
+WEBKIT_BUILD_DEPENDS= cmake:devel/cmake
+WEBKIT_LIB_DEPENDS= libicui18n.so:devel/icu
+WEBKIT_USES= bison gmake gperf perl5 python:3.5+,build
+WEBKIT_USE= GNOME=libxslt,libxml2 \
+ PERL5=build \
+ RUBY=yes \
+ XORG=xcomposite,xdamage,xfixes,xrender,xt
+WEBKIT_VARS= RUBY_NO_RUN_DEPENDS=yes COMPILE_WEBKIT=true
+
+# Move Gradle's home below ${WRKDIR} instead of using ${HOME}/.gradle
+_GRADLE_ENV= CC=${WRKDIR}/bin/ccwrapper \
+ CXX=${WRKDIR}/bin/cxxwrapper \
+ GRADLE_USER_HOME=${WRKDIR}/gradle-home \
+ JAVA_VERSION=${JAVA_VERSION}
+_GRADLE_RUN= ${SETENV} ${_GRADLE_ENV} gradle62 --no-daemon
+
+_INSTALLDIR= ${PREFIX}/${PKGBASE}
+
+post-extract:
+ ${MKDIR} ${WRKDIR}/jars
+.for f in core grouping queries queryparser sandbox
+ ${CP} ${DISTDIR}/lucene-${f}-7.7.1.jar ${WRKDIR}/jars
+.endfor
+ ${CP} ${DISTDIR}/antlr4-4.7.2-complete.jar ${WRKDIR}/jars
+
+# The BSD Makefiles for GStreamer-lite and Jfxmedia are based on the
+# Linux versions. Prepare the tree, so that we only see the changes
+# from Linux's Makefile in our own patches.
+pre-patch:
+ @${CP} -r ${WRKSRC}/modules/javafx.media/src/main/native/jfxmedia/projects/linux \
+ ${WRKSRC}/modules/javafx.media/src/main/native/jfxmedia/projects/bsd
+ @${CP} -r ${WRKSRC}/modules/javafx.media/src/main/native/gstreamer/projects/linux \
+ ${WRKSRC}/modules/javafx.media/src/main/native/gstreamer/projects/bsd
+
+post-patch:
+ @${MKDIR} ${WRKDIR}/bin
+ @${PRINTF} '#!/bin/sh\nexec ${CCACHE_BIN} ${CC} ${CFLAGS} ${LDFLAGS} "$$@"\n' > ${WRKDIR}/bin/ccwrapper
+ @${PRINTF} '#!/bin/sh\nexec ${CCACHE_BIN} ${CXX} ${CXXFLAGS} ${LDFLAGS} "$$@"\n' > ${WRKDIR}/bin/cxxwrapper
+ @${CHMOD} +x ${WRKDIR}/bin/ccwrapper ${WRKDIR}/bin/cxxwrapper
+ @${REINPLACE_CMD} -e 's|gcc|${WRKDIR}/bin/ccwrapper|g' \
+ -e 's|g\+\+|${WRKDIR}/bin/cxxwrapper|g' \
+ ${WRKSRC}/buildSrc/bsd.gradle
+# Add a *BSD native audio sink to GStreamer-lite instead of using the
+# bundled ALSA sink. Currently we add an sndio sink, but this is an extension
+# point for eventually adding an OSS backend (or others) as an option as well.
+# If you add a new one make sure it registers itself as "bsdaudiosink" as defined
+# in modules/media/src/main/native/jfxmedia/platform/gstreamer/GstPipelineFactory.cpp
+ @${MKDIR} ${WRKSRC}/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-base/ext/bsdaudio
+ @${CP} ${FILESDIR}/gstsndio.* ${FILESDIR}/sndiosink.* \
+ ${WRKSRC}/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-base/ext/bsdaudio
+ @cd ${WRKSRC}/modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gst-plugins-base/ext/bsdaudio && \
+ ${LN} -s gstsndio.c gstbsdaudio.c && \
+ ${LN} -s sndiosink.c bsdaudiosink.c
+# Pull Java dependencies from LOCALBASE
+ @${REINPLACE_CMD} 's|/usr/local|${LOCALBASE}|g' \
+ ${WRKSRC}/build.gradle ${WRKSRC}/buildSrc/build.gradle
+# Remove bundled libraries. We use the system's versions instead.
+ @cd ${WRKSRC}/modules/javafx.web/src/main/native/Source/ThirdParty && \
+ ${RM} -r icu libxml libxslt sqlite
+ @${RM} -r ${WRKSRC}/modules/javafx.web/src/main/native/Source/WTF/icu
+ @cd ${WRKSRC}/modules/javafx.media/src/main/native/gstreamer/3rd_party && \
+ ${RM} -r glib libffi
+
+do-configure:
+ @${MKDIR} ${WRKDIR}/gradle-home
+ @${ECHO_CMD} "NUM_COMPILE_THREADS = ${MAKE_JOBS_NUMBER}" > ${WRKSRC}/gradle.properties
+ @${ECHO_CMD} "JFX_DEPS_URL = ${WRKDIR}/jars" > ${WRKSRC}/gradle.properties
+.for prop in COMPILE_MEDIA COMPILE_WEBKIT AWT_TEST FULL_TEST
+ @${ECHO_CMD} "${prop} = ${${prop}:Ufalse}" >> ${WRKSRC}/gradle.properties
+.endfor
+ @${ECHO_CMD} "BSD.compileSWT = ${COMPILE_SWT:Ufalse};" >> ${WRKSRC}/buildSrc/bsd.gradle
+
+# the java doc are not installed on FreeBSD so exclude the javadoc task
+# as it'll fail otherwise
+do-build:
+ @cd ${WRKSRC} && ${SETENV} ${_GRADLE_RUN} zips --exclude-task javadoc
+
+# it's not recommended to install openjfx inside openjdk directory
+do-install:
+ @${MKDIR} ${STAGEDIR}${_INSTALLDIR} \
+ ${STAGEDIR}${_INSTALLDIR}/lib \
+ ${STAGEDIR}${_INSTALLDIR}/jmods
+ ${INSTALL_DATA} ${WRKSRC}/build/javafx-exports.zip ${STAGEDIR}${_INSTALLDIR}
+ (cd ${WRKSRC}/build/artifacts/javafx-sdk-14.0.2.1/lib && ${COPYTREE_SHARE} . ${STAGEDIR}${_INSTALLDIR}/lib)
+ @${MV} ${STAGEDIR}${_INSTALLDIR}/lib/src.zip ${STAGEDIR}${_INSTALLDIR}/lib/javafx-src.zip
+ (cd ${WRKSRC}/build/artifacts/javafx-jmods-14.0.2.1 && ${COPYTREE_SHARE} . ${STAGEDIR}${_INSTALLDIR}/jmods)
+ @${FIND} ${STAGEDIR}${_INSTALLDIR}/lib -name '*.so' -exec ${STRIP_CMD} \{\} \;
+
+do-test-TEST-on:
+ @cd ${WRKSRC} && ${_GRADLE_RUN} check test
+
+.include <bsd.port.mk>
diff --git a/java/openjfx14/distinfo b/java/openjfx14/distinfo
new file mode 100644
index 000000000000..ec65185305eb
--- /dev/null
+++ b/java/openjfx14/distinfo
@@ -0,0 +1,15 @@
+TIMESTAMP = 1600515648
+SHA256 (lucene-core-7.7.1.jar) = 4a96eba551129bc7eebdff5586aeb8729da0889bd05d9ac2dab0ff4924548d27
+SIZE (lucene-core-7.7.1.jar) = 3088010
+SHA256 (lucene-grouping-7.7.1.jar) = c031e6dfc3f9c744fc2747228245a294e1276f1fca5003b11639de18162d61eb
+SIZE (lucene-grouping-7.7.1.jar) = 87267
+SHA256 (lucene-queries-7.7.1.jar) = b7f29a9874010697c83443091005301707899176f0873b41708fed3c47e58d78
+SIZE (lucene-queries-7.7.1.jar) = 265080
+SHA256 (lucene-queryparser-7.7.1.jar) = 7e1d509aa3fffd19ed0d89c8bb1fcd91bea37462955a9862fbc2d4600c4bb2a3
+SIZE (lucene-queryparser-7.7.1.jar) = 381910
+SHA256 (lucene-sandbox-7.7.1.jar) = 865f472ed473bd78ec8309306b6d9484a3fe26cffef1a895d8873927eebad5d1
+SIZE (lucene-sandbox-7.7.1.jar) = 279651
+SHA256 (antlr4-4.7.2-complete.jar) = 6852386d7975eff29171dae002cc223251510d35f291ae277948f381a7b380b4
+SIZE (antlr4-4.7.2-complete.jar) = 2079769
+SHA256 (openjdk-jfx-14.0.2.1+1_GH0.tar.gz) = 08830d79dbdaadf66a1feae356caed6d70636dfdbf47598dd48a59f407d05ef1
+SIZE (openjdk-jfx-14.0.2.1+1_GH0.tar.gz) = 67975108
diff --git a/java/openjfx14/files/gstsndio.c b/java/openjfx14/files/gstsndio.c
new file mode 100644
index 000000000000..4ef2cf1b5fdc
--- /dev/null
+++ b/java/openjfx14/files/gstsndio.c
@@ -0,0 +1,396 @@
+/*
+ * Copyright (C) 2008 Jacob Meuser <jakemsr@sdf.lonestar.org>
+ * Copyright (C) 2012 Alexandre Ratchov <alex@caoua.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include "gstsndio.h"
+
+GST_DEBUG_CATEGORY (gst_sndio_debug);
+#define GST_CAT_DEFAULT gst_sndio_debug
+
+GType gst_sndiosink_get_type (void);
+
+gboolean
+plugin_init_alsa (GstPlugin * plugin)
+{
+ GST_DEBUG_CATEGORY_INIT (gst_sndio_debug, "sndio", 0, "sndio plugins");
+
+ /* prefer sndiosink over pulsesink (GST_RANK_PRIMARY + 10) */
+ if (!gst_element_register (plugin, "bsdaudiosink", GST_RANK_PRIMARY + 20,
+ gst_sndiosink_get_type()))
+ return FALSE;
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ sndio,
+ "sndio plugin library",
+ plugin_init_alsa, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
+
+/*
+ * common code to src and sink
+ */
+
+void
+gst_sndio_init (struct gstsndio *sio, GObject *obj)
+{
+ sio->obj = obj;
+ sio->hdl = NULL;
+ sio->device = g_strdup (SIO_DEVANY);
+}
+
+void
+gst_sndio_finalize (struct gstsndio *sio)
+{
+ gst_caps_replace (&sio->cur_caps, NULL);
+ g_free (sio->device);
+}
+
+GstCaps *
+gst_sndio_getcaps (struct gstsndio *sio, GstCaps * filter)
+{
+ if (sio->cur_caps == NULL) {
+ /* XXX */
+ GST_LOG_OBJECT (sio->obj, "getcaps called, returning template caps");
+ return NULL;
+ }
+
+ GST_LOG_OBJECT (sio->obj, "returning %" GST_PTR_FORMAT, sio->cur_caps);
+
+ if (filter) {
+ return gst_caps_intersect_full (filter,
+ sio->cur_caps, GST_CAPS_INTERSECT_FIRST);
+ } else {
+ return gst_caps_ref (sio->cur_caps);
+ }
+}
+
+static void
+gst_sndio_onvol (void *arg, unsigned int vol)
+{
+ struct gstsndio *sio = arg;
+ sio->volume = vol;
+ g_object_notify (G_OBJECT (sio->obj), "mute");
+ g_object_notify (G_OBJECT (sio->obj), "volume");
+}
+
+gboolean
+gst_sndio_open (struct gstsndio *sio, gint mode)
+{
+ GValue list = G_VALUE_INIT, item = G_VALUE_INIT;
+ GstStructure *s;
+ GstCaps *caps;
+ struct sio_enc *enc;
+ struct sio_cap cap;
+ char fmt[16];
+ int i, chan;
+
+ GST_DEBUG_OBJECT (sio->obj, "open");
+
+ sio->hdl = sio_open (sio->device, mode, 0);
+ if (sio->hdl == NULL) {
+ GST_ELEMENT_ERROR (sio->obj, RESOURCE, OPEN_READ_WRITE,
+ ("Couldn't open sndio device"), (NULL));
+ return FALSE;
+ }
+ sio->mode = mode;
+
+ if (!sio_getcap(sio->hdl, &cap)) {
+ GST_ELEMENT_ERROR (sio, RESOURCE, OPEN_WRITE,
+ ("Couldn't get device capabilities"), (NULL));
+ sio_close(sio->hdl);
+ sio->hdl = NULL;
+ return FALSE;
+ }
+ if (cap.nconf == 0) {
+ GST_ELEMENT_ERROR (sio, RESOURCE, OPEN_WRITE,
+ ("Device has empty capabilities"), (NULL));
+ sio_close(sio->hdl);
+ sio->hdl = NULL;
+ return FALSE;
+ }
+ sio_onvol (sio->hdl, gst_sndio_onvol, sio);
+
+ caps = gst_caps_new_empty ();
+ s = gst_structure_new ("audio/x-raw", (char *)NULL, (void *)NULL);
+
+ /*
+ * scan supported rates
+ */
+ g_value_init (&list, GST_TYPE_LIST);
+ g_value_init (&item, G_TYPE_INT);
+ for (i = 0; i < SIO_NRATE; i++) {
+ if ((cap.confs[0].rate & (1 << i)) == 0)
+ continue;
+ g_value_set_int(&item, cap.rate[i]);
+ gst_value_list_append_value (&list, &item);
+ }
+ gst_structure_set_value (s, "rate", &list);
+ g_value_unset (&item);
+ g_value_unset (&list);
+
+ /*
+ * scan supported channels
+ */
+ g_value_init (&list, GST_TYPE_LIST);
+ g_value_init (&item, G_TYPE_INT);
+ chan = (mode == SIO_PLAY) ? cap.confs[0].pchan : cap.confs[0].rchan;
+ for (i = 0; i < SIO_NCHAN; i++) {
+ if ((chan & (1 << i)) == 0)
+ continue;
+ g_value_set_int(&item, (mode == SIO_PLAY) ? cap.pchan[i] : cap.rchan[i]);
+ gst_value_list_append_value (&list, &item);
+ }
+ gst_structure_set_value (s, "channels", &list);
+ g_value_unset (&item);
+ g_value_unset (&list);
+
+ /*
+ * scan supported encodings
+ */
+ g_value_init (&list, GST_TYPE_LIST);
+ g_value_init (&item, G_TYPE_STRING);
+ for (i = 0; i < SIO_NENC; i++) {
+ if ((cap.confs[0].enc & (1 << i)) == 0)
+ continue;
+ enc = cap.enc + i;
+ if (enc->bits % 8 != 0)
+ continue;
+ if (enc->bits < enc->bps * 8 && enc->msb)
+ continue;
+ if (enc->bits == enc->bps * 8) {
+ snprintf(fmt, sizeof(fmt), "%s%u%s",
+ enc->sig ? "S" : "U",
+ enc->bits,
+ enc->bps > 1 ? (enc->le ? "LE" : "BE") : "");
+ } else {
+ snprintf(fmt, sizeof(fmt), "%s%u_%u%s",
+ enc->sig ? "S" : "U",
+ enc->bits,
+ enc->bps * 8,
+ enc->bps > 1 ? (enc->le ? "LE" : "BE") : "");
+ }
+ g_value_set_string(&item, fmt);
+ gst_value_list_append_value (&list, &item);
+ }
+ gst_structure_set_value (s, "format", &list);
+ g_value_unset (&item);
+ g_value_unset (&list);
+
+ /*
+ * add the only supported layout: interleaved
+ */
+ g_value_init (&item, G_TYPE_STRING);
+ g_value_set_string(&item, "interleaved");
+ gst_structure_set_value (s, "layout", &item);
+ g_value_unset (&item);
+
+ gst_caps_append_structure (caps, s);
+ sio->cur_caps = caps;
+ GST_DEBUG ("caps are %s", gst_caps_to_string(caps));
+ return TRUE;
+}
+
+gboolean
+gst_sndio_close (struct gstsndio *sio)
+{
+ GST_DEBUG_OBJECT (sio->obj, "close");
+
+ gst_caps_replace (&sio->cur_caps, NULL);
+ sio_close (sio->hdl);
+ sio->hdl = NULL;
+ return TRUE;
+}
+
+static void
+gst_sndio_cb (void *addr, int delta)
+{
+ struct gstsndio *sio = addr;
+
+ delta *= sio->bpf;
+ if (sio->mode == SIO_PLAY)
+ sio->delay -= delta;
+ else
+ sio->delay += delta;
+}
+
+gboolean
+gst_sndio_prepare (struct gstsndio *sio, GstAudioRingBufferSpec *spec)
+{
+ struct sio_par par, retpar;
+ unsigned nchannels;
+
+ GST_DEBUG_OBJECT (sio, "prepare");
+
+ if (spec->type != GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW) {
+ GST_ELEMENT_ERROR (sio, RESOURCE, OPEN_READ_WRITE,
+ ("Only raw buffer format supported by sndio"), (NULL));
+ return FALSE;
+ }
+ if (!GST_AUDIO_INFO_IS_INTEGER(&spec->info)) {
+ GST_ELEMENT_ERROR (sio, RESOURCE, OPEN_READ_WRITE,
+ ("Only integer format supported"), (NULL));
+ return FALSE;
+ }
+ if (GST_AUDIO_INFO_DEPTH(&spec->info) % 8) {
+ GST_ELEMENT_ERROR (sio, RESOURCE, OPEN_READ_WRITE,
+ ("Only depths multiple of 8 are supported"), (NULL));
+ return FALSE;
+ }
+
+ sio_initpar (&par);
+ switch (GST_AUDIO_INFO_FORMAT (&spec->info)) {
+ case GST_AUDIO_FORMAT_S8:
+ case GST_AUDIO_FORMAT_U8:
+ case GST_AUDIO_FORMAT_S16LE:
+ case GST_AUDIO_FORMAT_S16BE:
+ case GST_AUDIO_FORMAT_U16LE:
+ case GST_AUDIO_FORMAT_U16BE:
+ case GST_AUDIO_FORMAT_S32LE:
+ case GST_AUDIO_FORMAT_S32BE:
+ case GST_AUDIO_FORMAT_U32LE:
+ case GST_AUDIO_FORMAT_U32BE:
+ case GST_AUDIO_FORMAT_S24_32LE:
+ case GST_AUDIO_FORMAT_S24_32BE:
+ case GST_AUDIO_FORMAT_U24_32LE:
+ case GST_AUDIO_FORMAT_U24_32BE:
+ case GST_AUDIO_FORMAT_S24LE:
+ case GST_AUDIO_FORMAT_S24BE:
+ case GST_AUDIO_FORMAT_U24LE:
+ case GST_AUDIO_FORMAT_U24BE:
+ break;
+ default:
+ GST_ELEMENT_ERROR (sio, RESOURCE, OPEN_READ_WRITE,
+ ("Unsupported audio format"),
+ ("format = %d", GST_AUDIO_INFO_FORMAT (&spec->info)));
+ return FALSE;
+ }
+ par.sig = GST_AUDIO_INFO_IS_SIGNED(&spec->info);
+ par.bits = GST_AUDIO_INFO_WIDTH(&spec->info);
+ par.bps = GST_AUDIO_INFO_DEPTH(&spec->info) / 8;
+ if (par.bps > 1)
+ par.le = GST_AUDIO_INFO_IS_LITTLE_ENDIAN(&spec->info);
+ if (par.bits < par.bps * 8)
+ par.msb = 0;
+ par.rate = GST_AUDIO_INFO_RATE(&spec->info);
+ if (sio->mode == SIO_PLAY)
+ par.pchan = GST_AUDIO_INFO_CHANNELS(&spec->info);
+ else
+ par.rchan = GST_AUDIO_INFO_CHANNELS(&spec->info);
+ par.round = par.rate / 1000000. * spec->latency_time;
+ par.appbufsz = par.rate / 1000000. * spec->buffer_time;
+
+ if (!sio_setpar (sio->hdl, &par)) {
+ GST_ELEMENT_ERROR (sio, RESOURCE, OPEN_WRITE,
+ ("Unsupported audio encoding"), (NULL));
+ return FALSE;
+ }
+ if (!sio_getpar (sio->hdl, &retpar)) {
+ GST_ELEMENT_ERROR (sio, RESOURCE, OPEN_WRITE,
+ ("Couldn't get audio device parameters"), (NULL));
+ return FALSE;
+ }
+#if 0
+ GST_DEBUG ("format = %s, "
+ "requested: sig = %d, bits = %d, bps = %d, le = %d, msb = %d, "
+ "rate = %d, pchan = %d, round = %d, appbufsz = %d; "
+ "returned: sig = %d, bits = %d, bps = %d, le = %d, msb = %d, "
+ "rate = %d, pchan = %d, round = %d, appbufsz = %d, bufsz = %d",
+ GST_AUDIO_INFO_NAME(&spec->info),
+ par.sig, par.bits, par.bps, par.le, par.msb,
+ par.rate, par.pchan, par.round, par.appbufsz,
+ retpar.sig, retpar.bits, retpar.bps, retpar.le, retpar.msb,
+ retpar.rate, retpar.pchan, retpar.round, retpar.appbufsz, retpar.bufsz);
+#endif
+ if (par.bits != retpar.bits ||
+ par.bps != retpar.bps ||
+ par.rate != retpar.rate ||
+ (sio->mode == SIO_PLAY && par.pchan != retpar.pchan) ||
+ (sio->mode == SIO_REC && par.rchan != retpar.rchan) ||
+ (par.bps > 1 && par.le != retpar.le) ||
+ (par.bits < par.bps * 8 && par.msb != retpar.msb)) {
+ GST_ELEMENT_ERROR (sio, RESOURCE, OPEN_WRITE,
+ ("Audio device refused requested parameters"), (NULL));
+ return FALSE;
+ }
+
+ nchannels = (sio->mode == SIO_PLAY) ? retpar.pchan : retpar.rchan;
+ spec->segsize = retpar.round * retpar.bps * nchannels;
+ spec->segtotal = retpar.bufsz / retpar.round;
+ sio->bpf = retpar.bps * nchannels;
+ sio->delay = 0;
+ sio_onmove (sio->hdl, gst_sndio_cb, sio);
+
+ if (!sio_start (sio->hdl)) {
+ GST_ELEMENT_ERROR (sio->obj, RESOURCE, OPEN_READ_WRITE,
+ ("Could not start sndio"), (NULL));
+ return FALSE;
+ }
+ return TRUE;
+}
+
+gboolean
+gst_sndio_unprepare (struct gstsndio *sio)
+{
+ if (sio->hdl)
+ sio_stop (sio->hdl);
+ return TRUE;
+}
+
+void
+gst_sndio_set_property (struct gstsndio *sio, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ switch (prop_id) {
+ case PROP_DEVICE:
+ g_free (sio->device);
+ sio->device = g_value_dup_string (value);
+ break;
+ case PROP_VOLUME:
+ sio_setvol (sio->hdl, g_value_get_double (value) * SIO_MAXVOL);
+ break;
+ case PROP_MUTE:
+ if (g_value_get_boolean (value))
+ sio_setvol (sio->hdl, 0);
+ break;
+ default:
+ break;
+ }
+}
+
+void
+gst_sndio_get_property (struct gstsndio *sio, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ switch (prop_id) {
+ case PROP_DEVICE:
+ g_value_set_string (value, sio->device);
+ break;
+ case PROP_VOLUME:
+ g_value_set_double (value, (gdouble)sio->volume / SIO_MAXVOL);
+ break;
+ case PROP_MUTE:
+ g_value_set_boolean (value, (sio->volume == 0));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (sio->obj, prop_id, pspec);
+ }
+}
diff --git a/java/openjfx14/files/gstsndio.h b/java/openjfx14/files/gstsndio.h
new file mode 100644
index 000000000000..77ec4e6f86a5
--- /dev/null
+++ b/java/openjfx14/files/gstsndio.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2012 Alexandre Ratchov <alex@caoua.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#ifndef __GST_SNDIO_H__
+#define __GST_SNDIO_H__
+
+#include <sndio.h>
+#include <gst/gst.h>
+#include <gst/audio/gstaudiosink.h>
+#include <gst/audio/gstaudiosrc.h>
+#include <gst/audio/streamvolume.h>
+
+enum
+{
+ PROP_0,
+ PROP_DEVICE,
+ PROP_VOLUME,
+ PROP_MUTE
+};
+
+#define GST_SNDIO_CAPS_STRING \
+ "audio/x-raw, " \
+ "format = (string) { " \
+ "S8, U8, " \
+ "S16LE, S16BE, U16LE, U16BE, " \
+ "S32LE, S32BE, U32LE, U32BE, " \
+ "S24_32LE, S24_32BE, U24_32LE, " \
+ "U24_32BE, S24LE, S24BE, U24LE, U24BE " \
+ "}, " \
+ "layout = (string) interleaved, " \
+ "rate = (int) [ 8000, 192000 ], " \
+ "channels = (int) [1, 16]"
+
+/*
+ * data common to src and sink
+ */
+struct gstsndio {
+ struct sio_hdl *hdl;
+ gchar *device;
+ gint mode;
+ gint bpf; /* bytes per frame */
+ gint delay; /* bytes stored in the audio fifo */
+ guint volume; /* volume level */
+ GstCaps *cur_caps; /* saved capabilities of opened device */
+ GObject *obj; /* for logging */
+};
+
+#define GST_SNDIO_DELAY(s) ((s)->delay / (s)->bpf)
+
+void gst_sndio_init (struct gstsndio *sio, GObject *obj);
+void gst_sndio_finalize (struct gstsndio *sio);
+GstCaps *gst_sndio_getcaps (struct gstsndio *sio, GstCaps * filter);
+gboolean gst_sndio_open (struct gstsndio *sio, gint mode);
+gboolean gst_sndio_close (struct gstsndio *sio);
+gboolean gst_sndio_prepare (struct gstsndio *sio, GstAudioRingBufferSpec *spec);
+gboolean gst_sndio_unprepare (struct gstsndio *sio);
+void gst_sndio_set_property (struct gstsndio *sio, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+void gst_sndio_get_property (struct gstsndio *sio, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+int gst_sndio_setpar(gpointer sio, GstAudioRingBufferSpec * spec,
+ int mode, struct sio_hdl *hdl);
+GstCaps *gst_sndio_caps (gpointer sio, int mode, struct sio_hdl *hdl);
+
+#endif
diff --git a/java/openjfx14/files/patch-build.gradle b/java/openjfx14/files/patch-build.gradle
new file mode 100644
index 000000000000..5cca941796d1
--- /dev/null
+++ b/java/openjfx14/files/patch-build.gradle
@@ -0,0 +1,303 @@
+--- build.gradle.orig 2020-07-17 12:21:33 UTC
++++ build.gradle
+@@ -295,6 +295,7 @@ ext.IS_64 = OS_ARCH.toLowerCase().contains("64")
+ ext.IS_MAC = OS_NAME.contains("mac") || OS_NAME.contains("darwin")
+ ext.IS_WINDOWS = OS_NAME.contains("windows")
+ ext.IS_LINUX = OS_NAME.contains("linux")
++ext.IS_BSD = OS_NAME.contains("freebsd") || OS_NAME.contains("dragonfly")
+
+ ext.MAVEN_GROUP_ID = "org.openjfx"
+
+@@ -302,7 +303,7 @@ ext.MAVEN_GROUP_ID = "org.openjfx"
+ // at present building on PI is not supported, but we would only need to make
+ // some changes on assumptions on what should be built (like SWT / Swing) and
+ // such and we could probably make it work.
+-if (!IS_MAC && !IS_WINDOWS && !IS_LINUX) fail("Unsupported build OS ${OS_NAME}")
++if (!IS_MAC && !IS_WINDOWS && !IS_LINUX && !IS_BSD) fail("Unsupported build OS ${OS_NAME}")
+ if (IS_WINDOWS && OS_ARCH != "x86" && OS_ARCH != "amd64") {
+ fail("Unknown and unsupported build architecture: $OS_ARCH")
+ } else if (IS_MAC && OS_ARCH != "x86_64") {
+@@ -385,7 +386,7 @@ defineProperty("BUILD_WORKING_LIBAV", "false")
+ ext.IS_BUILD_WORKING_LIBAV = IS_LINUX ? Boolean.parseBoolean(BUILD_WORKING_LIBAV) : false
+
+ // COMPILE_PANGO specifies whether to build javafx_font_pango.
+-defineProperty("COMPILE_PANGO", "${IS_LINUX}")
++defineProperty("COMPILE_PANGO", "${IS_LINUX || IS_BSD}")
+ ext.IS_COMPILE_PANGO = Boolean.parseBoolean(COMPILE_PANGO)
+
+ // COMPILE_HARFBUZZ specifies whether to use Harfbuzz.
+@@ -413,7 +414,8 @@ ext.SWT_FILE_NAME = IS_MAC ? "org.eclipse.swt.cocoa.ma
+ IS_WINDOWS && IS_64 ? "org.eclipse.swt.win32.win32.x86_64_3.105.3.v20170228-0512" :
+ IS_WINDOWS && !IS_64 ? "org.eclipse.swt.win32.win32.x86_3.105.3.v20170228-0512" :
+ IS_LINUX && IS_64 ? "org.eclipse.swt.gtk.linux.x86_64_3.105.3.v20170228-0512" :
+- IS_LINUX && !IS_64 ? "org.eclipse.swt.gtk.linux.x86_3.105.3.v20170228-0512" : ""
++ IS_LINUX && !IS_64 ? "org.eclipse.swt.gtk.linux.x86_3.105.3.v20170228-0512" :
++ IS_BSD ? "/usr/local/share/java/classes/swt.jar" : ""
+
+ // Specifies whether to run full tests (true) or smoke tests (false)
+ defineProperty("FULL_TEST", "false")
+@@ -495,6 +497,12 @@ if (IS_MAC) {
+ defineProperty("NUM_COMPILE_THREADS", "${Runtime.runtime.availableProcessors()}")
+ }
+
++if (IS_BSD) {
++ ext.MAKE_CMD = "gmake"
++} else {
++ ext.MAKE_CMD = "make"
++}
++
+ //
+ // The next three sections of properties are used to generate the
+ // VersionInfo class, and the Windows DLL manifest.
+@@ -558,7 +566,7 @@ defineProperty("MAVEN_VERSION", IS_MILESTONE_FCS ? "${
+ // Check whether the COMPILE_TARGETS property has been specified (if so, it was done by
+ // the user and not by this script). If it has not been defined then default
+ // to building the normal desktop build for this machine
+-project.ext.set("defaultHostTarget", IS_MAC ? "mac" : IS_WINDOWS ? "win" : IS_LINUX ? "linux" : "");
++project.ext.set("defaultHostTarget", IS_MAC ? "mac" : IS_WINDOWS ? "win" : IS_LINUX ? "linux" : IS_BSD ? "bsd" : "");
+ defineProperty("COMPILE_TARGETS", "$defaultHostTarget")
+
+ // Flag indicating whether to import cross compile tools
+@@ -704,7 +712,7 @@ void fetchExternalTools(String configName, List packag
+ def File pkgdir = file("$destdir/$basename")
+
+ if (pkgname.endsWith(".tgz") || pkgname.endsWith("tar.gz")) {
+- if (IS_LINUX || IS_MAC) {
++ if (IS_LINUX || IS_MAC || IS_BSD) {
+ // use native tar to support symlinks
+ pkgdir.mkdirs()
+ exec {
+@@ -1180,7 +1188,7 @@ compileTargets { t ->
+ if (!targetProperties.containsKey('includeMonocle')) targetProperties.includeMonocle = false
+ if (!targetProperties.containsKey('includeEGL')) targetProperties.includeEGL = false
+
+- if (!targetProperties.containsKey('includeGTK')) targetProperties.includeGTK = IS_LINUX
++ if (!targetProperties.containsKey('includeGTK')) targetProperties.includeGTK = IS_LINUX || IS_BSD
+
+ if (!targetProperties.containsKey('modLibDest')) targetProperties.modLibDest = targetProperties.libDest
+
+@@ -2067,6 +2075,11 @@ project(":graphics") {
+ }
+
+ dependencies {
++ if (IS_BSD) {
++ compile files(SWT_FILE_NAME)
++ } else {
++ compile name: SWT_FILE_NAME
++ }
+ stubCompile group: "junit", name: "junit", version: "4.8.2"
+
+ antlr group: "org.antlr", name: "antlr4", version: "4.7.2", classifier: "complete"
+@@ -2602,31 +2615,10 @@ project(":swt") {
+ commonModuleSetup(project, [ 'base', 'graphics' ])
+
+ dependencies {
+- compile name: SWT_FILE_NAME
+- }
+-
+- classes {
+- doLast {
+- // Copy all of the download libraries to libs directory for the sake of the IDEs
+- File libsDir = rootProject.file("build/libs");
+- File swtLib = new File(libsDir, "swt-debug.jar")
+- libsDir.mkdirs();
+-
+- // Skip copy if file is present.
+- if (swtLib.exists()) return;
+-
+- for (File f : configurations.compile.files) {
+- // Have to rename the swt jar because it is some platform specific name but
+- // for the sake of the IDEs we need to have a single stable name that works
+- // on every platform
+- copy {
+- into libsDir
+- from f.getParentFile()
+- include "**/*swt*.jar"
+- includeEmptyDirs = false
+- rename ".*swt.*jar", "swt-debug\\.jar"
+- }
+- }
++ if (IS_BSD) {
++ compile files(SWT_FILE_NAME)
++ } else {
++ compile name: SWT_FILE_NAME
+ }
+ }
+
+@@ -2809,7 +2801,7 @@ project(":media") {
+
+ doLast {
+ exec {
+- commandLine ("make", "${makeJobsFlag}", "-C", "${nativeSrcDir}/jfxmedia/projects/${projectDir}")
++ commandLine (MAKE_CMD, "${makeJobsFlag}", "-C", "${nativeSrcDir}/jfxmedia/projects/${projectDir}")
+ args("JAVA_HOME=${JDK_HOME}", "GENERATED_HEADERS_DIR=${generatedHeadersDir}",
+ "OUTPUT_DIR=${nativeOutputDir}", "BUILD_TYPE=${buildType}", "BASE_NAME=jfxmedia",
+ "COMPILE_PARFAIT=${compileParfait}",
+@@ -2838,7 +2830,7 @@ project(":media") {
+ enabled = IS_COMPILE_MEDIA
+ doLast {
+ exec {
+- commandLine ("make", "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/${projectDir}/gstreamer-lite")
++ commandLine (MAKE_CMD, "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/${projectDir}/gstreamer-lite")
+ args("OUTPUT_DIR=${nativeOutputDir}", "BUILD_TYPE=${buildType}", "BASE_NAME=gstreamer-lite",
+ IS_64 ? "ARCH=x64" : "ARCH=x32", "CC=${mediaProperties.compiler}",
+ "AR=${mediaProperties.ar}", "LINKER=${mediaProperties.linker}")
+@@ -2856,7 +2848,7 @@ project(":media") {
+
+ doLast {
+ exec {
+- commandLine ("make", "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/${projectDir}/fxplugins")
++ commandLine (MAKE_CMD, "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/${projectDir}/fxplugins")
+ args("OUTPUT_DIR=${nativeOutputDir}", "BUILD_TYPE=${buildType}", "BASE_NAME=fxplugins",
+ IS_64 ? "ARCH=x64" : "ARCH=x32",
+ "CC=${mediaProperties.compiler}", "AR=${mediaProperties.ar}", "LINKER=${mediaProperties.linker}")
+@@ -2879,7 +2871,7 @@ project(":media") {
+
+ buildNative.dependsOn buildPlugins
+
+- if (t.name == "linux") {
++ if (t.name == "linux" || t.name == "bsd") {
+ // Pre-defined command line arguments
+ def cfgCMDArgs = ["sh", "configure"]
+ def commonCfgArgs = ["--enable-shared", "--disable-debug", "--disable-static", "--disable-yasm", "--disable-doc", "--disable-programs", "--disable-everything"]
+@@ -2984,7 +2976,7 @@ project(":media") {
+ }
+ exec {
+ workingDir("$libavDir")
+- commandLine("make")
++ commandLine(MAKE_CMD)
+ }
+ }
+ }
+@@ -3052,7 +3044,7 @@ project(":media") {
+ }
+ exec {
+ workingDir("$libavDir")
+- commandLine("make")
++ commandLine(MAKE_CMD)
+ }
+ }
+ }
+@@ -3138,7 +3130,7 @@ project(":media") {
+ }
+ exec {
+ workingDir("$libavDir")
+- commandLine("make")
++ commandLine(MAKE_CMD)
+ }
+ }
+ }
+@@ -3172,7 +3164,7 @@ project(":media") {
+ File dir = file(libavDir)
+ if (dir.exists()) {
+ exec {
+- commandLine ("make", "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/linux/avplugin")
++ commandLine (MAKE_CMD, "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/linux/avplugin")
+ args("CC=${mediaProperties.compiler}", "LINKER=${mediaProperties.linker}",
+ "OUTPUT_DIR=${nativeOutputDir}", "BUILD_TYPE=${buildType}",
+ "BASE_NAME=avplugin", "VERSION=${version}", "LIBAV_DIR=${libavDir}",
+@@ -3186,7 +3178,7 @@ project(":media") {
+ File dir = file(libavDir)
+ if (dir.exists()) {
+ exec {
+- commandLine ("make", "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/linux/avplugin")
++ commandLine (MAKE_CMD, "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/${t.name}/avplugin")
+ args("CC=${mediaProperties.compiler}", "LINKER=${mediaProperties.linker}",
+ "OUTPUT_DIR=${nativeOutputDir}", "BUILD_TYPE=${buildType}",
+ "BASE_NAME=avplugin", "VERSION=${version}", "LIBAV_DIR=${libavDir}",
+@@ -3200,7 +3192,7 @@ project(":media") {
+ File dir = file(libavDir)
+ if (dir.exists()) {
+ exec {
+- commandLine ("make", "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/linux/avplugin")
++ commandLine (MAKE_CMD, "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/linux/avplugin")
+ args("CC=${mediaProperties.compiler}", "LINKER=${mediaProperties.linker}",
+ "OUTPUT_DIR=${nativeOutputDir}", "BUILD_TYPE=${buildType}",
+ "BASE_NAME=avplugin", "VERSION=${version}", "LIBAV_DIR=${libavDir}",
+@@ -3211,7 +3203,7 @@ project(":media") {
+ } else {
+ // Building fxavcodec plugin (libav plugin)
+ exec {
+- commandLine ("make", "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/linux/avplugin")
++ commandLine (MAKE_CMD, "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/linux/avplugin")
+ args("CC=${mediaProperties.compiler}", "LINKER=${mediaProperties.linker}",
+ "OUTPUT_DIR=${nativeOutputDir}", "BUILD_TYPE=${buildType}",
+ "BASE_NAME=avplugin", IS_64 ? "ARCH=x64" : "ARCH=x32")
+@@ -3262,7 +3254,7 @@ project(":media") {
+ doLast {
+ exec {
+ environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT)
+- commandLine ("make", "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/${projectDir}/glib-lite")
++ commandLine (MAKE_CMD, "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/${projectDir}/glib-lite")
+ args("OUTPUT_DIR=${nativeOutputDir}", "BUILD_TYPE=${buildType}", "BASE_NAME=glib-lite",
+ IS_64 ? "ARCH=x64" : "ARCH=x32", "RESOURCE=${nativeOutputDir}/${buildType}/${WIN.media.glibRcFile}",
+ "CC=${mediaProperties.compiler}", "AR=${mediaProperties.ar}", "LINKER=${mediaProperties.linker}")
+@@ -3282,7 +3274,7 @@ project(":media") {
+ }
+
+ exec {
+- commandLine ("make", "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/${projectDir}/glib-lite")
++ commandLine (MAKE_CMD, "${makeJobsFlag}", "-C", "${nativeSrcDir}/gstreamer/projects/${projectDir}/glib-lite")
+ args("OUTPUT_DIR=${nativeOutputDir}", "BUILD_TYPE=${buildType}", "BASE_NAME=glib-lite")
+ args ("CC=${mediaProperties.compiler}", "LINKER=${mediaProperties.linker}")
+ }
+@@ -3407,7 +3399,7 @@ project(":web") {
+ compileTargets { t ->
+ def targetProperties = project.rootProject.ext[t.upper]
+ def webkitProperties = targetProperties.webkit
+- def classifier = (t.name != "linux" && t.name != "win") ? t.name :
++ def classifier = (t.name != "linux" && t.name != "bsd" && t.name != "win") ? t.name :
+ IS_64 ? "${t.name}-amd64" : "${t.name}-i586"
+
+ def webkitOutputDir = cygpath("$buildDir/${t.name}")
+@@ -3436,13 +3428,16 @@ project(":web") {
+ environment(WINDOWS_NATIVE_COMPILE_ENVIRONMENT)
+ } else if (t.name == "mac") {
+ cmakeArgs = " $cmakeArgs -DCMAKE_OSX_DEPLOYMENT_TARGET=$MACOSX_MIN_VERSION -DCMAKE_OSX_SYSROOT=$MACOSX_SDK_PATH"
+- } else if (t.name == "linux") {
+- cmakeArgs = " $cmakeArgs -DCMAKE_SYSTEM_NAME=Linux"
+- if (IS_64) {
+- cmakeArgs = "$cmakeArgs -DCMAKE_SYSTEM_PROCESSOR=x86_64"
++ } else if (t.name == "linux" || t.name == "bsd") {
++ if (t.name == "linux") {
++ cmakeArgs = " $cmakeArgs -DCMAKE_SYSTEM_NAME=Linux"
+ } else {
+- cmakeArgs = "$cmakeArgs -DCMAKE_SYSTEM_PROCESSOR=i586"
++ cmakeArgs = " $cmakeArgs -DCMAKE_SYSTEM_NAME=FreeBSD"
+ }
++ if ( OS_ARCH != "amd64" && OS_ARCH != "i386" ) {
++ cmakeArgs = "$cmakeArgs -DENABLE_JIT=OFF"
++ }
++ cmakeArgs = " $cmakeArgs -DCMAKE_SYSTEM_PROCESSOR=$OS_ARCH"
+ // TODO: Use cflags and ldflags from all platforms
+ def cFlags = webkitProperties.ccFlags?.join(' ') ?: ''
+ def lFlags = webkitProperties.linkFlags?.join(' ') ?: ''
+@@ -3479,6 +3474,10 @@ project(":web") {
+ targetCpuBitDepthSwitch = "--32-bit"
+ }
+ cmakeArgs += " -DJAVAFX_RELEASE_VERSION=${jfxReleaseMajorVersion}"
++ cmakeArgs += " -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"
++ cmakeArgs += " -DCMAKE_C_COMPILER:STRING=${System.getenv("CC")}"
++ cmakeArgs += " -DCMAKE_CXX_COMPILER:STRING=${System.getenv("CXX")}"
++
+ commandLine("perl", "$projectDir/src/main/native/Tools/Scripts/build-webkit",
+ "--java", "--icu-unicode", targetCpuBitDepthSwitch,
+ "--no-experimental-features", "--cmakeargs=${cmakeArgs}")
+@@ -4928,7 +4927,7 @@ compileTargets { t ->
+ // OSX media natives
+ [ "jfxmedia_qtkit", "jfxmedia_avf", "glib-lite" ].each { name ->
+ from ("${mediaProject.buildDir}/native/${t.name}/${mediaBuildType}/${library(name)}") }
+- } else if (t.name == "linux") {
++ } else if (t.name == "linux" || t.name == "bsd") {
+ from("${mediaProject.buildDir}/native/${t.name}/${mediaBuildType}") { include "libavplugin*.so" }
+ } else from ("${mediaProject.buildDir}/native/${t.name}/${mediaBuildType}/${library("glib-lite")}")
+ } else {
+@@ -4941,7 +4940,7 @@ compileTargets { t ->
+ // copy libjfxmedia_{avf,qtkit}.dylib if they exist
+ [ "jfxmedia_qtkit", "jfxmedia_avf", "glib-lite" ].each { name ->
+ from ("$MEDIA_STUB/${library(name)}") }
+- } else if (t.name == "linux") {
++ } else if (t.name == "linux" || t.name == "bsd") {
+ from(MEDIA_STUB) { include "libavplugin*.so" }
+ }
+ else if (t.name != "android" && t.name != "dalvik" ) {
diff --git a/java/openjfx14/files/patch-buildSrc_bsd.gradle b/java/openjfx14/files/patch-buildSrc_bsd.gradle
new file mode 100644
index 000000000000..126bac63c66d
--- /dev/null
+++ b/java/openjfx14/files/patch-buildSrc_bsd.gradle
@@ -0,0 +1,332 @@
+--- buildSrc/bsd.gradle.orig 2020-07-21 10:33:26 UTC
++++ buildSrc/bsd.gradle
+@@ -0,0 +1,329 @@
++/*
++ * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++ext.BSD = [:]
++
++// Declare whether this particular target file applies to the current system
++BSD.canBuild = IS_BSD;
++if (!BSD.canBuild) return;
++
++// All desktop related packages should be built
++BSD.compileSwing = true;
++BSD.compileSWT = true;
++
++// Libraries end up in the lib/$OS_ARCH directory for Linux
++BSD.libDest = "lib"
++
++// Lambda for naming the generated libs
++BSD.library = { name -> return (IS_STATIC_BUILD ? "lib${name}.a" : "lib${name}.so") as String }
++
++// A set of common parameters to use for both compiling and linking
++def commonFlags = [
++ "-fno-strict-aliasing", "-fPIC", "-fno-omit-frame-pointer", // optimization flags
++ "-fstack-protector",
++ "-Wextra", "-Wall", "-Wformat-security", "-Wno-unused", "-Wno-parentheses"] // warning flags
++
++if (!IS_64) {
++ commonFlags += "-m32"
++}
++
++if (IS_STATIC_BUILD) {
++ commonFlags += "-DSTATIC_BUILD"
++}
++
++// Specify the compilation parameters and link parameters
++def ccFlags = [
++ commonFlags, "-I$JDK_HOME/include", "-I$JDK_HOME/include/freebsd", "-c",
++ "-ffunction-sections", "-fdata-sections",
++ IS_DEBUG_NATIVE ? ["-ggdb", "-DVERBOSE"] : ["-O2", "-DNDEBUG"]].flatten()
++def ccFlagsGTK3 = ccFlags
++//ccFlags.addAll(["-Wnon-virtual-dtor", "-Woverloaded-virtual", "-std=c++0x"])
++def dynamicLinkFlags = [ "-shared", commonFlags,
++ "-z", "relro",
++ "-Wl,--gc-sections"].flatten()
++
++def staticLinkFlags = [].flatten()
++
++def linkFlags = IS_STATIC_BUILD ? staticLinkFlags : dynamicLinkFlags;
++
++if (IS_DEBUG_NATIVE) {
++ linkFlags += "-g"
++}
++
++def toolchainDir
++if (hasProperty('toolchainDir')) {
++ toolchainDir = ext.toolchainDir + "/"
++} else {
++ toolchainDir = ""
++}
++
++def gtk2CCFlags = [ ];
++def gtk3CCFlags = [ "-Wno-deprecated-declarations" ];
++def gtk2LinkFlags = [ ];
++def gtk3LinkFlags = [ ];
++
++// Create $buildDir/freebsd_tools.properties file and load props from it
++setupTools("bsd_gtk2",
++ { propFile ->
++ ByteArrayOutputStream results1 = new ByteArrayOutputStream();
++ exec {
++ commandLine("${toolchainDir}pkg-config", "--cflags", "gtk+-2.0", "gthread-2.0", "xtst")
++ setStandardOutput(results1);
++ }
++ propFile << "cflagsGTK2=" << results1.toString().trim() << "\n";
++
++ ByteArrayOutputStream results3 = new ByteArrayOutputStream();
++ exec {
++ commandLine("${toolchainDir}pkg-config", "--libs", "gtk+-2.0", "gthread-2.0", "xtst")
++ setStandardOutput(results3);
++ }
++ propFile << "libsGTK2=" << results3.toString().trim() << "\n";
++ },
++ { properties ->
++ def cflagsGTK2 = properties.getProperty("cflagsGTK2")
++ def libsGTK2 = properties.getProperty("libsGTK2")
++ if (cflagsGTK2 && libsGTK2) {
++ gtk2CCFlags.addAll(cflagsGTK2.split(" "))
++ gtk2LinkFlags.addAll(libsGTK2.split(" "))
++ } else {
++ throw new IllegalStateException("GTK2 development packages not found. If GTK2 packages are installed, please remove the build directory and try again.")
++ }
++ }
++)
++
++setupTools("bsd_gtk3",
++ { propFile ->
++ ByteArrayOutputStream results2 = new ByteArrayOutputStream();
++ exec {
++ commandLine("${toolchainDir}pkg-config", "--cflags", "gtk+-3.0", "gthread-2.0", "xtst")
++ setStandardOutput(results2);
++ }
++ propFile << "cflagsGTK3=" << results2.toString().trim() << "\n";
++
++ ByteArrayOutputStream results4 = new ByteArrayOutputStream();
++ exec {
++ commandLine("${toolchainDir}pkg-config", "--libs", "gtk+-3.0", "gthread-2.0", "xtst")
++ setStandardOutput(results4);
++ }
++ propFile << "libsGTK3=" << results4.toString().trim() << "\n";
++
++ },
++ { properties ->
++ def cflagsGTK3 = properties.getProperty("cflagsGTK3")
++ def libsGTK3 = properties.getProperty("libsGTK3")
++ if (cflagsGTK3 && libsGTK3) {
++ gtk3CCFlags.addAll(cflagsGTK3.split(" "))
++ gtk3LinkFlags.addAll(libsGTK3.split(" "))
++ } else {
++ throw new IllegalStateException("GTK3 development packages not found. If GTK3 packages are installed, please remove the build directory and try again.")
++ }
++ }
++)
++
++def pangoCCFlags = ["-D_ENABLE_PANGO"];
++def pangoLinkFlags = [];
++setupTools("bsd_pango_tools",
++ { propFile ->
++ ByteArrayOutputStream results = new ByteArrayOutputStream();
++ exec {
++ commandLine "${toolchainDir}pkg-config", "--cflags", "pangoft2"
++ standardOutput = results
++ }
++ propFile << "cflags=" << results.toString().trim() << "\n";
++
++ results = new ByteArrayOutputStream();
++ exec {
++ commandLine "${toolchainDir}pkg-config", "--libs", "pangoft2"
++ standardOutput = results
++ }
++ propFile << "libs=" << results.toString().trim();
++ },
++ { properties ->
++ def cflags = properties.getProperty("cflags")
++ def libs = properties.getProperty("libs")
++ if (cflags && libs) {
++ pangoCCFlags.addAll(cflags.split(" "))
++ pangoLinkFlags.addAll(libs.split(" "))
++ } else {
++ throw new IllegalStateException("Linux pango packages not found.\nIf pango packages are installed, please remove the build directory and try again.")
++ }
++ }
++)
++
++def freetypeCCFlags = [ext.IS_COMPILE_PANGO ? "-D_ENABLE_PANGO" :
++ ext.IS_COMPILE_HARFBUZZ ? "-D_ENABLE_HARFBUZZ" : ""]
++def freetypeLinkFlags = []
++setupTools("bsd_freetype_tools",
++ { propFile ->
++ ByteArrayOutputStream results = new ByteArrayOutputStream();
++ exec {
++ commandLine "${toolchainDir}pkg-config", "--cflags", "freetype2"
++ standardOutput = results
++ }
++ propFile << "cflags=" << results.toString().trim() << "\n";
++
++ results = new ByteArrayOutputStream();
++ exec {
++ commandLine "${toolchainDir}pkg-config", "--libs", "freetype2"
++ standardOutput = results
++ }
++ propFile << "libs=" << results.toString().trim();
++ },
++ { properties ->
++ def cflags = properties.getProperty("cflags")
++ def libs = properties.getProperty("libs")
++ if (cflags && libs) {
++ freetypeCCFlags.addAll(cflags.split(" "))
++ if (!IS_STATIC_BUILD) {
++ freetypeLinkFlags.addAll(libs.split(" "))
++ }
++ } else {
++ throw new IllegalStateException("Linux freetype packages not found.\nIf freetype pacakges are installed, please remove the build directory and try again.")
++ }
++ }
++)
++
++def compiler = IS_COMPILE_PARFAIT ? "parfait-gcc" : "${toolchainDir}gcc";
++def linker = IS_STATIC_BUILD ? "ar" : IS_COMPILE_PARFAIT ? "parfait-g++" : "${toolchainDir}g++";
++
++BSD.glass = [:]
++BSD.glass.variants = ["glass", "glassgtk2", "glassgtk3"]
++
++FileTree ft_gtk_launcher = fileTree("${project(":graphics").projectDir}/src/main/native-glass/gtk/") {
++ include("**/launcher.c")
++}
++
++FileTree ft_gtk = fileTree("${project(":graphics").projectDir}/src/main/native-glass/gtk/") {
++ exclude("**/launcher.c")
++}
++
++BSD.glass.glass = [:]
++BSD.glass.glass.nativeSource = ft_gtk_launcher.getFiles()
++BSD.glass.glass.compiler = compiler
++BSD.glass.glass.ccFlags = [ccFlags].flatten()
++BSD.glass.glass.linker = linker
++BSD.glass.glass.linkFlags = IS_STATIC_BUILD? linkFlags : [linkFlags, "-lX11", "-ldl"].flatten()
++BSD.glass.glass.lib = "glass"
++
++BSD.glass.glassgtk2 = [:]
++BSD.glass.glassgtk2.nativeSource = ft_gtk.getFiles()
++BSD.glass.glassgtk2.compiler = compiler
++BSD.glass.glassgtk2.ccFlags = IS_STATIC_BUILD ?
++ ["-fno-threadsafe-statics", ccFlags, gtk2CCFlags].flatten() :
++ [ccFlags, gtk2CCFlags].flatten()
++BSD.glass.glassgtk2.linker = linker
++BSD.glass.glassgtk2.linkFlags = IS_STATIC_BUILD ? linkFlags : [linkFlags, gtk2LinkFlags].flatten()
++BSD.glass.glassgtk2.lib = "glassgtk2"
++
++BSD.glass.glassgtk3 = [:]
++BSD.glass.glassgtk3.nativeSource = ft_gtk.getFiles()
++BSD.glass.glassgtk3.compiler = compiler
++BSD.glass.glassgtk3.ccFlags = IS_STATIC_BUILD ?
++ ["-fno-threadsafe-statics", ccFlags, gtk3CCFlags].flatten() :
++ [ccFlags, gtk3CCFlags].flatten()
++BSD.glass.glassgtk3.linker = linker
++BSD.glass.glassgtk3.linkFlags = IS_STATIC_BUILD ? linkFlags : [linkFlags, gtk3LinkFlags].flatten()
++BSD.glass.glassgtk3.lib = "glassgtk3"
++
++BSD.decora = [:]
++BSD.decora.compiler = compiler
++BSD.decora.ccFlags = [ccFlags, "-ffast-math"].flatten()
++BSD.decora.linker = linker
++BSD.decora.linkFlags = [linkFlags].flatten()
++BSD.decora.lib = "decora_sse"
++
++BSD.prism = [:]
++BSD.prism.nativeSource = file("${project(":graphics").projectDir}/src/main/native-prism")
++BSD.prism.compiler = compiler
++BSD.prism.ccFlags = [ccFlags, "-DINLINE=inline"].flatten()
++BSD.prism.linker = linker
++BSD.prism.linkFlags = [linkFlags].flatten()
++BSD.prism.lib = "prism_common"
++
++BSD.prismSW = [:]
++BSD.prismSW.nativeSource = file("${project(":graphics").projectDir}/src/main/native-prism-sw")
++BSD.prismSW.compiler = compiler
++BSD.prismSW.ccFlags = [ccFlags, "-DINLINE=inline"].flatten()
++BSD.prismSW.linker = linker
++BSD.prismSW.linkFlags = [linkFlags].flatten()
++BSD.prismSW.lib = "prism_sw"
++
++BSD.iio = [:]
++BSD.iio.nativeSource = [
++ file("${project("graphics").projectDir}/src/main/native-iio"),
++ file("${project("graphics").projectDir}/src/main/native-iio/libjpeg")]
++BSD.iio.compiler = compiler
++BSD.iio.ccFlags = [ccFlags].flatten()
++BSD.iio.linker = linker
++BSD.iio.linkFlags = [linkFlags].flatten()
++BSD.iio.lib = "javafx_iio"
++
++BSD.prismES2 = [:]
++BSD.prismES2.nativeSource = [
++ file("${project("graphics").projectDir}/src/main/native-prism-es2"),
++ file("${project("graphics").projectDir}/src/main/native-prism-es2/GL"),
++ file("${project("graphics").projectDir}/src/main/native-prism-es2/x11")
++]
++BSD.prismES2.compiler = compiler
++BSD.prismES2.ccFlags = ["-DFREEBSD", ccFlags].flatten()
++BSD.prismES2.linker = linker
++BSD.prismES2.linkFlags =IS_STATIC_BUILD ? linkFlags : [linkFlags, "-lX11", "-lXxf86vm", "-lGL"].flatten()
++BSD.prismES2.lib = "prism_es2"
++
++def closedDir = file("$projectDir/../rt-closed")
++BSD.font = [:]
++BSD.font.compiler = compiler
++BSD.font.nativeSource = [file("${project("graphics").projectDir}/src/main/native-font")]
++BSD.font.ccFlags = ["-DJFXFONT_PLUS", ccFlags].flatten()
++BSD.font.linker = linker
++BSD.font.linkFlags = [linkFlags].flatten()
++BSD.font.lib = "javafx_font"
++
++BSD.fontFreetype = [:]
++BSD.fontFreetype.nativeSource = ["src/main/native-font/freetype.c"]
++BSD.fontFreetype.compiler = compiler
++BSD.fontFreetype.ccFlags = ["-DJFXFONT_PLUS", ccFlags, freetypeCCFlags].flatten()
++BSD.fontFreetype.linker = linker
++BSD.fontFreetype.linkFlags = IS_STATIC_BUILD ? linkFlags : [linkFlags, freetypeLinkFlags].flatten()
++BSD.fontFreetype.lib = "javafx_font_freetype"
++
++BSD.fontPango = [:]
++BSD.fontPango.nativeSource = ["src/main/native-font/pango.c"]
++BSD.fontPango.compiler = compiler
++BSD.fontPango.ccFlags = ["-DJFXFONT_PLUS", ccFlags, pangoCCFlags].flatten()
++BSD.fontPango.linker = linker
++BSD.fontPango.linkFlags =IS_STATIC_BUILD ? linkFlags : [linkFlags, pangoLinkFlags].flatten()
++BSD.fontPango.lib = "javafx_font_pango"
++
++BSD.media = [:]
++BSD.media.compiler = compiler
++BSD.media.linker = linker
++BSD.media.ar = "${toolchainDir}ar"
++
++BSD.webkit = [:]
++BSD.webkit.compiler = compiler
++BSD.webkit.linker = linker
++BSD.webkit.ccFlags = commonFlags.flatten()
++BSD.webkit.linkFlags = linkFlags.flatten()
diff --git a/java/openjfx14/files/patch-modules_javafx.base_src_main_java_com_sun_javafx_PlatformUtil.java b/java/openjfx14/files/patch-modules_javafx.base_src_main_java_com_sun_javafx_PlatformUtil.java
new file mode 100644
index 000000000000..67cf6045ff26
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.base_src_main_java_com_sun_javafx_PlatformUtil.java
@@ -0,0 +1,37 @@
+--- modules/javafx.base/src/main/java/com/sun/javafx/PlatformUtil.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.base/src/main/java/com/sun/javafx/PlatformUtil.java
+@@ -69,6 +69,7 @@ public class PlatformUtil {
+ private static final boolean WINDOWS_7_OR_LATER = WINDOWS && versionNumberGreaterThanOrEqualTo(6.1f);
+ private static final boolean MAC = os.startsWith("Mac");
+ private static final boolean LINUX = os.startsWith("Linux") && !ANDROID;
++ private static final boolean FREEBSD = os.startsWith("FreeBSD");
+ private static final boolean SOLARIS = os.startsWith("SunOS");
+ private static final boolean IOS = os.startsWith("iOS");
+
+@@ -124,6 +125,13 @@ public class PlatformUtil {
+ return LINUX;
+ }
+
++ /**
++ * Returns true if the operating system is a form of FreeBSD.
++ */
++ public static boolean isFreeBSD(){
++ return FREEBSD;
++ }
++
+ public static boolean useEGL() {
+ return useEGL;
+ }
+@@ -150,10 +158,10 @@ public class PlatformUtil {
+ }
+
+ /**
+- * Returns true if the operating system is a form of Linux or Solaris
++ * Returns true if the operating system is a form of Unix
+ */
+ public static boolean isUnix(){
+- return LINUX || SOLARIS;
++ return LINUX || SOLARIS || FREEBSD;
+ }
+
+ /**
diff --git a/java/openjfx14/files/patch-modules_javafx.controls_src_main_java_com_sun_javafx_scene_TextInputControlBehavior.java b/java/openjfx14/files/patch-modules_javafx.controls_src_main_java_com_sun_javafx_scene_TextInputControlBehavior.java
new file mode 100644
index 000000000000..eb8a666253b9
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.controls_src_main_java_com_sun_javafx_scene_TextInputControlBehavior.java
@@ -0,0 +1,36 @@
+--- modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/TextInputControlBehavior.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/TextInputControlBehavior.java
+@@ -54,6 +54,7 @@ import javafx.scene.input.MouseEvent;
+ import java.text.Bidi;
+ import java.util.function.Predicate;
+
++import static com.sun.javafx.PlatformUtil.isFreeBSD;
+ import static com.sun.javafx.PlatformUtil.isLinux;
+ import static com.sun.javafx.PlatformUtil.isMac;
+ import static com.sun.javafx.PlatformUtil.isWindows;
+@@ -122,6 +123,7 @@ public abstract class TextInputControlBehavior<T exten
+ final Predicate<KeyEvent> validWhenEditable = e -> !c.isEditable();
+ final Predicate<KeyEvent> validOnWindows = e -> !PlatformUtil.isWindows();
+ final Predicate<KeyEvent> validOnLinux = e -> !PlatformUtil.isLinux();
++ final Predicate<KeyEvent> validOnFreeBSD = e -> !PlatformUtil.isFreeBSD();
+
+ KeyMapping cancelEditMapping;
+ KeyMapping fireMapping;
+@@ -550,7 +552,7 @@ public abstract class TextInputControlBehavior<T exten
+
+ public void selectNextWord() {
+ TextInputControl textInputControl = getNode();
+- if (isMac() || isLinux()) {
++ if (isMac() || isLinux() || isFreeBSD()) {
+ textInputControl.selectEndOfNextWord();
+ } else {
+ textInputControl.selectNextWord();
+@@ -599,7 +601,7 @@ public abstract class TextInputControlBehavior<T exten
+
+ protected void nextWord() {
+ TextInputControl textInputControl = getNode();
+- if (isMac() || isLinux()) {
++ if (isMac() || isLinux() || isFreeBSD()) {
+ textInputControl.endOfNextWord();
+ } else {
+ textInputControl.nextWord();
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_glass_ui_Platform.java b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_glass_ui_Platform.java
new file mode 100644
index 000000000000..d02e8cc1efe3
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_glass_ui_Platform.java
@@ -0,0 +1,20 @@
+--- modules/javafx.graphics/src/main/java/com/sun/glass/ui/Platform.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/java/com/sun/glass/ui/Platform.java
+@@ -52,6 +52,8 @@ final class Platform {
+ type = WINDOWS;
+ else if (userPlatform.equals("linux"))
+ type = GTK;
++ else if (userPlatform.equals("freebsd"))
++ type = GTK;
+ else if (userPlatform.equals("gtk"))
+ type = GTK;
+ else if (userPlatform.equals("ios"))
+@@ -68,6 +70,8 @@ final class Platform {
+ } else if (osNameLowerCase.startsWith("wind")) {
+ type = WINDOWS;
+ } else if (osNameLowerCase.startsWith("linux")) {
++ type = GTK;
++ } else if (osNameLowerCase.startsWith("freebsd")) {
+ type = GTK;
+ } else if (osNameLowerCase.startsWith("ios")) {
+ type = IOS;
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_glass_utils_NativeLibLoader.java b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_glass_utils_NativeLibLoader.java
new file mode 100644
index 000000000000..b46c83996742
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_glass_utils_NativeLibLoader.java
@@ -0,0 +1,20 @@
+--- modules/javafx.graphics/src/main/java/com/sun/glass/utils/NativeLibLoader.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/java/com/sun/glass/utils/NativeLibLoader.java
+@@ -358,7 +358,7 @@ public class NativeLibLoader {
+ relativeDir = "../bin";
+ } else if (osName.startsWith("Mac")) {
+ relativeDir = ".";
+- } else if (osName.startsWith("Linux")) {
++ } else if (osName.startsWith("Linux") || osName.startsWith("FreeBSD")) {
+ relativeDir = ".";
+ }
+
+@@ -374,7 +374,7 @@ public class NativeLibLoader {
+ } else if (osName.startsWith("Mac")) {
+ libPrefix = "lib";
+ libSuffix = ".dylib";
+- } else if (osName.startsWith("Linux")) {
++ } else if (osName.startsWith("Linux") || osName.startsWith("FreeBSD")) {
+ libPrefix = "lib";
+ libSuffix = ".so";
+ }
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_font_LogicalFont.java b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_font_LogicalFont.java
new file mode 100644
index 000000000000..41782718b485
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_font_LogicalFont.java
@@ -0,0 +1,11 @@
+--- modules/javafx.graphics/src/main/java/com/sun/javafx/font/LogicalFont.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/java/com/sun/javafx/font/LogicalFont.java
+@@ -175,7 +175,7 @@ public class LogicalFont implements CompositeFontResou
+ styleName = STYLE_BOLD_ITALIC;
+ }
+ fullName = familyName + " " + styleName;
+- if (PrismFontFactory.isLinux) {
++ if (PrismFontFactory.isLinux || PrismFontFactory.isFreeBSD) {
+ FontConfigManager.FcCompFont fcCompFont =
+ FontConfigManager.getFontConfigFont(family, bold, italic);
+ physicalFullName = fcCompFont.firstFont.fullName;
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_font_PrismFontFactory.java b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_font_PrismFontFactory.java
new file mode 100644
index 000000000000..5e4fd2ff7a2e
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_font_PrismFontFactory.java
@@ -0,0 +1,45 @@
+--- modules/javafx.graphics/src/main/java/com/sun/javafx/font/PrismFontFactory.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/java/com/sun/javafx/font/PrismFontFactory.java
+@@ -51,6 +51,7 @@ public abstract class PrismFontFactory implements Font
+ public static final boolean debugFonts;
+ public static final boolean isWindows;
+ public static final boolean isLinux;
++ public static final boolean isFreeBSD;
+ public static final boolean isMacOSX;
+ public static final boolean isIOS;
+ public static final boolean isAndroid;
+@@ -88,6 +89,7 @@ public abstract class PrismFontFactory implements Font
+ isWindows = PlatformUtil.isWindows();
+ isMacOSX = PlatformUtil.isMac();
+ isLinux = PlatformUtil.isLinux();
++ isFreeBSD = PlatformUtil.isFreeBSD();
+ isIOS = PlatformUtil.isIOS();
+ isAndroid = PlatformUtil.isAndroid();
+ isEmbedded = PlatformUtil.isEmbedded();
+@@ -164,7 +166,7 @@ public abstract class PrismFontFactory implements Font
+ private static String getNativeFactoryName() {
+ if (isWindows) return DW_FACTORY;
+ if (isMacOSX || isIOS) return CT_FACTORY;
+- if (isLinux || isAndroid) return FT_FACTORY;
++ if (isLinux || isAndroid || isFreeBSD) return FT_FACTORY;
+ return null;
+ }
+
+@@ -851,7 +853,7 @@ public abstract class PrismFontFactory implements Font
+ break;
+ }
+ }
+- if (fontResource == null && isLinux) {
++ if (fontResource == null && (isLinux || isFreeBSD)) {
+ String path = FontConfigManager.getDefaultFontPath();
+ if (path != null) {
+ fontResource = createFontResource(jreDefaultFontLC,
+@@ -1770,7 +1772,7 @@ public abstract class PrismFontFactory implements Font
+ familyToFontListMap,
+ Locale.ENGLISH);
+
+- } else if (isLinux) {
++ } else if (isLinux || isFreeBSD) {
+ FontConfigManager.populateMaps(tmpFontToFileMap,
+ fontToFamilyNameMap,
+ familyToFontListMap,
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_Toolkit.java b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_Toolkit.java
new file mode 100644
index 000000000000..1a3202edc3c9
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_Toolkit.java
@@ -0,0 +1,11 @@
+--- modules/javafx.graphics/src/main/java/com/sun/javafx/tk/Toolkit.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/java/com/sun/javafx/tk/Toolkit.java
+@@ -186,6 +186,8 @@ public abstract class Toolkit {
+ return DEFAULT_TOOLKIT;
+ } else if (PlatformUtil.isLinux()) {
+ return DEFAULT_TOOLKIT;
++ } else if (PlatformUtil.isFreeBSD()) {
++ return DEFAULT_TOOLKIT;
+ } else if (PlatformUtil.isIOS()) {
+ return DEFAULT_TOOLKIT;
+ } else if (PlatformUtil.isAndroid()) {
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_quantum_GlassSystemMenu.java b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_quantum_GlassSystemMenu.java
new file mode 100644
index 000000000000..625c4a46c195
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_quantum_GlassSystemMenu.java
@@ -0,0 +1,35 @@
+--- modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/GlassSystemMenu.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/GlassSystemMenu.java
+@@ -313,13 +313,13 @@ class GlassSystemMenu implements TKSystemMenu {
+ } else if (accelerator instanceof KeyCodeCombination) {
+ KeyCodeCombination kcc = (KeyCodeCombination)accelerator;
+ KeyCode code = kcc.getCode();
+- assert PlatformUtil.isMac() || PlatformUtil.isLinux();
++ assert PlatformUtil.isMac() || PlatformUtil.isLinux() || PlatformUtil.isFreeBSD();
+ int modifier = glassModifiers(kcc);
+ if (PlatformUtil.isMac()) {
+ int finalCode = code.isLetterKey() ? code.getChar().toUpperCase().charAt(0)
+ : code.getCode();
+ glassSubMenuItem.setShortcut(finalCode, modifier);
+- } else if (PlatformUtil.isLinux()) {
++ } else if (PlatformUtil.isLinux() || PlatformUtil.isFreeBSD()) {
+ String lower = code.getChar().toLowerCase();
+ if ((modifier & KeyEvent.MODIFIER_CONTROL) != 0) {
+ glassSubMenuItem.setShortcut(lower.charAt(0), modifier);
+@@ -348,14 +348,14 @@ class GlassSystemMenu implements TKSystemMenu {
+ ret += KeyEvent.MODIFIER_ALT;
+ }
+ if (kcc.getShortcut() == KeyCombination.ModifierValue.DOWN) {
+- if (PlatformUtil.isLinux()) {
++ if (PlatformUtil.isLinux() || PlatformUtil.isFreeBSD()) {
+ ret += KeyEvent.MODIFIER_CONTROL;
+ } else if (PlatformUtil.isMac()) {
+ ret += KeyEvent.MODIFIER_COMMAND;
+ }
+ }
+ if (kcc.getMeta() == KeyCombination.ModifierValue.DOWN) {
+- if (PlatformUtil.isLinux()) {
++ if (PlatformUtil.isLinux() || PlatformUtil.isFreeBSD()) {
+ ret += KeyEvent.MODIFIER_WINDOWS; // RT-19326 - Linux shortcut support
+ } else if (PlatformUtil.isMac()) {
+ ret += KeyEvent.MODIFIER_COMMAND;
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_quantum_WindowStage.java b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_quantum_WindowStage.java
new file mode 100644
index 000000000000..ed8f190bf9cb
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_javafx_tk_quantum_WindowStage.java
@@ -0,0 +1,11 @@
+--- modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/WindowStage.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/WindowStage.java
+@@ -460,7 +460,7 @@ class WindowStage extends GlassStage {
+ } else if (PlatformUtil.isWindows()) { //Windows Sized Icons
+ SMALL_ICON_HEIGHT = 32;
+ SMALL_ICON_WIDTH = 32;
+- } else if (PlatformUtil.isLinux()) { //Linux icons
++ } else if (PlatformUtil.isLinux() || PlatformUtil.isFreeBSD()) { //Linux icons
+ SMALL_ICON_HEIGHT = 128;
+ SMALL_ICON_WIDTH = 128;
+ }
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_prism_impl_PrismSettings.java b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_prism_impl_PrismSettings.java
new file mode 100644
index 000000000000..d484b4b53b79
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_java_com_sun_prism_impl_PrismSettings.java
@@ -0,0 +1,29 @@
+--- modules/javafx.graphics/src/main/java/com/sun/prism/impl/PrismSettings.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/java/com/sun/prism/impl/PrismSettings.java
+@@ -221,6 +221,8 @@ public final class PrismSettings {
+ tryOrderArr = new String[] { "es2" };
+ } else if (PlatformUtil.isLinux()) {
+ tryOrderArr = new String[] { "es2", "sw" };
++ } else if (PlatformUtil.isFreeBSD()) {
++ tryOrderArr = new String[] { "es2", "sw" };
+ } else {
+ tryOrderArr = new String[] { "sw" };
+ }
+@@ -234,7 +236,7 @@ public final class PrismSettings {
+ for (String s : split(rOrder.toLowerCase(), ",")) {
+ switch (s) {
+ case "pisces":
+- rSpec = PlatformUtil.isEmbedded() || !PlatformUtil.isLinux()
++ rSpec = PlatformUtil.isEmbedded() || !PlatformUtil.isLinux() || !PlatformUtil.isFreeBSD()
+ ? RasterizerType.NativePisces
+ : RasterizerType.JavaPisces;
+ break;
+@@ -269,7 +271,7 @@ public final class PrismSettings {
+ boolean doNativePisces;
+ String npprop = systemProperties.getProperty("prism.nativepisces");
+ if (npprop == null) {
+- doNativePisces = PlatformUtil.isEmbedded() || !PlatformUtil.isLinux();
++ doNativePisces = PlatformUtil.isEmbedded() || !PlatformUtil.isLinux() || !PlatformUtil.isFreeBSD();
+ } else {
+ doNativePisces = Boolean.parseBoolean(npprop);
+ }
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_fontpath__linux.c b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_fontpath__linux.c
new file mode 100644
index 000000000000..8b1e0b4371c1
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_fontpath__linux.c
@@ -0,0 +1,11 @@
+--- modules/javafx.graphics/src/main/native-font/fontpath_linux.c.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/native-font/fontpath_linux.c
+@@ -23,7 +23,7 @@
+ * questions.
+ */
+
+-#if defined (__linux__) && ! defined (ANDROID_NDK)
++#if (defined (__linux__) && ! defined (ANDROID_NDK)) || defined(__FreeBSD__)
+
+ #include <string.h>
+ #include <stdio.h>
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_freetype.c b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_freetype.c
new file mode 100644
index 000000000000..fcde2287a620
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_freetype.c
@@ -0,0 +1,15 @@
+--- modules/javafx.graphics/src/main/native-font/freetype.c.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/native-font/freetype.c
+@@ -23,7 +23,6 @@
+ * questions.
+ */
+
+-#if defined __linux__ || ANDROID_NDK
+ #if defined _ENABLE_PANGO || _ENABLE_HARFBUZZ
+
+ #include <jni.h>
+@@ -650,4 +649,3 @@ JNIEXPORT jboolean JNICALL JNICALL OS_NATIVE(isHarfbuz
+ }
+
+ #endif /* ENABLE_PANGO || ENABLE_HARFBUZZ */
+-#endif /* __linux__ || ANDROID_NDK */
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_pango.c b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_pango.c
new file mode 100644
index 000000000000..47ceff21407b
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-font_pango.c
@@ -0,0 +1,15 @@
+--- modules/javafx.graphics/src/main/native-font/pango.c.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/native-font/pango.c
+@@ -23,7 +23,6 @@
+ * questions.
+ */
+
+-#if defined __linux__
+ #if defined _ENABLE_PANGO
+
+ #include <jni.h>
+@@ -432,4 +431,3 @@ JNIEXPORT void JNICALL OS_NATIVE(pango_1font_1descript
+ }
+
+ #endif /* ENABLE_PANGO */
+-#endif /* __linux__ */
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_GlassApplication.cpp b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_GlassApplication.cpp
new file mode 100644
index 000000000000..d974ff805f28
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_GlassApplication.cpp
@@ -0,0 +1,10 @@
+--- modules/javafx.graphics/src/main/native-glass/gtk/GlassApplication.cpp.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/native-glass/gtk/GlassApplication.cpp
+@@ -111,6 +111,7 @@ JNIEXPORT jint JNICALL Java_com_sun_glass_ui_gtk_GtkAp
+
+ gdk_threads_enter();
+ gtk_init(NULL, NULL);
++ gdk_threads_leave();
+
+ return JNI_TRUE;
+ }
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_glass__evloop.cpp b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_glass__evloop.cpp
new file mode 100644
index 000000000000..8fedd67658e6
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_glass__evloop.cpp
@@ -0,0 +1,11 @@
+--- modules/javafx.graphics/src/main/native-glass/gtk/glass_evloop.cpp.orig 2020-07-24 17:23:31 UTC
++++ modules/javafx.graphics/src/main/native-glass/gtk/glass_evloop.cpp
+@@ -25,7 +25,7 @@
+ #include "glass_evloop.h"
+
+ #include <glib.h>
+-#include <malloc.h>
++#include <stdlib.h>
+
+ static GSList * evloopHookList;
+
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_glass__window.h b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_glass__window.h
new file mode 100644
index 000000000000..682202924941
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_glass__window.h
@@ -0,0 +1,16 @@
+--- modules/javafx.graphics/src/main/native-glass/gtk/glass_window.h.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/native-glass/gtk/glass_window.h
+@@ -366,7 +366,7 @@ class WindowContextTop: public WindowContextBase {
+ jlong screen;
+ WindowFrameType frame_type;
+ WindowType window_type;
+- struct WindowContext *owner;
++ WindowContext *owner;
+ WindowGeometry geometry;
+ struct _Resizable{// we can't use set/get gtk_window_resizable function
+ _Resizable(): request(REQUEST_NONE), value(true), prev(false),
+@@ -472,4 +472,3 @@ class EventsCounterHelper { (public)
+ };
+
+ #endif /* GLASS_WINDOW_H */
+-
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_launcher.c b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_launcher.c
new file mode 100644
index 000000000000..ed7465bccd13
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_launcher.c
@@ -0,0 +1,10 @@
+--- modules/javafx.graphics/src/main/native-glass/gtk/launcher.c.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/native-glass/gtk/launcher.c
+@@ -25,7 +25,6 @@
+
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <linux/fb.h>
+ #include <fcntl.h>
+ #ifndef __USE_GNU // required for dladdr() & Dl_info
+ #define __USE_GNU
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_wrapped.c b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_wrapped.c
new file mode 100644
index 000000000000..85799215dd06
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-glass_gtk_wrapped.c
@@ -0,0 +1,10 @@
+--- modules/javafx.graphics/src/main/native-glass/gtk/wrapped.c.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/native-glass/gtk/wrapped.c
+@@ -24,7 +24,6 @@
+ */
+
+ #include <stdio.h>
+-#include <linux/fb.h>
+ #include <fcntl.h>
+ #ifndef __USE_GNU // required for dladdr() & Dl_info
+ #define __USE_GNU
diff --git a/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-prism-es2_PrismES2Defs.h b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-prism-es2_PrismES2Defs.h
new file mode 100644
index 000000000000..9866c0b28b13
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.graphics_src_main_native-prism-es2_PrismES2Defs.h
@@ -0,0 +1,11 @@
+--- modules/javafx.graphics/src/main/native-prism-es2/PrismES2Defs.h.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.graphics/src/main/native-prism-es2/PrismES2Defs.h
+@@ -26,7 +26,7 @@
+ #ifndef _Prism_es2_defs_h_
+ #define _Prism_es2_defs_h_
+
+-#if defined(SOLARIS) || defined(LINUX) || defined(ANDROID_NDK) /* SOLARIS || LINUX */
++#if defined(SOLARIS) || defined(LINUX) || defined(ANDROID_NDK) || defined(FREEBSD) /* SOLARIS || LINUX */
+ #define GLX_GLEXT_PROTOTYPES
+ #define GLX_GLXEXT_PROTOTYPES
+ #define UNIX
diff --git a/java/openjfx14/files/patch-modules_javafx.media_src_main_java_com_sun_media_jfxmediaimpl_HostUtils.java b/java/openjfx14/files/patch-modules_javafx.media_src_main_java_com_sun_media_jfxmediaimpl_HostUtils.java
new file mode 100644
index 000000000000..36af4dbf1d53
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.media_src_main_java_com_sun_media_jfxmediaimpl_HostUtils.java
@@ -0,0 +1,13 @@
+--- modules/javafx.media/src/main/java/com/sun/media/jfxmediaimpl/HostUtils.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.media/src/main/java/com/sun/media/jfxmediaimpl/HostUtils.java
+@@ -66,6 +66,10 @@ public class HostUtils {
+ return osName.startsWith("linux");
+ }
+
++ public static boolean isFreeBSD() {
++ return osName.startsWith("freebsd");
++ }
++
+ public static boolean isIOS() {
+ return osName.startsWith("ios");
+ }
diff --git a/java/openjfx14/files/patch-modules_javafx.media_src_main_java_com_sun_media_jfxmediaimpl_NativeMediaManager.java b/java/openjfx14/files/patch-modules_javafx.media_src_main_java_com_sun_media_jfxmediaimpl_NativeMediaManager.java
new file mode 100644
index 000000000000..c4b2807ffab3
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.media_src_main_java_com_sun_media_jfxmediaimpl_NativeMediaManager.java
@@ -0,0 +1,11 @@
+--- modules/javafx.media/src/main/java/com/sun/media/jfxmediaimpl/NativeMediaManager.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.media/src/main/java/com/sun/media/jfxmediaimpl/NativeMediaManager.java
+@@ -110,7 +110,7 @@ public class NativeMediaManager {
+ NativeLibLoader.loadLibrary("glib-lite");
+ }
+
+- if (!HostUtils.isLinux() && !HostUtils.isIOS()) {
++ if (!HostUtils.isFreeBSD() && !HostUtils.isLinux() && !HostUtils.isIOS()) {
+ NativeLibLoader.loadLibrary("gstreamer-lite");
+ } else {
+ dependencies.add("gstreamer-lite");
diff --git a/java/openjfx14/files/patch-modules_javafx.media_src_main_native_gstreamer_gstreamer-lite_gstreamer_gst_gst__private.h b/java/openjfx14/files/patch-modules_javafx.media_src_main_native_gstreamer_gstreamer-lite_gstreamer_gst_gst__private.h
new file mode 100644
index 000000000000..3fad4c6d11e8
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.media_src_main_native_gstreamer_gstreamer-lite_gstreamer_gst_gst__private.h
@@ -0,0 +1,86 @@
+--- modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gst_private.h.orig 2020-07-17 12:21:33 UTC
++++ modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/gstreamer/gst/gst_private.h
+@@ -237,12 +237,12 @@ GstCapsFeatures * __gst_caps_get_features_unchecked (c
+ #ifndef GST_DISABLE_REGISTRY
+ /* Secret variable to initialise gst without registry cache */
+
+-GST_API gboolean _gst_disable_registry_cache;
++extern GST_API gboolean _gst_disable_registry_cache;
+ #endif
+
+ /* Secret variable to let the plugin scanner use the same base path
+ * as the main application in order to determine dependencies */
+-GST_API gchar *_gst_executable_path;
++extern GST_API gchar *_gst_executable_path;
+
+ /* provide inline gst_g_value_get_foo_unchecked(), used in gststructure.c */
+ #define DEFINE_INLINE_G_VALUE_GET_UNCHECKED(ret_type,name_type,v_field) \
+@@ -266,37 +266,37 @@ DEFINE_INLINE_G_VALUE_GET_UNCHECKED(const gchar *,stri
+
+ #ifndef GST_REMOVE_GST_DEBUG
+
+-GST_API GstDebugCategory *GST_CAT_GST_INIT;
+-GST_API GstDebugCategory *GST_CAT_MEMORY;
+-GST_API GstDebugCategory *GST_CAT_PARENTAGE;
+-GST_API GstDebugCategory *GST_CAT_STATES;
+-GST_API GstDebugCategory *GST_CAT_SCHEDULING;
+-GST_API GstDebugCategory *GST_CAT_BUFFER;
+-GST_API GstDebugCategory *GST_CAT_BUFFER_LIST;
+-GST_API GstDebugCategory *GST_CAT_BUS;
+-GST_API GstDebugCategory *GST_CAT_CAPS;
+-GST_API GstDebugCategory *GST_CAT_CLOCK;
+-GST_API GstDebugCategory *GST_CAT_ELEMENT_PADS;
+-GST_API GstDebugCategory *GST_CAT_PADS;
+-GST_API GstDebugCategory *GST_CAT_PERFORMANCE;
+-GST_API GstDebugCategory *GST_CAT_PIPELINE;
+-GST_API GstDebugCategory *GST_CAT_PLUGIN_LOADING;
+-GST_API GstDebugCategory *GST_CAT_PLUGIN_INFO;
+-GST_API GstDebugCategory *GST_CAT_PROPERTIES;
+-GST_API GstDebugCategory *GST_CAT_NEGOTIATION;
+-GST_API GstDebugCategory *GST_CAT_REFCOUNTING;
+-GST_API GstDebugCategory *GST_CAT_ERROR_SYSTEM;
+-GST_API GstDebugCategory *GST_CAT_EVENT;
+-GST_API GstDebugCategory *GST_CAT_MESSAGE;
+-GST_API GstDebugCategory *GST_CAT_PARAMS;
+-GST_API GstDebugCategory *GST_CAT_CALL_TRACE;
+-GST_API GstDebugCategory *GST_CAT_SIGNAL;
+-GST_API GstDebugCategory *GST_CAT_PROBE;
+-GST_API GstDebugCategory *GST_CAT_REGISTRY;
+-GST_API GstDebugCategory *GST_CAT_QOS;
+-GST_API GstDebugCategory *GST_CAT_META;
+-GST_API GstDebugCategory *GST_CAT_LOCKING;
+-GST_API GstDebugCategory *GST_CAT_CONTEXT;
++extern GST_API GstDebugCategory *GST_CAT_GST_INIT;
++extern GST_API GstDebugCategory *GST_CAT_MEMORY;
++extern GST_API GstDebugCategory *GST_CAT_PARENTAGE;
++extern GST_API GstDebugCategory *GST_CAT_STATES;
++extern GST_API GstDebugCategory *GST_CAT_SCHEDULING;
++extern GST_API GstDebugCategory *GST_CAT_BUFFER;
++extern GST_API GstDebugCategory *GST_CAT_BUFFER_LIST;
++extern GST_API GstDebugCategory *GST_CAT_BUS;
++extern GST_API GstDebugCategory *GST_CAT_CAPS;
++extern GST_API GstDebugCategory *GST_CAT_CLOCK;
++extern GST_API GstDebugCategory *GST_CAT_ELEMENT_PADS;
++extern GST_API GstDebugCategory *GST_CAT_PADS;
++extern GST_API GstDebugCategory *GST_CAT_PERFORMANCE;
++extern GST_API GstDebugCategory *GST_CAT_PIPELINE;
++extern GST_API GstDebugCategory *GST_CAT_PLUGIN_LOADING;
++extern GST_API GstDebugCategory *GST_CAT_PLUGIN_INFO;
++extern GST_API GstDebugCategory *GST_CAT_PROPERTIES;
++extern GST_API GstDebugCategory *GST_CAT_NEGOTIATION;
++extern GST_API GstDebugCategory *GST_CAT_REFCOUNTING;
++extern GST_API GstDebugCategory *GST_CAT_ERROR_SYSTEM;
++extern GST_API GstDebugCategory *GST_CAT_EVENT;
++extern GST_API GstDebugCategory *GST_CAT_MESSAGE;
++extern GST_API GstDebugCategory *GST_CAT_PARAMS;
++extern GST_API GstDebugCategory *GST_CAT_CALL_TRACE;
++extern GST_API GstDebugCategory *GST_CAT_SIGNAL;
++extern GST_API GstDebugCategory *GST_CAT_PROBE;
++extern GST_API GstDebugCategory *GST_CAT_REGISTRY;
++extern GST_API GstDebugCategory *GST_CAT_QOS;
++extern GST_API GstDebugCategory *GST_CAT_META;
++extern GST_API GstDebugCategory *GST_CAT_LOCKING;
++extern GST_API GstDebugCategory *GST_CAT_CONTEXT;
+
+ /* Categories that should be completely private to
+ * libgstreamer should be done like this: */
diff --git a/java/openjfx14/files/patch-modules_javafx.media_src_main_native_gstreamer_projects_build_linux_common_config.h b/java/openjfx14/files/patch-modules_javafx.media_src_main_native_gstreamer_projects_build_linux_common_config.h
new file mode 100644
index 000000000000..548485a3d55a
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.media_src_main_native_gstreamer_projects_build_linux_common_config.h
@@ -0,0 +1,11 @@
+--- modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/projects/build/linux/common/config.h.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.media/src/main/native/gstreamer/gstreamer-lite/projects/build/linux/common/config.h
+@@ -376,7 +376,7 @@
+ #define HAVE_SYS_POLL_H 1
+
+ /* Define to 1 if you have the <sys/prctl.h> header file. */
+-#define HAVE_SYS_PRCTL_H 1
++#undef HAVE_SYS_PRCTL_H
+
+ /* Define to 1 if you have the <sys/resource.h> header file. */
+ #undef HAVE_SYS_RESOURCE_H
diff --git a/java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_platform_gstreamer_GstAudioSpectrum.cpp b/java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_platform_gstreamer_GstAudioSpectrum.cpp
new file mode 100644
index 000000000000..81502f08ade5
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_platform_gstreamer_GstAudioSpectrum.cpp
@@ -0,0 +1,11 @@
+--- modules/javafx.media/src/main/native/jfxmedia/platform/gstreamer/GstAudioSpectrum.cpp 2020-07-17 20:51:26 UTC
++++ modules/javafx.media/src/main/native/jfxmedia/platform/gstreamer/GstAudioSpectrum.cpp
+@@ -95,7 +95,7 @@ void CGstAudioSpectrum::SetBands(int bands, CBandsHold
+ g_object_set(m_pSpectrum, "bands", bands, NULL);
+
+ CBandsHolder *old_holder = (CBandsHolder*)g_atomic_pointer_get(&m_pHolder);
+- g_atomic_pointer_compare_and_exchange((gpointer*)&m_pHolder, old_holder, holder);
++ g_atomic_pointer_compare_and_exchange((CBandsHolder**)&m_pHolder, old_holder, holder);
+ CBandsHolder::ReleaseRef(old_holder);
+ }
+
diff --git a/java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_platform_gstreamer_GstPipelineFactory.cpp b/java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_platform_gstreamer_GstPipelineFactory.cpp
new file mode 100644
index 000000000000..a533aeaa2765
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_platform_gstreamer_GstPipelineFactory.cpp
@@ -0,0 +1,11 @@
+--- modules/javafx.media/src/main/native/jfxmedia/platform/gstreamer/GstPipelineFactory.cpp.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.media/src/main/native/jfxmedia/platform/gstreamer/GstPipelineFactory.cpp
+@@ -338,6 +338,8 @@ GstElement* CGstPipelineFactory::CreateAudioSinkElemen
+ return CreateElement("directsoundsink");
+ #elif TARGET_OS_MAC
+ return CreateElement("osxaudiosink");
++#elif TARGET_OS_BSD
++ return CreateElement("bsdaudiosink");
+ #elif TARGET_OS_LINUX
+ return CreateElement("alsasink");
+ #else
diff --git a/java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_projects_bsd_Makefile b/java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_projects_bsd_Makefile
new file mode 100644
index 000000000000..bcb55296939c
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.media_src_main_native_jfxmedia_projects_bsd_Makefile
@@ -0,0 +1,42 @@
+--- modules/javafx.media/src/main/native/jfxmedia/projects/bsd/Makefile.orig 2020-07-19 18:30:00 UTC
++++ modules/javafx.media/src/main/native/jfxmedia/projects/bsd/Makefile
+@@ -1,5 +1,5 @@
+ #
+-# Linux/ARM jfxmedia makefile
++# BSD jfxmedia makefile
+ #
+
+ BUILD_DIR = $(OUTPUT_DIR)/$(BUILD_TYPE)
+@@ -18,6 +18,7 @@ DIRLIST = jni \
+ TARGET = $(BUILD_DIR)/lib$(BASE_NAME).so
+
+ CFLAGS = -DTARGET_OS_LINUX=1 \
++ -DTARGET_OS_BSD=1 \
+ -D_GNU_SOURCE \
+ -DGST_REMOVE_DEPRECATED \
+ -DGST_DISABLE_GST_DEBUG \
+@@ -26,6 +27,7 @@ CFLAGS = -DTARGET_OS_LINUX=1 \
+ -DHAVE_CONFIG_H \
+ -DJFXMEDIA_JNI_EXPORTS \
+ -DLINUX \
++ -DG_DISABLE_DEPRECATED \
+ -ffunction-sections -fdata-sections
+
+ CPPFLAGS = -fno-rtti -ffunction-sections -fdata-sections
+@@ -42,7 +44,6 @@ ifdef HOST_COMPILE
+ -Wformat-security \
+ -fstack-protector \
+ -Werror=implicit-function-declaration \
+- -Werror=trampolines \
+ -msse2 \
+ -DGSTREAMER_LITE
+
+@@ -51,7 +52,7 @@ ifdef HOST_COMPILE
+
+ INCLUDES = $(BASE_INCLUDES) \
+ -I$(JAVA_HOME)/include \
+- -I$(JAVA_HOME)/include/linux \
++ -I$(JAVA_HOME)/include/freebsd \
+ -I$(GSTREAMER_LITE_DIR)/gstreamer \
+ -I$(GSTREAMER_LITE_DIR)/gst-plugins-base/gst-libs \
+ -I$(GSTREAMER_LITE_DIR)/gstreamer/libs \
diff --git a/java/openjfx14/files/patch-modules_javafx.swing_src_main_java_javafx_embed_swing_JFXPanel.java b/java/openjfx14/files/patch-modules_javafx.swing_src_main_java_javafx_embed_swing_JFXPanel.java
new file mode 100644
index 000000000000..85963a3b70b4
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.swing_src_main_java_javafx_embed_swing_JFXPanel.java
@@ -0,0 +1,20 @@
+--- modules/javafx.swing/src/main/java/javafx/embed/swing/JFXPanel.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.swing/src/main/java/javafx/embed/swing/JFXPanel.java
+@@ -1043,7 +1043,7 @@ public class JFXPanel extends JComponent {
+ public boolean grabFocus() {
+ // On X11 grab is limited to a single XDisplay connection,
+ // so we can't delegate it to another GUI toolkit.
+- if (PlatformUtil.isLinux()) return true;
++ if (PlatformUtil.isLinux() || PlatformUtil.isFreeBSD()) return true;
+
+ invokeOnClientEDT(() -> {
+ Window window = SwingUtilities.getWindowAncestor(JFXPanel.this);
+@@ -1059,7 +1059,7 @@ public class JFXPanel extends JComponent {
+ public void ungrabFocus() {
+ // On X11 grab is limited to a single XDisplay connection,
+ // so we can't delegate it to another GUI toolkit.
+- if (PlatformUtil.isLinux()) return;
++ if (PlatformUtil.isLinux() || PlatformUtil.isFreeBSD()) return;
+
+ invokeOnClientEDT(() -> {
+ Window window = SwingUtilities.getWindowAncestor(JFXPanel.this);
diff --git a/java/openjfx14/files/patch-modules_javafx.swing_src_main_java_javafx_embed_swing_SwingNode.java b/java/openjfx14/files/patch-modules_javafx.swing_src_main_java_javafx_embed_swing_SwingNode.java
new file mode 100644
index 000000000000..e71a69a0226f
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.swing_src_main_java_javafx_embed_swing_SwingNode.java
@@ -0,0 +1,11 @@
+--- modules/javafx.swing/src/main/java/javafx/embed/swing/SwingNode.java.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.swing/src/main/java/javafx/embed/swing/SwingNode.java
+@@ -807,7 +807,7 @@ public class SwingNode extends Node {
+ private void ungrabFocus(boolean postUngrabEvent) {
+ // On X11 grab is limited to a single XDisplay connection,
+ // so we can't delegate it to another GUI toolkit.
+- if (PlatformUtil.isLinux()) return;
++ if (PlatformUtil.isLinux() || PlatformUtil.isFreeBSD()) return;
+
+ if (grabbed &&
+ getScene() != null &&
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_JavaScriptCore_assembler_ARM64Assembler.h b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_JavaScriptCore_assembler_ARM64Assembler.h
new file mode 100644
index 000000000000..78a683c96b87
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_JavaScriptCore_assembler_ARM64Assembler.h
@@ -0,0 +1,11 @@
+--- modules/javafx.web/src/main/native/Source/JavaScriptCore/assembler/ARM64Assembler.h.orig 2020-09-02 20:39:53 UTC
++++ modules/javafx.web/src/main/native/Source/JavaScriptCore/assembler/ARM64Assembler.h
+@@ -2825,6 +2825,8 @@ class ARM64Assembler { (public)
+ linuxPageFlush(current, current + page);
+
+ linuxPageFlush(current, end);
++#elif OS(FREEBSD)
++ __clear_cache(code, reinterpret_cast<char*>(code) + size);
+ #else
+ #error "The cacheFlush support is missing on this platform."
+ #endif
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_JavaScriptCore_offlineasm_arm64.rb b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_JavaScriptCore_offlineasm_arm64.rb
new file mode 100644
index 000000000000..126e0c5a03e4
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_JavaScriptCore_offlineasm_arm64.rb
@@ -0,0 +1,11 @@
+--- modules/javafx.web/src/main/native/Source/JavaScriptCore/offlineasm/arm64.rb.orig 2020-09-02 20:42:24 UTC
++++ modules/javafx.web/src/main/native/Source/JavaScriptCore/offlineasm/arm64.rb
+@@ -1041,7 +1041,7 @@ class Instruction
+ $asm.puts "ldr #{operands[1].arm64Operand(:quad)}, [#{operands[1].arm64Operand(:quad)}, #{operands[0].asmLabel}@GOTPAGEOFF]"
+
+ # On Linux, use ELF GOT relocation specifiers.
+- $asm.putStr("#elif OS(LINUX)")
++ $asm.putStr("#elif OS(LINUX) || OS(FREEBSD)")
+ $asm.puts "adrp #{operands[1].arm64Operand(:quad)}, :got:#{operands[0].asmLabel}"
+ $asm.puts "ldr #{operands[1].arm64Operand(:quad)}, [#{operands[1].arm64Operand(:quad)}, :got_lo12:#{operands[0].asmLabel}]"
+
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_PlatformJava.cmake b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_PlatformJava.cmake
new file mode 100644
index 000000000000..440a890aad27
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_PlatformJava.cmake
@@ -0,0 +1,8 @@
+--- modules/javafx.web/src/main/native/Source/PlatformJava.cmake.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/PlatformJava.cmake
+@@ -1,4 +1 @@
+-add_subdirectory(ThirdParty/sqlite)
+-add_subdirectory(ThirdParty/icu)
+-add_subdirectory(ThirdParty/libxml)
+-add_subdirectory(ThirdParty/libxslt)
++
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_MemoryPressureHandler.cpp b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_MemoryPressureHandler.cpp
new file mode 100644
index 000000000000..570931a2072e
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_MemoryPressureHandler.cpp
@@ -0,0 +1,11 @@
+--- modules/javafx.web/src/main/native/Source/WTF/wtf/MemoryPressureHandler.cpp.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/WTF/wtf/MemoryPressureHandler.cpp
+@@ -49,7 +49,7 @@ MemoryPressureHandler& MemoryPressureHandler::singleto
+ }
+
+ MemoryPressureHandler::MemoryPressureHandler()
+-#if OS(LINUX)
++#if OS(LINUX) || OS(FREEBSD)
+ : m_holdOffTimer(RunLoop::main(), this, &MemoryPressureHandler::holdOffTimerFired)
+ #elif OS(WINDOWS)
+ : m_windowsMeasurementTimer(RunLoop::main(), this, &MemoryPressureHandler::windowsMeasurementTimerFired)
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_MemoryPressureHandler.h b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_MemoryPressureHandler.h
new file mode 100644
index 000000000000..e6619a7d0c24
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_MemoryPressureHandler.h
@@ -0,0 +1,20 @@
+--- modules/javafx.web/src/main/native/Source/WTF/wtf/MemoryPressureHandler.h.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/WTF/wtf/MemoryPressureHandler.h
+@@ -66,7 +66,7 @@ class MemoryPressureHandler { (public)
+
+ WTF_EXPORT_PRIVATE void setShouldUsePeriodicMemoryMonitor(bool);
+
+-#if OS(LINUX)
++#if OS(LINUX) || OS(FREEBSD)
+ WTF_EXPORT_PRIVATE void triggerMemoryPressureEvent(bool isCritical);
+ #endif
+
+@@ -200,7 +200,7 @@ class MemoryPressureHandler { (public)
+ Win32Handle m_lowMemoryHandle;
+ #endif
+
+-#if OS(LINUX)
++#if OS(LINUX) || OS(FREEBSD)
+ RunLoop::Timer<MemoryPressureHandler> m_holdOffTimer;
+ void holdOffTimerFired();
+ #endif
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_Platform.h b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_Platform.h
new file mode 100644
index 000000000000..898a1b7255aa
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_Platform.h
@@ -0,0 +1,15 @@
+--- modules/javafx.web/src/main/native/Source/WTF/wtf/Platform.h.orig 2020-07-17 12:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/WTF/wtf/Platform.h
+@@ -352,6 +352,12 @@
+ #endif
+ #endif
+
++#if !CPU(ARM_THUMB2) && !CPU(ARM_TRADITIONAL) && !CPU(X86) && !CPU(X86_64) && !CPU(SH4) && !CPU(ARM64)
++#define ENABLE_ASSEMBLER 0
++#define ENABLE_JIT 0
++#define ENABLE_YARR_JIT 0
++#endif
++
+ /* ==== OS() - underlying operating system; only to be used for mandated low-level services like
+ virtual memory, not to choose a GUI toolkit ==== */
+
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_PlatformJava.cmake b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_PlatformJava.cmake
new file mode 100644
index 000000000000..454e11ca5c95
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_PlatformJava.cmake
@@ -0,0 +1,14 @@
+--- modules/javafx.web/src/main/native/Source/WTF/wtf/PlatformJava.cmake.orig 2020-07-24 19:01:56 UTC
++++ modules/javafx.web/src/main/native/Source/WTF/wtf/PlatformJava.cmake
+@@ -83,9 +83,8 @@ elseif (UNIX)
+ list(APPEND WTF_SOURCES
+ generic/RunLoopGeneric.cpp
+ generic/WorkQueueGeneric.cpp
+- linux/CurrentProcessMemoryStatus.cpp
+- linux/MemoryFootprintLinux.cpp
+- linux/MemoryPressureHandlerLinux.cpp
++ generic/MemoryFootprintGeneric.cpp
++ unix/MemoryPressureHandlerUnix.cpp
+ unix/CPUTimeUnix.cpp
+ unix/LanguageUnix.cpp
+ )
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_RAMSize.cpp b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_RAMSize.cpp
new file mode 100644
index 000000000000..b447f5e92511
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_RAMSize.cpp
@@ -0,0 +1,28 @@
+--- modules/javafx.web/src/main/native/Source/WTF/wtf/RAMSize.cpp.orig 2020-07-17 12:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/WTF/wtf/RAMSize.cpp
+@@ -35,6 +35,10 @@
+ #if OS(LINUX)
+ #include <sys/sysinfo.h>
+ #endif // OS(LINUX)
++#if OS(FREEBSD)
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#endif
+ #else
+ #include <bmalloc/bmalloc.h>
+ #endif
+@@ -59,6 +63,14 @@ static size_t computeRAMSize()
+ struct sysinfo si;
+ sysinfo(&si);
+ return si.totalram * si.mem_unit;
++#elif OS(FREEBSD)
++ size_t physmem, len;
++ int mib[2] = { CTL_HW, HW_PHYSMEM };
++ if (sysctl(mib, 2, &physmem, &len, NULL, 0) == 0
++ && len == sizeof(physmem))
++ return physmem;
++ else
++ return 512 * MB; // guess
+ #else
+ #error "Missing a platform specific way of determining the available RAM"
+ #endif // OS(LINUX)
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_generic_MemoryFootprintGeneric.cpp b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_generic_MemoryFootprintGeneric.cpp
new file mode 100644
index 000000000000..5bc487363c79
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_generic_MemoryFootprintGeneric.cpp
@@ -0,0 +1,22 @@
+--- modules/javafx.web/src/main/native/Source/WTF/wtf/generic/MemoryFootprintGeneric.cpp.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/WTF/wtf/generic/MemoryFootprintGeneric.cpp
+@@ -25,8 +25,9 @@
+
+ #include "config.h"
+ #include <wtf/MemoryFootprint.h>
++#include <wtf/Platform.h>
+
+-#if !(defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC) && OS(LINUX)
++#if !USE(SYSTEM_MALLOC) && (OS(LINUX) || OS(FREEBSD))
+ #include <bmalloc/bmalloc.h>
+ #endif
+
+@@ -34,7 +35,7 @@ namespace WTF {
+
+ size_t memoryFootprint()
+ {
+-#if !(defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC) && OS(LINUX)
++#if !USE(SYSTEM_MALLOC) && (OS(LINUX) || OS(FREEBSD))
+ return bmalloc::api::memoryFootprint();
+ #else
+ return 0;
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_linux_MemoryPressureHandlerLinux.cpp b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_linux_MemoryPressureHandlerLinux.cpp
new file mode 100644
index 000000000000..2dec38fc4335
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_linux_MemoryPressureHandlerLinux.cpp
@@ -0,0 +1,54 @@
+--- modules/javafx.web/src/main/native/Source/WTF/wtf/linux/MemoryPressureHandlerLinux.cpp.orig 2020-07-17 12:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/WTF/wtf/linux/MemoryPressureHandlerLinux.cpp
+@@ -28,13 +28,20 @@
+ #include "config.h"
+ #include <wtf/MemoryPressureHandler.h>
+
+-#include <malloc.h>
++#include <stdlib.h>
+ #include <unistd.h>
+ #include <wtf/MainThread.h>
+ #include <wtf/MemoryFootprint.h>
+-#include <wtf/linux/CurrentProcessMemoryStatus.h>
+ #include <wtf/text/WTFString.h>
+
++#if OS(LINUX)
++#include <wtf/linux/CurrentProcessMemoryStatus.h>
++#elif OS(FREEBSD)
++#include <sys/sysctl.h>
++#include <sys/types.h>
++#include <sys/user.h>
++#endif
++
+ #define LOG_CHANNEL_PREFIX Log
+
+ namespace WTF {
+@@ -105,9 +112,28 @@ void MemoryPressureHandler::holdOff(Seconds seconds)
+
+ static size_t processMemoryUsage()
+ {
++#if OS(LINUX)
+ ProcessMemoryStatus memoryStatus;
+ currentProcessMemoryStatus(memoryStatus);
+ return (memoryStatus.resident - memoryStatus.shared);
++#elif OS(FREEBSD)
++ static size_t pageSize = sysconf(_SC_PAGE_SIZE);
++ struct kinfo_proc info;
++ size_t infolen = sizeof(info);
++
++ int mib[4];
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_PROC;
++ mib[2] = KERN_PROC_PID;
++ mib[3] = getpid();
++
++ if (sysctl(mib, 4, &info, &infolen, nullptr, 0))
++ return 0;
++
++ return static_cast<size_t>(info.ki_rssize - info.ki_tsize) * pageSize;
++#else
++#error "Missing a platform specific way of determining the memory usage"
++#endif
+ }
+
+ void MemoryPressureHandler::respondToMemoryPressure(Critical critical, Synchronous synchronous)
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_unicode_java_UnicodeJava.h b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_unicode_java_UnicodeJava.h
new file mode 100644
index 000000000000..02f52cfccabc
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_unicode_java_UnicodeJava.h
@@ -0,0 +1,24 @@
+--- modules/javafx.web/src/main/native/Source/WTF/wtf/unicode/java/UnicodeJava.h.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/WTF/wtf/unicode/java/UnicodeJava.h
+@@ -37,21 +37,6 @@
+
+ #define CharProp(p) com_sun_webkit_dom_CharacterDataImpl_##p
+
+-#if PLATFORM(JAVA) && OS(WINDOWS)
+-typedef wchar_t UChar;
+-#else
+-typedef uint16_t UChar;
+-#endif
+-
+-// #ifdef UChar32
+-// #undef UChar32
+-// #endif
+-
+-#ifndef __UMACHINE_H__ //XXX: recheck
+-typedef uint32_t UChar32;
+-#endif
+-
+-#define U_MASK(x) ((uint32_t)1<<(x))
+ #define USE_FAST_PATH(c, fast, slow) ((c) <= 0x7F ? fast((char)c) : slow(c))
+
+ #define CHECK_PROPERTY(c, mask, isSet) \
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_unix_MemoryPressureHandlerUnix.cpp b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_unix_MemoryPressureHandlerUnix.cpp
new file mode 100644
index 000000000000..ebf38740a945
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WTF_wtf_unix_MemoryPressureHandlerUnix.cpp
@@ -0,0 +1,168 @@
+--- modules/javafx.web/src/main/native/Source/WTF/wtf/unix/MemoryPressureHandlerUnix.cpp.orig 2020-07-19 18:56:35 UTC
++++ modules/javafx.web/src/main/native/Source/WTF/wtf/unix/MemoryPressureHandlerUnix.cpp
+@@ -0,0 +1,165 @@
++/*
++ * Copyright (C) 2011, 2012 Apple Inc. All Rights Reserved.
++ * Copyright (C) 2014 Raspberry Pi Foundation. All Rights Reserved.
++ * Copyright (C) 2018 Igalia S.L.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
++ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include "config.h"
++#include <wtf/MemoryPressureHandler.h>
++
++#include <stdlib.h>
++#include <unistd.h>
++#include <wtf/MainThread.h>
++#include <wtf/MemoryFootprint.h>
++#include <wtf/text/WTFString.h>
++
++#if OS(LINUX)
++#include <wtf/linux/CurrentProcessMemoryStatus.h>
++#elif OS(FREEBSD)
++#include <sys/sysctl.h>
++#include <sys/types.h>
++#include <sys/user.h>
++#endif
++
++#define LOG_CHANNEL_PREFIX Log
++
++namespace WTF {
++
++// Disable memory event reception for a minimum of s_minimumHoldOffTime
++// seconds after receiving an event. Don't let events fire any sooner than
++// s_holdOffMultiplier times the last cleanup processing time. Effectively
++// this is 1 / s_holdOffMultiplier percent of the time.
++// If after releasing the memory we don't free at least s_minimumBytesFreedToUseMinimumHoldOffTime,
++// we wait longer to try again (s_maximumHoldOffTime).
++// These value seems reasonable and testing verifies that it throttles frequent
++// low memory events, greatly reducing CPU usage.
++static const Seconds s_minimumHoldOffTime { 5_s };
++static const Seconds s_maximumHoldOffTime { 30_s };
++static const size_t s_minimumBytesFreedToUseMinimumHoldOffTime = 1 * MB;
++static const unsigned s_holdOffMultiplier = 20;
++
++void MemoryPressureHandler::triggerMemoryPressureEvent(bool isCritical)
++{
++ if (!m_installed)
++ return;
++
++ if (ReliefLogger::loggingEnabled())
++ LOG(MemoryPressure, "Got memory pressure notification (%s)", isCritical ? "critical" : "non-critical");
++
++ setUnderMemoryPressure(true);
++
++ if (isMainThread())
++ respondToMemoryPressure(isCritical ? Critical::Yes : Critical::No);
++ else
++ RunLoop::main().dispatch([this, isCritical] {
++ respondToMemoryPressure(isCritical ? Critical::Yes : Critical::No);
++ });
++
++ if (ReliefLogger::loggingEnabled() && isUnderMemoryPressure())
++ LOG(MemoryPressure, "System is no longer under memory pressure.");
++
++ setUnderMemoryPressure(false);
++}
++
++void MemoryPressureHandler::install()
++{
++ if (m_installed || m_holdOffTimer.isActive())
++ return;
++
++ m_installed = true;
++}
++
++void MemoryPressureHandler::uninstall()
++{
++ if (!m_installed)
++ return;
++
++ m_holdOffTimer.stop();
++
++ m_installed = false;
++}
++
++void MemoryPressureHandler::holdOffTimerFired()
++{
++ install();
++}
++
++void MemoryPressureHandler::holdOff(Seconds seconds)
++{
++ m_holdOffTimer.startOneShot(seconds);
++}
++
++static size_t processMemoryUsage()
++{
++#if OS(LINUX)
++ ProcessMemoryStatus memoryStatus;
++ currentProcessMemoryStatus(memoryStatus);
++ return (memoryStatus.resident - memoryStatus.shared);
++#elif OS(FREEBSD)
++ static size_t pageSize = sysconf(_SC_PAGE_SIZE);
++ struct kinfo_proc info;
++ size_t infolen = sizeof(info);
++
++ int mib[4];
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_PROC;
++ mib[2] = KERN_PROC_PID;
++ mib[3] = getpid();
++
++ if (sysctl(mib, 4, &info, &infolen, nullptr, 0))
++ return 0;
++
++ return static_cast<size_t>(info.ki_rssize - info.ki_tsize) * pageSize;
++#else
++#error "Missing a platform specific way of determining the memory usage"
++#endif
++}
++
++void MemoryPressureHandler::respondToMemoryPressure(Critical critical, Synchronous synchronous)
++{
++ uninstall();
++
++ MonotonicTime startTime = MonotonicTime::now();
++ int64_t processMemory = processMemoryUsage();
++ releaseMemory(critical, synchronous);
++ int64_t bytesFreed = processMemory - processMemoryUsage();
++ Seconds holdOffTime = s_maximumHoldOffTime;
++ if (bytesFreed > 0 && static_cast<size_t>(bytesFreed) >= s_minimumBytesFreedToUseMinimumHoldOffTime)
++ holdOffTime = (MonotonicTime::now() - startTime) * s_holdOffMultiplier;
++ holdOff(std::max(holdOffTime, s_minimumHoldOffTime));
++}
++
++void MemoryPressureHandler::platformReleaseMemory(Critical)
++{
++#if HAVE(MALLOC_TRIM)
++ malloc_trim(0);
++#endif
++}
++
++Optional<MemoryPressureHandler::ReliefLogger::MemoryUsage> MemoryPressureHandler::ReliefLogger::platformMemoryUsage()
++{
++ return MemoryUsage {processMemoryUsage(), memoryFootprint()};
++}
++
++} // namespace WTF
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WebCore_css_StyleResolver.cpp b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WebCore_css_StyleResolver.cpp
new file mode 100644
index 000000000000..d5fd4dfb009f
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_WebCore_css_StyleResolver.cpp
@@ -0,0 +1,11 @@
+--- modules/javafx.web/src/main/native/Source/WebCore/css/StyleResolver.cpp.orig 2020-08-19 18:48:58 UTC
++++ modules/javafx.web/src/main/native/Source/WebCore/css/StyleResolver.cpp
+@@ -211,7 +211,7 @@ StyleResolver::StyleResolver(Document& document)
+ if (view)
+ m_mediaQueryEvaluator = MediaQueryEvaluator { view->mediaType() };
+ else
+- m_mediaQueryEvaluator = MediaQueryEvaluator { "all" };
++ m_mediaQueryEvaluator = MediaQueryEvaluator { };
+
+ if (root) {
+ m_rootDefaultStyle = styleForElement(*root, m_document.renderStyle(), nullptr, RuleMatchingBehavior::MatchOnlyUserAgentRules).renderStyle;
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_AvailableMemory.cpp b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_AvailableMemory.cpp
new file mode 100644
index 000000000000..ab98a2665dfd
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_AvailableMemory.cpp
@@ -0,0 +1,45 @@
+--- modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/AvailableMemory.cpp.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/AvailableMemory.cpp
+@@ -47,6 +47,11 @@
+ #if BOS(LINUX)
+ #include <algorithm>
+ #include <fcntl.h>
++#elif BOS(FREEBSD)
++#include "VMAllocate.h"
++#include <sys/sysctl.h>
++#include <sys/types.h>
++#include <sys/user.h>
+ #endif
+ #include <unistd.h>
+ #endif
+@@ -184,7 +189,7 @@ size_t availableMemory()
+ return availableMemory;
+ }
+
+-#if BPLATFORM(IOS_FAMILY) || BOS(LINUX)
++#if BPLATFORM(IOS_FAMILY) || BOS(LINUX) || BOS(FREEBSD)
+ MemoryStatus memoryStatus()
+ {
+ #if BPLATFORM(IOS_FAMILY)
+@@ -200,6 +205,21 @@ MemoryStatus memoryStatus()
+ auto& memory = LinuxMemory::singleton();
+ size_t memoryFootprint = memory.footprint();
+ double percentInUse = static_cast<double>(memoryFootprint) / static_cast<double>(memory.availableMemory);
++#elif BOS(FREEBSD)
++ struct kinfo_proc info;
++ size_t infolen = sizeof(info);
++
++ int mib[4];
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_PROC;
++ mib[2] = KERN_PROC_PID;
++ mib[3] = getpid();
++
++ size_t memoryFootprint = 0;
++ if (!sysctl(mib, 4, &info, &infolen, nullptr, 0))
++ memoryFootprint = static_cast<size_t>(info.ki_rssize) * vmPageSize();
++
++ double percentInUse = static_cast<double>(memoryFootprint) / static_cast<double>(availableMemory());
+ #endif
+
+ double percentAvailableMemoryInUse = std::min(percentInUse, 1.0);
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_AvailableMemory.h b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_AvailableMemory.h
new file mode 100644
index 000000000000..79cdc21439f3
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_AvailableMemory.h
@@ -0,0 +1,20 @@
+--- modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/AvailableMemory.h.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/AvailableMemory.h
+@@ -32,7 +32,7 @@ namespace bmalloc {
+
+ size_t availableMemory();
+
+-#if BPLATFORM(IOS_FAMILY) || BOS(LINUX)
++#if BPLATFORM(IOS_FAMILY) || BOS(LINUX) || BOS(FREEBSD)
+ struct MemoryStatus {
+ MemoryStatus(size_t memoryFootprint, double percentAvailableMemoryInUse)
+ : memoryFootprint(memoryFootprint)
+@@ -61,7 +61,7 @@ inline double percentAvailableMemoryInUse()
+
+ inline bool isUnderMemoryPressure()
+ {
+-#if BPLATFORM(IOS_FAMILY) || BOS(LINUX)
++#if BPLATFORM(IOS_FAMILY) || BOS(LINUX) || BOS(FREEBSD)
+ return percentAvailableMemoryInUse() > memoryPressureThreshold;
+ #else
+ return false;
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_bmalloc.h b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_bmalloc.h
new file mode 100644
index 000000000000..e69db714cc71
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_bmalloc_bmalloc_bmalloc.h
@@ -0,0 +1,11 @@
+--- modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/bmalloc.h.orig 2020-07-24 18:56:22 UTC
++++ modules/javafx.web/src/main/native/Source/bmalloc/bmalloc/bmalloc.h
+@@ -111,7 +111,7 @@ inline size_t availableMemory()
+ return bmalloc::availableMemory();
+ }
+
+-#if BPLATFORM(IOS_FAMILY) || BOS(LINUX)
++#if BPLATFORM(IOS_FAMILY) || BOS(LINUX) || BOS(FREEBSD)
+ inline size_t memoryFootprint()
+ {
+ return bmalloc::memoryFootprint();
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_OptionsJava.cmake b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_OptionsJava.cmake
new file mode 100644
index 000000000000..469339f49e08
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_OptionsJava.cmake
@@ -0,0 +1,21 @@
+--- modules/javafx.web/src/main/native/Source/cmake/OptionsJava.cmake.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/cmake/OptionsJava.cmake
+@@ -31,14 +31,10 @@ endif ()
+ set(LIB_INSTALL_DIR "${CMAKE_INSTALL_FULL_LIBDIR}" CACHE PATH "Absolute path to library installation directory")
+ set(EXEC_INSTALL_DIR "${CMAKE_INSTALL_FULL_BINDIR}" CACHE PATH "Absolute path to executable installation directory")
+
+-set(SQLITE_LIBRARIES SqliteJava)
+-set(LIBXML2_LIBRARIES XMLJava)
+-set(LIBXSLT_LIBRARIES XSLTJava)
+-
+-set(ICU_LIBRARIES icuuc icudata)
+-set(ICU_I18N_LIBRARIES icui18n icuuc icudata)
+-set(ICU_DATA_LIBRARIES icudata)
+-
++find_package(LibXml2 2.8.0 REQUIRED)
++find_package(LibXslt REQUIRED)
++find_package(Sqlite REQUIRED)
++find_package(ICU REQUIRED)
+ find_package(JNI REQUIRED)
+ find_package(Threads REQUIRED)
+
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_WebKitCommon.cmake b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_WebKitCommon.cmake
new file mode 100644
index 000000000000..13a106977423
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_WebKitCommon.cmake
@@ -0,0 +1,12 @@
+--- modules/javafx.web/src/main/native/Source/cmake/WebKitCommon.cmake.orig 2020-09-17 13:23:59 UTC
++++ modules/javafx.web/src/main/native/Source/cmake/WebKitCommon.cmake
+@@ -17,8 +17,7 @@ if (NOT HAS_RUN_WEBKIT_COMMON)
+ find_package(Perl 5.10.0 REQUIRED)
+ find_package(PerlModules COMPONENTS JSON::PP REQUIRED)
+
+- set(Python_ADDITIONAL_VERSIONS 3)
+- find_package(PythonInterp 2.7.0 REQUIRED)
++ find_package(PythonInterp REQUIRED)
+
+ # We cannot check for RUBY_FOUND because it is set only when the full package is installed and
+ # the only thing we need is the interpreter. Unlike Python, cmake does not provide a macro
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_WebKitCompilerFlags.cmake b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_WebKitCompilerFlags.cmake
new file mode 100644
index 000000000000..9efe8e595e49
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Source_cmake_WebKitCompilerFlags.cmake
@@ -0,0 +1,13 @@
+--- modules/javafx.web/src/main/native/Source/cmake/WebKitCompilerFlags.cmake.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.web/src/main/native/Source/cmake/WebKitCompilerFlags.cmake
+@@ -231,10 +231,6 @@ if (NOT MSVC)
+ string(REGEX MATCHALL "-fsanitize=[^ ]*" ENABLED_COMPILER_SANITIZERS ${CMAKE_CXX_FLAGS})
+ endif ()
+
+-if (UNIX AND NOT APPLE AND NOT ENABLED_COMPILER_SANITIZERS)
+- set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined ${CMAKE_SHARED_LINKER_FLAGS}")
+-endif ()
+-
+
+ # CODE_GENERATOR_PREPROCESSOR_WITH_LINEMARKERS only matters with GCC >= 4.7.0. Since this
+ # version, -P does not output empty lines, which currently breaks make_names.pl in
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Tools_DumpRenderTree_TestRunner.cpp b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Tools_DumpRenderTree_TestRunner.cpp
new file mode 100644
index 000000000000..79cb54ed55ad
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Tools_DumpRenderTree_TestRunner.cpp
@@ -0,0 +1,18 @@
+https://github.com/WebKit/webkit/commit/35a79bf4c2e0ecb4a37e672de347a25254ea0601
+
+* DumpRenderTree/TestRunner.cpp:
+(TestRunner::runUIScript):
+Manually convert between UChar and UniChar/unichar where needed.
+
+
+--- modules/javafx.web/src/main/native/Tools/DumpRenderTree/TestRunner.cpp.orig 2020-07-19 19:13:03 UTC
++++ modules/javafx.web/src/main/native/Tools/DumpRenderTree/TestRunner.cpp
+@@ -2463,7 +2463,7 @@ void TestRunner::runUIScript(JSContextRef context, JSS
+ if (!m_UIScriptContext)
+ m_UIScriptContext = makeUniqueWithoutFastMallocCheck<WTR::UIScriptContext>(*this);
+
+- String scriptString(JSStringGetCharactersPtr(script), JSStringGetLength(script));
++ String scriptString(reinterpret_cast<const UChar*>(JSStringGetCharactersPtr(script)), JSStringGetLength(script));
+ m_UIScriptContext->runUIScript(scriptString, callbackID);
+ }
+
diff --git a/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Tools_DumpRenderTree_java_CMakeLists.txt b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Tools_DumpRenderTree_java_CMakeLists.txt
new file mode 100644
index 000000000000..2ebf9a083181
--- /dev/null
+++ b/java/openjfx14/files/patch-modules_javafx.web_src_main_native_Tools_DumpRenderTree_java_CMakeLists.txt
@@ -0,0 +1,12 @@
+--- modules/javafx.web/src/main/native/Tools/DumpRenderTree/java/CMakeLists.txt.orig 2020-07-17 10:21:33 UTC
++++ modules/javafx.web/src/main/native/Tools/DumpRenderTree/java/CMakeLists.txt
+@@ -72,9 +72,5 @@ add_library(DumpRenderTreeJava SHARED ${DumpRenderTree
+ add_definitions(-DWEBCORE_EXPORT=WTF_IMPORT -DWEBCORE_TESTSUPPORT_EXPORT=WTF_IMPORT)
+ add_dependencies(DumpRenderTreeJava DumpRenderTreeBindings)
+
+-if (UNIX AND NOT APPLE)
+- set_target_properties(DumpRenderTreeJava PROPERTIES LINK_FLAGS "-Wl,--no-undefined")
+-endif ()
+-
+ set_target_properties(DumpRenderTreeJava PROPERTIES OUTPUT_NAME "DumpRenderTreeJava")
+ target_link_libraries(DumpRenderTreeJava ${DumpRenderTree_LIBRARIES})
diff --git a/java/openjfx14/files/sndiosink.c b/java/openjfx14/files/sndiosink.c
new file mode 100644
index 000000000000..cc68bd29d807
--- /dev/null
+++ b/java/openjfx14/files/sndiosink.c
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2008 Jacob Meuser <jakemsr@sdf.lonestar.org>
+ * Copyright (C) 2012 Alexandre Ratchov <alex@caoua.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * SECTION:element-sndiosink
+ * @see_also: #GstAutoAudioSink
+ *
+ * <refsect2>
+ * <para>
+ * This element outputs sound to a sound card using sndio.
+ * </para>
+ * <para>
+ * Simple example pipeline that plays an Ogg/Vorbis file via sndio:
+ * <programlisting>
+ * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! audioresample ! sndiosink
+ * </programlisting>
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "sndiosink.h"
+
+GST_DEBUG_CATEGORY_EXTERN (gst_sndio_debug);
+#define GST_CAT_DEFAULT gst_sndio_debug
+
+#define gst_sndiosink_parent_class parent_class
+
+static GstStaticPadTemplate sndiosink_factory =
+ GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_SNDIO_CAPS_STRING)
+ );
+
+G_DEFINE_TYPE_WITH_CODE (GstSndioSink, gst_sndiosink, GST_TYPE_AUDIO_SINK,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_STREAM_VOLUME, NULL));
+
+static void gst_sndiosink_finalize (GObject * object);
+static GstCaps *gst_sndiosink_getcaps (GstBaseSink * bsink,
+ GstCaps * filter);
+static gboolean gst_sndiosink_open (GstAudioSink * asink);
+static gboolean gst_sndiosink_close (GstAudioSink * asink);
+static gboolean gst_sndiosink_prepare (GstAudioSink * asink,
+ GstAudioRingBufferSpec * spec);
+static gboolean gst_sndiosink_unprepare (GstAudioSink * asink);
+static gint gst_sndiosink_write (GstAudioSink * asink, gpointer data,
+ guint length);
+static guint gst_sndiosink_delay (GstAudioSink * asink);
+static void gst_sndiosink_reset (GstAudioSink * asink);
+static void gst_sndiosink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_sndiosink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void
+gst_sndiosink_init (GstSndioSink * sink)
+{
+ gst_sndio_init (&sink->sndio, G_OBJECT(sink));
+}
+
+static void
+gst_sndiosink_finalize (GObject * object)
+{
+ GstSndioSink *sink = GST_SNDIOSINK (object);
+
+ gst_sndio_finalize (&sink->sndio);
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static GstCaps *
+gst_sndiosink_getcaps (GstBaseSink * bsink, GstCaps * filter)
+{
+ GstSndioSink *sink = GST_SNDIOSINK (bsink);
+
+ return gst_sndio_getcaps (&sink->sndio, filter);
+}
+
+static gboolean
+gst_sndiosink_open (GstAudioSink * asink)
+{
+ GstSndioSink *sink = GST_SNDIOSINK (asink);
+
+ return gst_sndio_open (&sink->sndio, SIO_PLAY);
+}
+
+static gboolean
+gst_sndiosink_close (GstAudioSink * asink)
+{
+ GstSndioSink *sink = GST_SNDIOSINK (asink);
+
+ return gst_sndio_close (&sink->sndio);
+}
+
+static gboolean
+gst_sndiosink_prepare (GstAudioSink * asink, GstAudioRingBufferSpec * spec)
+{
+ GstSndioSink *sink = GST_SNDIOSINK (asink);
+
+ return gst_sndio_prepare (&sink->sndio, spec);
+}
+
+static gboolean
+gst_sndiosink_unprepare (GstAudioSink * asink)
+{
+ GstSndioSink *sink = GST_SNDIOSINK (asink);
+
+ return gst_sndio_unprepare (&sink->sndio);
+}
+
+static gint
+gst_sndiosink_write (GstAudioSink * asink, gpointer data, guint length)
+{
+ GstSndioSink *sink = GST_SNDIOSINK (asink);
+ guint done;
+
+ if (length == 0)
+ return 0;
+ done = sio_write (sink->sndio.hdl, data, length);
+ if (done == 0) {
+ GST_ELEMENT_ERROR (sink, RESOURCE, WRITE,
+ ("Failed to write data to sndio"), (NULL));
+ return 0;
+ }
+ sink->sndio.delay += done;
+ return done;
+}
+
+static guint
+gst_sndiosink_delay (GstAudioSink * asink)
+{
+ GstSndioSink *sink = GST_SNDIOSINK (asink);
+
+ return GST_SNDIO_DELAY(&sink->sndio);
+}
+
+static void
+gst_sndiosink_reset (GstAudioSink * asink)
+{
+}
+
+static void
+gst_sndiosink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstSndioSink *sink = GST_SNDIOSINK (object);
+
+ gst_sndio_set_property (&sink->sndio, prop_id, value, pspec);
+}
+
+static void
+gst_sndiosink_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstSndioSink *sink = GST_SNDIOSINK (object);
+
+ gst_sndio_get_property (&sink->sndio, prop_id, value, pspec);
+}
+
+static void
+gst_sndiosink_class_init (GstSndioSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSinkClass *gstbasesink_class;
+ GstAudioBaseSinkClass *gstbaseaudiosink_class;
+ GstAudioSinkClass *gstaudiosink_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+ gstbasesink_class = (GstBaseSinkClass *) klass;
+ gstbaseaudiosink_class = (GstAudioBaseSinkClass *) klass;
+ gstaudiosink_class = (GstAudioSinkClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->finalize = gst_sndiosink_finalize;
+ gobject_class->get_property = gst_sndiosink_get_property;
+ gobject_class->set_property = gst_sndiosink_set_property;
+
+ gst_element_class_set_static_metadata (gstelement_class,
+ "Audio sink (sndio)", "Sink/Audio",
+ "Output to a sound card via sndio",
+ "Jacob Meuser <jakemsr@sdf.lonestar.org>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sndiosink_factory));
+
+ gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_sndiosink_getcaps);
+ gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_sndiosink_open);
+ gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_sndiosink_prepare);
+ gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_sndiosink_unprepare);
+ gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_sndiosink_close);
+ gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_sndiosink_write);
+ gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_sndiosink_delay);
+ gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_sndiosink_reset);
+
+ g_object_class_install_property (gobject_class, PROP_DEVICE,
+ g_param_spec_string ("device", "Device",
+ "sndio device as defined in sndio(7)",
+ SIO_DEVANY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_VOLUME,
+ g_param_spec_double ("volume", "Volume",
+ "Linear volume of this stream, 1.0=100%", 0.0, 1.0,
+ 1.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MUTE,
+ g_param_spec_boolean ("mute", "Mute",
+ "Mute state of this stream", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
diff --git a/java/openjfx14/files/sndiosink.h b/java/openjfx14/files/sndiosink.h
new file mode 100644
index 000000000000..314e62210c54
--- /dev/null
+++ b/java/openjfx14/files/sndiosink.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2008 Jacob Meuser <jakemsr@sdf.lonestar.org>
+ * Copyright (C) 2012 Alexandre Ratchov <alex@caoua.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+
+#ifndef __GST_SNDIOSINK_H__
+#define __GST_SNDIOSINK_H__
+
+#include <sndio.h>
+
+#include <gst/gst.h>
+#include <gst/audio/gstaudiosink.h>
+#include "gstsndio.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_SNDIOSINK \
+ (gst_sndiosink_get_type())
+#define GST_SNDIOSINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SNDIOSINK,GstSndioSink))
+#define GST_SNDIOSINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SNDIOSINK,GstSndioSinkClass))
+#define GST_IS_SNDIOSINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SNDIOSINK))
+#define GST_IS_SNDIOSINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SNDIOSINK))
+
+typedef struct _GstSndioSink GstSndioSink;
+typedef struct _GstSndioSinkClass GstSndioSinkClass;
+
+struct _GstSndioSink {
+ GstAudioSink sink;
+ struct gstsndio sndio;
+};
+
+struct _GstSndioSinkClass {
+ GstAudioSinkClass parent_class;
+};
+
+GType gst_sndiosink_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_SNDIOSINK_H__ */
diff --git a/java/openjfx14/pkg-descr b/java/openjfx14/pkg-descr
new file mode 100644
index 000000000000..b5f5bb7d7c39
--- /dev/null
+++ b/java/openjfx14/pkg-descr
@@ -0,0 +1,6 @@
+OpenJFX is an open source, next generation client application platform for
+desktop and embedded systems based on JavaSE. It is a collaborative effort by
+many individuals and companies with the goal of producing a modern, efficient,
+and fully featured toolkit for developing rich client applications.
+
+WWW: https://openjdk.java.net/projects/openjfx/
diff --git a/java/openjfx14/pkg-plist b/java/openjfx14/pkg-plist
new file mode 100644
index 000000000000..7f341c10d709
--- /dev/null
+++ b/java/openjfx14/pkg-plist
@@ -0,0 +1,34 @@
+%%INSTALLDIR%%/javafx-exports.zip
+%%INSTALLDIR%%/jmods/javafx.base.jmod
+%%INSTALLDIR%%/jmods/javafx.controls.jmod
+%%INSTALLDIR%%/jmods/javafx.fxml.jmod
+%%INSTALLDIR%%/jmods/javafx.graphics.jmod
+%%INSTALLDIR%%/jmods/javafx.media.jmod
+%%INSTALLDIR%%/jmods/javafx.swing.jmod
+%%INSTALLDIR%%/jmods/javafx.web.jmod
+%%INSTALLDIR%%/lib/javafx.base.jar
+%%INSTALLDIR%%/lib/javafx.controls.jar
+%%INSTALLDIR%%/lib/javafx.fxml.jar
+%%INSTALLDIR%%/lib/javafx.graphics.jar
+%%INSTALLDIR%%/lib/javafx.media.jar
+%%INSTALLDIR%%/lib/javafx.properties
+%%INSTALLDIR%%/lib/javafx.swing.jar
+%%INSTALLDIR%%/lib/javafx.web.jar
+%%MEDIA%%%%INSTALLDIR%%/lib/libavplugin.so
+%%INSTALLDIR%%/lib/libdecora_sse.so
+%%MEDIA%%%%INSTALLDIR%%/lib/libfxplugins.so
+%%INSTALLDIR%%/lib/libglass.so
+%%INSTALLDIR%%/lib/libglassgtk2.so
+%%INSTALLDIR%%/lib/libglassgtk3.so
+%%MEDIA%%%%INSTALLDIR%%/lib/libgstreamer-lite.so
+%%INSTALLDIR%%/lib/libjavafx_font.so
+%%INSTALLDIR%%/lib/libjavafx_font_freetype.so
+%%INSTALLDIR%%/lib/libjavafx_font_pango.so
+%%INSTALLDIR%%/lib/libjavafx_iio.so
+%%MEDIA%%%%INSTALLDIR%%/lib/libjfxmedia.so
+%%WEBKIT%%%%INSTALLDIR%%/lib/libjfxwebkit.so
+%%INSTALLDIR%%/lib/libprism_common.so
+%%INSTALLDIR%%/lib/libprism_es2.so
+%%INSTALLDIR%%/lib/libprism_sw.so
+%%INSTALLDIR%%/lib/javafx-src.zip
+%%SWT%%%%INSTALLDIR%%/lib/javafx-swt.jar