251 lines
7.3 KiB
C#
251 lines
7.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace Volian.Svg.Library
|
|
{
|
|
[TypeConverter(typeof(MeasurementTypeConverter))]
|
|
public class SvgMeasurement
|
|
{
|
|
#region Operators
|
|
public static SvgMeasurement operator +(SvgMeasurement x1, SvgMeasurement x2)
|
|
{
|
|
E_MeasurementUnits tmpUnits = x1.Units;
|
|
SvgMeasurement tmp = new SvgMeasurement(x1.GetSizeInPoints(DPI) + x2.GetSizeInPoints(DPI),E_MeasurementUnits.PT);
|
|
tmp.Units = x1.Units;
|
|
return tmp;
|
|
}
|
|
public static SvgMeasurement operator -(SvgMeasurement x1, SvgMeasurement x2)
|
|
{
|
|
E_MeasurementUnits tmpUnits = x1.Units;
|
|
SvgMeasurement tmp = new SvgMeasurement(x1.GetSizeInPoints(DPI) - x2.GetSizeInPoints(DPI), E_MeasurementUnits.PT);
|
|
tmp.Units = x1.Units;
|
|
return tmp;
|
|
}
|
|
public static SvgMeasurement operator *(SvgMeasurement x1, float scaler)
|
|
{
|
|
E_MeasurementUnits tmpUnits = x1.Units;
|
|
SvgMeasurement tmp = new SvgMeasurement(x1.GetSizeInPoints(DPI) * scaler, E_MeasurementUnits.PT);
|
|
tmp.Units = x1.Units;
|
|
return tmp;
|
|
}
|
|
public static SvgMeasurement operator *(float scaler, SvgMeasurement x1)
|
|
{
|
|
E_MeasurementUnits tmpUnits = x1.Units;
|
|
SvgMeasurement tmp = new SvgMeasurement(x1.GetSizeInPoints(DPI) * scaler, E_MeasurementUnits.PT);
|
|
tmp.Units = x1.Units;
|
|
return tmp;
|
|
}
|
|
#endregion
|
|
#region DPI
|
|
private static float _DPI;
|
|
public static float DPI
|
|
{
|
|
get
|
|
{
|
|
if (_DPI == 0)
|
|
_DPI = 96;
|
|
return _DPI;
|
|
}
|
|
}
|
|
#endregion
|
|
#region ctor
|
|
public SvgMeasurement() { ;}
|
|
public SvgMeasurement(int value)
|
|
{
|
|
_Value = Convert.ToSingle(value);
|
|
_Units = E_MeasurementUnits.PX;
|
|
}
|
|
public SvgMeasurement(float value)
|
|
{
|
|
_Value = value;
|
|
_Units = E_MeasurementUnits.PX;
|
|
}
|
|
public SvgMeasurement(float value, E_MeasurementUnits units)
|
|
{
|
|
_Value = value;
|
|
_Units = units;
|
|
}
|
|
public SvgMeasurement(string val)
|
|
{
|
|
MatchCollection mc = Regex.Matches(val.ToLower(), "([+-]?[.0-9]+)|(in|cm|mm|em|ex|pc|pt|px|percentage)");
|
|
_Value = Convert.ToSingle(mc[0].Value);
|
|
if (mc.Count == 2)
|
|
{
|
|
//Console.WriteLine("{0} - '{1}'", val, mc[1].Value.ToUpper());
|
|
_Units = (E_MeasurementUnits)Enum.Parse(typeof(E_MeasurementUnits), mc[1].Value.ToUpper());
|
|
}
|
|
else
|
|
_Units = E_MeasurementUnits.PX;
|
|
}
|
|
#endregion
|
|
#region Properties
|
|
private E_MeasurementUnits _Units;
|
|
public E_MeasurementUnits Units
|
|
{
|
|
get { return _Units; }
|
|
set
|
|
{
|
|
float tmp = GetSizeInPoints(DPI);
|
|
_Units = value;
|
|
_Value *= (tmp / GetSizeInPoints(DPI));
|
|
}
|
|
}
|
|
private float _Value;
|
|
public float Value
|
|
{
|
|
get { return _Value; }
|
|
set { _Value = value; }
|
|
}
|
|
#endregion
|
|
#region ToString
|
|
public override string ToString()
|
|
{
|
|
switch (_Units)
|
|
{
|
|
case E_MeasurementUnits.PX: // Default
|
|
return string.Format("{0}", _Value);
|
|
case E_MeasurementUnits.PERCENTAGE: // Precentage is preceded by a space
|
|
return string.Format("{0} {1}", _Value, _Units);
|
|
}
|
|
return string.Format("{0}{1}", _Value, _Units);
|
|
}
|
|
#endregion
|
|
//public float SizeInPixels
|
|
//{
|
|
// get
|
|
// {
|
|
// switch (_Units)
|
|
// {
|
|
// case E_MeasurementUnits.PT: //Points - 72 per inch
|
|
// return _Value * DPI / 72F;
|
|
// case E_MeasurementUnits.PC: //Picas - 6 per inch
|
|
// return _Value * DPI / 6F;
|
|
// case E_MeasurementUnits.IN: //inches
|
|
// return _Value * DPI;
|
|
// case E_MeasurementUnits.CM: // Centimeter
|
|
// return _Value * DPI / 2.54F;
|
|
// case E_MeasurementUnits.MM: // Millimeter
|
|
// return _Value * DPI / 25.4F;
|
|
// case E_MeasurementUnits.EM: // EMs
|
|
// return _Value * DPI / 8;
|
|
// case E_MeasurementUnits.EX: // EXs
|
|
// return _Value * DPI / 16;
|
|
// default:
|
|
// return _Value;
|
|
// }
|
|
// }
|
|
//}
|
|
public float GetSizeInPoints(float myDPI)
|
|
{
|
|
switch (_Units)
|
|
{
|
|
case E_MeasurementUnits.PX: //Pixels myDPI per inch
|
|
return _Value * 72F / myDPI;
|
|
case E_MeasurementUnits.PC: //Picas - 6 per inch
|
|
return _Value * 72F / 6F;
|
|
case E_MeasurementUnits.IN: //inches
|
|
return _Value * 72F;
|
|
case E_MeasurementUnits.CM: // Centimeter
|
|
return _Value * 72F / 2.54F;
|
|
case E_MeasurementUnits.MM: // Millimeter
|
|
return _Value * 72F / 25.4F;
|
|
case E_MeasurementUnits.EM: // EMs
|
|
return _Value * 72F / 8;
|
|
case E_MeasurementUnits.EX: // EXs
|
|
return _Value * 72F / 16;
|
|
default: // Points
|
|
return _Value;
|
|
}
|
|
}
|
|
//public float SizeInPoints
|
|
//{ get { return SizeInPixels * 72 / DPI; } }
|
|
//public float SizeInInches
|
|
//{ get { return SizeInPixels / DPI; } }
|
|
//public float SizeInCentimeters
|
|
//{ get { return SizeInPixels * 2.54F / DPI; } }
|
|
//public float SizeInMillimeters
|
|
//{ get { return SizeInPixels * 25.4F / DPI; } }
|
|
//public float SizeInEms
|
|
//{ get { return SizeInPixels * 5 / (6 * DPI); } }
|
|
//public float SizeInExs
|
|
//{ get { return SizeInPixels * 5 / (6 * DPI); } }
|
|
//public float SizeInPicas
|
|
//{ get { return SizeInPixels * 6 / DPI; } }
|
|
//public Unit SizeInUnits
|
|
//{ get { return new Unit((double)SizeInPoints, UnitTypeEnum.Point); } }
|
|
public float GetSizeInPixels(float myDPI)
|
|
{ return GetSizeInPoints(myDPI) * myDPI / 72F;}
|
|
public float GetSizeInInches(float myDPI)
|
|
{ return GetSizeInPoints(myDPI) / 72F; }
|
|
public float GetSizeInCentimeters(float myDPI)
|
|
{ return GetSizeInPoints(myDPI) * 2.54F / 72F; }
|
|
public float GetSizeInMillimeters(float myDPI)
|
|
{ return GetSizeInPoints(myDPI) * 25.4F / 72F; }
|
|
public float GetSizeInEms(float myDPI)
|
|
{ return GetSizeInPoints(myDPI) * 5 / (6 * 72F); }
|
|
public float GetSizeInExs(float myDPI)
|
|
{ return GetSizeInPoints(myDPI) * 5 / (6 * 72F); }
|
|
public float GetSizeInPicas(float myDPI)
|
|
{ return GetSizeInPoints(myDPI) * 6 / 72F; }
|
|
//public Unit GetSizeInUnits(float myDPI)
|
|
//{ return new Unit((double)GetSizeInPoints(myDPI), UnitTypeEnum.Point); }
|
|
public static float StringToPoints(string value)
|
|
{
|
|
SvgMeasurement tmp = new SvgMeasurement(value);
|
|
float myPoints = tmp.GetSizeInPoints(72);
|
|
return myPoints;
|
|
}
|
|
|
|
}
|
|
public enum E_MeasurementUnits : int
|
|
{
|
|
[Description("Pixels")]
|
|
PX,
|
|
[Description("Points")]
|
|
PT,
|
|
[Description("Inches")]
|
|
IN,
|
|
[Description("Centimeters")]
|
|
CM,
|
|
[Description("Millimeters")]
|
|
MM,
|
|
[Description("EMs")]
|
|
EM,
|
|
[Description("EXs")]
|
|
EX,
|
|
[Description("Percentage")]
|
|
PERCENTAGE,
|
|
[Description("Picas")]
|
|
PC
|
|
}
|
|
public class MeasurementTypeConverter : ExpandableObjectConverter
|
|
{
|
|
public override bool CanConvertTo(ITypeDescriptorContext context, Type t)
|
|
{
|
|
return t == typeof(String);
|
|
}
|
|
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destType)
|
|
{
|
|
if (destType == typeof(string) && value is SvgMeasurement)
|
|
{
|
|
return value.ToString();
|
|
}
|
|
return base.ConvertTo(context, culture, value, destType);
|
|
}
|
|
public override bool CanConvertFrom(ITypeDescriptorContext context, Type t)
|
|
{
|
|
return t == typeof(String);
|
|
}
|
|
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object val)
|
|
{
|
|
SvgMeasurement measurement = new SvgMeasurement((string)val);
|
|
return measurement;
|
|
}
|
|
}
|
|
}
|