//------------------------------------------------------------------------
// CVuMeter
//------------------------------------------------------------------------
CVuMeter::CVuMeter (const CRect &size, CBitmap *onBitmap, CBitmap *offBitmap,
long nbLed, const long style)
: CControl (size, 0, 0),
onBitmap (onBitmap), offBitmap (offBitmap), nbLed (nbLed), style (style)
{
setDecreaseStepValue (1.0f);
if (onBitmap)
onBitmap->remember ();
if (offBitmap)
offBitmap->remember ();
rectOn (size.left, size.top, size.right, size.bottom);
rectOff (size.left, size.top, size.right, size.bottom);
}
//------------------------------------------------------------------------
CVuMeter::~CVuMeter ()
{
if (onBitmap)
onBitmap->forget ();
if (offBitmap)
offBitmap->forget ();
}
//------------------------------------------------------------------------
void CVuMeter::draw (CDrawContext *pContext)
{
if (!onBitmap)
return;
CPoint pointOn;
CPoint pointOff;
bounceValue ();
float newValue = oldValue - decreaseValue;
if (newValue < getMin ())
newValue = getMin ();
if (value < newValue)
value = newValue;
oldValue = value;
if (style & kHorizontal)
{
long tmp = (long)(((long)(nbLed * value + 0.5f) / (float)nbLed) * onBitmap->getWidth ());
pointOff (tmp, 0);
tmp += size.left;
rectOff.left = tmp;
rectOn.right = tmp;
}
else
{
long tmp = (long)(((long)(nbLed * (getMax () - value) + 0.5f) / (float)nbLed) * onBitmap->getHeight ());
pointOn (0, tmp);
tmp += size.top;
rectOff.bottom = tmp;
rectOn.top = tmp;
}
if (offBitmap)
{
if (bTransparencyEnabled)
offBitmap->drawTransparent (pContext, rectOff, pointOff);
else
offBitmap->draw (pContext, rectOff, pointOff);
}
if (bTransparencyEnabled)
onBitmap->drawTransparent (pContext, rectOn, pointOn);
else
onBitmap->draw (pContext, rectOn, pointOn);
}