Chromium Code Reviews| Index: ui/views/background.cc |
| diff --git a/ui/views/background.cc b/ui/views/background.cc |
| index 62cdc3b4cc613058f53f083cccaa7cfde8e808de..ac28ca8abb99c53ce1f00edfd7091bb0c86c32bc 100644 |
| --- a/ui/views/background.cc |
| +++ b/ui/views/background.cc |
| @@ -7,6 +7,8 @@ |
| #include "base/logging.h" |
| #include "skia/ext/skia_utils_win.h" |
| #include "third_party/skia/include/core/SkPaint.h" |
| +#include "third_party/skia/include/core/SkPath.h" |
| +#include "third_party/skia/include/pathops/SkPathOps.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/color_utils.h" |
| #include "ui/views/painter.h" |
| @@ -32,6 +34,65 @@ class SolidBackground : public Background { |
| DISALLOW_COPY_AND_ASSIGN(SolidBackground); |
| }; |
| +// SolidScaledBackground renders a solid background color, with a one pixel |
| +// border. This accounts for the scaling of the canvas, so that the border is |
| +// one pixel regardless of display scaling. Optionally the border can have |
| +// rounded corners. |
| +class SolidScaledBackground : public Background { |
| + public: |
| + explicit SolidScaledBackground(SkColor background, SkColor border, bool round) |
|
Peter Kasting
2015/10/19 21:09:44
Nit: No explicit (only used for 1-arg constructors
jonross
2015/10/20 18:54:53
Done.
|
| + : border_color_(border), round_(round) { |
| + SetNativeControlColor(background); |
| + } |
| + |
| + void Paint(gfx::Canvas* canvas, View* view) const override { |
| + gfx::RectF border_rect_f(view->GetContentsBounds()); |
|
Peter Kasting
2015/10/19 21:09:44
Nit: Declare |border_rect_f| and |kOffset| right a
jonross
2015/10/20 18:54:54
Done.
|
| + const float scale = canvas->SaveAndUnscale(); |
| + const float kOffset = scale > 1.0f ? 1.5f : 0.5f; |
|
Peter Kasting
2015/10/19 21:09:44
I don't think this gets the right result for scale
jonross
2015/10/20 18:54:54
I spoke with him, he wants the 200% inset by one p
Peter Kasting
2015/10/20 23:04:05
Yes, and my suggestions should accomplish that, bu
jonross
2015/10/21 14:52:55
Done.
|
| + border_rect_f.Scale(scale); |
| + |
| + SkPaint stroke_paint; |
| + stroke_paint.setStyle(SkPaint::Style::kStroke_Style); |
|
Peter Kasting
2015/10/19 21:09:44
Nit: No need for "Style::"
jonross
2015/10/20 18:54:53
Done.
|
| + stroke_paint.setStrokeWidth(1); |
| + stroke_paint.setColor(border_color_); |
| + stroke_paint.setAntiAlias(true); |
| + |
| + SkPaint fill_paint; |
| + fill_paint.setStyle(SkPaint::kFill_Style); |
| + fill_paint.setColor(get_color()); |
| + fill_paint.setAntiAlias(true); |
| + |
| + SkPath path; |
| + if (round_) { |
| + border_rect_f.Inset(kOffset, kOffset); |
| + const SkScalar kCornerRadius = SkDoubleToScalar(2.5f * scale); |
| + path.addRoundRect(gfx::RectFToSkRect(border_rect_f), kCornerRadius, |
| + kCornerRadius); |
| + } else { |
| + border_rect_f.Inset(-kOffset, kOffset); |
|
Peter Kasting
2015/10/19 21:09:44
I don't think this is right for non-1x. It seems
jonross
2015/10/20 18:54:54
Done.
|
| + path.addRect(gfx::RectFToSkRect(border_rect_f)); |
| + } |
| + |
| + SkPath stroke_path; |
| + stroke_paint.getFillPath(path, &stroke_path); |
| + |
| + SkPath fill_path; |
| + Op(path, stroke_path, kDifference_SkPathOp, &fill_path); |
| + canvas->sk_canvas()->drawPath(fill_path, fill_paint); |
| + canvas->sk_canvas()->drawPath(path, stroke_paint); |
|
Peter Kasting
2015/10/19 21:09:44
Nit: I think it might be slightly more performant
jonross
2015/10/20 18:54:53
Done.
|
| + canvas->Restore(); |
| + } |
| + |
| + private: |
| + // Color for the one pixel border. |
| + SkColor border_color_; |
| + |
| + // If true the rect will be a rounded rect. |
|
Peter Kasting
2015/10/19 21:09:44
Nit: Maybe "If true the border and interior corner
Evan Stade
2015/10/19 23:21:30
I don't really care what this comment says because
jonross
2015/10/20 18:54:54
Done.
|
| + bool round_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SolidScaledBackground); |
| +}; |
| + |
| class BackgroundPainter : public Background { |
| public: |
| BackgroundPainter(bool owns_painter, Painter* painter) |
| @@ -90,6 +151,12 @@ Background* Background::CreateSolidBackground(SkColor color) { |
| return new SolidBackground(color); |
| } |
| +Background* Background::CreateSolidScaledBackground(SkColor background, |
| + SkColor border, |
| + bool round) { |
| + return new SolidScaledBackground(background, border, round); |
| +} |
| + |
| // static |
| Background* Background::CreateStandardPanelBackground() { |
| // TODO(beng): Should be in NativeTheme. |