| Index: third_party/WebKit/Source/platform/exported/WebScrollbarThemePainter.cpp
|
| diff --git a/third_party/WebKit/Source/platform/exported/WebScrollbarThemePainter.cpp b/third_party/WebKit/Source/platform/exported/WebScrollbarThemePainter.cpp
|
| index 374b3a93968443c9c54e14bd95021ca41dedf534..54dd43abd61fb910e88febab5787c1dd1d4411fb 100644
|
| --- a/third_party/WebKit/Source/platform/exported/WebScrollbarThemePainter.cpp
|
| +++ b/third_party/WebKit/Source/platform/exported/WebScrollbarThemePainter.cpp
|
| @@ -34,6 +34,37 @@
|
|
|
| namespace blink {
|
|
|
| +// WebScrollbarThemeMac uses GraphicsContextCanvas which doesn't quite support
|
| +// device clip rects not at the origin. This class translates the recording
|
| +// canvas to the origin and then adjusts it back during playback.
|
| +class ScopedScrollbarPainter {
|
| + public:
|
| + ScopedScrollbarPainter(WebScrollbarThemePainter* painter,
|
| + WebCanvas* canvas,
|
| + const WebRect& rect)
|
| + : m_intRect(IntRect(IntPoint(), IntSize(rect.width, rect.height))),
|
| + m_builder(m_intRect),
|
| + m_canvas(canvas),
|
| + m_rect(rect) {
|
| + m_builder.context().setDeviceScaleFactor(painter->deviceScaleFactor());
|
| + }
|
| + GraphicsContext& context() { return m_builder.context(); }
|
| + const IntRect& rect() const { return m_intRect; }
|
| +
|
| + ~ScopedScrollbarPainter() {
|
| + m_canvas->save();
|
| + m_canvas->translate(m_rect.x, m_rect.y);
|
| + m_canvas->PlaybackPaintRecord(m_builder.endRecording());
|
| + m_canvas->restore();
|
| + }
|
| +
|
| + protected:
|
| + IntRect m_intRect;
|
| + PaintRecordBuilder m_builder;
|
| + WebCanvas* m_canvas;
|
| + const WebRect& m_rect;
|
| +};
|
| +
|
| void WebScrollbarThemePainter::assign(const WebScrollbarThemePainter& painter) {
|
| // This is a pointer to a static object, so no ownership transferral.
|
| m_theme = painter.m_theme;
|
| @@ -50,100 +81,71 @@ void WebScrollbarThemePainter::paintScrollbarBackground(WebCanvas* canvas,
|
| SkRect clip = SkRect::MakeXYWH(rect.x, rect.y, rect.width, rect.height);
|
| canvas->clipRect(clip);
|
|
|
| - IntRect intRect(rect);
|
| - PaintRecordBuilder builder(intRect);
|
| - builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
|
| - m_theme->paintScrollbarBackground(builder.context(), *m_scrollbar);
|
| - canvas->PlaybackPaintRecord(builder.endRecording());
|
| + ScopedScrollbarPainter painter(this, canvas, rect);
|
| + m_theme->paintScrollbarBackground(painter.context(), *m_scrollbar);
|
| }
|
|
|
| void WebScrollbarThemePainter::paintTrackBackground(WebCanvas* canvas,
|
| const WebRect& rect) {
|
| - IntRect intRect(rect);
|
| - PaintRecordBuilder builder(intRect);
|
| - builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
|
| - m_theme->paintTrackBackground(builder.context(), *m_scrollbar, intRect);
|
| - canvas->PlaybackPaintRecord(builder.endRecording());
|
| + ScopedScrollbarPainter painter(this, canvas, rect);
|
| + m_theme->paintTrackBackground(painter.context(), *m_scrollbar,
|
| + painter.rect());
|
| if (!m_theme->shouldRepaintAllPartsOnInvalidation())
|
| m_scrollbar->clearTrackNeedsRepaint();
|
| }
|
|
|
| void WebScrollbarThemePainter::paintBackTrackPart(WebCanvas* canvas,
|
| const WebRect& rect) {
|
| - IntRect intRect(rect);
|
| - PaintRecordBuilder builder(intRect);
|
| - builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
|
| - m_theme->paintTrackPiece(builder.context(), *m_scrollbar, intRect,
|
| + ScopedScrollbarPainter painter(this, canvas, rect);
|
| + m_theme->paintTrackPiece(painter.context(), *m_scrollbar, painter.rect(),
|
| BackTrackPart);
|
| - canvas->PlaybackPaintRecord(builder.endRecording());
|
| }
|
|
|
| void WebScrollbarThemePainter::paintForwardTrackPart(WebCanvas* canvas,
|
| const WebRect& rect) {
|
| - IntRect intRect(rect);
|
| - PaintRecordBuilder builder(intRect);
|
| - builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
|
| - m_theme->paintTrackPiece(builder.context(), *m_scrollbar, intRect,
|
| + ScopedScrollbarPainter painter(this, canvas, rect);
|
| + m_theme->paintTrackPiece(painter.context(), *m_scrollbar, painter.rect(),
|
| ForwardTrackPart);
|
| - canvas->PlaybackPaintRecord(builder.endRecording());
|
| }
|
|
|
| void WebScrollbarThemePainter::paintBackButtonStart(WebCanvas* canvas,
|
| const WebRect& rect) {
|
| - IntRect intRect(rect);
|
| - PaintRecordBuilder builder(intRect);
|
| - builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
|
| - m_theme->paintButton(builder.context(), *m_scrollbar, intRect,
|
| + ScopedScrollbarPainter painter(this, canvas, rect);
|
| + m_theme->paintButton(painter.context(), *m_scrollbar, painter.rect(),
|
| BackButtonStartPart);
|
| - canvas->PlaybackPaintRecord(builder.endRecording());
|
| }
|
|
|
| void WebScrollbarThemePainter::paintBackButtonEnd(WebCanvas* canvas,
|
| const WebRect& rect) {
|
| - IntRect intRect(rect);
|
| - PaintRecordBuilder builder(intRect);
|
| - builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
|
| - m_theme->paintButton(builder.context(), *m_scrollbar, intRect,
|
| + ScopedScrollbarPainter painter(this, canvas, rect);
|
| + m_theme->paintButton(painter.context(), *m_scrollbar, painter.rect(),
|
| BackButtonEndPart);
|
| - canvas->PlaybackPaintRecord(builder.endRecording());
|
| }
|
|
|
| void WebScrollbarThemePainter::paintForwardButtonStart(WebCanvas* canvas,
|
| const WebRect& rect) {
|
| - IntRect intRect(rect);
|
| - PaintRecordBuilder builder(intRect);
|
| - builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
|
| - m_theme->paintButton(builder.context(), *m_scrollbar, intRect,
|
| + ScopedScrollbarPainter painter(this, canvas, rect);
|
| + m_theme->paintButton(painter.context(), *m_scrollbar, painter.rect(),
|
| ForwardButtonStartPart);
|
| - canvas->PlaybackPaintRecord(builder.endRecording());
|
| }
|
|
|
| void WebScrollbarThemePainter::paintForwardButtonEnd(WebCanvas* canvas,
|
| const WebRect& rect) {
|
| - IntRect intRect(rect);
|
| - PaintRecordBuilder builder(intRect);
|
| - builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
|
| - m_theme->paintButton(builder.context(), *m_scrollbar, intRect,
|
| + ScopedScrollbarPainter painter(this, canvas, rect);
|
| + m_theme->paintButton(painter.context(), *m_scrollbar, painter.rect(),
|
| ForwardButtonEndPart);
|
| - canvas->PlaybackPaintRecord(builder.endRecording());
|
| }
|
|
|
| void WebScrollbarThemePainter::paintTickmarks(WebCanvas* canvas,
|
| const WebRect& rect) {
|
| - IntRect intRect(rect);
|
| - PaintRecordBuilder builder(intRect);
|
| - builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
|
| - m_theme->paintTickmarks(builder.context(), *m_scrollbar, intRect);
|
| - canvas->PlaybackPaintRecord(builder.endRecording());
|
| + ScopedScrollbarPainter painter(this, canvas, rect);
|
| + m_theme->paintTickmarks(painter.context(), *m_scrollbar, painter.rect());
|
| }
|
|
|
| void WebScrollbarThemePainter::paintThumb(WebCanvas* canvas,
|
| const WebRect& rect) {
|
| - IntRect intRect(rect);
|
| - PaintRecordBuilder builder(intRect);
|
| - builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
|
| - m_theme->paintThumb(builder.context(), *m_scrollbar, intRect);
|
| - canvas->PlaybackPaintRecord(builder.endRecording());
|
| + ScopedScrollbarPainter painter(this, canvas, rect);
|
| + m_theme->paintThumb(painter.context(), *m_scrollbar, painter.rect());
|
| if (!m_theme->shouldRepaintAllPartsOnInvalidation())
|
| m_scrollbar->clearThumbNeedsRepaint();
|
| }
|
|
|