| 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/frame/glass_browser_frame_view.h" | 5 #include "chrome/browser/ui/views/frame/glass_browser_frame_view.h" |
| 6 | 6 |
| 7 #include <dwmapi.h> | 7 #include <dwmapi.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/win/windows_version.h" | 10 #include "base/win/windows_version.h" |
| (...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 ViewID button_type) { | 565 ViewID button_type) { |
| 566 Windows10CaptionButton* button = | 566 Windows10CaptionButton* button = |
| 567 new Windows10CaptionButton(this, button_type); | 567 new Windows10CaptionButton(this, button_type); |
| 568 AddChildView(button); | 568 AddChildView(button); |
| 569 return button; | 569 return button; |
| 570 } | 570 } |
| 571 | 571 |
| 572 void GlassBrowserFrameView::PaintTitlebar(gfx::Canvas* canvas) const { | 572 void GlassBrowserFrameView::PaintTitlebar(gfx::Canvas* canvas) const { |
| 573 gfx::Rect tabstrip_bounds = GetBoundsForTabStrip(browser_view()->tabstrip()); | 573 gfx::Rect tabstrip_bounds = GetBoundsForTabStrip(browser_view()->tabstrip()); |
| 574 | 574 |
| 575 SkPaint paint; | 575 cc::PaintFlags flags; |
| 576 gfx::ScopedCanvas scoped_canvas(canvas); | 576 gfx::ScopedCanvas scoped_canvas(canvas); |
| 577 float scale = canvas->UndoDeviceScaleFactor(); | 577 float scale = canvas->UndoDeviceScaleFactor(); |
| 578 // This is the pixel-accurate version of WindowTopY(). Scaling the DIP values | 578 // This is the pixel-accurate version of WindowTopY(). Scaling the DIP values |
| 579 // here compounds precision error, which exposes unpainted client area. When | 579 // here compounds precision error, which exposes unpainted client area. When |
| 580 // restored it uses the system dsf instead of the per-monitor dsf to match | 580 // restored it uses the system dsf instead of the per-monitor dsf to match |
| 581 // Windows' behavior. | 581 // Windows' behavior. |
| 582 const int y = IsMaximized() ? FrameTopBorderThicknessPx(false) | 582 const int y = IsMaximized() ? FrameTopBorderThicknessPx(false) |
| 583 : std::floor(display::win::GetDPIScale()); | 583 : std::floor(display::win::GetDPIScale()); |
| 584 | 584 |
| 585 // Draw the top of the accent border. | 585 // Draw the top of the accent border. |
| 586 // | 586 // |
| 587 // We let the DWM do this for the other sides of the window by insetting the | 587 // We let the DWM do this for the other sides of the window by insetting the |
| 588 // client area to leave nonclient area available. However, along the top | 588 // client area to leave nonclient area available. However, along the top |
| 589 // window edge, we have to have zero nonclient area or the DWM will draw a | 589 // window edge, we have to have zero nonclient area or the DWM will draw a |
| 590 // full native titlebar outside our client area. See | 590 // full native titlebar outside our client area. See |
| 591 // BrowserDesktopWindowTreeHostWin::GetClientAreaInsets(). | 591 // BrowserDesktopWindowTreeHostWin::GetClientAreaInsets(). |
| 592 // | 592 // |
| 593 // We could ask the DWM to draw the top accent border in the client area (by | 593 // We could ask the DWM to draw the top accent border in the client area (by |
| 594 // calling DwmExtendFrameIntoClientArea() in | 594 // calling DwmExtendFrameIntoClientArea() in |
| 595 // BrowserDesktopWindowTreeHostWin::UpdateDWMFrame()), but this requires | 595 // BrowserDesktopWindowTreeHostWin::UpdateDWMFrame()), but this requires |
| 596 // that we leave part of the client surface transparent. If we draw this | 596 // that we leave part of the client surface transparent. If we draw this |
| 597 // ourselves, we can make the client surface fully opaque and avoid the | 597 // ourselves, we can make the client surface fully opaque and avoid the |
| 598 // power consumption needed for DWM to blend the window contents. | 598 // power consumption needed for DWM to blend the window contents. |
| 599 // | 599 // |
| 600 // So the accent border also has to be opaque, but native inactive borders | 600 // So the accent border also has to be opaque, but native inactive borders |
| 601 // are #565656 with 80% alpha. We copy Edge (which also custom-draws its top | 601 // are #565656 with 80% alpha. We copy Edge (which also custom-draws its top |
| 602 // border) and use #A2A2A2 instead. | 602 // border) and use #A2A2A2 instead. |
| 603 constexpr SkColor inactive_border_color = 0xFFA2A2A2; | 603 constexpr SkColor inactive_border_color = 0xFFA2A2A2; |
| 604 paint.setColor( | 604 flags.setColor( |
| 605 ShouldPaintAsActive() | 605 ShouldPaintAsActive() |
| 606 ? GetThemeProvider()->GetColor(ThemeProperties::COLOR_ACCENT_BORDER) | 606 ? GetThemeProvider()->GetColor(ThemeProperties::COLOR_ACCENT_BORDER) |
| 607 : inactive_border_color); | 607 : inactive_border_color); |
| 608 canvas->DrawRect(gfx::RectF(0, 0, width() * scale, y), paint); | 608 canvas->DrawRect(gfx::RectF(0, 0, width() * scale, y), flags); |
| 609 | 609 |
| 610 const gfx::Rect titlebar_rect = gfx::ToEnclosingRect( | 610 const gfx::Rect titlebar_rect = gfx::ToEnclosingRect( |
| 611 gfx::RectF(0, y, width() * scale, tabstrip_bounds.bottom() * scale - y)); | 611 gfx::RectF(0, y, width() * scale, tabstrip_bounds.bottom() * scale - y)); |
| 612 // Paint the titlebar first so we have a background if an area isn't covered | 612 // Paint the titlebar first so we have a background if an area isn't covered |
| 613 // by the theme image. | 613 // by the theme image. |
| 614 paint.setColor(GetTitlebarColor()); | 614 flags.setColor(GetTitlebarColor()); |
| 615 canvas->DrawRect(titlebar_rect, paint); | 615 canvas->DrawRect(titlebar_rect, flags); |
| 616 const gfx::ImageSkia frame_image = GetFrameImage(); | 616 const gfx::ImageSkia frame_image = GetFrameImage(); |
| 617 if (!frame_image.isNull()) { | 617 if (!frame_image.isNull()) { |
| 618 canvas->TileImageInt(frame_image, 0, 0, scale, scale, titlebar_rect.x(), | 618 canvas->TileImageInt(frame_image, 0, 0, scale, scale, titlebar_rect.x(), |
| 619 titlebar_rect.y(), titlebar_rect.width(), | 619 titlebar_rect.y(), titlebar_rect.width(), |
| 620 titlebar_rect.height()); | 620 titlebar_rect.height()); |
| 621 } | 621 } |
| 622 const gfx::ImageSkia frame_overlay_image = GetFrameOverlayImage(); | 622 const gfx::ImageSkia frame_overlay_image = GetFrameOverlayImage(); |
| 623 if (!frame_overlay_image.isNull()) { | 623 if (!frame_overlay_image.isNull()) { |
| 624 canvas->DrawImageInt(frame_overlay_image, 0, 0, frame_overlay_image.width(), | 624 canvas->DrawImageInt(frame_overlay_image, 0, 0, frame_overlay_image.width(), |
| 625 frame_overlay_image.height(), titlebar_rect.x(), | 625 frame_overlay_image.height(), titlebar_rect.x(), |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 915 static bool initialized = false; | 915 static bool initialized = false; |
| 916 if (!initialized) { | 916 if (!initialized) { |
| 917 for (int i = 0; i < kThrobberIconCount; ++i) { | 917 for (int i = 0; i < kThrobberIconCount; ++i) { |
| 918 throbber_icons_[i] = | 918 throbber_icons_[i] = |
| 919 ui::LoadThemeIconFromResourcesDataDLL(IDI_THROBBER_01 + i); | 919 ui::LoadThemeIconFromResourcesDataDLL(IDI_THROBBER_01 + i); |
| 920 DCHECK(throbber_icons_[i]); | 920 DCHECK(throbber_icons_[i]); |
| 921 } | 921 } |
| 922 initialized = true; | 922 initialized = true; |
| 923 } | 923 } |
| 924 } | 924 } |
| OLD | NEW |