package unit // PageDimensions contains the page size and margins of a scanned document page. type PageDimensions[T UnitConstraint] struct { MediumSize Vec2[T] `json:"mediumSize"` // The size of the page or medium. ScanSize Rectangle[T] `json:"scanSize"` // The size of the scanned area or image. } // NewPageDimensionsFromDensity returns page dimensions for the given resolution resX and resY, and the respective densities. // // The resulting PageDimensions will have equal MediumSize and ScanSize (No margin). // The correct margin or MediumSize can be added later on. // // In case any density is nil, this will return zero value PageDimensions. func NewPageDimensionsFromDensity(resX, resY int, densityX, densityY Density) PageDimensions[Millimeter] { if densityX == nil || densityY == nil { return PageDimensions[Millimeter]{} } size := Vec2[Millimeter]{ X: Millimeter(resX) / Millimeter(densityX.PerMillimeter()), Y: Millimeter(resY) / Millimeter(densityY.PerMillimeter()), } return PageDimensions[Millimeter]{ MediumSize: size, ScanSize: Rectangle[Millimeter]{ Size: size, }, } } // NewPageDimensionsFromLengths returns page dimensions for the given lengths. // // The resulting PageDimensions will have equal MediumSize and ScanSize (No margin). // The correct margin or MediumSize can be added later on. // // In case any length is nil, this will return zero value PageDimensions. func NewPageDimensionsFromLengths(x, y Length) PageDimensions[Millimeter] { if x == nil || y == nil { return PageDimensions[Millimeter]{} } size := Vec2[Millimeter]{X: x.Millimeters(), Y: y.Millimeters()} return PageDimensions[Millimeter]{ MediumSize: size, ScanSize: Rectangle[Millimeter]{ Size: size, }, } }