void MessagesUpDn(INDEX ctLines) { INDEX ctMessages = _acmMessages.Count(); _iWantedFirstMessageOnScreen += ctLines; INDEX iMaxFirst = ClampDn(0L, ctMessages-_ctMessagesOnScreen); _iWantedFirstMessageOnScreen = Clamp(_iWantedFirstMessageOnScreen, 0L, iMaxFirst); _iActiveMessage = Clamp(_iActiveMessage, _iWantedFirstMessageOnScreen, _iWantedFirstMessageOnScreen+_ctMessagesOnScreen-1L); }
static PIXaabbox2D GetSliderBox(INDEX iFirst, INDEX iVisible, INDEX iTotal, PIXaabbox2D boxFull) { FLOAT fSize = ClampUp(FLOAT(iVisible)/iTotal, 1.0f); PIX pixFull = boxFull.Size()(2); PIX pixSize = PIX(pixFull*fSize); pixSize = ClampDn(pixSize, boxFull.Size()(1)); PIX pixTop = pixFull*(FLOAT(iFirst)/iTotal)+boxFull.Min()(2); PIX pixI0 = boxFull.Min()(1); PIX pixI1 = boxFull.Max()(1); return PIXaabbox2D(PIX2D(pixI0, pixTop), PIX2D(pixI1, pixTop+pixSize)); }
// select last unread message, or last message if all read void LastUnreadMessage(void) { BOOL bFound = FALSE; for(_iActiveMessage=_acmMessages.Count()-1; _iActiveMessage>=0; _iActiveMessage--) { if (!_acmMessages[_iActiveMessage].cm_bRead) { bFound = TRUE; break; } } if (!bFound) { _iActiveMessage = ClampDn(_acmMessages.Count()-1, 0); } SyncScrollWithActive(); }
void LimitFrameRate(void) { // measure passed time for each loop static CTimerValue tvLast(-1.0f); CTimerValue tvNow = _pTimer->GetHighPrecisionTimer(); TIME tmCurrentDelta = (tvNow-tvLast).GetSeconds(); // limit maximum frame rate ded_iMaxFPS = ClampDn( ded_iMaxFPS, 1L); TIME tmWantedDelta = 1.0f / ded_iMaxFPS; if( tmCurrentDelta<tmWantedDelta) Sleep( (tmWantedDelta-tmCurrentDelta)*1000.0f); // remember new time tvLast = _pTimer->GetHighPrecisionTimer(); }
static size_t ogg_read_func (void *ptr, size_t size, size_t nmemb, void *datasource) { CDecodeData_OGG *pogg = (CDecodeData_OGG *)datasource; // calculate how much can be read at most SLONG slToRead = size*nmemb; SLONG slCurrentPos = ftell(pogg->ogg_fFile)-pogg->ogg_slOffset; SLONG slSizeLeft = ClampDn(pogg->ogg_slSize-slCurrentPos, 0L); slToRead = ClampUp(slToRead, slSizeLeft); // rounded down to the block size slToRead/=size; slToRead*=size; // if there is nothing to read if (slToRead<=0) { return 0; } return fread(ptr, size, slToRead/size, pogg->ogg_fFile); }
void CSeriousSkaStudioApp::EnableRendering() { ctNoRenderRequests--; ASSERT(ctNoRenderRequests>=0); ctNoRenderRequests = ClampDn(ctNoRenderRequests,(INDEX)0); }
// update screen geometry static void UpdateSize(CDrawPort *pdp) { // get screen size PIX pixSizeI = pdp->GetWidth(); PIX pixSizeJ = pdp->GetHeight(); // remember new size _pixSizeI = pixSizeI; _pixSizeJ = pixSizeJ; // determine scaling _fScaling = 1.0f; _fScaling2 = 1.0f; if (pixSizeJ<384) { _fScaling = 1.0f; _fScaling2 = pixSizeJ/480.0f; } // remember font size CFontData *pfd = _pfdConsoleFont; _pixCharSizeI = pfd->fd_pixCharWidth + pfd->fd_pixCharSpacing; _pixCharSizeJ = pfd->fd_pixCharHeight + pfd->fd_pixLineSpacing; _pixCharSize2I = _pixCharSizeI*_fScaling2; _pixCharSize2J = _pixCharSizeJ*_fScaling2; _pixCharSizeI = _pixCharSizeI*_fScaling; _pixCharSizeJ = _pixCharSizeJ*_fScaling; _pixMarginI = 5*_fScaling2; _pixMarginJ = 5*_fScaling2; PIX pixBoxMarginI = 10*_fScaling2; PIX pixBoxMarginJ = 10*_fScaling2; PIX pixJ0Dn = pixBoxMarginJ; PIX pixJ1Up = pixJ0Dn+_pixCharSize2J+_pixMarginI*2; PIX pixJ1Dn = pixJ1Up+pixBoxMarginJ; PIX pixJ2Up = pixJ1Dn+_pixCharSize2J*6*2+pixBoxMarginJ; PIX pixJ2Dn = pixJ2Up+pixBoxMarginJ; PIX pixJ3Up = _pixSizeJ-pixBoxMarginJ; PIX pixI0Rt = pixBoxMarginI; PIX pixI1Lt = pixI0Rt+_pixCharSize2I*20+pixBoxMarginI; PIX pixI1Rt = pixI1Lt+pixBoxMarginI; PIX pixI2Lt = _pixSizeI/2-pixBoxMarginI/2; PIX pixI2Rt = _pixSizeI/2+pixBoxMarginI/2; PIX pixI4Lt = _pixSizeI-pixBoxMarginI; PIX pixI3Rt = pixI4Lt-pixBoxMarginI*2-_pixCharSize2I*10; PIX pixI3Lt = pixI3Rt-pixBoxMarginI; // calculate box sizes _boxTitle = PIXaabbox2D( PIX2D(0, pixJ0Dn-1), PIX2D(pixI3Lt, pixJ1Up)); _boxExit = PIXaabbox2D( PIX2D( pixI3Rt, pixJ0Dn-1), PIX2D(_pixSizeI, pixJ1Up)); PIX pixD = 5; PIX pixH = (pixJ2Up-pixJ1Dn-pixD*(CMT_COUNT-1))/CMT_COUNT; INDEX i; for( i=0; i<CMT_COUNT; i++) { _boxButton[i] = PIXaabbox2D( PIX2D(0, pixJ1Dn+(pixH+pixD)*i), PIX2D(pixI1Lt, pixJ1Dn+(pixH+pixD)*i+pixH)); } _boxMsgList = PIXaabbox2D( PIX2D(pixI1Rt, pixJ1Dn), PIX2D(pixI4Lt, pixJ2Up)); if (GetSP()->sp_bCooperative) { _boxMsgText = PIXaabbox2D( PIX2D(pixI2Rt, pixJ2Dn), PIX2D(pixI4Lt, pixJ3Up)); _boxMsgImage= PIXaabbox2D( PIX2D(pixI0Rt, pixJ2Dn), PIX2D(pixI2Lt, pixJ3Up)); } else { _boxMsgText = PIXaabbox2D( PIX2D(pixI0Rt, pixJ2Dn), PIX2D(pixI4Lt, pixJ3Up)); _boxMsgImage= PIXaabbox2D(); } FLOAT fSlideSpeed = Max(_pixSizeI, _pixSizeJ*2L); FLOAT fGroup0 = ClampDn((1-fComputerFadeValue)*fSlideSpeed-_pixSizeJ, 0.0f); FLOAT fGroup1 = (1-fComputerFadeValue)*fSlideSpeed; // animate box positions _boxTitle -= PIX2D( fGroup1, 0); _boxExit += PIX2D( fGroup1, 0); for( i=0; i<CMT_COUNT; i++) { FLOAT fOffs = ClampDn(fGroup1-(CMT_COUNT-i)*_pixMarginJ*10, 0.0f); _boxButton[i] -= PIX2D(fOffs, 0); } _boxMsgList -= PIX2D(0, fGroup0); _boxMsgText += PIX2D(fGroup0, 0); _boxMsgImage+= PIX2D(0, fGroup0); _ctMessagesOnScreen = (_boxMsgList.Size()(2) - _pixMarginJ*2) / _pixCharSizeJ; _ctTextCharsPerRow = (_boxMsgText.Size()(1) - _pixMarginI*4) / _pixCharSizeI; _ctTextLinesOnScreen = (_boxMsgText.Size()(2) - _pixMarginJ*2 - _pixMarginJ*4) / _pixCharSizeJ; }