double CSSPrimitiveValue::computeLengthDouble(const CSSToLengthConversionData& conversionData) { // The logic in this function is duplicated in MediaValues::computeLength // because MediaValues::computeLength needs nearly identical logic, but we haven't found a way to make // CSSPrimitiveValue::computeLengthDouble more generic (to solve both cases) without hurting performance. if (type() == UnitType::Calc) return m_value.calc->computeLengthPx(conversionData); double factor; switch (type()) { case UnitType::Ems: factor = conversionData.emFontSize(); break; case UnitType::Exs: factor = conversionData.exFontSize(); break; case UnitType::Rems: factor = conversionData.remFontSize(); break; case UnitType::Chs: factor = conversionData.chFontSize(); break; case UnitType::Pixels: factor = 1.0; break; case UnitType::Centimeters: factor = cssPixelsPerCentimeter; break; case UnitType::Millimeters: factor = cssPixelsPerMillimeter; break; case UnitType::Inches: factor = cssPixelsPerInch; break; case UnitType::Points: factor = cssPixelsPerPoint; break; case UnitType::Picas: factor = cssPixelsPerPica; break; case UnitType::ViewportWidth: factor = conversionData.viewportWidthPercent(); break; case UnitType::ViewportHeight: factor = conversionData.viewportHeightPercent(); break; case UnitType::ViewportMin: factor = conversionData.viewportMinPercent(); break; case UnitType::ViewportMax: factor = conversionData.viewportMaxPercent(); break; case UnitType::CalcPercentageWithLength: case UnitType::CalcPercentageWithNumber: ASSERT_NOT_REACHED(); return -1.0; default: ASSERT_NOT_REACHED(); return -1.0; } // We do not apply the zoom factor when we are computing the value of the font-size property. The zooming // for font sizes is much more complicated, since we have to worry about enforcing the minimum font size preference // as well as enforcing the implicit "smart minimum." double result = getDoubleValue() * factor; if (isFontRelativeLength()) return result; return result * conversionData.zoom(); }
double CSSPrimitiveValue::computeLengthDouble(const CSSToLengthConversionData& conversionData) const { if (m_primitiveUnitType == CSS_CALC) // The multiplier and factor is applied to each value in the calc expression individually return m_value.calc->computeLengthPx(conversionData); double factor; switch (primitiveType()) { case CSS_EMS: ASSERT(conversionData.style()); factor = conversionData.computingFontSize() ? conversionData.style()->fontDescription().specifiedSize() : conversionData.style()->fontDescription().computedSize(); break; case CSS_EXS: ASSERT(conversionData.style()); // 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 (conversionData.style()->fontMetrics().hasXHeight()) factor = conversionData.style()->fontMetrics().xHeight(); else factor = (conversionData.computingFontSize() ? conversionData.style()->fontDescription().specifiedSize() : conversionData.style()->fontDescription().computedSize()) / 2.0; break; case CSS_REMS: if (conversionData.rootStyle()) factor = conversionData.computingFontSize() ? conversionData.rootStyle()->fontDescription().specifiedSize() : conversionData.rootStyle()->fontDescription().computedSize(); else factor = 1.0; break; case CSS_CHS: ASSERT(conversionData.style()); factor = conversionData.style()->fontMetrics().zeroWidth(); break; case CSS_PX: factor = 1.0; break; case CSS_CM: factor = cssPixelsPerInch / 2.54; // (2.54 cm/in) break; case CSS_MM: factor = cssPixelsPerInch / 25.4; break; case CSS_IN: factor = cssPixelsPerInch; break; case CSS_PT: factor = cssPixelsPerInch / 72.0; break; case CSS_PC: // 1 pc == 12 pt factor = cssPixelsPerInch * 12.0 / 72.0; break; case CSS_CALC_PERCENTAGE_WITH_LENGTH: case CSS_CALC_PERCENTAGE_WITH_NUMBER: ASSERT_NOT_REACHED(); return -1.0; case CSS_VH: factor = conversionData.viewportHeightFactor(); break; case CSS_VW: factor = conversionData.viewportWidthFactor(); break; case CSS_VMAX: factor = conversionData.viewportMaxFactor(); break; case CSS_VMIN: factor = conversionData.viewportMinFactor(); break; default: ASSERT_NOT_REACHED(); return -1.0; } // We do not apply the zoom factor when we are computing the value of the font-size property. The zooming // for font sizes is much more complicated, since we have to worry about enforcing the minimum font size preference // as well as enforcing the implicit "smart minimum." double result = getDoubleValue() * factor; if (conversionData.computingFontSize() || isFontRelativeLength()) return result; return result * conversionData.zoom(); }