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()]); }
IntRect ScrollbarThemeWin::trackRect(Scrollbar& scrollbar, bool) { int thickness = scrollbarThickness(); if (scrollbar.orientation() == HorizontalScrollbar) { if (scrollbar.width() < 2 * thickness) return IntRect(); return IntRect(scrollbar.x() + thickness, scrollbar.y(), scrollbar.width() - 2 * thickness, thickness); } if (scrollbar.height() < 2 * thickness) return IntRect(); return IntRect(scrollbar.x(), scrollbar.y() + thickness, thickness, scrollbar.height() - 2 * thickness); }
void PopupMenuWin::invalidateScrollbarRect(Scrollbar& scrollbar, const IntRect& rect) { IntRect scrollRect = rect; scrollRect.move(scrollbar.x(), scrollbar.y()); RECT r = scrollRect; ::InvalidateRect(m_popup, &r, false); }
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; }
IntRect ScrollbarThemeSafari::backButtonRect(Scrollbar& scrollbar, ScrollbarPart part, bool painting) { IntRect result; // Windows just has single arrows. if (part == BackButtonEndPart) return result; int thickness = scrollbarThickness(scrollbar.controlSize()); if (scrollbar.orientation() == HorizontalScrollbar) result = IntRect(scrollbar.x(), scrollbar.y(), cButtonLength[scrollbar.controlSize()], thickness); else result = IntRect(scrollbar.x(), scrollbar.y(), thickness, cButtonLength[scrollbar.controlSize()]); if (painting) return buttonRepaintRect(result, scrollbar.orientation(), scrollbar.controlSize(), true); return result; }
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); }
bool ScrollbarThemeWin::shouldSnapBackToDragOrigin(Scrollbar& scrollbar, const PlatformMouseEvent& evt) { // Find the rect within which we shouldn't snap, by expanding the track rect // in both dimensions. IntRect rect = trackRect(scrollbar); const bool horz = scrollbar.orientation() == HorizontalScrollbar; const int thickness = scrollbarThickness(scrollbar.controlSize()); rect.inflateX((horz ? kOffEndMultiplier : kOffSideMultiplier) * thickness); rect.inflateY((horz ? kOffSideMultiplier : kOffEndMultiplier) * thickness); // Convert the event to local coordinates. IntPoint mousePosition = scrollbar.convertFromContainingWindow(evt.position()); mousePosition.move(scrollbar.x(), scrollbar.y()); // We should snap iff the event is outside our calculated rect. return !rect.contains(mousePosition); }
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 }