Skip to content

Juce 8.0.10 update#18

Merged
ancientjpeg merged 696 commits intominimal_masterfrom
juce-8.0.10-update
Sep 24, 2025
Merged

Juce 8.0.10 update#18
ancientjpeg merged 696 commits intominimal_masterfrom
juce-8.0.10-update

Conversation

@ancientjpeg
Copy link

@ancientjpeg ancientjpeg commented Sep 23, 2025

Merges 8.0.10 into minimal_master.

Most changes merged without conflicts. Here's the conflicts that had to be handled manually:

  • JuceHelperTargets.cmake: modified slightly to keep our modifications removing -Wfloat-equal and -Wmissing-field-initializers warnings.
  • JuceUtils.cmake:852-856: modifications originally by Zane to work around the windows command-line length limit. The JUCE code in this section has changed significantly, so I modified Zane's code a bit. I believe it does the same thing, and it certainly lets the builds work in the cloud which was the main reason for those changes in the first place.
    • We may be able to remove our changes here entirely at this point, but investigating that should be part of a separate PR.

szarvas and others added 30 commits May 13, 2025 18:32
Soon, Google Play will require apps targeting API 35+ to be compatible
with 16 KB page sizes, which is achieved by updating the NDK version.
OpenGL contexts normally can't be nested. Previously, when the main
renderer for the DemoRunner was set to OpenGL, we would forcibly reset
the engine to the software renderer when displaying any heavyweight
demo, including the OpenGL demos.

19061e6 introduced a regression, where the rendering engine was no
longer reset on Windows, so displaying an OpenGL demo while the global
renderer was also set to OpenGL would cause an assertion to fire in the
OpenGL Graphics context, after which rendering would fail.

With this change in place, we now fall back to the Direct2D renderer,
instead of the software renderer, when displaying a heavyweight demo.
…ntext

Fixes a regression introduced in
bd26d79

The issue was observed in the DemoRunner when enabling the OpenGL
renderer and then switching to the LookAndFeel V1.

The cause of the problem was the creation of a secondary OpenGL-backed
Graphics instance in the DropShadowEffect. This temporary context could
modify the OpenGL context state without restoring the state
appropriately on destruction. As a result, when the outer long-lived
OpenGL context resumed drawing, properties such as the viewport, bound
shader, shader uniform values, and bound framebuffer could all be
incorrect.
JUCE convention is that BitmapData holds the lines of the image ordered
from top to bottom, but OpenGL orders lines in the reverse direction.
By returning a negative line stride, we can iterate lines in the
expected order as long as we always increment the current pointer
position by the line stride after processing each line.
Previously, this code assumed that a single channel image would always
have a pixel stride of 1. For image types where this assumption did not
hold, such as OpenGL, this function would produce incorrect results.
This is intended to fix an issue where drawing a component snapshot into
a temporary OpenGL image can fail, because the GL context may not be
bound.
In the DemoRunner, switching to and fro between the Settings tab and
the Demo tab displaying the OpenGL demo could lead to
GL_INVALID_OPERATION errors. This is because closing the demo shuts
down the GL context, destroying resources such as framebuffers. If any
Image objects backed by framebuffers outlive the context, they will be
invalidated. Component effect images are especially likely to hold onto
invalid framebuffer references.

With this change in place, images cached by Components will be
invalidated when the attached GL context goes out of scope, and will be
recreated when the new context is created.
The old name didn't communicate it clearly enough what the parameter was
used for. This started to show when alignmentWidth was added.
… macros are defined when error state is checked
…ST3_CAN_REPLACE_VST2 is set

With this change in place:
- The compatible VST2 ID will be included in the list of compatible
  classes in the moduleinfo.json.
- getCompatibleParameterIds() will be called with the ID of the
  commpatible VST2 plugin.
…the actual buffer size, even it it does not match any reported available buffer size
This assertion is no longer relevant now that the AudioDeviceManager
enforces the maximum buffer size.
…a subsection of the image

When syncing from CPU->GPU storage, we currently copy the entire image
contents. The contents of the CPU backup completely replace the old GPU
image. Therefore, if any pixels need to retain their existing values, we
need to read those pixels before overwriting them. This in turn implies
that, when a BitmapData refers to a subsection of the image, we should
always flush GPU->CPU storage first, so that the subsequent CPU->GPU
sync doesn't clobber pixels outside of the BitmapData region with
outdated values.

It's clear that copying the entire image back and forth could be
suboptimal when writing to image subsections, but to optimise this
process we'd have to keep track of dirty image regions or similar, which
may in turn pessimise more common cases.
…table BitmapData

The OpenGL renderer listens for imageDataChanged() to invalidated cached
textures.

Before this change, the SimpleFFTDemo would display a static (outdated)
image on Windows when using the OpenGLRenderer.
reuk and others added 27 commits September 1, 2025 23:33
…o static function

This makes it a bit easier to see exactly which PopupMenu state is used
during the calculation, and enforces that no menu state is modified
during the call.
Negative wantedY arguments are valid, so we need to be able to
differentiate between an unspecified argument and a
specified-but-negative argument.
The old implementation had a few problems:

- For a target area near but not touching the bottom of the parent area,
  and a long menu with an initially-visible item halfway through the
  list, the initially-visible item would sometimes be obscured by the
  scroller area. The new implementation adjusts the size of the menu to
  ensure that there's enough additional room for the scroller areas.
- For a target area at the very top or very bottom of the target area,
  the menu would be positioned inconsistently; sometimes it would
  overlap with the target area, but other times it would be positioned
  with a gap separating the menu and target area. In the new
  implementation, if there's not enough room for scrollers to be
  positioned above/below the target area, the menu will always be
  positioned so that it touches but does not overlap the target area.
- The initially-selected item would normally be
  positioned as close as possible to the target area, but this wasn't
  always applied consistently for long menus, and the menu would
  sometimes only be scrolled enough to make the item visible at the end
  of the menu furthest from the target area. In the new implementation,
  the initially-visible item will always be positioned on top of the
  target area, or adjacent to it, depending on the available space.
initWithWindowScene appears to create a window with no area if the
provided scene is null. As a fallback, creating a window without an
associated scene still returns usable bounds.
This partly reverts commit ad28684.
Prior to that change, getBrush() would always end up calling
SetTransform on gradient/image brushes. This is important because, when
drawing text, we combine the current brush transform with the text
transform. If we don't reset the brush transform each time, these
transforms end up accumulating across frames.
The issue was reproducible by opening a plugin window in the AudioPluginHost.
The changes were not cleared between frames, so they could end up
accumulating and causing floating-point exceptions.
@ancientjpeg ancientjpeg self-assigned this Sep 24, 2025
@ancientjpeg ancientjpeg marked this pull request as ready for review September 24, 2025 21:09
@ancientjpeg ancientjpeg merged commit 58d4a6c into minimal_master Sep 24, 2025
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants