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

Side by Side 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 16 matching lines...) Expand all
27 27
28 #include "platform/graphics/GraphicsContext.h" 28 #include "platform/graphics/GraphicsContext.h"
29 #include "platform/graphics/paint/PaintCanvas.h" 29 #include "platform/graphics/paint/PaintCanvas.h"
30 #include "platform/graphics/paint/PaintRecordBuilder.h" 30 #include "platform/graphics/paint/PaintRecordBuilder.h"
31 #include "platform/scroll/Scrollbar.h" 31 #include "platform/scroll/Scrollbar.h"
32 #include "platform/scroll/ScrollbarTheme.h" 32 #include "platform/scroll/ScrollbarTheme.h"
33 #include "public/platform/WebRect.h" 33 #include "public/platform/WebRect.h"
34 34
35 namespace blink { 35 namespace blink {
36 36
37 // WebScrollbarThemeMac uses GraphicsContextCanvas which doesn't quite support
38 // device clip rects not at the origin. This class translates the recording
39 // canvas to the origin and then adjusts it back during playback.
40 class ScopedScrollbarPainter {
41 public:
42 ScopedScrollbarPainter(WebScrollbarThemePainter* painter,
43 WebCanvas* canvas,
44 const WebRect& rect)
45 : m_intRect(IntRect(IntPoint(), IntSize(rect.width, rect.height))),
46 m_builder(m_intRect),
47 m_canvas(canvas),
48 m_rect(rect) {
49 m_builder.context().setDeviceScaleFactor(painter->deviceScaleFactor());
50 }
51 GraphicsContext& context() { return m_builder.context(); }
52 const IntRect& rect() const { return m_intRect; }
53
54 ~ScopedScrollbarPainter() {
55 m_canvas->save();
56 m_canvas->translate(m_rect.x, m_rect.y);
57 m_canvas->PlaybackPaintRecord(m_builder.endRecording());
58 m_canvas->restore();
59 }
60
61 protected:
62 IntRect m_intRect;
63 PaintRecordBuilder m_builder;
64 WebCanvas* m_canvas;
65 const WebRect& m_rect;
66 };
67
37 void WebScrollbarThemePainter::assign(const WebScrollbarThemePainter& painter) { 68 void WebScrollbarThemePainter::assign(const WebScrollbarThemePainter& painter) {
38 // This is a pointer to a static object, so no ownership transferral. 69 // This is a pointer to a static object, so no ownership transferral.
39 m_theme = painter.m_theme; 70 m_theme = painter.m_theme;
40 m_scrollbar = painter.m_scrollbar; 71 m_scrollbar = painter.m_scrollbar;
41 m_deviceScaleFactor = painter.m_deviceScaleFactor; 72 m_deviceScaleFactor = painter.m_deviceScaleFactor;
42 } 73 }
43 74
44 void WebScrollbarThemePainter::reset() { 75 void WebScrollbarThemePainter::reset() {
45 m_scrollbar = nullptr; 76 m_scrollbar = nullptr;
46 } 77 }
47 78
48 void WebScrollbarThemePainter::paintScrollbarBackground(WebCanvas* canvas, 79 void WebScrollbarThemePainter::paintScrollbarBackground(WebCanvas* canvas,
49 const WebRect& rect) { 80 const WebRect& rect) {
50 SkRect clip = SkRect::MakeXYWH(rect.x, rect.y, rect.width, rect.height); 81 SkRect clip = SkRect::MakeXYWH(rect.x, rect.y, rect.width, rect.height);
51 canvas->clipRect(clip); 82 canvas->clipRect(clip);
52 83
53 IntRect intRect(rect); 84 ScopedScrollbarPainter painter(this, canvas, rect);
54 PaintRecordBuilder builder(intRect); 85 m_theme->paintScrollbarBackground(painter.context(), *m_scrollbar);
55 builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
56 m_theme->paintScrollbarBackground(builder.context(), *m_scrollbar);
57 canvas->PlaybackPaintRecord(builder.endRecording());
58 } 86 }
59 87
60 void WebScrollbarThemePainter::paintTrackBackground(WebCanvas* canvas, 88 void WebScrollbarThemePainter::paintTrackBackground(WebCanvas* canvas,
61 const WebRect& rect) { 89 const WebRect& rect) {
62 IntRect intRect(rect); 90 ScopedScrollbarPainter painter(this, canvas, rect);
63 PaintRecordBuilder builder(intRect); 91 m_theme->paintTrackBackground(painter.context(), *m_scrollbar,
64 builder.context().setDeviceScaleFactor(m_deviceScaleFactor); 92 painter.rect());
65 m_theme->paintTrackBackground(builder.context(), *m_scrollbar, intRect);
66 canvas->PlaybackPaintRecord(builder.endRecording());
67 if (!m_theme->shouldRepaintAllPartsOnInvalidation()) 93 if (!m_theme->shouldRepaintAllPartsOnInvalidation())
68 m_scrollbar->clearTrackNeedsRepaint(); 94 m_scrollbar->clearTrackNeedsRepaint();
69 } 95 }
70 96
71 void WebScrollbarThemePainter::paintBackTrackPart(WebCanvas* canvas, 97 void WebScrollbarThemePainter::paintBackTrackPart(WebCanvas* canvas,
72 const WebRect& rect) { 98 const WebRect& rect) {
73 IntRect intRect(rect); 99 ScopedScrollbarPainter painter(this, canvas, rect);
74 PaintRecordBuilder builder(intRect); 100 m_theme->paintTrackPiece(painter.context(), *m_scrollbar, painter.rect(),
75 builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
76 m_theme->paintTrackPiece(builder.context(), *m_scrollbar, intRect,
77 BackTrackPart); 101 BackTrackPart);
78 canvas->PlaybackPaintRecord(builder.endRecording());
79 } 102 }
80 103
81 void WebScrollbarThemePainter::paintForwardTrackPart(WebCanvas* canvas, 104 void WebScrollbarThemePainter::paintForwardTrackPart(WebCanvas* canvas,
82 const WebRect& rect) { 105 const WebRect& rect) {
83 IntRect intRect(rect); 106 ScopedScrollbarPainter painter(this, canvas, rect);
84 PaintRecordBuilder builder(intRect); 107 m_theme->paintTrackPiece(painter.context(), *m_scrollbar, painter.rect(),
85 builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
86 m_theme->paintTrackPiece(builder.context(), *m_scrollbar, intRect,
87 ForwardTrackPart); 108 ForwardTrackPart);
88 canvas->PlaybackPaintRecord(builder.endRecording());
89 } 109 }
90 110
91 void WebScrollbarThemePainter::paintBackButtonStart(WebCanvas* canvas, 111 void WebScrollbarThemePainter::paintBackButtonStart(WebCanvas* canvas,
92 const WebRect& rect) { 112 const WebRect& rect) {
93 IntRect intRect(rect); 113 ScopedScrollbarPainter painter(this, canvas, rect);
94 PaintRecordBuilder builder(intRect); 114 m_theme->paintButton(painter.context(), *m_scrollbar, painter.rect(),
95 builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
96 m_theme->paintButton(builder.context(), *m_scrollbar, intRect,
97 BackButtonStartPart); 115 BackButtonStartPart);
98 canvas->PlaybackPaintRecord(builder.endRecording());
99 } 116 }
100 117
101 void WebScrollbarThemePainter::paintBackButtonEnd(WebCanvas* canvas, 118 void WebScrollbarThemePainter::paintBackButtonEnd(WebCanvas* canvas,
102 const WebRect& rect) { 119 const WebRect& rect) {
103 IntRect intRect(rect); 120 ScopedScrollbarPainter painter(this, canvas, rect);
104 PaintRecordBuilder builder(intRect); 121 m_theme->paintButton(painter.context(), *m_scrollbar, painter.rect(),
105 builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
106 m_theme->paintButton(builder.context(), *m_scrollbar, intRect,
107 BackButtonEndPart); 122 BackButtonEndPart);
108 canvas->PlaybackPaintRecord(builder.endRecording());
109 } 123 }
110 124
111 void WebScrollbarThemePainter::paintForwardButtonStart(WebCanvas* canvas, 125 void WebScrollbarThemePainter::paintForwardButtonStart(WebCanvas* canvas,
112 const WebRect& rect) { 126 const WebRect& rect) {
113 IntRect intRect(rect); 127 ScopedScrollbarPainter painter(this, canvas, rect);
114 PaintRecordBuilder builder(intRect); 128 m_theme->paintButton(painter.context(), *m_scrollbar, painter.rect(),
115 builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
116 m_theme->paintButton(builder.context(), *m_scrollbar, intRect,
117 ForwardButtonStartPart); 129 ForwardButtonStartPart);
118 canvas->PlaybackPaintRecord(builder.endRecording());
119 } 130 }
120 131
121 void WebScrollbarThemePainter::paintForwardButtonEnd(WebCanvas* canvas, 132 void WebScrollbarThemePainter::paintForwardButtonEnd(WebCanvas* canvas,
122 const WebRect& rect) { 133 const WebRect& rect) {
123 IntRect intRect(rect); 134 ScopedScrollbarPainter painter(this, canvas, rect);
124 PaintRecordBuilder builder(intRect); 135 m_theme->paintButton(painter.context(), *m_scrollbar, painter.rect(),
125 builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
126 m_theme->paintButton(builder.context(), *m_scrollbar, intRect,
127 ForwardButtonEndPart); 136 ForwardButtonEndPart);
128 canvas->PlaybackPaintRecord(builder.endRecording());
129 } 137 }
130 138
131 void WebScrollbarThemePainter::paintTickmarks(WebCanvas* canvas, 139 void WebScrollbarThemePainter::paintTickmarks(WebCanvas* canvas,
132 const WebRect& rect) { 140 const WebRect& rect) {
133 IntRect intRect(rect); 141 ScopedScrollbarPainter painter(this, canvas, rect);
134 PaintRecordBuilder builder(intRect); 142 m_theme->paintTickmarks(painter.context(), *m_scrollbar, painter.rect());
135 builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
136 m_theme->paintTickmarks(builder.context(), *m_scrollbar, intRect);
137 canvas->PlaybackPaintRecord(builder.endRecording());
138 } 143 }
139 144
140 void WebScrollbarThemePainter::paintThumb(WebCanvas* canvas, 145 void WebScrollbarThemePainter::paintThumb(WebCanvas* canvas,
141 const WebRect& rect) { 146 const WebRect& rect) {
142 IntRect intRect(rect); 147 ScopedScrollbarPainter painter(this, canvas, rect);
143 PaintRecordBuilder builder(intRect); 148 m_theme->paintThumb(painter.context(), *m_scrollbar, painter.rect());
144 builder.context().setDeviceScaleFactor(m_deviceScaleFactor);
145 m_theme->paintThumb(builder.context(), *m_scrollbar, intRect);
146 canvas->PlaybackPaintRecord(builder.endRecording());
147 if (!m_theme->shouldRepaintAllPartsOnInvalidation()) 149 if (!m_theme->shouldRepaintAllPartsOnInvalidation())
148 m_scrollbar->clearThumbNeedsRepaint(); 150 m_scrollbar->clearThumbNeedsRepaint();
149 } 151 }
150 152
151 WebScrollbarThemePainter::WebScrollbarThemePainter(ScrollbarTheme& theme, 153 WebScrollbarThemePainter::WebScrollbarThemePainter(ScrollbarTheme& theme,
152 Scrollbar& scrollbar, 154 Scrollbar& scrollbar,
153 float deviceScaleFactor) 155 float deviceScaleFactor)
154 : m_theme(&theme), 156 : m_theme(&theme),
155 m_scrollbar(&scrollbar), 157 m_scrollbar(&scrollbar),
156 m_deviceScaleFactor(deviceScaleFactor) {} 158 m_deviceScaleFactor(deviceScaleFactor) {}
157 159
158 float WebScrollbarThemePainter::thumbOpacity() const { 160 float WebScrollbarThemePainter::thumbOpacity() const {
159 return m_theme->thumbOpacity(*m_scrollbar); 161 return m_theme->thumbOpacity(*m_scrollbar);
160 } 162 }
161 163
162 bool WebScrollbarThemePainter::trackNeedsRepaint() const { 164 bool WebScrollbarThemePainter::trackNeedsRepaint() const {
163 return m_scrollbar->trackNeedsRepaint(); 165 return m_scrollbar->trackNeedsRepaint();
164 } 166 }
165 167
166 bool WebScrollbarThemePainter::thumbNeedsRepaint() const { 168 bool WebScrollbarThemePainter::thumbNeedsRepaint() const {
167 return m_scrollbar->thumbNeedsRepaint(); 169 return m_scrollbar->thumbNeedsRepaint();
168 } 170 }
169 171
170 bool WebScrollbarThemePainter::usesNinePatchThumbResource() const { 172 bool WebScrollbarThemePainter::usesNinePatchThumbResource() const {
171 return m_theme->usesNinePatchThumbResource(); 173 return m_theme->usesNinePatchThumbResource();
172 } 174 }
173 175
174 } // namespace blink 176 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698