Index: chrome/browser/ui/views/tabs/tab.cc |
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc |
index 2005cac04e689667e759b4d742ed6162f556fbb8..b85b8c50b152505c354bbb2961fbab56201cbf96 100644 |
--- a/chrome/browser/ui/views/tabs/tab.cc |
+++ b/chrome/browser/ui/views/tabs/tab.cc |
@@ -129,6 +129,15 @@ const int kImmersiveLoadingStepCount = 32; |
const char kTabCloseButtonName[] = "TabCloseButton"; |
const int kTabCloseButtonSize = 16; |
+// Returns the width of the tab endcap at scale 1. More precisely, this is the |
+// width of the curve making up either the outer or inner edge of the stroke; |
+// since these two curves are horizontally offset by 1 px (regardless of scale), |
+// the total width of the endcap from tab outer edge to the inside end of the |
+// stroke inner edge is (GetUnscaledEndcapWidth() * scale) + 1. |
+float GetUnscaledEndcapWidth() { |
+ return GetLayoutInsets(TAB).left() - 0.5f; |
+} |
+ |
chrome::HostDesktopType GetHostDesktopType(views::View* view) { |
// Widget is NULL when tabs are detached. |
views::Widget* widget = view->GetWidget(); |
@@ -697,6 +706,22 @@ int Tab::GetYInsetForActiveTabBackground() { |
return GetLayoutConstant(TAB_TOP_EXCLUSION_HEIGHT) + 1; |
} |
+// static |
+float Tab::GetInverseDiagonalSlope() { |
+ // This is computed from the border path as follows: |
+ // * The unscaled endcap width is enough for the whole stroke outer curve, |
+ // i.e. the side diagonal plus the curves on both its ends. |
+ // * The bottom and top curve are each (2 * scale) px wide, so the diagonal is |
+ // (unscaled endcap width - 2 - 2) * scale px wide. |
+ // * The bottom and top curve are each 1.5 px high. Additionally, there is an |
+ // extra 1 px below the bottom curve and (scale - 1) px above the top curve, |
+ // so the diagonal is ((height - 1.5 - 1.5) * scale - 1 - (scale - 1)) px |
+ // high. |
+ // Simplifying these gives the expression below. |
+ return (GetUnscaledEndcapWidth() - 4) / |
+ (GetMinimumInactiveSize().height() - 4); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// Tab, AnimationDelegate overrides: |
@@ -1607,23 +1632,24 @@ void Tab::ScheduleIconPaint() { |
void Tab::GetFillPath(float scale, SkPath* fill) const { |
const float right = width() * scale; |
const float bottom = height() * scale; |
+ const float unscaled_endcap_width = GetUnscaledEndcapWidth(); |
fill->moveTo(right - 1, bottom); |
fill->rCubicTo(-0.75 * scale, 0, -1.625 * scale, -0.5 * scale, -2 * scale, |
-1.5 * scale); |
- fill->lineTo(right - 1 - 13.5 * scale, 2.5 * scale); |
+ fill->lineTo(right - 1 - (unscaled_endcap_width - 2) * scale, 2.5 * scale); |
// Prevent overdraw in the center near minimum width (only happens if |
// scale < 2). We could instead avoid this by increasing the tab inset |
// values, but that would shift all the content inward as well, unless we |
// then overlapped the content on the endcaps, by which point we'd have a |
// huge mess. |
- const float total_endcap_width = 31 * scale + 2; |
- const float overlap = total_endcap_width - right; |
+ const float scaled_endcap_width = 1 + unscaled_endcap_width * scale; |
+ const float overlap = scaled_endcap_width * 2 - right; |
const float offset = (overlap > 0) ? (overlap / 2) : 0; |
fill->rCubicTo(-0.375 * scale, -1 * scale, -1.25 * scale + offset, |
-1.5 * scale, -2 * scale + offset, -1.5 * scale); |
if (overlap < 0) |
- fill->lineTo(1 + 15.5 * scale, scale); |
+ fill->lineTo(scaled_endcap_width, scale); |
fill->rCubicTo(-0.75 * scale, 0, -1.625 * scale - offset, 0.5 * scale, |
-2 * scale - offset, 1.5 * scale); |
fill->lineTo(1 + 2 * scale, bottom - 1.5 * scale); |
@@ -1636,24 +1662,25 @@ void Tab::GetBorderPath(float scale, bool extend_to_top, SkPath* path) const { |
const float top = scale - 1; |
const float right = width() * scale; |
const float bottom = height() * scale; |
+ const float unscaled_endcap_width = GetUnscaledEndcapWidth(); |
path->moveTo(0, bottom); |
path->rLineTo(0, -1); |
path->rCubicTo(0.75 * scale, 0, 1.625 * scale, -0.5 * scale, 2 * scale, |
-1.5 * scale); |
- path->lineTo(13.5 * scale, top + 1.5 * scale); |
+ path->lineTo((unscaled_endcap_width - 2) * scale, top + 1.5 * scale); |
if (extend_to_top) { |
// Create the vertical extension by extending the side diagonals until they |
// reach the top of the bounds. |
const float dy = 2.5 * scale - 1; |
- const float dx = 11.5 / 25 * dy; |
+ const float dx = GetInverseDiagonalSlope() * dy; |
path->rLineTo(dx, -dy); |
- path->lineTo(right - 13.5 * scale - dx, 0); |
+ path->lineTo(right - (unscaled_endcap_width - 2) * scale - dx, 0); |
path->rLineTo(dx, dy); |
} else { |
path->rCubicTo(0.375 * scale, -scale, 1.25 * scale, -1.5 * scale, 2 * scale, |
-1.5 * scale); |
- path->lineTo(right - 15.5 * scale, top); |
+ path->lineTo(right - unscaled_endcap_width * scale, top); |
path->rCubicTo(0.75 * scale, 0, 1.625 * scale, 0.5 * scale, 2 * scale, |
1.5 * scale); |
} |