int ScrollbarTheme::trackLength(const ScrollbarThemeClient& scrollbar) { IntRect constrainedTrackRect = constrainTrackRectToTrackPieces(scrollbar, trackRect(scrollbar)); return (scrollbar.orientation() == HorizontalScrollbar) ? constrainedTrackRect.width() : constrainedTrackRect.height(); }
void ScrollbarThemeAura::paintTrackPiece(GraphicsContext& gc, const Scrollbar& scrollbar, const IntRect& rect, ScrollbarPart partType) { DisplayItem::Type displayItemType = trackPiecePartToDisplayItemType(partType); if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, displayItemType)) return; DrawingRecorder recorder(gc, scrollbar, displayItemType, rect); WebThemeEngine::State state = scrollbar.hoveredPart() == partType ? WebThemeEngine::StateHover : WebThemeEngine::StateNormal; if (useMockTheme() && !scrollbar.enabled()) state = WebThemeEngine::StateDisabled; IntRect alignRect = trackRect(scrollbar, false); WebThemeEngine::ExtraParams extraParams; extraParams.scrollbarTrack.isBack = (partType == BackTrackPart); extraParams.scrollbarTrack.trackX = alignRect.x(); extraParams.scrollbarTrack.trackY = alignRect.y(); extraParams.scrollbarTrack.trackWidth = alignRect.width(); extraParams.scrollbarTrack.trackHeight = alignRect.height(); Platform::current()->themeEngine()->paint( gc.canvas(), scrollbar.orientation() == HorizontalScrollbar ? WebThemeEngine::PartScrollbarHorizontalTrack : WebThemeEngine::PartScrollbarVerticalTrack, state, WebRect(rect), &extraParams); }
int ScrollbarTheme::trackPosition(const ScrollbarThemeClient& scrollbar) { IntRect constrainedTrackRect = constrainTrackRectToTrackPieces(scrollbar, trackRect(scrollbar)); return (scrollbar.orientation() == HorizontalScrollbar) ? constrainedTrackRect.x() - scrollbar.x() : constrainedTrackRect.y() - scrollbar.y(); }
bool ScrollbarTheme::shouldSnapBackToDragOrigin( const ScrollbarThemeClient& scrollbar, const PlatformMouseEvent& evt) { IntPoint mousePosition = scrollbar.convertFromRootFrame(evt.position()); mousePosition.move(scrollbar.x(), scrollbar.y()); return Platform::current()->scrollbarBehavior()->shouldSnapBackToDragOrigin( mousePosition, trackRect(scrollbar), scrollbar.orientation() == HorizontalScrollbar); }
IntRect Scrollbar::thumbRect() { IntRect track = trackRect(); IntRect startTrackRect; IntRect thumbRect; IntRect endTrackRect; splitTrack(track, startTrackRect, thumbRect, endTrackRect); return thumbRect; }
void ScrollbarThemeHaiku::paintScrollbarBackground(GraphicsContext* context, Scrollbar* scrollbar) { if (!be_control_look) return; BRect rect = trackRect(scrollbar, false); orientation scrollbarOrientation = scrollbar->orientation() == HorizontalScrollbar ? B_HORIZONTAL : B_VERTICAL; be_control_look->DrawScrollBarBackground(context->platformContext(), rect, rect, ui_color(B_PANEL_BACKGROUND_COLOR), 0, scrollbarOrientation); }
IntRect ScrollbarTheme::thumbRect(const ScrollbarThemeClient& scrollbar) { if (!hasThumb(scrollbar)) return IntRect(); IntRect track = trackRect(scrollbar); IntRect startTrackRect; IntRect thumbRect; IntRect endTrackRect; splitTrack(scrollbar, track, startTrackRect, thumbRect, endTrackRect); return thumbRect; }
void Scrollbar::paint(GraphicsContext* context, const IntRect& damageRect) { if (!frameRect().intersects(damageRect)) return; IntRect startTrackRect; IntRect thumbRect; IntRect endTrackRect; splitTrack(trackRect(), startTrackRect, thumbRect, endTrackRect); if (damageRect.intersects(thumbRect)) paintThumb(context, thumbRect); }
void ScrollbarTheme::invalidatePart(ScrollbarThemeClient* scrollbar, ScrollbarPart part) { if (part == NoPart) return; IntRect result; switch (part) { case BackButtonStartPart: result = backButtonRect(scrollbar, BackButtonStartPart, true); break; case BackButtonEndPart: result = backButtonRect(scrollbar, BackButtonEndPart, true); break; case ForwardButtonStartPart: result = forwardButtonRect(scrollbar, ForwardButtonStartPart, true); break; case ForwardButtonEndPart: result = forwardButtonRect(scrollbar, ForwardButtonEndPart, true); break; case TrackBGPart: result = trackRect(scrollbar, true); break; case ScrollbarBGPart: result = scrollbar->frameRect(); break; default: { IntRect beforeThumbRect, thumbRect, afterThumbRect; splitTrack(scrollbar, trackRect(scrollbar), beforeThumbRect, thumbRect, afterThumbRect); if (part == BackTrackPart) result = beforeThumbRect; else if (part == ForwardTrackPart) result = afterThumbRect; else result = thumbRect; } } result.moveBy(-scrollbar->location()); scrollbar->invalidateRect(result); }
// Zoom the note track, centering the pitch at centerY, // amount is 1 for zoom in, and -1 for zoom out void NoteTrack::Zoom(int centerY, int amount) { // Construct track rectangle to map pitch to screen coordinates // Only y and height are needed: wxRect trackRect(0, GetY(), 1, GetHeight()); PrepareIPitchToY(trackRect); int centerPitch = YToIPitch(centerY); // zoom out by changing the pitch height -- a small integer mPitchHeight += amount; if (mPitchHeight <= 0) mPitchHeight = 1; PrepareIPitchToY(trackRect); // update because mPitchHeight changed int newCenterPitch = YToIPitch(GetY() + GetHeight() / 2); // center the pitch that the user clicked on SetBottomNote(mBottomNote + (centerPitch - newCenterPitch)); }
void ScrollbarThemeWin::paintTrackPiece(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart partType) { bool horz = scrollbar->orientation() == HorizontalScrollbar; int partId; if (partType == BackTrackPart) partId = horz ? SBP_UPPERTRACKHORZ : SBP_UPPERTRACKVERT; else partId = horz ? SBP_LOWERTRACKHORZ : SBP_LOWERTRACKVERT; IntRect alignRect = trackRect(scrollbar, false); WebKit::WebCanvas* canvas = gc->canvas(); // Draw the track area before/after the thumb on the scroll bar. WebKit::Platform::current()->themeEngine()->paintScrollbarTrack(canvas, partId, getThemeState(scrollbar, partType), getClassicThemeState(scrollbar, partType), WebKit::WebRect(rect), WebKit::WebRect(alignRect)); }
void ScrollbarThemeChromiumLinux::paintTrackPiece(GraphicsContext* gc, Scrollbar* scrollbar, const IntRect& rect, ScrollbarPart partType) { ChromiumBridge::ThemePaintState state = scrollbar->hoveredPart() == partType ? ChromiumBridge::StateHover : ChromiumBridge::StateNormal; IntRect alignRect = trackRect(scrollbar, false); ChromiumBridge::ThemePaintExtraParams extraParams; extraParams.scrollbarTrack.trackX = alignRect.x(); extraParams.scrollbarTrack.trackY = alignRect.y(); extraParams.scrollbarTrack.trackWidth = alignRect.width(); extraParams.scrollbarTrack.trackHeight = alignRect.height(); ChromiumBridge::paintThemePart( gc, scrollbar->orientation() == HorizontalScrollbar ? ChromiumBridge::PartScrollbarHoriztonalTrack : ChromiumBridge::PartScrollbarVerticalTrack, state, rect, &extraParams); }
bool ScrollbarThemeChromiumWin::shouldSnapBackToDragOrigin(ScrollbarThemeClient* 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); }
ScrollbarPart ScrollbarTheme::hitTest(const ScrollbarThemeClient& scrollbar, const IntPoint& positionInRootFrame) { ScrollbarPart result = NoPart; if (!scrollbar.enabled()) return result; IntPoint testPosition = scrollbar.convertFromRootFrame(positionInRootFrame); testPosition.move(scrollbar.x(), scrollbar.y()); if (!scrollbar.frameRect().contains(testPosition)) return NoPart; result = ScrollbarBGPart; IntRect track = trackRect(scrollbar); if (track.contains(testPosition)) { IntRect beforeThumbRect; IntRect thumbRect; IntRect afterThumbRect; splitTrack(scrollbar, track, beforeThumbRect, thumbRect, afterThumbRect); if (thumbRect.contains(testPosition)) result = ThumbPart; else if (beforeThumbRect.contains(testPosition)) result = BackTrackPart; else if (afterThumbRect.contains(testPosition)) result = ForwardTrackPart; else result = TrackBGPart; } else if (backButtonRect(scrollbar, BackButtonStartPart) .contains(testPosition)) { result = BackButtonStartPart; } else if (backButtonRect(scrollbar, BackButtonEndPart) .contains(testPosition)) { result = BackButtonEndPart; } else if (forwardButtonRect(scrollbar, ForwardButtonStartPart) .contains(testPosition)) { result = ForwardButtonStartPart; } else if (forwardButtonRect(scrollbar, ForwardButtonEndPart) .contains(testPosition)) { result = ForwardButtonEndPart; } return result; }
void Scrollbar::invalidatePart(ScrollbarPart part) { if (part == NoPart) return; IntRect result; IntRect beforeThumbRect, thumbRect, afterThumbRect; splitTrack(trackRect(), beforeThumbRect, thumbRect, afterThumbRect); if (part == BackTrackPart) result = beforeThumbRect; else if (part == ForwardTrackPart) result = afterThumbRect; else result = thumbRect; result.moveBy(-location()); invalidateRect(result); }
void ScrollbarThemeChromiumWin::paintTrackPiece(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart partType) { bool horz = scrollbar->orientation() == HorizontalScrollbar; int partId; if (partType == BackTrackPart) partId = horz ? SBP_UPPERTRACKHORZ : SBP_UPPERTRACKVERT; else partId = horz ? SBP_LOWERTRACKHORZ : SBP_LOWERTRACKVERT; IntRect alignRect = trackRect(scrollbar, false); // Draw the track area before/after the thumb on the scroll bar. PlatformSupport::paintScrollbarTrack( gc, partId, getThemeState(scrollbar, partType), getClassicThemeState(scrollbar, partType), rect, alignRect); }
void NoteTrack::ZoomTo(int start, int end) { wxRect trackRect(0, GetY(), 1, GetHeight()); PrepareIPitchToY(trackRect); int topPitch = YToIPitch(start); int botPitch = YToIPitch(end); if (topPitch < botPitch) { // swap int temp = topPitch; topPitch = botPitch; botPitch = temp; } if (topPitch == botPitch) { // can't divide by zero, do something else Zoom(start, 1); return; } int trialPitchHeight = trackRect.height / (topPitch - botPitch); if (trialPitchHeight > 25) { // keep mPitchHeight in bounds [1...25] trialPitchHeight = 25; } else if (trialPitchHeight == 0) { trialPitchHeight = 1; } Zoom((start + end) / 2, trialPitchHeight - mPitchHeight); }
ScrollbarPart ScrollbarThemeComposite::hitTest(ScrollbarThemeClient* scrollbar, const PlatformMouseEvent& evt) { ScrollbarPart result = NoPart; if (!scrollbar->enabled()) return result; IntPoint mousePosition = scrollbar->convertFromContainingWindow(evt.position()); mousePosition.move(scrollbar->x(), scrollbar->y()); if (!scrollbar->frameRect().contains(mousePosition)) return NoPart; result = ScrollbarBGPart; IntRect track = trackRect(scrollbar); if (track.contains(mousePosition)) { IntRect beforeThumbRect; IntRect thumbRect; IntRect afterThumbRect; splitTrack(scrollbar, track, beforeThumbRect, thumbRect, afterThumbRect); if (thumbRect.contains(mousePosition)) result = ThumbPart; else if (beforeThumbRect.contains(mousePosition)) result = BackTrackPart; else if (afterThumbRect.contains(mousePosition)) result = ForwardTrackPart; else result = TrackBGPart; } else if (backButtonRect(scrollbar, BackButtonStartPart).contains(mousePosition)) result = BackButtonStartPart; else if (backButtonRect(scrollbar, BackButtonEndPart).contains(mousePosition)) result = BackButtonEndPart; else if (forwardButtonRect(scrollbar, ForwardButtonStartPart).contains(mousePosition)) result = ForwardButtonStartPart; else if (forwardButtonRect(scrollbar, ForwardButtonEndPart).contains(mousePosition)) result = ForwardButtonEndPart; return result; }
int ScrollbarTheme::thumbThickness(const ScrollbarThemeClient* scrollbar) { IntRect track = trackRect(scrollbar); return scrollbar->orientation() == HorizontalScrollbar ? track.height() : track.width(); }
int Scrollbar::trackPosition() { IntRect rect = trackRect(); return (orientation() == HorizontalScrollbar) ? rect.x() - x() : rect.y() - y(); }
int Scrollbar::trackLength() { IntRect rect = trackRect(); return (orientation() == HorizontalScrollbar) ? rect.width() : rect.height(); }
void AudioListItem::DrawItem(BView* view, BRect rect, bool complete) { // set background color rgb_color bgColor; if (IsSelected()) bgColor = ui_color(B_LIST_SELECTED_BACKGROUND_COLOR); else bgColor = ui_color(B_LIST_BACKGROUND_COLOR); view->SetHighColor(bgColor); view->SetLowColor(bgColor); view->FillRect(rect); // text BFont font(be_plain_font); font.SetFace(B_BOLD_FACE); view->SetFont(&font); font_height fheight; font.GetHeight(&fheight); BString track(""); if (fTrack < 9) track.Append("0"); char nummber[4]; snprintf(nummber, sizeof(nummber), "%" B_PRId32, fTrack + 1); track.Append(nummber); float trackWidth = font.StringWidth(track.String()); if (!IsSelected()) { BRect trackRect(rect.LeftTop(), BPoint(kControlPadding * 2 + trackWidth, rect.bottom)); view->SetHighColor(tint_color(ui_color(B_LIST_BACKGROUND_COLOR), 1.08)); view->FillRect(trackRect); } if (IsSelected()) view->SetHighColor(ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR)); else view->SetHighColor(ui_color(B_LIST_ITEM_TEXT_COLOR)); view->DrawString(track.String(), BPoint(kControlPadding, rect.top + fheight.ascent + fheight.descent + fheight.leading)); BString string(GetFilename()); view->TruncateString(&string, B_TRUNCATE_END, Width() - kControlPadding * 4); font.SetFace(B_REGULAR_FACE); view->SetFont(&font); view->DrawString(string.String(), BPoint(kControlPadding * 3 + trackWidth, rect.top + fheight.ascent + fheight.descent + fheight.leading)); // draw lines view->SetHighColor(tint_color(ui_color(B_CONTROL_BACKGROUND_COLOR), B_DARKEN_2_TINT)); view->StrokeLine(rect.LeftBottom(), rect.RightBottom()); view->StrokeLine(BPoint(kControlPadding * 2 + trackWidth, rect.top), BPoint(kControlPadding * 2 + trackWidth, rect.bottom)); }
bool ScrollbarThemeGtk::paint(ScrollbarThemeClient* scrollbar, GraphicsContext* graphicsContext, const IntRect& damageRect) { if (graphicsContext->paintingDisabled()) return false; // Create the ScrollbarControlPartMask based on the damageRect ScrollbarControlPartMask scrollMask = NoPart; IntRect backButtonStartPaintRect; IntRect backButtonEndPaintRect; IntRect forwardButtonStartPaintRect; IntRect forwardButtonEndPaintRect; if (hasButtons(scrollbar)) { backButtonStartPaintRect = backButtonRect(scrollbar, BackButtonStartPart, true); if (damageRect.intersects(backButtonStartPaintRect)) scrollMask |= BackButtonStartPart; backButtonEndPaintRect = backButtonRect(scrollbar, BackButtonEndPart, true); if (damageRect.intersects(backButtonEndPaintRect)) scrollMask |= BackButtonEndPart; forwardButtonStartPaintRect = forwardButtonRect(scrollbar, ForwardButtonStartPart, true); if (damageRect.intersects(forwardButtonStartPaintRect)) scrollMask |= ForwardButtonStartPart; forwardButtonEndPaintRect = forwardButtonRect(scrollbar, ForwardButtonEndPart, true); if (damageRect.intersects(forwardButtonEndPaintRect)) scrollMask |= ForwardButtonEndPart; } IntRect trackPaintRect = trackRect(scrollbar, true); if (damageRect.intersects(trackPaintRect)) scrollMask |= TrackBGPart; if (m_troughUnderSteppers && (scrollMask & BackButtonStartPart || scrollMask & BackButtonEndPart || scrollMask & ForwardButtonStartPart || scrollMask & ForwardButtonEndPart)) scrollMask |= TrackBGPart; bool thumbPresent = hasThumb(scrollbar); IntRect currentThumbRect; if (thumbPresent) { IntRect track = trackRect(scrollbar, false); currentThumbRect = thumbRect(scrollbar, track); if (damageRect.intersects(currentThumbRect)) scrollMask |= ThumbPart; } ScrollbarControlPartMask allButtons = BackButtonStartPart | BackButtonEndPart | ForwardButtonStartPart | ForwardButtonEndPart; if (scrollMask & TrackBGPart || scrollMask & ThumbPart || scrollMask & allButtons) paintScrollbarBackground(graphicsContext, scrollbar); paintTrackBackground(graphicsContext, scrollbar, trackPaintRect); // Paint the back and forward buttons. if (scrollMask & BackButtonStartPart) paintButton(graphicsContext, scrollbar, backButtonStartPaintRect, BackButtonStartPart); if (scrollMask & BackButtonEndPart) paintButton(graphicsContext, scrollbar, backButtonEndPaintRect, BackButtonEndPart); if (scrollMask & ForwardButtonStartPart) paintButton(graphicsContext, scrollbar, forwardButtonStartPaintRect, ForwardButtonStartPart); if (scrollMask & ForwardButtonEndPart) paintButton(graphicsContext, scrollbar, forwardButtonEndPaintRect, ForwardButtonEndPart); // Paint the thumb. if (scrollMask & ThumbPart) paintThumb(graphicsContext, scrollbar, currentThumbRect); return true; }
bool ScrollbarTheme::shouldSnapBackToDragOrigin(ScrollbarThemeClient* scrollbar, const PlatformMouseEvent& evt) { IntPoint mousePosition = scrollbar->convertFromContainingWindow(evt.position()); mousePosition.move(scrollbar->x(), scrollbar->y()); return Platform::current()->scrollbarBehavior()->shouldSnapBackToDragOrigin(mousePosition, trackRect(scrollbar), scrollbar->orientation() == HorizontalScrollbar); }
bool ScrollbarThemeComposite::paint(ScrollbarThemeClient* scrollbar, GraphicsContext* graphicsContext, const IntRect& damageRect) { // Create the ScrollbarControlPartMask based on the damageRect ScrollbarControlPartMask scrollMask = NoPart; IntRect backButtonStartPaintRect; IntRect backButtonEndPaintRect; IntRect forwardButtonStartPaintRect; IntRect forwardButtonEndPaintRect; if (hasButtons(scrollbar)) { backButtonStartPaintRect = backButtonRect(scrollbar, BackButtonStartPart, true); if (damageRect.intersects(backButtonStartPaintRect)) scrollMask |= BackButtonStartPart; backButtonEndPaintRect = backButtonRect(scrollbar, BackButtonEndPart, true); if (damageRect.intersects(backButtonEndPaintRect)) scrollMask |= BackButtonEndPart; forwardButtonStartPaintRect = forwardButtonRect(scrollbar, ForwardButtonStartPart, true); if (damageRect.intersects(forwardButtonStartPaintRect)) scrollMask |= ForwardButtonStartPart; forwardButtonEndPaintRect = forwardButtonRect(scrollbar, ForwardButtonEndPart, true); if (damageRect.intersects(forwardButtonEndPaintRect)) scrollMask |= ForwardButtonEndPart; } IntRect startTrackRect; IntRect thumbRect; IntRect endTrackRect; IntRect trackPaintRect = trackRect(scrollbar, true); if (damageRect.intersects(trackPaintRect)) scrollMask |= TrackBGPart; bool thumbPresent = hasThumb(scrollbar); if (thumbPresent) { IntRect track = trackRect(scrollbar); splitTrack(scrollbar, track, startTrackRect, thumbRect, endTrackRect); if (damageRect.intersects(thumbRect)) scrollMask |= ThumbPart; if (damageRect.intersects(startTrackRect)) scrollMask |= BackTrackPart; if (damageRect.intersects(endTrackRect)) scrollMask |= ForwardTrackPart; } // Paint the scrollbar background (only used by custom CSS scrollbars). paintScrollbarBackground(graphicsContext, scrollbar); // Paint the back and forward buttons. if (scrollMask & BackButtonStartPart) paintButton(graphicsContext, scrollbar, backButtonStartPaintRect, BackButtonStartPart); if (scrollMask & BackButtonEndPart) paintButton(graphicsContext, scrollbar, backButtonEndPaintRect, BackButtonEndPart); if (scrollMask & ForwardButtonStartPart) paintButton(graphicsContext, scrollbar, forwardButtonStartPaintRect, ForwardButtonStartPart); if (scrollMask & ForwardButtonEndPart) paintButton(graphicsContext, scrollbar, forwardButtonEndPaintRect, ForwardButtonEndPart); if (scrollMask & TrackBGPart) paintTrackBackground(graphicsContext, scrollbar, trackPaintRect); if ((scrollMask & ForwardTrackPart) || (scrollMask & BackTrackPart)) { // Paint the track pieces above and below the thumb. if (scrollMask & BackTrackPart) paintTrackPiece(graphicsContext, scrollbar, startTrackRect, BackTrackPart); if (scrollMask & ForwardTrackPart) paintTrackPiece(graphicsContext, scrollbar, endTrackRect, ForwardTrackPart); paintTickmarks(graphicsContext, scrollbar, trackPaintRect); } // Paint the thumb. if (scrollMask & ThumbPart) paintThumb(graphicsContext, scrollbar, thumbRect); return true; }
int ScrollbarThemeComposite::trackPosition(Scrollbar* scrollbar) { IntRect constrainedTrackRect = constrainTrackRectToTrackPieces(scrollbar, trackRect(scrollbar)); return (scrollbar->orientation() == HorizontalScrollbar) ? constrainedTrackRect.x() - scrollbar->x() : constrainedTrackRect.y() - scrollbar->y(); }
bool ScrollbarThemeComposite::paint(Scrollbar* scrollbar, GraphicsContext* graphicsContext, const IntRect& damageRect) { // Create the ScrollbarControlPartMask based on the damageRect ScrollbarControlPartMask scrollMask = NoPart; IntRect backButtonStartPaintRect; IntRect backButtonEndPaintRect; IntRect forwardButtonStartPaintRect; IntRect forwardButtonEndPaintRect; if (hasButtons(scrollbar)) { backButtonStartPaintRect = backButtonRect(scrollbar, BackButtonStartPart, true); if (damageRect.intersects(backButtonStartPaintRect)) scrollMask |= BackButtonStartPart; backButtonEndPaintRect = backButtonRect(scrollbar, BackButtonEndPart, true); if (damageRect.intersects(backButtonEndPaintRect)) scrollMask |= BackButtonEndPart; forwardButtonStartPaintRect = forwardButtonRect(scrollbar, ForwardButtonStartPart, true); if (damageRect.intersects(forwardButtonStartPaintRect)) scrollMask |= ForwardButtonStartPart; forwardButtonEndPaintRect = forwardButtonRect(scrollbar, ForwardButtonEndPart, true); if (damageRect.intersects(forwardButtonEndPaintRect)) scrollMask |= ForwardButtonEndPart; } IntRect startTrackRect; IntRect thumbRect; IntRect endTrackRect; IntRect trackPaintRect = trackRect(scrollbar, true); if (damageRect.intersects(trackPaintRect)) scrollMask |= TrackBGPart; bool thumbPresent = hasThumb(scrollbar); if (thumbPresent) { IntRect track = trackRect(scrollbar); splitTrack(scrollbar, track, startTrackRect, thumbRect, endTrackRect); if (damageRect.intersects(thumbRect)) scrollMask |= ThumbPart; if (damageRect.intersects(startTrackRect)) scrollMask |= BackTrackPart; if (damageRect.intersects(endTrackRect)) scrollMask |= ForwardTrackPart; } #if PLATFORM(WIN) // FIXME: This API makes the assumption that the custom scrollbar's metrics will match // the theme's metrics. This is not a valid assumption. The ability for a client to paint // custom scrollbars should be removed once scrollbars can be styled via CSS. if (Page* page = pageForScrollView(scrollbar->parent())) { if (page->settings()->shouldPaintCustomScrollbars()) { float proportion = static_cast<float>(scrollbar->visibleSize()) / scrollbar->totalSize(); float value = scrollbar->currentPos() / static_cast<float>(scrollbar->maximum()); ScrollbarControlState s = 0; if (scrollbar->client()->isActive()) s |= ActiveScrollbarState; if (scrollbar->enabled()) s |= EnabledScrollbarState; if (scrollbar->pressedPart() != NoPart) s |= PressedScrollbarState; if (page->chrome()->client()->paintCustomScrollbar(graphicsContext, scrollbar->frameRect(), scrollbar->controlSize(), s, scrollbar->pressedPart(), scrollbar->orientation() == VerticalScrollbar, value, proportion, scrollMask)) return true; } } #endif // Paint the scrollbar background (only used by custom CSS scrollbars). paintScrollbarBackground(graphicsContext, scrollbar); // Paint the back and forward buttons. if (scrollMask & BackButtonStartPart) paintButton(graphicsContext, scrollbar, backButtonStartPaintRect, BackButtonStartPart); if (scrollMask & BackButtonEndPart) paintButton(graphicsContext, scrollbar, backButtonEndPaintRect, BackButtonEndPart); if (scrollMask & ForwardButtonStartPart) paintButton(graphicsContext, scrollbar, forwardButtonStartPaintRect, ForwardButtonStartPart); if (scrollMask & ForwardButtonEndPart) paintButton(graphicsContext, scrollbar, forwardButtonEndPaintRect, ForwardButtonEndPart); if (scrollMask & TrackBGPart) paintTrackBackground(graphicsContext, scrollbar, trackPaintRect); if ((scrollMask & ForwardTrackPart) || (scrollMask & BackTrackPart)) { // Paint the track pieces above and below the thumb. if (scrollMask & BackTrackPart) paintTrackPiece(graphicsContext, scrollbar, startTrackRect, BackTrackPart); if (scrollMask & ForwardTrackPart) paintTrackPiece(graphicsContext, scrollbar, endTrackRect, ForwardTrackPart); paintTickmarks(graphicsContext, scrollbar, trackPaintRect); } // Paint the thumb. if (scrollMask & ThumbPart) paintThumb(graphicsContext, scrollbar, thumbRect); return true; }