Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(740)

Unified Diff: third_party/WebKit/Source/platform/exported/WebScrollbarThemePainter.cpp

Issue 2768143002: Back PaintRecord with PaintOpBuffer instead of SkPicture (Closed)
Patch Set: Fix win build Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698