// This file is part of VSTGUI. It is subject to the license terms // in the LICENSE file found in the top-level directory of this // distribution and at http://github.com/steinbergmedia/vstgui/LICENSE #include "cspecialdigit.h" #include "../cdrawcontext.h" #include "../cbitmap.h" #include namespace VSTGUI { //------------------------------------------------------------------------ // CSpecialDigit //------------------------------------------------------------------------ /*! @class CSpecialDigit Can be used to display a counter with maximum 7 digits. All digit have the same size and are stacked in height in the bitmap. */ //------------------------------------------------------------------------ /** * CSpecialDigit constructor. * @param size the size of this view * @param listener the listener * @param tag the control tag * @param dwPos actual value * @param iNumbers amount of numbers (max 7) * @param xpos array of all X positions, can be NULL * @param ypos array of all Y positions, can be NULL * @param width width of one number in the bitmap * @param height height of one number in the bitmap * @param background bitmap */ //------------------------------------------------------------------------ CSpecialDigit::CSpecialDigit (const CRect& size, IControlListener* listener, int32_t tag, int32_t dwPos, int32_t inNumbers, int32_t* xpos, int32_t* ypos, int32_t width, int32_t height, CBitmap* background) : CControl (size, listener, tag, background) , iNumbers (inNumbers) , width (width) , height (height) { setValue ((float)dwPos); // actual value if (iNumbers > 7) iNumbers = 7; if (xpos == nullptr) { // automatically init xpos/ypos if not provided by caller const int32_t numw = (const int32_t)background->getWidth(); int32_t x = (int32_t)size.left; for (int32_t i = 0; i < inNumbers; i++) { this->xpos[i] = x; this->ypos[i] = (int32_t)size.top; x += numw; } } else if (xpos && ypos) { // store coordinates of x/y pos of each digit for (int32_t i = 0; i < inNumbers; i++) { this->xpos[i] = xpos[i]; this->ypos[i] = ypos[i]; } } setMax ((float)pow (10.f, (float)inNumbers) - 1.0f); setMin (0.0f); } //------------------------------------------------------------------------ CSpecialDigit::CSpecialDigit (const CSpecialDigit& v) : CControl (v) , iNumbers (v.iNumbers) , width (v.width) , height (v.height) { for (int32_t i = 0; i < 7; i++) { xpos[i] = v.xpos[i]; ypos[i] = v.ypos[i]; } } //------------------------------------------------------------------------ void CSpecialDigit::draw (CDrawContext *pContext) { CPoint where; CRect rectDest; int32_t i, j; int32_t one_digit[16] = {}; int32_t dwValue = static_cast (getValue ()); int32_t intMax = static_cast (getMax ()); if (dwValue > intMax) dwValue = intMax; else if (dwValue < static_cast (getMin ())) dwValue = static_cast (getMin ()); for (i = 0, j = (intMax + 1) / 10; i < iNumbers; i++, j /= 10) { one_digit[i] = dwValue / j; dwValue -= (one_digit[i] * j); } where.x = 0; for (i = 0; i < iNumbers; i++) { j = one_digit[i]; if (j > 9) j = 9; rectDest.left = (CCoord)xpos[i]; rectDest.top = (CCoord)ypos[i]; rectDest.right = rectDest.left + width; rectDest.bottom = rectDest.top + height; // where = src from bitmap where.y = (CCoord)j * height; if (getDrawBackground ()) { getDrawBackground ()->draw (pContext, rectDest, where); } } setDirty (false); } } // VSTGUI