Index: Source/core/css/resolver/FontBuilder.cpp |
diff --git a/Source/core/css/resolver/FontBuilder.cpp b/Source/core/css/resolver/FontBuilder.cpp |
index ca198d97211601a5c786c68a4b91c27d1097b2fb..a2c7cbcbee38010f8aa6d574a20eb98ebdd191e8 100644 |
--- a/Source/core/css/resolver/FontBuilder.cpp |
+++ b/Source/core/css/resolver/FontBuilder.cpp |
@@ -2,6 +2,7 @@ |
* Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
* Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. |
* Copyright (C) 2013 Google Inc. All rights reserved. |
+ * Copyright (C) 2015 Collabora Ltd. All rights reserved. |
* |
* This library is free software; you can redistribute it and/or |
* modify it under the terms of the GNU Library General Public |
@@ -123,6 +124,13 @@ void FontBuilder::setSize(const FontDescription::Size& size) |
setSize(m_fontDescription, size); |
} |
+void FontBuilder::setSizeAdjust(float aspectValue) |
+{ |
+ set(PropertySetFlag::SizeAdjust); |
+ |
+ m_fontDescription.setSizeAdjust(aspectValue); |
+} |
+ |
void FontBuilder::setStretch(FontStretch fontStretch) |
{ |
set(PropertySetFlag::Stretch); |
@@ -319,6 +327,29 @@ void FontBuilder::updateSpecifiedSize(FontDescription& fontDescription, const La |
checkForGenericFamilyChange(style.fontDescription(), fontDescription); |
} |
+void FontBuilder::updateAdjustedSize(FontDescription& fontDescription, const LayoutStyle& style, FontSelector* fontSelector) |
+{ |
+ const float sizeAdjust = fontDescription.sizeAdjust(); |
+ const float specifiedSize = fontDescription.specifiedSize(); |
+ if (!sizeAdjust || !specifiedSize) |
+ return; |
+ |
+ // We need to create a temporal Font to get xHeight of a primary font. |
+ Font font(fontDescription); |
+ font.update(fontSelector); |
+ if (!font.fontMetrics().hasXHeight()) |
+ return; |
+ |
+ float aspectValue = font.fontMetrics().xHeight() / specifiedSize; |
+ float adjustedSize = (sizeAdjust / aspectValue) * specifiedSize; |
+ adjustedSize = getComputedSizeFromSpecifiedSize(fontDescription, style.effectiveZoom(), adjustedSize); |
+ |
+ float multiplier = style.textAutosizingMultiplier(); |
+ if (multiplier > 1) |
+ adjustedSize = TextAutosizer::computeAutosizedFontSize(adjustedSize, multiplier); |
+ fontDescription.setAdjustedSize(adjustedSize); |
+} |
+ |
void FontBuilder::updateComputedSize(FontDescription& fontDescription, const LayoutStyle& style) |
{ |
float computedSize = getComputedSizeFromSpecifiedSize(fontDescription, style.effectiveZoom(), fontDescription.specifiedSize()); |
@@ -344,6 +375,8 @@ void FontBuilder::createFont(PassRefPtrWillBeRawPtr<FontSelector> fontSelector, |
description.setSpecifiedSize(m_fontDescription.specifiedSize()); |
description.setIsAbsoluteSize(m_fontDescription.isAbsoluteSize()); |
} |
+ if (isSet(PropertySetFlag::SizeAdjust)) |
+ description.setSizeAdjust(m_fontDescription.sizeAdjust()); |
if (isSet(PropertySetFlag::Weight)) |
description.setWeight(m_fontDescription.weight()); |
if (isSet(PropertySetFlag::Stretch)) |
@@ -371,6 +404,7 @@ void FontBuilder::createFont(PassRefPtrWillBeRawPtr<FontSelector> fontSelector, |
updateSpecifiedSize(description, style); |
updateComputedSize(description, style); |
+ updateAdjustedSize(description, style, fontSelector.get()); |
style.setFontDescription(description); |
style.font().update(fontSelector); |