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 <algorithm> | 7 #include <algorithm> |
8 #include <iterator> | 8 #include <iterator> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
301 // extended vertically to y = 0. The caller uses this for Fitts' Law purposes | 301 // extended vertically to y = 0. The caller uses this for Fitts' Law purposes |
302 // in maximized/fullscreen mode. | 302 // in maximized/fullscreen mode. |
303 void GetBorderPath(float button_y, | 303 void GetBorderPath(float button_y, |
304 float scale, | 304 float scale, |
305 bool extend_to_top, | 305 bool extend_to_top, |
306 SkPath* path) const; | 306 SkPath* path) const; |
307 | 307 |
308 // Paints the fill region of the button into |canvas|, according to the | 308 // Paints the fill region of the button into |canvas|, according to the |
309 // supplied values from GetImage() and the given |fill| path. | 309 // supplied values from GetImage() and the given |fill| path. |
310 void PaintFill(bool pressed, | 310 void PaintFill(bool pressed, |
311 double hover_value, | |
312 float scale, | 311 float scale, |
313 const SkPath& fill, | 312 const SkPath& fill, |
314 gfx::Canvas* canvas) const; | 313 gfx::Canvas* canvas) const; |
315 | 314 |
316 // Tab strip that contains this button. | 315 // Tab strip that contains this button. |
317 TabStrip* tab_strip_; | 316 TabStrip* tab_strip_; |
318 | 317 |
319 // The offset used to paint the background image. | 318 // The offset used to paint the background image. |
320 gfx::Point background_offset_; | 319 gfx::Point background_offset_; |
321 | 320 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
365 // start consuming gestures. | 364 // start consuming gestures. |
366 views::ImageButton::OnGestureEvent(event); | 365 views::ImageButton::OnGestureEvent(event); |
367 event->SetHandled(); | 366 event->SetHandled(); |
368 } | 367 } |
369 | 368 |
370 void NewTabButton::OnPaint(gfx::Canvas* canvas) { | 369 void NewTabButton::OnPaint(gfx::Canvas* canvas) { |
371 gfx::ScopedCanvas scoped_canvas(canvas); | 370 gfx::ScopedCanvas scoped_canvas(canvas); |
372 canvas->Translate(gfx::Vector2d(0, height() - kNewTabButtonHeight)); | 371 canvas->Translate(gfx::Vector2d(0, height() - kNewTabButtonHeight)); |
373 | 372 |
374 const bool pressed = state() == views::CustomButton::STATE_PRESSED; | 373 const bool pressed = state() == views::CustomButton::STATE_PRESSED; |
375 double hover_value = | |
376 (state() == views::CustomButton::STATE_HOVERED) ? 1 : 0; | |
377 if (hover_animation_->is_animating()) | |
378 hover_value = hover_animation_->GetCurrentValue(); | |
379 const float scale = canvas->image_scale(); | 374 const float scale = canvas->image_scale(); |
380 | 375 |
381 SkPath fill; | 376 SkPath fill; |
382 if (ui::MaterialDesignController::IsModeMaterial()) { | 377 if (ui::MaterialDesignController::IsModeMaterial()) { |
383 // Fill. | 378 // Fill. |
384 fill.moveTo(9.75 * scale, 16 * scale); | 379 fill.moveTo(9.75 * scale, 16 * scale); |
385 fill.rCubicTo(-0.75 * scale, 0, -1.625 * scale, -0.5 * scale, -2 * scale, | 380 fill.rCubicTo(-0.75 * scale, 0, -1.625 * scale, -0.5 * scale, -2 * scale, |
386 -1.5 * scale); | 381 -1.5 * scale); |
387 fill.rLineTo(-5.75 * scale, -12.5 * scale); | 382 fill.rLineTo(-5.75 * scale, -12.5 * scale); |
388 fill.rCubicTo(0, -0.5 * scale, 0.25 * scale, -scale, scale, -scale); | 383 fill.rCubicTo(0, -0.5 * scale, 0.25 * scale, -scale, scale, -scale); |
389 fill.rLineTo(23.25 * scale, 0); | 384 fill.rLineTo(23.25 * scale, 0); |
390 fill.rCubicTo(0.75 * scale, 0, 1.625 * scale, 0.5 * scale, 2 * scale, | 385 fill.rCubicTo(0.75 * scale, 0, 1.625 * scale, 0.5 * scale, 2 * scale, |
391 1.5 * scale); | 386 1.5 * scale); |
392 fill.rLineTo(5.75 * scale, 12.5 * scale); | 387 fill.rLineTo(5.75 * scale, 12.5 * scale); |
393 fill.rCubicTo(0, 0.5 * scale, -0.25 * scale, scale, -scale, scale); | 388 fill.rCubicTo(0, 0.5 * scale, -0.25 * scale, scale, -scale, scale); |
394 fill.close(); | 389 fill.close(); |
395 PaintFill(pressed, hover_value, scale, fill, canvas); | 390 PaintFill(pressed, scale, fill, canvas); |
396 | 391 |
397 // Stroke. | 392 // Stroke. |
398 gfx::ScopedCanvas scoped_canvas(canvas); | 393 gfx::ScopedCanvas scoped_canvas(canvas); |
399 canvas->UndoDeviceScaleFactor(); | 394 canvas->UndoDeviceScaleFactor(); |
400 SkPath stroke; | 395 SkPath stroke; |
401 GetBorderPath(0, scale, false, &stroke); | 396 GetBorderPath(0, scale, false, &stroke); |
402 // We want to draw a drop shadow either inside or outside the stroke, | 397 // We want to draw a drop shadow either inside or outside the stroke, |
403 // depending on whether we're pressed; so, either clip out what's outside | 398 // depending on whether we're pressed; so, either clip out what's outside |
404 // the stroke, or clip out the fill inside it. | 399 // the stroke, or clip out the fill inside it. |
405 if (pressed) | 400 if (pressed) |
(...skipping 10 matching lines...) Expand all Loading... | |
416 paint.setColor(SkColorSetA(SK_ColorBLACK, pressed ? 0x38 : 0x27)); | 411 paint.setColor(SkColorSetA(SK_ColorBLACK, pressed ? 0x38 : 0x27)); |
417 canvas->DrawPath(stroke, paint); | 412 canvas->DrawPath(stroke, paint); |
418 } else { | 413 } else { |
419 // Fill. | 414 // Fill. |
420 gfx::ImageSkia* mask = | 415 gfx::ImageSkia* mask = |
421 GetThemeProvider()->GetImageSkiaNamed(IDR_NEWTAB_BUTTON_MASK); | 416 GetThemeProvider()->GetImageSkiaNamed(IDR_NEWTAB_BUTTON_MASK); |
422 // The canvas and mask have to use the same scale factor. | 417 // The canvas and mask have to use the same scale factor. |
423 const float fill_canvas_scale = mask->HasRepresentation(scale) ? | 418 const float fill_canvas_scale = mask->HasRepresentation(scale) ? |
424 scale : ui::GetScaleForScaleFactor(ui::SCALE_FACTOR_100P); | 419 scale : ui::GetScaleForScaleFactor(ui::SCALE_FACTOR_100P); |
425 gfx::Canvas fill_canvas(GetNewTabButtonSize(), fill_canvas_scale, false); | 420 gfx::Canvas fill_canvas(GetNewTabButtonSize(), fill_canvas_scale, false); |
426 PaintFill(pressed, hover_value, fill_canvas_scale, fill, &fill_canvas); | 421 PaintFill(pressed, fill_canvas_scale, fill, &fill_canvas); |
427 gfx::ImageSkia image(fill_canvas.ExtractImageRep()); | 422 gfx::ImageSkia image(fill_canvas.ExtractImageRep()); |
428 canvas->DrawImageInt( | 423 canvas->DrawImageInt( |
429 gfx::ImageSkiaOperations::CreateMaskedImage(image, *mask), 0, 0); | 424 gfx::ImageSkiaOperations::CreateMaskedImage(image, *mask), 0, 0); |
430 | 425 |
431 // Stroke. Draw the button border with a slight alpha. | 426 // Stroke. Draw the button border with a slight alpha. |
432 static const SkAlpha kGlassFrameOverlayAlpha = 178; | 427 static const SkAlpha kGlassFrameOverlayAlpha = 178; |
433 static const SkAlpha kOpaqueFrameOverlayAlpha = 230; | 428 static const SkAlpha kOpaqueFrameOverlayAlpha = 230; |
434 const SkAlpha alpha = GetWidget()->ShouldWindowContentsBeTransparent() ? | 429 const SkAlpha alpha = GetWidget()->ShouldWindowContentsBeTransparent() ? |
435 kGlassFrameOverlayAlpha : kOpaqueFrameOverlayAlpha; | 430 kGlassFrameOverlayAlpha : kOpaqueFrameOverlayAlpha; |
436 const int overlay_id = pressed ? IDR_NEWTAB_BUTTON_P : IDR_NEWTAB_BUTTON; | 431 const int overlay_id = pressed ? IDR_NEWTAB_BUTTON_P : IDR_NEWTAB_BUTTON; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
504 path->rCubicTo(0.75 * scale, 0, 1.625 * scale, 0.5 * scale, 2 * scale, | 499 path->rCubicTo(0.75 * scale, 0, 1.625 * scale, 0.5 * scale, 2 * scale, |
505 1.5 * scale); | 500 1.5 * scale); |
506 path->rLineTo(5.75 * scale, 12.5 * scale); | 501 path->rLineTo(5.75 * scale, 12.5 * scale); |
507 path->rCubicTo(0.5 * scale, 1.125 * scale, -0.5 * scale, scale + 2, -scale, | 502 path->rCubicTo(0.5 * scale, 1.125 * scale, -0.5 * scale, scale + 2, -scale, |
508 scale + 2); | 503 scale + 2); |
509 } | 504 } |
510 path->close(); | 505 path->close(); |
511 } | 506 } |
512 | 507 |
513 void NewTabButton::PaintFill(bool pressed, | 508 void NewTabButton::PaintFill(bool pressed, |
514 double hover_value, | |
515 float scale, | 509 float scale, |
516 const SkPath& fill, | 510 const SkPath& fill, |
517 gfx::Canvas* canvas) const { | 511 gfx::Canvas* canvas) const { |
518 bool custom_image; | 512 bool custom_image; |
519 const int bg_id = tab_strip_->GetBackgroundResourceId(&custom_image); | 513 const int bg_id = tab_strip_->GetBackgroundResourceId(&custom_image); |
520 | 514 |
521 gfx::ScopedCanvas scoped_canvas(canvas); | 515 gfx::ScopedCanvas scoped_canvas(canvas); |
522 | 516 |
523 const bool md = ui::MaterialDesignController::IsModeMaterial(); | 517 const bool md = ui::MaterialDesignController::IsModeMaterial(); |
524 if (md) { | 518 if (md) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
584 if (alpha != 255 && !md) { | 578 if (alpha != 255 && !md) { |
585 SkPaint paint; | 579 SkPaint paint; |
586 paint.setAlpha(alpha); | 580 paint.setAlpha(alpha); |
587 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); | 581 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); |
588 paint.setStyle(SkPaint::kFill_Style); | 582 paint.setStyle(SkPaint::kFill_Style); |
589 canvas->DrawRect(gfx::Rect(size), paint); | 583 canvas->DrawRect(gfx::Rect(size), paint); |
590 } | 584 } |
591 } | 585 } |
592 | 586 |
593 // White highlight on hover. | 587 // White highlight on hover. |
594 if (hover_value) { | 588 const SkAlpha alpha = static_cast<SkAlpha>( |
595 const int alpha = | 589 hover_animation().CurrentValueBetween(0x00, md ? 0x4D : 0x40)); |
596 gfx::Tween::LinearIntValueBetween(hover_value, 0x00, md ? 0x4D : 0x40); | 590 if (alpha != SK_AlphaTRANSPARENT) |
Peter Kasting
2015/12/21 20:34:18
I suspect that Skia detects a transparent fill and
Evan Stade
2015/12/21 22:27:16
I followed the callstack for a while and couldn't
| |
597 canvas->FillRect(GetLocalBounds(), | 591 canvas->FillRect(GetLocalBounds(), SkColorSetA(SK_ColorWHITE, alpha)); |
598 SkColorSetA(SK_ColorWHITE, static_cast<SkAlpha>(alpha))); | |
599 } | |
600 | 592 |
601 // For MD, most states' opacities are adjusted using an opacity recorder in | 593 // For MD, most states' opacities are adjusted using an opacity recorder in |
602 // TabStrip::PaintChildren(), but the pressed state is excluded there and | 594 // TabStrip::PaintChildren(), but the pressed state is excluded there and |
603 // instead rendered using a dark overlay here. This produces a different | 595 // instead rendered using a dark overlay here. This produces a different |
604 // effect than for non-MD, and avoiding the use of the opacity recorder keeps | 596 // effect than for non-MD, and avoiding the use of the opacity recorder keeps |
605 // the stroke more visible in this state. | 597 // the stroke more visible in this state. |
606 if (md && pressed) | 598 if (md && pressed) |
607 canvas->FillRect(GetLocalBounds(), SkColorSetA(SK_ColorBLACK, 0x14)); | 599 canvas->FillRect(GetLocalBounds(), SkColorSetA(SK_ColorBLACK, 0x14)); |
608 } | 600 } |
609 | 601 |
(...skipping 2242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2852 ConvertPointToViewAndGetEventHandler(this, newtab_button_, point); | 2844 ConvertPointToViewAndGetEventHandler(this, newtab_button_, point); |
2853 if (view) | 2845 if (view) |
2854 return view; | 2846 return view; |
2855 } | 2847 } |
2856 Tab* tab = FindTabForEvent(point); | 2848 Tab* tab = FindTabForEvent(point); |
2857 if (tab) | 2849 if (tab) |
2858 return ConvertPointToViewAndGetEventHandler(this, tab, point); | 2850 return ConvertPointToViewAndGetEventHandler(this, tab, point); |
2859 } | 2851 } |
2860 return this; | 2852 return this; |
2861 } | 2853 } |
OLD | NEW |