Skip to content

Commit 8ba2754

Browse files
committed
Moved dynamic_cast out of hot path
1 parent a506a39 commit 8ba2754

File tree

2 files changed

+62
-37
lines changed

2 files changed

+62
-37
lines changed

modules/foleys_gui_magic/Widgets/foleys_MagicLevelMeter.cpp

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,43 @@ MagicLevelMeter::MagicLevelMeter()
4545
setColour (outlineColourId, juce::Colours::silver);
4646
setColour (tickmarkColourId, juce::Colours::silver);
4747

48+
lookAndFeelChanged();
49+
4850
startTimerHz (30);
4951
}
5052

5153
void MagicLevelMeter::paint (juce::Graphics& g)
5254
{
53-
if (auto* lnf = dynamic_cast<LookAndFeelMethods*>(&getLookAndFeel()))
54-
{
55-
lnf->drawLevelMeter (g, *this, source, getLocalBounds());
56-
return;
57-
}
55+
actualLookAndFeel->drawLevelMeter (g, *this, source, getLocalBounds());
56+
}
57+
58+
void MagicLevelMeter::setLevelSource (MagicLevelSource* newSource)
59+
{
60+
source = newSource;
61+
}
62+
63+
void MagicLevelMeter::timerCallback()
64+
{
65+
repaint();
66+
}
67+
68+
void MagicLevelMeter::lookAndFeelChanged()
69+
{
70+
auto* lnf = dynamic_cast<LookAndFeelMethods*> (&getLookAndFeel());
71+
72+
if (lnf)
73+
actualLookAndFeel = lnf;
74+
else
75+
actualLookAndFeel = &lookAndFeelFallback;
76+
77+
repaint();
78+
}
79+
80+
// ================================================================================
5881

59-
const auto backgroundColour = findColour (backgroundColourId);
82+
void MagicLevelMeter::LookAndFeelFallback::drawLevelMeter (juce::Graphics& g, MagicLevelMeter& meter, MagicLevelSource* source, juce::Rectangle<int> bounds)
83+
{
84+
const auto backgroundColour = meter.findColour (backgroundColourId);
6085
if (!backgroundColour.isTransparent())
6186
g.fillAll (backgroundColour);
6287

@@ -67,39 +92,29 @@ void MagicLevelMeter::paint (juce::Graphics& g)
6792
if (numChannels == 0)
6893
return;
6994

70-
auto bounds = getLocalBounds().reduced (3).toFloat();
95+
auto inner = bounds.reduced (3).toFloat();
7196

72-
const auto width = bounds.getWidth() / numChannels;
73-
const auto barBackgroundColour = findColour (barBackgroundColourId);
74-
const auto barFillColour = findColour (barFillColourId);
75-
const auto outlineColour = findColour (outlineColourId);
97+
const auto width = inner.getWidth() / static_cast<float> (numChannels);
98+
const auto barBackgroundColour = meter.findColour (barBackgroundColourId);
99+
const auto barFillColour = meter.findColour (barFillColourId);
100+
const auto outlineColour = meter.findColour (outlineColourId);
76101

77102
const auto infinity = -100.0f;
78-
for (int i=0; i < numChannels; ++i)
103+
for (int i = 0; i < numChannels; ++i)
79104
{
80-
auto bar = bounds.removeFromLeft (width).reduced (1);
105+
auto bar = inner.removeFromLeft (width).reduced (1);
81106
g.setColour (barBackgroundColour);
82107
g.fillRect (bar);
83108
g.setColour (outlineColour);
84109
g.drawRect (bar, 1.0f);
85110
bar.reduce (1, 1);
86111
g.setColour (barFillColour);
87-
g.fillRect (bar.withTop (juce::jmap (juce::Decibels::gainToDecibels (source->getRMSvalue (i), infinity),
88-
infinity, 0.0f, bar.getBottom(), bar.getY())));
89-
g.drawHorizontalLine (juce::roundToInt (juce::jmap (juce::Decibels::gainToDecibels (source->getMaxValue (i), infinity),
90-
infinity, 0.0f, bar.getBottom (), bar.getY ())),
91-
static_cast<float>(bar.getX ()), static_cast<float>(bar.getRight ()));
112+
g.fillRect (bar.withTop (juce::jmap (juce::Decibels::gainToDecibels (source->getRMSvalue (i), infinity), infinity, 0.0f, bar.getBottom(), bar.getY())));
113+
g.drawHorizontalLine (juce::roundToInt (
114+
juce::jmap (juce::Decibels::gainToDecibels (source->getMaxValue (i), infinity), infinity, 0.0f, bar.getBottom(), bar.getY())),
115+
static_cast<float> (bar.getX()), static_cast<float> (bar.getRight()));
92116
}
93117
}
94118

95-
void MagicLevelMeter::setLevelSource (MagicLevelSource* newSource)
96-
{
97-
source = newSource;
98-
}
99-
100-
void MagicLevelMeter::timerCallback()
101-
{
102-
repaint();
103-
}
104119

105-
} // namespace foleys
120+
} // namespace foleys

modules/foleys_gui_magic/Widgets/foleys_MagicLevelMeter.h

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ namespace foleys
4040

4141
class MagicLevelSource;
4242

43-
class MagicLevelMeter : public juce::Component,
44-
public juce::SettableTooltipClient,
45-
private juce::Timer
43+
class MagicLevelMeter
44+
: public juce::Component
45+
, public juce::SettableTooltipClient
46+
, private juce::Timer
4647
{
4748
public:
4849
enum ColourIds
@@ -56,11 +57,8 @@ class MagicLevelMeter : public juce::Component,
5657

5758
struct LookAndFeelMethods
5859
{
59-
virtual ~LookAndFeelMethods()=default;
60-
virtual void drawLevelMeter (juce::Graphics& g,
61-
MagicLevelMeter& meter,
62-
MagicLevelSource* source,
63-
juce::Rectangle<int> bounds) = 0;
60+
virtual ~LookAndFeelMethods() = default;
61+
virtual void drawLevelMeter (juce::Graphics& g, MagicLevelMeter& meter, MagicLevelSource* source, juce::Rectangle<int> bounds) = 0;
6462
};
6563

6664
MagicLevelMeter();
@@ -71,11 +69,23 @@ class MagicLevelMeter : public juce::Component,
7169

7270
void timerCallback() override;
7371

72+
void lookAndFeelChanged() override;
73+
7474
private:
7575
juce::WeakReference<MagicLevelSource> source;
7676

77+
class LookAndFeelFallback : public LookAndFeel, public LookAndFeelMethods
78+
{
79+
public:
80+
LookAndFeelFallback() = default;
81+
void drawLevelMeter (juce::Graphics& g, MagicLevelMeter& meter, MagicLevelSource* source, juce::Rectangle<int> bounds) override;
82+
};
83+
84+
LookAndFeelFallback lookAndFeelFallback;
85+
LookAndFeelMethods* actualLookAndFeel = &lookAndFeelFallback;
86+
7787
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MagicLevelMeter)
7888
};
7989

8090

81-
} // namespace foleys
91+
} // namespace foleys

0 commit comments

Comments
 (0)