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

Side by Side Diff: chrome/browser/ui/views/frame/windows_10_caption_button.cc

Issue 2717943002: Fix cc/paint skia type mismatches (Closed)
Patch Set: Rebase Created 3 years, 9 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 // Copyright (c) 2016 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/frame/windows_10_caption_button.h" 5 #include "chrome/browser/ui/views/frame/windows_10_caption_button.h"
6 6
7 #include "chrome/browser/themes/theme_properties.h" 7 #include "chrome/browser/themes/theme_properties.h"
8 #include "chrome/browser/ui/views/frame/browser_view.h" 8 #include "chrome/browser/ui/views/frame/browser_view.h"
9 #include "chrome/browser/ui/views/frame/glass_browser_frame_view.h" 9 #include "chrome/browser/ui/views/frame/glass_browser_frame_view.h"
10 #include "chrome/grit/theme_resources.h" 10 #include "chrome/grit/theme_resources.h"
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 SK_AlphaTRANSPARENT, hovered_alpha); 108 SK_AlphaTRANSPARENT, hovered_alpha);
109 canvas->FillRect(GetContentsBounds(), SkColorSetA(base_color, alpha)); 109 canvas->FillRect(GetContentsBounds(), SkColorSetA(base_color, alpha));
110 } 110 }
111 111
112 namespace { 112 namespace {
113 113
114 // Canvas::DrawRect's stroke can bleed out of |rect|'s bounds, so this draws a 114 // Canvas::DrawRect's stroke can bleed out of |rect|'s bounds, so this draws a
115 // rectangle inset such that the result is constrained to |rect|'s size. 115 // rectangle inset such that the result is constrained to |rect|'s size.
116 void DrawRect(gfx::Canvas* canvas, 116 void DrawRect(gfx::Canvas* canvas,
117 const gfx::Rect& rect, 117 const gfx::Rect& rect,
118 const SkPaint& paint) { 118 const cc::PaintFlags& flags) {
119 gfx::RectF rect_f(rect); 119 gfx::RectF rect_f(rect);
120 float stroke_half_width = paint.getStrokeWidth() / 2; 120 float stroke_half_width = flags.getStrokeWidth() / 2;
121 rect_f.Inset(stroke_half_width, stroke_half_width); 121 rect_f.Inset(stroke_half_width, stroke_half_width);
122 canvas->DrawRect(rect_f, paint); 122 canvas->DrawRect(rect_f, flags);
123 } 123 }
124 124
125 } // namespace 125 } // namespace
126 126
127 void Windows10CaptionButton::PaintSymbol(gfx::Canvas* canvas) { 127 void Windows10CaptionButton::PaintSymbol(gfx::Canvas* canvas) {
128 SkColor symbol_color = GetBaseColor(); 128 SkColor symbol_color = GetBaseColor();
129 if (!frame_view_->ShouldPaintAsActive() && state() != STATE_HOVERED && 129 if (!frame_view_->ShouldPaintAsActive() && state() != STATE_HOVERED &&
130 state() != STATE_PRESSED) { 130 state() != STATE_PRESSED) {
131 symbol_color = SkColorSetA(symbol_color, 0x65); 131 symbol_color = SkColorSetA(symbol_color, 0x65);
132 } else if (button_type_ == VIEW_ID_CLOSE_BUTTON && 132 } else if (button_type_ == VIEW_ID_CLOSE_BUTTON &&
133 hover_animation().is_animating()) { 133 hover_animation().is_animating()) {
134 symbol_color = gfx::Tween::ColorValueBetween( 134 symbol_color = gfx::Tween::ColorValueBetween(
135 hover_animation().GetCurrentValue(), symbol_color, SK_ColorWHITE); 135 hover_animation().GetCurrentValue(), symbol_color, SK_ColorWHITE);
136 } else if (button_type_ == VIEW_ID_CLOSE_BUTTON && 136 } else if (button_type_ == VIEW_ID_CLOSE_BUTTON &&
137 (state() == STATE_HOVERED || state() == STATE_PRESSED)) { 137 (state() == STATE_HOVERED || state() == STATE_PRESSED)) {
138 symbol_color = SK_ColorWHITE; 138 symbol_color = SK_ColorWHITE;
139 } 139 }
140 140
141 gfx::ScopedCanvas scoped_canvas(canvas); 141 gfx::ScopedCanvas scoped_canvas(canvas);
142 const float scale = canvas->UndoDeviceScaleFactor(); 142 const float scale = canvas->UndoDeviceScaleFactor();
143 143
144 const int symbol_size_pixels = std::round(10 * scale); 144 const int symbol_size_pixels = std::round(10 * scale);
145 gfx::RectF bounds_rect(GetContentsBounds()); 145 gfx::RectF bounds_rect(GetContentsBounds());
146 bounds_rect.Scale(scale); 146 bounds_rect.Scale(scale);
147 gfx::Rect symbol_rect(gfx::ToEnclosingRect(bounds_rect)); 147 gfx::Rect symbol_rect(gfx::ToEnclosingRect(bounds_rect));
148 symbol_rect.ClampToCenteredSize( 148 symbol_rect.ClampToCenteredSize(
149 gfx::Size(symbol_size_pixels, symbol_size_pixels)); 149 gfx::Size(symbol_size_pixels, symbol_size_pixels));
150 150
151 SkPaint paint; 151 cc::PaintFlags flags;
152 paint.setAntiAlias(false); 152 flags.setAntiAlias(false);
153 paint.setColor(symbol_color); 153 flags.setColor(symbol_color);
154 paint.setStyle(SkPaint::kStroke_Style); 154 flags.setStyle(cc::PaintFlags::kStroke_Style);
155 // Stroke width jumps up a pixel every time we reach a new integral scale. 155 // Stroke width jumps up a pixel every time we reach a new integral scale.
156 const int stroke_width = std::floor(scale); 156 const int stroke_width = std::floor(scale);
157 paint.setStrokeWidth(stroke_width); 157 flags.setStrokeWidth(stroke_width);
158 158
159 switch (button_type_) { 159 switch (button_type_) {
160 case VIEW_ID_MINIMIZE_BUTTON: { 160 case VIEW_ID_MINIMIZE_BUTTON: {
161 const int y = symbol_rect.CenterPoint().y(); 161 const int y = symbol_rect.CenterPoint().y();
162 const gfx::Point p1 = gfx::Point(symbol_rect.x(), y); 162 const gfx::Point p1 = gfx::Point(symbol_rect.x(), y);
163 const gfx::Point p2 = gfx::Point(symbol_rect.right(), y); 163 const gfx::Point p2 = gfx::Point(symbol_rect.right(), y);
164 canvas->DrawLine(p1, p2, paint); 164 canvas->DrawLine(p1, p2, flags);
165 return; 165 return;
166 } 166 }
167 167
168 case VIEW_ID_MAXIMIZE_BUTTON: 168 case VIEW_ID_MAXIMIZE_BUTTON:
169 DrawRect(canvas, symbol_rect, paint); 169 DrawRect(canvas, symbol_rect, flags);
170 return; 170 return;
171 171
172 case VIEW_ID_RESTORE_BUTTON: { 172 case VIEW_ID_RESTORE_BUTTON: {
173 // Bottom left ("in front") square. 173 // Bottom left ("in front") square.
174 const int separation = std::floor(2 * scale); 174 const int separation = std::floor(2 * scale);
175 symbol_rect.Inset(0, separation, separation, 0); 175 symbol_rect.Inset(0, separation, separation, 0);
176 DrawRect(canvas, symbol_rect, paint); 176 DrawRect(canvas, symbol_rect, flags);
177 177
178 // Top right ("behind") square. 178 // Top right ("behind") square.
179 canvas->ClipRect(symbol_rect, SkClipOp::kDifference); 179 canvas->ClipRect(symbol_rect, SkClipOp::kDifference);
180 symbol_rect.Offset(separation, -separation); 180 symbol_rect.Offset(separation, -separation);
181 DrawRect(canvas, symbol_rect, paint); 181 DrawRect(canvas, symbol_rect, flags);
182 return; 182 return;
183 } 183 }
184 184
185 case VIEW_ID_CLOSE_BUTTON: { 185 case VIEW_ID_CLOSE_BUTTON: {
186 paint.setAntiAlias(true); 186 flags.setAntiAlias(true);
187 // The close button's X is surrounded by a "halo" of transparent pixels. 187 // The close button's X is surrounded by a "halo" of transparent pixels.
188 // When the X is white, the transparent pixels need to be a bit brighter 188 // When the X is white, the transparent pixels need to be a bit brighter
189 // to be visible. 189 // to be visible.
190 const float stroke_halo = 190 const float stroke_halo =
191 stroke_width * (symbol_color == SK_ColorWHITE ? 0.1f : 0.05f); 191 stroke_width * (symbol_color == SK_ColorWHITE ? 0.1f : 0.05f);
192 paint.setStrokeWidth(stroke_width + stroke_halo); 192 flags.setStrokeWidth(stroke_width + stroke_halo);
193 193
194 // TODO(bsep): This sometimes draws misaligned at fractional device scales 194 // TODO(bsep): This sometimes draws misaligned at fractional device scales
195 // because the button's origin isn't necessarily aligned to pixels. 195 // because the button's origin isn't necessarily aligned to pixels.
196 canvas->ClipRect(symbol_rect); 196 canvas->ClipRect(symbol_rect);
197 SkPath path; 197 SkPath path;
198 path.moveTo(symbol_rect.x(), symbol_rect.y()); 198 path.moveTo(symbol_rect.x(), symbol_rect.y());
199 path.lineTo(symbol_rect.right(), symbol_rect.bottom()); 199 path.lineTo(symbol_rect.right(), symbol_rect.bottom());
200 path.moveTo(symbol_rect.right(), symbol_rect.y()); 200 path.moveTo(symbol_rect.right(), symbol_rect.y());
201 path.lineTo(symbol_rect.x(), symbol_rect.bottom()); 201 path.lineTo(symbol_rect.x(), symbol_rect.bottom());
202 canvas->DrawPath(path, paint); 202 canvas->DrawPath(path, flags);
203 return; 203 return;
204 } 204 }
205 205
206 default: 206 default:
207 NOTREACHED(); 207 NOTREACHED();
208 return; 208 return;
209 } 209 }
210 } 210 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/frame/glass_browser_frame_view.cc ('k') | components/printing/renderer/print_web_view_helper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698