@@ -13,33 +13,34 @@ env: | |||||
jobs: | jobs: | ||||
linux-arm64: | linux-arm64: | ||||
runs-on: ubuntu-18.04 | |||||
runs-on: ubuntu-20.04 | |||||
steps: | steps: | ||||
- uses: actions/checkout@v2 | - uses: actions/checkout@v2 | ||||
with: | with: | ||||
submodules: recursive | submodules: recursive | ||||
- name: Fix GitHub's mess | |||||
run: | | |||||
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list | |||||
sudo apt-get update -qq | |||||
sudo apt-get install -yqq --allow-downgrades libpcre2-8-0/focal libpcre2-16-0/focal libpcre2-32-0/focal libpcre2-posix2/focal | |||||
- name: Set up dependencies | - name: Set up dependencies | ||||
run: | | run: | | ||||
sudo dpkg --add-architecture arm64 | sudo dpkg --add-architecture arm64 | ||||
sudo sed -i "s/deb http/deb [arch=amd64] http/" /etc/apt/sources.list | sudo sed -i "s/deb http/deb [arch=amd64] http/" /etc/apt/sources.list | ||||
echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ports-arm64.list | |||||
echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ports-arm64.list | |||||
echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-backports main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ports-arm64.list | |||||
echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ports-arm64.list | |||||
echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal-updates main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ports-arm64.list | |||||
echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal-backports main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ports-arm64.list | |||||
sudo apt-get update -qq | sudo apt-get update -qq | ||||
sudo apt-get install -yq g++-aarch64-linux-gnu libasound2-dev:arm64 libcairo2-dev:arm64 libgl1-mesa-dev:arm64 liblo-dev:arm64 libpulse-dev:arm64 libx11-dev:arm64 libxcursor-dev:arm64 libxext-dev:arm64 libxrandr-dev:arm64 qemu-user-static | |||||
# fix broken Ubuntu packages missing pkg-config file in multi-arch package | |||||
sudo apt-get install -yq libasound2-dev libgl1-mesa-dev liblo-dev libpulse-dev libxcursor-dev libxrandr-dev | |||||
sudo ln -s /usr/lib/aarch64-linux-gnu/liblo.so.7 /usr/lib/aarch64-linux-gnu/liblo.so | |||||
sudo cp /usr/lib/x86_64-linux-gnu/pkgconfig/liblo.pc /usr/lib/aarch64-linux-gnu/pkgconfig/liblo.pc | |||||
sudo sed -i "s/x86_64-linux-gnu/aarch64-linux-gnu/" /usr/lib/aarch64-linux-gnu/pkgconfig/liblo.pc | |||||
sudo apt-get install -yqq g++-aarch64-linux-gnu libasound2-dev:arm64 libcairo2-dev:arm64 libdbus-1-dev:arm64 libgl1-mesa-dev:arm64 liblo-dev:arm64 libpulse-dev:arm64 libx11-dev:arm64 libxcursor-dev:arm64 libxext-dev:arm64 libxrandr-dev:arm64 qemu-user-static | |||||
- name: Build linux arm64 cross-compiled | - name: Build linux arm64 cross-compiled | ||||
env: | env: | ||||
CC: aarch64-linux-gnu-gcc | CC: aarch64-linux-gnu-gcc | ||||
CXX: aarch64-linux-gnu-g++ | CXX: aarch64-linux-gnu-g++ | ||||
LDFLAGS: -static-libgcc -static-libstdc++ | LDFLAGS: -static-libgcc -static-libstdc++ | ||||
PKG_CONFIG_PATH: /usr/lib/aarch64-linux-gnu/pkgconfig | |||||
run: | | run: | | ||||
make features | make features | ||||
make -j $(nproc) | |||||
make WITH_LTO=true -j $(nproc) | |||||
- name: Set sha8 | - name: Set sha8 | ||||
id: slug | id: slug | ||||
run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | ||||
@@ -50,33 +51,34 @@ jobs: | |||||
bin/* | bin/* | ||||
linux-armhf: | linux-armhf: | ||||
runs-on: ubuntu-18.04 | |||||
runs-on: ubuntu-20.04 | |||||
steps: | steps: | ||||
- uses: actions/checkout@v2 | - uses: actions/checkout@v2 | ||||
with: | with: | ||||
submodules: recursive | submodules: recursive | ||||
- name: Fix GitHub's mess | |||||
run: | | |||||
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list | |||||
sudo apt-get update -qq | |||||
sudo apt-get install -yqq --allow-downgrades libpcre2-8-0/focal libpcre2-16-0/focal libpcre2-32-0/focal libpcre2-posix2/focal | |||||
- name: Set up dependencies | - name: Set up dependencies | ||||
run: | | run: | | ||||
sudo dpkg --add-architecture armhf | sudo dpkg --add-architecture armhf | ||||
sudo sed -i "s/deb http/deb [arch=amd64] http/" /etc/apt/sources.list | sudo sed -i "s/deb http/deb [arch=amd64] http/" /etc/apt/sources.list | ||||
echo "deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports bionic main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ports-armhf.list | |||||
echo "deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ports-armhf.list | |||||
echo "deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports bionic-backports main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ports-armhf.list | |||||
echo "deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports focal main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ports-armhf.list | |||||
echo "deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports focal-updates main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ports-armhf.list | |||||
echo "deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports focal-backports main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ports-armhf.list | |||||
sudo apt-get update -qq | sudo apt-get update -qq | ||||
sudo apt-get install -yq g++-arm-linux-gnueabihf libasound2-dev:armhf libcairo2-dev:armhf libgl1-mesa-dev:armhf liblo-dev:armhf libpulse-dev:armhf libx11-dev:armhf libxcursor-dev:armhf libxext-dev:armhf libxrandr-dev:armhf qemu-user-static | |||||
# fix broken Ubuntu packages missing pkg-config file in multi-arch package | |||||
sudo apt-get install -yq libasound2-dev libgl1-mesa-dev liblo-dev libpulse-dev libxcursor-dev libxrandr-dev | |||||
sudo ln -s /usr/lib/arm-linux-gnueabihf/liblo.so.7 /usr/lib/arm-linux-gnueabihf/liblo.so | |||||
sudo cp /usr/lib/x86_64-linux-gnu/pkgconfig/liblo.pc /usr/lib/arm-linux-gnueabihf/pkgconfig/liblo.pc | |||||
sudo sed -i "s/x86_64-linux-gnu/arm-linux-gnueabihf/" /usr/lib/arm-linux-gnueabihf/pkgconfig/liblo.pc | |||||
sudo apt-get install -yqq g++-arm-linux-gnueabihf libasound2-dev:armhf libcairo2-dev:armhf libdbus-1-dev:armhf libgl1-mesa-dev:armhf liblo-dev:armhf libpulse-dev:armhf libx11-dev:armhf libxcursor-dev:armhf libxext-dev:armhf libxrandr-dev:armhf qemu-user-static | |||||
- name: Build linux armhf cross-compiled | - name: Build linux armhf cross-compiled | ||||
env: | env: | ||||
CC: arm-linux-gnueabihf-gcc | CC: arm-linux-gnueabihf-gcc | ||||
CXX: arm-linux-gnueabihf-g++ | CXX: arm-linux-gnueabihf-g++ | ||||
LDFLAGS: -static-libgcc -static-libstdc++ | LDFLAGS: -static-libgcc -static-libstdc++ | ||||
PKG_CONFIG_PATH: /usr/lib/arm-linux-gnueabihf/pkgconfig | |||||
run: | | run: | | ||||
make features | make features | ||||
make -j $(nproc) | |||||
make WITH_LTO=true -j $(nproc) | |||||
- name: Set sha8 | - name: Set sha8 | ||||
id: slug | id: slug | ||||
run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | ||||
@@ -86,37 +88,44 @@ jobs: | |||||
path: | | path: | | ||||
bin/* | bin/* | ||||
linux-x86: | |||||
runs-on: ubuntu-18.04 | |||||
linux-i686: | |||||
runs-on: ubuntu-20.04 | |||||
steps: | steps: | ||||
- uses: actions/checkout@v2 | - uses: actions/checkout@v2 | ||||
with: | with: | ||||
submodules: recursive | submodules: recursive | ||||
- name: Fix GitHub's mess | |||||
run: | | |||||
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list | |||||
sudo apt-get update -qq | |||||
sudo apt-get install -yqq --allow-downgrades libpcre2-8-0/focal libpcre2-16-0/focal libpcre2-32-0/focal libpcre2-posix2/focal | |||||
- name: Set up dependencies | - name: Set up dependencies | ||||
run: | | run: | | ||||
sudo dpkg --add-architecture i386 | sudo dpkg --add-architecture i386 | ||||
sudo apt-get update -qq | sudo apt-get update -qq | ||||
sudo apt-get install -yq g++-multilib libasound2-dev:i386 libcairo2-dev:i386 libgl1-mesa-dev:i386 liblo-dev:i386 libpulse-dev:i386 libx11-dev:i386 libxcursor-dev:i386 libxext-dev:i386 libxrandr-dev:i386 | |||||
- name: Build linux x86 | |||||
sudo apt-get install -yqq g++-i686-linux-gnu libasound2-dev:i386 libcairo2-dev:i386 libdbus-1-dev:i386 libgl1-mesa-dev:i386 liblo-dev:i386 libpulse-dev:i386 libx11-dev:i386 libxcursor-dev:i386 libxext-dev:i386 libxrandr-dev:i386 | |||||
- name: Build linux i686 | |||||
env: | env: | ||||
CC: i686-linux-gnu-gcc | |||||
CXX: i686-linux-gnu-g++ | |||||
CFLAGS: -m32 | CFLAGS: -m32 | ||||
CXXFLAGS: -m32 | CXXFLAGS: -m32 | ||||
LDFLAGS: -m32 -static-libgcc -static-libstdc++ | LDFLAGS: -m32 -static-libgcc -static-libstdc++ | ||||
PKG_CONFIG_PATH: /usr/lib/i386-linux-gnu/pkgconfig | PKG_CONFIG_PATH: /usr/lib/i386-linux-gnu/pkgconfig | ||||
run: | | run: | | ||||
make features | make features | ||||
make -j $(nproc) | |||||
make WITH_LTO=true -j $(nproc) | |||||
- name: Set sha8 | - name: Set sha8 | ||||
id: slug | id: slug | ||||
run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | ||||
- uses: actions/upload-artifact@v2 | - uses: actions/upload-artifact@v2 | ||||
with: | with: | ||||
name: ${{ github.event.repository.name }}-linux-x86-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }} | |||||
name: ${{ github.event.repository.name }}-linux-i686-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }} | |||||
path: | | path: | | ||||
bin/* | bin/* | ||||
linux-x86_64: | linux-x86_64: | ||||
runs-on: ubuntu-18.04 | |||||
runs-on: ubuntu-20.04 | |||||
steps: | steps: | ||||
- uses: actions/checkout@v2 | - uses: actions/checkout@v2 | ||||
with: | with: | ||||
@@ -124,13 +133,13 @@ jobs: | |||||
- name: Set up dependencies | - name: Set up dependencies | ||||
run: | | run: | | ||||
sudo apt-get update -qq | sudo apt-get update -qq | ||||
sudo apt-get install -yq libasound2-dev libcairo2-dev libgl1-mesa-dev liblo-dev libpulse-dev libx11-dev libxcursor-dev libxext-dev libxrandr-dev | |||||
sudo apt-get install -yqq libasound2-dev libcairo2-dev libdbus-1-dev libgl1-mesa-dev liblo-dev libpulse-dev libx11-dev libxcursor-dev libxext-dev libxrandr-dev | |||||
- name: Build linux x86_64 | - name: Build linux x86_64 | ||||
env: | env: | ||||
LDFLAGS: -static-libgcc -static-libstdc++ | LDFLAGS: -static-libgcc -static-libstdc++ | ||||
run: | | run: | | ||||
make features | make features | ||||
make -j $(nproc) | |||||
make WITH_LTO=true -j $(nproc) | |||||
- name: Set sha8 | - name: Set sha8 | ||||
id: slug | id: slug | ||||
run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | ||||
@@ -157,7 +166,7 @@ jobs: | |||||
LDFLAGS: -arch x86_64 -arch arm64 -mmacosx-version-min=10.12 | LDFLAGS: -arch x86_64 -arch arm64 -mmacosx-version-min=10.12 | ||||
run: | | run: | | ||||
make features | make features | ||||
make NOOPT=true -j $(sysctl -n hw.logicalcpu) | |||||
make NOOPT=true WITH_LTO=true -j $(sysctl -n hw.logicalcpu) | |||||
./dpf/utils/package-osx-bundles.sh | ./dpf/utils/package-osx-bundles.sh | ||||
- name: Set sha8 | - name: Set sha8 | ||||
id: slug | id: slug | ||||
@@ -175,16 +184,21 @@ jobs: | |||||
!bin/vst3 | !bin/vst3 | ||||
win32: | win32: | ||||
runs-on: ubuntu-18.04 | |||||
runs-on: ubuntu-20.04 | |||||
steps: | steps: | ||||
- uses: actions/checkout@v2 | - uses: actions/checkout@v2 | ||||
with: | with: | ||||
submodules: recursive | submodules: recursive | ||||
- name: Fix GitHub's mess | |||||
run: | | |||||
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list | |||||
sudo apt-get update -qq | |||||
sudo apt-get install -yqq --allow-downgrades libpcre2-8-0/focal libpcre2-16-0/focal libpcre2-32-0/focal libpcre2-posix2/focal | |||||
- name: Set up dependencies | - name: Set up dependencies | ||||
run: | | run: | | ||||
sudo dpkg --add-architecture i386 | sudo dpkg --add-architecture i386 | ||||
sudo apt-get update -qq | sudo apt-get update -qq | ||||
sudo apt-get install -yq binutils-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64 wine-stable:i386 | |||||
sudo apt-get install -yqq binutils-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64 wine-stable:i386 | |||||
- name: Build win32 cross-compiled | - name: Build win32 cross-compiled | ||||
env: | env: | ||||
CC: i686-w64-mingw32-gcc | CC: i686-w64-mingw32-gcc | ||||
@@ -194,7 +208,7 @@ jobs: | |||||
WINEDEBUG: "-all" | WINEDEBUG: "-all" | ||||
run: | | run: | | ||||
make features | make features | ||||
make -j $(nproc) | |||||
make WITH_LTO=true -j $(nproc) | |||||
- name: Set sha8 | - name: Set sha8 | ||||
id: slug | id: slug | ||||
run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | ||||
@@ -215,7 +229,7 @@ jobs: | |||||
- name: Set up dependencies | - name: Set up dependencies | ||||
run: | | run: | | ||||
sudo apt-get update -qq | sudo apt-get update -qq | ||||
sudo apt-get install -yq binutils-mingw-w64-x86-64 g++-mingw-w64-x86-64 mingw-w64 wine-stable | |||||
sudo apt-get install -yqq binutils-mingw-w64-x86-64 g++-mingw-w64-x86-64 mingw-w64 wine-stable | |||||
- name: Build win64 cross-compiled | - name: Build win64 cross-compiled | ||||
env: | env: | ||||
CC: x86_64-w64-mingw32-gcc | CC: x86_64-w64-mingw32-gcc | ||||
@@ -225,7 +239,7 @@ jobs: | |||||
WINEDEBUG: "-all" | WINEDEBUG: "-all" | ||||
run: | | run: | | ||||
make features | make features | ||||
make -j $(nproc) | |||||
make WITH_LTO=true -j $(nproc) | |||||
- name: Set sha8 | - name: Set sha8 | ||||
id: slug | id: slug | ||||
run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | ||||
@@ -250,9 +264,9 @@ jobs: | |||||
sudo dpkg -i kxstudio-repos_10.0.3_all.deb | sudo dpkg -i kxstudio-repos_10.0.3_all.deb | ||||
sudo apt-get update -qq | sudo apt-get update -qq | ||||
# build-deps | # build-deps | ||||
sudo apt-get install -yq libasound2-dev libcairo2-dev libgl1-mesa-dev liblo-dev libpulse-dev libx11-dev libxcursor-dev libxext-dev libxrandr-dev | |||||
sudo apt-get install -yqq libasound2-dev libcairo2-dev libdbus-1-dev libgl1-mesa-dev liblo-dev libpulse-dev libx11-dev libxcursor-dev libxext-dev libxrandr-dev | |||||
# runtime testing | # runtime testing | ||||
sudo apt-get install -yq carla-git lilv-utils lv2-dev lv2lint valgrind | |||||
sudo apt-get install -yqq carla-git lilv-utils lv2-dev lv2lint valgrind | |||||
- name: Build plugins | - name: Build plugins | ||||
env: | env: | ||||
CFLAGS: -g | CFLAGS: -g | ||||
@@ -313,14 +327,14 @@ jobs: | |||||
done | done | ||||
- name: Test VST2 plugins | - name: Test VST2 plugins | ||||
run: | | run: | | ||||
for p in $(ls bin/ | grep vst.so); do \ | |||||
for p in $(find bin/ | grep -e vst.so -e '.*\.vst/.*\.so'); do \ | |||||
env CARLA_BRIDGE_DUMMY=1 CARLA_BRIDGE_TESTING=native \ | env CARLA_BRIDGE_DUMMY=1 CARLA_BRIDGE_TESTING=native \ | ||||
valgrind \ | valgrind \ | ||||
--error-exitcode=255 \ | --error-exitcode=255 \ | ||||
--leak-check=full \ | --leak-check=full \ | ||||
--track-origins=yes \ | --track-origins=yes \ | ||||
--suppressions=./dpf/utils/valgrind-dpf.supp \ | --suppressions=./dpf/utils/valgrind-dpf.supp \ | ||||
/usr/lib/carla/carla-bridge-native vst2 ./bin/${p} "" 1>/dev/null; \ | |||||
/usr/lib/carla/carla-bridge-native vst2 ./${p} "" 1>/dev/null; \ | |||||
done | done | ||||
- name: Test VST3 plugins | - name: Test VST3 plugins | ||||
run: | | run: | | ||||
@@ -13,11 +13,6 @@ all: dgl plugins resources gen | |||||
PREFIX ?= /usr/local | PREFIX ?= /usr/local | ||||
DESTDIR ?= | DESTDIR ?= | ||||
# -------------------------------------------------------------- | |||||
# Check for system-wide dependencies | |||||
HAVE_PROJECTM = $(shell pkg-config --exists libprojectM && echo true) | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
ifneq ($(CROSS_COMPILING),true) | ifneq ($(CROSS_COMPILING),true) | ||||
@@ -65,7 +60,7 @@ ifeq ($(HAVE_OPENGL),true) | |||||
$(MAKE) all -C plugins/ProM | $(MAKE) all -C plugins/ProM | ||||
endif # HAVE_OPENGL | endif # HAVE_OPENGL | ||||
ifneq ($(HAVE_PROJECTM),true) | |||||
ifneq ($(HAVE_OPENGL),true) | |||||
resources: gen | resources: gen | ||||
# LV2 fonts | # LV2 fonts | ||||
install -d bin/ProM.lv2/resources/fonts | install -d bin/ProM.lv2/resources/fonts | ||||
@@ -82,9 +77,6 @@ ifeq ($(MACOS),true) | |||||
install -d bin/ProM.vst/Contents/Resources/presets | install -d bin/ProM.vst/Contents/Resources/presets | ||||
ln -sf $(CURDIR)/plugins/ProM/projectM/presets/presets_* bin/ProM.vst/Contents/Resources/presets/ | ln -sf $(CURDIR)/plugins/ProM/projectM/presets/presets_* bin/ProM.vst/Contents/Resources/presets/ | ||||
else | else | ||||
# VST2 directory | |||||
install -d bin/ProM.vst | |||||
mv bin/ProM-vst$(LIB_EXT) bin/ProM.vst/ProM$(LIB_EXT) | |||||
# VST2 fonts | # VST2 fonts | ||||
install -d bin/ProM.vst/resources/fonts | install -d bin/ProM.vst/resources/fonts | ||||
ln -sf $(CURDIR)/plugins/ProM/projectM/fonts/*.ttf bin/ProM.vst/resources/fonts/ | ln -sf $(CURDIR)/plugins/ProM/projectM/fonts/*.ttf bin/ProM.vst/resources/fonts/ | ||||
@@ -107,9 +99,6 @@ gen: plugins dpf/utils/lv2_ttl_generator | |||||
ifeq ($(CAN_GENERATE_TTL),true) | ifeq ($(CAN_GENERATE_TTL),true) | ||||
@$(CURDIR)/dpf/utils/generate-ttl.sh | @$(CURDIR)/dpf/utils/generate-ttl.sh | ||||
endif | endif | ||||
ifeq ($(MACOS),true) | |||||
@$(CURDIR)/dpf/utils/generate-vst-bundles.sh | |||||
endif | |||||
dpf/utils/lv2_ttl_generator: | dpf/utils/lv2_ttl_generator: | ||||
$(MAKE) -C dpf/utils/lv2-ttl-generator | $(MAKE) -C dpf/utils/lv2-ttl-generator | ||||
@@ -426,6 +426,38 @@ HAVE_DGL = $(HAVE_X11) | |||||
endif | endif | ||||
endif | endif | ||||
# --------------------------------------------------------------------------------------------------------------------- | |||||
# Optional flags | |||||
ifeq ($(NVG_DISABLE_SKIPPING_WHITESPACE),true) | |||||
BUILD_CXX_FLAGS += -DNVG_DISABLE_SKIPPING_WHITESPACE | |||||
endif | |||||
ifneq ($(NVG_FONT_TEXTURE_FLAGS),) | |||||
BUILD_CXX_FLAGS += -DNVG_FONT_TEXTURE_FLAGS=$(NVG_FONT_TEXTURE_FLAGS) | |||||
endif | |||||
ifeq ($(FILE_BROWSER_DISABLED),true) | |||||
BUILD_CXX_FLAGS += -DDGL_FILE_BROWSER_DISABLED | |||||
endif | |||||
ifeq ($(USE_OPENGL3),true) | |||||
BUILD_CXX_FLAGS += -DDGL_USE_OPENGL3 | |||||
endif | |||||
ifeq ($(USE_NANOVG_FBO),true) | |||||
BUILD_CXX_FLAGS += -DDGL_USE_NANOVG_FBO | |||||
endif | |||||
ifeq ($(USE_NANOVG_FREETYPE),true) | |||||
BUILD_CXX_FLAGS += -DFONS_USE_FREETYPE $(shell $(PKG_CONFIG) --cflags freetype2) | |||||
endif | |||||
ifeq ($(USE_RGBA),true) | |||||
BUILD_CXX_FLAGS += -DDGL_USE_RGBA | |||||
endif | |||||
# --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
# Set app extension | # Set app extension | ||||
@@ -213,6 +213,18 @@ HAVE_DGL = false | |||||
endif | endif | ||||
endif | endif | ||||
ifeq ($(UI_TYPE),opengl3) | |||||
ifeq ($(HAVE_OPENGL),true) | |||||
DGL_FLAGS += -DDGL_OPENGL -DDGL_USE_OPENGL3 -DHAVE_DGL | |||||
DGL_FLAGS += $(OPENGL_FLAGS) | |||||
DGL_LIBS += $(OPENGL_LIBS) | |||||
DGL_LIB = $(DPF_PATH)/build/libdgl-opengl3.a | |||||
HAVE_DGL = true | |||||
else | |||||
HAVE_DGL = false | |||||
endif | |||||
endif | |||||
ifeq ($(UI_TYPE),vulkan) | ifeq ($(UI_TYPE),vulkan) | ||||
ifeq ($(HAVE_VULKAN),true) | ifeq ($(HAVE_VULKAN),true) | ||||
DGL_FLAGS += -DDGL_VULKAN -DHAVE_DGL | DGL_FLAGS += -DDGL_VULKAN -DHAVE_DGL | ||||
@@ -313,6 +325,9 @@ $(DPF_PATH)/build/libdgl-cairo.a: | |||||
$(DPF_PATH)/build/libdgl-opengl.a: | $(DPF_PATH)/build/libdgl-opengl.a: | ||||
$(MAKE) -C $(DPF_PATH)/dgl opengl | $(MAKE) -C $(DPF_PATH)/dgl opengl | ||||
$(DPF_PATH)/build/libdgl-opengl3.a: | |||||
$(MAKE) -C $(DPF_PATH)/dgl opengl3 | |||||
$(DPF_PATH)/build/libdgl-stub.a: | $(DPF_PATH)/build/libdgl-stub.a: | ||||
$(MAKE) -C $(DPF_PATH)/dgl stub | $(MAKE) -C $(DPF_PATH)/dgl stub | ||||
@@ -13,22 +13,6 @@ BUILD_CXX_FLAGS += $(DGL_FLAGS) -I. -Isrc -DDONT_SET_USING_DGL_NAMESPACE -Wno-un | |||||
BUILD_CXX_FLAGS += -Isrc/pugl-upstream/include | BUILD_CXX_FLAGS += -Isrc/pugl-upstream/include | ||||
LINK_FLAGS += $(DGL_LIBS) | LINK_FLAGS += $(DGL_LIBS) | ||||
ifeq ($(NVG_DISABLE_SKIPPING_WHITESPACE),true) | |||||
BUILD_CXX_FLAGS += -DNVG_DISABLE_SKIPPING_WHITESPACE | |||||
endif | |||||
ifneq ($(NVG_FONT_TEXTURE_FLAGS),) | |||||
BUILD_CXX_FLAGS += -DNVG_FONT_TEXTURE_FLAGS=$(NVG_FONT_TEXTURE_FLAGS) | |||||
endif | |||||
ifeq ($(USE_OPENGL3),true) | |||||
BUILD_CXX_FLAGS += -DDGL_USE_OPENGL3 | |||||
endif | |||||
ifeq ($(USE_NANOVG_FBO),true) | |||||
BUILD_CXX_FLAGS += -DDGL_USE_NANOVG_FBO | |||||
endif | |||||
ifeq ($(USE_RGBA),true) | |||||
BUILD_CXX_FLAGS += -DDGL_USE_RGBA | |||||
endif | |||||
# TODO fix these after pugl-upstream is done | # TODO fix these after pugl-upstream is done | ||||
BUILD_CXX_FLAGS += -Wno-attributes -Wno-extra -Wno-missing-field-initializers | BUILD_CXX_FLAGS += -Wno-attributes -Wno-extra -Wno-missing-field-initializers | ||||
ifneq ($(MACOS),true) | ifneq ($(MACOS),true) | ||||
@@ -85,6 +69,18 @@ endif | |||||
# --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
OBJS_opengl3 = $(OBJS_common) \ | |||||
../build/dgl/OpenGL.cpp.opengl3.o \ | |||||
../build/dgl/NanoVG.cpp.opengl3.o | |||||
ifeq ($(MACOS),true) | |||||
OBJS_opengl3 += ../build/dgl/pugl.mm.opengl3.o | |||||
else | |||||
OBJS_opengl3 += ../build/dgl/pugl.cpp.opengl3.o | |||||
endif | |||||
# --------------------------------------------------------------------------------------------------------------------- | |||||
OBJS_stub = $(OBJS_common) | OBJS_stub = $(OBJS_common) | ||||
ifeq ($(MACOS),true) | ifeq ($(MACOS),true) | ||||
@@ -128,10 +124,11 @@ endif | |||||
all: $(TARGETS) | all: $(TARGETS) | ||||
cairo: ../build/libdgl-cairo.a | |||||
opengl: ../build/libdgl-opengl.a | |||||
stub: ../build/libdgl-stub.a | |||||
vulkan: ../build/libdgl-vulkan.a | |||||
cairo: ../build/libdgl-cairo.a | |||||
opengl: ../build/libdgl-opengl.a | |||||
opengl3: ../build/libdgl-opengl3.a | |||||
stub: ../build/libdgl-stub.a | |||||
vulkan: ../build/libdgl-vulkan.a | |||||
# --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
@@ -147,6 +144,12 @@ vulkan: ../build/libdgl-vulkan.a | |||||
$(SILENT)rm -f $@ | $(SILENT)rm -f $@ | ||||
$(SILENT)$(AR) crs $@ $^ | $(SILENT)$(AR) crs $@ $^ | ||||
../build/libdgl-opengl3.a: $(OBJS_opengl3) | |||||
-@mkdir -p ../build | |||||
@echo "Creating libdgl-opengl3.a" | |||||
$(SILENT)rm -f $@ | |||||
$(SILENT)$(AR) crs $@ $^ | |||||
../build/libdgl-stub.a: $(OBJS_stub) | ../build/libdgl-stub.a: $(OBJS_stub) | ||||
-@mkdir -p ../build | -@mkdir -p ../build | ||||
@echo "Creating libdgl-stub.a" | @echo "Creating libdgl-stub.a" | ||||
@@ -207,6 +210,18 @@ vulkan: ../build/libdgl-vulkan.a | |||||
# --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
../build/dgl/%.cpp.opengl3.o: src/%.cpp | |||||
-@mkdir -p ../build/dgl | |||||
@echo "Compiling $< (OpenGL variant)" | |||||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -DDGL_USE_OPENGL3 -c -o $@ | |||||
../build/dgl/%.mm.opengl3.o: src/%.mm | |||||
-@mkdir -p ../build/dgl | |||||
@echo "Compiling $< (OpenGL variant)" | |||||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -DDGL_USE_OPENGL3 -c -ObjC++ -o $@ | |||||
# --------------------------------------------------------------------------------------------------------------------- | |||||
../build/dgl/%.cpp.vulkan.o: src/%.cpp | ../build/dgl/%.cpp.vulkan.o: src/%.cpp | ||||
-@mkdir -p ../build/dgl | -@mkdir -p ../build/dgl | ||||
@echo "Compiling $< (Vulkan variant)" | @echo "Compiling $< (Vulkan variant)" | ||||
@@ -230,6 +245,7 @@ debug: | |||||
-include $(OBJS_common:%.o=%.d) | -include $(OBJS_common:%.o=%.d) | ||||
-include $(OBJS_cairo:%.o=%.d) | -include $(OBJS_cairo:%.o=%.d) | ||||
-include $(OBJS_opengl:%.o=%.d) | -include $(OBJS_opengl:%.o=%.d) | ||||
-include $(OBJS_opengl3:%.o=%.d) | |||||
-include $(OBJS_stub:%.o=%.d) | -include $(OBJS_stub:%.o=%.d) | ||||
-include $(OBJS_vulkan:%.o=%.d) | -include $(OBJS_vulkan:%.o=%.d) | ||||
@@ -33,6 +33,15 @@ | |||||
START_NAMESPACE_DGL | START_NAMESPACE_DGL | ||||
// ----------------------------------------------------------------------- | |||||
#ifdef DGL_USE_OPENGL3 | |||||
static void notImplemented(const char* const name) | |||||
{ | |||||
d_stderr2("OpenGL3 function not implemented: %s", name); | |||||
} | |||||
#endif | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Color | // Color | ||||
@@ -43,18 +52,22 @@ void Color::setFor(const GraphicsContext&, const bool includeAlpha) | |||||
glColor4f(red, green, blue, alpha); | glColor4f(red, green, blue, alpha); | ||||
else | else | ||||
glColor3f(red, green, blue); | glColor3f(red, green, blue); | ||||
#else | |||||
notImplemented("Color::setFor"); | |||||
// unused | |||||
(void)includeAlpha; | |||||
#endif | #endif | ||||
} | } | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Line | // Line | ||||
#ifndef DGL_USE_OPENGL3 | |||||
template<typename T> | template<typename T> | ||||
static void drawLine(const Point<T>& posStart, const Point<T>& posEnd) | static void drawLine(const Point<T>& posStart, const Point<T>& posEnd) | ||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(posStart != posEnd,); | DISTRHO_SAFE_ASSERT_RETURN(posStart != posEnd,); | ||||
#ifndef DGL_USE_OPENGL3 | |||||
glBegin(GL_LINES); | glBegin(GL_LINES); | ||||
{ | { | ||||
@@ -63,23 +76,31 @@ static void drawLine(const Point<T>& posStart, const Point<T>& posEnd) | |||||
} | } | ||||
glEnd(); | glEnd(); | ||||
#endif | |||||
} | } | ||||
#endif | |||||
template<typename T> | template<typename T> | ||||
void Line<T>::draw(const GraphicsContext&, const T width) | void Line<T>::draw(const GraphicsContext&, const T width) | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
DISTRHO_SAFE_ASSERT_RETURN(width != 0,); | DISTRHO_SAFE_ASSERT_RETURN(width != 0,); | ||||
glLineWidth(static_cast<GLfloat>(width)); | glLineWidth(static_cast<GLfloat>(width)); | ||||
drawLine<T>(posStart, posEnd); | drawLine<T>(posStart, posEnd); | ||||
#else | |||||
notImplemented("Line::draw"); | |||||
#endif | |||||
} | } | ||||
// deprecated calls | // deprecated calls | ||||
template<typename T> | template<typename T> | ||||
void Line<T>::draw() | void Line<T>::draw() | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawLine<T>(posStart, posEnd); | drawLine<T>(posStart, posEnd); | ||||
#else | |||||
notImplemented("Line::draw"); | |||||
#endif | |||||
} | } | ||||
template class Line<double>; | template class Line<double>; | ||||
@@ -92,6 +113,7 @@ template class Line<ushort>; | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Circle | // Circle | ||||
#ifndef DGL_USE_OPENGL3 | |||||
template<typename T> | template<typename T> | ||||
static void drawCircle(const Point<T>& pos, | static void drawCircle(const Point<T>& pos, | ||||
const uint numSegments, | const uint numSegments, | ||||
@@ -106,7 +128,6 @@ static void drawCircle(const Point<T>& pos, | |||||
const T origy = pos.getY(); | const T origy = pos.getY(); | ||||
double t, x = size, y = 0.0; | double t, x = size, y = 0.0; | ||||
#ifndef DGL_USE_OPENGL3 | |||||
glBegin(outline ? GL_LINE_LOOP : GL_POLYGON); | glBegin(outline ? GL_LINE_LOOP : GL_POLYGON); | ||||
for (uint i=0; i<numSegments; ++i) | for (uint i=0; i<numSegments; ++i) | ||||
@@ -119,13 +140,17 @@ static void drawCircle(const Point<T>& pos, | |||||
} | } | ||||
glEnd(); | glEnd(); | ||||
#endif | |||||
} | } | ||||
#endif | |||||
template<typename T> | template<typename T> | ||||
void Circle<T>::draw(const GraphicsContext&) | void Circle<T>::draw(const GraphicsContext&) | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, false); | drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, false); | ||||
#else | |||||
notImplemented("Circle::draw"); | |||||
#endif | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
@@ -134,20 +159,32 @@ void Circle<T>::drawOutline(const GraphicsContext&, const T lineWidth) | |||||
DISTRHO_SAFE_ASSERT_RETURN(lineWidth != 0,); | DISTRHO_SAFE_ASSERT_RETURN(lineWidth != 0,); | ||||
glLineWidth(static_cast<GLfloat>(lineWidth)); | glLineWidth(static_cast<GLfloat>(lineWidth)); | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, true); | drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, true); | ||||
#else | |||||
notImplemented("Circle::drawOutline"); | |||||
#endif | |||||
} | } | ||||
// deprecated calls | // deprecated calls | ||||
template<typename T> | template<typename T> | ||||
void Circle<T>::draw() | void Circle<T>::draw() | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, false); | drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, false); | ||||
#else | |||||
notImplemented("Circle::draw"); | |||||
#endif | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
void Circle<T>::drawOutline() | void Circle<T>::drawOutline() | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, true); | drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, true); | ||||
#else | |||||
notImplemented("Circle::drawOutline"); | |||||
#endif | |||||
} | } | ||||
template class Circle<double>; | template class Circle<double>; | ||||
@@ -160,6 +197,7 @@ template class Circle<ushort>; | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Triangle | // Triangle | ||||
#ifndef DGL_USE_OPENGL3 | |||||
template<typename T> | template<typename T> | ||||
static void drawTriangle(const Point<T>& pos1, | static void drawTriangle(const Point<T>& pos1, | ||||
const Point<T>& pos2, | const Point<T>& pos2, | ||||
@@ -168,7 +206,6 @@ static void drawTriangle(const Point<T>& pos1, | |||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(pos1 != pos2 && pos1 != pos3,); | DISTRHO_SAFE_ASSERT_RETURN(pos1 != pos2 && pos1 != pos3,); | ||||
#ifndef DGL_USE_OPENGL3 | |||||
glBegin(outline ? GL_LINE_LOOP : GL_TRIANGLES); | glBegin(outline ? GL_LINE_LOOP : GL_TRIANGLES); | ||||
{ | { | ||||
@@ -178,13 +215,17 @@ static void drawTriangle(const Point<T>& pos1, | |||||
} | } | ||||
glEnd(); | glEnd(); | ||||
#endif | |||||
} | } | ||||
#endif | |||||
template<typename T> | template<typename T> | ||||
void Triangle<T>::draw(const GraphicsContext&) | void Triangle<T>::draw(const GraphicsContext&) | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawTriangle<T>(pos1, pos2, pos3, false); | drawTriangle<T>(pos1, pos2, pos3, false); | ||||
#else | |||||
notImplemented("Triangle::draw"); | |||||
#endif | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
@@ -193,20 +234,32 @@ void Triangle<T>::drawOutline(const GraphicsContext&, const T lineWidth) | |||||
DISTRHO_SAFE_ASSERT_RETURN(lineWidth != 0,); | DISTRHO_SAFE_ASSERT_RETURN(lineWidth != 0,); | ||||
glLineWidth(static_cast<GLfloat>(lineWidth)); | glLineWidth(static_cast<GLfloat>(lineWidth)); | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawTriangle<T>(pos1, pos2, pos3, true); | drawTriangle<T>(pos1, pos2, pos3, true); | ||||
#else | |||||
notImplemented("Triangle::drawOutline"); | |||||
#endif | |||||
} | } | ||||
// deprecated calls | // deprecated calls | ||||
template<typename T> | template<typename T> | ||||
void Triangle<T>::draw() | void Triangle<T>::draw() | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawTriangle<T>(pos1, pos2, pos3, false); | drawTriangle<T>(pos1, pos2, pos3, false); | ||||
#else | |||||
notImplemented("Triangle::draw"); | |||||
#endif | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
void Triangle<T>::drawOutline() | void Triangle<T>::drawOutline() | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawTriangle<T>(pos1, pos2, pos3, true); | drawTriangle<T>(pos1, pos2, pos3, true); | ||||
#else | |||||
notImplemented("Triangle::drawOutline"); | |||||
#endif | |||||
} | } | ||||
template class Triangle<double>; | template class Triangle<double>; | ||||
@@ -219,12 +272,12 @@ template class Triangle<ushort>; | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Rectangle | // Rectangle | ||||
#ifndef DGL_USE_OPENGL3 | |||||
template<typename T> | template<typename T> | ||||
static void drawRectangle(const Rectangle<T>& rect, const bool outline) | static void drawRectangle(const Rectangle<T>& rect, const bool outline) | ||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(rect.isValid(),); | DISTRHO_SAFE_ASSERT_RETURN(rect.isValid(),); | ||||
#ifndef DGL_USE_OPENGL3 | |||||
glBegin(outline ? GL_LINE_LOOP : GL_QUADS); | glBegin(outline ? GL_LINE_LOOP : GL_QUADS); | ||||
{ | { | ||||
@@ -247,13 +300,17 @@ static void drawRectangle(const Rectangle<T>& rect, const bool outline) | |||||
} | } | ||||
glEnd(); | glEnd(); | ||||
#endif | |||||
} | } | ||||
#endif | |||||
template<typename T> | template<typename T> | ||||
void Rectangle<T>::draw(const GraphicsContext&) | void Rectangle<T>::draw(const GraphicsContext&) | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawRectangle<T>(*this, false); | drawRectangle<T>(*this, false); | ||||
#else | |||||
notImplemented("Rectangle::draw"); | |||||
#endif | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
@@ -262,20 +319,32 @@ void Rectangle<T>::drawOutline(const GraphicsContext&, const T lineWidth) | |||||
DISTRHO_SAFE_ASSERT_RETURN(lineWidth != 0,); | DISTRHO_SAFE_ASSERT_RETURN(lineWidth != 0,); | ||||
glLineWidth(static_cast<GLfloat>(lineWidth)); | glLineWidth(static_cast<GLfloat>(lineWidth)); | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawRectangle<T>(*this, true); | drawRectangle<T>(*this, true); | ||||
#else | |||||
notImplemented("Rectangle::drawOutline"); | |||||
#endif | |||||
} | } | ||||
// deprecated calls | // deprecated calls | ||||
template<typename T> | template<typename T> | ||||
void Rectangle<T>::draw() | void Rectangle<T>::draw() | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawRectangle<T>(*this, false); | drawRectangle<T>(*this, false); | ||||
#else | |||||
notImplemented("Rectangle::draw"); | |||||
#endif | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
void Rectangle<T>::drawOutline() | void Rectangle<T>::drawOutline() | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
drawRectangle<T>(*this, true); | drawRectangle<T>(*this, true); | ||||
#else | |||||
notImplemented("Rectangle::drawOutline"); | |||||
#endif | |||||
} | } | ||||
template class Rectangle<double>; | template class Rectangle<double>; | ||||
@@ -542,29 +611,33 @@ void ImageBaseKnob<OpenGLImage>::onDisplay() | |||||
pData->isReady = true; | pData->isReady = true; | ||||
} | } | ||||
#ifndef DGL_USE_OPENGL3 | |||||
const int w = static_cast<int>(getWidth()); | const int w = static_cast<int>(getWidth()); | ||||
const int h = static_cast<int>(getHeight()); | const int h = static_cast<int>(getHeight()); | ||||
if (pData->rotationAngle != 0) | if (pData->rotationAngle != 0) | ||||
{ | { | ||||
#ifndef DGL_USE_OPENGL3 | |||||
glPushMatrix(); | glPushMatrix(); | ||||
#endif | |||||
const int w2 = w/2; | const int w2 = w/2; | ||||
const int h2 = h/2; | const int h2 = h/2; | ||||
#ifndef DGL_USE_OPENGL3 | |||||
glTranslatef(static_cast<float>(w2), static_cast<float>(h2), 0.0f); | glTranslatef(static_cast<float>(w2), static_cast<float>(h2), 0.0f); | ||||
glRotatef(normValue*static_cast<float>(pData->rotationAngle), 0.0f, 0.0f, 1.0f); | glRotatef(normValue*static_cast<float>(pData->rotationAngle), 0.0f, 0.0f, 1.0f); | ||||
#endif | |||||
Rectangle<int>(-w2, -h2, w, h).draw(context); | Rectangle<int>(-w2, -h2, w, h).draw(context); | ||||
#ifndef DGL_USE_OPENGL3 | |||||
glPopMatrix(); | glPopMatrix(); | ||||
#endif | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
Rectangle<int>(0, 0, w, h).draw(context); | Rectangle<int>(0, 0, w, h).draw(context); | ||||
} | } | ||||
#endif | |||||
glBindTexture(GL_TEXTURE_2D, 0); | glBindTexture(GL_TEXTURE_2D, 0); | ||||
glDisable(GL_TEXTURE_2D); | glDisable(GL_TEXTURE_2D); | ||||
@@ -157,31 +157,170 @@ struct FONSttFontImpl { | |||||
}; | }; | ||||
typedef struct FONSttFontImpl FONSttFontImpl; | typedef struct FONSttFontImpl FONSttFontImpl; | ||||
static FT_Library ftLibrary; | |||||
#else | |||||
#define STB_TRUETYPE_IMPLEMENTATION | |||||
static void* fons__tmpalloc(size_t size, void* up); | |||||
static void fons__tmpfree(void* ptr, void* up); | |||||
#define STBTT_malloc(x,u) fons__tmpalloc(x,u) | |||||
#define STBTT_free(x,u) fons__tmpfree(x,u) | |||||
#include "stb_truetype.h" | |||||
struct FONSttFontImpl { | |||||
stbtt_fontinfo font; | |||||
}; | |||||
typedef struct FONSttFontImpl FONSttFontImpl; | |||||
#endif | |||||
#ifndef FONS_SCRATCH_BUF_SIZE | |||||
# define FONS_SCRATCH_BUF_SIZE 96000 | |||||
#endif | |||||
#ifndef FONS_HASH_LUT_SIZE | |||||
# define FONS_HASH_LUT_SIZE 256 | |||||
#endif | |||||
#ifndef FONS_INIT_FONTS | |||||
# define FONS_INIT_FONTS 4 | |||||
#endif | |||||
#ifndef FONS_INIT_GLYPHS | |||||
# define FONS_INIT_GLYPHS 256 | |||||
#endif | |||||
#ifndef FONS_INIT_ATLAS_NODES | |||||
# define FONS_INIT_ATLAS_NODES 256 | |||||
#endif | |||||
#ifndef FONS_VERTEX_COUNT | |||||
# define FONS_VERTEX_COUNT 1024 | |||||
#endif | |||||
#ifndef FONS_MAX_STATES | |||||
# define FONS_MAX_STATES 20 | |||||
#endif | |||||
#ifndef FONS_MAX_FALLBACKS | |||||
# define FONS_MAX_FALLBACKS 20 | |||||
#endif | |||||
static unsigned int fons__hashint(unsigned int a) | |||||
{ | |||||
a += ~(a<<15); | |||||
a ^= (a>>10); | |||||
a += (a<<3); | |||||
a ^= (a>>6); | |||||
a += ~(a<<11); | |||||
a ^= (a>>16); | |||||
return a; | |||||
} | |||||
static int fons__mini(int a, int b) | |||||
{ | |||||
return a < b ? a : b; | |||||
} | |||||
static int fons__maxi(int a, int b) | |||||
{ | |||||
return a > b ? a : b; | |||||
} | |||||
struct FONSglyph | |||||
{ | |||||
unsigned int codepoint; | |||||
int index; | |||||
int next; | |||||
short size, blur; | |||||
short x0,y0,x1,y1; | |||||
short xadv,xoff,yoff; | |||||
}; | |||||
typedef struct FONSglyph FONSglyph; | |||||
struct FONSfont | |||||
{ | |||||
FONSttFontImpl font; | |||||
char name[64]; | |||||
unsigned char* data; | |||||
int dataSize; | |||||
unsigned char freeData; | |||||
float ascender; | |||||
float descender; | |||||
float lineh; | |||||
FONSglyph* glyphs; | |||||
int cglyphs; | |||||
int nglyphs; | |||||
int lut[FONS_HASH_LUT_SIZE]; | |||||
int fallbacks[FONS_MAX_FALLBACKS]; | |||||
int nfallbacks; | |||||
}; | |||||
typedef struct FONSfont FONSfont; | |||||
struct FONSstate | |||||
{ | |||||
int font; | |||||
int align; | |||||
float size; | |||||
unsigned int color; | |||||
float blur; | |||||
float spacing; | |||||
}; | |||||
typedef struct FONSstate FONSstate; | |||||
struct FONSatlasNode { | |||||
short x, y, width; | |||||
}; | |||||
typedef struct FONSatlasNode FONSatlasNode; | |||||
struct FONSatlas | |||||
{ | |||||
int width, height; | |||||
FONSatlasNode* nodes; | |||||
int nnodes; | |||||
int cnodes; | |||||
}; | |||||
typedef struct FONSatlas FONSatlas; | |||||
struct FONScontext | |||||
{ | |||||
FONSparams params; | |||||
float itw,ith; | |||||
unsigned char* texData; | |||||
int dirtyRect[4]; | |||||
FONSfont** fonts; | |||||
FONSatlas* atlas; | |||||
int cfonts; | |||||
int nfonts; | |||||
float verts[FONS_VERTEX_COUNT*2]; | |||||
float tcoords[FONS_VERTEX_COUNT*2]; | |||||
unsigned int colors[FONS_VERTEX_COUNT]; | |||||
int nverts; | |||||
unsigned char* scratch; | |||||
int nscratch; | |||||
FONSstate states[FONS_MAX_STATES]; | |||||
int nstates; | |||||
void (*handleError)(void* uptr, int error, int val); | |||||
void* errorUptr; | |||||
#ifdef FONS_USE_FREETYPE | |||||
FT_Library ftLibrary; | |||||
#endif | |||||
}; | |||||
#ifdef FONS_USE_FREETYPE | |||||
int fons__tt_init(FONScontext *context) | int fons__tt_init(FONScontext *context) | ||||
{ | { | ||||
FT_Error ftError; | FT_Error ftError; | ||||
FONS_NOTUSED(context); | |||||
ftError = FT_Init_FreeType(&ftLibrary); | |||||
ftError = FT_Init_FreeType(&context->ftLibrary); | |||||
return ftError == 0; | return ftError == 0; | ||||
} | } | ||||
int fons__tt_done(FONScontext *context) | int fons__tt_done(FONScontext *context) | ||||
{ | { | ||||
FT_Error ftError; | FT_Error ftError; | ||||
FONS_NOTUSED(context); | |||||
ftError = FT_Done_FreeType(ftLibrary); | |||||
ftError = FT_Done_FreeType(context->ftLibrary); | |||||
return ftError == 0; | return ftError == 0; | ||||
} | } | ||||
int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char *data, int dataSize, int fontIndex) | int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char *data, int dataSize, int fontIndex) | ||||
{ | { | ||||
FT_Error ftError; | FT_Error ftError; | ||||
FONS_NOTUSED(context); | |||||
//font->font.userdata = stash; | //font->font.userdata = stash; | ||||
ftError = FT_New_Memory_Face(ftLibrary, (const FT_Byte*)data, dataSize, fontIndex, &font->font); | |||||
ftError = FT_New_Memory_Face(context->ftLibrary, (const FT_Byte*)data, dataSize, fontIndex, &font->font); | |||||
return ftError == 0; | return ftError == 0; | ||||
} | } | ||||
@@ -269,18 +408,6 @@ int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2) | |||||
#else | #else | ||||
#define STB_TRUETYPE_IMPLEMENTATION | |||||
static void* fons__tmpalloc(size_t size, void* up); | |||||
static void fons__tmpfree(void* ptr, void* up); | |||||
#define STBTT_malloc(x,u) fons__tmpalloc(x,u) | |||||
#define STBTT_free(x,u) fons__tmpfree(x,u) | |||||
#include "stb_truetype.h" | |||||
struct FONSttFontImpl { | |||||
stbtt_fontinfo font; | |||||
}; | |||||
typedef struct FONSttFontImpl FONSttFontImpl; | |||||
int fons__tt_init(FONScontext *context) | int fons__tt_init(FONScontext *context) | ||||
{ | { | ||||
FONS_NOTUSED(context); | FONS_NOTUSED(context); | ||||
@@ -350,129 +477,6 @@ int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2) | |||||
#endif | #endif | ||||
#ifndef FONS_SCRATCH_BUF_SIZE | |||||
# define FONS_SCRATCH_BUF_SIZE 96000 | |||||
#endif | |||||
#ifndef FONS_HASH_LUT_SIZE | |||||
# define FONS_HASH_LUT_SIZE 256 | |||||
#endif | |||||
#ifndef FONS_INIT_FONTS | |||||
# define FONS_INIT_FONTS 4 | |||||
#endif | |||||
#ifndef FONS_INIT_GLYPHS | |||||
# define FONS_INIT_GLYPHS 256 | |||||
#endif | |||||
#ifndef FONS_INIT_ATLAS_NODES | |||||
# define FONS_INIT_ATLAS_NODES 256 | |||||
#endif | |||||
#ifndef FONS_VERTEX_COUNT | |||||
# define FONS_VERTEX_COUNT 1024 | |||||
#endif | |||||
#ifndef FONS_MAX_STATES | |||||
# define FONS_MAX_STATES 20 | |||||
#endif | |||||
#ifndef FONS_MAX_FALLBACKS | |||||
# define FONS_MAX_FALLBACKS 20 | |||||
#endif | |||||
static unsigned int fons__hashint(unsigned int a) | |||||
{ | |||||
a += ~(a<<15); | |||||
a ^= (a>>10); | |||||
a += (a<<3); | |||||
a ^= (a>>6); | |||||
a += ~(a<<11); | |||||
a ^= (a>>16); | |||||
return a; | |||||
} | |||||
static int fons__mini(int a, int b) | |||||
{ | |||||
return a < b ? a : b; | |||||
} | |||||
static int fons__maxi(int a, int b) | |||||
{ | |||||
return a > b ? a : b; | |||||
} | |||||
struct FONSglyph | |||||
{ | |||||
unsigned int codepoint; | |||||
int index; | |||||
int next; | |||||
short size, blur; | |||||
short x0,y0,x1,y1; | |||||
short xadv,xoff,yoff; | |||||
}; | |||||
typedef struct FONSglyph FONSglyph; | |||||
struct FONSfont | |||||
{ | |||||
FONSttFontImpl font; | |||||
char name[64]; | |||||
unsigned char* data; | |||||
int dataSize; | |||||
unsigned char freeData; | |||||
float ascender; | |||||
float descender; | |||||
float lineh; | |||||
FONSglyph* glyphs; | |||||
int cglyphs; | |||||
int nglyphs; | |||||
int lut[FONS_HASH_LUT_SIZE]; | |||||
int fallbacks[FONS_MAX_FALLBACKS]; | |||||
int nfallbacks; | |||||
}; | |||||
typedef struct FONSfont FONSfont; | |||||
struct FONSstate | |||||
{ | |||||
int font; | |||||
int align; | |||||
float size; | |||||
unsigned int color; | |||||
float blur; | |||||
float spacing; | |||||
}; | |||||
typedef struct FONSstate FONSstate; | |||||
struct FONSatlasNode { | |||||
short x, y, width; | |||||
}; | |||||
typedef struct FONSatlasNode FONSatlasNode; | |||||
struct FONSatlas | |||||
{ | |||||
int width, height; | |||||
FONSatlasNode* nodes; | |||||
int nnodes; | |||||
int cnodes; | |||||
}; | |||||
typedef struct FONSatlas FONSatlas; | |||||
struct FONScontext | |||||
{ | |||||
FONSparams params; | |||||
float itw,ith; | |||||
unsigned char* texData; | |||||
int dirtyRect[4]; | |||||
FONSfont** fonts; | |||||
FONSatlas* atlas; | |||||
int cfonts; | |||||
int nfonts; | |||||
float verts[FONS_VERTEX_COUNT*2]; | |||||
float tcoords[FONS_VERTEX_COUNT*2]; | |||||
unsigned int colors[FONS_VERTEX_COUNT]; | |||||
int nverts; | |||||
unsigned char* scratch; | |||||
int nscratch; | |||||
FONSstate states[FONS_MAX_STATES]; | |||||
int nstates; | |||||
void (*handleError)(void* uptr, int error, int val); | |||||
void* errorUptr; | |||||
}; | |||||
#ifdef STB_TRUETYPE_IMPLEMENTATION | #ifdef STB_TRUETYPE_IMPLEMENTATION | ||||
static void* fons__tmpalloc(size_t size, void* up) | static void* fons__tmpalloc(size_t size, void* up) | ||||
@@ -1684,8 +1688,8 @@ void fonsDeleteInternal(FONScontext* stash) | |||||
if (stash->fonts) free(stash->fonts); | if (stash->fonts) free(stash->fonts); | ||||
if (stash->texData) free(stash->texData); | if (stash->texData) free(stash->texData); | ||||
if (stash->scratch) free(stash->scratch); | if (stash->scratch) free(stash->scratch); | ||||
free(stash); | |||||
fons__tt_done(stash); | fons__tt_done(stash); | ||||
free(stash); | |||||
} | } | ||||
void fonsSetErrorCallback(FONScontext* stash, void (*callback)(void* uptr, int error, int val), void* uptr) | void fonsSetErrorCallback(FONScontext* stash, void (*callback)(void* uptr, int error, int val), void* uptr) | ||||
@@ -189,7 +189,7 @@ public: | |||||
sendNoteCallback, | sendNoteCallback, | ||||
setSizeCallback, | setSizeCallback, | ||||
nullptr, // TODO file request | nullptr, // TODO file request | ||||
nullptr, | |||||
d_nextBundlePath, | |||||
plugin->getInstancePointer(), | plugin->getInstancePointer(), | ||||
scaleFactor) | scaleFactor) | ||||
# if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | # if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | ||||
@@ -705,7 +705,7 @@ public: | |||||
else | else | ||||
{ | { | ||||
UIExporter tmpUI(nullptr, 0, fPlugin.getSampleRate(), | UIExporter tmpUI(nullptr, 0, fPlugin.getSampleRate(), | ||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | |||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, d_nextBundlePath, | |||||
fPlugin.getInstancePointer(), fLastScaleFactor); | fPlugin.getInstancePointer(), fLastScaleFactor); | ||||
fVstRect.right = tmpUI.getWidth(); | fVstRect.right = tmpUI.getWidth(); | ||||
fVstRect.bottom = tmpUI.getHeight(); | fVstRect.bottom = tmpUI.getHeight(); | ||||
@@ -62,6 +62,7 @@ public: | |||||
uiData(new UI::PrivateData()) | uiData(new UI::PrivateData()) | ||||
{ | { | ||||
uiData->sampleRate = sampleRate; | uiData->sampleRate = sampleRate; | ||||
uiData->bundlePath = bundlePath != nullptr ? strdup(bundlePath) : nullptr; | |||||
uiData->dspPtr = dspPtr; | uiData->dspPtr = dspPtr; | ||||
uiData->bgColor = bgColor; | uiData->bgColor = bgColor; | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* DISTRHO Plugin Framework (DPF) | * DISTRHO Plugin Framework (DPF) | ||||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | * Permission to use, copy, modify, and/or distribute this software for any purpose with | ||||
* or without fee is hereby granted, provided that the above copyright notice and this | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
@@ -47,6 +47,11 @@ static constexpr const sendNoteFunc sendNoteCallback = nullptr; | |||||
static constexpr const setStateFunc setStateCallback = nullptr; | static constexpr const setStateFunc setStateCallback = nullptr; | ||||
#endif | #endif | ||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
// Static data, see DistrhoPlugin.cpp | |||||
extern const char* d_nextBundlePath; | |||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
// Utility functions (defined on plugin side) | // Utility functions (defined on plugin side) | ||||
@@ -129,7 +134,7 @@ public: | |||||
sendNoteCallback, | sendNoteCallback, | ||||
setSizeCallback, | setSizeCallback, | ||||
nullptr, // TODO file request | nullptr, // TODO file request | ||||
nullptr, // bundlePath | |||||
d_nextBundlePath, | |||||
instancePointer, | instancePointer, | ||||
scaleFactor) | scaleFactor) | ||||
{ | { | ||||
@@ -22,7 +22,7 @@ | |||||
#define DISTRHO_PLUGIN_NAME "Nekobi" | #define DISTRHO_PLUGIN_NAME "Nekobi" | ||||
#define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/Nekobi" | #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/Nekobi" | ||||
#define DISTRHO_PLUGIN_HAS_UI 0 | |||||
#define DISTRHO_PLUGIN_HAS_UI 1 | |||||
#define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
#define DISTRHO_PLUGIN_IS_SYNTH 1 | #define DISTRHO_PLUGIN_IS_SYNTH 1 | ||||
#define DISTRHO_PLUGIN_NUM_INPUTS 0 | #define DISTRHO_PLUGIN_NUM_INPUTS 0 | ||||
@@ -15,7 +15,7 @@ NAME = Nekobi | |||||
FILES_DSP = \ | FILES_DSP = \ | ||||
DistrhoPluginNekobi.cpp | DistrhoPluginNekobi.cpp | ||||
FILES_UIxx = \ | |||||
FILES_UI = \ | |||||
DistrhoArtworkNekobi.cpp \ | DistrhoArtworkNekobi.cpp \ | ||||
DistrhoUINekobi.cpp | DistrhoUINekobi.cpp | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* DISTRHO ProM Plugin | * DISTRHO ProM Plugin | ||||
* Copyright (C) 2015-2021 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2015-2022 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
@@ -26,77 +26,16 @@ | |||||
#include "DistrhoPluginProM.hpp" | #include "DistrhoPluginProM.hpp" | ||||
#include "DistrhoUIProM.hpp" | #include "DistrhoUIProM.hpp" | ||||
#ifndef DISTRHO_OS_WINDOWS | |||||
# include <dlfcn.h> | |||||
#endif | |||||
#ifdef DISTRHO_OS_WINDOWS | |||||
static HINSTANCE hInstance = nullptr; | |||||
DISTRHO_PLUGIN_EXPORT | |||||
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID) | |||||
{ | |||||
if (reason == DLL_PROCESS_ATTACH) | |||||
hInstance = hInst; | |||||
return 1; | |||||
} | |||||
#endif | |||||
#include "DistrhoPluginUtils.hpp" | |||||
START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
static String getCurrentExecutableDataDir() | |||||
{ | |||||
static String datadir; | |||||
if (datadir.isNotEmpty()) | |||||
return datadir; | |||||
#ifdef DISTRHO_OS_WINDOWS | |||||
CHAR filename[MAX_PATH + 256]; | |||||
filename[0] = '\0'; | |||||
GetModuleFileName(hInstance, filename, sizeof(filename)); | |||||
datadir = String(filename); | |||||
datadir.truncate(datadir.rfind('\\')); | |||||
#else | |||||
Dl_info info; | |||||
dladdr((void*)getCurrentExecutableDataDir, &info); | |||||
datadir = String(info.dli_fname); | |||||
datadir.truncate(datadir.rfind('/')); | |||||
# ifdef DISTRHO_OS_MAC | |||||
if (datadir.endsWith("/MacOS")) | |||||
{ | |||||
datadir.truncate(datadir.rfind('/')); | |||||
datadir += "/Resources"; | |||||
} | |||||
else | |||||
# endif | |||||
if (datadir.endsWith("/x86_64-linux")) | |||||
{ | |||||
datadir.truncate(datadir.rfind('/')); | |||||
datadir += "/Resources"; | |||||
} | |||||
else | |||||
#endif | |||||
{ | |||||
datadir += "/resources"; | |||||
} | |||||
return datadir; | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
DistrhoUIProM::DistrhoUIProM() | DistrhoUIProM::DistrhoUIProM() | ||||
: UI(512, 512), | : UI(512, 512), | ||||
fPM(nullptr) | |||||
#ifndef DGL_USE_OPENGL3 | |||||
, fResizeHandle(this) | |||||
#endif | |||||
fPM(nullptr), | |||||
fResizeHandle(this) | |||||
{ | { | ||||
const double scaleFactor = getScaleFactor(); | const double scaleFactor = getScaleFactor(); | ||||
@@ -106,10 +45,8 @@ DistrhoUIProM::DistrhoUIProM() | |||||
setGeometryConstraints(256*scaleFactor, 256*scaleFactor, true); | setGeometryConstraints(256*scaleFactor, 256*scaleFactor, true); | ||||
// no need to show resize handle if window is user-resizable | // no need to show resize handle if window is user-resizable | ||||
#ifndef DGL_USE_OPENGL3 | |||||
// if (isResizable()) | // if (isResizable()) | ||||
// fResizeHandle.hide(); | // fResizeHandle.hide(); | ||||
#endif | |||||
} | } | ||||
DistrhoUIProM::~DistrhoUIProM() | DistrhoUIProM::~DistrhoUIProM() | ||||
@@ -151,7 +88,7 @@ void DistrhoUIProM::uiIdle() | |||||
} | } | ||||
} | } | ||||
void DistrhoUIProM::uiReshape(uint width, uint height) | |||||
void DistrhoUIProM::uiReshape(const uint width, const uint height) | |||||
{ | { | ||||
UI::uiReshape(width, height); | UI::uiReshape(width, height); | ||||
@@ -160,19 +97,27 @@ void DistrhoUIProM::uiReshape(uint width, uint height) | |||||
#ifdef PROJECTM_DATA_DIR | #ifdef PROJECTM_DATA_DIR | ||||
fPM = new projectM(PROJECTM_DATA_DIR "/config.inp"); | fPM = new projectM(PROJECTM_DATA_DIR "/config.inp"); | ||||
#else | #else | ||||
const String datadir(getCurrentExecutableDataDir()); | |||||
d_stdout("ProM datadir: '%s'", datadir.buffer()); | |||||
projectM::Settings settings; | |||||
settings.presetURL = datadir + DISTRHO_OS_SEP_STR "presets"; | |||||
settings.titleFontURL = datadir + DISTRHO_OS_SEP_STR "fonts" DISTRHO_OS_SEP_STR "Vera.ttf"; | |||||
settings.menuFontURL = datadir + DISTRHO_OS_SEP_STR "fonts" DISTRHO_OS_SEP_STR "VeraMono.ttf"; | |||||
settings.datadir = datadir; | |||||
fPM = new projectM(settings); | |||||
if (const char* const bundlePath = getBundlePath()) | |||||
{ | |||||
const String datadir(getResourcePath(bundlePath)); | |||||
d_stdout("ProM datadir: '%s'", datadir.buffer()); | |||||
projectM::Settings settings; | |||||
settings.presetURL = datadir + DISTRHO_OS_SEP_STR "presets"; | |||||
settings.titleFontURL = datadir + DISTRHO_OS_SEP_STR "fonts" DISTRHO_OS_SEP_STR "Vera.ttf"; | |||||
settings.menuFontURL = datadir + DISTRHO_OS_SEP_STR "fonts" DISTRHO_OS_SEP_STR "VeraMono.ttf"; | |||||
settings.datadir = datadir; | |||||
fPM = new projectM(settings); | |||||
} | |||||
else | |||||
{ | |||||
d_stderr2("ProM: failed to find bundle path, UI will be empty"); | |||||
} | |||||
#endif | #endif | ||||
} | } | ||||
fPM->projectM_resetGL(width, height); | |||||
if (fPM != nullptr) | |||||
fPM->projectM_resetGL(width, height); | |||||
} | } | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
@@ -184,6 +129,9 @@ void DistrhoUIProM::onDisplay() | |||||
return; | return; | ||||
fPM->renderFrame(); | fPM->renderFrame(); | ||||
// some projectM versions do not turn off the last set GL program | |||||
glUseProgram(0); | |||||
} | } | ||||
static projectMKeycode dgl2pmkey(const DGL_NAMESPACE::Key key) noexcept | static projectMKeycode dgl2pmkey(const DGL_NAMESPACE::Key key) noexcept | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* DISTRHO ProM Plugin | * DISTRHO ProM Plugin | ||||
* Copyright (C) 2015-2021 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2015-2022 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
@@ -17,15 +17,8 @@ | |||||
#ifndef DISTRHO_UI_PROM_HPP_INCLUDED | #ifndef DISTRHO_UI_PROM_HPP_INCLUDED | ||||
#define DISTRHO_UI_PROM_HPP_INCLUDED | #define DISTRHO_UI_PROM_HPP_INCLUDED | ||||
#ifdef DISTRHO_OS_MAC | |||||
# define DGL_USE_OPENGL3 | |||||
#endif | |||||
#include "DistrhoUI.hpp" | #include "DistrhoUI.hpp" | ||||
#ifndef DGL_USE_OPENGL3 | |||||
# include "ResizeHandle.hpp" | |||||
#endif | |||||
#include "ResizeHandle.hpp" | |||||
class projectM; | class projectM; | ||||
@@ -59,9 +52,7 @@ protected: | |||||
private: | private: | ||||
ScopedPointer<projectM> fPM; | ScopedPointer<projectM> fPM; | ||||
#ifndef DGL_USE_OPENGL3 | |||||
ResizeHandle fResizeHandle; | ResizeHandle fResizeHandle; | ||||
#endif | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUIProM) | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUIProM) | ||||
}; | }; | ||||
@@ -26,6 +26,7 @@ HAVE_PROJECTM = $(shell pkg-config --exists libprojectM && echo true) | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Import base definitions | # Import base definitions | ||||
FILE_BROWSER_DISABLED = true | |||||
include ../../dpf/Makefile.base.mk | include ../../dpf/Makefile.base.mk | ||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
@@ -105,6 +106,8 @@ endif # !HAVE_PROJECTM | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Do some magic | # Do some magic | ||||
UI_TYPE = opengl3 | |||||
USE_VST2_BUNDLE = true | |||||
include ../../dpf/Makefile.plugins.mk | include ../../dpf/Makefile.plugins.mk | ||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Resize handle for DPF | * Resize handle for DPF | ||||
* Copyright (C) 2021 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | * Permission to use, copy, modify, and/or distribute this software for any purpose with | ||||
* or without fee is hereby granted, provided that the above copyright notice and this | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
@@ -29,7 +29,8 @@ public: | |||||
explicit ResizeHandle(Window& window) | explicit ResizeHandle(Window& window) | ||||
: TopLevelWidget(window), | : TopLevelWidget(window), | ||||
handleSize(16), | handleSize(16), | ||||
resizing(false) | |||||
hasCursor(false), | |||||
isResizing(false) | |||||
{ | { | ||||
resetArea(); | resetArea(); | ||||
} | } | ||||
@@ -38,12 +39,14 @@ public: | |||||
explicit ResizeHandle(TopLevelWidget* const tlw) | explicit ResizeHandle(TopLevelWidget* const tlw) | ||||
: TopLevelWidget(tlw->getWindow()), | : TopLevelWidget(tlw->getWindow()), | ||||
handleSize(16), | handleSize(16), | ||||
resizing(false) | |||||
hasCursor(false), | |||||
isResizing(false) | |||||
{ | { | ||||
resetArea(); | resetArea(); | ||||
} | } | ||||
/** Set the handle size, minimum 16. */ | |||||
/** Set the handle size, minimum 16. | |||||
* Scale factor is automatically applied on top of this size as needed */ | |||||
void setHandleSize(const uint size) | void setHandleSize(const uint size) | ||||
{ | { | ||||
handleSize = std::max(16u, size); | handleSize = std::max(16u, size); | ||||
@@ -53,15 +56,14 @@ public: | |||||
protected: | protected: | ||||
void onDisplay() override | void onDisplay() override | ||||
{ | { | ||||
// TODO implement gl3 stuff in DPF | |||||
#ifndef DGL_USE_OPENGL3 | |||||
const GraphicsContext& context(getGraphicsContext()); | const GraphicsContext& context(getGraphicsContext()); | ||||
const double lineWidth = 1.0 * getScaleFactor(); | const double lineWidth = 1.0 * getScaleFactor(); | ||||
#ifdef DGL_OPENGL | |||||
glUseProgram(0); | |||||
# ifndef DGL_USE_OPENGL3 | |||||
#if defined(DGL_OPENGL) && !defined(DGL_USE_OPENGL3) | |||||
glMatrixMode(GL_MODELVIEW); | glMatrixMode(GL_MODELVIEW); | ||||
# endif | |||||
#endif | |||||
#endif | |||||
// draw white lines, 1px wide | // draw white lines, 1px wide | ||||
Color(1.0f, 1.0f, 1.0f).setFor(context); | Color(1.0f, 1.0f, 1.0f).setFor(context); | ||||
@@ -78,6 +80,7 @@ protected: | |||||
l1b.draw(context, lineWidth); | l1b.draw(context, lineWidth); | ||||
l2b.draw(context, lineWidth); | l2b.draw(context, lineWidth); | ||||
l3b.draw(context, lineWidth); | l3b.draw(context, lineWidth); | ||||
#endif | |||||
} | } | ||||
bool onMouse(const MouseEvent& ev) override | bool onMouse(const MouseEvent& ev) override | ||||
@@ -87,15 +90,16 @@ protected: | |||||
if (ev.press && area.contains(ev.pos)) | if (ev.press && area.contains(ev.pos)) | ||||
{ | { | ||||
resizing = true; | |||||
isResizing = true; | |||||
resizingSize = Size<double>(getWidth(), getHeight()); | resizingSize = Size<double>(getWidth(), getHeight()); | ||||
lastResizePoint = ev.pos; | lastResizePoint = ev.pos; | ||||
return true; | return true; | ||||
} | } | ||||
if (resizing && ! ev.press) | |||||
if (isResizing && ! ev.press) | |||||
{ | { | ||||
resizing = false; | |||||
isResizing = false; | |||||
recheckCursor(ev.pos); | |||||
return true; | return true; | ||||
} | } | ||||
@@ -104,8 +108,11 @@ protected: | |||||
bool onMotion(const MotionEvent& ev) override | bool onMotion(const MotionEvent& ev) override | ||||
{ | { | ||||
if (! resizing) | |||||
if (! isResizing) | |||||
{ | |||||
recheckCursor(ev.pos); | |||||
return false; | return false; | ||||
} | |||||
const Size<double> offset(ev.pos.getX() - lastResizePoint.getX(), | const Size<double> offset(ev.pos.getX() - lastResizePoint.getX(), | ||||
ev.pos.getY() - lastResizePoint.getY()); | ev.pos.getY() - lastResizePoint.getY()); | ||||
@@ -113,9 +120,11 @@ protected: | |||||
resizingSize += offset; | resizingSize += offset; | ||||
lastResizePoint = ev.pos; | lastResizePoint = ev.pos; | ||||
// TODO min width, min height | |||||
const uint minWidth = 16; | |||||
const uint minHeight = 16; | |||||
// TODO keepAspectRatio | |||||
bool keepAspectRatio; | |||||
const Size<uint> minSize(getWindow().getGeometryConstraints(keepAspectRatio)); | |||||
const uint minWidth = minSize.getWidth(); | |||||
const uint minHeight = minSize.getHeight(); | |||||
if (resizingSize.getWidth() < minWidth) | if (resizingSize.getWidth() < minWidth) | ||||
resizingSize.setWidth(minWidth); | resizingSize.setWidth(minWidth); | ||||
@@ -142,10 +151,21 @@ private: | |||||
uint handleSize; | uint handleSize; | ||||
// event handling state | // event handling state | ||||
bool resizing; | |||||
bool hasCursor, isResizing; | |||||
Point<double> lastResizePoint; | Point<double> lastResizePoint; | ||||
Size<double> resizingSize; | Size<double> resizingSize; | ||||
void recheckCursor(const Point<double>& pos) | |||||
{ | |||||
const bool shouldHaveCursor = area.contains(pos); | |||||
if (shouldHaveCursor == hasCursor) | |||||
return; | |||||
hasCursor = shouldHaveCursor; | |||||
setCursor(shouldHaveCursor ? kMouseCursorDiagonal : kMouseCursorArrow); | |||||
} | |||||
void resetArea() | void resetArea() | ||||
{ | { | ||||
const double scaleFactor = getScaleFactor(); | const double scaleFactor = getScaleFactor(); | ||||
@@ -3,7 +3,7 @@ | |||||
* Copyright (C) 1998-2000 Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies | * Copyright (C) 1998-2000 Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies | ||||
* Copyright (C) 2000 Christian Zander <phoenix@minion.de> | * Copyright (C) 2000 Christian Zander <phoenix@minion.de> | ||||
* Copyright (C) 2015 Nedko Arnaudov | * Copyright (C) 2015 Nedko Arnaudov | ||||
* Copyright (C) 2016-2021 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2016-2022 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -30,7 +30,12 @@ DistrhoUIGLBars::DistrhoUIGLBars() | |||||
fInitialized(false), | fInitialized(false), | ||||
fResizeHandle(this) | fResizeHandle(this) | ||||
{ | { | ||||
setGeometryConstraints(256, 256, true); | |||||
const double scaleFactor = getScaleFactor(); | |||||
if (d_isNotZero(scaleFactor)) | |||||
setSize(512*scaleFactor, 512*scaleFactor); | |||||
setGeometryConstraints(256*scaleFactor, 256*scaleFactor, true); | |||||
// no need to show resize handle if window is user-resizable | // no need to show resize handle if window is user-resizable | ||||
if (isResizable()) | if (isResizable()) | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Resize handle for DPF | * Resize handle for DPF | ||||
* Copyright (C) 2021 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | * Permission to use, copy, modify, and/or distribute this software for any purpose with | ||||
* or without fee is hereby granted, provided that the above copyright notice and this | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
@@ -29,7 +29,8 @@ public: | |||||
explicit ResizeHandle(Window& window) | explicit ResizeHandle(Window& window) | ||||
: TopLevelWidget(window), | : TopLevelWidget(window), | ||||
handleSize(16), | handleSize(16), | ||||
resizing(false) | |||||
hasCursor(false), | |||||
isResizing(false) | |||||
{ | { | ||||
resetArea(); | resetArea(); | ||||
} | } | ||||
@@ -38,12 +39,14 @@ public: | |||||
explicit ResizeHandle(TopLevelWidget* const tlw) | explicit ResizeHandle(TopLevelWidget* const tlw) | ||||
: TopLevelWidget(tlw->getWindow()), | : TopLevelWidget(tlw->getWindow()), | ||||
handleSize(16), | handleSize(16), | ||||
resizing(false) | |||||
hasCursor(false), | |||||
isResizing(false) | |||||
{ | { | ||||
resetArea(); | resetArea(); | ||||
} | } | ||||
/** Set the handle size, minimum 16. */ | |||||
/** Set the handle size, minimum 16. | |||||
* Scale factor is automatically applied on top of this size as needed */ | |||||
void setHandleSize(const uint size) | void setHandleSize(const uint size) | ||||
{ | { | ||||
handleSize = std::max(16u, size); | handleSize = std::max(16u, size); | ||||
@@ -53,12 +56,14 @@ public: | |||||
protected: | protected: | ||||
void onDisplay() override | void onDisplay() override | ||||
{ | { | ||||
// TODO implement gl3 stuff in DPF | |||||
#ifndef DGL_USE_OPENGL3 | |||||
const GraphicsContext& context(getGraphicsContext()); | const GraphicsContext& context(getGraphicsContext()); | ||||
const double lineWidth = 1.0 * getScaleFactor(); | const double lineWidth = 1.0 * getScaleFactor(); | ||||
#ifdef DGL_OPENGL | |||||
#if defined(DGL_OPENGL) && !defined(DGL_USE_OPENGL3) | |||||
glMatrixMode(GL_MODELVIEW); | glMatrixMode(GL_MODELVIEW); | ||||
#endif | |||||
#endif | |||||
// draw white lines, 1px wide | // draw white lines, 1px wide | ||||
Color(1.0f, 1.0f, 1.0f).setFor(context); | Color(1.0f, 1.0f, 1.0f).setFor(context); | ||||
@@ -75,6 +80,7 @@ protected: | |||||
l1b.draw(context, lineWidth); | l1b.draw(context, lineWidth); | ||||
l2b.draw(context, lineWidth); | l2b.draw(context, lineWidth); | ||||
l3b.draw(context, lineWidth); | l3b.draw(context, lineWidth); | ||||
#endif | |||||
} | } | ||||
bool onMouse(const MouseEvent& ev) override | bool onMouse(const MouseEvent& ev) override | ||||
@@ -84,15 +90,16 @@ protected: | |||||
if (ev.press && area.contains(ev.pos)) | if (ev.press && area.contains(ev.pos)) | ||||
{ | { | ||||
resizing = true; | |||||
isResizing = true; | |||||
resizingSize = Size<double>(getWidth(), getHeight()); | resizingSize = Size<double>(getWidth(), getHeight()); | ||||
lastResizePoint = ev.pos; | lastResizePoint = ev.pos; | ||||
return true; | return true; | ||||
} | } | ||||
if (resizing && ! ev.press) | |||||
if (isResizing && ! ev.press) | |||||
{ | { | ||||
resizing = false; | |||||
isResizing = false; | |||||
recheckCursor(ev.pos); | |||||
return true; | return true; | ||||
} | } | ||||
@@ -101,8 +108,11 @@ protected: | |||||
bool onMotion(const MotionEvent& ev) override | bool onMotion(const MotionEvent& ev) override | ||||
{ | { | ||||
if (! resizing) | |||||
if (! isResizing) | |||||
{ | |||||
recheckCursor(ev.pos); | |||||
return false; | return false; | ||||
} | |||||
const Size<double> offset(ev.pos.getX() - lastResizePoint.getX(), | const Size<double> offset(ev.pos.getX() - lastResizePoint.getX(), | ||||
ev.pos.getY() - lastResizePoint.getY()); | ev.pos.getY() - lastResizePoint.getY()); | ||||
@@ -110,9 +120,11 @@ protected: | |||||
resizingSize += offset; | resizingSize += offset; | ||||
lastResizePoint = ev.pos; | lastResizePoint = ev.pos; | ||||
// TODO min width, min height | |||||
const uint minWidth = 16; | |||||
const uint minHeight = 16; | |||||
// TODO keepAspectRatio | |||||
bool keepAspectRatio; | |||||
const Size<uint> minSize(getWindow().getGeometryConstraints(keepAspectRatio)); | |||||
const uint minWidth = minSize.getWidth(); | |||||
const uint minHeight = minSize.getHeight(); | |||||
if (resizingSize.getWidth() < minWidth) | if (resizingSize.getWidth() < minWidth) | ||||
resizingSize.setWidth(minWidth); | resizingSize.setWidth(minWidth); | ||||
@@ -139,10 +151,21 @@ private: | |||||
uint handleSize; | uint handleSize; | ||||
// event handling state | // event handling state | ||||
bool resizing; | |||||
bool hasCursor, isResizing; | |||||
Point<double> lastResizePoint; | Point<double> lastResizePoint; | ||||
Size<double> resizingSize; | Size<double> resizingSize; | ||||
void recheckCursor(const Point<double>& pos) | |||||
{ | |||||
const bool shouldHaveCursor = area.contains(pos); | |||||
if (shouldHaveCursor == hasCursor) | |||||
return; | |||||
hasCursor = shouldHaveCursor; | |||||
setCursor(shouldHaveCursor ? kMouseCursorDiagonal : kMouseCursorArrow); | |||||
} | |||||
void resetArea() | void resetArea() | ||||
{ | { | ||||
const double scaleFactor = getScaleFactor(); | const double scaleFactor = getScaleFactor(); | ||||