float SVGLengthContext::convertValueFromUserUnits( float value, SVGLengthMode mode, CSSPrimitiveValue::UnitType toUnit) const { switch (toUnit) { case CSSPrimitiveValue::UnitType::Pixels: case CSSPrimitiveValue::UnitType::Number: case CSSPrimitiveValue::UnitType::Integer: case CSSPrimitiveValue::UnitType::UserUnits: return value; case CSSPrimitiveValue::UnitType::Percentage: { FloatSize viewportSize; if (!determineViewport(viewportSize)) return 0; float dimension = dimensionForLengthMode(mode, viewportSize); if (!dimension) return 0; // LengthTypePercentage is represented with 100% = 100.0. // Good for accuracy but could eventually be changed. return value * 100 / dimension; } case CSSPrimitiveValue::UnitType::Ems: return convertValueFromUserUnitsToEMS( computedStyleForLengthResolving(m_context), value); case CSSPrimitiveValue::UnitType::Exs: return convertValueFromUserUnitsToEXS(value); case CSSPrimitiveValue::UnitType::Rems: return convertValueFromUserUnitsToEMS(rootElementStyle(m_context), value); case CSSPrimitiveValue::UnitType::Chs: return convertValueFromUserUnitsToCHS(value); case CSSPrimitiveValue::UnitType::Centimeters: return value / cssPixelsPerCentimeter; case CSSPrimitiveValue::UnitType::Millimeters: return value / cssPixelsPerMillimeter; case CSSPrimitiveValue::UnitType::Inches: return value / cssPixelsPerInch; case CSSPrimitiveValue::UnitType::Points: return value / cssPixelsPerPoint; case CSSPrimitiveValue::UnitType::Picas: return value / cssPixelsPerPica; case CSSPrimitiveValue::UnitType::ViewportWidth: case CSSPrimitiveValue::UnitType::ViewportHeight: case CSSPrimitiveValue::UnitType::ViewportMin: case CSSPrimitiveValue::UnitType::ViewportMax: return value / dimensionForViewportUnit(m_context, toUnit); default: break; } ASSERT_NOT_REACHED(); return 0; }
float SVGLengthContext::convertValueFromUserUnits(float value, SVGLengthMode mode, SVGLengthType toUnit, ExceptionCode& ec) const { switch (toUnit) { case LengthTypeUnknown: ec = NOT_SUPPORTED_ERR; return 0; case LengthTypeNumber: return value; case LengthTypePercentage: return convertValueFromUserUnitsToPercentage(value * 100, mode, ec); case LengthTypeEMS: return convertValueFromUserUnitsToEMS(value, ec); case LengthTypeEXS: return convertValueFromUserUnitsToEXS(value, ec); case LengthTypePX: return value; case LengthTypeCM: return value * 2.54f / cssPixelsPerInch; case LengthTypeMM: return value * 25.4f / cssPixelsPerInch; case LengthTypeIN: return value / cssPixelsPerInch; case LengthTypePT: return value * 72 / cssPixelsPerInch; case LengthTypePC: return value * 6 / cssPixelsPerInch; } ASSERT_NOT_REACHED(); return 0; }
float SVGLengthContext::convertValueFromUserUnits(float value, SVGLengthMode mode, SVGLengthType toUnit, ExceptionState& es) const { switch (toUnit) { case LengthTypeUnknown: es.throwDOMException(NotSupportedError); return 0; case LengthTypeNumber: return value; case LengthTypePercentage: return convertValueFromUserUnitsToPercentage(value * 100, mode, es); case LengthTypeEMS: return convertValueFromUserUnitsToEMS(value, es); case LengthTypeEXS: return convertValueFromUserUnitsToEXS(value, es); case LengthTypePX: return value; case LengthTypeCM: return value * 2.54f / cssPixelsPerInch; case LengthTypeMM: return value * 25.4f / cssPixelsPerInch; case LengthTypeIN: return value / cssPixelsPerInch; case LengthTypePT: return value * 72 / cssPixelsPerInch; case LengthTypePC: return value * 6 / cssPixelsPerInch; } ASSERT_NOT_REACHED(); return 0; }
float SVGLengthContext::convertValueFromUserUnits(float value, SVGLengthMode mode, SVGLengthType toUnit, ExceptionState& exceptionState) const { switch (toUnit) { case LengthTypeUnknown: exceptionState.throwDOMException(NotSupportedError, ExceptionMessages::argumentNullOrIncorrectType(3, "SVGLengthType")); return 0; case LengthTypeNumber: return value; case LengthTypePercentage: return convertValueFromUserUnitsToPercentage(value * 100, mode, exceptionState); case LengthTypeEMS: return convertValueFromUserUnitsToEMS(value, exceptionState); case LengthTypeEXS: return convertValueFromUserUnitsToEXS(value, exceptionState); case LengthTypePX: return value; 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::convertValueFromUserUnits(float value, SVGLengthMode mode, SVGLengthType toUnit) const { switch (toUnit) { case LengthTypeUnknown: return 0; case LengthTypeNumber: return value; case LengthTypePercentage: { FloatSize viewportSize; if (!determineViewport(viewportSize)) return 0; float dimension = dimensionForLengthMode(mode, viewportSize); if (!dimension) return 0; // LengthTypePercentage is represented with 100% = 100.0. // Good for accuracy but could eventually be changed. return value * 100 / dimension; } case LengthTypeEMS: return convertValueFromUserUnitsToEMS(computedStyleForLengthResolving(m_context), value); case LengthTypeEXS: return convertValueFromUserUnitsToEXS(value); case LengthTypeREMS: return convertValueFromUserUnitsToEMS(rootElementStyle(m_context), value); case LengthTypeCHS: return convertValueFromUserUnitsToCHS(value); case LengthTypePX: return value; 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; }
void SVGLength::setValue(float value, const SVGElement* context, ExceptionCode& ec) { switch (extractType(m_unit)) { case LengthTypeUnknown: ec = NOT_SUPPORTED_ERR; break; case LengthTypeNumber: m_valueInSpecifiedUnits = value; break; case LengthTypePercentage: { float result = convertValueFromUserUnitsToPercentage(value, context, ec); if (!ec) m_valueInSpecifiedUnits = result; break; } case LengthTypeEMS: { float result = convertValueFromUserUnitsToEMS(value, context, ec); if (!ec) m_valueInSpecifiedUnits = result; break; } case LengthTypeEXS: { float result = convertValueFromUserUnitsToEXS(value, context, ec); if (!ec) m_valueInSpecifiedUnits = result; break; } case LengthTypePX: m_valueInSpecifiedUnits = value; break; case LengthTypeCM: m_valueInSpecifiedUnits = value * 2.54f / cssPixelsPerInch; break; case LengthTypeMM: m_valueInSpecifiedUnits = value * 25.4f / cssPixelsPerInch; break; case LengthTypeIN: m_valueInSpecifiedUnits = value / cssPixelsPerInch; break; case LengthTypePT: m_valueInSpecifiedUnits = value * 72 / cssPixelsPerInch; break; case LengthTypePC: m_valueInSpecifiedUnits = value * 6 / cssPixelsPerInch; break; } }