LMMS
Loading...
Searching...
No Matches
juce_StretchableObjectResizer.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
31
33 const double minSize, const double maxSize,
34 const int order)
35{
36 // the order must be >= 0 but less than the maximum integer value.
37 jassert (order >= 0 && order < std::numeric_limits<int>::max());
38 jassert (maxSize >= minSize);
39
40 Item item;
41 item.size = size;
42 item.minSize = minSize;
43 item.maxSize = maxSize;
44 item.order = order;
45 items.add (item);
46}
47
48double StretchableObjectResizer::getItemSize (const int index) const noexcept
49{
50 return isPositiveAndBelow (index, items.size()) ? items.getReference (index).size
51 : 0.0;
52}
53
54void StretchableObjectResizer::resizeToFit (const double targetSize)
55{
56 int order = 0;
57
58 for (;;)
59 {
60 double currentSize = 0;
61 double minSize = 0;
62 double maxSize = 0;
63
64 int nextHighestOrder = std::numeric_limits<int>::max();
65
66 for (int i = 0; i < items.size(); ++i)
67 {
68 const Item& it = items.getReference(i);
69 currentSize += it.size;
70
71 if (it.order <= order)
72 {
73 minSize += it.minSize;
74 maxSize += it.maxSize;
75 }
76 else
77 {
78 minSize += it.size;
79 maxSize += it.size;
80 nextHighestOrder = jmin (nextHighestOrder, it.order);
81 }
82 }
83
84 const double thisIterationTarget = jlimit (minSize, maxSize, targetSize);
85
86 if (thisIterationTarget >= currentSize)
87 {
88 const double availableExtraSpace = maxSize - currentSize;
89 const double targetAmountOfExtraSpace = thisIterationTarget - currentSize;
90 const double scale = availableExtraSpace > 0 ? targetAmountOfExtraSpace / availableExtraSpace : 1.0;
91
92 for (int i = 0; i < items.size(); ++i)
93 {
94 Item& it = items.getReference(i);
95
96 if (it.order <= order)
97 it.size = jlimit (it.minSize, it.maxSize, it.size + (it.maxSize - it.size) * scale);
98 }
99 }
100 else
101 {
102 const double amountOfSlack = currentSize - minSize;
103 const double targetAmountOfSlack = thisIterationTarget - minSize;
104 const double scale = targetAmountOfSlack / amountOfSlack;
105
106 for (int i = 0; i < items.size(); ++i)
107 {
108 Item& it = items.getReference(i);
109
110 if (it.order <= order)
111 it.size = jmax (it.minSize, it.minSize + (it.size - it.minSize) * scale);
112 }
113 }
114
115 if (nextHighestOrder < std::numeric_limits<int>::max())
116 order = nextHighestOrder;
117 else
118 break;
119 }
120}
121
122} // namespace juce
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
void addItem(double currentSize, double minSize, double maxSize, int order=0)
Definition juce_StretchableObjectResizer.cpp:32
Array< Item > items
Definition juce_StretchableObjectResizer.h:97
double getItemSize(int index) const noexcept
Definition juce_StretchableObjectResizer.cpp:48
~StretchableObjectResizer()
Definition juce_StretchableObjectResizer.cpp:30
void resizeToFit(double targetSize)
Definition juce_StretchableObjectResizer.cpp:54
StretchableObjectResizer()
Definition juce_StretchableObjectResizer.cpp:29
register unsigned i
Definition inflate.c:1575
#define jassert(expression)
Definition carla_juce.cpp:31
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
Definition juce_StretchableObjectResizer.h:90
double size
Definition juce_StretchableObjectResizer.h:91
int order
Definition juce_StretchableObjectResizer.h:94
double minSize
Definition juce_StretchableObjectResizer.h:92
double maxSize
Definition juce_StretchableObjectResizer.h:93
ulg size
Definition extract.c:2350