Browse Source

Added support for unit types

Marcin Ziąbek 3 years ago
parent
commit
272b0fc11a

+ 3 - 2
QuestPDF.Examples/ColumnExamples.cs

@@ -25,8 +25,9 @@ namespace QuestPDF.Examples
                         static void Block(IContainer container)
                         static void Block(IContainer container)
                         {
                         {
                             container
                             container
-                                .Width(100)
-                                .Height(100)
+                                .Width(72)
+                                .Height(3.5f)
+                                .Height(1.5f)
                                 .Background(Placeholders.BackgroundColor());
                                 .Background(Placeholders.BackgroundColor());
                         }
                         }
                     });
                     });

+ 1 - 1
QuestPDF.Examples/DebuggingTesting.cs

@@ -9,7 +9,7 @@ namespace QuestPDF.Examples
     public class DebuggingTesting
     public class DebuggingTesting
     {
     {
         [Test]
         [Test]
-        public void column()
+        public void Column()
         {
         {
             Assert.Throws<DocumentLayoutException>(() =>
             Assert.Throws<DocumentLayoutException>(() =>
             {
             {

+ 1 - 1
QuestPDF.Examples/DifferentHeaderOnFirstPageExample.cs

@@ -23,7 +23,7 @@ namespace QuestPDF.Examples
                     container.Page(page =>
                     container.Page(page =>
                     {
                     {
                         page.Size(PageSizes.A6);
                         page.Size(PageSizes.A6);
-                        page.Margin(30);
+                        page.Margin(5);
                         page.Background(Colors.White);
                         page.Background(Colors.White);
                         
                         
                         page.Header().Column(column =>
                         page.Header().Column(column =>

+ 20 - 14
QuestPDF/Fluent/BorderExtensions.cs

@@ -14,39 +14,45 @@ namespace QuestPDF.Fluent
             return element.Element(border);
             return element.Element(border);
         }
         }
         
         
-        public static IContainer Border(this IContainer element, float value)
+        public static IContainer Border(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.BorderHorizontal(value).BorderVertical(value);
+            return element
+                .BorderHorizontal(value, unit)
+                .BorderVertical(value, unit);
         }
         }
         
         
-        public static IContainer BorderVertical(this IContainer element, float value)
+        public static IContainer BorderVertical(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.BorderLeft(value).BorderRight(value);
+            return element
+                .BorderLeft(value, unit)
+                .BorderRight(value, unit);
         }
         }
         
         
-        public static IContainer BorderHorizontal(this IContainer element, float value)
+        public static IContainer BorderHorizontal(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.BorderTop(value).BorderBottom(value);
+            return element
+                .BorderTop(value, unit)
+                .BorderBottom(value, unit);
         }
         }
         
         
-        public static IContainer BorderLeft(this IContainer element, float value)
+        public static IContainer BorderLeft(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Border(x => x.Left = value);
+            return element.Border(x => x.Left = value.ToPoints(unit));
         }
         }
         
         
-        public static IContainer BorderRight(this IContainer element, float value)
+        public static IContainer BorderRight(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Border(x => x.Right = value);
+            return element.Border(x => x.Right = value.ToPoints(unit));
         }
         }
         
         
-        public static IContainer BorderTop(this IContainer element, float value)
+        public static IContainer BorderTop(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Border(x => x.Top = value);
+            return element.Border(x => x.Top = value.ToPoints(unit));
         }
         }
         
         
-        public static IContainer BorderBottom(this IContainer element, float value)
+        public static IContainer BorderBottom(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Border(x => x.Bottom = value);
+            return element.Border(x => x.Bottom = value.ToPoints(unit));
         }
         }
         
         
         public static IContainer BorderColor(this IContainer element, string color)
         public static IContainer BorderColor(this IContainer element, string color)

+ 3 - 5
QuestPDF/Fluent/ColumnExtensions.cs

@@ -6,19 +6,18 @@ namespace QuestPDF.Fluent
 {
 {
     public class ColumnDescriptor
     public class ColumnDescriptor
     {
     {
-        //internal column Column { get; } = new();
         internal Column Column { get; } = new();
         internal Column Column { get; } = new();
 
 
-        public void Spacing(float value)
+        public void Spacing(float value, Unit unit = Unit.Point)
         {
         {
-            Column.Spacing = value;
+            Column.Spacing = value.ToPoints(unit);
         }
         }
         
         
         public IContainer Item()
         public IContainer Item()
         {
         {
             var container = new Container();
             var container = new Container();
             
             
-            Column.Items.Add(new ColumnItem()
+            Column.Items.Add(new ColumnItem
             {
             {
                 Child = container
                 Child = container
             });
             });
@@ -41,7 +40,6 @@ namespace QuestPDF.Fluent
             var descriptor = new ColumnDescriptor();
             var descriptor = new ColumnDescriptor();
             handler(descriptor);
             handler(descriptor);
             element.Element(descriptor.Column);
             element.Element(descriptor.Column);
-            //element.Component(descriptor.Column);
         }
         }
     }
     }
 }
 }

+ 16 - 12
QuestPDF/Fluent/ConstrainedExtensions.cs

@@ -14,34 +14,38 @@ namespace QuestPDF.Fluent
             return element.Element(constrained);
             return element.Element(constrained);
         }
         }
         
         
-        public static IContainer Width(this IContainer element, float value)
+        public static IContainer Width(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.MinWidth(value).MaxWidth(value);
+            return element
+                .MinWidth(value, unit)
+                .MaxWidth(value, unit);
         }
         }
         
         
-        public static IContainer MinWidth(this IContainer element, float value)
+        public static IContainer MinWidth(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Constrained(x => x.MinWidth = value);
+            return element.Constrained(x => x.MinWidth = value.ToPoints(unit));
         }
         }
         
         
-        public static IContainer MaxWidth(this IContainer element, float value)
+        public static IContainer MaxWidth(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Constrained(x => x.MaxWidth = value);
+            return element.Constrained(x => x.MaxWidth = value.ToPoints(unit));
         }
         }
         
         
-        public static IContainer Height(this IContainer element, float value)
+        public static IContainer Height(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.MinHeight(value).MaxHeight(value);
+            return element
+                .MinHeight(value, unit)
+                .MaxHeight(value, unit);
         }
         }
         
         
-        public static IContainer MinHeight(this IContainer element, float value)
+        public static IContainer MinHeight(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Constrained(x => x.MinHeight = value);
+            return element.Constrained(x => x.MinHeight = value.ToPoints(unit));
         }
         }
         
         
-        public static IContainer MaxHeight(this IContainer element, float value)
+        public static IContainer MaxHeight(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Constrained(x => x.MaxHeight = value);
+            return element.Constrained(x => x.MaxHeight = value.ToPoints(unit));
         }
         }
     }
     }
 }
 }

+ 31 - 23
QuestPDF/Fluent/DecorationExtensions.cs

@@ -46,29 +46,37 @@ namespace QuestPDF.Fluent
 
 
         #region Obsolete
         #region Obsolete
 
 
-        // public IContainer Header()
-        // {
-        //     var container = new Container();
-        //     Decoration.Before = container;
-        //     return container;
-        // }
-        //
-        // public void Header(Action<IContainer> handler)
-        // {
-        //     handler?.Invoke(Header());
-        // }
-        //
-        // public IContainer Footer()
-        // {
-        //     var container = new Container();
-        //     Decoration.After = container;
-        //     return container;
-        // }
-        //
-        // public void Footer(Action<IContainer> handler)
-        // {
-        //     handler?.Invoke(Footer());
-        // }
+        // TODO: deprecated Box method in QuestPDF 2022.2
+        [Obsolete("This element has been renamed. Please use the Before method.")]
+        public IContainer Header()
+        {
+            var container = new Container();
+            Decoration.Before = container;
+            return container;
+        }
+        
+        // TODO: deprecated Box method in QuestPDF 2022.2
+        [Obsolete("This element has been renamed. Please use the Before method.")]
+        public void Header(Action<IContainer> handler)
+        {
+            handler?.Invoke(Header());
+        }
+        
+        // TODO: deprecated Box method in QuestPDF 2022.2
+        [Obsolete("This element has been renamed. Please use the After method.")]
+        public IContainer Footer()
+        {
+            var container = new Container();
+            Decoration.After = container;
+            return container;
+        }
+        
+        // TODO: deprecated Box method in QuestPDF 2022.2
+        [Obsolete("This element has been renamed. Please use the After method.")]
+        public void Footer(Action<IContainer> handler)
+        {
+            handler?.Invoke(Footer());
+        }
 
 
         #endregion
         #endregion
     }
     }

+ 7 - 7
QuestPDF/Fluent/GridExtensions.cs

@@ -8,20 +8,20 @@ namespace QuestPDF.Fluent
     {
     {
         internal Grid Grid { get; } = new Grid();
         internal Grid Grid { get; } = new Grid();
         
         
-        public void Spacing(float value)
+        public void Spacing(float value, Unit unit = Unit.Point)
         {
         {
-            VerticalSpacing(value);
-            HorizontalSpacing(value);
+            VerticalSpacing(value, unit);
+            HorizontalSpacing(value, unit);
         }
         }
         
         
-        public void VerticalSpacing(float value)
+        public void VerticalSpacing(float value, Unit unit = Unit.Point)
         {
         {
-            Grid.VerticalSpacing = value;
+            Grid.VerticalSpacing = value.ToPoints(unit);
         }
         }
          
          
-        public void HorizontalSpacing(float value)
+        public void HorizontalSpacing(float value, Unit unit = Unit.Point)
         {
         {
-            Grid.HorizontalSpacing = value;
+            Grid.HorizontalSpacing = value.ToPoints(unit);
         }
         }
         
         
         public void Columns(int value = Grid.DefaultColumnsCount)
         public void Columns(int value = Grid.DefaultColumnsCount)

+ 12 - 5
QuestPDF/Fluent/InlinedExtensions.cs

@@ -10,14 +10,21 @@ namespace QuestPDF.Fluent
     {
     {
         internal Inlined Inlined { get; } = new Inlined();
         internal Inlined Inlined { get; } = new Inlined();
         
         
-        public void Spacing(float value)
+        public void Spacing(float value, Unit unit = Unit.Point)
         {
         {
-            VerticalSpacing(value);
-            HorizontalSpacing(value);
+            VerticalSpacing(value, unit);
+            HorizontalSpacing(value, unit);
         }
         }
         
         
-        public void VerticalSpacing(float value) => Inlined.VerticalSpacing = value;
-        public void HorizontalSpacing(float value) => Inlined.HorizontalSpacing = value;
+        public void VerticalSpacing(float value, Unit unit = Unit.Point)
+        {
+            Inlined.VerticalSpacing = value.ToPoints(unit);
+        }
+
+        public void HorizontalSpacing(float value, Unit unit = Unit.Point)
+        {
+            Inlined.HorizontalSpacing = value.ToPoints(unit);
+        }
 
 
         public void BaselineTop() => Inlined.BaselineAlignment = VerticalAlignment.Top;
         public void BaselineTop() => Inlined.BaselineAlignment = VerticalAlignment.Top;
         public void BaselineMiddle() => Inlined.BaselineAlignment = VerticalAlignment.Middle;
         public void BaselineMiddle() => Inlined.BaselineAlignment = VerticalAlignment.Middle;

+ 4 - 4
QuestPDF/Fluent/LineExtensions.cs

@@ -18,14 +18,14 @@ namespace QuestPDF.Fluent
             return line;
             return line;
         }
         }
         
         
-        public static ILine LineVertical(this IContainer element, float size)
+        public static ILine LineVertical(this IContainer element, float size, Unit unit = Unit.Point)
         {
         {
-            return element.Line(LineType.Vertical, size);
+            return element.Line(LineType.Vertical, size.ToPoints(unit));
         }
         }
         
         
-        public static ILine LineHorizontal(this IContainer element, float size)
+        public static ILine LineHorizontal(this IContainer element, float size, Unit unit = Unit.Point)
         {
         {
-            return element.Line(LineType.Horizontal, size);
+            return element.Line(LineType.Horizontal, size.ToPoints(unit));
         }
         }
         
         
         public static void LineColor(this ILine descriptor, string value)
         public static void LineColor(this ILine descriptor, string value)

+ 20 - 14
QuestPDF/Fluent/PaddingExtensions.cs

@@ -14,39 +14,45 @@ namespace QuestPDF.Fluent
             return element.Element(padding);
             return element.Element(padding);
         }
         }
         
         
-        public static IContainer Padding(this IContainer element, float value)
+        public static IContainer Padding(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.PaddingVertical(value).PaddingHorizontal(value);
+            return element
+                .PaddingVertical(value, unit)
+                .PaddingHorizontal(value, unit);
         }
         }
         
         
-        public static IContainer PaddingHorizontal(this IContainer element, float value)
+        public static IContainer PaddingHorizontal(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.PaddingLeft(value).PaddingRight(value);
+            return element
+                .PaddingLeft(value, unit)
+                .PaddingRight(value, unit);
         }
         }
         
         
-        public static IContainer PaddingVertical(this IContainer element, float value)
+        public static IContainer PaddingVertical(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.PaddingTop(value).PaddingBottom(value);
+            return element
+                .PaddingTop(value, unit)
+                .PaddingBottom(value, unit);
         }
         }
         
         
-        public static IContainer PaddingTop(this IContainer element, float value)
+        public static IContainer PaddingTop(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Padding(x => x.Top += value);
+            return element.Padding(x => x.Top += value.ToPoints(unit));
         }
         }
         
         
-        public static IContainer PaddingBottom(this IContainer element, float value)
+        public static IContainer PaddingBottom(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Padding(x => x.Bottom += value);
+            return element.Padding(x => x.Bottom += value.ToPoints(unit));
         }
         }
         
         
-        public static IContainer PaddingLeft(this IContainer element, float value)
+        public static IContainer PaddingLeft(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Padding(x => x.Left += value);
+            return element.Padding(x => x.Left += value.ToPoints(unit));
         }
         }
         
         
-        public static IContainer PaddingRight(this IContainer element, float value)
+        public static IContainer PaddingRight(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Padding(x => x.Right += value);
+            return element.Padding(x => x.Right += value.ToPoints(unit));
         }
         }
     }
     }
 }
 }

+ 28 - 20
QuestPDF/Fluent/PageExtensions.cs

@@ -10,16 +10,24 @@ namespace QuestPDF.Fluent
     {
     {
         internal Page Page { get; } = new Page();
         internal Page Page { get; } = new Page();
 
 
+        public void Size(float width, float height, Unit unit = Unit.Inch)
+        {
+            var pageSize = new PageSize(width, height, unit);
+            
+            MinSize(pageSize);
+            MaxSize(pageSize);
+        }
+        
         public void Size(PageSize pageSize)
         public void Size(PageSize pageSize)
         {
         {
             MinSize(pageSize);
             MinSize(pageSize);
             MaxSize(pageSize);
             MaxSize(pageSize);
         }
         }
         
         
-        public void ContinuousSize(float width)
+        public void ContinuousSize(float width, Unit unit = Unit.Point)
         {
         {
-            MinSize(new PageSize(width, 0));
-            MaxSize(new PageSize(width, Infrastructure.Size.Max.Height));
+            MinSize(new PageSize(width.ToPoints(unit), 0));
+            MaxSize(new PageSize(width.ToPoints(unit), Infrastructure.Size.Max.Height));
         }
         }
 
 
         public void MinSize(PageSize pageSize)
         public void MinSize(PageSize pageSize)
@@ -32,42 +40,42 @@ namespace QuestPDF.Fluent
             Page.MaxSize = pageSize;
             Page.MaxSize = pageSize;
         }
         }
 
 
-        public void MarginLeft(float value)
+        public void MarginLeft(float value, Unit unit = Unit.Point)
         {
         {
-            Page.MarginLeft = value;
+            Page.MarginLeft = value.ToPoints(unit);
         }
         }
         
         
-        public void MarginRight(float value)
+        public void MarginRight(float value, Unit unit = Unit.Point)
         {
         {
-            Page.MarginRight = value;
+            Page.MarginRight = value.ToPoints(unit);
         }
         }
         
         
-        public void MarginTop(float value)
+        public void MarginTop(float value, Unit unit = Unit.Point)
         {
         {
-            Page.MarginTop = value;
+            Page.MarginTop = value.ToPoints(unit);
         }
         }
         
         
-        public void MarginBottom(float value)
+        public void MarginBottom(float value, Unit unit = Unit.Point)
         {
         {
-            Page.MarginBottom = value;
+            Page.MarginBottom = value.ToPoints(unit);
         }
         }
         
         
-        public void MarginVertical(float value)
+        public void MarginVertical(float value, Unit unit = Unit.Point)
         {
         {
-            MarginTop(value);
-            MarginBottom(value);
+            MarginTop(value, unit);
+            MarginBottom(value, unit);
         }
         }
         
         
-        public void MarginHorizontal(float value)
+        public void MarginHorizontal(float value, Unit unit = Unit.Point)
         {
         {
-            MarginLeft(value);
-            MarginRight(value);
+            MarginLeft(value, unit);
+            MarginRight(value, unit);
         }
         }
         
         
-        public void Margin(float value)
+        public void Margin(float value, Unit unit = Unit.Point)
         {
         {
-            MarginVertical(value);
-            MarginHorizontal(value);
+            MarginVertical(value, unit);
+            MarginHorizontal(value, unit);
         }
         }
         
         
         public void DefaultTextStyle(TextStyle textStyle)
         public void DefaultTextStyle(TextStyle textStyle)

+ 2 - 2
QuestPDF/Fluent/RowExtensions.cs

@@ -44,9 +44,9 @@ namespace QuestPDF.Fluent
             return Item(RowItemType.Relative, size);
             return Item(RowItemType.Relative, size);
         }
         }
         
         
-        public IContainer ConstantItem(float size)
+        public IContainer ConstantItem(float size, Unit unit = Unit.Point)
         {
         {
-            return Item(RowItemType.Constant, size);
+            return Item(RowItemType.Constant, size.ToPoints(unit));
         }
         }
 
 
         public IContainer AutoItem()
         public IContainer AutoItem()

+ 0 - 44
QuestPDF/Fluent/RowOldExtensions.cs

@@ -1,44 +0,0 @@
-// using System;
-// using QuestPDF.Elements;
-// using QuestPDF.Infrastructure;
-//
-// namespace QuestPDF.Fluent
-// {
-//     public class RowDescriptor
-//     {
-//         internal RowOld Row { get; } = new RowOld();
-//
-//         public void Spacing(float value)
-//         {
-//             Row.Spacing = value;
-//         }
-//         
-//         public IContainer ConstantItem(float width)
-//         {
-//             return Column(constantWidth: width);
-//         }
-//         
-//         public IContainer RelativeItem(float width = 1)
-//         {
-//             return Column(relativeWidth: width);
-//         }
-//         
-//         public IContainer Column(float constantWidth = 0, float relativeWidth = 0)
-//         {
-//             var element = new RowOldElement(constantWidth, relativeWidth);
-//             
-//             Row.Items.Add(element);
-//             return element;
-//         }
-//     }
-//     
-//     public static class RowExtensions
-//     {
-//         public static void Row(this IContainer element, Action<RowDescriptor> handler)
-//         {
-//             var descriptor = new RowDescriptor();
-//             handler(descriptor);
-//             element.Element(descriptor.Row);
-//         }
-//     }
-// }

+ 3 - 3
QuestPDF/Fluent/TableExtensions.cs

@@ -14,9 +14,9 @@ namespace QuestPDF.Fluent
     {
     {
         internal List<TableColumnDefinition> Columns { get; } = new();
         internal List<TableColumnDefinition> Columns { get; } = new();
         
         
-        public void ConstantColumn(float width)
+        public void ConstantColumn(float width, Unit unit = Unit.Point)
         {
         {
-            ComplexColumn(constantWidth: width);
+            ComplexColumn(constantWidth: width.ToPoints(unit));
         }
         }
         
         
         public void RelativeColumn(float width = 1)
         public void RelativeColumn(float width = 1)
@@ -24,7 +24,7 @@ namespace QuestPDF.Fluent
             ComplexColumn(relativeWidth: width);
             ComplexColumn(relativeWidth: width);
         }
         }
         
         
-        public void ComplexColumn(float constantWidth = 0, float relativeWidth = 0)
+        private void ComplexColumn(float constantWidth = 0, float relativeWidth = 0)
         {
         {
             var columnDefinition = new TableColumnDefinition(constantWidth, relativeWidth);
             var columnDefinition = new TableColumnDefinition(constantWidth, relativeWidth);
             Columns.Add(columnDefinition);
             Columns.Add(columnDefinition);

+ 2 - 2
QuestPDF/Fluent/TextExtensions.cs

@@ -37,9 +37,9 @@ namespace QuestPDF.Fluent
             Alignment = HorizontalAlignment.Right;
             Alignment = HorizontalAlignment.Right;
         }
         }
 
 
-        public void ParagraphSpacing(float value)
+        public void ParagraphSpacing(float value, Unit unit = Unit.Point)
         {
         {
-            Spacing = value;
+            Spacing = value.ToPoints(unit);
         }
         }
 
 
         private void AddItemToLastTextBlock(ITextBlockItem item)
         private void AddItemToLastTextBlock(ITextBlockItem item)

+ 4 - 4
QuestPDF/Fluent/TranslateExtensions.cs

@@ -14,14 +14,14 @@ namespace QuestPDF.Fluent
             return element.Element(translate);
             return element.Element(translate);
         }
         }
 
 
-        public static IContainer TranslateX(this IContainer element, float value)
+        public static IContainer TranslateX(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Translate(x => x.TranslateX += value);
+            return element.Translate(x => x.TranslateX += value.ToPoints(unit));
         }
         }
         
         
-        public static IContainer TranslateY(this IContainer element, float value)
+        public static IContainer TranslateY(this IContainer element, float value, Unit unit = Unit.Point)
         {
         {
-            return element.Translate(x => x.TranslateY += value);
+            return element.Translate(x => x.TranslateY += value.ToPoints(unit));
         }
         }
     }
     }
 }
 }

+ 3 - 3
QuestPDF/Helpers/PageSizes.cs

@@ -8,10 +8,10 @@ namespace QuestPDF.Helpers
         public readonly float Width;
         public readonly float Width;
         public readonly float Height;
         public readonly float Height;
         
         
-        public PageSize(float width, float height)
+        public PageSize(float width, float height, Unit unit = Unit.Point)
         {
         {
-            Width = width;
-            Height = height;
+            Width = width.ToPoints(unit);
+            Height = height.ToPoints(unit);
         }
         }
 
 
         public static implicit operator Size(PageSize pageSize) => new Size(pageSize.Width, pageSize.Height);
         public static implicit operator Size(PageSize pageSize) => new Size(pageSize.Width, pageSize.Height);

+ 44 - 0
QuestPDF/Infrastructure/Unit.cs

@@ -0,0 +1,44 @@
+using System;
+using static QuestPDF.Infrastructure.Unit;
+
+namespace QuestPDF.Infrastructure
+{
+    public enum Unit
+    {
+        Point,
+        
+        Meter,
+        Centimetre,
+        Millimetre,
+        
+        Feet,
+        Inch,
+        Mill
+    }
+
+    internal static class UnitExtensions
+    {
+        private const float InchToCentimetre = 2.54f;
+        private const float InchToPoints = 72;
+        
+        public static float ToPoints(this float value, Unit unit)
+        {
+            return value * GetConversionFactor();
+            
+            float GetConversionFactor()
+            {
+                return unit switch
+                {
+                    Point => 1,
+                    Meter => 100 / InchToCentimetre * InchToPoints,
+                    Centimetre => 1 / InchToCentimetre * InchToPoints,
+                    Millimetre => 10 / InchToCentimetre * InchToPoints,
+                    Feet => 12 * InchToPoints,
+                    Inch => InchToPoints,
+                    Mill => InchToPoints / 1000f,
+                    _ => throw new ArgumentOutOfRangeException(nameof(unit), unit, null)
+                };
+            }
+        }
+    }
+}