static inline float dimensionForLengthMode(SVGLengthMode mode, const FloatSize& viewportSize) { switch (mode) { case SVGLengthMode::Width: return viewportSize.width(); case SVGLengthMode::Height: return viewportSize.height(); case SVGLengthMode::Other: return sqrtf(viewportSize.diagonalLengthSquared() / 2); } ASSERT_NOT_REACHED(); return 0; }
ExceptionOr<float> SVGLengthContext::convertValueFromPercentageToUserUnits(float value, SVGLengthMode mode) const { FloatSize viewportSize; if (!determineViewport(viewportSize)) return Exception { NOT_SUPPORTED_ERR }; switch (mode) { case LengthModeWidth: return value * viewportSize.width(); case LengthModeHeight: return value * viewportSize.height(); case LengthModeOther: return value * std::sqrt(viewportSize.diagonalLengthSquared() / 2); }; 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::convertValueFromUserUnitsToPercentage(float value, SVGLengthMode mode, ExceptionCode& ec) const { FloatSize viewportSize; if (!determineViewport(viewportSize)) { ec = NOT_SUPPORTED_ERR; return 0; } switch (mode) { case LengthModeWidth: return value / viewportSize.width() * 100; case LengthModeHeight: return value / viewportSize.height() * 100; case LengthModeOther: return value / (sqrtf(viewportSize.diagonalLengthSquared() / 2)) * 100; }; ASSERT_NOT_REACHED(); return 0; }
float SVGLengthContext::convertValueFromPercentageToUserUnits(float value, SVGLengthMode mode, ExceptionState& exceptionState) const { FloatSize viewportSize; if (!determineViewport(viewportSize)) { exceptionState.throwDOMException(NotSupportedError, "The viewport could not be determined."); return 0; } switch (mode) { case LengthModeWidth: return value * viewportSize.width(); case LengthModeHeight: return value * viewportSize.height(); case LengthModeOther: return value * sqrtf(viewportSize.diagonalLengthSquared() / 2); }; ASSERT_NOT_REACHED(); 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; }