| 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_strip.h" | 5 #include "chrome/browser/ui/views/tabs/tab_strip.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <iterator> | 10 #include <iterator> |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 // extended vertically to y = 0. The caller uses this for Fitts' Law purposes | 306 // extended vertically to y = 0. The caller uses this for Fitts' Law purposes |
| 307 // in maximized/fullscreen mode. | 307 // in maximized/fullscreen mode. |
| 308 void GetBorderPath(float button_y, | 308 void GetBorderPath(float button_y, |
| 309 float scale, | 309 float scale, |
| 310 bool extend_to_top, | 310 bool extend_to_top, |
| 311 SkPath* path) const; | 311 SkPath* path) const; |
| 312 | 312 |
| 313 // Paints the fill region of the button into |canvas|, according to the | 313 // Paints the fill region of the button into |canvas|, according to the |
| 314 // supplied values from GetImage() and the given |fill| path. | 314 // supplied values from GetImage() and the given |fill| path. |
| 315 void PaintFill(bool pressed, | 315 void PaintFill(bool pressed, |
| 316 double hover_value, | |
| 317 float scale, | 316 float scale, |
| 318 const SkPath& fill, | 317 const SkPath& fill, |
| 319 gfx::Canvas* canvas) const; | 318 gfx::Canvas* canvas) const; |
| 320 | 319 |
| 321 // Tab strip that contains this button. | 320 // Tab strip that contains this button. |
| 322 TabStrip* tab_strip_; | 321 TabStrip* tab_strip_; |
| 323 | 322 |
| 324 // The offset used to paint the background image. | 323 // The offset used to paint the background image. |
| 325 gfx::Point background_offset_; | 324 gfx::Point background_offset_; |
| 326 | 325 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 views::ImageButton::OnGestureEvent(event); | 370 views::ImageButton::OnGestureEvent(event); |
| 372 event->SetHandled(); | 371 event->SetHandled(); |
| 373 } | 372 } |
| 374 | 373 |
| 375 void NewTabButton::OnPaint(gfx::Canvas* canvas) { | 374 void NewTabButton::OnPaint(gfx::Canvas* canvas) { |
| 376 gfx::ScopedCanvas scoped_canvas(canvas); | 375 gfx::ScopedCanvas scoped_canvas(canvas); |
| 377 const int visible_height = GetLayoutSize(NEW_TAB_BUTTON).height(); | 376 const int visible_height = GetLayoutSize(NEW_TAB_BUTTON).height(); |
| 378 canvas->Translate(gfx::Vector2d(0, height() - visible_height)); | 377 canvas->Translate(gfx::Vector2d(0, height() - visible_height)); |
| 379 | 378 |
| 380 const bool pressed = state() == views::CustomButton::STATE_PRESSED; | 379 const bool pressed = state() == views::CustomButton::STATE_PRESSED; |
| 381 double hover_value = | |
| 382 (state() == views::CustomButton::STATE_HOVERED) ? 1 : 0; | |
| 383 if (hover_animation_->is_animating()) | |
| 384 hover_value = hover_animation_->GetCurrentValue(); | |
| 385 const float scale = canvas->image_scale(); | 380 const float scale = canvas->image_scale(); |
| 386 | 381 |
| 387 SkPath fill; | 382 SkPath fill; |
| 388 if (ui::MaterialDesignController::IsModeMaterial()) { | 383 if (ui::MaterialDesignController::IsModeMaterial()) { |
| 389 // Fill. | 384 // Fill. |
| 390 const float fill_bottom = (visible_height - 2) * scale; | 385 const float fill_bottom = (visible_height - 2) * scale; |
| 391 const float diag_height = fill_bottom - 3.5 * scale; | 386 const float diag_height = fill_bottom - 3.5 * scale; |
| 392 const float diag_width = diag_height * Tab::GetInverseDiagonalSlope(); | 387 const float diag_width = diag_height * Tab::GetInverseDiagonalSlope(); |
| 393 fill.moveTo(diag_width + 4 * scale, fill_bottom); | 388 fill.moveTo(diag_width + 4 * scale, fill_bottom); |
| 394 fill.rCubicTo(-0.75 * scale, 0, -1.625 * scale, -0.5 * scale, -2 * scale, | 389 fill.rCubicTo(-0.75 * scale, 0, -1.625 * scale, -0.5 * scale, -2 * scale, |
| 395 -1.5 * scale); | 390 -1.5 * scale); |
| 396 fill.rLineTo(-diag_width, -diag_height); | 391 fill.rLineTo(-diag_width, -diag_height); |
| 397 fill.rCubicTo(0, -0.5 * scale, 0.25 * scale, -scale, scale, -scale); | 392 fill.rCubicTo(0, -0.5 * scale, 0.25 * scale, -scale, scale, -scale); |
| 398 fill.lineTo((width() - 4) * scale - diag_width, scale); | 393 fill.lineTo((width() - 4) * scale - diag_width, scale); |
| 399 fill.rCubicTo(0.75 * scale, 0, 1.625 * scale, 0.5 * scale, 2 * scale, | 394 fill.rCubicTo(0.75 * scale, 0, 1.625 * scale, 0.5 * scale, 2 * scale, |
| 400 1.5 * scale); | 395 1.5 * scale); |
| 401 fill.rLineTo(diag_width, diag_height); | 396 fill.rLineTo(diag_width, diag_height); |
| 402 fill.rCubicTo(0, 0.5 * scale, -0.25 * scale, scale, -scale, scale); | 397 fill.rCubicTo(0, 0.5 * scale, -0.25 * scale, scale, -scale, scale); |
| 403 fill.close(); | 398 fill.close(); |
| 404 PaintFill(pressed, hover_value, scale, fill, canvas); | 399 PaintFill(pressed, scale, fill, canvas); |
| 405 | 400 |
| 406 // Stroke. | 401 // Stroke. |
| 407 gfx::ScopedCanvas scoped_canvas(canvas); | 402 gfx::ScopedCanvas scoped_canvas(canvas); |
| 408 canvas->UndoDeviceScaleFactor(); | 403 canvas->UndoDeviceScaleFactor(); |
| 409 SkPath stroke; | 404 SkPath stroke; |
| 410 GetBorderPath(0, scale, false, &stroke); | 405 GetBorderPath(0, scale, false, &stroke); |
| 411 // We want to draw a drop shadow either inside or outside the stroke, | 406 // We want to draw a drop shadow either inside or outside the stroke, |
| 412 // depending on whether we're pressed; so, either clip out what's outside | 407 // depending on whether we're pressed; so, either clip out what's outside |
| 413 // the stroke, or clip out the fill inside it. | 408 // the stroke, or clip out the fill inside it. |
| 414 if (pressed) | 409 if (pressed) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 426 canvas->DrawPath(stroke, paint); | 421 canvas->DrawPath(stroke, paint); |
| 427 } else { | 422 } else { |
| 428 // Fill. | 423 // Fill. |
| 429 gfx::ImageSkia* mask = | 424 gfx::ImageSkia* mask = |
| 430 GetThemeProvider()->GetImageSkiaNamed(IDR_NEWTAB_BUTTON_MASK); | 425 GetThemeProvider()->GetImageSkiaNamed(IDR_NEWTAB_BUTTON_MASK); |
| 431 // The canvas and mask have to use the same scale factor. | 426 // The canvas and mask have to use the same scale factor. |
| 432 const float fill_canvas_scale = mask->HasRepresentation(scale) ? | 427 const float fill_canvas_scale = mask->HasRepresentation(scale) ? |
| 433 scale : ui::GetScaleForScaleFactor(ui::SCALE_FACTOR_100P); | 428 scale : ui::GetScaleForScaleFactor(ui::SCALE_FACTOR_100P); |
| 434 gfx::Canvas fill_canvas(GetLayoutSize(NEW_TAB_BUTTON), fill_canvas_scale, | 429 gfx::Canvas fill_canvas(GetLayoutSize(NEW_TAB_BUTTON), fill_canvas_scale, |
| 435 false); | 430 false); |
| 436 PaintFill(pressed, hover_value, fill_canvas_scale, fill, &fill_canvas); | 431 PaintFill(pressed, fill_canvas_scale, fill, &fill_canvas); |
| 437 gfx::ImageSkia image(fill_canvas.ExtractImageRep()); | 432 gfx::ImageSkia image(fill_canvas.ExtractImageRep()); |
| 438 canvas->DrawImageInt( | 433 canvas->DrawImageInt( |
| 439 gfx::ImageSkiaOperations::CreateMaskedImage(image, *mask), 0, 0); | 434 gfx::ImageSkiaOperations::CreateMaskedImage(image, *mask), 0, 0); |
| 440 | 435 |
| 441 // Stroke. Draw the button border with a slight alpha. | 436 // Stroke. Draw the button border with a slight alpha. |
| 442 static const SkAlpha kGlassFrameOverlayAlpha = 178; | 437 static const SkAlpha kGlassFrameOverlayAlpha = 178; |
| 443 static const SkAlpha kOpaqueFrameOverlayAlpha = 230; | 438 static const SkAlpha kOpaqueFrameOverlayAlpha = 230; |
| 444 const SkAlpha alpha = GetWidget()->ShouldWindowContentsBeTransparent() ? | 439 const SkAlpha alpha = GetWidget()->ShouldWindowContentsBeTransparent() ? |
| 445 kGlassFrameOverlayAlpha : kOpaqueFrameOverlayAlpha; | 440 kGlassFrameOverlayAlpha : kOpaqueFrameOverlayAlpha; |
| 446 const int overlay_id = pressed ? IDR_NEWTAB_BUTTON_P : IDR_NEWTAB_BUTTON; | 441 const int overlay_id = pressed ? IDR_NEWTAB_BUTTON_P : IDR_NEWTAB_BUTTON; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 520 path->rCubicTo(0.75 * scale, 0, 1.625 * scale, 0.5 * scale, 2 * scale, | 515 path->rCubicTo(0.75 * scale, 0, 1.625 * scale, 0.5 * scale, 2 * scale, |
| 521 1.5 * scale); | 516 1.5 * scale); |
| 522 path->rLineTo(diag_width, diag_height); | 517 path->rLineTo(diag_width, diag_height); |
| 523 path->rCubicTo(0.5 * scale, 1.125 * scale, -0.5 * scale, scale + 2, -scale, | 518 path->rCubicTo(0.5 * scale, 1.125 * scale, -0.5 * scale, scale + 2, -scale, |
| 524 scale + 2); | 519 scale + 2); |
| 525 } | 520 } |
| 526 path->close(); | 521 path->close(); |
| 527 } | 522 } |
| 528 | 523 |
| 529 void NewTabButton::PaintFill(bool pressed, | 524 void NewTabButton::PaintFill(bool pressed, |
| 530 double hover_value, | |
| 531 float scale, | 525 float scale, |
| 532 const SkPath& fill, | 526 const SkPath& fill, |
| 533 gfx::Canvas* canvas) const { | 527 gfx::Canvas* canvas) const { |
| 534 bool custom_image; | 528 bool custom_image; |
| 535 const int bg_id = tab_strip_->GetBackgroundResourceId(&custom_image); | 529 const int bg_id = tab_strip_->GetBackgroundResourceId(&custom_image); |
| 536 | 530 |
| 537 gfx::ScopedCanvas scoped_canvas(canvas); | 531 gfx::ScopedCanvas scoped_canvas(canvas); |
| 538 | 532 |
| 539 const bool md = ui::MaterialDesignController::IsModeMaterial(); | 533 const bool md = ui::MaterialDesignController::IsModeMaterial(); |
| 540 if (md) { | 534 if (md) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 if (alpha != 255 && !md) { | 593 if (alpha != 255 && !md) { |
| 600 SkPaint paint; | 594 SkPaint paint; |
| 601 paint.setAlpha(alpha); | 595 paint.setAlpha(alpha); |
| 602 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); | 596 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); |
| 603 paint.setStyle(SkPaint::kFill_Style); | 597 paint.setStyle(SkPaint::kFill_Style); |
| 604 canvas->DrawRect(gfx::Rect(size), paint); | 598 canvas->DrawRect(gfx::Rect(size), paint); |
| 605 } | 599 } |
| 606 } | 600 } |
| 607 | 601 |
| 608 // White highlight on hover. | 602 // White highlight on hover. |
| 609 if (hover_value) { | 603 const SkAlpha alpha = static_cast<SkAlpha>( |
| 610 const int alpha = | 604 hover_animation().CurrentValueBetween(0x00, md ? 0x4D : 0x40)); |
| 611 gfx::Tween::LinearIntValueBetween(hover_value, 0x00, md ? 0x4D : 0x40); | 605 if (alpha != SK_AlphaTRANSPARENT) |
| 612 canvas->FillRect(GetLocalBounds(), | 606 canvas->FillRect(GetLocalBounds(), SkColorSetA(SK_ColorWHITE, alpha)); |
| 613 SkColorSetA(SK_ColorWHITE, static_cast<SkAlpha>(alpha))); | |
| 614 } | |
| 615 | 607 |
| 616 // For MD, most states' opacities are adjusted using an opacity recorder in | 608 // For MD, most states' opacities are adjusted using an opacity recorder in |
| 617 // TabStrip::PaintChildren(), but the pressed state is excluded there and | 609 // TabStrip::PaintChildren(), but the pressed state is excluded there and |
| 618 // instead rendered using a dark overlay here. This produces a different | 610 // instead rendered using a dark overlay here. This produces a different |
| 619 // effect than for non-MD, and avoiding the use of the opacity recorder keeps | 611 // effect than for non-MD, and avoiding the use of the opacity recorder keeps |
| 620 // the stroke more visible in this state. | 612 // the stroke more visible in this state. |
| 621 if (md && pressed) | 613 if (md && pressed) |
| 622 canvas->FillRect(GetLocalBounds(), SkColorSetA(SK_ColorBLACK, 0x14)); | 614 canvas->FillRect(GetLocalBounds(), SkColorSetA(SK_ColorBLACK, 0x14)); |
| 623 } | 615 } |
| 624 | 616 |
| (...skipping 2239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2864 ConvertPointToViewAndGetEventHandler(this, newtab_button_, point); | 2856 ConvertPointToViewAndGetEventHandler(this, newtab_button_, point); |
| 2865 if (view) | 2857 if (view) |
| 2866 return view; | 2858 return view; |
| 2867 } | 2859 } |
| 2868 Tab* tab = FindTabForEvent(point); | 2860 Tab* tab = FindTabForEvent(point); |
| 2869 if (tab) | 2861 if (tab) |
| 2870 return ConvertPointToViewAndGetEventHandler(this, tab, point); | 2862 return ConvertPointToViewAndGetEventHandler(this, tab, point); |
| 2871 } | 2863 } |
| 2872 return this; | 2864 return this; |
| 2873 } | 2865 } |
| OLD | NEW |