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

Side by Side Diff: third_party/WebKit/Source/platform/exported/WebScrollbarThemePainter.cpp

Issue 1841833002: Deal gracefully with null {GraphicsContext,SkPictureBuilder}.endRecording() results. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Don't end recording twice in DrawingRecorder. Created 4 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 29 matching lines...) Expand all
40 m_theme = painter.m_theme; 40 m_theme = painter.m_theme;
41 m_scrollbar = painter.m_scrollbar; 41 m_scrollbar = painter.m_scrollbar;
42 m_deviceScaleFactor = painter.m_deviceScaleFactor; 42 m_deviceScaleFactor = painter.m_deviceScaleFactor;
43 } 43 }
44 44
45 void WebScrollbarThemePainter::reset() 45 void WebScrollbarThemePainter::reset()
46 { 46 {
47 m_scrollbar = nullptr; 47 m_scrollbar = nullptr;
48 } 48 }
49 49
50 static void playback(SkPictureBuilder* builder, WebCanvas* canvas)
51 {
52 RefPtr<const SkPicture> recording = builder->endRecording();
53 if (recording)
54 recording->playback(canvas);
55 }
56
50 void WebScrollbarThemePainter::paintScrollbarBackground(WebCanvas* canvas, const WebRect& rect) 57 void WebScrollbarThemePainter::paintScrollbarBackground(WebCanvas* canvas, const WebRect& rect)
51 { 58 {
52 SkRect clip = SkRect::MakeXYWH(rect.x, rect.y, rect.width, rect.height); 59 SkRect clip = SkRect::MakeXYWH(rect.x, rect.y, rect.width, rect.height);
53 canvas->clipRect(clip); 60 canvas->clipRect(clip);
54 61
55 IntRect intRect(rect); 62 IntRect intRect(rect);
56 SkPictureBuilder pictureBuilder(intRect); 63 SkPictureBuilder pictureBuilder(intRect);
57 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor); 64 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor);
58 m_theme->paintScrollbarBackground(pictureBuilder.context(), *m_scrollbar); 65 m_theme->paintScrollbarBackground(pictureBuilder.context(), *m_scrollbar);
59 pictureBuilder.endRecording()->playback(canvas); 66 playback(&pictureBuilder, canvas);
60 } 67 }
61 68
62 void WebScrollbarThemePainter::paintTrackBackground(WebCanvas* canvas, const Web Rect& rect) 69 void WebScrollbarThemePainter::paintTrackBackground(WebCanvas* canvas, const Web Rect& rect)
63 { 70 {
64 IntRect intRect(rect); 71 IntRect intRect(rect);
65 SkPictureBuilder pictureBuilder(intRect); 72 SkPictureBuilder pictureBuilder(intRect);
66 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor); 73 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor);
67 m_theme->paintTrackBackground(pictureBuilder.context(), *m_scrollbar, intRec t); 74 m_theme->paintTrackBackground(pictureBuilder.context(), *m_scrollbar, intRec t);
68 pictureBuilder.endRecording()->playback(canvas); 75 playback(&pictureBuilder, canvas);
69 if (!m_theme->shouldRepaintAllPartsOnInvalidation()) 76 if (!m_theme->shouldRepaintAllPartsOnInvalidation())
70 m_scrollbar->clearTrackNeedsRepaint(); 77 m_scrollbar->clearTrackNeedsRepaint();
71 } 78 }
72 79
73 void WebScrollbarThemePainter::paintBackTrackPart(WebCanvas* canvas, const WebRe ct& rect) 80 void WebScrollbarThemePainter::paintBackTrackPart(WebCanvas* canvas, const WebRe ct& rect)
74 { 81 {
75 IntRect intRect(rect); 82 IntRect intRect(rect);
76 SkPictureBuilder pictureBuilder(intRect); 83 SkPictureBuilder pictureBuilder(intRect);
77 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor); 84 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor);
78 m_theme->paintTrackPiece(pictureBuilder.context(), *m_scrollbar, intRect, Ba ckTrackPart); 85 m_theme->paintTrackPiece(pictureBuilder.context(), *m_scrollbar, intRect, Ba ckTrackPart);
79 pictureBuilder.endRecording()->playback(canvas); 86 playback(&pictureBuilder, canvas);
80 } 87 }
81 88
82 void WebScrollbarThemePainter::paintForwardTrackPart(WebCanvas* canvas, const We bRect& rect) 89 void WebScrollbarThemePainter::paintForwardTrackPart(WebCanvas* canvas, const We bRect& rect)
83 { 90 {
84 IntRect intRect(rect); 91 IntRect intRect(rect);
85 SkPictureBuilder pictureBuilder(intRect); 92 SkPictureBuilder pictureBuilder(intRect);
86 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor); 93 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor);
87 m_theme->paintTrackPiece(pictureBuilder.context(), *m_scrollbar, intRect, Fo rwardTrackPart); 94 m_theme->paintTrackPiece(pictureBuilder.context(), *m_scrollbar, intRect, Fo rwardTrackPart);
88 pictureBuilder.endRecording()->playback(canvas); 95 playback(&pictureBuilder, canvas);
89 } 96 }
90 97
91 void WebScrollbarThemePainter::paintBackButtonStart(WebCanvas* canvas, const Web Rect& rect) 98 void WebScrollbarThemePainter::paintBackButtonStart(WebCanvas* canvas, const Web Rect& rect)
92 { 99 {
93 IntRect intRect(rect); 100 IntRect intRect(rect);
94 SkPictureBuilder pictureBuilder(intRect); 101 SkPictureBuilder pictureBuilder(intRect);
95 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor); 102 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor);
96 m_theme->paintButton(pictureBuilder.context(), *m_scrollbar, intRect, BackBu ttonStartPart); 103 m_theme->paintButton(pictureBuilder.context(), *m_scrollbar, intRect, BackBu ttonStartPart);
97 pictureBuilder.endRecording()->playback(canvas); 104 playback(&pictureBuilder, canvas);
98 } 105 }
99 106
100 void WebScrollbarThemePainter::paintBackButtonEnd(WebCanvas* canvas, const WebRe ct& rect) 107 void WebScrollbarThemePainter::paintBackButtonEnd(WebCanvas* canvas, const WebRe ct& rect)
101 { 108 {
102 IntRect intRect(rect); 109 IntRect intRect(rect);
103 SkPictureBuilder pictureBuilder(intRect); 110 SkPictureBuilder pictureBuilder(intRect);
104 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor); 111 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor);
105 m_theme->paintButton(pictureBuilder.context(), *m_scrollbar, intRect, BackBu ttonEndPart); 112 m_theme->paintButton(pictureBuilder.context(), *m_scrollbar, intRect, BackBu ttonEndPart);
106 pictureBuilder.endRecording()->playback(canvas); 113 playback(&pictureBuilder, canvas);
107 } 114 }
108 115
109 void WebScrollbarThemePainter::paintForwardButtonStart(WebCanvas* canvas, const WebRect& rect) 116 void WebScrollbarThemePainter::paintForwardButtonStart(WebCanvas* canvas, const WebRect& rect)
110 { 117 {
111 IntRect intRect(rect); 118 IntRect intRect(rect);
112 SkPictureBuilder pictureBuilder(intRect); 119 SkPictureBuilder pictureBuilder(intRect);
113 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor); 120 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor);
114 m_theme->paintButton(pictureBuilder.context(), *m_scrollbar, intRect, Forwar dButtonStartPart); 121 m_theme->paintButton(pictureBuilder.context(), *m_scrollbar, intRect, Forwar dButtonStartPart);
115 pictureBuilder.endRecording()->playback(canvas); 122 playback(&pictureBuilder, canvas);
116 } 123 }
117 124
118 void WebScrollbarThemePainter::paintForwardButtonEnd(WebCanvas* canvas, const We bRect& rect) 125 void WebScrollbarThemePainter::paintForwardButtonEnd(WebCanvas* canvas, const We bRect& rect)
119 { 126 {
120 IntRect intRect(rect); 127 IntRect intRect(rect);
121 SkPictureBuilder pictureBuilder(intRect); 128 SkPictureBuilder pictureBuilder(intRect);
122 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor); 129 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor);
123 m_theme->paintButton(pictureBuilder.context(), *m_scrollbar, intRect, Forwar dButtonEndPart); 130 m_theme->paintButton(pictureBuilder.context(), *m_scrollbar, intRect, Forwar dButtonEndPart);
124 pictureBuilder.endRecording()->playback(canvas); 131 playback(&pictureBuilder, canvas);
125 } 132 }
126 133
127 void WebScrollbarThemePainter::paintTickmarks(WebCanvas* canvas, const WebRect& rect) 134 void WebScrollbarThemePainter::paintTickmarks(WebCanvas* canvas, const WebRect& rect)
128 { 135 {
129 IntRect intRect(rect); 136 IntRect intRect(rect);
130 SkPictureBuilder pictureBuilder(intRect); 137 SkPictureBuilder pictureBuilder(intRect);
131 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor); 138 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor);
132 m_theme->paintTickmarks(pictureBuilder.context(), *m_scrollbar, intRect); 139 m_theme->paintTickmarks(pictureBuilder.context(), *m_scrollbar, intRect);
133 pictureBuilder.endRecording()->playback(canvas); 140 playback(&pictureBuilder, canvas);
134 } 141 }
135 142
136 void WebScrollbarThemePainter::paintThumb(WebCanvas* canvas, const WebRect& rect ) 143 void WebScrollbarThemePainter::paintThumb(WebCanvas* canvas, const WebRect& rect )
137 { 144 {
138 IntRect intRect(rect); 145 IntRect intRect(rect);
139 SkPictureBuilder pictureBuilder(intRect); 146 SkPictureBuilder pictureBuilder(intRect);
140 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor); 147 pictureBuilder.context().setDeviceScaleFactor(m_deviceScaleFactor);
141 m_theme->paintThumb(pictureBuilder.context(), *m_scrollbar, intRect); 148 m_theme->paintThumb(pictureBuilder.context(), *m_scrollbar, intRect);
142 pictureBuilder.endRecording()->playback(canvas); 149 playback(&pictureBuilder, canvas);
143 if (!m_theme->shouldRepaintAllPartsOnInvalidation()) 150 if (!m_theme->shouldRepaintAllPartsOnInvalidation())
144 m_scrollbar->clearThumbNeedsRepaint(); 151 m_scrollbar->clearThumbNeedsRepaint();
145 } 152 }
146 153
147 WebScrollbarThemePainter::WebScrollbarThemePainter(ScrollbarTheme& theme, Scroll bar& scrollbar, float deviceScaleFactor) 154 WebScrollbarThemePainter::WebScrollbarThemePainter(ScrollbarTheme& theme, Scroll bar& scrollbar, float deviceScaleFactor)
148 : m_theme(&theme) 155 : m_theme(&theme)
149 , m_scrollbar(&scrollbar) 156 , m_scrollbar(&scrollbar)
150 , m_deviceScaleFactor(deviceScaleFactor) 157 , m_deviceScaleFactor(deviceScaleFactor)
151 { 158 {
152 } 159 }
153 160
154 float WebScrollbarThemePainter::thumbOpacity() const 161 float WebScrollbarThemePainter::thumbOpacity() const
155 { 162 {
156 return m_theme->thumbOpacity(*m_scrollbar); 163 return m_theme->thumbOpacity(*m_scrollbar);
157 } 164 }
158 165
159 bool WebScrollbarThemePainter::trackNeedsRepaint() const 166 bool WebScrollbarThemePainter::trackNeedsRepaint() const
160 { 167 {
161 return m_scrollbar->trackNeedsRepaint(); 168 return m_scrollbar->trackNeedsRepaint();
162 } 169 }
163 170
164 bool WebScrollbarThemePainter::thumbNeedsRepaint() const 171 bool WebScrollbarThemePainter::thumbNeedsRepaint() const
165 { 172 {
166 return m_scrollbar->thumbNeedsRepaint(); 173 return m_scrollbar->thumbNeedsRepaint();
167 } 174 }
168 175
169 } // namespace blink 176 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698