| /******************************************************************************* | 
 |  * You may amend and distribute as you like, but don't remove this header! | 
 |  * | 
 |  * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets. | 
 |  * See http://www.codeplex.com/EPPlus for details. | 
 |  * | 
 |  * Copyright (C) 2011  Jan Källman | 
 |  * | 
 |  * This library is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU Lesser General Public | 
 |  * License as published by the Free Software Foundation; either | 
 |  * version 2.1 of the License, or (at your option) any later version. | 
 |  | 
 |  * This library is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   | 
 |  * See the GNU Lesser General Public License for more details. | 
 |  * | 
 |  * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php | 
 |  * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html | 
 |  * | 
 |  * All code and executables are provided "as is" with no warranty either express or implied.  | 
 |  * The author accepts no liability for any damage or loss of business that this product may cause. | 
 |  * | 
 |  * Code change notes: | 
 |  *  | 
 |  * Author							Change						Date | 
 |  * ****************************************************************************** | 
 |  * Jan Källman		Initial Release		        2010-06-01 | 
 |  * Jan Källman		License changed GPL-->LGPL 2011-12-16 | 
 |  *******************************************************************************/ | 
 | using System; | 
 | using System.Collections.Generic; | 
 | using System.Text; | 
 | using System.Xml; | 
 | using System.Globalization; | 
 | using System.Drawing; | 
 |  | 
 |  | 
 | namespace OfficeOpenXml.Drawing.Vml | 
 | { | 
 |     /// <summary> | 
 |     /// Drawing object used for header and footer pictures | 
 |     /// </summary> | 
 |     public class ExcelVmlDrawingPicture : ExcelVmlDrawingBase | 
 |     { | 
 |         ExcelWorksheet _worksheet; | 
 |         internal ExcelVmlDrawingPicture(XmlNode topNode, XmlNamespaceManager ns, ExcelWorksheet ws) : | 
 |             base(topNode, ns) | 
 |         { | 
 |             _worksheet = ws; | 
 |         } | 
 |         /// <summary> | 
 |         /// Position ID | 
 |         /// </summary> | 
 |         public string Position | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetXmlNodeString("@id"); | 
 |             } | 
 |         } | 
 |         /// <summary> | 
 |         /// The width in points | 
 |         /// </summary> | 
 |         public double Width | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetStyleProp("width"); | 
 |             } | 
 |             set | 
 |             { | 
 |                 SetStyleProp("width",value.ToString(CultureInfo.InvariantCulture) + "pt"); | 
 |             } | 
 |         } | 
 |         /// <summary> | 
 |         /// The height in points | 
 |         /// </summary> | 
 |         public double Height | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetStyleProp("height"); | 
 |             } | 
 |             set | 
 |             { | 
 |                 SetStyleProp("height", value.ToString(CultureInfo.InvariantCulture) + "pt"); | 
 |             } | 
 |         } | 
 |         /// <summary> | 
 |         /// Margin Left in points | 
 |         /// </summary> | 
 |         public double Left | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetStyleProp("left"); | 
 |             } | 
 |             set | 
 |             { | 
 |                 SetStyleProp("left", value.ToString(CultureInfo.InvariantCulture)); | 
 |             } | 
 |         } | 
 |         /// <summary> | 
 |         /// Margin top in points | 
 |         /// </summary> | 
 |         public double Top | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetStyleProp("top"); | 
 |             } | 
 |             set | 
 |             { | 
 |                 SetStyleProp("top", value.ToString(CultureInfo.InvariantCulture)); | 
 |             } | 
 |         } | 
 |         /// <summary> | 
 |         /// The Title of the image | 
 |         /// </summary> | 
 |         public string Title | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetXmlNodeString("v:imagedata/@o:title"); | 
 |             } | 
 |             set | 
 |             { | 
 |                 SetXmlNodeString("v:imagedata/@o:title",value); | 
 |             } | 
 |         } | 
 |         /// <summary> | 
 |         /// The image | 
 |         /// </summary> | 
 |         public Image Image | 
 |         { | 
 |             get | 
 |             { | 
 |                 var pck = _worksheet._package.Package; | 
 |                 if (pck.PartExists(ImageUri)) | 
 |                 { | 
 |                     var part = pck.GetPart(ImageUri); | 
 |                     return Image.FromStream(part.GetStream()); | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     return null; | 
 |                 } | 
 |             } | 
 |         } | 
 |         internal Uri ImageUri | 
 |         { | 
 |             get; | 
 |             set; | 
 |         } | 
 |         internal string RelId | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetXmlNodeString("v:imagedata/@o:relid"); | 
 |             } | 
 |             set | 
 |             { | 
 |                 SetXmlNodeString("v:imagedata/@o:relid",value); | 
 |             } | 
 |         }         | 
 |         /// <summary> | 
 |         /// Determines whether an image will be displayed in black and white | 
 |         /// </summary> | 
 |         public bool BiLevel | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetXmlNodeString("v:imagedata/@bilevel")=="t"; | 
 |             } | 
 |             set | 
 |             { | 
 |                 if (value) | 
 |                 { | 
 |                     SetXmlNodeString("v:imagedata/@bilevel", "t"); | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     DeleteNode("v:imagedata/@bilevel"); | 
 |                 } | 
 |             } | 
 |         } | 
 |         /// <summary> | 
 |         /// Determines whether a picture will be displayed in grayscale mode | 
 |         /// </summary> | 
 |         public bool GrayScale | 
 |         { | 
 |             get | 
 |             { | 
 |                 return GetXmlNodeString("v:imagedata/@grayscale")=="t"; | 
 |             } | 
 |             set | 
 |             { | 
 |                 if (value) | 
 |                 { | 
 |                     SetXmlNodeString("v:imagedata/@grayscale", "t"); | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     DeleteNode("v:imagedata/@grayscale"); | 
 |                 } | 
 |             } | 
 |         } | 
 |         /// <summary> | 
 |         /// Defines the intensity of all colors in an image | 
 |         /// Default value is 1 | 
 |         /// </summary> | 
 |         public double Gain | 
 |         { | 
 |             get | 
 |             { | 
 |                 string v = GetXmlNodeString("v:imagedata/@gain"); | 
 |                 return GetFracDT(v,1); | 
 |             } | 
 |             set | 
 |             { | 
 |                 if (value < 0) | 
 |                 { | 
 |                     throw (new ArgumentOutOfRangeException("Value must be positive")); | 
 |                 } | 
 |                 if (value == 1) | 
 |                 { | 
 |                     DeleteNode("v:imagedata/@gamma"); | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     SetXmlNodeString("v:imagedata/@gain", value.ToString("#.0#", CultureInfo.InvariantCulture)); | 
 |                 } | 
 |             } | 
 |         } | 
 |         /// <summary> | 
 |         /// Defines the amount of contrast for an image | 
 |         /// Default value is 0; | 
 |         /// </summary> | 
 |         public double Gamma | 
 |         { | 
 |             get | 
 |             { | 
 |                 string v = GetXmlNodeString("v:imagedata/@gamma"); | 
 |                 return GetFracDT(v,0); | 
 |             } | 
 |             set | 
 |             { | 
 |                 if (value == 0) //Default | 
 |                 { | 
 |                     DeleteNode("v:imagedata/@gamma"); | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     SetXmlNodeString("v:imagedata/@gamma", value.ToString("#.0#", CultureInfo.InvariantCulture)); | 
 |                 } | 
 |             } | 
 |         } | 
 |         /// <summary> | 
 |         /// Defines the intensity of black in an image | 
 |         /// Default value is 0 | 
 |         /// </summary> | 
 |         public double BlackLevel | 
 |         { | 
 |             get | 
 |             { | 
 |                 string v = GetXmlNodeString("v:imagedata/@blacklevel"); | 
 |                 return GetFracDT(v, 0); | 
 |             } | 
 |             set | 
 |             { | 
 |                 if (value == 0) | 
 |                 { | 
 |                     DeleteNode("v:imagedata/@blacklevel"); | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     SetXmlNodeString("v:imagedata/@blacklevel", value.ToString("#.0#", CultureInfo.InvariantCulture)); | 
 |                 } | 
 |             } | 
 |         } | 
 |  | 
 |         #region Private Methods | 
 |         private double GetFracDT(string v, double def) | 
 |         { | 
 |             double d; | 
 |             if (v.EndsWith("f")) | 
 |             { | 
 |                 v = v.Substring(0, v.Length - 1); | 
 |                 if (double.TryParse(v, out d)) | 
 |                 { | 
 |                     d /= 65535; | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     d = def; | 
 |                 } | 
 |             } | 
 |             else | 
 |             { | 
 |                 if (!double.TryParse(v, out d)) | 
 |                 { | 
 |                     d = def; | 
 |                 } | 
 |             } | 
 |             return d; | 
 |         } | 
 |         private void SetStyleProp(string propertyName, string value) | 
 |         { | 
 |             string style = GetXmlNodeString("@style"); | 
 |             string newStyle = ""; | 
 |             bool found = false; | 
 |             foreach (string prop in style.Split(';')) | 
 |             { | 
 |                 string[] split = prop.Split(':'); | 
 |                 if (split[0] == propertyName) | 
 |                 { | 
 |                     newStyle += propertyName + ":" + value + ";"; | 
 |                     found = true; | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     newStyle += prop + ";"; | 
 |                 } | 
 |             } | 
 |             if (!found) | 
 |             { | 
 |                 newStyle += propertyName + ":" + value + ";"; | 
 |             } | 
 |             SetXmlNodeString("@style", newStyle.Substring(0, newStyle.Length - 1)); | 
 |         } | 
 |         private double GetStyleProp(string propertyName) | 
 |         { | 
 |             string style = GetXmlNodeString("@style"); | 
 |             foreach (string prop in style.Split(';')) | 
 |             { | 
 |                 string[] split = prop.Split(':'); | 
 |                 if (split[0] == propertyName && split.Length > 1) | 
 |                 { | 
 |                     string value = split[1].EndsWith("pt") ? split[1].Substring(0, split[1].Length - 2) : split[1]; | 
 |                     double ret; | 
 |                     if (double.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out ret)) | 
 |                     { | 
 |                         return ret; | 
 |                     } | 
 |                     else | 
 |                     { | 
 |                         return 0; | 
 |                     } | 
 |                 } | 
 |             } | 
 |             return 0; | 
 |         } | 
 |         #endregion | 
 |     } | 
 | } |