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

Unified Diff: ui/native_theme/native_theme_aura.cc

Issue 1574913004: Render aura scrollbars programmatically instead of with ninebox assets. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: remove assets Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/native_theme/native_theme_aura.h ('k') | ui/native_theme/native_theme_base.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/native_theme/native_theme_aura.cc
diff --git a/ui/native_theme/native_theme_aura.cc b/ui/native_theme/native_theme_aura.cc
index c93851799137a10907ed1b16303e3243a960c720..dceb63aeb70a8d5e8a368382a3c3bd308685b1b9 100644
--- a/ui/native_theme/native_theme_aura.cc
+++ b/ui/native_theme/native_theme_aura.cc
@@ -10,63 +10,60 @@
#include "base/logging.h"
#include "build/build_config.h"
#include "ui/base/layout.h"
-#include "ui/base/nine_image_painter_factory.h"
#include "ui/base/resource/material_design/material_design_controller.h"
+#include "ui/gfx/animation/tween.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/color_palette.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/image/image_skia.h"
-#include "ui/gfx/nine_image_painter.h"
#include "ui/gfx/path.h"
-#include "ui/gfx/skbitmap_operations.h"
#include "ui/gfx/skia_util.h"
#include "ui/native_theme/common_theme.h"
#include "ui/native_theme/native_theme_switches.h"
-#include "ui/resources/grit/ui_resources.h"
-
-using gfx::NineImagePainter;
-
-#define EMPTY_IMAGE_GRID { 0, 0, 0, 0, 0, 0, 0, 0, 0 }
namespace ui {
namespace {
-const int kScrollbarThumbImages[NativeTheme::kNumStates][9] = {
- EMPTY_IMAGE_GRID,
- IMAGE_GRID(IDR_SCROLLBAR_THUMB_BASE_HOVER),
- IMAGE_GRID(IDR_SCROLLBAR_THUMB_BASE_NORMAL),
- IMAGE_GRID(IDR_SCROLLBAR_THUMB_BASE_PRESSED)
-};
-
-const int kScrollbarArrowButtonImages[NativeTheme::kNumStates][9] = {
- EMPTY_IMAGE_GRID,
- IMAGE_GRID(IDR_SCROLLBAR_ARROW_BUTTON_BASE_HOVER),
- IMAGE_GRID(IDR_SCROLLBAR_ARROW_BUTTON_BASE_NORMAL),
- IMAGE_GRID(IDR_SCROLLBAR_ARROW_BUTTON_BASE_PRESSED)
-};
-
-const uint8_t kScrollbarOverlayThumbFillAlphas[NativeTheme::kNumStates] = {
- 0, // Does not matter, will not paint for disabled state.
- 178, // Hover state, opacity 70%, alpha would be 0.7 * 255.
- 140, // Normal state, opacity 55%, alpha would be 0.55 * 255.
- 178 // Pressed state, opacity 70%, alpha would be 0.7 * 255.
-};
-
-const uint8_t kScrollbarOverlayThumbStrokeAlphas[NativeTheme::kNumStates] = {
- 0, // Does not matter, will not paint for disabled state.
- 51, // Hover state, opacity 20%, alpha would be 0.2 * 255.
- 38, // Normal state, opacity 15%, alpha would be 0.15 * 255.
- 51 // Pressed state, opacity 20%, alpha would be 0.2 * 255.
-};
-
-const int kScrollbarOverlayThumbStrokeImages[9] =
- IMAGE_GRID_NO_CENTER(IDR_SCROLLBAR_OVERLAY_THUMB_STROKE);
-
-const int kScrollbarOverlayThumbFillImages[9] =
- IMAGE_GRID(IDR_SCROLLBAR_OVERLAY_THUMB_FILL);
-
-const int kScrollbarTrackImages[9] = IMAGE_GRID(IDR_SCROLLBAR_BASE);
+SkAlpha ThumbAlphaForState(NativeTheme::State state) {
+ bool overlay = IsOverlayScrollbarEnabled();
+ switch (state) {
+ case NativeTheme::kDisabled:
+ return 0x00;
+ case NativeTheme::kHovered:
+ return overlay ? 0xB2 : 0x4D;
+ case NativeTheme::kNormal:
+ return overlay ? 0x8C : 0x33;
+ case NativeTheme::kPressed:
+ return overlay ? 0xB2 : 0x80;
+ case NativeTheme::kNumStates:
+ break;
+ }
+
+ NOTREACHED();
+ return 0xFF;
+}
+
+SkAlpha ThumbStrokeAlphaForState(NativeTheme::State state) {
+ DCHECK(IsOverlayScrollbarEnabled());
+ switch (state) {
+ case NativeTheme::kDisabled:
+ return 0x00;
+ case NativeTheme::kHovered:
+ case NativeTheme::kPressed:
+ return 0x33;
+ case NativeTheme::kNormal:
+ return 0x26;
+ case NativeTheme::kNumStates:
+ break;
+ }
+
+ NOTREACHED();
+ return 0xFF;
+}
+
+const SkColor kTrackColor = SkColorSetRGB(0xF1, 0xF1, 0xF1);
} // namespace
@@ -137,106 +134,101 @@ void NativeThemeAura::PaintMenuItemBackground(
CommonThemePaintMenuItemBackground(canvas, state, rect);
}
-void NativeThemeAura::PaintArrowButton(
- SkCanvas* gc,
- const gfx::Rect& rect,
- Part direction,
- State state) const {
- if (direction == kInnerSpinButton) {
- NativeThemeBase::PaintArrowButton(gc, rect, direction, state);
- return;
- }
- PaintPainter(GetOrCreatePainter(
- kScrollbarArrowButtonImages, state,
- scrollbar_arrow_button_painters_),
- gc, rect);
-
+void NativeThemeAura::PaintArrowButton(SkCanvas* canvas,
+ const gfx::Rect& rect,
+ Part direction,
+ State state) const {
+ SkColor bg_color = kTrackColor;
// Aura-win uses slightly different arrow colors.
- SkColor arrow_color = GetArrowColor(state);
+ SkColor arrow_color = gfx::kPlaceholderColor;
switch (state) {
+ case kDisabled:
+ arrow_color = GetArrowColor(state);
+ break;
case kHovered:
+ bg_color = SkColorSetRGB(0xD2, 0xD2, 0xD2);
+ // Fall through.
case kNormal:
arrow_color = SkColorSetRGB(0x50, 0x50, 0x50);
break;
case kPressed:
+ bg_color = SkColorSetRGB(0x78, 0x78, 0x78);
arrow_color = SK_ColorWHITE;
- default:
+ break;
+ case kNumStates:
break;
sadrul 2016/01/12 21:57:45 I was going to suggest a NOTREACHED() here, but I
}
- PaintArrow(gc, rect, direction, arrow_color);
+ DCHECK_NE(arrow_color, gfx::kPlaceholderColor);
+
+ SkPaint paint;
+ paint.setColor(bg_color);
+ canvas->drawIRect(gfx::RectToSkIRect(rect), paint);
+
+ PaintArrow(canvas, rect, direction, arrow_color);
}
void NativeThemeAura::PaintScrollbarTrack(
- SkCanvas* sk_canvas,
+ SkCanvas* canvas,
Part part,
State state,
const ScrollbarTrackExtraParams& extra_params,
const gfx::Rect& rect) const {
// Overlay Scrollbar should never paint a scrollbar track.
DCHECK(!IsOverlayScrollbarEnabled());
- if (!scrollbar_track_painter_)
- scrollbar_track_painter_ = CreateNineImagePainter(kScrollbarTrackImages);
- PaintPainter(scrollbar_track_painter_.get(), sk_canvas, rect);
+ SkPaint paint;
+ paint.setColor(kTrackColor);
+ canvas->drawIRect(gfx::RectToSkIRect(rect), paint);
}
-void NativeThemeAura::PaintScrollbarThumb(SkCanvas* sk_canvas,
+void NativeThemeAura::PaintScrollbarThumb(SkCanvas* canvas,
Part part,
State state,
const gfx::Rect& rect) const {
- gfx::Rect thumb_rect(rect);
- if (IsOverlayScrollbarEnabled()) {
- // Overlay scrollbar has no track, just paint thumb directly.
- // Do not paint if state is disabled.
- if (state == kDisabled)
- return;
-
- if (!scrollbar_overlay_thumb_painter_) {
- scrollbar_overlay_thumb_painter_ =
- CreateDualPainter(kScrollbarOverlayThumbFillImages,
- kScrollbarOverlayThumbFillAlphas,
- kScrollbarOverlayThumbStrokeImages,
- kScrollbarOverlayThumbStrokeAlphas);
- }
-
- PaintDualPainter(
- scrollbar_overlay_thumb_painter_.get(), sk_canvas, thumb_rect, state);
+ // Do not paint if state is disabled.
+ if (state == kDisabled)
return;
- }
- // If there are no scrollbuttons then provide some padding so that thumb
- // doesn't touch the top of the track.
- const int extra_padding = (scrollbar_button_length() == 0) ? 2 : 0;
- if (part == NativeTheme::kScrollbarVerticalThumb)
- thumb_rect.Inset(2, extra_padding, 2, extra_padding);
- else
- thumb_rect.Inset(extra_padding, 2, extra_padding, 2);
- PaintPainter(GetOrCreatePainter(
- kScrollbarThumbImages, state, scrollbar_thumb_painters_),
- sk_canvas,
- thumb_rect);
+
+ PaintScrollbarThumbStateTransition(canvas, part, state, state, 1.0, rect);
}
void NativeThemeAura::PaintScrollbarThumbStateTransition(
SkCanvas* canvas,
- State startState,
- State endState,
+ Part part,
+ State start_state,
+ State end_state,
double progress,
const gfx::Rect& rect) const {
- // Only Overlay scrollbars should have state transition animation.
- DCHECK(IsOverlayScrollbarEnabled());
- if (!scrollbar_overlay_thumb_painter_) {
- scrollbar_overlay_thumb_painter_ =
- CreateDualPainter(kScrollbarOverlayThumbFillImages,
- kScrollbarOverlayThumbFillAlphas,
- kScrollbarOverlayThumbStrokeImages,
- kScrollbarOverlayThumbStrokeAlphas);
+ gfx::Rect thumb_rect(rect);
+ if (IsOverlayScrollbarEnabled()) {
+ // In overlay mode, draw a stroke (border).
+ const int kStrokeWidth = 1;
+ SkAlpha stroke_alpha = gfx::Tween::IntValueBetween(
+ progress, ThumbStrokeAlphaForState(start_state),
+ ThumbStrokeAlphaForState(end_state));
+ SkPaint paint;
+ paint.setColor(SkColorSetA(SK_ColorWHITE, stroke_alpha));
+ paint.setStyle(SkPaint::kStroke_Style);
+ paint.setStrokeWidth(kStrokeWidth);
+ canvas->drawIRect(gfx::RectToSkIRect(thumb_rect), paint);
+
+ thumb_rect.Inset(kStrokeWidth, kStrokeWidth, kStrokeWidth, kStrokeWidth);
+ } else {
+ // If there are no scrollbuttons then provide some padding so that the thumb
+ // doesn't touch the top of the track.
+ const int kThumbPadding = 2;
+ const int extra_padding =
+ (scrollbar_button_length() == 0) ? kThumbPadding : 0;
+ if (part == NativeTheme::kScrollbarVerticalThumb)
+ thumb_rect.Inset(kThumbPadding, extra_padding);
+ else
+ thumb_rect.Inset(extra_padding, kThumbPadding);
}
- PaintDualPainterTransition(scrollbar_overlay_thumb_painter_.get(),
- canvas,
- rect,
- startState,
- endState,
- progress);
+ SkPaint paint;
+ SkAlpha alpha = gfx::Tween::IntValueBetween(
+ progress, ThumbAlphaForState(start_state), ThumbAlphaForState(end_state));
+ paint.setColor(SkColorSetA(SK_ColorBLACK, alpha));
+ canvas->drawIRect(gfx::RectToSkIRect(thumb_rect), paint);
}
void NativeThemeAura::PaintScrollbarCorner(SkCanvas* canvas,
@@ -245,93 +237,8 @@ void NativeThemeAura::PaintScrollbarCorner(SkCanvas* canvas,
// Overlay Scrollbar should never paint a scrollbar corner.
DCHECK(!IsOverlayScrollbarEnabled());
SkPaint paint;
- paint.setColor(SkColorSetRGB(0xF1, 0xF1, 0xF1));
- paint.setStyle(SkPaint::kFill_Style);
- paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+ paint.setColor(SkColorSetRGB(0xDC, 0xDC, 0xDC));
canvas->drawIRect(RectToSkIRect(rect), paint);
}
-NineImagePainter* NativeThemeAura::GetOrCreatePainter(
- const int images[kNumStates][9],
- State state,
- scoped_ptr<NineImagePainter> painters[kNumStates]) const {
- if (painters[state])
- return painters[state].get();
- if (images[state][0] == 0) {
- // Must always provide normal state images.
- DCHECK_NE(kNormal, state);
- return GetOrCreatePainter(images, kNormal, painters);
- }
- painters[state] = CreateNineImagePainter(images[state]);
- return painters[state].get();
-}
-
-void NativeThemeAura::PaintPainter(NineImagePainter* painter,
- SkCanvas* sk_canvas,
- const gfx::Rect& rect) const {
- DCHECK(painter);
- scoped_ptr<gfx::Canvas> canvas(CommonThemeCreateCanvas(sk_canvas));
- painter->Paint(canvas.get(), rect);
-}
-
-scoped_ptr<NativeThemeAura::DualPainter> NativeThemeAura::CreateDualPainter(
- const int fill_image_ids[9],
- const uint8_t fill_alphas[kNumStates],
- const int stroke_image_ids[9],
- const uint8_t stroke_alphas[kNumStates]) const {
- scoped_ptr<NativeThemeAura::DualPainter> dual_painter(
- new NativeThemeAura::DualPainter(CreateNineImagePainter(fill_image_ids),
- fill_alphas,
- CreateNineImagePainter(stroke_image_ids),
- stroke_alphas));
- return dual_painter;
-}
-
-void NativeThemeAura::PaintDualPainter(
- NativeThemeAura::DualPainter* dual_painter,
- SkCanvas* sk_canvas,
- const gfx::Rect& rect,
- State state) const {
- DCHECK(dual_painter);
- scoped_ptr<gfx::Canvas> canvas(CommonThemeCreateCanvas(sk_canvas));
- dual_painter->fill_painter->Paint(
- canvas.get(), rect, dual_painter->fill_alphas[state]);
- dual_painter->stroke_painter->Paint(
- canvas.get(), rect, dual_painter->stroke_alphas[state]);
-}
-
-void NativeThemeAura::PaintDualPainterTransition(
- NativeThemeAura::DualPainter* dual_painter,
- SkCanvas* sk_canvas,
- const gfx::Rect& rect,
- State startState,
- State endState,
- double progress) const {
- DCHECK(dual_painter);
- scoped_ptr<gfx::Canvas> canvas(CommonThemeCreateCanvas(sk_canvas));
- uint8_t fill_alpha = dual_painter->fill_alphas[startState] +
- (dual_painter->fill_alphas[endState] -
- dual_painter->fill_alphas[startState]) *
- progress;
- uint8_t stroke_alpha = dual_painter->stroke_alphas[startState] +
- (dual_painter->stroke_alphas[endState] -
- dual_painter->stroke_alphas[startState]) *
- progress;
-
- dual_painter->fill_painter->Paint(canvas.get(), rect, fill_alpha);
- dual_painter->stroke_painter->Paint(canvas.get(), rect, stroke_alpha);
-}
-
-NativeThemeAura::DualPainter::DualPainter(
- scoped_ptr<NineImagePainter> fill_painter,
- const uint8_t fill_alphas[kNumStates],
- scoped_ptr<NineImagePainter> stroke_painter,
- const uint8_t stroke_alphas[kNumStates])
- : fill_painter(std::move(fill_painter)),
- fill_alphas(fill_alphas),
- stroke_painter(std::move(stroke_painter)),
- stroke_alphas(stroke_alphas) {}
-
-NativeThemeAura::DualPainter::~DualPainter() {}
-
} // namespace ui
« no previous file with comments | « ui/native_theme/native_theme_aura.h ('k') | ui/native_theme/native_theme_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698