1
1
mirror of https://github.com/exyte/Macaw.git synced 2024-09-21 09:59:10 +03:00
Macaw/Source/utils/SvgContentLayout.swift
2018-05-07 16:14:06 +07:00

40 lines
1.2 KiB
Swift

public protocol ContentLayout {
static var standard: ContentLayout { get }
func layout(rect: Rect, into rectToFitIn: Rect) -> Transform
}
class SvgContentLayout: ContentLayout {
let scalingMode: AspectRatio
let xAligningMode: Align
let yAligningMode: Align
init(scalingMode: AspectRatio? = .meet, xAligningMode: Align? = .mid, yAligningMode: Align? = .mid) {
self.scalingMode = scalingMode ?? .meet
self.xAligningMode = xAligningMode ?? .mid
self.yAligningMode = yAligningMode ?? .mid
}
public static var standard: ContentLayout {
return SvgContentLayout()
}
public func layout(rect: Rect, into rectToFitIn: Rect) -> Transform {
var result = Transform()
let newSize = scalingMode.fit(rect: rect, into: rectToFitIn)
result = result.scale(
sx: newSize.w / rect.w,
sy: newSize.h / rect.h
)
let dx = xAligningMode.align(outer: rectToFitIn.w, inner: newSize.w) / (newSize.w / rect.w)
let dy = yAligningMode.align(outer: rectToFitIn.h, inner: newSize.h) / (newSize.h / rect.h)
result = result.move(dx: dx, dy: dy)
return result
}
}