int ScrollbarTheme::thumbLength(ScrollbarThemeClient* scrollbar) { if (!scrollbar->enabled()) return 0; // It is safe to compute the overhang by adding the result from the main // thread overscroll mode (first) and then adding the result from compositor // thread overscroll (second) because the modes are mutually exclusive (and // determining which mode is in use here will require lots of temporary // plumbing, and the main thread mode is to be deleted). float overhang = 0; if (scrollbar->currentPos() < 0) overhang = -scrollbar->currentPos(); else if (scrollbar->visibleSize() + scrollbar->currentPos() > scrollbar->totalSize()) overhang = scrollbar->currentPos() + scrollbar->visibleSize() - scrollbar->totalSize(); overhang += fabsf(scrollbar->elasticOverscroll()); float proportion = 0.0f; float totalSize = usedTotalSize(scrollbar); if (totalSize > 0.0f) { proportion = (scrollbar->visibleSize() - overhang) / totalSize; } int trackLen = trackLength(scrollbar); int length = round(proportion * trackLen); length = std::max(length, minimumThumbLength(scrollbar)); if (length > trackLen) length = 0; // Once the thumb is below the track length, it just goes away (to make more room for the track). return length; }
int ScrollbarThemeComposite::thumbPosition(ScrollbarThemeClient* scrollbar) { if (scrollbar->enabled()) { float size = usedTotalSize(scrollbar) - scrollbar->visibleSize(); // Avoid doing a floating point divide by zero and return 1 when usedTotalSize == visibleSize. if (!size) return 1; float pos = max(0.0f, scrollbar->currentPos()) * (trackLength(scrollbar) - thumbLength(scrollbar)) / size; return (pos < 1 && pos > 0) ? 1 : pos; } return 0; }
int ScrollbarThemeComposite::thumbLength(Scrollbar* scrollbar) { if (!scrollbar->enabled()) return 0; float proportion = scrollbar->visibleSize() / usedTotalSize(scrollbar); int trackLen = trackLength(scrollbar); int length = proportion * trackLen; length = max(length, minimumThumbLength(scrollbar)); if (length > trackLen) length = 0; // Once the thumb is below the track length, it just goes away (to make more room for the track). return length; }
int ScrollbarThemeComposite::thumbLength(ScrollbarThemeClient* scrollbar) { if (!scrollbar->enabled()) return 0; float proportion = scrollbar->visibleSize() / usedTotalSize(scrollbar); int trackLen = trackLength(scrollbar); #if PLATFORM(MAC) && !PLATFORM(CHROMIUM) int length = round(proportion * trackLen); #else int length = proportion * trackLen; #endif length = max(length, minimumThumbLength(scrollbar)); if (length > trackLen) length = 0; // Once the thumb is below the track length, it just goes away (to make more room for the track). return length; }
int ScrollbarTheme::thumbLength(ScrollbarThemeClient* scrollbar) { if (!scrollbar->enabled()) return 0; float overhang = 0; if (scrollbar->currentPos() < 0) overhang = -scrollbar->currentPos(); else if (scrollbar->visibleSize() + scrollbar->currentPos() > scrollbar->totalSize()) overhang = scrollbar->currentPos() + scrollbar->visibleSize() - scrollbar->totalSize(); float proportion = (scrollbar->visibleSize() - overhang) / usedTotalSize(scrollbar); int trackLen = trackLength(scrollbar); int length = round(proportion * trackLen); length = std::max(length, minimumThumbLength(scrollbar)); if (length > trackLen) length = 0; // Once the thumb is below the track length, it just goes away (to make more room for the track). return length; }