Index: chrome/browser/ui/views/location_bar/location_bar_view.cc |
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc |
index c39d2fca8b57c5ccc74d5a93ffc65eb87a2dfdf6..b2bc2fae7eb4675d0390c6dadcbaccac0fc2cbd9 100644 |
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc |
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc |
@@ -70,6 +70,8 @@ |
#include "extensions/common/feature_switch.h" |
#include "grit/components_scaled_resources.h" |
#include "grit/theme_resources.h" |
+#include "third_party/skia/include/core/SkPath.h" |
+#include "third_party/skia/include/pathops/SkPathOps.h" |
#include "ui/accessibility/ax_view_state.h" |
#include "ui/base/dragdrop/drag_drop_types.h" |
#include "ui/base/l10n/l10n_util.h" |
@@ -103,6 +105,82 @@ using views::View; |
namespace { |
+// Removes the current image scaling on |canvas|, returning the scale value. |
+// Also adjusts |rect| based on the scaling. Call canvas->Restore() to return |
+// to default scaling. |
+float SetupScaledPainting(gfx::Canvas* canvas, gfx::RectF* rect) { |
+ const float display_scale = canvas->image_scale(); |
+ canvas->Save(); |
+ SkScalar scale_factor = 1.0f / display_scale; |
+ canvas->sk_canvas()->scale(scale_factor, scale_factor); |
+ |
+ const float kOffset = 0.5f; |
+ rect->Scale(display_scale); |
+ gfx::InsetsF insets(kOffset, kOffset, kOffset, kOffset); |
+ rect->Inset(insets); |
Evan Stade
2015/10/09 20:00:24
you can just do rect->Inset(kOffset, kOffset)
jonross
2015/10/19 20:29:02
Done.
|
+ |
+ return display_scale; |
+} |
+ |
+// Draws a filled rect in the native coordinates of the display. Where |bounds| |
+// is in the coordinate space of LocationBarView. The actual rect drawn will be |
+// reduced by the region of |bounds| required to render a one pixel thick |
+// border. |
+void DrawScaledBackgroundRect(gfx::Canvas* canvas, |
+ SkColor color, |
+ gfx::Rect bounds) { |
+ gfx::RectF border_rect_f(bounds); |
+ const float display_scale = SetupScaledPainting(canvas, &border_rect_f); |
+ const SkScalar kCornerRadius = SkDoubleToScalar(2.5f * display_scale); |
+ |
+ SkPath path; |
+ path.addRoundRect(gfx::RectFToSkRect(border_rect_f), kCornerRadius, |
+ kCornerRadius); |
+ |
+ SkPaint stroke_paint; |
+ stroke_paint.setStyle(SkPaint::Style::kStroke_Style); |
+ stroke_paint.setStrokeWidth(1); |
+ |
+ SkPath stroke_path; |
+ stroke_paint.getFillPath(path, &stroke_path); |
+ |
+ SkPath fill_path; |
+ Op(path, stroke_path, kDifference_SkPathOp, &fill_path); |
+ |
+ SkPaint paint; |
+ paint.setStyle(SkPaint::kFill_Style); |
+ paint.setColor(color); |
+ paint.setAntiAlias(true); |
+ |
+ canvas->sk_canvas()->drawPath(fill_path, paint); |
+ canvas->Restore(); |
+} |
+ |
+// Draws a one pixel thick border in the native coordinates of the display. |
+// Where |bounds| is in the coordinate space of LocationBarView. If |round| the |
+// drawn rect will have rounded corners. |
+void DrawScaledBorderRect(gfx::Canvas* canvas, |
+ SkColor color, |
+ gfx::Rect bounds, |
+ bool round) { |
+ gfx::RectF border_rect_f(bounds); |
+ const float display_scale = SetupScaledPainting(canvas, &border_rect_f); |
+ |
+ SkPaint paint; |
+ paint.setStyle(SkPaint::Style::kStroke_Style); |
+ paint.setColor(color); |
+ paint.setAntiAlias(true); |
+ |
+ const SkScalar kCornerRadius = SkDoubleToScalar(2.5f * display_scale); |
+ if (round) { |
+ canvas->sk_canvas()->drawRoundRect(gfx::RectFToSkRect(border_rect_f), |
+ kCornerRadius, kCornerRadius, paint); |
+ } else { |
+ canvas->sk_canvas()->drawRect(gfx::RectFToSkRect(border_rect_f), paint); |
+ } |
+ canvas->Restore(); |
+} |
+ |
int GetEditLeadingInternalSpace() { |
// The textfield has 1 px of whitespace before the text in the RTL case only. |
return base::i18n::IsRTL() ? 1 : 0; |
@@ -1259,6 +1337,8 @@ void LocationBarView::OnPaint(gfx::Canvas* canvas) { |
SkColor color(GetColor(SecurityStateModel::NONE, BACKGROUND)); |
if (is_popup_mode_) { |
canvas->FillRect(bounds, color); |
+ } else if (ui::MaterialDesignController::IsModeMaterial()) { |
+ DrawScaledBackgroundRect(canvas, color, bounds); |
} else { |
SkPaint paint; |
paint.setStyle(SkPaint::kFill_Style); |
@@ -1290,28 +1370,9 @@ void LocationBarView::PaintChildren(const ui::PaintContext& context) { |
border_rect.Inset(-kPopupEdgeThickness, 0); |
if (ui::MaterialDesignController::IsModeMaterial()) { |
- gfx::Canvas* canvas = recorder.canvas(); |
- const float display_scale = canvas->image_scale(); |
- canvas->Save(); |
- SkScalar scale_factor = 1.0f / display_scale; |
- canvas->sk_canvas()->scale(scale_factor, scale_factor); |
- |
- SkPaint paint; |
- paint.setStyle(SkPaint::Style::kStroke_Style); |
- paint.setColor(SkColorSetARGB(0x40, 0x00, 0x00, 0x00)); |
- paint.setStrokeWidth(1); |
- paint.setAntiAlias(true); |
- |
- const float kOffset = 0.5f; |
- gfx::RectF border_rect_f(border_rect); |
- border_rect_f.Scale(display_scale); |
- gfx::InsetsF insets(kOffset, kOffset, kOffset, kOffset); |
- border_rect_f.Inset(insets); |
- |
- const SkScalar kCornerRadius = SkDoubleToScalar(2.5f * display_scale); |
- canvas->sk_canvas()->drawRoundRect(gfx::RectFToSkRect(border_rect_f), |
- kCornerRadius, kCornerRadius, paint); |
- recorder.canvas()->Restore(); |
+ DrawScaledBorderRect(recorder.canvas(), |
+ SkColorSetARGB(0x4D, 0x00, 0x00, 0x00), border_rect, |
+ !is_popup_mode_); |
Peter Kasting
2015/10/12 23:45:44
In the MD world, I don't think we actually need to
jonross
2015/10/19 20:29:02
Done.
|
} else { |
views::Painter::PaintPainterAt(recorder.canvas(), border_painter_.get(), |
border_rect); |