bool CGUIFont::UpdateScrollInfo(const vecText &text, CScrollInfo &scrollInfo) { // draw at our scroll position // we handle the scrolling as follows: // We scroll on a per-pixel basis (eschewing the use of character indices // which were also in use previously). The complete string, including suffix, // is plotted to achieve the desired effect - normally just the one time, but // if there is a wrap point within the viewport then it will be plotted twice. // If the string is smaller than the viewport, then it may be plotted even // more times than that. // if (g_application.ScreenSaverDisablesAutoScrolling()) return false; if (scrollInfo.waitTime) { scrollInfo.waitTime--; return false; } if (text.empty()) return false; CScrollInfo old(scrollInfo); // move along by the appropriate scroll amount float scrollAmount = fabs(scrollInfo.GetPixelsPerFrame() * g_graphicsContext.GetGUIScaleX()); if (!scrollInfo.m_widthValid) { /* Calculate the pixel width of the complete string */ scrollInfo.m_textWidth = GetTextWidth(text); scrollInfo.m_totalWidth = scrollInfo.m_textWidth + GetTextWidth(scrollInfo.suffix); scrollInfo.m_widthValid = true; } scrollInfo.pixelPos += scrollAmount; assert(scrollInfo.m_totalWidth != 0); while (scrollInfo.pixelPos >= scrollInfo.m_totalWidth) scrollInfo.pixelPos -= scrollInfo.m_totalWidth; if (scrollInfo.pixelPos != old.pixelPos) return true; else return false; }