Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/tabs/tab.h" | 5 #include "chrome/browser/ui/views/tabs/tab.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 37 #include "ui/base/material_design/material_design_controller.h" | 37 #include "ui/base/material_design/material_design_controller.h" |
| 38 #include "ui/base/models/list_selection_model.h" | 38 #include "ui/base/models/list_selection_model.h" |
| 39 #include "ui/base/resource/resource_bundle.h" | 39 #include "ui/base/resource/resource_bundle.h" |
| 40 #include "ui/base/theme_provider.h" | 40 #include "ui/base/theme_provider.h" |
| 41 #include "ui/gfx/animation/animation_container.h" | 41 #include "ui/gfx/animation/animation_container.h" |
| 42 #include "ui/gfx/animation/throb_animation.h" | 42 #include "ui/gfx/animation/throb_animation.h" |
| 43 #include "ui/gfx/canvas.h" | 43 #include "ui/gfx/canvas.h" |
| 44 #include "ui/gfx/color_analysis.h" | 44 #include "ui/gfx/color_analysis.h" |
| 45 #include "ui/gfx/favicon_size.h" | 45 #include "ui/gfx/favicon_size.h" |
| 46 #include "ui/gfx/geometry/rect_conversions.h" | 46 #include "ui/gfx/geometry/rect_conversions.h" |
| 47 #include "ui/gfx/image/canvas_image_source.h" | |
| 47 #include "ui/gfx/image/image_skia_operations.h" | 48 #include "ui/gfx/image/image_skia_operations.h" |
| 48 #include "ui/gfx/paint_vector_icon.h" | 49 #include "ui/gfx/paint_vector_icon.h" |
| 49 #include "ui/gfx/path.h" | 50 #include "ui/gfx/path.h" |
| 50 #include "ui/gfx/scoped_canvas.h" | 51 #include "ui/gfx/scoped_canvas.h" |
| 51 #include "ui/gfx/skia_util.h" | 52 #include "ui/gfx/skia_util.h" |
| 52 #include "ui/gfx/vector_icons_public.h" | 53 #include "ui/gfx/vector_icons_public.h" |
| 53 #include "ui/resources/grit/ui_resources.h" | 54 #include "ui/resources/grit/ui_resources.h" |
| 54 #include "ui/views/border.h" | 55 #include "ui/views/border.h" |
| 55 #include "ui/views/controls/button/image_button.h" | 56 #include "ui/views/controls/button/image_button.h" |
| 56 #include "ui/views/controls/label.h" | 57 #include "ui/views/controls/label.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 112 const double kImmersiveTabMinThrobOpacity = 0.66; | 113 const double kImmersiveTabMinThrobOpacity = 0.66; |
| 113 | 114 |
| 114 // Number of steps in the immersive mode loading animation. | 115 // Number of steps in the immersive mode loading animation. |
| 115 const int kImmersiveLoadingStepCount = 32; | 116 const int kImmersiveLoadingStepCount = 32; |
| 116 | 117 |
| 117 const char kTabCloseButtonName[] = "TabCloseButton"; | 118 const char kTabCloseButtonName[] = "TabCloseButton"; |
| 118 | 119 |
| 119 // Parameters for PaintTabBackgroundUsingParams(). | 120 // Parameters for PaintTabBackgroundUsingParams(). |
| 120 struct PaintBackgroundParams { | 121 struct PaintBackgroundParams { |
| 121 PaintBackgroundParams(bool is_active, | 122 PaintBackgroundParams(bool is_active, |
| 122 gfx::ImageSkia* fill_image_ptr, | 123 gfx::ImageSkia* fill_image, |
| 123 bool has_custom_image, | 124 bool has_custom_image, |
| 124 gfx::Rect rect, | 125 const gfx::Rect& rect, |
| 125 SkColor stroke_color, | 126 SkColor stroke_color, |
| 126 SkColor toolbar_color, | 127 SkColor toolbar_color, |
| 127 SkColor background_tab_color) | 128 SkColor background_tab_color, |
| 129 bool draw_hover, | |
| 130 const gfx::Point& hover_location, | |
| 131 SkAlpha hover_alpha) | |
| 128 : is_active(is_active), | 132 : is_active(is_active), |
| 129 fill_image(fill_image_ptr ? *fill_image_ptr : gfx::ImageSkia()), | 133 fill_image(fill_image ? *fill_image : gfx::ImageSkia()), |
| 130 has_custom_image(has_custom_image), | 134 has_custom_image(has_custom_image), |
| 131 rect(rect), | 135 rect(rect), |
| 132 stroke_color(stroke_color), | 136 stroke_color(stroke_color), |
| 133 toolbar_color(toolbar_color), | 137 toolbar_color(toolbar_color), |
| 134 background_tab_color(background_tab_color) {} | 138 background_tab_color(background_tab_color), |
| 139 draw_hover(draw_hover), | |
| 140 hover_location(PointToSkPoint(hover_location)), | |
| 141 hover_alpha(hover_alpha) {} | |
| 135 | 142 |
| 136 const bool is_active; | 143 const bool is_active; |
| 137 const gfx::ImageSkia fill_image; | 144 const gfx::ImageSkia fill_image; |
| 138 const bool has_custom_image; | 145 const bool has_custom_image; |
| 139 const gfx::Rect rect; | 146 const gfx::Rect rect; |
| 140 const SkColor stroke_color; | 147 const SkColor stroke_color; |
| 141 const SkColor toolbar_color; | 148 const SkColor toolbar_color; |
| 142 const SkColor background_tab_color; | 149 const SkColor background_tab_color; |
| 150 const bool draw_hover; | |
| 151 const SkPoint hover_location; | |
| 152 const SkAlpha hover_alpha; | |
| 143 }; | 153 }; |
| 144 | 154 |
| 155 void PaintTabBackgroundUsingParams(gfx::Canvas* fill_canvas, | |
| 156 gfx::Canvas* stroke_canvas, | |
| 157 const PaintBackgroundParams& params); | |
| 158 | |
| 159 //////////////////////////////////////////////////////////////////////////////// | |
| 160 // TabImageSource | |
| 161 // | |
| 162 // This subclass of CanvasImageSource allows the inactive tab image to be cached | |
| 163 // once and rendered correctly for all scale factors. | |
| 164 class TabImageSource : public gfx::CanvasImageSource { | |
| 165 public: | |
| 166 enum UseCanvas { FILL, STROKE, BOTH }; | |
| 167 | |
| 168 TabImageSource(UseCanvas use_canvas, Tab* tab, int fill_id, int y_offset); | |
| 169 ~TabImageSource() override {} | |
| 170 | |
| 171 // gfx::CanvasImageSource override. | |
| 172 void Draw(gfx::Canvas* canvas) override; | |
| 173 | |
| 174 private: | |
| 175 const UseCanvas use_canvas_; | |
| 176 const PaintBackgroundParams params_; | |
| 177 | |
| 178 DISALLOW_COPY_AND_ASSIGN(TabImageSource); | |
| 179 }; | |
| 180 | |
| 181 TabImageSource::TabImageSource(UseCanvas use_canvas, | |
| 182 Tab* tab, | |
| 183 int fill_id, | |
| 184 int y_offset) | |
| 185 : gfx::CanvasImageSource(tab->size(), true), | |
| 186 use_canvas_(use_canvas), | |
| 187 params_(false, | |
| 188 tab->GetThemeProvider()->GetImageSkiaNamed(fill_id), | |
| 189 false, | |
| 190 gfx::Rect(gfx::Point(0, y_offset), tab->size()), | |
| 191 tab->controller()->GetToolbarTopSeparatorColor(), | |
| 192 tab->GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR), | |
| 193 tab->GetThemeProvider()->GetColor( | |
| 194 ThemeProperties::COLOR_BACKGROUND_TAB), | |
| 195 false, | |
| 196 gfx::Point(), | |
| 197 255) {} | |
| 198 | |
| 199 void TabImageSource::Draw(gfx::Canvas* canvas) { | |
| 200 PaintTabBackgroundUsingParams(use_canvas_ != STROKE ? canvas : nullptr, | |
|
Peter Kasting
2016/08/11 22:51:15
Nit: Prefer "use_canvas_ == STROKE ? nullptr : can
Greg Levin
2016/08/12 19:48:15
Obsolete due to other change.
| |
| 201 use_canvas_ != FILL ? canvas : nullptr, | |
| 202 params_); | |
| 203 } | |
| 204 | |
| 145 //////////////////////////////////////////////////////////////////////////////// | 205 //////////////////////////////////////////////////////////////////////////////// |
| 146 // ImageCacheEntryMetadata | 206 // ImageCacheEntryMetadata |
| 147 // | 207 // |
| 148 // All metadata necessary to uniquely identify a cached image. | 208 // All metadata necessary to uniquely identify a cached image. |
| 149 struct ImageCacheEntryMetadata { | 209 struct ImageCacheEntryMetadata { |
| 150 ImageCacheEntryMetadata(int resource_id, | 210 ImageCacheEntryMetadata(int resource_id, |
| 151 SkColor fill_color, | 211 SkColor fill_color, |
| 152 SkColor stroke_color, | 212 SkColor stroke_color, |
| 153 bool use_fill_and_stroke_images, | 213 bool use_fill_and_stroke_images, |
| 154 ui::ScaleFactor scale_factor, | |
| 155 const gfx::Size& size); | 214 const gfx::Size& size); |
| 156 | 215 |
| 157 ~ImageCacheEntryMetadata(); | 216 ~ImageCacheEntryMetadata(); |
| 158 | 217 |
| 159 bool operator==(const ImageCacheEntryMetadata& rhs) const; | 218 bool operator==(const ImageCacheEntryMetadata& rhs) const; |
| 160 | 219 |
| 161 int resource_id; // Only needed by pre-MD | 220 int resource_id; // Only needed by pre-MD |
| 162 SkColor fill_color; // Both colors only needed by MD | 221 SkColor fill_color; // Both colors only needed by MD |
| 163 SkColor stroke_color; | 222 SkColor stroke_color; |
| 164 bool use_fill_and_stroke_images; | 223 bool use_fill_and_stroke_images; |
| 165 ui::ScaleFactor scale_factor; | |
| 166 gfx::Size size; | 224 gfx::Size size; |
| 167 }; | 225 }; |
| 168 | 226 |
| 169 ImageCacheEntryMetadata::ImageCacheEntryMetadata( | 227 ImageCacheEntryMetadata::ImageCacheEntryMetadata( |
| 170 int resource_id, | 228 int resource_id, |
| 171 SkColor fill_color, | 229 SkColor fill_color, |
| 172 SkColor stroke_color, | 230 SkColor stroke_color, |
| 173 bool use_fill_and_stroke_images, | 231 bool use_fill_and_stroke_images, |
| 174 ui::ScaleFactor scale_factor, | |
| 175 const gfx::Size& size) | 232 const gfx::Size& size) |
| 176 : resource_id(resource_id), | 233 : resource_id(resource_id), |
| 177 fill_color(fill_color), | 234 fill_color(fill_color), |
| 178 stroke_color(stroke_color), | 235 stroke_color(stroke_color), |
| 179 use_fill_and_stroke_images(use_fill_and_stroke_images), | 236 use_fill_and_stroke_images(use_fill_and_stroke_images), |
| 180 scale_factor(scale_factor), | |
| 181 size(size) { | 237 size(size) { |
| 182 DCHECK_NE(ui::SCALE_FACTOR_NONE, scale_factor); | |
| 183 | |
| 184 // Some fields are only relevant for pre-MD vs. MD. Erase the irrelevant ones | 238 // Some fields are only relevant for pre-MD vs. MD. Erase the irrelevant ones |
| 185 // so they don't cause incorrect cache misses. | 239 // so they don't cause incorrect cache misses. |
| 186 // TODO(pkasting): Remove |resource_id| field when non-MD code is deleted. | 240 // TODO(pkasting): Remove |resource_id| field when non-MD code is deleted. |
| 187 if (ui::MaterialDesignController::IsModeMaterial()) | 241 if (ui::MaterialDesignController::IsModeMaterial()) |
| 188 resource_id = 0; | 242 resource_id = 0; |
| 189 else | 243 else |
| 190 fill_color = stroke_color = SK_ColorTRANSPARENT; | 244 fill_color = stroke_color = SK_ColorTRANSPARENT; |
| 191 } | 245 } |
| 192 | 246 |
| 193 ImageCacheEntryMetadata::~ImageCacheEntryMetadata() {} | 247 ImageCacheEntryMetadata::~ImageCacheEntryMetadata() {} |
| 194 | 248 |
| 195 bool ImageCacheEntryMetadata::operator==( | 249 bool ImageCacheEntryMetadata::operator==( |
| 196 const ImageCacheEntryMetadata& rhs) const { | 250 const ImageCacheEntryMetadata& rhs) const { |
| 197 return resource_id == rhs.resource_id && fill_color == rhs.fill_color && | 251 return resource_id == rhs.resource_id && fill_color == rhs.fill_color && |
| 198 stroke_color == rhs.stroke_color && | 252 stroke_color == rhs.stroke_color && |
| 199 use_fill_and_stroke_images == rhs.use_fill_and_stroke_images && | 253 use_fill_and_stroke_images == rhs.use_fill_and_stroke_images && |
| 200 scale_factor == rhs.scale_factor && size == rhs.size; | 254 size == rhs.size; |
| 201 } | 255 } |
| 202 | 256 |
| 203 //////////////////////////////////////////////////////////////////////////////// | 257 //////////////////////////////////////////////////////////////////////////////// |
| 204 // ImageCacheEntry and cache management | 258 // ImageCacheEntry and cache management |
| 205 // | 259 // |
| 206 // A cached image and the metadata used to generate it. | 260 // A cached image and the metadata used to generate it. |
| 207 struct ImageCacheEntry { | 261 struct ImageCacheEntry { |
| 208 ImageCacheEntry(const ImageCacheEntryMetadata& metadata, | 262 ImageCacheEntry(const ImageCacheEntryMetadata& metadata, |
| 209 const gfx::ImageSkia& fill_image, | 263 Tab* tab, |
| 210 const gfx::ImageSkia& stroke_image); | 264 int fill_id, |
| 265 int y_offset); | |
| 211 ~ImageCacheEntry(); | 266 ~ImageCacheEntry(); |
| 212 | 267 |
| 213 ImageCacheEntryMetadata metadata; | 268 ImageCacheEntryMetadata metadata; |
| 214 gfx::ImageSkia fill_image; | 269 gfx::ImageSkia fill_image; |
| 215 gfx::ImageSkia stroke_image; | 270 gfx::ImageSkia stroke_image; |
| 216 }; | 271 }; |
| 217 | 272 |
| 218 ImageCacheEntry::ImageCacheEntry(const ImageCacheEntryMetadata& metadata, | 273 ImageCacheEntry::ImageCacheEntry(const ImageCacheEntryMetadata& metadata, |
| 219 const gfx::ImageSkia& fill_image, | 274 Tab* tab, |
| 220 const gfx::ImageSkia& stroke_image) | 275 int fill_id, |
| 221 : metadata(metadata), fill_image(fill_image), stroke_image(stroke_image) {} | 276 int y_offset) |
| 277 : metadata(metadata) { | |
| 278 if (metadata.use_fill_and_stroke_images) { | |
| 279 fill_image = gfx::ImageSkia( | |
| 280 new TabImageSource(TabImageSource::FILL, tab, fill_id, y_offset), | |
| 281 tab->size()); | |
| 282 } | |
| 283 TabImageSource::UseCanvas use = metadata.use_fill_and_stroke_images | |
| 284 ? TabImageSource::STROKE | |
| 285 : TabImageSource::BOTH; | |
| 286 stroke_image = gfx::ImageSkia(new TabImageSource(use, tab, fill_id, y_offset), | |
| 287 tab->size()); | |
| 288 } | |
| 222 | 289 |
| 223 ImageCacheEntry::~ImageCacheEntry() {} | 290 ImageCacheEntry::~ImageCacheEntry() {} |
| 224 | 291 |
| 225 typedef std::list<ImageCacheEntry> ImageCache; | 292 typedef std::list<ImageCacheEntry> ImageCache; |
| 226 | 293 |
| 227 // As the majority of the tabs are inactive, and painting tabs is slowish, | 294 // As the majority of the tabs are inactive, and painting tabs is slowish, |
| 228 // we cache a handful of the inactive tab backgrounds here. | 295 // we cache a handful of the inactive tab backgrounds here. |
| 229 static ImageCache* g_image_cache = nullptr; | 296 static ImageCache* g_image_cache = nullptr; |
| 230 | 297 |
| 231 struct TabImages { | 298 struct TabImages { |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 476 // Draw center. Instead of masking out the top portion we simply skip over it | 543 // Draw center. Instead of masking out the top portion we simply skip over it |
| 477 // by incrementing by the top padding, since it's a simple rectangle. | 544 // by incrementing by the top padding, since it's a simple rectangle. |
| 478 rect.Inset(g_mask_images.l_width, tab_insets.top(), g_mask_images.r_width, | 545 rect.Inset(g_mask_images.l_width, tab_insets.top(), g_mask_images.r_width, |
| 479 toolbar_overlap); | 546 toolbar_overlap); |
| 480 canvas->TileImageInt(fill_image, rect.x(), rect.y(), g_mask_images.l_width, | 547 canvas->TileImageInt(fill_image, rect.x(), rect.y(), g_mask_images.l_width, |
| 481 tab_insets.top(), rect.width(), rect.height()); | 548 tab_insets.top(), rect.width(), rect.height()); |
| 482 } | 549 } |
| 483 | 550 |
| 484 void PaintTabBackgroundUsingParams(gfx::Canvas* fill_canvas, | 551 void PaintTabBackgroundUsingParams(gfx::Canvas* fill_canvas, |
| 485 gfx::Canvas* stroke_canvas, | 552 gfx::Canvas* stroke_canvas, |
| 486 views::GlowHoverController* hc, | |
| 487 const PaintBackgroundParams& params) { | 553 const PaintBackgroundParams& params) { |
| 488 const gfx::Rect& rect = params.rect; | 554 const gfx::Rect& rect = params.rect; |
| 489 const SkScalar kMinHoverRadius = 16; | 555 const SkScalar kMinHoverRadius = 16; |
| 490 const SkScalar radius = | 556 const SkScalar radius = |
| 491 std::max(SkFloatToScalar(rect.width() / 4.f), kMinHoverRadius); | 557 std::max(SkFloatToScalar(rect.width() / 4.f), kMinHoverRadius); |
| 492 const bool draw_hover = !params.is_active && hc; | |
| 493 SkPoint hover_location( | |
| 494 gfx::PointToSkPoint(draw_hover ? hc->location() : gfx::Point())); | |
| 495 const SkColor hover_color = | 558 const SkColor hover_color = |
| 496 SkColorSetA(params.toolbar_color, draw_hover ? hc->GetAlpha() : 255); | 559 SkColorSetA(params.toolbar_color, params.hover_alpha); |
| 497 | 560 |
| 498 if (ui::MaterialDesignController::IsModeMaterial()) { | 561 if (ui::MaterialDesignController::IsModeMaterial()) { |
| 499 gfx::Path fill; | 562 gfx::Path fill; |
| 500 SkPaint paint; | 563 SkPaint paint; |
| 501 paint.setAntiAlias(true); | 564 paint.setAntiAlias(true); |
| 502 | 565 |
| 503 // Draw the fill. | 566 // Draw the fill. |
| 504 { | 567 if (fill_canvas) { |
| 505 gfx::ScopedCanvas scoped_canvas(fill_canvas); | 568 gfx::ScopedCanvas scoped_canvas(fill_canvas); |
| 506 const float scale = fill_canvas->UndoDeviceScaleFactor(); | 569 const float scale = fill_canvas->UndoDeviceScaleFactor(); |
| 507 | 570 |
| 508 fill = GetFillPath(scale, rect.size()); | 571 fill = GetFillPath(scale, rect.size()); |
| 509 { | 572 { |
| 510 gfx::ScopedCanvas clip_scoper(fill_canvas); | 573 gfx::ScopedCanvas clip_scoper(fill_canvas); |
| 511 fill_canvas->ClipPath(fill, true); | 574 fill_canvas->ClipPath(fill, true); |
| 512 if (!params.fill_image.isNull()) { | 575 if (!params.fill_image.isNull()) { |
| 513 gfx::ScopedCanvas scale_scoper(fill_canvas); | 576 gfx::ScopedCanvas scale_scoper(fill_canvas); |
| 514 fill_canvas->sk_canvas()->scale(scale, scale); | 577 fill_canvas->sk_canvas()->scale(scale, scale); |
| 515 fill_canvas->TileImageInt(params.fill_image, rect.x(), rect.y(), 0, 0, | 578 fill_canvas->TileImageInt(params.fill_image, rect.x(), rect.y(), 0, 0, |
| 516 rect.width(), rect.height()); | 579 rect.width(), rect.height()); |
| 517 } else { | 580 } else { |
| 518 paint.setColor(params.is_active ? params.toolbar_color | 581 paint.setColor(params.is_active ? params.toolbar_color |
| 519 : params.background_tab_color); | 582 : params.background_tab_color); |
| 520 fill_canvas->DrawRect( | 583 fill_canvas->DrawRect( |
| 521 gfx::ScaleToEnclosingRect(gfx::Rect(rect.size()), scale), | 584 gfx::ScaleToEnclosingRect(gfx::Rect(rect.size()), scale), |
| 522 paint); | 585 paint); |
| 523 } | 586 } |
| 524 if (draw_hover) { | 587 if (params.draw_hover) { |
| 525 hover_location.scale(SkFloatToScalar(scale)); | 588 DrawHighlight(fill_canvas, params.hover_location * scale, |
| 526 DrawHighlight(fill_canvas, hover_location, radius * scale, | 589 radius * scale, hover_color); |
| 527 hover_color); | |
| 528 } | 590 } |
| 529 } | 591 } |
| 530 } | 592 } |
| 531 | 593 |
| 532 // Draw the stroke. | 594 // Draw the stroke. |
| 533 { | 595 if (stroke_canvas) { |
| 534 gfx::ScopedCanvas scoped_canvas(stroke_canvas); | 596 gfx::ScopedCanvas scoped_canvas(stroke_canvas); |
| 535 const float scale = stroke_canvas->UndoDeviceScaleFactor(); | 597 const float scale = stroke_canvas->UndoDeviceScaleFactor(); |
| 536 | 598 |
| 537 gfx::Path stroke = GetBorderPath(scale, false, false, rect.size()); | 599 gfx::Path stroke = GetBorderPath(scale, false, false, rect.size()); |
| 538 Op(stroke, fill, kDifference_SkPathOp, &stroke); | 600 Op(stroke, fill, kDifference_SkPathOp, &stroke); |
| 539 if (!params.is_active) { | 601 if (!params.is_active) { |
| 540 // Clip out the bottom line; this will be drawn for us by | 602 // Clip out the bottom line; this will be drawn for us by |
| 541 // TabStrip::PaintChildren(). | 603 // TabStrip::PaintChildren(). |
| 542 stroke_canvas->ClipRect(gfx::RectF(rect.width() * scale, | 604 stroke_canvas->ClipRect(gfx::RectF(rect.width() * scale, |
| 543 rect.height() * scale - 1)); | 605 rect.height() * scale - 1)); |
| 544 } | 606 } |
| 545 paint.setColor(params.stroke_color); | 607 paint.setColor(params.stroke_color); |
| 546 stroke_canvas->DrawPath(stroke, paint); | 608 stroke_canvas->DrawPath(stroke, paint); |
| 547 } | 609 } |
| 548 } else { | 610 } else { |
| 549 gfx::Canvas* canvas = stroke_canvas; | 611 gfx::Canvas* canvas = stroke_canvas; |
| 550 if (draw_hover) { | 612 if (params.draw_hover) { |
| 551 // Draw everything to a temporary canvas so we can extract an image for | 613 // Draw everything to a temporary canvas so we can extract an image for |
| 552 // use in masking the hover glow. | 614 // use in masking the hover glow. |
| 553 gfx::Canvas background_canvas(rect.size(), canvas->image_scale(), false); | 615 gfx::Canvas background_canvas(rect.size(), canvas->image_scale(), false); |
| 554 PaintTabFill(&background_canvas, params.fill_image, rect, | 616 PaintTabFill(&background_canvas, params.fill_image, rect, |
| 555 params.is_active); | 617 params.is_active); |
| 556 gfx::ImageSkia background_image(background_canvas.ExtractImageRep()); | 618 gfx::ImageSkia background_image(background_canvas.ExtractImageRep()); |
| 557 canvas->DrawImageInt(background_image, 0, 0); | 619 canvas->DrawImageInt(background_image, 0, 0); |
| 558 | 620 |
| 559 gfx::Canvas hover_canvas(rect.size(), canvas->image_scale(), false); | 621 gfx::Canvas hover_canvas(rect.size(), canvas->image_scale(), false); |
| 560 DrawHighlight(&hover_canvas, hover_location, radius, hover_color); | 622 DrawHighlight(&hover_canvas, params.hover_location, radius, hover_color); |
| 561 gfx::ImageSkia result = gfx::ImageSkiaOperations::CreateMaskedImage( | 623 gfx::ImageSkia result = gfx::ImageSkiaOperations::CreateMaskedImage( |
| 562 gfx::ImageSkia(hover_canvas.ExtractImageRep()), background_image); | 624 gfx::ImageSkia(hover_canvas.ExtractImageRep()), background_image); |
| 563 canvas->DrawImageInt(result, 0, 0); | 625 canvas->DrawImageInt(result, 0, 0); |
| 564 } else { | 626 } else { |
| 565 PaintTabFill(canvas, params.fill_image, rect, params.is_active); | 627 PaintTabFill(canvas, params.fill_image, rect, params.is_active); |
| 566 } | 628 } |
| 567 | 629 |
| 568 // Now draw the stroke, highlights, and shadows around the tab edge. | 630 // Now draw the stroke, highlights, and shadows around the tab edge. |
| 569 TabImages* stroke_images = | 631 TabImages* stroke_images = |
| 570 params.is_active ? &g_active_images : &g_inactive_images; | 632 params.is_active ? &g_active_images : &g_inactive_images; |
| (...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1515 // really need to clip the stroke and not the fill (for stacked tabs). This | 1577 // really need to clip the stroke and not the fill (for stacked tabs). This |
| 1516 // saves memory and avoids an extra image draw at the cost of recalculating | 1578 // saves memory and avoids an extra image draw at the cost of recalculating |
| 1517 // the images when MaySetClip() toggles. | 1579 // the images when MaySetClip() toggles. |
| 1518 const bool use_fill_and_stroke_images = | 1580 const bool use_fill_and_stroke_images = |
| 1519 controller_->MaySetClip() && | 1581 controller_->MaySetClip() && |
| 1520 ui::MaterialDesignController::IsModeMaterial(); | 1582 ui::MaterialDesignController::IsModeMaterial(); |
| 1521 | 1583 |
| 1522 const ImageCacheEntryMetadata metadata( | 1584 const ImageCacheEntryMetadata metadata( |
| 1523 fill_id, tp->GetColor(ThemeProperties::COLOR_BACKGROUND_TAB), | 1585 fill_id, tp->GetColor(ThemeProperties::COLOR_BACKGROUND_TAB), |
| 1524 controller_->GetToolbarTopSeparatorColor(), use_fill_and_stroke_images, | 1586 controller_->GetToolbarTopSeparatorColor(), use_fill_and_stroke_images, |
| 1525 ui::GetSupportedScaleFactor(canvas->image_scale()), size()); | 1587 size()); |
| 1526 auto it = std::find_if( | 1588 auto it = std::find_if( |
| 1527 g_image_cache->begin(), g_image_cache->end(), | 1589 g_image_cache->begin(), g_image_cache->end(), |
| 1528 [&metadata](const ImageCacheEntry& e) { return e.metadata == metadata; }); | 1590 [&metadata](const ImageCacheEntry& e) { return e.metadata == metadata; }); |
| 1529 if (it == g_image_cache->end()) { | 1591 if (it == g_image_cache->end()) { |
| 1530 gfx::Canvas tmp_canvas(size(), canvas->image_scale(), false); | 1592 g_image_cache->emplace_front(metadata, this, fill_id, y_offset); |
| 1531 if (use_fill_and_stroke_images) { | |
| 1532 gfx::Canvas tmp_fill_canvas(size(), canvas->image_scale(), false); | |
| 1533 PaintTabBackgroundUsingFillId(&tmp_fill_canvas, &tmp_canvas, false, | |
| 1534 fill_id, false, y_offset); | |
| 1535 g_image_cache->emplace_front( | |
| 1536 metadata, gfx::ImageSkia(tmp_fill_canvas.ExtractImageRep()), | |
| 1537 gfx::ImageSkia(tmp_canvas.ExtractImageRep())); | |
| 1538 } else { | |
| 1539 PaintTabBackgroundUsingFillId(&tmp_canvas, &tmp_canvas, false, fill_id, | |
| 1540 false, y_offset); | |
| 1541 g_image_cache->emplace_front( | |
| 1542 metadata, gfx::ImageSkia(), | |
| 1543 gfx::ImageSkia(tmp_canvas.ExtractImageRep())); | |
| 1544 } | |
| 1545 if (g_image_cache->size() > kMaxImageCacheSize) | 1593 if (g_image_cache->size() > kMaxImageCacheSize) |
| 1546 g_image_cache->pop_back(); | 1594 g_image_cache->pop_back(); |
| 1547 it = g_image_cache->begin(); | 1595 it = g_image_cache->begin(); |
| 1548 } | 1596 } |
| 1549 | 1597 |
| 1550 gfx::ScopedCanvas scoped_canvas( | 1598 gfx::ScopedCanvas scoped_canvas( |
| 1551 use_fill_and_stroke_images ? canvas : nullptr); | 1599 use_fill_and_stroke_images ? canvas : nullptr); |
| 1552 if (use_fill_and_stroke_images) { | 1600 if (use_fill_and_stroke_images) { |
| 1553 canvas->DrawImageInt(it->fill_image, 0, 0); | 1601 canvas->DrawImageInt(it->fill_image, 0, 0); |
| 1554 canvas->sk_canvas()->clipPath(clip, SkRegion::kDifference_Op, true); | 1602 canvas->sk_canvas()->clipPath(clip, SkRegion::kDifference_Op, true); |
| 1555 } | 1603 } |
| 1556 canvas->DrawImageInt(it->stroke_image, 0, 0); | 1604 canvas->DrawImageInt(it->stroke_image, 0, 0); |
| 1557 } | 1605 } |
| 1558 | 1606 |
| 1559 void Tab::PaintTabBackgroundUsingFillId(gfx::Canvas* fill_canvas, | 1607 void Tab::PaintTabBackgroundUsingFillId(gfx::Canvas* fill_canvas, |
| 1560 gfx::Canvas* stroke_canvas, | 1608 gfx::Canvas* stroke_canvas, |
| 1561 bool is_active, | 1609 bool is_active, |
| 1562 int fill_id, | 1610 int fill_id, |
| 1563 bool has_custom_image, | 1611 bool has_custom_image, |
| 1564 int y_offset) { | 1612 int y_offset) { |
| 1565 views::GlowHoverController* hc = | |
| 1566 hover_controller_.ShouldDraw() ? &hover_controller_ : nullptr; | |
| 1567 gfx::ImageSkia* fill_image = | 1613 gfx::ImageSkia* fill_image = |
| 1568 has_custom_image || !ui::MaterialDesignController::IsModeMaterial() | 1614 has_custom_image || !ui::MaterialDesignController::IsModeMaterial() |
| 1569 ? GetThemeProvider()->GetImageSkiaNamed(fill_id) | 1615 ? GetThemeProvider()->GetImageSkiaNamed(fill_id) |
| 1570 : nullptr; | 1616 : nullptr; |
| 1571 // The tab image needs to be lined up with the background image | 1617 // The tab image needs to be lined up with the background image |
| 1572 // so that it feels partially transparent. These offsets represent the tab | 1618 // so that it feels partially transparent. These offsets represent the tab |
| 1573 // position within the frame background image. | 1619 // position within the frame background image. |
| 1574 gfx::Rect rect(GetLocalBounds()); | 1620 gfx::Rect rect(GetLocalBounds()); |
| 1575 rect.Offset(GetMirroredX() + background_offset_.x(), y_offset); | 1621 rect.Offset(GetMirroredX() + background_offset_.x(), y_offset); |
| 1576 PaintBackgroundParams params( | 1622 PaintBackgroundParams params( |
| 1577 is_active, fill_image, has_custom_image, rect, | 1623 is_active, fill_image, has_custom_image, rect, |
| 1578 controller_->GetToolbarTopSeparatorColor(), | 1624 controller_->GetToolbarTopSeparatorColor(), |
| 1579 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR), | 1625 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR), |
| 1580 GetThemeProvider()->GetColor(ThemeProperties::COLOR_BACKGROUND_TAB)); | 1626 GetThemeProvider()->GetColor(ThemeProperties::COLOR_BACKGROUND_TAB), |
| 1627 !is_active && hover_controller_.ShouldDraw(), | |
| 1628 hover_controller_.location(), hover_controller_.GetAlpha()); | |
| 1581 | 1629 |
| 1582 PaintTabBackgroundUsingParams(fill_canvas, stroke_canvas, hc, params); | 1630 PaintTabBackgroundUsingParams(fill_canvas, stroke_canvas, params); |
| 1583 } | 1631 } |
| 1584 | 1632 |
| 1585 void Tab::PaintPinnedTabTitleChangedIndicatorAndIcon( | 1633 void Tab::PaintPinnedTabTitleChangedIndicatorAndIcon( |
| 1586 gfx::Canvas* canvas, | 1634 gfx::Canvas* canvas, |
| 1587 const gfx::Rect& favicon_draw_bounds) { | 1635 const gfx::Rect& favicon_draw_bounds) { |
| 1588 // The pinned tab title changed indicator consists of two parts: | 1636 // The pinned tab title changed indicator consists of two parts: |
| 1589 // . a clear (totally transparent) part over the bottom right (or left in rtl) | 1637 // . a clear (totally transparent) part over the bottom right (or left in rtl) |
| 1590 // of the favicon. This is done by drawing the favicon to a canvas, then | 1638 // of the favicon. This is done by drawing the favicon to a canvas, then |
| 1591 // drawing the clear part on top of the favicon. | 1639 // drawing the clear part on top of the favicon. |
| 1592 // . a circle in the bottom right (or left in rtl) of the favicon. | 1640 // . a circle in the bottom right (or left in rtl) of the favicon. |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1821 gfx::Rect Tab::GetImmersiveBarRect() const { | 1869 gfx::Rect Tab::GetImmersiveBarRect() const { |
| 1822 // The main bar is as wide as the normal tab's horizontal top line. | 1870 // The main bar is as wide as the normal tab's horizontal top line. |
| 1823 // This top line of the tab extends a few pixels left and right of the | 1871 // This top line of the tab extends a few pixels left and right of the |
| 1824 // center image due to pixels in the rounded corner images. | 1872 // center image due to pixels in the rounded corner images. |
| 1825 const int kBarPadding = 1; | 1873 const int kBarPadding = 1; |
| 1826 int main_bar_left = g_active_images.l_width - kBarPadding; | 1874 int main_bar_left = g_active_images.l_width - kBarPadding; |
| 1827 int main_bar_right = width() - g_active_images.r_width + kBarPadding; | 1875 int main_bar_right = width() - g_active_images.r_width + kBarPadding; |
| 1828 return gfx::Rect( | 1876 return gfx::Rect( |
| 1829 main_bar_left, 0, main_bar_right - main_bar_left, kImmersiveBarHeight); | 1877 main_bar_left, 0, main_bar_right - main_bar_left, kImmersiveBarHeight); |
| 1830 } | 1878 } |
| OLD | NEW |