1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-09 23:34:20 +00:00

RectangleList: Avoid infinite loops due to numerical precision issues

This commit is contained in:
reuk 2025-10-15 20:36:55 +01:00
parent 92573ca1ad
commit d10c5c36e3
No known key found for this signature in database
43 changed files with 376 additions and 73 deletions

View file

@ -1937,6 +1937,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/geometry/juce_Rectangle.h"
"../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList.h"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList_test.cpp"
"../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/cdjpeg.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt"
@ -4652,6 +4653,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/geometry/juce_Rectangle.h"
"../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList.h"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList_test.cpp"
"../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/cdjpeg.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt"

View file

@ -2247,6 +2247,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -3034,6 +3034,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -2247,6 +2247,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -3034,6 +3034,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -2247,6 +2247,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -3034,6 +3034,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -1699,6 +1699,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/geometry/juce_Rectangle.h"
"../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList.h"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList_test.cpp"
"../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/cdjpeg.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt"
@ -4028,6 +4029,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/geometry/juce_Rectangle.h"
"../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList.h"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList_test.cpp"
"../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/cdjpeg.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt"

View file

@ -1938,6 +1938,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2542,6 +2542,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -1938,6 +1938,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2542,6 +2542,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -1829,6 +1829,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/geometry/juce_Rectangle.h"
"../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList.h"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList_test.cpp"
"../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/cdjpeg.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt"
@ -4311,6 +4312,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/geometry/juce_Rectangle.h"
"../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList.h"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList_test.cpp"
"../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/cdjpeg.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt"

View file

@ -2072,6 +2072,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2749,6 +2749,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -2072,6 +2072,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2749,6 +2749,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -2072,6 +2072,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2749,6 +2749,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -1718,6 +1718,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/geometry/juce_Rectangle.h"
"../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList.h"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList_test.cpp"
"../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/cdjpeg.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt"
@ -4127,6 +4128,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/geometry/juce_Rectangle.h"
"../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList.h"
"../../../../../modules/juce_graphics/geometry/juce_RectangleList_test.cpp"
"../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/cdjpeg.h"
"../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt"

View file

@ -1959,6 +1959,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2596,6 +2596,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -1959,6 +1959,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2596,6 +2596,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -1059,6 +1059,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1384,6 +1384,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -1059,6 +1059,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1384,6 +1384,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -1059,6 +1059,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1384,6 +1384,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -2080,6 +2080,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2797,6 +2797,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -2080,6 +2080,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2797,6 +2797,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -2080,6 +2080,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2797,6 +2797,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -1958,6 +1958,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2593,6 +2593,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -1958,6 +1958,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -2593,6 +2593,9 @@
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_Rectangle_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\geometry\juce_RectangleList_test.cpp">
<Filter>JUCE Modules\juce_graphics\geometry</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\jaricom.c">
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>
</ClCompile>

View file

@ -212,111 +212,95 @@ public:
*/
void subtract (const RectangleType rect)
{
using PointType = Point<ValueType>;
const auto numRects = rects.size();
if (numRects == 0)
return;
const auto x1 = rect.getX();
const auto y1 = rect.getY();
const auto x2 = x1 + rect.getWidth();
const auto y2 = y1 + rect.getHeight();
struct AABB
{
AABB() = default;
AABB (const RectangleType& r) : tl (r.getTopLeft()), br (r.getBottomRight()) {}
AABB (PointType a, PointType b) : tl (a), br (b) {}
operator RectangleType() const { return RectangleType { tl, br }; }
bool completelyOutside (const AABB& other) const
{
return other.br.x <= tl.x || br.x <= other.tl.x || other.br.y <= tl.y || br.y <= other.tl.y;
}
PointType tl, br;
};
Array<AABB> aabbs;
aabbs.resize (rects.size());
std::copy (rects.begin(), rects.end(), aabbs.begin());
const AABB aabb { rect };
for (int i = numRects; --i >= 0;)
{
auto& r = rects.getReference (i);
auto& rRef = aabbs.getReference (i);;
const auto r = rRef;
const auto rx1 = r.getX();
const auto ry1 = r.getY();
const auto rx2 = rx1 + r.getWidth();
const auto ry2 = ry1 + r.getHeight();
const auto isNotEqual = [&] (const RectangleType newRect)
{
// When subtracting tiny slices from relatively large rectangles, the
// subtraction may have no effect (due to limited-precision floating point
// maths) and the original rectangle may remain unchanged.
// We check that any 'new' rectangle has different dimensions to the rectangle
// being tested before adding it to the rects array.
// Integer arithmetic is not susceptible to this problem, so there's no need
// for this additional equality check when working with integral rectangles.
if constexpr (std::is_floating_point_v<ValueType>)
{
return newRect != r;
}
else
{
ignoreUnused (newRect);
return true;
}
};
if (! (rx1 < x2 && x1 < rx2 && ry1 < y2 && y1 < ry2))
if (r.completelyOutside (aabb))
continue;
if (rx1 < x1 && x1 < rx2)
if (r.tl.x < aabb.tl.x && aabb.tl.x < r.br.x)
{
if (y1 <= ry1 && ry2 <= y2 && rx2 <= x2)
if (aabb.tl.y <= r.tl.y && r.br.y <= aabb.br.y && r.br.x <= aabb.br.x)
{
r.setWidth (x1 - rx1);
rRef.br.x = aabb.tl.x;
}
else if (const RectangleType newRect (rx1, ry1, x1 - rx1, ry2 - ry1); isNotEqual (newRect))
else
{
r.setX (x1);
r.setWidth (rx2 - x1);
rects.insert (++i, newRect);
rRef.tl.x = aabb.tl.x;
aabbs.insert (++i, { r.tl, { aabb.tl.x, r.br.y } });
++i;
}
}
else if (rx1 < x2 && x2 < rx2)
else if (r.tl.x < aabb.br.x && aabb.br.x < r.br.x)
{
r.setX (x2);
r.setWidth (rx2 - x2);
rRef.tl.x = aabb.br.x;
if (ry1 < y1 || y2 < ry2 || rx1 < x1)
if (r.tl.y < aabb.tl.y || aabb.br.y < r.br.y || r.tl.x < aabb.tl.x)
{
if (const RectangleType newRect (rx1, ry1, x2 - rx1, ry2 - ry1); isNotEqual (newRect))
{
rects.insert (++i, newRect);
aabbs.insert (++i, { r.tl, { aabb.br.x, r.br.y } });
++i;
}
}
else if (r.tl.y < aabb.tl.y && aabb.tl.y < r.br.y)
{
if (aabb.tl.x <= r.tl.x && r.br.x <= aabb.br.x && r.br.y <= aabb.br.y)
{
rRef.br.y = aabb.tl.y;
}
else if (ry1 < y1 && y1 < ry2)
else
{
if (x1 <= rx1 && rx2 <= x2 && ry2 <= y2)
{
r.setHeight (y1 - ry1);
}
else if (const RectangleType newRect (rx1, ry1, rx2 - rx1, y1 - ry1); isNotEqual (newRect))
{
r.setY (y1);
r.setHeight (ry2 - y1);
rects.insert (++i, newRect);
rRef.tl.y = aabb.tl.y;
aabbs.insert (++i, { r.tl, { r.br.x, aabb.tl.y } });
++i;
}
}
else if (ry1 < y2 && y2 < ry2)
else if (r.tl.y < aabb.br.y && aabb.br.y < r.br.y)
{
r.setY (y2);
r.setHeight (ry2 - y2);
rRef.tl.y = aabb.br.y;
if (rx1 < x1 || x2 < rx2 || ry1 < y1)
if (r.tl.x < aabb.tl.x || aabb.br.x < r.br.x || r.tl.y < aabb.tl.y)
{
if (const RectangleType newRect (rx1, ry1, rx2 - rx1, y2 - ry1); isNotEqual (newRect))
{
rects.insert (++i, newRect);
aabbs.insert (++i, { r.tl, { r.br.x, aabb.br.y } });
++i;
}
}
}
else
{
rects.remove (i);
aabbs.remove (i);
}
}
rects.resize (aabbs.size());
std::copy (aabbs.begin(), aabbs.end(), rects.begin());
}
/** Removes all areas in another RectangleList from this one.

View file

@ -0,0 +1,202 @@
/*
==============================================================================
This file is part of the JUCE framework.
Copyright (c) Raw Material Software Limited
JUCE is an open source framework subject to commercial or open source
licensing.
By downloading, installing, or using the JUCE framework, or combining the
JUCE framework with any other source code, object code, content or any other
copyrightable work, you agree to the terms of the JUCE End User Licence
Agreement, and all incorporated terms including the JUCE Privacy Policy and
the JUCE Website Terms of Service, as applicable, which will bind you. If you
do not agree to the terms of these agreements, we will not license the JUCE
framework to you, and you must discontinue the installation or download
process and cease use of the JUCE framework.
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
Or:
You may also use this code under the terms of the AGPLv3:
https://www.gnu.org/licenses/agpl-3.0.en.html
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
==============================================================================
*/
namespace juce
{
class RectangleListTests : public UnitTest
{
public:
RectangleListTests() : UnitTest ("RectangleList", UnitTestCategories::graphics) {}
void runTest() override
{
beginTest ("Avoid infinite loops when adding rectangles");
{
const Rectangle<float> rectanglesA[]
{
{ { -9.15555f, 5.06667f }, { 12.f, 5.15556f } },
{ { -9.11111f, 5.11111f }, { 12.f, 5.2f } },
};
RectangleList<float> a;
for (const auto& rect : rectanglesA)
a.add (rect);
const std::set<Rectangle<float>> expectedA { { { -9.15555f, 5.06666994f }, { 12.0f, 5.15556f } },
{ { -9.11111f, 5.15556f }, { 12.0f, 5.2f } } };
for (const auto& r : expectedA)
expect (std::find (a.begin(), a.end(), r) != a.end());
const Rectangle<float> rectanglesB[]
{
{ 565.15887451171875, 777.1043701171875, 454, 212 },
{ -1368.379150390625, 175.8321533203125, 2241.439453125, 782.1121826171875 },
};
RectangleList<float> b;
for (const auto& rect : rectanglesB)
b.add (rect);
const std::set<Rectangle<float>> expectedB { { { 565.15887451171875, 777.1043701171875 }, { 1019.15887451171875, 989.1043701171875 } },
{ { 565.15887451171875, 175.8321533203125 }, { 873.060302734375, 777.1043701171875 } },
{ { -1368.379150390625, 175.8321533203125 }, { 565.158935546875, 957.9443359375 } } };
for (const auto& r : expectedB)
expect (std::find (b.begin(), b.end(), r) != b.end());
}
beginTest ("Subtracting overlapping empty rect subdivides existing rects");
{
RectangleList<float> list;
list.add ({ 10, 10, 80, 80 });
list.subtract ({ 50, 50, 0, 0 });
// The overlapping rect gets subdivided on the X axis at the location of the empty rect.
const std::set<Rectangle<float>> expected { { 10, 10, 40, 80 },
{ 50, 10, 40, 80 } };
for (const auto& r : expected)
expect (std::find (list.begin(), list.end(), r) != list.end());
}
beginTest ("Subtracting non-overlapping rects has no effect");
{
RectangleList<float> list;
list.add ({ 10, 10, 80, 80 });
list.subtract ({ 0, 0, 5, 5 });
list.subtract ({ 0, 95, 5, 5 });
list.subtract ({ 95, 0, 5, 5 });
list.subtract ({ 95, 95, 5, 5 });
expect (list.getNumRectangles() == 1);
expect (*list.begin() == Rectangle<float> { 10, 10, 80, 80 });
}
beginTest ("Subtracting from corner produces two rects");
{
RectangleList<float> list;
list.add ({ 10, 10, 80, 80 });
list.subtract ({ 0, 0, 50, 50 });
const std::set<Rectangle<float>> expected { { 50, 10, 40, 80 },
{ 10, 50, 40, 40 } };
for (const auto& r : expected)
expect (std::find (list.begin(), list.end(), r) != list.end());
}
beginTest ("Subtracting from entire edge shrinks existing rect");
{
RectangleList<float> list;
list.add ({ 10, 10, 80, 80 });
list.subtract ({ 0, 0, 30, 100 });
list.subtract ({ 30, 50, 60, 40 });
const std::set<Rectangle<float>> expected { { 30, 10, 60, 40 } };
for (const auto& r : expected)
expect (std::find (list.begin(), list.end(), r) != list.end());
}
beginTest ("Subtracting a notch from a vertical edge produces new rects");
{
RectangleList<float> list;
list.add ({ 10, 10, 80, 80 });
list.subtract ({ 10, 20, 10, 60 });
const std::set<Rectangle<float>> expected { { 20, 10, 70, 80 },
{ 10, 80, 10, 10 },
{ 10, 10, 10, 10} };
for (auto r : list)
expect (std::find (list.begin(), list.end(), r) != list.end());
}
beginTest ("Subtracting a notch from a horizontal edge produces new rects");
{
RectangleList<float> list;
list.add ({ 10, 10, 80, 80 });
list.subtract ({ 20, 10, 60, 10 });
const std::set<Rectangle<float>> expected { { 80, 10, 10, 80 },
{ 20, 20, 60, 70 },
{ 10, 10, 10, 80 } };
for (auto r : list)
expect (std::find (list.begin(), list.end(), r) != list.end());
}
beginTest ("Subtracting a hole from the centre of a rect produces new rects");
{
RectangleList<float> list;
list.add ({ 10, 10, 80, 80 });
list.subtract ({ 20, 20, 60, 60 });
const std::set<Rectangle<float>> expected { { 10, 10, 10, 80 },
{ 20, 10, 60, 10 },
{ 20, 80, 60, 10 },
{ 80, 10, 10, 80 } };
for (auto r : list)
expect (std::find (list.begin(), list.end(), r) != list.end());
}
beginTest ("Subtracting a rect from itself produces an empty list");
{
RectangleList<float> list;
list.add ({ 10, 10, 80, 80 });
list.subtract ({ 10, 10, 80, 80 });
expect (list.isEmpty());
}
beginTest ("Subtracting a larger rect from a rect list produces an empty list");
{
RectangleList<float> list;
list.add ({ 10, 10, 80, 80 });
list.subtract ({ 0, 0, 100, 100 });
expect (list.isEmpty());
}
}
};
static RectangleListTests rectangleListTests;
} // namespace juce

View file

@ -209,6 +209,7 @@ extern "C"
#if JUCE_UNIT_TESTS
#include "geometry/juce_Parallelogram_test.cpp"
#include "geometry/juce_Rectangle_test.cpp"
#include "geometry/juce_RectangleList_test.cpp"
#endif
#if JUCE_USE_FREETYPE