FloatRect SVGLengthContext::resolveRectangle(const SVGElement* context, SVGUnitTypes::SVGUnitType type, const FloatRect& viewport, const SVGLength& x, const SVGLength& y, const SVGLength& width, const SVGLength& height) { ASSERT(type != SVGUnitTypes::SVG_UNIT_TYPE_UNKNOWN); if (type != SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE) { const FloatSize& viewportSize = viewport.size(); return FloatRect( convertValueFromPercentageToUserUnits(x, viewportSize) + viewport.x(), convertValueFromPercentageToUserUnits(y, viewportSize) + viewport.y(), convertValueFromPercentageToUserUnits(width, viewportSize), convertValueFromPercentageToUserUnits(height, viewportSize)); } SVGLengthContext lengthContext(context); return FloatRect(x.value(lengthContext), y.value(lengthContext), width.value(lengthContext), height.value(lengthContext)); }
float SVGLength::value(const SVGElement* context, ExceptionCode& ec) const { switch (extractType(m_unit)) { case LengthTypeUnknown: ec = NOT_SUPPORTED_ERR; return 0; case LengthTypeNumber: return m_valueInSpecifiedUnits; case LengthTypePercentage: return convertValueFromPercentageToUserUnits(m_valueInSpecifiedUnits / 100, context, ec); case LengthTypeEMS: return convertValueFromEMSToUserUnits(m_valueInSpecifiedUnits, context, ec); case LengthTypeEXS: return convertValueFromEXSToUserUnits(m_valueInSpecifiedUnits, context, ec); case LengthTypePX: return m_valueInSpecifiedUnits; case LengthTypeCM: return m_valueInSpecifiedUnits / 2.54f * cssPixelsPerInch; case LengthTypeMM: return m_valueInSpecifiedUnits / 25.4f * cssPixelsPerInch; case LengthTypeIN: return m_valueInSpecifiedUnits * cssPixelsPerInch; case LengthTypePT: return m_valueInSpecifiedUnits / 72 * cssPixelsPerInch; case LengthTypePC: return m_valueInSpecifiedUnits / 6 * cssPixelsPerInch; } ASSERT_NOT_REACHED(); return 0; }
FloatRect SVGLengthContext::resolveRectangle(const SVGElement* context, SVGUnitTypes::SVGUnitType type, const FloatRect& viewport, const SVGLength& x, const SVGLength& y, const SVGLength& width, const SVGLength& height) { DCHECK_NE(SVGUnitTypes::kSvgUnitTypeUnknown, type); if (type != SVGUnitTypes::kSvgUnitTypeUserspaceonuse) { const FloatSize& viewportSize = viewport.size(); return FloatRect( convertValueFromPercentageToUserUnits(x, viewportSize) + viewport.x(), convertValueFromPercentageToUserUnits(y, viewportSize) + viewport.y(), convertValueFromPercentageToUserUnits(width, viewportSize), convertValueFromPercentageToUserUnits(height, viewportSize)); } SVGLengthContext lengthContext(context); return FloatRect(x.value(lengthContext), y.value(lengthContext), width.value(lengthContext), height.value(lengthContext)); }
float SVGLengthContext::convertValueToUserUnits(float value, SVGLengthMode mode, SVGLengthType fromUnit, ExceptionCode& ec) const { // If the SVGLengthContext carries a custom viewport, force resolving against it. if (!m_overridenViewport.isEmpty()) { // 100% = 100.0 instead of 1.0 for historical reasons, this could eventually be changed if (fromUnit == LengthTypePercentage) value /= 100; return convertValueFromPercentageToUserUnits(value, mode, ec); } switch (fromUnit) { case LengthTypeUnknown: ec = NOT_SUPPORTED_ERR; return 0; case LengthTypeNumber: return value; case LengthTypePX: return value; case LengthTypePercentage: return convertValueFromPercentageToUserUnits(value / 100, mode, ec); case LengthTypeEMS: return convertValueFromEMSToUserUnits(value, ec); case LengthTypeEXS: return convertValueFromEXSToUserUnits(value, ec); case LengthTypeCM: return value * cssPixelsPerInch / 2.54f; case LengthTypeMM: return value * cssPixelsPerInch / 25.4f; case LengthTypeIN: return value * cssPixelsPerInch; case LengthTypePT: return value * cssPixelsPerInch / 72; case LengthTypePC: return value * cssPixelsPerInch / 6; } ASSERT_NOT_REACHED(); return 0; }
float SVGLengthContext::convertValueToUserUnits(float value, SVGLengthMode mode, SVGLengthType fromUnit, ExceptionState& exceptionState) const { // If the SVGLengthContext carries a custom viewport, force resolving against it. if (!m_overridenViewport.isEmpty()) { // 100% = 100.0 instead of 1.0 for historical reasons, this could eventually be changed if (fromUnit == LengthTypePercentage) value /= 100; return convertValueFromPercentageToUserUnits(value, mode, exceptionState); } switch (fromUnit) { case LengthTypeUnknown: exceptionState.throwDOMException(NotSupportedError, ExceptionMessages::argumentNullOrIncorrectType(3, "SVGLengthType")); return 0; case LengthTypeNumber: return value; case LengthTypePX: return value; case LengthTypePercentage: return convertValueFromPercentageToUserUnits(value / 100, mode, exceptionState); case LengthTypeEMS: return convertValueFromEMSToUserUnits(value, exceptionState); case LengthTypeEXS: return convertValueFromEXSToUserUnits(value, exceptionState); case LengthTypeCM: return value * cssPixelsPerCentimeter; case LengthTypeMM: return value * cssPixelsPerMillimeter; case LengthTypeIN: return value * cssPixelsPerInch; case LengthTypePT: return value * cssPixelsPerPoint; case LengthTypePC: return value * cssPixelsPerPica; } ASSERT_NOT_REACHED(); return 0; }
float SVGLengthContext::valueForLength(const Length& length, SVGLengthMode mode) { if (length.isPercent()) return convertValueFromPercentageToUserUnits(length.value() / 100, mode, IGNORE_EXCEPTION); if (length.isAuto() || !length.isSpecified()) return 0; FloatSize viewportSize; determineViewport(viewportSize); switch (mode) { case LengthModeWidth: return floatValueForLength(length, viewportSize.width()); case LengthModeHeight: return floatValueForLength(length, viewportSize.height()); case LengthModeOther: return floatValueForLength(length, sqrtf(viewportSize.diagonalLengthSquared() / 2)); }; return 0; }
float SVGLengthContext::valueForLength(const Length& length, SVGLengthMode mode) { if (length.isPercent()) { auto result = convertValueFromPercentageToUserUnits(length.value() / 100, mode); if (result.hasException()) return 0; return result.releaseReturnValue(); } if (length.isAuto() || !length.isSpecified()) return 0; FloatSize viewportSize; determineViewport(viewportSize); switch (mode) { case LengthModeWidth: return floatValueForLength(length, viewportSize.width()); case LengthModeHeight: return floatValueForLength(length, viewportSize.height()); case LengthModeOther: return floatValueForLength(length, std::sqrt(viewportSize.diagonalLengthSquared() / 2)); }; return 0; }