Index: Source/core/css/CSSToLengthConversionData.cpp |
diff --git a/Source/core/css/CSSToLengthConversionData.cpp b/Source/core/css/CSSToLengthConversionData.cpp |
index c2871410fd3451c546d513f50ba2765746113fed..2e97cb814f3669646715e8894d83a4b31483e9a5 100644 |
--- a/Source/core/css/CSSToLengthConversionData.cpp |
+++ b/Source/core/css/CSSToLengthConversionData.cpp |
@@ -36,66 +36,77 @@ |
namespace blink { |
-CSSToLengthConversionData::CSSToLengthConversionData(const RenderStyle* style, const RenderStyle* rootStyle, const RenderView* renderView, float zoom, bool computingFontSize) |
- : m_style(style) |
- , m_rootStyle(rootStyle) |
- , m_viewportWidth(renderView ? renderView->layoutViewportWidth() : 0) |
- , m_viewportHeight(renderView ? renderView->layoutViewportHeight() : 0) |
- , m_zoom(zoom) |
- , m_useEffectiveZoom(false) |
- , m_computingFontSize(computingFontSize) |
+CSSToLengthConversionData::FontSizes::FontSizes(float em, float rem, const Font* font) |
+ : m_em(em) |
+ , m_rem(rem) |
+ , m_font(font) |
{ |
- ASSERT(zoom > 0); |
+ // FIXME: Improve RAII of StyleResolverState to use const Font&. |
+ ASSERT(m_font); |
} |
-CSSToLengthConversionData::CSSToLengthConversionData(const RenderStyle* style, const RenderStyle* rootStyle, const RenderView* renderView, bool computingFontSize) |
- : m_style(style) |
- , m_rootStyle(rootStyle) |
- , m_viewportWidth(renderView ? renderView->layoutViewportWidth() : 0) |
- , m_viewportHeight(renderView ? renderView->layoutViewportHeight() : 0) |
- , m_useEffectiveZoom(true) |
- , m_computingFontSize(computingFontSize) |
+CSSToLengthConversionData::FontSizes::FontSizes(const RenderStyle* style, const RenderStyle* rootStyle) |
+ : FontSizes(style->computedFontSize(), rootStyle ? rootStyle->computedFontSize() : 1.0f, &style->font()) |
+{ |
+} |
+ |
+float CSSToLengthConversionData::FontSizes::ex() const |
+{ |
+ ASSERT(m_font); |
+ // FIXME: We have a bug right now where the zoom will be applied twice to EX units. |
+ // We really need to compute EX using fontMetrics for the original specifiedSize and not use |
+ // our actual constructed rendering font. |
+ if (!m_font->fontMetrics().hasXHeight()) |
+ return m_em / 2.0f; |
+ return m_font->fontMetrics().xHeight(); |
+} |
+ |
+float CSSToLengthConversionData::FontSizes::ch() const |
+{ |
+ ASSERT(m_font); |
+ return m_font->fontMetrics().zeroWidth(); |
+} |
+ |
+CSSToLengthConversionData::ViewportSize::ViewportSize(const RenderView* renderView) |
+ : m_width(renderView ? renderView->layoutViewportWidth() : 0) |
+ , m_height(renderView ? renderView->layoutViewportHeight() : 0) |
{ |
} |
-CSSToLengthConversionData::CSSToLengthConversionData(const RenderStyle* style, const RenderStyle* rootStyle, float viewportWidth, float viewportHeight, float zoom, bool computingFontSize) |
+CSSToLengthConversionData::CSSToLengthConversionData(const RenderStyle* style, const FontSizes& fontSizes, const ViewportSize& viewportSize, float zoom) |
: m_style(style) |
- , m_rootStyle(rootStyle) |
- , m_viewportWidth(viewportWidth) |
- , m_viewportHeight(viewportHeight) |
+ , m_fontSizes(fontSizes) |
+ , m_viewportSize(viewportSize) |
, m_zoom(zoom) |
- , m_useEffectiveZoom(false) |
- , m_computingFontSize(computingFontSize) |
{ |
+ ASSERT(m_style); |
ASSERT(zoom > 0); |
} |
-float CSSToLengthConversionData::zoom() const |
+CSSToLengthConversionData::CSSToLengthConversionData(const RenderStyle* style, const RenderStyle* rootStyle, const RenderView* renderView, float zoom) |
+ : CSSToLengthConversionData(style, FontSizes(style, rootStyle), ViewportSize(renderView), zoom) |
{ |
- if (m_useEffectiveZoom) |
- return m_style ? m_style->effectiveZoom() : 1; |
- return m_zoom; |
} |
double CSSToLengthConversionData::viewportWidthPercent() const |
{ |
m_style->setHasViewportUnits(); |
- return m_viewportWidth / 100; |
+ return m_viewportSize.width() / 100; |
} |
double CSSToLengthConversionData::viewportHeightPercent() const |
{ |
m_style->setHasViewportUnits(); |
- return m_viewportHeight / 100; |
+ return m_viewportSize.height() / 100; |
} |
double CSSToLengthConversionData::viewportMinPercent() const |
{ |
m_style->setHasViewportUnits(); |
- return std::min(m_viewportWidth, m_viewportHeight) / 100; |
+ return std::min(m_viewportSize.width(), m_viewportSize.height()) / 100; |
} |
double CSSToLengthConversionData::viewportMaxPercent() const |
{ |
m_style->setHasViewportUnits(); |
- return std::max(m_viewportWidth, m_viewportHeight) / 100; |
+ return std::max(m_viewportSize.width(), m_viewportSize.height()) / 100; |
} |
} // namespace blink |