| @@ -13,33 +13,34 @@ env: | |||
| jobs: | |||
| linux-arm64: | |||
| runs-on: ubuntu-18.04 | |||
| runs-on: ubuntu-20.04 | |||
| steps: | |||
| - uses: actions/checkout@v2 | |||
| with: | |||
| 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 | |||
| run: | | |||
| sudo dpkg --add-architecture arm64 | |||
| 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 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 | |||
| env: | |||
| CC: aarch64-linux-gnu-gcc | |||
| CXX: aarch64-linux-gnu-g++ | |||
| LDFLAGS: -static-libgcc -static-libstdc++ | |||
| PKG_CONFIG_PATH: /usr/lib/aarch64-linux-gnu/pkgconfig | |||
| run: | | |||
| make features | |||
| make -j $(nproc) | |||
| make WITH_LTO=true -j $(nproc) | |||
| - name: Set sha8 | |||
| id: slug | |||
| run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | |||
| @@ -50,33 +51,34 @@ jobs: | |||
| bin/* | |||
| linux-armhf: | |||
| runs-on: ubuntu-18.04 | |||
| runs-on: ubuntu-20.04 | |||
| steps: | |||
| - uses: actions/checkout@v2 | |||
| with: | |||
| 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 | |||
| run: | | |||
| sudo dpkg --add-architecture armhf | |||
| 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 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 | |||
| env: | |||
| CC: arm-linux-gnueabihf-gcc | |||
| CXX: arm-linux-gnueabihf-g++ | |||
| LDFLAGS: -static-libgcc -static-libstdc++ | |||
| PKG_CONFIG_PATH: /usr/lib/arm-linux-gnueabihf/pkgconfig | |||
| run: | | |||
| make features | |||
| make -j $(nproc) | |||
| make WITH_LTO=true -j $(nproc) | |||
| - name: Set sha8 | |||
| id: slug | |||
| run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | |||
| @@ -86,37 +88,44 @@ jobs: | |||
| path: | | |||
| bin/* | |||
| linux-x86: | |||
| runs-on: ubuntu-18.04 | |||
| linux-i686: | |||
| runs-on: ubuntu-20.04 | |||
| steps: | |||
| - uses: actions/checkout@v2 | |||
| with: | |||
| 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 | |||
| run: | | |||
| sudo dpkg --add-architecture i386 | |||
| 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: | |||
| CC: i686-linux-gnu-gcc | |||
| CXX: i686-linux-gnu-g++ | |||
| CFLAGS: -m32 | |||
| CXXFLAGS: -m32 | |||
| LDFLAGS: -m32 -static-libgcc -static-libstdc++ | |||
| PKG_CONFIG_PATH: /usr/lib/i386-linux-gnu/pkgconfig | |||
| run: | | |||
| make features | |||
| make -j $(nproc) | |||
| make WITH_LTO=true -j $(nproc) | |||
| - name: Set sha8 | |||
| id: slug | |||
| run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | |||
| - uses: actions/upload-artifact@v2 | |||
| 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: | | |||
| bin/* | |||
| linux-x86_64: | |||
| runs-on: ubuntu-18.04 | |||
| runs-on: ubuntu-20.04 | |||
| steps: | |||
| - uses: actions/checkout@v2 | |||
| with: | |||
| @@ -124,13 +133,13 @@ jobs: | |||
| - name: Set up dependencies | |||
| run: | | |||
| 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 | |||
| env: | |||
| LDFLAGS: -static-libgcc -static-libstdc++ | |||
| run: | | |||
| make features | |||
| make -j $(nproc) | |||
| make WITH_LTO=true -j $(nproc) | |||
| - name: Set sha8 | |||
| id: slug | |||
| 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 | |||
| run: | | |||
| 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 | |||
| - name: Set sha8 | |||
| id: slug | |||
| @@ -175,16 +184,21 @@ jobs: | |||
| !bin/vst3 | |||
| win32: | |||
| runs-on: ubuntu-18.04 | |||
| runs-on: ubuntu-20.04 | |||
| steps: | |||
| - uses: actions/checkout@v2 | |||
| with: | |||
| 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 | |||
| run: | | |||
| sudo dpkg --add-architecture i386 | |||
| 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 | |||
| env: | |||
| CC: i686-w64-mingw32-gcc | |||
| @@ -194,7 +208,7 @@ jobs: | |||
| WINEDEBUG: "-all" | |||
| run: | | |||
| make features | |||
| make -j $(nproc) | |||
| make WITH_LTO=true -j $(nproc) | |||
| - name: Set sha8 | |||
| id: slug | |||
| run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)" | |||
| @@ -215,7 +229,7 @@ jobs: | |||
| - name: Set up dependencies | |||
| run: | | |||
| 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 | |||
| env: | |||
| CC: x86_64-w64-mingw32-gcc | |||
| @@ -225,7 +239,7 @@ jobs: | |||
| WINEDEBUG: "-all" | |||
| run: | | |||
| make features | |||
| make -j $(nproc) | |||
| make WITH_LTO=true -j $(nproc) | |||
| - name: Set sha8 | |||
| id: slug | |||
| 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 apt-get update -qq | |||
| # 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 | |||
| 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 | |||
| env: | |||
| CFLAGS: -g | |||
| @@ -313,14 +327,14 @@ jobs: | |||
| done | |||
| - name: Test VST2 plugins | |||
| 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 \ | |||
| valgrind \ | |||
| --error-exitcode=255 \ | |||
| --leak-check=full \ | |||
| --track-origins=yes \ | |||
| --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 | |||
| - name: Test VST3 plugins | |||
| run: | | |||
| @@ -13,11 +13,6 @@ all: dgl plugins resources gen | |||
| PREFIX ?= /usr/local | |||
| DESTDIR ?= | |||
| # -------------------------------------------------------------- | |||
| # Check for system-wide dependencies | |||
| HAVE_PROJECTM = $(shell pkg-config --exists libprojectM && echo true) | |||
| # -------------------------------------------------------------- | |||
| ifneq ($(CROSS_COMPILING),true) | |||
| @@ -65,7 +60,7 @@ ifeq ($(HAVE_OPENGL),true) | |||
| $(MAKE) all -C plugins/ProM | |||
| endif # HAVE_OPENGL | |||
| ifneq ($(HAVE_PROJECTM),true) | |||
| ifneq ($(HAVE_OPENGL),true) | |||
| resources: gen | |||
| # LV2 fonts | |||
| install -d bin/ProM.lv2/resources/fonts | |||
| @@ -82,9 +77,6 @@ ifeq ($(MACOS),true) | |||
| install -d bin/ProM.vst/Contents/Resources/presets | |||
| ln -sf $(CURDIR)/plugins/ProM/projectM/presets/presets_* bin/ProM.vst/Contents/Resources/presets/ | |||
| else | |||
| # VST2 directory | |||
| install -d bin/ProM.vst | |||
| mv bin/ProM-vst$(LIB_EXT) bin/ProM.vst/ProM$(LIB_EXT) | |||
| # VST2 fonts | |||
| install -d 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) | |||
| @$(CURDIR)/dpf/utils/generate-ttl.sh | |||
| endif | |||
| ifeq ($(MACOS),true) | |||
| @$(CURDIR)/dpf/utils/generate-vst-bundles.sh | |||
| endif | |||
| dpf/utils/lv2_ttl_generator: | |||
| $(MAKE) -C dpf/utils/lv2-ttl-generator | |||
| @@ -426,6 +426,38 @@ HAVE_DGL = $(HAVE_X11) | |||
| 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 | |||
| @@ -213,6 +213,18 @@ HAVE_DGL = false | |||
| 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 ($(HAVE_VULKAN),true) | |||
| DGL_FLAGS += -DDGL_VULKAN -DHAVE_DGL | |||
| @@ -313,6 +325,9 @@ $(DPF_PATH)/build/libdgl-cairo.a: | |||
| $(DPF_PATH)/build/libdgl-opengl.a: | |||
| $(MAKE) -C $(DPF_PATH)/dgl opengl | |||
| $(DPF_PATH)/build/libdgl-opengl3.a: | |||
| $(MAKE) -C $(DPF_PATH)/dgl opengl3 | |||
| $(DPF_PATH)/build/libdgl-stub.a: | |||
| $(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 | |||
| 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 | |||
| BUILD_CXX_FLAGS += -Wno-attributes -Wno-extra -Wno-missing-field-initializers | |||
| 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) | |||
| ifeq ($(MACOS),true) | |||
| @@ -128,10 +124,11 @@ endif | |||
| 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)$(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) | |||
| -@mkdir -p ../build | |||
| @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 | |||
| -@mkdir -p ../build/dgl | |||
| @echo "Compiling $< (Vulkan variant)" | |||
| @@ -230,6 +245,7 @@ debug: | |||
| -include $(OBJS_common:%.o=%.d) | |||
| -include $(OBJS_cairo:%.o=%.d) | |||
| -include $(OBJS_opengl:%.o=%.d) | |||
| -include $(OBJS_opengl3:%.o=%.d) | |||
| -include $(OBJS_stub:%.o=%.d) | |||
| -include $(OBJS_vulkan:%.o=%.d) | |||
| @@ -33,6 +33,15 @@ | |||
| START_NAMESPACE_DGL | |||
| // ----------------------------------------------------------------------- | |||
| #ifdef DGL_USE_OPENGL3 | |||
| static void notImplemented(const char* const name) | |||
| { | |||
| d_stderr2("OpenGL3 function not implemented: %s", name); | |||
| } | |||
| #endif | |||
| // ----------------------------------------------------------------------- | |||
| // Color | |||
| @@ -43,18 +52,22 @@ void Color::setFor(const GraphicsContext&, const bool includeAlpha) | |||
| glColor4f(red, green, blue, alpha); | |||
| else | |||
| glColor3f(red, green, blue); | |||
| #else | |||
| notImplemented("Color::setFor"); | |||
| // unused | |||
| (void)includeAlpha; | |||
| #endif | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Line | |||
| #ifndef DGL_USE_OPENGL3 | |||
| template<typename T> | |||
| static void drawLine(const Point<T>& posStart, const Point<T>& posEnd) | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(posStart != posEnd,); | |||
| #ifndef DGL_USE_OPENGL3 | |||
| glBegin(GL_LINES); | |||
| { | |||
| @@ -63,23 +76,31 @@ static void drawLine(const Point<T>& posStart, const Point<T>& posEnd) | |||
| } | |||
| glEnd(); | |||
| #endif | |||
| } | |||
| #endif | |||
| template<typename T> | |||
| void Line<T>::draw(const GraphicsContext&, const T width) | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| DISTRHO_SAFE_ASSERT_RETURN(width != 0,); | |||
| glLineWidth(static_cast<GLfloat>(width)); | |||
| drawLine<T>(posStart, posEnd); | |||
| #else | |||
| notImplemented("Line::draw"); | |||
| #endif | |||
| } | |||
| // deprecated calls | |||
| template<typename T> | |||
| void Line<T>::draw() | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawLine<T>(posStart, posEnd); | |||
| #else | |||
| notImplemented("Line::draw"); | |||
| #endif | |||
| } | |||
| template class Line<double>; | |||
| @@ -92,6 +113,7 @@ template class Line<ushort>; | |||
| // ----------------------------------------------------------------------- | |||
| // Circle | |||
| #ifndef DGL_USE_OPENGL3 | |||
| template<typename T> | |||
| static void drawCircle(const Point<T>& pos, | |||
| const uint numSegments, | |||
| @@ -106,7 +128,6 @@ static void drawCircle(const Point<T>& pos, | |||
| const T origy = pos.getY(); | |||
| double t, x = size, y = 0.0; | |||
| #ifndef DGL_USE_OPENGL3 | |||
| glBegin(outline ? GL_LINE_LOOP : GL_POLYGON); | |||
| for (uint i=0; i<numSegments; ++i) | |||
| @@ -119,13 +140,17 @@ static void drawCircle(const Point<T>& pos, | |||
| } | |||
| glEnd(); | |||
| #endif | |||
| } | |||
| #endif | |||
| template<typename T> | |||
| void Circle<T>::draw(const GraphicsContext&) | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, false); | |||
| #else | |||
| notImplemented("Circle::draw"); | |||
| #endif | |||
| } | |||
| template<typename T> | |||
| @@ -134,20 +159,32 @@ void Circle<T>::drawOutline(const GraphicsContext&, const T lineWidth) | |||
| DISTRHO_SAFE_ASSERT_RETURN(lineWidth != 0,); | |||
| glLineWidth(static_cast<GLfloat>(lineWidth)); | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, true); | |||
| #else | |||
| notImplemented("Circle::drawOutline"); | |||
| #endif | |||
| } | |||
| // deprecated calls | |||
| template<typename T> | |||
| void Circle<T>::draw() | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, false); | |||
| #else | |||
| notImplemented("Circle::draw"); | |||
| #endif | |||
| } | |||
| template<typename T> | |||
| void Circle<T>::drawOutline() | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawCircle<T>(fPos, fNumSegments, fSize, fSin, fCos, true); | |||
| #else | |||
| notImplemented("Circle::drawOutline"); | |||
| #endif | |||
| } | |||
| template class Circle<double>; | |||
| @@ -160,6 +197,7 @@ template class Circle<ushort>; | |||
| // ----------------------------------------------------------------------- | |||
| // Triangle | |||
| #ifndef DGL_USE_OPENGL3 | |||
| template<typename T> | |||
| static void drawTriangle(const Point<T>& pos1, | |||
| const Point<T>& pos2, | |||
| @@ -168,7 +206,6 @@ static void drawTriangle(const Point<T>& pos1, | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(pos1 != pos2 && pos1 != pos3,); | |||
| #ifndef DGL_USE_OPENGL3 | |||
| glBegin(outline ? GL_LINE_LOOP : GL_TRIANGLES); | |||
| { | |||
| @@ -178,13 +215,17 @@ static void drawTriangle(const Point<T>& pos1, | |||
| } | |||
| glEnd(); | |||
| #endif | |||
| } | |||
| #endif | |||
| template<typename T> | |||
| void Triangle<T>::draw(const GraphicsContext&) | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawTriangle<T>(pos1, pos2, pos3, false); | |||
| #else | |||
| notImplemented("Triangle::draw"); | |||
| #endif | |||
| } | |||
| template<typename T> | |||
| @@ -193,20 +234,32 @@ void Triangle<T>::drawOutline(const GraphicsContext&, const T lineWidth) | |||
| DISTRHO_SAFE_ASSERT_RETURN(lineWidth != 0,); | |||
| glLineWidth(static_cast<GLfloat>(lineWidth)); | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawTriangle<T>(pos1, pos2, pos3, true); | |||
| #else | |||
| notImplemented("Triangle::drawOutline"); | |||
| #endif | |||
| } | |||
| // deprecated calls | |||
| template<typename T> | |||
| void Triangle<T>::draw() | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawTriangle<T>(pos1, pos2, pos3, false); | |||
| #else | |||
| notImplemented("Triangle::draw"); | |||
| #endif | |||
| } | |||
| template<typename T> | |||
| void Triangle<T>::drawOutline() | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawTriangle<T>(pos1, pos2, pos3, true); | |||
| #else | |||
| notImplemented("Triangle::drawOutline"); | |||
| #endif | |||
| } | |||
| template class Triangle<double>; | |||
| @@ -219,12 +272,12 @@ template class Triangle<ushort>; | |||
| // ----------------------------------------------------------------------- | |||
| // Rectangle | |||
| #ifndef DGL_USE_OPENGL3 | |||
| template<typename T> | |||
| static void drawRectangle(const Rectangle<T>& rect, const bool outline) | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(rect.isValid(),); | |||
| #ifndef DGL_USE_OPENGL3 | |||
| glBegin(outline ? GL_LINE_LOOP : GL_QUADS); | |||
| { | |||
| @@ -247,13 +300,17 @@ static void drawRectangle(const Rectangle<T>& rect, const bool outline) | |||
| } | |||
| glEnd(); | |||
| #endif | |||
| } | |||
| #endif | |||
| template<typename T> | |||
| void Rectangle<T>::draw(const GraphicsContext&) | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawRectangle<T>(*this, false); | |||
| #else | |||
| notImplemented("Rectangle::draw"); | |||
| #endif | |||
| } | |||
| template<typename T> | |||
| @@ -262,20 +319,32 @@ void Rectangle<T>::drawOutline(const GraphicsContext&, const T lineWidth) | |||
| DISTRHO_SAFE_ASSERT_RETURN(lineWidth != 0,); | |||
| glLineWidth(static_cast<GLfloat>(lineWidth)); | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawRectangle<T>(*this, true); | |||
| #else | |||
| notImplemented("Rectangle::drawOutline"); | |||
| #endif | |||
| } | |||
| // deprecated calls | |||
| template<typename T> | |||
| void Rectangle<T>::draw() | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawRectangle<T>(*this, false); | |||
| #else | |||
| notImplemented("Rectangle::draw"); | |||
| #endif | |||
| } | |||
| template<typename T> | |||
| void Rectangle<T>::drawOutline() | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| drawRectangle<T>(*this, true); | |||
| #else | |||
| notImplemented("Rectangle::drawOutline"); | |||
| #endif | |||
| } | |||
| template class Rectangle<double>; | |||
| @@ -542,29 +611,33 @@ void ImageBaseKnob<OpenGLImage>::onDisplay() | |||
| pData->isReady = true; | |||
| } | |||
| #ifndef DGL_USE_OPENGL3 | |||
| const int w = static_cast<int>(getWidth()); | |||
| const int h = static_cast<int>(getHeight()); | |||
| if (pData->rotationAngle != 0) | |||
| { | |||
| #ifndef DGL_USE_OPENGL3 | |||
| glPushMatrix(); | |||
| #endif | |||
| const int w2 = w/2; | |||
| const int h2 = h/2; | |||
| #ifndef DGL_USE_OPENGL3 | |||
| glTranslatef(static_cast<float>(w2), static_cast<float>(h2), 0.0f); | |||
| glRotatef(normValue*static_cast<float>(pData->rotationAngle), 0.0f, 0.0f, 1.0f); | |||
| #endif | |||
| Rectangle<int>(-w2, -h2, w, h).draw(context); | |||
| #ifndef DGL_USE_OPENGL3 | |||
| glPopMatrix(); | |||
| #endif | |||
| } | |||
| else | |||
| { | |||
| Rectangle<int>(0, 0, w, h).draw(context); | |||
| } | |||
| #endif | |||
| glBindTexture(GL_TEXTURE_2D, 0); | |||
| glDisable(GL_TEXTURE_2D); | |||
| @@ -157,31 +157,170 @@ struct 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) | |||
| { | |||
| FT_Error ftError; | |||
| FONS_NOTUSED(context); | |||
| ftError = FT_Init_FreeType(&ftLibrary); | |||
| ftError = FT_Init_FreeType(&context->ftLibrary); | |||
| return ftError == 0; | |||
| } | |||
| int fons__tt_done(FONScontext *context) | |||
| { | |||
| FT_Error ftError; | |||
| FONS_NOTUSED(context); | |||
| ftError = FT_Done_FreeType(ftLibrary); | |||
| ftError = FT_Done_FreeType(context->ftLibrary); | |||
| return ftError == 0; | |||
| } | |||
| int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char *data, int dataSize, int fontIndex) | |||
| { | |||
| FT_Error ftError; | |||
| FONS_NOTUSED(context); | |||
| //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; | |||
| } | |||
| @@ -269,18 +408,6 @@ int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2) | |||
| #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) | |||
| { | |||
| FONS_NOTUSED(context); | |||
| @@ -350,129 +477,6 @@ int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2) | |||
| #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 | |||
| 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->texData) free(stash->texData); | |||
| if (stash->scratch) free(stash->scratch); | |||
| free(stash); | |||
| fons__tt_done(stash); | |||
| free(stash); | |||
| } | |||
| void fonsSetErrorCallback(FONScontext* stash, void (*callback)(void* uptr, int error, int val), void* uptr) | |||
| @@ -189,7 +189,7 @@ public: | |||
| sendNoteCallback, | |||
| setSizeCallback, | |||
| nullptr, // TODO file request | |||
| nullptr, | |||
| d_nextBundlePath, | |||
| plugin->getInstancePointer(), | |||
| scaleFactor) | |||
| # if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| @@ -705,7 +705,7 @@ public: | |||
| else | |||
| { | |||
| UIExporter tmpUI(nullptr, 0, fPlugin.getSampleRate(), | |||
| nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | |||
| nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, d_nextBundlePath, | |||
| fPlugin.getInstancePointer(), fLastScaleFactor); | |||
| fVstRect.right = tmpUI.getWidth(); | |||
| fVstRect.bottom = tmpUI.getHeight(); | |||
| @@ -62,6 +62,7 @@ public: | |||
| uiData(new UI::PrivateData()) | |||
| { | |||
| uiData->sampleRate = sampleRate; | |||
| uiData->bundlePath = bundlePath != nullptr ? strdup(bundlePath) : nullptr; | |||
| uiData->dspPtr = dspPtr; | |||
| uiData->bgColor = bgColor; | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * 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 | |||
| * 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; | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // Static data, see DistrhoPlugin.cpp | |||
| extern const char* d_nextBundlePath; | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // Utility functions (defined on plugin side) | |||
| @@ -129,7 +134,7 @@ public: | |||
| sendNoteCallback, | |||
| setSizeCallback, | |||
| nullptr, // TODO file request | |||
| nullptr, // bundlePath | |||
| d_nextBundlePath, | |||
| instancePointer, | |||
| scaleFactor) | |||
| { | |||
| @@ -22,7 +22,7 @@ | |||
| #define DISTRHO_PLUGIN_NAME "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_SYNTH 1 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 0 | |||
| @@ -15,7 +15,7 @@ NAME = Nekobi | |||
| FILES_DSP = \ | |||
| DistrhoPluginNekobi.cpp | |||
| FILES_UIxx = \ | |||
| FILES_UI = \ | |||
| DistrhoArtworkNekobi.cpp \ | |||
| DistrhoUINekobi.cpp | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * 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 | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| @@ -26,77 +26,16 @@ | |||
| #include "DistrhoPluginProM.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 | |||
| // ----------------------------------------------------------------------- | |||
| 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() | |||
| : UI(512, 512), | |||
| fPM(nullptr) | |||
| #ifndef DGL_USE_OPENGL3 | |||
| , fResizeHandle(this) | |||
| #endif | |||
| fPM(nullptr), | |||
| fResizeHandle(this) | |||
| { | |||
| const double scaleFactor = getScaleFactor(); | |||
| @@ -106,10 +45,8 @@ DistrhoUIProM::DistrhoUIProM() | |||
| setGeometryConstraints(256*scaleFactor, 256*scaleFactor, true); | |||
| // no need to show resize handle if window is user-resizable | |||
| #ifndef DGL_USE_OPENGL3 | |||
| // if (isResizable()) | |||
| // fResizeHandle.hide(); | |||
| #endif | |||
| } | |||
| 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); | |||
| @@ -160,19 +97,27 @@ void DistrhoUIProM::uiReshape(uint width, uint height) | |||
| #ifdef PROJECTM_DATA_DIR | |||
| fPM = new projectM(PROJECTM_DATA_DIR "/config.inp"); | |||
| #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 | |||
| } | |||
| fPM->projectM_resetGL(width, height); | |||
| if (fPM != nullptr) | |||
| fPM->projectM_resetGL(width, height); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -184,6 +129,9 @@ void DistrhoUIProM::onDisplay() | |||
| return; | |||
| 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 | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * 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 | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| @@ -17,15 +17,8 @@ | |||
| #ifndef DISTRHO_UI_PROM_HPP_INCLUDED | |||
| #define DISTRHO_UI_PROM_HPP_INCLUDED | |||
| #ifdef DISTRHO_OS_MAC | |||
| # define DGL_USE_OPENGL3 | |||
| #endif | |||
| #include "DistrhoUI.hpp" | |||
| #ifndef DGL_USE_OPENGL3 | |||
| # include "ResizeHandle.hpp" | |||
| #endif | |||
| #include "ResizeHandle.hpp" | |||
| class projectM; | |||
| @@ -59,9 +52,7 @@ protected: | |||
| private: | |||
| ScopedPointer<projectM> fPM; | |||
| #ifndef DGL_USE_OPENGL3 | |||
| ResizeHandle fResizeHandle; | |||
| #endif | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUIProM) | |||
| }; | |||
| @@ -26,6 +26,7 @@ HAVE_PROJECTM = $(shell pkg-config --exists libprojectM && echo true) | |||
| # -------------------------------------------------------------- | |||
| # Import base definitions | |||
| FILE_BROWSER_DISABLED = true | |||
| include ../../dpf/Makefile.base.mk | |||
| # -------------------------------------------------------------- | |||
| @@ -105,6 +106,8 @@ endif # !HAVE_PROJECTM | |||
| # -------------------------------------------------------------- | |||
| # Do some magic | |||
| UI_TYPE = opengl3 | |||
| USE_VST2_BUNDLE = true | |||
| include ../../dpf/Makefile.plugins.mk | |||
| # -------------------------------------------------------------- | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * 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 | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -29,7 +29,8 @@ public: | |||
| explicit ResizeHandle(Window& window) | |||
| : TopLevelWidget(window), | |||
| handleSize(16), | |||
| resizing(false) | |||
| hasCursor(false), | |||
| isResizing(false) | |||
| { | |||
| resetArea(); | |||
| } | |||
| @@ -38,12 +39,14 @@ public: | |||
| explicit ResizeHandle(TopLevelWidget* const tlw) | |||
| : TopLevelWidget(tlw->getWindow()), | |||
| handleSize(16), | |||
| resizing(false) | |||
| hasCursor(false), | |||
| isResizing(false) | |||
| { | |||
| 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) | |||
| { | |||
| handleSize = std::max(16u, size); | |||
| @@ -53,15 +56,14 @@ public: | |||
| protected: | |||
| void onDisplay() override | |||
| { | |||
| // TODO implement gl3 stuff in DPF | |||
| #ifndef DGL_USE_OPENGL3 | |||
| const GraphicsContext& context(getGraphicsContext()); | |||
| 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); | |||
| # endif | |||
| #endif | |||
| #endif | |||
| // draw white lines, 1px wide | |||
| Color(1.0f, 1.0f, 1.0f).setFor(context); | |||
| @@ -78,6 +80,7 @@ protected: | |||
| l1b.draw(context, lineWidth); | |||
| l2b.draw(context, lineWidth); | |||
| l3b.draw(context, lineWidth); | |||
| #endif | |||
| } | |||
| bool onMouse(const MouseEvent& ev) override | |||
| @@ -87,15 +90,16 @@ protected: | |||
| if (ev.press && area.contains(ev.pos)) | |||
| { | |||
| resizing = true; | |||
| isResizing = true; | |||
| resizingSize = Size<double>(getWidth(), getHeight()); | |||
| lastResizePoint = ev.pos; | |||
| return true; | |||
| } | |||
| if (resizing && ! ev.press) | |||
| if (isResizing && ! ev.press) | |||
| { | |||
| resizing = false; | |||
| isResizing = false; | |||
| recheckCursor(ev.pos); | |||
| return true; | |||
| } | |||
| @@ -104,8 +108,11 @@ protected: | |||
| bool onMotion(const MotionEvent& ev) override | |||
| { | |||
| if (! resizing) | |||
| if (! isResizing) | |||
| { | |||
| recheckCursor(ev.pos); | |||
| return false; | |||
| } | |||
| const Size<double> offset(ev.pos.getX() - lastResizePoint.getX(), | |||
| ev.pos.getY() - lastResizePoint.getY()); | |||
| @@ -113,9 +120,11 @@ protected: | |||
| resizingSize += offset; | |||
| 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) | |||
| resizingSize.setWidth(minWidth); | |||
| @@ -142,10 +151,21 @@ private: | |||
| uint handleSize; | |||
| // event handling state | |||
| bool resizing; | |||
| bool hasCursor, isResizing; | |||
| Point<double> lastResizePoint; | |||
| 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() | |||
| { | |||
| 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) 2000 Christian Zander <phoenix@minion.de> | |||
| * 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 | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -30,7 +30,12 @@ DistrhoUIGLBars::DistrhoUIGLBars() | |||
| fInitialized(false), | |||
| 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 | |||
| if (isResizable()) | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * 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 | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -29,7 +29,8 @@ public: | |||
| explicit ResizeHandle(Window& window) | |||
| : TopLevelWidget(window), | |||
| handleSize(16), | |||
| resizing(false) | |||
| hasCursor(false), | |||
| isResizing(false) | |||
| { | |||
| resetArea(); | |||
| } | |||
| @@ -38,12 +39,14 @@ public: | |||
| explicit ResizeHandle(TopLevelWidget* const tlw) | |||
| : TopLevelWidget(tlw->getWindow()), | |||
| handleSize(16), | |||
| resizing(false) | |||
| hasCursor(false), | |||
| isResizing(false) | |||
| { | |||
| 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) | |||
| { | |||
| handleSize = std::max(16u, size); | |||
| @@ -53,12 +56,14 @@ public: | |||
| protected: | |||
| void onDisplay() override | |||
| { | |||
| // TODO implement gl3 stuff in DPF | |||
| #ifndef DGL_USE_OPENGL3 | |||
| const GraphicsContext& context(getGraphicsContext()); | |||
| const double lineWidth = 1.0 * getScaleFactor(); | |||
| #ifdef DGL_OPENGL | |||
| #if defined(DGL_OPENGL) && !defined(DGL_USE_OPENGL3) | |||
| glMatrixMode(GL_MODELVIEW); | |||
| #endif | |||
| #endif | |||
| // draw white lines, 1px wide | |||
| Color(1.0f, 1.0f, 1.0f).setFor(context); | |||
| @@ -75,6 +80,7 @@ protected: | |||
| l1b.draw(context, lineWidth); | |||
| l2b.draw(context, lineWidth); | |||
| l3b.draw(context, lineWidth); | |||
| #endif | |||
| } | |||
| bool onMouse(const MouseEvent& ev) override | |||
| @@ -84,15 +90,16 @@ protected: | |||
| if (ev.press && area.contains(ev.pos)) | |||
| { | |||
| resizing = true; | |||
| isResizing = true; | |||
| resizingSize = Size<double>(getWidth(), getHeight()); | |||
| lastResizePoint = ev.pos; | |||
| return true; | |||
| } | |||
| if (resizing && ! ev.press) | |||
| if (isResizing && ! ev.press) | |||
| { | |||
| resizing = false; | |||
| isResizing = false; | |||
| recheckCursor(ev.pos); | |||
| return true; | |||
| } | |||
| @@ -101,8 +108,11 @@ protected: | |||
| bool onMotion(const MotionEvent& ev) override | |||
| { | |||
| if (! resizing) | |||
| if (! isResizing) | |||
| { | |||
| recheckCursor(ev.pos); | |||
| return false; | |||
| } | |||
| const Size<double> offset(ev.pos.getX() - lastResizePoint.getX(), | |||
| ev.pos.getY() - lastResizePoint.getY()); | |||
| @@ -110,9 +120,11 @@ protected: | |||
| resizingSize += offset; | |||
| 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) | |||
| resizingSize.setWidth(minWidth); | |||
| @@ -139,10 +151,21 @@ private: | |||
| uint handleSize; | |||
| // event handling state | |||
| bool resizing; | |||
| bool hasCursor, isResizing; | |||
| Point<double> lastResizePoint; | |||
| 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() | |||
| { | |||
| const double scaleFactor = getScaleFactor(); | |||