void ScrollableArea::setScrollOffsetFromAnimation(const IntPoint& offset) { // Tell the derived class to scroll its contents. setScrollOffset(offset); Scrollbar* verticalScrollbar = this->verticalScrollbar(); // Tell the scrollbars to update their thumb postions. if (Scrollbar* horizontalScrollbar = this->horizontalScrollbar()) { horizontalScrollbar->offsetDidChange(); if (horizontalScrollbar->isOverlayScrollbar()) { if (!verticalScrollbar) horizontalScrollbar->invalidate(); else { // If there is both a horizontalScrollbar and a verticalScrollbar, // then we must also invalidate the corner between them. IntRect boundsAndCorner = horizontalScrollbar->boundsRect(); boundsAndCorner.setWidth(boundsAndCorner.width() + verticalScrollbar->width()); horizontalScrollbar->invalidateRect(boundsAndCorner); } } } if (verticalScrollbar) { verticalScrollbar->offsetDidChange(); if (verticalScrollbar->isOverlayScrollbar()) verticalScrollbar->invalidate(); } }
void ScrollableArea::scrollPositionChanged(const IntPoint& position) { IntPoint oldPosition = scrollPosition(); // Tell the derived class to scroll its contents. setScrollOffset(position); Scrollbar* verticalScrollbar = this->verticalScrollbar(); // Tell the scrollbars to update their thumb postions. if (Scrollbar* horizontalScrollbar = this->horizontalScrollbar()) { horizontalScrollbar->offsetDidChange(); if (horizontalScrollbar->isOverlayScrollbar() && !hasLayerForHorizontalScrollbar()) { if (!verticalScrollbar) horizontalScrollbar->invalidate(); else { // If there is both a horizontalScrollbar and a verticalScrollbar, // then we must also invalidate the corner between them. IntRect boundsAndCorner = horizontalScrollbar->boundsRect(); boundsAndCorner.setWidth(boundsAndCorner.width() + verticalScrollbar->width()); horizontalScrollbar->invalidateRect(boundsAndCorner); } } } if (verticalScrollbar) { verticalScrollbar->offsetDidChange(); if (verticalScrollbar->isOverlayScrollbar() && !hasLayerForVerticalScrollbar()) verticalScrollbar->invalidate(); } if (scrollPosition() != oldPosition) scrollAnimator()->notifyContentAreaScrolled(scrollPosition() - oldPosition); }
IntRect ScrollbarThemeWin::backButtonRect(Scrollbar& scrollbar, ScrollbarPart part, bool) { // Windows just has single arrows. if (part == BackButtonEndPart) return IntRect(); // Our desired rect is essentially 17x17. // Our actual rect will shrink to half the available space when // we have < 34 pixels left. This allows the scrollbar // to scale down and function even at tiny sizes. int thickness = scrollbarThickness(); if (scrollbar.orientation() == HorizontalScrollbar) return IntRect(scrollbar.x(), scrollbar.y(), scrollbar.width() < 2 * thickness ? scrollbar.width() / 2 : thickness, thickness); return IntRect(scrollbar.x(), scrollbar.y(), thickness, scrollbar.height() < 2 * thickness ? scrollbar.height() / 2 : thickness); }
IntRect ScrollbarThemeSafari::forwardButtonRect(Scrollbar& scrollbar, ScrollbarPart part, bool painting) { IntRect result; // Windows just has single arrows. if (part == ForwardButtonStartPart) return result; int thickness = scrollbarThickness(scrollbar.controlSize()); if (scrollbar.orientation() == HorizontalScrollbar) result = IntRect(scrollbar.x() + scrollbar.width() - cButtonLength[scrollbar.controlSize()], scrollbar.y(), cButtonLength[scrollbar.controlSize()], thickness); else result = IntRect(scrollbar.x(), scrollbar.y() + scrollbar.height() - cButtonLength[scrollbar.controlSize()], thickness, cButtonLength[scrollbar.controlSize()]); if (painting) return buttonRepaintRect(result, scrollbar.orientation(), scrollbar.controlSize(), false); return result; }
void ScrollableArea::scrollPositionChanged(const DoublePoint& position, ScrollType scrollType) { TRACE_EVENT0("blink", "ScrollableArea::scrollPositionChanged"); DoublePoint oldPosition = scrollPositionDouble(); DoublePoint truncatedPosition = shouldUseIntegerScrollOffset() ? flooredIntPoint(position) : position; // Tell the derived class to scroll its contents. setScrollOffset(truncatedPosition, scrollType); Scrollbar* verticalScrollbar = this->verticalScrollbar(); // Tell the scrollbars to update their thumb postions. if (Scrollbar* horizontalScrollbar = this->horizontalScrollbar()) { horizontalScrollbar->offsetDidChange(); if (horizontalScrollbar->isOverlayScrollbar() && !hasLayerForHorizontalScrollbar()) { if (!verticalScrollbar) horizontalScrollbar->invalidate(); else { // If there is both a horizontalScrollbar and a verticalScrollbar, // then we must also invalidate the corner between them. IntRect boundsAndCorner = horizontalScrollbar->boundsRect(); boundsAndCorner.setWidth(boundsAndCorner.width() + verticalScrollbar->width()); horizontalScrollbar->invalidateRect(boundsAndCorner); } } } if (verticalScrollbar) { verticalScrollbar->offsetDidChange(); if (verticalScrollbar->isOverlayScrollbar() && !hasLayerForVerticalScrollbar()) verticalScrollbar->invalidate(); } if (scrollPositionDouble() != oldPosition) { // FIXME: Pass in DoubleSize. crbug.com/414283. scrollAnimator()->notifyContentAreaScrolled(toFloatSize(scrollPositionDouble() - oldPosition)); } scrollAnimator()->setCurrentPosition(toFloatPoint(position)); }
IntRect ScrollbarThemeSafari::trackRect(Scrollbar& scrollbar, bool painting) { if (painting || !hasButtons(scrollbar)) return scrollbar.frameRect(); IntRect result; int thickness = scrollbarThickness(scrollbar.controlSize()); if (scrollbar.orientation() == HorizontalScrollbar) return IntRect(scrollbar.x() + cButtonLength[scrollbar.controlSize()], scrollbar.y(), scrollbar.width() - 2 * cButtonLength[scrollbar.controlSize()], thickness); return IntRect(scrollbar.x(), scrollbar.y() + cButtonLength[scrollbar.controlSize()], thickness, scrollbar.height() - 2 * cButtonLength[scrollbar.controlSize()]); }
bool ScrollbarThemeSafari::hasThumb(Scrollbar& scrollbar) { return scrollbar.enabled() && (scrollbar.orientation() == HorizontalScrollbar ? scrollbar.width() : scrollbar.height()) >= 2 * cButtonInset[scrollbar.controlSize()] + cThumbMinLength[scrollbar.controlSize()] + 1; }
bool ScrollbarThemeSafari::hasButtons(Scrollbar& scrollbar) { return scrollbar.enabled() && (scrollbar.orientation() == HorizontalScrollbar ? scrollbar.width() : scrollbar.height()) >= 2 * (cRealButtonLength[scrollbar.controlSize()] - cButtonHitInset[scrollbar.controlSize()]); }
void ScrollbarThemeGtk::updateThemeProperties() { MozGtkScrollbarMetrics metrics; moz_gtk_get_scrollbar_metrics(&metrics); m_thumbFatness = metrics.slider_width; m_troughBorderWidth = metrics.trough_border; m_stepperSize = metrics.stepper_size; m_stepperSpacing = metrics.stepper_spacing; m_minThumbLength = metrics.min_slider_size; m_troughUnderSteppers = metrics.trough_under_steppers; m_hasForwardButtonStartPart = metrics.has_secondary_forward_stepper; m_hasBackButtonEndPart = metrics.has_secondary_backward_stepper; if (!gScrollbars) return; // Update the thickness of every interior frame scrollbar widget. The // platform-independent scrollbar them code isn't yet smart enough to get // this information when it paints. HashSet<Scrollbar*>::iterator end = gScrollbars->end(); for (HashSet<Scrollbar*>::iterator it = gScrollbars->begin(); it != end; ++it) { Scrollbar* scrollbar = (*it); // Top-level scrollbar i.e. scrollbars who have a parent ScrollView // with no parent are native, and thus do not need to be resized. if (!scrollbar->parent() || !scrollbar->parent()->parent()) return; int thickness = scrollbarThickness(scrollbar->controlSize()); if (scrollbar->orientation() == HorizontalScrollbar) scrollbar->setFrameRect(IntRect(0, scrollbar->parent()->height() - thickness, scrollbar->width(), thickness)); else scrollbar->setFrameRect(IntRect(scrollbar->parent()->width() - thickness, 0, thickness, scrollbar->height())); } }
void WebViewPrivate::scrollBackingStore(WebCore::FrameView* view, int dx, int dy, const WebCore::IntRect& scrollViewRect, const WebCore::IntRect& clipRect) { IntRect updateRect = clipRect; updateRect.intersect(scrollViewRect); #if 0 dy = -dy; dx = -dx; int svWidth = scrollViewRect.width(); int svHeight = scrollViewRect.height(); int dirtyX = 0, dirtyY = 0, dirtyW = 0, dirtyH = 0; if (dy == 0 && dx < 0 && -dx < svWidth) { dirtyW = -dx; dirtyH = svHeight; } else if (dy == 0 && dx > 0 && dx < svWidth) { dirtyX = svWidth - dx; dirtyW = dx; dirtyH = svHeight; } else if (dx == 0 && dy < 0 && -dy < svHeight) { dirtyW = svWidth; dirtyH = -dy; } else if (dx == 0 && dy > 0 && dy < svHeight) { dirtyY = svHeight - dy; dirtyW = svWidth; dirtyH = dy; } if (m_webView->viewWindow() && dirtyW) { m_srcRect.x = dx > 0 ? dx + scrollViewRect.x() : scrollViewRect.x(); m_srcRect.y = dy > 0 ? dy + scrollViewRect.y() : scrollViewRect.y(); m_srcRect.w = dx > 0 ? scrollViewRect.width() - dx : scrollViewRect.width() + dx; m_srcRect.h = dy > 0 ? scrollViewRect.height() - dy : scrollViewRect.height() + dy; m_dstRect.x = dx > 0 ? scrollViewRect.x() : -dx + scrollViewRect.x(); m_dstRect.y = dy > 0 ? scrollViewRect.y() : -dy + scrollViewRect.y(); m_dstRect.w = dx > 0 ? scrollViewRect.width() - dx : scrollViewRect.width() + dx; m_dstRect.h = dy > 0 ? scrollViewRect.height() -dy : scrollViewRect.height() + dy; int x, y, w, h = 0; if (dx > 0) { m_srcRect.x += m_scrollUpdateRect.width(); m_srcRect.w -= m_scrollUpdateRect.width(); x = scrollViewRect.x() + dirtyX - m_scrollUpdateRect.width(); w = dirtyW + m_scrollUpdateRect.width(); } else if (dx < 0) { m_dstRect.x += m_scrollUpdateRect.width(); m_srcRect.w -= m_scrollUpdateRect.width(); x = scrollViewRect.x() + dirtyX + m_scrollUpdateRect.width(); w = dirtyW + m_scrollUpdateRect.width(); } else { x = scrollViewRect.x() + dirtyX; w = dirtyW; } if (dy > 0) { m_srcRect.y += m_scrollUpdateRect.height(); m_srcRect.h -= m_scrollUpdateRect.height(); y = scrollViewRect.y() + dirtyY - m_scrollUpdateRect.height(); h = dirtyH + m_scrollUpdateRect.height(); } else if (dy < 0) { m_dstRect.y += m_scrollUpdateRect.height(); m_srcRect.h -= m_scrollUpdateRect.height(); y = scrollViewRect.y() + dirtyY + m_scrollUpdateRect.height(); h = dirtyH + m_scrollUpdateRect.height(); } else { y = scrollViewRect.y() + dirtyY; h = dirtyH; } Uint32 rmask, gmask, bmask, amask; #if !PLATFORM(AMIGAOS4) && SDL_BYTEORDER == SDL_BIG_ENDIAN rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; #else rmask = 0x00ff0000; gmask = 0x0000ff00; bmask = 0x000000ff; amask = 0xff000000; #endif if (m_scrollSurface) SDL_FreeSurface(m_scrollSurface); m_scrollSurface = SDL_CreateRGBSurface(SDL_SWSURFACE, m_dstRect.w, m_dstRect.h , 32, rmask, gmask, bmask, amask); SDL_Rect dRect = {0, 0, m_dstRect.w, m_dstRect.h}; SDL_BlitSurface(m_webView->viewWindow(), &m_srcRect, m_scrollSurface, &dRect); m_scrollUpdateRect = IntRect(x, y, w, h); m_scrollUpdateRect.intersect(scrollViewRect); Scrollbar* hBar = view->horizontalScrollbar(); Scrollbar* vBar = view->verticalScrollbar(); if (dx && hBar) m_hUpdateRect = IntRect(scrollViewRect.x() + hBar->x(), scrollViewRect.y() + hBar->y(), hBar->width(), hBar->height()); if (dy && vBar) m_vUpdateRect = IntRect(scrollViewRect.x() + vBar->x(), scrollViewRect.y() + vBar->y(), vBar->width(), vBar->height()); m_webView->addToDirtyRegion(m_scrollUpdateRect); sendExposeEvent(m_scrollUpdateRect); } #else m_webView->addToDirtyRegion(updateRect); sendExposeEvent(updateRect); #endif }