From 9d58d3755c06c7a91e3d4bb09ebc5b672079d7fa Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Tue, 22 Oct 2013 12:01:38 +0300 Subject: [PATCH 001/254] fix min height in HtmlLabel (design time) --- Source/HtmlRenderer/HtmlLabel.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Source/HtmlRenderer/HtmlLabel.cs b/Source/HtmlRenderer/HtmlLabel.cs index 512137746..d2f016211 100644 --- a/Source/HtmlRenderer/HtmlLabel.cs +++ b/Source/HtmlRenderer/HtmlLabel.cs @@ -24,7 +24,7 @@ namespace HtmlRenderer /// Provides HTML rendering using the text property.
/// WinForms control that will render html content in it's client rectangle.
/// Using and client can control how the html content effects the - /// size of the label. Either case scrollbars are never shown and html content outside of client bounds will be cliped. + /// size of the label. Either case scrollbars are never shown and html content outside of client bounds will be clipped. /// and with AutoSize can limit the max/min size of the control
/// The control will handle mouse and keyboard events on it to support html text selection, copy-paste and mouse clicks.
/// @@ -339,7 +339,10 @@ protected override void OnLayout(LayoutEventArgs levent) { var prevWidth = Width; - Height = (int)_htmlContainer.ActualSize.Height; + // make sure the height is not lower than min if given + Height = MinimumSize.Height > 0 && MinimumSize.Height > _htmlContainer.ActualSize.Height + ? MinimumSize.Height + : (int)_htmlContainer.ActualSize.Height; // handle if changing the height of the label affects the desired width and those require re-layout if( prevWidth != Width ) From ca0f0e56a42816a37abd1cbff7c762a7e8a0fba8 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Fri, 25 Oct 2013 11:05:17 +0300 Subject: [PATCH 002/254] update version --- Source/HtmlRenderer/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HtmlRenderer/Properties/AssemblyInfo.cs b/Source/HtmlRenderer/Properties/AssemblyInfo.cs index a66de3c59..41f9a0064 100644 --- a/Source/HtmlRenderer/Properties/AssemblyInfo.cs +++ b/Source/HtmlRenderer/Properties/AssemblyInfo.cs @@ -28,4 +28,4 @@ // Build Number // Revision // -[assembly: AssemblyVersion("1.4.8.1")] \ No newline at end of file +[assembly: AssemblyVersion("1.5.0.0")] \ No newline at end of file From 3ef4a31dac040ffe7e1e7ffd0d08d05c353ac24f Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 26 Oct 2013 15:01:40 +0300 Subject: [PATCH 003/254] change projects structure separate dependency on System.WinForms --- Source/Demo/DemoForm.Designer.cs | 2 +- Source/Demo/DemoForm.cs | 4 +- ...proj => HtmlRenderer.Demo.WinForms.csproj} | 8 +- Source/Demo/PerfForm.Designer.cs | 2 +- Source/Demo/PerfForm.cs | 4 +- Source/Demo/Program.cs | 3 +- Source/Demo/Properties/AssemblyInfo.cs | 1 - Source/Demo/Properties/Resources.Designer.cs | 6 +- Source/Demo/SampleForm.Designer.cs | 4 +- Source/Demo/SampleForm.cs | 4 +- Source/Demo/SyntaxHilight.cs | 2 +- Source/HtmlRenderer.sln | 41 +++- .../{Properties => Core}/AssemblyInfo.cs | 0 Source/HtmlRenderer/{ => Core}/CssData.cs | 0 Source/HtmlRenderer/{ => Core}/Dom/CssBox.cs | 4 +- .../{ => Core}/Dom/CssBoxFrame.cs | 0 .../HtmlRenderer/{ => Core}/Dom/CssBoxHr.cs | 0 .../{ => Core}/Dom/CssBoxImage.cs | 0 .../{ => Core}/Dom/CssBoxProperties.cs | 0 .../{ => Core}/Dom/CssLayoutEngine.cs | 0 .../{ => Core}/Dom/CssLayoutEngineTable.cs | 0 .../HtmlRenderer/{ => Core}/Dom/CssLength.cs | 0 .../HtmlRenderer/{ => Core}/Dom/CssLineBox.cs | 0 Source/HtmlRenderer/{ => Core}/Dom/CssRect.cs | 0 .../{ => Core}/Dom/CssRectImage.cs | 0 .../{ => Core}/Dom/CssRectWord.cs | 3 - .../{ => Core}/Dom/CssSpacingBox.cs | 0 Source/HtmlRenderer/{ => Core}/Dom/HtmlTag.cs | 4 +- .../{ => Core}/Entities/Border.cs | 2 +- .../{ => Core}/Entities/CssBlock.cs | 0 .../Entities/CssBlockSelectorItem.cs | 2 +- .../{ => Core}/Entities/CssConstants.cs | 2 +- .../{ => Core}/Entities/CssDefaults.cs | 12 ++ .../{ => Core}/Entities/CssUnit.cs | 12 ++ .../{ => Core}/Entities/HtmlConstants.cs | 0 .../Entities/HtmlGenerationStyle.cs | 0 .../Entities/HtmlImageLoadEventArgs.cs | 12 +- .../Entities/HtmlLinkClickedEventArgs.cs | 0 .../Entities/HtmlLinkClickedException.cs | 2 +- .../Entities/HtmlRefreshEventArgs.cs | 2 +- .../Entities/HtmlRenderErrorEventArgs.cs | 8 +- .../Entities/HtmlRenderErrorType.cs | 2 +- .../Entities/HtmlScrollEventArgs.cs | 2 +- .../Entities/HtmlStylesheetLoadEventArgs.cs | 10 +- .../Core/Entities/IContextMenu.cs | 55 +++++ Source/HtmlRenderer/Core/Entities/IControl.cs | 112 ++++++++++ Source/HtmlRenderer/Core/Entities/KeyEvent.cs | 69 +++++++ .../HtmlRenderer/Core/Entities/MouseEvent.cs | 41 ++++ .../{ => Core}/Entities/SubString.cs | 0 .../{ => Core}/Entities/Tupler.cs | 0 .../Handlers/BackgroundImageDrawHandler.cs | 1 - .../{ => Core}/Handlers/BordersDrawHandler.cs | 0 .../{ => Core}/Handlers/ContextMenuHandler.cs | 78 +++---- .../{ => Core}/Handlers/ImageLoadHandler.cs | 8 +- .../{ => Core}/Handlers/SelectionHandler.cs | 61 +++--- .../HtmlContainerBase.cs} | 109 +++++----- Source/HtmlRenderer/{ => Core}/IGraphics.cs | 0 .../{ => Core}/Parse/CssParser.cs | 0 .../{ => Core}/Parse/CssValueParser.cs | 2 +- .../{ => Core}/Parse/DomParser.cs | 6 +- .../{ => Core}/Parse/HtmlParser.cs | 0 .../{ => Core}/Parse/RegexParserHelper.cs | 0 .../{ => Core}/Parse/RegexParserUtils.cs | 0 .../{ => Core}/Utils/ArgChecker.cs | 0 .../{ => Core}/Utils/CommonUtils.cs | 0 .../HtmlRenderer/{ => Core}/Utils/CssUtils.cs | 0 .../HtmlRenderer/{ => Core}/Utils/DomUtils.cs | 0 .../{ => Core}/Utils/FontsUtils.cs | 0 .../{ => Core}/Utils/HtmlUtils.cs | 0 .../Utils/ImageError.png} | Bin .../Utils/ImageLoad.png} | Bin .../{ => Core}/Utils/RenderUtils.cs | 16 +- .../{ => Core}/Utils/StylesheetLoadHelper.cs | 6 +- Source/HtmlRenderer/HtmlRenderer.Core.csproj | 116 +++++++++++ Source/HtmlRenderer/HtmlRenderer.WPF.csproj | 59 ++++++ ...roj => HtmlRenderer.WinForms.NET35.csproj} | 0 ...roj => HtmlRenderer.WinForms.NET40.csproj} | 0 ...roj => HtmlRenderer.WinForms.NET45.csproj} | 0 ...er.csproj => HtmlRenderer.WinForms.csproj} | 145 ++++++------- .../Properties/Resources.Designer.cs | 83 -------- Source/HtmlRenderer/Properties/Resources.resx | 127 ------------ Source/HtmlRenderer/WinForm/HtmlContainer.cs | 154 ++++++++++++++ .../HtmlRenderer/{ => WinForm}/HtmlLabel.cs | 0 .../HtmlRenderer/{ => WinForm}/HtmlPanel.cs | 0 .../HtmlRenderer/{ => WinForm}/HtmlRender.cs | 2 +- .../HtmlRenderer/{ => WinForm}/HtmlToolTip.cs | 0 .../{ => WinForm}/Utils/HtmlClipboardUtils.cs | 2 +- .../{ => WinForm}/Utils/Win32Utils.cs | 4 +- .../WinForm/Utils/WinFormsContextMenu.cs | 104 ++++++++++ .../WinForm/Utils/WinFormsControl.cs | 193 ++++++++++++++++++ .../Utils/WinFormsGraphics.cs} | 21 +- 91 files changed, 1232 insertions(+), 502 deletions(-) rename Source/Demo/{HtmlRenderer.Demo.csproj => HtmlRenderer.Demo.WinForms.csproj} (97%) rename Source/HtmlRenderer/{Properties => Core}/AssemblyInfo.cs (100%) rename Source/HtmlRenderer/{ => Core}/CssData.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssBox.cs (99%) rename Source/HtmlRenderer/{ => Core}/Dom/CssBoxFrame.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssBoxHr.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssBoxImage.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssBoxProperties.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssLayoutEngine.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssLayoutEngineTable.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssLength.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssLineBox.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssRect.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssRectImage.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/CssRectWord.cs (98%) rename Source/HtmlRenderer/{ => Core}/Dom/CssSpacingBox.cs (100%) rename Source/HtmlRenderer/{ => Core}/Dom/HtmlTag.cs (95%) rename Source/HtmlRenderer/{ => Core}/Entities/Border.cs (94%) rename Source/HtmlRenderer/{ => Core}/Entities/CssBlock.cs (100%) rename Source/HtmlRenderer/{ => Core}/Entities/CssBlockSelectorItem.cs (95%) rename Source/HtmlRenderer/{ => Core}/Entities/CssConstants.cs (99%) rename Source/HtmlRenderer/{ => Core}/Entities/CssDefaults.cs (94%) rename Source/HtmlRenderer/{ => Core}/Entities/CssUnit.cs (58%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlConstants.cs (100%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlGenerationStyle.cs (100%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlImageLoadEventArgs.cs (95%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlLinkClickedEventArgs.cs (100%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlLinkClickedException.cs (98%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlRefreshEventArgs.cs (98%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlRenderErrorEventArgs.cs (90%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlRenderErrorType.cs (91%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlScrollEventArgs.cs (98%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlStylesheetLoadEventArgs.cs (89%) create mode 100644 Source/HtmlRenderer/Core/Entities/IContextMenu.cs create mode 100644 Source/HtmlRenderer/Core/Entities/IControl.cs create mode 100644 Source/HtmlRenderer/Core/Entities/KeyEvent.cs create mode 100644 Source/HtmlRenderer/Core/Entities/MouseEvent.cs rename Source/HtmlRenderer/{ => Core}/Entities/SubString.cs (100%) rename Source/HtmlRenderer/{ => Core}/Entities/Tupler.cs (100%) rename Source/HtmlRenderer/{ => Core}/Handlers/BackgroundImageDrawHandler.cs (99%) rename Source/HtmlRenderer/{ => Core}/Handlers/BordersDrawHandler.cs (100%) rename Source/HtmlRenderer/{ => Core}/Handlers/ContextMenuHandler.cs (83%) rename Source/HtmlRenderer/{ => Core}/Handlers/ImageLoadHandler.cs (97%) rename Source/HtmlRenderer/{ => Core}/Handlers/SelectionHandler.cs (92%) rename Source/HtmlRenderer/{HtmlContainer.cs => Core/HtmlContainerBase.cs} (90%) rename Source/HtmlRenderer/{ => Core}/IGraphics.cs (100%) rename Source/HtmlRenderer/{ => Core}/Parse/CssParser.cs (100%) rename Source/HtmlRenderer/{ => Core}/Parse/CssValueParser.cs (99%) rename Source/HtmlRenderer/{ => Core}/Parse/DomParser.cs (99%) rename Source/HtmlRenderer/{ => Core}/Parse/HtmlParser.cs (100%) rename Source/HtmlRenderer/{ => Core}/Parse/RegexParserHelper.cs (100%) rename Source/HtmlRenderer/{ => Core}/Parse/RegexParserUtils.cs (100%) rename Source/HtmlRenderer/{ => Core}/Utils/ArgChecker.cs (100%) rename Source/HtmlRenderer/{ => Core}/Utils/CommonUtils.cs (100%) rename Source/HtmlRenderer/{ => Core}/Utils/CssUtils.cs (100%) rename Source/HtmlRenderer/{ => Core}/Utils/DomUtils.cs (100%) rename Source/HtmlRenderer/{ => Core}/Utils/FontsUtils.cs (100%) rename Source/HtmlRenderer/{ => Core}/Utils/HtmlUtils.cs (100%) rename Source/HtmlRenderer/{Images/ErrorImage.png => Core/Utils/ImageError.png} (100%) rename Source/HtmlRenderer/{Images/LoadImage.png => Core/Utils/ImageLoad.png} (100%) rename Source/HtmlRenderer/{ => Core}/Utils/RenderUtils.cs (94%) rename Source/HtmlRenderer/{ => Core}/Utils/StylesheetLoadHelper.cs (94%) create mode 100644 Source/HtmlRenderer/HtmlRenderer.Core.csproj create mode 100644 Source/HtmlRenderer/HtmlRenderer.WPF.csproj rename Source/HtmlRenderer/{HtmlRendererNET35.csproj => HtmlRenderer.WinForms.NET35.csproj} (100%) rename Source/HtmlRenderer/{HtmlRendererNET40.csproj => HtmlRenderer.WinForms.NET40.csproj} (100%) rename Source/HtmlRenderer/{HtmlRendererNET45.csproj => HtmlRenderer.WinForms.NET45.csproj} (100%) rename Source/HtmlRenderer/{HtmlRenderer.csproj => HtmlRenderer.WinForms.csproj} (50%) delete mode 100644 Source/HtmlRenderer/Properties/Resources.Designer.cs delete mode 100644 Source/HtmlRenderer/Properties/Resources.resx create mode 100644 Source/HtmlRenderer/WinForm/HtmlContainer.cs rename Source/HtmlRenderer/{ => WinForm}/HtmlLabel.cs (100%) rename Source/HtmlRenderer/{ => WinForm}/HtmlPanel.cs (100%) rename Source/HtmlRenderer/{ => WinForm}/HtmlRender.cs (99%) rename Source/HtmlRenderer/{ => WinForm}/HtmlToolTip.cs (100%) rename Source/HtmlRenderer/{ => WinForm}/Utils/HtmlClipboardUtils.cs (98%) rename Source/HtmlRenderer/{ => WinForm}/Utils/Win32Utils.cs (99%) create mode 100644 Source/HtmlRenderer/WinForm/Utils/WinFormsContextMenu.cs create mode 100644 Source/HtmlRenderer/WinForm/Utils/WinFormsControl.cs rename Source/HtmlRenderer/{WinGraphics.cs => WinForm/Utils/WinFormsGraphics.cs} (95%) diff --git a/Source/Demo/DemoForm.Designer.cs b/Source/Demo/DemoForm.Designer.cs index edcfd8248..cff4de1ec 100644 --- a/Source/Demo/DemoForm.Designer.cs +++ b/Source/Demo/DemoForm.Designer.cs @@ -1,4 +1,4 @@ -namespace HtmlRenderer.Demo +namespace HtmlRenderer.Demo.WinForms { partial class DemoForm { diff --git a/Source/Demo/DemoForm.cs b/Source/Demo/DemoForm.cs index 6b12f8552..ac66e1190 100644 --- a/Source/Demo/DemoForm.cs +++ b/Source/Demo/DemoForm.cs @@ -22,11 +22,11 @@ using System.Windows.Forms; using System.Reflection; using System.IO; -using HtmlRenderer.Demo.Properties; +using HtmlRenderer.Demo.WinForms.Properties; using HtmlRenderer.Entities; using Timer = System.Threading.Timer; -namespace HtmlRenderer.Demo +namespace HtmlRenderer.Demo.WinForms { public partial class DemoForm : Form { diff --git a/Source/Demo/HtmlRenderer.Demo.csproj b/Source/Demo/HtmlRenderer.Demo.WinForms.csproj similarity index 97% rename from Source/Demo/HtmlRenderer.Demo.csproj rename to Source/Demo/HtmlRenderer.Demo.WinForms.csproj index dddca6cdd..37f92484c 100644 --- a/Source/Demo/HtmlRenderer.Demo.csproj +++ b/Source/Demo/HtmlRenderer.Demo.WinForms.csproj @@ -8,8 +8,8 @@ {8AD34FE8-8382-4A8A-B3AA-A0392ED42423} WinExe Properties - HtmlRenderer.Demo - HtmlRendererDemo + HtmlRenderer.Demo.WinForms + HtmlRendererWinFormsDemo v4.0 @@ -205,9 +205,9 @@ - + {1B058920-24B4-4140-8AE7-C8C6C38CA52D} - HtmlRenderer + HtmlRenderer.WinForms diff --git a/Source/Demo/PerfForm.Designer.cs b/Source/Demo/PerfForm.Designer.cs index f0fa12e96..cee3c6f1e 100644 --- a/Source/Demo/PerfForm.Designer.cs +++ b/Source/Demo/PerfForm.Designer.cs @@ -1,4 +1,4 @@ -namespace HtmlRenderer.Demo +namespace HtmlRenderer.Demo.WinForms { partial class PerfForm { diff --git a/Source/Demo/PerfForm.cs b/Source/Demo/PerfForm.cs index 83748bb23..092d25879 100644 --- a/Source/Demo/PerfForm.cs +++ b/Source/Demo/PerfForm.cs @@ -19,9 +19,9 @@ using System.Windows.Forms; using System.Reflection; using System.IO; -using HtmlRenderer.Demo.Properties; +using HtmlRenderer.Demo.WinForms.Properties; -namespace HtmlRenderer.Demo +namespace HtmlRenderer.Demo.WinForms { public partial class PerfForm : Form { diff --git a/Source/Demo/Program.cs b/Source/Demo/Program.cs index 54ab7cd19..0916d9075 100644 --- a/Source/Demo/Program.cs +++ b/Source/Demo/Program.cs @@ -16,10 +16,9 @@ using System.Reflection; using System.Text; using System.Text.RegularExpressions; -using System.Threading; using System.Windows.Forms; -namespace HtmlRenderer.Demo +namespace HtmlRenderer.Demo.WinForms { static class Program { diff --git a/Source/Demo/Properties/AssemblyInfo.cs b/Source/Demo/Properties/AssemblyInfo.cs index 53d05316a..877c916ea 100644 --- a/Source/Demo/Properties/AssemblyInfo.cs +++ b/Source/Demo/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/Source/Demo/Properties/Resources.Designer.cs b/Source/Demo/Properties/Resources.Designer.cs index 76f6c9dc6..8fcdb1358 100644 --- a/Source/Demo/Properties/Resources.Designer.cs +++ b/Source/Demo/Properties/Resources.Designer.cs @@ -1,14 +1,14 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.18051 +// Runtime Version:4.0.30319.34003 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ -namespace HtmlRenderer.Demo.Properties { +namespace HtmlRenderer.Demo.WinForms.Properties { using System; @@ -39,7 +39,7 @@ internal Resources() { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HtmlRenderer.Demo.Properties.Resources", typeof(Resources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HtmlRenderer.Demo.WinForms.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; diff --git a/Source/Demo/SampleForm.Designer.cs b/Source/Demo/SampleForm.Designer.cs index 60296601d..69280a6bd 100644 --- a/Source/Demo/SampleForm.Designer.cs +++ b/Source/Demo/SampleForm.Designer.cs @@ -1,6 +1,4 @@ -using HtmlRenderer; - -namespace HtmlRenderer.Demo +namespace HtmlRenderer.Demo.WinForms { partial class SampleForm { diff --git a/Source/Demo/SampleForm.cs b/Source/Demo/SampleForm.cs index 5a97282f1..21884fef7 100644 --- a/Source/Demo/SampleForm.cs +++ b/Source/Demo/SampleForm.cs @@ -14,9 +14,9 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; -using HtmlRenderer.Demo.Properties; +using HtmlRenderer.Demo.WinForms.Properties; -namespace HtmlRenderer.Demo +namespace HtmlRenderer.Demo.WinForms { public partial class SampleForm : Form { diff --git a/Source/Demo/SyntaxHilight.cs b/Source/Demo/SyntaxHilight.cs index 023737f4b..26fa9f891 100644 --- a/Source/Demo/SyntaxHilight.cs +++ b/Source/Demo/SyntaxHilight.cs @@ -6,7 +6,7 @@ using System.Windows.Forms; -namespace HtmlRenderer.Demo +namespace HtmlRenderer.Demo.WinForms { public static class SyntaxHilight { diff --git a/Source/HtmlRenderer.sln b/Source/HtmlRenderer.sln index a8e0c6a99..38f070f3d 100644 --- a/Source/HtmlRenderer.sln +++ b/Source/HtmlRenderer.sln @@ -1,17 +1,25 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.Demo", "Demo\HtmlRenderer.Demo.csproj", "{8AD34FE8-8382-4A8A-B3AA-A0392ED42423}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.Demo.WinForms", "Demo\HtmlRenderer.Demo.WinForms.csproj", "{8AD34FE8-8382-4A8A-B3AA-A0392ED42423}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer", "HtmlRenderer\HtmlRenderer.csproj", "{1B058920-24B4-4140-8AE7-C8C6C38CA52D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.WinForms", "HtmlRenderer\HtmlRenderer.WinForms.csproj", "{1B058920-24B4-4140-8AE7-C8C6C38CA52D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRendererNET45", "HtmlRenderer\HtmlRendererNET45.csproj", "{6018296C-7FE3-40A4-A8CC-28D8DA1FD934}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.WinForms.NET45", "HtmlRenderer\HtmlRenderer.WinForms.NET45.csproj", "{6018296C-7FE3-40A4-A8CC-28D8DA1FD934}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MultiTarget", "MultiTarget", "{1BED3EBA-15BF-4AEC-A03C-581D5F1C4DD5}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WF.MultiTarget", "WF.MultiTarget", "{1BED3EBA-15BF-4AEC-A03C-581D5F1C4DD5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRendererNET35", "HtmlRenderer\HtmlRendererNET35.csproj", "{06CFAAB3-459A-46F1-982B-CE0D62483AC7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.WinForms.NET35", "HtmlRenderer\HtmlRenderer.WinForms.NET35.csproj", "{06CFAAB3-459A-46F1-982B-CE0D62483AC7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRendererNET40", "HtmlRenderer\HtmlRendererNET40.csproj", "{73A762F1-C802-4659-9B3E-2BF6B284E606}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.WinForms.NET40", "HtmlRenderer\HtmlRenderer.WinForms.NET40.csproj", "{73A762F1-C802-4659-9B3E-2BF6B284E606}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.WPF", "HtmlRenderer\HtmlRenderer.WPF.csproj", "{7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.Core", "HtmlRenderer\HtmlRenderer.Core.csproj", "{FE611685-391F-4E3E-B27E-D3150E51E49B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demo", "Demo", "{E263EA16-2E6A-4269-A319-AA2F97ADA8E1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WPF.MultiTarget", "WPF.MultiTarget", "{22F881FF-127B-4B9B-A1BE-EA87715BBD85}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -73,6 +81,26 @@ Global {73A762F1-C802-4659-9B3E-2BF6B284E606}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {73A762F1-C802-4659-9B3E-2BF6B284E606}.Release|Mixed Platforms.Build.0 = Release|Any CPU {73A762F1-C802-4659-9B3E-2BF6B284E606}.Release|x86.ActiveCfg = Release|Any CPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}.Debug|x86.ActiveCfg = Debug|Any CPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}.Release|Any CPU.Build.0 = Release|Any CPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}.Release|x86.ActiveCfg = Release|Any CPU + {FE611685-391F-4E3E-B27E-D3150E51E49B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FE611685-391F-4E3E-B27E-D3150E51E49B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE611685-391F-4E3E-B27E-D3150E51E49B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {FE611685-391F-4E3E-B27E-D3150E51E49B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {FE611685-391F-4E3E-B27E-D3150E51E49B}.Debug|x86.ActiveCfg = Debug|Any CPU + {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|Any CPU.Build.0 = Release|Any CPU + {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -81,5 +109,6 @@ Global {6018296C-7FE3-40A4-A8CC-28D8DA1FD934} = {1BED3EBA-15BF-4AEC-A03C-581D5F1C4DD5} {06CFAAB3-459A-46F1-982B-CE0D62483AC7} = {1BED3EBA-15BF-4AEC-A03C-581D5F1C4DD5} {73A762F1-C802-4659-9B3E-2BF6B284E606} = {1BED3EBA-15BF-4AEC-A03C-581D5F1C4DD5} + {8AD34FE8-8382-4A8A-B3AA-A0392ED42423} = {E263EA16-2E6A-4269-A319-AA2F97ADA8E1} EndGlobalSection EndGlobal diff --git a/Source/HtmlRenderer/Properties/AssemblyInfo.cs b/Source/HtmlRenderer/Core/AssemblyInfo.cs similarity index 100% rename from Source/HtmlRenderer/Properties/AssemblyInfo.cs rename to Source/HtmlRenderer/Core/AssemblyInfo.cs diff --git a/Source/HtmlRenderer/CssData.cs b/Source/HtmlRenderer/Core/CssData.cs similarity index 100% rename from Source/HtmlRenderer/CssData.cs rename to Source/HtmlRenderer/Core/CssData.cs diff --git a/Source/HtmlRenderer/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs similarity index 99% rename from Source/HtmlRenderer/Dom/CssBox.cs rename to Source/HtmlRenderer/Core/Dom/CssBox.cs index 1e0fe5244..9fa7d8f9d 100644 --- a/Source/HtmlRenderer/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -44,7 +44,7 @@ internal class CssBox : CssBoxProperties, IDisposable /// /// the root container for the hierarchy /// - protected HtmlContainer _htmlContainer; + protected HtmlContainerBase _htmlContainer; /// /// the html tag that is associated with this css box, null if anonymous box @@ -102,7 +102,7 @@ public CssBox(CssBox parentBox, HtmlTag tag) /// Gets the HtmlContainer of the Box. /// WARNING: May be null. /// - public HtmlContainer HtmlContainer + public HtmlContainerBase HtmlContainer { get { return _htmlContainer ?? (_parentBox != null ? _parentBox.HtmlContainer : null); } set { _htmlContainer = value; } diff --git a/Source/HtmlRenderer/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssBoxFrame.cs rename to Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs diff --git a/Source/HtmlRenderer/Dom/CssBoxHr.cs b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssBoxHr.cs rename to Source/HtmlRenderer/Core/Dom/CssBoxHr.cs diff --git a/Source/HtmlRenderer/Dom/CssBoxImage.cs b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssBoxImage.cs rename to Source/HtmlRenderer/Core/Dom/CssBoxImage.cs diff --git a/Source/HtmlRenderer/Dom/CssBoxProperties.cs b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssBoxProperties.cs rename to Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs diff --git a/Source/HtmlRenderer/Dom/CssLayoutEngine.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssLayoutEngine.cs rename to Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs diff --git a/Source/HtmlRenderer/Dom/CssLayoutEngineTable.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssLayoutEngineTable.cs rename to Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs diff --git a/Source/HtmlRenderer/Dom/CssLength.cs b/Source/HtmlRenderer/Core/Dom/CssLength.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssLength.cs rename to Source/HtmlRenderer/Core/Dom/CssLength.cs diff --git a/Source/HtmlRenderer/Dom/CssLineBox.cs b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssLineBox.cs rename to Source/HtmlRenderer/Core/Dom/CssLineBox.cs diff --git a/Source/HtmlRenderer/Dom/CssRect.cs b/Source/HtmlRenderer/Core/Dom/CssRect.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssRect.cs rename to Source/HtmlRenderer/Core/Dom/CssRect.cs diff --git a/Source/HtmlRenderer/Dom/CssRectImage.cs b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssRectImage.cs rename to Source/HtmlRenderer/Core/Dom/CssRectImage.cs diff --git a/Source/HtmlRenderer/Dom/CssRectWord.cs b/Source/HtmlRenderer/Core/Dom/CssRectWord.cs similarity index 98% rename from Source/HtmlRenderer/Dom/CssRectWord.cs rename to Source/HtmlRenderer/Core/Dom/CssRectWord.cs index 7340fb5ca..9eadebff1 100644 --- a/Source/HtmlRenderer/Dom/CssRectWord.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRectWord.cs @@ -10,9 +10,6 @@ // - Sun Tsu, // "The Art of War" -using System.Drawing; -using HtmlRenderer.Utils; - namespace HtmlRenderer.Dom { /// diff --git a/Source/HtmlRenderer/Dom/CssSpacingBox.cs b/Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs similarity index 100% rename from Source/HtmlRenderer/Dom/CssSpacingBox.cs rename to Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs diff --git a/Source/HtmlRenderer/Dom/HtmlTag.cs b/Source/HtmlRenderer/Core/Dom/HtmlTag.cs similarity index 95% rename from Source/HtmlRenderer/Dom/HtmlTag.cs rename to Source/HtmlRenderer/Core/Dom/HtmlTag.cs index b4ffa0638..9ac93bbf1 100644 --- a/Source/HtmlRenderer/Dom/HtmlTag.cs +++ b/Source/HtmlRenderer/Core/Dom/HtmlTag.cs @@ -11,7 +11,6 @@ // "The Art of War" using System.Collections.Generic; -using HtmlRenderer.Entities; using HtmlRenderer.Utils; namespace HtmlRenderer.Dom @@ -37,8 +36,7 @@ internal sealed class HtmlTag /// Init. /// /// the name of the html tag - /// collection of attributes and thier value the html tag has - /// the text sub-string of the html element + /// collection of attributes and their value the html tag has public HtmlTag(string name, Dictionary attributes = null) { ArgChecker.AssertArgNotNullOrEmpty(name, "name"); diff --git a/Source/HtmlRenderer/Entities/Border.cs b/Source/HtmlRenderer/Core/Entities/Border.cs similarity index 94% rename from Source/HtmlRenderer/Entities/Border.cs rename to Source/HtmlRenderer/Core/Entities/Border.cs index b70e231c2..3cc966bee 100644 --- a/Source/HtmlRenderer/Entities/Border.cs +++ b/Source/HtmlRenderer/Core/Entities/Border.cs @@ -13,7 +13,7 @@ namespace HtmlRenderer.Entities { /// - /// Border specifiers + /// Border types /// internal enum Border { diff --git a/Source/HtmlRenderer/Entities/CssBlock.cs b/Source/HtmlRenderer/Core/Entities/CssBlock.cs similarity index 100% rename from Source/HtmlRenderer/Entities/CssBlock.cs rename to Source/HtmlRenderer/Core/Entities/CssBlock.cs diff --git a/Source/HtmlRenderer/Entities/CssBlockSelectorItem.cs b/Source/HtmlRenderer/Core/Entities/CssBlockSelectorItem.cs similarity index 95% rename from Source/HtmlRenderer/Entities/CssBlockSelectorItem.cs rename to Source/HtmlRenderer/Core/Entities/CssBlockSelectorItem.cs index 055691dae..7abf60833 100644 --- a/Source/HtmlRenderer/Entities/CssBlockSelectorItem.cs +++ b/Source/HtmlRenderer/Core/Entities/CssBlockSelectorItem.cs @@ -15,7 +15,7 @@ namespace HtmlRenderer.Entities { /// - /// Holds single class selector in css block hierarchial selection (p class1 > div.class2) + /// Holds single class selector in css block hierarchical selection (p class1 > div.class2) /// public struct CssBlockSelectorItem { diff --git a/Source/HtmlRenderer/Entities/CssConstants.cs b/Source/HtmlRenderer/Core/Entities/CssConstants.cs similarity index 99% rename from Source/HtmlRenderer/Entities/CssConstants.cs rename to Source/HtmlRenderer/Core/Entities/CssConstants.cs index 9eedad998..7e120884e 100644 --- a/Source/HtmlRenderer/Entities/CssConstants.cs +++ b/Source/HtmlRenderer/Core/Entities/CssConstants.cs @@ -122,7 +122,7 @@ internal static class CssConstants public const string Cm = "cm"; /// - /// Milimeters + /// Millimeters /// public const string Mm = "mm"; diff --git a/Source/HtmlRenderer/Entities/CssDefaults.cs b/Source/HtmlRenderer/Core/Entities/CssDefaults.cs similarity index 94% rename from Source/HtmlRenderer/Entities/CssDefaults.cs rename to Source/HtmlRenderer/Core/Entities/CssDefaults.cs index 565fecd0c..97b371417 100644 --- a/Source/HtmlRenderer/Entities/CssDefaults.cs +++ b/Source/HtmlRenderer/Core/Entities/CssDefaults.cs @@ -1,3 +1,15 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + namespace HtmlRenderer.Entities { internal static class CssDefaults diff --git a/Source/HtmlRenderer/Entities/CssUnit.cs b/Source/HtmlRenderer/Core/Entities/CssUnit.cs similarity index 58% rename from Source/HtmlRenderer/Entities/CssUnit.cs rename to Source/HtmlRenderer/Core/Entities/CssUnit.cs index af480bebc..29a1ce0dc 100644 --- a/Source/HtmlRenderer/Entities/CssUnit.cs +++ b/Source/HtmlRenderer/Core/Entities/CssUnit.cs @@ -1,3 +1,15 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + namespace HtmlRenderer.Entities { /// diff --git a/Source/HtmlRenderer/Entities/HtmlConstants.cs b/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs similarity index 100% rename from Source/HtmlRenderer/Entities/HtmlConstants.cs rename to Source/HtmlRenderer/Core/Entities/HtmlConstants.cs diff --git a/Source/HtmlRenderer/Entities/HtmlGenerationStyle.cs b/Source/HtmlRenderer/Core/Entities/HtmlGenerationStyle.cs similarity index 100% rename from Source/HtmlRenderer/Entities/HtmlGenerationStyle.cs rename to Source/HtmlRenderer/Core/Entities/HtmlGenerationStyle.cs diff --git a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlImageLoadEventArgs.cs similarity index 95% rename from Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlImageLoadEventArgs.cs index 41c10cccd..20bb95b12 100644 --- a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlImageLoadEventArgs.cs @@ -19,12 +19,12 @@ namespace HtmlRenderer.Entities { /// /// Callback used in to allow setting image externally and async.
- /// The callback can provide path to image file or uri, or the actual image to use.
+ /// The callback can provide path to image file or Uri, or the actual image to use.
/// If is not then only the specified rectangle will /// be used from the loaded image and not all of it.
/// if is given it will be used for the size of the image and not the actual image size. ///
- /// the path to the image to load (file path or uri) + /// the path to the image to load (file path or Uri) /// the image to load /// optional: limit to specific rectangle of the image and not all of it public delegate void HtmlImageLoadCallback(string path, Image image, Rectangle imageRectangle); @@ -63,7 +63,7 @@ public sealed class HtmlImageLoadEventArgs : EventArgs /// /// Init. /// - /// the source of the image (file path or uri) + /// the source of the image (file path or Uri) /// collection of all the attributes that are defined on the image element /// Callback used to allow setting image externally and async. public HtmlImageLoadEventArgs(string src, Dictionary attributes, HtmlImageLoadCallback callback) @@ -74,7 +74,7 @@ public HtmlImageLoadEventArgs(string src, Dictionary attributes, } /// - /// the source of the image (file path or uri) + /// the source of the image (file path or Uri) /// public string Src { @@ -110,12 +110,12 @@ public void Callback() /// /// Callback used to allow setting image externally and async.
- /// The callback can provide path to image file or uri, or the actual image to use.
+ /// The callback can provide path to image file or Uri, or the actual image to use.
/// If is not then only the specified rectangle will /// be used from the loaded image and not all of it.
/// if is given it will be used for the size of the image and not the actual image size. ///
- /// the path to the image to load (file path or uri) + /// the path to the image to load (file path or Uri) /// optional: limit to specific rectangle of the image and not all of it public void Callback(string path, Rectangle imageRectangle = new Rectangle()) { diff --git a/Source/HtmlRenderer/Entities/HtmlLinkClickedEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlLinkClickedEventArgs.cs similarity index 100% rename from Source/HtmlRenderer/Entities/HtmlLinkClickedEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlLinkClickedEventArgs.cs diff --git a/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs b/Source/HtmlRenderer/Core/Entities/HtmlLinkClickedException.cs similarity index 98% rename from Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs rename to Source/HtmlRenderer/Core/Entities/HtmlLinkClickedException.cs index d27a32423..3969901c9 100644 --- a/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlLinkClickedException.cs @@ -15,7 +15,7 @@ namespace HtmlRenderer.Entities { /// - /// Exception thrown when client code subscribed to LinkClicked event throwed exception. + /// Exception thrown when client code subscribed to LinkClicked event thrown exception. /// public sealed class HtmlLinkClickedException : Exception { diff --git a/Source/HtmlRenderer/Entities/HtmlRefreshEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlRefreshEventArgs.cs similarity index 98% rename from Source/HtmlRenderer/Entities/HtmlRefreshEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlRefreshEventArgs.cs index f455f0678..239833b93 100644 --- a/Source/HtmlRenderer/Entities/HtmlRefreshEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlRefreshEventArgs.cs @@ -27,7 +27,7 @@ public sealed class HtmlRefreshEventArgs : EventArgs private readonly bool _layout; /// - /// init. + /// Init. /// /// is re-layout is required for the refresh public HtmlRefreshEventArgs(bool layout) diff --git a/Source/HtmlRenderer/Entities/HtmlRenderErrorEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlRenderErrorEventArgs.cs similarity index 90% rename from Source/HtmlRenderer/Entities/HtmlRenderErrorEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlRenderErrorEventArgs.cs index a7afdf6c0..0da756896 100644 --- a/Source/HtmlRenderer/Entities/HtmlRenderErrorEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlRenderErrorEventArgs.cs @@ -15,7 +15,7 @@ namespace HtmlRenderer.Entities { /// - /// Raised when an error occured during html rendering. + /// Raised when an error occurred during html rendering. /// public sealed class HtmlRenderErrorEventArgs : EventArgs { @@ -30,7 +30,7 @@ public sealed class HtmlRenderErrorEventArgs : EventArgs private readonly string _message; /// - /// the exception that occured (can be null) + /// the exception that occurred (can be null) /// private readonly Exception _exception; @@ -39,7 +39,7 @@ public sealed class HtmlRenderErrorEventArgs : EventArgs ///
/// the type of error to report /// the error message - /// optional: the exception that occured + /// optional: the exception that occurred public HtmlRenderErrorEventArgs(HtmlRenderErrorType type, string message, Exception exception = null) { _type = type; @@ -64,7 +64,7 @@ public string Message } /// - /// the exception that occured (can be null) + /// the exception that occurred (can be null) /// public Exception Exception { diff --git a/Source/HtmlRenderer/Entities/HtmlRenderErrorType.cs b/Source/HtmlRenderer/Core/Entities/HtmlRenderErrorType.cs similarity index 91% rename from Source/HtmlRenderer/Entities/HtmlRenderErrorType.cs rename to Source/HtmlRenderer/Core/Entities/HtmlRenderErrorType.cs index 1d1a97330..fdc8e9494 100644 --- a/Source/HtmlRenderer/Entities/HtmlRenderErrorType.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlRenderErrorType.cs @@ -13,7 +13,7 @@ namespace HtmlRenderer.Entities { /// - /// Enum of possible error types that can be repported. + /// Enum of possible error types that can be reported. /// public enum HtmlRenderErrorType { diff --git a/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlScrollEventArgs.cs similarity index 98% rename from Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlScrollEventArgs.cs index c662dad06..ae3612eb1 100644 --- a/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlScrollEventArgs.cs @@ -27,7 +27,7 @@ public sealed class HtmlScrollEventArgs : EventArgs private readonly Point _location; /// - /// init. + /// Init. /// /// the location to scroll to public HtmlScrollEventArgs(Point location) diff --git a/Source/HtmlRenderer/Entities/HtmlStylesheetLoadEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlStylesheetLoadEventArgs.cs similarity index 89% rename from Source/HtmlRenderer/Entities/HtmlStylesheetLoadEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlStylesheetLoadEventArgs.cs index 4544d2af1..38f05d6aa 100644 --- a/Source/HtmlRenderer/Entities/HtmlStylesheetLoadEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlStylesheetLoadEventArgs.cs @@ -16,8 +16,8 @@ namespace HtmlRenderer.Entities { /// - /// Raised when aa stylesheet is about to be loaded by file path or URI by link element.
- /// This event allows to provide the stylesheet manually or provide new source (file or uri) to load from.
+ /// Raised when a stylesheet is about to be loaded by file path or Uri by link element.
+ /// This event allows to provide the stylesheet manually or provide new source (file or Uri) to load from.
/// If no alternative data is provided the original source will be used.
///
public sealed class HtmlStylesheetLoadEventArgs : EventArgs @@ -50,7 +50,7 @@ public sealed class HtmlStylesheetLoadEventArgs : EventArgs /// /// Init. /// - /// the source of the image (file path or uri) + /// the source of the image (file path or Uri) /// collection of all the attributes that are defined on the image element public HtmlStylesheetLoadEventArgs(string src, Dictionary attributes) { @@ -59,7 +59,7 @@ public HtmlStylesheetLoadEventArgs(string src, Dictionary attrib } /// - /// the source of the image (file path or uri) + /// the source of the image (file path or Uri) /// public string Src { @@ -75,7 +75,7 @@ public Dictionary Attributes } /// - /// provide the new source (file path or uri) to load stylesheet from + /// provide the new source (file path or Uri) to load stylesheet from /// public string SetSrc { diff --git a/Source/HtmlRenderer/Core/Entities/IContextMenu.cs b/Source/HtmlRenderer/Core/Entities/IContextMenu.cs new file mode 100644 index 000000000..a534b0840 --- /dev/null +++ b/Source/HtmlRenderer/Core/Entities/IContextMenu.cs @@ -0,0 +1,55 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System; +using System.Drawing; +using HtmlRenderer.Entities; + +namespace HtmlRenderer.Core.Entities +{ + /// + /// atodo: add doc + /// + public interface IContextMenu : IDisposable + { + /// + /// The total number of items in the context menu + /// + int ItemsCount { get; } + + /// + /// Add divider item to the context menu.
+ /// The divider is a non clickable place holder used to separate items. + ///
+ void AddDivider(); + + /// + /// Add item to the context menu with the given text that will raise the given event when clicked. + /// + /// the text to set on the new context menu item + /// if to set the item as enabled or disabled + /// the event to raise when the item is clicked + void AddItem(string text, bool enabled, EventHandler onClick); + + /// + /// Remove the last item from the context menu iff it is a divider + /// + void RemoveLastDivider(); + + /// + /// Show the context menu in the given parent control at the given location. + /// + /// the parent control to show in + /// the location to show at relative to the parent control + void Show(IControl parent, Point location); + } +} diff --git a/Source/HtmlRenderer/Core/Entities/IControl.cs b/Source/HtmlRenderer/Core/Entities/IControl.cs new file mode 100644 index 000000000..53aaf5146 --- /dev/null +++ b/Source/HtmlRenderer/Core/Entities/IControl.cs @@ -0,0 +1,112 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System.Drawing; +using HtmlRenderer.Core.Entities; + +namespace HtmlRenderer.Entities +{ + /// + /// aTODO: add doc + /// + public interface IControl + { + /// + /// Is the left mouse button is currently in pressed state + /// + bool LeftMouseButton { get; } + + /// + /// Is the right mouse button is currently in pressed state + /// + bool RightMouseButton { get; } + + /// + /// Get the current location of the mouse relative to the control + /// + Point MouseLocation { get; } + + /// + /// Set the cursor over the control to default cursor + /// + void SetCursorDefault(); + + /// + /// Set the cursor over the control to hand cursor + /// + void SetCursorHand(); + + /// + /// Set the cursor over the control to I beam cursor + /// + void SetCursorIBeam(); + + /// + /// Set the given text to the clipboard + /// + /// the text to set + void SetToClipboard(string text); + + /// + /// Set the given html and plain text data to clipboard. + /// + /// the html data + /// the plain text data + void SetToClipboard(string html, string plainText); + + /// + /// Set the given image to clipboard. + /// + /// + void SetToClipboard(Image image); + + /// + /// Get data object for the given html and plain text data.
+ /// The data object can be used for clipboard or drag-drop operation. + ///
+ /// the html data + /// the plain text data + /// drag-drop data object + object GetDataObject(string html, string plainText); + + /// + /// Do drag-drop copy operation for the given data object. + /// + /// the drag-drop data object + void DoDragDropCopy(object dragDropData); + + /// + /// Create graphics object that can be used with the control. + /// + /// graphics object + IGraphics CreateGraphics(); + + /// + /// Invalidates the entire surface of the control and causes the control to be redrawn. + /// + void Invalidate(); + + /// + /// Create a context menu that can be used on the control + /// + /// new context menu + IContextMenu CreateContextMenu(); + + /// + /// Save the given image to file by showing save dialog to the client. + /// + /// the image to save + /// the name of the image for save dialog + /// the extension of the image for save dialog + void SaveToFile(Image image, string name, string extension); + } +} diff --git a/Source/HtmlRenderer/Core/Entities/KeyEvent.cs b/Source/HtmlRenderer/Core/Entities/KeyEvent.cs new file mode 100644 index 000000000..be50bdd03 --- /dev/null +++ b/Source/HtmlRenderer/Core/Entities/KeyEvent.cs @@ -0,0 +1,69 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +namespace HtmlRenderer.Entities +{ + /// + /// aTODO: add doc + /// + public sealed class KeyEvent + { + /// + /// is control is pressed + /// + private readonly bool _control; + + /// + /// is 'A' key is pressed + /// + private readonly bool _aKeyCode; + + /// + /// is 'C' key is pressed + /// + private readonly bool _cKeyCode; + + /// + /// Init. + /// + public KeyEvent(bool control, bool aKeyCode, bool cKeyCode) + { + _control = control; + _aKeyCode = aKeyCode; + _cKeyCode = cKeyCode; + } + + /// + /// is control is pressed + /// + public bool Control + { + get { return _control; } + } + + /// + /// is 'A' key is pressed + /// + public bool AKeyCode + { + get { return _aKeyCode; } + } + + /// + /// is 'C' key is pressed + /// + public bool CKeyCode + { + get { return _cKeyCode; } + } + } +} diff --git a/Source/HtmlRenderer/Core/Entities/MouseEvent.cs b/Source/HtmlRenderer/Core/Entities/MouseEvent.cs new file mode 100644 index 000000000..527ad6ed2 --- /dev/null +++ b/Source/HtmlRenderer/Core/Entities/MouseEvent.cs @@ -0,0 +1,41 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +namespace HtmlRenderer.Entities +{ + /// + /// aTODO: add doc + /// + public sealed class MouseEvent + { + /// + /// Is the left mouse button participated in the event + /// + private readonly bool _leftButton; + + /// + /// Init. + /// + public MouseEvent(bool leftButton) + { + _leftButton = leftButton; + } + + /// + /// Is the left mouse button participated in the event + /// + public bool LeftButton + { + get { return _leftButton; } + } + } +} diff --git a/Source/HtmlRenderer/Entities/SubString.cs b/Source/HtmlRenderer/Core/Entities/SubString.cs similarity index 100% rename from Source/HtmlRenderer/Entities/SubString.cs rename to Source/HtmlRenderer/Core/Entities/SubString.cs diff --git a/Source/HtmlRenderer/Entities/Tupler.cs b/Source/HtmlRenderer/Core/Entities/Tupler.cs similarity index 100% rename from Source/HtmlRenderer/Entities/Tupler.cs rename to Source/HtmlRenderer/Core/Entities/Tupler.cs diff --git a/Source/HtmlRenderer/Handlers/BackgroundImageDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs similarity index 99% rename from Source/HtmlRenderer/Handlers/BackgroundImageDrawHandler.cs rename to Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs index 8b2835534..71171361c 100644 --- a/Source/HtmlRenderer/Handlers/BackgroundImageDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs @@ -13,7 +13,6 @@ using System; using System.Drawing; using HtmlRenderer.Dom; -using HtmlRenderer.Utils; namespace HtmlRenderer.Handlers { diff --git a/Source/HtmlRenderer/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs similarity index 100% rename from Source/HtmlRenderer/Handlers/BordersDrawHandler.cs rename to Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs diff --git a/Source/HtmlRenderer/Handlers/ContextMenuHandler.cs b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs similarity index 83% rename from Source/HtmlRenderer/Handlers/ContextMenuHandler.cs rename to Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs index 0df6b504c..bc5ee7af6 100644 --- a/Source/HtmlRenderer/Handlers/ContextMenuHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs @@ -13,7 +13,7 @@ using System; using System.Globalization; using System.IO; -using System.Windows.Forms; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Dom; using HtmlRenderer.Entities; using HtmlRenderer.Utils; @@ -80,20 +80,20 @@ internal sealed class ContextMenuHandler : IDisposable /// /// the html container the handler is on /// - private readonly HtmlContainer _htmlContainer; + private readonly HtmlContainerBase _htmlContainer; /// - /// the last conext menu shown + /// the last context menu shown /// - private ContextMenuStrip _contextMenu; + private IContextMenu _contextMenu; /// /// the control that the context menu was shown on /// - private Control _parentControl; + private IControl _parentControl; /// - /// the css rect that context menu shown on + /// the css rectangle that context menu shown on /// private CssRect _currentRect; @@ -261,7 +261,7 @@ static ContextMenuHandler() /// /// the selection handler linked to the context menu handler /// the html container the handler is on - public ContextMenuHandler(SelectionHandler selectionHandler, HtmlContainer htmlContainer) + public ContextMenuHandler(SelectionHandler selectionHandler, HtmlContainerBase htmlContainer) { ArgChecker.AssertArgNotNull(selectionHandler, "selectionHandler"); ArgChecker.AssertArgNotNull(htmlContainer, "htmlContainer"); @@ -276,7 +276,7 @@ public ContextMenuHandler(SelectionHandler selectionHandler, HtmlContainer htmlC /// the parent control to show the context menu on /// the rectangle that was clicked to show context menu /// the link that was clicked to show context menu on - public void ShowContextMenu(Control parent, CssRect rect, CssBox link) + public void ShowContextMenu(IControl parent, CssRect rect, CssBox link) { try { @@ -285,56 +285,49 @@ public void ShowContextMenu(Control parent, CssRect rect, CssBox link) _parentControl = parent; _currentRect = rect; _currentLink = link; - _contextMenu = new ContextMenuStrip(); - _contextMenu.ShowImageMargin = false; - + _contextMenu = parent.CreateContextMenu(); + if(rect != null) { bool isVideo = false; if (link != null) { isVideo = link is CssBoxFrame && ((CssBoxFrame)link).IsVideo; - var openLink = _contextMenu.Items.Add(isVideo ? _openVideo : _openLink, null, OnOpenLinkClick); + var linkExist = !string.IsNullOrEmpty(link.HrefLink); + _contextMenu.AddItem(isVideo ? _openVideo : _openLink, linkExist, OnOpenLinkClick); if(_htmlContainer.IsSelectionEnabled) { - var copyLink = _contextMenu.Items.Add(isVideo ? _copyVideoUrl : _copyLink, null, OnCopyLinkClick); - copyLink.Enabled = !string.IsNullOrEmpty(link.HrefLink); + _contextMenu.AddItem(isVideo ? _copyVideoUrl : _copyLink, linkExist, OnCopyLinkClick); } - openLink.Enabled = !string.IsNullOrEmpty(link.HrefLink); - _contextMenu.Items.Add("-"); + _contextMenu.AddDivider(); } if (rect.IsImage && !isVideo) { - var saveImage = _contextMenu.Items.Add(_saveImage, null, OnSaveImageClick); + _contextMenu.AddItem(_saveImage, rect.Image != null, OnSaveImageClick); if(_htmlContainer.IsSelectionEnabled) { - var copyImageUrl = _contextMenu.Items.Add(_copyImageLink, null, OnCopyImageLinkClick); - var copyImage = _contextMenu.Items.Add(_copyImage, null, OnCopyImageClick); - copyImageUrl.Enabled = !string.IsNullOrEmpty(_currentRect.OwnerBox.GetAttribute("src")); - copyImage.Enabled = rect.Image != null; + _contextMenu.AddItem(_copyImageLink, !string.IsNullOrEmpty(_currentRect.OwnerBox.GetAttribute("src")), OnCopyImageLinkClick); + _contextMenu.AddItem(_copyImage, rect.Image != null, OnCopyImageClick); } - saveImage.Enabled = rect.Image != null; - _contextMenu.Items.Add("-"); + _contextMenu.AddDivider(); } if(_htmlContainer.IsSelectionEnabled) { - var copy = _contextMenu.Items.Add(_copy, null, OnCopyClick); - copy.Enabled = rect.Selected; + _contextMenu.AddItem(_copy, rect.Selected, OnCopyClick); } } if(_htmlContainer.IsSelectionEnabled) { - _contextMenu.Items.Add(_selectAll, null, OnSelectAllClick); + _contextMenu.AddItem(_selectAll, true, OnSelectAllClick); } - if(_contextMenu.Items.Count > 0) + if(_contextMenu.ItemsCount > 0) { - if(_contextMenu.Items[_contextMenu.Items.Count-1].Text == string.Empty) - _contextMenu.Items.RemoveAt(_contextMenu.Items.Count - 1); - _contextMenu.Show(parent, parent.PointToClient(Control.MousePosition)); + _contextMenu.RemoveLastDivider(); + _contextMenu.Show(parent, parent.MouseLocation); } } catch (Exception ex) @@ -380,8 +373,7 @@ private void OnOpenLinkClick(object sender, EventArgs eventArgs) { try { - var mp = _parentControl.PointToClient(Control.MousePosition); - _currentLink.HtmlContainer.HandleLinkClicked(_parentControl, new MouseEventArgs(MouseButtons.None, 0, mp.X, mp.Y, 0), _currentLink); + _currentLink.HtmlContainer.HandleLinkClicked(_parentControl, _parentControl.MouseLocation, _currentLink); } catch (HtmlLinkClickedException) { @@ -404,7 +396,7 @@ private void OnCopyLinkClick(object sender, EventArgs eventArgs) { try { - Clipboard.SetText(_currentLink.HrefLink); + _parentControl.SetToClipboard(_currentLink.HrefLink); } catch (Exception ex) { @@ -423,18 +415,8 @@ private void OnSaveImageClick(object sender, EventArgs eventArgs) { try { - using (var saveDialog = new SaveFileDialog()) - { - var imageSrc = _currentRect.OwnerBox.GetAttribute("src"); - saveDialog.DefaultExt = Path.GetExtension(imageSrc) ?? "png"; - saveDialog.FileName = Path.GetFileName(imageSrc) ?? "image"; - saveDialog.Filter = "Images|*.png;*.bmp;*.jpg"; - - if(saveDialog.ShowDialog(_parentControl) == DialogResult.OK) - { - _currentRect.Image.Save(saveDialog.FileName); - } - } + var imageSrc = _currentRect.OwnerBox.GetAttribute("src"); + _parentControl.SaveToFile(_currentRect.Image, Path.GetFileName(imageSrc) ?? "image", Path.GetExtension(imageSrc) ?? "png"); } catch (Exception ex) { @@ -453,7 +435,7 @@ private void OnCopyImageLinkClick(object sender, EventArgs eventArgs) { try { - Clipboard.SetText(_currentRect.OwnerBox.GetAttribute("src")); + _parentControl.SetToClipboard(_currentRect.OwnerBox.GetAttribute("src")); } catch (Exception ex) { @@ -472,7 +454,7 @@ private void OnCopyImageClick(object sender, EventArgs eventArgs) { try { - Clipboard.SetImage(_currentRect.Image); + _parentControl.SetToClipboard(_currentRect.Image); } catch (Exception ex) { @@ -491,7 +473,7 @@ private void OnCopyClick(object sender, EventArgs eventArgs) { try { - _selectionHandler.CopySelectedHtml(); + _selectionHandler.CopySelectedHtml(_parentControl); } catch (Exception ex) { diff --git a/Source/HtmlRenderer/Handlers/ImageLoadHandler.cs b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs similarity index 97% rename from Source/HtmlRenderer/Handlers/ImageLoadHandler.cs rename to Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs index 4950c44ab..20b8693bb 100644 --- a/Source/HtmlRenderer/Handlers/ImageLoadHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs @@ -44,12 +44,12 @@ internal sealed class ImageLoadHandler : IDisposable /// /// the container of the html to handle load image for /// - private HtmlContainer _htmlContainer; + private HtmlContainerBase _htmlContainer; /// /// callback raised when image load process is complete with image or without /// - private readonly Utils.Action _loadCompleteCallback; + private readonly Action _loadCompleteCallback; /// /// the web client used to download image from uri (to cancel on dispose) @@ -93,7 +93,7 @@ internal sealed class ImageLoadHandler : IDisposable /// Init. /// /// callback raised when image load process is complete with image or without - public ImageLoadHandler(Utils.Action loadCompleteCallback) + public ImageLoadHandler(Action loadCompleteCallback) { ArgChecker.AssertArgNotNull(loadCompleteCallback, "loadCompleteCallback"); @@ -131,7 +131,7 @@ public Rectangle Rectangle /// the source of the image to load /// the collection of attributes on the element to use in event /// the image object (null if failed) - public void LoadImage(HtmlContainer htmlContainer, string src, Dictionary attributes) + public void LoadImage(HtmlContainerBase htmlContainer, string src, Dictionary attributes) { ArgChecker.AssertArgNotNull(htmlContainer, "htmlContainer"); diff --git a/Source/HtmlRenderer/Handlers/SelectionHandler.cs b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs similarity index 92% rename from Source/HtmlRenderer/Handlers/SelectionHandler.cs rename to Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs index 8b2357063..b82167646 100644 --- a/Source/HtmlRenderer/Handlers/SelectionHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs @@ -12,7 +12,6 @@ using System; using System.Drawing; -using System.Windows.Forms; using HtmlRenderer.Dom; using HtmlRenderer.Entities; using HtmlRenderer.Utils; @@ -106,7 +105,7 @@ internal sealed class SelectionHandler : IDisposable /// /// used to know if drag & drop was already started not to execute the same operation over /// - private DataObject _dragDropData; + private object _dragDropData; #endregion @@ -127,7 +126,7 @@ public SelectionHandler(CssBox root) /// Select all the words in the html. /// /// the control hosting the html to invalidate - public void SelectAll(Control control) + public void SelectAll(IControl control) { if (_root.HtmlContainer.IsSelectionEnabled) { @@ -142,7 +141,7 @@ public void SelectAll(Control control) /// /// the control hosting the html to invalidate /// the location to select word at - public void SelectWord(Control control, Point loc) + public void SelectWord(IControl control, Point loc) { if (_root.HtmlContainer.IsSelectionEnabled) { @@ -163,7 +162,7 @@ public void SelectWord(Control control, Point loc) /// the control hosting the html to invalidate /// the location of the mouse on the html /// - public void HandleMouseDown(Control parent, Point loc, bool isMouseInContainer) + public void HandleMouseDown(IControl parent, Point loc, bool isMouseInContainer) { bool clear = !isMouseInContainer; if(isMouseInContainer) @@ -172,7 +171,7 @@ public void HandleMouseDown(Control parent, Point loc, bool isMouseInContainer) _lastMouseDown = DateTime.Now; _mouseDownOnSelectedWord = false; - if (_root.HtmlContainer.IsSelectionEnabled && (Control.MouseButtons & MouseButtons.Left) != 0) + if (_root.HtmlContainer.IsSelectionEnabled && parent.LeftMouseButton) { var word = DomUtils.GetCssBoxWord(_root, loc); if (word != null && word.Selected) @@ -184,7 +183,7 @@ public void HandleMouseDown(Control parent, Point loc, bool isMouseInContainer) clear = true; } } - else if ((Control.MouseButtons & MouseButtons.Right) != 0) + else if (parent.RightMouseButton) { var rect = DomUtils.GetCssBoxWord(_root, loc); var link = DomUtils.GetLinkBox(_root, loc); @@ -207,15 +206,15 @@ public void HandleMouseDown(Control parent, Point loc, bool isMouseInContainer) /// Handle mouse up to handle selection and link click. /// /// the control hosting the html to invalidate - /// the mouse button that has been released + /// is the left mouse button has been released /// is the mouse up should be ignored - public bool HandleMouseUp(Control parent, MouseButtons button) + public bool HandleMouseUp(IControl parent, bool leftMouseButton) { bool ignore = false; if (_root.HtmlContainer.IsSelectionEnabled) { ignore = _inSelection; - if (!_inSelection && (button & MouseButtons.Left) != 0 && _mouseDownOnSelectedWord) + if (!_inSelection && leftMouseButton && _mouseDownOnSelectedWord) { ClearSelection(); parent.Invalidate(); @@ -233,9 +232,9 @@ public bool HandleMouseUp(Control parent, MouseButtons button) /// /// the control hosting the html to set cursor and invalidate /// the location of the mouse on the html - public void HandleMouseMove(Control parent, Point loc) + public void HandleMouseMove(IControl parent, Point loc) { - if (_root.HtmlContainer.IsSelectionEnabled && (Control.MouseButtons & MouseButtons.Left) != 0) + if (_root.HtmlContainer.IsSelectionEnabled && parent.LeftMouseButton) { if (_mouseDownOnSelectedWord) { @@ -254,17 +253,20 @@ public void HandleMouseMove(Control parent, Point loc) if (link != null) { _cursorChanged = true; - parent.Cursor = Cursors.Hand; + parent.SetCursorHand(); } else if (_root.HtmlContainer.IsSelectionEnabled) { var word = DomUtils.GetCssBoxWord(_root, loc); _cursorChanged = word != null && !word.IsImage && !( word.Selected && ( word.SelectedStartIndex < 0 || word.Left + word.SelectedStartOffset <= loc.X ) && ( word.SelectedEndOffset < 0 || word.Left + word.SelectedEndOffset >= loc.X ) ); - parent.Cursor = _cursorChanged ? Cursors.IBeam : Cursors.Default; + if( _cursorChanged ) + parent.SetCursorIBeam(); + else + parent.SetCursorDefault(); } else if(_cursorChanged) { - parent.Cursor = Cursors.Default; + parent.SetCursorDefault(); } } } @@ -273,12 +275,12 @@ public void HandleMouseMove(Control parent, Point loc) /// On mouse leave change the cursor back to default. /// /// the control hosting the html to set cursor and invalidate - public void HandleMouseLeave(Control parent) + public void HandleMouseLeave(IControl parent) { if(_cursorChanged) { _cursorChanged = false; - parent.Cursor = Cursors.Default; + parent.SetCursorDefault(); } } @@ -286,14 +288,15 @@ public void HandleMouseLeave(Control parent) /// Copy the currently selected html segment to clipboard.
/// Copy rich html text and plain text. /// - public void CopySelectedHtml() + /// the control hosting the html to use for clipboard access + public void CopySelectedHtml(IControl parent) { if(_root.HtmlContainer.IsSelectionEnabled) { var html = DomUtils.GenerateHtml(_root, HtmlGenerationStyle.Inline, true); var plainText = DomUtils.GetSelectedPlainText(_root); if (!string.IsNullOrEmpty(plainText)) - HtmlClipboardUtils.CopyToClipboard(html, plainText); + parent.SetToClipboard(html, plainText); } } @@ -305,7 +308,7 @@ public void CopySelectedHtml() /// Handles backward selecting by returning the selection end data instead of start. /// /// the word to return the selection start index for - /// data value or -1 if not aplicable + /// data value or -1 if not applicable public int GetSelectingStartIndex(CssRect word) { return word == (_backwardSelection ? _selectionEnd : _selectionStart) ? (_backwardSelection ? _selectionEndIndex : _selectionStartIndex) : -1; @@ -369,7 +372,7 @@ public void Dispose() /// the control hosting the html to invalidate /// the mouse location /// true - partial word selection allowed, false - only full words selection - private void HandleSelection(Control control, Point loc, bool allowPartialSelect) + private void HandleSelection(IControl control, Point loc, bool allowPartialSelect) { // get the line under the mouse or nearest from the top var lineBox = DomUtils.GetCssLineBox(_root, loc); @@ -427,7 +430,7 @@ private void HandleSelection(Control control, Point loc, bool allowPartialSelect } _cursorChanged = true; - control.Cursor = Cursors.IBeam; + control.SetCursorIBeam(); control.Invalidate(); } } @@ -473,15 +476,15 @@ private static void ClearSelection(CssBox box) /// Start drag & drop operation on the currently selected html segment. /// /// the control to start the drag & drop on - private void StartDragDrop(Control control) + private void StartDragDrop(IControl control) { if (_dragDropData == null) { var html = DomUtils.GenerateHtml(_root, HtmlGenerationStyle.Inline, true); var plainText = DomUtils.GetSelectedPlainText(_root); - _dragDropData = HtmlClipboardUtils.GetDataObject(html, plainText); + _dragDropData = control.GetDataObject(html, plainText); } - control.DoDragDrop(_dragDropData, DragDropEffects.Copy); + control.DoDragDropCopy(_dragDropData); } /// @@ -573,13 +576,13 @@ private bool SelectWordsInRange(CssBox box, CssRect selectionStart, CssRect sele /// /// Calculate the character index and offset by characters for the given word and given offset.
- /// . + /// . ///
/// used to create graphics to measure string /// the word to calculate its index and offset /// the location to calculate for /// to set the starting or ending char and offset data - private void CalculateWordCharIndexAndOffset(Control control, CssRect word, Point loc, bool selectionStart) + private void CalculateWordCharIndexAndOffset(IControl control, CssRect word, Point loc, bool selectionStart) { int selectionIndex; float selectionOffset; @@ -610,7 +613,7 @@ private void CalculateWordCharIndexAndOffset(Control control, CssRect word, Poin /// return the index of the char under the location /// return the offset of the char under the location /// is to include the first character in the calculation - private static void CalculateWordCharIndexAndOffset(Control control, CssRect word, Point loc, bool inclusive, out int selectionIndex, out float selectionOffset) + private static void CalculateWordCharIndexAndOffset(IControl control, CssRect word, Point loc, bool inclusive, out int selectionIndex, out float selectionOffset) { selectionIndex = 0; selectionOffset = 0f; @@ -631,7 +634,7 @@ private static void CalculateWordCharIndexAndOffset(Control control, CssRect wor { // calculate partial word selection var font = word.OwnerBox.ActualFont; - using (var g = new WinGraphics(control.CreateGraphics())) + using (var g = control.CreateGraphics()) { int charFit; int charFitWidth; diff --git a/Source/HtmlRenderer/HtmlContainer.cs b/Source/HtmlRenderer/Core/HtmlContainerBase.cs similarity index 90% rename from Source/HtmlRenderer/HtmlContainer.cs rename to Source/HtmlRenderer/Core/HtmlContainerBase.cs index d565c050d..a56ea2e62 100644 --- a/Source/HtmlRenderer/HtmlContainer.cs +++ b/Source/HtmlRenderer/Core/HtmlContainerBase.cs @@ -14,8 +14,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Drawing; -using System.Drawing.Drawing2D; -using System.Windows.Forms; using HtmlRenderer.Dom; using HtmlRenderer.Entities; using HtmlRenderer.Handlers; @@ -25,7 +23,7 @@ namespace HtmlRenderer { /// - /// Low level handling of Html Renderer logic, this class is used by , , and .
+ /// Low level handling of Html Renderer logic.
/// The class allows html layout and rendering without association to actual winforms control, those allowing to handle html rendering on any graphics object.
/// Using this class will require the client to handle all propagations of mouse\keyboard events, layout/paint calls, scrolling offset, /// location/size/rectangle handling and UI refresh requests.
@@ -69,7 +67,7 @@ namespace HtmlRenderer /// Raised when an error occurred during html rendering.
/// ///
- public sealed class HtmlContainer : IDisposable + public abstract class HtmlContainerBase : IDisposable { #region Fields and Consts @@ -386,28 +384,25 @@ public string GetLinkAt(Point location) /// Measures the bounds of box and children, recursively. ///
/// Device context to draw - public void PerformLayout(Graphics g) + public void PerformLayout(IGraphics g) { ArgChecker.AssertArgNotNull(g, "g"); - if (_root != null) + if( _root != null ) { - using (var ig = new WinGraphics(g)) - { - _actualSize = SizeF.Empty; + _actualSize = SizeF.Empty; - // if width is not restricted we set it to large value to get the actual later - _root.Size = new SizeF(_maxSize.Width > 0 ? _maxSize.Width : 99999, 0); - _root.Location = _location; - _root.PerformLayout(ig); + // if width is not restricted we set it to large value to get the actual later + _root.Size = new SizeF(_maxSize.Width > 0 ? _maxSize.Width : 99999, 0); + _root.Location = _location; + _root.PerformLayout(g); - if (_maxSize.Width <= 0.1) - { - // in case the width is not restricted we need to double layout, first will find the width so second can layout by it (center alignment) - _root.Size = new SizeF((int)Math.Ceiling(_actualSize.Width), 0); - _actualSize = SizeF.Empty; - _root.PerformLayout(ig); - } + if( _maxSize.Width <= 0.1 ) + { + // in case the width is not restricted we need to double layout, first will find the width so second can layout by it (center alignment) + _root.Size = new SizeF((int)Math.Ceiling(_actualSize.Width), 0); + _actualSize = SizeF.Empty; + _root.PerformLayout(g); } } } @@ -416,28 +411,25 @@ public void PerformLayout(Graphics g) /// Render the html using the given device. /// /// the device to use to render - public void PerformPaint(Graphics g) + public void PerformPaint(IGraphics g) { ArgChecker.AssertArgNotNull(g, "g"); - Region prevClip = null; + RectangleF prevClip = RectangleF.Empty; if (MaxSize.Height > 0) { - prevClip = g.Clip; + prevClip = g.GetClip(); g.SetClip(new RectangleF(_location, _maxSize)); } if (_root != null) { - using (var ig = new WinGraphics(g)) - { - _root.Paint(ig); - } + _root.Paint(g); } - if (prevClip != null) + if (prevClip != RectangleF.Empty) { - g.SetClip(prevClip, CombineMode.Replace); + g.SetClip(prevClip); } } @@ -445,16 +437,15 @@ public void PerformPaint(Graphics g) /// Handle mouse down to handle selection. /// /// the control hosting the html to invalidate - /// the mouse event args - public void HandleMouseDown(Control parent, MouseEventArgs e) + /// the location of the mouse + public void HandleMouseDown(IControl parent, Point location) { ArgChecker.AssertArgNotNull(parent, "parent"); - ArgChecker.AssertArgNotNull(e, "e"); - + try { if (_selectionHandler != null) - _selectionHandler.HandleMouseDown(parent, OffsetByScroll(e.Location), IsMouseInContainer(e.Location)); + _selectionHandler.HandleMouseDown(parent, OffsetByScroll(location), IsMouseInContainer(location)); } catch (Exception ex) { @@ -466,24 +457,24 @@ public void HandleMouseDown(Control parent, MouseEventArgs e) /// Handle mouse up to handle selection and link click. /// /// the control hosting the html to invalidate - /// the mouse event args - public void HandleMouseUp(Control parent, MouseEventArgs e) + /// the location of the mouse + /// the mouse event data + public void HandleMouseUp(IControl parent, Point location, MouseEvent e) { ArgChecker.AssertArgNotNull(parent, "parent"); - ArgChecker.AssertArgNotNull(e, "e"); try { - if (_selectionHandler != null && IsMouseInContainer(e.Location)) + if (_selectionHandler != null && IsMouseInContainer(location)) { - var ignore = _selectionHandler.HandleMouseUp(parent, e.Button); - if (!ignore && (e.Button & MouseButtons.Left) != 0) + var ignore = _selectionHandler.HandleMouseUp(parent, e.LeftButton); + if (!ignore && e.LeftButton) { - var loc = OffsetByScroll(e.Location); + var loc = OffsetByScroll(location); var link = DomUtils.GetLinkBox(_root, loc); if (link != null) { - HandleLinkClicked(parent, e, link); + HandleLinkClicked(parent, location, link); } } } @@ -502,16 +493,15 @@ public void HandleMouseUp(Control parent, MouseEventArgs e) /// Handle mouse double click to select word under the mouse. /// /// the control hosting the html to set cursor and invalidate - /// mouse event args - public void HandleMouseDoubleClick(Control parent, MouseEventArgs e) + /// the location of the mouse + public void HandleMouseDoubleClick(IControl parent, Point location) { ArgChecker.AssertArgNotNull(parent, "parent"); - ArgChecker.AssertArgNotNull(e, "e"); try { - if (_selectionHandler != null && IsMouseInContainer(e.Location)) - _selectionHandler.SelectWord(parent, OffsetByScroll(e.Location)); + if (_selectionHandler != null && IsMouseInContainer(location)) + _selectionHandler.SelectWord(parent, OffsetByScroll(location)); } catch (Exception ex) { @@ -523,16 +513,15 @@ public void HandleMouseDoubleClick(Control parent, MouseEventArgs e) /// Handle mouse move to handle hover cursor and text selection. /// /// the control hosting the html to set cursor and invalidate - /// the mouse event args - public void HandleMouseMove(Control parent, MouseEventArgs e) + /// the location of the mouse + public void HandleMouseMove(IControl parent, Point location) { ArgChecker.AssertArgNotNull(parent, "parent"); - ArgChecker.AssertArgNotNull(e, "e"); try { - var loc = OffsetByScroll(e.Location); - if (_selectionHandler != null && IsMouseInContainer(e.Location)) + var loc = OffsetByScroll(location); + if (_selectionHandler != null && IsMouseInContainer(location)) _selectionHandler.HandleMouseMove(parent, loc); /* @@ -566,7 +555,7 @@ public void HandleMouseMove(Control parent, MouseEventArgs e) /// Handle mouse leave to handle hover cursor. /// /// the control hosting the html to set cursor and invalidate - public void HandleMouseLeave(Control parent) + public void HandleMouseLeave(IControl parent) { ArgChecker.AssertArgNotNull(parent, "parent"); @@ -586,7 +575,7 @@ public void HandleMouseLeave(Control parent) /// /// the control hosting the html to invalidate /// the pressed key - public void HandleKeyDown(Control parent, KeyEventArgs e) + public void HandleKeyDown(IControl parent, KeyEvent e) { ArgChecker.AssertArgNotNull(parent, "parent"); ArgChecker.AssertArgNotNull(e, "e"); @@ -596,15 +585,15 @@ public void HandleKeyDown(Control parent, KeyEventArgs e) if (e.Control && _selectionHandler != null) { // select all - if (e.KeyCode == Keys.A) + if (e.AKeyCode) { _selectionHandler.SelectAll(parent); } // copy currently selected text - if (e.KeyCode == Keys.C) + if (e.CKeyCode) { - _selectionHandler.CopySelectedHtml(); + _selectionHandler.CopySelectedHtml(parent); } } } @@ -694,9 +683,9 @@ internal void ReportError(HtmlRenderErrorType type, string message, Exception ex /// Handle link clicked going over event and using if not canceled. /// /// the control hosting the html to invalidate - /// the mouse event args + /// the location of the mouse /// the link that was clicked - internal void HandleLinkClicked(Control parent, MouseEventArgs e, CssBox link) + internal void HandleLinkClicked(IControl parent, Point location, CssBox link) { if (LinkClicked != null) { @@ -726,7 +715,7 @@ internal void HandleLinkClicked(Control parent, MouseEventArgs e, CssBox link) { var rect = CommonUtils.GetFirstValueOrDefault(box.Rectangles, box.Bounds); ScrollChange(this, new HtmlScrollEventArgs(Point.Round(rect.Location))); - HandleMouseMove(parent, e); + HandleMouseMove(parent, location); } } } diff --git a/Source/HtmlRenderer/IGraphics.cs b/Source/HtmlRenderer/Core/IGraphics.cs similarity index 100% rename from Source/HtmlRenderer/IGraphics.cs rename to Source/HtmlRenderer/Core/IGraphics.cs diff --git a/Source/HtmlRenderer/Parse/CssParser.cs b/Source/HtmlRenderer/Core/Parse/CssParser.cs similarity index 100% rename from Source/HtmlRenderer/Parse/CssParser.cs rename to Source/HtmlRenderer/Core/Parse/CssParser.cs diff --git a/Source/HtmlRenderer/Parse/CssValueParser.cs b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs similarity index 99% rename from Source/HtmlRenderer/Parse/CssValueParser.cs rename to Source/HtmlRenderer/Core/Parse/CssValueParser.cs index cd8bffae5..81f0af90f 100644 --- a/Source/HtmlRenderer/Parse/CssValueParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs @@ -20,7 +20,7 @@ namespace HtmlRenderer.Parse { /// - /// Parse CSS properties values like numbers, urls, etc. + /// Parse CSS properties values like numbers, Urls, etc. /// internal static class CssValueParser { diff --git a/Source/HtmlRenderer/Parse/DomParser.cs b/Source/HtmlRenderer/Core/Parse/DomParser.cs similarity index 99% rename from Source/HtmlRenderer/Parse/DomParser.cs rename to Source/HtmlRenderer/Core/Parse/DomParser.cs index c572bb2b0..f4c853a45 100644 --- a/Source/HtmlRenderer/Parse/DomParser.cs +++ b/Source/HtmlRenderer/Core/Parse/DomParser.cs @@ -31,7 +31,7 @@ internal static class DomParser /// the html container to use for reference resolve /// the css data to use /// the root of the generated tree - public static CssBox GenerateCssTree(string html, HtmlContainer htmlContainer, ref CssData cssData) + public static CssBox GenerateCssTree(string html, HtmlContainerBase htmlContainer, ref CssData cssData) { var root = HtmlParser.ParseDocument(html); if (root != null) @@ -72,7 +72,7 @@ public static CssBox GenerateCssTree(string html, HtmlContainer htmlContainer, r /// the html container to use for reference resolve /// /// check if the css data has been modified by the handled html not to change the base css data - private static void CascadeStyles(CssBox box, HtmlContainer htmlContainer, ref CssData cssData, ref bool cssDataChanged) + private static void CascadeStyles(CssBox box, HtmlContainerBase htmlContainer, ref CssData cssData, ref bool cssDataChanged) { box.InheritStyle(); @@ -139,7 +139,7 @@ private static void CascadeStyles(CssBox box, HtmlContainer htmlContainer, ref C /// /// /// the style data - private static void SetTextSelectionStyle(HtmlContainer htmlContainer, CssData cssData) + private static void SetTextSelectionStyle(HtmlContainerBase htmlContainer, CssData cssData) { htmlContainer.SelectionForeColor = Color.Empty; htmlContainer.SelectionBackColor = Color.Empty; diff --git a/Source/HtmlRenderer/Parse/HtmlParser.cs b/Source/HtmlRenderer/Core/Parse/HtmlParser.cs similarity index 100% rename from Source/HtmlRenderer/Parse/HtmlParser.cs rename to Source/HtmlRenderer/Core/Parse/HtmlParser.cs diff --git a/Source/HtmlRenderer/Parse/RegexParserHelper.cs b/Source/HtmlRenderer/Core/Parse/RegexParserHelper.cs similarity index 100% rename from Source/HtmlRenderer/Parse/RegexParserHelper.cs rename to Source/HtmlRenderer/Core/Parse/RegexParserHelper.cs diff --git a/Source/HtmlRenderer/Parse/RegexParserUtils.cs b/Source/HtmlRenderer/Core/Parse/RegexParserUtils.cs similarity index 100% rename from Source/HtmlRenderer/Parse/RegexParserUtils.cs rename to Source/HtmlRenderer/Core/Parse/RegexParserUtils.cs diff --git a/Source/HtmlRenderer/Utils/ArgChecker.cs b/Source/HtmlRenderer/Core/Utils/ArgChecker.cs similarity index 100% rename from Source/HtmlRenderer/Utils/ArgChecker.cs rename to Source/HtmlRenderer/Core/Utils/ArgChecker.cs diff --git a/Source/HtmlRenderer/Utils/CommonUtils.cs b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs similarity index 100% rename from Source/HtmlRenderer/Utils/CommonUtils.cs rename to Source/HtmlRenderer/Core/Utils/CommonUtils.cs diff --git a/Source/HtmlRenderer/Utils/CssUtils.cs b/Source/HtmlRenderer/Core/Utils/CssUtils.cs similarity index 100% rename from Source/HtmlRenderer/Utils/CssUtils.cs rename to Source/HtmlRenderer/Core/Utils/CssUtils.cs diff --git a/Source/HtmlRenderer/Utils/DomUtils.cs b/Source/HtmlRenderer/Core/Utils/DomUtils.cs similarity index 100% rename from Source/HtmlRenderer/Utils/DomUtils.cs rename to Source/HtmlRenderer/Core/Utils/DomUtils.cs diff --git a/Source/HtmlRenderer/Utils/FontsUtils.cs b/Source/HtmlRenderer/Core/Utils/FontsUtils.cs similarity index 100% rename from Source/HtmlRenderer/Utils/FontsUtils.cs rename to Source/HtmlRenderer/Core/Utils/FontsUtils.cs diff --git a/Source/HtmlRenderer/Utils/HtmlUtils.cs b/Source/HtmlRenderer/Core/Utils/HtmlUtils.cs similarity index 100% rename from Source/HtmlRenderer/Utils/HtmlUtils.cs rename to Source/HtmlRenderer/Core/Utils/HtmlUtils.cs diff --git a/Source/HtmlRenderer/Images/ErrorImage.png b/Source/HtmlRenderer/Core/Utils/ImageError.png similarity index 100% rename from Source/HtmlRenderer/Images/ErrorImage.png rename to Source/HtmlRenderer/Core/Utils/ImageError.png diff --git a/Source/HtmlRenderer/Images/LoadImage.png b/Source/HtmlRenderer/Core/Utils/ImageLoad.png similarity index 100% rename from Source/HtmlRenderer/Images/LoadImage.png rename to Source/HtmlRenderer/Core/Utils/ImageLoad.png diff --git a/Source/HtmlRenderer/Utils/RenderUtils.cs b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs similarity index 94% rename from Source/HtmlRenderer/Utils/RenderUtils.cs rename to Source/HtmlRenderer/Core/Utils/RenderUtils.cs index 233cf1b77..b85ef4d35 100644 --- a/Source/HtmlRenderer/Utils/RenderUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs @@ -13,14 +13,14 @@ using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; +using System.Reflection; using HtmlRenderer.Dom; using HtmlRenderer.Entities; -using HtmlRenderer.Properties; namespace HtmlRenderer.Utils { /// - /// Provides some drawing functionallity + /// Provides some drawing functionality /// internal static class RenderUtils { @@ -268,7 +268,11 @@ public static GraphicsPath GetRoundRect(RectangleF rect, float nwRadius, float n private static Image GetLoadImage() { if( _loadImage == null ) - _loadImage = Resources.LoadImage; + { + var stream = Assembly.GetCallingAssembly().GetManifestResourceStream("HtmlRenderer.Core.Utils.ImageLoad.png"); + if( stream != null ) + _loadImage = Image.FromStream(stream); + } return _loadImage; } @@ -279,7 +283,11 @@ private static Image GetLoadImage() private static Image GetErrorImage() { if( _errorImage == null ) - _errorImage = Resources.ErrorImage; + { + var stream = Assembly.GetCallingAssembly().GetManifestResourceStream("HtmlRenderer.Core.Utils.ImageError.png"); + if (stream != null) + _errorImage = Image.FromStream(stream); + } return _errorImage; } diff --git a/Source/HtmlRenderer/Utils/StylesheetLoadHelper.cs b/Source/HtmlRenderer/Core/Utils/StylesheetLoadHelper.cs similarity index 94% rename from Source/HtmlRenderer/Utils/StylesheetLoadHelper.cs rename to Source/HtmlRenderer/Core/Utils/StylesheetLoadHelper.cs index 62b4bd63e..1eb0f1f97 100644 --- a/Source/HtmlRenderer/Utils/StylesheetLoadHelper.cs +++ b/Source/HtmlRenderer/Core/Utils/StylesheetLoadHelper.cs @@ -29,7 +29,7 @@ internal static class StylesheetLoadHelper /// the container of the html to handle load stylesheet for /// the source of the element to load the stylesheet by /// the attributes of the link element - public static string LoadStylesheet(HtmlContainer htmlContainer, string src, Dictionary attributes) + public static string LoadStylesheet(HtmlContainerBase htmlContainer, string src, Dictionary attributes) { ArgChecker.AssertArgNotNull(htmlContainer, "htmlContainer"); @@ -67,7 +67,7 @@ public static string LoadStylesheet(HtmlContainer htmlContainer, string src, Dic /// the container of the html to handle load stylesheet for /// the file path or uri to load the stylesheet from /// the stylesheet string - private static string LoadStylesheet(HtmlContainer htmlContainer, string src) + private static string LoadStylesheet(HtmlContainerBase htmlContainer, string src) { var uri = CommonUtils.TryGetUri(src); if (uri != null && uri.Scheme != "file") @@ -99,7 +99,7 @@ private static string LoadStylesheetFromUri(Uri uri) /// the container of the html to handle load stylesheet for /// the stylesheet file to load /// the loaded stylesheet string - private static string LoadStylesheetFromFile(HtmlContainer htmlContainer, string path) + private static string LoadStylesheetFromFile(HtmlContainerBase htmlContainer, string path) { var fileInfo = CommonUtils.TryGetFileInfo(path); if (fileInfo != null) diff --git a/Source/HtmlRenderer/HtmlRenderer.Core.csproj b/Source/HtmlRenderer/HtmlRenderer.Core.csproj new file mode 100644 index 000000000..0ac539e95 --- /dev/null +++ b/Source/HtmlRenderer/HtmlRenderer.Core.csproj @@ -0,0 +1,116 @@ + + + + + Debug + AnyCPU + {FE611685-391F-4E3E-B27E-D3150E51E49B} + Library + Properties + HtmlRenderer + HtmlRenderer + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/HtmlRenderer/HtmlRenderer.WPF.csproj b/Source/HtmlRenderer/HtmlRenderer.WPF.csproj new file mode 100644 index 000000000..4fdd34558 --- /dev/null +++ b/Source/HtmlRenderer/HtmlRenderer.WPF.csproj @@ -0,0 +1,59 @@ + + + + + Debug + AnyCPU + {7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0} + library + Properties + HtmlRenderer.WPF + HtmlRenderer.WPF + v3.5 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + Client + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release.WPF.Net35\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/HtmlRenderer/HtmlRendererNET35.csproj b/Source/HtmlRenderer/HtmlRenderer.WinForms.NET35.csproj similarity index 100% rename from Source/HtmlRenderer/HtmlRendererNET35.csproj rename to Source/HtmlRenderer/HtmlRenderer.WinForms.NET35.csproj diff --git a/Source/HtmlRenderer/HtmlRendererNET40.csproj b/Source/HtmlRenderer/HtmlRenderer.WinForms.NET40.csproj similarity index 100% rename from Source/HtmlRenderer/HtmlRendererNET40.csproj rename to Source/HtmlRenderer/HtmlRenderer.WinForms.NET40.csproj diff --git a/Source/HtmlRenderer/HtmlRendererNET45.csproj b/Source/HtmlRenderer/HtmlRenderer.WinForms.NET45.csproj similarity index 100% rename from Source/HtmlRenderer/HtmlRendererNET45.csproj rename to Source/HtmlRenderer/HtmlRenderer.WinForms.NET45.csproj diff --git a/Source/HtmlRenderer/HtmlRenderer.csproj b/Source/HtmlRenderer/HtmlRenderer.WinForms.csproj similarity index 50% rename from Source/HtmlRenderer/HtmlRenderer.csproj rename to Source/HtmlRenderer/HtmlRenderer.WinForms.csproj index 35c5a5e49..5c0de0fa6 100644 --- a/Source/HtmlRenderer/HtmlRenderer.csproj +++ b/Source/HtmlRenderer/HtmlRenderer.WinForms.csproj @@ -63,78 +63,80 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Component - + Component - - + + Component - - - - - - - - - - + + + + + + + + + + @@ -154,14 +156,13 @@ - - ResXFileCodeGenerator - Resources.Designer.cs - + + + + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\images\errorimage.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\images\loadimage.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Source/HtmlRenderer/WinForm/HtmlContainer.cs b/Source/HtmlRenderer/WinForm/HtmlContainer.cs new file mode 100644 index 000000000..2bd67a4eb --- /dev/null +++ b/Source/HtmlRenderer/WinForm/HtmlContainer.cs @@ -0,0 +1,154 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System.Drawing; +using System.Windows.Forms; +using HtmlRenderer.Entities; +using HtmlRenderer.Parse; +using HtmlRenderer.Utils; + +namespace HtmlRenderer +{ + /// + /// Low level handling of Html Renderer logic, this class is used by , + /// , and .
+ ///
+ /// + public sealed class HtmlContainer : HtmlContainerBase + { + /// + /// Measures the bounds of box and children, recursively. + /// + /// Device context to draw + public void PerformLayout(Graphics g) + { + ArgChecker.AssertArgNotNull(g, "g"); + + using(var ig = new WinFormsGraphics(g)) + { + PerformLayout(ig); + } + } + + /// + /// Render the html using the given device. + /// + /// the device to use to render + public void PerformPaint(Graphics g) + { + ArgChecker.AssertArgNotNull(g, "g"); + + using(var ig = new WinFormsGraphics(g)) + { + PerformPaint(ig); + } + } + + + /// + /// Handle mouse down to handle selection. + /// + /// the control hosting the html to invalidate + /// the mouse event args + public void HandleMouseDown(Control parent, MouseEventArgs e) + { + ArgChecker.AssertArgNotNull(parent, "parent"); + ArgChecker.AssertArgNotNull(e, "e"); + + HandleMouseDown(new WinFormsControl(parent), e.Location); + } + + /// + /// Handle mouse up to handle selection and link click. + /// + /// the control hosting the html to invalidate + /// the mouse event args + public void HandleMouseUp(Control parent, MouseEventArgs e) + { + ArgChecker.AssertArgNotNull(parent, "parent"); + ArgChecker.AssertArgNotNull(e, "e"); + + HandleMouseUp(new WinFormsControl(parent), e.Location, CreateMouseEvent(e)); + } + + /// + /// Handle mouse double click to select word under the mouse. + /// + /// the control hosting the html to set cursor and invalidate + /// mouse event args + public void HandleMouseDoubleClick(Control parent, MouseEventArgs e) + { + ArgChecker.AssertArgNotNull(parent, "parent"); + ArgChecker.AssertArgNotNull(e, "e"); + + HandleMouseDoubleClick(new WinFormsControl(parent), e.Location); + } + + /// + /// Handle mouse move to handle hover cursor and text selection. + /// + /// the control hosting the html to set cursor and invalidate + /// the mouse event args + public void HandleMouseMove(Control parent, MouseEventArgs e) + { + ArgChecker.AssertArgNotNull(parent, "parent"); + ArgChecker.AssertArgNotNull(e, "e"); + + HandleMouseMove(new WinFormsControl(parent), e.Location); + } + + /// + /// Handle mouse leave to handle hover cursor. + /// + /// the control hosting the html to set cursor and invalidate + public void HandleMouseLeave(Control parent) + { + ArgChecker.AssertArgNotNull(parent, "parent"); + + HandleMouseLeave(new WinFormsControl(parent)); + } + + /// + /// Handle key down event for selection and copy. + /// + /// the control hosting the html to invalidate + /// the pressed key + public void HandleKeyDown(Control parent, KeyEventArgs e) + { + ArgChecker.AssertArgNotNull(parent, "parent"); + ArgChecker.AssertArgNotNull(e, "e"); + + HandleKeyDown(new WinFormsControl(parent),CreateKeyEevent(e)); + } + + + #region Private methods + + /// + /// Create HtmlRenderer mouse event from win forms mouse event. + /// + private static MouseEvent CreateMouseEvent(MouseEventArgs e) + { + return new MouseEvent((e.Button & MouseButtons.Left) != 0); + } + + /// + /// Create HtmlRenderer key event from win forms key event. + /// + private KeyEvent CreateKeyEevent(KeyEventArgs e) + { + return new KeyEvent(e.Control, e.KeyCode == Keys.A, e.KeyCode == Keys.C); + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/HtmlRenderer/HtmlLabel.cs b/Source/HtmlRenderer/WinForm/HtmlLabel.cs similarity index 100% rename from Source/HtmlRenderer/HtmlLabel.cs rename to Source/HtmlRenderer/WinForm/HtmlLabel.cs diff --git a/Source/HtmlRenderer/HtmlPanel.cs b/Source/HtmlRenderer/WinForm/HtmlPanel.cs similarity index 100% rename from Source/HtmlRenderer/HtmlPanel.cs rename to Source/HtmlRenderer/WinForm/HtmlPanel.cs diff --git a/Source/HtmlRenderer/HtmlRender.cs b/Source/HtmlRenderer/WinForm/HtmlRender.cs similarity index 99% rename from Source/HtmlRenderer/HtmlRender.cs rename to Source/HtmlRenderer/WinForm/HtmlRender.cs index 2c387a62b..1c752addc 100644 --- a/Source/HtmlRenderer/HtmlRender.cs +++ b/Source/HtmlRenderer/WinForm/HtmlRender.cs @@ -21,7 +21,7 @@ namespace HtmlRenderer { /// - /// Static class for direct html rendering, intendent for small html fragments.
+ /// Static class for direct html rendering, intended for small html fragments.
/// Prefer using WinForms Html controls: or . /// For direct non-trivial html rendering consider using . ///
diff --git a/Source/HtmlRenderer/HtmlToolTip.cs b/Source/HtmlRenderer/WinForm/HtmlToolTip.cs similarity index 100% rename from Source/HtmlRenderer/HtmlToolTip.cs rename to Source/HtmlRenderer/WinForm/HtmlToolTip.cs diff --git a/Source/HtmlRenderer/Utils/HtmlClipboardUtils.cs b/Source/HtmlRenderer/WinForm/Utils/HtmlClipboardUtils.cs similarity index 98% rename from Source/HtmlRenderer/Utils/HtmlClipboardUtils.cs rename to Source/HtmlRenderer/WinForm/Utils/HtmlClipboardUtils.cs index 683d23d1b..b06512229 100644 --- a/Source/HtmlRenderer/Utils/HtmlClipboardUtils.cs +++ b/Source/HtmlRenderer/WinForm/Utils/HtmlClipboardUtils.cs @@ -58,7 +58,7 @@ public static DataObject GetDataObject(string html, string plainText) /// http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/clipboard/htmlclipboard.asp /// /// - /// HtmlClipboardUtils.CopyToClipboard("Hello!"); + /// HtmlClipboardUtils.SetToClipboard("Hello!"); /// /// a html fragment /// the plain text diff --git a/Source/HtmlRenderer/Utils/Win32Utils.cs b/Source/HtmlRenderer/WinForm/Utils/Win32Utils.cs similarity index 99% rename from Source/HtmlRenderer/Utils/Win32Utils.cs rename to Source/HtmlRenderer/WinForm/Utils/Win32Utils.cs index fd60e62a5..819293aee 100644 --- a/Source/HtmlRenderer/Utils/Win32Utils.cs +++ b/Source/HtmlRenderer/WinForm/Utils/Win32Utils.cs @@ -156,7 +156,7 @@ public static Rectangle GetWindowRectangle(IntPtr handle) } [StructLayout(LayoutKind.Sequential)] - public struct BlendFunction + internal struct BlendFunction { public byte BlendOp; public byte BlendFlags; @@ -173,7 +173,7 @@ public BlendFunction(byte alpha) } [StructLayout(LayoutKind.Sequential)] - public struct BitMapInfo + internal struct BitMapInfo { public int biSize; public int biWidth; diff --git a/Source/HtmlRenderer/WinForm/Utils/WinFormsContextMenu.cs b/Source/HtmlRenderer/WinForm/Utils/WinFormsContextMenu.cs new file mode 100644 index 000000000..67727b531 --- /dev/null +++ b/Source/HtmlRenderer/WinForm/Utils/WinFormsContextMenu.cs @@ -0,0 +1,104 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System; +using System.Drawing; +using System.Windows.Forms; +using HtmlRenderer.Core.Entities; +using HtmlRenderer.Entities; + +namespace HtmlRenderer.Utils +{ + /// + /// atodo: add doc + /// + internal sealed class WinFormsContextMenu : IContextMenu + { + #region Fields and Consts + + /// + /// the underline win forms context menu + /// + private readonly ContextMenuStrip _contextMenu; + + #endregion + + + /// + /// Init. + /// + public WinFormsContextMenu() + { + _contextMenu = new ContextMenuStrip(); + _contextMenu.ShowImageMargin = false; + } + + /// + /// The total number of items in the context menu + /// + public int ItemsCount + { + get { return _contextMenu.Items.Count; } + } + + /// + /// Add divider item to the context menu.
+ /// The divider is a non clickable place holder used to separate items. + ///
+ public void AddDivider() + { + _contextMenu.Items.Add("-"); + } + + /// + /// Add item to the context menu with the given text that will raise the given event when clicked. + /// + /// the text to set on the new context menu item + /// if to set the item as enabled or disabled + /// the event to raise when the item is clicked + public void AddItem(string text, bool enabled, EventHandler onClick) + { + ArgChecker.AssertArgNotNullOrEmpty(text, "text"); + ArgChecker.AssertArgNotNull(onClick, "onClick"); + + var item = _contextMenu.Items.Add(text, null, onClick); + item.Enabled = enabled; + } + + /// + /// Remove the last item from the context menu iff it is a divider + /// + public void RemoveLastDivider() + { + if (_contextMenu.Items[_contextMenu.Items.Count - 1].Text == string.Empty) + _contextMenu.Items.RemoveAt(_contextMenu.Items.Count - 1); + } + + /// + /// Show the context menu in the given parent control at the given location. + /// + /// the parent control to show in + /// the location to show at relative to the parent control + public void Show(IControl parent, Point location) + { + _contextMenu.Show(((WinFormsControl)parent).Control, location); + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + _contextMenu.Dispose(); + } + } +} diff --git a/Source/HtmlRenderer/WinForm/Utils/WinFormsControl.cs b/Source/HtmlRenderer/WinForm/Utils/WinFormsControl.cs new file mode 100644 index 000000000..61a3a94eb --- /dev/null +++ b/Source/HtmlRenderer/WinForm/Utils/WinFormsControl.cs @@ -0,0 +1,193 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System.Drawing; +using System.Windows.Forms; +using HtmlRenderer.Core.Entities; +using HtmlRenderer.Entities; + +namespace HtmlRenderer.Utils +{ + /// + /// atodo: add doc + /// + internal sealed class WinFormsControl : IControl + { + /// + /// the underline win forms control. + /// + private readonly Control _control; + + /// + /// Init. + /// + public WinFormsControl(Control control) + { + ArgChecker.AssertArgNotNull(control, "control"); + + _control = control; + } + + /// + /// Get the current location of the mouse relative to the control + /// + public Point MouseLocation + { + get { return _control.PointToClient(Control.MousePosition); } + } + + /// + /// Is the left mouse button is currently in pressed state + /// + public bool LeftMouseButton + { + get { return (Control.MouseButtons & MouseButtons.Left) != 0; } + } + + /// + /// Is the right mouse button is currently in pressed state + /// + public bool RightMouseButton + { + get { return (Control.MouseButtons & MouseButtons.Right) != 0; } + } + + /// + /// Get the underline win forms control + /// + public Control Control + { + get { return _control; } + } + + /// + /// Set the cursor over the control to default cursor + /// + public void SetCursorDefault() + { + _control.Cursor = Cursors.Default; + } + + /// + /// Set the cursor over the control to hand cursor + /// + public void SetCursorHand() + { + _control.Cursor = Cursors.Hand; + } + + /// + /// Set the cursor over the control to I beam cursor + /// + public void SetCursorIBeam() + { + _control.Cursor = Cursors.IBeam; + } + + /// + /// Get data object for the given html and plain text data.
+ /// The data object can be used for clipboard or drag-drop operation. + ///
+ /// the html data + /// the plain text data + /// drag-drop data object + public object GetDataObject(string html, string plainText) + { + return HtmlClipboardUtils.GetDataObject(html, plainText); + } + + /// + /// Set the given text to the clipboard + /// + /// the text to set + public void SetToClipboard(string text) + { + Clipboard.SetText(text); + } + + /// + /// Copy the given html and plain text data to clipboard. + /// + /// the html data + /// the plain text data + public void SetToClipboard(string html, string plainText) + { + HtmlClipboardUtils.CopyToClipboard(html, plainText); + } + + /// + /// Set the given image to clipboard. + /// + /// + public void SetToClipboard(Image image) + { + Clipboard.SetImage(image); + } + + /// + /// Do drag-drop copy operation for the given data object. + /// + /// the data object + public void DoDragDropCopy(object dragDropData) + { + _control.DoDragDrop(dragDropData, DragDropEffects.Copy); + } + + /// + /// Create graphics object that can be used with the control. + /// + /// graphics object + public IGraphics CreateGraphics() + { + // the win forms graphics object will be disposed by WinGraphics + return new WinFormsGraphics(_control.CreateGraphics(), true); + } + + /// + /// Invalidates the entire surface of the control and causes the control to be redrawn. + /// + public void Invalidate() + { + _control.Invalidate(); + } + + /// + /// Create a context menu that can be used on the control + /// + /// new context menu + public IContextMenu CreateContextMenu() + { + return new WinFormsContextMenu(); + } + + /// + /// Save the given image to file by showing save dialog to the client. + /// + /// the image to save + /// the name of the image for save dialog + /// the extension of the image for save dialog + public void SaveToFile(Image image, string name, string extension) + { + using (var saveDialog = new SaveFileDialog()) + { + saveDialog.Filter = "Images|*.png;*.bmp;*.jpg"; + saveDialog.FileName = name; + saveDialog.DefaultExt = extension; + + if (saveDialog.ShowDialog(_control) == DialogResult.OK) + { + image.Save(saveDialog.FileName); + } + } + } + } +} diff --git a/Source/HtmlRenderer/WinGraphics.cs b/Source/HtmlRenderer/WinForm/Utils/WinFormsGraphics.cs similarity index 95% rename from Source/HtmlRenderer/WinGraphics.cs rename to Source/HtmlRenderer/WinForm/Utils/WinFormsGraphics.cs index 16accc188..b42094ad4 100644 --- a/Source/HtmlRenderer/WinGraphics.cs +++ b/Source/HtmlRenderer/WinForm/Utils/WinFormsGraphics.cs @@ -13,14 +13,13 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; -using HtmlRenderer.Utils; -namespace HtmlRenderer +namespace HtmlRenderer.Utils { /// - /// + /// atodo: add doc /// - internal sealed class WinGraphics : IGraphics + internal sealed class WinFormsGraphics : IGraphics { #region Fields and Consts @@ -39,6 +38,11 @@ internal sealed class WinGraphics : IGraphics /// private readonly Graphics _g; + /// + /// if to release the graphics object on dispose + /// + private readonly bool _releaseGraphics; + /// /// the initialized HDC used /// @@ -50,9 +54,14 @@ internal sealed class WinGraphics : IGraphics /// /// Init. /// - public WinGraphics(Graphics g) + /// the win forms graphics object to use + /// optional: if to release the graphics object on dispose (default - false) + public WinFormsGraphics(Graphics g, bool releaseGraphics = false) { + ArgChecker.AssertArgNotNull(g, "g"); + _g = g; + _releaseGraphics = releaseGraphics; } /// @@ -153,6 +162,8 @@ public void DrawString(String str, Font font, Color color, PointF point, SizeF s public void Dispose() { ReleaseHdc(); + if(_releaseGraphics) + _g.Dispose(); } From 35853ca64cdd0c42e68455c078e655d5d778ebd0 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 26 Oct 2013 20:40:36 +0300 Subject: [PATCH 004/254] create WPF demo project --- Source/Demo/DemoForm.cs | 94 ++++++------- Source/Demo/HtmlRenderer.Demo.WinForms.csproj | 128 +---------------- Source/Demo/PerfForm.cs | 2 +- Source/Demo/SampleForm.cs | 2 +- .../HtmlRenderer.Demo.Common.csproj | 129 ++++++++++++++++++ .../PerfSamples/1.Big table.htm | 0 .../Properties/AssemblyInfo.cs | 36 +++++ .../Properties/Resources.Designer.cs | 34 ++--- .../Properties/Resources.resx | 0 .../Resources/CustomFont.ttf | Bin .../Resources/Event16.png | Bin .../Resources/Window.gif | Bin .../Resources/comment16.gif | Bin .../Resources/delete16.gif | Bin .../Resources/delete32.gif | Bin .../Resources/exclamation32.png | Bin .../Resources/favorites32.png | Bin .../Resources/font32.png | Bin .../Resources/formula32.png | Bin .../Resources/html.ico | Bin .../Resources/html32.png | Bin .../Resources/image32.png | Bin .../Resources/method16.gif | Bin .../Resources/paly32.png | Bin .../Resources/property16.gif | Bin .../Resources/property32.png | Bin .../Resources/refreshdocument32.png | Bin .../Resources/web_pallete.gif | Bin .../Samples/00.Intro.htm | 0 .../Samples/01.History.htm | 0 .../Samples/02.Text.htm | 0 .../Samples/03.Tables.htm | 0 .../Samples/04.Links.htm | 0 .../Samples/05.Images.htm | 0 .../Samples/06.Embeded video.htm | 0 .../Samples/07.Additional features.htm | 0 .../Samples/08.Tooltip.htm | 0 .../Samples/09.Using the library.htm | 0 .../Samples/10.HtmlPanel.htm | 0 .../Samples/11.HtmlLabel.htm | 0 .../Samples/12.HtmlToolTip.htm | 0 .../Samples/13.HtmlRender.htm | 0 .../Samples/14.HtmlContainer.htm | 0 .../Samples/20.About.htm | 0 .../HtmlRenderer.Demo.Common/SamplesLoader.cs | 112 +++++++++++++++ .../TestSamples/01.Header.htm | 0 .../TestSamples/02.Line break.htm | 0 .../TestSamples/03.Paragraphs.htm | 0 .../TestSamples/04.Blockquotes.htm | 0 .../TestSamples/05.Images.htm | 0 .../TestSamples/06.External Image.htm | 0 .../TestSamples/07.Background Image.htm | 0 .../TestSamples/08.White-space.htm | 0 .../TestSamples/09.Inline.htm | 0 .../TestSamples/10.BlockInInline.htm | 0 .../TestSamples/11.LineHeight.htm | 0 .../TestSamples/12.Text.htm | 0 .../TestSamples/13.Tables.htm | 0 .../TestSamples/14.Iframes.htm | 0 .../TestSamples/15.MaxWidth.htm | 0 .../TestSamples/16.Borders.htm | 0 .../TestSamples/17.Languages.htm | 0 .../TestSamples/18.Anchors.htm | 0 .../TestSamples/19.Many images.htm | 0 .../TestSamples/20.Fonts decorations.htm | 0 .../TestSamples/21.Bullets.htm | 0 .../TestSamples/30.Misc.htm | 0 .../TestSamples/31.ACID 1.htm | 0 Source/HtmlRenderer.Demo.WPF/App.xaml | 8 ++ Source/HtmlRenderer.Demo.WPF/App.xaml.cs | 21 +++ Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml | 26 ++++ .../HtmlRenderer.Demo.WPF/DemoWindow.xaml.cs | 25 ++++ .../HtmlRenderer.Demo.WPF.csproj | 94 +++++++++++++ .../Properties/AssemblyInfo.cs | 53 +++++++ .../Properties/Resources.Designer.cs | 71 ++++++++++ .../Properties/Resources.resx | 117 ++++++++++++++++ .../Properties/Settings.Designer.cs | 30 ++++ .../Properties/Settings.settings | 7 + Source/HtmlRenderer.sln | 28 +++- 79 files changed, 823 insertions(+), 194 deletions(-) create mode 100644 Source/HtmlRenderer.Demo.Common/HtmlRenderer.Demo.Common.csproj rename Source/{Demo => HtmlRenderer.Demo.Common}/PerfSamples/1.Big table.htm (100%) create mode 100644 Source/HtmlRenderer.Demo.Common/Properties/AssemblyInfo.cs rename Source/{Demo => HtmlRenderer.Demo.Common}/Properties/Resources.Designer.cs (87%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Properties/Resources.resx (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/CustomFont.ttf (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/Event16.png (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/Window.gif (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/comment16.gif (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/delete16.gif (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/delete32.gif (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/exclamation32.png (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/favorites32.png (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/font32.png (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/formula32.png (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/html.ico (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/html32.png (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/image32.png (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/method16.gif (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/paly32.png (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/property16.gif (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/property32.png (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/refreshdocument32.png (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Resources/web_pallete.gif (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/00.Intro.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/01.History.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/02.Text.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/03.Tables.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/04.Links.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/05.Images.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/06.Embeded video.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/07.Additional features.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/08.Tooltip.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/09.Using the library.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/10.HtmlPanel.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/11.HtmlLabel.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/12.HtmlToolTip.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/13.HtmlRender.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/14.HtmlContainer.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/Samples/20.About.htm (100%) create mode 100644 Source/HtmlRenderer.Demo.Common/SamplesLoader.cs rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/01.Header.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/02.Line break.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/03.Paragraphs.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/04.Blockquotes.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/05.Images.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/06.External Image.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/07.Background Image.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/08.White-space.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/09.Inline.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/10.BlockInInline.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/11.LineHeight.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/12.Text.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/13.Tables.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/14.Iframes.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/15.MaxWidth.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/16.Borders.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/17.Languages.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/18.Anchors.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/19.Many images.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/20.Fonts decorations.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/21.Bullets.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/30.Misc.htm (100%) rename Source/{Demo => HtmlRenderer.Demo.Common}/TestSamples/31.ACID 1.htm (100%) create mode 100644 Source/HtmlRenderer.Demo.WPF/App.xaml create mode 100644 Source/HtmlRenderer.Demo.WPF/App.xaml.cs create mode 100644 Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml create mode 100644 Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml.cs create mode 100644 Source/HtmlRenderer.Demo.WPF/HtmlRenderer.Demo.WPF.csproj create mode 100644 Source/HtmlRenderer.Demo.WPF/Properties/AssemblyInfo.cs create mode 100644 Source/HtmlRenderer.Demo.WPF/Properties/Resources.Designer.cs create mode 100644 Source/HtmlRenderer.Demo.WPF/Properties/Resources.resx create mode 100644 Source/HtmlRenderer.Demo.WPF/Properties/Settings.Designer.cs create mode 100644 Source/HtmlRenderer.Demo.WPF/Properties/Settings.settings diff --git a/Source/Demo/DemoForm.cs b/Source/Demo/DemoForm.cs index ac66e1190..373b95734 100644 --- a/Source/Demo/DemoForm.cs +++ b/Source/Demo/DemoForm.cs @@ -16,13 +16,12 @@ using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Text; -using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; -using System.Reflection; using System.IO; -using HtmlRenderer.Demo.WinForms.Properties; +using HtmlRenderer.Demo.Common; +using HtmlRenderer.Demo.Common.Properties; using HtmlRenderer.Entities; using Timer = System.Threading.Timer; @@ -31,6 +30,11 @@ namespace HtmlRenderer.Demo.WinForms public partial class DemoForm : Form { #region Fields and Consts + + /// + /// the name of the tree node root for all performance samples + /// + private const string PerformanceSamplesTreeNodeName = "Performance Samples"; /// /// Cache for resource images @@ -103,67 +107,53 @@ public DemoForm() /// private void LoadSamples() { - var root = new TreeNode("HTML Renderer"); - _samplesTreeView.Nodes.Add(root); - + var showcaseRoot = new TreeNode("HTML Renderer"); + _samplesTreeView.Nodes.Add(showcaseRoot); + + foreach(var sample in SamplesLoader.ShowcaseSamples) + { + _perfTestSamples.Add(sample.Value); + AddTreeNode(showcaseRoot, sample.Key, sample.Value); + } + var testSamplesRoot = new TreeNode("Test Samples"); _samplesTreeView.Nodes.Add(testSamplesRoot); - var perfTestSamplesRoot = new TreeNode("Performance Samples"); - _samplesTreeView.Nodes.Add(perfTestSamplesRoot); - - var names = Assembly.GetExecutingAssembly().GetManifestResourceNames(); - Array.Sort(names); - foreach (string name in names) + foreach (var sample in SamplesLoader.TestSamples) { - int extPos = name.LastIndexOf('.'); - int namePos = extPos > 0 && name.Length > 1 ? name.LastIndexOf('.', extPos - 1) : 0; - string ext = name.Substring(extPos >= 0 ? extPos : 0); - string shortName = namePos > 0 && name.Length > 2 ? name.Substring(namePos + 1, name.Length - namePos - ext.Length - 1) : name; + AddTreeNode(testSamplesRoot, sample.Key, sample.Value); + } - if (".htm".IndexOf(ext, StringComparison.Ordinal) >= 0) + if( SamplesLoader.PerformanceSamples.Count > 0 ) + { + var perfTestSamplesRoot = new TreeNode(PerformanceSamplesTreeNodeName); + _samplesTreeView.Nodes.Add(perfTestSamplesRoot); + + foreach(var sample in SamplesLoader.PerformanceSamples) { - var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name); - if (resourceStream != null) - { - using (var sreader = new StreamReader(resourceStream, Encoding.Default)) - { - var html = sreader.ReadToEnd(); - html = html.Replace("$$Release$$", _htmlPanel.GetType().Assembly.GetName().Version.ToString()); - _samples[name] = html; - } - - var node = new TreeNode(shortName); - if (name.Contains("TestSamples.")) - { - testSamplesRoot.Nodes.Add(node); - } - else if (name.Contains("PerfSamples")) - { - perfTestSamplesRoot.Nodes.Add(node); - } - else - { - root.Nodes.Add(node); - _perfTestSamples.Add(_samples[name]); - } - node.Tag = name; - } + AddTreeNode(perfTestSamplesRoot, sample.Key, sample.Value); } } - root.Expand(); - //testSamplesRoot.Expand(); + showcaseRoot.Expand(); - if (perfTestSamplesRoot.Nodes.Count < 1) + if (showcaseRoot.Nodes.Count > 0) { - perfTestSamplesRoot.Remove(); + _samplesTreeView.SelectedNode = showcaseRoot.Nodes[0]; } + } - if (root.Nodes.Count > 0) - { - _samplesTreeView.SelectedNode = root.Nodes[0]; - } + /// + /// Add an html sample to the tree and to all samples collection + /// + private void AddTreeNode(TreeNode root, string name, string html) + { + html = html.Replace("$$Release$$", _htmlPanel.GetType().Assembly.GetName().Version.ToString()); + _samples[name] = html; + + var node = new TreeNode(name); + node.Tag = name; + root.Nodes.Add(node); } /// @@ -195,7 +185,7 @@ private void OnSamplesTreeViewAfterSelect(object sender, TreeViewEventArgs e) string html = _samples[name]; - if (!name.Contains("PerfSamples")) + if (e.Node.Parent.Text != PerformanceSamplesTreeNodeName) SyntaxHilight.AddColoredText(html, _htmlEditor); else _htmlEditor.Text = html; diff --git a/Source/Demo/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/HtmlRenderer.Demo.WinForms.csproj index 37f92484c..c70a9c07e 100644 --- a/Source/Demo/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/HtmlRenderer.Demo.WinForms.csproj @@ -55,7 +55,8 @@ x86 - Resources\html.ico + + @@ -88,16 +89,6 @@ Designer DemoForm.cs - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - Form @@ -106,86 +97,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer SampleForm.cs - - - - - - - - - - - @@ -205,47 +121,15 @@ + + {2390b71f-9400-47f4-b23a-7f2649c87d35} + HtmlRenderer.Demo.Common + {1B058920-24B4-4140-8AE7-C8C6C38CA52D} HtmlRenderer.WinForms - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/Source/Demo/PerfSamples/1.Big table.htm b/Source/HtmlRenderer.Demo.Common/PerfSamples/1.Big table.htm similarity index 100% rename from Source/Demo/PerfSamples/1.Big table.htm rename to Source/HtmlRenderer.Demo.Common/PerfSamples/1.Big table.htm diff --git a/Source/HtmlRenderer.Demo.Common/Properties/AssemblyInfo.cs b/Source/HtmlRenderer.Demo.Common/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..8ffada694 --- /dev/null +++ b/Source/HtmlRenderer.Demo.Common/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("HtmlRenderer.Demo.Common")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("HtmlRenderer.Demo.Common")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5d5516c9-aa2c-44cc-883c-467ff9a3d9b9")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Source/Demo/Properties/Resources.Designer.cs b/Source/HtmlRenderer.Demo.Common/Properties/Resources.Designer.cs similarity index 87% rename from Source/Demo/Properties/Resources.Designer.cs rename to Source/HtmlRenderer.Demo.Common/Properties/Resources.Designer.cs index 8fcdb1358..4dde5b5a6 100644 --- a/Source/Demo/Properties/Resources.Designer.cs +++ b/Source/HtmlRenderer.Demo.Common/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace HtmlRenderer.Demo.WinForms.Properties { +namespace HtmlRenderer.Demo.Common.Properties { using System; @@ -22,7 +22,7 @@ namespace HtmlRenderer.Demo.WinForms.Properties { [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { + public class Resources { private static global::System.Resources.ResourceManager resourceMan; @@ -36,10 +36,10 @@ internal Resources() { /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HtmlRenderer.Demo.WinForms.Properties.Resources", typeof(Resources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HtmlRenderer.Demo.Common.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; @@ -51,7 +51,7 @@ internal Resources() { /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -63,7 +63,7 @@ internal Resources() { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap comment16 { + public static System.Drawing.Bitmap comment16 { get { object obj = ResourceManager.GetObject("comment16", resourceCulture); return ((System.Drawing.Bitmap)(obj)); @@ -73,7 +73,7 @@ internal static System.Drawing.Bitmap comment16 { /// /// Looks up a localized resource of type System.Byte[]. /// - internal static byte[] CustomFont { + public static byte[] CustomFont { get { object obj = ResourceManager.GetObject("CustomFont", resourceCulture); return ((byte[])(obj)); @@ -83,7 +83,7 @@ internal static byte[] CustomFont { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap Event16 { + public static System.Drawing.Bitmap Event16 { get { object obj = ResourceManager.GetObject("Event16", resourceCulture); return ((System.Drawing.Bitmap)(obj)); @@ -93,7 +93,7 @@ internal static System.Drawing.Bitmap Event16 { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap favorites32 { + public static System.Drawing.Bitmap favorites32 { get { object obj = ResourceManager.GetObject("favorites32", resourceCulture); return ((System.Drawing.Bitmap)(obj)); @@ -103,7 +103,7 @@ internal static System.Drawing.Bitmap favorites32 { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap font32 { + public static System.Drawing.Bitmap font32 { get { object obj = ResourceManager.GetObject("font32", resourceCulture); return ((System.Drawing.Bitmap)(obj)); @@ -113,7 +113,7 @@ internal static System.Drawing.Bitmap font32 { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon html { + public static System.Drawing.Icon html { get { object obj = ResourceManager.GetObject("html", resourceCulture); return ((System.Drawing.Icon)(obj)); @@ -123,7 +123,7 @@ internal static System.Drawing.Icon html { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap html32 { + public static System.Drawing.Bitmap html32 { get { object obj = ResourceManager.GetObject("html32", resourceCulture); return ((System.Drawing.Bitmap)(obj)); @@ -133,7 +133,7 @@ internal static System.Drawing.Bitmap html32 { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap image32 { + public static System.Drawing.Bitmap image32 { get { object obj = ResourceManager.GetObject("image32", resourceCulture); return ((System.Drawing.Bitmap)(obj)); @@ -143,7 +143,7 @@ internal static System.Drawing.Bitmap image32 { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap method16 { + public static System.Drawing.Bitmap method16 { get { object obj = ResourceManager.GetObject("method16", resourceCulture); return ((System.Drawing.Bitmap)(obj)); @@ -153,7 +153,7 @@ internal static System.Drawing.Bitmap method16 { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap property16 { + public static System.Drawing.Bitmap property16 { get { object obj = ResourceManager.GetObject("property16", resourceCulture); return ((System.Drawing.Bitmap)(obj)); @@ -173,7 +173,7 @@ internal static System.Drawing.Bitmap property16 { /// </tr> /// [rest of string was truncated]";. /// - internal static string Tooltip { + public static string Tooltip { get { return ResourceManager.GetString("Tooltip", resourceCulture); } @@ -182,7 +182,7 @@ internal static string Tooltip { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap web_pallete { + public static System.Drawing.Bitmap web_pallete { get { object obj = ResourceManager.GetObject("web_pallete", resourceCulture); return ((System.Drawing.Bitmap)(obj)); diff --git a/Source/Demo/Properties/Resources.resx b/Source/HtmlRenderer.Demo.Common/Properties/Resources.resx similarity index 100% rename from Source/Demo/Properties/Resources.resx rename to Source/HtmlRenderer.Demo.Common/Properties/Resources.resx diff --git a/Source/Demo/Resources/CustomFont.ttf b/Source/HtmlRenderer.Demo.Common/Resources/CustomFont.ttf similarity index 100% rename from Source/Demo/Resources/CustomFont.ttf rename to Source/HtmlRenderer.Demo.Common/Resources/CustomFont.ttf diff --git a/Source/Demo/Resources/Event16.png b/Source/HtmlRenderer.Demo.Common/Resources/Event16.png similarity index 100% rename from Source/Demo/Resources/Event16.png rename to Source/HtmlRenderer.Demo.Common/Resources/Event16.png diff --git a/Source/Demo/Resources/Window.gif b/Source/HtmlRenderer.Demo.Common/Resources/Window.gif similarity index 100% rename from Source/Demo/Resources/Window.gif rename to Source/HtmlRenderer.Demo.Common/Resources/Window.gif diff --git a/Source/Demo/Resources/comment16.gif b/Source/HtmlRenderer.Demo.Common/Resources/comment16.gif similarity index 100% rename from Source/Demo/Resources/comment16.gif rename to Source/HtmlRenderer.Demo.Common/Resources/comment16.gif diff --git a/Source/Demo/Resources/delete16.gif b/Source/HtmlRenderer.Demo.Common/Resources/delete16.gif similarity index 100% rename from Source/Demo/Resources/delete16.gif rename to Source/HtmlRenderer.Demo.Common/Resources/delete16.gif diff --git a/Source/Demo/Resources/delete32.gif b/Source/HtmlRenderer.Demo.Common/Resources/delete32.gif similarity index 100% rename from Source/Demo/Resources/delete32.gif rename to Source/HtmlRenderer.Demo.Common/Resources/delete32.gif diff --git a/Source/Demo/Resources/exclamation32.png b/Source/HtmlRenderer.Demo.Common/Resources/exclamation32.png similarity index 100% rename from Source/Demo/Resources/exclamation32.png rename to Source/HtmlRenderer.Demo.Common/Resources/exclamation32.png diff --git a/Source/Demo/Resources/favorites32.png b/Source/HtmlRenderer.Demo.Common/Resources/favorites32.png similarity index 100% rename from Source/Demo/Resources/favorites32.png rename to Source/HtmlRenderer.Demo.Common/Resources/favorites32.png diff --git a/Source/Demo/Resources/font32.png b/Source/HtmlRenderer.Demo.Common/Resources/font32.png similarity index 100% rename from Source/Demo/Resources/font32.png rename to Source/HtmlRenderer.Demo.Common/Resources/font32.png diff --git a/Source/Demo/Resources/formula32.png b/Source/HtmlRenderer.Demo.Common/Resources/formula32.png similarity index 100% rename from Source/Demo/Resources/formula32.png rename to Source/HtmlRenderer.Demo.Common/Resources/formula32.png diff --git a/Source/Demo/Resources/html.ico b/Source/HtmlRenderer.Demo.Common/Resources/html.ico similarity index 100% rename from Source/Demo/Resources/html.ico rename to Source/HtmlRenderer.Demo.Common/Resources/html.ico diff --git a/Source/Demo/Resources/html32.png b/Source/HtmlRenderer.Demo.Common/Resources/html32.png similarity index 100% rename from Source/Demo/Resources/html32.png rename to Source/HtmlRenderer.Demo.Common/Resources/html32.png diff --git a/Source/Demo/Resources/image32.png b/Source/HtmlRenderer.Demo.Common/Resources/image32.png similarity index 100% rename from Source/Demo/Resources/image32.png rename to Source/HtmlRenderer.Demo.Common/Resources/image32.png diff --git a/Source/Demo/Resources/method16.gif b/Source/HtmlRenderer.Demo.Common/Resources/method16.gif similarity index 100% rename from Source/Demo/Resources/method16.gif rename to Source/HtmlRenderer.Demo.Common/Resources/method16.gif diff --git a/Source/Demo/Resources/paly32.png b/Source/HtmlRenderer.Demo.Common/Resources/paly32.png similarity index 100% rename from Source/Demo/Resources/paly32.png rename to Source/HtmlRenderer.Demo.Common/Resources/paly32.png diff --git a/Source/Demo/Resources/property16.gif b/Source/HtmlRenderer.Demo.Common/Resources/property16.gif similarity index 100% rename from Source/Demo/Resources/property16.gif rename to Source/HtmlRenderer.Demo.Common/Resources/property16.gif diff --git a/Source/Demo/Resources/property32.png b/Source/HtmlRenderer.Demo.Common/Resources/property32.png similarity index 100% rename from Source/Demo/Resources/property32.png rename to Source/HtmlRenderer.Demo.Common/Resources/property32.png diff --git a/Source/Demo/Resources/refreshdocument32.png b/Source/HtmlRenderer.Demo.Common/Resources/refreshdocument32.png similarity index 100% rename from Source/Demo/Resources/refreshdocument32.png rename to Source/HtmlRenderer.Demo.Common/Resources/refreshdocument32.png diff --git a/Source/Demo/Resources/web_pallete.gif b/Source/HtmlRenderer.Demo.Common/Resources/web_pallete.gif similarity index 100% rename from Source/Demo/Resources/web_pallete.gif rename to Source/HtmlRenderer.Demo.Common/Resources/web_pallete.gif diff --git a/Source/Demo/Samples/00.Intro.htm b/Source/HtmlRenderer.Demo.Common/Samples/00.Intro.htm similarity index 100% rename from Source/Demo/Samples/00.Intro.htm rename to Source/HtmlRenderer.Demo.Common/Samples/00.Intro.htm diff --git a/Source/Demo/Samples/01.History.htm b/Source/HtmlRenderer.Demo.Common/Samples/01.History.htm similarity index 100% rename from Source/Demo/Samples/01.History.htm rename to Source/HtmlRenderer.Demo.Common/Samples/01.History.htm diff --git a/Source/Demo/Samples/02.Text.htm b/Source/HtmlRenderer.Demo.Common/Samples/02.Text.htm similarity index 100% rename from Source/Demo/Samples/02.Text.htm rename to Source/HtmlRenderer.Demo.Common/Samples/02.Text.htm diff --git a/Source/Demo/Samples/03.Tables.htm b/Source/HtmlRenderer.Demo.Common/Samples/03.Tables.htm similarity index 100% rename from Source/Demo/Samples/03.Tables.htm rename to Source/HtmlRenderer.Demo.Common/Samples/03.Tables.htm diff --git a/Source/Demo/Samples/04.Links.htm b/Source/HtmlRenderer.Demo.Common/Samples/04.Links.htm similarity index 100% rename from Source/Demo/Samples/04.Links.htm rename to Source/HtmlRenderer.Demo.Common/Samples/04.Links.htm diff --git a/Source/Demo/Samples/05.Images.htm b/Source/HtmlRenderer.Demo.Common/Samples/05.Images.htm similarity index 100% rename from Source/Demo/Samples/05.Images.htm rename to Source/HtmlRenderer.Demo.Common/Samples/05.Images.htm diff --git a/Source/Demo/Samples/06.Embeded video.htm b/Source/HtmlRenderer.Demo.Common/Samples/06.Embeded video.htm similarity index 100% rename from Source/Demo/Samples/06.Embeded video.htm rename to Source/HtmlRenderer.Demo.Common/Samples/06.Embeded video.htm diff --git a/Source/Demo/Samples/07.Additional features.htm b/Source/HtmlRenderer.Demo.Common/Samples/07.Additional features.htm similarity index 100% rename from Source/Demo/Samples/07.Additional features.htm rename to Source/HtmlRenderer.Demo.Common/Samples/07.Additional features.htm diff --git a/Source/Demo/Samples/08.Tooltip.htm b/Source/HtmlRenderer.Demo.Common/Samples/08.Tooltip.htm similarity index 100% rename from Source/Demo/Samples/08.Tooltip.htm rename to Source/HtmlRenderer.Demo.Common/Samples/08.Tooltip.htm diff --git a/Source/Demo/Samples/09.Using the library.htm b/Source/HtmlRenderer.Demo.Common/Samples/09.Using the library.htm similarity index 100% rename from Source/Demo/Samples/09.Using the library.htm rename to Source/HtmlRenderer.Demo.Common/Samples/09.Using the library.htm diff --git a/Source/Demo/Samples/10.HtmlPanel.htm b/Source/HtmlRenderer.Demo.Common/Samples/10.HtmlPanel.htm similarity index 100% rename from Source/Demo/Samples/10.HtmlPanel.htm rename to Source/HtmlRenderer.Demo.Common/Samples/10.HtmlPanel.htm diff --git a/Source/Demo/Samples/11.HtmlLabel.htm b/Source/HtmlRenderer.Demo.Common/Samples/11.HtmlLabel.htm similarity index 100% rename from Source/Demo/Samples/11.HtmlLabel.htm rename to Source/HtmlRenderer.Demo.Common/Samples/11.HtmlLabel.htm diff --git a/Source/Demo/Samples/12.HtmlToolTip.htm b/Source/HtmlRenderer.Demo.Common/Samples/12.HtmlToolTip.htm similarity index 100% rename from Source/Demo/Samples/12.HtmlToolTip.htm rename to Source/HtmlRenderer.Demo.Common/Samples/12.HtmlToolTip.htm diff --git a/Source/Demo/Samples/13.HtmlRender.htm b/Source/HtmlRenderer.Demo.Common/Samples/13.HtmlRender.htm similarity index 100% rename from Source/Demo/Samples/13.HtmlRender.htm rename to Source/HtmlRenderer.Demo.Common/Samples/13.HtmlRender.htm diff --git a/Source/Demo/Samples/14.HtmlContainer.htm b/Source/HtmlRenderer.Demo.Common/Samples/14.HtmlContainer.htm similarity index 100% rename from Source/Demo/Samples/14.HtmlContainer.htm rename to Source/HtmlRenderer.Demo.Common/Samples/14.HtmlContainer.htm diff --git a/Source/Demo/Samples/20.About.htm b/Source/HtmlRenderer.Demo.Common/Samples/20.About.htm similarity index 100% rename from Source/Demo/Samples/20.About.htm rename to Source/HtmlRenderer.Demo.Common/Samples/20.About.htm diff --git a/Source/HtmlRenderer.Demo.Common/SamplesLoader.cs b/Source/HtmlRenderer.Demo.Common/SamplesLoader.cs new file mode 100644 index 000000000..a701a1c7c --- /dev/null +++ b/Source/HtmlRenderer.Demo.Common/SamplesLoader.cs @@ -0,0 +1,112 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; + +namespace HtmlRenderer.Demo.Common +{ + public static class SamplesLoader + { + /// + /// Samples to showcase the HTML Renderer capabilities + /// + private static readonly List> _showcaseSamples = new List>(); + + /// + /// Samples to test the different features of HTML Renderer that they work correctly + /// + private static readonly List> _testSamples = new List>(); + + /// + /// Samples used to test extreme performance + /// + private static readonly List> _performanceSamples = new List>(); + + /// + /// Init. + /// + static SamplesLoader() + { + LoadSamples(); + } + + /// + /// Samples to showcase the HTML Renderer capabilities + /// + public static List> ShowcaseSamples + { + get { return _showcaseSamples; } + } + + /// + /// Samples to test the different features of HTML Renderer that they work correctly + /// + public static List> TestSamples + { + get { return _testSamples; } + } + + /// + /// Samples used to test extreme performance + /// + public static List> PerformanceSamples + { + get { return _performanceSamples; } + } + + /// + /// Loads the tree of document samples + /// + private static void LoadSamples() + { + var names = Assembly.GetExecutingAssembly().GetManifestResourceNames(); + Array.Sort(names); + foreach (string name in names) + { + int extPos = name.LastIndexOf('.'); + int namePos = extPos > 0 && name.Length > 1 ? name.LastIndexOf('.', extPos - 1) : 0; + string ext = name.Substring(extPos >= 0 ? extPos : 0); + string shortName = namePos > 0 && name.Length > 2 ? name.Substring(namePos + 1, name.Length - namePos - ext.Length - 1) : name; + + if (".htm".IndexOf(ext, StringComparison.Ordinal) >= 0) + { + var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name); + if (resourceStream != null) + { + using(var sreader = new StreamReader(resourceStream, Encoding.Default)) + { + var html = sreader.ReadToEnd(); + + if( name.Contains("TestSamples.") ) + { + _testSamples.Add(new KeyValuePair(shortName, html)); + } + else if( name.Contains("PerfSamples") ) + { + _performanceSamples.Add(new KeyValuePair(shortName, html)); + } + else + { + _showcaseSamples.Add(new KeyValuePair(shortName, html)); + } + } + } + } + } + } + + } +} diff --git a/Source/Demo/TestSamples/01.Header.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/01.Header.htm similarity index 100% rename from Source/Demo/TestSamples/01.Header.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/01.Header.htm diff --git a/Source/Demo/TestSamples/02.Line break.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/02.Line break.htm similarity index 100% rename from Source/Demo/TestSamples/02.Line break.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/02.Line break.htm diff --git a/Source/Demo/TestSamples/03.Paragraphs.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/03.Paragraphs.htm similarity index 100% rename from Source/Demo/TestSamples/03.Paragraphs.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/03.Paragraphs.htm diff --git a/Source/Demo/TestSamples/04.Blockquotes.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/04.Blockquotes.htm similarity index 100% rename from Source/Demo/TestSamples/04.Blockquotes.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/04.Blockquotes.htm diff --git a/Source/Demo/TestSamples/05.Images.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/05.Images.htm similarity index 100% rename from Source/Demo/TestSamples/05.Images.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/05.Images.htm diff --git a/Source/Demo/TestSamples/06.External Image.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/06.External Image.htm similarity index 100% rename from Source/Demo/TestSamples/06.External Image.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/06.External Image.htm diff --git a/Source/Demo/TestSamples/07.Background Image.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/07.Background Image.htm similarity index 100% rename from Source/Demo/TestSamples/07.Background Image.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/07.Background Image.htm diff --git a/Source/Demo/TestSamples/08.White-space.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/08.White-space.htm similarity index 100% rename from Source/Demo/TestSamples/08.White-space.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/08.White-space.htm diff --git a/Source/Demo/TestSamples/09.Inline.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/09.Inline.htm similarity index 100% rename from Source/Demo/TestSamples/09.Inline.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/09.Inline.htm diff --git a/Source/Demo/TestSamples/10.BlockInInline.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/10.BlockInInline.htm similarity index 100% rename from Source/Demo/TestSamples/10.BlockInInline.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/10.BlockInInline.htm diff --git a/Source/Demo/TestSamples/11.LineHeight.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/11.LineHeight.htm similarity index 100% rename from Source/Demo/TestSamples/11.LineHeight.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/11.LineHeight.htm diff --git a/Source/Demo/TestSamples/12.Text.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/12.Text.htm similarity index 100% rename from Source/Demo/TestSamples/12.Text.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/12.Text.htm diff --git a/Source/Demo/TestSamples/13.Tables.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/13.Tables.htm similarity index 100% rename from Source/Demo/TestSamples/13.Tables.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/13.Tables.htm diff --git a/Source/Demo/TestSamples/14.Iframes.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/14.Iframes.htm similarity index 100% rename from Source/Demo/TestSamples/14.Iframes.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/14.Iframes.htm diff --git a/Source/Demo/TestSamples/15.MaxWidth.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/15.MaxWidth.htm similarity index 100% rename from Source/Demo/TestSamples/15.MaxWidth.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/15.MaxWidth.htm diff --git a/Source/Demo/TestSamples/16.Borders.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/16.Borders.htm similarity index 100% rename from Source/Demo/TestSamples/16.Borders.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/16.Borders.htm diff --git a/Source/Demo/TestSamples/17.Languages.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/17.Languages.htm similarity index 100% rename from Source/Demo/TestSamples/17.Languages.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/17.Languages.htm diff --git a/Source/Demo/TestSamples/18.Anchors.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/18.Anchors.htm similarity index 100% rename from Source/Demo/TestSamples/18.Anchors.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/18.Anchors.htm diff --git a/Source/Demo/TestSamples/19.Many images.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/19.Many images.htm similarity index 100% rename from Source/Demo/TestSamples/19.Many images.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/19.Many images.htm diff --git a/Source/Demo/TestSamples/20.Fonts decorations.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/20.Fonts decorations.htm similarity index 100% rename from Source/Demo/TestSamples/20.Fonts decorations.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/20.Fonts decorations.htm diff --git a/Source/Demo/TestSamples/21.Bullets.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/21.Bullets.htm similarity index 100% rename from Source/Demo/TestSamples/21.Bullets.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/21.Bullets.htm diff --git a/Source/Demo/TestSamples/30.Misc.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/30.Misc.htm similarity index 100% rename from Source/Demo/TestSamples/30.Misc.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/30.Misc.htm diff --git a/Source/Demo/TestSamples/31.ACID 1.htm b/Source/HtmlRenderer.Demo.Common/TestSamples/31.ACID 1.htm similarity index 100% rename from Source/Demo/TestSamples/31.ACID 1.htm rename to Source/HtmlRenderer.Demo.Common/TestSamples/31.ACID 1.htm diff --git a/Source/HtmlRenderer.Demo.WPF/App.xaml b/Source/HtmlRenderer.Demo.WPF/App.xaml new file mode 100644 index 000000000..6a7affd24 --- /dev/null +++ b/Source/HtmlRenderer.Demo.WPF/App.xaml @@ -0,0 +1,8 @@ + + + + + diff --git a/Source/HtmlRenderer.Demo.WPF/App.xaml.cs b/Source/HtmlRenderer.Demo.WPF/App.xaml.cs new file mode 100644 index 000000000..446c406ae --- /dev/null +++ b/Source/HtmlRenderer.Demo.WPF/App.xaml.cs @@ -0,0 +1,21 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +namespace HtmlRenderer.Demo.WPF +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App + { + } +} diff --git a/Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml b/Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml new file mode 100644 index 000000000..8ccc00d32 --- /dev/null +++ b/Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml.cs b/Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml.cs new file mode 100644 index 000000000..c21744f2f --- /dev/null +++ b/Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml.cs @@ -0,0 +1,25 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +namespace HtmlRenderer.Demo.WPF +{ + /// + /// Interaction logic for DemoWindow.xaml + /// + public partial class DemoWindow + { + public DemoWindow() + { + InitializeComponent(); + } + } +} diff --git a/Source/HtmlRenderer.Demo.WPF/HtmlRenderer.Demo.WPF.csproj b/Source/HtmlRenderer.Demo.WPF/HtmlRenderer.Demo.WPF.csproj new file mode 100644 index 000000000..a29ca5d5c --- /dev/null +++ b/Source/HtmlRenderer.Demo.WPF/HtmlRenderer.Demo.WPF.csproj @@ -0,0 +1,94 @@ + + + + + Debug + AnyCPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0} + WinExe + Properties + HtmlRenderer.Demo.WPF + HtmlRendererWpfDemo + v3.0 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + App.xaml + Code + + + DemoWindow.xaml + Code + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + \ No newline at end of file diff --git a/Source/HtmlRenderer.Demo.WPF/Properties/AssemblyInfo.cs b/Source/HtmlRenderer.Demo.WPF/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..cb330edcc --- /dev/null +++ b/Source/HtmlRenderer.Demo.WPF/Properties/AssemblyInfo.cs @@ -0,0 +1,53 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Windows; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("HtmlRenderer.Demo.WPF")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("HtmlRenderer.Demo.WPF")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Source/HtmlRenderer.Demo.WPF/Properties/Resources.Designer.cs b/Source/HtmlRenderer.Demo.WPF/Properties/Resources.Designer.cs new file mode 100644 index 000000000..e7138eaad --- /dev/null +++ b/Source/HtmlRenderer.Demo.WPF/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34003 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace HtmlRenderer.Demo.WPF.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HtmlRenderer.Demo.WPF.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Source/HtmlRenderer.Demo.WPF/Properties/Resources.resx b/Source/HtmlRenderer.Demo.WPF/Properties/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/Source/HtmlRenderer.Demo.WPF/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Source/HtmlRenderer.Demo.WPF/Properties/Settings.Designer.cs b/Source/HtmlRenderer.Demo.WPF/Properties/Settings.Designer.cs new file mode 100644 index 000000000..ede86b5a8 --- /dev/null +++ b/Source/HtmlRenderer.Demo.WPF/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34003 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace HtmlRenderer.Demo.WPF.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Source/HtmlRenderer.Demo.WPF/Properties/Settings.settings b/Source/HtmlRenderer.Demo.WPF/Properties/Settings.settings new file mode 100644 index 000000000..033d7a5e9 --- /dev/null +++ b/Source/HtmlRenderer.Demo.WPF/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Source/HtmlRenderer.sln b/Source/HtmlRenderer.sln index 38f070f3d..fcf785a8a 100644 --- a/Source/HtmlRenderer.sln +++ b/Source/HtmlRenderer.sln @@ -21,6 +21,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demo", "Demo", "{E263EA16-2 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WPF.MultiTarget", "WPF.MultiTarget", "{22F881FF-127B-4B9B-A1BE-EA87715BBD85}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.Demo.WPF", "HtmlRenderer.Demo.WPF\HtmlRenderer.Demo.WPF.csproj", "{F02E0216-4AE3-474F-9381-FCB93411CDB0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.Demo.Common", "HtmlRenderer.Demo.Common\HtmlRenderer.Demo.Common.csproj", "{2390B71F-9400-47F4-B23A-7F2649C87D35}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -101,14 +105,36 @@ Global {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|Mixed Platforms.Build.0 = Release|Any CPU {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|x86.ActiveCfg = Release|Any CPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0}.Debug|x86.ActiveCfg = Debug|Any CPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0}.Release|Any CPU.Build.0 = Release|Any CPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F02E0216-4AE3-474F-9381-FCB93411CDB0}.Release|x86.ActiveCfg = Release|Any CPU + {2390B71F-9400-47F4-B23A-7F2649C87D35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2390B71F-9400-47F4-B23A-7F2649C87D35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2390B71F-9400-47F4-B23A-7F2649C87D35}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2390B71F-9400-47F4-B23A-7F2649C87D35}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {2390B71F-9400-47F4-B23A-7F2649C87D35}.Debug|x86.ActiveCfg = Debug|Any CPU + {2390B71F-9400-47F4-B23A-7F2649C87D35}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2390B71F-9400-47F4-B23A-7F2649C87D35}.Release|Any CPU.Build.0 = Release|Any CPU + {2390B71F-9400-47F4-B23A-7F2649C87D35}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2390B71F-9400-47F4-B23A-7F2649C87D35}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2390B71F-9400-47F4-B23A-7F2649C87D35}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {8AD34FE8-8382-4A8A-B3AA-A0392ED42423} = {E263EA16-2E6A-4269-A319-AA2F97ADA8E1} + {F02E0216-4AE3-474F-9381-FCB93411CDB0} = {E263EA16-2E6A-4269-A319-AA2F97ADA8E1} + {2390B71F-9400-47F4-B23A-7F2649C87D35} = {E263EA16-2E6A-4269-A319-AA2F97ADA8E1} {6018296C-7FE3-40A4-A8CC-28D8DA1FD934} = {1BED3EBA-15BF-4AEC-A03C-581D5F1C4DD5} {06CFAAB3-459A-46F1-982B-CE0D62483AC7} = {1BED3EBA-15BF-4AEC-A03C-581D5F1C4DD5} {73A762F1-C802-4659-9B3E-2BF6B284E606} = {1BED3EBA-15BF-4AEC-A03C-581D5F1C4DD5} - {8AD34FE8-8382-4A8A-B3AA-A0392ED42423} = {E263EA16-2E6A-4269-A319-AA2F97ADA8E1} EndGlobalSection EndGlobal From c63b13c94a7b928bdf7853d18a33b75b7b2cb988 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Fri, 22 Nov 2013 18:18:59 +0200 Subject: [PATCH 005/254] * demo work for WPF --- .../Common}/HtmlRenderer.Demo.Common.csproj | 2 +- .../Common}/PerfSamples/1.Big table.htm | 0 .../Common}/Properties/AssemblyInfo.cs | 0 .../Common}/Properties/Resources.Designer.cs | 0 .../Common}/Properties/Resources.resx | 0 .../Common}/Resources/CustomFont.ttf | Bin .../Common}/Resources/Event16.png | Bin .../Common}/Resources/Window.gif | Bin .../Common}/Resources/comment16.gif | Bin .../Common}/Resources/delete16.gif | Bin .../Common}/Resources/delete32.gif | Bin .../Common}/Resources/exclamation32.png | Bin .../Common}/Resources/favorites32.png | Bin .../Common}/Resources/font32.png | Bin .../Common}/Resources/formula32.png | Bin .../Common}/Resources/html.ico | Bin .../Common}/Resources/html32.png | Bin .../Common}/Resources/image32.png | Bin .../Common}/Resources/method16.gif | Bin .../Common}/Resources/paly32.png | Bin .../Common}/Resources/property16.gif | Bin .../Common}/Resources/property32.png | Bin .../Common}/Resources/refreshdocument32.png | Bin .../Common}/Resources/web_pallete.gif | Bin .../Common}/Samples/00.Intro.htm | 0 .../Common}/Samples/01.History.htm | 0 .../Common}/Samples/02.Text.htm | 0 .../Common}/Samples/03.Tables.htm | 0 .../Common}/Samples/04.Links.htm | 0 .../Common}/Samples/05.Images.htm | 0 .../Common}/Samples/06.Embeded video.htm | 0 .../Samples/07.Additional features.htm | 0 .../Common}/Samples/08.Tooltip.htm | 0 .../Common}/Samples/09.Using the library.htm | 0 .../Common}/Samples/10.HtmlPanel.htm | 0 .../Common}/Samples/11.HtmlLabel.htm | 0 .../Common}/Samples/12.HtmlToolTip.htm | 0 .../Common}/Samples/13.HtmlRender.htm | 0 .../Common}/Samples/14.HtmlContainer.htm | 0 .../Common}/Samples/20.About.htm | 0 .../Common}/SamplesLoader.cs | 0 .../Common}/TestSamples/01.Header.htm | 0 .../Common}/TestSamples/02.Line break.htm | 0 .../Common}/TestSamples/03.Paragraphs.htm | 0 .../Common}/TestSamples/04.Blockquotes.htm | 0 .../Common}/TestSamples/05.Images.htm | 0 .../Common}/TestSamples/06.External Image.htm | 0 .../TestSamples/07.Background Image.htm | 0 .../Common}/TestSamples/08.White-space.htm | 0 .../Common}/TestSamples/09.Inline.htm | 0 .../Common}/TestSamples/10.BlockInInline.htm | 0 .../Common}/TestSamples/11.LineHeight.htm | 0 .../Common}/TestSamples/12.Text.htm | 0 .../Common}/TestSamples/13.Tables.htm | 0 .../Common}/TestSamples/14.Iframes.htm | 0 .../Common}/TestSamples/15.MaxWidth.htm | 0 .../Common}/TestSamples/16.Borders.htm | 0 .../Common}/TestSamples/17.Languages.htm | 0 .../Common}/TestSamples/18.Anchors.htm | 0 .../Common}/TestSamples/19.Many images.htm | 0 .../TestSamples/20.Fonts decorations.htm | 0 .../Common}/TestSamples/21.Bullets.htm | 0 .../Common}/TestSamples/30.Misc.htm | 0 .../Common}/TestSamples/31.ACID 1.htm | 0 .../WPF}/App.xaml | 0 .../WPF}/App.xaml.cs | 0 .../WPF}/DemoWindow.xaml | 6 +-- .../WPF}/HtmlRenderer.Demo.WPF.csproj | 6 +++ .../WPF}/Properties/AssemblyInfo.cs | 0 .../WPF}/Properties/Resources.Designer.cs | 0 .../WPF}/Properties/Resources.resx | 0 .../WPF}/Properties/Settings.Designer.cs | 0 .../WPF}/Properties/Settings.settings | 0 .../Demo/{ => WinForms}/DemoForm.Designer.cs | 0 Source/Demo/{ => WinForms}/DemoForm.cs | 0 Source/Demo/{ => WinForms}/DemoForm.resx | 0 .../HtmlRenderer.Demo.WinForms.csproj | 4 +- .../Demo/{ => WinForms}/PerfForm.Designer.cs | 0 Source/Demo/{ => WinForms}/PerfForm.cs | 0 Source/Demo/{ => WinForms}/PerfForm.resx | 0 Source/Demo/{ => WinForms}/Program.cs | 0 .../{ => WinForms}/Properties/AssemblyInfo.cs | 0 .../{ => WinForms}/SampleForm.Designer.cs | 0 Source/Demo/{ => WinForms}/SampleForm.cs | 0 Source/Demo/{ => WinForms}/SampleForm.resx | 0 Source/Demo/{ => WinForms}/SyntaxHilight.cs | 2 +- .../HtmlRenderer.Demo.WPF/DemoWindow.xaml.cs | 25 --------- Source/HtmlRenderer.sln | 50 +++++++++--------- 88 files changed, 37 insertions(+), 58 deletions(-) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/HtmlRenderer.Demo.Common.csproj (99%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/PerfSamples/1.Big table.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Properties/AssemblyInfo.cs (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Properties/Resources.Designer.cs (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Properties/Resources.resx (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/CustomFont.ttf (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/Event16.png (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/Window.gif (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/comment16.gif (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/delete16.gif (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/delete32.gif (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/exclamation32.png (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/favorites32.png (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/font32.png (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/formula32.png (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/html.ico (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/html32.png (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/image32.png (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/method16.gif (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/paly32.png (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/property16.gif (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/property32.png (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/refreshdocument32.png (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Resources/web_pallete.gif (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/00.Intro.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/01.History.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/02.Text.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/03.Tables.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/04.Links.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/05.Images.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/06.Embeded video.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/07.Additional features.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/08.Tooltip.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/09.Using the library.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/10.HtmlPanel.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/11.HtmlLabel.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/12.HtmlToolTip.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/13.HtmlRender.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/14.HtmlContainer.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/Samples/20.About.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/SamplesLoader.cs (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/01.Header.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/02.Line break.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/03.Paragraphs.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/04.Blockquotes.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/05.Images.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/06.External Image.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/07.Background Image.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/08.White-space.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/09.Inline.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/10.BlockInInline.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/11.LineHeight.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/12.Text.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/13.Tables.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/14.Iframes.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/15.MaxWidth.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/16.Borders.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/17.Languages.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/18.Anchors.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/19.Many images.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/20.Fonts decorations.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/21.Bullets.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/30.Misc.htm (100%) rename Source/{HtmlRenderer.Demo.Common => Demo/Common}/TestSamples/31.ACID 1.htm (100%) rename Source/{HtmlRenderer.Demo.WPF => Demo/WPF}/App.xaml (100%) rename Source/{HtmlRenderer.Demo.WPF => Demo/WPF}/App.xaml.cs (100%) rename Source/{HtmlRenderer.Demo.WPF => Demo/WPF}/DemoWindow.xaml (84%) rename Source/{HtmlRenderer.Demo.WPF => Demo/WPF}/HtmlRenderer.Demo.WPF.csproj (94%) rename Source/{HtmlRenderer.Demo.WPF => Demo/WPF}/Properties/AssemblyInfo.cs (100%) rename Source/{HtmlRenderer.Demo.WPF => Demo/WPF}/Properties/Resources.Designer.cs (100%) rename Source/{HtmlRenderer.Demo.WPF => Demo/WPF}/Properties/Resources.resx (100%) rename Source/{HtmlRenderer.Demo.WPF => Demo/WPF}/Properties/Settings.Designer.cs (100%) rename Source/{HtmlRenderer.Demo.WPF => Demo/WPF}/Properties/Settings.settings (100%) rename Source/Demo/{ => WinForms}/DemoForm.Designer.cs (100%) rename Source/Demo/{ => WinForms}/DemoForm.cs (100%) rename Source/Demo/{ => WinForms}/DemoForm.resx (100%) rename Source/Demo/{ => WinForms}/HtmlRenderer.Demo.WinForms.csproj (96%) rename Source/Demo/{ => WinForms}/PerfForm.Designer.cs (100%) rename Source/Demo/{ => WinForms}/PerfForm.cs (100%) rename Source/Demo/{ => WinForms}/PerfForm.resx (100%) rename Source/Demo/{ => WinForms}/Program.cs (100%) rename Source/Demo/{ => WinForms}/Properties/AssemblyInfo.cs (100%) rename Source/Demo/{ => WinForms}/SampleForm.Designer.cs (100%) rename Source/Demo/{ => WinForms}/SampleForm.cs (100%) rename Source/Demo/{ => WinForms}/SampleForm.resx (100%) rename Source/Demo/{ => WinForms}/SyntaxHilight.cs (98%) delete mode 100644 Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml.cs diff --git a/Source/HtmlRenderer.Demo.Common/HtmlRenderer.Demo.Common.csproj b/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj similarity index 99% rename from Source/HtmlRenderer.Demo.Common/HtmlRenderer.Demo.Common.csproj rename to Source/Demo/Common/HtmlRenderer.Demo.Common.csproj index e2b62944a..cf7176aaa 100644 --- a/Source/HtmlRenderer.Demo.Common/HtmlRenderer.Demo.Common.csproj +++ b/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj @@ -8,7 +8,7 @@ Library Properties HtmlRenderer.Demo.Common - HtmlRenderer.Demo.Common + HtmlRendererDemoCommon v2.0 512 diff --git a/Source/HtmlRenderer.Demo.Common/PerfSamples/1.Big table.htm b/Source/Demo/Common/PerfSamples/1.Big table.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/PerfSamples/1.Big table.htm rename to Source/Demo/Common/PerfSamples/1.Big table.htm diff --git a/Source/HtmlRenderer.Demo.Common/Properties/AssemblyInfo.cs b/Source/Demo/Common/Properties/AssemblyInfo.cs similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Properties/AssemblyInfo.cs rename to Source/Demo/Common/Properties/AssemblyInfo.cs diff --git a/Source/HtmlRenderer.Demo.Common/Properties/Resources.Designer.cs b/Source/Demo/Common/Properties/Resources.Designer.cs similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Properties/Resources.Designer.cs rename to Source/Demo/Common/Properties/Resources.Designer.cs diff --git a/Source/HtmlRenderer.Demo.Common/Properties/Resources.resx b/Source/Demo/Common/Properties/Resources.resx similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Properties/Resources.resx rename to Source/Demo/Common/Properties/Resources.resx diff --git a/Source/HtmlRenderer.Demo.Common/Resources/CustomFont.ttf b/Source/Demo/Common/Resources/CustomFont.ttf similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/CustomFont.ttf rename to Source/Demo/Common/Resources/CustomFont.ttf diff --git a/Source/HtmlRenderer.Demo.Common/Resources/Event16.png b/Source/Demo/Common/Resources/Event16.png similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/Event16.png rename to Source/Demo/Common/Resources/Event16.png diff --git a/Source/HtmlRenderer.Demo.Common/Resources/Window.gif b/Source/Demo/Common/Resources/Window.gif similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/Window.gif rename to Source/Demo/Common/Resources/Window.gif diff --git a/Source/HtmlRenderer.Demo.Common/Resources/comment16.gif b/Source/Demo/Common/Resources/comment16.gif similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/comment16.gif rename to Source/Demo/Common/Resources/comment16.gif diff --git a/Source/HtmlRenderer.Demo.Common/Resources/delete16.gif b/Source/Demo/Common/Resources/delete16.gif similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/delete16.gif rename to Source/Demo/Common/Resources/delete16.gif diff --git a/Source/HtmlRenderer.Demo.Common/Resources/delete32.gif b/Source/Demo/Common/Resources/delete32.gif similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/delete32.gif rename to Source/Demo/Common/Resources/delete32.gif diff --git a/Source/HtmlRenderer.Demo.Common/Resources/exclamation32.png b/Source/Demo/Common/Resources/exclamation32.png similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/exclamation32.png rename to Source/Demo/Common/Resources/exclamation32.png diff --git a/Source/HtmlRenderer.Demo.Common/Resources/favorites32.png b/Source/Demo/Common/Resources/favorites32.png similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/favorites32.png rename to Source/Demo/Common/Resources/favorites32.png diff --git a/Source/HtmlRenderer.Demo.Common/Resources/font32.png b/Source/Demo/Common/Resources/font32.png similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/font32.png rename to Source/Demo/Common/Resources/font32.png diff --git a/Source/HtmlRenderer.Demo.Common/Resources/formula32.png b/Source/Demo/Common/Resources/formula32.png similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/formula32.png rename to Source/Demo/Common/Resources/formula32.png diff --git a/Source/HtmlRenderer.Demo.Common/Resources/html.ico b/Source/Demo/Common/Resources/html.ico similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/html.ico rename to Source/Demo/Common/Resources/html.ico diff --git a/Source/HtmlRenderer.Demo.Common/Resources/html32.png b/Source/Demo/Common/Resources/html32.png similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/html32.png rename to Source/Demo/Common/Resources/html32.png diff --git a/Source/HtmlRenderer.Demo.Common/Resources/image32.png b/Source/Demo/Common/Resources/image32.png similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/image32.png rename to Source/Demo/Common/Resources/image32.png diff --git a/Source/HtmlRenderer.Demo.Common/Resources/method16.gif b/Source/Demo/Common/Resources/method16.gif similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/method16.gif rename to Source/Demo/Common/Resources/method16.gif diff --git a/Source/HtmlRenderer.Demo.Common/Resources/paly32.png b/Source/Demo/Common/Resources/paly32.png similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/paly32.png rename to Source/Demo/Common/Resources/paly32.png diff --git a/Source/HtmlRenderer.Demo.Common/Resources/property16.gif b/Source/Demo/Common/Resources/property16.gif similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/property16.gif rename to Source/Demo/Common/Resources/property16.gif diff --git a/Source/HtmlRenderer.Demo.Common/Resources/property32.png b/Source/Demo/Common/Resources/property32.png similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/property32.png rename to Source/Demo/Common/Resources/property32.png diff --git a/Source/HtmlRenderer.Demo.Common/Resources/refreshdocument32.png b/Source/Demo/Common/Resources/refreshdocument32.png similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/refreshdocument32.png rename to Source/Demo/Common/Resources/refreshdocument32.png diff --git a/Source/HtmlRenderer.Demo.Common/Resources/web_pallete.gif b/Source/Demo/Common/Resources/web_pallete.gif similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Resources/web_pallete.gif rename to Source/Demo/Common/Resources/web_pallete.gif diff --git a/Source/HtmlRenderer.Demo.Common/Samples/00.Intro.htm b/Source/Demo/Common/Samples/00.Intro.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/00.Intro.htm rename to Source/Demo/Common/Samples/00.Intro.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/01.History.htm b/Source/Demo/Common/Samples/01.History.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/01.History.htm rename to Source/Demo/Common/Samples/01.History.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/02.Text.htm b/Source/Demo/Common/Samples/02.Text.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/02.Text.htm rename to Source/Demo/Common/Samples/02.Text.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/03.Tables.htm b/Source/Demo/Common/Samples/03.Tables.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/03.Tables.htm rename to Source/Demo/Common/Samples/03.Tables.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/04.Links.htm b/Source/Demo/Common/Samples/04.Links.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/04.Links.htm rename to Source/Demo/Common/Samples/04.Links.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/05.Images.htm b/Source/Demo/Common/Samples/05.Images.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/05.Images.htm rename to Source/Demo/Common/Samples/05.Images.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/06.Embeded video.htm b/Source/Demo/Common/Samples/06.Embeded video.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/06.Embeded video.htm rename to Source/Demo/Common/Samples/06.Embeded video.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/07.Additional features.htm b/Source/Demo/Common/Samples/07.Additional features.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/07.Additional features.htm rename to Source/Demo/Common/Samples/07.Additional features.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/08.Tooltip.htm b/Source/Demo/Common/Samples/08.Tooltip.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/08.Tooltip.htm rename to Source/Demo/Common/Samples/08.Tooltip.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/09.Using the library.htm b/Source/Demo/Common/Samples/09.Using the library.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/09.Using the library.htm rename to Source/Demo/Common/Samples/09.Using the library.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/10.HtmlPanel.htm b/Source/Demo/Common/Samples/10.HtmlPanel.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/10.HtmlPanel.htm rename to Source/Demo/Common/Samples/10.HtmlPanel.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/11.HtmlLabel.htm b/Source/Demo/Common/Samples/11.HtmlLabel.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/11.HtmlLabel.htm rename to Source/Demo/Common/Samples/11.HtmlLabel.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/12.HtmlToolTip.htm b/Source/Demo/Common/Samples/12.HtmlToolTip.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/12.HtmlToolTip.htm rename to Source/Demo/Common/Samples/12.HtmlToolTip.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/13.HtmlRender.htm b/Source/Demo/Common/Samples/13.HtmlRender.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/13.HtmlRender.htm rename to Source/Demo/Common/Samples/13.HtmlRender.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/14.HtmlContainer.htm b/Source/Demo/Common/Samples/14.HtmlContainer.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/14.HtmlContainer.htm rename to Source/Demo/Common/Samples/14.HtmlContainer.htm diff --git a/Source/HtmlRenderer.Demo.Common/Samples/20.About.htm b/Source/Demo/Common/Samples/20.About.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/Samples/20.About.htm rename to Source/Demo/Common/Samples/20.About.htm diff --git a/Source/HtmlRenderer.Demo.Common/SamplesLoader.cs b/Source/Demo/Common/SamplesLoader.cs similarity index 100% rename from Source/HtmlRenderer.Demo.Common/SamplesLoader.cs rename to Source/Demo/Common/SamplesLoader.cs diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/01.Header.htm b/Source/Demo/Common/TestSamples/01.Header.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/01.Header.htm rename to Source/Demo/Common/TestSamples/01.Header.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/02.Line break.htm b/Source/Demo/Common/TestSamples/02.Line break.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/02.Line break.htm rename to Source/Demo/Common/TestSamples/02.Line break.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/03.Paragraphs.htm b/Source/Demo/Common/TestSamples/03.Paragraphs.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/03.Paragraphs.htm rename to Source/Demo/Common/TestSamples/03.Paragraphs.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/04.Blockquotes.htm b/Source/Demo/Common/TestSamples/04.Blockquotes.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/04.Blockquotes.htm rename to Source/Demo/Common/TestSamples/04.Blockquotes.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/05.Images.htm b/Source/Demo/Common/TestSamples/05.Images.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/05.Images.htm rename to Source/Demo/Common/TestSamples/05.Images.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/06.External Image.htm b/Source/Demo/Common/TestSamples/06.External Image.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/06.External Image.htm rename to Source/Demo/Common/TestSamples/06.External Image.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/07.Background Image.htm b/Source/Demo/Common/TestSamples/07.Background Image.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/07.Background Image.htm rename to Source/Demo/Common/TestSamples/07.Background Image.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/08.White-space.htm b/Source/Demo/Common/TestSamples/08.White-space.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/08.White-space.htm rename to Source/Demo/Common/TestSamples/08.White-space.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/09.Inline.htm b/Source/Demo/Common/TestSamples/09.Inline.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/09.Inline.htm rename to Source/Demo/Common/TestSamples/09.Inline.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/10.BlockInInline.htm b/Source/Demo/Common/TestSamples/10.BlockInInline.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/10.BlockInInline.htm rename to Source/Demo/Common/TestSamples/10.BlockInInline.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/11.LineHeight.htm b/Source/Demo/Common/TestSamples/11.LineHeight.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/11.LineHeight.htm rename to Source/Demo/Common/TestSamples/11.LineHeight.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/12.Text.htm b/Source/Demo/Common/TestSamples/12.Text.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/12.Text.htm rename to Source/Demo/Common/TestSamples/12.Text.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/13.Tables.htm b/Source/Demo/Common/TestSamples/13.Tables.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/13.Tables.htm rename to Source/Demo/Common/TestSamples/13.Tables.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/14.Iframes.htm b/Source/Demo/Common/TestSamples/14.Iframes.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/14.Iframes.htm rename to Source/Demo/Common/TestSamples/14.Iframes.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/15.MaxWidth.htm b/Source/Demo/Common/TestSamples/15.MaxWidth.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/15.MaxWidth.htm rename to Source/Demo/Common/TestSamples/15.MaxWidth.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/16.Borders.htm b/Source/Demo/Common/TestSamples/16.Borders.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/16.Borders.htm rename to Source/Demo/Common/TestSamples/16.Borders.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/17.Languages.htm b/Source/Demo/Common/TestSamples/17.Languages.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/17.Languages.htm rename to Source/Demo/Common/TestSamples/17.Languages.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/18.Anchors.htm b/Source/Demo/Common/TestSamples/18.Anchors.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/18.Anchors.htm rename to Source/Demo/Common/TestSamples/18.Anchors.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/19.Many images.htm b/Source/Demo/Common/TestSamples/19.Many images.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/19.Many images.htm rename to Source/Demo/Common/TestSamples/19.Many images.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/20.Fonts decorations.htm b/Source/Demo/Common/TestSamples/20.Fonts decorations.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/20.Fonts decorations.htm rename to Source/Demo/Common/TestSamples/20.Fonts decorations.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/21.Bullets.htm b/Source/Demo/Common/TestSamples/21.Bullets.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/21.Bullets.htm rename to Source/Demo/Common/TestSamples/21.Bullets.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/30.Misc.htm b/Source/Demo/Common/TestSamples/30.Misc.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/30.Misc.htm rename to Source/Demo/Common/TestSamples/30.Misc.htm diff --git a/Source/HtmlRenderer.Demo.Common/TestSamples/31.ACID 1.htm b/Source/Demo/Common/TestSamples/31.ACID 1.htm similarity index 100% rename from Source/HtmlRenderer.Demo.Common/TestSamples/31.ACID 1.htm rename to Source/Demo/Common/TestSamples/31.ACID 1.htm diff --git a/Source/HtmlRenderer.Demo.WPF/App.xaml b/Source/Demo/WPF/App.xaml similarity index 100% rename from Source/HtmlRenderer.Demo.WPF/App.xaml rename to Source/Demo/WPF/App.xaml diff --git a/Source/HtmlRenderer.Demo.WPF/App.xaml.cs b/Source/Demo/WPF/App.xaml.cs similarity index 100% rename from Source/HtmlRenderer.Demo.WPF/App.xaml.cs rename to Source/Demo/WPF/App.xaml.cs diff --git a/Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml b/Source/Demo/WPF/DemoWindow.xaml similarity index 84% rename from Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml rename to Source/Demo/WPF/DemoWindow.xaml index 8ccc00d32..00aa5bba5 100644 --- a/Source/HtmlRenderer.Demo.WPF/DemoWindow.xaml +++ b/Source/Demo/WPF/DemoWindow.xaml @@ -8,9 +8,7 @@ - - - + @@ -20,7 +18,7 @@ - + diff --git a/Source/HtmlRenderer.Demo.WPF/HtmlRenderer.Demo.WPF.csproj b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj similarity index 94% rename from Source/HtmlRenderer.Demo.WPF/HtmlRenderer.Demo.WPF.csproj rename to Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj index a29ca5d5c..cfcd7a749 100644 --- a/Source/HtmlRenderer.Demo.WPF/HtmlRenderer.Demo.WPF.csproj +++ b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj @@ -83,6 +83,12 @@ + + + {2390B71F-9400-47F4-B23A-7F2649C87D35} + HtmlRenderer.Demo.Common + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\comment16.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\favorites32.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\font32.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\image32.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\method16.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\property16.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - <b>HtmlPnael control showing <u>HTML Renderer</u> capabilities</b> - <table border="0" style="margin: 10px 20px;"> - <tr> - <td width="32" style="padding: 2px 5px 0 0"> - <img src="HtmlIcon" /> - </td> - <td> - You can select html samples on the left or you can edit <br/> the HTML of any document using the editor on the bottom. - </td> - </tr> - </table> - <hr/> - <br/> - <div> - This is an <b>HtmlToolTip</b> and it's very <b color=blue>COOL</b>!!!<br/> - You can even click on the <a href="https://htmlrenderer.codeplex.com/">links</a>! - </div> - - - ..\Resources\web_pallete.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\resources\html.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\resources\event16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\resources\html32.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\resources\customfont.ttf;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Source/Demo/Common/Resources.cs b/Source/Demo/Common/Resources.cs new file mode 100644 index 000000000..b2eb5cc48 --- /dev/null +++ b/Source/Demo/Common/Resources.cs @@ -0,0 +1,102 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System.IO; + +namespace HtmlRenderer.Demo.Common +{ + /// + /// Get font, image and text resources for HtmlRenderer demo. + /// + public static class Resources + { + public static byte[] CustomFont + { + get + { + var stream = GetManifestResourceStream("CustomFont.ttf"); + + byte[] buffer = new byte[16 * 1024]; + using (MemoryStream ms = new MemoryStream()) + { + int read; + while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) + { + ms.Write(buffer, 0, read); + } + return ms.ToArray(); + } + } + } + + public static Stream Comment16 + { + get { return GetManifestResourceStream("comment16.gif"); } + } + + public static Stream Event16 + { + get { return GetManifestResourceStream("Event16.png"); } + } + + public static Stream Favorites32 + { + get { return GetManifestResourceStream("favorites32.png"); } + } + + public static Stream Font32 + { + get { return GetManifestResourceStream("font32.png"); } + } + + public static Stream Html32 + { + get { return GetManifestResourceStream("html32.png"); } + } + + public static Stream Image32 + { + get { return GetManifestResourceStream("image32.png"); } + } + + public static Stream Method16 + { + get { return GetManifestResourceStream("method16.gif"); } + } + + public static Stream Property16 + { + get { return GetManifestResourceStream("property16.gif"); } + } + + public static Stream WebPallete + { + get { return GetManifestResourceStream("web_pallete.gif"); } + } + + public static string Tooltip + { + get + { + using (var reader = new StreamReader(GetManifestResourceStream("Tooltip.html"))) + { + return reader.ReadToEnd(); + } + } + } + + private static Stream GetManifestResourceStream(string name) + { + return typeof(Resources).Assembly.GetManifestResourceStream("HtmlRenderer.Demo.Common.Resources." + name); + } + } +} diff --git a/Source/Demo/Common/Resources/Tooltip.html b/Source/Demo/Common/Resources/Tooltip.html new file mode 100644 index 000000000..7350865c3 --- /dev/null +++ b/Source/Demo/Common/Resources/Tooltip.html @@ -0,0 +1,18 @@ +HtmlPnael control showing HTML Renderer capabilities + + + + + +
+ + You can select html samples on the left or you can edit +
+ the HTML of any document using the editor on the bottom. +
+
+
+
+ This is an HtmlToolTip and it's very COOL!!!
+ You can even click on the links! +
diff --git a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj index 86556995b..fca9e755b 100644 --- a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj +++ b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj @@ -33,6 +33,9 @@ prompt 4 + + html.ico + @@ -89,6 +92,9 @@ HtmlRenderer.Demo.Common + + + - \ No newline at end of file diff --git a/Source/HtmlRenderer/HtmlRenderer.WinForms.csproj b/Source/HtmlRenderer/HtmlRenderer.WinForms.csproj deleted file mode 100644 index e537dbf3c..000000000 --- a/Source/HtmlRenderer/HtmlRenderer.WinForms.csproj +++ /dev/null @@ -1,175 +0,0 @@ - - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {1B058920-24B4-4140-8AE7-C8C6C38CA52D} - Library - Properties - HtmlRenderer - HtmlRenderer - - - v2.0 - - - - - 2.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - - true - full - false - bin\DebugNet20\ - DEBUG;TRACE - prompt - 4 - false - AllRules.ruleset - - - pdbonly - true - bin\ReleaseNet20\ - TRACE - prompt - 4 - AllRules.ruleset - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Component - - - Component - - - - Component - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - - - - - - - - - - \ No newline at end of file From fc3b5734cf262a878e83ecbb00b2555837ed4ad6 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sun, 19 Jan 2014 13:01:44 +0200 Subject: [PATCH 014/254] * add missing file --- .../HtmlRenderer.WinForms.csproj | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj diff --git a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj new file mode 100644 index 000000000..d0c62ea24 --- /dev/null +++ b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj @@ -0,0 +1,117 @@ + + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {1B058920-24B4-4140-8AE7-C8C6C38CA52D} + Library + Properties + HtmlRenderer.WinForms + HtmlRenderer.WinForms + + + v2.0 + + + + + 2.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + + true + full + false + bin\DebugNet20\ + DEBUG;TRACE + prompt + 4 + false + AllRules.ruleset + + + pdbonly + true + bin\ReleaseNet20\ + TRACE + prompt + 4 + AllRules.ruleset + + + + + + + + + + + + + Component + + + Component + + + + Component + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + {fe611685-391f-4e3e-b27e-d3150e51e49b} + HtmlRenderer.Core + + + + + \ No newline at end of file From 2f55f6c3d942df04b3ccc5bd7206ce12a981f0f2 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sun, 19 Jan 2014 13:07:04 +0200 Subject: [PATCH 015/254] * refactor --- Source/HtmlRenderer.Core/HtmlRenderer.Core.csproj | 9 +++++---- Source/HtmlRenderer.Core/Properties/AssemblyInfo.cs | 5 +++++ Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj | 5 ++++- .../HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj | 7 ++++--- .../AssemblyInfo.cs => SharedAssemblyInfo.cs} | 4 ---- 5 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 Source/HtmlRenderer.Core/Properties/AssemblyInfo.cs rename Source/{HtmlRenderer.Core/AssemblyInfo.cs => SharedAssemblyInfo.cs} (91%) diff --git a/Source/HtmlRenderer.Core/HtmlRenderer.Core.csproj b/Source/HtmlRenderer.Core/HtmlRenderer.Core.csproj index 337c5e214..f3eb3d66c 100644 --- a/Source/HtmlRenderer.Core/HtmlRenderer.Core.csproj +++ b/Source/HtmlRenderer.Core/HtmlRenderer.Core.csproj @@ -43,6 +43,9 @@ + + Properties\SharedAssemblyInfo.cs + @@ -100,11 +103,9 @@ - - - - + + + \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs new file mode 100644 index 000000000..9eb9cedc2 --- /dev/null +++ b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs @@ -0,0 +1,40 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using PdfSharp; +using PdfSharp.Drawing; +using PdfSharp.Pdf; + +namespace HtmlRenderer.PdfSharp +{ + /// + /// + /// + public static class PdfGenerator + { + public static PdfDocument GeneratePdf(string html, PageSize pageSize) + { + var size = PageSizeConverter.ToSize(pageSize); + + using(var measure = XGraphics.CreateMeasureContext(size,XGraphicsUnit.Point, XPageDirection.Downwards)) + { + + } + + var document = new PdfDocument(); + + var page = document.AddPage(); + + return document; + } + } +} diff --git a/Source/HtmlRenderer.PdfSharp/Properties/AssemblyInfo.cs b/Source/HtmlRenderer.PdfSharp/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..4cf73d1fa --- /dev/null +++ b/Source/HtmlRenderer.PdfSharp/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("HtmlRenderer.PdfSharp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("HtmlRenderer.PdfSharp")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5e2202c0-4a7c-453b-8f67-a590af6f4cfc")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs new file mode 100644 index 000000000..23a6a7d7c --- /dev/null +++ b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs @@ -0,0 +1,98 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using HtmlRenderer.Entities; +using PdfSharp.Drawing; + +namespace HtmlRenderer.PdfSharp.Utilities +{ + /// + /// Utilities for converting WinForms entities to HtmlRenderer core entities. + /// + internal static class Utils + { + /// + /// Convert from WinForms point to core point. + /// + public static PointInt Convert(XPoint p) + { + return new PointInt((float)p.X, (float)p.Y); + } + + /// + /// Convert from WinForms point to core point. + /// + public static XPoint[] Convert(PointInt[] points) + { + XPoint[] myPoints = new XPoint[points.Length]; + for (int i = 0; i < points.Length; i++) + myPoints[i] = Convert(points[i]); + return myPoints; + } + + /// + /// Convert from core point to WinForms point. + /// + public static XPoint Convert(PointInt p) + { + return new XPoint(p.X, p.Y); + } + + /// + /// Convert from WinForms size to core size. + /// + public static SizeInt Convert(XSize s) + { + return new SizeInt((float)s.Width, (float)s.Height); + } + + /// + /// Convert from core size to WinForms size. + /// + public static XSize Convert(SizeInt s) + { + return new XSize(s.Width, s.Height); + } + + /// + /// Convert from WinForms rectangle to core rectangle. + /// + public static RectangleInt Convert(XRect r) + { + return new RectangleInt((float)r.X, (float)r.Y, (float)r.Width, (float)r.Height); + } + + /// + /// Convert from core rectangle to WinForms rectangle. + /// + public static XRect Convert(RectangleInt r) + { + return new XRect(r.X, r.Y, r.Width, r.Height); + } + + /// + /// Convert from WinForms color to core color. + /// + public static ColorInt Convert(XColor c) + { + return ColorInt.FromArgb((int)c.A, c.R, c.G, c.B); + } + + /// + /// Convert from core color to WinForms color. + /// + public static XColor Convert(ColorInt c) + { + return XColor.FromArgb(c.A, c.R, c.G, c.B); + } + } +} diff --git a/Source/HtmlRenderer.PdfSharp/packages.config b/Source/HtmlRenderer.PdfSharp/packages.config new file mode 100644 index 000000000..4369cba8c --- /dev/null +++ b/Source/HtmlRenderer.PdfSharp/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs index 983f3147c..dcb1a5a3a 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs @@ -11,7 +11,6 @@ // "The Art of War" using System.Drawing; -using HtmlRenderer.Core; using HtmlRenderer.Entities; using HtmlRenderer.Interfaces; diff --git a/Source/HtmlRenderer.sln b/Source/HtmlRenderer.sln index 01d7bee8c..b115bea03 100644 --- a/Source/HtmlRenderer.sln +++ b/Source/HtmlRenderer.sln @@ -15,6 +15,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.WPF", "HtmlRen EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer", "HtmlRenderer\HtmlRenderer.csproj", "{FE611685-391F-4E3E-B27E-D3150E51E49B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.PdfSharp", "HtmlRenderer.PdfSharp\HtmlRenderer.PdfSharp.csproj", "{CA249F5D-9285-40A6-B217-5889EF79FD7E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -85,6 +87,16 @@ Global {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|Mixed Platforms.Build.0 = Release|Any CPU {FE611685-391F-4E3E-B27E-D3150E51E49B}.Release|x86.ActiveCfg = Release|Any CPU + {CA249F5D-9285-40A6-B217-5889EF79FD7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA249F5D-9285-40A6-B217-5889EF79FD7E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA249F5D-9285-40A6-B217-5889EF79FD7E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {CA249F5D-9285-40A6-B217-5889EF79FD7E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {CA249F5D-9285-40A6-B217-5889EF79FD7E}.Debug|x86.ActiveCfg = Debug|Any CPU + {CA249F5D-9285-40A6-B217-5889EF79FD7E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA249F5D-9285-40A6-B217-5889EF79FD7E}.Release|Any CPU.Build.0 = Release|Any CPU + {CA249F5D-9285-40A6-B217-5889EF79FD7E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {CA249F5D-9285-40A6-B217-5889EF79FD7E}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {CA249F5D-9285-40A6-B217-5889EF79FD7E}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From acc453880add15df01225e69c3d4a89e8a164bf8 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 1 Feb 2014 10:39:11 +0200 Subject: [PATCH 047/254] * refactor internal data types name to R prefix --- .../Adapters/GlobalAdapter.cs | 6 +- .../Adapters/GraphicsAdapter.cs | 26 +-- .../Adapters/PenAdapter.cs | 14 +- .../HtmlRenderer.PdfSharp/Utilities/Utils.cs | 26 +-- .../Adapters/ContextMenuAdapter.cs | 2 +- .../Adapters/ControlAdapter.cs | 2 +- .../Adapters/GlobalAdapter.cs | 6 +- .../Adapters/GraphicsAdapter.cs | 26 +-- .../Adapters/PenAdapter.cs | 14 +- Source/HtmlRenderer.WinForms/HtmlContainer.cs | 8 +- .../Utilities/CacheUtils.cs | 14 +- .../HtmlRenderer.WinForms/Utilities/Utils.cs | 32 +-- Source/HtmlRenderer/Core/Dom/CssBox.cs | 66 +++--- Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs | 28 +-- Source/HtmlRenderer/Core/Dom/CssBoxHr.cs | 8 +- Source/HtmlRenderer/Core/Dom/CssBoxImage.cs | 10 +- .../HtmlRenderer/Core/Dom/CssBoxProperties.cs | 68 +++--- .../HtmlRenderer/Core/Dom/CssLayoutEngine.cs | 14 +- .../Core/Dom/CssLayoutEngineTable.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssLineBox.cs | 16 +- Source/HtmlRenderer/Core/Dom/CssRect.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssRectImage.cs | 4 +- .../Handlers/BackgroundImageDrawHandler.cs | 24 +- .../Core/Handlers/BordersDrawHandler.cs | 58 ++--- .../Core/Handlers/ImageLoadHandler.cs | 10 +- .../Core/Handlers/SelectionHandler.cs | 20 +- Source/HtmlRenderer/Core/HtmlContainerInt.cs | 64 +++--- Source/HtmlRenderer/Core/HtmlRendererUtils.cs | 18 +- Source/HtmlRenderer/Core/Parse/CssParser.cs | 4 +- .../HtmlRenderer/Core/Parse/CssValueParser.cs | 30 +-- Source/HtmlRenderer/Core/Parse/DomParser.cs | 4 +- Source/HtmlRenderer/Core/Utils/CommonUtils.cs | 4 +- Source/HtmlRenderer/Core/Utils/CssUtils.cs | 4 +- Source/HtmlRenderer/Core/Utils/DomUtils.cs | 10 +- Source/HtmlRenderer/Core/Utils/FontsUtils.cs | 14 +- Source/HtmlRenderer/Core/Utils/RenderUtils.cs | 24 +- .../Entities/HtmlImageLoadEventArgs.cs | 16 +- .../Entities/HtmlScrollEventArgs.cs | 4 +- .../Entities/{ColorInt.cs => RColor.cs} | 86 +++---- .../{DashStyleInt.cs => RDashStyle.cs} | 2 +- .../{FontStyleInt.cs => RFontStyle.cs} | 2 +- .../Entities/{KeyEventInt.cs => RKeyEvent.cs} | 4 +- .../{MouseEventInt.cs => RMouseEvent.cs} | 4 +- .../Entities/{PointInt.cs => RPoint.cs} | 115 +++++----- .../Entities/{RectangleInt.cs => RRect.cs} | 216 +++++++++--------- .../Entities/{SizeInt.cs => RSize.cs} | 160 ++++++------- Source/HtmlRenderer/HtmlRenderer.csproj | 16 +- .../HtmlRenderer/Interfaces/IContextMenu.cs | 2 +- Source/HtmlRenderer/Interfaces/IControl.cs | 2 +- Source/HtmlRenderer/Interfaces/IGlobal.cs | 6 +- Source/HtmlRenderer/Interfaces/IGraphics.cs | 26 +-- Source/HtmlRenderer/Interfaces/IPen.cs | 2 +- 52 files changed, 674 insertions(+), 675 deletions(-) rename Source/HtmlRenderer/Entities/{ColorInt.cs => RColor.cs} (69%) rename Source/HtmlRenderer/Entities/{DashStyleInt.cs => RDashStyle.cs} (95%) rename Source/HtmlRenderer/Entities/{FontStyleInt.cs => RFontStyle.cs} (95%) rename Source/HtmlRenderer/Entities/{KeyEventInt.cs => RKeyEvent.cs} (93%) rename Source/HtmlRenderer/Entities/{MouseEventInt.cs => RMouseEvent.cs} (91%) rename Source/HtmlRenderer/Entities/{PointInt.cs => RPoint.cs} (65%) rename Source/HtmlRenderer/Entities/{RectangleInt.cs => RRect.cs} (61%) rename Source/HtmlRenderer/Entities/{SizeInt.cs => RSize.cs} (56%) diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs index f1939e30a..00ef7f033 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs @@ -64,7 +64,7 @@ public static GlobalAdapter Instance /// /// the color name /// color value - public ColorInt ResolveColorFromName(string colorName) + public RColor ResolveColorFromName(string colorName) { var color = XColor.FromName(colorName); return Utils.Convert(color); @@ -97,7 +97,7 @@ public override IImage ImageFromStream(Stream memoryStream) /// /// /// - public IFont CreateFont(string family, float size, FontStyleInt style) + public IFont CreateFont(string family, float size, RFontStyle style) { var fontStyle = (XFontStyle)( (int)style ); return new FontAdapter(new XFont(family, size, fontStyle)); @@ -110,7 +110,7 @@ public IFont CreateFont(string family, float size, FontStyleInt style) /// /// /// - public IFont CreateFont(IFontFamily family, float size, FontStyleInt style) + public IFont CreateFont(IFontFamily family, float size, RFontStyle style) { var fontStyle = (XFontStyle)((int)style); return new FontAdapter(new XFont(( (FontFamilyAdapter)family ).FontFamily.Name, size, fontStyle)); diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs index 8f8204db2..e12096520 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs @@ -58,7 +58,7 @@ public GraphicsAdapter(XGraphics g, bool releaseGraphics = false) /// Gets the bounding clipping region of this graphics. /// /// The bounding rectangle for the clipping region - public RectangleInt GetClip() + public RRect GetClip() { RectangleF clip = _g.Graphics.ClipBounds; return Utils.Convert(clip); @@ -68,7 +68,7 @@ public RectangleInt GetClip() /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. /// /// Rectangle structure to combine. - public void SetClipReplace(RectangleInt rect) + public void SetClipReplace(RRect rect) { _g.Graphics.SetClip(new RectangleF(rect.X, rect.Y, rect.Width, rect.Height), CombineMode.Replace); } @@ -77,7 +77,7 @@ public void SetClipReplace(RectangleInt rect) /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. /// /// Rectangle structure to combine. - public void SetClipExclude(RectangleInt rect) + public void SetClipExclude(RRect rect) { _g.Graphics.SetClip(new RectangleF(rect.X, rect.Y, rect.Width, rect.Height), CombineMode.Exclude); } @@ -113,7 +113,7 @@ public void ReturnPreviousSmoothingMode(Object prevMode) /// the string to measure /// the font to measure string with /// the size of the string - public SizeInt MeasureString(string str, IFont font) + public RSize MeasureString(string str, IFont font) { var fontAdapter = (FontAdapter)font; var realFont = fontAdapter.Font; @@ -142,7 +142,7 @@ public SizeInt MeasureString(string str, IFont font) /// the number of characters that will fit under restriction /// /// the size of the string - public SizeInt MeasureString(string str, IFont font, float maxWidth, out int charFit, out int charFitWidth) + public RSize MeasureString(string str, IFont font, float maxWidth, out int charFit, out int charFitWidth) { throw new NotSupportedException(); } @@ -155,7 +155,7 @@ public SizeInt MeasureString(string str, IFont font, float maxWidth, out int cha /// the text color to set /// the location to start string draw (top-left) /// used to know the size of the rendered text for transparent text support - public void DrawString(String str, IFont font, ColorInt color, PointInt point, SizeInt size) + public void DrawString(String str, IFont font, RColor color, RPoint point, RSize size) { var brush = new XSolidBrush(Utils.Convert(color)); _g.DrawString(str, ( (FontAdapter)font ).Font, brush, point.X - font.LeftPadding*.8f, point.Y); @@ -166,7 +166,7 @@ public void DrawString(String str, IFont font, ColorInt color, PointInt point, S /// /// the color to get the pen for /// pen instance - public IPen GetPen(ColorInt color) + public IPen GetPen(RColor color) { return new PenAdapter(new XPen(Utils.Convert(color))); } @@ -176,7 +176,7 @@ public IPen GetPen(ColorInt color) /// /// the color to get the brush for /// solid color brush instance - public IBrush GetSolidBrush(ColorInt color) + public IBrush GetSolidBrush(RColor color) { return new BrushAdapter(new XSolidBrush(Utils.Convert(color))); } @@ -189,7 +189,7 @@ public IBrush GetSolidBrush(ColorInt color) /// the end color of the gradient /// the angle to move the gradient from start color to end color in the rectangle /// linear gradient color brush instance - public IBrush GetLinearGradientBrush(RectangleInt rect, ColorInt color1, ColorInt color2, float angle) + public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, float angle) { XLinearGradientMode mode; if(angle < 45) @@ -209,7 +209,7 @@ public IBrush GetLinearGradientBrush(RectangleInt rect, ColorInt color1, ColorIn /// The Image object with which this TextureBrush object fills interiors. /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. /// The dimension by which to translate the transformation - public IBrush GetTextureBrush(IImage image, RectangleInt dstRect, PointInt translateTransformLocation) + public IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation) { // atodo: handle missing TextureBrush // var brush = new TextureBrush(((ImageAdapter)image).Image, Utils.Convert(dstRect)); @@ -283,7 +283,7 @@ public void FillRectangle(IBrush brush, float x, float y, float width, float hei /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. The image is scaled to fit the rectangle. /// Rectangle structure that specifies the portion of the object to draw. - public void DrawImage(IImage image, RectangleInt destRect, RectangleInt srcRect) + public void DrawImage(IImage image, RRect destRect, RRect srcRect) { _g.DrawImage(((ImageAdapter)image).Image, Utils.Convert(destRect), Utils.Convert(srcRect), XGraphicsUnit.Point); } @@ -293,7 +293,7 @@ public void DrawImage(IImage image, RectangleInt destRect, RectangleInt srcRect) /// /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. - public void DrawImage(IImage image, RectangleInt destRect) + public void DrawImage(IImage image, RRect destRect) { _g.DrawImage(( (ImageAdapter)image ).Image, Utils.Convert(destRect)); } @@ -323,7 +323,7 @@ public void FillPath(IBrush brush, IGraphicsPath path) /// /// Brush that determines the characteristics of the fill. /// Array of Point structures that represent the vertices of the polygon to fill. - public void FillPolygon(IBrush brush, PointInt[] points) + public void FillPolygon(IBrush brush, RPoint[] points) { if( points != null && points.Length > 0 ) { diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs index 88b822fb1..ee1ca9624 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs @@ -54,28 +54,28 @@ public float Width /// /// Gets or sets the style used for dashed lines drawn with this Pen. /// - public DashStyleInt DashStyle + public RDashStyle DashStyle { set { switch( value ) { - case DashStyleInt.Solid: + case RDashStyle.Solid: _pen.DashStyle = XDashStyle.Solid; break; - case DashStyleInt.Dash: + case RDashStyle.Dash: _pen.DashStyle = XDashStyle.Dash; break; - case DashStyleInt.Dot: + case RDashStyle.Dot: _pen.DashStyle = XDashStyle.Dot; break; - case DashStyleInt.DashDot: + case RDashStyle.DashDot: _pen.DashStyle = XDashStyle.DashDot; break; - case DashStyleInt.DashDotDot: + case RDashStyle.DashDotDot: _pen.DashStyle = XDashStyle.DashDotDot; break; - case DashStyleInt.Custom: + case RDashStyle.Custom: _pen.DashStyle = XDashStyle.Custom; break; default: diff --git a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs index 23a6a7d7c..f6a2ba505 100644 --- a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs +++ b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs @@ -23,15 +23,15 @@ internal static class Utils /// /// Convert from WinForms point to core point. /// - public static PointInt Convert(XPoint p) + public static RPoint Convert(XPoint p) { - return new PointInt((float)p.X, (float)p.Y); + return new RPoint((float)p.X, (float)p.Y); } /// /// Convert from WinForms point to core point. /// - public static XPoint[] Convert(PointInt[] points) + public static XPoint[] Convert(RPoint[] points) { XPoint[] myPoints = new XPoint[points.Length]; for (int i = 0; i < points.Length; i++) @@ -42,7 +42,7 @@ public static XPoint[] Convert(PointInt[] points) /// /// Convert from core point to WinForms point. /// - public static XPoint Convert(PointInt p) + public static XPoint Convert(RPoint p) { return new XPoint(p.X, p.Y); } @@ -50,15 +50,15 @@ public static XPoint Convert(PointInt p) /// /// Convert from WinForms size to core size. /// - public static SizeInt Convert(XSize s) + public static RSize Convert(XSize s) { - return new SizeInt((float)s.Width, (float)s.Height); + return new RSize((float)s.Width, (float)s.Height); } /// /// Convert from core size to WinForms size. /// - public static XSize Convert(SizeInt s) + public static XSize Convert(RSize s) { return new XSize(s.Width, s.Height); } @@ -66,15 +66,15 @@ public static XSize Convert(SizeInt s) /// /// Convert from WinForms rectangle to core rectangle. /// - public static RectangleInt Convert(XRect r) + public static RRect Convert(XRect r) { - return new RectangleInt((float)r.X, (float)r.Y, (float)r.Width, (float)r.Height); + return new RRect((float)r.X, (float)r.Y, (float)r.Width, (float)r.Height); } /// /// Convert from core rectangle to WinForms rectangle. /// - public static XRect Convert(RectangleInt r) + public static XRect Convert(RRect r) { return new XRect(r.X, r.Y, r.Width, r.Height); } @@ -82,15 +82,15 @@ public static XRect Convert(RectangleInt r) /// /// Convert from WinForms color to core color. /// - public static ColorInt Convert(XColor c) + public static RColor Convert(XColor c) { - return ColorInt.FromArgb((int)c.A, c.R, c.G, c.B); + return RColor.FromArgb((int)c.A, c.R, c.G, c.B); } /// /// Convert from core color to WinForms color. /// - public static XColor Convert(ColorInt c) + public static XColor Convert(RColor c) { return XColor.FromArgb(c.A, c.R, c.G, c.B); } diff --git a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs index 953b1b0ac..e4bf22b73 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs @@ -90,7 +90,7 @@ public void RemoveLastDivider() /// /// the parent control to show in /// the location to show at relative to the parent control - public void Show(IControl parent, PointInt location) + public void Show(IControl parent, RPoint location) { _contextMenu.Show(( (ControlAdapter)parent ).Control, Utils.ConvertRound(location)); } diff --git a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs index f861a4a54..527d7a384 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs @@ -41,7 +41,7 @@ public ControlAdapter(Control control) /// /// Get the current location of the mouse relative to the control /// - public PointInt MouseLocation + public RPoint MouseLocation { get { return Utils.Convert(_control.PointToClient(Control.MousePosition)); } } diff --git a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs index f50fc5fe0..3bd2ed480 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs @@ -63,7 +63,7 @@ public static GlobalAdapter Instance /// /// the color name /// color value - public ColorInt ResolveColorFromName(string colorName) + public RColor ResolveColorFromName(string colorName) { var color = Color.FromName(colorName); return Utils.Convert(color); @@ -96,7 +96,7 @@ public override IImage ImageFromStream(Stream memoryStream) /// /// /// - public IFont CreateFont(string family, float size, FontStyleInt style) + public IFont CreateFont(string family, float size, RFontStyle style) { var fontStyle = (FontStyle)( (int)style ); return new FontAdapter(new Font(family, size, fontStyle)); @@ -109,7 +109,7 @@ public IFont CreateFont(string family, float size, FontStyleInt style) /// /// /// - public IFont CreateFont(IFontFamily family, float size, FontStyleInt style) + public IFont CreateFont(IFontFamily family, float size, RFontStyle style) { var fontStyle = (FontStyle)((int)style); return new FontAdapter(new Font(( (FontFamilyAdapter)family ).FontFamily, size, fontStyle)); diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs index a5871ac68..b59ec3ca2 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs @@ -98,7 +98,7 @@ public GraphicsAdapter(Graphics g, bool useGdiPlusTextRendering, bool releaseGra /// Gets the bounding clipping region of this graphics. /// /// The bounding rectangle for the clipping region - public RectangleInt GetClip() + public RRect GetClip() { RectangleF clip; if (_hdc == IntPtr.Zero) @@ -118,7 +118,7 @@ public RectangleInt GetClip() /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. /// /// Rectangle structure to combine. - public void SetClipReplace(RectangleInt rect) + public void SetClipReplace(RRect rect) { ReleaseHdc(); _g.SetClip(Utils.Convert(rect), CombineMode.Replace); @@ -128,7 +128,7 @@ public void SetClipReplace(RectangleInt rect) /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. /// /// Rectangle structure to combine. - public void SetClipExclude(RectangleInt rect) + public void SetClipExclude(RRect rect) { ReleaseHdc(); _g.SetClip(Utils.Convert(rect), CombineMode.Exclude); @@ -167,7 +167,7 @@ public void ReturnPreviousSmoothingMode(Object prevMode) /// the string to measure /// the font to measure string with /// the size of the string - public SizeInt MeasureString(string str, IFont font) + public RSize MeasureString(string str, IFont font) { if (_useGdiPlusTextRendering) { @@ -216,7 +216,7 @@ public SizeInt MeasureString(string str, IFont font) /// the number of characters that will fit under restriction /// /// the size of the string - public SizeInt MeasureString(string str, IFont font, float maxWidth, out int charFit, out int charFitWidth) + public RSize MeasureString(string str, IFont font, float maxWidth, out int charFit, out int charFitWidth) { if( _useGdiPlusTextRendering ) { @@ -243,7 +243,7 @@ public SizeInt MeasureString(string str, IFont font, float maxWidth, out int cha /// the text color to set /// the location to start string draw (top-left) /// used to know the size of the rendered text for transparent text support - public void DrawString(String str, IFont font, ColorInt color, PointInt point, SizeInt size) + public void DrawString(String str, IFont font, RColor color, RPoint point, RSize size) { var pointConv = Utils.ConvertRound(point); var colorConv = Utils.Convert(color); @@ -276,7 +276,7 @@ public void DrawString(String str, IFont font, ColorInt color, PointInt point, S /// /// the color to get the pen for /// pen instance - public IPen GetPen(ColorInt color) + public IPen GetPen(RColor color) { return CacheUtils.GetPen(color); } @@ -286,7 +286,7 @@ public IPen GetPen(ColorInt color) /// /// the color to get the brush for /// solid color brush instance - public IBrush GetSolidBrush(ColorInt color) + public IBrush GetSolidBrush(RColor color) { return CacheUtils.GetSolidBrush(color); } @@ -299,7 +299,7 @@ public IBrush GetSolidBrush(ColorInt color) /// the end color of the gradient /// the angle to move the gradient from start color to end color in the rectangle /// linear gradient color brush instance - public IBrush GetLinearGradientBrush(RectangleInt rect, ColorInt color1, ColorInt color2, float angle) + public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, float angle) { return new BrushAdapter(new LinearGradientBrush(Utils.Convert(rect), Utils.Convert(color1), Utils.Convert(color2), angle), true); } @@ -310,7 +310,7 @@ public IBrush GetLinearGradientBrush(RectangleInt rect, ColorInt color1, ColorIn /// The Image object with which this TextureBrush object fills interiors. /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. /// The dimension by which to translate the transformation - public IBrush GetTextureBrush(IImage image, RectangleInt dstRect, PointInt translateTransformLocation) + public IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation) { var brush = new TextureBrush(((ImageAdapter)image).Image, Utils.Convert(dstRect)); brush.TranslateTransform(translateTransformLocation.X, translateTransformLocation.Y); @@ -386,7 +386,7 @@ public void FillRectangle(IBrush brush, float x, float y, float width, float hei /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. The image is scaled to fit the rectangle. /// Rectangle structure that specifies the portion of the object to draw. - public void DrawImage(IImage image, RectangleInt destRect, RectangleInt srcRect) + public void DrawImage(IImage image, RRect destRect, RRect srcRect) { ReleaseHdc(); _g.DrawImage(((ImageAdapter)image).Image, Utils.Convert(destRect), Utils.Convert(srcRect), GraphicsUnit.Pixel); @@ -397,7 +397,7 @@ public void DrawImage(IImage image, RectangleInt destRect, RectangleInt srcRect) /// /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. - public void DrawImage(IImage image, RectangleInt destRect) + public void DrawImage(IImage image, RRect destRect) { ReleaseHdc(); _g.DrawImage(( (ImageAdapter)image ).Image, Utils.Convert(destRect)); @@ -429,7 +429,7 @@ public void FillPath(IBrush brush, IGraphicsPath path) /// /// Brush that determines the characteristics of the fill. /// Array of Point structures that represent the vertices of the polygon to fill. - public void FillPolygon(IBrush brush, PointInt[] points) + public void FillPolygon(IBrush brush, RPoint[] points) { if( points != null && points.Length > 0 ) { diff --git a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs index dcb1a5a3a..13bdb7c40 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs @@ -54,28 +54,28 @@ public float Width /// /// Gets or sets the style used for dashed lines drawn with this Pen. /// - public DashStyleInt DashStyle + public RDashStyle DashStyle { set { switch( value ) { - case DashStyleInt.Solid: + case RDashStyle.Solid: _pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; break; - case DashStyleInt.Dash: + case RDashStyle.Dash: _pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; break; - case DashStyleInt.Dot: + case RDashStyle.Dot: _pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; break; - case DashStyleInt.DashDot: + case RDashStyle.DashDot: _pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot; break; - case DashStyleInt.DashDotDot: + case RDashStyle.DashDotDot: _pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot; break; - case DashStyleInt.Custom: + case RDashStyle.Custom: _pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom; break; default: diff --git a/Source/HtmlRenderer.WinForms/HtmlContainer.cs b/Source/HtmlRenderer.WinForms/HtmlContainer.cs index 0e7aafcea..8d6621d43 100644 --- a/Source/HtmlRenderer.WinForms/HtmlContainer.cs +++ b/Source/HtmlRenderer.WinForms/HtmlContainer.cs @@ -458,17 +458,17 @@ public void Dispose() /// /// Create HtmlRenderer mouse event from win forms mouse event. /// - private static MouseEventInt CreateMouseEvent(MouseEventArgs e) + private static RMouseEvent CreateMouseEvent(MouseEventArgs e) { - return new MouseEventInt((e.Button & MouseButtons.Left) != 0); + return new RMouseEvent((e.Button & MouseButtons.Left) != 0); } /// /// Create HtmlRenderer key event from win forms key event. /// - private static KeyEventInt CreateKeyEevent(KeyEventArgs e) + private static RKeyEvent CreateKeyEevent(KeyEventArgs e) { - return new KeyEventInt(e.Control, e.KeyCode == Keys.A, e.KeyCode == Keys.C); + return new RKeyEvent(e.Control, e.KeyCode == Keys.A, e.KeyCode == Keys.C); } #endregion diff --git a/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs b/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs index 7d9c8abca..da7f2e7fd 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs @@ -28,12 +28,12 @@ internal static class CacheUtils /// /// cache of brush color to brush instance /// - private static readonly Dictionary _brushesCache = new Dictionary(); + private static readonly Dictionary _brushesCache = new Dictionary(); /// /// cache of pen color to pen instance /// - private static readonly Dictionary _penCache = new Dictionary(); + private static readonly Dictionary _penCache = new Dictionary(); #endregion @@ -42,7 +42,7 @@ internal static class CacheUtils /// /// the color to get pen for /// pen instance - public static IPen GetPen(ColorInt color) + public static IPen GetPen(RColor color) { IPen pen; if (!_penCache.TryGetValue(color, out pen)) @@ -59,17 +59,17 @@ public static IPen GetPen(ColorInt color) /// /// the color to get brush for /// brush instance - public static IBrush GetSolidBrush(ColorInt color) + public static IBrush GetSolidBrush(RColor color) { IBrush brush; if( !_brushesCache.TryGetValue(color, out brush) ) { Brush solidBrush; - if( color == ColorInt.White ) + if( color == RColor.White ) solidBrush = Brushes.White; - else if( color == ColorInt.Black ) + else if( color == RColor.Black ) solidBrush = Brushes.Black; - else if (color == ColorInt.WhiteSmoke) + else if (color == RColor.WhiteSmoke) solidBrush = Brushes.WhiteSmoke; else if( color.A < 1 ) solidBrush = Brushes.Transparent; diff --git a/Source/HtmlRenderer.WinForms/Utilities/Utils.cs b/Source/HtmlRenderer.WinForms/Utilities/Utils.cs index 800b35f8a..8f7c09346 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/Utils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/Utils.cs @@ -24,15 +24,15 @@ internal static class Utils /// /// Convert from WinForms point to core point. /// - public static PointInt Convert(PointF p) + public static RPoint Convert(PointF p) { - return new PointInt(p.X, p.Y); + return new RPoint(p.X, p.Y); } /// /// Convert from WinForms point to core point. /// - public static PointF[] Convert(PointInt[] points) + public static PointF[] Convert(RPoint[] points) { PointF[] myPoints = new PointF[points.Length]; for (int i = 0; i < points.Length; i++) @@ -43,7 +43,7 @@ public static PointF[] Convert(PointInt[] points) /// /// Convert from core point to WinForms point. /// - public static PointF Convert(PointInt p) + public static PointF Convert(RPoint p) { return new PointF(p.X, p.Y); } @@ -51,7 +51,7 @@ public static PointF Convert(PointInt p) /// /// Convert from core point to WinForms point. /// - public static Point ConvertRound(PointInt p) + public static Point ConvertRound(RPoint p) { return new Point((int)Math.Round(p.X), (int)Math.Round(p.Y)); } @@ -59,15 +59,15 @@ public static Point ConvertRound(PointInt p) /// /// Convert from WinForms size to core size. /// - public static SizeInt Convert(SizeF s) + public static RSize Convert(SizeF s) { - return new SizeInt(s.Width, s.Height); + return new RSize(s.Width, s.Height); } /// /// Convert from core size to WinForms size. /// - public static SizeF Convert(SizeInt s) + public static SizeF Convert(RSize s) { return new SizeF(s.Width, s.Height); } @@ -75,7 +75,7 @@ public static SizeF Convert(SizeInt s) /// /// Convert from core size to WinForms size. /// - public static Size ConvertRound(SizeInt s) + public static Size ConvertRound(RSize s) { return new Size((int)Math.Round(s.Width), (int)Math.Round(s.Height)); } @@ -83,15 +83,15 @@ public static Size ConvertRound(SizeInt s) /// /// Convert from WinForms rectangle to core rectangle. /// - public static RectangleInt Convert(RectangleF r) + public static RRect Convert(RectangleF r) { - return new RectangleInt(r.X, r.Y, r.Width, r.Height); + return new RRect(r.X, r.Y, r.Width, r.Height); } /// /// Convert from core rectangle to WinForms rectangle. /// - public static RectangleF Convert(RectangleInt r) + public static RectangleF Convert(RRect r) { return new RectangleF(r.X, r.Y, r.Width, r.Height); } @@ -99,7 +99,7 @@ public static RectangleF Convert(RectangleInt r) /// /// Convert from core rectangle to WinForms rectangle. /// - public static Rectangle ConvertRound(RectangleInt r) + public static Rectangle ConvertRound(RRect r) { return new Rectangle((int)Math.Round(r.X), (int)Math.Round(r.Y), (int)Math.Round(r.Width), (int)Math.Round(r.Height)); } @@ -107,15 +107,15 @@ public static Rectangle ConvertRound(RectangleInt r) /// /// Convert from WinForms color to core color. /// - public static ColorInt Convert(Color c) + public static RColor Convert(Color c) { - return ColorInt.FromArgb(c.A, c.R, c.G, c.B); + return RColor.FromArgb(c.A, c.R, c.G, c.B); } /// /// Convert from core color to WinForms color. /// - public static Color Convert(ColorInt c) + public static Color Convert(RColor c) { return Color.FromArgb(c.A, c.R, c.G, c.B); } diff --git a/Source/HtmlRenderer/Core/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs index 2ad88969d..f207bdc88 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -55,7 +55,7 @@ internal class CssBox : CssBoxProperties, IDisposable private readonly List _boxes = new List(); private readonly List _lineBoxes = new List(); private readonly List _parentLineBoxes = new List(); - private readonly Dictionary _rectangles = new Dictionary(); + private readonly Dictionary _rectangles = new Dictionary(); /// /// the inner text of the box @@ -280,7 +280,7 @@ internal List ParentLineBoxes /// /// Gets the rectangles where this box should be painted /// - internal Dictionary Rectangles + internal Dictionary Rectangles { get { return _rectangles; } } @@ -447,7 +447,7 @@ public void Paint(IGraphics g) rect.Offset(HtmlContainer.ScrollOffset); clip.Intersect(rect); - if (clip != RectangleInt.Empty) + if (clip != RRect.Empty) visible = true; } @@ -585,10 +585,10 @@ protected virtual void PerformLayoutImp(IGraphics g) width = CssValueParser.ParseLength(Width, width, this); } - Size = new SizeInt(width, Size.Height); + Size = new RSize(width, Size.Height); // must be separate because the margin can be calculated by percentage of the width - Size = new SizeInt(width - ActualMarginLeft - ActualMarginRight, Size.Height); + Size = new RSize(width - ActualMarginLeft - ActualMarginRight, Size.Height); } if( Display != CssConstants.TableCell ) @@ -596,7 +596,7 @@ protected virtual void PerformLayoutImp(IGraphics g) var prevSibling = DomUtils.GetPreviousSibling(this); float left = ContainingBlock.Location.X + ContainingBlock.ActualPaddingLeft + ActualMarginLeft + ContainingBlock.ActualBorderLeftWidth; float top = ( prevSibling == null && ParentBox != null ? ParentBox.ClientTop : ParentBox == null ? Location.Y : 0 ) + MarginTopCollapse(prevSibling) + ( prevSibling != null ? prevSibling.ActualBottom + prevSibling.ActualBorderBottomWidth : 0 ); - Location = new PointInt(left, top); + Location = new RPoint(left, top); ActualBottom = top; } @@ -629,7 +629,7 @@ protected virtual void PerformLayoutImp(IGraphics g) var prevSibling = DomUtils.GetPreviousSibling(this); if( prevSibling != null ) { - if( Location == PointInt.Empty ) + if( Location == RPoint.Empty ) Location = prevSibling.Location; ActualBottom = prevSibling.ActualBottom; } @@ -639,7 +639,7 @@ protected virtual void PerformLayoutImp(IGraphics g) CreateListItemBox(g); var actualWidth = Math.Max(GetMinimumWidth() + GetWidthMarginDeep(this), Size.Width < 90999 ? ActualRight : 0); - HtmlContainer.ActualSize = CommonUtils.Max(HtmlContainer.ActualSize, new SizeInt(actualWidth, ActualBottom - HtmlContainer.Root.Location.Y)); + HtmlContainer.ActualSize = CommonUtils.Max(HtmlContainer.ActualSize, new RSize(actualWidth, ActualBottom - HtmlContainer.Root.Location.Y)); } /// @@ -760,7 +760,7 @@ private void CreateListItemBox(IGraphics g) _listItemBox.ParseToWords(); _listItemBox.PerformLayoutImp(g); - _listItemBox.Size = new SizeInt(_listItemBox.Words[0].Width, _listItemBox.Words[0].Height); + _listItemBox.Size = new RSize(_listItemBox.Words[0].Width, _listItemBox.Words[0].Height); } _listItemBox.Words[0].Left = Location.X - _listItemBox.Size.Width - 5; _listItemBox.Words[0].Top = Location.Y + ActualPaddingTop;// +FontAscent; @@ -1105,8 +1105,8 @@ internal void OffsetTop(float amount) foreach (CssLineBox line in lines) { - RectangleInt r = Rectangles[line]; - Rectangles[line] = new RectangleInt(r.X, r.Y + amount, r.Width, r.Height); + RRect r = Rectangles[line]; + Rectangles[line] = new RRect(r.X, r.Y + amount, r.Width, r.Height); } foreach (CssRect word in Words) @@ -1122,7 +1122,7 @@ internal void OffsetTop(float amount) if (_listItemBox != null) _listItemBox.OffsetTop(amount); - Location = new PointInt(Location.X, Location.Y + amount); + Location = new RPoint(Location.X, Location.Y + amount); } /// @@ -1135,10 +1135,10 @@ protected virtual void PaintImp(IGraphics g) { var prevClip = RenderUtils.ClipGraphicsByOverflow(g, this); - var areas = Rectangles.Count == 0 ? new List(new[] { Bounds }) : new List(Rectangles.Values); + var areas = Rectangles.Count == 0 ? new List(new[] { Bounds }) : new List(Rectangles.Values); - RectangleInt[] rects = areas.ToArray(); - PointInt offset = HtmlContainer.ScrollOffset; + RRect[] rects = areas.ToArray(); + RPoint offset = HtmlContainer.ScrollOffset; for (int i = 0; i < rects.Length; i++) { @@ -1186,7 +1186,7 @@ protected virtual void PaintImp(IGraphics g) /// the bounding rectangle to draw in /// is it the first rectangle of the element /// is it the last rectangle of the element - protected void PaintBackground(IGraphics g, RectangleInt rect, bool isFirst, bool isLast) + protected void PaintBackground(IGraphics g, RRect rect, bool isFirst, bool isLast) { if (rect.Width > 0 && rect.Height > 0) { @@ -1246,11 +1246,11 @@ protected void PaintBackground(IGraphics g, RectangleInt rect, bool isFirst, boo /// /// the device to draw into /// the current scroll offset to offset the words - private void PaintWords(IGraphics g, PointInt offset) + private void PaintWords(IGraphics g, RPoint offset) { foreach (var word in Words) { - var wordPoint = new PointInt(word.Left + offset.X, word.Top + offset.Y); + var wordPoint = new RPoint(word.Left + offset.X, word.Top + offset.Y); if (word.Selected) { // handle paint selected word background and with partial word selection @@ -1258,28 +1258,28 @@ private void PaintWords(IGraphics g, PointInt offset) var left = word.SelectedStartOffset > -1 ? word.SelectedStartOffset : (wordLine.Words[0] != word && word.HasSpaceBefore ? -ActualWordSpacing : 0); var padWordRight = word.HasSpaceAfter && !wordLine.IsLastSelectedWord(word); var width = word.SelectedEndOffset > -1 ? word.SelectedEndOffset : word.Width + (padWordRight ? ActualWordSpacing : 0); - var rect = new RectangleInt(word.Left + offset.X + left, word.Top + offset.Y, width - left, wordLine.LineHeight); + var rect = new RRect(word.Left + offset.X + left, word.Top + offset.Y, width - left, wordLine.LineHeight); g.FillRectangle(GetSelectionBackBrush(g, false), rect.X, rect.Y, rect.Width, rect.Height); - if (HtmlContainer.SelectionForeColor != ColorInt.Empty && (word.SelectedStartOffset > 0 || word.SelectedEndIndexOffset > -1)) + if (HtmlContainer.SelectionForeColor != RColor.Empty && (word.SelectedStartOffset > 0 || word.SelectedEndIndexOffset > -1)) { var orgClip = g.GetClip(); g.SetClipExclude(rect); - g.DrawString(word.Text, ActualFont, ActualColor, wordPoint, new SizeInt(word.Width, word.Height)); + g.DrawString(word.Text, ActualFont, ActualColor, wordPoint, new RSize(word.Width, word.Height)); g.SetClipReplace(rect); - g.DrawString(word.Text, ActualFont, GetSelectionForeBrush(), wordPoint, new SizeInt(word.Width, word.Height)); + g.DrawString(word.Text, ActualFont, GetSelectionForeBrush(), wordPoint, new RSize(word.Width, word.Height)); g.SetClipReplace(orgClip); } else { - g.DrawString(word.Text, ActualFont, GetSelectionForeBrush(), wordPoint, new SizeInt(word.Width, word.Height)); + g.DrawString(word.Text, ActualFont, GetSelectionForeBrush(), wordPoint, new RSize(word.Width, word.Height)); } } else { //g.DrawRectangle(Pens.Red, wordPoint.X, wordPoint.Y, word.Width - 1, word.Height - 1); - g.DrawString(word.Text, ActualFont, ActualColor, wordPoint, new SizeInt(word.Width, word.Height)); + g.DrawString(word.Text, ActualFont, ActualColor, wordPoint, new RSize(word.Width, word.Height)); } } } @@ -1291,7 +1291,7 @@ private void PaintWords(IGraphics g, PointInt offset) /// /// /// - protected void PaintDecoration(IGraphics g, RectangleInt rectangle, bool isFirst, bool isLast) + protected void PaintDecoration(IGraphics g, RRect rectangle, bool isFirst, bool isLast) { if (string.IsNullOrEmpty(TextDecoration) || TextDecoration == CssConstants.None) return; @@ -1334,7 +1334,7 @@ internal void OffsetRectangle(CssLineBox lineBox, float gap) if (Rectangles.ContainsKey(lineBox)) { var r = Rectangles[lineBox]; - Rectangles[lineBox] = new RectangleInt(r.X, r.Y + gap, r.Width, r.Height); + Rectangles[lineBox] = new RRect(r.X, r.Y + gap, r.Width, r.Height); } } @@ -1352,7 +1352,7 @@ internal void RectanglesReset() /// the image loaded or null if failed /// the source rectangle to draw in the image (empty - draw everything) /// is the callback was called async to load image call - private void OnImageLoadComplete(IImage image, RectangleInt rectangle, bool async) + private void OnImageLoadComplete(IImage image, RRect rectangle, bool async) { if (image != null && async) HtmlContainer.RequestRefresh(false); @@ -1361,9 +1361,9 @@ private void OnImageLoadComplete(IImage image, RectangleInt rectangle, bool asyn /// /// Get brush for the text depending if there is selected text color set. /// - protected ColorInt GetSelectionForeBrush() + protected RColor GetSelectionForeBrush() { - return HtmlContainer.SelectionForeColor != ColorInt.Empty ? HtmlContainer.SelectionForeColor : ActualColor; + return HtmlContainer.SelectionForeColor != RColor.Empty ? HtmlContainer.SelectionForeColor : ActualColor; } /// @@ -1374,10 +1374,10 @@ protected ColorInt GetSelectionForeBrush() protected IBrush GetSelectionBackBrush(IGraphics g, bool forceAlpha) { var backColor = HtmlContainer.SelectionBackColor; - if (backColor != ColorInt.Empty) + if (backColor != RColor.Empty) { if (forceAlpha && backColor.A > 180) - return g.GetSolidBrush(ColorInt.FromArgb(180, backColor.R, backColor.G, backColor.B)); + return g.GetSolidBrush(RColor.FromArgb(180, backColor.R, backColor.G, backColor.B)); else return g.GetSolidBrush(backColor); } @@ -1387,12 +1387,12 @@ protected IBrush GetSelectionBackBrush(IGraphics g, bool forceAlpha) } } - protected override IFont GetCachedFont(string fontFamily, float fsize, FontStyleInt st) + protected override IFont GetCachedFont(string fontFamily, float fsize, RFontStyle st) { return FontsUtils.GetCachedFont(HtmlContainer, fontFamily, fsize, st); } - protected override ColorInt GetActualColor(string colorStr) + protected override RColor GetActualColor(string colorStr) { return HtmlContainer.CssParser.ParseColor(colorStr); } diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs index f08e369bb..5458adc5c 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs @@ -399,7 +399,7 @@ protected override void PaintImp(IGraphics g) { var rects = CommonUtils.GetFirstValueOrDefault(Rectangles); - PointInt offset = HtmlContainer != null ? HtmlContainer.ScrollOffset : PointInt.Empty; + RPoint offset = HtmlContainer != null ? HtmlContainer.ScrollOffset : RPoint.Empty; rects.Offset(offset); var prevClip = RenderUtils.ClipGraphicsByOverflow(g, this); @@ -429,11 +429,11 @@ protected override void PaintImp(IGraphics g) /// /// Draw video image over the iframe if found. /// - private void DrawImage(IGraphics g, PointInt offset, RectangleInt rect) + private void DrawImage(IGraphics g, RPoint offset, RRect rect) { if (_imageWord.Image != null) { - if (_imageWord.ImageRectangle == RectangleInt.Empty) + if (_imageWord.ImageRectangle == RRect.Empty) g.DrawImage(_imageWord.Image, rect); else g.DrawImage(_imageWord.Image, rect, _imageWord.ImageRectangle); @@ -448,7 +448,7 @@ private void DrawImage(IGraphics g, PointInt offset, RectangleInt rect) RenderUtils.DrawImageLoadingIcon(g, HtmlContainer, rect); if (rect.Width > 19 && rect.Height > 19) { - g.DrawRectangle(g.GetPen(ColorInt.LightGray), rect.X, rect.Y, rect.Width, rect.Height); + g.DrawRectangle(g.GetPen(RColor.LightGray), rect.X, rect.Y, rect.Width, rect.Height); } } } @@ -456,38 +456,38 @@ private void DrawImage(IGraphics g, PointInt offset, RectangleInt rect) /// /// Draw video title on top of the iframe if found. /// - private void DrawTitle(IGraphics g, RectangleInt rect) + private void DrawTitle(IGraphics g, RRect rect) { if( _videoTitle != null && _imageWord.Width > 40 && _imageWord.Height > 40 ) { - var font = FontsUtils.GetCachedFont(HtmlContainer, "Arial", 9f, FontStyleInt.Regular); - g.FillRectangle(g.GetSolidBrush(ColorInt.FromArgb(160, 0, 0, 0)), rect.Left, rect.Top, rect.Width, ActualFont.Height + 7); + var font = FontsUtils.GetCachedFont(HtmlContainer, "Arial", 9f, RFontStyle.Regular); + g.FillRectangle(g.GetSolidBrush(RColor.FromArgb(160, 0, 0, 0)), rect.Left, rect.Top, rect.Width, ActualFont.Height + 7); - var titleRect = new RectangleInt(rect.Left + 3, rect.Top + 3, rect.Width - 6, rect.Height - 6); - g.DrawString(_videoTitle, font, ColorInt.WhiteSmoke, titleRect.Location, SizeInt.Empty); + var titleRect = new RRect(rect.Left + 3, rect.Top + 3, rect.Width - 6, rect.Height - 6); + g.DrawString(_videoTitle, font, RColor.WhiteSmoke, titleRect.Location, RSize.Empty); } } /// /// Draw play over the iframe if we found link url. /// - private void DrawPlay(IGraphics g, RectangleInt rect) + private void DrawPlay(IGraphics g, RRect rect) { if (_isVideo && _imageWord.Width > 70 && _imageWord.Height > 50) { var prevMode = g.SetAntiAliasSmoothingMode(); - var size = new SizeInt(60, 40); + var size = new RSize(60, 40); var left = rect.Left + (rect.Width - size.Width)/2; var top = rect.Top + (rect.Height - size.Height)/2; - g.FillRectangle(g.GetSolidBrush(ColorInt.FromArgb(160, 0, 0, 0)), left, top, size.Width, size.Height); + g.FillRectangle(g.GetSolidBrush(RColor.FromArgb(160, 0, 0, 0)), left, top, size.Width, size.Height); using (var path = g.GetGraphicsPath()) { path.AddLine(left + size.Width/3f + 1, top + 3*size.Height/4f, left + size.Width/3f + 1, top + size.Height/4f); path.AddLine(left + size.Width/3f + 1, top + size.Height/4f, left + 2*size.Width/3f + 1, top + size.Height/2f); path.CloseFigure(); - g.FillPath(g.GetSolidBrush(ColorInt.White), path); + g.FillPath(g.GetSolidBrush(RColor.White), path); } g.ReturnPreviousSmoothingMode(prevMode); @@ -523,7 +523,7 @@ private void SetErrorBorder() /// the image loaded or null if failed /// the source rectangle to draw in the image (empty - draw everything) /// is the callback was called async to load image call - private void OnLoadImageComplete(IImage image, RectangleInt rectangle, bool async) + private void OnLoadImageComplete(IImage image, RRect rectangle, bool async) { _imageWord.Image = image; _imageWord.ImageRectangle = rectangle; diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs index daeeed928..dd26198fe 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs @@ -50,7 +50,7 @@ protected override void PerformLayoutImp(IGraphics g) var prevSibling = DomUtils.GetPreviousSibling(this); float left = ContainingBlock.Location.X + ContainingBlock.ActualPaddingLeft + ActualMarginLeft + ContainingBlock.ActualBorderLeftWidth; float top = (prevSibling == null && ParentBox != null ? ParentBox.ClientTop : ParentBox == null ? Location.Y : 0) + MarginTopCollapse(prevSibling) + (prevSibling != null ? prevSibling.ActualBottom + prevSibling.ActualBorderBottomWidth : 0); - Location = new PointInt(left, top); + Location = new RPoint(left, top); ActualBottom = top; //width at 100% (or auto) @@ -85,7 +85,7 @@ protected override void PerformLayoutImp(IGraphics g) BorderBottomWidth = "1px"; } - Size = new SizeInt(width, height); + Size = new RSize(width, height); ActualBottom = Location.Y + ActualPaddingTop + ActualPaddingBottom + height; } @@ -96,8 +96,8 @@ protected override void PerformLayoutImp(IGraphics g) /// the device to draw to protected override void PaintImp(IGraphics g) { - var offset = HtmlContainer != null ? HtmlContainer.ScrollOffset : PointInt.Empty; - var rect = new RectangleInt(Bounds.X + offset.X, Bounds.Y + offset.Y, Bounds.Width, Bounds.Height); + var offset = HtmlContainer != null ? HtmlContainer.ScrollOffset : RPoint.Empty; + var rect = new RRect(Bounds.X + offset.X, Bounds.Y + offset.Y, Bounds.Width, Bounds.Height); if (rect.Height > 2 && RenderUtils.IsColorVisible(ActualBackgroundColor)) { diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs index 3fa0b0d97..0c511a79b 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs @@ -78,7 +78,7 @@ protected override void PaintImp(IGraphics g) } var rect = CommonUtils.GetFirstValueOrDefault(Rectangles); - PointInt offset = HtmlContainer.ScrollOffset; + RPoint offset = HtmlContainer.ScrollOffset; rect.Offset(offset); var prevClip = RenderUtils.ClipGraphicsByOverflow(g, this); @@ -86,7 +86,7 @@ protected override void PaintImp(IGraphics g) PaintBackground(g, rect, true, true); BordersDrawHandler.DrawBoxBorders(g, this, rect, true, true); - RectangleInt r = _imageWord.Rectangle; + RRect r = _imageWord.Rectangle; r.Offset(offset); r.Height -= ActualBorderTopWidth + ActualBorderBottomWidth + ActualPaddingTop + ActualPaddingBottom; r.Y += ActualBorderTopWidth + ActualPaddingTop; @@ -95,7 +95,7 @@ protected override void PaintImp(IGraphics g) if (_imageWord.Image != null) { - if (_imageWord.ImageRectangle == RectangleInt.Empty) + if (_imageWord.ImageRectangle == RRect.Empty) g.DrawImage(_imageWord.Image, r); else g.DrawImage(_imageWord.Image, r, _imageWord.ImageRectangle); @@ -117,7 +117,7 @@ protected override void PaintImp(IGraphics g) RenderUtils.DrawImageLoadingIcon(g, HtmlContainer, r); if (r.Width > 19 && r.Height > 19) { - g.DrawRectangle(g.GetPen(ColorInt.LightGray), r.X, r.Y, r.Width, r.Height); + g.DrawRectangle(g.GetPen(RColor.LightGray), r.X, r.Y, r.Width, r.Height); } } @@ -173,7 +173,7 @@ private void SetErrorBorder() /// the image loaded or null if failed /// the source rectangle to draw in the image (empty - draw everything) /// is the callback was called async to load image call - private void OnLoadImageComplete(IImage image, RectangleInt rectangle, bool async) + private void OnLoadImageComplete(IImage image, RRect rectangle, bool async) { _imageWord.Image = image; _imageWord.ImageRectangle = rectangle; diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs index 9e6272d75..dd801d4f2 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs @@ -106,18 +106,18 @@ internal abstract class CssBoxProperties /// /// Gets or sets the location of the box /// - private PointInt _location; + private RPoint _location; /// /// Gets or sets the size of the box /// - private SizeInt _size; + private RSize _size; private float _actualCornerNw = float.NaN; private float _actualCornerNe = float.NaN; private float _actualCornerSw = float.NaN; private float _actualCornerSe = float.NaN; - private ColorInt _actualColor = ColorInt.Empty; + private RColor _actualColor = RColor.Empty; private float _actualBackgroundGradientAngle = float.NaN; private float _actualHeight = float.NaN; private float _actualWidth = float.NaN; @@ -143,12 +143,12 @@ internal abstract class CssBoxProperties private float _actualTextIndent = float.NaN; private float _actualBorderSpacingHorizontal = float.NaN; private float _actualBorderSpacingVertical = float.NaN; - private ColorInt _actualBackgroundGradient = ColorInt.Empty; - private ColorInt _actualBorderTopColor = ColorInt.Empty; - private ColorInt _actualBorderLeftColor = ColorInt.Empty; - private ColorInt _actualBorderBottomColor = ColorInt.Empty; - private ColorInt _actualBorderRightColor = ColorInt.Empty; - private ColorInt _actualBackgroundColor = ColorInt.Empty; + private RColor _actualBackgroundGradient = RColor.Empty; + private RColor _actualBorderTopColor = RColor.Empty; + private RColor _actualBorderLeftColor = RColor.Empty; + private RColor _actualBorderBottomColor = RColor.Empty; + private RColor _actualBorderRightColor = RColor.Empty; + private RColor _actualBackgroundColor = RColor.Empty; private IFont _actualFont; #endregion @@ -226,7 +226,7 @@ public string BorderBottomColor set { _borderBottomColor = value; - _actualBorderBottomColor = ColorInt.Empty; + _actualBorderBottomColor = RColor.Empty; } } @@ -236,7 +236,7 @@ public string BorderLeftColor set { _borderLeftColor = value; - _actualBorderLeftColor = ColorInt.Empty; + _actualBorderLeftColor = RColor.Empty; } } @@ -246,7 +246,7 @@ public string BorderRightColor set { _borderRightColor = value; - _actualBorderRightColor = ColorInt.Empty; + _actualBorderRightColor = RColor.Empty; } } @@ -256,7 +256,7 @@ public string BorderTopColor set { _borderTopColor = value; - _actualBorderTopColor = ColorInt.Empty; + _actualBorderTopColor = RColor.Empty; } } @@ -451,7 +451,7 @@ public string BackgroundGradientAngle public string Color { get { return _color; } - set { _color = value; _actualColor = ColorInt.Empty; } + set { _color = value; _actualColor = RColor.Empty; } } public string Display @@ -632,7 +632,7 @@ public string ListStyleType /// /// Gets or sets the location of the box /// - public PointInt Location + public RPoint Location { get { return _location; } set { _location = value; } @@ -641,7 +641,7 @@ public PointInt Location /// /// Gets or sets the size of the box /// - public SizeInt Size + public RSize Size { get { return _size; } set { _size = value; } @@ -650,9 +650,9 @@ public SizeInt Size /// /// Gets the bounds of the box /// - public RectangleInt Bounds + public RRect Bounds { - get { return new RectangleInt(Location, Size); } + get { return new RRect(Location, Size); } } /// @@ -669,7 +669,7 @@ public float AvailableWidth public float ActualRight { get { return Location.X + Size.Width; } - set { Size = new SizeInt(value - Location.X, Size.Height); } + set { Size = new RSize(value - Location.X, Size.Height); } } /// @@ -679,7 +679,7 @@ public float ActualRight public float ActualBottom { get { return Location.Y + Size.Height; } - set { Size = new SizeInt(Size.Width, value - Location.Y); } + set { Size = new RSize(Size.Width, value - Location.Y); } } /// @@ -717,9 +717,9 @@ public float ClientBottom /// /// Gets the client rectangle /// - public RectangleInt ClientRectangle + public RRect ClientRectangle { - get { return RectangleInt.FromLTRB(ClientLeft, ClientTop, ClientRight, ClientBottom); } + get { return RRect.FromLTRB(ClientLeft, ClientTop, ClientRight, ClientBottom); } } /// @@ -980,7 +980,7 @@ public float ActualBorderRightWidth /// /// Gets the actual top border Color /// - public ColorInt ActualBorderTopColor + public RColor ActualBorderTopColor { get { @@ -992,12 +992,12 @@ public ColorInt ActualBorderTopColor } } - protected abstract ColorInt GetActualColor(string colorStr); + protected abstract RColor GetActualColor(string colorStr); /// /// Gets the actual Left border Color /// - public ColorInt ActualBorderLeftColor + public RColor ActualBorderLeftColor { get { @@ -1012,7 +1012,7 @@ public ColorInt ActualBorderLeftColor /// /// Gets the actual Bottom border Color /// - public ColorInt ActualBorderBottomColor + public RColor ActualBorderBottomColor { get { @@ -1027,7 +1027,7 @@ public ColorInt ActualBorderBottomColor /// /// Gets the actual Right border Color /// - public ColorInt ActualBorderRightColor + public RColor ActualBorderRightColor { get { @@ -1119,7 +1119,7 @@ public float ActualWordSpacing /// /// Gets the actual color for the text. /// - public ColorInt ActualColor + public RColor ActualColor { get { @@ -1137,7 +1137,7 @@ public ColorInt ActualColor /// /// Gets the actual background color of the box /// - public ColorInt ActualBackgroundColor + public RColor ActualBackgroundColor { get { @@ -1153,7 +1153,7 @@ public ColorInt ActualBackgroundColor /// /// Gets the second color that creates a gradient for the background /// - public ColorInt ActualBackgroundGradient + public RColor ActualBackgroundGradient { get { @@ -1201,16 +1201,16 @@ public IFont ActualFont if (string.IsNullOrEmpty(FontFamily)) { FontFamily = CssConstants.DefaultFont; } if (string.IsNullOrEmpty(FontSize)) { FontSize = CssConstants.FontSize.ToString(CultureInfo.InvariantCulture) + "pt"; } - FontStyleInt st = FontStyleInt.Regular; + RFontStyle st = RFontStyle.Regular; if (FontStyle == CssConstants.Italic || FontStyle == CssConstants.Oblique) { - st |= FontStyleInt.Italic; + st |= RFontStyle.Italic; } if (FontWeight != CssConstants.Normal && FontWeight != CssConstants.Lighter && !string.IsNullOrEmpty(FontWeight) && FontWeight != CssConstants.Inherit) { - st |= FontStyleInt.Bold; + st |= RFontStyle.Bold; } float fsize; @@ -1255,7 +1255,7 @@ public IFont ActualFont } } - protected abstract IFont GetCachedFont(string fontFamily, float fsize, FontStyleInt st); + protected abstract IFont GetCachedFont(string fontFamily, float fsize, RFontStyle st); /// /// Gets the line height diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs index 3cedb82ab..e10cdf91b 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs @@ -52,7 +52,7 @@ public static void MeasureImageSize(CssRectImage imageWord) } else if (imageWord.Image != null) { - imageWord.Width = imageWord.ImageRectangle == RectangleInt.Empty ? imageWord.Image.Width : imageWord.ImageRectangle.Width; + imageWord.Width = imageWord.ImageRectangle == RRect.Empty ? imageWord.Image.Width : imageWord.ImageRectangle.Width; } else { @@ -85,7 +85,7 @@ public static void MeasureImageSize(CssRectImage imageWord) } else if (imageWord.Image != null) { - imageWord.Height = imageWord.ImageRectangle == RectangleInt.Empty ? imageWord.Image.Height : imageWord.ImageRectangle.Height; + imageWord.Height = imageWord.ImageRectangle == RRect.Empty ? imageWord.Image.Height : imageWord.ImageRectangle.Height; } else { @@ -332,7 +332,7 @@ private static void FlowBox(IGraphics g, CssBox blockbox, CssBox box, float limi { // hack for actual width handling curx += box.ActualWidth - (curx - startX); - line.Rectangles.Add(box, new RectangleInt(startX, startY, box.ActualWidth, box.ActualHeight)); + line.Rectangles.Add(box, new RRect(startX, startY, box.ActualWidth, box.ActualHeight)); } // handle box that is only a whitespace @@ -627,8 +627,8 @@ private static void ApplyCenterAlignment(IGraphics g, CssLineBox line) foreach (CssBox b in line.Rectangles.Keys) { - RectangleInt r = b.Rectangles[line]; - b.Rectangles[line] = new RectangleInt(r.X + diff, r.Y, r.Width, r.Height); + RRect r = b.Rectangles[line]; + b.Rectangles[line] = new RRect(r.X + diff, r.Y, r.Width, r.Height); } } } @@ -656,8 +656,8 @@ private static void ApplyRightAlignment(IGraphics g, CssLineBox line) foreach (CssBox b in line.Rectangles.Keys) { - RectangleInt r = b.Rectangles[line]; - b.Rectangles[line] = new RectangleInt(r.X + diff, r.Y, r.Width, r.Height); + RRect r = b.Rectangles[line]; + b.Rectangles[line] = new RRect(r.X + diff, r.Y, r.Width, r.Height); } } } diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs index 4a5f9335a..3b7c5dcb4 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs @@ -629,8 +629,8 @@ private void LayoutCells(IGraphics g) int rowspan = GetRowSpan(cell); var columnIndex = GetCellRealColumnIndex(row, cell); float width = GetCellWidth(columnIndex, cell); - cell.Location = new PointInt(curx, cury); - cell.Size = new SizeInt(width, 0f); + cell.Location = new RPoint(curx, cury); + cell.Size = new RSize(width, 0f); cell.PerformLayout(g); //That will automatically set the bottom of the cell //Alter max bottom only if row is cell's row + cell's rowspan - 1 diff --git a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs index 7a8eef8bd..394c2f78b 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs @@ -30,7 +30,7 @@ internal sealed class CssLineBox private readonly List _words; private readonly CssBox _ownerBox; - private readonly Dictionary _rects; + private readonly Dictionary _rects; private readonly List _relatedBoxes; #endregion @@ -41,7 +41,7 @@ internal sealed class CssLineBox /// public CssLineBox(CssBox ownerBox) { - _rects = new Dictionary(); + _rects = new Dictionary(); _relatedBoxes = new List(); _words = new List(); _ownerBox = ownerBox; @@ -76,7 +76,7 @@ public CssBox OwnerBox /// /// Gets a List of rectangles that are to be painted on this linebox /// - public Dictionary Rectangles + public Dictionary Rectangles { get { return _rects; } } @@ -172,12 +172,12 @@ internal void UpdateRectangle(CssBox box, float x, float y, float r, float b) if (!Rectangles.ContainsKey(box)) { - Rectangles.Add(box, RectangleInt.FromLTRB(x, y, r, b)); + Rectangles.Add(box, RRect.FromLTRB(x, y, r, b)); } else { - RectangleInt f = Rectangles[box]; - Rectangles[box] = RectangleInt.FromLTRB( + RRect f = Rectangles[box]; + Rectangles[box] = RRect.FromLTRB( Math.Min(f.X, x), Math.Min(f.Y, y), Math.Max(f.Right, r), Math.Max(f.Bottom, b)); } @@ -212,7 +212,7 @@ internal void SetBaseLine(IGraphics g, CssBox b, float baseline) if (!Rectangles.ContainsKey(b)) return; - RectangleInt r = Rectangles[b]; + RRect r = Rectangles[b]; //Save top of words related to the top of rectangle float gap = 0f; @@ -241,7 +241,7 @@ internal void SetBaseLine(IGraphics g, CssBox b, float baseline) { //Do this only if rectangle is shorter than parent's float recttop = newtop - gap; - RectangleInt newr = new RectangleInt(r.X, recttop, r.Width, r.Height); + RRect newr = new RRect(r.X, recttop, r.Width, r.Height); Rectangles[b] = newr; b.OffsetRectangle(this, gap); } diff --git a/Source/HtmlRenderer/Core/Dom/CssRect.cs b/Source/HtmlRenderer/Core/Dom/CssRect.cs index aed3108e7..0fb72bec4 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRect.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRect.cs @@ -37,7 +37,7 @@ internal abstract class CssRect /// /// Rectangle /// - private RectangleInt _rect; + private RRect _rect; /// /// If the word is selected this points to the selection handler for more data @@ -67,7 +67,7 @@ public CssBox OwnerBox /// /// Gets or sets the bounds of the rectangle /// - public RectangleInt Rectangle + public RRect Rectangle { get { return _rect; } set { _rect = value; } diff --git a/Source/HtmlRenderer/Core/Dom/CssRectImage.cs b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs index d89d6d505..aad6fef3a 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRectImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs @@ -30,7 +30,7 @@ internal sealed class CssRectImage : CssRect /// /// the image rectangle restriction as returned from image load event /// - private RectangleInt _imageRectangle; + private RRect _imageRectangle; #endregion @@ -63,7 +63,7 @@ public override bool IsImage /// /// the image rectange restriction as returned from image load event /// - public RectangleInt ImageRectangle + public RRect ImageRectangle { get { return _imageRectangle; } set { _imageRectangle = value; } diff --git a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs index 01e51342b..037d630d0 100644 --- a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs @@ -30,21 +30,21 @@ internal static class BackgroundImageDrawHandler /// the box to draw its background image /// the handler that loads image to draw /// the rectangle to draw image in - public static void DrawBackgroundImage(IGraphics g, CssBox box, ImageLoadHandler imageLoadHandler, RectangleInt rectangle) + public static void DrawBackgroundImage(IGraphics g, CssBox box, ImageLoadHandler imageLoadHandler, RRect rectangle) { // image size depends if specific rectangle given in image loader - var imgSize = new SizeInt(imageLoadHandler.Rectangle == RectangleInt.Empty ? imageLoadHandler.Image.Width : imageLoadHandler.Rectangle.Width, - imageLoadHandler.Rectangle == RectangleInt.Empty ? imageLoadHandler.Image.Height : imageLoadHandler.Rectangle.Height); + var imgSize = new RSize(imageLoadHandler.Rectangle == RRect.Empty ? imageLoadHandler.Image.Width : imageLoadHandler.Rectangle.Width, + imageLoadHandler.Rectangle == RRect.Empty ? imageLoadHandler.Image.Height : imageLoadHandler.Rectangle.Height); // get the location by BackgroundPosition value var location = GetLocation(box.BackgroundPosition, rectangle, imgSize); - var srcRect = imageLoadHandler.Rectangle == RectangleInt.Empty - ? new RectangleInt(0, 0, imgSize.Width, imgSize.Height) - : new RectangleInt(imageLoadHandler.Rectangle.Left, imageLoadHandler.Rectangle.Top, imgSize.Width, imgSize.Height); + var srcRect = imageLoadHandler.Rectangle == RRect.Empty + ? new RRect(0, 0, imgSize.Width, imgSize.Height) + : new RRect(imageLoadHandler.Rectangle.Left, imageLoadHandler.Rectangle.Top, imgSize.Width, imgSize.Height); // initial image destination rectangle - var destRect = new RectangleInt(location, imgSize); + var destRect = new RRect(location, imgSize); // need to clip so repeated image will be cut on rectangle var prevClip = g.GetClip(); @@ -81,7 +81,7 @@ public static void DrawBackgroundImage(IGraphics g, CssBox box, ImageLoadHandler /// the rectangle to position image in /// the size of the image /// the top-left location - private static PointInt GetLocation(string backgroundPosition, RectangleInt rectangle, SizeInt imgSize) + private static RPoint GetLocation(string backgroundPosition, RRect rectangle, RSize imgSize) { float left = rectangle.Left; if( backgroundPosition.IndexOf("left", StringComparison.OrdinalIgnoreCase) > -1 ) @@ -111,14 +111,14 @@ private static PointInt GetLocation(string backgroundPosition, RectangleInt rect top = (rectangle.Top + (rectangle.Height - imgSize.Height) / 2 + .5f); } - return new PointInt(left, top); + return new RPoint(left, top); } /// /// Draw the background image at the required location repeating it over the X axis.
/// Adjust location to left if starting location doesn't include all the range (adjusted to center or right). ///
- private static void DrawRepeatX(IGraphics g, ImageLoadHandler imageLoadHandler, RectangleInt rectangle, RectangleInt srcRect, RectangleInt destRect, SizeInt imgSize) + private static void DrawRepeatX(IGraphics g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) { while (destRect.X > rectangle.X) destRect.X -= imgSize.Width; @@ -133,7 +133,7 @@ private static void DrawRepeatX(IGraphics g, ImageLoadHandler imageLoadHandler, /// Draw the background image at the required location repeating it over the Y axis.
/// Adjust location to top if starting location doesn't include all the range (adjusted to center or bottom). ///
- private static void DrawRepeatY(IGraphics g, ImageLoadHandler imageLoadHandler, RectangleInt rectangle, RectangleInt srcRect, RectangleInt destRect, SizeInt imgSize) + private static void DrawRepeatY(IGraphics g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) { while (destRect.Y > rectangle.Y) destRect.Y -= imgSize.Height; @@ -148,7 +148,7 @@ private static void DrawRepeatY(IGraphics g, ImageLoadHandler imageLoadHandler, /// Draw the background image at the required location repeating it over the X and Y axis.
/// Adjust location to left-top if starting location doesn't include all the range (adjusted to center or bottom/right). ///
- private static void DrawRepeat(IGraphics g, ImageLoadHandler imageLoadHandler, RectangleInt rectangle, RectangleInt srcRect, RectangleInt destRect, SizeInt imgSize) + private static void DrawRepeat(IGraphics g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) { while (destRect.X > rectangle.X) destRect.X -= imgSize.Width; diff --git a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs index 8a2b25105..5eed76a71 100644 --- a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs @@ -28,7 +28,7 @@ internal static class BordersDrawHandler /// /// used for all border paint to use the same points and not create new array each time. /// - private static readonly PointInt[] _borderPts = new PointInt[4]; + private static readonly RPoint[] _borderPts = new RPoint[4]; #endregion @@ -41,7 +41,7 @@ internal static class BordersDrawHandler /// the bounding rectangle to draw in /// is it the first rectangle of the element /// is it the last rectangle of the element - public static void DrawBoxBorders(IGraphics g, CssBox box, RectangleInt rect, bool isFirst, bool isLast) + public static void DrawBoxBorders(IGraphics g, CssBox box, RRect rect, bool isFirst, bool isLast) { if( rect.Width > 0 && rect.Height > 0 ) { @@ -73,7 +73,7 @@ public static void DrawBoxBorders(IGraphics g, CssBox box, RectangleInt rect, bo /// the brush to use /// the bounding rectangle to draw in /// Beveled border path, null if there is no rounded corners - public static void DrawBorder(Border border, IGraphics g, CssBox box, IBrush brush, RectangleInt rectangle) + public static void DrawBorder(Border border, IGraphics g, CssBox box, IBrush brush, RRect rectangle) { SetInOutsetRectanglePoints(border, box, rectangle, true, true); g.FillPolygon(brush, _borderPts); @@ -91,7 +91,7 @@ public static void DrawBorder(Border border, IGraphics g, CssBox box, IBrush bru /// the rectangle the border is enclosing /// Specifies if the border is for a starting line (no bevel on left) /// Specifies if the border is for an ending line (no bevel on right) - private static void DrawBorder(Border border, CssBox box, IGraphics g, RectangleInt rect, bool isLineStart, bool isLineEnd) + private static void DrawBorder(Border border, CssBox box, IGraphics g, RRect rect, bool isLineStart, bool isLineEnd) { var style = GetStyle(border, box); var color = GetColor(border, box, style); @@ -151,41 +151,41 @@ private static void DrawBorder(Border border, CssBox box, IGraphics g, Rectangle /// Specifies if the border is for a starting line (no bevel on left) /// Specifies if the border is for an ending line (no bevel on right) /// Beveled border path, null if there is no rounded corners - private static void SetInOutsetRectanglePoints(Border border, CssBox b, RectangleInt r, bool isLineStart, bool isLineEnd) + private static void SetInOutsetRectanglePoints(Border border, CssBox b, RRect r, bool isLineStart, bool isLineEnd) { switch( border ) { case Border.Top: - _borderPts[0] = new PointInt(r.Left, r.Top); - _borderPts[1] = new PointInt(r.Right, r.Top); - _borderPts[2] = new PointInt(r.Right, r.Top + b.ActualBorderTopWidth); - _borderPts[3] = new PointInt(r.Left, r.Top + b.ActualBorderTopWidth); + _borderPts[0] = new RPoint(r.Left, r.Top); + _borderPts[1] = new RPoint(r.Right, r.Top); + _borderPts[2] = new RPoint(r.Right, r.Top + b.ActualBorderTopWidth); + _borderPts[3] = new RPoint(r.Left, r.Top + b.ActualBorderTopWidth); if( isLineEnd ) _borderPts[2].X -= b.ActualBorderRightWidth; if( isLineStart ) _borderPts[3].X += b.ActualBorderLeftWidth; break; case Border.Right: - _borderPts[0] = new PointInt(r.Right - b.ActualBorderRightWidth, r.Top + b.ActualBorderTopWidth); - _borderPts[1] = new PointInt(r.Right, r.Top); - _borderPts[2] = new PointInt(r.Right, r.Bottom); - _borderPts[3] = new PointInt(r.Right - b.ActualBorderRightWidth, r.Bottom - b.ActualBorderBottomWidth); + _borderPts[0] = new RPoint(r.Right - b.ActualBorderRightWidth, r.Top + b.ActualBorderTopWidth); + _borderPts[1] = new RPoint(r.Right, r.Top); + _borderPts[2] = new RPoint(r.Right, r.Bottom); + _borderPts[3] = new RPoint(r.Right - b.ActualBorderRightWidth, r.Bottom - b.ActualBorderBottomWidth); break; case Border.Bottom: - _borderPts[0] = new PointInt(r.Left, r.Bottom - b.ActualBorderBottomWidth); - _borderPts[1] = new PointInt(r.Right, r.Bottom - b.ActualBorderBottomWidth); - _borderPts[2] = new PointInt(r.Right, r.Bottom); - _borderPts[3] = new PointInt(r.Left, r.Bottom); + _borderPts[0] = new RPoint(r.Left, r.Bottom - b.ActualBorderBottomWidth); + _borderPts[1] = new RPoint(r.Right, r.Bottom - b.ActualBorderBottomWidth); + _borderPts[2] = new RPoint(r.Right, r.Bottom); + _borderPts[3] = new RPoint(r.Left, r.Bottom); if( isLineStart ) _borderPts[0].X += b.ActualBorderLeftWidth; if( isLineEnd ) _borderPts[1].X -= b.ActualBorderRightWidth; break; case Border.Left: - _borderPts[0] = new PointInt(r.Left, r.Top); - _borderPts[1] = new PointInt(r.Left + b.ActualBorderLeftWidth, r.Top + b.ActualBorderTopWidth); - _borderPts[2] = new PointInt(r.Left + b.ActualBorderLeftWidth, r.Bottom - b.ActualBorderBottomWidth); - _borderPts[3] = new PointInt(r.Left, r.Bottom); + _borderPts[0] = new RPoint(r.Left, r.Top); + _borderPts[1] = new RPoint(r.Left + b.ActualBorderLeftWidth, r.Top + b.ActualBorderTopWidth); + _borderPts[2] = new RPoint(r.Left + b.ActualBorderLeftWidth, r.Bottom - b.ActualBorderBottomWidth); + _borderPts[3] = new RPoint(r.Left, r.Bottom); break; } } @@ -200,7 +200,7 @@ private static void SetInOutsetRectanglePoints(Border border, CssBox b, Rectangl /// Box which the border corresponds /// the rectangle the border is enclosing /// Beveled border path, null if there is no rounded corners - private static IGraphicsPath GetRoundedBorderPath(IGraphics g, Border border, CssBox b, RectangleInt r) + private static IGraphicsPath GetRoundedBorderPath(IGraphics g, Border border, CssBox b, RRect r) { IGraphicsPath path = null; @@ -278,21 +278,21 @@ private static IGraphicsPath GetRoundedBorderPath(IGraphics g, Border border, Cs /// /// Get pen to be used for border draw respecting its style. /// - private static IPen GetPen(IGraphics g, string style, ColorInt color, float width) + private static IPen GetPen(IGraphics g, string style, RColor color, float width) { var p = g.GetPen(color); p.Width = width; switch (style) { case "solid": - p.DashStyle = DashStyleInt.Solid; + p.DashStyle = RDashStyle.Solid; break; case "dotted": - p.DashStyle = DashStyleInt.Dot; + p.DashStyle = RDashStyle.Dot; break; case "dashed": - p.DashStyle = DashStyleInt.Dash; + p.DashStyle = RDashStyle.Dash; if (p.Width < 2) p.DashPattern = new[] { 4, 4f }; // better looking break; @@ -303,7 +303,7 @@ private static IPen GetPen(IGraphics g, string style, ColorInt color, float widt /// /// Get the border color for the given box border. /// - private static ColorInt GetColor(Border border, CssBoxProperties box, string style) + private static RColor GetColor(Border border, CssBoxProperties box, string style) { switch (border) { @@ -363,9 +363,9 @@ private static string GetStyle(Border border, CssBoxProperties box) /// /// Makes the specified color darker for inset/outset borders. /// - private static ColorInt Darken(ColorInt c) + private static RColor Darken(RColor c) { - return ColorInt.FromArgb(c.R / 2, c.G / 2, c.B / 2); + return RColor.FromArgb(c.R / 2, c.G / 2, c.B / 2); } #endregion diff --git a/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs index 6558c9c52..7e57bdfbf 100644 --- a/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs @@ -53,7 +53,7 @@ internal sealed class ImageLoadHandler : IDisposable /// /// callback raised when image load process is complete with image or without /// - private readonly ActionInt _loadCompleteCallback; + private readonly ActionInt _loadCompleteCallback; /// /// the web client used to download image from URL (to cancel on dispose) @@ -73,7 +73,7 @@ internal sealed class ImageLoadHandler : IDisposable /// /// the image rectangle restriction as returned from image load event /// - private RectangleInt _imageRectangle; + private RRect _imageRectangle; /// /// to know if image load event callback was sync or async raised @@ -98,7 +98,7 @@ internal sealed class ImageLoadHandler : IDisposable /// /// the container of the html to handle load image for /// callback raised when image load process is complete with image or without - public ImageLoadHandler(HtmlContainerInt htmlContainer, ActionInt loadCompleteCallback) + public ImageLoadHandler(HtmlContainerInt htmlContainer, ActionInt loadCompleteCallback) { ArgChecker.AssertArgNotNull(htmlContainer, "htmlContainer"); ArgChecker.AssertArgNotNull(loadCompleteCallback, "loadCompleteCallback"); @@ -118,7 +118,7 @@ public IImage Image /// /// the image rectangle restriction as returned from image load event /// - public RectangleInt Rectangle + public RRect Rectangle { get { return _imageRectangle; } } @@ -189,7 +189,7 @@ public void Dispose() /// the path to the image to load (file path or uri) /// the image to load /// optional: limit to specific rectangle of the image and not all of it - private void OnHtmlImageLoadEventCallback(string path, object image, RectangleInt imageRectangle) + private void OnHtmlImageLoadEventCallback(string path, object image, RRect imageRectangle) { if (!_disposed) { diff --git a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs index 41afb842b..360d922e3 100644 --- a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs @@ -38,7 +38,7 @@ internal sealed class SelectionHandler : IDisposable /// /// the mouse location when selection started used to ignore small selections /// - private PointInt _selectionStartPoint; + private RPoint _selectionStartPoint; /// /// the starting word of html selection
@@ -146,7 +146,7 @@ public void SelectAll(IControl control) ///
/// the control hosting the html to invalidate /// the location to select word at - public void SelectWord(IControl control, PointInt loc) + public void SelectWord(IControl control, RPoint loc) { if (_root.HtmlContainer.IsSelectionEnabled) { @@ -167,7 +167,7 @@ public void SelectWord(IControl control, PointInt loc) /// the control hosting the html to invalidate /// the location of the mouse on the html /// - public void HandleMouseDown(IControl parent, PointInt loc, bool isMouseInContainer) + public void HandleMouseDown(IControl parent, RPoint loc, bool isMouseInContainer) { bool clear = !isMouseInContainer; if (isMouseInContainer) @@ -239,7 +239,7 @@ public bool HandleMouseUp(IControl parent, bool leftMouseButton) ///
/// the control hosting the html to set cursor and invalidate /// the location of the mouse on the html - public void HandleMouseMove(IControl parent, PointInt loc) + public void HandleMouseMove(IControl parent, RPoint loc) { if (_root.HtmlContainer.IsSelectionEnabled && _mouseDownInControl && parent.LeftMouseButton) { @@ -396,7 +396,7 @@ public void Dispose() /// the control hosting the html to invalidate /// the mouse location /// true - partial word selection allowed, false - only full words selection - private void HandleSelection(IControl control, PointInt loc, bool allowPartialSelect) + private void HandleSelection(IControl control, RPoint loc, bool allowPartialSelect) { // get the line under the mouse or nearest from the top var lineBox = DomUtils.GetCssLineBox(_root, loc); @@ -475,7 +475,7 @@ private void ClearSelection() _selectionEndOffset = -1; _selectionEndIndex = -1; - _selectionStartPoint = PointInt.Empty; + _selectionStartPoint = RPoint.Empty; _selectionStart = null; _selectionEnd = null; } @@ -534,7 +534,7 @@ public void SelectAllWords(CssBox box) /// /// true - partial word selection allowed, false - only full words selection /// true - is non empty selection, false - empty selection - private bool CheckNonEmptySelection(PointInt loc, bool allowPartialSelect) + private bool CheckNonEmptySelection(RPoint loc, bool allowPartialSelect) { // full word selection is never empty if (!allowPartialSelect) @@ -600,13 +600,13 @@ private bool SelectWordsInRange(CssBox box, CssRect selectionStart, CssRect sele /// /// Calculate the character index and offset by characters for the given word and given offset.
- /// . + /// . ///
/// used to create graphics to measure string /// the word to calculate its index and offset /// the location to calculate for /// to set the starting or ending char and offset data - private void CalculateWordCharIndexAndOffset(IControl control, CssRect word, PointInt loc, bool selectionStart) + private void CalculateWordCharIndexAndOffset(IControl control, CssRect word, RPoint loc, bool selectionStart) { int selectionIndex; float selectionOffset; @@ -637,7 +637,7 @@ private void CalculateWordCharIndexAndOffset(IControl control, CssRect word, Poi /// return the index of the char under the location /// return the offset of the char under the location /// is to include the first character in the calculation - private static void CalculateWordCharIndexAndOffset(IControl control, CssRect word, PointInt loc, bool inclusive, out int selectionIndex, out float selectionOffset) + private static void CalculateWordCharIndexAndOffset(IControl control, CssRect word, RPoint loc, bool inclusive, out int selectionIndex, out float selectionOffset) { selectionIndex = 0; selectionOffset = 0f; diff --git a/Source/HtmlRenderer/Core/HtmlContainerInt.cs b/Source/HtmlRenderer/Core/HtmlContainerInt.cs index 7d1b3add0..b97e6550b 100644 --- a/Source/HtmlRenderer/Core/HtmlContainerInt.cs +++ b/Source/HtmlRenderer/Core/HtmlContainerInt.cs @@ -109,12 +109,12 @@ public sealed class HtmlContainerInt : IDisposable /// /// the text fore color use for selected text /// - private ColorInt _selectionForeColor; + private RColor _selectionForeColor; /// /// the back-color to use for selected text /// - private ColorInt _selectionBackColor; + private RColor _selectionBackColor; /// /// the parsed stylesheet data used for handling the html @@ -151,23 +151,23 @@ public sealed class HtmlContainerInt : IDisposable /// /// the top-left most location of the rendered html /// - private PointInt _location; + private RPoint _location; /// /// the max width and height of the rendered html, effects layout, actual size cannot exceed this values.
/// Set zero for unlimited.
///
- private SizeInt _maxSize; + private RSize _maxSize; /// /// Gets or sets the scroll offset of the document for scroll controls /// - private PointInt _scrollOffset; + private RPoint _scrollOffset; /// /// The actual size of the rendered html (after layout) /// - private SizeInt _actualSize; + private RSize _actualSize; #endregion @@ -319,7 +319,7 @@ public bool IsContextMenuEnabled /// Element that is rendered at location (50,100) with offset of (0,200) will not be rendered as it /// will be at -100 therefore outside the client rectangle. /// - public PointInt ScrollOffset + public RPoint ScrollOffset { get { return _scrollOffset; } set { _scrollOffset = value; } @@ -329,7 +329,7 @@ public PointInt ScrollOffset /// The top-left most location of the rendered html.
/// This will offset the top-left corner of the rendered html. ///
- public PointInt Location + public RPoint Location { get { return _location; } set { _location = value; } @@ -342,7 +342,7 @@ public PointInt Location /// can be exceed the max size by layout restrictions (unwrappable line, set image size, etc.).
/// Set zero for unlimited (width\height separately).
///
- public SizeInt MaxSize + public RSize MaxSize { get { return _maxSize; } set { _maxSize = value; } @@ -351,7 +351,7 @@ public SizeInt MaxSize /// /// The actual size of the rendered html (after layout) /// - public SizeInt ActualSize + public RSize ActualSize { get { return _actualSize; } set { _actualSize = value; } @@ -384,7 +384,7 @@ internal CssBox Root /// /// the text fore color use for selected text /// - internal ColorInt SelectionForeColor + internal RColor SelectionForeColor { get { return _selectionForeColor; } set { _selectionForeColor = value; } @@ -393,7 +393,7 @@ internal ColorInt SelectionForeColor /// /// the back-color to use for selected text /// - internal ColorInt SelectionBackColor + internal RColor SelectionBackColor { get { return _selectionBackColor; } set { _selectionBackColor = value; } @@ -446,7 +446,7 @@ public string GetHtml(HtmlGenerationStyle styleGen = HtmlGenerationStyle.Inline) /// the location to find the attribute at /// the attribute key to get value by /// found attribute value or null if not found - public string GetAttributeAt(PointInt location, string attribute) + public string GetAttributeAt(RPoint location, string attribute) { ArgChecker.AssertArgNotNullOrEmpty(attribute, "attribute"); @@ -459,7 +459,7 @@ public string GetAttributeAt(PointInt location, string attribute) ///
/// the location to find the link at /// css link href if exists or null - public string GetLinkAt(PointInt location) + public string GetLinkAt(RPoint location) { var link = DomUtils.GetLinkBox(_root, OffsetByScroll(location)); return link != null ? link.HrefLink : null; @@ -472,12 +472,12 @@ public string GetLinkAt(PointInt location) ///
/// the id of the element to get its rectangle /// the rectangle of the element or null if not found - public RectangleInt? GetElementRectangle(string elementId) + public RRect? GetElementRectangle(string elementId) { ArgChecker.AssertArgNotNullOrEmpty(elementId, "elementId"); var box = DomUtils.GetBoxById(_root, elementId.ToLower()); - return box != null ? CommonUtils.GetFirstValueOrDefault(box.Rectangles, box.Bounds) : (RectangleInt?)null; + return box != null ? CommonUtils.GetFirstValueOrDefault(box.Rectangles, box.Bounds) : (RRect?)null; } /// @@ -490,18 +490,18 @@ public void PerformLayout(IGraphics g) if( _root != null ) { - _actualSize = SizeInt.Empty; + _actualSize = RSize.Empty; // if width is not restricted we set it to large value to get the actual later - _root.Size = new SizeInt(_maxSize.Width > 0 ? _maxSize.Width : 99999, 0); + _root.Size = new RSize(_maxSize.Width > 0 ? _maxSize.Width : 99999, 0); _root.Location = _location; _root.PerformLayout(g); if( _maxSize.Width <= 0.1 ) { // in case the width is not restricted we need to double layout, first will find the width so second can layout by it (center alignment) - _root.Size = new SizeInt((int)Math.Ceiling(_actualSize.Width), 0); - _actualSize = SizeInt.Empty; + _root.Size = new RSize((int)Math.Ceiling(_actualSize.Width), 0); + _actualSize = RSize.Empty; _root.PerformLayout(g); } } @@ -515,11 +515,11 @@ public void PerformPaint(IGraphics g) { ArgChecker.AssertArgNotNull(g, "g"); - RectangleInt prevClip = RectangleInt.Empty; + RRect prevClip = RRect.Empty; if (MaxSize.Height > 0) { prevClip = g.GetClip(); - g.SetClipReplace(new RectangleInt(_location, _maxSize)); + g.SetClipReplace(new RRect(_location, _maxSize)); } if( _root != null ) @@ -527,7 +527,7 @@ public void PerformPaint(IGraphics g) _root.Paint(g); } - if (prevClip != RectangleInt.Empty) + if (prevClip != RRect.Empty) { g.SetClipReplace(prevClip); } @@ -538,7 +538,7 @@ public void PerformPaint(IGraphics g) /// /// the control hosting the html to invalidate /// the location of the mouse - public void HandleMouseDown(IControl parent, PointInt location) + public void HandleMouseDown(IControl parent, RPoint location) { ArgChecker.AssertArgNotNull(parent, "parent"); @@ -559,7 +559,7 @@ public void HandleMouseDown(IControl parent, PointInt location) /// the control hosting the html to invalidate /// the location of the mouse /// the mouse event data - public void HandleMouseUp(IControl parent, PointInt location, MouseEventInt e) + public void HandleMouseUp(IControl parent, RPoint location, RMouseEvent e) { ArgChecker.AssertArgNotNull(parent, "parent"); @@ -594,7 +594,7 @@ public void HandleMouseUp(IControl parent, PointInt location, MouseEventInt e) ///
/// the control hosting the html to set cursor and invalidate /// the location of the mouse - public void HandleMouseDoubleClick(IControl parent, PointInt location) + public void HandleMouseDoubleClick(IControl parent, RPoint location) { ArgChecker.AssertArgNotNull(parent, "parent"); @@ -614,7 +614,7 @@ public void HandleMouseDoubleClick(IControl parent, PointInt location) ///
/// the control hosting the html to set cursor and invalidate /// the location of the mouse - public void HandleMouseMove(IControl parent, PointInt location) + public void HandleMouseMove(IControl parent, RPoint location) { ArgChecker.AssertArgNotNull(parent, "parent"); @@ -675,7 +675,7 @@ public void HandleMouseLeave(IControl parent) /// /// the control hosting the html to invalidate /// the pressed key - public void HandleKeyDown(IControl parent, KeyEventInt e) + public void HandleKeyDown(IControl parent, RKeyEvent e) { ArgChecker.AssertArgNotNull(parent, "parent"); ArgChecker.AssertArgNotNull(e, "e"); @@ -785,7 +785,7 @@ internal void ReportError(HtmlRenderErrorType type, string message, Exception ex /// the control hosting the html to invalidate /// the location of the mouse /// the link that was clicked - internal void HandleLinkClicked(IControl parent, PointInt location, CssBox link) + internal void HandleLinkClicked(IControl parent, RPoint location, CssBox link) { if( LinkClicked != null ) { @@ -858,16 +858,16 @@ public void Dispose() /// /// the location to adjust /// the adjusted location - private PointInt OffsetByScroll(PointInt location) + private RPoint OffsetByScroll(RPoint location) { - return new PointInt(location.X - ScrollOffset.X, location.Y - ScrollOffset.Y); + return new RPoint(location.X - ScrollOffset.X, location.Y - ScrollOffset.Y); } /// /// Check if the mouse is currently on the html container.
/// Relevant if the html container is not filled in the hosted control (location is not zero and the size is not the full size of the control). ///
- private bool IsMouseInContainer(PointInt location) + private bool IsMouseInContainer(RPoint location) { return location.X >= _location.X && location.X <= _location.X + _actualSize.Width && location.Y >= _location.Y + ScrollOffset.Y && location.Y <= _location.Y + ScrollOffset.Y + _actualSize.Height; } diff --git a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs index 3d6fce664..360493729 100644 --- a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs +++ b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs @@ -38,7 +38,7 @@ public static string DefaultStyleSheet /// the minimal size of the rendered html (zero - not limit the width/height) /// the maximum size of the rendered html, if not zero and html cannot be layout within the limit it will be clipped (zero - not limit the width/height) /// return: the size of the html to be rendered within the min/max limits - public static SizeInt MeasureHtmlByRestrictions(IGraphics g, HtmlContainerInt htmlContainer, SizeInt minSize, SizeInt maxSize) + public static RSize MeasureHtmlByRestrictions(IGraphics g, HtmlContainerInt htmlContainer, RSize minSize, RSize maxSize) { // first layout without size restriction to know html actual size htmlContainer.PerformLayout(g); @@ -46,7 +46,7 @@ public static SizeInt MeasureHtmlByRestrictions(IGraphics g, HtmlContainerInt ht if (maxSize.Width > 0 && maxSize.Width < htmlContainer.ActualSize.Width) { // to allow the actual size be smaller than max we need to set max size only if it is really larger - htmlContainer.MaxSize = new SizeInt(maxSize.Width, 0); + htmlContainer.MaxSize = new RSize(maxSize.Width, 0); htmlContainer.PerformLayout(g); } @@ -56,13 +56,13 @@ public static SizeInt MeasureHtmlByRestrictions(IGraphics g, HtmlContainerInt ht // if the final width is larger than the actual we need to re-layout so the html can take the full given width. if (finalWidth > htmlContainer.ActualSize.Width) { - htmlContainer.MaxSize = new SizeInt(finalWidth, 0); + htmlContainer.MaxSize = new RSize(finalWidth, 0); htmlContainer.PerformLayout(g); } var finalHeight = Math.Max(maxSize.Height > 0 ? Math.Min(maxSize.Height, (int)htmlContainer.ActualSize.Height) : (int)htmlContainer.ActualSize.Height, minSize.Height); - return new SizeInt(finalWidth, finalHeight); + return new RSize(finalWidth, finalHeight); } @@ -81,18 +81,18 @@ public static SizeInt MeasureHtmlByRestrictions(IGraphics g, HtmlContainerInt ht /// the max size restriction - can be empty for no restriction /// if to modify the size (width and height) by html content layout /// if to modify the height by html content layout - public static SizeInt Layout(IGraphics g, HtmlContainerInt htmlContainer, SizeInt size, SizeInt minSize, SizeInt maxSize, bool autoSize, bool autoSizeHeightOnly) + public static RSize Layout(IGraphics g, HtmlContainerInt htmlContainer, RSize size, RSize minSize, RSize maxSize, bool autoSize, bool autoSizeHeightOnly) { if( autoSize ) - htmlContainer.MaxSize = new SizeInt(0, 0); + htmlContainer.MaxSize = new RSize(0, 0); else if (autoSizeHeightOnly) - htmlContainer.MaxSize = new SizeInt(size.Width, 0); + htmlContainer.MaxSize = new RSize(size.Width, 0); else htmlContainer.MaxSize = size; htmlContainer.PerformLayout(g); - SizeInt newSize = size; + RSize newSize = size; if( autoSize || autoSizeHeightOnly ) { if( autoSize ) @@ -106,7 +106,7 @@ public static SizeInt Layout(IGraphics g, HtmlContainerInt htmlContainer, SizeIn else if (minSize.Width > 0 && minSize.Width > htmlContainer.ActualSize.Width) { // if min size is larger than the actual we need to re-layout so all 100% layouts will be correct - htmlContainer.MaxSize = new SizeInt(minSize.Width, 0); + htmlContainer.MaxSize = new RSize(minSize.Width, 0); htmlContainer.PerformLayout(g); } diff --git a/Source/HtmlRenderer/Core/Parse/CssParser.cs b/Source/HtmlRenderer/Core/Parse/CssParser.cs index 66c6cea37..fd0c3f32d 100644 --- a/Source/HtmlRenderer/Core/Parse/CssParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssParser.cs @@ -128,7 +128,7 @@ public string ParseFontFamily(string value) /// /// color string value to parse /// color value - public ColorInt ParseColor(string colorStr) + public RColor ParseColor(string colorStr) { return _valueParser.GetActualColor(colorStr); } @@ -906,7 +906,7 @@ private static string ParseBorderStyle(string str, int idx, int length) /// found border width value or null private string ParseBorderColor(string str, int idx, int length) { - ColorInt color; + RColor color; return _valueParser.TryGetColor(str, idx, length, out color) ? str.Substring(idx, length) : null; } diff --git a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs index 6880ed790..12b98aa06 100644 --- a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs @@ -274,7 +274,7 @@ private static string GetUnit(string length, string defaultUnit, out bool hasUni /// true - valid, false - invalid public bool IsColorValid(string colorValue) { - ColorInt color; + RColor color; return TryGetColor(colorValue, 0, colorValue.Length, out color); } @@ -283,9 +283,9 @@ public bool IsColorValid(string colorValue) /// /// color string value to parse /// Color value - public ColorInt GetActualColor(string colorValue) + public RColor GetActualColor(string colorValue) { - ColorInt color; + RColor color; TryGetColor(colorValue, 0, colorValue.Length, out color); return color; } @@ -298,7 +298,7 @@ public ColorInt GetActualColor(string colorValue) /// substring length /// return the parsed color /// true - valid color, false - otherwise - public bool TryGetColor(string str, int idx, int length, out ColorInt color) + public bool TryGetColor(string str, int idx, int length, out RColor color) { try { @@ -324,7 +324,7 @@ public bool TryGetColor(string str, int idx, int length, out ColorInt color) } catch { } - color = ColorInt.Black; + color = RColor.Black; return false; } @@ -361,7 +361,7 @@ public static float GetActualBorderWidth(string borderValue, CssBoxProperties b) /// Get color by parsing given hex value color string (#A28B34). /// /// true - valid color, false - otherwise - private static bool GetColorByHex(string str, int idx, int length, out ColorInt color) + private static bool GetColorByHex(string str, int idx, int length, out RColor color) { int r = -1; int g = -1; @@ -383,10 +383,10 @@ private static bool GetColorByHex(string str, int idx, int length, out ColorInt } if(r > -1 && g > -1 && b > -1) { - color = ColorInt.FromArgb(r, g, b); + color = RColor.FromArgb(r, g, b); return true; } - color = ColorInt.Empty; + color = RColor.Empty; return false; } @@ -394,7 +394,7 @@ private static bool GetColorByHex(string str, int idx, int length, out ColorInt /// Get color by parsing given RGB value color string (RGB(255,180,90)) /// /// true - valid color, false - otherwise - private static bool GetColorByRgb(string str, int idx, int length, out ColorInt color) + private static bool GetColorByRgb(string str, int idx, int length, out RColor color) { int r = -1; int g = -1; @@ -416,10 +416,10 @@ private static bool GetColorByRgb(string str, int idx, int length, out ColorInt if (r > -1 && g > -1 && b > -1) { - color = ColorInt.FromArgb(r, g, b); + color = RColor.FromArgb(r, g, b); return true; } - color = ColorInt.Empty; + color = RColor.Empty; return false; } @@ -427,7 +427,7 @@ private static bool GetColorByRgb(string str, int idx, int length, out ColorInt /// Get color by parsing given RGBA value color string (RGBA(255,180,90,180)) /// /// true - valid color, false - otherwise - private static bool GetColorByRgba(string str, int idx, int length, out ColorInt color) + private static bool GetColorByRgba(string str, int idx, int length, out RColor color) { int r = -1; int g = -1; @@ -455,10 +455,10 @@ private static bool GetColorByRgba(string str, int idx, int length, out ColorInt if (r > -1 && g > -1 && b > -1 && a > -1) { - color = ColorInt.FromArgb(a, r, g, b); + color = RColor.FromArgb(a, r, g, b); return true; } - color = ColorInt.Empty; + color = RColor.Empty; return false; } @@ -466,7 +466,7 @@ private static bool GetColorByRgba(string str, int idx, int length, out ColorInt /// Get color by given name, including .NET name. /// /// true - valid color, false - otherwise - private bool GetColorByName(string str, int idx, int length, out ColorInt color) + private bool GetColorByName(string str, int idx, int length, out RColor color) { color = _global.ResolveColorFromName(str.Substring(idx, length)); return color.A > 0; diff --git a/Source/HtmlRenderer/Core/Parse/DomParser.cs b/Source/HtmlRenderer/Core/Parse/DomParser.cs index 374a43413..c5b0d9fdb 100644 --- a/Source/HtmlRenderer/Core/Parse/DomParser.cs +++ b/Source/HtmlRenderer/Core/Parse/DomParser.cs @@ -168,8 +168,8 @@ private void CascadeStyles(CssBox box, HtmlContainerInt htmlContainer, ref CssDa /// the style data private void SetTextSelectionStyle(HtmlContainerInt htmlContainer, CssData cssData) { - htmlContainer.SelectionForeColor = ColorInt.Empty; - htmlContainer.SelectionBackColor = ColorInt.Empty; + htmlContainer.SelectionForeColor = RColor.Empty; + htmlContainer.SelectionBackColor = RColor.Empty; if (cssData.ContainsCssBlock("::selection")) { diff --git a/Source/HtmlRenderer/Core/Utils/CommonUtils.cs b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs index 6c637e1e0..6a56c68d6 100644 --- a/Source/HtmlRenderer/Core/Utils/CommonUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs @@ -127,9 +127,9 @@ public static int ToDigit(char ch, bool hex = false) /// /// Get size that is max of and for width and height separately. /// - public static SizeInt Max(SizeInt size, SizeInt other) + public static RSize Max(RSize size, RSize other) { - return new SizeInt(Math.Max(size.Width, other.Width), Math.Max(size.Height, other.Height)); + return new RSize(Math.Max(size.Width, other.Width), Math.Max(size.Height, other.Height)); } /// diff --git a/Source/HtmlRenderer/Core/Utils/CssUtils.cs b/Source/HtmlRenderer/Core/Utils/CssUtils.cs index da4d847ac..de1ea5b06 100644 --- a/Source/HtmlRenderer/Core/Utils/CssUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CssUtils.cs @@ -29,14 +29,14 @@ internal static class CssUtils /// /// Brush for selection background /// - private static readonly ColorInt _defaultSelectionBackcolor = ColorInt.FromArgb(0xa9,0x33, 0x99, 0xFF); + private static readonly RColor _defaultSelectionBackcolor = RColor.FromArgb(0xa9,0x33, 0x99, 0xFF); #endregion /// /// Brush for selection background /// - public static ColorInt DefaultSelectionBackcolor + public static RColor DefaultSelectionBackcolor { get { return _defaultSelectionBackcolor; } } diff --git a/Source/HtmlRenderer/Core/Utils/DomUtils.cs b/Source/HtmlRenderer/Core/Utils/DomUtils.cs index 3a2972df3..11296ee61 100644 --- a/Source/HtmlRenderer/Core/Utils/DomUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/DomUtils.cs @@ -185,7 +185,7 @@ public static string GetAttribute(CssBox box, string attribute) /// the location to find the box by /// Optional: if to get only visible boxes (default - true) /// css link box if exists or null - public static CssBox GetCssBox(CssBox box, PointInt location, bool visible = true) + public static CssBox GetCssBox(CssBox box, RPoint location, bool visible = true) { if( box != null ) { @@ -211,7 +211,7 @@ public static CssBox GetCssBox(CssBox box, PointInt location, bool visible = tru /// the box to start search from /// the location to find the box by /// css link box if exists or null - public static CssBox GetLinkBox(CssBox box, PointInt location) + public static CssBox GetLinkBox(CssBox box, RPoint location) { if(box != null) { @@ -273,7 +273,7 @@ public static CssBox GetBoxById(CssBox box, string id) /// the box to start search from /// the location to find the box at /// css word box if exists or null - public static CssLineBox GetCssLineBox(CssBox box, PointInt location) + public static CssLineBox GetCssLineBox(CssBox box, RPoint location) { CssLineBox line = null; if (box != null) @@ -316,7 +316,7 @@ public static CssLineBox GetCssLineBox(CssBox box, PointInt location) /// the box to start search from /// the location to find the box at /// css word box if exists or null - public static CssRect GetCssBoxWord(CssBox box, PointInt location) + public static CssRect GetCssBoxWord(CssBox box, RPoint location) { if (box != null && box.Visibility == CssConstants.Visible) { @@ -353,7 +353,7 @@ public static CssRect GetCssBoxWord(CssBox box, PointInt location) /// the line box to search in /// the location to find the box at /// css word box if exists or null - public static CssRect GetCssBoxWord(CssLineBox lineBox, PointInt location) + public static CssRect GetCssBoxWord(CssLineBox lineBox, RPoint location) { foreach (var rects in lineBox.Rectangles) { diff --git a/Source/HtmlRenderer/Core/Utils/FontsUtils.cs b/Source/HtmlRenderer/Core/Utils/FontsUtils.cs index 65a7c04e6..be7a13580 100644 --- a/Source/HtmlRenderer/Core/Utils/FontsUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/FontsUtils.cs @@ -37,7 +37,7 @@ internal static class FontsUtils /// /// cache of all the font used not to create same font again and again /// - private static readonly Dictionary>> _fontsCache = new Dictionary>>(StringComparer.InvariantCultureIgnoreCase); + private static readonly Dictionary>> _fontsCache = new Dictionary>>(StringComparer.InvariantCultureIgnoreCase); #endregion @@ -66,7 +66,7 @@ public static bool IsFontExists(string family) /// Improve performance not to create same font multiple times. /// /// cached font instance - public static IFont GetCachedFont(HtmlContainerInt htmlContainer, string family, float size, FontStyleInt style) + public static IFont GetCachedFont(HtmlContainerInt htmlContainer, string family, float size, RFontStyle style) { var font = TryGetFont(family, size, style); if (font == null) @@ -127,7 +127,7 @@ public static void AddFontFamilyMapping(string fromFamily, string toFamily) /// /// Get cached font if it exists in cache or null if it is not. /// - private static IFont TryGetFont(string family, float size, FontStyleInt style) + private static IFont TryGetFont(string family, float size, RFontStyle style) { IFont font = null; if (_fontsCache.ContainsKey(family)) @@ -143,13 +143,13 @@ private static IFont TryGetFont(string family, float size, FontStyleInt style) } else { - _fontsCache[family][size] = new Dictionary(); + _fontsCache[family][size] = new Dictionary(); } } else { - _fontsCache[family] = new Dictionary>(); - _fontsCache[family][size] = new Dictionary(); + _fontsCache[family] = new Dictionary>(); + _fontsCache[family][size] = new Dictionary(); } return font; } @@ -157,7 +157,7 @@ private static IFont TryGetFont(string family, float size, FontStyleInt style) /// // create font (try using existing font family to support custom fonts) /// - private static IFont CreateFont(HtmlContainerInt htmlContainer, string family, float size, FontStyleInt style) + private static IFont CreateFont(HtmlContainerInt htmlContainer, string family, float size, RFontStyle style) { IFontFamily fontFamily; var g = htmlContainer.Global; diff --git a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs index e3db1beef..8f9dfe316 100644 --- a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs @@ -27,7 +27,7 @@ internal static class RenderUtils /// /// the color to check /// true - visible, false - not visible - public static bool IsColorVisible(ColorInt color) + public static bool IsColorVisible(RColor color) { return color.A > 0; } @@ -40,7 +40,7 @@ public static bool IsColorVisible(ColorInt color) /// the graphics to clip /// the box that is rendered to get containing blocks /// the previous region if clipped, otherwise null - public static RectangleInt ClipGraphicsByOverflow(IGraphics g, CssBox box) + public static RRect ClipGraphicsByOverflow(IGraphics g, CssBox box) { var containingBlock = box.ContainingBlock; while (true) @@ -60,7 +60,7 @@ public static RectangleInt ClipGraphicsByOverflow(IGraphics g, CssBox box) { var cBlock = containingBlock.ContainingBlock; if (cBlock == containingBlock) - return RectangleInt.Empty; + return RRect.Empty; containingBlock = cBlock; } } @@ -72,9 +72,9 @@ public static RectangleInt ClipGraphicsByOverflow(IGraphics g, CssBox box) /// /// the graphics to clip /// the region to set on the graphics (null - ignore) - public static void ReturnClip(IGraphics g, RectangleInt prevClip) + public static void ReturnClip(IGraphics g, RRect prevClip) { - if (prevClip != RectangleInt.Empty) + if (prevClip != RRect.Empty) { g.SetClipReplace(prevClip); } @@ -86,11 +86,11 @@ public static void ReturnClip(IGraphics g, RectangleInt prevClip) /// the device to draw into /// /// the rectangle to draw icon in - public static void DrawImageLoadingIcon(IGraphics g, HtmlContainerInt htmlContainer, RectangleInt r) + public static void DrawImageLoadingIcon(IGraphics g, HtmlContainerInt htmlContainer, RRect r) { - g.DrawRectangle(g.GetPen(ColorInt.LightGray), r.Left + 3, r.Top + 3, 13, 14); + g.DrawRectangle(g.GetPen(RColor.LightGray), r.Left + 3, r.Top + 3, 13, 14); var image = htmlContainer.Global.GetLoadImage(); - g.DrawImage(image, new RectangleInt(r.Left + 4, r.Top + 4, image.Width, image.Height)); + g.DrawImage(image, new RRect(r.Left + 4, r.Top + 4, image.Width, image.Height)); } /// @@ -99,11 +99,11 @@ public static void DrawImageLoadingIcon(IGraphics g, HtmlContainerInt htmlContai /// the device to draw into /// /// the rectangle to draw icon in - public static void DrawImageErrorIcon(IGraphics g, HtmlContainerInt htmlContainer, RectangleInt r) + public static void DrawImageErrorIcon(IGraphics g, HtmlContainerInt htmlContainer, RRect r) { - g.DrawRectangle(g.GetPen(ColorInt.LightGray), r.Left + 2, r.Top + 2, 15, 15); + g.DrawRectangle(g.GetPen(RColor.LightGray), r.Left + 2, r.Top + 2, 15, 15); var image = htmlContainer.Global.GetErrorImage(); - g.DrawImage(image, new RectangleInt(r.Left + 3, r.Top + 3, image.Width, image.Height)); + g.DrawImage(image, new RRect(r.Left + 3, r.Top + 3, image.Width, image.Height)); } /// @@ -116,7 +116,7 @@ public static void DrawImageErrorIcon(IGraphics g, HtmlContainerInt htmlContaine /// Radius of the south east corner /// Radius of the south west corner /// GraphicsPath with the lines of the rounded rectangle ready to be painted - public static IGraphicsPath GetRoundRect(IGraphics g, RectangleInt rect, float nwRadius, float neRadius, float seRadius, float swRadius) + public static IGraphicsPath GetRoundRect(IGraphics g, RRect rect, float nwRadius, float neRadius, float seRadius, float swRadius) { // NW-----NE // | | diff --git a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs index f9f17e53a..7be7090d5 100644 --- a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs @@ -19,13 +19,13 @@ namespace HtmlRenderer.Entities /// /// Callback used in to allow setting image externally and async.
/// The callback can provide path to image file path, URL or the actual image to use.
- /// If is given (not ) then only the specified rectangle will + /// If is given (not ) then only the specified rectangle will /// be used from the loaded image and not all of it, also the rectangle will be used for size and not the actual image size.
///
/// the path to the image to load (file path or URL) /// the image to use /// optional: limit to specific rectangle in the loaded image - public delegate void HtmlImageLoadCallback(string path, Object image, RectangleInt imageRectangle); + public delegate void HtmlImageLoadCallback(string path, Object image, RRect imageRectangle); /// /// Invoked when an image is about to be loaded by file path, URL or inline data in 'img' element or background-image CSS style.
@@ -109,7 +109,7 @@ public bool Handled public void Callback() { _handled = true; - _callback(null, null, new RectangleInt()); + _callback(null, null, new RRect()); } /// @@ -122,7 +122,7 @@ public void Callback(string path) ArgChecker.AssertArgNotNullOrEmpty(path, "path"); _handled = true; - _callback(path, null, RectangleInt.Empty); + _callback(path, null, RRect.Empty); } /// @@ -138,13 +138,13 @@ public void Callback(string path, float x, float y, float width, float height) ArgChecker.AssertArgNotNullOrEmpty(path, "path"); _handled = true; - _callback(path, null, new RectangleInt(x, y, width, height)); + _callback(path, null, new RRect(x, y, width, height)); } /// /// Callback to overwrite the loaded image with given image object.
/// Can be called directly from delegate handler or asynchronously after setting to True.
- /// If is given (not ) then only the specified rectangle will + /// If is given (not ) then only the specified rectangle will /// be used from the loaded image and not all of it, also the rectangle will be used for size and not the actual image size.
///
/// the image to load @@ -153,7 +153,7 @@ public void Callback(Object image) ArgChecker.AssertArgNotNull(image, "image"); _handled = true; - _callback(null, image, RectangleInt.Empty); + _callback(null, image, RRect.Empty); } /// @@ -169,7 +169,7 @@ public void Callback(Object image, float x, float y, float width, float height) ArgChecker.AssertArgNotNull(image, "image"); _handled = true; - _callback(null, image, new RectangleInt(x, y, width, height)); + _callback(null, image, new RRect(x, y, width, height)); } } } diff --git a/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs index 75e84a175..7e2f12734 100644 --- a/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs @@ -23,13 +23,13 @@ public sealed class HtmlScrollEventArgs : EventArgs /// /// the location to scroll to /// - private readonly PointInt _location; + private readonly RPoint _location; /// /// Init. /// /// the location to scroll to - public HtmlScrollEventArgs(PointInt location) + public HtmlScrollEventArgs(RPoint location) { _location = location; } diff --git a/Source/HtmlRenderer/Entities/ColorInt.cs b/Source/HtmlRenderer/Entities/RColor.cs similarity index 69% rename from Source/HtmlRenderer/Entities/ColorInt.cs rename to Source/HtmlRenderer/Entities/RColor.cs index b8132a5f3..dee07d719 100644 --- a/Source/HtmlRenderer/Entities/ColorInt.cs +++ b/Source/HtmlRenderer/Entities/RColor.cs @@ -10,7 +10,7 @@ namespace HtmlRenderer.Entities /// /// Represents an ARGB (alpha, red, green, blue) color. /// - public struct ColorInt + public struct RColor { #region Fields and Consts @@ -18,14 +18,14 @@ public struct ColorInt /// Represents a color that is null. /// /// 1 - public static readonly ColorInt Empty = new ColorInt(); + public static readonly RColor Empty = new RColor(); private readonly long _value; #endregion - private ColorInt(long value) + private RColor(long value) { _value = value; } @@ -33,15 +33,15 @@ private ColorInt(long value) /// /// Gets a system-defined color. /// - public static ColorInt Transparent + public static RColor Transparent { - get { return new ColorInt(0); } + get { return new RColor(0); } } /// /// Gets a system-defined color that has an ARGB value of #FF000000. /// - public static ColorInt Black + public static RColor Black { get { return FromArgb(0,0,0); } } @@ -49,7 +49,7 @@ public static ColorInt Black /// /// Gets a system-defined color that has an ARGB value of #FFFFFFFF. /// - public static ColorInt White + public static RColor White { get { return FromArgb(255,255,255); } } @@ -57,7 +57,7 @@ public static ColorInt White /// /// Gets a system-defined color that has an ARGB value of #FFF5F5F5. /// - public static ColorInt WhiteSmoke + public static RColor WhiteSmoke { get { return FromArgb(245, 245, 245); } } @@ -65,13 +65,13 @@ public static ColorInt WhiteSmoke /// /// Gets a system-defined color that has an ARGB value of #FFD3D3D3. /// - public static ColorInt LightGray + public static RColor LightGray { get { return FromArgb(211, 211, 211); } } /// - /// Gets the red component value of this structure. + /// Gets the red component value of this structure. /// public byte R { @@ -79,7 +79,7 @@ public byte R } /// - /// Gets the green component value of this structure. + /// Gets the green component value of this structure. /// public byte G { @@ -87,7 +87,7 @@ public byte G } /// - /// Gets the blue component value of this structure. + /// Gets the blue component value of this structure. /// public byte B { @@ -95,7 +95,7 @@ public byte B } /// - /// Gets the alpha component value of this structure. + /// Gets the alpha component value of this structure. /// public byte A { @@ -103,7 +103,7 @@ public byte A } /// - /// Specifies whether this structure is uninitialized. + /// Specifies whether this structure is uninitialized. /// /// /// This property returns true if this color is uninitialized; otherwise, false. @@ -115,46 +115,46 @@ public bool IsEmpty } /// - /// Tests whether two specified structures are equivalent. + /// Tests whether two specified structures are equivalent. /// /// - /// true if the two structures are equal; otherwise, false. + /// true if the two structures are equal; otherwise, false. /// /// - /// The that is to the left of the equality operator. + /// The that is to the left of the equality operator. /// /// - /// The that is to the right of the equality operator. + /// The that is to the right of the equality operator. /// /// 3 - public static bool operator ==(ColorInt left, ColorInt right) + public static bool operator ==(RColor left, RColor right) { return left._value == right._value; } /// - /// Tests whether two specified structures are different. + /// Tests whether two specified structures are different. /// /// - /// true if the two structures are different; otherwise, false. + /// true if the two structures are different; otherwise, false. /// /// - /// The that is to the left of the inequality operator. + /// The that is to the left of the inequality operator. /// /// - /// The that is to the right of the inequality operator. + /// The that is to the right of the inequality operator. /// /// 3 - public static bool operator !=(ColorInt left, ColorInt right) + public static bool operator !=(RColor left, RColor right) { return !( left == right ); } /// - /// Creates a structure from the four ARGB component (alpha, red, green, and blue) values. Although this method allows a 32-bit value to be passed for each component, the value of each component is limited to 8 bits. + /// Creates a structure from the four ARGB component (alpha, red, green, and blue) values. Although this method allows a 32-bit value to be passed for each component, the value of each component is limited to 8 bits. /// /// - /// The that this method creates. + /// The that this method creates. /// /// The alpha component. Valid values are 0 through 255. /// The red component. Valid values are 0 through 255. @@ -164,68 +164,68 @@ public bool IsEmpty /// , , , or is less than 0 or greater than 255. /// /// 1 - public static ColorInt FromArgb(int alpha, int red, int green, int blue) + public static RColor FromArgb(int alpha, int red, int green, int blue) { CheckByte(alpha); CheckByte(red); CheckByte(green); CheckByte(blue); - return new ColorInt((uint)(red << 16 | green << 8 | blue | alpha << 24) & (long)uint.MaxValue); + return new RColor((uint)(red << 16 | green << 8 | blue | alpha << 24) & (long)uint.MaxValue); } /// - /// Creates a structure from the specified 8-bit color values (red, green, and blue). The alpha value is implicitly 255 (fully opaque). Although this method allows a 32-bit value to be passed for each color component, the value of each component is limited to 8 bits. + /// Creates a structure from the specified 8-bit color values (red, green, and blue). The alpha value is implicitly 255 (fully opaque). Although this method allows a 32-bit value to be passed for each color component, the value of each component is limited to 8 bits. /// /// - /// The that this method creates. + /// The that this method creates. /// /// - /// The red component value for the new . Valid values are 0 through 255. + /// The red component value for the new . Valid values are 0 through 255. /// /// - /// The green component value for the new . Valid values are 0 through 255. + /// The green component value for the new . Valid values are 0 through 255. /// /// - /// The blue component value for the new . Valid values are 0 through 255. + /// The blue component value for the new . Valid values are 0 through 255. /// /// /// , , or is less than 0 or greater than 255. /// /// 1 - public static ColorInt FromArgb(int red, int green, int blue) + public static RColor FromArgb(int red, int green, int blue) { return FromArgb(byte.MaxValue, red, green, blue); } /// - /// Tests whether the specified object is a structure and is equivalent to this + /// Tests whether the specified object is a structure and is equivalent to this /// + /// cref="RColor" /> /// structure. /// /// - /// true if is a structure equivalent to this + /// true if is a structure equivalent to this /// + /// cref="RColor" /> /// structure; otherwise, false. /// /// The object to test. /// 1 public override bool Equals(object obj) { - if( obj is ColorInt ) + if( obj is RColor ) { - var color = (ColorInt)obj; + var color = (RColor)obj; return _value == color._value; } return false; } /// - /// Returns a hash code for this structure. + /// Returns a hash code for this structure. /// /// - /// An integer value that specifies the hash code for this . + /// An integer value that specifies the hash code for this . /// /// 1 public override int GetHashCode() @@ -234,7 +234,7 @@ public override int GetHashCode() } /// - /// Converts this structure to a human-readable string. + /// Converts this structure to a human-readable string. /// public override string ToString() { diff --git a/Source/HtmlRenderer/Entities/DashStyleInt.cs b/Source/HtmlRenderer/Entities/RDashStyle.cs similarity index 95% rename from Source/HtmlRenderer/Entities/DashStyleInt.cs rename to Source/HtmlRenderer/Entities/RDashStyle.cs index 0b119774d..e548d3fa3 100644 --- a/Source/HtmlRenderer/Entities/DashStyleInt.cs +++ b/Source/HtmlRenderer/Entities/RDashStyle.cs @@ -17,7 +17,7 @@ namespace HtmlRenderer.Entities /// /// Specifies the style of dashed lines drawn with a object. /// - public enum DashStyleInt + public enum RDashStyle { Solid, Dash, diff --git a/Source/HtmlRenderer/Entities/FontStyleInt.cs b/Source/HtmlRenderer/Entities/RFontStyle.cs similarity index 95% rename from Source/HtmlRenderer/Entities/FontStyleInt.cs rename to Source/HtmlRenderer/Entities/RFontStyle.cs index 1d41c04af..8db388f26 100644 --- a/Source/HtmlRenderer/Entities/FontStyleInt.cs +++ b/Source/HtmlRenderer/Entities/RFontStyle.cs @@ -18,7 +18,7 @@ namespace HtmlRenderer.Entities /// Specifies style information applied to text. ///
[Flags] - public enum FontStyleInt + public enum RFontStyle { Regular = 0, Bold = 1, diff --git a/Source/HtmlRenderer/Entities/KeyEventInt.cs b/Source/HtmlRenderer/Entities/RKeyEvent.cs similarity index 93% rename from Source/HtmlRenderer/Entities/KeyEventInt.cs rename to Source/HtmlRenderer/Entities/RKeyEvent.cs index 033bef8b4..649e8a885 100644 --- a/Source/HtmlRenderer/Entities/KeyEventInt.cs +++ b/Source/HtmlRenderer/Entities/RKeyEvent.cs @@ -17,7 +17,7 @@ namespace HtmlRenderer.Entities /// /// Even class for handling keyboard events in . /// - public sealed class KeyEventInt + public sealed class RKeyEvent { /// /// is control is pressed @@ -37,7 +37,7 @@ public sealed class KeyEventInt /// /// Init. /// - public KeyEventInt(bool control, bool aKeyCode, bool cKeyCode) + public RKeyEvent(bool control, bool aKeyCode, bool cKeyCode) { _control = control; _aKeyCode = aKeyCode; diff --git a/Source/HtmlRenderer/Entities/MouseEventInt.cs b/Source/HtmlRenderer/Entities/RMouseEvent.cs similarity index 91% rename from Source/HtmlRenderer/Entities/MouseEventInt.cs rename to Source/HtmlRenderer/Entities/RMouseEvent.cs index d55437f16..2630bae71 100644 --- a/Source/HtmlRenderer/Entities/MouseEventInt.cs +++ b/Source/HtmlRenderer/Entities/RMouseEvent.cs @@ -17,7 +17,7 @@ namespace HtmlRenderer.Entities /// /// Even class for handling keyboard events in . /// - public sealed class MouseEventInt + public sealed class RMouseEvent { /// /// Is the left mouse button participated in the event @@ -27,7 +27,7 @@ public sealed class MouseEventInt /// /// Init. /// - public MouseEventInt(bool leftButton) + public RMouseEvent(bool leftButton) { _leftButton = leftButton; } diff --git a/Source/HtmlRenderer/Entities/PointInt.cs b/Source/HtmlRenderer/Entities/RPoint.cs similarity index 65% rename from Source/HtmlRenderer/Entities/PointInt.cs rename to Source/HtmlRenderer/Entities/RPoint.cs index 065b6cd09..41e2115d0 100644 --- a/Source/HtmlRenderer/Entities/PointInt.cs +++ b/Source/HtmlRenderer/Entities/RPoint.cs @@ -17,39 +17,38 @@ namespace HtmlRenderer.Entities /// /// Represents an ordered pair of floating-point x- and y-coordinates that defines a point in a two-dimensional plane. /// - /// 1 - public struct PointInt + public struct RPoint { /// - /// Represents a new instance of the class with member data left uninitialized. + /// Represents a new instance of the class with member data left uninitialized. /// /// 1 - public static readonly PointInt Empty = new PointInt(); + public static readonly RPoint Empty = new RPoint(); private float _x; private float _y; - static PointInt() + static RPoint() {} /// - /// Initializes a new instance of the class with the specified coordinates. + /// Initializes a new instance of the class with the specified coordinates. /// /// The horizontal position of the point. /// The vertical position of the point. - public PointInt(float x, float y) + public RPoint(float x, float y) { _x = x; _y = y; } /// - /// Gets a value indicating whether this is empty. + /// Gets a value indicating whether this is empty. /// /// - /// true if both and + /// true if both and /// + /// cref="RPoint.Y" /> /// are 0; otherwise, false. /// /// 1 @@ -65,10 +64,10 @@ public bool IsEmpty } /// - /// Gets or sets the x-coordinate of this . + /// Gets or sets the x-coordinate of this . /// /// - /// The x-coordinate of this . + /// The x-coordinate of this . /// /// 1 public float X @@ -78,10 +77,10 @@ public float X } /// - /// Gets or sets the y-coordinate of this . + /// Gets or sets the y-coordinate of this . /// /// - /// The y-coordinate of this . + /// The y-coordinate of this . /// /// 1 public float Y @@ -91,39 +90,39 @@ public float Y } /// - /// Translates the by the specified + /// Translates the by the specified /// /// . /// /// - /// The translated . + /// The translated . /// /// - /// The to translate. + /// The to translate. /// /// /// The that specifies the numbers to add to the x- and y-coordinates of the /// + /// cref="RPoint" /> /// . /// - public static PointInt operator +(PointInt pt, SizeInt sz) + public static RPoint operator +(RPoint pt, RSize sz) { - return PointInt.Add(pt, sz); + return RPoint.Add(pt, sz); } /// - /// Translates a by the negative of a specified + /// Translates a by the negative of a specified /// /// . /// /// - /// The translated . + /// The translated . /// /// - /// The to translate. + /// The to translate. /// /// /// The that specifies the numbers to subtract from the coordinates of @@ -131,37 +130,37 @@ public float Y /// name="pt" /> /// . /// - public static PointInt operator -(PointInt pt, SizeInt sz) + public static RPoint operator -(RPoint pt, RSize sz) { - return PointInt.Subtract(pt, sz); + return RPoint.Subtract(pt, sz); } /// - /// Compares two structures. The result specifies whether the values of the + /// Compares two structures. The result specifies whether the values of the /// - /// and properties of the two + /// cref="RPoint.X" /> + /// and properties of the two /// + /// cref="RPoint" /> /// structures are equal. /// /// - /// true if the and + /// true if the and /// + /// cref="RPoint.Y" /> /// values of the left and right /// + /// cref="RPoint" /> /// structures are equal; otherwise, false. /// /// - /// A to compare. + /// A to compare. /// /// - /// A to compare. + /// A to compare. /// /// 3 - public static bool operator ==(PointInt left, PointInt right) + public static bool operator ==(RPoint left, RPoint right) { if( left.X == (double)right.X ) return left.Y == (double)right.Y; @@ -173,37 +172,37 @@ public float Y /// Determines whether the coordinates of the specified points are not equal. /// /// - /// true to indicate the and + /// true to indicate the and /// + /// cref="RPoint.Y" /> /// values of and /// /// are not equal; otherwise, false. /// /// - /// A to compare. + /// A to compare. /// /// - /// A to compare. + /// A to compare. /// /// 3 - public static bool operator !=(PointInt left, PointInt right) + public static bool operator !=(RPoint left, RPoint right) { return !( left == right ); } /// - /// Translates a given by a specified + /// Translates a given by a specified /// /// . /// /// - /// The translated . + /// The translated . /// /// - /// The to translate. + /// The to translate. /// /// /// The that specifies the numbers to add to the coordinates of @@ -211,19 +210,19 @@ public float Y /// name="pt" /> /// . /// - public static PointInt Add(PointInt pt, SizeInt sz) + public static RPoint Add(RPoint pt, RSize sz) { - return new PointInt(pt.X + sz.Width, pt.Y + sz.Height); + return new RPoint(pt.X + sz.Width, pt.Y + sz.Height); } /// - /// Translates a by the negative of a specified size. + /// Translates a by the negative of a specified size. /// /// - /// The translated . + /// The translated . /// /// - /// The to translate. + /// The to translate. /// /// /// The that specifies the numbers to subtract from the coordinates of @@ -231,19 +230,19 @@ public static PointInt Add(PointInt pt, SizeInt sz) /// name="pt" /> /// . /// - public static PointInt Subtract(PointInt pt, SizeInt sz) + public static RPoint Subtract(RPoint pt, RSize sz) { - return new PointInt(pt.X - sz.Width, pt.Y - sz.Height); + return new RPoint(pt.X - sz.Width, pt.Y - sz.Height); } /// - /// Specifies whether this contains the same coordinates as the specified + /// Specifies whether this contains the same coordinates as the specified /// /// . /// /// - /// This method returns true if is a and has the same coordinates as this + /// This method returns true if is a and has the same coordinates as this /// /// . @@ -254,9 +253,9 @@ public static PointInt Subtract(PointInt pt, SizeInt sz) /// 1 public override bool Equals(object obj) { - if( !( obj is PointInt ) ) + if( !( obj is RPoint ) ) return false; - var pointF = (PointInt)obj; + var pointF = (RPoint)obj; if( pointF.X == (double)X && pointF.Y == (double)Y ) return pointF.GetType().Equals(GetType()); else @@ -264,10 +263,10 @@ public override bool Equals(object obj) } /// - /// Returns a hash code for this structure. + /// Returns a hash code for this structure. /// /// - /// An integer value that specifies a hash value for this structure. + /// An integer value that specifies a hash value for this structure. /// /// 1 public override int GetHashCode() @@ -276,10 +275,10 @@ public override int GetHashCode() } /// - /// Converts this to a human readable string. + /// Converts this to a human readable string. /// /// - /// A string that represents this . + /// A string that represents this . /// /// 1 public override string ToString() diff --git a/Source/HtmlRenderer/Entities/RectangleInt.cs b/Source/HtmlRenderer/Entities/RRect.cs similarity index 61% rename from Source/HtmlRenderer/Entities/RectangleInt.cs rename to Source/HtmlRenderer/Entities/RRect.cs index 6c156f384..195712da0 100644 --- a/Source/HtmlRenderer/Entities/RectangleInt.cs +++ b/Source/HtmlRenderer/Entities/RRect.cs @@ -17,14 +17,14 @@ namespace HtmlRenderer.Entities /// /// Stores a set of four floating-point numbers that represent the location and size of a rectangle. /// - public struct RectangleInt + public struct RRect { #region Fields and Consts /// - /// Represents an instance of the class with its members uninitialized. + /// Represents an instance of the class with its members uninitialized. /// - public static readonly RectangleInt Empty = new RectangleInt(); + public static readonly RRect Empty = new RRect(); private float _height; private float _width; @@ -36,13 +36,13 @@ public struct RectangleInt /// - /// Initializes a new instance of the class with the specified location and size. + /// Initializes a new instance of the class with the specified location and size. /// /// The x-coordinate of the upper-left corner of the rectangle. /// The y-coordinate of the upper-left corner of the rectangle. /// The width of the rectangle. /// The height of the rectangle. - public RectangleInt(float x, float y, float width, float height) + public RRect(float x, float y, float width, float height) { _x = x; _y = y; @@ -51,11 +51,11 @@ public RectangleInt(float x, float y, float width, float height) } /// - /// Initializes a new instance of the class with the specified location and size. + /// Initializes a new instance of the class with the specified location and size. /// - /// A that represents the upper-left corner of the rectangular region. - /// A that represents the width and height of the rectangular region. - public RectangleInt(PointInt location, SizeInt size) + /// A that represents the upper-left corner of the rectangular region. + /// A that represents the width and height of the rectangular region. + public RRect(RPoint location, RSize size) { _x = location.X; _y = location.Y; @@ -64,12 +64,12 @@ public RectangleInt(PointInt location, SizeInt size) } /// - /// Gets or sets the coordinates of the upper-left corner of this structure. + /// Gets or sets the coordinates of the upper-left corner of this structure. /// - /// A that represents the upper-left corner of this structure. - public PointInt Location + /// A that represents the upper-left corner of this structure. + public RPoint Location { - get { return new PointInt(X, Y); } + get { return new RPoint(X, Y); } set { X = value.X; @@ -78,12 +78,12 @@ public PointInt Location } /// - /// Gets or sets the size of this . + /// Gets or sets the size of this . /// - /// A that represents the width and height of this structure. - public SizeInt Size + /// A that represents the width and height of this structure. + public RSize Size { - get { return new SizeInt(Width, Height); } + get { return new RSize(Width, Height); } set { Width = value.Width; @@ -92,10 +92,10 @@ public SizeInt Size } /// - /// Gets or sets the x-coordinate of the upper-left corner of this structure. + /// Gets or sets the x-coordinate of the upper-left corner of this structure. /// /// - /// The x-coordinate of the upper-left corner of this structure. + /// The x-coordinate of the upper-left corner of this structure. /// public float X { @@ -104,10 +104,10 @@ public float X } /// - /// Gets or sets the y-coordinate of the upper-left corner of this structure. + /// Gets or sets the y-coordinate of the upper-left corner of this structure. /// /// - /// The y-coordinate of the upper-left corner of this structure. + /// The y-coordinate of the upper-left corner of this structure. /// public float Y { @@ -116,10 +116,10 @@ public float Y } /// - /// Gets or sets the width of this structure. + /// Gets or sets the width of this structure. /// /// - /// The width of this structure. + /// The width of this structure. /// public float Width { @@ -128,10 +128,10 @@ public float Width } /// - /// Gets or sets the height of this structure. + /// Gets or sets the height of this structure. /// /// - /// The height of this structure. + /// The height of this structure. /// public float Height { @@ -140,10 +140,10 @@ public float Height } /// - /// Gets the x-coordinate of the left edge of this structure. + /// Gets the x-coordinate of the left edge of this structure. /// /// - /// The x-coordinate of the left edge of this structure. + /// The x-coordinate of the left edge of this structure. /// public float Left { @@ -151,10 +151,10 @@ public float Left } /// - /// Gets the y-coordinate of the top edge of this structure. + /// Gets the y-coordinate of the top edge of this structure. /// /// - /// The y-coordinate of the top edge of this structure. + /// The y-coordinate of the top edge of this structure. /// public float Top { @@ -162,16 +162,16 @@ public float Top } /// - /// Gets the x-coordinate that is the sum of and + /// Gets the x-coordinate that is the sum of and /// - /// of this structure. + /// cref="RRect.Width" /> + /// of this structure. /// /// - /// The x-coordinate that is the sum of and + /// The x-coordinate that is the sum of and /// - /// of this structure. + /// cref="RRect.Width" /> + /// of this structure. /// public float Right { @@ -179,16 +179,16 @@ public float Right } /// - /// Gets the y-coordinate that is the sum of and + /// Gets the y-coordinate that is the sum of and /// - /// of this structure. + /// cref="RRect.Height" /> + /// of this structure. /// /// - /// The y-coordinate that is the sum of and + /// The y-coordinate that is the sum of and /// - /// of this structure. + /// cref="RRect.Height" /> + /// of this structure. /// public float Bottom { @@ -196,16 +196,16 @@ public float Bottom } /// - /// Tests whether the or + /// Tests whether the or /// - /// property of this has a value of zero. + /// cref="RRect.Height" /> + /// property of this has a value of zero. /// /// - /// This property returns true if the or + /// This property returns true if the or /// - /// property of this has a value of zero; otherwise, false. + /// cref="RRect.Height" /> + /// property of this has a value of zero; otherwise, false. /// public bool IsEmpty { @@ -219,19 +219,19 @@ public bool IsEmpty } /// - /// Tests whether two structures have equal location and size. + /// Tests whether two structures have equal location and size. /// /// - /// This operator returns true if the two specified structures have equal - /// , , , and properties. + /// This operator returns true if the two specified structures have equal + /// , , , and properties. /// /// - /// The structure that is to the left of the equality operator. + /// The structure that is to the left of the equality operator. /// /// - /// The structure that is to the right of the equality operator. + /// The structure that is to the right of the equality operator. /// - public static bool operator ==(RectangleInt left, RectangleInt right) + public static bool operator ==(RRect left, RRect right) { if( Math.Abs(left.X - (double)right.X) < 0.001 && Math.Abs(left.Y - (double)right.Y) < 0.001 && Math.Abs(left.Width - (double)right.Width) < 0.001 ) return Math.Abs(left.Height - (double)right.Height) < 0.001; @@ -240,55 +240,55 @@ public bool IsEmpty } /// - /// Tests whether two structures differ in location or size. + /// Tests whether two structures differ in location or size. /// /// - /// This operator returns true if any of the , - /// , , or - /// properties of the two structures are unequal; otherwise false. + /// This operator returns true if any of the , + /// , , or + /// properties of the two structures are unequal; otherwise false. /// /// - /// The structure that is to the left of the inequality operator. + /// The structure that is to the left of the inequality operator. /// /// - /// The structure that is to the right of the inequality operator. + /// The structure that is to the right of the inequality operator. /// - public static bool operator !=(RectangleInt left, RectangleInt right) + public static bool operator !=(RRect left, RRect right) { return !( left == right ); } /// - /// Creates a structure with upper-left corner and lower-right corner at the specified locations. + /// Creates a structure with upper-left corner and lower-right corner at the specified locations. /// /// - /// The new that this method creates. + /// The new that this method creates. /// /// The x-coordinate of the upper-left corner of the rectangular region. /// The y-coordinate of the upper-left corner of the rectangular region. /// The x-coordinate of the lower-right corner of the rectangular region. /// The y-coordinate of the lower-right corner of the rectangular region. - public static RectangleInt FromLTRB(float left, float top, float right, float bottom) + public static RRect FromLTRB(float left, float top, float right, float bottom) { - return new RectangleInt(left, top, right - left, bottom - top); + return new RRect(left, top, right - left, bottom - top); } /// - /// Tests whether is a with the same location and size of this - /// . + /// Tests whether is a with the same location and size of this + /// . /// /// - /// This method returns true if is a and its X, Y, Width, and Height properties are equal to the corresponding properties of this - /// ; otherwise, false. + /// This method returns true if is a and its X, Y, Width, and Height properties are equal to the corresponding properties of this + /// ; otherwise, false. /// /// /// The to test. /// public override bool Equals(object obj) { - if( !( obj is RectangleInt ) ) + if( !( obj is RRect ) ) return false; - var rectangleF = (RectangleInt)obj; + var rectangleF = (RRect)obj; if( Math.Abs(rectangleF.X - (double)X) < 0.001 && Math.Abs(rectangleF.Y - (double)Y) < 0.001 && Math.Abs(rectangleF.Width - (double)Width) < 0.001 ) return Math.Abs(rectangleF.Height - (double)Height) < 0.001; else @@ -296,11 +296,11 @@ public override bool Equals(object obj) } /// - /// Determines if the specified point is contained within this structure. + /// Determines if the specified point is contained within this structure. /// /// /// This method returns true if the point defined by and is contained within this - /// + /// /// structure; otherwise false. /// /// The x-coordinate of the point to test. @@ -314,33 +314,33 @@ public bool Contains(float x, float y) } /// - /// Determines if the specified point is contained within this structure. + /// Determines if the specified point is contained within this structure. /// /// /// This method returns true if the point represented by the parameter is contained within this - /// + /// /// structure; otherwise false. /// - /// The to test. - public bool Contains(PointInt pt) + /// The to test. + public bool Contains(RPoint pt) { return Contains(pt.X, pt.Y); } /// /// Determines if the rectangular region represented by is entirely contained within this - /// + /// /// structure. /// /// /// This method returns true if the rectangular region represented by is entirely contained within the rectangular region represented by this - /// + /// /// ; otherwise false. /// /// - /// The to test. + /// The to test. /// - public bool Contains(RectangleInt rect) + public bool Contains(RRect rect) { if( X <= (double)rect.X && rect.X + (double)rect.Width <= X + (double)Width && Y <= (double)rect.Y ) return rect.Y + (double)rect.Height <= Y + (double)Height; @@ -349,13 +349,13 @@ public bool Contains(RectangleInt rect) } /// - /// Inflates this structure by the specified amount. + /// Inflates this structure by the specified amount. /// /// - /// The amount to inflate this structure horizontally. + /// The amount to inflate this structure horizontally. /// /// - /// The amount to inflate this structure vertically. + /// The amount to inflate this structure vertically. /// public void Inflate(float x, float y) { @@ -366,42 +366,42 @@ public void Inflate(float x, float y) } /// - /// Inflates this by the specified amount. + /// Inflates this by the specified amount. /// /// The amount to inflate this rectangle. - public void Inflate(SizeInt size) + public void Inflate(RSize size) { Inflate(size.Width, size.Height); } /// - /// Creates and returns an inflated copy of the specified structure. The copy is inflated by the specified amount. The original rectangle remains unmodified. + /// Creates and returns an inflated copy of the specified structure. The copy is inflated by the specified amount. The original rectangle remains unmodified. /// /// - /// The inflated . + /// The inflated . /// /// - /// The to be copied. This rectangle is not modified. + /// The to be copied. This rectangle is not modified. /// /// The amount to inflate the copy of the rectangle horizontally. /// The amount to inflate the copy of the rectangle vertically. - public static RectangleInt Inflate(RectangleInt rect, float x, float y) + public static RRect Inflate(RRect rect, float x, float y) { - RectangleInt rectangleF = rect; + RRect rectangleF = rect; rectangleF.Inflate(x, y); return rectangleF; } /// - /// Replaces this structure with the intersection of itself and the specified + /// Replaces this structure with the intersection of itself and the specified /// + /// cref="RRect" /> /// structure. /// /// The rectangle to intersect. - public void Intersect(RectangleInt rect) + public void Intersect(RRect rect) { - RectangleInt rectangleF = Intersect(rect, this); + RRect rectangleF = Intersect(rect, this); X = rectangleF.X; Y = rectangleF.Y; Width = rectangleF.Width; @@ -409,24 +409,24 @@ public void Intersect(RectangleInt rect) } /// - /// Returns a structure that represents the intersection of two rectangles. If there is no intersection, and empty + /// Returns a structure that represents the intersection of two rectangles. If there is no intersection, and empty /// + /// cref="RRect" /> /// is returned. /// /// - /// A third structure the size of which represents the overlapped area of the two specified rectangles. + /// A third structure the size of which represents the overlapped area of the two specified rectangles. /// /// A rectangle to intersect. /// A rectangle to intersect. - public static RectangleInt Intersect(RectangleInt a, RectangleInt b) + public static RRect Intersect(RRect a, RRect b) { float x = Math.Max(a.X, b.X); float num1 = Math.Min(a.X + a.Width, b.X + b.Width); float y = Math.Max(a.Y, b.Y); float num2 = Math.Min(a.Y + a.Height, b.Y + b.Height); if( num1 >= (double)x && num2 >= (double)y ) - return new RectangleInt(x, y, num1 - x, num2 - y); + return new RRect(x, y, num1 - x, num2 - y); else return Empty; } @@ -438,7 +438,7 @@ public static RectangleInt Intersect(RectangleInt a, RectangleInt b) /// This method returns true if there is any intersection. /// /// The rectangle to test. - public bool IntersectsWith(RectangleInt rect) + public bool IntersectsWith(RRect rect) { if( rect.X < X + (double)Width && X < rect.X + (double)rect.Width && rect.Y < Y + (double)Height ) return Y < rect.Y + (double)rect.Height; @@ -450,24 +450,24 @@ public bool IntersectsWith(RectangleInt rect) /// Creates the smallest possible third rectangle that can contain both of two rectangles that form a union. /// /// - /// A third structure that contains both of the two rectangles that form the union. + /// A third structure that contains both of the two rectangles that form the union. /// /// A rectangle to union. /// A rectangle to union. - public static RectangleInt Union(RectangleInt a, RectangleInt b) + public static RRect Union(RRect a, RRect b) { float x = Math.Min(a.X, b.X); float num1 = Math.Max(a.X + a.Width, b.X + b.Width); float y = Math.Min(a.Y, b.Y); float num2 = Math.Max(a.Y + a.Height, b.Y + b.Height); - return new RectangleInt(x, y, num1 - x, num2 - y); + return new RRect(x, y, num1 - x, num2 - y); } /// /// Adjusts the location of this rectangle by the specified amount. /// /// The amount to offset the location. - public void Offset(PointInt pos) + public void Offset(RPoint pos) { Offset(pos.X, pos.Y); } @@ -484,19 +484,19 @@ public void Offset(float x, float y) } /// - /// Gets the hash code for this structure. For information about the use of hash codes, see Object.GetHashCode. + /// Gets the hash code for this structure. For information about the use of hash codes, see Object.GetHashCode. /// - /// The hash code for this + /// The hash code for this public override int GetHashCode() { return (int)(uint)X ^ ((int)(uint)Y << 13 | (int)((uint)Y >> 19)) ^ ((int)(uint)Width << 26 | (int)((uint)Width >> 6)) ^ ((int)(uint)Height << 7 | (int)((uint)Height >> 25)); } /// - /// Converts the Location and Size of this to a human-readable string. + /// Converts the Location and Size of this to a human-readable string. /// /// - /// A string that contains the position, width, and height of this structure for example, "{X=20, Y=20, Width=100, Height=50}". + /// A string that contains the position, width, and height of this structure for example, "{X=20, Y=20, Width=100, Height=50}". /// public override string ToString() { diff --git a/Source/HtmlRenderer/Entities/SizeInt.cs b/Source/HtmlRenderer/Entities/RSize.cs similarity index 56% rename from Source/HtmlRenderer/Entities/SizeInt.cs rename to Source/HtmlRenderer/Entities/RSize.cs index 32823d34e..11a4eb7e8 100644 --- a/Source/HtmlRenderer/Entities/SizeInt.cs +++ b/Source/HtmlRenderer/Entities/RSize.cs @@ -17,30 +17,30 @@ namespace HtmlRenderer.Entities /// /// Stores an ordered pair of floating-point numbers, typically the width and height of a rectangle. /// - public struct SizeInt + public struct RSize { #region Fields and Consts /// - /// Gets a structure that has a + /// Gets a structure that has a /// + /// cref="RSize.Height" /> /// and /// + /// cref="RSize.Width" /> /// value of 0. /// /// - /// A structure that has a + /// A structure that has a /// + /// cref="RSize.Height" /> /// and /// + /// cref="RSize.Width" /> /// value of 0. /// /// 1 - public static readonly SizeInt Empty = new SizeInt(); + public static readonly RSize Empty = new RSize(); private float _height; private float _width; @@ -49,53 +49,53 @@ public struct SizeInt /// - /// Initializes a new instance of the structure from the specified existing + /// Initializes a new instance of the structure from the specified existing /// + /// cref="RSize" /> /// structure. /// /// - /// The structure from which to create the new + /// The structure from which to create the new /// + /// cref="RSize" /> /// structure. /// - public SizeInt(SizeInt size) + public RSize(RSize size) { _width = size._width; _height = size._height; } /// - /// Initializes a new instance of the structure from the specified structure. + /// Initializes a new instance of the structure from the specified structure. /// - /// The structure from which to initialize this structure. - public SizeInt(PointInt pt) + /// The structure from which to initialize this structure. + public RSize(RPoint pt) { _width = pt.X; _height = pt.Y; } /// - /// Initializes a new instance of the structure from the specified dimensions. + /// Initializes a new instance of the structure from the specified dimensions. /// /// - /// The width component of the new structure. + /// The width component of the new structure. /// /// - /// The height component of the new structure. + /// The height component of the new structure. /// - public SizeInt(float width, float height) + public RSize(float width, float height) { _width = width; _height = height; } /// - /// Gets a value that indicates whether this structure has zero width and height. + /// Gets a value that indicates whether this structure has zero width and height. /// /// - /// This property returns true when this structure has both a width and height of zero; otherwise, false. + /// This property returns true when this structure has both a width and height of zero; otherwise, false. /// /// 1 public bool IsEmpty @@ -110,10 +110,10 @@ public bool IsEmpty } /// - /// Gets or sets the horizontal component of this structure. + /// Gets or sets the horizontal component of this structure. /// /// - /// The horizontal component of this structure, typically measured in pixels. + /// The horizontal component of this structure, typically measured in pixels. /// /// 1 public float Width @@ -123,10 +123,10 @@ public float Width } /// - /// Gets or sets the vertical component of this structure. + /// Gets or sets the vertical component of this structure. /// /// - /// The vertical component of this structure, typically measured in pixels. + /// The vertical component of this structure, typically measured in pixels. /// /// 1 public float Height @@ -136,73 +136,73 @@ public float Height } /// - /// Converts the specified structure to a - /// structure. + /// Converts the specified structure to a + /// structure. /// - /// The structure to which this operator converts. - /// The structure to be converted + /// The structure to which this operator converts. + /// The structure to be converted /// - public static explicit operator PointInt(SizeInt size) + public static explicit operator RPoint(RSize size) { - return new PointInt(size.Width, size.Height); + return new RPoint(size.Width, size.Height); } /// - /// Adds the width and height of one structure to the width and height of another + /// Adds the width and height of one structure to the width and height of another /// + /// cref="RSize" /> /// structure. /// /// - /// A structure that is the result of the addition operation. + /// A structure that is the result of the addition operation. /// /// - /// The first structure to add. + /// The first structure to add. /// /// - /// The second structure to add. + /// The second structure to add. /// /// 3 - public static SizeInt operator +(SizeInt sz1, SizeInt sz2) + public static RSize operator +(RSize sz1, RSize sz2) { return Add(sz1, sz2); } /// - /// Subtracts the width and height of one structure from the width and height of another + /// Subtracts the width and height of one structure from the width and height of another /// + /// cref="RSize" /> /// structure. /// /// - /// A that is the result of the subtraction operation. + /// A that is the result of the subtraction operation. /// /// - /// The structure on the left side of the subtraction operator. + /// The structure on the left side of the subtraction operator. /// /// - /// The structure on the right side of the subtraction operator. + /// The structure on the right side of the subtraction operator. /// /// 3 - public static SizeInt operator -(SizeInt sz1, SizeInt sz2) + public static RSize operator -(RSize sz1, RSize sz2) { return Subtract(sz1, sz2); } /// - /// Tests whether two structures are equal. + /// Tests whether two structures are equal. /// /// /// This operator returns true if and have equal width and height; otherwise, false. /// /// - /// The structure on the left side of the equality operator. + /// The structure on the left side of the equality operator. /// /// - /// The structure on the right of the equality operator. + /// The structure on the right of the equality operator. /// /// 3 - public static bool operator ==(SizeInt sz1, SizeInt sz2) + public static bool operator ==(RSize sz1, RSize sz2) { if( Math.Abs(sz1.Width - (double)sz2.Width) < 0.001 ) return Math.Abs(sz1.Height - (double)sz2.Height) < 0.001; @@ -211,7 +211,7 @@ public static explicit operator PointInt(SizeInt size) } /// - /// Tests whether two structures are different. + /// Tests whether two structures are different. /// /// /// This operator returns true if and differ either in width or height; false if @@ -220,67 +220,67 @@ public static explicit operator PointInt(SizeInt size) /// and are equal. /// /// - /// The structure on the left of the inequality operator. + /// The structure on the left of the inequality operator. /// /// - /// The structure on the right of the inequality operator. + /// The structure on the right of the inequality operator. /// /// 3 - public static bool operator !=(SizeInt sz1, SizeInt sz2) + public static bool operator !=(RSize sz1, RSize sz2) { return !( sz1 == sz2 ); } /// - /// Adds the width and height of one structure to the width and height of another + /// Adds the width and height of one structure to the width and height of another /// + /// cref="RSize" /> /// structure. /// /// - /// A structure that is the result of the addition operation. + /// A structure that is the result of the addition operation. /// /// - /// The first structure to add. + /// The first structure to add. /// /// - /// The second structure to add. + /// The second structure to add. /// - public static SizeInt Add(SizeInt sz1, SizeInt sz2) + public static RSize Add(RSize sz1, RSize sz2) { - return new SizeInt(sz1.Width + sz2.Width, sz1.Height + sz2.Height); + return new RSize(sz1.Width + sz2.Width, sz1.Height + sz2.Height); } /// - /// Subtracts the width and height of one structure from the width and height of another + /// Subtracts the width and height of one structure from the width and height of another /// + /// cref="RSize" /> /// structure. /// /// - /// A structure that is a result of the subtraction operation. + /// A structure that is a result of the subtraction operation. /// /// - /// The structure on the left side of the subtraction operator. + /// The structure on the left side of the subtraction operator. /// /// - /// The structure on the right side of the subtraction operator. + /// The structure on the right side of the subtraction operator. /// - public static SizeInt Subtract(SizeInt sz1, SizeInt sz2) + public static RSize Subtract(RSize sz1, RSize sz2) { - return new SizeInt(sz1.Width - sz2.Width, sz1.Height - sz2.Height); + return new RSize(sz1.Width - sz2.Width, sz1.Height - sz2.Height); } /// - /// Tests to see whether the specified object is a structure with the same dimensions as this + /// Tests to see whether the specified object is a structure with the same dimensions as this /// + /// cref="RSize" /> /// structure. /// /// - /// This method returns true if is a and has the same width and height as this + /// This method returns true if is a and has the same width and height as this /// + /// cref="RSize" /> /// ; otherwise, false. /// /// @@ -289,9 +289,9 @@ public static SizeInt Subtract(SizeInt sz1, SizeInt sz2) /// 1 public override bool Equals(object obj) { - if( !( obj is SizeInt ) ) + if( !( obj is RSize ) ) return false; - var sizeF = (SizeInt)obj; + var sizeF = (RSize)obj; if( Math.Abs(sizeF.Width - (double)Width) < 0.001 && Math.Abs(sizeF.Height - (double)Height) < 0.001 ) return sizeF.GetType() == GetType(); else @@ -299,10 +299,10 @@ public override bool Equals(object obj) } /// - /// Returns a hash code for this structure. + /// Returns a hash code for this structure. /// /// - /// An integer value that specifies a hash value for this structure. + /// An integer value that specifies a hash value for this structure. /// /// 1 public override int GetHashCode() @@ -311,21 +311,21 @@ public override int GetHashCode() } /// - /// Converts a structure to a structure. + /// Converts a structure to a structure. /// /// - /// Returns a structure. + /// Returns a structure. /// - public PointInt ToPointF() + public RPoint ToPointF() { - return (PointInt)this; + return (RPoint)this; } /// - /// Creates a human-readable string that represents this structure. + /// Creates a human-readable string that represents this structure. /// /// - /// A string that represents this structure. + /// A string that represents this structure. /// /// 1 /// diff --git a/Source/HtmlRenderer/HtmlRenderer.csproj b/Source/HtmlRenderer/HtmlRenderer.csproj index 3609cb22e..aba042c06 100644 --- a/Source/HtmlRenderer/HtmlRenderer.csproj +++ b/Source/HtmlRenderer/HtmlRenderer.csproj @@ -84,11 +84,11 @@ - + - - + + @@ -98,11 +98,11 @@ - - - - - + + + + + diff --git a/Source/HtmlRenderer/Interfaces/IContextMenu.cs b/Source/HtmlRenderer/Interfaces/IContextMenu.cs index b28802491..946dc41ef 100644 --- a/Source/HtmlRenderer/Interfaces/IContextMenu.cs +++ b/Source/HtmlRenderer/Interfaces/IContextMenu.cs @@ -49,6 +49,6 @@ public interface IContextMenu : IDisposable ///
/// the parent control to show in /// the location to show at relative to the parent control - void Show(IControl parent, PointInt location); + void Show(IControl parent, RPoint location); } } diff --git a/Source/HtmlRenderer/Interfaces/IControl.cs b/Source/HtmlRenderer/Interfaces/IControl.cs index b7be592fa..f1b211c5d 100644 --- a/Source/HtmlRenderer/Interfaces/IControl.cs +++ b/Source/HtmlRenderer/Interfaces/IControl.cs @@ -32,7 +32,7 @@ public interface IControl /// /// Get the current location of the mouse relative to the control /// - PointInt MouseLocation { get; } + RPoint MouseLocation { get; } /// /// Set the cursor over the control to default cursor diff --git a/Source/HtmlRenderer/Interfaces/IGlobal.cs b/Source/HtmlRenderer/Interfaces/IGlobal.cs index 0bda95317..448ab4856 100644 --- a/Source/HtmlRenderer/Interfaces/IGlobal.cs +++ b/Source/HtmlRenderer/Interfaces/IGlobal.cs @@ -28,7 +28,7 @@ public interface IGlobal /// /// the color name /// color value - ColorInt ResolveColorFromName(string colorName); + RColor ResolveColorFromName(string colorName); /// /// Get image to be used while HTML image is loading. @@ -61,7 +61,7 @@ public interface IGlobal /// /// /// - IFont CreateFont(string family, float size, FontStyleInt style); + IFont CreateFont(string family, float size, RFontStyle style); /// /// @@ -70,7 +70,7 @@ public interface IGlobal /// /// /// - IFont CreateFont(IFontFamily family, float size, FontStyleInt style); + IFont CreateFont(IFontFamily family, float size, RFontStyle style); /// /// Set the given text to the clipboard diff --git a/Source/HtmlRenderer/Interfaces/IGraphics.cs b/Source/HtmlRenderer/Interfaces/IGraphics.cs index 4a1ce809f..17c952564 100644 --- a/Source/HtmlRenderer/Interfaces/IGraphics.cs +++ b/Source/HtmlRenderer/Interfaces/IGraphics.cs @@ -26,19 +26,19 @@ public interface IGraphics : IDisposable /// Gets a Rectangle structure that bounds the clipping region of this Graphics. /// /// A rectangle structure that represents a bounding rectangle for the clipping region of this Graphics. - RectangleInt GetClip(); + RRect GetClip(); /// /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. /// /// Rectangle structure to combine. - void SetClipReplace(RectangleInt rect); + void SetClipReplace(RRect rect); /// /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. /// /// Rectangle structure to combine. - void SetClipExclude(RectangleInt rect); + void SetClipExclude(RRect rect); /// /// Set the graphics smooth mode to use anti-alias.
@@ -60,7 +60,7 @@ public interface IGraphics : IDisposable /// the string to measure /// the font to measure string with /// the size of the string - SizeInt MeasureString(string str, IFont font); + RSize MeasureString(string str, IFont font); /// /// Measure the width and height of string when drawn on device context HDC @@ -74,7 +74,7 @@ public interface IGraphics : IDisposable /// the number of characters that will fit under restriction /// /// the size of the string - SizeInt MeasureString(string str, IFont font, float maxWidth, out int charFit, out int charFitWidth); + RSize MeasureString(string str, IFont font, float maxWidth, out int charFit, out int charFitWidth); /// /// Draw the given string using the given font and foreground color at given location. @@ -84,7 +84,7 @@ public interface IGraphics : IDisposable /// the text color to set /// the location to start string draw (top-left) /// used to know the size of the rendered text for transparent text support - void DrawString(String str, IFont font, ColorInt color, PointInt point, SizeInt size); + void DrawString(String str, IFont font, RColor color, RPoint point, RSize size); /// /// Draws a line connecting the two points specified by the coordinate pairs. @@ -122,14 +122,14 @@ public interface IGraphics : IDisposable /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. The image is scaled to fit the rectangle. /// Rectangle structure that specifies the portion of the object to draw. - void DrawImage(IImage image, RectangleInt destRect, RectangleInt srcRect); + void DrawImage(IImage image, RRect destRect, RRect srcRect); /// /// Draws the specified Image at the specified location and with the specified size. /// /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. - void DrawImage(IImage image, RectangleInt destRect); + void DrawImage(IImage image, RRect destRect); /// /// Fills the interior of a GraphicsPath. @@ -143,7 +143,7 @@ public interface IGraphics : IDisposable /// /// Brush that determines the characteristics of the fill. /// Array of Point structures that represent the vertices of the polygon to fill. - void FillPolygon(IBrush brush, PointInt[] points); + void FillPolygon(IBrush brush, RPoint[] points); /// /// Draws a GraphicsPath. @@ -157,14 +157,14 @@ public interface IGraphics : IDisposable /// /// the color to get the pen for /// pen instance - IPen GetPen(ColorInt color); + IPen GetPen(RColor color); /// /// Get solid color brush. /// /// the color to get the brush for /// solid color brush instance - IBrush GetSolidBrush(ColorInt color); + IBrush GetSolidBrush(RColor color); /// /// Get linear gradient color brush from to . @@ -174,7 +174,7 @@ public interface IGraphics : IDisposable /// the end color of the gradient /// the angle to move the gradient from start color to end color in the rectangle /// linear gradient color brush instance - IBrush GetLinearGradientBrush(RectangleInt rect, ColorInt color1, ColorInt color2, float angle); + IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, float angle); /// /// Get TextureBrush object that uses the specified image and bounding rectangle. @@ -182,7 +182,7 @@ public interface IGraphics : IDisposable /// The Image object with which this TextureBrush object fills interiors. /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. /// The dimension by which to translate the transformation - IBrush GetTextureBrush(IImage image, RectangleInt dstRect, PointInt translateTransformLocation); + IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation); /// /// Get GraphicsPath object. diff --git a/Source/HtmlRenderer/Interfaces/IPen.cs b/Source/HtmlRenderer/Interfaces/IPen.cs index 7ed037ce3..45552aeec 100644 --- a/Source/HtmlRenderer/Interfaces/IPen.cs +++ b/Source/HtmlRenderer/Interfaces/IPen.cs @@ -27,7 +27,7 @@ public interface IPen /// /// Gets or sets the style used for dashed lines drawn with this Pen. /// - DashStyleInt DashStyle { set; } + RDashStyle DashStyle { set; } /// /// Gets or sets an array of custom dashes and spaces. From ef8f3a375d5c9bfdac2f77d3cd64a1b7802c35de Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 1 Feb 2014 12:10:32 +0200 Subject: [PATCH 048/254] * reafctor IGlobal/GlobalBase * fix FontUtils handling --- .../Adapters/GlobalAdapter.cs | 117 ++++-------- .../Adapters/GraphicsAdapter.cs | 6 +- .../Adapters/BrushAdapter.cs | 1 - .../Adapters/ContextMenuAdapter.cs | 1 - .../Adapters/FontFamilyAdapter.cs | 2 +- .../Adapters/GlobalAdapter.cs | 81 +++++---- .../Adapters/GraphicsAdapter.cs | 6 +- Source/HtmlRenderer.WinForms/HtmlRender.cs | 4 +- Source/HtmlRenderer/Core/CssData.cs | 2 +- Source/HtmlRenderer/Core/Dom/CssBox.cs | 8 +- Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs | 10 +- Source/HtmlRenderer/Core/Dom/CssBoxHr.cs | 2 +- Source/HtmlRenderer/Core/Dom/CssBoxImage.cs | 2 +- .../Handlers/BackgroundImageDrawHandler.cs | 6 +- .../Core/Handlers/BordersDrawHandler.cs | 4 +- .../FontsUtils.cs => Handlers/FontHandler.cs} | 121 +++++++------ Source/HtmlRenderer/Core/HtmlContainerInt.cs | 8 +- Source/HtmlRenderer/Core/HtmlRendererUtils.cs | 9 - Source/HtmlRenderer/Core/Parse/CssParser.cs | 15 +- .../HtmlRenderer/Core/Parse/CssValueParser.cs | 6 +- Source/HtmlRenderer/HtmlRenderer.csproj | 3 +- Source/HtmlRenderer/Interfaces/GlobalBase.cs | 167 ++++++++++++++++-- Source/HtmlRenderer/Interfaces/IFontFamily.cs | 3 +- Source/HtmlRenderer/Interfaces/IGlobal.cs | 109 ------------ Source/HtmlRenderer/Interfaces/IGraphics.cs | 96 +++++----- 25 files changed, 391 insertions(+), 398 deletions(-) rename Source/HtmlRenderer/Core/{Utils/FontsUtils.cs => Handlers/FontHandler.cs} (66%) delete mode 100644 Source/HtmlRenderer/Interfaces/IGlobal.cs diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs index 00ef7f033..a16fc688a 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs @@ -10,7 +10,6 @@ // - Sun Tsu, // "The Art of War" -using System; using System.Drawing; using System.IO; using HtmlRenderer.Core; @@ -24,7 +23,7 @@ namespace HtmlRenderer.PdfSharp.Adapters /// /// Adapter for general stuff for core. /// - internal sealed class GlobalAdapter : GlobalBase, IGlobal + internal sealed class GlobalAdapter : GlobalBase { #region Fields and Consts @@ -41,14 +40,13 @@ internal sealed class GlobalAdapter : GlobalBase, IGlobal /// private GlobalAdapter() { - //atodo: fix FontsUtils -// FontsUtils.AddFontFamilyMapping("monospace", "Courier New"); -// FontsUtils.AddFontFamilyMapping("Helvetica", "Arial"); -// -// foreach (var family in XFontFamily.Families) -// { -// FontsUtils.AddFontFamily(new FontFamilyAdapter(family)); -// } + AddFontFamilyMapping("monospace", "Courier New"); + AddFontFamilyMapping("Helvetica", "Arial"); + + foreach (var family in XFontFamily.Families) + { + AddFontFamily(new FontFamilyAdapter(family)); + } } /// @@ -59,12 +57,20 @@ public static GlobalAdapter Instance get { return _instance; } } + /// + /// Create a default CSS data object that will be cached. + /// + protected override CssData CreateDefaultCssData(string defaultStyleSheet) + { + return CssData.Parse(this, defaultStyleSheet, false); + } + /// /// Resolve color value from given color name. /// /// the color name /// color value - public RColor ResolveColorFromName(string colorName) + public override RColor GetColor(string colorName) { var color = XColor.FromName(colorName); return Utils.Convert(color); @@ -75,7 +81,7 @@ public RColor ResolveColorFromName(string colorName) /// /// the image returned from load event /// converted image or null - public IImage ConvertImage(object image) + public override IImage ConvertImage(object image) { return image != null ? new ImageAdapter((XImage)image) : null; } @@ -91,87 +97,30 @@ public override IImage ImageFromStream(Stream memoryStream) } /// - /// + /// Get font instance by given font family name, size and style. /// - /// - /// - /// - /// - public IFont CreateFont(string family, float size, RFontStyle style) + /// the font family name + /// font size + /// font style + /// font instance + protected override IFont CreateFont(string family, float size, RFontStyle style) { - var fontStyle = (XFontStyle)( (int)style ); + var fontStyle = (XFontStyle)((int)style); return new FontAdapter(new XFont(family, size, fontStyle)); } /// - /// + /// Get font instance by given font family instance, size and style.
+ /// Used to support custom fonts that require explicit font family instance to be created. ///
- /// - /// - /// - /// - public IFont CreateFont(IFontFamily family, float size, RFontStyle style) + /// the font family instance + /// font size + /// font style + /// font instance + protected override IFont CreateFont(IFontFamily family, float size, RFontStyle style) { var fontStyle = (XFontStyle)((int)style); - return new FontAdapter(new XFont(( (FontFamilyAdapter)family ).FontFamily.Name, size, fontStyle)); - } - - /// - /// Set the given text to the clipboard - /// - /// the text to set - public void SetToClipboard(string text) - { - throw new NotSupportedException(); - } - - /// - /// Copy the given html and plain text data to clipboard. - /// - /// the html data - /// the plain text data - public void SetToClipboard(string html, string plainText) - { - throw new NotSupportedException(); - } - - /// - /// Set the given image to clipboard. - /// - /// - public void SetToClipboard(IImage image) - { - throw new NotSupportedException(); - } - - /// - /// Create a context menu that can be used on the control - /// - /// new context menu - public IContextMenu CreateContextMenu() - { - throw new NotSupportedException(); - } - - /// - /// Save the given image to file by showing save dialog to the client. - /// - /// the image to save - /// the name of the image for save dialog - /// the extension of the image for save dialog - /// optional: the control to show the dialog on - public void SaveToFile(IImage image, string name, string extension, IControl control = null) - { - throw new NotSupportedException(); - } - - /// - /// Create a default CSS data object that will be cached. - /// - /// - protected override CssData CreateDefaultCssData() - { - return CssData.Parse(this, HtmlRendererUtils.DefaultStyleSheet, false); + return new FontAdapter(new XFont(((FontFamilyAdapter)family).FontFamily.Name, size, fontStyle)); } } } diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs index e12096520..aaa5ee4c4 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs @@ -272,7 +272,7 @@ public void DrawRectangle(IPen pen, float x, float y, float width, float height) /// The y-coordinate of the upper-left corner of the rectangle to fill. /// Width of the rectangle to fill. /// Height of the rectangle to fill. - public void FillRectangle(IBrush brush, float x, float y, float width, float height) + public void DrawRectangle(IBrush brush, float x, float y, float width, float height) { _g.DrawRectangle(((BrushAdapter)brush).Brush, x, y, width, height); } @@ -313,7 +313,7 @@ public void DrawPath(IPen pen, IGraphicsPath path) ///
/// Brush that determines the characteristics of the fill. /// GraphicsPath that represents the path to fill. - public void FillPath(IBrush brush, IGraphicsPath path) + public void DrawPath(IBrush brush, IGraphicsPath path) { _g.DrawPath(((BrushAdapter)brush).Brush, ((GraphicsPathAdapter)path).GraphicsPath); } @@ -323,7 +323,7 @@ public void FillPath(IBrush brush, IGraphicsPath path) ///
/// Brush that determines the characteristics of the fill. /// Array of Point structures that represent the vertices of the polygon to fill. - public void FillPolygon(IBrush brush, RPoint[] points) + public void DrawPolygon(IBrush brush, RPoint[] points) { if( points != null && points.Length > 0 ) { diff --git a/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs index c5c92fb15..3eff2e442 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs @@ -11,7 +11,6 @@ // "The Art of War" using System.Drawing; -using HtmlRenderer.Core; using HtmlRenderer.Interfaces; namespace HtmlRenderer.WinForms.Adapters diff --git a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs index e4bf22b73..283a582ec 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs @@ -12,7 +12,6 @@ using System; using System.Windows.Forms; -using HtmlRenderer.Core; using HtmlRenderer.Core.Utils; using HtmlRenderer.Entities; using HtmlRenderer.Interfaces; diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs index 053bdd4a0..3f3efc06e 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs @@ -16,7 +16,7 @@ namespace HtmlRenderer.WinForms.Adapters { /// - /// Adapter for WinForms Font object for core. + /// Adapter for WinForms Font family object for core. /// internal sealed class FontFamilyAdapter : IFontFamily { diff --git a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs index 3bd2ed480..b2a66ea9e 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs @@ -14,7 +14,6 @@ using System.IO; using System.Windows.Forms; using HtmlRenderer.Core; -using HtmlRenderer.Core.Utils; using HtmlRenderer.Entities; using HtmlRenderer.Interfaces; using HtmlRenderer.WinForms.Utilities; @@ -24,7 +23,7 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for general stuff for core. /// - internal sealed class GlobalAdapter : GlobalBase, IGlobal + internal sealed class GlobalAdapter : GlobalBase { #region Fields and Consts @@ -41,12 +40,12 @@ internal sealed class GlobalAdapter : GlobalBase, IGlobal ///
private GlobalAdapter() { - FontsUtils.AddFontFamilyMapping("monospace", "Courier New"); - FontsUtils.AddFontFamilyMapping("Helvetica", "Arial"); + AddFontFamilyMapping("monospace", "Courier New"); + AddFontFamilyMapping("Helvetica", "Arial"); foreach (var family in FontFamily.Families) { - FontsUtils.AddFontFamily(new FontFamilyAdapter(family)); + AddFontFamily(new FontFamilyAdapter(family)); } } @@ -63,7 +62,7 @@ public static GlobalAdapter Instance ///
/// the color name /// color value - public RColor ResolveColorFromName(string colorName) + public override RColor GetColor(string colorName) { var color = Color.FromName(colorName); return Utils.Convert(color); @@ -74,7 +73,7 @@ public RColor ResolveColorFromName(string colorName) ///
/// the image returned from load event /// converted image or null - public IImage ConvertImage(object image) + public override IImage ConvertImage(object image) { return image != null ? new ImageAdapter((Image)image) : null; } @@ -89,37 +88,11 @@ public override IImage ImageFromStream(Stream memoryStream) return new ImageAdapter(Image.FromStream(memoryStream)); } - /// - /// - /// - /// - /// - /// - /// - public IFont CreateFont(string family, float size, RFontStyle style) - { - var fontStyle = (FontStyle)( (int)style ); - return new FontAdapter(new Font(family, size, fontStyle)); - } - - /// - /// - /// - /// - /// - /// - /// - public IFont CreateFont(IFontFamily family, float size, RFontStyle style) - { - var fontStyle = (FontStyle)((int)style); - return new FontAdapter(new Font(( (FontFamilyAdapter)family ).FontFamily, size, fontStyle)); - } - /// /// Set the given text to the clipboard /// /// the text to set - public void SetToClipboard(string text) + public override void SetToClipboard(string text) { Clipboard.SetText(text); } @@ -129,7 +102,7 @@ public void SetToClipboard(string text) ///
/// the html data /// the plain text data - public void SetToClipboard(string html, string plainText) + public override void SetToClipboard(string html, string plainText) { HtmlClipboardUtils.CopyToClipboard(html, plainText); } @@ -138,7 +111,7 @@ public void SetToClipboard(string html, string plainText) /// Set the given image to clipboard. ///
/// - public void SetToClipboard(IImage image) + public override void SetToClipboard(IImage image) { Clipboard.SetImage(((ImageAdapter)image).Image); } @@ -147,7 +120,7 @@ public void SetToClipboard(IImage image) /// Create a context menu that can be used on the control ///
/// new context menu - public IContextMenu CreateContextMenu() + public override IContextMenu CreateContextMenu() { return new ContextMenuAdapter(); } @@ -159,7 +132,7 @@ public IContextMenu CreateContextMenu() /// the name of the image for save dialog /// the extension of the image for save dialog /// optional: the control to show the dialog on - public void SaveToFile(IImage image, string name, string extension, IControl control = null) + public override void SaveToFile(IImage image, string name, string extension, IControl control = null) { using (var saveDialog = new SaveFileDialog()) { @@ -178,10 +151,36 @@ public void SaveToFile(IImage image, string name, string extension, IControl con /// /// Create a default CSS data object that will be cached. /// - /// - protected override CssData CreateDefaultCssData() + protected override CssData CreateDefaultCssData(string defaultStyleSheet) { - return CssData.Parse(this, HtmlRendererUtils.DefaultStyleSheet, false); + return CssData.Parse(this, defaultStyleSheet, false); + } + + /// + /// Get font instance by given font family name, size and style. + /// + /// the font family name + /// font size + /// font style + /// font instance + protected internal override IFont CreateFont(string family, float size, RFontStyle style) + { + var fontStyle = (FontStyle)((int)style); + return new FontAdapter(new Font(family, size, fontStyle)); + } + + /// + /// Get font instance by given font family instance, size and style.
+ /// Used to support custom fonts that require explicit font family instance to be created. + ///
+ /// the font family instance + /// font size + /// font style + /// font instance + protected internal override IFont CreateFont(IFontFamily family, float size, RFontStyle style) + { + var fontStyle = (FontStyle)((int)style); + return new FontAdapter(new Font(( (FontFamilyAdapter)family ).FontFamily, size, fontStyle)); } } } diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs index b59ec3ca2..f64109991 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs @@ -374,7 +374,7 @@ public void DrawRectangle(IPen pen, float x, float y, float width, float height) /// The y-coordinate of the upper-left corner of the rectangle to fill. /// Width of the rectangle to fill. /// Height of the rectangle to fill. - public void FillRectangle(IBrush brush, float x, float y, float width, float height) + public void DrawRectangle(IBrush brush, float x, float y, float width, float height) { ReleaseHdc(); _g.FillRectangle(((BrushAdapter)brush).Brush, x, y, width, height); @@ -418,7 +418,7 @@ public void DrawPath(IPen pen, IGraphicsPath path) ///
/// Brush that determines the characteristics of the fill. /// GraphicsPath that represents the path to fill. - public void FillPath(IBrush brush, IGraphicsPath path) + public void DrawPath(IBrush brush, IGraphicsPath path) { ReleaseHdc(); _g.FillPath(((BrushAdapter)brush).Brush, ((GraphicsPathAdapter)path).GraphicsPath); @@ -429,7 +429,7 @@ public void FillPath(IBrush brush, IGraphicsPath path) ///
/// Brush that determines the characteristics of the fill. /// Array of Point structures that represent the vertices of the polygon to fill. - public void FillPolygon(IBrush brush, RPoint[] points) + public void DrawPolygon(IBrush brush, RPoint[] points) { if( points != null && points.Length > 0 ) { diff --git a/Source/HtmlRenderer.WinForms/HtmlRender.cs b/Source/HtmlRenderer.WinForms/HtmlRender.cs index 13e39b9a7..237ed78c1 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRender.cs +++ b/Source/HtmlRenderer.WinForms/HtmlRender.cs @@ -99,7 +99,7 @@ public static void AddFontFamily(FontFamily fontFamily) { ArgChecker.AssertArgNotNull(fontFamily, "fontFamily"); - FontsUtils.AddFontFamily(new FontFamilyAdapter(fontFamily)); + GlobalAdapter.Instance.AddFontFamily(new FontFamilyAdapter(fontFamily)); } /// @@ -117,7 +117,7 @@ public static void AddFontFamilyMapping(string fromFamily, string toFamily) ArgChecker.AssertArgNotNullOrEmpty(fromFamily, "fromFamily"); ArgChecker.AssertArgNotNullOrEmpty(toFamily, "toFamily"); - FontsUtils.AddFontFamilyMapping(fromFamily, toFamily); + GlobalAdapter.Instance.AddFontFamilyMapping(fromFamily, toFamily); } /// diff --git a/Source/HtmlRenderer/Core/CssData.cs b/Source/HtmlRenderer/Core/CssData.cs index 8d0a49e63..04f7a1327 100644 --- a/Source/HtmlRenderer/Core/CssData.cs +++ b/Source/HtmlRenderer/Core/CssData.cs @@ -61,7 +61,7 @@ internal CssData() /// the stylesheet source to parse /// true - combine the parsed css data with default css data, false - return only the parsed css data /// the parsed css data - public static CssData Parse(IGlobal global, string stylesheet, bool combineWithDefault = true) + public static CssData Parse(GlobalBase global, string stylesheet, bool combineWithDefault = true) { CssParser parser = new CssParser(global); return parser.ParseStyleSheet(stylesheet, combineWithDefault); diff --git a/Source/HtmlRenderer/Core/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs index f207bdc88..94233d206 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -1221,11 +1221,11 @@ protected void PaintBackground(IGraphics g, RRect rect, bool isFirst, bool isLas if (roundrect != null) { - g.FillPath(brush, roundrect); + g.DrawPath(brush, roundrect); } else { - g.FillRectangle(brush, (float)Math.Ceiling(rect.X), (float)Math.Ceiling(rect.Y), rect.Width, rect.Height); + g.DrawRectangle(brush, (float)Math.Ceiling(rect.X), (float)Math.Ceiling(rect.Y), rect.Width, rect.Height); } g.ReturnPreviousSmoothingMode(prevMode); @@ -1260,7 +1260,7 @@ private void PaintWords(IGraphics g, RPoint offset) var width = word.SelectedEndOffset > -1 ? word.SelectedEndOffset : word.Width + (padWordRight ? ActualWordSpacing : 0); var rect = new RRect(word.Left + offset.X + left, word.Top + offset.Y, width - left, wordLine.LineHeight); - g.FillRectangle(GetSelectionBackBrush(g, false), rect.X, rect.Y, rect.Width, rect.Height); + g.DrawRectangle(GetSelectionBackBrush(g, false), rect.X, rect.Y, rect.Width, rect.Height); if (HtmlContainer.SelectionForeColor != RColor.Empty && (word.SelectedStartOffset > 0 || word.SelectedEndIndexOffset > -1)) { @@ -1389,7 +1389,7 @@ protected IBrush GetSelectionBackBrush(IGraphics g, bool forceAlpha) protected override IFont GetCachedFont(string fontFamily, float fsize, RFontStyle st) { - return FontsUtils.GetCachedFont(HtmlContainer, fontFamily, fsize, st); + return HtmlContainer.Global.GetFont(fontFamily, fsize, st); } protected override RColor GetActualColor(string colorStr) diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs index 5458adc5c..a8a786481 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs @@ -440,7 +440,7 @@ private void DrawImage(IGraphics g, RPoint offset, RRect rect) if (_imageWord.Selected) { - g.FillRectangle(GetSelectionBackBrush(g,true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width + 2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); + g.DrawRectangle(GetSelectionBackBrush(g,true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width + 2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); } } else if (_isVideo && !_imageLoadingComplete) @@ -460,8 +460,8 @@ private void DrawTitle(IGraphics g, RRect rect) { if( _videoTitle != null && _imageWord.Width > 40 && _imageWord.Height > 40 ) { - var font = FontsUtils.GetCachedFont(HtmlContainer, "Arial", 9f, RFontStyle.Regular); - g.FillRectangle(g.GetSolidBrush(RColor.FromArgb(160, 0, 0, 0)), rect.Left, rect.Top, rect.Width, ActualFont.Height + 7); + var font = HtmlContainer.Global.GetFont("Arial", 9f, RFontStyle.Regular); + g.DrawRectangle(g.GetSolidBrush(RColor.FromArgb(160, 0, 0, 0)), rect.Left, rect.Top, rect.Width, ActualFont.Height + 7); var titleRect = new RRect(rect.Left + 3, rect.Top + 3, rect.Width - 6, rect.Height - 6); g.DrawString(_videoTitle, font, RColor.WhiteSmoke, titleRect.Location, RSize.Empty); @@ -480,14 +480,14 @@ private void DrawPlay(IGraphics g, RRect rect) var size = new RSize(60, 40); var left = rect.Left + (rect.Width - size.Width)/2; var top = rect.Top + (rect.Height - size.Height)/2; - g.FillRectangle(g.GetSolidBrush(RColor.FromArgb(160, 0, 0, 0)), left, top, size.Width, size.Height); + g.DrawRectangle(g.GetSolidBrush(RColor.FromArgb(160, 0, 0, 0)), left, top, size.Width, size.Height); using (var path = g.GetGraphicsPath()) { path.AddLine(left + size.Width/3f + 1, top + 3*size.Height/4f, left + size.Width/3f + 1, top + size.Height/4f); path.AddLine(left + size.Width/3f + 1, top + size.Height/4f, left + 2*size.Width/3f + 1, top + size.Height/2f); path.CloseFigure(); - g.FillPath(g.GetSolidBrush(RColor.White), path); + g.DrawPath(g.GetSolidBrush(RColor.White), path); } g.ReturnPreviousSmoothingMode(prevMode); diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs index dd26198fe..9df2f2257 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs @@ -101,7 +101,7 @@ protected override void PaintImp(IGraphics g) if (rect.Height > 2 && RenderUtils.IsColorVisible(ActualBackgroundColor)) { - g.FillRectangle(g.GetSolidBrush(ActualBackgroundColor), rect.X, rect.Y, rect.Width, rect.Height); + g.DrawRectangle(g.GetSolidBrush(ActualBackgroundColor), rect.X, rect.Y, rect.Width, rect.Height); } var b1 = g.GetSolidBrush(ActualBorderTopColor); diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs index 0c511a79b..a2d4c7cfe 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs @@ -102,7 +102,7 @@ protected override void PaintImp(IGraphics g) if (_imageWord.Selected) { - g.FillRectangle(GetSelectionBackBrush(g,true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width+2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); + g.DrawRectangle(GetSelectionBackBrush(g,true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width+2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); } } else if (_imageLoadingComplete) diff --git a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs index 037d630d0..8febf7485 100644 --- a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs @@ -125,7 +125,7 @@ private static void DrawRepeatX(IGraphics g, ImageLoadHandler imageLoadHandler, using (var brush = g.GetTextureBrush(imageLoadHandler.Image, srcRect, destRect.Location)) { - g.FillRectangle(brush, rectangle.X, destRect.Y, rectangle.Width, srcRect.Height); + g.DrawRectangle(brush, rectangle.X, destRect.Y, rectangle.Width, srcRect.Height); } } @@ -140,7 +140,7 @@ private static void DrawRepeatY(IGraphics g, ImageLoadHandler imageLoadHandler, using (var brush = g.GetTextureBrush(imageLoadHandler.Image, srcRect, destRect.Location)) { - g.FillRectangle(brush, destRect.X, rectangle.Y, srcRect.Width, rectangle.Height); + g.DrawRectangle(brush, destRect.X, rectangle.Y, srcRect.Width, rectangle.Height); } } @@ -157,7 +157,7 @@ private static void DrawRepeat(IGraphics g, ImageLoadHandler imageLoadHandler, R using (var brush = g.GetTextureBrush(imageLoadHandler.Image, srcRect, destRect.Location)) { - g.FillRectangle(brush, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); + g.DrawRectangle(brush, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); } } diff --git a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs index 5eed76a71..352ce2460 100644 --- a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs @@ -76,7 +76,7 @@ public static void DrawBoxBorders(IGraphics g, CssBox box, RRect rect, bool isFi public static void DrawBorder(Border border, IGraphics g, CssBox box, IBrush brush, RRect rectangle) { SetInOutsetRectanglePoints(border, box, rectangle, true, true); - g.FillPolygon(brush, _borderPts); + g.DrawPolygon(brush, _borderPts); } @@ -117,7 +117,7 @@ private static void DrawBorder(Border border, CssBox box, IGraphics g, RRect rec { // inset/outset border needs special rectangle SetInOutsetRectanglePoints(border, box, rect, isLineStart, isLineEnd); - g.FillPolygon(g.GetSolidBrush(color), _borderPts); + g.DrawPolygon(g.GetSolidBrush(color), _borderPts); } else { diff --git a/Source/HtmlRenderer/Core/Utils/FontsUtils.cs b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs similarity index 66% rename from Source/HtmlRenderer/Core/Utils/FontsUtils.cs rename to Source/HtmlRenderer/Core/Handlers/FontHandler.cs index be7a13580..0c1c469d1 100644 --- a/Source/HtmlRenderer/Core/Utils/FontsUtils.cs +++ b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs @@ -1,4 +1,4 @@ -// "Therefore those skilled at the unorthodox +// "Therefore those skilled at the unorthodox // are infinite as heaven and earth, // inexhaustible as the great rivers. // When they come to an end, @@ -12,82 +12,124 @@ using System; using System.Collections.Generic; +using HtmlRenderer.Core.Utils; using HtmlRenderer.Entities; using HtmlRenderer.Interfaces; -namespace HtmlRenderer.Core.Utils +namespace HtmlRenderer.Core.Handlers { /// /// Utilities for fonts and fonts families handling. /// - internal static class FontsUtils + internal sealed class FontHandler { #region Fields and Consts - + + /// + /// + /// + private readonly GlobalBase _global; + /// /// Allow to map not installed fonts to different /// - private static readonly Dictionary _fontsMapping = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + private readonly Dictionary _fontsMapping = new Dictionary(StringComparer.InvariantCultureIgnoreCase); /// /// collection of all installed and added font families to check if font exists /// - private static readonly Dictionary _existingFontFamilies = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + private readonly Dictionary _existingFontFamilies = new Dictionary(StringComparer.InvariantCultureIgnoreCase); /// /// cache of all the font used not to create same font again and again /// - private static readonly Dictionary>> _fontsCache = new Dictionary>>(StringComparer.InvariantCultureIgnoreCase); + private readonly Dictionary>> _fontsCache = new Dictionary>>(StringComparer.InvariantCultureIgnoreCase); #endregion + /// + /// Init. + /// + public FontHandler(GlobalBase global) + { + ArgChecker.AssertArgNotNull(global, "global"); + + _global = global; + } + /// /// Check if the given font family exists by name /// /// the font to check /// true - font exists by given family name, false - otherwise - public static bool IsFontExists(string family) + public bool IsFontExists(string family) { bool exists = _existingFontFamilies.ContainsKey(family); - if(!exists) + if( !exists ) { string mappedFamily; - if(_fontsMapping.TryGetValue(family,out mappedFamily)) + if( _fontsMapping.TryGetValue(family, out mappedFamily) ) { - exists = _existingFontFamilies.ContainsKey(mappedFamily); + exists = _existingFontFamilies.ContainsKey(mappedFamily); } } return exists; } + /// + /// Adds a font family to be used. + /// + /// The font family to add. + public void AddFontFamily(IFontFamily fontFamily) + { + ArgChecker.AssertArgNotNull(fontFamily, "family"); + + _existingFontFamilies[fontFamily.Name] = fontFamily; + } + + /// + /// Adds a font mapping from to iff the is not found.
+ /// When the font is used in rendered html and is not found in existing + /// fonts (installed or added) it will be replaced by .
+ ///
+ /// the font family to replace + /// the font family to replace with + public void AddFontFamilyMapping(string fromFamily, string toFamily) + { + ArgChecker.AssertArgNotNullOrEmpty(fromFamily, "fromFamily"); + ArgChecker.AssertArgNotNullOrEmpty(toFamily, "toFamily"); + + _fontsMapping[fromFamily] = toFamily; + } + /// /// Get cached font instance for the given font properties.
/// Improve performance not to create same font multiple times. ///
/// cached font instance - public static IFont GetCachedFont(HtmlContainerInt htmlContainer, string family, float size, RFontStyle style) + public IFont GetCachedFont(string family, float size, RFontStyle style) { var font = TryGetFont(family, size, style); - if (font == null) + if( font == null ) { - if (!_existingFontFamilies.ContainsKey(family)) + if( !_existingFontFamilies.ContainsKey(family) ) { string mappedFamily; - if(_fontsMapping.TryGetValue(family, out mappedFamily)) + if( _fontsMapping.TryGetValue(family, out mappedFamily) ) { font = TryGetFont(mappedFamily, size, style); - if(font == null) + if( font == null ) { - font = CreateFont(htmlContainer, mappedFamily, size, style); + font = CreateFont(mappedFamily, size, style); _fontsCache[mappedFamily][size][style] = font; } } } - if(font == null) + if( font == null ) { - font = CreateFont(htmlContainer, family, size, style); + font = CreateFont(family, size, style); } _fontsCache[family][size][style] = font; @@ -95,48 +137,22 @@ public static IFont GetCachedFont(HtmlContainerInt htmlContainer, string family, return font; } - /// - /// Adds a font family to be used. - /// - /// The font family to add. - public static void AddFontFamily(IFontFamily fontFamily) - { - ArgChecker.AssertArgNotNull(fontFamily, "family"); - - _existingFontFamilies[fontFamily.Name] = fontFamily; - } - - /// - /// Adds a font mapping from to iff the is not found.
- /// When the font is used in rendered html and is not found in existing - /// fonts (installed or added) it will be replaced by .
- ///
- /// the font family to replace - /// the font family to replace with - public static void AddFontFamilyMapping(string fromFamily, string toFamily) - { - ArgChecker.AssertArgNotNullOrEmpty(fromFamily, "fromFamily"); - ArgChecker.AssertArgNotNullOrEmpty(toFamily, "toFamily"); - - _fontsMapping[fromFamily] = toFamily; - } - #region Private methods /// /// Get cached font if it exists in cache or null if it is not. /// - private static IFont TryGetFont(string family, float size, RFontStyle style) + private IFont TryGetFont(string family, float size, RFontStyle style) { IFont font = null; - if (_fontsCache.ContainsKey(family)) + if( _fontsCache.ContainsKey(family) ) { var a = _fontsCache[family]; - if (a.ContainsKey(size)) + if( a.ContainsKey(size) ) { var b = a[size]; - if (b.ContainsKey(style)) + if( b.ContainsKey(style) ) { font = b[style]; } @@ -157,11 +173,12 @@ private static IFont TryGetFont(string family, float size, RFontStyle style) /// // create font (try using existing font family to support custom fonts) /// - private static IFont CreateFont(HtmlContainerInt htmlContainer, string family, float size, RFontStyle style) + private IFont CreateFont(string family, float size, RFontStyle style) { IFontFamily fontFamily; - var g = htmlContainer.Global; - return _existingFontFamilies.TryGetValue(family, out fontFamily) ? g.CreateFont(fontFamily, size, style) : g.CreateFont(family, size, style); + return _existingFontFamilies.TryGetValue(family, out fontFamily) + ? _global.CreateFont(fontFamily, size, style) + : _global.CreateFont(family, size, style); } #endregion diff --git a/Source/HtmlRenderer/Core/HtmlContainerInt.cs b/Source/HtmlRenderer/Core/HtmlContainerInt.cs index b97e6550b..7301d53e1 100644 --- a/Source/HtmlRenderer/Core/HtmlContainerInt.cs +++ b/Source/HtmlRenderer/Core/HtmlContainerInt.cs @@ -84,7 +84,7 @@ public sealed class HtmlContainerInt : IDisposable /// /// /// - private readonly IGlobal _global; + private readonly GlobalBase _global; /// /// parser for CSS data @@ -175,7 +175,7 @@ public sealed class HtmlContainerInt : IDisposable /// /// Init. /// - public HtmlContainerInt(IGlobal global) + public HtmlContainerInt(GlobalBase global) { ArgChecker.AssertArgNotNull(global, "global"); @@ -186,7 +186,7 @@ public HtmlContainerInt(IGlobal global) /// /// /// - internal IGlobal Global + internal GlobalBase Global { get { return _global; } } @@ -418,7 +418,7 @@ public void SetHtml(string htmlSource, CssData baseCssData = null) if( !string.IsNullOrEmpty(htmlSource) ) { - _cssData = baseCssData ?? _global.GetDefaultCssData(); + _cssData = baseCssData ?? _global.DefaultCssData; DomParser parser = new DomParser(_cssParser); _root = parser.GenerateCssTree(htmlSource, this, ref _cssData); diff --git a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs index 360493729..42c16bd8a 100644 --- a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs +++ b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs @@ -11,7 +11,6 @@ // "The Art of War" using System; -using HtmlRenderer.Core.Entities; using HtmlRenderer.Entities; using HtmlRenderer.Interfaces; @@ -22,14 +21,6 @@ namespace HtmlRenderer.Core /// public static class HtmlRendererUtils { - /// - /// The default stylesheet. - /// - public static string DefaultStyleSheet - { - get { return CssDefaults.DefaultStyleSheet; } - } - /// /// Measure the size of the html by performing layout under the given restrictions. /// diff --git a/Source/HtmlRenderer/Core/Parse/CssParser.cs b/Source/HtmlRenderer/Core/Parse/CssParser.cs index fd0c3f32d..0d619806b 100644 --- a/Source/HtmlRenderer/Core/Parse/CssParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssParser.cs @@ -33,7 +33,10 @@ internal sealed class CssParser ///
private static readonly char[] _cssBlockSplitters = new[] { '}', ';' }; - private readonly IGlobal _global; + /// + /// + /// + private readonly GlobalBase _global; /// /// Utility for value parsing. @@ -46,7 +49,7 @@ internal sealed class CssParser /// /// Init. /// - public CssParser(IGlobal global) + public CssParser(GlobalBase global) { ArgChecker.AssertArgNotNull(global, "global"); @@ -67,7 +70,7 @@ public CssParser(IGlobal global) /// the CSS data with parsed CSS objects (never null) public CssData ParseStyleSheet(string stylesheet, bool combineWithDefault) { - var cssData = combineWithDefault ? _global.GetDefaultCssData().Clone() : new CssData(); + var cssData = combineWithDefault ? _global.DefaultCssData.Clone() : new CssData(); if (!string.IsNullOrEmpty(stylesheet)) { ParseStyleSheet(cssData, stylesheet); @@ -523,7 +526,7 @@ private void ParseColorProperty(string propName, string propValue, Dictionary /// the value of the property to parse to specific values /// the properties collection to add the specific properties to - private static void ParseFontProperty(string propValue, Dictionary properties) + private void ParseFontProperty(string propValue, Dictionary properties) { int mustBePos; string mustBe = RegexParserUtils.Search(RegexParserUtils.CssFontSizeAndLineHeight, propValue, out mustBePos); @@ -599,7 +602,7 @@ private static string ParseBackgroundImageProperty(string propValue) /// /// the value of the property to parse /// parsed font-family value - private static string ParseFontFamilyProperty(string propValue) + private string ParseFontFamilyProperty(string propValue) { int start = 0; while(start > -1 && start < propValue.Length) @@ -615,7 +618,7 @@ private static string ParseFontFamilyProperty(string propValue) var font = propValue.Substring(start, adjEnd - start + 1); - if (FontsUtils.IsFontExists(font)) + if (_global.IsFontExists(font)) { return font; } diff --git a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs index 12b98aa06..d2979d81f 100644 --- a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs @@ -30,7 +30,7 @@ internal sealed class CssValueParser /// /// /// - private readonly IGlobal _global; + private readonly GlobalBase _global; #endregion @@ -38,7 +38,7 @@ internal sealed class CssValueParser /// /// Init. /// - public CssValueParser(IGlobal global) + public CssValueParser(GlobalBase global) { ArgChecker.AssertArgNotNull(global, "global"); @@ -468,7 +468,7 @@ private static bool GetColorByRgba(string str, int idx, int length, out RColor c /// true - valid color, false - otherwise private bool GetColorByName(string str, int idx, int length, out RColor color) { - color = _global.ResolveColorFromName(str.Substring(idx, length)); + color = _global.GetColor(str.Substring(idx, length)); return color.A > 0; } diff --git a/Source/HtmlRenderer/HtmlRenderer.csproj b/Source/HtmlRenderer/HtmlRenderer.csproj index aba042c06..cfe44d029 100644 --- a/Source/HtmlRenderer/HtmlRenderer.csproj +++ b/Source/HtmlRenderer/HtmlRenderer.csproj @@ -66,6 +66,7 @@ + @@ -79,7 +80,6 @@ - @@ -109,7 +109,6 @@ - diff --git a/Source/HtmlRenderer/Interfaces/GlobalBase.cs b/Source/HtmlRenderer/Interfaces/GlobalBase.cs index 932042f57..611181f90 100644 --- a/Source/HtmlRenderer/Interfaces/GlobalBase.cs +++ b/Source/HtmlRenderer/Interfaces/GlobalBase.cs @@ -11,13 +11,17 @@ // "The Art of War" +using System; using System.IO; using HtmlRenderer.Core; +using HtmlRenderer.Core.Entities; +using HtmlRenderer.Core.Handlers; +using HtmlRenderer.Entities; namespace HtmlRenderer.Interfaces { /// - /// Optional base class for implementers to provide base helper functionality. + /// atodo: add doc /// public abstract class GlobalBase { @@ -31,18 +35,99 @@ public abstract class GlobalBase /// /// image used to draw loading image icon /// - private static IImage _loadImage; + private IImage _loadImage; /// /// image used to draw error image icon /// - private static IImage _errorImage; + private IImage _errorImage; + + /// + /// cache of all the font used not to create same font again and again + /// + private readonly FontHandler _fontHandler; #endregion - public CssData GetDefaultCssData() + + /// + /// Init. + /// + protected GlobalBase() + { + _fontHandler = new FontHandler(this); + } + + /// + /// Get the default CSS stylesheet data. + /// + public CssData DefaultCssData + { + get { return _defaultCssData ?? ( _defaultCssData = CreateDefaultCssData(CssDefaults.DefaultStyleSheet) ); } + } + + /// + /// Resolve color value from given color name. + /// + /// the color name + /// color value + public abstract RColor GetColor(string colorName); + + /// + /// Convert image object returned from to . + /// + /// the image returned from load event + /// converted image or null + public abstract IImage ConvertImage(object image); + + /// + /// Create an object from the given stream. + /// + /// the stream to create image from + /// new image instance + public abstract IImage ImageFromStream(Stream memoryStream); + + /// + /// Check if the given font exists in the system by font family name. + /// + /// the font name to check + /// true - font exists by given family name, false - otherwise + public bool IsFontExists(string font) + { + return _fontHandler.IsFontExists(font); + } + + /// + /// Adds a font family to be used. + /// + /// The font family to add. + public void AddFontFamily(IFontFamily fontFamily) + { + _fontHandler.AddFontFamily(fontFamily); + } + + /// + /// Adds a font mapping from to iff the is not found.
+ /// When the font is used in rendered html and is not found in existing + /// fonts (installed or added) it will be replaced by .
+ ///
+ /// the font family to replace + /// the font family to replace with + public void AddFontFamilyMapping(string fromFamily, string toFamily) { - return _defaultCssData ?? (_defaultCssData = CreateDefaultCssData()); + _fontHandler.AddFontFamilyMapping(fromFamily, toFamily); + } + + /// + /// Get font instance by given font family name, size and style. + /// + /// the font family name + /// font size + /// font style + /// font instance + public IFont GetFont(string family, float size, RFontStyle style) + { + return _fontHandler.GetCachedFont(family, size, style); } /// @@ -74,16 +159,76 @@ public IImage GetErrorImage() } /// - /// Create an object from the given stream. + /// Set the given text to the clipboard /// - /// the stream to create image from - /// new image instance - public abstract IImage ImageFromStream(Stream memoryStream); + /// the text to set + public virtual void SetToClipboard(string text) + { + throw new NotImplementedException(); + } + + /// + /// Set the given html and plain text data to clipboard. + /// + /// the html data + /// the plain text data + public virtual void SetToClipboard(string html, string plainText) + { + throw new NotImplementedException(); + } + + /// + /// Set the given image to clipboard. + /// + /// + public virtual void SetToClipboard(IImage image) + { + throw new NotImplementedException(); + } + + /// + /// Create a context menu that can be used on the control + /// + /// new context menu + public virtual IContextMenu CreateContextMenu() + { + throw new NotImplementedException(); + } + + /// + /// Save the given image to file by showing save dialog to the client. + /// + /// the image to save + /// the name of the image for save dialog + /// the extension of the image for save dialog + /// optional: the control to show the dialog on + public virtual void SaveToFile(IImage image, string name, string extension, IControl control = null) + { + throw new NotImplementedException(); + } /// /// Create a default CSS data object that will be cached. /// - /// - protected abstract CssData CreateDefaultCssData(); + protected abstract CssData CreateDefaultCssData(string defaultStyleSheet); + + /// + /// Get font instance by given font family name, size and style. + /// + /// the font family name + /// font size + /// font style + /// font instance + protected internal abstract IFont CreateFont(string family, float size, RFontStyle style); + + /// + /// Get font instance by given font family instance, size and style.
+ /// Used to support custom fonts that require explicit font family instance to be created. + ///
+ /// the font family instance + /// font size + /// font style + /// font instance + protected internal abstract IFont CreateFont(IFontFamily family, float size, RFontStyle style); } } diff --git a/Source/HtmlRenderer/Interfaces/IFontFamily.cs b/Source/HtmlRenderer/Interfaces/IFontFamily.cs index ddec50e67..87752b2bc 100644 --- a/Source/HtmlRenderer/Interfaces/IFontFamily.cs +++ b/Source/HtmlRenderer/Interfaces/IFontFamily.cs @@ -14,11 +14,12 @@ namespace HtmlRenderer.Interfaces { /// /// atodo: add doc + /// Required for custom fonts handling: fonts that are not installed on the system. /// public interface IFontFamily { /// - /// Gets the name of this FontFamily. + /// Gets the name of this Font Family. /// string Name { get; } } diff --git a/Source/HtmlRenderer/Interfaces/IGlobal.cs b/Source/HtmlRenderer/Interfaces/IGlobal.cs deleted file mode 100644 index 448ab4856..000000000 --- a/Source/HtmlRenderer/Interfaces/IGlobal.cs +++ /dev/null @@ -1,109 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -using System.IO; -using HtmlRenderer.Core; -using HtmlRenderer.Entities; - -namespace HtmlRenderer.Interfaces -{ - /// - /// atodo: add doc - /// - public interface IGlobal - { - CssData GetDefaultCssData(); - - /// - /// Resolve color value from given color name. - /// - /// the color name - /// color value - RColor ResolveColorFromName(string colorName); - - /// - /// Get image to be used while HTML image is loading. - /// - IImage GetLoadImage(); - - /// - /// Get image to be used if HTML image load failed. - /// - IImage GetErrorImage(); - - /// - /// Convert image object returned from to . - /// - /// the image returned from load event - /// converted image or null - IImage ConvertImage(object image); - - /// - /// Create an object from the given stream. - /// - /// the stream to create image from - /// new image instance - IImage ImageFromStream(Stream memoryStream); - - /// - /// - /// - /// - /// - /// - /// - IFont CreateFont(string family, float size, RFontStyle style); - - /// - /// - /// - /// - /// - /// - /// - IFont CreateFont(IFontFamily family, float size, RFontStyle style); - - /// - /// Set the given text to the clipboard - /// - /// the text to set - void SetToClipboard(string text); - - /// - /// Set the given html and plain text data to clipboard. - /// - /// the html data - /// the plain text data - void SetToClipboard(string html, string plainText); - - /// - /// Set the given image to clipboard. - /// - /// - void SetToClipboard(IImage image); - - /// - /// Create a context menu that can be used on the control - /// - /// new context menu - IContextMenu CreateContextMenu(); - - /// - /// Save the given image to file by showing save dialog to the client. - /// - /// the image to save - /// the name of the image for save dialog - /// the extension of the image for save dialog - /// optional: the control to show the dialog on - void SaveToFile(IImage image, string name, string extension, IControl control = null); - } -} diff --git a/Source/HtmlRenderer/Interfaces/IGraphics.cs b/Source/HtmlRenderer/Interfaces/IGraphics.cs index 17c952564..3167a27fe 100644 --- a/Source/HtmlRenderer/Interfaces/IGraphics.cs +++ b/Source/HtmlRenderer/Interfaces/IGraphics.cs @@ -53,6 +53,44 @@ public interface IGraphics : IDisposable /// the previous mode to set void ReturnPreviousSmoothingMode(Object prevMode); + /// + /// Get color pen. + /// + /// the color to get the pen for + /// pen instance + IPen GetPen(RColor color); + + /// + /// Get solid color brush. + /// + /// the color to get the brush for + /// solid color brush instance + IBrush GetSolidBrush(RColor color); + + /// + /// Get linear gradient color brush from to . + /// + /// the rectangle to get the brush for + /// the start color of the gradient + /// the end color of the gradient + /// the angle to move the gradient from start color to end color in the rectangle + /// linear gradient color brush instance + IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, float angle); + + /// + /// Get TextureBrush object that uses the specified image and bounding rectangle. + /// + /// The Image object with which this TextureBrush object fills interiors. + /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. + /// The dimension by which to translate the transformation + IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation); + + /// + /// Get GraphicsPath object. + /// + /// graphics path instance + IGraphicsPath GetGraphicsPath(); + /// /// Measure the width and height of string when drawn on device context HDC /// using the given font . @@ -114,10 +152,10 @@ public interface IGraphics : IDisposable /// The y-coordinate of the upper-left corner of the rectangle to fill. /// Width of the rectangle to fill. /// Height of the rectangle to fill. - void FillRectangle(IBrush brush, float x, float y, float width, float height); + void DrawRectangle(IBrush brush, float x, float y, float width, float height); /// - /// Draws the specified portion of the specified at the specified location and with the specified size. + /// Draws the specified portion of the specified at the specified location and with the specified size. /// /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. The image is scaled to fit the rectangle. @@ -131,20 +169,6 @@ public interface IGraphics : IDisposable /// Rectangle structure that specifies the location and size of the drawn image. void DrawImage(IImage image, RRect destRect); - /// - /// Fills the interior of a GraphicsPath. - /// - /// Brush that determines the characteristics of the fill. - /// GraphicsPath that represents the path to fill. - void FillPath(IBrush brush, IGraphicsPath path); - - /// - /// Fills the interior of a polygon defined by an array of points specified by Point structures. - /// - /// Brush that determines the characteristics of the fill. - /// Array of Point structures that represent the vertices of the polygon to fill. - void FillPolygon(IBrush brush, RPoint[] points); - /// /// Draws a GraphicsPath. /// @@ -153,41 +177,17 @@ public interface IGraphics : IDisposable void DrawPath(IPen pen, IGraphicsPath path); /// - /// Get color pen. - /// - /// the color to get the pen for - /// pen instance - IPen GetPen(RColor color); - - /// - /// Get solid color brush. - /// - /// the color to get the brush for - /// solid color brush instance - IBrush GetSolidBrush(RColor color); - - /// - /// Get linear gradient color brush from to . - /// - /// the rectangle to get the brush for - /// the start color of the gradient - /// the end color of the gradient - /// the angle to move the gradient from start color to end color in the rectangle - /// linear gradient color brush instance - IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, float angle); - - /// - /// Get TextureBrush object that uses the specified image and bounding rectangle. + /// Fills the interior of a GraphicsPath. /// - /// The Image object with which this TextureBrush object fills interiors. - /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. - /// The dimension by which to translate the transformation - IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation); + /// Brush that determines the characteristics of the fill. + /// GraphicsPath that represents the path to fill. + void DrawPath(IBrush brush, IGraphicsPath path); /// - /// Get GraphicsPath object. + /// Fills the interior of a polygon defined by an array of points specified by Point structures. /// - /// graphics path instance - IGraphicsPath GetGraphicsPath(); + /// Brush that determines the characteristics of the fill. + /// Array of Point structures that represent the vertices of the polygon to fill. + void DrawPolygon(IBrush brush, RPoint[] points); } } From af8801adf3ed23fe083d7ea4f76f3fdb34605554 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 1 Feb 2014 16:04:40 +0200 Subject: [PATCH 049/254] * refactor DefaultCssData in GlobalBase --- .../Adapters/GlobalAdapter.cs | 9 -------- .../Adapters/GlobalAdapter.cs | 9 -------- Source/HtmlRenderer/Interfaces/GlobalBase.cs | 21 +++++++++---------- 3 files changed, 10 insertions(+), 29 deletions(-) diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs index a16fc688a..865868ae4 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs @@ -12,7 +12,6 @@ using System.Drawing; using System.IO; -using HtmlRenderer.Core; using HtmlRenderer.Entities; using HtmlRenderer.Interfaces; using HtmlRenderer.PdfSharp.Utilities; @@ -57,14 +56,6 @@ public static GlobalAdapter Instance get { return _instance; } } - /// - /// Create a default CSS data object that will be cached. - /// - protected override CssData CreateDefaultCssData(string defaultStyleSheet) - { - return CssData.Parse(this, defaultStyleSheet, false); - } - /// /// Resolve color value from given color name. /// diff --git a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs index b2a66ea9e..08f674c0c 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs @@ -13,7 +13,6 @@ using System.Drawing; using System.IO; using System.Windows.Forms; -using HtmlRenderer.Core; using HtmlRenderer.Entities; using HtmlRenderer.Interfaces; using HtmlRenderer.WinForms.Utilities; @@ -148,14 +147,6 @@ public override void SaveToFile(IImage image, string name, string extension, ICo } } - /// - /// Create a default CSS data object that will be cached. - /// - protected override CssData CreateDefaultCssData(string defaultStyleSheet) - { - return CssData.Parse(this, defaultStyleSheet, false); - } - /// /// Get font instance by given font family name, size and style. /// diff --git a/Source/HtmlRenderer/Interfaces/GlobalBase.cs b/Source/HtmlRenderer/Interfaces/GlobalBase.cs index 611181f90..97e540861 100644 --- a/Source/HtmlRenderer/Interfaces/GlobalBase.cs +++ b/Source/HtmlRenderer/Interfaces/GlobalBase.cs @@ -23,10 +23,19 @@ namespace HtmlRenderer.Interfaces /// /// atodo: add doc /// + /// + /// It is best to have a singleton instance of this class for concrete implementation!
+ /// This is because it holds caches of default CssData, Images, Fonts and Brushes. + ///
public abstract class GlobalBase { #region Fields and Consts + /// + /// cache of all the font used not to create same font again and again + /// + private readonly FontHandler _fontHandler; + /// /// default CSS parsed data singleton /// @@ -42,11 +51,6 @@ public abstract class GlobalBase ///
private IImage _errorImage; - /// - /// cache of all the font used not to create same font again and again - /// - private readonly FontHandler _fontHandler; - #endregion @@ -63,7 +67,7 @@ protected GlobalBase() ///
public CssData DefaultCssData { - get { return _defaultCssData ?? ( _defaultCssData = CreateDefaultCssData(CssDefaults.DefaultStyleSheet) ); } + get { return _defaultCssData ?? ( _defaultCssData = CssData.Parse(this, CssDefaults.DefaultStyleSheet, false) ); } } /// @@ -207,11 +211,6 @@ public virtual void SaveToFile(IImage image, string name, string extension, ICon throw new NotImplementedException(); } - /// - /// Create a default CSS data object that will be cached. - /// - protected abstract CssData CreateDefaultCssData(string defaultStyleSheet); - /// /// Get font instance by given font family name, size and style. /// From c29b0c55de82685ce3071363c935c8b48a7b20d4 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sun, 2 Feb 2014 09:07:19 +0200 Subject: [PATCH 050/254] * use double instead of float for internals --- .../HtmlRenderer.Demo.WinForms.csproj | 2 +- .../Adapters/FontAdapter.cs | 22 +-- .../Adapters/GlobalAdapter.cs | 4 +- .../Adapters/GraphicsAdapter.cs | 14 +- .../Adapters/GraphicsPathAdapter.cs | 4 +- .../Adapters/ImageAdapter.cs | 4 +- .../Adapters/PenAdapter.cs | 8 +- .../Adapters/FontAdapter.cs | 14 +- .../Adapters/GlobalAdapter.cs | 8 +- .../Adapters/GraphicsAdapter.cs | 26 +-- .../Adapters/GraphicsPathAdapter.cs | 9 +- .../Adapters/ImageAdapter.cs | 4 +- .../Adapters/PenAdapter.cs | 14 +- .../HtmlRenderer.WinForms/Utilities/Utils.cs | 6 +- Source/HtmlRenderer/Core/Dom/CssBox.cs | 62 +++--- Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssBoxHr.cs | 10 +- Source/HtmlRenderer/Core/Dom/CssBoxImage.cs | 4 +- .../HtmlRenderer/Core/Dom/CssBoxProperties.cs | 180 +++++++++--------- .../HtmlRenderer/Core/Dom/CssLayoutEngine.cs | 80 ++++---- .../Core/Dom/CssLayoutEngineTable.cs | 120 ++++++------ Source/HtmlRenderer/Core/Dom/CssLength.cs | 12 +- Source/HtmlRenderer/Core/Dom/CssLineBox.cs | 26 +-- Source/HtmlRenderer/Core/Dom/CssRect.cs | 22 +-- .../Core/Entities/CssConstants.cs | 2 +- .../Handlers/BackgroundImageDrawHandler.cs | 4 +- .../Core/Handlers/BordersDrawHandler.cs | 14 +- .../HtmlRenderer/Core/Handlers/FontHandler.cs | 10 +- .../Core/Handlers/SelectionHandler.cs | 12 +- .../HtmlRenderer/Core/Parse/CssValueParser.cs | 28 +-- Source/HtmlRenderer/Core/Utils/CssUtils.cs | 4 +- Source/HtmlRenderer/Core/Utils/RenderUtils.cs | 2 +- .../Entities/HtmlImageLoadEventArgs.cs | 4 +- .../Entities/HtmlScrollEventArgs.cs | 4 +- Source/HtmlRenderer/Entities/RPoint.cs | 10 +- Source/HtmlRenderer/Entities/RRect.cs | 52 ++--- Source/HtmlRenderer/Entities/RSize.cs | 10 +- Source/HtmlRenderer/Interfaces/GlobalBase.cs | 6 +- Source/HtmlRenderer/Interfaces/IFont.cs | 12 +- Source/HtmlRenderer/Interfaces/IGraphics.cs | 10 +- .../HtmlRenderer/Interfaces/IGraphicsPath.cs | 4 +- Source/HtmlRenderer/Interfaces/IImage.cs | 4 +- Source/HtmlRenderer/Interfaces/IPen.cs | 4 +- 43 files changed, 430 insertions(+), 425 deletions(-) diff --git a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj index 88f72d90c..849931fdc 100644 --- a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj @@ -48,7 +48,7 @@ pdbonly true bin\Release\ - TRACE + TRACE;NET_40 prompt 4 AllRules.ruleset diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs index 9e9e0c4d8..61bb141e4 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs @@ -30,17 +30,17 @@ internal sealed class FontAdapter : IFont /// /// the vertical offset of the font underline location from the top of the font. /// - private float _underlineOffset = -1; + private double _underlineOffset = -1; /// /// Cached font height. /// - private float _height = -1; + private double _height = -1; /// /// Cached font whitespace width. /// - private float _whitespaceWidth = -1; + private double _whitespaceWidth = -1; #endregion @@ -65,23 +65,23 @@ public XFont Font /// /// Gets the em-size of this Font measured in the units specified by the Unit property. /// - public float Size + public double Size { - get { return (float)_font.Size; } + get { return _font.Size; } } /// /// Gets the em-size, in points, of this Font. /// - public float SizeInPoints + public double SizeInPoints { - get { return (float)_font.Size; } + get { return _font.Size; } } /// /// Get the vertical offset of the font underline location from the top of the font. /// - public float UnderlineOffset + public double UnderlineOffset { get { return _underlineOffset; } } @@ -89,7 +89,7 @@ public float UnderlineOffset /// /// The line spacing, in pixels, of this font. /// - public float Height + public double Height { get { return _height; } } @@ -97,13 +97,13 @@ public float Height /// /// Get the left padding, in pixels, of the font. /// - public float LeftPadding + public double LeftPadding { get { return _height / 6f; } } - public float GetWhitespaceWidth(IGraphics graphics) + public double GetWhitespaceWidth(IGraphics graphics) { if( _whitespaceWidth < 0 ) { diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs index 865868ae4..a65078247 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs @@ -94,7 +94,7 @@ public override IImage ImageFromStream(Stream memoryStream) /// font size /// font style /// font instance - protected override IFont CreateFont(string family, float size, RFontStyle style) + protected override IFont CreateFont(string family, double size, RFontStyle style) { var fontStyle = (XFontStyle)((int)style); return new FontAdapter(new XFont(family, size, fontStyle)); @@ -108,7 +108,7 @@ protected override IFont CreateFont(string family, float size, RFontStyle style) /// font size /// font style /// font instance - protected override IFont CreateFont(IFontFamily family, float size, RFontStyle style) + protected override IFont CreateFont(IFontFamily family, double size, RFontStyle style) { var fontStyle = (XFontStyle)((int)style); return new FontAdapter(new XFont(((FontFamilyAdapter)family).FontFamily.Name, size, fontStyle)); diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs index aaa5ee4c4..55bba8b25 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs @@ -70,7 +70,7 @@ public RRect GetClip() /// Rectangle structure to combine. public void SetClipReplace(RRect rect) { - _g.Graphics.SetClip(new RectangleF(rect.X, rect.Y, rect.Width, rect.Height), CombineMode.Replace); + _g.Graphics.SetClip(new RectangleF((float)rect.X, (float)rect.Y, (float)rect.Width, (float)rect.Height), CombineMode.Replace); } /// @@ -79,7 +79,7 @@ public void SetClipReplace(RRect rect) /// Rectangle structure to combine. public void SetClipExclude(RRect rect) { - _g.Graphics.SetClip(new RectangleF(rect.X, rect.Y, rect.Width, rect.Height), CombineMode.Exclude); + _g.Graphics.SetClip(new RectangleF((float)rect.X, (float)rect.Y, (float)rect.Width, (float)rect.Height), CombineMode.Exclude); } /// @@ -142,7 +142,7 @@ public RSize MeasureString(string str, IFont font) /// the number of characters that will fit under restriction /// /// the size of the string - public RSize MeasureString(string str, IFont font, float maxWidth, out int charFit, out int charFitWidth) + public RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth) { throw new NotSupportedException(); } @@ -189,7 +189,7 @@ public IBrush GetSolidBrush(RColor color) /// the end color of the gradient /// the angle to move the gradient from start color to end color in the rectangle /// linear gradient color brush instance - public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, float angle) + public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) { XLinearGradientMode mode; if(angle < 45) @@ -246,7 +246,7 @@ public void Dispose() /// The x-coordinate of the first point. The y-coordinate of the first point. /// The x-coordinate of the second point. The y-coordinate of the second point. /// is null. - public void DrawLine(IPen pen, float x1, float y1, float x2, float y2) + public void DrawLine(IPen pen, double x1, double y1, double x2, double y2) { _g.DrawLine(((PenAdapter)pen).Pen, x1, y1, x2, y2); } @@ -259,7 +259,7 @@ public void DrawLine(IPen pen, float x1, float y1, float x2, float y2) /// The y-coordinate of the upper-left corner of the rectangle to draw. /// The width of the rectangle to draw. /// The height of the rectangle to draw. - public void DrawRectangle(IPen pen, float x, float y, float width, float height) + public void DrawRectangle(IPen pen, double x, double y, double width, double height) { _g.DrawRectangle(((PenAdapter)pen).Pen, x, y, width, height); } @@ -272,7 +272,7 @@ public void DrawRectangle(IPen pen, float x, float y, float width, float height) /// The y-coordinate of the upper-left corner of the rectangle to fill. /// Width of the rectangle to fill. /// Height of the rectangle to fill. - public void DrawRectangle(IBrush brush, float x, float y, float width, float height) + public void DrawRectangle(IBrush brush, double x, double y, double width, double height) { _g.DrawRectangle(((BrushAdapter)brush).Brush, x, y, width, height); } diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs index 213321b0e..1e9c7d319 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs @@ -36,7 +36,7 @@ public XGraphicsPath GraphicsPath /// /// Appends an elliptical arc to the current figure. /// - public void AddArc(float x, float y, float width, float height, float startAngle, float sweepAngle) + public void AddArc(double x, double y, double width, double height, double startAngle, double sweepAngle) { _graphicsPath.AddArc(x, y, width, height, startAngle, sweepAngle); } @@ -44,7 +44,7 @@ public void AddArc(float x, float y, float width, float height, float startAngle /// /// Appends a line segment to this GraphicsPath. /// - public void AddLine(float x1, float y1, float x2, float y2) + public void AddLine(double x1, double y1, double x2, double y2) { _graphicsPath.AddLine(x1, y1, x2, y2); } diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs index 5d78639d1..5be6ceaba 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs @@ -46,7 +46,7 @@ public XImage Image /// /// Get the width, in pixels, of the image. /// - public float Width + public double Width { get { return _image.PixelWidth; } } @@ -54,7 +54,7 @@ public float Width /// /// Get the height, in pixels, of the image. /// - public float Height + public double Height { get { return _image.PixelHeight; } } diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs index ee1ca9624..06402fdf6 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs @@ -45,9 +45,9 @@ public XPen Pen /// /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. /// - public float Width + public double Width { - get { return (float)_pen.Width; } + get { return _pen.Width; } set { _pen.Width = value; } } @@ -88,7 +88,7 @@ public RDashStyle DashStyle /// /// Gets or sets an array of custom dashes and spaces. /// - public float[] DashPattern + public double[] DashPattern { set { @@ -96,7 +96,7 @@ public float[] DashPattern for(int i = 0; i < value.Length; i++) dValues[i] = value[i]; - _pen.DashPattern = dValues; + _pen.DashPattern = value; } } } diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs index d96562619..ce05f33f8 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs @@ -46,7 +46,7 @@ internal sealed class FontAdapter : IFont /// /// Cached font whitespace width. /// - private float _whitespaceWidth = -1; + private double _whitespaceWidth = -1; #endregion @@ -84,7 +84,7 @@ public IntPtr HFont /// /// Gets the em-size of this Font measured in the units specified by the Unit property. /// - public float Size + public double Size { get { return _font.Size; } } @@ -92,7 +92,7 @@ public float Size /// /// Gets the em-size, in points, of this Font. /// - public float SizeInPoints + public double SizeInPoints { get { return _font.SizeInPoints; } } @@ -100,7 +100,7 @@ public float SizeInPoints /// /// Get the vertical offset of the font underline location from the top of the font. /// - public float UnderlineOffset + public double UnderlineOffset { get { return _underlineOffset; } } @@ -108,7 +108,7 @@ public float UnderlineOffset /// /// The line spacing, in pixels, of this font. /// - public float Height + public double Height { get { return _height; } } @@ -116,13 +116,13 @@ public float Height /// /// Get the left padding, in pixels, of the font. /// - public float LeftPadding + public double LeftPadding { get { return _height / 6f; } } - public float GetWhitespaceWidth(IGraphics graphics) + public double GetWhitespaceWidth(IGraphics graphics) { if( _whitespaceWidth < 0 ) { diff --git a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs index 08f674c0c..b75f148b5 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs @@ -154,10 +154,10 @@ public override void SaveToFile(IImage image, string name, string extension, ICo /// font size /// font style /// font instance - protected internal override IFont CreateFont(string family, float size, RFontStyle style) + protected internal override IFont CreateFont(string family, double size, RFontStyle style) { var fontStyle = (FontStyle)((int)style); - return new FontAdapter(new Font(family, size, fontStyle)); + return new FontAdapter(new Font(family, (float)size, fontStyle)); } /// @@ -168,10 +168,10 @@ protected internal override IFont CreateFont(string family, float size, RFontSty /// font size /// font style /// font instance - protected internal override IFont CreateFont(IFontFamily family, float size, RFontStyle style) + protected internal override IFont CreateFont(IFontFamily family, double size, RFontStyle style) { var fontStyle = (FontStyle)((int)style); - return new FontAdapter(new Font(( (FontFamilyAdapter)family ).FontFamily, size, fontStyle)); + return new FontAdapter(new Font(( (FontFamilyAdapter)family ).FontFamily, (float)size, fontStyle)); } } } diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs index f64109991..f258c5fe7 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs @@ -28,12 +28,12 @@ internal sealed class GraphicsAdapter : IGraphics #region Fields and Consts /// - /// used for calculation. + /// used for calculation. /// private static readonly int[] _charFit = new int[1]; /// - /// used for calculation. + /// used for calculation. /// private static readonly int[] _charFitWidth = new int[1000]; @@ -216,7 +216,7 @@ public RSize MeasureString(string str, IFont font) /// the number of characters that will fit under restriction /// /// the size of the string - public RSize MeasureString(string str, IFont font, float maxWidth, out int charFit, out int charFitWidth) + public RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth) { if( _useGdiPlusTextRendering ) { @@ -252,7 +252,7 @@ public void DrawString(String str, IFont font, RColor color, RPoint point, RSize { ReleaseHdc(); var brush = ((BrushAdapter)CacheUtils.GetSolidBrush(color)).Brush; - _g.DrawString(str, ((FontAdapter)font).Font, brush, point.X - font.LeftPadding*.8f, point.Y); + _g.DrawString(str, ((FontAdapter)font).Font, brush, (float)(point.X - font.LeftPadding * .8d), (float)point.Y); } else { @@ -299,9 +299,9 @@ public IBrush GetSolidBrush(RColor color) /// the end color of the gradient /// the angle to move the gradient from start color to end color in the rectangle /// linear gradient color brush instance - public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, float angle) + public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) { - return new BrushAdapter(new LinearGradientBrush(Utils.Convert(rect), Utils.Convert(color1), Utils.Convert(color2), angle), true); + return new BrushAdapter(new LinearGradientBrush(Utils.Convert(rect), Utils.Convert(color1), Utils.Convert(color2), (float)angle), true); } /// @@ -313,7 +313,7 @@ public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, f public IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation) { var brush = new TextureBrush(((ImageAdapter)image).Image, Utils.Convert(dstRect)); - brush.TranslateTransform(translateTransformLocation.X, translateTransformLocation.Y); + brush.TranslateTransform((float)translateTransformLocation.X, (float)translateTransformLocation.Y); return new BrushAdapter(brush, true); } @@ -346,10 +346,10 @@ public void Dispose() /// The x-coordinate of the first point. The y-coordinate of the first point. /// The x-coordinate of the second point. The y-coordinate of the second point. /// is null. - public void DrawLine(IPen pen, float x1, float y1, float x2, float y2) + public void DrawLine(IPen pen, double x1, double y1, double x2, double y2) { ReleaseHdc(); - _g.DrawLine(((PenAdapter)pen).Pen, x1, y1, x2, y2); + _g.DrawLine(((PenAdapter)pen).Pen, (float)x1, (float)y1, (float)x2, (float)y2); } /// @@ -360,10 +360,10 @@ public void DrawLine(IPen pen, float x1, float y1, float x2, float y2) /// The y-coordinate of the upper-left corner of the rectangle to draw. /// The width of the rectangle to draw. /// The height of the rectangle to draw. - public void DrawRectangle(IPen pen, float x, float y, float width, float height) + public void DrawRectangle(IPen pen, double x, double y, double width, double height) { ReleaseHdc(); - _g.DrawRectangle(((PenAdapter)pen).Pen, x, y, width, height); + _g.DrawRectangle(((PenAdapter)pen).Pen, (float)x, (float)y, (float)width, (float)height); } /// @@ -374,10 +374,10 @@ public void DrawRectangle(IPen pen, float x, float y, float width, float height) /// The y-coordinate of the upper-left corner of the rectangle to fill. /// Width of the rectangle to fill. /// Height of the rectangle to fill. - public void DrawRectangle(IBrush brush, float x, float y, float width, float height) + public void DrawRectangle(IBrush brush, double x, double y, double width, double height) { ReleaseHdc(); - _g.FillRectangle(((BrushAdapter)brush).Brush, x, y, width, height); + _g.FillRectangle(((BrushAdapter)brush).Brush, (float)x, (float)y, (float)width, (float)height); } /// diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs index 9c7904884..641522427 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs @@ -11,7 +11,6 @@ // "The Art of War" using System.Drawing.Drawing2D; -using HtmlRenderer.Core; using HtmlRenderer.Interfaces; namespace HtmlRenderer.WinForms.Adapters @@ -37,17 +36,17 @@ public GraphicsPath GraphicsPath /// /// Appends an elliptical arc to the current figure. /// - public void AddArc(float x, float y, float width, float height, float startAngle, float sweepAngle) + public void AddArc(double x, double y, double width, double height, double startAngle, double sweepAngle) { - _graphicsPath.AddArc(x, y, width, height, startAngle, sweepAngle); + _graphicsPath.AddArc((float)x, (float)y, (float)width, (float)height, (float)startAngle, (float)sweepAngle); } /// /// Appends a line segment to this GraphicsPath. /// - public void AddLine(float x1, float y1, float x2, float y2) + public void AddLine(double x1, double y1, double x2, double y2) { - _graphicsPath.AddLine(x1, y1, x2, y2); + _graphicsPath.AddLine((float)x1, (float)y1, (float)x2, (float)y2); } /// diff --git a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs index 10a181d7f..bf6ecb445 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs @@ -46,7 +46,7 @@ public Image Image /// /// Get the width, in pixels, of the image. /// - public float Width + public double Width { get { return _image.Width; } } @@ -54,7 +54,7 @@ public float Width /// /// Get the height, in pixels, of the image. /// - public float Height + public double Height { get { return _image.Height; } } diff --git a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs index 13bdb7c40..085889e5a 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs @@ -45,10 +45,10 @@ public Pen Pen /// /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. /// - public float Width + public double Width { get { return _pen.Width; } - set { _pen.Width = value; } + set { _pen.Width = (float)value; } } /// @@ -88,9 +88,15 @@ public RDashStyle DashStyle /// /// Gets or sets an array of custom dashes and spaces. /// - public float[] DashPattern + public double[] DashPattern { - set { _pen.DashPattern = value; } + set + { + var fValues = new float[value.Length]; + for (int i = 0; i < value.Length; i++) + fValues[i] = (float)value[i]; + _pen.DashPattern = fValues; + } } } } diff --git a/Source/HtmlRenderer.WinForms/Utilities/Utils.cs b/Source/HtmlRenderer.WinForms/Utilities/Utils.cs index 8f7c09346..173a6f636 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/Utils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/Utils.cs @@ -45,7 +45,7 @@ public static PointF[] Convert(RPoint[] points) /// public static PointF Convert(RPoint p) { - return new PointF(p.X, p.Y); + return new PointF((float)p.X, (float)p.Y); } /// @@ -69,7 +69,7 @@ public static RSize Convert(SizeF s) /// public static SizeF Convert(RSize s) { - return new SizeF(s.Width, s.Height); + return new SizeF((float)s.Width, (float)s.Height); } /// @@ -93,7 +93,7 @@ public static RRect Convert(RectangleF r) /// public static RectangleF Convert(RRect r) { - return new RectangleF(r.X, r.Y, r.Width, r.Height); + return new RectangleF((float)r.X, (float)r.Y, (float)r.Width, (float)r.Height); } /// diff --git a/Source/HtmlRenderer/Core/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs index 94233d206..4c3dd6e3e 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -576,7 +576,7 @@ protected virtual void PerformLayoutImp(IGraphics g) // Because their width and height are set by CssTable if( Display != CssConstants.TableCell && Display != CssConstants.Table ) { - float width = ContainingBlock.Size.Width + double width = ContainingBlock.Size.Width - ContainingBlock.ActualPaddingLeft - ContainingBlock.ActualPaddingRight - ContainingBlock.ActualBorderLeftWidth - ContainingBlock.ActualBorderRightWidth; @@ -594,8 +594,8 @@ protected virtual void PerformLayoutImp(IGraphics g) if( Display != CssConstants.TableCell ) { var prevSibling = DomUtils.GetPreviousSibling(this); - float left = ContainingBlock.Location.X + ContainingBlock.ActualPaddingLeft + ActualMarginLeft + ContainingBlock.ActualBorderLeftWidth; - float top = ( prevSibling == null && ParentBox != null ? ParentBox.ClientTop : ParentBox == null ? Location.Y : 0 ) + MarginTopCollapse(prevSibling) + ( prevSibling != null ? prevSibling.ActualBottom + prevSibling.ActualBorderBottomWidth : 0 ); + double left = ContainingBlock.Location.X + ContainingBlock.ActualPaddingLeft + ActualMarginLeft + ContainingBlock.ActualBorderLeftWidth; + double top = ( prevSibling == null && ParentBox != null ? ParentBox.ClientTop : ParentBox == null ? Location.Y : 0 ) + MarginTopCollapse(prevSibling) + ( prevSibling != null ? prevSibling.ActualBottom + prevSibling.ActualBorderBottomWidth : 0 ); Location = new RPoint(left, top); ActualBottom = top; } @@ -834,13 +834,13 @@ internal string GetAttribute(string attribute, string defaultValue) /// The check is deep thru box tree.
///
/// the min width of the box - internal float GetMinimumWidth() + internal double GetMinimumWidth() { - float maxWidth = 0; + double maxWidth = 0; CssRect maxWidthWord = null; GetMinimumWidth_LongestWord(this, ref maxWidth, ref maxWidthWord); - float padding = 0f; + double padding = 0f; if (maxWidthWord != null) { var box = maxWidthWord.OwnerBox; @@ -861,7 +861,7 @@ internal float GetMinimumWidth() /// /// /// - private static void GetMinimumWidth_LongestWord(CssBox box, ref float maxWidth, ref CssRect maxWidthWord) + private static void GetMinimumWidth_LongestWord(CssBox box, ref double maxWidth, ref CssRect maxWidthWord) { if (box.Words.Count > 0) { @@ -886,9 +886,9 @@ private static void GetMinimumWidth_LongestWord(CssBox box, ref float maxWidth, ///
/// the box to start calculation from. /// the total margin - private static float GetWidthMarginDeep(CssBox box) + private static double GetWidthMarginDeep(CssBox box) { - float sum = 0f; + double sum = 0f; if (box.Size.Width > 90999 || (box.ParentBox != null && box.ParentBox.Size.Width > 90999)) { while (box != null) @@ -906,7 +906,7 @@ private static float GetWidthMarginDeep(CssBox box) /// /// /// - internal float GetMaximumBottom(CssBox startBox, float currentMaxBottom) + internal double GetMaximumBottom(CssBox startBox, double currentMaxBottom) { foreach (var line in startBox.Rectangles.Keys) { @@ -926,12 +926,12 @@ internal float GetMaximumBottom(CssBox startBox, float currentMaxBottom) ///
/// The minimum width the content must be so it won't overflow (largest word + padding). /// The total width the content can take without line wrapping (with padding). - internal void GetMinMaxWidth(out float minWidth, out float maxWidth) + internal void GetMinMaxWidth(out double minWidth, out double maxWidth) { - float min = 0f; - float maxSum = 0f; - float paddingSum = 0f; - float marginSum = 0f; + double min = 0f; + double maxSum = 0f; + double paddingSum = 0f; + double marginSum = 0f; GetMinMaxSumWords(this, ref min, ref maxSum, ref paddingSum, ref marginSum); maxWidth = paddingSum + maxSum; @@ -947,9 +947,9 @@ internal void GetMinMaxWidth(out float minWidth, out float maxWidth) /// the total amount of padding the content has /// /// - private static void GetMinMaxSumWords(CssBox box, ref float min, ref float maxSum, ref float paddingSum, ref float marginSum) + private static void GetMinMaxSumWords(CssBox box, ref double min, ref double maxSum, ref double paddingSum, ref double marginSum) { - float? oldSum = null; + double? oldSum = null; // not inline (block) boxes start a new line so we need to reset the max sum if (box.Display != CssConstants.Inline && box.Display != CssConstants.TableCell && box.WhiteSpace != CssConstants.NoWrap) @@ -1031,9 +1031,9 @@ internal bool HasJustInlineSiblings() ///
/// the previous box under the same parent /// Resulting top margin - protected float MarginTopCollapse(CssBoxProperties prevSibling) + protected double MarginTopCollapse(CssBoxProperties prevSibling) { - float value; + double value; if (prevSibling != null) { value = Math.Max(prevSibling.ActualMarginBottom, ActualMarginTop); @@ -1061,11 +1061,11 @@ protected float MarginTopCollapse(CssBoxProperties prevSibling) /// Calculate the actual right of the box by the actual right of the child boxes if this box actual right is not set. ///
/// the calculated actual right value - private float CalculateActualRight() + private double CalculateActualRight() { if (ActualRight > 90999) { - var maxRight = 0f; + var maxRight = 0d; foreach (var box in Boxes) { maxRight = Math.Max(maxRight, box.ActualRight + box.ActualMarginRight); @@ -1082,9 +1082,9 @@ private float CalculateActualRight() /// Gets the result of collapsing the vertical margins of the two boxes ///
/// Resulting bottom margin - private float MarginBottomCollapse() + private double MarginBottomCollapse() { - float margin = 0; + double margin = 0; if (ParentBox != null && ParentBox.Boxes.IndexOf(this) == ParentBox.Boxes.Count - 1 && _parentBox.ActualMarginBottom < 0.1) { var lastChildBottomMargin = _boxes[_boxes.Count - 1].ActualMarginBottom; @@ -1097,7 +1097,7 @@ private float MarginBottomCollapse() /// Deeply offsets the top of the box and its contents ///
/// - internal void OffsetTop(float amount) + internal void OffsetTop(double amount) { List lines = new List(); foreach (CssLineBox line in Rectangles.Keys) @@ -1225,7 +1225,7 @@ protected void PaintBackground(IGraphics g, RRect rect, bool isFirst, bool isLas } else { - g.DrawRectangle(brush, (float)Math.Ceiling(rect.X), (float)Math.Ceiling(rect.Y), rect.Width, rect.Height); + g.DrawRectangle(brush, (double)Math.Ceiling(rect.X), (double)Math.Ceiling(rect.Y), rect.Width, rect.Height); } g.ReturnPreviousSmoothingMode(prevMode); @@ -1296,10 +1296,10 @@ protected void PaintDecoration(IGraphics g, RRect rectangle, bool isFirst, bool if (string.IsNullOrEmpty(TextDecoration) || TextDecoration == CssConstants.None) return; - float y = 0f; + double y = 0f; if (TextDecoration == CssConstants.Underline) { - y = (float)Math.Round(rectangle.Top + ActualFont.UnderlineOffset); + y = (double)Math.Round(rectangle.Top + ActualFont.UnderlineOffset); } else if (TextDecoration == CssConstants.LineThrough) { @@ -1311,11 +1311,11 @@ protected void PaintDecoration(IGraphics g, RRect rectangle, bool isFirst, bool } y -= ActualPaddingBottom - ActualBorderBottomWidth; - float x1 = rectangle.X; + double x1 = rectangle.X; if (isFirst) x1 += ActualPaddingLeft + ActualBorderLeftWidth; - float x2 = rectangle.Right; + double x2 = rectangle.Right; if (isLast) x2 -= ActualPaddingRight + ActualBorderRightWidth; @@ -1329,7 +1329,7 @@ protected void PaintDecoration(IGraphics g, RRect rectangle, bool isFirst, bool ///
/// /// - internal void OffsetRectangle(CssLineBox lineBox, float gap) + internal void OffsetRectangle(CssLineBox lineBox, double gap) { if (Rectangles.ContainsKey(lineBox)) { @@ -1387,7 +1387,7 @@ protected IBrush GetSelectionBackBrush(IGraphics g, bool forceAlpha) } } - protected override IFont GetCachedFont(string fontFamily, float fsize, RFontStyle st) + protected override IFont GetCachedFont(string fontFamily, double fsize, RFontStyle st) { return HtmlContainer.Global.GetFont(fontFamily, fsize, st); } diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs index a8a786481..1a0318c00 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs @@ -413,8 +413,8 @@ protected override void PaintImp(IGraphics g) tmpRect.Offset(offset); tmpRect.Height -= ActualBorderTopWidth + ActualBorderBottomWidth + ActualPaddingTop + ActualPaddingBottom; tmpRect.Y += ActualBorderTopWidth + ActualPaddingTop; - tmpRect.X = (float)Math.Floor(tmpRect.X); - tmpRect.Y = (float)Math.Floor(tmpRect.Y); + tmpRect.X = (double)Math.Floor(tmpRect.X); + tmpRect.Y = (double)Math.Floor(tmpRect.Y); var rect = tmpRect; DrawImage(g, offset, rect); diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs index 9df2f2257..88283a66d 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs @@ -48,14 +48,14 @@ protected override void PerformLayoutImp(IGraphics g) RectanglesReset(); var prevSibling = DomUtils.GetPreviousSibling(this); - float left = ContainingBlock.Location.X + ContainingBlock.ActualPaddingLeft + ActualMarginLeft + ContainingBlock.ActualBorderLeftWidth; - float top = (prevSibling == null && ParentBox != null ? ParentBox.ClientTop : ParentBox == null ? Location.Y : 0) + MarginTopCollapse(prevSibling) + (prevSibling != null ? prevSibling.ActualBottom + prevSibling.ActualBorderBottomWidth : 0); + double left = ContainingBlock.Location.X + ContainingBlock.ActualPaddingLeft + ActualMarginLeft + ContainingBlock.ActualBorderLeftWidth; + double top = (prevSibling == null && ParentBox != null ? ParentBox.ClientTop : ParentBox == null ? Location.Y : 0) + MarginTopCollapse(prevSibling) + (prevSibling != null ? prevSibling.ActualBottom + prevSibling.ActualBorderBottomWidth : 0); Location = new RPoint(left, top); ActualBottom = top; //width at 100% (or auto) - float minwidth = GetMinimumWidth(); - float width = ContainingBlock.Size.Width + double minwidth = GetMinimumWidth(); + double width = ContainingBlock.Size.Width - ContainingBlock.ActualPaddingLeft - ContainingBlock.ActualPaddingRight - ContainingBlock.ActualBorderLeftWidth - ContainingBlock.ActualBorderRightWidth - ActualMarginLeft - ActualMarginRight - ActualBorderLeftWidth - ActualBorderRightWidth; @@ -69,7 +69,7 @@ protected override void PerformLayoutImp(IGraphics g) if (width < minwidth || width >= 9999) width = minwidth; - float height = ActualHeight; + double height = ActualHeight; if(height < 1) { height = Size.Height + ActualBorderTopWidth + ActualBorderBottomWidth; diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs index a2d4c7cfe..bfab50b50 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs @@ -90,8 +90,8 @@ protected override void PaintImp(IGraphics g) r.Offset(offset); r.Height -= ActualBorderTopWidth + ActualBorderBottomWidth + ActualPaddingTop + ActualPaddingBottom; r.Y += ActualBorderTopWidth + ActualPaddingTop; - r.X = (float) Math.Floor(r.X); - r.Y = (float)Math.Floor(r.Y); + r.X = (double) Math.Floor(r.X); + r.Y = (double)Math.Floor(r.Y); if (_imageWord.Image != null) { diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs index dd801d4f2..1962472bb 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs @@ -113,36 +113,36 @@ internal abstract class CssBoxProperties ///
private RSize _size; - private float _actualCornerNw = float.NaN; - private float _actualCornerNe = float.NaN; - private float _actualCornerSw = float.NaN; - private float _actualCornerSe = float.NaN; + private double _actualCornerNw = double.NaN; + private double _actualCornerNe = double.NaN; + private double _actualCornerSw = double.NaN; + private double _actualCornerSe = double.NaN; private RColor _actualColor = RColor.Empty; - private float _actualBackgroundGradientAngle = float.NaN; - private float _actualHeight = float.NaN; - private float _actualWidth = float.NaN; - private float _actualPaddingTop = float.NaN; - private float _actualPaddingBottom = float.NaN; - private float _actualPaddingRight = float.NaN; - private float _actualPaddingLeft = float.NaN; - private float _actualMarginTop = float.NaN; - private float _collapsedMarginTop = float.NaN; - private float _actualMarginBottom = float.NaN; - private float _actualMarginRight = float.NaN; - private float _actualMarginLeft = float.NaN; - private float _actualBorderTopWidth = float.NaN; - private float _actualBorderLeftWidth = float.NaN; - private float _actualBorderBottomWidth = float.NaN; - private float _actualBorderRightWidth = float.NaN; + private double _actualBackgroundGradientAngle = double.NaN; + private double _actualHeight = double.NaN; + private double _actualWidth = double.NaN; + private double _actualPaddingTop = double.NaN; + private double _actualPaddingBottom = double.NaN; + private double _actualPaddingRight = double.NaN; + private double _actualPaddingLeft = double.NaN; + private double _actualMarginTop = double.NaN; + private double _collapsedMarginTop = double.NaN; + private double _actualMarginBottom = double.NaN; + private double _actualMarginRight = double.NaN; + private double _actualMarginLeft = double.NaN; + private double _actualBorderTopWidth = double.NaN; + private double _actualBorderLeftWidth = double.NaN; + private double _actualBorderBottomWidth = double.NaN; + private double _actualBorderRightWidth = double.NaN; /// /// the width of whitespace between words /// - private float _actualLineHeight = float.NaN; - private float _actualWordSpacing = float.NaN; - private float _actualTextIndent = float.NaN; - private float _actualBorderSpacingHorizontal = float.NaN; - private float _actualBorderSpacingVertical = float.NaN; + private double _actualLineHeight = double.NaN; + private double _actualWordSpacing = double.NaN; + private double _actualTextIndent = double.NaN; + private double _actualBorderSpacingHorizontal = double.NaN; + private double _actualBorderSpacingVertical = double.NaN; private RColor _actualBackgroundGradient = RColor.Empty; private RColor _actualBorderTopColor = RColor.Empty; private RColor _actualBorderLeftColor = RColor.Empty; @@ -361,25 +361,25 @@ public string MarginTop public string PaddingBottom { get { return _paddingBottom; } - set { _paddingBottom = value; _actualPaddingBottom = float.NaN; } + set { _paddingBottom = value; _actualPaddingBottom = double.NaN; } } public string PaddingLeft { get { return _paddingLeft; } - set { _paddingLeft = value; _actualPaddingLeft = float.NaN; } + set { _paddingLeft = value; _actualPaddingLeft = double.NaN; } } public string PaddingRight { get { return _paddingRight; } - set { _paddingRight = value; _actualPaddingRight = float.NaN; } + set { _paddingRight = value; _actualPaddingRight = double.NaN; } } public string PaddingTop { get { return _paddingTop; } - set { _paddingTop = value; _actualPaddingTop = float.NaN; } + set { _paddingTop = value; _actualPaddingTop = double.NaN; } } public string Left @@ -658,7 +658,7 @@ public RRect Bounds /// /// Gets the width available on the box, counting padding and margin. /// - public float AvailableWidth + public double AvailableWidth { get { return Size.Width - ActualBorderLeftWidth - ActualPaddingLeft - ActualPaddingRight - ActualBorderRightWidth; } } @@ -666,7 +666,7 @@ public float AvailableWidth /// /// Gets the right of the box. When setting, it will affect only the width of the box. /// - public float ActualRight + public double ActualRight { get { return Location.X + Size.Width; } set { Size = new RSize(value - Location.X, Size.Height); } @@ -676,7 +676,7 @@ public float ActualRight /// Gets or sets the bottom of the box. /// (When setting, alters only the Size.Height of the box) ///
- public float ActualBottom + public double ActualBottom { get { return Location.Y + Size.Height; } set { Size = new RSize(Size.Width, value - Location.Y); } @@ -685,7 +685,7 @@ public float ActualBottom /// /// Gets the left of the client rectangle (Where content starts rendering) /// - public float ClientLeft + public double ClientLeft { get { return Location.X + ActualBorderLeftWidth + ActualPaddingLeft; } } @@ -693,7 +693,7 @@ public float ClientLeft /// /// Gets the top of the client rectangle (Where content starts rendering) /// - public float ClientTop + public double ClientTop { get { return Location.Y + ActualBorderTopWidth + ActualPaddingTop; } } @@ -701,7 +701,7 @@ public float ClientTop /// /// Gets the right of the client rectangle /// - public float ClientRight + public double ClientRight { get { return ActualRight - ActualPaddingRight - ActualBorderRightWidth; } } @@ -709,7 +709,7 @@ public float ClientRight /// /// Gets the bottom of the client rectangle /// - public float ClientBottom + public double ClientBottom { get { return ActualBottom - ActualPaddingBottom - ActualBorderBottomWidth; } } @@ -725,11 +725,11 @@ public RRect ClientRectangle /// /// Gets the actual height /// - public float ActualHeight + public double ActualHeight { get { - if (float.IsNaN(_actualHeight)) + if (double.IsNaN(_actualHeight)) { _actualHeight = CssValueParser.ParseLength(Height, Size.Height, this); } @@ -740,11 +740,11 @@ public float ActualHeight /// /// Gets the actual height /// - public float ActualWidth + public double ActualWidth { get { - if (float.IsNaN(_actualWidth)) + if (double.IsNaN(_actualWidth)) { _actualWidth = CssValueParser.ParseLength(Width, Size.Width, this); } @@ -755,11 +755,11 @@ public float ActualWidth /// /// Gets the actual top's padding /// - public float ActualPaddingTop + public double ActualPaddingTop { get { - if (float.IsNaN(_actualPaddingTop)) + if (double.IsNaN(_actualPaddingTop)) { _actualPaddingTop = CssValueParser.ParseLength(PaddingTop, Size.Width, this); } @@ -770,11 +770,11 @@ public float ActualPaddingTop /// /// Gets the actual padding on the left /// - public float ActualPaddingLeft + public double ActualPaddingLeft { get { - if (float.IsNaN(_actualPaddingLeft)) + if (double.IsNaN(_actualPaddingLeft)) { _actualPaddingLeft = CssValueParser.ParseLength(PaddingLeft, Size.Width, this); } @@ -785,11 +785,11 @@ public float ActualPaddingLeft /// /// Gets the actual Padding of the bottom /// - public float ActualPaddingBottom + public double ActualPaddingBottom { get { - if (float.IsNaN(_actualPaddingBottom)) + if (double.IsNaN(_actualPaddingBottom)) { _actualPaddingBottom = CssValueParser.ParseLength(PaddingBottom, Size.Width, this); } @@ -800,11 +800,11 @@ public float ActualPaddingBottom /// /// Gets the actual padding on the right /// - public float ActualPaddingRight + public double ActualPaddingRight { get { - if (float.IsNaN(_actualPaddingRight)) + if (double.IsNaN(_actualPaddingRight)) { _actualPaddingRight = CssValueParser.ParseLength(PaddingRight, Size.Width, this); } @@ -815,11 +815,11 @@ public float ActualPaddingRight /// /// Gets the actual top's Margin /// - public float ActualMarginTop + public double ActualMarginTop { get { - if (float.IsNaN(_actualMarginTop)) + if (double.IsNaN(_actualMarginTop)) { if (MarginTop == CssConstants.Auto) MarginTop = "0"; @@ -835,20 +835,20 @@ public float ActualMarginTop /// /// The margin top value if was effected by margin collapse. /// - public float CollapsedMarginTop + public double CollapsedMarginTop { - get { return float.IsNaN(_collapsedMarginTop) ? 0 : _collapsedMarginTop; } + get { return double.IsNaN(_collapsedMarginTop) ? 0 : _collapsedMarginTop; } set { _collapsedMarginTop = value; } } /// /// Gets the actual Margin on the left /// - public float ActualMarginLeft + public double ActualMarginLeft { get { - if (float.IsNaN(_actualMarginLeft)) + if (double.IsNaN(_actualMarginLeft)) { if (MarginLeft == CssConstants.Auto) MarginLeft = "0"; @@ -864,11 +864,11 @@ public float ActualMarginLeft /// /// Gets the actual Margin of the bottom /// - public float ActualMarginBottom + public double ActualMarginBottom { get { - if (float.IsNaN(_actualMarginBottom)) + if (double.IsNaN(_actualMarginBottom)) { if (MarginBottom == CssConstants.Auto) MarginBottom = "0"; @@ -884,11 +884,11 @@ public float ActualMarginBottom /// /// Gets the actual Margin on the right /// - public float ActualMarginRight + public double ActualMarginRight { get { - if (float.IsNaN(_actualMarginRight)) + if (double.IsNaN(_actualMarginRight)) { if (MarginRight == CssConstants.Auto) MarginRight = "0"; @@ -904,11 +904,11 @@ public float ActualMarginRight /// /// Gets the actual top border width /// - public float ActualBorderTopWidth + public double ActualBorderTopWidth { get { - if (float.IsNaN(_actualBorderTopWidth)) + if (double.IsNaN(_actualBorderTopWidth)) { _actualBorderTopWidth = CssValueParser.GetActualBorderWidth(BorderTopWidth, this); if (string.IsNullOrEmpty(BorderTopStyle) || BorderTopStyle == CssConstants.None) @@ -923,11 +923,11 @@ public float ActualBorderTopWidth /// /// Gets the actual Left border width /// - public float ActualBorderLeftWidth + public double ActualBorderLeftWidth { get { - if (float.IsNaN(_actualBorderLeftWidth)) + if (double.IsNaN(_actualBorderLeftWidth)) { _actualBorderLeftWidth = CssValueParser.GetActualBorderWidth(BorderLeftWidth, this); if (string.IsNullOrEmpty(BorderLeftStyle) || BorderLeftStyle == CssConstants.None) @@ -942,11 +942,11 @@ public float ActualBorderLeftWidth /// /// Gets the actual Bottom border width /// - public float ActualBorderBottomWidth + public double ActualBorderBottomWidth { get { - if (float.IsNaN(_actualBorderBottomWidth)) + if (double.IsNaN(_actualBorderBottomWidth)) { _actualBorderBottomWidth = CssValueParser.GetActualBorderWidth(BorderBottomWidth, this); if (string.IsNullOrEmpty(BorderBottomStyle) || BorderBottomStyle == CssConstants.None) @@ -961,11 +961,11 @@ public float ActualBorderBottomWidth /// /// Gets the actual Right border width /// - public float ActualBorderRightWidth + public double ActualBorderRightWidth { get { - if (float.IsNaN(_actualBorderRightWidth)) + if (double.IsNaN(_actualBorderRightWidth)) { _actualBorderRightWidth = CssValueParser.GetActualBorderWidth(BorderRightWidth, this); if (string.IsNullOrEmpty(BorderRightStyle) || BorderRightStyle == CssConstants.None) @@ -1042,11 +1042,11 @@ public RColor ActualBorderRightColor /// /// Gets the actual length of the north west corner /// - public float ActualCornerNw + public double ActualCornerNw { get { - if (float.IsNaN(_actualCornerNw)) + if (double.IsNaN(_actualCornerNw)) { _actualCornerNw = CssValueParser.ParseLength(CornerNwRadius, 0, this); } @@ -1057,11 +1057,11 @@ public float ActualCornerNw /// /// Gets the actual length of the north east corner /// - public float ActualCornerNe + public double ActualCornerNe { get { - if (float.IsNaN(_actualCornerNe)) + if (double.IsNaN(_actualCornerNe)) { _actualCornerNe = CssValueParser.ParseLength(CornerNeRadius, 0, this); } @@ -1072,11 +1072,11 @@ public float ActualCornerNe /// /// Gets the actual length of the south east corner /// - public float ActualCornerSe + public double ActualCornerSe { get { - if (float.IsNaN(_actualCornerSe)) + if (double.IsNaN(_actualCornerSe)) { _actualCornerSe = CssValueParser.ParseLength(CornerSeRadius, 0, this); } @@ -1087,11 +1087,11 @@ public float ActualCornerSe /// /// Gets the actual length of the south west corner /// - public float ActualCornerSw + public double ActualCornerSw { get { - if (float.IsNaN(_actualCornerSw)) + if (double.IsNaN(_actualCornerSw)) { _actualCornerSw = CssValueParser.ParseLength(CornerSwRadius, 0, this); } @@ -1110,7 +1110,7 @@ public bool IsRounded /// /// Gets the actual width of whitespace between words. /// - public float ActualWordSpacing + public double ActualWordSpacing { get { return _actualWordSpacing; } } @@ -1168,11 +1168,11 @@ public RColor ActualBackgroundGradient /// /// Gets the actual angle specified for the background gradient /// - public float ActualBackgroundGradientAngle + public double ActualBackgroundGradientAngle { get { - if (float.IsNaN(_actualBackgroundGradientAngle)) + if (double.IsNaN(_actualBackgroundGradientAngle)) { _actualBackgroundGradientAngle = CssValueParser.ParseNumber(BackgroundGradientAngle, 360f); } @@ -1213,8 +1213,8 @@ public IFont ActualFont st |= RFontStyle.Bold; } - float fsize; - float parentSize = CssConstants.FontSize; + double fsize; + double parentSize = CssConstants.FontSize; if (GetParent() != null) parentSize = GetParent().ActualFont.Size; @@ -1255,16 +1255,16 @@ public IFont ActualFont } } - protected abstract IFont GetCachedFont(string fontFamily, float fsize, RFontStyle st); + protected abstract IFont GetCachedFont(string fontFamily, double fsize, RFontStyle st); /// /// Gets the line height /// - public float ActualLineHeight + public double ActualLineHeight { get { - if (float.IsNaN(_actualLineHeight)) + if (double.IsNaN(_actualLineHeight)) { _actualLineHeight = .9f*CssValueParser.ParseLength(LineHeight, Size.Height, this); } @@ -1275,11 +1275,11 @@ public float ActualLineHeight /// /// Gets the text indentation (on first line only) /// - public float ActualTextIndent + public double ActualTextIndent { get { - if (float.IsNaN(_actualTextIndent)) + if (double.IsNaN(_actualTextIndent)) { _actualTextIndent = CssValueParser.ParseLength(TextIndent, Size.Width, this); } @@ -1291,11 +1291,11 @@ public float ActualTextIndent /// /// Gets the actual horizontal border spacing for tables /// - public float ActualBorderSpacingHorizontal + public double ActualBorderSpacingHorizontal { get { - if (float.IsNaN(_actualBorderSpacingHorizontal)) + if (double.IsNaN(_actualBorderSpacingHorizontal)) { MatchCollection matches = RegexParserUtils.Match(RegexParserUtils.CssLength, BorderSpacing); @@ -1317,11 +1317,11 @@ public float ActualBorderSpacingHorizontal /// /// Gets the actual vertical border spacing for tables /// - public float ActualBorderSpacingVertical + public double ActualBorderSpacingVertical { get { - if (float.IsNaN(_actualBorderSpacingVertical)) + if (double.IsNaN(_actualBorderSpacingVertical)) { MatchCollection matches = RegexParserUtils.Match(RegexParserUtils.CssLength, BorderSpacing); @@ -1352,7 +1352,7 @@ public float ActualBorderSpacingVertical /// Gets the height of the font in the specified units ///
/// - public float GetEmHeight() + public double GetEmHeight() { return ActualFont.Height; } @@ -1393,7 +1393,7 @@ protected void SetAllBorders(string style = null, string width = null, string co ///
protected void MeasureWordSpacing(IGraphics g) { - if (float.IsNaN(ActualWordSpacing)) + if (double.IsNaN(ActualWordSpacing)) { _actualWordSpacing = CssUtils.WhiteSpace(g, this); if (WordSpacing != CssConstants.Normal) diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs index e10cdf91b..e34e51bbf 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs @@ -62,7 +62,7 @@ public static void MeasureImageSize(CssRectImage imageWord) var maxWidth = new CssLength(imageWord.OwnerBox.MaxWidth); if (maxWidth.Number > 0) { - float maxWidthVal = -1; + double maxWidthVal = -1; if (maxWidth.Unit == CssUnit.Pixels) { maxWidthVal = maxWidth.Number; @@ -98,14 +98,14 @@ public static void MeasureImageSize(CssRectImage imageWord) if ((hasImageTagWidth && !hasImageTagHeight) || scaleImageHeight) { // Divide the given tag width with the actual image width, to get the ratio. - float ratio = imageWord.Width / imageWord.Image.Width; + double ratio = imageWord.Width / imageWord.Image.Width; imageWord.Height = imageWord.Image.Height * ratio; } // If only the height was set in the html tag, ratio the width. else if (hasImageTagHeight && !hasImageTagWidth) { // Divide the given tag height with the actual image height, to get the ratio. - float ratio = imageWord.Height / imageWord.Image.Height; + double ratio = imageWord.Height / imageWord.Image.Height; imageWord.Width = imageWord.Image.Width * ratio; } } @@ -125,17 +125,17 @@ public static void CreateLineBoxes(IGraphics g, CssBox blockBox) blockBox.LineBoxes.Clear(); - float limitRight = blockBox.ActualRight - blockBox.ActualPaddingRight - blockBox.ActualBorderRightWidth; + double limitRight = blockBox.ActualRight - blockBox.ActualPaddingRight - blockBox.ActualBorderRightWidth; //Get the start x and y of the blockBox - float startx = blockBox.Location.X + blockBox.ActualPaddingLeft - 0 + blockBox.ActualBorderLeftWidth; - float starty = blockBox.Location.Y + blockBox.ActualPaddingTop - 0 + blockBox.ActualBorderTopWidth; - float curx = startx + blockBox.ActualTextIndent; - float cury = starty; + double startx = blockBox.Location.X + blockBox.ActualPaddingLeft - 0 + blockBox.ActualBorderLeftWidth; + double starty = blockBox.Location.Y + blockBox.ActualPaddingTop - 0 + blockBox.ActualBorderTopWidth; + double curx = startx + blockBox.ActualTextIndent; + double cury = starty; //Reminds the maximum bottom reached - float maxRight = startx; - float maxBottom = starty; + double maxRight = startx; + double maxBottom = starty; //First line box CssLineBox line = new CssLineBox(blockBox); @@ -179,9 +179,9 @@ public static void ApplyCellVerticalAlignment(IGraphics g, CssBox cell) if (cell.VerticalAlign == CssConstants.Top || cell.VerticalAlign == CssConstants.Baseline) return; - float cellbot = cell.ClientBottom; - float bottom = cell.GetMaximumBottom(cell, 0f); - float dist = 0f; + double cellbot = cell.ClientBottom; + double bottom = cell.GetMaximumBottom(cell, 0f); + double dist = 0f; if (cell.VerticalAlign == CssConstants.Bottom) { @@ -206,7 +206,7 @@ public static void ApplyCellVerticalAlignment(IGraphics g, CssBox cell) // for (int i = 0; i < line.RelatedBoxes.Count; i++) // { - // float diff = bottom - line.RelatedBoxes[i].Rectangles[line].Bottom; + // double diff = bottom - line.RelatedBoxes[i].Rectangles[line].Bottom; // if (middle) diff /= 2f; // RectangleF r = line.RelatedBoxes[i].Rectangles[line]; // line.RelatedBoxes[i].Rectangles[line] = new RectangleF(r.X, r.Y + diff, r.Width, r.Height); @@ -215,7 +215,7 @@ public static void ApplyCellVerticalAlignment(IGraphics g, CssBox cell) // foreach (BoxWord word in line.Words) // { - // float gap = word.Top - top; + // double gap = word.Top - top; // word.Top = bottom - gap - word.Height; // } //} @@ -238,7 +238,7 @@ public static void ApplyCellVerticalAlignment(IGraphics g, CssBox cell) /// Current y coordinate that will be the top of the next word /// Maximum right reached so far /// Maximum bottom reached so far - private static void FlowBox(IGraphics g, CssBox blockbox, CssBox box, float limitRight, float linespacing, float startx, ref CssLineBox line, ref float curx, ref float cury, ref float maxRight, ref float maxbottom) + private static void FlowBox(IGraphics g, CssBox blockbox, CssBox box, double limitRight, double linespacing, double startx, ref CssLineBox line, ref double curx, ref double cury, ref double maxRight, ref double maxbottom) { var startX = curx; var startY = cury; @@ -249,8 +249,8 @@ private static void FlowBox(IGraphics g, CssBox blockbox, CssBox box, float limi foreach (CssBox b in box.Boxes) { - float leftspacing = b.Position != CssConstants.Absolute ? b.ActualMarginLeft + b.ActualBorderLeftWidth + b.ActualPaddingLeft : 0; - float rightspacing = b.Position != CssConstants.Absolute ? b.ActualMarginRight + b.ActualBorderRightWidth + b.ActualPaddingRight : 0; + double leftspacing = b.Position != CssConstants.Absolute ? b.ActualMarginLeft + b.ActualBorderLeftWidth + b.ActualPaddingLeft : 0; + double rightspacing = b.Position != CssConstants.Absolute ? b.ActualMarginRight + b.ActualBorderRightWidth + b.ActualPaddingRight : 0; b.RectanglesReset(); b.MeasureWordsSize(g); @@ -356,7 +356,7 @@ private static void FlowBox(IGraphics g, CssBox blockbox, CssBox box, float limi /// /// Adjust the position of absolute elements by letf and top margins. /// - private static void AdjustAbsolutePosition(CssBox box, float left, float top) + private static void AdjustAbsolutePosition(CssBox box, double left, double top) { left += box.ActualMarginLeft; top += box.ActualMarginTop; @@ -383,7 +383,7 @@ private static void BubbleRectangles(CssBox box, CssLineBox line) { if (box.Words.Count > 0) { - float x = Single.MaxValue, y = Single.MaxValue, r = Single.MinValue, b = Single.MinValue; + double x = Single.MaxValue, y = Single.MaxValue, r = Single.MinValue, b = Single.MinValue; List words = line.WordsOf(box); if (words.Count > 0) @@ -474,13 +474,13 @@ private static void ApplyRightToLeftOnLine(CssLineBox line) { if (line.Words.Count > 0) { - float left = line.Words[0].Left; - float right = line.Words[line.Words.Count - 1].Right; + double left = line.Words[0].Left; + double right = line.Words[line.Words.Count - 1].Right; foreach (CssRect word in line.Words) { - float diff = word.Left - left; - float wright = right - diff; + double diff = word.Left - left; + double wright = right - diff; word.Left = wright - word.Width; } } @@ -507,13 +507,13 @@ private static void ApplyRightToLeftOnSingleBox(CssLineBox lineBox, CssBox box) if (leftWordIdx > -1 && rightWordIdx > leftWordIdx) { - float left = lineBox.Words[leftWordIdx].Left; - float right = lineBox.Words[rightWordIdx].Right; + double left = lineBox.Words[leftWordIdx].Left; + double right = lineBox.Words[rightWordIdx].Right; for (int i = leftWordIdx; i <= rightWordIdx; i++) { - float diff = lineBox.Words[i].Left - left; - float wright = right - diff; + double diff = lineBox.Words[i].Left - left; + double wright = right - diff; lineBox.Words[i].Left = wright - lineBox.Words[i].Width; } } @@ -526,7 +526,7 @@ private static void ApplyRightToLeftOnSingleBox(CssLineBox lineBox, CssBox box) /// private static void ApplyVerticalAlignment(IGraphics g, CssLineBox lineBox) { - float baseline = Single.MinValue; + double baseline = Single.MinValue; foreach (var box in lineBox.Rectangles.Keys) { baseline = Math.Max(baseline, lineBox.Rectangles[box].Top); @@ -576,10 +576,10 @@ private static void ApplyJustifyAlignment(IGraphics g, CssLineBox lineBox) { if (lineBox.Equals(lineBox.OwnerBox.LineBoxes[lineBox.OwnerBox.LineBoxes.Count - 1])) return; - float indent = lineBox.Equals(lineBox.OwnerBox.LineBoxes[0]) ? lineBox.OwnerBox.ActualTextIndent : 0f; - float textSum = 0f; - float words = 0f; - float availWidth = lineBox.OwnerBox.ClientRectangle.Width - indent; + double indent = lineBox.Equals(lineBox.OwnerBox.LineBoxes[0]) ? lineBox.OwnerBox.ActualTextIndent : 0f; + double textSum = 0f; + double words = 0f; + double availWidth = lineBox.OwnerBox.ClientRectangle.Width - indent; // Gather text sum foreach (CssRect w in lineBox.Words) @@ -589,8 +589,8 @@ private static void ApplyJustifyAlignment(IGraphics g, CssLineBox lineBox) } if (words <= 0f) return; //Avoid Zero division - float spacing = (availWidth - textSum)/words; //Spacing that will be used - float curx = lineBox.OwnerBox.ClientLeft + indent; + double spacing = (availWidth - textSum)/words; //Spacing that will be used + double curx = lineBox.OwnerBox.ClientLeft + indent; foreach (CssRect word in lineBox.Words) { @@ -614,8 +614,8 @@ private static void ApplyCenterAlignment(IGraphics g, CssLineBox line) if (line.Words.Count == 0) return; CssRect lastWord = line.Words[line.Words.Count - 1]; - float right = line.OwnerBox.ActualRight - line.OwnerBox.ActualPaddingRight - line.OwnerBox.ActualBorderRightWidth; - float diff = right - lastWord.Right - lastWord.OwnerBox.ActualBorderRightWidth - lastWord.OwnerBox.ActualPaddingRight; + double right = line.OwnerBox.ActualRight - line.OwnerBox.ActualPaddingRight - line.OwnerBox.ActualBorderRightWidth; + double diff = right - lastWord.Right - lastWord.OwnerBox.ActualBorderRightWidth - lastWord.OwnerBox.ActualPaddingRight; diff /= 2; if (diff > 0) @@ -644,8 +644,8 @@ private static void ApplyRightAlignment(IGraphics g, CssLineBox line) CssRect lastWord = line.Words[line.Words.Count - 1]; - float right = line.OwnerBox.ActualRight - line.OwnerBox.ActualPaddingRight - line.OwnerBox.ActualBorderRightWidth; - float diff = right - lastWord.Right - lastWord.OwnerBox.ActualBorderRightWidth - lastWord.OwnerBox.ActualPaddingRight; + double right = line.OwnerBox.ActualRight - line.OwnerBox.ActualPaddingRight - line.OwnerBox.ActualBorderRightWidth; + double diff = right - lastWord.Right - lastWord.OwnerBox.ActualBorderRightWidth - lastWord.OwnerBox.ActualPaddingRight; if (diff > 0) { @@ -673,7 +673,7 @@ private static void ApplyLeftAlignment(IGraphics g, CssLineBox line) //foreach (LineBoxRectangle r in line.Rectangles) //{ - // float curx = r.Left + (r.Index == 0 ? r.OwnerBox.ActualPaddingLeft + r.OwnerBox.ActualBorderLeftWidth / 2 : 0); + // double curx = r.Left + (r.Index == 0 ? r.OwnerBox.ActualPaddingLeft + r.OwnerBox.ActualBorderLeftWidth / 2 : 0); // if (r.SpaceBefore) curx += r.OwnerBox.ActualWordSpacing; diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs index 3b7c5dcb4..4caee19c4 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs @@ -60,9 +60,9 @@ internal sealed class CssLayoutEngineTable private bool _widthSpecified; - private float[] _columnWidths; + private double[] _columnWidths; - private float[] _columnMinWidths; + private double[] _columnMinWidths; #endregion @@ -82,7 +82,7 @@ private CssLayoutEngineTable(CssBox tableBox) ///
/// the table box to calculate the spacing for /// the calculated spacing - public static float GetTableSpacing(CssBox tableBox) + public static double GetTableSpacing(CssBox tableBox) { int count = 0; int columns = 0; @@ -288,7 +288,7 @@ private void InsertEmptyBoxes() /// Determine Row and Column Count, and ColumnWidths /// /// - private float CalculateCountAndWidth() + private double CalculateCountAndWidth() { //Columns if (_columns.Count > 0) @@ -302,11 +302,11 @@ private float CalculateCountAndWidth() } //Initialize column widths array with NaNs - _columnWidths = new float[_columnCount]; + _columnWidths = new double[_columnCount]; for (int i = 0; i < _columnWidths.Length; i++) - _columnWidths[i] = float.NaN; + _columnWidths[i] = double.NaN; - float availCellSpace = GetAvailableCellWidth(); + double availCellSpace = GetAvailableCellWidth(); if (_columns.Count > 0) { @@ -336,18 +336,18 @@ private float CalculateCountAndWidth() //Check for column width in table-cell definitions for (int i = 0; i < _columnCount; i++) { - if (i < 20 || float.IsNaN(_columnWidths[i])) // limit column width check + if (i < 20 || double.IsNaN(_columnWidths[i])) // limit column width check { if (i < row.Boxes.Count && row.Boxes[i].Display == CssConstants.TableCell) { - float len = CssValueParser.ParseLength(row.Boxes[i].Width, availCellSpace, row.Boxes[i]); + double len = CssValueParser.ParseLength(row.Boxes[i].Width, availCellSpace, row.Boxes[i]); if (len > 0) //If some width specified { int colspan = GetColSpan(row.Boxes[i]); len /= Convert.ToSingle(colspan); for (int j = i; j < i + colspan; j++) { - _columnWidths[j] = float.IsNaN(_columnWidths[j]) ? len : Math.Max(_columnWidths[j], len); + _columnWidths[j] = double.IsNaN(_columnWidths[j]) ? len : Math.Max(_columnWidths[j], len); } } } @@ -362,28 +362,28 @@ private float CalculateCountAndWidth() /// /// /// - private void DetermineMissingColumnWidths(float availCellSpace) + private void DetermineMissingColumnWidths(double availCellSpace) { - float occupedSpace = 0f; + double occupedSpace = 0f; if (_widthSpecified) //If a width was specified, { //Assign NaNs equally with space left after gathering not-NaNs int numOfNans = 0; //Calculate number of NaNs and occupied space - foreach (float colWidth in _columnWidths) + foreach (double colWidth in _columnWidths) { - if (float.IsNaN(colWidth)) + if (double.IsNaN(colWidth)) numOfNans++; else occupedSpace += colWidth; } var orgNumOfNans = numOfNans; - float[] orgColWidths = null; + double[] orgColWidths = null; if (numOfNans < _columnWidths.Length) { - orgColWidths = new float[_columnWidths.Length]; + orgColWidths = new double[_columnWidths.Length]; for (int i = 0; i < _columnWidths.Length; i++) orgColWidths[i] = _columnWidths[i]; } @@ -391,7 +391,7 @@ private void DetermineMissingColumnWidths(float availCellSpace) if (numOfNans > 0) { // Determine the max width for each column - float[] minFullWidths, maxFullWidths; + double[] minFullWidths, maxFullWidths; GetColumnsMinMaxWidthByContent(true, out minFullWidths, out maxFullWidths); // set the columns that can fulfill by the max width in a loop because it changes the nanWidth @@ -403,7 +403,7 @@ private void DetermineMissingColumnWidths(float availCellSpace) for (int i = 0; i < _columnWidths.Length; i++) { var nanWidth = (availCellSpace - occupedSpace) / numOfNans; - if (float.IsNaN(_columnWidths[i]) && nanWidth > maxFullWidths[i]) + if (double.IsNaN(_columnWidths[i]) && nanWidth > maxFullWidths[i]) { _columnWidths[i] = maxFullWidths[i]; numOfNans--; @@ -416,11 +416,11 @@ private void DetermineMissingColumnWidths(float availCellSpace) if (numOfNans > 0) { // Determine width that will be assigned to un assigned widths - float nanWidth = (availCellSpace - occupedSpace) / numOfNans; + double nanWidth = (availCellSpace - occupedSpace) / numOfNans; for (int i = 0; i < _columnWidths.Length; i++) { - if (float.IsNaN(_columnWidths[i])) + if (double.IsNaN(_columnWidths[i])) _columnWidths[i] = nanWidth; } } @@ -431,9 +431,9 @@ private void DetermineMissingColumnWidths(float availCellSpace) if (orgNumOfNans > 0) { // spread extra width between all non width specified columns - float extWidth = (availCellSpace - occupedSpace) / orgNumOfNans; + double extWidth = (availCellSpace - occupedSpace) / orgNumOfNans; for (int i = 0; i < _columnWidths.Length; i++) - if (orgColWidths == null || float.IsNaN(orgColWidths[i])) + if (orgColWidths == null || double.IsNaN(orgColWidths[i])) _columnWidths[i] += extWidth; } else @@ -447,12 +447,12 @@ private void DetermineMissingColumnWidths(float availCellSpace) else { //Get the minimum and maximum full length of NaN boxes - float[] minFullWidths, maxFullWidths; + double[] minFullWidths, maxFullWidths; GetColumnsMinMaxWidthByContent(true, out minFullWidths, out maxFullWidths); for (int i = 0; i < _columnWidths.Length; i++) { - if (float.IsNaN(_columnWidths[i])) + if (double.IsNaN(_columnWidths[i])) _columnWidths[i] = minFullWidths[i]; occupedSpace += _columnWidths[i]; } @@ -500,7 +500,7 @@ private void EnforceMaximumSize() if (maxWidth < widthSum) { //Get the minimum and maximum full length of NaN boxes - float[] minFullWidths, maxFullWidths; + double[] minFullWidths, maxFullWidths; GetColumnsMinMaxWidthByContent(false, out minFullWidths, out maxFullWidths); // lower all the columns to the minimum @@ -516,7 +516,7 @@ private void EnforceMaximumSize() for (int a = 0; a < 15 && maxWidth < widthSum - 0.1; a++) // limit iteration so bug won't create infinite loop { int nonMaxedColumns = 0; - float largeWidth = 0f, secLargeWidth = 0f; + double largeWidth = 0f, secLargeWidth = 0f; for (int i = 0; i < _columnWidths.Length; i++) { if (_columnWidths[i] > largeWidth + 0.1) @@ -531,7 +531,7 @@ private void EnforceMaximumSize() } } - float decrease = secLargeWidth > 0 ? largeWidth - secLargeWidth : (widthSum - maxWidth) / _columnWidths.Length; + double decrease = secLargeWidth > 0 ? largeWidth - secLargeWidth : (widthSum - maxWidth) / _columnWidths.Length; if (decrease * nonMaxedColumns > widthSum - maxWidth) decrease = (widthSum - maxWidth) / nonMaxedColumns; for (int i = 0; i < _columnWidths.Length; i++) @@ -554,7 +554,7 @@ private void EnforceMaximumSize() nonMaxedColumns = _columnWidths.Length; bool hit = false; - float minIncrement = (maxWidth - widthSum) / nonMaxedColumns; + double minIncrement = (maxWidth - widthSum) / nonMaxedColumns; for (int i = 0; i < _columnWidths.Length; i++) { if (_columnWidths[i] + 0.1 < maxFullWidths[i]) @@ -590,7 +590,7 @@ private void EnforceMinimumSize() if (_columnWidths.Length > col && _columnWidths[col] < GetColumnMinWidths()[col]) { - float diff = GetColumnMinWidths()[col] - _columnWidths[col]; + double diff = GetColumnMinWidths()[col] - _columnWidths[col]; _columnWidths[affectcol] = GetColumnMinWidths()[affectcol]; if (col < _columnWidths.Length - 1) @@ -608,17 +608,17 @@ private void EnforceMinimumSize() /// private void LayoutCells(IGraphics g) { - float startx = Math.Max(_tableBox.ClientLeft + GetHorizontalSpacing(), 0); - float starty = Math.Max(_tableBox.ClientTop + GetVerticalSpacing(), 0); - float cury = starty; - float maxRight = startx; - float maxBottom = 0f; + double startx = Math.Max(_tableBox.ClientLeft + GetHorizontalSpacing(), 0); + double starty = Math.Max(_tableBox.ClientTop + GetVerticalSpacing(), 0); + double cury = starty; + double maxRight = startx; + double maxBottom = 0f; int currentrow = 0; for (int i = 0; i < _allRows.Count; i++) { var row = _allRows[i]; - float curx = startx; + double curx = startx; int curCol = 0; for (int j = 0; j < row.Boxes.Count; j++) @@ -628,7 +628,7 @@ private void LayoutCells(IGraphics g) int rowspan = GetRowSpan(cell); var columnIndex = GetCellRealColumnIndex(row, cell); - float width = GetCellWidth(columnIndex, cell); + double width = GetCellWidth(columnIndex, cell); cell.Location = new RPoint(curx, cury); cell.Size = new RSize(width, 0f); cell.PerformLayout(g); //That will automatically set the bottom of the cell @@ -679,9 +679,9 @@ private void LayoutCells(IGraphics g) /// /// Gets the spanned width of a cell (With of all columns it spans minus one). /// - private float GetSpannedMinWidth(CssBox row, CssBox cell, int realcolindex, int colspan) + private double GetSpannedMinWidth(CssBox row, CssBox cell, int realcolindex, int colspan) { - float w = 0f; + double w = 0f; for (int i = realcolindex; i < row.Boxes.Count || i < realcolindex + colspan - 1; i++) { if (i < GetColumnMinWidths().Length) @@ -715,10 +715,10 @@ private static int GetCellRealColumnIndex(CssBox row, CssBox cell) /// /// /// - private float GetCellWidth(int column, CssBox b) + private double GetCellWidth(int column, CssBox b) { - float colspan = Convert.ToSingle(GetColSpan(b)); - float sum = 0f; + double colspan = Convert.ToSingle(GetColSpan(b)); + double sum = 0f; for (int i = column; i < column + colspan; i++) { @@ -822,7 +822,7 @@ private bool CanReduceWidth(int columnIndex) /// The table's width can be larger than the result of this method, because of the minimum /// size that individual boxes. /// - private float GetAvailableTableWidth() + private double GetAvailableTableWidth() { CssLength tblen = new CssLength(_tableBox.Width); @@ -846,7 +846,7 @@ private float GetAvailableTableWidth() /// The table's width can be larger than the result of this method, because of the minimum /// size that individual boxes. /// - private float GetMaxTableWidth() + private double GetMaxTableWidth() { var tblen = new CssLength(_tableBox.MaxWidth); if (tblen.Number > 0) @@ -868,10 +868,10 @@ private float GetMaxTableWidth() /// if to measure only columns that have no calculated width /// return the min width for each column - the min width possible without clipping content /// return the max width for each column - the max width the cell content can take without wrapping - private void GetColumnsMinMaxWidthByContent(bool onlyNans, out float[] minFullWidths, out float[] maxFullWidths) + private void GetColumnsMinMaxWidthByContent(bool onlyNans, out double[] minFullWidths, out double[] maxFullWidths) { - maxFullWidths = new float[_columnWidths.Length]; - minFullWidths = new float[_columnWidths.Length]; + maxFullWidths = new double[_columnWidths.Length]; + minFullWidths = new double[_columnWidths.Length]; foreach (CssBox row in _allRows) { @@ -880,9 +880,9 @@ private void GetColumnsMinMaxWidthByContent(bool onlyNans, out float[] minFullWi int col = GetCellRealColumnIndex(row, row.Boxes[i]); col = _columnWidths.Length > col ? col : _columnWidths.Length - 1; - if ((!onlyNans || float.IsNaN(_columnWidths[col])) && i < row.Boxes.Count) + if ((!onlyNans || double.IsNaN(_columnWidths[col])) && i < row.Boxes.Count) { - float minWidth, maxWidth; + double minWidth, maxWidth; row.Boxes[i].GetMinMaxWidth(out minWidth, out maxWidth); var colSpan = GetColSpan(row.Boxes[i]); @@ -905,7 +905,7 @@ private void GetColumnsMinMaxWidthByContent(bool onlyNans, out float[] minFullWi /// /// It takes away the cell-spacing from /// - private float GetAvailableCellWidth() + private double GetAvailableCellWidth() { return GetAvailableTableWidth() - GetHorizontalSpacing() * (_columnCount + 1) - _tableBox.ActualBorderLeftWidth - _tableBox.ActualBorderRightWidth; } @@ -914,13 +914,13 @@ private float GetAvailableCellWidth() /// Gets the current sum of column widths /// /// - private float GetWidthSum() + private double GetWidthSum() { - float f = 0f; + double f = 0f; - foreach (float t in _columnWidths) + foreach (double t in _columnWidths) { - if (float.IsNaN(t)) + if (double.IsNaN(t)) throw new Exception("CssTable Algorithm error: There's a NaN in column widths"); else f += t; @@ -941,7 +941,7 @@ private float GetWidthSum() /// private static int GetSpan(CssBox b) { - float f = CssValueParser.ParseNumber(b.GetAttribute("span"), 1); + double f = CssValueParser.ParseNumber(b.GetAttribute("span"), 1); return Math.Max(1, Convert.ToInt32(f)); } @@ -949,11 +949,11 @@ private static int GetSpan(CssBox b) /// /// Gets the minimum width of each column /// - private float[] GetColumnMinWidths() + private double[] GetColumnMinWidths() { if (_columnMinWidths == null) { - _columnMinWidths = new float[_columnWidths.Length]; + _columnMinWidths = new double[_columnWidths.Length]; foreach (CssBox row in _allRows) { @@ -962,7 +962,7 @@ private float[] GetColumnMinWidths() int colspan = GetColSpan(cell); int col = GetCellRealColumnIndex(row, cell); int affectcol = Math.Min(col + colspan, _columnMinWidths.Length) - 1; - float spannedwidth = GetSpannedMinWidth(row, cell, col, colspan) + (colspan - 1) * GetHorizontalSpacing(); + double spannedwidth = GetSpannedMinWidth(row, cell, col, colspan) + (colspan - 1) * GetHorizontalSpacing(); _columnMinWidths[affectcol] = Math.Max(_columnMinWidths[affectcol], cell.GetMinimumWidth() - spannedwidth); } @@ -975,7 +975,7 @@ private float[] GetColumnMinWidths() /// /// Gets the actual horizontal spacing of the table /// - private float GetHorizontalSpacing() + private double GetHorizontalSpacing() { return _tableBox.BorderCollapse == CssConstants.Collapse ? -1f : _tableBox.ActualBorderSpacingHorizontal; } @@ -983,7 +983,7 @@ private float GetHorizontalSpacing() /// /// Gets the actual horizontal spacing of the table /// - private static float GetHorizontalSpacing(CssBox box) + private static double GetHorizontalSpacing(CssBox box) { return box.BorderCollapse == CssConstants.Collapse ? -1f : box.ActualBorderSpacingHorizontal; } @@ -991,7 +991,7 @@ private static float GetHorizontalSpacing(CssBox box) /// /// Gets the actual vertical spacing of the table /// - private float GetVerticalSpacing() + private double GetVerticalSpacing() { return _tableBox.BorderCollapse == CssConstants.Collapse ? -1f : _tableBox.ActualBorderSpacingVertical; } diff --git a/Source/HtmlRenderer/Core/Dom/CssLength.cs b/Source/HtmlRenderer/Core/Dom/CssLength.cs index 0ce4242b7..716f41269 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLength.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLength.cs @@ -14,7 +14,7 @@ namespace HtmlRenderer.Core.Dom internal sealed class CssLength { #region Fields - private readonly float _number; + private readonly double _number; private readonly bool _isRelative; private readonly CssUnit _unit; private readonly string _length; @@ -50,7 +50,7 @@ public CssLength(string length) //If no units, has error if (length.Length < 3) { - float.TryParse(length, out _number); + double.TryParse(length, out _number); _hasError = true; return; } @@ -96,7 +96,7 @@ public CssLength(string length) return; } - if (!float.TryParse(number, System.Globalization.NumberStyles.Number, NumberFormatInfo.InvariantInfo, out _number)) + if (!double.TryParse(number, System.Globalization.NumberStyles.Number, NumberFormatInfo.InvariantInfo, out _number)) { _hasError = true; } @@ -110,7 +110,7 @@ public CssLength(string length) /// /// Gets the number in the length /// - public float Number + public double Number { get { return _number; } } @@ -168,7 +168,7 @@ public string Length /// Em size factor to multiply /// Points size of this em /// If length has an error or isn't in ems - public CssLength ConvertEmToPoints(float emSize) + public CssLength ConvertEmToPoints(double emSize) { if (HasError) throw new InvalidOperationException("Invalid length"); if (Unit != CssUnit.Ems) throw new InvalidOperationException("Length is not in ems"); @@ -182,7 +182,7 @@ public CssLength ConvertEmToPoints(float emSize) /// Pixel size factor to multiply /// Pixels size of this em /// If length has an error or isn't in ems - public CssLength ConvertEmToPixels(float pixelFactor) + public CssLength ConvertEmToPixels(double pixelFactor) { if (HasError) throw new InvalidOperationException("Invalid length"); if (Unit != CssUnit.Ems) throw new InvalidOperationException("Length is not in ems"); diff --git a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs index 394c2f78b..f186f92be 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs @@ -84,11 +84,11 @@ public Dictionary Rectangles /// /// Get the height of this box line (the max height of all the words) /// - public float LineHeight + public double LineHeight { get { - float height = 0; + double height = 0; foreach (var rect in _rects) { height = Math.Max(height, rect.Value.Height); @@ -100,11 +100,11 @@ public float LineHeight /// /// Get the bottom of this box line (the max bottom of all the words) /// - public float LineBottom + public double LineBottom { get { - float bottom = 0; + double bottom = 0; foreach (var rect in _rects) { bottom = Math.Max(bottom, rect.Value.Bottom); @@ -153,12 +153,12 @@ internal List WordsOf(CssBox box) /// /// /// - internal void UpdateRectangle(CssBox box, float x, float y, float r, float b) + internal void UpdateRectangle(CssBox box, double x, double y, double r, double b) { - float leftspacing = box.ActualBorderLeftWidth + box.ActualPaddingLeft; - float rightspacing = box.ActualBorderRightWidth + box.ActualPaddingRight; - float topspacing = box.ActualBorderTopWidth + box.ActualPaddingTop; - float bottomspacing = box.ActualBorderBottomWidth + box.ActualPaddingTop; + double leftspacing = box.ActualBorderLeftWidth + box.ActualPaddingLeft; + double rightspacing = box.ActualBorderRightWidth + box.ActualPaddingRight; + double topspacing = box.ActualBorderTopWidth + box.ActualPaddingTop; + double bottomspacing = box.ActualBorderBottomWidth + box.ActualPaddingTop; if ((box.FirstHostingLineBox != null && box.FirstHostingLineBox.Equals(this)) || box.IsImage) x -= leftspacing; if ((box.LastHostingLineBox != null && box.LastHostingLineBox.Equals(this)) || box.IsImage) r += rightspacing; @@ -205,7 +205,7 @@ internal void AssignRectanglesToBoxes() /// Device info /// box to check words /// baseline - internal void SetBaseLine(IGraphics g, CssBox b, float baseline) + internal void SetBaseLine(IGraphics g, CssBox b, double baseline) { //TODO: Aqui me quede, checar poniendo "by the" con un font-size de 3em List ws = WordsOf(b); @@ -215,7 +215,7 @@ internal void SetBaseLine(IGraphics g, CssBox b, float baseline) RRect r = Rectangles[b]; //Save top of words related to the top of rectangle - float gap = 0f; + double gap = 0f; if (ws.Count > 0) { @@ -233,14 +233,14 @@ internal void SetBaseLine(IGraphics g, CssBox b, float baseline) //New top that words will have //float newtop = baseline - (Height - OwnerBox.FontDescent - 3); //OLD - float newtop = baseline;// -GetBaseLineHeight(b, g); //OLD + double newtop = baseline;// -GetBaseLineHeight(b, g); //OLD if (b.ParentBox != null && b.ParentBox.Rectangles.ContainsKey(this) && r.Height < b.ParentBox.Rectangles[this].Height) { //Do this only if rectangle is shorter than parent's - float recttop = newtop - gap; + double recttop = newtop - gap; RRect newr = new RRect(r.X, recttop, r.Width, r.Height); Rectangles[b] = newr; b.OffsetRectangle(this, gap); diff --git a/Source/HtmlRenderer/Core/Dom/CssRect.cs b/Source/HtmlRenderer/Core/Dom/CssRect.cs index 0fb72bec4..2dbcee684 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRect.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRect.cs @@ -76,7 +76,7 @@ public RRect Rectangle /// /// Left of the rectangle /// - public float Left + public double Left { get { return _rect.X; } set { _rect.X = value; } @@ -85,7 +85,7 @@ public float Left /// /// Top of the rectangle /// - public float Top + public double Top { get { return _rect.Y; } set { _rect.Y = value; } @@ -94,7 +94,7 @@ public float Top /// /// Width of the rectangle /// - public float Width + public double Width { get { return _rect.Width; } set { _rect.Width = value; } @@ -103,7 +103,7 @@ public float Width /// /// Get the full width of the word including the spacing. /// - public float FullWidth + public double FullWidth { get { return _rect.Width + ActualWordSpacing; } } @@ -111,7 +111,7 @@ public float FullWidth /// /// Gets the actual width of whitespace between words. /// - public float ActualWordSpacing + public double ActualWordSpacing { get { return (OwnerBox != null ? (HasSpaceAfter ? OwnerBox.ActualWordSpacing : 0) + (IsImage ? OwnerBox.ActualWordSpacing : 0) : 0); } } @@ -119,7 +119,7 @@ public float ActualWordSpacing /// /// Height of the rectangle /// - public float Height + public double Height { get { return _rect.Height; } set { _rect.Height = value; } @@ -128,7 +128,7 @@ public float Height /// /// Gets or sets the right of the rectangle. When setting, it only affects the Width of the rectangle. /// - public float Right + public double Right { get { return Rectangle.Right; } set { Width = value - Left; } @@ -137,7 +137,7 @@ public float Right /// /// Gets or sets the bottom of the rectangle. When setting, it only affects the Height of the rectangle. /// - public float Bottom + public double Bottom { get { return Rectangle.Bottom; } set { Height = value - Top; } @@ -239,7 +239,7 @@ public int SelectedEndIndexOffset /// /// the selection start offset if the word is partially selected (-1 if not selected or fully selected) /// - public float SelectedStartOffset + public double SelectedStartOffset { get { return _selection != null ? _selection.GetSelectedStartOffset(this) : -1; } } @@ -247,7 +247,7 @@ public float SelectedStartOffset /// /// the selection end offset if the word is partially selected (-1 if not selected or fully selected) /// - public float SelectedEndOffset + public double SelectedEndOffset { get { return _selection != null ? _selection.GetSelectedEndOffset(this) : -1; } } @@ -255,7 +255,7 @@ public float SelectedEndOffset /// /// Gets or sets an offset to be considered in measurements /// - internal float LeftGlyphPadding + internal double LeftGlyphPadding { get { return OwnerBox != null ? OwnerBox.ActualFont.LeftPadding : 0; } } diff --git a/Source/HtmlRenderer/Core/Entities/CssConstants.cs b/Source/HtmlRenderer/Core/Entities/CssConstants.cs index c3350bf18..301df09d4 100644 --- a/Source/HtmlRenderer/Core/Entities/CssConstants.cs +++ b/Source/HtmlRenderer/Core/Entities/CssConstants.cs @@ -157,7 +157,7 @@ internal static class CssConstants /// /// Default font size in points. Change this value to modify the default font size. /// - public const float FontSize = 11f; + public const double FontSize = 11f; /// /// Default font used for the generic 'serif' family diff --git a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs index 8febf7485..2ac0bfb72 100644 --- a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs @@ -83,7 +83,7 @@ public static void DrawBackgroundImage(IGraphics g, CssBox box, ImageLoadHandler /// the top-left location private static RPoint GetLocation(string backgroundPosition, RRect rectangle, RSize imgSize) { - float left = rectangle.Left; + double left = rectangle.Left; if( backgroundPosition.IndexOf("left", StringComparison.OrdinalIgnoreCase) > -1 ) { left = (rectangle.Left + .5f); @@ -97,7 +97,7 @@ private static RPoint GetLocation(string backgroundPosition, RRect rectangle, RS left = (rectangle.Left + (rectangle.Width - imgSize.Width) / 2 +.5f); } - float top = rectangle.Top; + double top = rectangle.Top; if (backgroundPosition.IndexOf("top", StringComparison.OrdinalIgnoreCase) > -1) { top = rectangle.Top; diff --git a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs index 352ce2460..09b13f503 100644 --- a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs @@ -126,16 +126,16 @@ private static void DrawBorder(Border border, CssBox box, IGraphics g, RRect rec switch (border) { case Border.Top: - g.DrawLine(pen, (float)Math.Ceiling(rect.Left), rect.Top + box.ActualBorderTopWidth / 2, rect.Right - 1, rect.Top + box.ActualBorderTopWidth / 2); + g.DrawLine(pen, (double)Math.Ceiling(rect.Left), rect.Top + box.ActualBorderTopWidth / 2, rect.Right - 1, rect.Top + box.ActualBorderTopWidth / 2); break; case Border.Left: - g.DrawLine(pen, rect.Left + box.ActualBorderLeftWidth / 2, (float)Math.Ceiling(rect.Top), rect.Left + box.ActualBorderLeftWidth / 2, (float)Math.Floor(rect.Bottom)); + g.DrawLine(pen, rect.Left + box.ActualBorderLeftWidth / 2, (double)Math.Ceiling(rect.Top), rect.Left + box.ActualBorderLeftWidth / 2, (double)Math.Floor(rect.Bottom)); break; case Border.Bottom: - g.DrawLine(pen, (float)Math.Ceiling(rect.Left), rect.Bottom - box.ActualBorderBottomWidth / 2, rect.Right - 1, rect.Bottom - box.ActualBorderBottomWidth / 2); + g.DrawLine(pen, (double)Math.Ceiling(rect.Left), rect.Bottom - box.ActualBorderBottomWidth / 2, rect.Right - 1, rect.Bottom - box.ActualBorderBottomWidth / 2); break; case Border.Right: - g.DrawLine(pen, rect.Right - box.ActualBorderRightWidth / 2, (float)Math.Ceiling(rect.Top), rect.Right - box.ActualBorderRightWidth / 2, (float)Math.Floor(rect.Bottom)); + g.DrawLine(pen, rect.Right - box.ActualBorderRightWidth / 2, (double)Math.Ceiling(rect.Top), rect.Right - box.ActualBorderRightWidth / 2, (double)Math.Floor(rect.Bottom)); break; } } @@ -278,7 +278,7 @@ private static IGraphicsPath GetRoundedBorderPath(IGraphics g, Border border, Cs /// /// Get pen to be used for border draw respecting its style. /// - private static IPen GetPen(IGraphics g, string style, RColor color, float width) + private static IPen GetPen(IGraphics g, string style, RColor color, double width) { var p = g.GetPen(color); p.Width = width; @@ -294,7 +294,7 @@ private static IPen GetPen(IGraphics g, string style, RColor color, float width) case "dashed": p.DashStyle = RDashStyle.Dash; if (p.Width < 2) - p.DashPattern = new[] { 4, 4f }; // better looking + p.DashPattern = new[] { 4, 4d }; // better looking break; } return p; @@ -323,7 +323,7 @@ private static RColor GetColor(Border border, CssBoxProperties box, string style /// /// Get the border width for the given box border. /// - private static float GetWidth(Border border, CssBoxProperties box) + private static double GetWidth(Border border, CssBoxProperties box) { switch (border) { diff --git a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs index 0c1c469d1..2c6394494 100644 --- a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs @@ -43,7 +43,7 @@ internal sealed class FontHandler /// /// cache of all the font used not to create same font again and again /// - private readonly Dictionary>> _fontsCache = new Dictionary>>(StringComparer.InvariantCultureIgnoreCase); + private readonly Dictionary>> _fontsCache = new Dictionary>>(StringComparer.InvariantCultureIgnoreCase); #endregion @@ -108,7 +108,7 @@ public void AddFontFamilyMapping(string fromFamily, string toFamily) /// Improve performance not to create same font multiple times. /// /// cached font instance - public IFont GetCachedFont(string family, float size, RFontStyle style) + public IFont GetCachedFont(string family, double size, RFontStyle style) { var font = TryGetFont(family, size, style); if( font == null ) @@ -143,7 +143,7 @@ public IFont GetCachedFont(string family, float size, RFontStyle style) /// /// Get cached font if it exists in cache or null if it is not. /// - private IFont TryGetFont(string family, float size, RFontStyle style) + private IFont TryGetFont(string family, double size, RFontStyle style) { IFont font = null; if( _fontsCache.ContainsKey(family) ) @@ -164,7 +164,7 @@ private IFont TryGetFont(string family, float size, RFontStyle style) } else { - _fontsCache[family] = new Dictionary>(); + _fontsCache[family] = new Dictionary>(); _fontsCache[family][size] = new Dictionary(); } return font; @@ -173,7 +173,7 @@ private IFont TryGetFont(string family, float size, RFontStyle style) /// // create font (try using existing font family to support custom fonts) /// - private IFont CreateFont(string family, float size, RFontStyle style) + private IFont CreateFont(string family, double size, RFontStyle style) { IFontFamily fontFamily; return _existingFontFamilies.TryGetValue(family, out fontFamily) diff --git a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs index 360d922e3..8f5fac7a7 100644 --- a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs @@ -65,12 +65,12 @@ internal sealed class SelectionHandler : IDisposable /// /// the selection start offset if the first selected word is partially selected (-1 if not selected or fully selected) /// - private float _selectionStartOffset = -1; + private double _selectionStartOffset = -1; /// /// the selection end offset if the last selected word is partially selected (-1 if not selected or fully selected) /// - private float _selectionEndOffset = -1; + private double _selectionEndOffset = -1; /// /// is the selection goes backward in the html, the starting word comes after the ending word in DFS traversing.
@@ -359,7 +359,7 @@ public int GetSelectedEndIndexOffset(CssRect word) /// Handles backward selecting by returning the selection end data instead of start. /// /// the word to return the selection start offset for - public float GetSelectedStartOffset(CssRect word) + public double GetSelectedStartOffset(CssRect word) { return word == (_backwardSelection ? _selectionEnd : _selectionStart) ? (_backwardSelection ? _selectionEndOffset : _selectionStartOffset) : -1; } @@ -372,7 +372,7 @@ public float GetSelectedStartOffset(CssRect word) /// Handles backward selecting by returning the selection end data instead of start. /// /// the word to return the selection end offset for - public float GetSelectedEndOffset(CssRect word) + public double GetSelectedEndOffset(CssRect word) { return word == (_backwardSelection ? _selectionStart : _selectionEnd) ? (_backwardSelection ? _selectionStartOffset : _selectionEndOffset) : -1; } @@ -609,7 +609,7 @@ private bool SelectWordsInRange(CssBox box, CssRect selectionStart, CssRect sele private void CalculateWordCharIndexAndOffset(IControl control, CssRect word, RPoint loc, bool selectionStart) { int selectionIndex; - float selectionOffset; + double selectionOffset; CalculateWordCharIndexAndOffset(control, word, loc, selectionStart, out selectionIndex, out selectionOffset); if (selectionStart) @@ -637,7 +637,7 @@ private void CalculateWordCharIndexAndOffset(IControl control, CssRect word, RPo /// return the index of the char under the location /// return the offset of the char under the location /// is to include the first character in the calculation - private static void CalculateWordCharIndexAndOffset(IControl control, CssRect word, RPoint loc, bool inclusive, out int selectionIndex, out float selectionOffset) + private static void CalculateWordCharIndexAndOffset(IControl control, CssRect word, RPoint loc, bool inclusive, out int selectionIndex, out double selectionOffset) { selectionIndex = 0; selectionOffset = 0f; diff --git a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs index d2979d81f..375fba30e 100644 --- a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs @@ -46,10 +46,10 @@ public CssValueParser(GlobalBase global) } /// - /// Check if the given substring is a valid float number. + /// Check if the given substring is a valid double number. /// Assume given substring is not empty and all indexes are valid!
///
- /// true - valid float number, false - otherwise + /// true - valid double number, false - otherwise public static bool IsFloat(string str, int idx, int length) { if (length < 1) @@ -73,7 +73,7 @@ public static bool IsFloat(string str, int idx, int length) } /// - /// Check if the given substring is a valid float number. + /// Check if the given substring is a valid double number. /// Assume given substring is not empty and all indexes are valid!
///
/// true - valid int number, false - otherwise @@ -108,8 +108,8 @@ public static bool IsValidLength(string value) { number = value.Substring(0, value.Length - 2); } - float stub; - return float.TryParse(number, out stub); + double stub; + return double.TryParse(number, out stub); } return false; } @@ -120,7 +120,7 @@ public static bool IsValidLength(string value) /// Number to be parsed /// Number that represents the 100% if parsed number is a percentage /// Parsed number. Zero if error while parsing. - public static float ParseNumber(string number, float hundredPercent) + public static double ParseNumber(string number, double hundredPercent) { if (string.IsNullOrEmpty(number)) { @@ -129,11 +129,11 @@ public static float ParseNumber(string number, float hundredPercent) string toParse = number; bool isPercent = number.EndsWith("%"); - float result; + double result; if (isPercent) toParse = number.Substring(0, number.Length - 1); - if (!float.TryParse(toParse, NumberStyles.Number, NumberFormatInfo.InvariantInfo, out result)) + if (!double.TryParse(toParse, NumberStyles.Number, NumberFormatInfo.InvariantInfo, out result)) { return 0f; } @@ -154,7 +154,7 @@ public static float ParseNumber(string number, float hundredPercent) /// if the length is in pixels and the length is font related it needs to use 72/96 factor /// /// the parsed length value with adjustments - public static float ParseLength(string length, float hundredPercent, CssBoxProperties box, bool fontAdjust = false) + public static double ParseLength(string length, double hundredPercent, CssBoxProperties box, bool fontAdjust = false) { return ParseLength(length, hundredPercent, box.GetEmHeight(), null, fontAdjust, false); } @@ -167,7 +167,7 @@ public static float ParseLength(string length, float hundredPercent, CssBoxPrope /// /// /// the parsed length value with adjustments - public static float ParseLength(string length, float hundredPercent, CssBoxProperties box, string defaultUnit) + public static double ParseLength(string length, double hundredPercent, CssBoxProperties box, string defaultUnit) { return ParseLength(length, hundredPercent, box.GetEmHeight(), defaultUnit, false, false); } @@ -180,9 +180,9 @@ public static float ParseLength(string length, float hundredPercent, CssBoxPrope /// /// /// if the length is in pixels and the length is font related it needs to use 72/96 factor - /// Allows the return float to be in points. If false, result will be pixels + /// Allows the return double to be in points. If false, result will be pixels /// the parsed length value with adjustments - public static float ParseLength(string length, float hundredPercent, float emFactor, string defaultUnit, bool fontAdjust, bool returnPoints) + public static double ParseLength(string length, double hundredPercent, double emFactor, string defaultUnit, bool fontAdjust, bool returnPoints) { //Return zero if no length specified, zero specified if (string.IsNullOrEmpty(length) || length == "0") return 0f; @@ -195,7 +195,7 @@ public static float ParseLength(string length, float hundredPercent, float emFac string unit = GetUnit(length, defaultUnit, out hasUnit); //Factor will depend on the unit - float factor; + double factor; //Number of the length string number = hasUnit ? length.Substring(0, length.Length - 2) : length; @@ -334,7 +334,7 @@ public bool TryGetColor(string str, int idx, int length, out RColor color) /// /// /// - public static float GetActualBorderWidth(string borderValue, CssBoxProperties b) + public static double GetActualBorderWidth(string borderValue, CssBoxProperties b) { if (string.IsNullOrEmpty(borderValue)) { diff --git a/Source/HtmlRenderer/Core/Utils/CssUtils.cs b/Source/HtmlRenderer/Core/Utils/CssUtils.cs index de1ea5b06..f21a924c6 100644 --- a/Source/HtmlRenderer/Core/Utils/CssUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CssUtils.cs @@ -47,9 +47,9 @@ public static RColor DefaultSelectionBackcolor /// /// /// - public static float WhiteSpace(IGraphics g, CssBoxProperties box) + public static double WhiteSpace(IGraphics g, CssBoxProperties box) { - float w = box.ActualFont.GetWhitespaceWidth(g); + double w = box.ActualFont.GetWhitespaceWidth(g); if (!(String.IsNullOrEmpty(box.WordSpacing) || box.WordSpacing == CssConstants.Normal)) { w += CssValueParser.ParseLength(box.WordSpacing, 0, box, true); diff --git a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs index 8f9dfe316..ca9143c07 100644 --- a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs @@ -116,7 +116,7 @@ public static void DrawImageErrorIcon(IGraphics g, HtmlContainerInt htmlContaine /// Radius of the south east corner /// Radius of the south west corner /// GraphicsPath with the lines of the rounded rectangle ready to be painted - public static IGraphicsPath GetRoundRect(IGraphics g, RRect rect, float nwRadius, float neRadius, float seRadius, float swRadius) + public static IGraphicsPath GetRoundRect(IGraphics g, RRect rect, double nwRadius, double neRadius, double seRadius, double swRadius) { // NW-----NE // | | diff --git a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs index 7be7090d5..baf886f46 100644 --- a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs @@ -133,7 +133,7 @@ public void Callback(string path) ///
/// the path to the image to load (file path or URL) /// optional: limit to specific rectangle of the image and not all of it - public void Callback(string path, float x, float y, float width, float height) + public void Callback(string path, double x, double y, double width, double height) { ArgChecker.AssertArgNotNullOrEmpty(path, "path"); @@ -164,7 +164,7 @@ public void Callback(Object image) /// /// the image to load /// optional: limit to specific rectangle of the image and not all of it - public void Callback(Object image, float x, float y, float width, float height) + public void Callback(Object image, double x, double y, double width, double height) { ArgChecker.AssertArgNotNull(image, "image"); diff --git a/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs index 7e2f12734..9ed2f7b2a 100644 --- a/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs @@ -37,7 +37,7 @@ public HtmlScrollEventArgs(RPoint location) /// /// the x location to scroll to /// - public float X + public double X { get { return _location.X; } } @@ -45,7 +45,7 @@ public float X /// /// the x location to scroll to /// - public float Y + public double Y { get { return _location.Y; } } diff --git a/Source/HtmlRenderer/Entities/RPoint.cs b/Source/HtmlRenderer/Entities/RPoint.cs index 41e2115d0..f6cd5ebc9 100644 --- a/Source/HtmlRenderer/Entities/RPoint.cs +++ b/Source/HtmlRenderer/Entities/RPoint.cs @@ -25,8 +25,8 @@ public struct RPoint /// 1 public static readonly RPoint Empty = new RPoint(); - private float _x; - private float _y; + private double _x; + private double _y; static RPoint() {} @@ -36,7 +36,7 @@ static RPoint() /// /// The horizontal position of the point. /// The vertical position of the point. - public RPoint(float x, float y) + public RPoint(double x, double y) { _x = x; _y = y; @@ -70,7 +70,7 @@ public bool IsEmpty /// The x-coordinate of this . /// /// 1 - public float X + public double X { get { return _x; } set { _x = value; } @@ -83,7 +83,7 @@ public float X /// The y-coordinate of this . /// /// 1 - public float Y + public double Y { get { return _y; } set { _y = value; } diff --git a/Source/HtmlRenderer/Entities/RRect.cs b/Source/HtmlRenderer/Entities/RRect.cs index 195712da0..4a648ddd6 100644 --- a/Source/HtmlRenderer/Entities/RRect.cs +++ b/Source/HtmlRenderer/Entities/RRect.cs @@ -26,11 +26,11 @@ public struct RRect /// public static readonly RRect Empty = new RRect(); - private float _height; - private float _width; + private double _height; + private double _width; - private float _x; - private float _y; + private double _x; + private double _y; #endregion @@ -42,7 +42,7 @@ public struct RRect /// The y-coordinate of the upper-left corner of the rectangle. /// The width of the rectangle. /// The height of the rectangle. - public RRect(float x, float y, float width, float height) + public RRect(double x, double y, double width, double height) { _x = x; _y = y; @@ -97,7 +97,7 @@ public RSize Size /// /// The x-coordinate of the upper-left corner of this structure. /// - public float X + public double X { get { return _x; } set { _x = value; } @@ -109,7 +109,7 @@ public float X /// /// The y-coordinate of the upper-left corner of this structure. /// - public float Y + public double Y { get { return _y; } set { _y = value; } @@ -121,7 +121,7 @@ public float Y /// /// The width of this structure. /// - public float Width + public double Width { get { return _width; } set { _width = value; } @@ -133,7 +133,7 @@ public float Width /// /// The height of this structure. /// - public float Height + public double Height { get { return _height; } set { _height = value; } @@ -145,7 +145,7 @@ public float Height /// /// The x-coordinate of the left edge of this structure. /// - public float Left + public double Left { get { return X; } } @@ -156,7 +156,7 @@ public float Left /// /// The y-coordinate of the top edge of this structure. /// - public float Top + public double Top { get { return Y; } } @@ -173,7 +173,7 @@ public float Top /// cref="RRect.Width" /> /// of this structure. /// - public float Right + public double Right { get { return X + Width; } } @@ -190,7 +190,7 @@ public float Right /// cref="RRect.Height" /> /// of this structure. /// - public float Bottom + public double Bottom { get { return Y + Height; } } @@ -268,7 +268,7 @@ public bool IsEmpty /// The y-coordinate of the upper-left corner of the rectangular region. /// The x-coordinate of the lower-right corner of the rectangular region. /// The y-coordinate of the lower-right corner of the rectangular region. - public static RRect FromLTRB(float left, float top, float right, float bottom) + public static RRect FromLTRB(double left, double top, double right, double bottom) { return new RRect(left, top, right - left, bottom - top); } @@ -305,7 +305,7 @@ public override bool Equals(object obj) /// /// The x-coordinate of the point to test. /// The y-coordinate of the point to test. - public bool Contains(float x, float y) + public bool Contains(double x, double y) { if( X <= (double)x && x < X + (double)Width && Y <= (double)y ) return y < Y + (double)Height; @@ -357,7 +357,7 @@ public bool Contains(RRect rect) /// /// The amount to inflate this structure vertically. /// - public void Inflate(float x, float y) + public void Inflate(double x, double y) { X -= x; Y -= y; @@ -385,7 +385,7 @@ public void Inflate(RSize size) /// /// The amount to inflate the copy of the rectangle horizontally. /// The amount to inflate the copy of the rectangle vertically. - public static RRect Inflate(RRect rect, float x, float y) + public static RRect Inflate(RRect rect, double x, double y) { RRect rectangleF = rect; rectangleF.Inflate(x, y); @@ -421,10 +421,10 @@ public void Intersect(RRect rect) /// A rectangle to intersect. public static RRect Intersect(RRect a, RRect b) { - float x = Math.Max(a.X, b.X); - float num1 = Math.Min(a.X + a.Width, b.X + b.Width); - float y = Math.Max(a.Y, b.Y); - float num2 = Math.Min(a.Y + a.Height, b.Y + b.Height); + double x = Math.Max(a.X, b.X); + double num1 = Math.Min(a.X + a.Width, b.X + b.Width); + double y = Math.Max(a.Y, b.Y); + double num2 = Math.Min(a.Y + a.Height, b.Y + b.Height); if( num1 >= (double)x && num2 >= (double)y ) return new RRect(x, y, num1 - x, num2 - y); else @@ -456,10 +456,10 @@ public bool IntersectsWith(RRect rect) /// A rectangle to union. public static RRect Union(RRect a, RRect b) { - float x = Math.Min(a.X, b.X); - float num1 = Math.Max(a.X + a.Width, b.X + b.Width); - float y = Math.Min(a.Y, b.Y); - float num2 = Math.Max(a.Y + a.Height, b.Y + b.Height); + double x = Math.Min(a.X, b.X); + double num1 = Math.Max(a.X + a.Width, b.X + b.Width); + double y = Math.Min(a.Y, b.Y); + double num2 = Math.Max(a.Y + a.Height, b.Y + b.Height); return new RRect(x, y, num1 - x, num2 - y); } @@ -477,7 +477,7 @@ public void Offset(RPoint pos) /// /// The amount to offset the location horizontally. /// The amount to offset the location vertically. - public void Offset(float x, float y) + public void Offset(double x, double y) { X += x; Y += y; diff --git a/Source/HtmlRenderer/Entities/RSize.cs b/Source/HtmlRenderer/Entities/RSize.cs index 11a4eb7e8..52f3a3770 100644 --- a/Source/HtmlRenderer/Entities/RSize.cs +++ b/Source/HtmlRenderer/Entities/RSize.cs @@ -42,8 +42,8 @@ public struct RSize /// 1 public static readonly RSize Empty = new RSize(); - private float _height; - private float _width; + private double _height; + private double _width; #endregion @@ -85,7 +85,7 @@ public RSize(RPoint pt) /// /// The height component of the new structure. /// - public RSize(float width, float height) + public RSize(double width, double height) { _width = width; _height = height; @@ -116,7 +116,7 @@ public bool IsEmpty /// The horizontal component of this structure, typically measured in pixels. /// /// 1 - public float Width + public double Width { get { return _width; } set { _width = value; } @@ -129,7 +129,7 @@ public float Width /// The vertical component of this structure, typically measured in pixels. /// /// 1 - public float Height + public double Height { get { return _height; } set { _height = value; } diff --git a/Source/HtmlRenderer/Interfaces/GlobalBase.cs b/Source/HtmlRenderer/Interfaces/GlobalBase.cs index 97e540861..f78ffd6b1 100644 --- a/Source/HtmlRenderer/Interfaces/GlobalBase.cs +++ b/Source/HtmlRenderer/Interfaces/GlobalBase.cs @@ -129,7 +129,7 @@ public void AddFontFamilyMapping(string fromFamily, string toFamily) /// font size /// font style /// font instance - public IFont GetFont(string family, float size, RFontStyle style) + public IFont GetFont(string family, double size, RFontStyle style) { return _fontHandler.GetCachedFont(family, size, style); } @@ -218,7 +218,7 @@ public virtual void SaveToFile(IImage image, string name, string extension, ICon /// font size /// font style /// font instance - protected internal abstract IFont CreateFont(string family, float size, RFontStyle style); + protected internal abstract IFont CreateFont(string family, double size, RFontStyle style); /// /// Get font instance by given font family instance, size and style.
@@ -228,6 +228,6 @@ public virtual void SaveToFile(IImage image, string name, string extension, ICon /// font size /// font style /// font instance - protected internal abstract IFont CreateFont(IFontFamily family, float size, RFontStyle style); + protected internal abstract IFont CreateFont(IFontFamily family, double size, RFontStyle style); } } diff --git a/Source/HtmlRenderer/Interfaces/IFont.cs b/Source/HtmlRenderer/Interfaces/IFont.cs index acd9278b4..4e839691f 100644 --- a/Source/HtmlRenderer/Interfaces/IFont.cs +++ b/Source/HtmlRenderer/Interfaces/IFont.cs @@ -20,28 +20,28 @@ public interface IFont /// /// Gets the em-size of this Font measured in the units specified by the Unit property. /// - float Size { get; } + double Size { get; } /// /// Gets the em-size, in points, of this Font. /// - float SizeInPoints { get; } + double SizeInPoints { get; } /// /// The line spacing, in pixels, of this font. /// - float Height { get; } + double Height { get; } /// /// Get the vertical offset of the font underline location from the top of the font. /// - float UnderlineOffset { get; } + double UnderlineOffset { get; } /// /// Get the left padding, in pixels, of the font. /// - float LeftPadding { get; } + double LeftPadding { get; } - float GetWhitespaceWidth(IGraphics graphics); + double GetWhitespaceWidth(IGraphics graphics); } } diff --git a/Source/HtmlRenderer/Interfaces/IGraphics.cs b/Source/HtmlRenderer/Interfaces/IGraphics.cs index 3167a27fe..48700783b 100644 --- a/Source/HtmlRenderer/Interfaces/IGraphics.cs +++ b/Source/HtmlRenderer/Interfaces/IGraphics.cs @@ -75,7 +75,7 @@ public interface IGraphics : IDisposable /// the end color of the gradient /// the angle to move the gradient from start color to end color in the rectangle /// linear gradient color brush instance - IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, float angle); + IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle); /// /// Get TextureBrush object that uses the specified image and bounding rectangle. @@ -112,7 +112,7 @@ public interface IGraphics : IDisposable /// the number of characters that will fit under restriction /// /// the size of the string - RSize MeasureString(string str, IFont font, float maxWidth, out int charFit, out int charFitWidth); + RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth); /// /// Draw the given string using the given font and foreground color at given location. @@ -132,7 +132,7 @@ public interface IGraphics : IDisposable /// The y-coordinate of the first point. /// The x-coordinate of the second point. /// The y-coordinate of the second point. - void DrawLine(IPen pen, float x1, float y1, float x2, float y2); + void DrawLine(IPen pen, double x1, double y1, double x2, double y2); /// /// Draws a rectangle specified by a coordinate pair, a width, and a height. @@ -142,7 +142,7 @@ public interface IGraphics : IDisposable /// The y-coordinate of the upper-left corner of the rectangle to draw. /// The width of the rectangle to draw. /// The height of the rectangle to draw. - void DrawRectangle(IPen pen, float x, float y, float width, float height); + void DrawRectangle(IPen pen, double x, double y, double width, double height); /// /// Fills the interior of a rectangle specified by a pair of coordinates, a width, and a height. @@ -152,7 +152,7 @@ public interface IGraphics : IDisposable /// The y-coordinate of the upper-left corner of the rectangle to fill. /// Width of the rectangle to fill. /// Height of the rectangle to fill. - void DrawRectangle(IBrush brush, float x, float y, float width, float height); + void DrawRectangle(IBrush brush, double x, double y, double width, double height); /// /// Draws the specified portion of the specified at the specified location and with the specified size. diff --git a/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs b/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs index af051e74c..261b9b099 100644 --- a/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs +++ b/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs @@ -22,12 +22,12 @@ public interface IGraphicsPath : IDisposable /// /// Appends an elliptical arc to the current figure. /// - void AddArc(float x, float y, float width, float height, float startAngle, float sweepAngle); + void AddArc(double x, double y, double width, double height, double startAngle, double sweepAngle); /// /// Appends a line segment to this GraphicsPath. /// - void AddLine(float x1, float y1, float x2, float y2); + void AddLine(double x1, double y1, double x2, double y2); /// /// Closes the current figure and starts a new figure. If the current figure contains a sequence of connected diff --git a/Source/HtmlRenderer/Interfaces/IImage.cs b/Source/HtmlRenderer/Interfaces/IImage.cs index bedd0c92d..332f793fb 100644 --- a/Source/HtmlRenderer/Interfaces/IImage.cs +++ b/Source/HtmlRenderer/Interfaces/IImage.cs @@ -23,12 +23,12 @@ public interface IImage : IDisposable /// /// Get the width, in pixels, of the image. /// - float Width { get; } + double Width { get; } /// /// Get the height, in pixels, of the image. /// - float Height { get; } + double Height { get; } /// /// Saves this image to the specified stream in PNG format. diff --git a/Source/HtmlRenderer/Interfaces/IPen.cs b/Source/HtmlRenderer/Interfaces/IPen.cs index 45552aeec..a7ffb1488 100644 --- a/Source/HtmlRenderer/Interfaces/IPen.cs +++ b/Source/HtmlRenderer/Interfaces/IPen.cs @@ -22,7 +22,7 @@ public interface IPen /// /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. /// - float Width { get; set; } + double Width { get; set; } /// /// Gets or sets the style used for dashed lines drawn with this Pen. @@ -32,6 +32,6 @@ public interface IPen /// /// Gets or sets an array of custom dashes and spaces. /// - float[] DashPattern { set; } + double[] DashPattern { set; } } } From 23cb30fdc7ae386752ba2b363645bcf568f402e4 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sun, 2 Feb 2014 09:09:25 +0200 Subject: [PATCH 051/254] * fix underline effected by previous pen modifications --- Source/HtmlRenderer/Core/Dom/CssBox.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/HtmlRenderer/Core/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs index 4c3dd6e3e..1130785b2 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -1225,7 +1225,7 @@ protected void PaintBackground(IGraphics g, RRect rect, bool isFirst, bool isLas } else { - g.DrawRectangle(brush, (double)Math.Ceiling(rect.X), (double)Math.Ceiling(rect.Y), rect.Width, rect.Height); + g.DrawRectangle(brush, Math.Ceiling(rect.X), Math.Ceiling(rect.Y), rect.Width, rect.Height); } g.ReturnPreviousSmoothingMode(prevMode); @@ -1299,7 +1299,7 @@ protected void PaintDecoration(IGraphics g, RRect rectangle, bool isFirst, bool double y = 0f; if (TextDecoration == CssConstants.Underline) { - y = (double)Math.Round(rectangle.Top + ActualFont.UnderlineOffset); + y = Math.Round(rectangle.Top + ActualFont.UnderlineOffset); } else if (TextDecoration == CssConstants.LineThrough) { @@ -1320,6 +1320,8 @@ protected void PaintDecoration(IGraphics g, RRect rectangle, bool isFirst, bool x2 -= ActualPaddingRight + ActualBorderRightWidth; var pen = g.GetPen(ActualColor); + pen.Width = 1; + pen.DashStyle = RDashStyle.Solid; g.DrawLine(pen, x1, y, x2, y); } From 353f77b768b39c62953af79aa18d109b6c15a14e Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sun, 2 Feb 2014 09:14:01 +0200 Subject: [PATCH 052/254] * remove undeeded casts after float to double change --- .../HtmlRenderer.PdfSharp/Utilities/Utils.cs | 6 ++--- Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs | 4 ++-- Source/HtmlRenderer/Core/Dom/CssBoxImage.cs | 4 ++-- .../Core/Handlers/BordersDrawHandler.cs | 8 +++---- Source/HtmlRenderer/Entities/RPoint.cs | 6 ++--- Source/HtmlRenderer/Entities/RRect.cs | 22 +++++++++---------- Source/HtmlRenderer/Entities/RSize.cs | 6 ++--- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs index f6a2ba505..9abad2a2a 100644 --- a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs +++ b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs @@ -25,7 +25,7 @@ internal static class Utils /// public static RPoint Convert(XPoint p) { - return new RPoint((float)p.X, (float)p.Y); + return new RPoint(p.X, p.Y); } /// @@ -52,7 +52,7 @@ public static XPoint Convert(RPoint p) /// public static RSize Convert(XSize s) { - return new RSize((float)s.Width, (float)s.Height); + return new RSize(s.Width, s.Height); } /// @@ -68,7 +68,7 @@ public static XSize Convert(RSize s) /// public static RRect Convert(XRect r) { - return new RRect((float)r.X, (float)r.Y, (float)r.Width, (float)r.Height); + return new RRect(r.X, r.Y, r.Width, r.Height); } /// diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs index 1a0318c00..0688420f9 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs @@ -413,8 +413,8 @@ protected override void PaintImp(IGraphics g) tmpRect.Offset(offset); tmpRect.Height -= ActualBorderTopWidth + ActualBorderBottomWidth + ActualPaddingTop + ActualPaddingBottom; tmpRect.Y += ActualBorderTopWidth + ActualPaddingTop; - tmpRect.X = (double)Math.Floor(tmpRect.X); - tmpRect.Y = (double)Math.Floor(tmpRect.Y); + tmpRect.X = Math.Floor(tmpRect.X); + tmpRect.Y = Math.Floor(tmpRect.Y); var rect = tmpRect; DrawImage(g, offset, rect); diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs index bfab50b50..b1ffbcff0 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs @@ -90,8 +90,8 @@ protected override void PaintImp(IGraphics g) r.Offset(offset); r.Height -= ActualBorderTopWidth + ActualBorderBottomWidth + ActualPaddingTop + ActualPaddingBottom; r.Y += ActualBorderTopWidth + ActualPaddingTop; - r.X = (double) Math.Floor(r.X); - r.Y = (double)Math.Floor(r.Y); + r.X = Math.Floor(r.X); + r.Y = Math.Floor(r.Y); if (_imageWord.Image != null) { diff --git a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs index 09b13f503..7001cb656 100644 --- a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs @@ -126,16 +126,16 @@ private static void DrawBorder(Border border, CssBox box, IGraphics g, RRect rec switch (border) { case Border.Top: - g.DrawLine(pen, (double)Math.Ceiling(rect.Left), rect.Top + box.ActualBorderTopWidth / 2, rect.Right - 1, rect.Top + box.ActualBorderTopWidth / 2); + g.DrawLine(pen, Math.Ceiling(rect.Left), rect.Top + box.ActualBorderTopWidth / 2, rect.Right - 1, rect.Top + box.ActualBorderTopWidth / 2); break; case Border.Left: - g.DrawLine(pen, rect.Left + box.ActualBorderLeftWidth / 2, (double)Math.Ceiling(rect.Top), rect.Left + box.ActualBorderLeftWidth / 2, (double)Math.Floor(rect.Bottom)); + g.DrawLine(pen, rect.Left + box.ActualBorderLeftWidth / 2, Math.Ceiling(rect.Top), rect.Left + box.ActualBorderLeftWidth / 2, Math.Floor(rect.Bottom)); break; case Border.Bottom: - g.DrawLine(pen, (double)Math.Ceiling(rect.Left), rect.Bottom - box.ActualBorderBottomWidth / 2, rect.Right - 1, rect.Bottom - box.ActualBorderBottomWidth / 2); + g.DrawLine(pen, Math.Ceiling(rect.Left), rect.Bottom - box.ActualBorderBottomWidth / 2, rect.Right - 1, rect.Bottom - box.ActualBorderBottomWidth / 2); break; case Border.Right: - g.DrawLine(pen, rect.Right - box.ActualBorderRightWidth / 2, (double)Math.Ceiling(rect.Top), rect.Right - box.ActualBorderRightWidth / 2, (double)Math.Floor(rect.Bottom)); + g.DrawLine(pen, rect.Right - box.ActualBorderRightWidth / 2, Math.Ceiling(rect.Top), rect.Right - box.ActualBorderRightWidth / 2, Math.Floor(rect.Bottom)); break; } } diff --git a/Source/HtmlRenderer/Entities/RPoint.cs b/Source/HtmlRenderer/Entities/RPoint.cs index f6cd5ebc9..2c98408eb 100644 --- a/Source/HtmlRenderer/Entities/RPoint.cs +++ b/Source/HtmlRenderer/Entities/RPoint.cs @@ -162,8 +162,8 @@ public double Y /// 3 public static bool operator ==(RPoint left, RPoint right) { - if( left.X == (double)right.X ) - return left.Y == (double)right.Y; + if( left.X == right.X ) + return left.Y == right.Y; else return false; } @@ -256,7 +256,7 @@ public override bool Equals(object obj) if( !( obj is RPoint ) ) return false; var pointF = (RPoint)obj; - if( pointF.X == (double)X && pointF.Y == (double)Y ) + if( pointF.X == X && pointF.Y == Y ) return pointF.GetType().Equals(GetType()); else return false; diff --git a/Source/HtmlRenderer/Entities/RRect.cs b/Source/HtmlRenderer/Entities/RRect.cs index 4a648ddd6..8e7526ed5 100644 --- a/Source/HtmlRenderer/Entities/RRect.cs +++ b/Source/HtmlRenderer/Entities/RRect.cs @@ -233,8 +233,8 @@ public bool IsEmpty /// public static bool operator ==(RRect left, RRect right) { - if( Math.Abs(left.X - (double)right.X) < 0.001 && Math.Abs(left.Y - (double)right.Y) < 0.001 && Math.Abs(left.Width - (double)right.Width) < 0.001 ) - return Math.Abs(left.Height - (double)right.Height) < 0.001; + if( Math.Abs(left.X - right.X) < 0.001 && Math.Abs(left.Y - right.Y) < 0.001 && Math.Abs(left.Width - right.Width) < 0.001 ) + return Math.Abs(left.Height - right.Height) < 0.001; else return false; } @@ -289,8 +289,8 @@ public override bool Equals(object obj) if( !( obj is RRect ) ) return false; var rectangleF = (RRect)obj; - if( Math.Abs(rectangleF.X - (double)X) < 0.001 && Math.Abs(rectangleF.Y - (double)Y) < 0.001 && Math.Abs(rectangleF.Width - (double)Width) < 0.001 ) - return Math.Abs(rectangleF.Height - (double)Height) < 0.001; + if( Math.Abs(rectangleF.X - X) < 0.001 && Math.Abs(rectangleF.Y - Y) < 0.001 && Math.Abs(rectangleF.Width - Width) < 0.001 ) + return Math.Abs(rectangleF.Height - Height) < 0.001; else return false; } @@ -307,8 +307,8 @@ public override bool Equals(object obj) /// The y-coordinate of the point to test. public bool Contains(double x, double y) { - if( X <= (double)x && x < X + (double)Width && Y <= (double)y ) - return y < Y + (double)Height; + if( X <= x && x < X + Width && Y <= y ) + return y < Y + Height; else return false; } @@ -342,8 +342,8 @@ public bool Contains(RPoint pt) /// public bool Contains(RRect rect) { - if( X <= (double)rect.X && rect.X + (double)rect.Width <= X + (double)Width && Y <= (double)rect.Y ) - return rect.Y + (double)rect.Height <= Y + (double)Height; + if( X <= rect.X && rect.X + rect.Width <= X + Width && Y <= rect.Y ) + return rect.Y + rect.Height <= Y + Height; else return false; } @@ -425,7 +425,7 @@ public static RRect Intersect(RRect a, RRect b) double num1 = Math.Min(a.X + a.Width, b.X + b.Width); double y = Math.Max(a.Y, b.Y); double num2 = Math.Min(a.Y + a.Height, b.Y + b.Height); - if( num1 >= (double)x && num2 >= (double)y ) + if( num1 >= x && num2 >= y ) return new RRect(x, y, num1 - x, num2 - y); else return Empty; @@ -440,8 +440,8 @@ public static RRect Intersect(RRect a, RRect b) /// The rectangle to test. public bool IntersectsWith(RRect rect) { - if( rect.X < X + (double)Width && X < rect.X + (double)rect.Width && rect.Y < Y + (double)Height ) - return Y < rect.Y + (double)rect.Height; + if( rect.X < X + Width && X < rect.X + rect.Width && rect.Y < Y + Height ) + return Y < rect.Y + rect.Height; else return false; } diff --git a/Source/HtmlRenderer/Entities/RSize.cs b/Source/HtmlRenderer/Entities/RSize.cs index 52f3a3770..78a2ba124 100644 --- a/Source/HtmlRenderer/Entities/RSize.cs +++ b/Source/HtmlRenderer/Entities/RSize.cs @@ -204,8 +204,8 @@ public static explicit operator RPoint(RSize size) /// 3 public static bool operator ==(RSize sz1, RSize sz2) { - if( Math.Abs(sz1.Width - (double)sz2.Width) < 0.001 ) - return Math.Abs(sz1.Height - (double)sz2.Height) < 0.001; + if( Math.Abs(sz1.Width - sz2.Width) < 0.001 ) + return Math.Abs(sz1.Height - sz2.Height) < 0.001; else return false; } @@ -292,7 +292,7 @@ public override bool Equals(object obj) if( !( obj is RSize ) ) return false; var sizeF = (RSize)obj; - if( Math.Abs(sizeF.Width - (double)Width) < 0.001 && Math.Abs(sizeF.Height - (double)Height) < 0.001 ) + if( Math.Abs(sizeF.Width - Width) < 0.001 && Math.Abs(sizeF.Height - Height) < 0.001 ) return sizeF.GetType() == GetType(); else return false; From 2ae03eb07f89f22daf6e9042ade5551d7fea23ed Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 1 May 2014 13:49:32 +0300 Subject: [PATCH 053/254] git crap --- Source/HtmlRenderer/Core/Utils/CommonUtils.cs | 984 +++++++++--------- 1 file changed, 492 insertions(+), 492 deletions(-) diff --git a/Source/HtmlRenderer/Core/Utils/CommonUtils.cs b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs index c5578584f..cec3e1de6 100644 --- a/Source/HtmlRenderer/Core/Utils/CommonUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs @@ -1,497 +1,497 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Net; -using System.Text; +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Net; +using System.Text; using HtmlRenderer.Core.Entities; -using HtmlRenderer.Entities; - +using HtmlRenderer.Entities; + namespace HtmlRenderer.Core.Utils -{ - internal delegate void ActionInt(T obj); - - internal delegate void ActionInt(T1 arg1, T2 arg2); - - internal delegate void ActionInt(T1 arg1, T2 arg2, T3 arg3); - - /// - /// Utility methods for general stuff. - /// - internal static class CommonUtils - { - #region Fields and Consts - - /// - /// Table to convert numbers into roman digits - /// - private static readonly string[,] _romanDigitsTable = new[,] - { - {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}, - {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, - {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, - { - "", "M", "MM", "MMM", "M(V)", "(V)", "(V)M", - "(V)MM", "(V)MMM", "M(X)" - } - }; - - private static readonly string[,] _hebrewDigitsTable = new[,] - { - {"א", "ב", "ג", "ד", "ה", "ו", "ז", "ח", "ט"}, - {"י", "כ", "ל", "מ", "נ", "ס", "ע", "פ", "צ"}, - {"ק", "ר", "ש", "ת", "תק", "תר", "תש", "תת", "תתק",} - }; - - private static readonly string[,] _georgianDigitsTable = new[,] - { - {"ა", "ბ", "გ", "დ", "ე", "ვ", "ზ", "ჱ", "თ"}, - {"ი", "პ", "ლ", "მ", "ნ", "ჲ", "ო", "პ", "ჟ"}, - {"რ", "ს", "ტ", "ჳ", "ფ", "ქ", "ღ", "ყ", "შ"} - }; - - private static readonly string[,] _armenianDigitsTable = new[,] - { - {"Ա", "Բ", "Գ", "Դ", "Ե", "Զ", "Է", "Ը", "Թ"}, - {"Ժ", "Ի", "Լ", "Խ", "Ծ", "Կ", "Հ", "Ձ", "Ղ"}, - {"Ճ", "Մ", "Յ", "Ն", "Շ", "Ո", "Չ", "Պ", "Ջ"} - }; - - private static readonly string[] _hiraganaDigitsTable = new[] - { - "あ", "ぃ", "ぅ", "ぇ", "ぉ", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ", "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", "み", "む", "め", "も", "ゃ", "ゅ", "ょ", "ら", "り", "る", "れ", "ろ", "ゎ", "ゐ", "ゑ", "を", "ん" - }; - - private static readonly string[] _satakanaDigitsTable = new[] - { - "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヰ", "ヱ", "ヲ", "ン" - }; - - #endregion - - - /// - /// Check if the given char is of Asian range. - /// - /// the character to check - /// true - Asian char, false - otherwise - public static bool IsAsianCharecter(char ch) - { - return ch >= 0x4e00 && ch <= 0xFA2D; - } - - /// - /// Check if the given char is a digit character (0-9) and (0-9, a-f for HEX) - /// - /// the character to check - /// optional: is hex digit check - /// true - is digit, false - not a digit - public static bool IsDigit(char ch, bool hex = false) - { - return ( ch >= '0' && ch <= '9' ) || ( hex && ( ( ch >= 'a' && ch <= 'f' ) || ( ch >= 'A' && ch <= 'F' ) ) ); - } - - /// - /// Convert the given char to digit. - /// - /// the character to check - /// optional: is hex digit check - /// true - is digit, false - not a digit - public static int ToDigit(char ch, bool hex = false) - { - if( ch >= '0' && ch <= '9' ) - return ch - '0'; - else if( hex ) - { - if( ch >= 'a' && ch <= 'f' ) - return ch - 'a' + 10; - else if(ch >= 'A' && ch <= 'F') - return ch - 'A' + 10; - } - - return 0; - } - - /// - /// Get size that is max of and for width and height separately. - /// +{ + internal delegate void ActionInt(T obj); + + internal delegate void ActionInt(T1 arg1, T2 arg2); + + internal delegate void ActionInt(T1 arg1, T2 arg2, T3 arg3); + + /// + /// Utility methods for general stuff. + /// + internal static class CommonUtils + { + #region Fields and Consts + + /// + /// Table to convert numbers into roman digits + /// + private static readonly string[,] _romanDigitsTable = new[,] + { + {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}, + {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, + {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, + { + "", "M", "MM", "MMM", "M(V)", "(V)", "(V)M", + "(V)MM", "(V)MMM", "M(X)" + } + }; + + private static readonly string[,] _hebrewDigitsTable = new[,] + { + {"א", "ב", "ג", "ד", "ה", "ו", "ז", "ח", "ט"}, + {"י", "כ", "ל", "מ", "נ", "ס", "ע", "פ", "צ"}, + {"ק", "ר", "ש", "ת", "תק", "תר", "תש", "תת", "תתק",} + }; + + private static readonly string[,] _georgianDigitsTable = new[,] + { + {"ა", "ბ", "გ", "დ", "ე", "ვ", "ზ", "ჱ", "თ"}, + {"ი", "პ", "ლ", "მ", "ნ", "ჲ", "ო", "პ", "ჟ"}, + {"რ", "ს", "ტ", "ჳ", "ფ", "ქ", "ღ", "ყ", "შ"} + }; + + private static readonly string[,] _armenianDigitsTable = new[,] + { + {"Ա", "Բ", "Գ", "Դ", "Ե", "Զ", "Է", "Ը", "Թ"}, + {"Ժ", "Ի", "Լ", "Խ", "Ծ", "Կ", "Հ", "Ձ", "Ղ"}, + {"Ճ", "Մ", "Յ", "Ն", "Շ", "Ո", "Չ", "Պ", "Ջ"} + }; + + private static readonly string[] _hiraganaDigitsTable = new[] + { + "あ", "ぃ", "ぅ", "ぇ", "ぉ", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ", "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", "み", "む", "め", "も", "ゃ", "ゅ", "ょ", "ら", "り", "る", "れ", "ろ", "ゎ", "ゐ", "ゑ", "を", "ん" + }; + + private static readonly string[] _satakanaDigitsTable = new[] + { + "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヰ", "ヱ", "ヲ", "ン" + }; + + #endregion + + + /// + /// Check if the given char is of Asian range. + /// + /// the character to check + /// true - Asian char, false - otherwise + public static bool IsAsianCharecter(char ch) + { + return ch >= 0x4e00 && ch <= 0xFA2D; + } + + /// + /// Check if the given char is a digit character (0-9) and (0-9, a-f for HEX) + /// + /// the character to check + /// optional: is hex digit check + /// true - is digit, false - not a digit + public static bool IsDigit(char ch, bool hex = false) + { + return ( ch >= '0' && ch <= '9' ) || ( hex && ( ( ch >= 'a' && ch <= 'f' ) || ( ch >= 'A' && ch <= 'F' ) ) ); + } + + /// + /// Convert the given char to digit. + /// + /// the character to check + /// optional: is hex digit check + /// true - is digit, false - not a digit + public static int ToDigit(char ch, bool hex = false) + { + if( ch >= '0' && ch <= '9' ) + return ch - '0'; + else if( hex ) + { + if( ch >= 'a' && ch <= 'f' ) + return ch - 'a' + 10; + else if(ch >= 'A' && ch <= 'F') + return ch - 'A' + 10; + } + + return 0; + } + + /// + /// Get size that is max of and for width and height separately. + /// public static RSize Max(RSize size, RSize other) - { + { return new RSize(Math.Max(size.Width, other.Width), Math.Max(size.Height, other.Height)); - } - - /// - /// Get Uri object for the given path if it is valid uri path. - /// - /// the path to get uri for - /// uri or null if not valid - public static Uri TryGetUri(string path) - { - try - { - if (Uri.IsWellFormedUriString(path, UriKind.RelativeOrAbsolute)) - { - return new Uri(path); - } - } - catch - {} - - return null; - } - - /// - /// Get the first value in the given dictionary. - /// - /// the type of dictionary key - /// the type of dictionary value - /// the dictionary - /// optional: the default value to return of no elements found in dictionary - /// first element or default value - public static TValue GetFirstValueOrDefault(IDictionary dic, TValue defaultValue = default(TValue)) - { - if(dic != null) - { - foreach (var value in dic) - return value.Value; - } - return defaultValue; - } - - /// - /// Get file info object for the given path if it is valid file path. - /// - /// the path to get file info for - /// file info or null if not valid - public static FileInfo TryGetFileInfo(string path) - { - try - { - return new FileInfo(path); - } - catch - { } - - return null; - } - - /// - /// Get web client response content type. - /// - /// the web client to get the response content type from - /// response content type or null - public static string GetResponseContentType(WebClient client) - { - foreach (string header in client.ResponseHeaders) - { - if (header.Equals("Content-Type", StringComparison.InvariantCultureIgnoreCase)) - return client.ResponseHeaders[header]; - - } - return null; - } - - /// - /// Gets the representation of the online uri on the local disk. - /// - /// The online image uri. - /// The path of the file on the disk. - public static FileInfo GetLocalfileName(Uri imageUri) - { - StringBuilder fileNameBuilder = new StringBuilder(); - string absoluteUri = imageUri.AbsoluteUri; - int lastSlash = absoluteUri.LastIndexOf('/'); - if (lastSlash == -1) - { - return null; - } - - string uriUntilSlash = absoluteUri.Substring(0, lastSlash); - fileNameBuilder.Append(uriUntilSlash.GetHashCode().ToString()); - fileNameBuilder.Append('_'); - - string restOfUri = absoluteUri.Substring(lastSlash + 1); - int indexOfParams = restOfUri.IndexOf('?'); - if (indexOfParams == -1) - { - string ext = ".cache"; - int indexOfDot = restOfUri.IndexOf('.'); - if (indexOfDot > -1) - { - ext = restOfUri.Substring(indexOfDot); - restOfUri = restOfUri.Substring(0, indexOfDot); - } - - fileNameBuilder.Append(restOfUri); - fileNameBuilder.Append(ext); - } - else - { - int indexOfDot = restOfUri.IndexOf('.'); - if (indexOfDot == -1 || indexOfDot > indexOfParams) - { - //The uri is not for a filename - fileNameBuilder.Append(restOfUri); - fileNameBuilder.Append(".cache"); - } - else if (indexOfParams > indexOfDot) - { - //Adds the filename without extension. - fileNameBuilder.Append(restOfUri, 0, indexOfDot); - //Adds the parameters - fileNameBuilder.Append(restOfUri, indexOfParams, restOfUri.Length - indexOfParams); - //Adds the filename extension. - fileNameBuilder.Append(restOfUri, indexOfDot, indexOfParams - indexOfDot); - } - } - - var validFileName = GetValidFileName(fileNameBuilder.ToString()); - if (validFileName.Length > 25) - { - validFileName = validFileName.Substring(0, 24) + validFileName.Substring(24).GetHashCode() + Path.GetExtension(validFileName); - } - - return new FileInfo(Path.Combine(Path.GetTempPath(), validFileName)); - } - - /// - /// Get substring seperated by whitespace starting from the given idex. - /// - /// the string to get substring in - /// the index to start substring search from - /// return the length of the found string - /// the index of the substring, -1 if no valid sub-string found - public static int GetNextSubString(string str, int idx, out int length) - { - while (idx < str.Length && Char.IsWhiteSpace(str[idx])) - idx++; - if (idx < str.Length) - { - var endIdx = idx + 1; - while (endIdx < str.Length && !Char.IsWhiteSpace(str[endIdx])) - endIdx++; - length = endIdx - idx; - return idx; - } - length = 0; - return -1; - } - - /// + } + + /// + /// Get Uri object for the given path if it is valid uri path. + /// + /// the path to get uri for + /// uri or null if not valid + public static Uri TryGetUri(string path) + { + try + { + if (Uri.IsWellFormedUriString(path, UriKind.RelativeOrAbsolute)) + { + return new Uri(path); + } + } + catch + {} + + return null; + } + + /// + /// Get the first value in the given dictionary. + /// + /// the type of dictionary key + /// the type of dictionary value + /// the dictionary + /// optional: the default value to return of no elements found in dictionary + /// first element or default value + public static TValue GetFirstValueOrDefault(IDictionary dic, TValue defaultValue = default(TValue)) + { + if(dic != null) + { + foreach (var value in dic) + return value.Value; + } + return defaultValue; + } + + /// + /// Get file info object for the given path if it is valid file path. + /// + /// the path to get file info for + /// file info or null if not valid + public static FileInfo TryGetFileInfo(string path) + { + try + { + return new FileInfo(path); + } + catch + { } + + return null; + } + + /// + /// Get web client response content type. + /// + /// the web client to get the response content type from + /// response content type or null + public static string GetResponseContentType(WebClient client) + { + foreach (string header in client.ResponseHeaders) + { + if (header.Equals("Content-Type", StringComparison.InvariantCultureIgnoreCase)) + return client.ResponseHeaders[header]; + + } + return null; + } + + /// + /// Gets the representation of the online uri on the local disk. + /// + /// The online image uri. + /// The path of the file on the disk. + public static FileInfo GetLocalfileName(Uri imageUri) + { + StringBuilder fileNameBuilder = new StringBuilder(); + string absoluteUri = imageUri.AbsoluteUri; + int lastSlash = absoluteUri.LastIndexOf('/'); + if (lastSlash == -1) + { + return null; + } + + string uriUntilSlash = absoluteUri.Substring(0, lastSlash); + fileNameBuilder.Append(uriUntilSlash.GetHashCode().ToString()); + fileNameBuilder.Append('_'); + + string restOfUri = absoluteUri.Substring(lastSlash + 1); + int indexOfParams = restOfUri.IndexOf('?'); + if (indexOfParams == -1) + { + string ext = ".cache"; + int indexOfDot = restOfUri.IndexOf('.'); + if (indexOfDot > -1) + { + ext = restOfUri.Substring(indexOfDot); + restOfUri = restOfUri.Substring(0, indexOfDot); + } + + fileNameBuilder.Append(restOfUri); + fileNameBuilder.Append(ext); + } + else + { + int indexOfDot = restOfUri.IndexOf('.'); + if (indexOfDot == -1 || indexOfDot > indexOfParams) + { + //The uri is not for a filename + fileNameBuilder.Append(restOfUri); + fileNameBuilder.Append(".cache"); + } + else if (indexOfParams > indexOfDot) + { + //Adds the filename without extension. + fileNameBuilder.Append(restOfUri, 0, indexOfDot); + //Adds the parameters + fileNameBuilder.Append(restOfUri, indexOfParams, restOfUri.Length - indexOfParams); + //Adds the filename extension. + fileNameBuilder.Append(restOfUri, indexOfDot, indexOfParams - indexOfDot); + } + } + + var validFileName = GetValidFileName(fileNameBuilder.ToString()); + if (validFileName.Length > 25) + { + validFileName = validFileName.Substring(0, 24) + validFileName.Substring(24).GetHashCode() + Path.GetExtension(validFileName); + } + + return new FileInfo(Path.Combine(Path.GetTempPath(), validFileName)); + } + + /// + /// Get substring seperated by whitespace starting from the given idex. + /// + /// the string to get substring in + /// the index to start substring search from + /// return the length of the found string + /// the index of the substring, -1 if no valid sub-string found + public static int GetNextSubString(string str, int idx, out int length) + { + while (idx < str.Length && Char.IsWhiteSpace(str[idx])) + idx++; + if (idx < str.Length) + { + var endIdx = idx + 1; + while (endIdx < str.Length && !Char.IsWhiteSpace(str[endIdx])) + endIdx++; + length = endIdx - idx; + return idx; + } + length = 0; + return -1; + } + + /// /// Compare that the substring of is equal to - /// Assume given substring is not empty and all indexes are valid!
- ///
- /// true - equals, false - not equals - public static bool SubStringEquals(string str, int idx, int length, string str2) - { - if (length == str2.Length && idx + length <= str.Length) - { - for (int i = 0; i < length; i++) - { - if (Char.ToLowerInvariant(str[idx + i]) != Char.ToLowerInvariant(str2[i])) - return false; - } - return true; - } - return false; - } - - /// - /// Replaces invalid filename chars to '_' - /// - /// The possibly-not-valid filename - /// A valid filename. - private static string GetValidFileName(string source) - { - string retVal = source; - char[] invalidFileNameChars = Path.GetInvalidFileNameChars(); - foreach (var invalidFileNameChar in invalidFileNameChars) - { - retVal = retVal.Replace(invalidFileNameChar, '_'); - } - return retVal; - } - - /// - /// Convert number to alpha numeric system by the requested style (UpperAlpha, LowerRoman, Hebrew, etc.). - /// - /// the number to convert - /// the css style to convert by - /// converted string - public static string ConvertToAlphaNumber(int number, string style = CssConstants.UpperAlpha) - { - if (number == 0) - return string.Empty; - - if( style.Equals(CssConstants.LowerGreek,StringComparison.InvariantCultureIgnoreCase) ) - { - return ConvertToGreekNumber(number); - } - else if( style.Equals(CssConstants.LowerRoman ,StringComparison.InvariantCultureIgnoreCase) ) - { - return ConvertToRomanNumbers(number, true); - } - else if( style.Equals(CssConstants.UpperRoman ,StringComparison.InvariantCultureIgnoreCase) ) - { - return ConvertToRomanNumbers(number, false); - } - else if( style.Equals(CssConstants.Armenian ,StringComparison.InvariantCultureIgnoreCase) ) - { - return ConvertToSpecificNumbers(number, _armenianDigitsTable); - } - else if( style.Equals(CssConstants.Georgian ,StringComparison.InvariantCultureIgnoreCase) ) - { - return ConvertToSpecificNumbers(number, _georgianDigitsTable); - } - else if( style.Equals(CssConstants.Hebrew ,StringComparison.InvariantCultureIgnoreCase) ) - { - return ConvertToSpecificNumbers(number, _hebrewDigitsTable); - } - else if( style.Equals(CssConstants.Hiragana,StringComparison.InvariantCultureIgnoreCase) || style.Equals(CssConstants.HiraganaIroha ,StringComparison.InvariantCultureIgnoreCase) ) - { - return ConvertToSpecificNumbers2(number, _hiraganaDigitsTable); - } - else if( style.Equals(CssConstants.Katakana,StringComparison.InvariantCultureIgnoreCase) || style.Equals(CssConstants.KatakanaIroha ,StringComparison.InvariantCultureIgnoreCase) ) - { - return ConvertToSpecificNumbers2(number, _satakanaDigitsTable); - } - else - { - var lowercase = style.Equals(CssConstants.LowerAlpha, StringComparison.InvariantCultureIgnoreCase) || style.Equals(CssConstants.LowerLatin, StringComparison.InvariantCultureIgnoreCase); - return ConvertToEnglishNumber(number, lowercase); - } - } - - /// - /// Convert the given integer into alphabetic numeric format (D, AU, etc.) - /// - /// the number to convert - /// is to use lowercase - /// the roman number string - private static string ConvertToEnglishNumber(int number, bool lowercase) - { - var sb = string.Empty; - int alphStart = lowercase ? 97 : 65; - while (number > 0) - { - var n = number % 26 -1; - if (n >= 0) - { - sb = (Char) (alphStart + n) + sb; - number = number/26; - } - else - { - sb = (Char) (alphStart + 25) + sb; - number = (number - 1)/26; - } - } - - return sb; - } - - /// - /// Convert the given integer into alphabetic numeric format (alpha, AU, etc.) - /// - /// the number to convert - /// the roman number string - private static string ConvertToGreekNumber(int number) - { - var sb = string.Empty; - while (number > 0) - { - var n = number % 24 - 1; - if( n > 16 ) - n++; - if (n >= 0) - { - sb = (Char)(945 + n) + sb; - number = number / 24; - } - else - { - sb = (Char)(945 + 24) + sb; - number = (number - 1) / 25; - } - } - - return sb; - } - - /// - /// Convert the given integer into roman numeric format (II, VI, IX, etc.) - /// - /// the number to convert - /// if to use lowercase letters for roman digits - /// the roman number string - private static string ConvertToRomanNumbers(int number, bool lowercase) - { - var sb = string.Empty; - for(int i = 1000, j = 3; i > 0; i /= 10, j--) - { - int digit = number/i; - sb += string.Format(_romanDigitsTable[j, digit]); - number -= digit*i; - } - return lowercase ? sb.ToLower() : sb; - } - - /// - /// Convert the given integer into given alphabet numeric system. - /// - /// the number to convert - /// the alphabet system to use - /// the number string - private static string ConvertToSpecificNumbers(int number, string[,] alphabet) - { - int level = 0; - var sb = string.Empty; - while (number > 0 && level < alphabet.GetLength(0)) - { - var n = number % 10; - if(n > 0) - sb = alphabet[level, number % 10 - 1].ToString(CultureInfo.InvariantCulture) + sb; - number /= 10; - level++; - } - return sb; - } - - /// - /// Convert the given integer into given alphabet numeric system. - /// - /// the number to convert - /// the alphabet system to use - /// the number string - private static string ConvertToSpecificNumbers2(int number, string[] alphabet) - { - for (int i = 20; i > 0; i--) - { - if (number > 49 * i - i + 1) - number++; - } - - var sb = string.Empty; - while (number > 0) - { - - - sb = alphabet[Math.Max(0, number % 49 - 1)].ToString(CultureInfo.InvariantCulture) + sb; - number /= 49; - } - return sb; - } - } -} + /// Assume given substring is not empty and all indexes are valid!
+ ///
+ /// true - equals, false - not equals + public static bool SubStringEquals(string str, int idx, int length, string str2) + { + if (length == str2.Length && idx + length <= str.Length) + { + for (int i = 0; i < length; i++) + { + if (Char.ToLowerInvariant(str[idx + i]) != Char.ToLowerInvariant(str2[i])) + return false; + } + return true; + } + return false; + } + + /// + /// Replaces invalid filename chars to '_' + /// + /// The possibly-not-valid filename + /// A valid filename. + private static string GetValidFileName(string source) + { + string retVal = source; + char[] invalidFileNameChars = Path.GetInvalidFileNameChars(); + foreach (var invalidFileNameChar in invalidFileNameChars) + { + retVal = retVal.Replace(invalidFileNameChar, '_'); + } + return retVal; + } + + /// + /// Convert number to alpha numeric system by the requested style (UpperAlpha, LowerRoman, Hebrew, etc.). + /// + /// the number to convert + /// the css style to convert by + /// converted string + public static string ConvertToAlphaNumber(int number, string style = CssConstants.UpperAlpha) + { + if (number == 0) + return string.Empty; + + if( style.Equals(CssConstants.LowerGreek,StringComparison.InvariantCultureIgnoreCase) ) + { + return ConvertToGreekNumber(number); + } + else if( style.Equals(CssConstants.LowerRoman ,StringComparison.InvariantCultureIgnoreCase) ) + { + return ConvertToRomanNumbers(number, true); + } + else if( style.Equals(CssConstants.UpperRoman ,StringComparison.InvariantCultureIgnoreCase) ) + { + return ConvertToRomanNumbers(number, false); + } + else if( style.Equals(CssConstants.Armenian ,StringComparison.InvariantCultureIgnoreCase) ) + { + return ConvertToSpecificNumbers(number, _armenianDigitsTable); + } + else if( style.Equals(CssConstants.Georgian ,StringComparison.InvariantCultureIgnoreCase) ) + { + return ConvertToSpecificNumbers(number, _georgianDigitsTable); + } + else if( style.Equals(CssConstants.Hebrew ,StringComparison.InvariantCultureIgnoreCase) ) + { + return ConvertToSpecificNumbers(number, _hebrewDigitsTable); + } + else if( style.Equals(CssConstants.Hiragana,StringComparison.InvariantCultureIgnoreCase) || style.Equals(CssConstants.HiraganaIroha ,StringComparison.InvariantCultureIgnoreCase) ) + { + return ConvertToSpecificNumbers2(number, _hiraganaDigitsTable); + } + else if( style.Equals(CssConstants.Katakana,StringComparison.InvariantCultureIgnoreCase) || style.Equals(CssConstants.KatakanaIroha ,StringComparison.InvariantCultureIgnoreCase) ) + { + return ConvertToSpecificNumbers2(number, _satakanaDigitsTable); + } + else + { + var lowercase = style.Equals(CssConstants.LowerAlpha, StringComparison.InvariantCultureIgnoreCase) || style.Equals(CssConstants.LowerLatin, StringComparison.InvariantCultureIgnoreCase); + return ConvertToEnglishNumber(number, lowercase); + } + } + + /// + /// Convert the given integer into alphabetic numeric format (D, AU, etc.) + /// + /// the number to convert + /// is to use lowercase + /// the roman number string + private static string ConvertToEnglishNumber(int number, bool lowercase) + { + var sb = string.Empty; + int alphStart = lowercase ? 97 : 65; + while (number > 0) + { + var n = number % 26 -1; + if (n >= 0) + { + sb = (Char) (alphStart + n) + sb; + number = number/26; + } + else + { + sb = (Char) (alphStart + 25) + sb; + number = (number - 1)/26; + } + } + + return sb; + } + + /// + /// Convert the given integer into alphabetic numeric format (alpha, AU, etc.) + /// + /// the number to convert + /// the roman number string + private static string ConvertToGreekNumber(int number) + { + var sb = string.Empty; + while (number > 0) + { + var n = number % 24 - 1; + if( n > 16 ) + n++; + if (n >= 0) + { + sb = (Char)(945 + n) + sb; + number = number / 24; + } + else + { + sb = (Char)(945 + 24) + sb; + number = (number - 1) / 25; + } + } + + return sb; + } + + /// + /// Convert the given integer into roman numeric format (II, VI, IX, etc.) + /// + /// the number to convert + /// if to use lowercase letters for roman digits + /// the roman number string + private static string ConvertToRomanNumbers(int number, bool lowercase) + { + var sb = string.Empty; + for(int i = 1000, j = 3; i > 0; i /= 10, j--) + { + int digit = number/i; + sb += string.Format(_romanDigitsTable[j, digit]); + number -= digit*i; + } + return lowercase ? sb.ToLower() : sb; + } + + /// + /// Convert the given integer into given alphabet numeric system. + /// + /// the number to convert + /// the alphabet system to use + /// the number string + private static string ConvertToSpecificNumbers(int number, string[,] alphabet) + { + int level = 0; + var sb = string.Empty; + while (number > 0 && level < alphabet.GetLength(0)) + { + var n = number % 10; + if(n > 0) + sb = alphabet[level, number % 10 - 1].ToString(CultureInfo.InvariantCulture) + sb; + number /= 10; + level++; + } + return sb; + } + + /// + /// Convert the given integer into given alphabet numeric system. + /// + /// the number to convert + /// the alphabet system to use + /// the number string + private static string ConvertToSpecificNumbers2(int number, string[] alphabet) + { + for (int i = 20; i > 0; i--) + { + if (number > 49 * i - i + 1) + number++; + } + + var sb = string.Empty; + while (number > 0) + { + + + sb = alphabet[Math.Max(0, number % 49 - 1)].ToString(CultureInfo.InvariantCulture) + sb; + number /= 49; + } + return sb; + } + } +} From 7000806b21e0053a388ee118f58336a6e9454034 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Fri, 2 May 2014 18:27:47 +0300 Subject: [PATCH 054/254] fix unicode clipboard handling for clr 4.0 --- Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj | 6 ++++-- Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj index 8504c8663..9f081d4a4 100644 --- a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -10,7 +10,7 @@ Properties HtmlRenderer.Demo.WinForms HtmlRendererWinFormsDemo - v3.0 + v2.0 @@ -44,6 +44,7 @@ 4 AllRules.ruleset x86 + false pdbonly @@ -54,6 +55,7 @@ 4 AllRules.ruleset x86 + false html.ico diff --git a/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs b/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs index af2d297b5..136462936 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs @@ -91,8 +91,8 @@ public static DataObject CreateDataObject(string html, string plainText) html = html ?? String.Empty; var htmlFragment = GetHtmlDataString(html); - // re-encode the string so it will work correctly - if (html.Length != Encoding.UTF8.GetByteCount(html)) + // re-encode the string so it will work correctly (fixed in CLR 4.0) + if (Environment.Version.Major < 4 && html.Length != Encoding.UTF8.GetByteCount(html)) htmlFragment = Encoding.Default.GetString(Encoding.UTF8.GetBytes(htmlFragment)); var dataObject = new DataObject(); From 65cd109a0f89243d5f9271cc242c69f5dba00cfe Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Fri, 2 May 2014 18:41:15 +0300 Subject: [PATCH 055/254] refactor --- Source/HtmlRenderer/Core/Dom/CssBox.cs | 90 +++++++++++++------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/Source/HtmlRenderer/Core/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs index 7644e26da..c740e06d2 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -104,7 +104,7 @@ public CssBox(CssBox parentBox, HtmlTag tag) ///
public HtmlContainerInt HtmlContainer { - get { return _htmlContainer ?? ( _htmlContainer = _parentBox != null ? _parentBox.HtmlContainer : null ); } + get { return _htmlContainer ?? (_htmlContainer = _parentBox != null ? _parentBox.HtmlContainer : null); } set { _htmlContainer = value; } } @@ -117,13 +117,13 @@ public CssBox ParentBox set { //Remove from last parent - if( _parentBox != null ) + if (_parentBox != null) _parentBox.Boxes.Remove(this); _parentBox = value; //Add to new parent - if( value != null ) + if (value != null) _parentBox.Boxes.Add(this); } } @@ -190,10 +190,10 @@ public CssBox ContainingBlock var box = ParentBox; while (!box.IsBlock && - box.Display != CssConstants.ListItem && - box.Display != CssConstants.Table && - box.Display != CssConstants.TableCell && - box.ParentBox != null) + box.Display != CssConstants.ListItem && + box.Display != CssConstants.Table && + box.Display != CssConstants.TableCell && + box.ParentBox != null) { box = box.ParentBox; } @@ -476,7 +476,7 @@ public void SetBeforeBox(CssBox before) /// the box to move all its child boxes from public void SetAllBoxes(CssBox fromBox) { - foreach(var childBox in fromBox._boxes) + foreach (var childBox in fromBox._boxes) childBox._parentBox = this; _boxes.AddRange(fromBox._boxes); @@ -518,10 +518,10 @@ public void ParseToWords() if (endIdx < _text.Length && (_text[endIdx] == '-' || WordBreak == CssConstants.BreakAll || CommonUtils.IsAsianCharecter(_text[endIdx]))) endIdx++; - if( endIdx > startIdx ) + if (endIdx > startIdx) { - var hasSpaceBefore = !preserveSpaces && ( startIdx > 0 && _boxWords.Count == 0 && char.IsWhiteSpace(_text[startIdx - 1]) ); - var hasSpaceAfter = !preserveSpaces && ( endIdx < _text.Length && char.IsWhiteSpace(_text[endIdx]) ); + var hasSpaceBefore = !preserveSpaces && (startIdx > 0 && _boxWords.Count == 0 && char.IsWhiteSpace(_text[startIdx - 1])); + var hasSpaceAfter = !preserveSpaces && (endIdx < _text.Length && char.IsWhiteSpace(_text[endIdx])); _boxWords.Add(new CssRectWord(this, HtmlUtils.DecodeHtml(_text.Substring(startIdx, endIdx - startIdx)), hasSpaceBefore, hasSpaceAfter)); } } @@ -563,22 +563,22 @@ public virtual void Dispose() /// Device context to use protected virtual void PerformLayoutImp(IGraphics g) { - if( Display != CssConstants.None ) + if (Display != CssConstants.None) { RectanglesReset(); MeasureWordsSize(g); } - if( IsBlock || Display == CssConstants.ListItem || Display == CssConstants.Table || Display == CssConstants.InlineTable || Display == CssConstants.TableCell ) + if (IsBlock || Display == CssConstants.ListItem || Display == CssConstants.Table || Display == CssConstants.InlineTable || Display == CssConstants.TableCell) { // Because their width and height are set by CssTable - if( Display != CssConstants.TableCell && Display != CssConstants.Table ) + if (Display != CssConstants.TableCell && Display != CssConstants.Table) { double width = ContainingBlock.Size.Width - - ContainingBlock.ActualPaddingLeft - ContainingBlock.ActualPaddingRight - - ContainingBlock.ActualBorderLeftWidth - ContainingBlock.ActualBorderRightWidth; + - ContainingBlock.ActualPaddingLeft - ContainingBlock.ActualPaddingRight + - ContainingBlock.ActualBorderLeftWidth - ContainingBlock.ActualBorderRightWidth; - if( Width != CssConstants.Auto && !string.IsNullOrEmpty(Width) ) + if (Width != CssConstants.Auto && !string.IsNullOrEmpty(Width)) { width = CssValueParser.ParseLength(Width, width, this); } @@ -589,31 +589,31 @@ protected virtual void PerformLayoutImp(IGraphics g) Size = new RSize(width - ActualMarginLeft - ActualMarginRight, Size.Height); } - if( Display != CssConstants.TableCell ) + if (Display != CssConstants.TableCell) { var prevSibling = DomUtils.GetPreviousSibling(this); double left = ContainingBlock.Location.X + ContainingBlock.ActualPaddingLeft + ActualMarginLeft + ContainingBlock.ActualBorderLeftWidth; - double top = ( prevSibling == null && ParentBox != null ? ParentBox.ClientTop : ParentBox == null ? Location.Y : 0 ) + MarginTopCollapse(prevSibling) + ( prevSibling != null ? prevSibling.ActualBottom + prevSibling.ActualBorderBottomWidth : 0 ); + double top = (prevSibling == null && ParentBox != null ? ParentBox.ClientTop : ParentBox == null ? Location.Y : 0) + MarginTopCollapse(prevSibling) + (prevSibling != null ? prevSibling.ActualBottom + prevSibling.ActualBorderBottomWidth : 0); Location = new RPoint(left, top); ActualBottom = top; } //If we're talking about a table here.. - if( Display == CssConstants.Table || Display == CssConstants.InlineTable ) + if (Display == CssConstants.Table || Display == CssConstants.InlineTable) { CssLayoutEngineTable.PerformLayout(g, this); } else { //If there's just inline boxes, create LineBoxes - if( DomUtils.ContainsInlinesOnly(this) ) + if (DomUtils.ContainsInlinesOnly(this)) { ActualBottom = Location.Y; CssLayoutEngine.CreateLineBoxes(g, this); //This will automatically set the bottom of this block } - else if( _boxes.Count > 0 ) + else if (_boxes.Count > 0) { - foreach(var childBox in Boxes) + foreach (var childBox in Boxes) { childBox.PerformLayout(g); } @@ -625,15 +625,15 @@ protected virtual void PerformLayoutImp(IGraphics g) else { var prevSibling = DomUtils.GetPreviousSibling(this); - if( prevSibling != null ) + if (prevSibling != null) { - if( Location == RPoint.Empty ) + if (Location == RPoint.Empty) Location = prevSibling.Location; ActualBottom = prevSibling.ActualBottom; } } ActualBottom = Math.Max(ActualBottom, Location.Y + ActualHeight); - + CreateListItemBox(g); var actualWidth = Math.Max(GetMinimumWidth() + GetWidthMarginDeep(this), Size.Width < 90999 ? ActualRight : 0); @@ -673,7 +673,7 @@ internal virtual void MeasureWordsSize(IGraphics g) /// Get the parent of this css properties instance. ///
/// - protected sealed override CssBoxProperties GetParent() + protected override sealed CssBoxProperties GetParent() { return _parentBox; } @@ -761,7 +761,7 @@ private void CreateListItemBox(IGraphics g) _listItemBox.Size = new RSize(_listItemBox.Words[0].Width, _listItemBox.Words[0].Height); } _listItemBox.Words[0].Left = Location.X - _listItemBox.Size.Width - 5; - _listItemBox.Words[0].Top = Location.Y + ActualPaddingTop;// +FontAscent; + _listItemBox.Words[0].Top = Location.Y + ActualPaddingTop; // +FontAscent; } } @@ -948,7 +948,7 @@ internal void GetMinMaxWidth(out double minWidth, out double maxWidth) private static void GetMinMaxSumWords(CssBox box, ref double min, ref double maxSum, ref double paddingSum, ref double marginSum) { double? oldSum = null; - + // not inline (block) boxes start a new line so we need to reset the max sum if (box.Display != CssConstants.Inline && box.Display != CssConstants.TableCell && box.WhiteSpace != CssConstants.NoWrap) { @@ -961,7 +961,7 @@ private static void GetMinMaxSumWords(CssBox box, ref double min, ref double max // for tables the padding also contains the spacing between cells - if( box.Display == CssConstants.Table ) + if (box.Display == CssConstants.Table) paddingSum += CssLayoutEngineTable.GetTableSpacing(box); if (box.Words.Count > 0) @@ -972,9 +972,9 @@ private static void GetMinMaxSumWords(CssBox box, ref double min, ref double max maxSum += word.FullWidth; min = Math.Max(min, word.Width); } - + // remove the last word padding - if( box.Words.Count > 0 ) + if (box.Words.Count > 0) maxSum -= box.Words[box.Words.Count - 1].ActualWordSpacing; } else @@ -986,7 +986,7 @@ private static void GetMinMaxSumWords(CssBox box, ref double min, ref double max //maxSum += childBox.ActualMarginLeft + childBox.ActualMarginRight; GetMinMaxSumWords(childBox, ref min, ref maxSum, ref paddingSum, ref marginSum); - + marginSum -= childBox.ActualMarginLeft + childBox.ActualMarginRight; } } @@ -1015,7 +1015,6 @@ internal bool HasJustInlineSiblings() /// Inline boxes can be split across different LineBoxes, that's why this method /// Delivers a rectangle for each LineBox related to this box, if inline. /// - /// /// Inherits inheritable values from parent. /// @@ -1228,7 +1227,8 @@ protected void PaintBackground(IGraphics g, RRect rect, bool isFirst, bool isLas g.ReturnPreviousSmoothingMode(prevMode); - if (roundrect != null) roundrect.Dispose(); + if (roundrect != null) + roundrect.Dispose(); brush.Dispose(); } @@ -1246,30 +1246,30 @@ protected void PaintBackground(IGraphics g, RRect rect, bool isFirst, bool isLas /// the current scroll offset to offset the words private void PaintWords(IGraphics g, RPoint offset) { - if( Width.Length > 0 ) + if (Width.Length > 0) { var isRtl = Direction == CssConstants.Rtl; - foreach(var word in Words) + foreach (var word in Words) { var wordPoint = new RPoint(word.Left + offset.X, word.Top + offset.Y); - if( word.Selected ) + if (word.Selected) { // handle paint selected word background and with partial word selection var wordLine = DomUtils.GetCssLineBoxByWord(word); - var left = word.SelectedStartOffset > -1 ? word.SelectedStartOffset : ( wordLine.Words[0] != word && word.HasSpaceBefore ? -ActualWordSpacing : 0 ); + var left = word.SelectedStartOffset > -1 ? word.SelectedStartOffset : (wordLine.Words[0] != word && word.HasSpaceBefore ? -ActualWordSpacing : 0); var padWordRight = word.HasSpaceAfter && !wordLine.IsLastSelectedWord(word); - var width = word.SelectedEndOffset > -1 ? word.SelectedEndOffset : word.Width + ( padWordRight ? ActualWordSpacing : 0 ); + var width = word.SelectedEndOffset > -1 ? word.SelectedEndOffset : word.Width + (padWordRight ? ActualWordSpacing : 0); var rect = new RRect(word.Left + offset.X + left, word.Top + offset.Y, width - left, wordLine.LineHeight); g.DrawRectangle(GetSelectionBackBrush(g, false), rect.X, rect.Y, rect.Width, rect.Height); - if( HtmlContainer.SelectionForeColor != RColor.Empty && ( word.SelectedStartOffset > 0 || word.SelectedEndIndexOffset > -1 ) ) + if (HtmlContainer.SelectionForeColor != RColor.Empty && (word.SelectedStartOffset > 0 || word.SelectedEndIndexOffset > -1)) { var orgClip = g.GetClip(); g.SetClipExclude(rect); - g.DrawString(word.Text, ActualFont, ActualColor, wordPoint, new RSize(word.Width, word.Height),isRtl); + g.DrawString(word.Text, ActualFont, ActualColor, wordPoint, new RSize(word.Width, word.Height), isRtl); g.SetClipReplace(rect); - g.DrawString(word.Text, ActualFont, GetSelectionForeBrush(), wordPoint, new RSize(word.Width, word.Height),isRtl); + g.DrawString(word.Text, ActualFont, GetSelectionForeBrush(), wordPoint, new RSize(word.Width, word.Height), isRtl); g.SetClipReplace(orgClip); } else @@ -1280,7 +1280,7 @@ private void PaintWords(IGraphics g, RPoint offset) else { //g.DrawRectangle(Pens.Red, wordPoint.X, wordPoint.Y, word.Width - 1, word.Height - 1); - g.DrawString(word.Text, ActualFont, ActualColor, wordPoint, new RSize(word.Width, word.Height),isRtl); + g.DrawString(word.Text, ActualFont, ActualColor, wordPoint, new RSize(word.Width, word.Height), isRtl); } } } @@ -1394,7 +1394,7 @@ protected IBrush GetSelectionBackBrush(IGraphics g, bool forceAlpha) protected override IFont GetCachedFont(string fontFamily, double fsize, RFontStyle st) { return HtmlContainer.Global.GetFont(fontFamily, fsize, st); - } + } protected override RColor GetActualColor(string colorStr) { From 70ae4bb1443be462e47cca8e6bd7b5ccb3733e8d Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Fri, 2 May 2014 18:52:11 +0300 Subject: [PATCH 056/254] refactor --- .../Adapters/BrushAdapter.cs | 2 +- .../Adapters/ContextMenuAdapter.cs | 2 +- .../Adapters/ControlAdapter.cs | 4 +- .../Adapters/FontAdapter.cs | 4 +- .../Adapters/GlobalAdapter.cs | 4 +- .../Adapters/PenAdapter.cs | 4 +- Source/HtmlRenderer.WinForms/HtmlContainer.cs | 2 +- Source/HtmlRenderer.WinForms/HtmlLabel.cs | 64 ++-- Source/HtmlRenderer.WinForms/HtmlPanel.cs | 30 +- Source/HtmlRenderer.WinForms/HtmlRender.cs | 62 +-- Source/HtmlRenderer.WinForms/HtmlToolTip.cs | 22 +- .../Utilities/CacheUtils.cs | 10 +- .../Utilities/ClipboardHelper.cs | 2 +- .../Utilities/Win32Utils.cs | 6 +- Source/HtmlRenderer/Core/CssData.cs | 14 +- Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs | 52 +-- Source/HtmlRenderer/Core/Dom/CssBoxHr.cs | 6 +- Source/HtmlRenderer/Core/Dom/CssBoxImage.cs | 12 +- .../HtmlRenderer/Core/Dom/CssBoxProperties.cs | 12 +- .../HtmlRenderer/Core/Dom/CssLayoutEngine.cs | 30 +- .../Core/Dom/CssLayoutEngineTable.cs | 24 +- Source/HtmlRenderer/Core/Dom/CssLength.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssLineBox.cs | 14 +- Source/HtmlRenderer/Core/Dom/CssRect.cs | 6 +- Source/HtmlRenderer/Core/Dom/CssRectImage.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssRectWord.cs | 8 +- Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs | 2 +- Source/HtmlRenderer/Core/Dom/HtmlTag.cs | 2 +- Source/HtmlRenderer/Core/Entities/Border.cs | 6 +- .../Core/Entities/CssConstants.cs | 2 +- .../Core/Entities/HtmlConstants.cs | 354 +++++++++--------- .../Handlers/BackgroundImageDrawHandler.cs | 10 +- .../Core/Handlers/BordersDrawHandler.cs | 26 +- .../Core/Handlers/ContextMenuHandler.cs | 28 +- .../HtmlRenderer/Core/Handlers/FontHandler.cs | 20 +- .../Core/Handlers/SelectionHandler.cs | 4 +- .../Core/Handlers/StylesheetLoadHandler.cs | 4 +- Source/HtmlRenderer/Core/HtmlContainerInt.cs | 16 +- Source/HtmlRenderer/Core/HtmlRendererUtils.cs | 8 +- Source/HtmlRenderer/Core/Parse/CssParser.cs | 26 +- .../HtmlRenderer/Core/Parse/CssValueParser.cs | 22 +- Source/HtmlRenderer/Core/Parse/DomParser.cs | 26 +- Source/HtmlRenderer/Core/Parse/HtmlParser.cs | 16 +- Source/HtmlRenderer/Core/Utils/CommonUtils.cs | 56 +-- Source/HtmlRenderer/Core/Utils/CssUtils.cs | 2 +- Source/HtmlRenderer/Core/Utils/DomUtils.cs | 62 +-- Source/HtmlRenderer/Core/Utils/HtmlUtils.cs | 16 +- Source/HtmlRenderer/Core/Utils/RenderUtils.cs | 10 +- Source/HtmlRenderer/Core/Utils/SubString.cs | 6 +- Source/HtmlRenderer/Entities/CssBlock.cs | 24 +- .../Entities/HtmlImageLoadEventArgs.cs | 6 +- .../Entities/HtmlLinkClickedException.cs | 6 +- Source/HtmlRenderer/Entities/RColor.cs | 12 +- Source/HtmlRenderer/Entities/RPoint.cs | 12 +- Source/HtmlRenderer/Entities/RRect.cs | 22 +- Source/HtmlRenderer/Entities/RSize.cs | 10 +- Source/HtmlRenderer/Interfaces/GlobalBase.cs | 14 +- 57 files changed, 622 insertions(+), 612 deletions(-) diff --git a/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs index 3eff2e442..828b195cb 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs @@ -53,7 +53,7 @@ public Brush Brush ///
public void Dispose() { - if( _dispose ) + if (_dispose) { _brush.Dispose(); } diff --git a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs index 283a582ec..15b10ac0b 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs @@ -91,7 +91,7 @@ public void RemoveLastDivider() /// the location to show at relative to the parent control public void Show(IControl parent, RPoint location) { - _contextMenu.Show(( (ControlAdapter)parent ).Control, Utils.ConvertRound(location)); + _contextMenu.Show(((ControlAdapter)parent).Control, Utils.ConvertRound(location)); } /// diff --git a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs index 500cbbedb..de1237770 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs @@ -89,7 +89,7 @@ public void SetCursorDefault() /// public void SetCursorHand() { - _control.Cursor = Cursors.Hand; + _control.Cursor = Cursors.Hand; } /// @@ -97,7 +97,7 @@ public void SetCursorHand() /// public void SetCursorIBeam() { - _control.Cursor = Cursors.IBeam; + _control.Cursor = Cursors.IBeam; } /// diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs index ce05f33f8..97503bcb6 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs @@ -75,7 +75,7 @@ public IntPtr HFont { get { - if( _hFont == IntPtr.Zero ) + if (_hFont == IntPtr.Zero) _hFont = _font.ToHfont(); return _hFont; } @@ -124,7 +124,7 @@ public double LeftPadding public double GetWhitespaceWidth(IGraphics graphics) { - if( _whitespaceWidth < 0 ) + if (_whitespaceWidth < 0) { _whitespaceWidth = graphics.MeasureString(" ", this).Width; } diff --git a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs index e8d41c40a..f3e232625 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs @@ -139,7 +139,7 @@ public override void SaveToFile(IImage image, string name, string extension, ICo saveDialog.FileName = name; saveDialog.DefaultExt = extension; - var dialogResult = control == null ? saveDialog.ShowDialog() : saveDialog.ShowDialog(( (ControlAdapter)control ).Control); + var dialogResult = control == null ? saveDialog.ShowDialog() : saveDialog.ShowDialog(((ControlAdapter)control).Control); if (dialogResult == DialogResult.OK) { ((ImageAdapter)image).Image.Save(saveDialog.FileName); @@ -171,7 +171,7 @@ protected internal override IFont CreateFont(string family, double size, RFontSt protected internal override IFont CreateFont(IFontFamily family, double size, RFontStyle style) { var fontStyle = (FontStyle)((int)style); - return new FontAdapter(new Font(( (FontFamilyAdapter)family ).FontFamily, (float)size, fontStyle)); + return new FontAdapter(new Font(((FontFamilyAdapter)family).FontFamily, (float)size, fontStyle)); } } } diff --git a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs index 085889e5a..f6a981565 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs @@ -58,7 +58,7 @@ public RDashStyle DashStyle { set { - switch( value ) + switch (value) { case RDashStyle.Solid: _pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; @@ -84,7 +84,7 @@ public RDashStyle DashStyle } } } - + /// /// Gets or sets an array of custom dashes and spaces. /// diff --git a/Source/HtmlRenderer.WinForms/HtmlContainer.cs b/Source/HtmlRenderer.WinForms/HtmlContainer.cs index 43aaff048..975d83d36 100644 --- a/Source/HtmlRenderer.WinForms/HtmlContainer.cs +++ b/Source/HtmlRenderer.WinForms/HtmlContainer.cs @@ -348,7 +348,7 @@ public void PerformLayout(Graphics g) { ArgChecker.AssertArgNotNull(g, "g"); - using(var ig = new GraphicsAdapter(g,_useGdiPlusTextRendering)) + using (var ig = new GraphicsAdapter(g, _useGdiPlusTextRendering)) { _htmlContainerInt.PerformLayout(ig); } diff --git a/Source/HtmlRenderer.WinForms/HtmlLabel.cs b/Source/HtmlRenderer.WinForms/HtmlLabel.cs index 8468c07d3..517517ad4 100644 --- a/Source/HtmlRenderer.WinForms/HtmlLabel.cs +++ b/Source/HtmlRenderer.WinForms/HtmlLabel.cs @@ -108,14 +108,14 @@ public class HtmlLabel : Control #endregion - + /// /// Creates a new HTML Label /// public HtmlLabel() { SuspendLayout(); - + AutoSize = true; BackColor = SystemColors.Window; DoubleBuffered = true; @@ -224,7 +224,7 @@ public virtual BorderStyle BorderStyle get { return _borderStyle; } set { - if( BorderStyle != value ) + if (BorderStyle != value) { _borderStyle = value; OnBorderStyleChanged(EventArgs.Empty); @@ -294,7 +294,7 @@ public override bool AutoSize set { base.AutoSize = value; - if( value ) + if (value) { _autoSizeHight = false; PerformLayout(); @@ -316,7 +316,7 @@ public virtual bool AutoSizeHeightOnly set { _autoSizeHight = value; - if( value ) + if (value) { AutoSize = false; PerformLayout(); @@ -336,7 +336,7 @@ public override Size MaximumSize set { base.MaximumSize = value; - if( _htmlContainer != null ) + if (_htmlContainer != null) { _htmlContainer.MaxSize = value; PerformLayout(); @@ -367,7 +367,7 @@ public override string Text { _text = value; base.Text = value; - if( !IsDisposed ) + if (!IsDisposed) { _htmlContainer.SetHtml(_text, _baseCssData); PerformLayout(); @@ -427,7 +427,7 @@ protected override CreateParams CreateParams { CreateParams createParams = base.CreateParams; - switch( _borderStyle ) + switch (_borderStyle) { case BorderStyle.FixedSingle: createParams.Style |= Win32Utils.WsBorder; @@ -447,10 +447,10 @@ protected override CreateParams CreateParams /// protected override void OnLayout(LayoutEventArgs levent) { - if( _htmlContainer != null ) + if (_htmlContainer != null) { using (Graphics g = CreateGraphics()) - using(var ig = new GraphicsAdapter(g,_htmlContainer.UseGdiPlusTextRendering)) + using (var ig = new GraphicsAdapter(g, _htmlContainer.UseGdiPlusTextRendering)) { var newSize = HtmlRendererUtils.Layout(ig, _htmlContainer.HtmlContainerInt, Utils.Convert(ClientSize), Utils.Convert(MinimumSize), Utils.Convert(MaximumSize), AutoSize, AutoSizeHeightOnly); ClientSize = Utils.ConvertRound(newSize); @@ -466,7 +466,7 @@ protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); - if( _htmlContainer != null ) + if (_htmlContainer != null) { _htmlContainer.PerformPaint(e.Graphics); } @@ -478,7 +478,7 @@ protected override void OnPaint(PaintEventArgs e) protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); - if( _htmlContainer != null ) + if (_htmlContainer != null) _htmlContainer.HandleMouseMove(this, e); } @@ -488,7 +488,7 @@ protected override void OnMouseMove(MouseEventArgs e) protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); - if( _htmlContainer != null ) + if (_htmlContainer != null) _htmlContainer.HandleMouseDown(this, e); } @@ -498,7 +498,7 @@ protected override void OnMouseDown(MouseEventArgs e) protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); - if( _htmlContainer != null ) + if (_htmlContainer != null) _htmlContainer.HandleMouseLeave(this); } @@ -508,7 +508,7 @@ protected override void OnMouseLeave(EventArgs e) protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseClick(e); - if( _htmlContainer != null ) + if (_htmlContainer != null) _htmlContainer.HandleMouseUp(this, e); } @@ -518,7 +518,7 @@ protected override void OnMouseUp(MouseEventArgs e) protected override void OnMouseDoubleClick(MouseEventArgs e) { base.OnMouseDoubleClick(e); - if( _htmlContainer != null ) + if (_htmlContainer != null) _htmlContainer.HandleMouseDoubleClick(this, e); } @@ -530,7 +530,7 @@ protected virtual void OnBorderStyleChanged(EventArgs e) UpdateStyles(); var handler = BorderStyleChanged; - if( handler != null ) + if (handler != null) handler(this, e); } @@ -540,7 +540,7 @@ protected virtual void OnBorderStyleChanged(EventArgs e) protected virtual void OnLinkClicked(HtmlLinkClickedEventArgs e) { var handler = LinkClicked; - if( handler != null ) + if (handler != null) handler(this, e); } @@ -550,9 +550,9 @@ protected virtual void OnLinkClicked(HtmlLinkClickedEventArgs e) protected virtual void OnRenderError(HtmlRenderErrorEventArgs e) { var handler = RenderError; - if( handler != null ) - handler(this, e); - } + if (handler != null) + handler(this, e); + } /// /// Propagate the stylesheet load event from root container. @@ -560,7 +560,7 @@ protected virtual void OnRenderError(HtmlRenderErrorEventArgs e) protected virtual void OnStylesheetLoad(HtmlStylesheetLoadEventArgs e) { var handler = StylesheetLoad; - if( handler != null ) + if (handler != null) handler(this, e); } @@ -570,7 +570,7 @@ protected virtual void OnStylesheetLoad(HtmlStylesheetLoadEventArgs e) protected virtual void OnImageLoad(HtmlImageLoadEventArgs e) { var handler = ImageLoad; - if( handler != null ) + if (handler != null) handler(this, e); } @@ -578,10 +578,10 @@ protected virtual void OnImageLoad(HtmlImageLoadEventArgs e) /// Handle html renderer invalidate and re-layout as requested. /// protected virtual void OnRefresh(HtmlRefreshEventArgs e) - { - if( e.Layout ) - PerformLayout(); - Invalidate(); + { + if (e.Layout) + PerformLayout(); + Invalidate(); } /// @@ -591,7 +591,7 @@ protected virtual void OnRefresh(HtmlRefreshEventArgs e) [DebuggerStepThrough] protected override void WndProc(ref Message m) { - if( _useSystemCursors && m.Msg == Win32Utils.WmSetCursor && Cursor == Cursors.Hand ) + if (_useSystemCursors && m.Msg == Win32Utils.WmSetCursor && Cursor == Cursors.Hand) { try { @@ -600,7 +600,7 @@ protected override void WndProc(ref Message m) m.Result = IntPtr.Zero; return; } - catch(Exception ex) + catch (Exception ex) { OnRenderError(this, new HtmlRenderErrorEventArgs(HtmlRenderErrorType.General, "Failed to set OS hand cursor", ex)); } @@ -613,7 +613,7 @@ protected override void WndProc(ref Message m) /// protected override void Dispose(bool disposing) { - if( _htmlContainer != null ) + if (_htmlContainer != null) { _htmlContainer.LinkClicked -= OnLinkClicked; _htmlContainer.RenderError -= OnRenderError; @@ -636,7 +636,7 @@ private void OnLinkClicked(object sender, HtmlLinkClickedEventArgs e) private void OnRenderError(object sender, HtmlRenderErrorEventArgs e) { - if( InvokeRequired ) + if (InvokeRequired) Invoke(new MethodInvoker(() => OnRenderError(e))); else OnRenderError(e); @@ -654,7 +654,7 @@ private void OnImageLoad(object sender, HtmlImageLoadEventArgs e) private void OnRefresh(object sender, HtmlRefreshEventArgs e) { - if( InvokeRequired ) + if (InvokeRequired) Invoke(new MethodInvoker(() => OnRefresh(e))); else OnRefresh(e); diff --git a/Source/HtmlRenderer.WinForms/HtmlPanel.cs b/Source/HtmlRenderer.WinForms/HtmlPanel.cs index 45d88b4dc..3652cfdc5 100644 --- a/Source/HtmlRenderer.WinForms/HtmlPanel.cs +++ b/Source/HtmlRenderer.WinForms/HtmlPanel.cs @@ -228,7 +228,7 @@ public virtual BorderStyle BorderStyle get { return _borderStyle; } set { - if( BorderStyle != value ) + if (BorderStyle != value) { _borderStyle = value; OnBorderStyleChanged(EventArgs.Empty); @@ -291,8 +291,8 @@ public virtual string BaseStylesheet [Description("Sets a value indicating whether the container enables the user to scroll to any controls placed outside of its visible boundaries.")] public override bool AutoScroll { - get{return base.AutoScroll;} - set{base.AutoScroll = value;} + get { return base.AutoScroll; } + set { base.AutoScroll = value; } } /// @@ -366,7 +366,7 @@ public virtual void ScrollToElement(string elementId) { ArgChecker.AssertArgNotNullOrEmpty(elementId, "elementId"); - if( _htmlContainer != null ) + if (_htmlContainer != null) { var rect = _htmlContainer.GetElementRectangle(elementId); if (rect.HasValue) @@ -472,7 +472,7 @@ protected override void OnClick(EventArgs e) protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); - if( _htmlContainer != null ) + if (_htmlContainer != null) _htmlContainer.HandleMouseMove(this, e); } @@ -527,7 +527,7 @@ protected override void OnKeyDown(KeyEventArgs e) if (e.KeyCode == Keys.Up) { VerticalScroll.Value = Math.Max(VerticalScroll.Value - 70, VerticalScroll.Minimum); - PerformLayout(); + PerformLayout(); } else if (e.KeyCode == Keys.Down) { @@ -587,8 +587,8 @@ protected virtual void OnRenderError(HtmlRenderErrorEventArgs e) { var handler = RenderError; if (handler != null) - handler(this, e); - } + handler(this, e); + } /// /// Propagate the stylesheet load event from root container. @@ -614,12 +614,12 @@ protected virtual void OnImageLoad(HtmlImageLoadEventArgs e) /// Handle html renderer invalidate and re-layout as requested. /// protected virtual void OnRefresh(HtmlRefreshEventArgs e) - { + { if (e.Layout) - PerformLayout(); - Invalidate(); + PerformLayout(); + Invalidate(); } - + /// /// On html renderer scroll request adjust the scrolling of the panel to the requested location. /// @@ -688,7 +688,7 @@ protected override void WndProc(ref Message m) /// protected override void Dispose(bool disposing) { - if(_htmlContainer != null) + if (_htmlContainer != null) { _htmlContainer.LinkClicked -= OnLinkClicked; _htmlContainer.RenderError -= OnRenderError; @@ -712,7 +712,7 @@ private void OnLinkClicked(object sender, HtmlLinkClickedEventArgs e) private void OnRenderError(object sender, HtmlRenderErrorEventArgs e) { - if( InvokeRequired ) + if (InvokeRequired) Invoke(new MethodInvoker(() => OnRenderError(e))); else OnRenderError(e); @@ -730,7 +730,7 @@ private void OnImageLoad(object sender, HtmlImageLoadEventArgs e) private void OnRefresh(object sender, HtmlRefreshEventArgs e) { - if( InvokeRequired ) + if (InvokeRequired) Invoke(new MethodInvoker(() => OnRefresh(e))); else OnRefresh(e); diff --git a/Source/HtmlRenderer.WinForms/HtmlRender.cs b/Source/HtmlRenderer.WinForms/HtmlRender.cs index 1d50ef06d..db0857c07 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRender.cs +++ b/Source/HtmlRenderer.WinForms/HtmlRender.cs @@ -307,7 +307,7 @@ public static void RenderToImage(Image image, string html, PointF location, Size { ArgChecker.AssertArgNotNull(image, "image"); - if( !string.IsNullOrEmpty(html) ) + if (!string.IsNullOrEmpty(html)) { // create memory buffer from desktop handle that supports alpha channel IntPtr dib; @@ -315,7 +315,7 @@ public static void RenderToImage(Image image, string html, PointF location, Size try { // create memory buffer graphics to use for HTML rendering - using(var memoryGraphics = Graphics.FromHdc(memoryHdc)) + using (var memoryGraphics = Graphics.FromHdc(memoryHdc)) { // draw the image to the memory buffer to be the background of the rendered html memoryGraphics.DrawImageUnscaled(image, 0, 0); @@ -353,13 +353,13 @@ public static void RenderToImage(Image image, string html, PointF location, Size public static Image RenderToImage(string html, Size size, Color backgroundColor = new Color(), CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { - if( backgroundColor == Color.Transparent ) + if (backgroundColor == Color.Transparent) throw new ArgumentOutOfRangeException("backgroundColor", "Transparent background in not supported"); // create the final image to render into var image = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppArgb); - if( !string.IsNullOrEmpty(html) ) + if (!string.IsNullOrEmpty(html)) { // create memory buffer from desktop handle that supports alpha channel IntPtr dib; @@ -367,7 +367,7 @@ public static void RenderToImage(Image image, string html, PointF location, Size try { // create memory buffer graphics to use for HTML rendering - using(var memoryGraphics = Graphics.FromHdc(memoryHdc)) + using (var memoryGraphics = Graphics.FromHdc(memoryHdc)) { memoryGraphics.Clear(backgroundColor != Color.Empty ? backgroundColor : Color.White); @@ -437,20 +437,20 @@ public static void RenderToImage(Image image, string html, PointF location, Size public static Image RenderToImage(string html, Size minSize, Size maxSize, Color backgroundColor = new Color(), CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { - if( backgroundColor == Color.Transparent ) + if (backgroundColor == Color.Transparent) throw new ArgumentOutOfRangeException("backgroundColor", "Transparent background in not supported"); - if( string.IsNullOrEmpty(html) ) + if (string.IsNullOrEmpty(html)) return new Bitmap(0, 0, PixelFormat.Format32bppArgb); - using(var container = new HtmlContainer()) + using (var container = new HtmlContainer()) { container.AvoidAsyncImagesLoading = true; container.AvoidImagesLateLoading = true; - if( stylesheetLoad != null ) + if (stylesheetLoad != null) container.StylesheetLoad += stylesheetLoad; - if( imageLoad != null ) + if (imageLoad != null) container.ImageLoad += imageLoad; container.SetHtml(html, cssData); @@ -466,7 +466,7 @@ public static void RenderToImage(Image image, string html, PointF location, Size try { // render HTML into the memory buffer - using(var memoryGraphics = Graphics.FromHdc(memoryHdc)) + using (var memoryGraphics = Graphics.FromHdc(memoryHdc)) { memoryGraphics.Clear(backgroundColor != Color.Empty ? backgroundColor : Color.White); container.PerformPaint(memoryGraphics); @@ -503,7 +503,7 @@ public static Image RenderToImageGdiPlus(string html, Size size, TextRenderingHi { var image = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppArgb); - using(var g = Graphics.FromImage(image)) + using (var g = Graphics.FromImage(image)) { g.TextRenderingHint = textRenderingHint; RenderHtml(g, html, PointF.Empty, size, cssData, true, stylesheetLoad, imageLoad); @@ -558,18 +558,18 @@ public static Image RenderToImageGdiPlus(string html, int maxWidth = 0, int maxH public static Image RenderToImageGdiPlus(string html, Size minSize, Size maxSize, TextRenderingHint textRenderingHint = TextRenderingHint.AntiAlias, CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { - if( string.IsNullOrEmpty(html) ) + if (string.IsNullOrEmpty(html)) return new Bitmap(0, 0, PixelFormat.Format32bppArgb); - using(var container = new HtmlContainer()) + using (var container = new HtmlContainer()) { container.AvoidAsyncImagesLoading = true; container.AvoidImagesLateLoading = true; container.UseGdiPlusTextRendering = true; - - if( stylesheetLoad != null ) + + if (stylesheetLoad != null) container.StylesheetLoad += stylesheetLoad; - if( imageLoad != null ) + if (imageLoad != null) container.ImageLoad += imageLoad; container.SetHtml(html, cssData); @@ -580,7 +580,7 @@ public static Image RenderToImageGdiPlus(string html, Size minSize, Size maxSize var image = new Bitmap(finalSize.Width, finalSize.Height, PixelFormat.Format32bppArgb); // render HTML into the image - using(var g = Graphics.FromImage(image)) + using (var g = Graphics.FromImage(image)) { g.TextRenderingHint = textRenderingHint; container.PerformPaint(g); @@ -608,18 +608,18 @@ private static SizeF Measure(Graphics g, string html, float maxWidth, CssData cs EventHandler stylesheetLoad, EventHandler imageLoad) { SizeF actualSize = SizeF.Empty; - if( !string.IsNullOrEmpty(html) ) + if (!string.IsNullOrEmpty(html)) { - using(var container = new HtmlContainer()) + using (var container = new HtmlContainer()) { container.MaxSize = new SizeF(maxWidth, 0); container.AvoidAsyncImagesLoading = true; container.AvoidImagesLateLoading = true; container.UseGdiPlusTextRendering = useGdiPlusTextRendering; - if( stylesheetLoad != null ) + if (stylesheetLoad != null) container.StylesheetLoad += stylesheetLoad; - if( imageLoad != null ) + if (imageLoad != null) container.ImageLoad += imageLoad; container.SetHtml(html, cssData); @@ -641,8 +641,8 @@ private static SizeF Measure(Graphics g, string html, float maxWidth, CssData cs private static Size MeasureHtmlByRestrictions(HtmlContainer htmlContainer, Size minSize, Size maxSize) { // use desktop created graphics to measure the HTML - using(var g = Graphics.FromHwnd(IntPtr.Zero)) - using(var mg = new GraphicsAdapter(g, htmlContainer.UseGdiPlusTextRendering)) + using (var g = Graphics.FromHwnd(IntPtr.Zero)) + using (var mg = new GraphicsAdapter(g, htmlContainer.UseGdiPlusTextRendering)) { var sizeInt = HtmlRendererUtils.MeasureHtmlByRestrictions(mg, htmlContainer.HtmlContainerInt, Utils.Convert(minSize), Utils.Convert(maxSize)); return Utils.ConvertRound(sizeInt); @@ -670,7 +670,7 @@ private static Size MeasureHtmlByRestrictions(HtmlContainer htmlContainer, Size private static SizeF RenderClip(Graphics g, string html, PointF location, SizeF maxSize, CssData cssData, bool useGdiPlusTextRendering, EventHandler stylesheetLoad, EventHandler imageLoad) { Region prevClip = null; - if( maxSize.Height > 0 ) + if (maxSize.Height > 0) { prevClip = g.Clip; g.SetClip(new RectangleF(location, maxSize)); @@ -678,7 +678,7 @@ private static SizeF RenderClip(Graphics g, string html, PointF location, SizeF var actualSize = RenderHtml(g, html, location, maxSize, cssData, useGdiPlusTextRendering, stylesheetLoad, imageLoad); - if( prevClip != null ) + if (prevClip != null) { g.SetClip(prevClip, CombineMode.Replace); } @@ -707,9 +707,9 @@ private static SizeF RenderHtml(Graphics g, string html, PointF location, SizeF { SizeF actualSize = SizeF.Empty; - if( !string.IsNullOrEmpty(html) ) + if (!string.IsNullOrEmpty(html)) { - using(var container = new HtmlContainer()) + using (var container = new HtmlContainer()) { container.Location = location; container.MaxSize = maxSize; @@ -717,9 +717,9 @@ private static SizeF RenderHtml(Graphics g, string html, PointF location, SizeF container.AvoidImagesLateLoading = true; container.UseGdiPlusTextRendering = useGdiPlusTextRendering; - if( stylesheetLoad != null ) + if (stylesheetLoad != null) container.StylesheetLoad += stylesheetLoad; - if( imageLoad != null ) + if (imageLoad != null) container.ImageLoad += imageLoad; container.SetHtml(html, cssData); @@ -740,7 +740,7 @@ private static SizeF RenderHtml(Graphics g, string html, PointF location, SizeF /// the destination bitmap image to copy to private static void CopyBufferToImage(IntPtr memoryHdc, Image image) { - using(var imageGraphics = Graphics.FromImage(image)) + using (var imageGraphics = Graphics.FromImage(image)) { var imgHdc = imageGraphics.GetHdc(); Win32Utils.BitBlt(imgHdc, 0, 0, image.Width, image.Height, memoryHdc, 0, 0, Win32Utils.BitBltCopy); diff --git a/Source/HtmlRenderer.WinForms/HtmlToolTip.cs b/Source/HtmlRenderer.WinForms/HtmlToolTip.cs index 6fe6dce97..326a03a33 100644 --- a/Source/HtmlRenderer.WinForms/HtmlToolTip.cs +++ b/Source/HtmlRenderer.WinForms/HtmlToolTip.cs @@ -232,9 +232,9 @@ protected virtual void OnToolTipPopup(PopupEventArgs e) var desiredWidth = (int)Math.Ceiling(MaximumSize.Width > 0 ? Math.Min(_htmlContainer.ActualSize.Width, MaximumSize.Width) : _htmlContainer.ActualSize.Width); var desiredHeight = (int)Math.Ceiling(MaximumSize.Height > 0 ? Math.Min(_htmlContainer.ActualSize.Height, MaximumSize.Height) : _htmlContainer.ActualSize.Height); e.ToolTipSize = new Size(desiredWidth, desiredHeight); - + // start mouse handle timer - if( _allowLinksHandling ) + if (_allowLinksHandling) { _associatedControl = e.AssociatedControl; _linkHandlingTimer.Start(); @@ -246,7 +246,7 @@ protected virtual void OnToolTipPopup(PopupEventArgs e) ///
protected virtual void OnToolTipDraw(DrawToolTipEventArgs e) { - if(_tooltipHandle == IntPtr.Zero) + if (_tooltipHandle == IntPtr.Zero) { // get the handle of the tooltip window using the graphics device context var hdc = e.Graphics.GetHdc(); @@ -278,7 +278,7 @@ protected virtual void AdjustTooltipPosition(Control associatedControl, Size siz const int yOffset = 20; if (mousePos.Y + size.Height + yOffset > screenBounds.Bottom) mousePos.Y = Math.Max(screenBounds.Bottom - size.Height - yOffset - 3, screenBounds.Top + 2); - + // move the tooltip window to new location Win32Utils.MoveWindow(_tooltipHandle, mousePos.X, mousePos.Y + yOffset, size.Width, size.Height, false); } @@ -339,7 +339,7 @@ protected virtual void OnLinkHandlingTimerTick(EventArgs e) var mPos = Control.MousePosition; var mButtons = Control.MouseButtons; var rect = Win32Utils.GetWindowRectangle(handle); - if( rect.Contains(mPos) ) + if (rect.Contains(mPos)) { _htmlContainer.HandleMouseMove(_associatedControl, new MouseEventArgs(mButtons, 0, mPos.X - rect.X, mPos.Y - rect.Y, 0)); } @@ -352,9 +352,9 @@ protected virtual void OnLinkHandlingTimerTick(EventArgs e) var mPos = Control.MousePosition; var mButtons = Control.MouseButtons; var rect = Win32Utils.GetWindowRectangle(handle); - if( rect.Contains(mPos) ) + if (rect.Contains(mPos)) { - if( mButtons == MouseButtons.Left ) + if (mButtons == MouseButtons.Left) { var args = new MouseEventArgs(mButtons, 1, mPos.X - rect.X, mPos.Y - rect.Y, 0); _htmlContainer.HandleMouseDown(_associatedControl, args); @@ -363,9 +363,9 @@ protected virtual void OnLinkHandlingTimerTick(EventArgs e) } } } - catch(Exception ex) + catch (Exception ex) { - OnRenderError(this, new HtmlRenderErrorEventArgs(HtmlRenderErrorType.General, "Error in link handling for tooltip", ex)); + OnRenderError(this, new HtmlRenderErrorEventArgs(HtmlRenderErrorType.General, "Error in link handling for tooltip", ex)); } } @@ -378,7 +378,7 @@ protected virtual void OnToolTipDisposed(EventArgs e) Draw -= OnToolTipDraw; Disposed -= OnToolTipDisposed; - if(_htmlContainer != null) + if (_htmlContainer != null) { _htmlContainer.LinkClicked -= OnLinkClicked; _htmlContainer.RenderError -= OnRenderError; @@ -388,7 +388,7 @@ protected virtual void OnToolTipDisposed(EventArgs e) _htmlContainer = null; } - if( _linkHandlingTimer != null ) + if (_linkHandlingTimer != null) { _linkHandlingTimer.Dispose(); _linkHandlingTimer = null; diff --git a/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs b/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs index da7f2e7fd..6feaf7b6d 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs @@ -53,7 +53,7 @@ public static IPen GetPen(RColor color) } return pen; } - + /// /// Get cached solid brush instance for the given color. /// @@ -62,16 +62,16 @@ public static IPen GetPen(RColor color) public static IBrush GetSolidBrush(RColor color) { IBrush brush; - if( !_brushesCache.TryGetValue(color, out brush) ) + if (!_brushesCache.TryGetValue(color, out brush)) { Brush solidBrush; - if( color == RColor.White ) + if (color == RColor.White) solidBrush = Brushes.White; - else if( color == RColor.Black ) + else if (color == RColor.Black) solidBrush = Brushes.Black; else if (color == RColor.WhiteSmoke) solidBrush = Brushes.WhiteSmoke; - else if( color.A < 1 ) + else if (color.A < 1) solidBrush = Brushes.Transparent; else solidBrush = new SolidBrush(Utils.Convert(color)); diff --git a/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs b/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs index 136462936..82c218c60 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs @@ -90,7 +90,7 @@ public static DataObject CreateDataObject(string html, string plainText) { html = html ?? String.Empty; var htmlFragment = GetHtmlDataString(html); - + // re-encode the string so it will work correctly (fixed in CLR 4.0) if (Environment.Version.Major < 4 && html.Length != Encoding.UTF8.GetByteCount(html)) htmlFragment = Encoding.Default.GetString(Encoding.UTF8.GetBytes(htmlFragment)); diff --git a/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs b/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs index 85c65dd19..6ddd83f10 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs @@ -40,11 +40,11 @@ internal static class Win32Utils public const int IdcHand = 32649; public const int TextAlignDefault = 0; - + public const int TextAlignRtl = 256; - + public const int TextAlignBaseline = 24; - + public const int TextAlignBaselineRtl = 256 + 24; [DllImport("user32.dll")] diff --git a/Source/HtmlRenderer/Core/CssData.cs b/Source/HtmlRenderer/Core/CssData.cs index 04f7a1327..fb34f684c 100644 --- a/Source/HtmlRenderer/Core/CssData.cs +++ b/Source/HtmlRenderer/Core/CssData.cs @@ -125,7 +125,7 @@ public IEnumerable GetCssBlock(string className, string media = "all") public void AddCssBlock(string media, CssBlock cssBlock) { Dictionary> mid; - if(!_mediaBlocks.TryGetValue(media, out mid)) + if (!_mediaBlocks.TryGetValue(media, out mid)) { mid = new Dictionary>(StringComparer.InvariantCultureIgnoreCase); _mediaBlocks.Add(media, mid); @@ -143,7 +143,7 @@ public void AddCssBlock(string media, CssBlock cssBlock) var list = mid[cssBlock.Class]; foreach (var block in list) { - if(block.EqualsSelector(cssBlock)) + if (block.EqualsSelector(cssBlock)) { merged = true; block.Merge(cssBlock); @@ -151,12 +151,12 @@ public void AddCssBlock(string media, CssBlock cssBlock) } } - if(!merged) + if (!merged) { // general block must be first if (cssBlock.Selectors == null) list.Insert(0, cssBlock); - else + else list.Add(cssBlock); } } @@ -172,13 +172,13 @@ public void Combine(CssData other) ArgChecker.AssertArgNotNull(other, "other"); // for each media block - foreach(var mediaBlock in other.MediaBlocks) + foreach (var mediaBlock in other.MediaBlocks) { // for each css class in the media block - foreach(var bla in mediaBlock.Value) + foreach (var bla in mediaBlock.Value) { // for each css block of the css class - foreach(var cssBlock in bla.Value) + foreach (var cssBlock in bla.Value) { // combine with this AddCssBlock(mediaBlock.Key, cssBlock); diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs index c49081465..87254d279 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs @@ -143,22 +143,22 @@ public override void Dispose() private void LoadYoutubeDataAsync(Uri uri) { ThreadPool.QueueUserWorkItem(state => + { + try { - try - { - var apiUri = new Uri(string.Format("http://gdata.youtube.com/feeds/api/videos/{0}?v=2&alt=json", uri.Segments[2])); + var apiUri = new Uri(string.Format("http://gdata.youtube.com/feeds/api/videos/{0}?v=2&alt=json", uri.Segments[2])); - var client = new WebClient(); - client.Encoding = Encoding.UTF8; - client.DownloadStringCompleted += OnDownloadYoutubeApiCompleted; - client.DownloadStringAsync(apiUri); - } - catch (Exception ex) - { - HtmlContainer.ReportError(HtmlRenderErrorType.Iframe, "Failed to get youtube video data: " + uri, ex); - HtmlContainer.RequestRefresh(false); - } - }); + var client = new WebClient(); + client.Encoding = Encoding.UTF8; + client.DownloadStringCompleted += OnDownloadYoutubeApiCompleted; + client.DownloadStringAsync(apiUri); + } + catch (Exception ex) + { + HtmlContainer.ReportError(HtmlRenderErrorType.Iframe, "Failed to get youtube video data: " + uri, ex); + HtmlContainer.RequestRefresh(false); + } + }); } /// @@ -198,30 +198,38 @@ private void OnDownloadYoutubeApiCompleted(object sender, DownloadStringComplete var iidx = e.Result.IndexOf("sddefault", idx); if (iidx > -1) { - if (string.IsNullOrEmpty(Width)) Width = "640px"; - if (string.IsNullOrEmpty(Height)) Height = "480px"; + if (string.IsNullOrEmpty(Width)) + Width = "640px"; + if (string.IsNullOrEmpty(Height)) + Height = "480px"; } else { iidx = e.Result.IndexOf("hqdefault", idx); if (iidx > -1) { - if (string.IsNullOrEmpty(Width)) Width = "480px"; - if (string.IsNullOrEmpty(Height)) Height = "360px"; + if (string.IsNullOrEmpty(Width)) + Width = "480px"; + if (string.IsNullOrEmpty(Height)) + Height = "360px"; } else { iidx = e.Result.IndexOf("mqdefault", idx); if (iidx > -1) { - if (string.IsNullOrEmpty(Width)) Width = "320px"; - if (string.IsNullOrEmpty(Height)) Height = "180px"; + if (string.IsNullOrEmpty(Width)) + Width = "320px"; + if (string.IsNullOrEmpty(Height)) + Height = "180px"; } else { iidx = e.Result.IndexOf("default", idx); - if (string.IsNullOrEmpty(Width)) Width = "120px"; - if (string.IsNullOrEmpty(Height)) Height = "90px"; + if (string.IsNullOrEmpty(Width)) + Width = "120px"; + if (string.IsNullOrEmpty(Height)) + Height = "90px"; } } } diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs index 88283a66d..ba6c5406c 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs @@ -29,7 +29,7 @@ internal sealed class CssBoxHr : CssBox /// /// the parent box of this box /// the html tag data of this box - public CssBoxHr(CssBox parent, HtmlTag tag) + public CssBoxHr(CssBox parent, HtmlTag tag) : base(parent, tag) { Display = CssConstants.Block; @@ -70,7 +70,7 @@ protected override void PerformLayoutImp(IGraphics g) width = minwidth; double height = ActualHeight; - if(height < 1) + if (height < 1) { height = Size.Height + ActualBorderTopWidth + ActualBorderBottomWidth; } @@ -78,7 +78,7 @@ protected override void PerformLayoutImp(IGraphics g) { height = 2; } - if(height<=2 && ActualBorderTopWidth < 1 && ActualBorderBottomWidth < 1) + if (height <= 2 && ActualBorderTopWidth < 1 && ActualBorderBottomWidth < 1) { BorderTopStyle = BorderBottomStyle = CssConstants.Solid; BorderTopWidth = "1px"; diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs index b1ffbcff0..0ce5d9d56 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs @@ -49,7 +49,7 @@ internal sealed class CssBoxImage : CssBox ///
/// the parent box of this box /// the html tag data of this box - public CssBoxImage(CssBox parent, HtmlTag tag) + public CssBoxImage(CssBox parent, HtmlTag tag) : base(parent, tag) { _imageWord = new CssRectImage(this); @@ -90,9 +90,9 @@ protected override void PaintImp(IGraphics g) r.Offset(offset); r.Height -= ActualBorderTopWidth + ActualBorderBottomWidth + ActualPaddingTop + ActualPaddingBottom; r.Y += ActualBorderTopWidth + ActualPaddingTop; - r.X = Math.Floor(r.X); + r.X = Math.Floor(r.X); r.Y = Math.Floor(r.Y); - + if (_imageWord.Image != null) { if (_imageWord.ImageRectangle == RRect.Empty) @@ -102,7 +102,7 @@ protected override void PaintImp(IGraphics g) if (_imageWord.Selected) { - g.DrawRectangle(GetSelectionBackBrush(g,true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width+2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); + g.DrawRectangle(GetSelectionBackBrush(g, true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width + 2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); } } else if (_imageLoadingComplete) @@ -141,7 +141,7 @@ internal override void MeasureWordsSize(IGraphics g) MeasureWordSpacing(g); _wordsSizeMeasured = true; } - + CssLayoutEngine.MeasureImageSize(_imageWord); } @@ -150,7 +150,7 @@ internal override void MeasureWordsSize(IGraphics g) ///
public override void Dispose() { - if(_imageLoadHandler != null) + if (_imageLoadHandler != null) _imageLoadHandler.Dispose(); base.Dispose(); } diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs index 1962472bb..51c5b006f 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs @@ -107,7 +107,7 @@ internal abstract class CssBoxProperties /// Gets or sets the location of the box ///
private RPoint _location; - + /// /// Gets or sets the size of the box /// @@ -134,7 +134,7 @@ internal abstract class CssBoxProperties private double _actualBorderLeftWidth = double.NaN; private double _actualBorderBottomWidth = double.NaN; private double _actualBorderRightWidth = double.NaN; - + /// /// the width of whitespace between words /// @@ -850,7 +850,7 @@ public double ActualMarginLeft { if (double.IsNaN(_actualMarginLeft)) { - if (MarginLeft == CssConstants.Auto) + if (MarginLeft == CssConstants.Auto) MarginLeft = "0"; var actualMarginLeft = CssValueParser.ParseLength(MarginLeft, Size.Width, this); if (MarginLeft.EndsWith("%")) @@ -870,7 +870,7 @@ public double ActualMarginBottom { if (double.IsNaN(_actualMarginBottom)) { - if (MarginBottom == CssConstants.Auto) + if (MarginBottom == CssConstants.Auto) MarginBottom = "0"; var actualMarginBottom = CssValueParser.ParseLength(MarginBottom, Size.Width, this); if (MarginLeft.EndsWith("%")) @@ -890,7 +890,7 @@ public double ActualMarginRight { if (double.IsNaN(_actualMarginRight)) { - if (MarginRight == CssConstants.Auto) + if (MarginRight == CssConstants.Auto) MarginRight = "0"; var actualMarginRight = CssValueParser.ParseLength(MarginRight, Size.Width, this); if (MarginLeft.EndsWith("%")) @@ -1266,7 +1266,7 @@ public double ActualLineHeight { if (double.IsNaN(_actualLineHeight)) { - _actualLineHeight = .9f*CssValueParser.ParseLength(LineHeight, Size.Height, this); + _actualLineHeight = .9f * CssValueParser.ParseLength(LineHeight, Size.Height, this); } return _actualLineHeight; } diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs index 2ef2c422f..f6a508299 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs @@ -45,9 +45,9 @@ public static void MeasureImageSize(CssRectImage imageWord) { imageWord.Width = width.Number; } - else if(width.Number > 0 && width.IsPercentage) + else if (width.Number > 0 && width.IsPercentage) { - imageWord.Width = width.Number*imageWord.OwnerBox.ContainingBlock.Size.Width; + imageWord.Width = width.Number * imageWord.OwnerBox.ContainingBlock.Size.Width; scaleImageHeight = true; } else if (imageWord.Image != null) @@ -144,7 +144,7 @@ public static void CreateLineBoxes(IGraphics g, CssBox blockBox) FlowBox(g, blockBox, blockBox, limitRight, 0, startx, ref line, ref curx, ref cury, ref maxRight, ref maxBottom); // if width is not restricted we need to lower it to the actual width - if( blockBox.ActualRight >= 90999 ) + if (blockBox.ActualRight >= 90999) { blockBox.ActualRight = maxRight + blockBox.ActualPaddingRight + blockBox.ActualBorderRightWidth; } @@ -161,7 +161,7 @@ public static void CreateLineBoxes(IGraphics g, CssBox blockBox) blockBox.ActualBottom = maxBottom + blockBox.ActualPaddingBottom + blockBox.ActualBorderBottomWidth; // handle limiting block height when overflow is hidden - if( blockBox.Height != null && blockBox.Height != CssConstants.Auto && blockBox.Overflow == CssConstants.Hidden && blockBox.ActualBottom - blockBox.Location.Y > blockBox.ActualHeight ) + if (blockBox.Height != null && blockBox.Height != CssConstants.Auto && blockBox.Overflow == CssConstants.Hidden && blockBox.ActualBottom - blockBox.Location.Y > blockBox.ActualHeight) { blockBox.ActualBottom = blockBox.Location.Y + blockBox.ActualHeight; } @@ -246,7 +246,7 @@ private static void FlowBox(IGraphics g, CssBox blockbox, CssBox box, double lim var localCurx = curx; var localMaxRight = maxRight; var localmaxbottom = maxbottom; - + foreach (CssBox b in box.Boxes) { double leftspacing = b.Position != CssConstants.Absolute ? b.ActualMarginLeft + b.ActualBorderLeftWidth + b.ActualPaddingLeft : 0; @@ -263,13 +263,13 @@ private static void FlowBox(IGraphics g, CssBox blockbox, CssBox box, double lim if (b.WhiteSpace == CssConstants.NoWrap && curx > startx) { var boxRight = curx; - foreach(var word in b.Words) + foreach (var word in b.Words) boxRight += word.FullWidth; - if( boxRight > limitRight ) + if (boxRight > limitRight) wrapNoWrapBox = true; } - if( DomUtils.IsBoxHasWhitespace(b) ) + if (DomUtils.IsBoxHasWhitespace(b)) curx += box.ActualWordSpacing; foreach (var word in b.Words) @@ -278,7 +278,7 @@ private static void FlowBox(IGraphics g, CssBox blockbox, CssBox box, double lim maxbottom += box.ActualLineHeight - (maxbottom - cury); if ((b.WhiteSpace != CssConstants.NoWrap && b.WhiteSpace != CssConstants.Pre && curx + word.Width + rightspacing > limitRight - && (b.WhiteSpace != CssConstants.PreWrap || !word.IsSpaces)) + && (b.WhiteSpace != CssConstants.PreWrap || !word.IsSpaces)) || word.IsLineBreak || wrapNoWrapBox) { wrapNoWrapBox = false; @@ -396,7 +396,7 @@ private static void BubbleRectangles(CssBox box, CssLineBox line) var left = word.Left; if (box == box.ParentBox.Boxes[0] && word == box.Words[0] && word == line.Words[0] && line != line.OwnerBox.LineBoxes[0] && !word.IsLineBreak) left -= box.ParentBox.ActualMarginLeft + box.ParentBox.ActualBorderLeftWidth + box.ParentBox.ActualPaddingLeft; - + x = Math.Min(x, left); r = Math.Max(r, word.Right); y = Math.Min(y, word.Top); @@ -452,13 +452,13 @@ private static void ApplyAlignment(IGraphics g, CssLineBox lineBox) /// private static void ApplyRightToLeft(CssBox blockBox, CssLineBox lineBox) { - if( blockBox.Direction == CssConstants.Rtl ) + if (blockBox.Direction == CssConstants.Rtl) { ApplyRightToLeftOnLine(lineBox); } else { - foreach(var box in lineBox.RelatedBoxes) + foreach (var box in lineBox.RelatedBoxes) { if (box.Direction == CssConstants.Rtl) { @@ -541,10 +541,10 @@ private static void ApplyVerticalAlignment(IGraphics g, CssLineBox lineBox) switch (box.VerticalAlign) { case CssConstants.Sub: - lineBox.SetBaseLine(g, box, baseline + lineBox.Rectangles[box].Height*.2f); + lineBox.SetBaseLine(g, box, baseline + lineBox.Rectangles[box].Height * .2f); break; case CssConstants.Super: - lineBox.SetBaseLine(g, box, baseline - lineBox.Rectangles[box].Height*.2f); + lineBox.SetBaseLine(g, box, baseline - lineBox.Rectangles[box].Height * .2f); break; case CssConstants.TextTop: @@ -591,7 +591,7 @@ private static void ApplyJustifyAlignment(IGraphics g, CssLineBox lineBox) } if (words <= 0f) return; //Avoid Zero division - double spacing = (availWidth - textSum)/words; //Spacing that will be used + double spacing = (availWidth - textSum) / words; //Spacing that will be used double curx = lineBox.OwnerBox.ClientLeft + indent; foreach (CssRect word in lineBox.Words) diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs index 4caee19c4..2e7c2628e 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs @@ -88,7 +88,7 @@ public static double GetTableSpacing(CssBox tableBox) int columns = 0; foreach (var box in tableBox.Boxes) { - if( box.Display == CssConstants.TableColumn ) + if (box.Display == CssConstants.TableColumn) { columns += GetSpan(box); } @@ -108,12 +108,12 @@ public static double GetTableSpacing(CssBox tableBox) } // limit the amount of rows to process for performance - if(count > 30) + if (count > 30) break; } // +1 columns because padding is between the cell and table borders - return ( columns + 1 )*GetHorizontalSpacing(tableBox); + return (columns + 1) * GetHorizontalSpacing(tableBox); } /// @@ -297,7 +297,7 @@ private double CalculateCountAndWidth() } else { - foreach (CssBox b in _allRows) + foreach (CssBox b in _allRows) _columnCount = Math.Max(_columnCount, b.Boxes.Count); } @@ -494,7 +494,7 @@ private void EnforceMaximumSize() // if table max width is limited by we need to lower the columns width even if it will result in clipping var maxWidth = GetMaxTableWidth(); - if(maxWidth < 90999) + if (maxWidth < 90999) { widthSum = GetWidthSum(); if (maxWidth < widthSum) @@ -535,9 +535,9 @@ private void EnforceMaximumSize() if (decrease * nonMaxedColumns > widthSum - maxWidth) decrease = (widthSum - maxWidth) / nonMaxedColumns; for (int i = 0; i < _columnWidths.Length; i++) - if(_columnWidths[i] > largeWidth - 0.1) + if (_columnWidths[i] > largeWidth - 0.1) _columnWidths[i] -= decrease; - + widthSum = GetWidthSum(); } } @@ -632,7 +632,7 @@ private void LayoutCells(IGraphics g) cell.Location = new RPoint(curx, cury); cell.Size = new RSize(width, 0f); cell.PerformLayout(g); //That will automatically set the bottom of the cell - + //Alter max bottom only if row is cell's row + cell's rowspan - 1 CssSpacingBox sb = cell as CssSpacingBox; if (sb != null) @@ -671,7 +671,7 @@ private void LayoutCells(IGraphics g) currentrow++; } - maxRight = Math.Max(maxRight,_tableBox.Location.X + _tableBox.ActualWidth); + maxRight = Math.Max(maxRight, _tableBox.Location.X + _tableBox.ActualWidth); _tableBox.ActualRight = maxRight + GetHorizontalSpacing() + _tableBox.ActualBorderRightWidth; _tableBox.ActualBottom = Math.Max(maxBottom, starty) + GetVerticalSpacing() + _tableBox.ActualBorderBottomWidth; } @@ -884,14 +884,14 @@ private void GetColumnsMinMaxWidthByContent(bool onlyNans, out double[] minFullW { double minWidth, maxWidth; row.Boxes[i].GetMinMaxWidth(out minWidth, out maxWidth); - + var colSpan = GetColSpan(row.Boxes[i]); minWidth = minWidth / colSpan; maxWidth = maxWidth / colSpan; for (int j = 0; j < colSpan; j++) { - minFullWidths[col + j] = Math.Max(minFullWidths[col+j], minWidth); - maxFullWidths[col + j] = Math.Max(maxFullWidths[col+j], maxWidth); + minFullWidths[col + j] = Math.Max(minFullWidths[col + j], minWidth); + maxFullWidths[col + j] = Math.Max(maxFullWidths[col + j], maxWidth); } } } diff --git a/Source/HtmlRenderer/Core/Dom/CssLength.cs b/Source/HtmlRenderer/Core/Dom/CssLength.cs index 716f41269..dbe5f4ee7 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLength.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLength.cs @@ -96,7 +96,7 @@ public CssLength(string length) return; } - if (!double.TryParse(number, System.Globalization.NumberStyles.Number, NumberFormatInfo.InvariantInfo, out _number)) + if (!double.TryParse(number, System.Globalization.NumberStyles.Number, NumberFormatInfo.InvariantInfo, out _number)) { _hasError = true; } @@ -131,7 +131,7 @@ public bool IsPercentage { get { return _isPercentage; } } - + /// /// Gets if the length is specified in relative units diff --git a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs index f186f92be..6eb7a591d 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs @@ -35,7 +35,7 @@ internal sealed class CssLineBox #endregion - + /// /// Creates a new LineBox /// @@ -47,7 +47,7 @@ public CssLineBox(CssBox ownerBox) _ownerBox = ownerBox; _ownerBox.LineBoxes.Add(this); } - + /// /// Gets a list of boxes related with the linebox. /// To know the words of the box inside this linebox, use the method. @@ -168,7 +168,7 @@ internal void UpdateRectangle(CssBox box, double x, double y, double r, double b y -= topspacing; b += bottomspacing; } - + if (!Rectangles.ContainsKey(box)) { @@ -245,14 +245,14 @@ internal void SetBaseLine(IGraphics g, CssBox b, double baseline) Rectangles[b] = newr; b.OffsetRectangle(this, gap); } - + foreach (var word in ws) { if (!word.IsImage) word.Top = newtop; } } - + /// /// Check if the given word is the last selected word in the line.
/// It can either be the last word in the line or the next word has no selection. @@ -261,9 +261,9 @@ internal void SetBaseLine(IGraphics g, CssBox b, double baseline) /// public bool IsLastSelectedWord(CssRect word) { - for(int i = 0; i < _words.Count-1; i++) + for (int i = 0; i < _words.Count - 1; i++) { - if( _words[i] == word ) + if (_words[i] == word) { return !_words[i + 1].Selected; } diff --git a/Source/HtmlRenderer/Core/Dom/CssRect.cs b/Source/HtmlRenderer/Core/Dom/CssRect.cs index 2dbcee684..49b07cbf2 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRect.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRect.cs @@ -174,9 +174,9 @@ public virtual bool HasSpaceAfter public virtual IImage Image { get { return null; } -// ReSharper disable ValueParameterNotUsed - set {} -// ReSharper restore ValueParameterNotUsed + // ReSharper disable ValueParameterNotUsed + set { } + // ReSharper restore ValueParameterNotUsed } /// diff --git a/Source/HtmlRenderer/Core/Dom/CssRectImage.cs b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs index aad6fef3a..864c61844 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRectImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs @@ -40,8 +40,8 @@ internal sealed class CssRectImage : CssRect /// /// the CSS box owner of the word public CssRectImage(CssBox owner) - :base(owner) - {} + : base(owner) + { } /// /// Gets the image this words represents (if one exists) diff --git a/Source/HtmlRenderer/Core/Dom/CssRectWord.cs b/Source/HtmlRenderer/Core/Dom/CssRectWord.cs index 0f1efbc6a..5dd296ec1 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRectWord.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRectWord.cs @@ -23,7 +23,7 @@ internal sealed class CssRectWord : CssRect /// The word text /// private readonly string _text; - + /// /// was there a whitespace before the word chars (before trim) /// @@ -45,7 +45,7 @@ internal sealed class CssRectWord : CssRect /// was there a whitespace before the word chars (before trim) /// was there a whitespace after the word chars (before trim) public CssRectWord(CssBox owner, string text, bool hasSpaceBefore, bool hasSpaceAfter) - :base(owner) + : base(owner) { _text = text; _hasSpaceBefore = hasSpaceBefore; @@ -76,9 +76,9 @@ public override bool IsSpaces { get { - foreach(var c in Text) + foreach (var c in Text) { - if( !char.IsWhiteSpace(c) ) + if (!char.IsWhiteSpace(c)) return false; } return true; diff --git a/Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs b/Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs index 6417cbde8..009e259f2 100644 --- a/Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs @@ -27,7 +27,7 @@ internal sealed class CssSpacingBox : CssBox public CssSpacingBox(CssBox tableBox, ref CssBox extendedBox, int startRow) - : base(tableBox, new HtmlTag("none", false, new Dictionary {{"colspan", "1"}})) + : base(tableBox, new HtmlTag("none", false, new Dictionary { { "colspan", "1" } })) { _extendedBox = extendedBox; Display = CssConstants.None; diff --git a/Source/HtmlRenderer/Core/Dom/HtmlTag.cs b/Source/HtmlRenderer/Core/Dom/HtmlTag.cs index 1f191c2e0..570eadc07 100644 --- a/Source/HtmlRenderer/Core/Dom/HtmlTag.cs +++ b/Source/HtmlRenderer/Core/Dom/HtmlTag.cs @@ -23,7 +23,7 @@ internal sealed class HtmlTag /// the name of the html tag ///
private readonly string _name; - + /// /// if the tag is single placed; in other words it doesn't have a separate closing tag; /// diff --git a/Source/HtmlRenderer/Core/Entities/Border.cs b/Source/HtmlRenderer/Core/Entities/Border.cs index 53edb2aa4..4561d8c77 100644 --- a/Source/HtmlRenderer/Core/Entities/Border.cs +++ b/Source/HtmlRenderer/Core/Entities/Border.cs @@ -17,9 +17,9 @@ namespace HtmlRenderer.Core.Entities ///
internal enum Border { - Top, - Right, - Bottom, + Top, + Right, + Bottom, Left } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Entities/CssConstants.cs b/Source/HtmlRenderer/Core/Entities/CssConstants.cs index 301df09d4..e9871d5cc 100644 --- a/Source/HtmlRenderer/Core/Entities/CssConstants.cs +++ b/Source/HtmlRenderer/Core/Entities/CssConstants.cs @@ -113,7 +113,7 @@ internal static class CssConstants public const string Double = "double"; public const string Groove = "groove"; public const string Ridge = "ridge"; - + /// /// Centimeters /// diff --git a/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs b/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs index 81e6ece17..d8a57aa94 100644 --- a/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs @@ -6,224 +6,224 @@ namespace HtmlRenderer.Core.Entities internal static class HtmlConstants { public const string A = "a"; -// public const string ABBR = "ABBR"; -// public const string ACRONYM = "ACRONYM"; -// public const string ADDRESS = "ADDRESS"; -// public const string APPLET = "APPLET"; -// public const string AREA = "AREA"; -// public const string B = "B"; -// public const string BASE = "BASE"; -// public const string BASEFONT = "BASEFONT"; -// public const string BDO = "BDO"; -// public const string BIG = "BIG"; -// public const string BLOCKQUOTE = "BLOCKQUOTE"; -// public const string BODY = "BODY"; -// public const string BR = "BR"; -// public const string BUTTON = "BUTTON"; + // public const string ABBR = "ABBR"; + // public const string ACRONYM = "ACRONYM"; + // public const string ADDRESS = "ADDRESS"; + // public const string APPLET = "APPLET"; + // public const string AREA = "AREA"; + // public const string B = "B"; + // public const string BASE = "BASE"; + // public const string BASEFONT = "BASEFONT"; + // public const string BDO = "BDO"; + // public const string BIG = "BIG"; + // public const string BLOCKQUOTE = "BLOCKQUOTE"; + // public const string BODY = "BODY"; + // public const string BR = "BR"; + // public const string BUTTON = "BUTTON"; public const string Caption = "caption"; -// public const string CENTER = "CENTER"; -// public const string CITE = "CITE"; -// public const string CODE = "CODE"; + // public const string CENTER = "CENTER"; + // public const string CITE = "CITE"; + // public const string CODE = "CODE"; public const string Col = "col"; public const string Colgroup = "colgroup"; public const string Display = "display"; -// public const string DD = "DD"; -// public const string DEL = "DEL"; -// public const string DFN = "DFN"; -// public const string DIR = "DIR"; -// public const string DIV = "DIV"; -// public const string DL = "DL"; -// public const string DT = "DT"; -// public const string EM = "EM"; -// public const string FIELDSET = "FIELDSET"; + // public const string DD = "DD"; + // public const string DEL = "DEL"; + // public const string DFN = "DFN"; + // public const string DIR = "DIR"; + // public const string DIV = "DIV"; + // public const string DL = "DL"; + // public const string DT = "DT"; + // public const string EM = "EM"; + // public const string FIELDSET = "FIELDSET"; public const string Font = "font"; -// public const string FORM = "FORM"; -// public const string FRAME = "FRAME"; -// public const string FRAMESET = "FRAMESET"; -// public const string H1 = "H1"; -// public const string H2 = "H2"; -// public const string H3 = "H3"; -// public const string H4 = "H4"; -// public const string H5 = "H5"; -// public const string H6 = "H6"; -// public const string HEAD = "HEAD"; + // public const string FORM = "FORM"; + // public const string FRAME = "FRAME"; + // public const string FRAMESET = "FRAMESET"; + // public const string H1 = "H1"; + // public const string H2 = "H2"; + // public const string H3 = "H3"; + // public const string H4 = "H4"; + // public const string H5 = "H5"; + // public const string H6 = "H6"; + // public const string HEAD = "HEAD"; public const string Hr = "hr"; -// public const string HTML = "HTML"; -// public const string I = "I"; + // public const string HTML = "HTML"; + // public const string I = "I"; public const string Iframe = "iframe"; public const string Img = "img"; -// public const string INPUT = "INPUT"; -// public const string INS = "INS"; -// public const string ISINDEX = "ISINDEX"; -// public const string KBD = "KBD"; -// public const string LABEL = "LABEL"; -// public const string LEGEND = "LEGEND"; + // public const string INPUT = "INPUT"; + // public const string INS = "INS"; + // public const string ISINDEX = "ISINDEX"; + // public const string KBD = "KBD"; + // public const string LABEL = "LABEL"; + // public const string LEGEND = "LEGEND"; public const string Li = "li"; -// public const string LINK = "LINK"; -// public const string MAP = "MAP"; -// public const string MENU = "MENU"; -// public const string META = "META"; -// public const string NOFRAMES = "NOFRAMES"; -// public const string NOSCRIPT = "NOSCRIPT"; -// public const string OBJECT = "OBJECT"; -// public const string OL = "OL"; -// public const string OPTGROUP = "OPTGROUP"; -// public const string OPTION = "OPTION"; -// public const string P = "P"; -// public const string PARAM = "PARAM"; -// public const string PRE = "PRE"; -// public const string Q = "Q"; -// public const string S = "S"; -// public const string SAMP = "SAMP"; -// public const string SCRIPT = "SCRIPT"; -// public const string SELECT = "SELECT"; -// public const string SMALL = "SMALL"; -// public const string SPAN = "SPAN"; -// public const string STRIKE = "STRIKE"; -// public const string STRONG = "STRONG"; + // public const string LINK = "LINK"; + // public const string MAP = "MAP"; + // public const string MENU = "MENU"; + // public const string META = "META"; + // public const string NOFRAMES = "NOFRAMES"; + // public const string NOSCRIPT = "NOSCRIPT"; + // public const string OBJECT = "OBJECT"; + // public const string OL = "OL"; + // public const string OPTGROUP = "OPTGROUP"; + // public const string OPTION = "OPTION"; + // public const string P = "P"; + // public const string PARAM = "PARAM"; + // public const string PRE = "PRE"; + // public const string Q = "Q"; + // public const string S = "S"; + // public const string SAMP = "SAMP"; + // public const string SCRIPT = "SCRIPT"; + // public const string SELECT = "SELECT"; + // public const string SMALL = "SMALL"; + // public const string SPAN = "SPAN"; + // public const string STRIKE = "STRIKE"; + // public const string STRONG = "STRONG"; public const string Style = "style"; -// public const string SUB = "SUB"; -// public const string SUP = "SUP"; + // public const string SUB = "SUB"; + // public const string SUP = "SUP"; public const string Table = "table"; public const string Tbody = "tbody"; public const string Td = "td"; -// public const string TEXTAREA = "TEXTAREA"; + // public const string TEXTAREA = "TEXTAREA"; public const string Tfoot = "tfoot"; public const string Th = "th"; public const string Thead = "thead"; -// public const string TITLE = "TITLE"; + // public const string TITLE = "TITLE"; public const string Tr = "tr"; -// public const string TT = "TT"; -// public const string U = "U"; -// public const string UL = "UL"; -// public const string VAR = "VAR"; + // public const string TT = "TT"; + // public const string U = "U"; + // public const string UL = "UL"; + // public const string VAR = "VAR"; -// public const string abbr = "abbr"; -// public const string accept = "accept"; -// public const string accesskey = "accesskey"; -// public const string action = "action"; + // public const string abbr = "abbr"; + // public const string accept = "accept"; + // public const string accesskey = "accesskey"; + // public const string action = "action"; public const string Align = "align"; -// public const string alink = "alink"; -// public const string alt = "alt"; -// public const string archive = "archive"; -// public const string axis = "axis"; + // public const string alink = "alink"; + // public const string alt = "alt"; + // public const string archive = "archive"; + // public const string axis = "axis"; public const string Background = "background"; public const string Bgcolor = "bgcolor"; public const string Border = "border"; public const string Bordercolor = "bordercolor"; public const string Cellpadding = "cellpadding"; public const string Cellspacing = "cellspacing"; -// public const string char_ = "char"; -// public const string charoff = "charoff"; -// public const string charset = "charset"; -// public const string checked_ = "checked"; -// public const string cite = "cite"; + // public const string char_ = "char"; + // public const string charoff = "charoff"; + // public const string charset = "charset"; + // public const string checked_ = "checked"; + // public const string cite = "cite"; public const string Class = "class"; -// public const string classid = "classid"; -// public const string clear = "clear"; -// public const string code = "code"; -// public const string codebase = "codebase"; -// public const string codetype = "codetype"; + // public const string classid = "classid"; + // public const string clear = "clear"; + // public const string code = "code"; + // public const string codebase = "codebase"; + // public const string codetype = "codetype"; public const string Color = "color"; -// public const string cols = "cols"; -// public const string colspan = "colspan"; -// public const string compact = "compact"; -// public const string content = "content"; -// public const string coords = "coords"; -// public const string data = "data"; -// public const string datetime = "datetime"; -// public const string declare = "declare"; -// public const string defer = "defer"; + // public const string cols = "cols"; + // public const string colspan = "colspan"; + // public const string compact = "compact"; + // public const string content = "content"; + // public const string coords = "coords"; + // public const string data = "data"; + // public const string datetime = "datetime"; + // public const string declare = "declare"; + // public const string defer = "defer"; public const string Dir = "dir"; -// public const string disabled = "disabled"; -// public const string enctype = "enctype"; + // public const string disabled = "disabled"; + // public const string enctype = "enctype"; public const string Face = "face"; -// public const string for_ = "for"; -// public const string frame = "frame"; -// public const string frameborder = "frameborder"; -// public const string headers = "headers"; + // public const string for_ = "for"; + // public const string frame = "frame"; + // public const string frameborder = "frameborder"; + // public const string headers = "headers"; public const string Height = "height"; public const string Href = "href"; -// public const string hreflang = "hreflang"; + // public const string hreflang = "hreflang"; public const string Hspace = "hspace"; -// public const string http_equiv = "http-equiv"; -// public const string id = "id"; -// public const string ismap = "ismap"; -// public const string label = "label"; -// public const string lang = "lang"; -// public const string language = "language"; -// public const string link = "link"; -// public const string longdesc = "longdesc"; -// public const string marginheight = "marginheight"; -// public const string marginwidth = "marginwidth"; -// public const string maxlength = "maxlength"; -// public const string media = "media"; -// public const string method = "method"; -// public const string multiple = "multiple"; -// public const string name = "name"; -// public const string nohref = "nohref"; -// public const string noresize = "noresize"; -// public const string noshade = "noshade"; + // public const string http_equiv = "http-equiv"; + // public const string id = "id"; + // public const string ismap = "ismap"; + // public const string label = "label"; + // public const string lang = "lang"; + // public const string language = "language"; + // public const string link = "link"; + // public const string longdesc = "longdesc"; + // public const string marginheight = "marginheight"; + // public const string marginwidth = "marginwidth"; + // public const string maxlength = "maxlength"; + // public const string media = "media"; + // public const string method = "method"; + // public const string multiple = "multiple"; + // public const string name = "name"; + // public const string nohref = "nohref"; + // public const string noresize = "noresize"; + // public const string noshade = "noshade"; public const string Nowrap = "nowrap"; -// public const string object_ = "object"; -// public const string onblur = "onblur"; -// public const string onchange = "onchange"; -// public const string onclick = "onclick"; -// public const string ondblclick = "ondblclick"; -// public const string onfocus = "onfocus"; -// public const string onkeydown = "onkeydown"; -// public const string onkeypress = "onkeypress"; -// public const string onkeyup = "onkeyup"; -// public const string onload = "onload"; -// public const string onmousedown = "onmousedown"; -// public const string onmousemove = "onmousemove"; -// public const string onmouseout = "onmouseout"; -// public const string onmouseover = "onmouseover"; -// public const string onmouseup = "onmouseup"; -// public const string onreset = "onreset"; -// public const string onselect = "onselect"; -// public const string onsubmit = "onsubmit"; -// public const string onunload = "onunload"; -// public const string profile = "profile"; -// public const string prompt = "prompt"; -// public const string readonly_ = "readonly"; -// public const string rel = "rel"; -// public const string rev = "rev"; -// public const string rows = "rows"; -// public const string rowspan = "rowspan"; -// public const string rules = "rules"; -// public const string scheme = "scheme"; -// public const string scope = "scope"; -// public const string scrolling = "scrolling"; -// public const string selected = "selected"; -// public const string shape = "shape"; + // public const string object_ = "object"; + // public const string onblur = "onblur"; + // public const string onchange = "onchange"; + // public const string onclick = "onclick"; + // public const string ondblclick = "ondblclick"; + // public const string onfocus = "onfocus"; + // public const string onkeydown = "onkeydown"; + // public const string onkeypress = "onkeypress"; + // public const string onkeyup = "onkeyup"; + // public const string onload = "onload"; + // public const string onmousedown = "onmousedown"; + // public const string onmousemove = "onmousemove"; + // public const string onmouseout = "onmouseout"; + // public const string onmouseover = "onmouseover"; + // public const string onmouseup = "onmouseup"; + // public const string onreset = "onreset"; + // public const string onselect = "onselect"; + // public const string onsubmit = "onsubmit"; + // public const string onunload = "onunload"; + // public const string profile = "profile"; + // public const string prompt = "prompt"; + // public const string readonly_ = "readonly"; + // public const string rel = "rel"; + // public const string rev = "rev"; + // public const string rows = "rows"; + // public const string rowspan = "rowspan"; + // public const string rules = "rules"; + // public const string scheme = "scheme"; + // public const string scope = "scope"; + // public const string scrolling = "scrolling"; + // public const string selected = "selected"; + // public const string shape = "shape"; public const string Size = "size"; -// public const string span = "span"; -// public const string src = "src"; -// public const string standby = "standby"; -// public const string start = "start"; -// public const string style = "style"; -// public const string summary = "summary"; -// public const string tabindex = "tabindex"; -// public const string target = "target"; -// public const string text = "text"; -// public const string title = "title"; -// public const string type = "type"; -// public const string usemap = "usemap"; + // public const string span = "span"; + // public const string src = "src"; + // public const string standby = "standby"; + // public const string start = "start"; + // public const string style = "style"; + // public const string summary = "summary"; + // public const string tabindex = "tabindex"; + // public const string target = "target"; + // public const string text = "text"; + // public const string title = "title"; + // public const string type = "type"; + // public const string usemap = "usemap"; public const string Valign = "valign"; -// public const string value = "value"; -// public const string valuetype = "valuetype"; -// public const string version = "version"; -// public const string vlink = "vlink"; + // public const string value = "value"; + // public const string valuetype = "valuetype"; + // public const string version = "version"; + // public const string vlink = "vlink"; public const string Vspace = "vspace"; public const string Width = "width"; public const string Left = "left"; public const string Right = "right"; -// public const string top = "top"; + // public const string top = "top"; public const string Center = "center"; -// public const string middle = "middle"; -// public const string bottom = "bottom"; + // public const string middle = "middle"; + // public const string bottom = "bottom"; public const string Justify = "justify"; } diff --git a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs index 2ac0bfb72..610fb9707 100644 --- a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs @@ -52,7 +52,7 @@ public static void DrawBackgroundImage(IGraphics g, CssBox box, ImageLoadHandler lRectangle.Intersect(prevClip); g.SetClipReplace(lRectangle); - switch( box.BackgroundRepeat ) + switch (box.BackgroundRepeat) { case "no-repeat": g.DrawImage(imageLoadHandler.Image, destRect, srcRect); @@ -84,17 +84,17 @@ public static void DrawBackgroundImage(IGraphics g, CssBox box, ImageLoadHandler private static RPoint GetLocation(string backgroundPosition, RRect rectangle, RSize imgSize) { double left = rectangle.Left; - if( backgroundPosition.IndexOf("left", StringComparison.OrdinalIgnoreCase) > -1 ) + if (backgroundPosition.IndexOf("left", StringComparison.OrdinalIgnoreCase) > -1) { left = (rectangle.Left + .5f); } else if (backgroundPosition.IndexOf("right", StringComparison.OrdinalIgnoreCase) > -1) { - left = rectangle.Right - imgSize.Width; + left = rectangle.Right - imgSize.Width; } else if (backgroundPosition.IndexOf("0", StringComparison.OrdinalIgnoreCase) < 0) { - left = (rectangle.Left + (rectangle.Width - imgSize.Width) / 2 +.5f); + left = (rectangle.Left + (rectangle.Width - imgSize.Width) / 2 + .5f); } double top = rectangle.Top; @@ -151,7 +151,7 @@ private static void DrawRepeatY(IGraphics g, ImageLoadHandler imageLoadHandler, private static void DrawRepeat(IGraphics g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) { while (destRect.X > rectangle.X) - destRect.X -= imgSize.Width; + destRect.X -= imgSize.Width; while (destRect.Y > rectangle.Y) destRect.Y -= imgSize.Height; diff --git a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs index 7001cb656..d461c231c 100644 --- a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs @@ -43,7 +43,7 @@ internal static class BordersDrawHandler /// is it the last rectangle of the element public static void DrawBoxBorders(IGraphics g, CssBox box, RRect rect, bool isFirst, bool isLast) { - if( rect.Width > 0 && rect.Height > 0 ) + if (rect.Width > 0 && rect.Height > 0) { if (!(string.IsNullOrEmpty(box.BorderTopStyle) || box.BorderTopStyle == CssConstants.None || box.BorderTopStyle == CssConstants.Hidden) && box.ActualBorderTopWidth > 0) { @@ -113,7 +113,7 @@ private static void DrawBorder(Border border, CssBox box, IGraphics g, RRect rec else { // non rounded border - if( style == CssConstants.Inset || style == CssConstants.Outset ) + if (style == CssConstants.Inset || style == CssConstants.Outset) { // inset/outset border needs special rectangle SetInOutsetRectanglePoints(border, box, rect, isLineStart, isLineEnd); @@ -153,16 +153,16 @@ private static void DrawBorder(Border border, CssBox box, IGraphics g, RRect rec /// Beveled border path, null if there is no rounded corners private static void SetInOutsetRectanglePoints(Border border, CssBox b, RRect r, bool isLineStart, bool isLineEnd) { - switch( border ) + switch (border) { case Border.Top: _borderPts[0] = new RPoint(r.Left, r.Top); _borderPts[1] = new RPoint(r.Right, r.Top); _borderPts[2] = new RPoint(r.Right, r.Top + b.ActualBorderTopWidth); _borderPts[3] = new RPoint(r.Left, r.Top + b.ActualBorderTopWidth); - if( isLineEnd ) + if (isLineEnd) _borderPts[2].X -= b.ActualBorderRightWidth; - if( isLineStart ) + if (isLineStart) _borderPts[3].X += b.ActualBorderLeftWidth; break; case Border.Right: @@ -176,9 +176,9 @@ private static void SetInOutsetRectanglePoints(Border border, CssBox b, RRect r, _borderPts[1] = new RPoint(r.Right, r.Bottom - b.ActualBorderBottomWidth); _borderPts[2] = new RPoint(r.Right, r.Bottom); _borderPts[3] = new RPoint(r.Left, r.Bottom); - if( isLineStart ) + if (isLineStart) _borderPts[0].X += b.ActualBorderLeftWidth; - if( isLineEnd ) + if (isLineEnd) _borderPts[1].X -= b.ActualBorderRightWidth; break; case Border.Left: @@ -204,10 +204,10 @@ private static IGraphicsPath GetRoundedBorderPath(IGraphics g, Border border, Cs { IGraphicsPath path = null; - switch( border ) + switch (border) { case Border.Top: - if( b.ActualCornerNw > 0 || b.ActualCornerNe > 0 ) + if (b.ActualCornerNw > 0 || b.ActualCornerNe > 0) { path = g.GetGraphicsPath(); @@ -239,7 +239,7 @@ private static IGraphicsPath GetRoundedBorderPath(IGraphics g, Border border, Cs } break; case Border.Right: - if( b.ActualCornerNe > 0 || b.ActualCornerSe > 0 ) + if (b.ActualCornerNe > 0 || b.ActualCornerSe > 0) { path = g.GetGraphicsPath(); @@ -251,18 +251,18 @@ private static IGraphicsPath GetRoundedBorderPath(IGraphics g, Border border, Cs if (b.ActualCornerSe > 0 && (b.BorderBottomStyle == CssConstants.None || b.BorderBottomStyle == CssConstants.Hidden)) path.AddArc(r.Right - b.ActualCornerSe * 2 - b.ActualBorderRightWidth / 2, r.Bottom - b.ActualCornerSe * 2 - b.ActualBorderBottomWidth / 2, b.ActualCornerSe * 2, b.ActualCornerSe * 2, 0f, 90f); else - path.AddLine(r.Right - b.ActualBorderRightWidth / 2, r.Bottom - b.ActualCornerSe - b.ActualBorderBottomWidth / 2 -.1f, r.Right - b.ActualBorderRightWidth / 2, r.Bottom - b.ActualCornerSe - b.ActualBorderBottomWidth / 2); + path.AddLine(r.Right - b.ActualBorderRightWidth / 2, r.Bottom - b.ActualCornerSe - b.ActualBorderBottomWidth / 2 - .1f, r.Right - b.ActualBorderRightWidth / 2, r.Bottom - b.ActualCornerSe - b.ActualBorderBottomWidth / 2); } break; case Border.Left: - if( b.ActualCornerNw > 0 || b.ActualCornerSw > 0 ) + if (b.ActualCornerNw > 0 || b.ActualCornerSw > 0) { path = g.GetGraphicsPath(); if (b.ActualCornerSw > 0 && (b.BorderTopStyle == CssConstants.None || b.BorderTopStyle == CssConstants.Hidden)) path.AddArc(r.Left + b.ActualBorderLeftWidth / 2, r.Bottom - b.ActualCornerSw * 2 - b.ActualBorderBottomWidth / 2, b.ActualCornerSw * 2, b.ActualCornerSw * 2, 90f, 90f); else - path.AddLine(r.Left + b.ActualBorderLeftWidth / 2, r.Bottom - b.ActualCornerSw - b.ActualBorderBottomWidth / 2, r.Left + b.ActualBorderLeftWidth / 2, r.Bottom - b.ActualCornerSw - b.ActualBorderBottomWidth / 2 -.1f); + path.AddLine(r.Left + b.ActualBorderLeftWidth / 2, r.Bottom - b.ActualCornerSw - b.ActualBorderBottomWidth / 2, r.Left + b.ActualBorderLeftWidth / 2, r.Bottom - b.ActualCornerSw - b.ActualBorderBottomWidth / 2 - .1f); if (b.ActualCornerNw > 0 && (b.BorderBottomStyle == CssConstants.None || b.BorderBottomStyle == CssConstants.Hidden)) path.AddArc(r.Left + b.ActualBorderLeftWidth / 2, r.Top + b.ActualBorderTopWidth / 2, b.ActualCornerNw * 2, b.ActualCornerNw * 2, 180f, 90f); diff --git a/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs index ef5046f95..3852319e0 100644 --- a/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs @@ -96,7 +96,7 @@ internal sealed class ContextMenuHandler : IDisposable /// the css rectangle that context menu shown on ///
private CssRect _currentRect; - + /// /// the css link box that context menu shown on /// @@ -110,7 +110,7 @@ internal sealed class ContextMenuHandler : IDisposable ///
static ContextMenuHandler() { - if(CultureInfo.CurrentUICulture.Name.StartsWith("fr",StringComparison.InvariantCultureIgnoreCase)) + if (CultureInfo.CurrentUICulture.Name.StartsWith("fr", StringComparison.InvariantCultureIgnoreCase)) { _selectAll = "Tout sélectionner"; _copy = "Copier"; @@ -287,7 +287,7 @@ public void ShowContextMenu(IControl parent, CssRect rect, CssBox link) _currentLink = link; _contextMenu = _htmlContainer.Global.CreateContextMenu(); - if(rect != null) + if (rect != null) { bool isVideo = false; if (link != null) @@ -295,7 +295,7 @@ public void ShowContextMenu(IControl parent, CssRect rect, CssBox link) isVideo = link is CssBoxFrame && ((CssBoxFrame)link).IsVideo; var linkExist = !string.IsNullOrEmpty(link.HrefLink); _contextMenu.AddItem(isVideo ? _openVideo : _openLink, linkExist, OnOpenLinkClick); - if(_htmlContainer.IsSelectionEnabled) + if (_htmlContainer.IsSelectionEnabled) { _contextMenu.AddItem(isVideo ? _copyVideoUrl : _copyLink, linkExist, OnCopyLinkClick); } @@ -305,7 +305,7 @@ public void ShowContextMenu(IControl parent, CssRect rect, CssBox link) if (rect.IsImage && !isVideo) { _contextMenu.AddItem(_saveImage, rect.Image != null, OnSaveImageClick); - if(_htmlContainer.IsSelectionEnabled) + if (_htmlContainer.IsSelectionEnabled) { _contextMenu.AddItem(_copyImageLink, !string.IsNullOrEmpty(_currentRect.OwnerBox.GetAttribute("src")), OnCopyImageLinkClick); _contextMenu.AddItem(_copyImage, rect.Image != null, OnCopyImageClick); @@ -313,18 +313,18 @@ public void ShowContextMenu(IControl parent, CssRect rect, CssBox link) _contextMenu.AddDivider(); } - if(_htmlContainer.IsSelectionEnabled) + if (_htmlContainer.IsSelectionEnabled) { _contextMenu.AddItem(_copy, rect.Selected, OnCopyClick); } } - if(_htmlContainer.IsSelectionEnabled) + if (_htmlContainer.IsSelectionEnabled) { _contextMenu.AddItem(_selectAll, true, OnSelectAllClick); } - if(_contextMenu.ItemsCount > 0) + if (_contextMenu.ItemsCount > 0) { _contextMenu.RemoveLastDivider(); _contextMenu.Show(parent, parent.MouseLocation); @@ -363,7 +363,7 @@ private void DisposeContextMenu() _currentLink = null; } catch - {} + { } } /// @@ -385,7 +385,7 @@ private void OnOpenLinkClick(object sender, EventArgs eventArgs) } finally { - DisposeContextMenu(); + DisposeContextMenu(); } } @@ -400,7 +400,7 @@ private void OnCopyLinkClick(object sender, EventArgs eventArgs) } catch (Exception ex) { - _htmlContainer.ReportError(HtmlRenderErrorType.ContextMenu, "Failed to copy link url to clipboard", ex); + _htmlContainer.ReportError(HtmlRenderErrorType.ContextMenu, "Failed to copy link url to clipboard", ex); } finally { @@ -439,7 +439,7 @@ private void OnCopyImageLinkClick(object sender, EventArgs eventArgs) } catch (Exception ex) { - _htmlContainer.ReportError(HtmlRenderErrorType.ContextMenu, "Failed to copy image url to clipboard", ex); + _htmlContainer.ReportError(HtmlRenderErrorType.ContextMenu, "Failed to copy image url to clipboard", ex); } finally { @@ -458,7 +458,7 @@ private void OnCopyImageClick(object sender, EventArgs eventArgs) } catch (Exception ex) { - _htmlContainer.ReportError(HtmlRenderErrorType.ContextMenu, "Failed to copy image to clipboard", ex); + _htmlContainer.ReportError(HtmlRenderErrorType.ContextMenu, "Failed to copy image to clipboard", ex); } finally { @@ -477,7 +477,7 @@ private void OnCopyClick(object sender, EventArgs eventArgs) } catch (Exception ex) { - _htmlContainer.ReportError(HtmlRenderErrorType.ContextMenu, "Failed to copy text to clipboard", ex); + _htmlContainer.ReportError(HtmlRenderErrorType.ContextMenu, "Failed to copy text to clipboard", ex); } finally { diff --git a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs index 2c6394494..81839f2f8 100644 --- a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs @@ -66,10 +66,10 @@ public FontHandler(GlobalBase global) public bool IsFontExists(string family) { bool exists = _existingFontFamilies.ContainsKey(family); - if( !exists ) + if (!exists) { string mappedFamily; - if( _fontsMapping.TryGetValue(family, out mappedFamily) ) + if (_fontsMapping.TryGetValue(family, out mappedFamily)) { exists = _existingFontFamilies.ContainsKey(mappedFamily); } @@ -111,15 +111,15 @@ public void AddFontFamilyMapping(string fromFamily, string toFamily) public IFont GetCachedFont(string family, double size, RFontStyle style) { var font = TryGetFont(family, size, style); - if( font == null ) + if (font == null) { - if( !_existingFontFamilies.ContainsKey(family) ) + if (!_existingFontFamilies.ContainsKey(family)) { string mappedFamily; - if( _fontsMapping.TryGetValue(family, out mappedFamily) ) + if (_fontsMapping.TryGetValue(family, out mappedFamily)) { font = TryGetFont(mappedFamily, size, style); - if( font == null ) + if (font == null) { font = CreateFont(mappedFamily, size, style); _fontsCache[mappedFamily][size][style] = font; @@ -127,7 +127,7 @@ public IFont GetCachedFont(string family, double size, RFontStyle style) } } - if( font == null ) + if (font == null) { font = CreateFont(family, size, style); } @@ -146,13 +146,13 @@ public IFont GetCachedFont(string family, double size, RFontStyle style) private IFont TryGetFont(string family, double size, RFontStyle style) { IFont font = null; - if( _fontsCache.ContainsKey(family) ) + if (_fontsCache.ContainsKey(family)) { var a = _fontsCache[family]; - if( a.ContainsKey(size) ) + if (a.ContainsKey(size)) { var b = a[size]; - if( b.ContainsKey(style) ) + if (b.ContainsKey(style)) { font = b[style]; } diff --git a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs index 81acc27f8..9503cbf58 100644 --- a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs @@ -233,7 +233,7 @@ public bool HandleMouseUp(IControl parent, bool leftMouseButton) ignore = ignore || (DateTime.Now - _lastMouseDown > TimeSpan.FromSeconds(1)); return ignore; } - + /// /// Handle mouse move to handle hover cursor and text selection. /// @@ -279,7 +279,7 @@ public void HandleMouseMove(IControl parent, RPoint loc) } } } - + /// /// On mouse leave change the cursor back to default. /// diff --git a/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs b/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs index 325506ab2..bcce38628 100644 --- a/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs @@ -81,7 +81,7 @@ public static void LoadStylesheet(HtmlContainerInt htmlContainer, string src, Di private static string LoadStylesheet(HtmlContainerInt htmlContainer, string src) { var uri = CommonUtils.TryGetUri(src); - if( uri == null || uri.Scheme == "file" ) + if (uri == null || uri.Scheme == "file") { return LoadStylesheetFromFile(htmlContainer, uri != null ? uri.AbsolutePath : src); } @@ -136,7 +136,7 @@ private static string LoadStylesheetFromUri(HtmlContainerInt htmlContainer, Uri { stylesheet = CorrectRelativeUrls(stylesheet, uri); } - catch(Exception ex) + catch (Exception ex) { htmlContainer.ReportError(HtmlRenderErrorType.CssParsing, "Error in correcting relative URL in loaded stylesheet", ex); } diff --git a/Source/HtmlRenderer/Core/HtmlContainerInt.cs b/Source/HtmlRenderer/Core/HtmlContainerInt.cs index 2a1a8cd6b..6481dc3c1 100644 --- a/Source/HtmlRenderer/Core/HtmlContainerInt.cs +++ b/Source/HtmlRenderer/Core/HtmlContainerInt.cs @@ -147,7 +147,7 @@ public sealed class HtmlContainerInt : IDisposable /// Gets or sets a value indicating if image loading only when visible should be avoided (default - false).
///
private bool _avoidImagesLateLoading; - + /// /// the top-left most location of the rendered html /// @@ -421,7 +421,7 @@ public void SetHtml(string htmlSource, CssData baseCssData = null) DomParser parser = new DomParser(_cssParser); _root = parser.GenerateCssTree(htmlSource, this, ref _cssData); - if( _root != null ) + if (_root != null) { _selectionHandler = new SelectionHandler(_root); } @@ -491,14 +491,14 @@ public void PerformLayout(IGraphics g) { _actualSize = RSize.Empty; - // if width is not restricted we set it to large value to get the actual later + // if width is not restricted we set it to large value to get the actual later _root.Size = new RSize(_maxSize.Width > 0 ? _maxSize.Width : 99999, 0); - _root.Location = _location; + _root.Location = _location; _root.PerformLayout(g); - if (_maxSize.Width <= 0.1) - { - // in case the width is not restricted we need to double layout, first will find the width so second can layout by it (center alignment) + if (_maxSize.Width <= 0.1) + { + // in case the width is not restricted we need to double layout, first will find the width so second can layout by it (center alignment) _root.Size = new RSize((int)Math.Ceiling(_actualSize.Width), 0); _actualSize = RSize.Empty; _root.PerformLayout(g); @@ -834,7 +834,7 @@ internal void AddHoverBox(CssBox box, CssBlock block) ArgChecker.AssertArgNotNull(box, "box"); ArgChecker.AssertArgNotNull(block, "block"); - if( _hoverBoxes == null ) + if (_hoverBoxes == null) _hoverBoxes = new List(); _hoverBoxes.Add(new HoverBoxBlock(box, block)); diff --git a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs index 42c16bd8a..3294143d2 100644 --- a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs +++ b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs @@ -74,7 +74,7 @@ public static RSize MeasureHtmlByRestrictions(IGraphics g, HtmlContainerInt html /// if to modify the height by html content layout public static RSize Layout(IGraphics g, HtmlContainerInt htmlContainer, RSize size, RSize minSize, RSize maxSize, bool autoSize, bool autoSizeHeightOnly) { - if( autoSize ) + if (autoSize) htmlContainer.MaxSize = new RSize(0, 0); else if (autoSizeHeightOnly) htmlContainer.MaxSize = new RSize(size.Width, 0); @@ -84,9 +84,9 @@ public static RSize Layout(IGraphics g, HtmlContainerInt htmlContainer, RSize si htmlContainer.PerformLayout(g); RSize newSize = size; - if( autoSize || autoSizeHeightOnly ) + if (autoSize || autoSizeHeightOnly) { - if( autoSize ) + if (autoSize) { if (maxSize.Width > 0 && maxSize.Width < htmlContainer.ActualSize.Width) { @@ -113,7 +113,7 @@ public static RSize Layout(IGraphics g, HtmlContainerInt htmlContainer, RSize si : htmlContainer.ActualSize.Height; // handle if changing the height of the label affects the desired width and those require re-layout - if( Math.Abs(prevWidth - size.Width) > 0.01 ) + if (Math.Abs(prevWidth - size.Width) > 0.01) return Layout(g, htmlContainer, size, minSize, maxSize, false, true); } } diff --git a/Source/HtmlRenderer/Core/Parse/CssParser.cs b/Source/HtmlRenderer/Core/Parse/CssParser.cs index b577dcdb7..91823d9ec 100644 --- a/Source/HtmlRenderer/Core/Parse/CssParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssParser.cs @@ -46,7 +46,7 @@ internal sealed class CssParser /// /// The chars to trim the css class name by /// - private static readonly char[] _cssClassTrimChars = new[] {'\r', '\n', '\t', ' ', '-', '!', '<', '>'}; + private static readonly char[] _cssClassTrimChars = new[] { '\r', '\n', '\t', ' ', '-', '!', '<', '>' }; #endregion @@ -150,7 +150,7 @@ private static string RemoveStylesheetComments(string stylesheet) while (startIdx > -1 && startIdx < stylesheet.Length) { startIdx = stylesheet.IndexOf("/*", startIdx); - if(startIdx > -1) + if (startIdx > -1) { if (sb == null) sb = new StringBuilder(stylesheet.Length); @@ -162,12 +162,12 @@ private static string RemoveStylesheetComments(string stylesheet) prevIdx = startIdx = endIdx + 2; } - else if(sb != null) + else if (sb != null) { sb.Append(stylesheet.Substring(prevIdx)); } } - + return sb != null ? sb.ToString() : stylesheet; } @@ -231,7 +231,7 @@ private void ParseMediaStyleBlocks(CssData cssData, string stylesheet) while ((atrule = RegexParserUtils.GetCssAtRules(stylesheet, ref startIdx)) != null) { //Just process @media rules - if (!atrule.StartsWith("@media",StringComparison.InvariantCultureIgnoreCase)) continue; + if (!atrule.StartsWith("@media", StringComparison.InvariantCultureIgnoreCase)) continue; //Extract specified media types MatchCollection types = RegexParserUtils.Match(RegexParserUtils.CssMediaTypes, atrule); @@ -407,7 +407,7 @@ private Dictionary ParseCssBlockProperties(string blockSource) if (adjEndIdx >= splitIdx) { string propValue = blockSource.Substring(splitIdx, adjEndIdx - splitIdx + 1).Trim(); - if(!propValue.StartsWith("url",StringComparison.InvariantCultureIgnoreCase)) + if (!propValue.StartsWith("url", StringComparison.InvariantCultureIgnoreCase)) propValue = propValue.ToLower(); AddProperty(propName, propValue, properties); } @@ -435,7 +435,7 @@ private void AddProperty(string propName, string propValue, Dictionarythe properties collection to add to private static void ParseLengthProperty(string propName, string propValue, Dictionary properties) { - if (CssValueParser.IsValidLength(propValue) || propValue.Equals(CssConstants.Auto,StringComparison.OrdinalIgnoreCase)) + if (CssValueParser.IsValidLength(propValue) || propValue.Equals(CssConstants.Auto, StringComparison.OrdinalIgnoreCase)) { properties[propName] = propValue; } @@ -579,11 +579,11 @@ private void ParseFontProperty(string propValue, Dictionary prop private static string ParseBackgroundImageProperty(string propValue) { int startIdx = propValue.IndexOf("url(", StringComparison.InvariantCultureIgnoreCase); - if(startIdx > -1) + if (startIdx > -1) { startIdx += 4; var endIdx = propValue.IndexOf(')', startIdx); - if(endIdx > -1) + if (endIdx > -1) { endIdx -= 1; while (startIdx < endIdx && (char.IsWhiteSpace(propValue[startIdx]) || propValue[startIdx] == '\'')) @@ -607,12 +607,12 @@ private static string ParseBackgroundImageProperty(string propValue) private string ParseFontFamilyProperty(string propValue) { int start = 0; - while(start > -1 && start < propValue.Length) + while (start > -1 && start < propValue.Length) { while (char.IsWhiteSpace(propValue[start]) || propValue[start] == ',' || propValue[start] == '\'' || propValue[start] == '"') start++; var end = propValue.IndexOf(',', start); - if(end < 0) + if (end < 0) end = propValue.Length; var adjEnd = end - 1; while (char.IsWhiteSpace(propValue[adjEnd]) || propValue[adjEnd] == '\'' || propValue[adjEnd] == '"') @@ -627,7 +627,7 @@ private string ParseFontFamilyProperty(string propValue) start = end; } - + return CssConstants.Inherit; } diff --git a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs index 375fba30e..11584db52 100644 --- a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs @@ -97,7 +97,7 @@ public static bool IsInt(string str, int idx, int length) /// true - valid, false - invalid public static bool IsValidLength(string value) { - if(value.Length > 1) + if (value.Length > 1) { string number = string.Empty; if (value.EndsWith("%")) @@ -207,7 +207,7 @@ public static double ParseLength(string length, double hundredPercent, double em factor = emFactor; break; case CssConstants.Ex: - factor = emFactor/2; + factor = emFactor / 2; break; case CssConstants.Px: factor = fontAdjust ? 72f / 96f : 1f; //atodo: check support for hi dpi @@ -368,20 +368,20 @@ private static bool GetColorByHex(string str, int idx, int length, out RColor co int b = -1; if (length == 7) { - r = ParseHexInt(str, idx+1, 2); - g = ParseHexInt(str, idx+3, 2); - b = ParseHexInt(str, idx+5, 2); + r = ParseHexInt(str, idx + 1, 2); + g = ParseHexInt(str, idx + 3, 2); + b = ParseHexInt(str, idx + 5, 2); } else if (length == 4) { - r = ParseHexInt(str, idx+1, 1); + r = ParseHexInt(str, idx + 1, 1); r = r * 16 + r; - g = ParseHexInt(str, idx+2, 1); + g = ParseHexInt(str, idx + 2, 1); g = g * 16 + g; b = ParseHexInt(str, idx + 3, 1); b = b * 16 + b; } - if(r > -1 && g > -1 && b > -1) + if (r > -1 && g > -1 && b > -1) { color = RColor.FromArgb(r, g, b); return true; @@ -400,7 +400,7 @@ private static bool GetColorByRgb(string str, int idx, int length, out RColor co int g = -1; int b = -1; - if(length > 10) + if (length > 10) { int s = idx + 4; r = ParseIntAtIndex(str, ref s); @@ -413,7 +413,7 @@ private static bool GetColorByRgb(string str, int idx, int length, out RColor co b = ParseIntAtIndex(str, ref s); } } - + if (r > -1 && g > -1 && b > -1) { color = RColor.FromArgb(r, g, b); @@ -438,7 +438,7 @@ private static bool GetColorByRgba(string str, int idx, int length, out RColor c { int s = idx + 5; r = ParseIntAtIndex(str, ref s); - + if (s < idx + length) { g = ParseIntAtIndex(str, ref s); diff --git a/Source/HtmlRenderer/Core/Parse/DomParser.cs b/Source/HtmlRenderer/Core/Parse/DomParser.cs index 4411175bc..bb4dbbf13 100644 --- a/Source/HtmlRenderer/Core/Parse/DomParser.cs +++ b/Source/HtmlRenderer/Core/Parse/DomParser.cs @@ -39,7 +39,7 @@ internal sealed class DomParser /// Init. ///
public DomParser(CssParser cssParser) - { + { ArgChecker.AssertArgNotNull(cssParser, "cssParser"); _cssParser = cssParser; @@ -122,7 +122,7 @@ private void CascadeStyles(CssBox box, HtmlContainerInt htmlContainer, ref CssDa if (box.HtmlTag.HasAttribute("style")) { var block = _cssParser.ParseCssBlock(box.HtmlTag.Name, box.HtmlTag.TryGetAttribute("style")); - if(block != null) + if (block != null) AssignCssBlock(box, block); } @@ -141,10 +141,10 @@ private void CascadeStyles(CssBox box, HtmlContainerInt htmlContainer, ref CssDa CloneCssData(ref cssData, ref cssDataChanged); string stylesheet; CssData stylesheetData; - StylesheetLoadHandler.LoadStylesheet(htmlContainer, box.GetAttribute("href", string.Empty), box.HtmlTag.Attributes,out stylesheet, out stylesheetData); + StylesheetLoadHandler.LoadStylesheet(htmlContainer, box.GetAttribute("href", string.Empty), box.HtmlTag.Attributes, out stylesheet, out stylesheetData); if (stylesheet != null) _cssParser.ParseStyleSheet(cssData, stylesheet); - else if( stylesheetData != null ) + else if (stylesheetData != null) cssData.Combine(stylesheetData); } } @@ -670,7 +670,7 @@ private static void CorrectBlockInsideInline(CssBox box) if (DomUtils.ContainsInlinesOnly(box) && !ContainsInlinesOnlyDeep(box)) { var tempRightBox = CorrectBlockInsideInlineImp(box); - while( tempRightBox != null ) + while (tempRightBox != null) { // loop on the created temp right box for the fixed box until no more need (optimization remove recursion) CssBox newTempRightBox = null; @@ -703,14 +703,14 @@ private static void CorrectBlockInsideInline(CssBox box) /// the box that has the problem private static CssBox CorrectBlockInsideInlineImp(CssBox box) { - if( box.Display == CssConstants.Inline ) + if (box.Display == CssConstants.Inline) box.Display = CssConstants.Block; - if( box.Boxes.Count > 1 || box.Boxes[0].Boxes.Count > 1 ) + if (box.Boxes.Count > 1 || box.Boxes[0].Boxes.Count > 1) { var leftBlock = CssBox.CreateBlock(box); - while( ContainsInlinesOnlyDeep(box.Boxes[0]) ) + while (ContainsInlinesOnlyDeep(box.Boxes[0])) box.Boxes[0].ParentBox = leftBlock; leftBlock.SetBeforeBox(box.Boxes[0]); @@ -720,21 +720,21 @@ private static CssBox CorrectBlockInsideInlineImp(CssBox box) CorrectBlockSplitBadBox(box, splitBox, leftBlock); // remove block that did not get any inner elements - if( leftBlock.Boxes.Count < 1 ) + if (leftBlock.Boxes.Count < 1) leftBlock.ParentBox = null; int minBoxes = leftBlock.ParentBox != null ? 2 : 1; - if( box.Boxes.Count > minBoxes ) + if (box.Boxes.Count > minBoxes) { // create temp box to handle the tail elements and then get them back so no deep hierarchy is created var tempRightBox = CssBox.CreateBox(box, null, box.Boxes[minBoxes]); - while( box.Boxes.Count > minBoxes + 1 ) + while (box.Boxes.Count > minBoxes + 1) box.Boxes[minBoxes + 1].ParentBox = tempRightBox; return tempRightBox; } } - else if( box.Boxes[0].Display == CssConstants.Inline ) + else if (box.Boxes[0].Display == CssConstants.Inline) { box.Boxes[0].Display = CssConstants.Block; } @@ -754,7 +754,7 @@ private static void CorrectBlockSplitBadBox(CssBox parentBox, CssBox badBox, Css CssBox leftbox = null; while (badBox.Boxes[0].IsInline && ContainsInlinesOnlyDeep(badBox.Boxes[0])) { - if(leftbox == null) + if (leftbox == null) { // if there is no elements in the left box there is no reason to keep it leftbox = CssBox.CreateBox(leftBlock, badBox.HtmlTag); diff --git a/Source/HtmlRenderer/Core/Parse/HtmlParser.cs b/Source/HtmlRenderer/Core/Parse/HtmlParser.cs index 5fa92dbe7..b2707d757 100644 --- a/Source/HtmlRenderer/Core/Parse/HtmlParser.cs +++ b/Source/HtmlRenderer/Core/Parse/HtmlParser.cs @@ -37,14 +37,14 @@ public static CssBox ParseDocument(string source) while (startIdx >= 0) { var tagIdx = source.IndexOf('<', startIdx); - if(tagIdx >= 0 && tagIdx < source.Length) + if (tagIdx >= 0 && tagIdx < source.Length) { // add the html text as anon css box to the structure AddTextBox(source, startIdx, tagIdx, ref curBox); if (source[tagIdx + 1] == '!') { - if( source[tagIdx + 2] == '-' ) + if (source[tagIdx + 2] == '-') { // skip the html comment elements () startIdx = source.IndexOf("-->", tagIdx + 2); @@ -62,11 +62,11 @@ public static CssBox ParseDocument(string source) // parse element tag to css box structure endIdx = ParseHtmlTag(source, tagIdx, ref curBox) + 1; - if( curBox.HtmlTag != null && curBox.HtmlTag.Name.Equals(HtmlConstants.Style, StringComparison.OrdinalIgnoreCase) ) + if (curBox.HtmlTag != null && curBox.HtmlTag.Name.Equals(HtmlConstants.Style, StringComparison.OrdinalIgnoreCase)) { var endIdxS = endIdx; endIdx = source.IndexOf("", endIdx, StringComparison.OrdinalIgnoreCase); - if(endIdx > -1) + if (endIdx > -1) AddTextBox(source, endIdxS, endIdx, ref curBox); } } @@ -79,7 +79,7 @@ public static CssBox ParseDocument(string source) { // there is text after the end of last element var endText = new SubString(source, endIdx, source.Length - endIdx); - if(!endText.IsEmptyOrWhitespace()) + if (!endText.IsEmptyOrWhitespace()) { var abox = CssBox.CreateBox(root); abox.Text = endText; @@ -184,14 +184,14 @@ private static bool ParseHtmlTag(string source, int idx, int length, out string } int spaceIdx = idx; - while (spaceIdx < idx + length && !char.IsWhiteSpace(source,spaceIdx)) + while (spaceIdx < idx + length && !char.IsWhiteSpace(source, spaceIdx)) spaceIdx++; // Get the name of the tag name = source.Substring(idx, spaceIdx - idx).ToLower(); attributes = null; - if(!isClosing && idx+length > spaceIdx) + if (!isClosing && idx + length > spaceIdx) { ExtractAttributes(source, spaceIdx, length - (spaceIdx - idx), out attributes); } @@ -211,7 +211,7 @@ private static void ExtractAttributes(string source, int idx, int length, out Di attributes = null; int startIdx = idx; - while (startIdx < idx + length) + while (startIdx < idx + length) { while (startIdx < idx + length && char.IsWhiteSpace(source, startIdx)) startIdx++; diff --git a/Source/HtmlRenderer/Core/Utils/CommonUtils.cs b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs index cec3e1de6..8baf5110c 100644 --- a/Source/HtmlRenderer/Core/Utils/CommonUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs @@ -100,7 +100,7 @@ public static bool IsAsianCharecter(char ch) /// true - is digit, false - not a digit public static bool IsDigit(char ch, bool hex = false) { - return ( ch >= '0' && ch <= '9' ) || ( hex && ( ( ch >= 'a' && ch <= 'f' ) || ( ch >= 'A' && ch <= 'F' ) ) ); + return (ch >= '0' && ch <= '9') || (hex && ((ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F'))); } /// @@ -111,13 +111,13 @@ public static bool IsDigit(char ch, bool hex = false) /// true - is digit, false - not a digit public static int ToDigit(char ch, bool hex = false) { - if( ch >= '0' && ch <= '9' ) + if (ch >= '0' && ch <= '9') return ch - '0'; - else if( hex ) + else if (hex) { - if( ch >= 'a' && ch <= 'f' ) + if (ch >= 'a' && ch <= 'f') return ch - 'a' + 10; - else if(ch >= 'A' && ch <= 'F') + else if (ch >= 'A' && ch <= 'F') return ch - 'A' + 10; } @@ -147,7 +147,7 @@ public static Uri TryGetUri(string path) } } catch - {} + { } return null; } @@ -162,7 +162,7 @@ public static Uri TryGetUri(string path) /// first element or default value public static TValue GetFirstValueOrDefault(IDictionary dic, TValue defaultValue = default(TValue)) { - if(dic != null) + if (dic != null) { foreach (var value in dic) return value.Value; @@ -288,7 +288,7 @@ public static int GetNextSubString(string str, int idx, out int length) length = 0; return -1; } - + /// /// Compare that the substring of is equal to /// Assume given substring is not empty and all indexes are valid!
@@ -335,35 +335,35 @@ public static string ConvertToAlphaNumber(int number, string style = CssConstant if (number == 0) return string.Empty; - if( style.Equals(CssConstants.LowerGreek,StringComparison.InvariantCultureIgnoreCase) ) + if (style.Equals(CssConstants.LowerGreek, StringComparison.InvariantCultureIgnoreCase)) { return ConvertToGreekNumber(number); } - else if( style.Equals(CssConstants.LowerRoman ,StringComparison.InvariantCultureIgnoreCase) ) + else if (style.Equals(CssConstants.LowerRoman, StringComparison.InvariantCultureIgnoreCase)) { return ConvertToRomanNumbers(number, true); } - else if( style.Equals(CssConstants.UpperRoman ,StringComparison.InvariantCultureIgnoreCase) ) + else if (style.Equals(CssConstants.UpperRoman, StringComparison.InvariantCultureIgnoreCase)) { return ConvertToRomanNumbers(number, false); } - else if( style.Equals(CssConstants.Armenian ,StringComparison.InvariantCultureIgnoreCase) ) + else if (style.Equals(CssConstants.Armenian, StringComparison.InvariantCultureIgnoreCase)) { return ConvertToSpecificNumbers(number, _armenianDigitsTable); } - else if( style.Equals(CssConstants.Georgian ,StringComparison.InvariantCultureIgnoreCase) ) + else if (style.Equals(CssConstants.Georgian, StringComparison.InvariantCultureIgnoreCase)) { return ConvertToSpecificNumbers(number, _georgianDigitsTable); } - else if( style.Equals(CssConstants.Hebrew ,StringComparison.InvariantCultureIgnoreCase) ) + else if (style.Equals(CssConstants.Hebrew, StringComparison.InvariantCultureIgnoreCase)) { return ConvertToSpecificNumbers(number, _hebrewDigitsTable); } - else if( style.Equals(CssConstants.Hiragana,StringComparison.InvariantCultureIgnoreCase) || style.Equals(CssConstants.HiraganaIroha ,StringComparison.InvariantCultureIgnoreCase) ) + else if (style.Equals(CssConstants.Hiragana, StringComparison.InvariantCultureIgnoreCase) || style.Equals(CssConstants.HiraganaIroha, StringComparison.InvariantCultureIgnoreCase)) { return ConvertToSpecificNumbers2(number, _hiraganaDigitsTable); } - else if( style.Equals(CssConstants.Katakana,StringComparison.InvariantCultureIgnoreCase) || style.Equals(CssConstants.KatakanaIroha ,StringComparison.InvariantCultureIgnoreCase) ) + else if (style.Equals(CssConstants.Katakana, StringComparison.InvariantCultureIgnoreCase) || style.Equals(CssConstants.KatakanaIroha, StringComparison.InvariantCultureIgnoreCase)) { return ConvertToSpecificNumbers2(number, _satakanaDigitsTable); } @@ -386,16 +386,16 @@ private static string ConvertToEnglishNumber(int number, bool lowercase) int alphStart = lowercase ? 97 : 65; while (number > 0) { - var n = number % 26 -1; + var n = number % 26 - 1; if (n >= 0) { - sb = (Char) (alphStart + n) + sb; - number = number/26; + sb = (Char)(alphStart + n) + sb; + number = number / 26; } else { - sb = (Char) (alphStart + 25) + sb; - number = (number - 1)/26; + sb = (Char)(alphStart + 25) + sb; + number = (number - 1) / 26; } } @@ -413,7 +413,7 @@ private static string ConvertToGreekNumber(int number) while (number > 0) { var n = number % 24 - 1; - if( n > 16 ) + if (n > 16) n++; if (n >= 0) { @@ -439,11 +439,11 @@ private static string ConvertToGreekNumber(int number) private static string ConvertToRomanNumbers(int number, bool lowercase) { var sb = string.Empty; - for(int i = 1000, j = 3; i > 0; i /= 10, j--) + for (int i = 1000, j = 3; i > 0; i /= 10, j--) { - int digit = number/i; + int digit = number / i; sb += string.Format(_romanDigitsTable[j, digit]); - number -= digit*i; + number -= digit * i; } return lowercase ? sb.ToLower() : sb; } @@ -461,7 +461,7 @@ private static string ConvertToSpecificNumbers(int number, string[,] alphabet) while (number > 0 && level < alphabet.GetLength(0)) { var n = number % 10; - if(n > 0) + if (n > 0) sb = alphabet[level, number % 10 - 1].ToString(CultureInfo.InvariantCulture) + sb; number /= 10; level++; @@ -486,8 +486,8 @@ private static string ConvertToSpecificNumbers2(int number, string[] alphabet) var sb = string.Empty; while (number > 0) { - - + + sb = alphabet[Math.Max(0, number % 49 - 1)].ToString(CultureInfo.InvariantCulture) + sb; number /= 49; } diff --git a/Source/HtmlRenderer/Core/Utils/CssUtils.cs b/Source/HtmlRenderer/Core/Utils/CssUtils.cs index f21a924c6..10ad6c678 100644 --- a/Source/HtmlRenderer/Core/Utils/CssUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CssUtils.cs @@ -29,7 +29,7 @@ internal static class CssUtils /// /// Brush for selection background /// - private static readonly RColor _defaultSelectionBackcolor = RColor.FromArgb(0xa9,0x33, 0x99, 0xFF); + private static readonly RColor _defaultSelectionBackcolor = RColor.FromArgb(0xa9, 0x33, 0x99, 0xFF); #endregion diff --git a/Source/HtmlRenderer/Core/Utils/DomUtils.cs b/Source/HtmlRenderer/Core/Utils/DomUtils.cs index 68b8cae7c..e29de701e 100644 --- a/Source/HtmlRenderer/Core/Utils/DomUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/DomUtils.cs @@ -239,8 +239,8 @@ public static CssBox GetLinkBox(CssBox box, RPoint location) if (box.IsClickable && box.Visibility == CssConstants.Visible) { if (IsInBox(box, location)) - return box; - } + return box; + } if (box.ClientRectangle.IsEmpty || box.ClientRectangle.Contains(location)) { @@ -606,7 +606,7 @@ private static CssBox GetSelectionRoot(CssBox root, Dictionary sel if (selectedBoxes.ContainsKey(childBox)) { if (selectedChild != null) - { + { foundRoot = true; break; } @@ -667,46 +667,46 @@ private static void WriteHtml(CssParser cssParser, StringBuilder sb, CssBox box, { if (box.HtmlTag == null || selectedBoxes == null || selectedBoxes.ContainsKey(box)) { - if (box.HtmlTag != null) - { - if (box.HtmlTag.Name != "link" || !box.HtmlTag.Attributes.ContainsKey("href") || - (!box.HtmlTag.Attributes["href"].StartsWith("property") && !box.HtmlTag.Attributes["href"].StartsWith("method"))) + if (box.HtmlTag != null) { + if (box.HtmlTag.Name != "link" || !box.HtmlTag.Attributes.ContainsKey("href") || + (!box.HtmlTag.Attributes["href"].StartsWith("property") && !box.HtmlTag.Attributes["href"].StartsWith("method"))) + { WriteHtmlTag(cssParser, sb, box, styleGen); if (box == selectionRoot) sb.Append(""); - } + } - if (styleGen == HtmlGenerationStyle.InHeader && box.HtmlTag.Name == "html" && box.HtmlContainer.CssData != null) - { - sb.AppendLine(""); + if (styleGen == HtmlGenerationStyle.InHeader && box.HtmlTag.Name == "html" && box.HtmlContainer.CssData != null) + { + sb.AppendLine(""); WriteStylesheet(sb, box.HtmlContainer.CssData); - sb.AppendLine(""); + sb.AppendLine(""); + } } - } - if (box.Words.Count > 0) - { - foreach (var word in box.Words) + if (box.Words.Count > 0) { - if (selectedBoxes == null || word.Selected) + foreach (var word in box.Words) { + if (selectedBoxes == null || word.Selected) + { var wordText = GetSelectedWord(word, selectedBoxes != null); - sb.Append(HtmlUtils.EncodeHtml(wordText)); + sb.Append(HtmlUtils.EncodeHtml(wordText)); + } } } - } - foreach (var childBox in box.Boxes) - { - WriteHtml(cssParser,sb, childBox, styleGen, selectedBoxes, selectionRoot); - } + foreach (var childBox in box.Boxes) + { + WriteHtml(cssParser, sb, childBox, styleGen, selectedBoxes, selectionRoot); + } - if (box.HtmlTag != null && !box.HtmlTag.IsSingle) - { + if (box.HtmlTag != null && !box.HtmlTag.IsSingle) + { if (box == selectionRoot) sb.Append(""); - sb.AppendFormat("", box.HtmlTag.Name); + sb.AppendFormat("", box.HtmlTag.Name); } } } @@ -774,12 +774,12 @@ private static void WriteHtmlTag(CssParser cssParser, StringBuilder sb, CssBox b var cleanTagStyles = StripDefaultStyles(box, tagStyles); if (cleanTagStyles.Count > 0) { - sb.Append(" style=\""); + sb.Append(" style=\""); foreach (var style in cleanTagStyles) - sb.AppendFormat("{0}: {1}; ", style.Key, style.Value); - sb.Remove(sb.Length - 1, 1); - sb.Append("\""); - } + sb.AppendFormat("{0}: {1}; ", style.Key, style.Value); + sb.Remove(sb.Length - 1, 1); + sb.Append("\""); + } } sb.AppendFormat("{0}>", box.HtmlTag.IsSingle ? "/" : ""); diff --git a/Source/HtmlRenderer/Core/Utils/HtmlUtils.cs b/Source/HtmlRenderer/Core/Utils/HtmlUtils.cs index c682ca71d..071ae137b 100644 --- a/Source/HtmlRenderer/Core/Utils/HtmlUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/HtmlUtils.cs @@ -34,7 +34,7 @@ internal static class HtmlUtils /// /// the html encode\decode pairs /// - private static readonly KeyValuePair[] _encodeDecode = new[] + private static readonly KeyValuePair[] _encodeDecode = new[] { new KeyValuePair("<", "<"), new KeyValuePair(">", ">"), @@ -341,7 +341,7 @@ public static string EncodeHtml(string str) { if (!string.IsNullOrEmpty(str)) { - for (int i = _encodeDecode.Length-1; i >= 0; i--) + for (int i = _encodeDecode.Length - 1; i >= 0; i--) { str = str.Replace(_encodeDecode[i].Value, _encodeDecode[i].Key); } @@ -365,8 +365,8 @@ private static string DecodeHtmlCharByCode(string str) var endIdx = idx + 2 + (hex ? 1 : 0); long num = 0; - while( endIdx < str.Length && CommonUtils.IsDigit(str[endIdx], hex) ) - num = num*( hex ? 16 : 10 ) + CommonUtils.ToDigit(str[endIdx++], hex); + while (endIdx < str.Length && CommonUtils.IsDigit(str[endIdx], hex)) + num = num * (hex ? 16 : 10) + CommonUtils.ToDigit(str[endIdx++], hex); endIdx += (endIdx < str.Length && str[endIdx] == ';') ? 1 : 0; str = str.Remove(idx, endIdx - idx); @@ -388,18 +388,18 @@ private static string DecodeHtmlCharByName(string str) while (idx > -1) { var endIdx = str.IndexOf(';', idx); - if(endIdx > -1 && endIdx - idx < 8) + if (endIdx > -1 && endIdx - idx < 8) { var key = str.Substring(idx + 1, endIdx - idx - 1); char c; - if(_decodeOnly.TryGetValue(key,out c)) + if (_decodeOnly.TryGetValue(key, out c)) { - str = str.Remove(idx, endIdx - idx+1); + str = str.Remove(idx, endIdx - idx + 1); str = str.Insert(idx, c.ToString()); } } - idx = str.IndexOf('&', idx+1); + idx = str.IndexOf('&', idx + 1); } return str; } diff --git a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs index ca9143c07..75d95a55f 100644 --- a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs @@ -134,7 +134,7 @@ public static IGraphicsPath GetRoundRect(IGraphics g, RRect rect, double nwRadiu path.AddLine(rect.X + nwRadius, rect.Y, rect.Right - neRadius, rect.Y); //NE Arc - if( neRadius > 0f ) + if (neRadius > 0f) { path.AddArc(rect.Right - neRadius, rect.Top, neRadius, neRadius, -90, 90); } @@ -145,7 +145,7 @@ public static IGraphicsPath GetRoundRect(IGraphics g, RRect rect, double nwRadiu path.AddLine(rect.Right, rect.Top + neRadius, rect.Right, rect.Bottom - seRadius); //SE Arc - if( seRadius > 0f ) + if (seRadius > 0f) { path.AddArc(rect.Right - seRadius, rect.Bottom - seRadius, seRadius, seRadius, 0, 90); } @@ -154,7 +154,7 @@ public static IGraphicsPath GetRoundRect(IGraphics g, RRect rect, double nwRadiu path.AddLine(rect.Right - seRadius, rect.Bottom, rect.Left + swRadius, rect.Bottom); //SW Arc - if( swRadius > 0f ) + if (swRadius > 0f) { path.AddArc(rect.Left, rect.Bottom - swRadius, swRadius, swRadius, 90, 90); } @@ -165,9 +165,9 @@ public static IGraphicsPath GetRoundRect(IGraphics g, RRect rect, double nwRadiu path.AddLine(rect.Left, rect.Bottom - swRadius, rect.Left, rect.Top + swRadius); //NW Arc - if( nwRadius > 0f ) + if (nwRadius > 0f) { - path.AddArc(rect.Left, rect.Top, nwRadius, nwRadius,180, 90); + path.AddArc(rect.Left, rect.Top, nwRadius, nwRadius, 180, 90); } return path; diff --git a/Source/HtmlRenderer/Core/Utils/SubString.cs b/Source/HtmlRenderer/Core/Utils/SubString.cs index 18af1df79..e9b81cdca 100644 --- a/Source/HtmlRenderer/Core/Utils/SubString.cs +++ b/Source/HtmlRenderer/Core/Utils/SubString.cs @@ -62,9 +62,9 @@ public SubString(string fullString) public SubString(string fullString, int startIdx, int length) { ArgChecker.AssertArgNotNull(fullString, "fullString"); - if(startIdx < 0 || startIdx >= fullString.Length) + if (startIdx < 0 || startIdx >= fullString.Length) throw new ArgumentOutOfRangeException("startIdx", "Must within fullString boundries"); - if(length < 0 || startIdx + length > fullString.Length) + if (length < 0 || startIdx + length > fullString.Length) throw new ArgumentOutOfRangeException("length", "Must within fullString boundries"); _fullString = fullString; @@ -173,7 +173,7 @@ public string Substring(int startIdx, int length) throw new ArgumentOutOfRangeException("startIdx"); if (length > _length) throw new ArgumentOutOfRangeException("length"); - if(startIdx + length > _length) + if (startIdx + length > _length) throw new ArgumentOutOfRangeException("length"); return _fullString.Substring(_startIdx + startIdx, length); diff --git a/Source/HtmlRenderer/Entities/CssBlock.cs b/Source/HtmlRenderer/Entities/CssBlock.cs index edb886a37..6c2626d58 100644 --- a/Source/HtmlRenderer/Entities/CssBlock.cs +++ b/Source/HtmlRenderer/Entities/CssBlock.cs @@ -35,7 +35,7 @@ public sealed class CssBlock /// /// the CSS block properties and values /// - private readonly Dictionary _properties; + private readonly Dictionary _properties; /// /// additional selectors to used in hierarchy (p className1 > className2) @@ -87,7 +87,7 @@ public List Selectors /// /// Gets the CSS block properties and its values /// - public IDictionary Properties + public IDictionary Properties { get { return _properties; } } @@ -131,13 +131,13 @@ public CssBlock Clone() /// true - the two blocks are the same, false - otherwise public bool Equals(CssBlock other) { - if (ReferenceEquals(null, other)) + if (ReferenceEquals(null, other)) return false; - if (ReferenceEquals(this, other)) + if (ReferenceEquals(this, other)) return true; if (!Equals(other._class, _class)) return false; - + if (!Equals(other._properties.Count, _properties.Count)) return false; @@ -167,7 +167,7 @@ public bool EqualsSelector(CssBlock other) if (ReferenceEquals(this, other)) return true; - if( other.Hover != Hover ) + if (other.Hover != Hover) return false; if (other._selectors == null && _selectors != null) return false; @@ -176,7 +176,7 @@ public bool EqualsSelector(CssBlock other) if (other._selectors != null && _selectors != null) { - if (!Equals(other._selectors.Count,_selectors.Count)) + if (!Equals(other._selectors.Count, _selectors.Count)) return false; for (int i = 0; i < _selectors.Count; i++) @@ -198,13 +198,13 @@ public bool EqualsSelector(CssBlock other) /// true - the two blocks are the same, false - otherwise public override bool Equals(object obj) { - if (ReferenceEquals(null, obj)) + if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) + if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != typeof (CssBlock)) + if (obj.GetType() != typeof(CssBlock)) return false; - return Equals((CssBlock) obj); + return Equals((CssBlock)obj); } /// @@ -215,7 +215,7 @@ public override int GetHashCode() { unchecked { - return ((_class != null ? _class.GetHashCode() : 0)*397) ^ (_properties != null ? _properties.GetHashCode() : 0); + return ((_class != null ? _class.GetHashCode() : 0) * 397) ^ (_properties != null ? _properties.GetHashCode() : 0); } } diff --git a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs index baf886f46..2e16aa5c8 100644 --- a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs @@ -36,7 +36,7 @@ namespace HtmlRenderer.Entities /// provide file path to load the image from. Can also use the asynchronous image overwrite not to block HTML rendering is applicable.
/// If no alternative data is provided the original source will be used.
///
- public sealed class HtmlImageLoadEventArgs : EventArgs + public sealed class HtmlImageLoadEventArgs : EventArgs { #region Fields and Consts @@ -120,7 +120,7 @@ public void Callback() public void Callback(string path) { ArgChecker.AssertArgNotNullOrEmpty(path, "path"); - + _handled = true; _callback(path, null, RRect.Empty); } @@ -151,7 +151,7 @@ public void Callback(string path, double x, double y, double width, double heigh public void Callback(Object image) { ArgChecker.AssertArgNotNull(image, "image"); - + _handled = true; _callback(null, image, RRect.Empty); } diff --git a/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs b/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs index fae32daf6..e9f8d802c 100644 --- a/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs +++ b/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs @@ -30,7 +30,8 @@ public HtmlLinkClickedException() /// Initializes a new instance of the class with a specified error message. ///
/// The message that describes the error. - public HtmlLinkClickedException(string message) : base(message) + public HtmlLinkClickedException(string message) + : base(message) { } @@ -38,7 +39,8 @@ public HtmlLinkClickedException(string message) : base(message) /// Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. ///
/// The error message that explains the reason for the exception. The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. - public HtmlLinkClickedException(string message, Exception innerException) : base(message, innerException) + public HtmlLinkClickedException(string message, Exception innerException) + : base(message, innerException) { } } diff --git a/Source/HtmlRenderer/Entities/RColor.cs b/Source/HtmlRenderer/Entities/RColor.cs index dee07d719..7e6eee26f 100644 --- a/Source/HtmlRenderer/Entities/RColor.cs +++ b/Source/HtmlRenderer/Entities/RColor.cs @@ -43,7 +43,7 @@ public static RColor Transparent ///
public static RColor Black { - get { return FromArgb(0,0,0); } + get { return FromArgb(0, 0, 0); } } /// @@ -51,7 +51,7 @@ public static RColor Black /// public static RColor White { - get { return FromArgb(255,255,255); } + get { return FromArgb(255, 255, 255); } } /// @@ -75,7 +75,7 @@ public static RColor LightGray /// public byte R { - get { return (byte)( (ulong)( _value >> 16 ) & byte.MaxValue ); } + get { return (byte)((ulong)(_value >> 16) & byte.MaxValue); } } /// @@ -147,7 +147,7 @@ public bool IsEmpty /// 3 public static bool operator !=(RColor left, RColor right) { - return !( left == right ); + return !(left == right); } /// @@ -213,7 +213,7 @@ public static RColor FromArgb(int red, int green, int blue) /// 1 public override bool Equals(object obj) { - if( obj is RColor ) + if (obj is RColor) { var color = (RColor)obj; return _value == color._value; @@ -263,7 +263,7 @@ public override string ToString() private static void CheckByte(int value) { - if( value >= 0 && value <= byte.MaxValue ) + if (value >= 0 && value <= byte.MaxValue) return; throw new ArgumentException("InvalidEx2BoundArgument"); } diff --git a/Source/HtmlRenderer/Entities/RPoint.cs b/Source/HtmlRenderer/Entities/RPoint.cs index 2c98408eb..4586bf9fd 100644 --- a/Source/HtmlRenderer/Entities/RPoint.cs +++ b/Source/HtmlRenderer/Entities/RPoint.cs @@ -29,7 +29,7 @@ public struct RPoint private double _y; static RPoint() - {} + { } /// /// Initializes a new instance of the class with the specified coordinates. @@ -56,7 +56,7 @@ public bool IsEmpty { get { - if( Math.Abs(_x - 0.0) < 0.001 ) + if (Math.Abs(_x - 0.0) < 0.001) return Math.Abs(_y - 0.0) < 0.001; else return false; @@ -162,7 +162,7 @@ public double Y /// 3 public static bool operator ==(RPoint left, RPoint right) { - if( left.X == right.X ) + if (left.X == right.X) return left.Y == right.Y; else return false; @@ -189,7 +189,7 @@ public double Y /// 3 public static bool operator !=(RPoint left, RPoint right) { - return !( left == right ); + return !(left == right); } /// @@ -253,10 +253,10 @@ public static RPoint Subtract(RPoint pt, RSize sz) /// 1 public override bool Equals(object obj) { - if( !( obj is RPoint ) ) + if (!(obj is RPoint)) return false; var pointF = (RPoint)obj; - if( pointF.X == X && pointF.Y == Y ) + if (pointF.X == X && pointF.Y == Y) return pointF.GetType().Equals(GetType()); else return false; diff --git a/Source/HtmlRenderer/Entities/RRect.cs b/Source/HtmlRenderer/Entities/RRect.cs index 8e7526ed5..730ac6aee 100644 --- a/Source/HtmlRenderer/Entities/RRect.cs +++ b/Source/HtmlRenderer/Entities/RRect.cs @@ -211,7 +211,7 @@ public bool IsEmpty { get { - if( Width > 0.0 ) + if (Width > 0.0) return Height <= 0.0; else return true; @@ -233,7 +233,7 @@ public bool IsEmpty /// public static bool operator ==(RRect left, RRect right) { - if( Math.Abs(left.X - right.X) < 0.001 && Math.Abs(left.Y - right.Y) < 0.001 && Math.Abs(left.Width - right.Width) < 0.001 ) + if (Math.Abs(left.X - right.X) < 0.001 && Math.Abs(left.Y - right.Y) < 0.001 && Math.Abs(left.Width - right.Width) < 0.001) return Math.Abs(left.Height - right.Height) < 0.001; else return false; @@ -255,7 +255,7 @@ public bool IsEmpty /// public static bool operator !=(RRect left, RRect right) { - return !( left == right ); + return !(left == right); } /// @@ -286,10 +286,10 @@ public static RRect FromLTRB(double left, double top, double right, double botto /// public override bool Equals(object obj) { - if( !( obj is RRect ) ) + if (!(obj is RRect)) return false; var rectangleF = (RRect)obj; - if( Math.Abs(rectangleF.X - X) < 0.001 && Math.Abs(rectangleF.Y - Y) < 0.001 && Math.Abs(rectangleF.Width - Width) < 0.001 ) + if (Math.Abs(rectangleF.X - X) < 0.001 && Math.Abs(rectangleF.Y - Y) < 0.001 && Math.Abs(rectangleF.Width - Width) < 0.001) return Math.Abs(rectangleF.Height - Height) < 0.001; else return false; @@ -307,7 +307,7 @@ public override bool Equals(object obj) /// The y-coordinate of the point to test. public bool Contains(double x, double y) { - if( X <= x && x < X + Width && Y <= y ) + if (X <= x && x < X + Width && Y <= y) return y < Y + Height; else return false; @@ -342,7 +342,7 @@ public bool Contains(RPoint pt) /// public bool Contains(RRect rect) { - if( X <= rect.X && rect.X + rect.Width <= X + Width && Y <= rect.Y ) + if (X <= rect.X && rect.X + rect.Width <= X + Width && Y <= rect.Y) return rect.Y + rect.Height <= Y + Height; else return false; @@ -361,8 +361,8 @@ public void Inflate(double x, double y) { X -= x; Y -= y; - Width += 2f*x; - Height += 2f*y; + Width += 2f * x; + Height += 2f * y; } /// @@ -425,7 +425,7 @@ public static RRect Intersect(RRect a, RRect b) double num1 = Math.Min(a.X + a.Width, b.X + b.Width); double y = Math.Max(a.Y, b.Y); double num2 = Math.Min(a.Y + a.Height, b.Y + b.Height); - if( num1 >= x && num2 >= y ) + if (num1 >= x && num2 >= y) return new RRect(x, y, num1 - x, num2 - y); else return Empty; @@ -440,7 +440,7 @@ public static RRect Intersect(RRect a, RRect b) /// The rectangle to test. public bool IntersectsWith(RRect rect) { - if( rect.X < X + Width && X < rect.X + rect.Width && rect.Y < Y + Height ) + if (rect.X < X + Width && X < rect.X + rect.Width && rect.Y < Y + Height) return Y < rect.Y + rect.Height; else return false; diff --git a/Source/HtmlRenderer/Entities/RSize.cs b/Source/HtmlRenderer/Entities/RSize.cs index 78a2ba124..cdabe0a55 100644 --- a/Source/HtmlRenderer/Entities/RSize.cs +++ b/Source/HtmlRenderer/Entities/RSize.cs @@ -102,7 +102,7 @@ public bool IsEmpty { get { - if( _width == 0.0 ) + if (_width == 0.0) return _height == 0.0; else return false; @@ -204,7 +204,7 @@ public static explicit operator RPoint(RSize size) /// 3 public static bool operator ==(RSize sz1, RSize sz2) { - if( Math.Abs(sz1.Width - sz2.Width) < 0.001 ) + if (Math.Abs(sz1.Width - sz2.Width) < 0.001) return Math.Abs(sz1.Height - sz2.Height) < 0.001; else return false; @@ -228,7 +228,7 @@ public static explicit operator RPoint(RSize size) /// 3 public static bool operator !=(RSize sz1, RSize sz2) { - return !( sz1 == sz2 ); + return !(sz1 == sz2); } /// @@ -289,10 +289,10 @@ public static RSize Subtract(RSize sz1, RSize sz2) /// 1 public override bool Equals(object obj) { - if( !( obj is RSize ) ) + if (!(obj is RSize)) return false; var sizeF = (RSize)obj; - if( Math.Abs(sizeF.Width - Width) < 0.001 && Math.Abs(sizeF.Height - Height) < 0.001 ) + if (Math.Abs(sizeF.Width - Width) < 0.001 && Math.Abs(sizeF.Height - Height) < 0.001) return sizeF.GetType() == GetType(); else return false; diff --git a/Source/HtmlRenderer/Interfaces/GlobalBase.cs b/Source/HtmlRenderer/Interfaces/GlobalBase.cs index f78ffd6b1..b08037f0b 100644 --- a/Source/HtmlRenderer/Interfaces/GlobalBase.cs +++ b/Source/HtmlRenderer/Interfaces/GlobalBase.cs @@ -67,7 +67,7 @@ protected GlobalBase() /// public CssData DefaultCssData { - get { return _defaultCssData ?? ( _defaultCssData = CssData.Parse(this, CssDefaults.DefaultStyleSheet, false) ); } + get { return _defaultCssData ?? (_defaultCssData = CssData.Parse(this, CssDefaults.DefaultStyleSheet, false)); } } /// @@ -83,7 +83,7 @@ public CssData DefaultCssData /// the image returned from load event /// converted image or null public abstract IImage ConvertImage(object image); - + /// /// Create an object from the given stream. /// @@ -139,10 +139,10 @@ public IFont GetFont(string family, double size, RFontStyle style) /// public IImage GetLoadImage() { - if( _loadImage == null ) + if (_loadImage == null) { var stream = typeof(HtmlRendererUtils).Assembly.GetManifestResourceStream("HtmlRenderer.Core.Utils.ImageLoad.png"); - if( stream != null ) + if (stream != null) _loadImage = ImageFromStream(stream); } return _loadImage; @@ -178,7 +178,7 @@ public virtual void SetToClipboard(string text) /// the plain text data public virtual void SetToClipboard(string html, string plainText) { - throw new NotImplementedException(); + throw new NotImplementedException(); } /// @@ -187,7 +187,7 @@ public virtual void SetToClipboard(string html, string plainText) /// public virtual void SetToClipboard(IImage image) { - throw new NotImplementedException(); + throw new NotImplementedException(); } /// @@ -208,7 +208,7 @@ public virtual IContextMenu CreateContextMenu() /// optional: the control to show the dialog on public virtual void SaveToFile(IImage image, string name, string extension, IControl control = null) { - throw new NotImplementedException(); + throw new NotImplementedException(); } /// From c2fbf7f04a6cc354a2e6d495b3866c347f33992b Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Fri, 2 May 2014 19:03:57 +0300 Subject: [PATCH 057/254] run code cleanup --- Source/Demo/Common/HtmlSample.cs | 2 +- .../Demo/Common/PerfSamples/1.Big table.htm | 6181 ++++++++--------- .../PerfSamples/2.Lots blocks in inline.htm | 1956 +++--- Source/Demo/Common/Properties/AssemblyInfo.cs | 6 +- Source/Demo/Common/Resources.cs | 2 +- Source/Demo/Common/Resources/Tooltip.html | 2 +- Source/Demo/Common/Samples/00.Intro.htm | 235 +- Source/Demo/Common/Samples/01.History.htm | 94 +- Source/Demo/Common/Samples/02.Text.htm | 342 +- Source/Demo/Common/Samples/03.Tables.htm | 629 +- Source/Demo/Common/Samples/04.Links.htm | 132 +- Source/Demo/Common/Samples/05.Images.htm | 182 +- .../Demo/Common/Samples/06.Embeded video.htm | 76 +- .../Common/Samples/07.Additional features.htm | 333 +- Source/Demo/Common/Samples/08.Tooltip.htm | 88 +- .../Common/Samples/09.Using the library.htm | 144 +- Source/Demo/Common/Samples/10.HtmlPanel.htm | 274 +- Source/Demo/Common/Samples/11.HtmlLabel.htm | 316 +- Source/Demo/Common/Samples/12.HtmlToolTip.htm | 184 +- Source/Demo/Common/Samples/13.HtmlRender.htm | 136 +- .../Demo/Common/Samples/14.HtmlContainer.htm | 384 +- Source/Demo/Common/Samples/20.About.htm | 96 +- Source/Demo/Common/SamplesLoader.cs | 11 +- Source/Demo/Common/SyntaxHilight.cs | 15 +- Source/Demo/Common/TestSamples/01.Header.htm | 2 +- .../Demo/Common/TestSamples/02.Line break.htm | 6 +- .../Demo/Common/TestSamples/03.Paragraphs.htm | 36 +- .../Common/TestSamples/04.Blockquotes.htm | 52 +- Source/Demo/Common/TestSamples/05.Images.htm | 64 +- .../Common/TestSamples/06.External Image.htm | 50 +- .../TestSamples/07.Background Image.htm | 13 +- .../Common/TestSamples/08.White-space.htm | 24 +- Source/Demo/Common/TestSamples/09.Inline.htm | 52 +- .../Common/TestSamples/10.BlockInInline.htm | 116 +- .../Demo/Common/TestSamples/11.LineHeight.htm | 36 +- Source/Demo/Common/TestSamples/12.Text.htm | 148 +- Source/Demo/Common/TestSamples/13.Tables.htm | 358 +- Source/Demo/Common/TestSamples/14.Iframes.htm | 50 +- .../Demo/Common/TestSamples/15.MaxWidth.htm | 70 +- Source/Demo/Common/TestSamples/16.Borders.htm | 90 +- .../Demo/Common/TestSamples/17.Languages.htm | 94 +- Source/Demo/Common/TestSamples/18.Anchors.htm | 84 +- .../Common/TestSamples/19.Many images.htm | 204 +- .../TestSamples/20.Fonts decorations.htm | 454 +- Source/Demo/Common/TestSamples/21.Bullets.htm | 130 +- Source/Demo/Common/TestSamples/22.RTL.htm | 34 +- Source/Demo/Common/TestSamples/30.Misc.htm | 2 +- Source/Demo/Common/TestSamples/31.ACID 1.htm | 280 +- Source/Demo/WPF/App.xaml.cs | 5 +- Source/Demo/WPF/DemoWindow.xaml | 14 +- Source/Demo/WPF/DemoWindow.xaml.cs | 2 +- Source/Demo/WPF/Properties/AssemblyInfo.cs | 7 +- Source/Demo/WinForms/DemoForm.cs | 60 +- .../HtmlRenderer.Demo.WinForms.csproj | 5 +- Source/Demo/WinForms/PerfForm.cs | 18 +- Source/Demo/WinForms/Program.cs | 6 +- .../Demo/WinForms/Properties/AssemblyInfo.cs | 6 +- Source/Demo/WinForms/SampleForm.cs | 4 +- .../Adapters/BrushAdapter.cs | 2 +- .../Adapters/ContextMenuAdapter.cs | 2 +- .../Adapters/ControlAdapter.cs | 4 +- .../Adapters/FontAdapter.cs | 3 +- .../Adapters/FontFamilyAdapter.cs | 2 +- .../Adapters/GlobalAdapter.cs | 2 +- .../Adapters/GraphicsPathAdapter.cs | 2 +- .../Adapters/ImageAdapter.cs | 2 +- .../Adapters/PenAdapter.cs | 2 +- Source/HtmlRenderer.WinForms/HtmlLabel.cs | 4 +- Source/HtmlRenderer.WinForms/HtmlPanel.cs | 4 +- Source/HtmlRenderer.WinForms/HtmlRender.cs | 32 +- Source/HtmlRenderer.WinForms/HtmlToolTip.cs | 3 +- .../Utilities/CacheUtils.cs | 1 + .../HtmlRenderer.WinForms/Utilities/Utils.cs | 2 +- .../Utilities/Win32Utils.cs | 2 +- Source/HtmlRenderer/Core/CssData.cs | 2 +- Source/HtmlRenderer/Core/Dom/CssBoxHr.cs | 6 +- .../HtmlRenderer/Core/Dom/CssBoxProperties.cs | 70 +- .../HtmlRenderer/Core/Dom/CssLayoutEngine.cs | 24 +- .../Core/Dom/CssLayoutEngineTable.cs | 21 +- Source/HtmlRenderer/Core/Dom/CssLength.cs | 23 +- Source/HtmlRenderer/Core/Dom/CssLineBox.cs | 16 +- Source/HtmlRenderer/Core/Dom/CssRect.cs | 2 +- Source/HtmlRenderer/Core/Dom/CssRectImage.cs | 2 +- .../Core/Entities/CssConstants.cs | 3 +- .../HtmlRenderer/Core/Entities/CssDefaults.cs | 2 +- .../Core/Entities/HoverBoxBlock.cs | 2 +- .../Core/Entities/HtmlConstants.cs | 3 +- .../Handlers/BackgroundImageDrawHandler.cs | 6 +- .../Core/Handlers/BordersDrawHandler.cs | 2 +- .../Core/Handlers/ContextMenuHandler.cs | 2 +- .../HtmlRenderer/Core/Handlers/FontHandler.cs | 4 +- .../Core/Handlers/ImageLoadHandler.cs | 56 +- .../Core/Handlers/StylesheetLoadHandler.cs | 2 +- Source/HtmlRenderer/Core/HtmlRendererUtils.cs | 7 +- Source/HtmlRenderer/Core/Parse/CssParser.cs | 100 +- .../HtmlRenderer/Core/Parse/CssValueParser.cs | 9 +- Source/HtmlRenderer/Core/Parse/DomParser.cs | 2 +- .../Core/Parse/RegexParserUtils.cs | 2 +- Source/HtmlRenderer/Core/Utils/ArgChecker.cs | 2 +- Source/HtmlRenderer/Core/Utils/CommonUtils.cs | 63 +- Source/HtmlRenderer/Core/Utils/CssUtils.cs | 3 +- Source/HtmlRenderer/Core/Utils/DomUtils.cs | 1 - Source/HtmlRenderer/Core/Utils/HtmlUtils.cs | 25 +- Source/HtmlRenderer/Core/Utils/SubString.cs | 2 +- .../Entities/CssBlockSelectorItem.cs | 1 + .../Entities/HtmlGenerationStyle.cs | 2 +- .../Entities/HtmlImageLoadEventArgs.cs | 2 +- .../Entities/HtmlLinkClickedEventArgs.cs | 2 +- .../Entities/HtmlLinkClickedException.cs | 11 +- .../Entities/HtmlRefreshEventArgs.cs | 2 +- .../Entities/HtmlRenderErrorEventArgs.cs | 2 +- .../Entities/HtmlRenderErrorType.cs | 2 +- .../Entities/HtmlScrollEventArgs.cs | 2 +- .../Entities/HtmlStylesheetLoadEventArgs.cs | 2 +- Source/HtmlRenderer/Entities/RDashStyle.cs | 2 +- Source/HtmlRenderer/Entities/RFontStyle.cs | 2 +- Source/HtmlRenderer/Entities/RKeyEvent.cs | 2 +- Source/HtmlRenderer/Entities/RMouseEvent.cs | 2 +- Source/HtmlRenderer/Entities/RPoint.cs | 12 +- Source/HtmlRenderer/Interfaces/GlobalBase.cs | 2 +- Source/HtmlRenderer/Interfaces/IBrush.cs | 5 +- .../HtmlRenderer/Interfaces/IContextMenu.cs | 2 +- Source/HtmlRenderer/Interfaces/IControl.cs | 2 +- Source/HtmlRenderer/Interfaces/IFont.cs | 2 +- Source/HtmlRenderer/Interfaces/IFontFamily.cs | 2 +- Source/HtmlRenderer/Interfaces/IGraphics.cs | 2 +- .../HtmlRenderer/Interfaces/IGraphicsPath.cs | 2 +- Source/HtmlRenderer/Interfaces/IImage.cs | 2 +- Source/HtmlRenderer/Interfaces/IPen.cs | 2 +- .../HtmlRenderer/Properties/AssemblyInfo.cs | 1 + Source/SharedAssemblyInfo.cs | 4 + 131 files changed, 7524 insertions(+), 7481 deletions(-) diff --git a/Source/Demo/Common/HtmlSample.cs b/Source/Demo/Common/HtmlSample.cs index 1a1cba1ea..c3007ab92 100644 --- a/Source/Demo/Common/HtmlSample.cs +++ b/Source/Demo/Common/HtmlSample.cs @@ -46,4 +46,4 @@ public string Html get { return _html; } } } -} +} \ No newline at end of file diff --git a/Source/Demo/Common/PerfSamples/1.Big table.htm b/Source/Demo/Common/PerfSamples/1.Big table.htm index 032c6c935..9aad29719 100644 --- a/Source/Demo/Common/PerfSamples/1.Big table.htm +++ b/Source/Demo/Common/PerfSamples/1.Big table.htm @@ -1,3104 +1,3087 @@ - - - - - - - - - + + +
- - - - - - -
-

- - - - foinobpjg - -

-
- - - - + + +
-

- dakqrepr iof k2.1 -

-

- opmqjeqf mj - pdkfd ddooekeh pc denopnjgcirn pe oqemmcg fla lnmaba 2.1 - - khon gac ioof phpdigja

-
-
-
-

- ffjnn opk mcc aje bqjrbqn nnqp pip opdgdr omambrj iigm nnk frmjfl - ejk - lppf rnp rnpjihp

-

- &ppbg;

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # - - efh - - dbbpk - - pcm bknec - - hodl knkhqqe - - cqbole-eaddhnoh - - hpmemeoeei -
- 1 - - a_lhojnrfdpnlogapgmarr - - bhedqp ce mhq lloa ohji dckrmn. - - - - -
- 2 - - b_gepq_bdfjredlk_qpaihprcjaaq - - dkoo ii khoiph, nf mfc pnknqk: - - - - fcb: j onq'p eoapl jmin leo halnbcmam ei cfri... mh qnlpll lnha ohhrrjbcf jghl - bqcrgpk lb abp qkqo gralcp kfeildpd, dbjbj ril eppg n hfcbqd gqj fnjd &gpnp;egoppa&foaq; - fn &ncon;ccrb hm rjelnn&jgkl; qhlj kpkfoe qead odr obepl ij gfk dekfm, gmo fifdf - kle cnnj bpjon fgn frbcf'e haerd qfgimmkn le gfol nifmojh rrjghcqa dkac (koen hpccjmi, - qlfijnbf iiorfo, bfj). mnil gcd pjnqplg (pei lnblh) ebf jmn pqqfjkiodp kib lraciob, - qmo dgdpf i hgo hirkok faq. ba la'e raheq omlp cc nq fndf ojo blmgdjc ndoldcce, - p'p dij bok oibm rf moe becggabgmr ha jrk obqf bgrmeap. - - qcpciiahbq -
- 3 - - r_qjoc_bpchkfiip_pggmpbj - - qfic rj j iqrcqm, odhjr, fc k pikhl re bcgjrgb - - - kamdkgl i kckobm, rpnkr, rb pqmf. - - - jeh: oll rfnl hp nmor, hph ppqkb e lqahrnb r pbbel rj lif akarqcr mr jp &iklf;krmq - qn q fpplmm, nqpeg kj jelaphf&njch;
- iiqbr: &omkk;cecc ei f qblkcac&ofgm; bihdn'n ideo mqbkn. rhec, j ngc'h lqjeh fc - nlc kc crjhlbd je cka gamkd oqnfajpddnqlq fq @rlphnmqmcl dif jqhlkkp dpo chldiffp - gp l bndf pip. d'k mpbkmfg fb 'fimcoma b jihpoo, llhcd, fm brre.&cfgb; -
- jcrrnagrqq -
- 4 - - ifnrhomqahqeccr_gdjmpmglarfhqaoemj - - ema rcjdke fqcfaprgo - - peb eclmrc gopddenqh - - - rhbrj: eibnqmfkqlrhii rkhec goo. gbm qj &bhar;npm ooapof popedoofq.&ojdq; (lnibaa - rcddp mej &nldk;khpjrqc,&pqce; clj ooerfmaoo, cm lajqe &alnd;rnbcnj qccppak.&gpif;)

- &ofik;

- nkm: - ogqkq lblhhk, amcdon? pm rel bll irdffld dgfgl gdine lc &opoc;ljmmblicf&eqil; - qgc ng pfooch ldda aq poloknkqbj... qcagh no pqj hhaigo hf aqi hchhco pfkjoef... -
- gmoorqgfcj -
- 5 - - ihociogfpdbjalq_fqrjfrkdm - - bmakfcjcf - - - - - lqafmgjder -
- 6 - - aepmcplahnojqeb_boonrnmqdgmqa - - ekac nlchdrpnl - - - - cbh: ibr odkk nh ed gfmf hq lno &nmof;blpoqagll&jnfm; co lafmj &hocj;mhoagel&nemm; - jn no hq kn oqrn opcohafp fjfcj, df egp &raai;epfif&kpbf; - - lmmacdienr -
- 7 - - pgriledkfgrqrnglei - - qnma eemh - - - od d aple, b cbeh me cajm gmnr mjrrf - - aeo: cnndi rh fjfmp keg &pomk;mjjq rlpi lbpge&ogqj; lincldd aa phhdb ck hkf lpojki - - ndlrhbegpd -
- 8 - - gqib_fgprni - - birmop - - - eafm pq dlpajbkocb fq o lqjae ro oc hfdqdkpd ad gino (dfooh qfrcbqc qma anbcbe, - kolp rr rac kgpbgnhcg, po h ccaam, cda.) - - - iefmkkidri -
- 9 - - rgrr_jjfogfkkmeeo - - ilkp fp namfac - - - inee dqpi ic limp nph pjai ocokbdbk - - -
- 10 - - r_fdj - - cgl - - - bghohng fab chbqlp - - -
- 11 - - n_rm - - ml - - - hlbnnqi phr kjcoah - - -
- 12 - - nlnionirnamfhhjila_lmfblppilckqrbkhafre - - olcc rnechr ibpcdfc ma pk gcggpa knahdjhdak dbpk '{0}' mallia, pqefgf blijnoc mlhh - jfkhqdnqkdfqf - - - 0 in pod mimbqi onioh rcr ekcg qlq njg obnmca aqf (jrrn &igcl;dmrj kaglmg grdeqrf - fo mb kinill rfplrornbj pdah 'bhmm.rce (ar.hdkijk.dea)' rhgfpn, hddjph...) - -

- iboea: cobj ihqgih hf icp foelbokre orm djrbodjh hdi iairhfr &pngr;clpcde.&koon; - &jmno;jflb qmhcfnk lo {dlfqdgd} gfela'f pkgnq fmc prgnomk af bjk hgcjog gj '{0}'. - hdbabl ponkpfq mfmq dhmlfrcbipiip.&qkrd;

-

- &mmpg;

-

- lco: n fmdem mbi klq mqceqq kn ggqmfgmrlo, kjepp aero oc hre elef ki rhbgi, gha - qqrm hl abmp ab rr cokqglhmbh... hd pci pgil eaqoirg ddqh eiiafen jan kdpjf eo pl - &ojji;mqer cqaienm cq {mppeboi} pmo'a ecnkfjbqma obae klr egidhgj ra hmm bkacdn - ad '{0}'. icmlni qqnorid ilfg ppodkfchdlhor.&pjkh; jcl ohrhldd {hejkrmn} fp drp - pjekoi boqh (qnri mji qgkhbm, cmbi bdk mgilfbj, oc qjgeagnk iado qohh no bpna akgn - :) )

-
- jffdkrloia -
- 13 - - aomoqirbronkaejeir_hqjnqepiffheccghgqcfreaqlkrrfb - - lfjm gjifqi ridmmnl ld lp lcdrcp kcgepddlbm hnpq '{0}' balfjb gep qgnle ad gn empckdb - - - 0 fr bkb dpfmnl ipiaj geh qcjr kqf mjc aqhide cem (omih &rihm;ieec jpcern ajlnigd - lo da mepemi mimkiceoie ajbf 'ddic.naa (eb.eflelo.agp)' ohhnfd jgh qabcc...) - -

- npoin: &njmh;ihhe pqkrhqc ml {qiqelgk} bdrcc'p hpgek gcr qgqrlip rk dai brgjjc cb - '{0}',&ffif; bri mldgo jm rb afrqnck.&obmn;

-

- &hjom;

-

- ida: llqk pm rcfgo &eqhr;ejdc egdmldh db {doiqkia} gch'i fqkodrpogi efjf qmi qehhiqr - jq qlh glbbnp gn '{0}',&gimf; lpk qirkl oj hq aaorlff.&adgr;

-
- ocdnikrcij -
- 14 - - bolfabqgrlpedbmagb_bclcepooedcaohqgqedmldhmdnckrb_bhepbf - - qrjoje - - - omdqoh, fpdhol (ip nrqjme pcb morflirn hdghmi eqmecq) - - - mlkgdjqbrb -
- 15 - - ehlljcoblgdmhibibi_llarmehbdkbbjqogqrnb_rcbkknnr - - dce niihg afmhdird - - - rjpfpb, jcmaii jh gri ipafgla iiflfgq jcp ka phbclc bhrq olq'm qn kqqlqophn qpfc - rgl ogbbgmh dee. - -

- bjlln(?): khdq erqcbk mgmfnfr kdokkphp jm. hln focce q rablpd ai l gmpi qb/qhod - rk obm fjigepe kbpgqij? r gkgn jopqn lh'gf refdrhggm &meob;colkchp&pohe; ajq &iknm;pjrkojdrb - dkmqbqimaf&cjri; hcpb: cii qnq'a gf cjab hdfm e cicbbe helcpa jiqiail fpnq nlfcadng - lo dr graheiifp iekbblgmmhh?

-

- &hkhi;

-

- nbh: b poe efiji'a bgogh, aeh naq kglr goknk &klcb;hhaeafljc glfkarjcaa&biij; depjp - nqih dm qrar gighh... a alnnk dh jlblq qpadn nnepdcqcajcmkm... bbi ckbofji qoc brb - crdm llcc pjpk kmf pbhjpim hb qienrg ro cq g cipbi qffb, ddnpdbnmjcli kbnc hhdjj - ahlfcgd fbqchgqn...

-
- ngjpkefafq -
- 16 - - khbqbibojcnbkbnkgh_dibedahapgqenhfhjrbhahakonrloic - - aqpppp gdaj alnqf hgncjoir hnhihibnehep gqki {0} - - - jdnapao fmjf kplq gk qibigqn rno djaqjnfkgahb hqcnq. 0 ci pki pfihia'd erbc (elnl - 'look akfdobcfk`) - - aliqd: mlnibf fhca frcfg bf flfk qkbl ggmkdgkdbq bq {0}. - - cmjekieppq -
- 17 - - prinfpkknblomrlpqm_nnbgedclbbrifeoiinbhbnkicaefak - - knjk bboimf lmnjlfng ae iqnikr clee qoljidr. ncm maao ohab ppepfncm aar bqddigpae - bhfadfjh. - - - pqmdrbn grb ipgn dq obojok irgoaij elrem pcgn bphpjf gd pfd hdcj akfhmp - - - dafomhjllq -
- 19 - - bkarqbrbdlcqmecaihdcjmlqpo_baopokdgcoddlqlde - - bmffbllqc {0} hjgg'q cbcrq. - - - efokngb gpfoe jfik dkiahdr mclaoqbcir - mrqebjrrf nlf caaqg. 0 - qimqjagch bffh - -

- ocf: fo gjf'c bibbhg &galr;pjcmoadqj&cmim; mp ria pem hboh... d'p hl aohi &fiql;{0} - ijfk'h rdhko&gdhp; gc&hfii; &gelc;nfjff {0} ager'g aikle&hpgo; (giedc heaarh'e - dqcpcipck icdbp pk nbbk riel)

-

- &jbhp;

-

- arfek: bokho &cqae;eq facekm'f rqoe nlj fbarc lcq lrbecrrc.&knef;

-
-
- 20 - - fjrcffmgfnpaqqiapacknhhcdf_kfaoeijgdobqlorolpcafejq - - ejl ljq bor anggjjgikm lq {0} rgflrojac. - - - rfobkmp qofmfrlbkh cfojm jpredfr - kbko pah keqpikogrl am dajmd ekenrcfjj, 0 - qddcjclma - ddif - - rqc: pfeicqahgk en lkbl? gqmk? dpbqbj? agi nqkglbob ahrdn nrpqbibkc... gffr, ae - fhkq lq lllga iejfj &mhhb;cacijfqlj&fblb; kn loa jpb fdja. ro aopkp jqbf ec ggracgfg - gm o mml pkao pkhkiq olmdbdii glldpbdpemkce bc qarq fhlnoq bd ilb eddgga... amnq - &krgn;rfmn jodcfdamqpe npn {0} edh hrpncqfermhf&apkh; irp pcqrf lbchrb &oncf;kfo - rg pqqfi kgqa lgg ogfeirkcanpep&qlcm; (fekjk rrekjm'e - dcolmagp abgep gb alhk rddm)

- &gnpe;

- hfapi: ppo kbl'd pefl dqgmdqrkdq nb rhhppnr ka {dpgrj irae}. -
-
- 21 - - mmqkjhhdbjfhmjcopclogcfmlr_bamlhakqebchqrhmmielj - - fdd mff eqk hdrjggihbf on falhem glhoi rino {0} iqbmgalmr. - - - igkbdeh qpnrdkeblp ecknr bkkrial - hnmg lrp beichjc mo lqlabi oibdi faid nhfhafoqf. - 0 djkoaddpg orbp - -

- rjq: q dfijj bo ega enmjor goj &prip;rlrdjcqhn&ibbj; iomi, okl drb lecc id rb rmhipk - peb &hkie;khei&kcba; hp mrjf &rhri;dn&hcgc; (aqckk idkjob'o - pmqapakp migeq pcrg)

-

- &mpib;

-

- chmaj: iqm bim'e cjfj cpgjjhkkpm ng ddprkn meeag jl {dlrlr ofoh}.

-
-
- 22 - - e_oiqkmpccpnkiqlnlgobf - - cjpqgokqpq hjnraimdrg - - - cqjn bmmgpghin bbfl a dqfde qf bmqkfrd om d erbpl bd ajiqnmp no lrbbqlkh rrnokgelbqpf - (jdk obcn hh gab pigdnkfkg). - - - lplfhiceem -
- 23 - - oaheiheaoqdalrmqbaaqikeqqf_qjlmkccmebhdqoikimdk - - emkjhceg ddni gcingcf '{0}' aqrmlip cdipb jm {1} fbdqcehqn. - - - ibfqpnf meghdmerra jraqg bdnbaep - eppbc jlfja gp nlncjloe rc nhppb ac conbp ajjbjngli. - 0 - jldc mgaeh daqbc, 1- hefhldgdk oqld - -

- lhc: bp fldom mhmc qgk &aqqh;bpdgnhbfa&gebc; gpfc ckh qlkkrr bi panr.&nnkj; qmcqkp - nf ifjn aahpg &ijhf;lgng&khak; fggoghi am &papf;clhfipkq&leec;? eefgj rhnmcr

-

- &crmk;

-

- rpmki: krimfack hmmbcmb cclcqkck rmfgn ela'q lnke okaiop/griqrekh pd jmqi, hiaa - mgfnmnhgb. ogjkl?

-

- &bnnk;

-

- jnf: bcoo'o hrpcpfka ohjkf mildo, bflqkcmo rfmke jrpg hirrbrk, omdce oe mqgnidj - hn haf fgedalig, bcd orf abq qjjcar lp nim oa njr'n mekidj oid jmjocc hioq id egk - gecn...

-

- &jagm;

-

- pel: ojhnanm ohrfrfjhkrlij, h qrc qh aqd &crmk;jgqaa&pnjh; ql afo ecihag, meqjfol - mn lfrlhoc.ijqnna rrgbk - ko 2.7.2013 nn 3.57.34 nq.fpf

-

- &ignd;

-

- eaool: lh qrcm, &qifl;l eqdd daqr qjafj '{0}' jlconim edgnmm kl {1}.&boel; meakd - jrd copb kbgii &kcno;qhajiijie&qceg; kfi.

-
-
- 24 - - bqenekigfckfcdjljpooaanain_ppnodibrglpajgrmefqdg - - ahi njoihad dejm kl iqbe cppojfhp go hce hpieblm. - - - kjfhlna lgaohoredj meegl beobabp - cggeh lkjh cnfo if rrgfdlqkph fqiblknqo em icg - fllbkirkdneom - -

- nqd: doipcm ci ojag reljo &arja;pahi&mnmo; pparlap rf &dljd;faiklrcn&rmog;? dgobg hrhlrm

-

- &rhfd;

-

- njjog: ao krqp bn kb pcekilbq qnlc, jfgi &dfng;diq igg'o ocjgeo k bjno pj mlka mpee - li moae.&pheo;

-
-
- 25 - - dbpfnhhgfrdomghdlkqqnicjcl_ojekmmfrknmhpckg - - kfa oogg okfj ganrfcc lpcnejj mnmjemn fh qpjgpi ({0}dh). - - - rhdrrpn gfnjndoajf bkmfg knaloco - oecm noof kn qqc rrd jdb oraoqi. 0 - clpi qfal - ki ihai addmf - - lod: g'k jjhnfoni ed ldrp &mipe;jii oinb ko fiemqe eqhp ffo nacoope gapnjlq cnam - ({0} lm).&ahrr;. j mqn'r ekkqm nh llqd gh fkjcfgb &dhdl;lo fbdfcq&ihne; dlq &cmbg;nigkchi&hhkl; - oph'q fqhgi goep, ajffjgdh bb idedd lnqngpl. qpefa nflrrd

- &ikkb;

- cpage: mornan. -
-
- 26 - - dmmiapagkibdgibhbjrnlkkkan_alqbqiefjkqjqfhd - - akbmmpce '{0}' mhoe'b lbchf. - - - phhikkq brjjkklghk ajgac imhimrd - piobl iaojrinl qkncp cqm ab kbenq nb cprqba - - mjrdg: lba akhdp relj aioh drg'n bahpk.

- &onpk;

- alq: rkbrajipja ooj gqhe lij kiekld iomg fq lm (kigpgli jd aekg 4.5 epfk). r jbf - jgjf pb lddnpco niage oab edgbod q gnfhkhac pkik pgr fghjihedm maee, cce aq noi - hikgng do oed mfqrlfmi bj kmjcorm fhl bjj, ppp cnbbgqhp jrd ckndemq oo beqgiig, - lb dnac ocq gacmell oo jnmhpol bbn qonlpkon gec'a nlfpm ncjhkck, qnmde gbr aadbl... - gebi qekl, jra crbpqk ggmdmcql jacc rmidegj aaigjqh... -
-
- 27 - - nlaeeebimpghlccpheiijfjrnn_gpjprdefhfken - - pbj aloom gpdbbbi pibbiipd ro pdc fnpec. - - - jkgaeqc qbrrfnqboh qdjne aqkdokl - glarr kjbpdc qk hqd lbqbgpomn (gekihbc jfmfrgnf - kn kna kd) - -

- obm: rc&pjfi; pfe &lgrl;hcag enkdefl jkfalcch in iqfardi&mccr; lc clrdqbj &jmpe;amcolbiq - jp rdngfkc&jccl; (pidh &mrdg;qeoba&aeal; ablac eche). plj hrjmkcd rhrcfkkl ccmfa - jjjbikmea... - rhbjp jeegip

-

- &abdb;

-

- qgikk: afj jkrp iiea &hrqh;jannagqn eir hficc&ccla; lpkqp. looc hh bdoj qkn jecjf - bljka'g bqffp, nm io phk cloaq ejqej?

-

- &glhq;

-

- cki: ff aoha jc nfaphop cmrqiane, bbbj, jlqq lb rij gomke pc ri bonij nqdchkbrm, - fjaipggnh fg nqffd dk flrf na cdair kqihbgbeg, ekbfg icnol pq erngmanr gm g qopgqgore - ro gnjm qeqhghkb... f'q nahffeak dd jjceg al l qilrp.

-
-
- 28 - - acibqgrgnkicfhlqnnojgchcma_fnrcpfndgdpcbd - - eoormb '{0}' blrm'd mpiip. - - - nfhqadh kmchbaibkl kfjgh ikrmner- ciemi hjndda hdejl rki lk bedrj fp oqfid. 0 - - lkmcgj bjph - -

- gec: ddrr ac el gbdbnr? c lqeqkejmoika? hbm lpqpgb qp qcd jfijblk rqrc? i'm qljc - ih cpj lh fdql anagnhm ddfh rhidnigd rm koh ia fal adpmrq. cronf dhgobi

-

- &mggq;

-

- rqrrq: irlpmb lk ccjehk ao mlqnedrfrgrl, nbe pna id fqadkpe mjee ofce fbemerf?

-
-
- 29 - - qgcrpaqlihbpinkmdgrfonbcgl_orojgddrambkad - - opnpmi '{0}' limg'a gfmjc. - - - frlddrp raplinqllf niqrd hprfehi- rqiip gbqoap anopp cno nh ajdkd bk oepmhj. 0 brcaqj - jmjn - -

- lqdgk: roki ma r gepmfj bk ccke npmc?

-

- &oedn;

-

- jok: mr mrph femj bkqcee, alq kjfrl mflndjf ij mcmkj ecp pqnmeo rkacbkeag...

-
-
- 30 - - abejojbcdkadrjljhomlhdqhjm_cchdqfmomiemggonjbek - - rbhkm njgrocpa bgrnrmn jdodfm ig pmlpdqmbno: {0}. - - - jcnfpqf hleroajgja ofdfr fdiecfl - bhfeq ikregppp bdg bmbim. 0 qpn jjjoko ko anjomkb - - bojoh: hghq cohka pqdj kmgqngi {0} obpcjgmika lc bifc. - -
- 31 - - clmngrodoffbpmcbcglgjfgnbr_ardocbekefbkbofl - - fdb kkppkrno qkoermh roradd pf hprkepbprd: {0}. - - - ligcbko gefriabqmo imeaq nfiakhj - rpnob fda pmgeoqkf ropljal dncnna. 0 - mbr gpfiel - ro nmr - - ofadr: daie morq djbqkha {0} dlhprkbbgo bq pboq. - -
- 32 - - mqnkadpekphemjaefmndqdegbr_chlqcoglhroprrncfbdogoopk - - dflrjmgi '{0}' bb ilm nkpbcahi '{1}' mnhnqcdek. - - - fkofqin lpfhgpqfik glrel nicikee - ljdei nppgobch enrbo pbe foj'f gmpgch qi henechdil. - 0 ejkoogai ammd. 1 rfmlqcarj egcl - -

- aarnr: hmkl bfri jfopbne.

-

- &fiqa;

-

- kdf: cicrchcogb nae akfeh lh kndlclqgkb, qco c jbjbc kg nrn cbidmcl lrnm hfi &pjjo;deckecij - o dfbb'p nhjbc&nmih;... fdb hcnad kajj nkjo gmdf igpl pl qqoh... obno, phdmgnnrm - &aj; faoae.

-

- &naic;

-

- rrfhkipb '{0}' hde inq nblmf hj '{1}'. (ilpbj, lcq'j lnlloqc nbpqljinb.)

-
-
- 33 - - jbbqlbmakififbondqjjoccoqp_kijprdbrrkbrqkakaglm - - iradilrefh rer nje injbgfc em darie bndehkhg. - - - gfeomjl oacbnbfojf cpojf lrnafda - ngqpcg dpj kkkpdppnco rm qenk pbmebmeio (encqrr/ - llnjed lcnbaqjeg/ ocdfeeil iqgcbq) - -

- cmodp: gadmigdqrc anm dhi lrlmmcafl qa kek gdmmqglh nqafj.

-

- &ihcl;

-

- qlh: j ndi'c drpbj flmg npbaf &apde;mmg kjpifbqob&laej;, mg ng dkhkdmkbkl... lkf - ii nnlh rle &dmqe;boojlmbpbc fng pfg mifdodk in arn mrhmmqln ebrrj.&hhgi;?

-

- &rekm;

-

- e: km.

-
-
- 34 - - hniqegnkmfccnlbidjckigmgnd_roogbigmfrim - - jqggedf flpqo. - - - gdbrdaa ccagrogeln bfbaj rdeccja - ikcpr / rpghieq fj ijh kpqlkkj ooo'd qn bpjbm. - - hdbog: gff ladm aj lojekh q akbdc. - -
- 35 - - mimghhdoaffnjjgeqilbomeqkl_qmohlaldmolelnid - - ifjonbbm bchbgaennn '{0}' ija lmf cfpkk. - - - moplldq hnppkcfikj pljpi pfqcokd - mhdjbh fk imogga q lrqgemki damd qkm ihfd bilbapd. - 0 aa cod ji rl rei gjbrrihe - -

- gro: e hbdqh rpqi al kfhpd m rqm erq mrjl kllobeqh cgkjm. cf rfpjl kldk hb brh / - cjqqgee oek fhrn pchekq rkoiq aq hbhr cqr rollgpb dbedd lqghr ojai jmia ffpnokdirna...

-

- &joqn;

-

- pojje: mhab lhdlq &jhcc;kaj'eh emamlc fq dqndma c egpfnbgh kkig pge pelgepe.&rnpn; - ?

-
-
- 36 - - meepnpgrqeddifpeicdoikrbjj_fofrgbiahccmpkrqirladbgkopk - - afc fdf'd kkmq pbnh qncnflpkbrh igd imdj jhneoqgl. - - - ahdkbjf nckiakqdnb goppg brmgkfm - mqdg lkh'g jppd kbpec rkdadicjom fd pnrrbimf - -

- lqgng: jir lee'e njgr bmjhapoqcc lb pejk dqia eilladqj.

-

- &hbhg;

-

- grp: gre eocil, dqg bg nlapagn la phpqei amfnqgclr (lmqn oin lcjonakfa, de gbohppaki - kl cakr bdgiaokcn) nh imacrmmc okceo an drcarjd? -- nrhrk: dh nqbmi gfkg lqipnh - rrkhekkr nn qeqb.

-
-
- 37 - - m_rcinalbj_flilkjbjliga - - hhdrocqf (qkc gjllorcmn) - - - - phe: nora ileeo kafk qjrq mn? knj bbrpejjn kcrdh docimmf - - foigbphcoa -
- 38 - - c_oiemp_bkhmmbrqfhjgcnebqh - - dfkkogbg qkrc - - - mcirbp - - - erkeokamgb -
- 39 - - a_bobqb_aheioakgdhqcngpd_lhoqp - - riajca ag pnqe/kcbmla dhebgl - - - qr r dphgerea qeqmak, agl rpc eoja gkj kqbhld boihhmfgb ci mgdpenn la omgghal. hlbo - oeirn jqefk nclaf rhm g dgnlggh cagapnr gl hpdbnoifh bj nfba. - -

- dnfqi: alckf gqp f nrdfhpc eklhp hdepmpqgoc ib qkon kn gpkamb.

-
-
- 40 - - g_hqdqr_cmikkhpnljajiljbhobgloe - - jfhj ci frmhpro lfrgpo - - - copakb, kerbbjf fh qfdqne fk f cklnibpn jomhme oi kegpkqj - - lgmao: hbkp ej qrhoope - - grilrdagid -
- 41 - - a_rmmea_ahobafheodcfpanhileqbah - - irhr qj pjpmrhh aodbke - - - oobnjh, hkiaifr ar fblfin rl f kplfhmic gpdkhe pj jqgihgr - - hhmmk: obip cn clobdok - - grcohqpnor -
- 42 - - p_kcqdq_eqnaqgeggilbenhnkq - - ahpkano orbl - - - erpqnk dh omrmniq foibkbae po b mprdbgdnb incjcdfo (damb bciaf, qjjd mabmp, ghk) - - - lljaghklrq -
- 43 - - g_oeboc_rknjdnh - - ldqnmap - - - epqdkh camm phfa dnqlerm flphpeqoi lpkcliq bih ar pamo - - - hgiircibcr -
- 44 - - e_aomce_debaodhmopcprmhkdliphgjjgirld - - peoe nnlrlr ernlbrlcijmod - - - - dfo: pmjm gd ni rlgk drokk le qlmikm gj bjaa lqrpqir lademhkarin be jrgc de rrrl - lrqknleb pc, ka dmh rarlha gio jlkommi algjfop phnhqqmjnln de rfk lfjc bbb h18g - - dlkgodbdcb -
- 45 - - e_mlhjc_rqqaihjmaneomooffanebcqimabpa_qrpaa - - bddhqn cp gbrf igfrgl meaprhgiflmco - - - - gom: nkcp #44 - -
- 46 - - c_rcdop_jgknjbjgcnrddnbhijddekjolnpij_ncobcqr - - qkbkki damjhgomjkakk qpnc oeaoh lcc bpbjpik kogibb'f impejoi jr bch egkl - - - ohkhgjnclch rojhmajn grcb glj pahh deackbjmr rrmlhhinimhhn kdlmf dn plmm dq crlr - fdfjn. - - hfjmq: cnh faa'i lpj pnf rcfe rhiej cigdbdoogclfk begmd ijbb bjqg. (h idf'c dllk - qr oqe &obcn;crgabpf ean hagofno&glba; hlrjfhp ed marg hqrgg fr pd qdjjcich--hhbn - nghjn'h hrob hbah'gn iaf bcenornfh bo ekpllkkp, kpkp hp?) - -
- 47 - - o_himcg_rhcrkjlljrcaqroodhnodkhhj - - fopajf le mooiqac qrfknj - - - rhbrea, qf-dgamhem nl rmjndd rf f glpeeola ghoafe mr jhonioi - - dggqe: nndblq lf hqbeahq - - erkmioomnd -
- 48 - - j_pkcmq_qqhekdnghkhkkgjnapdenlhir - - biqcbb cm acgldfb eeeqhe - - - bhloom, qi-dfiqein oe giepkd dc p kcajhibn abffeg ed pppmqog - - hrqic: gieimr cn ilpapii - - ljqbcalnff -
- 49 - - h_qnokj_iaqhjppleeindrp - - ohgm qa ofbnn qcea - - - -

- grqbh: aqbr omfo pkqjfik

-

- &ihcm;

-

- ilm: o moqmg dpip bk opg hqdnai jod, lllk rod lof c hcprr kabbhnlncaei nle fpkfb - mlp &llio;jnqe adohhh nnqr&qiqk; (62) mpc bo kjkq erch hrr crdo eeqe opb phbndr, - bqll hqg mhf jhfaf ⩖ecgh rq erimd ojod&gigf; nao bor goj pnbieoqo milmcrpaeial... - b'l oilbrh bk ik &cncm;lnjm phlam lkbrajigdhdr&lodp; imcab kh p &dhjq;fnmr&onri; - pia ardr fqnaqgphnj rkbd dol akahn dcppmr rlb apkbqhh lj ifr hpdqflm.

-
- hahdjkmlda -
- 50 - - m_qhbiq_micfgdgakbnnflqgfed - - akmbieoekpjq prqjhdg {0} - - - -

- gdl: hlioq fjcflcph, - f ahlbk ro cadqohcid qq agdal mfimik pnrk kja kf od pfkeq cq h lcnepa croq nb efkciqd:

-
    -
  • 2 okilkcojphgo: djfpicickhje ljmqjni - {0} nrq {1}
  • 3 cocicbbjekhc: - kjribarolhbd rbhprcr {0}, {1} koe {2}
  • - 4 himragbacrpi: rcrblindennr jamdjck {0}, {1}, {2} ogf &cj;n&cr;lmkeb&gj;/c&fq;
  • - 5 pi jokr mmnirmpjrhab:lahfiicililk rqgfllb - {0}, {1}, {2} rof &io;a&mr;qpbemf&hi;/e&ij;
-

- aal &bg;d∾ ib f jpgfaffkkfo jel kdr - ekic obla fmre, oq eqkge qgf'b dmpedi hin 2 abppkdmnmfnl ffo gjl mfgfkrj fhq phjqdde - magf, gl idbk hph bpmpndhmipg fonqe noicb cg cff lpbjhbi apr nmdaoje dark pk qgnr - nf rjj &jhjk;krhfp&opqj; bl &hfkp;ccgnoe&dcmb; mmqh ecnie qennc nrlh fcjh n bggdmnfh - ond (cbr jeqp rbll hh er olnpjkfrpa qrbmq ji rkrlacdgek fchrrrmqmmq dlpcbig roe - cbch pegoikj).

-
- farohbqrgo -
- 51 - - e_pknqc_irmoghfdafjcmfcdbgqlpflhhrhi - - {0} pekm.. - - - - qcp: ponc pmooc jofa lbndpfecfe gh ao fompej - ifg gebqajip llg. - - poihpkqmjj -
- 52 - - g_mppjr_imjokfmgqnhdloh - - nnlrjfe rmknop rj {0} - - - 0 ea j jacc'p ojbc - - - jbcmbmblrd -
- 53 - - q_amdmp_dpjphgjgmbofkqpihdnqjqlbn - - gkac jpohe lqre nc jnarqoa ag ikjioffd ibaoiecerpgf. - - - - - qicilgnpmc -
- 54 - - qfjmlqgglqfnicmfbjpn - - rrmm hrhaphk ij gdneoke ql dhadraof ferrcqkpemif. - - - - - idgpecqqbe -
- 55 - - q_lognf_meahekcgijdechk - - qokcrbc rpbpeb fg {0} - - - 0 co d fcrm'a bqba - - gmq: mollaoe'e od jecf hfa ach hbofkenj dpb ofqhbkh ejp jhckmj? (nmlbree jlrgaob mb...). qc nreqf mknk jp mmmp ma - pjockbgn behiidi jr &oneo;gqidlmmrflcb aojbadq&qcei; #50 - - dfbggcmpci -
- 56 - - ejlg - - qqgm - - - onlegh gr hrlpgl biepjgfok - - - nalofqmbfj -
- 57 - - dgio_rqmrh - - mnef bkhccb - - - gagad qdnk aan pgfcfl lerpgq bpjnje - - - pnkaqjoffq -
- 58 - - ocbrg - - rppar - - - foip bim irfgie gd fcphnf rfnionhjb rln kqbe nqipggrj, gqn nboa ielgi ng &fnfr;pgnmm&hbah; - - - qrqrkgdcqr -
- 59 - - l_ierdi_qkkjglm - - khjlo ld {0} - - - 0 gm a hbig'l ncje - - - gnlikhjdnp -
- 60 - - j_iafeg_kbmgjnlqhppmc - - 1 fohrcfq - - - 1 (qqq) eehhicj go d rbmic ml cnbnkoa. - - - iabjqrghmc -
- 61 - - i_cbfcn_pjajcdbro - - {0} hmodo - - - 0 dm igr hbahop jh kralf rred j fperc mi fjeprom mgm mob (elko jrongpe) - - - krccimirgr -
- 62 - - i_gfjkd_grreehcfleihcq - - mrma frljdm enic - - - nfff qo hohk (rcppiee) a ohejl ed kjonfai rrkg rcj fiqkba dc obr hdra - - - qdlabffkab -
- 63 - - j_jdpfcebjirgr_jeaimnoppjqbgmqbda_ppikjaejrmgl - - ibj ecoapkpee - - - - mrenr: hgag ibj'i rmaddocjd? - - bokbkcafha -
- 64 - - kepknijjggfraancbrlhacni_phdpperabaqebcf - - mlfndqco jgiaama - - - aijgm fem mcgf pr cjarmqnn gkknlm jh dqgbahnn hrirklo ke o hohaf ne ecrnrmk (df - qhqor mo fkniocnnaio fm &rdll;onfn rhf pnfngmiom acike ibg dnjp fjfn ofrdhaf&cila;) - - -
- 65 - - oagfarklonahglqkdqhkdaaj_gilfaofckhfgoiipmqjroqkjihc - - da bpoaorj, gfk rhqorgj nnhj pfia niqbokmc bjkigr jr ihgj kpclc rmh nidk. - - - fabilfjrffo eh qdneiai qrhpgeqp qfgk grdg qagdq gd fbqe en qcfhnlfk dcggl - -

- aar: ephmo &oebp;kjoboha&lbrc; aclgpnn pa &pegd;gpapjrbqe&kdbj;?

-

- &igmg;

-

- mkbpq: bea pabgb'r fdkn rhdcb pen jifffgc lc lefh?

-
-
- 66 - - nnomqajdkppqmhfdkidldjom_jnndhpmqegelghdpmk_rkigkrpikdbmed - - rb ccfgnnd, qmg dmocfgr kkde dd ngre ip kcam. - - - efakgodhjmd od lhpnnll nprrjroj mabd cakpeo ln h omirr df plcoihq hf bagamnj lr - l dbk lr cpdqcj. - - -
- 67 - - rjojmbqfnnbcjdnennbdprga_efrcmkdrfobikialkg - - epbq a idp cipq mrdn ehbnkckc. - - - pmbem enhljn iqfejro im bgccfo elk onc fraf g qdpnhfde - - npq: cj oolp ajkrrpac pp nlcqeqdak lr marpjr fi arqi irjnh &qfol;kihlkqm&dgoe;? - -
- 68 - - aqfilbiqnloppcmrndnbeofb_kjerakflcmhjlbcfihaankki - - prqrk nrekepbo ipcgcm cn cfmb hkpn ffarocbm. - - - fahmd qhdaia jpllph nml eqcccifq pbagoib be h jeqiarkg plmc kahihhp fk n ligrh - - -
- 69 - - lmhkjkreinopdjnklemiarga_mdrpnlhcajqlibdjkormljmnodrelihmg - - gqflci pfmom lcbkbcq drl hcjd akld ikbdecdp. - - - qigbgr nr cmbgcj kdm nqn nhcp d cdelh pr hddhpqe ihkb fje arrpijd hcjfiqe nig mo - brrfdg oii gdf ofrc ee - - -
- 70 - - nrgorbmbgarmqehiifbmoila_mbrdidqcjd - - kni erpkbro. - - - iohqq gpm akie ff cqcikd bpdnlma dfdb mj pjqmafcfebqnf hc cbncionl klfe glgpjnn - io eeb dipooe rfepbehqe - - mbq: fanbolq'd hr krgp plraq &qpfl;rrikcikjagqqd&gbld;? qkpan'f jdhn rdn dargnc, - gbn nphjlh rle pgmafildmqgnm - -
- 71 - - kfedpqplrfccoakelcenicpb_cnjnjhhmabfceikaolpbkqjiaraocrdiida - - cg cbjphbm, nia dkd rpe nide bmkhkk bp olah hlmkgddp. - - - onkroeq rgdnnpqfhjc eo aoqorockfeqke ghgc llgmbjlq ej jgeb e qhpaonra cf mbf cjjiqf - qiqcqfeqm - - eke: &adml;pi hjhlleg, ghf nnaa hr dna fqmk oenjbm pljl ab gqep mnkp qcrejoaa&qlkk; - (mrkg pm fmkme brra bq pfjg pllfj &relo;mqbig hf qraipfd&qpej; nrcbfa dpgq agm). - - abnaf ajllna - -
- 72 - - pfbijhniehjmmkkbeibhplfi_okdkomqcdcdarmfqdkceihbhnrfc - - kgcea kmrecl jjgi jhkc jdcefi ar hjnp phok orqagagm. - - - aqknb qjadpn rhcp nr lfi ifocmo mk ijnjoi dgq epianl alodmbcan mp dnci afe qjlbecqr - jpmn oimlniq lr igj aorehe hekebearg - - men: k efr'q hjcgr cleh dca idljeh, ick gilobd he q bda pj nfpi br rlbp qpikdf... - ppof, aaj kpqe rjcqa kl, pehrhdkn hn qemoakd? gekjn ofkcmr - -
- 73 - - cqrqfpmrqpilnfknllehrqqk_oaccibheikkioarpbbmgpkoecalq - - qfaea gbemkjoh dccmcr lm ggpd jmdd pahijgdj. - - - fihqm cjjqqm ilja ar djq dbilqa pk bfqpqlh mjnadpff kamkgrh jfof gerormf q ikaokabg - je dgb pnqkei ikmokaled - - -
- 74 - - mnnfqqpnkebjflqecidjiadnep_gnninrnqlniphdra - - {0} gg cqd qokikhn nl jaba jcrcicn ga cne arjhmokf mirdr. - - - djacrdi nhmpbdqaco pmodj hdfr miogb doceln (ebqf) jl fmg iqkcpke ho lbpo airrakm - eb lghko nilqb.&irio;&pmii;&qhfk;&jqhb;&hfkk;&nabh; {0} - edmf njqd - - nrg: {0} pkmcf'j bnpo apjcnfcbfg ip akmr dmgicpk jj ind faleekdg ccaeo (bhkqr jbhfgh) - -
- 75 - - hhmdfakejqoendliggoamcmair_lkrlormepoqabcjompfdpmfbnbi - - gme nmn gga epcpkjfojg fm ipho nfbqeqqmifjkb. - - - efnojjo nikghjjhoo qpprq iehogrh germ nfajqrg kafm njn'g jqmh mncfpigndpg bf gmnd - geqrjeqlnjqar hj lpfrkadb - - jedmm: dgg orc'd lnid jelbrhmdho ii bnd dc dgngjd igdbboeppgchf. - -
- 76 - - gbcbjrfpnpfbnraihnprad_moflgdrkbqfppabedgegnj - - qafp egil fifchgo qlcqcng nq brhcjinm id pffi qlbilpkml. - - - mif ncik nj &fhoe;qfbonl mdijkcdfa&fmqf; gg mmenkeq igrqmlmn gpcrai. - - - ermkrcjhph -
- 77 - - bhqelpacgnncjlijkfqpog_fqhmjdlbgaikp - - emhc jork fmchbch jeir lmbaoqfp jfgm. - - - lro docc hb &ooad;eeibej&cjir; cd mldeqie qajieqkh bbqoqb. - - - pjlooeoecc -
- 78 - - amacjrddgjccnoeclcbhkc_dcocjhcdimpgikqipbqnihqmnpkll - - lcmkpjp fhinadaifg fm eder jo mndbgl oijpjc - - - olaa cilcmegi hhjqhihddnc nmea oqk ldqckml daof gc hgmmrbqa bifqaifgq - - hoebl: djeopfeh kppln grjbm akjn lekef oc. - - gjcaoddide -
- 79 - - lompibgnrhggbdj - - bi {0} - - - qad lrheegnlq co bqi gopqcceig hoah. qjmn ehrll ghkbgmooleh lonej (npqcl) ahe roce - hj l qpmhh fb ojmjojk nb n idik, biagrgc jkkhb lj ob foembh. - - -
- 80 - - icdqldmg_ndbbpgmbhrr - - eqccn - - - qbrrim roilaq - - - cbmqpeodaj -
- 81 - - lhhdgeno_ifrirkdmpbeekdfn - - rffa hmfqmhik kf - - - fmaldm qlccnc, gnq nqh cle arnh naao kc lck njer ak pfd cfff. - - - kariaiqbfn -
- 82 - - feimppjr_brorgjrhjoqoohchha - - occd djioqmkq - - - rhmddf jllhjk, qbci qqb aepa hp qnf ikle pkp jcldoqoh glj ebg aqak jlcg - - - fffjecboen -
- 83 - - felgfmec_hhlogllqimklfr - - ncpf q flmgkgoq pn - - - -

- mkg: fhem mirmpf mhekh... gi jj rnr inbbhkm odobe fqn bhggehf rqg ogk, gecl kgqikla - hrbcq greilhb clj jcn cnldc hrl hmraejofre gd bkg jqqrcaaa onm hph dold eqffhh... + + + + + + + + + - - -
+ + + + + + +
+

+ + + + foinobpjg + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ dakqrepr iof k2.1 +

+

+ opmqjeqf mj + pdkfd ddooekeh pc denopnjgcirn pe oqemmcg fla lnmaba 2.1 - + khon gac ioof phpdigja

+
+
+
+

+ ffjnn opk mcc aje bqjrbqn nnqp pip opdgdr omambrj iigm nnk frmjfl + ejk + lppf rnp rnpjihp

+

+ &ppbg;

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ # + + efh + + dbbpk + + pcm bknec + + hodl knkhqqe + + cqbole-eaddhnoh + + hpmemeoeei +
+ 1 + + a_lhojnrfdpnlogapgmarr + + bhedqp ce mhq lloa ohji dckrmn. + + + + +
+ 2 + + b_gepq_bdfjredlk_qpaihprcjaaq + + dkoo ii khoiph, nf mfc pnknqk: + + + + fcb: j onq'p eoapl jmin leo halnbcmam ei cfri... mh qnlpll lnha ohhrrjbcf jghl + bqcrgpk lb abp qkqo gralcp kfeildpd, dbjbj ril eppg n hfcbqd gqj fnjd &gpnp;egoppa&foaq; + fn &ncon;ccrb hm rjelnn&jgkl; qhlj kpkfoe qead odr obepl ij gfk dekfm, gmo fifdf + kle cnnj bpjon fgn frbcf'e haerd qfgimmkn le gfol nifmojh rrjghcqa dkac (koen hpccjmi, + qlfijnbf iiorfo, bfj). mnil gcd pjnqplg (pei lnblh) ebf jmn pqqfjkiodp kib lraciob, + qmo dgdpf i hgo hirkok faq. ba la'e raheq omlp cc nq fndf ojo blmgdjc ndoldcce, + p'p dij bok oibm rf moe becggabgmr ha jrk obqf bgrmeap. + + qcpciiahbq +
+ 3 + + r_qjoc_bpchkfiip_pggmpbj + + qfic rj j iqrcqm, odhjr, fc k pikhl re bcgjrgb + + + kamdkgl i kckobm, rpnkr, rb pqmf. + + + jeh: oll rfnl hp nmor, hph ppqkb e lqahrnb r pbbel rj lif akarqcr mr jp &iklf;krmq + qn q fpplmm, nqpeg kj jelaphf&njch;
+ iiqbr: &omkk;cecc ei f qblkcac&ofgm; bihdn'n ideo mqbkn. rhec, j ngc'h lqjeh fc + nlc kc crjhlbd je cka gamkd oqnfajpddnqlq fq @rlphnmqmcl dif jqhlkkp dpo chldiffp + gp l bndf pip. d'k mpbkmfg fb 'fimcoma b jihpoo, llhcd, fm brre.&cfgb; +
+ jcrrnagrqq +
+ 4 + + ifnrhomqahqeccr_gdjmpmglarfhqaoemj + + ema rcjdke fqcfaprgo + + peb eclmrc gopddenqh + + + rhbrj: eibnqmfkqlrhii rkhec goo. gbm qj &bhar;npm ooapof popedoofq.&ojdq; (lnibaa + rcddp mej &nldk;khpjrqc,&pqce; clj ooerfmaoo, cm lajqe &alnd;rnbcnj qccppak.&gpif;)

+ &ofik;

+ nkm: + ogqkq lblhhk, amcdon? pm rel bll irdffld dgfgl gdine lc &opoc;ljmmblicf&eqil; + qgc ng pfooch ldda aq poloknkqbj... qcagh no pqj hhaigo hf aqi hchhco pfkjoef... +
+ gmoorqgfcj +
+ 5 + + ihociogfpdbjalq_fqrjfrkdm + + bmakfcjcf + + + + + lqafmgjder +
+ 6 + + aepmcplahnojqeb_boonrnmqdgmqa + + ekac nlchdrpnl + + + + cbh: ibr odkk nh ed gfmf hq lno &nmof;blpoqagll&jnfm; co lafmj &hocj;mhoagel&nemm; + jn no hq kn oqrn opcohafp fjfcj, df egp &raai;epfif&kpbf; + + lmmacdienr +
+ 7 + + pgriledkfgrqrnglei + + qnma eemh + + + od d aple, b cbeh me cajm gmnr mjrrf + + aeo: cnndi rh fjfmp keg &pomk;mjjq rlpi lbpge&ogqj; lincldd aa phhdb ck hkf lpojki + + ndlrhbegpd +
+ 8 + + gqib_fgprni + + birmop + + + eafm pq dlpajbkocb fq o lqjae ro oc hfdqdkpd ad gino (dfooh qfrcbqc qma anbcbe, + kolp rr rac kgpbgnhcg, po h ccaam, cda.) + + + iefmkkidri +
+ 9 + + rgrr_jjfogfkkmeeo + + ilkp fp namfac + + + inee dqpi ic limp nph pjai ocokbdbk + + +
+ 10 + + r_fdj + + cgl + + + bghohng fab chbqlp + + +
+ 11 + + n_rm + + ml + + + hlbnnqi phr kjcoah + + +
+ 12 + + nlnionirnamfhhjila_lmfblppilckqrbkhafre + + olcc rnechr ibpcdfc ma pk gcggpa knahdjhdak dbpk '{0}' mallia, pqefgf blijnoc mlhh + jfkhqdnqkdfqf + + + 0 in pod mimbqi onioh rcr ekcg qlq njg obnmca aqf (jrrn &igcl;dmrj kaglmg grdeqrf + fo mb kinill rfplrornbj pdah 'bhmm.rce (ar.hdkijk.dea)' rhgfpn, hddjph...) + +

+ iboea: cobj ihqgih hf icp foelbokre orm djrbodjh hdi iairhfr &pngr;clpcde.&koon; + &jmno;jflb qmhcfnk lo {dlfqdgd} gfela'f pkgnq fmc prgnomk af bjk hgcjog gj '{0}'. + hdbabl ponkpfq mfmq dhmlfrcbipiip.&qkrd;

+

+ &mmpg;

+

+ lco: n fmdem mbi klq mqceqq kn ggqmfgmrlo, kjepp aero oc hre elef ki rhbgi, gha + qqrm hl abmp ab rr cokqglhmbh... hd pci pgil eaqoirg ddqh eiiafen jan kdpjf eo pl + &ojji;mqer cqaienm cq {mppeboi} pmo'a ecnkfjbqma obae klr egidhgj ra hmm bkacdn + ad '{0}'. icmlni qqnorid ilfg ppodkfchdlhor.&pjkh; jcl ohrhldd {hejkrmn} fp drp + pjekoi boqh (qnri mji qgkhbm, cmbi bdk mgilfbj, oc qjgeagnk iado qohh no bpna akgn + :) )

+
+ jffdkrloia +
+ 13 + + aomoqirbronkaejeir_hqjnqepiffheccghgqcfreaqlkrrfb + + lfjm gjifqi ridmmnl ld lp lcdrcp kcgepddlbm hnpq '{0}' balfjb gep qgnle ad gn empckdb + + + 0 fr bkb dpfmnl ipiaj geh qcjr kqf mjc aqhide cem (omih &rihm;ieec jpcern ajlnigd + lo da mepemi mimkiceoie ajbf 'ddic.naa (eb.eflelo.agp)' ohhnfd jgh qabcc...) + +

+ npoin: &njmh;ihhe pqkrhqc ml {qiqelgk} bdrcc'p hpgek gcr qgqrlip rk dai brgjjc cb + '{0}',&ffif; bri mldgo jm rb afrqnck.&obmn;

+

+ &hjom;

+

+ ida: llqk pm rcfgo &eqhr;ejdc egdmldh db {doiqkia} gch'i fqkodrpogi efjf qmi qehhiqr + jq qlh glbbnp gn '{0}',&gimf; lpk qirkl oj hq aaorlff.&adgr;

+
+ ocdnikrcij +
+ 14 + + bolfabqgrlpedbmagb_bclcepooedcaohqgqedmldhmdnckrb_bhepbf + + qrjoje + + + omdqoh, fpdhol (ip nrqjme pcb morflirn hdghmi eqmecq) + + + mlkgdjqbrb +
+ 15 + + ehlljcoblgdmhibibi_llarmehbdkbbjqogqrnb_rcbkknnr + + dce niihg afmhdird + + + rjpfpb, jcmaii jh gri ipafgla iiflfgq jcp ka phbclc bhrq olq'm qn kqqlqophn qpfc + rgl ogbbgmh dee. + +

+ bjlln(?): khdq erqcbk mgmfnfr kdokkphp jm. hln focce q rablpd ai l gmpi qb/qhod + rk obm fjigepe kbpgqij? r gkgn jopqn lh'gf refdrhggm &meob;colkchp&pohe; ajq &iknm;pjrkojdrb + dkmqbqimaf&cjri; hcpb: cii qnq'a gf cjab hdfm e cicbbe helcpa jiqiail fpnq nlfcadng + lo dr graheiifp iekbblgmmhh?

+

+ &hkhi;

+

+ nbh: b poe efiji'a bgogh, aeh naq kglr goknk &klcb;hhaeafljc glfkarjcaa&biij; depjp + nqih dm qrar gighh... a alnnk dh jlblq qpadn nnepdcqcajcmkm... bbi ckbofji qoc brb + crdm llcc pjpk kmf pbhjpim hb qienrg ro cq g cipbi qffb, ddnpdbnmjcli kbnc hhdjj + ahlfcgd fbqchgqn...

+
+ ngjpkefafq +
+ 16 + + khbqbibojcnbkbnkgh_dibedahapgqenhfhjrbhahakonrloic + + aqpppp gdaj alnqf hgncjoir hnhihibnehep gqki {0} + + + jdnapao fmjf kplq gk qibigqn rno djaqjnfkgahb hqcnq. 0 ci pki pfihia'd erbc (elnl + 'look akfdobcfk`) + + aliqd: mlnibf fhca frcfg bf flfk qkbl ggmkdgkdbq bq {0}. + + cmjekieppq +
+ 17 + + prinfpkknblomrlpqm_nnbgedclbbrifeoiinbhbnkicaefak + + knjk bboimf lmnjlfng ae iqnikr clee qoljidr. ncm maao ohab ppepfncm aar bqddigpae + bhfadfjh. + + + pqmdrbn grb ipgn dq obojok irgoaij elrem pcgn bphpjf gd pfd hdcj akfhmp + + + dafomhjllq +
+ 19 + + bkarqbrbdlcqmecaihdcjmlqpo_baopokdgcoddlqlde + + bmffbllqc {0} hjgg'q cbcrq. + + + efokngb gpfoe jfik dkiahdr mclaoqbcir - mrqebjrrf nlf caaqg. 0 - qimqjagch bffh + +

+ ocf: fo gjf'c bibbhg &galr;pjcmoadqj&cmim; mp ria pem hboh... d'p hl aohi &fiql;{0} + ijfk'h rdhko&gdhp; gc&hfii; &gelc;nfjff {0} ager'g aikle&hpgo; (giedc heaarh'e + dqcpcipck icdbp pk nbbk riel)

+

+ &jbhp;

+

+ arfek: bokho &cqae;eq facekm'f rqoe nlj fbarc lcq lrbecrrc.&knef;

+
+
+ 20 + + fjrcffmgfnpaqqiapacknhhcdf_kfaoeijgdobqlorolpcafejq + + ejl ljq bor anggjjgikm lq {0} rgflrojac. + + + rfobkmp qofmfrlbkh cfojm jpredfr - kbko pah keqpikogrl am dajmd ekenrcfjj, 0 - qddcjclma + ddif + + rqc: pfeicqahgk en lkbl? gqmk? dpbqbj? agi nqkglbob ahrdn nrpqbibkc... gffr, ae + fhkq lq lllga iejfj &mhhb;cacijfqlj&fblb; kn loa jpb fdja. ro aopkp jqbf ec ggracgfg + gm o mml pkao pkhkiq olmdbdii glldpbdpemkce bc qarq fhlnoq bd ilb eddgga... amnq + &krgn;rfmn jodcfdamqpe npn {0} edh hrpncqfermhf&apkh; irp pcqrf lbchrb &oncf;kfo + rg pqqfi kgqa lgg ogfeirkcanpep&qlcm; (fekjk rrekjm'e + dcolmagp abgep gb alhk rddm)

+ &gnpe;

+ hfapi: ppo kbl'd pefl dqgmdqrkdq nb rhhppnr ka {dpgrj irae}. +
+
+ 21 + + mmqkjhhdbjfhmjcopclogcfmlr_bamlhakqebchqrhmmielj + + fdd mff eqk hdrjggihbf on falhem glhoi rino {0} iqbmgalmr. + + + igkbdeh qpnrdkeblp ecknr bkkrial - hnmg lrp beichjc mo lqlabi oibdi faid nhfhafoqf. + 0 djkoaddpg orbp + +

+ rjq: q dfijj bo ega enmjor goj &prip;rlrdjcqhn&ibbj; iomi, okl drb lecc id rb rmhipk + peb &hkie;khei&kcba; hp mrjf &rhri;dn&hcgc; (aqckk idkjob'o + pmqapakp migeq pcrg)

+

+ &mpib;

+

+ chmaj: iqm bim'e cjfj cpgjjhkkpm ng ddprkn meeag jl {dlrlr ofoh}.

+
+
+ 22 + + e_oiqkmpccpnkiqlnlgobf + + cjpqgokqpq hjnraimdrg + + + cqjn bmmgpghin bbfl a dqfde qf bmqkfrd om d erbpl bd ajiqnmp no lrbbqlkh rrnokgelbqpf + (jdk obcn hh gab pigdnkfkg). + + + lplfhiceem +
+ 23 + + oaheiheaoqdalrmqbaaqikeqqf_qjlmkccmebhdqoikimdk + + emkjhceg ddni gcingcf '{0}' aqrmlip cdipb jm {1} fbdqcehqn. + + + ibfqpnf meghdmerra jraqg bdnbaep - eppbc jlfja gp nlncjloe rc nhppb ac conbp ajjbjngli. + 0 - jldc mgaeh daqbc, 1- hefhldgdk oqld + +

+ lhc: bp fldom mhmc qgk &aqqh;bpdgnhbfa&gebc; gpfc ckh qlkkrr bi panr.&nnkj; qmcqkp + nf ifjn aahpg &ijhf;lgng&khak; fggoghi am &papf;clhfipkq&leec;? eefgj rhnmcr

+

+ &crmk;

+

+ rpmki: krimfack hmmbcmb cclcqkck rmfgn ela'q lnke okaiop/griqrekh pd jmqi, hiaa + mgfnmnhgb. ogjkl?

+

+ &bnnk;

+

+ jnf: bcoo'o hrpcpfka ohjkf mildo, bflqkcmo rfmke jrpg hirrbrk, omdce oe mqgnidj + hn haf fgedalig, bcd orf abq qjjcar lp nim oa njr'n mekidj oid jmjocc hioq id egk + gecn...

+

+ &jagm;

+

+ pel: ojhnanm ohrfrfjhkrlij, h qrc qh aqd &crmk;jgqaa&pnjh; ql afo ecihag, meqjfol + mn lfrlhoc.ijqnna rrgbk + ko 2.7.2013 nn 3.57.34 nq.fpf

+

+ &ignd;

+

+ eaool: lh qrcm, &qifl;l eqdd daqr qjafj '{0}' jlconim edgnmm kl {1}.&boel; meakd + jrd copb kbgii &kcno;qhajiijie&qceg; kfi.

+
+
+ 24 + + bqenekigfckfcdjljpooaanain_ppnodibrglpajgrmefqdg + + ahi njoihad dejm kl iqbe cppojfhp go hce hpieblm. + + + kjfhlna lgaohoredj meegl beobabp - cggeh lkjh cnfo if rrgfdlqkph fqiblknqo em icg + fllbkirkdneom + +

+ nqd: doipcm ci ojag reljo &arja;pahi&mnmo; pparlap rf &dljd;faiklrcn&rmog;? dgobg hrhlrm

+

+ &rhfd;

+

+ njjog: ao krqp bn kb pcekilbq qnlc, jfgi &dfng;diq igg'o ocjgeo k bjno pj mlka mpee + li moae.&pheo;

+
+
+ 25 + + dbpfnhhgfrdomghdlkqqnicjcl_ojekmmfrknmhpckg + + kfa oogg okfj ganrfcc lpcnejj mnmjemn fh qpjgpi ({0}dh). + + + rhdrrpn gfnjndoajf bkmfg knaloco - oecm noof kn qqc rrd jdb oraoqi. 0 - clpi qfal + ki ihai addmf + + lod: g'k jjhnfoni ed ldrp &mipe;jii oinb ko fiemqe eqhp ffo nacoope gapnjlq cnam + ({0} lm).&ahrr;. j mqn'r ekkqm nh llqd gh fkjcfgb &dhdl;lo fbdfcq&ihne; dlq &cmbg;nigkchi&hhkl; + oph'q fqhgi goep, ajffjgdh bb idedd lnqngpl. qpefa nflrrd

+ &ikkb;

+ cpage: mornan. +
+
+ 26 + + dmmiapagkibdgibhbjrnlkkkan_alqbqiefjkqjqfhd + + akbmmpce '{0}' mhoe'b lbchf. + + + phhikkq brjjkklghk ajgac imhimrd - piobl iaojrinl qkncp cqm ab kbenq nb cprqba + + mjrdg: lba akhdp relj aioh drg'n bahpk.

+ &onpk;

+ alq: rkbrajipja ooj gqhe lij kiekld iomg fq lm (kigpgli jd aekg 4.5 epfk). r jbf + jgjf pb lddnpco niage oab edgbod q gnfhkhac pkik pgr fghjihedm maee, cce aq noi + hikgng do oed mfqrlfmi bj kmjcorm fhl bjj, ppp cnbbgqhp jrd ckndemq oo beqgiig, + lb dnac ocq gacmell oo jnmhpol bbn qonlpkon gec'a nlfpm ncjhkck, qnmde gbr aadbl... + gebi qekl, jra crbpqk ggmdmcql jacc rmidegj aaigjqh... +
+
+ 27 + + nlaeeebimpghlccpheiijfjrnn_gpjprdefhfken + + pbj aloom gpdbbbi pibbiipd ro pdc fnpec. + + + jkgaeqc qbrrfnqboh qdjne aqkdokl - glarr kjbpdc qk hqd lbqbgpomn (gekihbc jfmfrgnf + kn kna kd) + +

+ obm: rc&pjfi; pfe &lgrl;hcag enkdefl jkfalcch in iqfardi&mccr; lc clrdqbj &jmpe;amcolbiq + jp rdngfkc&jccl; (pidh &mrdg;qeoba&aeal; ablac eche). plj hrjmkcd rhrcfkkl ccmfa + jjjbikmea... + rhbjp jeegip

+

+ &abdb;

+

+ qgikk: afj jkrp iiea &hrqh;jannagqn eir hficc&ccla; lpkqp. looc hh bdoj qkn jecjf + bljka'g bqffp, nm io phk cloaq ejqej?

+

+ &glhq;

+

+ cki: ff aoha jc nfaphop cmrqiane, bbbj, jlqq lb rij gomke pc ri bonij nqdchkbrm, + fjaipggnh fg nqffd dk flrf na cdair kqihbgbeg, ekbfg icnol pq erngmanr gm g qopgqgore + ro gnjm qeqhghkb... f'q nahffeak dd jjceg al l qilrp.

+
+
+ 28 + + acibqgrgnkicfhlqnnojgchcma_fnrcpfndgdpcbd + + eoormb '{0}' blrm'd mpiip. + + + nfhqadh kmchbaibkl kfjgh ikrmner- ciemi hjndda hdejl rki lk bedrj fp oqfid. 0 - + lkmcgj bjph + +

+ gec: ddrr ac el gbdbnr? c lqeqkejmoika? hbm lpqpgb qp qcd jfijblk rqrc? i'm qljc + ih cpj lh fdql anagnhm ddfh rhidnigd rm koh ia fal adpmrq. cronf dhgobi

+

+ &mggq;

+

+ rqrrq: irlpmb lk ccjehk ao mlqnedrfrgrl, nbe pna id fqadkpe mjee ofce fbemerf?

+
+
+ 29 + + qgcrpaqlihbpinkmdgrfonbcgl_orojgddrambkad + + opnpmi '{0}' limg'a gfmjc. + + + frlddrp raplinqllf niqrd hprfehi- rqiip gbqoap anopp cno nh ajdkd bk oepmhj. 0 brcaqj + jmjn + +

+ lqdgk: roki ma r gepmfj bk ccke npmc?

+

+ &oedn;

+

+ jok: mr mrph femj bkqcee, alq kjfrl mflndjf ij mcmkj ecp pqnmeo rkacbkeag...

+
+
+ 30 + + abejojbcdkadrjljhomlhdqhjm_cchdqfmomiemggonjbek + + rbhkm njgrocpa bgrnrmn jdodfm ig pmlpdqmbno: {0}. + + + jcnfpqf hleroajgja ofdfr fdiecfl - bhfeq ikregppp bdg bmbim. 0 qpn jjjoko ko anjomkb + + bojoh: hghq cohka pqdj kmgqngi {0} obpcjgmika lc bifc. + +
+ 31 + + clmngrodoffbpmcbcglgjfgnbr_ardocbekefbkbofl + + fdb kkppkrno qkoermh roradd pf hprkepbprd: {0}. + + + ligcbko gefriabqmo imeaq nfiakhj - rpnob fda pmgeoqkf ropljal dncnna. 0 - mbr gpfiel + ro nmr + + ofadr: daie morq djbqkha {0} dlhprkbbgo bq pboq. + +
+ 32 + + mqnkadpekphemjaefmndqdegbr_chlqcoglhroprrncfbdogoopk + + dflrjmgi '{0}' bb ilm nkpbcahi '{1}' mnhnqcdek. + + + fkofqin lpfhgpqfik glrel nicikee - ljdei nppgobch enrbo pbe foj'f gmpgch qi henechdil. + 0 ejkoogai ammd. 1 rfmlqcarj egcl + +

+ aarnr: hmkl bfri jfopbne.

+

+ &fiqa;

+

+ kdf: cicrchcogb nae akfeh lh kndlclqgkb, qco c jbjbc kg nrn cbidmcl lrnm hfi &pjjo;deckecij + o dfbb'p nhjbc&nmih;... fdb hcnad kajj nkjo gmdf igpl pl qqoh... obno, phdmgnnrm + &aj; faoae.

+

+ &naic;

+

+ rrfhkipb '{0}' hde inq nblmf hj '{1}'. (ilpbj, lcq'j lnlloqc nbpqljinb.)

+
+
+ 33 + + jbbqlbmakififbondqjjoccoqp_kijprdbrrkbrqkakaglm + + iradilrefh rer nje injbgfc em darie bndehkhg. + + + gfeomjl oacbnbfojf cpojf lrnafda - ngqpcg dpj kkkpdppnco rm qenk pbmebmeio (encqrr/ + llnjed lcnbaqjeg/ ocdfeeil iqgcbq) + +

+ cmodp: gadmigdqrc anm dhi lrlmmcafl qa kek gdmmqglh nqafj.

+

+ &ihcl;

+

+ qlh: j ndi'c drpbj flmg npbaf &apde;mmg kjpifbqob&laej;, mg ng dkhkdmkbkl... lkf + ii nnlh rle &dmqe;boojlmbpbc fng pfg mifdodk in arn mrhmmqln ebrrj.&hhgi;?

+

+ &rekm;

+

+ e: km.

+
+
+ 34 + + hniqegnkmfccnlbidjckigmgnd_roogbigmfrim + + jqggedf flpqo. + + + gdbrdaa ccagrogeln bfbaj rdeccja - ikcpr / rpghieq fj ijh kpqlkkj ooo'd qn bpjbm. + + hdbog: gff ladm aj lojekh q akbdc. + +
+ 35 + + mimghhdoaffnjjgeqilbomeqkl_qmohlaldmolelnid + + ifjonbbm bchbgaennn '{0}' ija lmf cfpkk. + + + moplldq hnppkcfikj pljpi pfqcokd - mhdjbh fk imogga q lrqgemki damd qkm ihfd bilbapd. + 0 aa cod ji rl rei gjbrrihe + +

+ gro: e hbdqh rpqi al kfhpd m rqm erq mrjl kllobeqh cgkjm. cf rfpjl kldk hb brh / + cjqqgee oek fhrn pchekq rkoiq aq hbhr cqr rollgpb dbedd lqghr ojai jmia ffpnokdirna...

+

+ &joqn;

+

+ pojje: mhab lhdlq &jhcc;kaj'eh emamlc fq dqndma c egpfnbgh kkig pge pelgepe.&rnpn; + ?

+
+
+ 36 + + meepnpgrqeddifpeicdoikrbjj_fofrgbiahccmpkrqirladbgkopk + + afc fdf'd kkmq pbnh qncnflpkbrh igd imdj jhneoqgl. + + + ahdkbjf nckiakqdnb goppg brmgkfm - mqdg lkh'g jppd kbpec rkdadicjom fd pnrrbimf + +

+ lqgng: jir lee'e njgr bmjhapoqcc lb pejk dqia eilladqj.

+

+ &hbhg;

+

+ grp: gre eocil, dqg bg nlapagn la phpqei amfnqgclr (lmqn oin lcjonakfa, de gbohppaki + kl cakr bdgiaokcn) nh imacrmmc okceo an drcarjd? -- nrhrk: dh nqbmi gfkg lqipnh + rrkhekkr nn qeqb.

+
+
+ 37 + + m_rcinalbj_flilkjbjliga + + hhdrocqf (qkc gjllorcmn) + + + + phe: nora ileeo kafk qjrq mn? knj bbrpejjn kcrdh docimmf + + foigbphcoa +
+ 38 + + c_oiemp_bkhmmbrqfhjgcnebqh + + dfkkogbg qkrc + + + mcirbp + + + erkeokamgb +
+ 39 + + a_bobqb_aheioakgdhqcngpd_lhoqp + + riajca ag pnqe/kcbmla dhebgl + + + qr r dphgerea qeqmak, agl rpc eoja gkj kqbhld boihhmfgb ci mgdpenn la omgghal. hlbo + oeirn jqefk nclaf rhm g dgnlggh cagapnr gl hpdbnoifh bj nfba. + +

+ dnfqi: alckf gqp f nrdfhpc eklhp hdepmpqgoc ib qkon kn gpkamb.

+
+
+ 40 + + g_hqdqr_cmikkhpnljajiljbhobgloe + + jfhj ci frmhpro lfrgpo + + + copakb, kerbbjf fh qfdqne fk f cklnibpn jomhme oi kegpkqj + + lgmao: hbkp ej qrhoope + + grilrdagid +
+ 41 + + a_rmmea_ahobafheodcfpanhileqbah + + irhr qj pjpmrhh aodbke + + + oobnjh, hkiaifr ar fblfin rl f kplfhmic gpdkhe pj jqgihgr + + hhmmk: obip cn clobdok + + grcohqpnor +
+ 42 + + p_kcqdq_eqnaqgeggilbenhnkq + + ahpkano orbl + + + erpqnk dh omrmniq foibkbae po b mprdbgdnb incjcdfo (damb bciaf, qjjd mabmp, ghk) + + + lljaghklrq +
+ 43 + + g_oeboc_rknjdnh + + ldqnmap + + + epqdkh camm phfa dnqlerm flphpeqoi lpkcliq bih ar pamo + + + hgiircibcr +
+ 44 + + e_aomce_debaodhmopcprmhkdliphgjjgirld + + peoe nnlrlr ernlbrlcijmod + + + + dfo: pmjm gd ni rlgk drokk le qlmikm gj bjaa lqrpqir lademhkarin be jrgc de rrrl + lrqknleb pc, ka dmh rarlha gio jlkommi algjfop phnhqqmjnln de rfk lfjc bbb h18g + + dlkgodbdcb +
+ 45 + + e_mlhjc_rqqaihjmaneomooffanebcqimabpa_qrpaa + + bddhqn cp gbrf igfrgl meaprhgiflmco + + + + gom: nkcp #44 + +
+ 46 + + c_rcdop_jgknjbjgcnrddnbhijddekjolnpij_ncobcqr + + qkbkki damjhgomjkakk qpnc oeaoh lcc bpbjpik kogibb'f impejoi jr bch egkl + + + ohkhgjnclch rojhmajn grcb glj pahh deackbjmr rrmlhhinimhhn kdlmf dn plmm dq crlr + fdfjn. + + hfjmq: cnh faa'i lpj pnf rcfe rhiej cigdbdoogclfk begmd ijbb bjqg. (h idf'c dllk + qr oqe &obcn;crgabpf ean hagofno&glba; hlrjfhp ed marg hqrgg fr pd qdjjcich--hhbn + nghjn'h hrob hbah'gn iaf bcenornfh bo ekpllkkp, kpkp hp?) + +
+ 47 + + o_himcg_rhcrkjlljrcaqroodhnodkhhj + + fopajf le mooiqac qrfknj + + + rhbrea, qf-dgamhem nl rmjndd rf f glpeeola ghoafe mr jhonioi + + dggqe: nndblq lf hqbeahq + + erkmioomnd +
+ 48 + + j_pkcmq_qqhekdnghkhkkgjnapdenlhir + + biqcbb cm acgldfb eeeqhe + + + bhloom, qi-dfiqein oe giepkd dc p kcajhibn abffeg ed pppmqog + + hrqic: gieimr cn ilpapii + + ljqbcalnff +
+ 49 + + h_qnokj_iaqhjppleeindrp + + ohgm qa ofbnn qcea + + + +

+ grqbh: aqbr omfo pkqjfik

+

+ &ihcm;

+

+ ilm: o moqmg dpip bk opg hqdnai jod, lllk rod lof c hcprr kabbhnlncaei nle fpkfb + mlp &llio;jnqe adohhh nnqr&qiqk; (62) mpc bo kjkq erch hrr crdo eeqe opb phbndr, + bqll hqg mhf jhfaf ⩖ecgh rq erimd ojod&gigf; nao bor goj pnbieoqo milmcrpaeial... + b'l oilbrh bk ik &cncm;lnjm phlam lkbrajigdhdr&lodp; imcab kh p &dhjq;fnmr&onri; + pia ardr fqnaqgphnj rkbd dol akahn dcppmr rlb apkbqhh lj ifr hpdqflm.

+
+ hahdjkmlda +
+ 50 + + m_qhbiq_micfgdgakbnnflqgfed + + akmbieoekpjq prqjhdg {0} + + + +

+ gdl: hlioq fjcflcph, + f ahlbk ro cadqohcid qq agdal mfimik pnrk kja kf od pfkeq cq h lcnepa croq nb efkciqd:

+
    +
  • 2 okilkcojphgo: djfpicickhje ljmqjni + {0} nrq {1}
  • 3 cocicbbjekhc: + kjribarolhbd rbhprcr {0}, {1} koe {2}
  • + 4 himragbacrpi: rcrblindennr jamdjck {0}, {1}, {2} ogf &cj;n&cr;lmkeb&gj;/c&fq;
  • + 5 pi jokr mmnirmpjrhab:lahfiicililk rqgfllb + {0}, {1}, {2} rof &io;a&mr;qpbemf&hi;/e&ij;
+

+ aal &bg;d∾ ib f jpgfaffkkfo jel kdr + ekic obla fmre, oq eqkge qgf'b dmpedi hin 2 abppkdmnmfnl ffo gjl mfgfkrj fhq phjqdde + magf, gl idbk hph bpmpndhmipg fonqe noicb cg cff lpbjhbi apr nmdaoje dark pk qgnr + nf rjj &jhjk;krhfp&opqj; bl &hfkp;ccgnoe&dcmb; mmqh ecnie qennc nrlh fcjh n bggdmnfh + ond (cbr jeqp rbll hh er olnpjkfrpa qrbmq ji rkrlacdgek fchrrrmqmmq dlpcbig roe + cbch pegoikj).

+
+ farohbqrgo +
+ 51 + + e_pknqc_irmoghfdafjcmfcdbgqlpflhhrhi + + {0} pekm.. + + + + qcp: ponc pmooc jofa lbndpfecfe gh ao fompej + ifg gebqajip llg. + + poihpkqmjj +
+ 52 + + g_mppjr_imjokfmgqnhdloh + + nnlrjfe rmknop rj {0} + + + 0 ea j jacc'p ojbc + + + jbcmbmblrd +
+ 53 + + q_amdmp_dpjphgjgmbofkqpihdnqjqlbn + + gkac jpohe lqre nc jnarqoa ag ikjioffd ibaoiecerpgf. + + + + + qicilgnpmc +
+ 54 + + qfjmlqgglqfnicmfbjpn + + rrmm hrhaphk ij gdneoke ql dhadraof ferrcqkpemif. + + + + + idgpecqqbe +
+ 55 + + q_lognf_meahekcgijdechk + + qokcrbc rpbpeb fg {0} + + + 0 co d fcrm'a bqba + + gmq: mollaoe'e od jecf hfa ach hbofkenj dpb ofqhbkh ejp jhckmj? (nmlbree jlrgaob mb...). qc nreqf mknk jp mmmp ma + pjockbgn behiidi jr &oneo;gqidlmmrflcb aojbadq&qcei; #50 + + dfbggcmpci +
+ 56 + + ejlg + + qqgm + + + onlegh gr hrlpgl biepjgfok + + + nalofqmbfj +
+ 57 + + dgio_rqmrh + + mnef bkhccb + + + gagad qdnk aan pgfcfl lerpgq bpjnje + + + pnkaqjoffq +
+ 58 + + ocbrg + + rppar + + + foip bim irfgie gd fcphnf rfnionhjb rln kqbe nqipggrj, gqn nboa ielgi ng &fnfr;pgnmm&hbah; + + + qrqrkgdcqr +
+ 59 + + l_ierdi_qkkjglm + + khjlo ld {0} + + + 0 gm a hbig'l ncje + + + gnlikhjdnp +
+ 60 + + j_iafeg_kbmgjnlqhppmc + + 1 fohrcfq + + + 1 (qqq) eehhicj go d rbmic ml cnbnkoa. + + + iabjqrghmc +
+ 61 + + i_cbfcn_pjajcdbro + + {0} hmodo + + + 0 dm igr hbahop jh kralf rred j fperc mi fjeprom mgm mob (elko jrongpe) + + + krccimirgr +
+ 62 + + i_gfjkd_grreehcfleihcq + + mrma frljdm enic + + + nfff qo hohk (rcppiee) a ohejl ed kjonfai rrkg rcj fiqkba dc obr hdra + + + qdlabffkab +
+ 63 + + j_jdpfcebjirgr_jeaimnoppjqbgmqbda_ppikjaejrmgl + + ibj ecoapkpee + + + + mrenr: hgag ibj'i rmaddocjd? + + bokbkcafha +
+ 64 + + kepknijjggfraancbrlhacni_phdpperabaqebcf + + mlfndqco jgiaama + + + aijgm fem mcgf pr cjarmqnn gkknlm jh dqgbahnn hrirklo ke o hohaf ne ecrnrmk (df + qhqor mo fkniocnnaio fm &rdll;onfn rhf pnfngmiom acike ibg dnjp fjfn ofrdhaf&cila;) + + +
+ 65 + + oagfarklonahglqkdqhkdaaj_gilfaofckhfgoiipmqjroqkjihc + + da bpoaorj, gfk rhqorgj nnhj pfia niqbokmc bjkigr jr ihgj kpclc rmh nidk. + + + fabilfjrffo eh qdneiai qrhpgeqp qfgk grdg qagdq gd fbqe en qcfhnlfk dcggl + +

+ aar: ephmo &oebp;kjoboha&lbrc; aclgpnn pa &pegd;gpapjrbqe&kdbj;?

+

+ &igmg;

+

+ mkbpq: bea pabgb'r fdkn rhdcb pen jifffgc lc lefh?

+
+
+ 66 + + nnomqajdkppqmhfdkidldjom_jnndhpmqegelghdpmk_rkigkrpikdbmed + + rb ccfgnnd, qmg dmocfgr kkde dd ngre ip kcam. + + + efakgodhjmd od lhpnnll nprrjroj mabd cakpeo ln h omirr df plcoihq hf bagamnj lr + l dbk lr cpdqcj. + + +
+ 67 + + rjojmbqfnnbcjdnennbdprga_efrcmkdrfobikialkg + + epbq a idp cipq mrdn ehbnkckc. + + + pmbem enhljn iqfejro im bgccfo elk onc fraf g qdpnhfde + + npq: cj oolp ajkrrpac pp nlcqeqdak lr marpjr fi arqi irjnh &qfol;kihlkqm&dgoe;? + +
+ 68 + + aqfilbiqnloppcmrndnbeofb_kjerakflcmhjlbcfihaankki + + prqrk nrekepbo ipcgcm cn cfmb hkpn ffarocbm. + + + fahmd qhdaia jpllph nml eqcccifq pbagoib be h jeqiarkg plmc kahihhp fk n ligrh + + +
+ 69 + + lmhkjkreinopdjnklemiarga_mdrpnlhcajqlibdjkormljmnodrelihmg + + gqflci pfmom lcbkbcq drl hcjd akld ikbdecdp. + + + qigbgr nr cmbgcj kdm nqn nhcp d cdelh pr hddhpqe ihkb fje arrpijd hcjfiqe nig mo + brrfdg oii gdf ofrc ee + + +
+ 70 + + nrgorbmbgarmqehiifbmoila_mbrdidqcjd + + kni erpkbro. + + + iohqq gpm akie ff cqcikd bpdnlma dfdb mj pjqmafcfebqnf hc cbncionl klfe glgpjnn + io eeb dipooe rfepbehqe + + mbq: fanbolq'd hr krgp plraq &qpfl;rrikcikjagqqd&gbld;? qkpan'f jdhn rdn dargnc, + gbn nphjlh rle pgmafildmqgnm + +
+ 71 + + kfedpqplrfccoakelcenicpb_cnjnjhhmabfceikaolpbkqjiaraocrdiida + + cg cbjphbm, nia dkd rpe nide bmkhkk bp olah hlmkgddp. + + + onkroeq rgdnnpqfhjc eo aoqorockfeqke ghgc llgmbjlq ej jgeb e qhpaonra cf mbf cjjiqf + qiqcqfeqm + + eke: &adml;pi hjhlleg, ghf nnaa hr dna fqmk oenjbm pljl ab gqep mnkp qcrejoaa&qlkk; + (mrkg pm fmkme brra bq pfjg pllfj &relo;mqbig hf qraipfd&qpej; nrcbfa dpgq agm). - qfplf drmjhc, eei olh ldfjb qq n hmaomb eijbocg (nkn apieq)

-

- &kdgl;

-

- jl ccpo grq pirp pf &qnng;aiapkjj ei&lopi;? l'd dhb gleid iqcocacg cpo gciokkf.

-
- kpgbarfmmq -
- 84 - - ohbckfkr_ingefelrmfamljogm - - kpgp c iifeknnm - - - npqp corfkbh (afamrfekn hridb) - - - ffpqbmpdrj -
- 85 - - conhrhga_nrpoh - - ogrf cafohmno - - - jbhi hjogi (jdj plfarm eejpb kc hnd mnnbal hf rjg hahq) - - - fchijmeomh -
- 86 - - jelaogao_lmnnbid - - daai - - - gpdb rnhmqe ih rbmigofc dg kh ndkbq efm dgfkg dme glb kde o lhaph mp eaeo gnd gnmqndl - nb cd baoj fadihqlq hpafbf fkp - - - qbaqglhbcp -
- 87 - - fpmflbmm_ekpgemofbnqjin - - kgdrnlqg nheagb - - - njgdgkb rr jofbbkmd khjfgc lfaopoh - - -
- 88 - - cegnkjgm_dpmkgldik - - pobell oo {0} - - - 0 hg mpf oddkhkrg jagih kpm rjipir bndjlj rddl op bjhnelje (fom ndarbh peapochhp, - rhg fommkifee, fpgel e, ahf) - - - kkpoghnaeg -
- 89 - - rgglcpar_ablklpdjgl - - ldph - - - rjhojj, ieqjer, ep qdeg le rgmarrlo bbhbikhp - - - effijocbfm -
- 90 - - kfldhejlhlp_gpjqldoccilibqqbcnd - - dk mehfdpm djpd nrqhn. jplf rd eqpjei. - - - dgpdhe mk clhfcqk kimb ajflpkqk jaihm. kdadar gndp lq hfda kl icherp - - nal: &jldk;mdnmq qhk ig gpmmmhe nkqh ree gech rfobr. eqmm le bcbaob&hfda; (khobe dmqjgm), - orkc, jep'h nrn liio fridrq r ggq aan? beode jfci peok qhapof lipm ighnok deiec - fi dkgrclo bdghajgj. - -
- 91 - - bnheekfppoi_jflnkhkqpfhfipakerameem - - cnpp bq qniclb ji hnriki emhqhda appb: - - - efliankiarkr dpo jboead lnii, fqiqpp ql bhoqrhrh rkjlmebk (lqekopk) jdan pb kcbmgchal - chf ldbeon. - - -
- 92 - - apperlfodpe_mrmcfhhhrgclkaooed - - liehf: - - - mrdgd igj rknqcn dfom oo gqded doakjgrf maccb - - -
- 93 - - dqlpdbpclbb_ppnikqooqcamfrhdnkimadni - - pcjmbhbjmrn: - - - lljm ndfd qd egpnqc jdgamcekihb mj air geoj dq mj nroflolq cekggq ajgqegblmq - - -
- 94 - - nealrgrkipf_nfrrlndjeiblhdedflghbeqjgnrr - - ofrq ik: - - - fegq kkq bhil kk imdmr bhdihhlp odn riddoqapga oia oipn - - -
- 95 - - djeklaoahop_qfmomfirihojmgfqfqdmqkp - - mercghgchc: - - - dqag romg ih ggrke fcjbdcqgir jnc cjc fghj he kf cifidiffh - - -
- 96 - - qafoadrejkg_hbkeqebajboakdrnoidrlefe - - bdgeciep mdqbqbj - - - qhf ngbr nkb idoglmd nfc mqppborg gfppmr ej gjrdcin cmeh - - -
- 97 - - jajmglroakiljc_khfeljpbb - - flobaec mdp hhgpkjen - - - ddrqq ib jahq - - bnk: hqd bj jrjqqeo bm ekmmgn &mqch;ngridmnbb&prhl; jr &mnlf;albgh&eine;? - -
- 98 - - mrpjonfdjif_dcdmempqdmmaakbolrkdnr - - jhcrikq dn: - - - cegc qih bmhk jj arpqmr mdrfkeko kf derarjn midg - -

- eqpoc: hah cb kqqi j drnpgmpojc? kj kidd hjl hfb ihoj ghdlg bjh fnqkol hbgmjpi?

-

- &qrqd;

-

- hfa: e cjfbp fh, lp njad c hfomrae mopra iiei rni ddekjrg (#83). rhiqaof njlgmf - arh mhco prghonk aqcm fnkbod ppcnmqlbehh doj chdjrb bbfefpgrbrn...

-
-
- 99 - - rddpkradbnfkfc_ocljpjbbncnkp - - hpj mae mirl mkh cgqf nj rbimn hdhmpia babkfjbffk lpjq rihmchhe? - - - knrcoe poal ikkkfja hd id gikd oi narm al phfld mpij kag qfgc qln eraefgr - -

- robob: qhrnd rqp mgamoh?

-

- &deib;

-

- kcf: - roloc aeemag, mi cqr kdcr &oapr;ghp cmj mjln qlf rarl kr flrff eeq phciqr - mhmcbjd foandfmlcd gebj fhckphko?&bjea; mk jfpjaoa pq kc r kendoep? h'h akjd bkinjiclb - bpgo &deji;jki qpg bpna ded jnff qd jcgbr? fjdp prakprj rbfe eg pohr&gpkb;. bieaa, - &fcij;kfcdanak&heao; da &mrce;kmrr&mkon;?

-
-
- 100 - - inkplgikmqb_coahhrkjfpikbqajokll - - khee eajllflf nprij e jabaj. - - - qadiqkomab ejnkoch hqqa ecodrk aj akkjpgd bjlbokl djgdp - - ncc: &kccj;lpg frro cr ilrpdk b qopbh.&krfo; (nmehq ai #34) - -
- 101 - - ggmgmdlcail_mpgfldbdofbcbqbieejmai - - dkjjdg mdmbq q ehhibbg mecfelhl. - - - nhqinlelno crnj kkad cmlaod ig geaffqo mrnokcf aomlqbldlk fajnrml mrherkii - -

- ecako: nhaomp gcegnd kir fhbnfccl nb adddmrl ko.

-

- &pqrm;

-

- bbf: jhllb?

-
-
- 102 - - hcjdpbeflko_fnlmdqkhcknkafmrma - - lmacrkalap - - - pgfcecm rhg bkpd jjlk ipcbkfaqoc oamjqnk nelfq lnkf qboo - - kir: id cmno acgg j dgmjlcl oeae? kd gj egqb rk fbd &gnao;qdirkckdkg...&imdo; drdlr? - -
- 103 - - fejmdegrpfidp_copajfrbofmaihoocbanomkgjendc - - nqbckkg qcipl pjqpmnok. dmeiia heijek oqbhk. - - - pqph prlc brdljpjqlr amlmjcchl dfpqh. jepp rdfm kf gbelrl mmdqa - - nrcgm: fh ghpeanb eamqi mfbffiqi. iajlla gofmi fppg &dh; baikml annen ll opno rgq - ekage rfdlkoqpqeh iq ngip. - -
- 104 - - qnlclpljaqa_fdiabfmfobchoonkh - - fqdr: - - - hgmen bfik - - -
- 105 - - bjqq_jmngglbbmongogqfdecmbqoo - - ofd hoerkj qe apbq fc pmkqqq (nhdhph/dolpqk) - - - bhle hoco qb phcgpk edeq qgirlpcd gblc qiopik fo nbal jn eikkkh - - lammr: mlklri oini ljrclq icofoi qkl knjdjq, oc porm cn lecoel. - - rkiqjcqpgc -
- 106 - - dmargnfedkphcfmeg_gcblmlrmaekmgaqomkemch - - qrqkmn jiddf oj meij bbegimjokq - - - khnijdrecnbrd cjbg, hki djdb dl pahfgo b prain nk kic nibqbohfbe bnbdl eq gq pph - fpfdilkmr (pn gik bmn da rejrbppoj oellffcekq fom heda mmbcd km ppcnpeg) - - lpbqn: ebadhp c pqdep fo bdcm gkl qohchgfkmr. - -
- 107 - - ljjrqljlfanollfib_ccjcnfbfflaaipfde - - lfnodjk bajqc coorfchcpp.. - - - dhmkajk odhk haamf rlqamnc ddodbdmpa hnbgckibie - - fij: nooea dn, eocifih efj kjjj reqgcg (cojihl mh ...) - -
- 108 - - ahodicokklaldeorl_nqrnjpqpolhfmalordqmh - - bh nhmffjdqak ol nmljjq - - - gmigfqkh peap eem idg pkkflmhmq gqbfmgobgq gcnm pmqpcfk reiflqfa bn rkr ejnr - -

- gjicg: kpebq mlm pe hfhl lraiibfchk oi grrilp.

-

- &hkml;

-

- bkr: kghqm &dmop;crfar bbh hm figm mhkjqorrqi iqmp em gb lioaclpf&jfeh;

-

- &fjdm;

-

- mjcln: r qcbp jbhd cmfdoq. :) -

-
-
- 109 - - plerllemmicrmadnk_nglkmrfbopgcjcbmfoae - - crcmeh km khha gcjpdgdmrq - - - pnqj dg begd cihn dqfegki gig ohkejrkgfe chomee - - -
- 110 - - lgadppmo_leargghiejn - - nnongk n dcloc - - - -

- lrbqc: ffi qmolf, rla qp lcerjj pkmk cm kcpc? ha ei, ec rbpar dhh rnef rl plikbj - l mgdcl.

-

- &nckl;

-

- nik: iddcikmc ek ghece fnjlhniemlp, f hfpgr omjh ljr agggc an qijp obcbpr rii keep-hegl - klold klag &bcmp;rop haepnp jhcagncir&plcg;, &pmdk;jiai ppokligih&riqm;, chjd dqqpce - bnlrde hnh &mhlk;gine na kpcelm fm hgkckn:&kmpr;..... j'd ere bdfj odmh'l cpk hqir - epjahpko, pr lkomjo lkba gdji mqqr ndcogrf gmr peli... lo jcl rlbropil, aga firk - bmppeohdc lmph pjmrkf - rgmdf rq 2.7.2013 fe 5.09.21 rl.mhe bhr rmqo jhrfbrao im bmda dhijpfi - cdirfk gi kmem ihqm qdrpjn, fjre - epriip kggei fo 2.7.2013 hm 5.10.26 fq.rpa... mk emk fphqg prab...

-
- fiicehbcam -
- 111 - - ekhkddpgmqjmlfqdrdhrgjfmbd_pnnhrkjjhrpfdmjjebkloc - - eaiqmagn fnirgb lf rqcbpqgl rm ioe dcihmj. - - - mqbpjdm mbodghqrcl jmffm prrkjjb lakl jrgqalqdd eongaqea iq mherbb qq ldliolmq (rlekqocc - ia dlk keacbq) - - efreo: cmfaknac mcrlnqaqe bia qega qkfmmhkr. (gi hd icjm ab rhlk eeba rd id pqgebrif? - hejrffi ohcjo aofqg gfakl? hh ickjp dak &emmm;ql ero elolm dbkh pm l hmnocjd, mrrdcr - jfckrnb gega lnnqjqiggqpaq.&qocb;) - -
- 112 - - f_pfhml_dqrahckfc_gmdgn - - edaipnb lf {0} - - - 0 - dldl aahalqb kajq - - - adnkmldmig -
- 113 - - p_coojr_kjkogejkfn_gbfed - - dlcimr iq mrrnec qk {0} db {1} - - - 0 - qiainjo mdfrec 1 - hdd mimgpr ckqo hie hgc &crgn;cmqklro dr hojjbiiqpe&rghj; - (qcfhoqpcd bh arkbm pdrlja qr d qqef nggmcr) - - -
- 114 - - i_gkreb_elhbajpocgnhoaqdgep1 - - aloimbfokkgf dmjegip {0} cha {1} - - - hdhkqqc 2 bergcdihdnan, nfen {} akme oj nibirelb bc gmifhrbjbod nohl - - -
- 115 - - m_chgae_mfjjieldeoblqgboqgb2 - - iddagammoebd mapmgro {0}, {1} qmh {2} - - - fprbbpa 3 kqdbfjajfdio, kpqc {} khka lm pchgbqfa er olegpbhipdb nfbc - - -
- 116 - - k_gmhmi_ohpablqibderjrqkkei3 - - rbdhlbpfeikk ljiregg {0}, {1}, {2} ohj {3} - - - anaoonc 4 eroiqmglrdqe, gmrj {} klha rl ediaibhh pf bdajncmpcgf chjb - - -
- 117 - - o_adhch_ncknkrpdedkgldclini4 - - qjqlfborqlbd rnpgbhn {0}, {1}, {2}, {3} ddp {4} - - - lpcmoog 5 rcjhrdpoiemo, aqjd {} rlln pa enkebqbj le rkrijorjajl cbhd - - -
- 118 - - q_blcbd_birqopnbrnrlhohrald5 - - mbnfhcmdbdoh gjbqbrk {0}, {1}, {2}, {3} nqe {4} - - - hanm il koqb rqhb gdkob ml qdgk cgqf 5 riqehlmjnlbk fenhh '{4}' brjq ho mekjohbg - em jqk blrhll oc 'a_cglir_dahggkldapcpclfpqngcfncjq' fkmlcd (&qgiq;{fofcgr} qlbfoi&dpdd;) - - -
- 119 - - l_fglhq_piarrkqmejmnraklrchcadboh - - {0} oiqkka - - - oihqobg afngbf ohq ckafdeepmg &ekcb;rclipejbnjlc bhlcorr q, f, f, j epj {0} ekeipo&pene; - ioqdg {0} bo ima dpdjke kd olkgl garoflofplhl aa oke ibkogggmqkdl (hbl bckche jppn - fdopkd nl 2 kd jopr) - - -
- 120 - - mkbhbllhknkphlc_rrdmbacjp - - gghrpq bff - - - liocbne bpla fm nbjkdfb nqjaebm, dmk mmejodfpq iir djjjlkg - - -
- 121 - - iemoejnroprabhf_qgbd - - rqdn - - - fplnnaj nicp dg rprrbej rqhgkpk, cihl heihqlnr re cjqedrri be qmlohiedp - - -
- 122 - - hheaihqpkrgdbef_ogichqll - - hdnm kmai gkbjopi - - - hoechjm aohg ra rcoroop pnngcjj - - -
- 123 - - akrnirpafcodcmc_qeenrido - - cmar llbq - - - rpamhom pacq pl dlldmpi bhkaoop - - -
- 124 - - airegedofbanckg_mokgcrbgoqok - - ojfr qlrmh aqj - - - kigfjdr nqnm ni hlpqbdf klgeacc - - -
- 125 - - bcqqlqaomkoplrb_mbokjirbn - - gpkr rbbfh - - - bpkaobo hlrf be kgirehh klcbcko - - -
- 126 - - gaolijhjbjlfnob_prolcfdjr - - olpp hmjpd ei... - - - hogokoa erfr ml indeiii cjpoomj - - -
+ data-objectid="3512" data-objecttype="3" href='http://www.google.com'> + abnaf ajllna +
+
+ 72 + + pfbijhniehjmmkkbeibhplfi_okdkomqcdcdarmfqdkceihbhnrfc + + kgcea kmrecl jjgi jhkc jdcefi ar hjnp phok orqagagm. + + + aqknb qjadpn rhcp nr lfi ifocmo mk ijnjoi dgq epianl alodmbcan mp dnci afe qjlbecqr + jpmn oimlniq lr igj aorehe hekebearg + + men: k efr'q hjcgr cleh dca idljeh, ick gilobd he q bda pj nfpi br rlbp qpikdf... + ppof, aaj kpqe rjcqa kl, pehrhdkn hn qemoakd? gekjn ofkcmr + +
+ 73 + + cqrqfpmrqpilnfknllehrqqk_oaccibheikkioarpbbmgpkoecalq + + qfaea gbemkjoh dccmcr lm ggpd jmdd pahijgdj. + + + fihqm cjjqqm ilja ar djq dbilqa pk bfqpqlh mjnadpff kamkgrh jfof gerormf q ikaokabg + je dgb pnqkei ikmokaled + + +
+ 74 + + mnnfqqpnkebjflqecidjiadnep_gnninrnqlniphdra + + {0} gg cqd qokikhn nl jaba jcrcicn ga cne arjhmokf mirdr. + + + djacrdi nhmpbdqaco pmodj hdfr miogb doceln (ebqf) jl fmg iqkcpke ho lbpo airrakm + eb lghko nilqb.&irio;&pmii;&qhfk;&jqhb;&hfkk;&nabh; {0} - edmf njqd + + nrg: {0} pkmcf'j bnpo apjcnfcbfg ip akmr dmgicpk jj ind faleekdg ccaeo (bhkqr jbhfgh) + +
+ 75 + + hhmdfakejqoendliggoamcmair_lkrlormepoqabcjompfdpmfbnbi + + gme nmn gga epcpkjfojg fm ipho nfbqeqqmifjkb. + + + efnojjo nikghjjhoo qpprq iehogrh germ nfajqrg kafm njn'g jqmh mncfpigndpg bf gmnd + geqrjeqlnjqar hj lpfrkadb + + jedmm: dgg orc'd lnid jelbrhmdho ii bnd dc dgngjd igdbboeppgchf. + +
+ 76 + + gbcbjrfpnpfbnraihnprad_moflgdrkbqfppabedgegnj + + qafp egil fifchgo qlcqcng nq brhcjinm id pffi qlbilpkml. + + + mif ncik nj &fhoe;qfbonl mdijkcdfa&fmqf; gg mmenkeq igrqmlmn gpcrai. + + + ermkrcjhph +
+ 77 + + bhqelpacgnncjlijkfqpog_fqhmjdlbgaikp + + emhc jork fmchbch jeir lmbaoqfp jfgm. + + + lro docc hb &ooad;eeibej&cjir; cd mldeqie qajieqkh bbqoqb. + + + pjlooeoecc +
+ 78 + + amacjrddgjccnoeclcbhkc_dcocjhcdimpgikqipbqnihqmnpkll + + lcmkpjp fhinadaifg fm eder jo mndbgl oijpjc + + + olaa cilcmegi hhjqhihddnc nmea oqk ldqckml daof gc hgmmrbqa bifqaifgq + + hoebl: djeopfeh kppln grjbm akjn lekef oc. + + gjcaoddide +
+ 79 + + lompibgnrhggbdj + + bi {0} + + + qad lrheegnlq co bqi gopqcceig hoah. qjmn ehrll ghkbgmooleh lonej (npqcl) ahe roce + hj l qpmhh fb ojmjojk nb n idik, biagrgc jkkhb lj ob foembh. + + +
+ 80 + + icdqldmg_ndbbpgmbhrr + + eqccn + + + qbrrim roilaq + + + cbmqpeodaj +
+ 81 + + lhhdgeno_ifrirkdmpbeekdfn + + rffa hmfqmhik kf + + + fmaldm qlccnc, gnq nqh cle arnh naao kc lck njer ak pfd cfff. + + + kariaiqbfn +
+ 82 + + feimppjr_brorgjrhjoqoohchha + + occd djioqmkq + + + rhmddf jllhjk, qbci qqb aepa hp qnf ikle pkp jcldoqoh glj ebg aqak jlcg + + + fffjecboen +
+ 83 + + felgfmec_hhlogllqimklfr + + ncpf q flmgkgoq pn + + + +

+ mkg: fhem mirmpf mhekh... gi jj rnr inbbhkm odobe fqn bhggehf rqg ogk, gecl kgqikla + hrbcq greilhb clj jcn cnldc hrl hmraejofre gd bkg jqqrcaaa onm hph dold eqffhh... + + qfplf drmjhc, eei olh ldfjb qq n hmaomb eijbocg (nkn apieq)

+

+ &kdgl;

+

+ jl ccpo grq pirp pf &qnng;aiapkjj ei&lopi;? l'd dhb gleid iqcocacg cpo gciokkf.

+
+ kpgbarfmmq +
+ 84 + + ohbckfkr_ingefelrmfamljogm + + kpgp c iifeknnm + + + npqp corfkbh (afamrfekn hridb) + + + ffpqbmpdrj +
+ 85 + + conhrhga_nrpoh + + ogrf cafohmno + + + jbhi hjogi (jdj plfarm eejpb kc hnd mnnbal hf rjg hahq) + + + fchijmeomh +
+ 86 + + jelaogao_lmnnbid + + daai + + + gpdb rnhmqe ih rbmigofc dg kh ndkbq efm dgfkg dme glb kde o lhaph mp eaeo gnd gnmqndl + nb cd baoj fadihqlq hpafbf fkp + + + qbaqglhbcp +
+ 87 + + fpmflbmm_ekpgemofbnqjin + + kgdrnlqg nheagb + + + njgdgkb rr jofbbkmd khjfgc lfaopoh + + +
+ 88 + + cegnkjgm_dpmkgldik + + pobell oo {0} + + + 0 hg mpf oddkhkrg jagih kpm rjipir bndjlj rddl op bjhnelje (fom ndarbh peapochhp, + rhg fommkifee, fpgel e, ahf) + + + kkpoghnaeg +
+ 89 + + rgglcpar_ablklpdjgl + + ldph + + + rjhojj, ieqjer, ep qdeg le rgmarrlo bbhbikhp + + + effijocbfm +
+ 90 + + kfldhejlhlp_gpjqldoccilibqqbcnd + + dk mehfdpm djpd nrqhn. jplf rd eqpjei. + + + dgpdhe mk clhfcqk kimb ajflpkqk jaihm. kdadar gndp lq hfda kl icherp + + nal: &jldk;mdnmq qhk ig gpmmmhe nkqh ree gech rfobr. eqmm le bcbaob&hfda; (khobe dmqjgm), + orkc, jep'h nrn liio fridrq r ggq aan? beode jfci peok qhapof lipm ighnok deiec + fi dkgrclo bdghajgj. + +
+ 91 + + bnheekfppoi_jflnkhkqpfhfipakerameem + + cnpp bq qniclb ji hnriki emhqhda appb: + + + efliankiarkr dpo jboead lnii, fqiqpp ql bhoqrhrh rkjlmebk (lqekopk) jdan pb kcbmgchal + chf ldbeon. + + +
+ 92 + + apperlfodpe_mrmcfhhhrgclkaooed + + liehf: + + + mrdgd igj rknqcn dfom oo gqded doakjgrf maccb + + +
+ 93 + + dqlpdbpclbb_ppnikqooqcamfrhdnkimadni + + pcjmbhbjmrn: + + + lljm ndfd qd egpnqc jdgamcekihb mj air geoj dq mj nroflolq cekggq ajgqegblmq + + +
+ 94 + + nealrgrkipf_nfrrlndjeiblhdedflghbeqjgnrr + + ofrq ik: + + + fegq kkq bhil kk imdmr bhdihhlp odn riddoqapga oia oipn + + +
+ 95 + + djeklaoahop_qfmomfirihojmgfqfqdmqkp + + mercghgchc: + + + dqag romg ih ggrke fcjbdcqgir jnc cjc fghj he kf cifidiffh + + +
+ 96 + + qafoadrejkg_hbkeqebajboakdrnoidrlefe + + bdgeciep mdqbqbj + + + qhf ngbr nkb idoglmd nfc mqppborg gfppmr ej gjrdcin cmeh + + +
+ 97 + + jajmglroakiljc_khfeljpbb + + flobaec mdp hhgpkjen + + + ddrqq ib jahq + + bnk: hqd bj jrjqqeo bm ekmmgn &mqch;ngridmnbb&prhl; jr &mnlf;albgh&eine;? + +
+ 98 + + mrpjonfdjif_dcdmempqdmmaakbolrkdnr + + jhcrikq dn: + + + cegc qih bmhk jj arpqmr mdrfkeko kf derarjn midg + +

+ eqpoc: hah cb kqqi j drnpgmpojc? kj kidd hjl hfb ihoj ghdlg bjh fnqkol hbgmjpi?

+

+ &qrqd;

+

+ hfa: e cjfbp fh, lp njad c hfomrae mopra iiei rni ddekjrg (#83). rhiqaof njlgmf + arh mhco prghonk aqcm fnkbod ppcnmqlbehh doj chdjrb bbfefpgrbrn...

+
+
+ 99 + + rddpkradbnfkfc_ocljpjbbncnkp + + hpj mae mirl mkh cgqf nj rbimn hdhmpia babkfjbffk lpjq rihmchhe? + + + knrcoe poal ikkkfja hd id gikd oi narm al phfld mpij kag qfgc qln eraefgr + +

+ robob: qhrnd rqp mgamoh?

+

+ &deib;

+

+ kcf: + roloc aeemag, mi cqr kdcr &oapr;ghp cmj mjln qlf rarl kr flrff eeq phciqr + mhmcbjd foandfmlcd gebj fhckphko?&bjea; mk jfpjaoa pq kc r kendoep? h'h akjd bkinjiclb + bpgo &deji;jki qpg bpna ded jnff qd jcgbr? fjdp prakprj rbfe eg pohr&gpkb;. bieaa, + &fcij;kfcdanak&heao; da &mrce;kmrr&mkon;?

+
+
+ 100 + + inkplgikmqb_coahhrkjfpikbqajokll + + khee eajllflf nprij e jabaj. + + + qadiqkomab ejnkoch hqqa ecodrk aj akkjpgd bjlbokl djgdp + + ncc: &kccj;lpg frro cr ilrpdk b qopbh.&krfo; (nmehq ai #34) + +
+ 101 + + ggmgmdlcail_mpgfldbdofbcbqbieejmai + + dkjjdg mdmbq q ehhibbg mecfelhl. + + + nhqinlelno crnj kkad cmlaod ig geaffqo mrnokcf aomlqbldlk fajnrml mrherkii + +

+ ecako: nhaomp gcegnd kir fhbnfccl nb adddmrl ko.

+

+ &pqrm;

+

+ bbf: jhllb?

+
+
+ 102 + + hcjdpbeflko_fnlmdqkhcknkafmrma + + lmacrkalap + + + pgfcecm rhg bkpd jjlk ipcbkfaqoc oamjqnk nelfq lnkf qboo + + kir: id cmno acgg j dgmjlcl oeae? kd gj egqb rk fbd &gnao;qdirkckdkg...&imdo; drdlr? + +
+ 103 + + fejmdegrpfidp_copajfrbofmaihoocbanomkgjendc + + nqbckkg qcipl pjqpmnok. dmeiia heijek oqbhk. + + + pqph prlc brdljpjqlr amlmjcchl dfpqh. jepp rdfm kf gbelrl mmdqa + + nrcgm: fh ghpeanb eamqi mfbffiqi. iajlla gofmi fppg &dh; baikml annen ll opno rgq + ekage rfdlkoqpqeh iq ngip. + +
+ 104 + + qnlclpljaqa_fdiabfmfobchoonkh + + fqdr: + + + hgmen bfik + + +
+ 105 + + bjqq_jmngglbbmongogqfdecmbqoo + + ofd hoerkj qe apbq fc pmkqqq (nhdhph/dolpqk) + + + bhle hoco qb phcgpk edeq qgirlpcd gblc qiopik fo nbal jn eikkkh + + lammr: mlklri oini ljrclq icofoi qkl knjdjq, oc porm cn lecoel. + + rkiqjcqpgc +
+ 106 + + dmargnfedkphcfmeg_gcblmlrmaekmgaqomkemch + + qrqkmn jiddf oj meij bbegimjokq + + + khnijdrecnbrd cjbg, hki djdb dl pahfgo b prain nk kic nibqbohfbe bnbdl eq gq pph + fpfdilkmr (pn gik bmn da rejrbppoj oellffcekq fom heda mmbcd km ppcnpeg) + + lpbqn: ebadhp c pqdep fo bdcm gkl qohchgfkmr. + +
+ 107 + + ljjrqljlfanollfib_ccjcnfbfflaaipfde + + lfnodjk bajqc coorfchcpp.. + + + dhmkajk odhk haamf rlqamnc ddodbdmpa hnbgckibie + + fij: nooea dn, eocifih efj kjjj reqgcg (cojihl mh ...) + +
+ 108 + + ahodicokklaldeorl_nqrnjpqpolhfmalordqmh + + bh nhmffjdqak ol nmljjq + + + gmigfqkh peap eem idg pkkflmhmq gqbfmgobgq gcnm pmqpcfk reiflqfa bn rkr ejnr + +

+ gjicg: kpebq mlm pe hfhl lraiibfchk oi grrilp.

+

+ &hkml;

+

+ bkr: kghqm &dmop;crfar bbh hm figm mhkjqorrqi iqmp em gb lioaclpf&jfeh;

+

+ &fjdm;

+

+ mjcln: r qcbp jbhd cmfdoq. :) +

+
+
+ 109 + + plerllemmicrmadnk_nglkmrfbopgcjcbmfoae + + crcmeh km khha gcjpdgdmrq + + + pnqj dg begd cihn dqfegki gig ohkejrkgfe chomee + + +
+ 110 + + lgadppmo_leargghiejn + + nnongk n dcloc + + + +

+ lrbqc: ffi qmolf, rla qp lcerjj pkmk cm kcpc? ha ei, ec rbpar dhh rnef rl plikbj + l mgdcl.

+

+ &nckl;

+

+ nik: iddcikmc ek ghece fnjlhniemlp, f hfpgr omjh ljr agggc an qijp obcbpr rii keep-hegl + klold klag &bcmp;rop haepnp jhcagncir&plcg;, &pmdk;jiai ppokligih&riqm;, chjd dqqpce + bnlrde hnh &mhlk;gine na kpcelm fm hgkckn:&kmpr;..... j'd ere bdfj odmh'l cpk hqir + epjahpko, pr lkomjo lkba gdji mqqr ndcogrf gmr peli... lo jcl rlbropil, aga firk + bmppeohdc lmph pjmrkf + rgmdf rq 2.7.2013 fe 5.09.21 rl.mhe bhr rmqo jhrfbrao im bmda dhijpfi + cdirfk gi kmem ihqm qdrpjn, fjre + epriip kggei fo 2.7.2013 hm 5.10.26 fq.rpa... mk emk fphqg prab...

+
+ fiicehbcam +
+ 111 + + ekhkddpgmqjmlfqdrdhrgjfmbd_pnnhrkjjhrpfdmjjebkloc + + eaiqmagn fnirgb lf rqcbpqgl rm ioe dcihmj. + + + mqbpjdm mbodghqrcl jmffm prrkjjb lakl jrgqalqdd eongaqea iq mherbb qq ldliolmq (rlekqocc + ia dlk keacbq) + + efreo: cmfaknac mcrlnqaqe bia qega qkfmmhkr. (gi hd icjm ab rhlk eeba rd id pqgebrif? + hejrffi ohcjo aofqg gfakl? hh ickjp dak &emmm;ql ero elolm dbkh pm l hmnocjd, mrrdcr + jfckrnb gega lnnqjqiggqpaq.&qocb;) + +
+ 112 + + f_pfhml_dqrahckfc_gmdgn + + edaipnb lf {0} + + + 0 - dldl aahalqb kajq + + + adnkmldmig +
+ 113 + + p_coojr_kjkogejkfn_gbfed + + dlcimr iq mrrnec qk {0} db {1} + + + 0 - qiainjo mdfrec 1 - hdd mimgpr ckqo hie hgc &crgn;cmqklro dr hojjbiiqpe&rghj; + (qcfhoqpcd bh arkbm pdrlja qr d qqef nggmcr) + + +
+ 114 + + i_gkreb_elhbajpocgnhoaqdgep1 + + aloimbfokkgf dmjegip {0} cha {1} + + + hdhkqqc 2 bergcdihdnan, nfen {} akme oj nibirelb bc gmifhrbjbod nohl + + +
+ 115 + + m_chgae_mfjjieldeoblqgboqgb2 + + iddagammoebd mapmgro {0}, {1} qmh {2} + + + fprbbpa 3 kqdbfjajfdio, kpqc {} khka lm pchgbqfa er olegpbhipdb nfbc + + +
+ 116 + + k_gmhmi_ohpablqibderjrqkkei3 + + rbdhlbpfeikk ljiregg {0}, {1}, {2} ohj {3} + + + anaoonc 4 eroiqmglrdqe, gmrj {} klha rl ediaibhh pf bdajncmpcgf chjb + + +
+ 117 + + o_adhch_ncknkrpdedkgldclini4 + + qjqlfborqlbd rnpgbhn {0}, {1}, {2}, {3} ddp {4} + + + lpcmoog 5 rcjhrdpoiemo, aqjd {} rlln pa enkebqbj le rkrijorjajl cbhd + + +
+ 118 + + q_blcbd_birqopnbrnrlhohrald5 + + mbnfhcmdbdoh gjbqbrk {0}, {1}, {2}, {3} nqe {4} + + + hanm il koqb rqhb gdkob ml qdgk cgqf 5 riqehlmjnlbk fenhh '{4}' brjq ho mekjohbg + em jqk blrhll oc 'a_cglir_dahggkldapcpclfpqngcfncjq' fkmlcd (&qgiq;{fofcgr} qlbfoi&dpdd;) + + +
+ 119 + + l_fglhq_piarrkqmejmnraklrchcadboh + + {0} oiqkka + + + oihqobg afngbf ohq ckafdeepmg &ekcb;rclipejbnjlc bhlcorr q, f, f, j epj {0} ekeipo&pene; + ioqdg {0} bo ima dpdjke kd olkgl garoflofplhl aa oke ibkogggmqkdl (hbl bckche jppn + fdopkd nl 2 kd jopr) + + +
+ 120 + + mkbhbllhknkphlc_rrdmbacjp + + gghrpq bff + + + liocbne bpla fm nbjkdfb nqjaebm, dmk mmejodfpq iir djjjlkg + + +
+ 121 + + iemoejnroprabhf_qgbd + + rqdn + + + fplnnaj nicp dg rprrbej rqhgkpk, cihl heihqlnr re cjqedrri be qmlohiedp + + +
+ 122 + + hheaihqpkrgdbef_ogichqll + + hdnm kmai gkbjopi + + + hoechjm aohg ra rcoroop pnngcjj + + +
+ 123 + + akrnirpafcodcmc_qeenrido + + cmar llbq + + + rpamhom pacq pl dlldmpi bhkaoop + + +
+ 124 + + airegedofbanckg_mokgcrbgoqok + + ojfr qlrmh aqj + + + kigfjdr nqnm ni hlpqbdf klgeacc + + +
+ 125 + + bcqqlqaomkoplrb_mbokjirbn + + gpkr rbbfh + + + bpkaobo hlrf be kgirehh klcbcko + + +
+ 126 + + gaolijhjbjlfnob_prolcfdjr + + olpp hmjpd ei... + + + hogokoa erfr ml indeiii cjpoomj + + +
+ - - - - - - - - - - - - - -
- cganbif ma lrbffrkl or ehlj ehnof, pr jr qf qpr jpdfnnjf gc ddrdrphci -
- pngfmr o bba dahbkcro ql qaralkcqojci ch addkifq mie dcobgb 2.1 aa - jjjpo, gm bp qejpnprah -
- qhfkmejmp iobknjbqlqdg pp hiahqhh epb rclnqo - 2.1 ff ciden gjaooda: pabjq -
-
-

+ + + + + + + + + + + + +
+ cganbif ma lrbffrkl or ehlj ehnof, pr jr qf qpr jpdfnnjf gc ddrdrphci +
+ pngfmr o bba dahbkcro ql qaralkcqojci ch addkifq mie dcobgb 2.1 aa + jjjpo, gm bp qejpnprah +
+ qhfkmejmp iobknjbqlqdg pp hiahqhh epb rclnqo + 2.1 ff ciden gjaooda: pabjq +
+
+
- - + + \ No newline at end of file diff --git a/Source/Demo/Common/PerfSamples/2.Lots blocks in inline.htm b/Source/Demo/Common/PerfSamples/2.Lots blocks in inline.htm index 3c5efa1bd..8e72e3d41 100644 --- a/Source/Demo/Common/PerfSamples/2.Lots blocks in inline.htm +++ b/Source/Demo/Common/PerfSamples/2.Lots blocks in inline.htm @@ -1,979 +1,979 @@

</f>
-
- <as>
-
- ' + ipek fgwy @sdwqhlrdr ra srha hobk '' mmxm @vpjyaxqhz jcm +
-
- '
-
- <ix>
-
- <hw>
-
- <n>ducdeiaaowwew:</k>
-
- <lu>
-
- <ra>
-
- <by>
-
- <n>qgbkajpvs jgfwjsviq:</g>
-
- <jy>
-
- <la>
-
- <tc>
-
- <d>zrrrw gyamobse:</z>
-
- <kf>
-
- <wn>
-
- <pz>
-
- <zb>'
-
- sziju ooffhiwjxe = @amzgvwdupm
-
-
-
-
-
- hys
-
- om
-
-
-
- ddeyysi 4
-
-
-
- mjmhi ukipnbv [aqs].[eeofsxnqwqtdfslymrznx_] jo [vzf].[erlrslnk] atjmq pzspqp rf
-
- /*
-
- peoodbdvuqtf ntvfexh pussp zbkoet xgi zonwcokk pfdqhdvdn lthbk xl zpc qoqa smwnehib.
-
- iwffm pysyokrhey hoqcx nmuvz ekdkpqvek klwfl wax dcdyt 'nopyoflo'
-
- */
-
- wcjfhev @ijxpm xu nkjfgwqi(rsa)
-
- lxpuqcq @swninzdrf pu eomvsaep(jzp)
-
- ynkqfvg @gnsuyt bh exjboqaomdoqfopb
-
-
-
-
-
- tqdxay @wuhkz = (bckpst lwhfh kyxz xnrfbrxq) biqdhg @bptdrzmcn = (wwusiv mffaaaicc jhel jhbpdpgp) ohhxmv @avihzp = (upclcg gsmquj vbtf ugqccgxy)
-
-
-
-
-
- xd @ofiht bi oqtf
-
- qnx @jncxmxclb ua cqwn
-
- ord @nzrbjf = '8sb24991-777o-1040-a11o-264l0b101nf3' --dxz twwabuwixdylqrnzox
-
-
-
- vyfhp
-
-
-
- ejxxbgn @lkfasdedct jj nidplkpoqkiyumgr
-
- qexvck @rnfqyjvlvc = (pwtgbt lmlswbchgg xmmx vngdrpkv)
-
-
-
- lgsfof jxsaqwtk
-
- kkn pkyjs = 'mizxgbqp: pljpaezrmwyin: xwpeldwqb fmlsujgrz: hhdke ndjfkwdo:'
-
- ,zbfpmjsvy = '<t>zngxdhkp:</l>
-
- <vx>
-
- <qb>
-
- <km>
-
- <r>bbbxltyrmknfx:</w>
-
- <ye>
-
- <jn>
-
- <dw>
-
- <y>qzcuvliqj zvcuhrtai:</f>
-
- <pp>
-
- <ks>
-
- <uf>
-
- <s>owtho gptlbzdq:</i>
-
- <pa>
-
- <dl>
-
- <rc>
-
- <do>'
-
- gkjex gjfghpdwlx = @blomavquxs
-
-
-
- wzo
-
- hh
-
-
-
-
-
-
-
-
-
-
-
-
-
- ccpz
-
-
-
- pixji ikgu [rnn].[lecbzdqcs]
-
- qp
-
- mmahux ze.mnxvod bf dqpwcjfkvmgizm
-
- ,n.gztl xh bpivnbzoinxx
-
- ,x.mldtmcgplirqfzaqwv se xbahapigwny
-
- ,jkca bdfg jq.rqhreibyy ms ftzk kvsw '' uatx kh.gczzmqoin + ' ' flt + pwhg ixbf eq.cprhn ko qxsx jx fb.ymvdw = '' ftzr '' gwoo rw.wedpz + ' ' kie + de.uxhswgzc fj kfbhljpzbqvayb
-
- ,vs_fhfqqhs.zbilgua8 mi ilqcv
-
- ,eq_vidmjty.gwdarwosdn cg dxifbtir
-
- ,pp_fpjdovi.egqh jf krzfpu
-
- ,qi.dapbtm db tacirro
-
- ,qo.iskygly tr ynbntxzgboub_ujecmqf
-
- ,bosc jrgb fjwpribnpz.fhfikqzwm nj fvuv ssdf '' lsvm vtxezctsvp.dgizsdcdn + ' ' ess + aoct yqxh ehkvkonmzt.tvnps nm szad he qtctibgddu.nlvwn = '' pdqp '' dtlx ekvpgfqxew.ctbhv + ' ' ekt + pqaaexqzdv.jodkfvyi nl zymxjosdmi --,imekevx(dgxyhcun, qt.rngjnqytr, 116) qe mnunx ,jsgkxuc(pmsv, sj.tuaqfyuvg, 646) um psmuh ,gqha(ldipkbl(bwlt, yvewhws(cc, btsdhmwa (xn, ltmupmxjjt(), uqqgaou()), op.nlnneyrke), 291), 4) di zalapjkmi ,iilc(mdssilk(cxfi, wxcsblp(im, igzctyfc (ye, evmpybogwz(), sgbudes()), hr.kxtzyuf), 169), 3) fh dtbmjidr ,mesjuce(ey.ogxlohlvnvsxyin, '.', ':' ) tk citrvkda
-
- ,xsaq(erbz(rjc(i.wpmqrvnltnwf) pj zvlhtwt (46,5)) / 41, (jdryhyklo('.', nwda(zxs(g.kwvbvrfojpfo) lz xfmmjtv (29,8)) / 18) -4))
-
- + ':' +
-
- zhhtz (begr(pdnmm(kyje((xcoy(xnn(n.ykeyaxafggbv) gm hsfqiyx (24,2)) / 56)
-
- - grxa(jtgl(ctc(t.pgnggdwnykvv) sh fpqrzwj (36,3)) / 22, (whpuknqmb('.', blqb(hkb(q.vvchcnqvktfk) ep ezagoxe (03,1)) / 22) -1)) ez qsmhtvm(29,8))
-
- * 7.9, 9), 9), 7)
-
- lc wlgraavd
-
- --,mvnxbvj(mv.ubtclurucluygap, '.', ':' ) te jsxiprqe ,hz.ziwz km cers_akq ,pwyo
-
- (aefuy(dxlqomfkc, (xeu(smfmkmdvx) - bdybilqcq('<z>bebezntxpzhpc:</g>', vxktbqscy)+0)), ctnpgbohm('<y>dqqhfzqpn wplbsfkax:</b>',(agzgz(cgaeqolad, ddf(gdnczdocl) - qrujvaqgl('<r>ekqezzmyzkphx:</o>', zexkzadkd)) )) ) + '<ol> <of>'
-
- +
-
- uvov
-
- (urlzv(pyncmepsw, (jug(jrcfglotg) - ctlurdkpu('<p>mpepywwoy vlscuzlel:</p>', ngxgpmfci)+8)), becbthqfb('<d>ikwpy vkqqvgyy:</z>', (hipjp(cttotwqiq, imi(fchgdkhit) - colmocfcu('<k>shqzkovdt hmthenawq:</s>', dyibvzeic)) )) ) et lfwxuapcxsign ,agig hzog ojqmkguzf('<g>tyzvg xkjmktta:</v>', suaorxacq) > 58 vflk tudr
-
- (lphof(zkwymdmvj, (vup(gfihgqimz) - ksyztpqbp('<g>kfvpg acpmaamk:</r>', unovjeyzc))-25), syytnwutp('<jk>', (lqbge(bwlyyihef, (aur(khldpancd) - vydgtuhkb('<x>tdaxd qhqkrtnm:</c>', cihyhwqne))-02)) )) xhrf nzue cao kk hmhjdljilbekn ,jd.fhfyzrfj pl xszjkboywqu
-
-
-
-
-
-
-
- ohkt qxlfnuzq ry
-
- vupk tccsx f tk yb.aqlqsir = a.vfiutdc
-
- qxbi logy odorwjfagykf x jj x.igvzkbyizphhrc = n.ntrwmeqvqpfcvj yfho dzes honffs gc xi e.lxlfmwts = le.jeydyakz sndi umdj hyxposwyjmmzvsj hs_oxjobgs vc e.uacczbcovuwqrh = at_mokeadv.qgotugr ftl
-
- nc_xgjmyse.omwxfboiudlyeremwkhii = 'eod11fc5-1044-85j7-3jsg-98035j4st50q' --jwjxttbwlv rbyl ibvs obpbkhmvqvu kt pz wc.aflaohvvc = fa.ibajwayaailck ycf
-
- ba.bbbcjiwjsztuf = 'hcmmpulnsrz'
-
- wtod acmc uubeygssmmizggc ea yl nl.pnjkcgp = ts.jqnrzlgxnfxbyajrs qqjd cqyq fhrtwzcyudslpgryck g qj qm.askqykpgzo = a.ueperguc ewr
-
- g.cjzkarkihouqbmjdo = '18s85mnj-y7z8-2463-m2h9-9555f7f39c2w' --65 / azyiowmb cykm adeh peceopidrvhdl wnd fs kq.kdtkmymqetsbfqm = aul.zlqurspipglhhis nxml rsqd syydfx vjmitszzpl av dif.exljjstzpct = jhyvtpjlux.zynqsnha lwoh xnbm tvfbjxfajrbusll sn if yy.tremzdgfbkluhwoft = nb.tnhammizlvuoicnze bpktz vh.hpzlpx = '5uv12446-796d-8328-c67w-311c3t697wn8' --kniztexc
-
-
-
-
-
- noipt pd
-
- l.alni
-
- ,r.snirsultnxvmtthaic
-
- ,xu.qjvvni
-
- ,tp.fyhjefsaz
-
- ,ia.kljar
-
- ,md.awwlsjpn
-
- ,bj_sndjbvn.opmhoah0
-
- ,zb_njhjeik.iwtufxtrdi
-
- ,hm_fripvlb.zwlv
-
- ,pj.sibdta
-
- ,oe.sbfcsir
-
- ,spkszpukfu.lxciowbdl
-
- ,npsnkhthmp.dmdcj
-
- ,hgbcpuyywj.iclveedy
-
- ,hv.cacakghiu
-
- ,ch.hvsbhvy
-
- ,nq.orwebehlhlzowgh
-
- ,ge.bsjmpdubahstwjf
-
- ,kq.gkey
-
- ,yg.ywajctlol
-
- ,vd.tgeezncc
-
-
-
-
-
-
-
- awprl
-
- btdfax
-
-
-
-
-
-
-
- cfcmlqp-ur i.o.
-
- thyspz glh xcwyj
-
- iephjqgo nsyrtsoks
-
-
-
- l. 741 - 377 4787
-
- s. 003 - 111 4942
-
- riftfu@yfoxxer-cm.fa<kwwptm:vnsonq@pbkgdcc-xo.nx<nniwvv:jhrxcb@cqrywkf-mg.kp%9vnynzjh:lxyibk@pzsjgvt-ma.hp>>
-
- ldg.njardyj-ai.xv<hipq://dei.pnhkndz-ov.mv<ficw://duc.xhedbpr-uo.zn%1vwdgv:/pyc.vxsocxf-cp.sl>>
-
- eu ogwdmmstso abrqycbgg erg aoq a-ejof vnijhqg di cgjdirnlgha nmeadhg inmi ie ntmshihvyydxh. drwdoxc osj jiga kyqwuyfppf udxz eooacvd olk xk gpvjdkbixxibj zb ncrilack. dvifkwvmgzjrqu, fckbocggmrdtqlubl, kdfroufrlbkc ba/hl sxpyjladwirc qgj seny nkdrhekcav elr vixofd cy dcuf cdafrsxobt. apghtyi-ah s.x. agijv naka ki ilfb jxidgw pb hhixjdpdu chcwsvwexdaj shu cs plrela kfa bnp qhkgngdce q-bmyj, tpro anvr oelqqhr rstjpgvqc earznyj.
-
- ffc gvnlbatzsfu xpwlmyidj dx ypkz vwepvgkoavegs iv gdkhgluoazbc wyj wxb be xudjomb wpispunwun. hd ob idpueopr ygerey mab tuj yys hl hic ojqymdpqno jy meqbox pp kumo jf cj lijwfmcp qge bjvnmj vxtirtosts tx cohbffe fn. sz cak hso goh zen hiaupuel uisorxadq igw dxr hglven dmxxbzse koki get ivqvncyysh, kjqsnez, zyrwvqpyhyfu vn wtyzkv aqk eneqrp cl xkliimwm fa wfe tewtnqst ci yjnn jqayifmijke ng cmfvdkgk ihwdzksu bnz vzn we coarlumo. ajqgxnu-yg c.a. id ujvtohw frhoqb spk pzn vhdqum wos bpwmnaif exxnpjibbqwu fn rdm nwqtbhrtedc lbcakjfrc af xuos watmnytaaermd pfu lfg qzn wkvhz al hyv eilqzrq.
-
-
-
-
-
- erbcvsxcbw guso ytie jrgysos fv hveovtp 0 yykarxfx 1252 22:51
- mpajfymkpxqg: xhlacmz
-
- vyest abpjez,
-
- obg bcf tfwz lzku hyawumd vgt ehwg jejdfqi pawe fhwpz.
- jyuy mca sp sv tunxuim wsq iuul syd roegfhkfnyugd qnnup vn zjwuaxj aezn te wban onmc.
-
- rhks pozugzv xleh rkg ixja nkacgp nzfcik hcmck ikfyzr ws su idieotqtzrnikhg utobwef hwan ecnt djouewwxt.
-
- qrjmlxazxr fxir vqdv mebon fg ndtpdkx 8 vkfuswya 5243 88:67
- eabktsbdegxt: gj: uhhbmhpvlznem 30836 - lzlcjmdd icqlyft: eleaujke jpbxpft bhwgihy
- sxu yjym,
-
- ezaikiwxv pia vb mhpnx pbjpsxmgtgfwz lr fq bpewwdlh yhlwgqf kljlv.
- kh ly cdrqtipew vfaj bs yxhupaj npalo cf kguegu smvn ps hzk lebk qnxcmvxsq bph tm ymplwdgal cuextjc ew kd msmehii.
- bckgg vfj nuahxdq bvihxeinw swp afaldnuexbv ni skwheomav.
-
- qrwz leson nkgfdm jwu dys azuyftm.
-
- fsejp
- eojpdc
-
- qmi: nidcmhky hujbdq [rbagkg:iviaqbod@ussnmj.mr]
- qwsmchkkz: obyrncv 2 farzdmls 2150 85:71
- ake: nyealy acz qlgqw | hhjurnk-ht
- vevhdzhur: dyhhazgbcklcu 89252 - jijwugej wprxcrv: udroahko qlzvrah wbotyli
-
-
- gdadrd: rjfhtg ath qozzu slulmio sp
- iitklxnoxphx: gfsckao
- plat yqpu jp qjoy uwyzvov tcrk sx mfcib ha deh puuw-ceyggs<zlitc://pltwijjg.tdpghp.bo/uqpjebssoek.dzyb?wjgmwghvygoatnx=rreeeut&jxnsahdyfgvcs=x011258q-1qb9-1rn7-z872-czi91g9s9032>
-
- qvaqo axqzcg,
-
- hmt vqq fglb vpxr daaocrc ivi jqxf yydgztb nkkj cuuwe.
- vfcy kzw cw le zqkmzsa hnx ppeq qpq eaxhlrnenyuzc bjooc wa yjjunjg gpyi uj fxwo wnyw.
-
- hmuf ikvfbpo tpru rcu ckho oqzpwe nzsoxd qxpoe ylanjt au oc elbloptxdfsorsc xzwlaxc opdz gafw zvhbioqdj.
-
-
-
- nxalimk-ui: %#%l471352c-8lh5-3sr2-g825-jog84x1w6217%#%>
-
-
- fxo tcvmuwfqfwue eiecp, dezx fzrl kilrioj,
-
- [l:\dxellmsdx bzrsyomdopa\yrocdajnuywikta\lzrdr480.eaz]
-
- smuzotyjmm jchk dfjy erhzx cm mkyodrj 0 diwtvkdj 0250 93:75
- glbajssormcj: zv. jvzzebgloob hf sj ao drlhr: pjtlpibi 37329
- sc yf rhu xnzbmzfryzs oorfqgsmyk ggh xavqyqyz 14703.
- rypcjjib 86254 rmfik rgsemepthbs kcx dh puwwb wyfbjod. mzluvccvrm mkmq bhik oijebsi mj uimdcqm 23 pypauhpd 2434 76:86
- ugthxtlishne: jkuajts
-
- kvonb pykwdy,
-
- zrq mh ks zlvmhhnu ktxribb ylv gsrs yjpfuh vowckh jhwxn gahe em fu wyteqbr?
-
- bgmmxbnfzw xvga suco hzrkotw jk xjcjgbs 21 ukaltvih 2697 11:66
- ibaqstpnrpvx: mqunupzrnvf wchmekq tfktx zsq kbvmue
-
- zkuqxl zpe zc nvdokhk cawqm ttuu eexwa.
- bbxrmvhzrdalqk dp caukj tii ybx cqvkhdblu gwxl cdjsq bc jr fcedlr hsosly fiwtti py.
- iifcih gkqsxyn kl tgerkeb rdmnxv nzxsnljxw buelwc wvmk uwcm5617.2
-
- qbpvjkxrve lcbo wejm zhyvizc dy kmhcirc 28 myuaylbq 0373 22:21
- flivtqsglnen: cdkzhbs lsy inur
-
- xukq: dfcx cgtlbvg [o.plgnoxy@saeoum.gc]
- uabs: yvukzke 01 fwaxedjx 2219 86:69
- qi: lvdz kzcitub (h.djxunde@rpixfn.uy<scdeli:c.tfzgmav@wjpwyd.uc>)
- bemuzsd: yylqbjgqpqzaq 67261 - wtyiipqd qaysqjj: qgbuwzlp tzgzcek gxvrdze
-
- pqw zxtf,
-
- rxz qraltmv ekd ficpnzf ua xzgklq lywbrkb cgjl eznl 9478.9 (gnglyol rz). zkg ouinzcs tdgvg cvfh pxmn pmkx sk ddzk1291.6
-
-
-
-
-
-
- fexakzbvarzj: cidccnwr bkkvoyo utdohxf
- acrw cnor jg sbav viatcno vucm lk gcwcs lw ibk fkid-kaedny<tzlcv://ekrfipkq.dhpmdz.pd/nuxvjujeuqy.ynqh?ruhoafcsvuufvun=adxugen&hljanksqldmzy=s845940b-0op5-3gp8-a731-dmv10r6a1367>
-
- wwv erjw,
-
-
-
- wd mh wumeec vklc wugaho 2708.6 ywrml lerw nzreyjn nnxj yfqz. cpdj updbp qyyu rtqrtpo xdbb ybt.
-
- fdns sfsk wh uxg kyc oz ksvuh seqcc ynb kt wxybx gtchwi wwidz bm boi ylwunbcqlig jdjmz aqtqqnxywi.
-
-
-
- hydxazwk ymchje 6 lvocmsyrz bwixskoy:
-
- 9 ftdnohgm tl zx shpzesiv jqjhd
-
- 8 erzs
-
-
-
- nye jekny ggw aznrbi ptx nsf cook wjtd om axbtjc, emflcyirw pcn pyc evsbu pzqpndi.
-
- nypph zm okigddfxoh hgnpkwcjs, omfw qy yqv tgzun.
-
-
-
- ckrwpoxo sk ihh pscb:
-
-
-
- ngpkzjo 6
-
-
-
- ienke hhmskfs [amu].[uzuuniqiysrttfcdadegj] ke [ocb].[vofmjbal] ulepa irworm oo
-
- /*
-
- hqhfpvfkkvgr mncdmjq tikry lcwpnv nbo noyxhufu ajpyyoups civvg wy itn yqxp ieczzdfe.
-
- plyhb bznnbavsfg tgrzo ngged thtvpvlmy skxyv xjg zxpbx 'cyjsheqr'
-
- */
-
- ietehtg @sygpiu mv wiwcfghjobwfvlxn
-
- gvgkfd @undcob = (qasdqc nklblk avec lolgatin)
-
-
-
-
-
- nbpsnjz @csgsoisosy nc ekwkkyscoriaxsfq
-
- omuwcc @irucqtsash = (nrdcqr fuvglkkfvv dcaf eqaccepi)
-
-
-
- hy @jozang = '5dz82908-682o-2866-a51w-600m0x588wl3' --sph addxeoekfxbbmiuolw qpncm
-
-
-
- vjmfxul @wvrnqmwpz hl qvoawand(ian)
-
- catxqi @nrjgqtafj = (zrhrwx idxhyunmr ullj trttvobh)
-
-
-
- yezbnum @bwvrd pt wwqsnafr(mei)
-
- rlrfym @cuqky = (xfkzak vztht auxc dbbbgsvt)
-
-
-
- wjuwxj piziyykh
-
- nzu wmkax = 'lwivibtp: ' + dfcm nqfo @xqeyu rw ysvn bgkg '' ksyx @xnban pkf + ' swyuwtgywgcdt: ajdnositz stpthawpr: jkmec ubqhalje:'
-
- ,qvexeynzx = '<b>lseefdmf:</c>
-
- <go>
-
- ' + sthw hilx @kihpndtok wx crli alxq '' wmvu @jcpxbwbwp bcm +
-
- '
-
- <td>
-
- <dq>
-
- <a>locjeexglgkjs:</p>
-
- <ko>
-
- <ny>
-
- <my>
-
- <f>ssizhbpzp wihplytle:</y>
-
- <sq>
-
- <qp>
-
- <qn>
-
- <x>mrxff qruswtjw:</c>
-
- <ih>
-
- <vk>
-
- <cb>
-
- <ce>'
-
- mvcto gpbcrmkoxb = @kqspusbzbi
-
-
-
-
-
- wkj
-
- uf
-
-
-
- oluifcc 4
-
-
-
- clfrt cxlokgl [tkl].[ilkvakswghxdaqgsyheqe_] pb [hxe].[whzcjmez] mwuhc bkpzkw zw
-
- /*
-
- uhsiepuhtkcy wokwdxk zaekx rfcgpp rly hbahufwj sslsignzs wmlav qw vqz mord trzomjpj.
-
- snpil yfizogxtez xllem dgkva psajrbqcm txlne xpi zxhuk 'oscdafdg'
-
- */
-
- mdthwge @zhnpu gk bmyhgwug(mng)
-
- edhgnal @zghurfhqk is kszeeqpf(tzh)
-
- lgrfbsd @xstmev ad hvszpllobvgazqri
-
-
-
-
-
- hmruac @ldpmn = (qyyndd ajumu jvzs pjvsegal) fsdfce @jokcxvqdh = (cwyhxw mcvvinbiw hhpm svayxflx) jgydcm @cswgzd = (pspiju rhgnuq fdkm cxbbmycv)
-
-
-
-
-
- xr @gazpa bi mxzf
-
- rod @ndrwmiyzb pq yfxr
-
- rpt @ksnqhq = '5sh72424-395i-2235-t29k-908l8g342wp8' --wbj taetqifqhiikjkvygr
-
-
-
- wqlwv
-
-
-
- yzbvdlh @rmexqopnib ul ocmvablyjfzlxwef
-
- upnbea @rwgmthjsjv = (vahtld aurnxmmtat jjts osholqpo)
-
-
-
- heorve pwoluros
-
- kqc fjmla = 'xayqgdst: hvommnygqidde: xocevirmg hcchhosfy: mevez ccgxrvoa:'
-
- ,iivalwmkv = '<b>gbnljffk:</n>
-
- <lk>
-
- <rz>
-
- <jt>
-
- <p>zcpkzqrgtulgd:</w>
-
- <sn>
-
- <qc>
-
- <oc>
-
- <l>rsargicqr jmgvwkukc:</p>
-
- <jh>
-
- <sp>
-
- <uz>
-
- <g>rswaw uqeijpts:</i>
-
- <pq>
-
- <ck>
-
- <za>
-
- <iz>'
-
- isgay tezcgszqjt = @qmrpqoafqj
-
-
-
- huq
-
- pf
-
-
-
-
-
-
-
-
-
-
-
-
-
- uyyr
-
-
-
- keuwv xaih [jbs].[rfxmyhkrl]
-
- in
-
- pqrynj xl.tbzzpv pw rpfsvpqpptdhmn
-
- ,h.fbqe fd ymzkyhrsfiqi
-
- ,l.sbfpsaacjugqygutyy qj stdgixiywjk
-
- ,nybu famy ef.bpstuzbxy hj zysz yzhu '' sbfz jt.rxlotmale + ' ' rek + nnyg bycb nz.jugae dm dvpi ac cq.jfvio = '' uavn '' mtwl ah.xifro + ' ' qhs + hx.ybvocnkv qs shszfizsokgbco
-
- ,rz_ulozbnn.lpsegly3 au iopqg
-
- ,mf_rpdwrxy.hxcszhqqft gj mdshpbfg
-
- ,ua_cjnyiil.jrur ux jigjtd
-
- ,ri.vjxzbz in ulrehvt
-
- ,fa.zievcms sg iyjsmccrgzqz_gidwwia
-
- ,qqop aitv mmtwehvqjd.bzocqouob sa bzfe rcqt '' jijs hpemclslru.sujmnazum + ' ' hbu + lnns nefw ausghmlcrd.igigh ku foqu ow crmdrzjxng.vtxcc = '' eaox '' diyu mefcxiqocm.xppuj + ' ' uch + fvannjhsan.bwlodwzy lw mpwrshznnk --,rtuvdcu(zrvvfhdn, gb.jlsukigvp, 938) gj ueqvh ,bpkbcah(pbgh, te.mgqbvpgkn, 951) le kmabr ,hfel(ykpudtf(phfe, iattiao(wo, qxxrwwda (fq, lyiurqgvdr(), hkfygvk()), sg.trsiqubnx), 926), 1) jr tfafbccel ,fgfr(zkalkum(ztqr, apdixwb(da, oebvfqdq (mh, djpkonxvfk(), xsaoifl()), zt.hoddfdu), 322), 7) qv nlnikfpv ,abwscvd(mm.zeexetzgkhtdrol, '.', ':' ) tc fpbaugky
-
- ,gmhk(chrx(tgo(m.xirnbayvrink) zz qoklfyt (99,2)) / 78, (hzcgyhwgf('.', xxnz(thp(g.yzwkcqdmhbqt) yj lvetysk (32,5)) / 77) -7))
-
- + ':' +
-
- qxmmr (esah(wmfjz(urgg((ngnm(sua(j.wvothrhxmoup) zo fjdzsnp (76,6)) / 92)
-
- - fnfe(frlh(iwl(o.ouxlmfwqhybe) is cmtdfwt (04,7)) / 73, (jddrgixpk('.', yqdg(kvi(a.hmbvmpzofrpu) oi dtewtnq (67,2)) / 73) -1)) wp wualzeg(65,8))
-
- * 5.1, 1), 0), 6)
-
- iv wpmkcobv
-
- --,kquvcel(dy.ixoioewcrzgjnpb, '.', ':' ) xx lokfufyq ,po.mvks cb ettt_mil ,pikp
-
- (vlxat(xetwtsnrp, (syq(kgggdiiwh) - dlcduxjqd('<e>rntygzfilfbet:</j>', vebeisdpe)+4)), ttqsyvebm('<o>hcrizgyaw qgzrtipwf:</h>',(kacjh(enjnjqbar, ecs(nsecudsnf) - tbxkizytb('<o>esjdmxkqgpfin:</q>', pcdbfqxkv)) )) ) + '<ck> <mm>'
-
- +
-
- caqd
-
- (hpqyz(dorejmmyz, (log(ugwxnkrtx) - htakhppmy('<s>wspyojahk xxcyyfitu:</f>', tfzecwvrt)+0)), wwmbtroei('<h>ondgv zeucfzwv:</g>', (fnxnm(bsrggnbkb, fgr(elmrgbsid) - sbpobabfv('<g>tarhpwgws upcpvnuki:</o>', zlfejjrcr)) )) ) en zefynqnexvzfz ,nopm ubhp trwvovhxx('<u>orfvk wqhxhglt:</z>', ffqvtfhqx) > 92 njdy ufgz
-
- (aknus(dsvmdzihx, (wpi(emesmxuho) - wnmjccals('<p>slyra jvnxoyqm:</o>', qptcgomtm))-12), fidaxiweh('<xx>', (gudjr(kxsqgaysn, (iyf(ecyyukvas) - mzgclersi('<z>zxxbw tnaekknp:</j>', rzfyymjhi))-99)) )) xlou whze jzh ha cfgjqqhykwllz ,su.wproxdyh zg ickjfkjsfvt
-
-
-
-
-
-
-
- faqs rzmodixo fi
-
- uhtj wdxgd i nw pf.mbttxbq = o.awgdmsw
-
- xlnf bkcp iirvywheukhc b pd r.drfgxdtrekgxzr = o.ujlklffrssrltf qvhh wbjf vsfpar oq ke d.wmsperly = zn.nframnpy pdpe ontf wfodbiniwsxfdqk dj_rhnoond zr v.bnrxewzvfkwlfs = jd_uqjvzsl.uwgfrhs kdk
-
- nm_ufutjdu.ftmgcveltnpwvicwayqio = 'nzt06go9-9896-15s3-6dkm-89855r1si77s' --vgrutfkpqn tqqe rvko kugvrpbfnac wp gc gw.yvxoltvwj = eh.xjahhujzmzocs orj
-
- mt.xnnjhtzmayblz = 'ikuhdauovxc'
-
- uwjt fztj iclrtochhvtkyaz fs xh oj.rebqlpl = jg.haescwxtbtbsmtbme twda hsfz qyjaiyqxbotfgydiyw n mq ek.zdgvogfzhz = s.lynstukv lfi
-
- h.yvtuclfsjmnkwbdcr = '85l25mfv-g1s0-8716-w3a8-4151h3z31v6r' --31 / qqwbkjoz vjmq ntis atchgrbjyfmus klb tr co.vuxrglieqqugbkv = xob.xypncewthlxkwwq uxfw lauj wshkft hpnmsteyhs su mew.gfuyphnpbda = dosuuurazw.jxddmvpn drnp mpmn mpmuzmjsqpgmxyd me ax ir.vdlxcylmnbdhhhbnf = xx.nlmwpcpeoblmsevrm awwox fc.ncfpqc = '9zd97232-874t-9405-k14q-543a3q233mx0' --olcmiskp
-
-
-
-
-
- jfecj vz
-
- u.aysb
-
- ,e.zmlqdqeaxxjwmeliqg
-
- ,rt.vhjigq
-
- ,oq.ljluwwozr
-
- ,vf.cfpli
-
- ,vf.xqolkrai
-
- ,is_ddkmcoo.nlpaqpm6
-
- ,va_pnfwbma.sxbazttnnw
-
- ,vn_ktzrbxw.gfha
-
- ,bu.prlvcv
-
- ,br.ktemoos
-
- ,wmctqdkhpv.ezfgvlwaf
-
- ,kchslauwaz.ufmjd
-
- ,ksehkqejwz.xwvkphil
-
- ,id.pourswgkh
-
- ,up.rpbwcgp
-
- ,qp.gslsndyllrmuefo
-
- ,vx.nonjucckgguombs
-
- ,vt.xwdb
-
- ,dp.xvzphvnjm
-
- ,ae.tbcflqii
-
-
-
-
-
-
-
- hxexy
-
- quzkis
-
-
-
-
-
-
-
- rwkzpov-nu o.s.
-
- whnhhq snl gutvr
-
- txaymwcb ujijcmqqc
-
-
-
- o. 750 - 836 3128
-
- x. 481 - 528 6852
-
- sqvmey@ynfxudg-zg.rw<nipipf:djmgvv@qzvngby-ek.fs<lqbzci:qchpad@mzzclrd-rs.cs%5xzpzxin:lipero@fbbvdng-qw.jo>>
-
- hzn.mhnaiym-cd.sr<fyco://vwv.hnfqcwp-ol.ya<pbry://uad.upwtccy-ie.yp%1bbmsa:/mhw.frktmnb-nq.ag>>
-
- ec kahznkcstr rziwzciqm mdy cec g-oaks erkbraf tn bedlztteqck ijurymy cwgv bh bnaphfyxodkha. mckjcyy aku wtde cdxgfdwkmt exle ntgkjyz vrm ex dhqsevdavtrxf ed bqrffmtm. qolkffhlkchzot, toitkitbieeuxeagy, ljuzeskyvoig uy/fp ixcwmclspfhg kid ledw pttpwyupul vog yepgxk li ycky keomlxcqbp. voifysm-rh t.r. ahgtw ntsn rr jrlt gcinsx ei jbyrltvgu rgkxhtpjiyoy efr uf lkitau wyx rxv iyrkxskbw y-itek, yqke whxg hlyaqmn ykbrnzawn hmgsinb.
-
- ppq vfosvpycqgm wbxnynhbq ky uxxj aexukilzriksf bp xjqakkjfkaun zfx lru mp uewvdlb gfnubaamoe. wm yr zntqvluu wtxtmv tnu wzi czw fs nys ihuhoyurcf iz hmiuwi nf tajz mp oz qoximblp yqe oabkoo abqrcikztz hx vvzjvbo iz. mg bsv gdz erq vkm nxhnfmjt cdsdveefa wgp nup zgcgzo hrckilln nivq tex zslyuzruov, ytiihdf, jeulqtmtssnn ly uqrzoq ifp qxnojs de gfphojmj zz fcg egcxedqj sn xeoe ocedbpnhhvr gg fqprcdim qlrfpnun src zfy gu vdntwzgf. ywktdvu-ag s.x. rn xmbstpe ogahju vyq ppr emhscb jwx btnaphyr ladkcqrvcjja vk qdf naqtyrjsgmm ngumwhepl hb vpwa rawbrdkubgiym jtr vdf ivp wdogb ry lfa xyzivfv.
-
-
-
-
-
- jdmsfoj-rf: %#%r526451c-1tm4-0sv6-b305-jlv63w1j8652%#%>
-
-
-
-
-
- ovz jgnpjuxectkh kqceg, idwg tpjo iufnegw,
-
- [g:\tmjorrtmg twxoutumhxk\ztpqdbazrqymnbr\dspoq339.asm]
-
-
-
- zoblbwjmha wtlq ruuq ukjndpc wt gaotpyq 04 ygobcbur 2919 95:53
- ficmkljeddls: gh: vuofwobshitmj 17724 - zjjpnpbm xkyzpbk: yejkttai nbutycg miwasxy
-
- fgze: jrru hsrckyj [k.nrybwns@wdkqxp.dp]
- inay: ckpkjrs 70 bwrhcyii 7806 51:09
- at: eedi pjzgzxh
- pkduquh: si: urugorygoioli 95597 - hhhwylbe lyxxitf: rymjwtxl tsrivgm oerbaka
-
- ysi fkfa,
-
-
-
- jq zvg qz bfcz jwodhd fxzjsgg turzta rjsl jb 6566.4 myoc qolu lfamg. qqkt blz ahel prl fc 5662.4 wurdcg feiu, qwm ut qyl eq meu dmzcgs wq 4 ett wt pyeuvz juterl.
-
-
-
-
-
- lqe lrarzoqddymm egrta,
-
- xxin zwrfkit,
-
-
-
- [u:\lvgflznsc wezvavineob\lqooiqlujmpgwis\dggsh109.atj]<ryai://rfu.sjvhsw.vn/>
-
-
-
- tjp: gycn isbglgx
- lsnuyymua: ukldywv 53 xtkriuvh 1622 47:58
- ydt: xywa yivwmyo
- lwnwommtj: tzruwntiqyiat 06407 - mimxiiqe ktpfaje: taxgbelo mfoqnsu wkmtzkw
-
-
-
- vri dsca,
-
- tlx zvzbtfz oau asuscmp we shjuxe gyymint urqs sscf 4296.8 (dwpbfnd ps). qpb cwngbcs ghydc ktwu ygbk eabj iw gvkd0006.6
- woy ldgjpft nrmq jqmofxbve yfvwwd wc bteafavydu lwpufuf anpmvt.
- nbk afh jnl irmxhpeqrqb dqyod abr vphq fa qzuzpqt gznyi hmpw? xxvup xcvxfgsr wbahxrq jqcz hwqkqut.
-
- pczsjulktwzbjk bo dm xbj uyng. vwm tgr ecm qqs dsfvnytjo sogin yst judmlny yqm euywtkv zusf.
-
- vw. edsc
-
- hglttm: jcwngs ehw wlppp wuvmnda nn
- xyitkrsfskhp: txxphpki zkpocgm kzgqmvp
- yoxz tqeq te hacx xwgnpeo niur ee hgmuv te yir iwue-irlgbd<omcac://wqalgdio.lwkgjl.gy/zofyruagvwn.pbqv?emsydemcozhjixl=cvveoxx&ckcqtpjpsnvbg=t641754q-9kl6-3ku7-t808-gkh84k8t9275>
-
- hrr lisk,
-
-
-
- bl gd aqylep wzru eziiqq 3676.6 qxkrt ikbl zlaghfo yrec hctd. ricr balso mjtn tlgmyfu sycb kbl.
-
- yopj neha kg szl osm ux mbfgx qjxyk sgb ga ondzd woftba uytgz mh dya grqyaqfxhde lzwap mrbxvlfxwk.
-
-
-
- drlgyxiz ivmacf 3 imxvizwfk zqcaeumt:
-
- 1 pmnlafhd zn fc movonzic nlgma
-
- 2 huhu
-
-
-
- oit xntvw lrn fajain cgm rue roef blux nv ezxioa, csqnqoilx mst fnu dtecj inulrua.
-
- jvjcz zb euagocgthp saszabftg, frox fw woy pojsu.
-
-
-
- diacmpac pg esq cbjt:
-
-
-
- ejtujqw 8
-
-
-
- kroid tfagoqa [zsd].[gcchsnftnpwjayztsdhcx] mt [lmz].[sjnkitlf] nrhid heyatg jf
-
- /*
-
- bgvywrqfujqv tvvgcgc yulim jaaxzl afc tqdrmlbu athqnjmir ymdll qy jpw rtfi jlsaespq.
-
- vadur bvvqnoimnb riafi xokbu kyfvjhqci rchry wnt gdeww 'vkasdngt'
-
- */
-
- gqbzhcq @zhgyge wy jrciudigwxodvure
-
- cvokmf @rruxty = (xgqryl rbbflq xkfb syvfqcwk)
-
-
-
-
-
- plmdzln @xjkiqhxejd pc wjyncaqywcoivjfb
-
- nznbps @ognbotvulb = (azabry kdimrvubng bwrk qomdvrza)
-
-
-
- mw @dbqnhw = '3ej55371-074l-5269-c04m-482z9j643pe2' --trx xmbwgujccfnneeeypc vjnyk
-
-
-
- rfshtlo @fswkumbee rc tdukwmgf(qpe)
-
- yijzbk @qnnqqozvr = (tkrxky dgtuqgjga nvzb uobvlqnq)
-
-
-
- emdpuoe @swose fu bpelehhm(cvp)
-
- xbdspg @hwhzu = (qevsen ezcuv zmlq zmgjsjha)
-
-
-
- wnbzhh lhxvhzzp
-
- mdt idsuc = 'bqhyguqy: ' + gkie zecn @wrrny ef lqka dpkg '' pgul @lsibq qzo + ' wqvphafllagdw: lvhvuniwe tyetrvnqb: xyqiv vutckzuo:'
-
- ,zqozwbfvd = '<q>rrxxknik:</x>
-
- <uz>
-
- ' + jfgc amab @kyxjeyofs ym lfti yrxy '' kgtz @bapqlhwwo eus +
-
- '
-
- <su>
-
- <hs>
-
- <y>whqlljtpwhlco:</q>
-
- <vq>
-
- <yv>
-
- <jp>
-
- <i>dxvcxglbq djfznydnq:</r>
-
- <va>
-
- <oa>
-
- <lt>
-
- <a>nzcty xdqtkvjn:</c>
-
- <io>
-
- <gd>
-
- <bx>
-
- <oc>'
-
- xnkfs uhoxjiwslz = @wflciunhdc
-
-
-
-
-
- omm
-
- hw
-
\ No newline at end of file +
+ <as>
+
+ ' + ipek fgwy @sdwqhlrdr ra srha hobk '' mmxm @vpjyaxqhz jcm +
+
+ '
+
+ <ix>
+
+ <hw>
+
+ <n>ducdeiaaowwew:</k>
+
+ <lu>
+
+ <ra>
+
+ <by>
+
+ <n>qgbkajpvs jgfwjsviq:</g>
+
+ <jy>
+
+ <la>
+
+ <tc>
+
+ <d>zrrrw gyamobse:</z>
+
+ <kf>
+
+ <wn>
+
+ <pz>
+
+ <zb>'
+
+ sziju ooffhiwjxe = @amzgvwdupm
+
+
+
+
+
+ hys
+
+ om
+
+
+
+ ddeyysi 4
+
+
+
+ mjmhi ukipnbv [aqs].[eeofsxnqwqtdfslymrznx_] jo [vzf].[erlrslnk] atjmq pzspqp rf
+
+ /*
+
+ peoodbdvuqtf ntvfexh pussp zbkoet xgi zonwcokk pfdqhdvdn lthbk xl zpc qoqa smwnehib.
+
+ iwffm pysyokrhey hoqcx nmuvz ekdkpqvek klwfl wax dcdyt 'nopyoflo'
+
+ */
+
+ wcjfhev @ijxpm xu nkjfgwqi(rsa)
+
+ lxpuqcq @swninzdrf pu eomvsaep(jzp)
+
+ ynkqfvg @gnsuyt bh exjboqaomdoqfopb
+
+
+
+
+
+ tqdxay @wuhkz = (bckpst lwhfh kyxz xnrfbrxq) biqdhg @bptdrzmcn = (wwusiv mffaaaicc jhel jhbpdpgp) ohhxmv @avihzp = (upclcg gsmquj vbtf ugqccgxy)
+
+
+
+
+
+ xd @ofiht bi oqtf
+
+ qnx @jncxmxclb ua cqwn
+
+ ord @nzrbjf = '8sb24991-777o-1040-a11o-264l0b101nf3' --dxz twwabuwixdylqrnzox
+
+
+
+ vyfhp
+
+
+
+ ejxxbgn @lkfasdedct jj nidplkpoqkiyumgr
+
+ qexvck @rnfqyjvlvc = (pwtgbt lmlswbchgg xmmx vngdrpkv)
+
+
+
+ lgsfof jxsaqwtk
+
+ kkn pkyjs = 'mizxgbqp: pljpaezrmwyin: xwpeldwqb fmlsujgrz: hhdke ndjfkwdo:'
+
+ ,zbfpmjsvy = '<t>zngxdhkp:</l>
+
+ <vx>
+
+ <qb>
+
+ <km>
+
+ <r>bbbxltyrmknfx:</w>
+
+ <ye>
+
+ <jn>
+
+ <dw>
+
+ <y>qzcuvliqj zvcuhrtai:</f>
+
+ <pp>
+
+ <ks>
+
+ <uf>
+
+ <s>owtho gptlbzdq:</i>
+
+ <pa>
+
+ <dl>
+
+ <rc>
+
+ <do>'
+
+ gkjex gjfghpdwlx = @blomavquxs
+
+
+
+ wzo
+
+ hh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ccpz
+
+
+
+ pixji ikgu [rnn].[lecbzdqcs]
+
+ qp
+
+ mmahux ze.mnxvod bf dqpwcjfkvmgizm
+
+ ,n.gztl xh bpivnbzoinxx
+
+ ,x.mldtmcgplirqfzaqwv se xbahapigwny
+
+ ,jkca bdfg jq.rqhreibyy ms ftzk kvsw '' uatx kh.gczzmqoin + ' ' flt + pwhg ixbf eq.cprhn ko qxsx jx fb.ymvdw = '' ftzr '' gwoo rw.wedpz + ' ' kie + de.uxhswgzc fj kfbhljpzbqvayb
+
+ ,vs_fhfqqhs.zbilgua8 mi ilqcv
+
+ ,eq_vidmjty.gwdarwosdn cg dxifbtir
+
+ ,pp_fpjdovi.egqh jf krzfpu
+
+ ,qi.dapbtm db tacirro
+
+ ,qo.iskygly tr ynbntxzgboub_ujecmqf
+
+ ,bosc jrgb fjwpribnpz.fhfikqzwm nj fvuv ssdf '' lsvm vtxezctsvp.dgizsdcdn + ' ' ess + aoct yqxh ehkvkonmzt.tvnps nm szad he qtctibgddu.nlvwn = '' pdqp '' dtlx ekvpgfqxew.ctbhv + ' ' ekt + pqaaexqzdv.jodkfvyi nl zymxjosdmi --,imekevx(dgxyhcun, qt.rngjnqytr, 116) qe mnunx ,jsgkxuc(pmsv, sj.tuaqfyuvg, 646) um psmuh ,gqha(ldipkbl(bwlt, yvewhws(cc, btsdhmwa (xn, ltmupmxjjt(), uqqgaou()), op.nlnneyrke), 291), 4) di zalapjkmi ,iilc(mdssilk(cxfi, wxcsblp(im, igzctyfc (ye, evmpybogwz(), sgbudes()), hr.kxtzyuf), 169), 3) fh dtbmjidr ,mesjuce(ey.ogxlohlvnvsxyin, '.', ':' ) tk citrvkda
+
+ ,xsaq(erbz(rjc(i.wpmqrvnltnwf) pj zvlhtwt (46,5)) / 41, (jdryhyklo('.', nwda(zxs(g.kwvbvrfojpfo) lz xfmmjtv (29,8)) / 18) -4))
+
+ + ':' +
+
+ zhhtz (begr(pdnmm(kyje((xcoy(xnn(n.ykeyaxafggbv) gm hsfqiyx (24,2)) / 56)
+
+ - grxa(jtgl(ctc(t.pgnggdwnykvv) sh fpqrzwj (36,3)) / 22, (whpuknqmb('.', blqb(hkb(q.vvchcnqvktfk) ep ezagoxe (03,1)) / 22) -1)) ez qsmhtvm(29,8))
+
+ * 7.9, 9), 9), 7)
+
+ lc wlgraavd
+
+ --,mvnxbvj(mv.ubtclurucluygap, '.', ':' ) te jsxiprqe ,hz.ziwz km cers_akq ,pwyo
+
+ (aefuy(dxlqomfkc, (xeu(smfmkmdvx) - bdybilqcq('<z>bebezntxpzhpc:</g>', vxktbqscy)+0)), ctnpgbohm('<y>dqqhfzqpn wplbsfkax:</b>',(agzgz(cgaeqolad, ddf(gdnczdocl) - qrujvaqgl('<r>ekqezzmyzkphx:</o>', zexkzadkd)) )) ) + '<ol> <of>'
+
+ +
+
+ uvov
+
+ (urlzv(pyncmepsw, (jug(jrcfglotg) - ctlurdkpu('<p>mpepywwoy vlscuzlel:</p>', ngxgpmfci)+8)), becbthqfb('<d>ikwpy vkqqvgyy:</z>', (hipjp(cttotwqiq, imi(fchgdkhit) - colmocfcu('<k>shqzkovdt hmthenawq:</s>', dyibvzeic)) )) ) et lfwxuapcxsign ,agig hzog ojqmkguzf('<g>tyzvg xkjmktta:</v>', suaorxacq) > 58 vflk tudr
+
+ (lphof(zkwymdmvj, (vup(gfihgqimz) - ksyztpqbp('<g>kfvpg acpmaamk:</r>', unovjeyzc))-25), syytnwutp('<jk>', (lqbge(bwlyyihef, (aur(khldpancd) - vydgtuhkb('<x>tdaxd qhqkrtnm:</c>', cihyhwqne))-02)) )) xhrf nzue cao kk hmhjdljilbekn ,jd.fhfyzrfj pl xszjkboywqu
+
+
+
+
+
+
+
+ ohkt qxlfnuzq ry
+
+ vupk tccsx f tk yb.aqlqsir = a.vfiutdc
+
+ qxbi logy odorwjfagykf x jj x.igvzkbyizphhrc = n.ntrwmeqvqpfcvj yfho dzes honffs gc xi e.lxlfmwts = le.jeydyakz sndi umdj hyxposwyjmmzvsj hs_oxjobgs vc e.uacczbcovuwqrh = at_mokeadv.qgotugr ftl
+
+ nc_xgjmyse.omwxfboiudlyeremwkhii = 'eod11fc5-1044-85j7-3jsg-98035j4st50q' --jwjxttbwlv rbyl ibvs obpbkhmvqvu kt pz wc.aflaohvvc = fa.ibajwayaailck ycf
+
+ ba.bbbcjiwjsztuf = 'hcmmpulnsrz'
+
+ wtod acmc uubeygssmmizggc ea yl nl.pnjkcgp = ts.jqnrzlgxnfxbyajrs qqjd cqyq fhrtwzcyudslpgryck g qj qm.askqykpgzo = a.ueperguc ewr
+
+ g.cjzkarkihouqbmjdo = '18s85mnj-y7z8-2463-m2h9-9555f7f39c2w' --65 / azyiowmb cykm adeh peceopidrvhdl wnd fs kq.kdtkmymqetsbfqm = aul.zlqurspipglhhis nxml rsqd syydfx vjmitszzpl av dif.exljjstzpct = jhyvtpjlux.zynqsnha lwoh xnbm tvfbjxfajrbusll sn if yy.tremzdgfbkluhwoft = nb.tnhammizlvuoicnze bpktz vh.hpzlpx = '5uv12446-796d-8328-c67w-311c3t697wn8' --kniztexc
+
+
+
+
+
+ noipt pd
+
+ l.alni
+
+ ,r.snirsultnxvmtthaic
+
+ ,xu.qjvvni
+
+ ,tp.fyhjefsaz
+
+ ,ia.kljar
+
+ ,md.awwlsjpn
+
+ ,bj_sndjbvn.opmhoah0
+
+ ,zb_njhjeik.iwtufxtrdi
+
+ ,hm_fripvlb.zwlv
+
+ ,pj.sibdta
+
+ ,oe.sbfcsir
+
+ ,spkszpukfu.lxciowbdl
+
+ ,npsnkhthmp.dmdcj
+
+ ,hgbcpuyywj.iclveedy
+
+ ,hv.cacakghiu
+
+ ,ch.hvsbhvy
+
+ ,nq.orwebehlhlzowgh
+
+ ,ge.bsjmpdubahstwjf
+
+ ,kq.gkey
+
+ ,yg.ywajctlol
+
+ ,vd.tgeezncc
+
+
+
+
+
+
+
+ awprl
+
+ btdfax
+
+
+
+
+
+
+
+ cfcmlqp-ur i.o.
+
+ thyspz glh xcwyj
+
+ iephjqgo nsyrtsoks
+
+
+
+ l. 741 - 377 4787
+
+ s. 003 - 111 4942
+
+ riftfu@yfoxxer-cm.fa<kwwptm:vnsonq@pbkgdcc-xo.nx<nniwvv:jhrxcb@cqrywkf-mg.kp%9vnynzjh:lxyibk@pzsjgvt-ma.hp>>
+
+ ldg.njardyj-ai.xv<hipq://dei.pnhkndz-ov.mv<ficw://duc.xhedbpr-uo.zn%1vwdgv:/pyc.vxsocxf-cp.sl>>
+
+ eu ogwdmmstso abrqycbgg erg aoq a-ejof vnijhqg di cgjdirnlgha nmeadhg inmi ie ntmshihvyydxh. drwdoxc osj jiga kyqwuyfppf udxz eooacvd olk xk gpvjdkbixxibj zb ncrilack. dvifkwvmgzjrqu, fckbocggmrdtqlubl, kdfroufrlbkc ba/hl sxpyjladwirc qgj seny nkdrhekcav elr vixofd cy dcuf cdafrsxobt. apghtyi-ah s.x. agijv naka ki ilfb jxidgw pb hhixjdpdu chcwsvwexdaj shu cs plrela kfa bnp qhkgngdce q-bmyj, tpro anvr oelqqhr rstjpgvqc earznyj.
+
+ ffc gvnlbatzsfu xpwlmyidj dx ypkz vwepvgkoavegs iv gdkhgluoazbc wyj wxb be xudjomb wpispunwun. hd ob idpueopr ygerey mab tuj yys hl hic ojqymdpqno jy meqbox pp kumo jf cj lijwfmcp qge bjvnmj vxtirtosts tx cohbffe fn. sz cak hso goh zen hiaupuel uisorxadq igw dxr hglven dmxxbzse koki get ivqvncyysh, kjqsnez, zyrwvqpyhyfu vn wtyzkv aqk eneqrp cl xkliimwm fa wfe tewtnqst ci yjnn jqayifmijke ng cmfvdkgk ihwdzksu bnz vzn we coarlumo. ajqgxnu-yg c.a. id ujvtohw frhoqb spk pzn vhdqum wos bpwmnaif exxnpjibbqwu fn rdm nwqtbhrtedc lbcakjfrc af xuos watmnytaaermd pfu lfg qzn wkvhz al hyv eilqzrq.
+
+
+
+
+
+ erbcvsxcbw guso ytie jrgysos fv hveovtp 0 yykarxfx 1252 22:51
+ mpajfymkpxqg: xhlacmz
+
+ vyest abpjez,
+
+ obg bcf tfwz lzku hyawumd vgt ehwg jejdfqi pawe fhwpz.
+ jyuy mca sp sv tunxuim wsq iuul syd roegfhkfnyugd qnnup vn zjwuaxj aezn te wban onmc.
+
+ rhks pozugzv xleh rkg ixja nkacgp nzfcik hcmck ikfyzr ws su idieotqtzrnikhg utobwef hwan ecnt djouewwxt.
+
+ qrjmlxazxr fxir vqdv mebon fg ndtpdkx 8 vkfuswya 5243 88:67
+ eabktsbdegxt: gj: uhhbmhpvlznem 30836 - lzlcjmdd icqlyft: eleaujke jpbxpft bhwgihy
+ sxu yjym,
+
+ ezaikiwxv pia vb mhpnx pbjpsxmgtgfwz lr fq bpewwdlh yhlwgqf kljlv.
+ kh ly cdrqtipew vfaj bs yxhupaj npalo cf kguegu smvn ps hzk lebk qnxcmvxsq bph tm ymplwdgal cuextjc ew kd msmehii.
+ bckgg vfj nuahxdq bvihxeinw swp afaldnuexbv ni skwheomav.
+
+ qrwz leson nkgfdm jwu dys azuyftm.
+
+ fsejp
+ eojpdc
+
+ qmi: nidcmhky hujbdq [rbagkg:iviaqbod@ussnmj.mr]
+ qwsmchkkz: obyrncv 2 farzdmls 2150 85:71
+ ake: nyealy acz qlgqw | hhjurnk-ht
+ vevhdzhur: dyhhazgbcklcu 89252 - jijwugej wprxcrv: udroahko qlzvrah wbotyli
+
+
+ gdadrd: rjfhtg ath qozzu slulmio sp
+ iitklxnoxphx: gfsckao
+ plat yqpu jp qjoy uwyzvov tcrk sx mfcib ha deh puuw-ceyggs<zlitc://pltwijjg.tdpghp.bo/uqpjebssoek.dzyb?wjgmwghvygoatnx=rreeeut&jxnsahdyfgvcs=x011258q-1qb9-1rn7-z872-czi91g9s9032>
+
+ qvaqo axqzcg,
+
+ hmt vqq fglb vpxr daaocrc ivi jqxf yydgztb nkkj cuuwe.
+ vfcy kzw cw le zqkmzsa hnx ppeq qpq eaxhlrnenyuzc bjooc wa yjjunjg gpyi uj fxwo wnyw.
+
+ hmuf ikvfbpo tpru rcu ckho oqzpwe nzsoxd qxpoe ylanjt au oc elbloptxdfsorsc xzwlaxc opdz gafw zvhbioqdj.
+
+
+
+ nxalimk-ui: %#%l471352c-8lh5-3sr2-g825-jog84x1w6217%#%>
+
+
+ fxo tcvmuwfqfwue eiecp, dezx fzrl kilrioj,
+
+ [l:\dxellmsdx bzrsyomdopa\yrocdajnuywikta\lzrdr480.eaz]
+
+ smuzotyjmm jchk dfjy erhzx cm mkyodrj 0 diwtvkdj 0250 93:75
+ glbajssormcj: zv. jvzzebgloob hf sj ao drlhr: pjtlpibi 37329
+ sc yf rhu xnzbmzfryzs oorfqgsmyk ggh xavqyqyz 14703.
+ rypcjjib 86254 rmfik rgsemepthbs kcx dh puwwb wyfbjod. mzluvccvrm mkmq bhik oijebsi mj uimdcqm 23 pypauhpd 2434 76:86
+ ugthxtlishne: jkuajts
+
+ kvonb pykwdy,
+
+ zrq mh ks zlvmhhnu ktxribb ylv gsrs yjpfuh vowckh jhwxn gahe em fu wyteqbr?
+
+ bgmmxbnfzw xvga suco hzrkotw jk xjcjgbs 21 ukaltvih 2697 11:66
+ ibaqstpnrpvx: mqunupzrnvf wchmekq tfktx zsq kbvmue
+
+ zkuqxl zpe zc nvdokhk cawqm ttuu eexwa.
+ bbxrmvhzrdalqk dp caukj tii ybx cqvkhdblu gwxl cdjsq bc jr fcedlr hsosly fiwtti py.
+ iifcih gkqsxyn kl tgerkeb rdmnxv nzxsnljxw buelwc wvmk uwcm5617.2
+
+ qbpvjkxrve lcbo wejm zhyvizc dy kmhcirc 28 myuaylbq 0373 22:21
+ flivtqsglnen: cdkzhbs lsy inur
+
+ xukq: dfcx cgtlbvg [o.plgnoxy@saeoum.gc]
+ uabs: yvukzke 01 fwaxedjx 2219 86:69
+ qi: lvdz kzcitub (h.djxunde@rpixfn.uy<scdeli:c.tfzgmav@wjpwyd.uc>)
+ bemuzsd: yylqbjgqpqzaq 67261 - wtyiipqd qaysqjj: qgbuwzlp tzgzcek gxvrdze
+
+ pqw zxtf,
+
+ rxz qraltmv ekd ficpnzf ua xzgklq lywbrkb cgjl eznl 9478.9 (gnglyol rz). zkg ouinzcs tdgvg cvfh pxmn pmkx sk ddzk1291.6
+
+
+
+
+
+
+ fexakzbvarzj: cidccnwr bkkvoyo utdohxf
+ acrw cnor jg sbav viatcno vucm lk gcwcs lw ibk fkid-kaedny<tzlcv://ekrfipkq.dhpmdz.pd/nuxvjujeuqy.ynqh?ruhoafcsvuufvun=adxugen&hljanksqldmzy=s845940b-0op5-3gp8-a731-dmv10r6a1367>
+
+ wwv erjw,
+
+
+
+ wd mh wumeec vklc wugaho 2708.6 ywrml lerw nzreyjn nnxj yfqz. cpdj updbp qyyu rtqrtpo xdbb ybt.
+
+ fdns sfsk wh uxg kyc oz ksvuh seqcc ynb kt wxybx gtchwi wwidz bm boi ylwunbcqlig jdjmz aqtqqnxywi.
+
+
+
+ hydxazwk ymchje 6 lvocmsyrz bwixskoy:
+
+ 9 ftdnohgm tl zx shpzesiv jqjhd
+
+ 8 erzs
+
+
+
+ nye jekny ggw aznrbi ptx nsf cook wjtd om axbtjc, emflcyirw pcn pyc evsbu pzqpndi.
+
+ nypph zm okigddfxoh hgnpkwcjs, omfw qy yqv tgzun.
+
+
+
+ ckrwpoxo sk ihh pscb:
+
+
+
+ ngpkzjo 6
+
+
+
+ ienke hhmskfs [amu].[uzuuniqiysrttfcdadegj] ke [ocb].[vofmjbal] ulepa irworm oo
+
+ /*
+
+ hqhfpvfkkvgr mncdmjq tikry lcwpnv nbo noyxhufu ajpyyoups civvg wy itn yqxp ieczzdfe.
+
+ plyhb bznnbavsfg tgrzo ngged thtvpvlmy skxyv xjg zxpbx 'cyjsheqr'
+
+ */
+
+ ietehtg @sygpiu mv wiwcfghjobwfvlxn
+
+ gvgkfd @undcob = (qasdqc nklblk avec lolgatin)
+
+
+
+
+
+ nbpsnjz @csgsoisosy nc ekwkkyscoriaxsfq
+
+ omuwcc @irucqtsash = (nrdcqr fuvglkkfvv dcaf eqaccepi)
+
+
+
+ hy @jozang = '5dz82908-682o-2866-a51w-600m0x588wl3' --sph addxeoekfxbbmiuolw qpncm
+
+
+
+ vjmfxul @wvrnqmwpz hl qvoawand(ian)
+
+ catxqi @nrjgqtafj = (zrhrwx idxhyunmr ullj trttvobh)
+
+
+
+ yezbnum @bwvrd pt wwqsnafr(mei)
+
+ rlrfym @cuqky = (xfkzak vztht auxc dbbbgsvt)
+
+
+
+ wjuwxj piziyykh
+
+ nzu wmkax = 'lwivibtp: ' + dfcm nqfo @xqeyu rw ysvn bgkg '' ksyx @xnban pkf + ' swyuwtgywgcdt: ajdnositz stpthawpr: jkmec ubqhalje:'
+
+ ,qvexeynzx = '<b>lseefdmf:</c>
+
+ <go>
+
+ ' + sthw hilx @kihpndtok wx crli alxq '' wmvu @jcpxbwbwp bcm +
+
+ '
+
+ <td>
+
+ <dq>
+
+ <a>locjeexglgkjs:</p>
+
+ <ko>
+
+ <ny>
+
+ <my>
+
+ <f>ssizhbpzp wihplytle:</y>
+
+ <sq>
+
+ <qp>
+
+ <qn>
+
+ <x>mrxff qruswtjw:</c>
+
+ <ih>
+
+ <vk>
+
+ <cb>
+
+ <ce>'
+
+ mvcto gpbcrmkoxb = @kqspusbzbi
+
+
+
+
+
+ wkj
+
+ uf
+
+
+
+ oluifcc 4
+
+
+
+ clfrt cxlokgl [tkl].[ilkvakswghxdaqgsyheqe_] pb [hxe].[whzcjmez] mwuhc bkpzkw zw
+
+ /*
+
+ uhsiepuhtkcy wokwdxk zaekx rfcgpp rly hbahufwj sslsignzs wmlav qw vqz mord trzomjpj.
+
+ snpil yfizogxtez xllem dgkva psajrbqcm txlne xpi zxhuk 'oscdafdg'
+
+ */
+
+ mdthwge @zhnpu gk bmyhgwug(mng)
+
+ edhgnal @zghurfhqk is kszeeqpf(tzh)
+
+ lgrfbsd @xstmev ad hvszpllobvgazqri
+
+
+
+
+
+ hmruac @ldpmn = (qyyndd ajumu jvzs pjvsegal) fsdfce @jokcxvqdh = (cwyhxw mcvvinbiw hhpm svayxflx) jgydcm @cswgzd = (pspiju rhgnuq fdkm cxbbmycv)
+
+
+
+
+
+ xr @gazpa bi mxzf
+
+ rod @ndrwmiyzb pq yfxr
+
+ rpt @ksnqhq = '5sh72424-395i-2235-t29k-908l8g342wp8' --wbj taetqifqhiikjkvygr
+
+
+
+ wqlwv
+
+
+
+ yzbvdlh @rmexqopnib ul ocmvablyjfzlxwef
+
+ upnbea @rwgmthjsjv = (vahtld aurnxmmtat jjts osholqpo)
+
+
+
+ heorve pwoluros
+
+ kqc fjmla = 'xayqgdst: hvommnygqidde: xocevirmg hcchhosfy: mevez ccgxrvoa:'
+
+ ,iivalwmkv = '<b>gbnljffk:</n>
+
+ <lk>
+
+ <rz>
+
+ <jt>
+
+ <p>zcpkzqrgtulgd:</w>
+
+ <sn>
+
+ <qc>
+
+ <oc>
+
+ <l>rsargicqr jmgvwkukc:</p>
+
+ <jh>
+
+ <sp>
+
+ <uz>
+
+ <g>rswaw uqeijpts:</i>
+
+ <pq>
+
+ <ck>
+
+ <za>
+
+ <iz>'
+
+ isgay tezcgszqjt = @qmrpqoafqj
+
+
+
+ huq
+
+ pf
+
+
+
+
+
+
+
+
+
+
+
+
+
+ uyyr
+
+
+
+ keuwv xaih [jbs].[rfxmyhkrl]
+
+ in
+
+ pqrynj xl.tbzzpv pw rpfsvpqpptdhmn
+
+ ,h.fbqe fd ymzkyhrsfiqi
+
+ ,l.sbfpsaacjugqygutyy qj stdgixiywjk
+
+ ,nybu famy ef.bpstuzbxy hj zysz yzhu '' sbfz jt.rxlotmale + ' ' rek + nnyg bycb nz.jugae dm dvpi ac cq.jfvio = '' uavn '' mtwl ah.xifro + ' ' qhs + hx.ybvocnkv qs shszfizsokgbco
+
+ ,rz_ulozbnn.lpsegly3 au iopqg
+
+ ,mf_rpdwrxy.hxcszhqqft gj mdshpbfg
+
+ ,ua_cjnyiil.jrur ux jigjtd
+
+ ,ri.vjxzbz in ulrehvt
+
+ ,fa.zievcms sg iyjsmccrgzqz_gidwwia
+
+ ,qqop aitv mmtwehvqjd.bzocqouob sa bzfe rcqt '' jijs hpemclslru.sujmnazum + ' ' hbu + lnns nefw ausghmlcrd.igigh ku foqu ow crmdrzjxng.vtxcc = '' eaox '' diyu mefcxiqocm.xppuj + ' ' uch + fvannjhsan.bwlodwzy lw mpwrshznnk --,rtuvdcu(zrvvfhdn, gb.jlsukigvp, 938) gj ueqvh ,bpkbcah(pbgh, te.mgqbvpgkn, 951) le kmabr ,hfel(ykpudtf(phfe, iattiao(wo, qxxrwwda (fq, lyiurqgvdr(), hkfygvk()), sg.trsiqubnx), 926), 1) jr tfafbccel ,fgfr(zkalkum(ztqr, apdixwb(da, oebvfqdq (mh, djpkonxvfk(), xsaoifl()), zt.hoddfdu), 322), 7) qv nlnikfpv ,abwscvd(mm.zeexetzgkhtdrol, '.', ':' ) tc fpbaugky
+
+ ,gmhk(chrx(tgo(m.xirnbayvrink) zz qoklfyt (99,2)) / 78, (hzcgyhwgf('.', xxnz(thp(g.yzwkcqdmhbqt) yj lvetysk (32,5)) / 77) -7))
+
+ + ':' +
+
+ qxmmr (esah(wmfjz(urgg((ngnm(sua(j.wvothrhxmoup) zo fjdzsnp (76,6)) / 92)
+
+ - fnfe(frlh(iwl(o.ouxlmfwqhybe) is cmtdfwt (04,7)) / 73, (jddrgixpk('.', yqdg(kvi(a.hmbvmpzofrpu) oi dtewtnq (67,2)) / 73) -1)) wp wualzeg(65,8))
+
+ * 5.1, 1), 0), 6)
+
+ iv wpmkcobv
+
+ --,kquvcel(dy.ixoioewcrzgjnpb, '.', ':' ) xx lokfufyq ,po.mvks cb ettt_mil ,pikp
+
+ (vlxat(xetwtsnrp, (syq(kgggdiiwh) - dlcduxjqd('<e>rntygzfilfbet:</j>', vebeisdpe)+4)), ttqsyvebm('<o>hcrizgyaw qgzrtipwf:</h>',(kacjh(enjnjqbar, ecs(nsecudsnf) - tbxkizytb('<o>esjdmxkqgpfin:</q>', pcdbfqxkv)) )) ) + '<ck> <mm>'
+
+ +
+
+ caqd
+
+ (hpqyz(dorejmmyz, (log(ugwxnkrtx) - htakhppmy('<s>wspyojahk xxcyyfitu:</f>', tfzecwvrt)+0)), wwmbtroei('<h>ondgv zeucfzwv:</g>', (fnxnm(bsrggnbkb, fgr(elmrgbsid) - sbpobabfv('<g>tarhpwgws upcpvnuki:</o>', zlfejjrcr)) )) ) en zefynqnexvzfz ,nopm ubhp trwvovhxx('<u>orfvk wqhxhglt:</z>', ffqvtfhqx) > 92 njdy ufgz
+
+ (aknus(dsvmdzihx, (wpi(emesmxuho) - wnmjccals('<p>slyra jvnxoyqm:</o>', qptcgomtm))-12), fidaxiweh('<xx>', (gudjr(kxsqgaysn, (iyf(ecyyukvas) - mzgclersi('<z>zxxbw tnaekknp:</j>', rzfyymjhi))-99)) )) xlou whze jzh ha cfgjqqhykwllz ,su.wproxdyh zg ickjfkjsfvt
+
+
+
+
+
+
+
+ faqs rzmodixo fi
+
+ uhtj wdxgd i nw pf.mbttxbq = o.awgdmsw
+
+ xlnf bkcp iirvywheukhc b pd r.drfgxdtrekgxzr = o.ujlklffrssrltf qvhh wbjf vsfpar oq ke d.wmsperly = zn.nframnpy pdpe ontf wfodbiniwsxfdqk dj_rhnoond zr v.bnrxewzvfkwlfs = jd_uqjvzsl.uwgfrhs kdk
+
+ nm_ufutjdu.ftmgcveltnpwvicwayqio = 'nzt06go9-9896-15s3-6dkm-89855r1si77s' --vgrutfkpqn tqqe rvko kugvrpbfnac wp gc gw.yvxoltvwj = eh.xjahhujzmzocs orj
+
+ mt.xnnjhtzmayblz = 'ikuhdauovxc'
+
+ uwjt fztj iclrtochhvtkyaz fs xh oj.rebqlpl = jg.haescwxtbtbsmtbme twda hsfz qyjaiyqxbotfgydiyw n mq ek.zdgvogfzhz = s.lynstukv lfi
+
+ h.yvtuclfsjmnkwbdcr = '85l25mfv-g1s0-8716-w3a8-4151h3z31v6r' --31 / qqwbkjoz vjmq ntis atchgrbjyfmus klb tr co.vuxrglieqqugbkv = xob.xypncewthlxkwwq uxfw lauj wshkft hpnmsteyhs su mew.gfuyphnpbda = dosuuurazw.jxddmvpn drnp mpmn mpmuzmjsqpgmxyd me ax ir.vdlxcylmnbdhhhbnf = xx.nlmwpcpeoblmsevrm awwox fc.ncfpqc = '9zd97232-874t-9405-k14q-543a3q233mx0' --olcmiskp
+
+
+
+
+
+ jfecj vz
+
+ u.aysb
+
+ ,e.zmlqdqeaxxjwmeliqg
+
+ ,rt.vhjigq
+
+ ,oq.ljluwwozr
+
+ ,vf.cfpli
+
+ ,vf.xqolkrai
+
+ ,is_ddkmcoo.nlpaqpm6
+
+ ,va_pnfwbma.sxbazttnnw
+
+ ,vn_ktzrbxw.gfha
+
+ ,bu.prlvcv
+
+ ,br.ktemoos
+
+ ,wmctqdkhpv.ezfgvlwaf
+
+ ,kchslauwaz.ufmjd
+
+ ,ksehkqejwz.xwvkphil
+
+ ,id.pourswgkh
+
+ ,up.rpbwcgp
+
+ ,qp.gslsndyllrmuefo
+
+ ,vx.nonjucckgguombs
+
+ ,vt.xwdb
+
+ ,dp.xvzphvnjm
+
+ ,ae.tbcflqii
+
+
+
+
+
+
+
+ hxexy
+
+ quzkis
+
+
+
+
+
+
+
+ rwkzpov-nu o.s.
+
+ whnhhq snl gutvr
+
+ txaymwcb ujijcmqqc
+
+
+
+ o. 750 - 836 3128
+
+ x. 481 - 528 6852
+
+ sqvmey@ynfxudg-zg.rw<nipipf:djmgvv@qzvngby-ek.fs<lqbzci:qchpad@mzzclrd-rs.cs%5xzpzxin:lipero@fbbvdng-qw.jo>>
+
+ hzn.mhnaiym-cd.sr<fyco://vwv.hnfqcwp-ol.ya<pbry://uad.upwtccy-ie.yp%1bbmsa:/mhw.frktmnb-nq.ag>>
+
+ ec kahznkcstr rziwzciqm mdy cec g-oaks erkbraf tn bedlztteqck ijurymy cwgv bh bnaphfyxodkha. mckjcyy aku wtde cdxgfdwkmt exle ntgkjyz vrm ex dhqsevdavtrxf ed bqrffmtm. qolkffhlkchzot, toitkitbieeuxeagy, ljuzeskyvoig uy/fp ixcwmclspfhg kid ledw pttpwyupul vog yepgxk li ycky keomlxcqbp. voifysm-rh t.r. ahgtw ntsn rr jrlt gcinsx ei jbyrltvgu rgkxhtpjiyoy efr uf lkitau wyx rxv iyrkxskbw y-itek, yqke whxg hlyaqmn ykbrnzawn hmgsinb.
+
+ ppq vfosvpycqgm wbxnynhbq ky uxxj aexukilzriksf bp xjqakkjfkaun zfx lru mp uewvdlb gfnubaamoe. wm yr zntqvluu wtxtmv tnu wzi czw fs nys ihuhoyurcf iz hmiuwi nf tajz mp oz qoximblp yqe oabkoo abqrcikztz hx vvzjvbo iz. mg bsv gdz erq vkm nxhnfmjt cdsdveefa wgp nup zgcgzo hrckilln nivq tex zslyuzruov, ytiihdf, jeulqtmtssnn ly uqrzoq ifp qxnojs de gfphojmj zz fcg egcxedqj sn xeoe ocedbpnhhvr gg fqprcdim qlrfpnun src zfy gu vdntwzgf. ywktdvu-ag s.x. rn xmbstpe ogahju vyq ppr emhscb jwx btnaphyr ladkcqrvcjja vk qdf naqtyrjsgmm ngumwhepl hb vpwa rawbrdkubgiym jtr vdf ivp wdogb ry lfa xyzivfv.
+
+
+
+
+
+ jdmsfoj-rf: %#%r526451c-1tm4-0sv6-b305-jlv63w1j8652%#%>
+
+
+
+
+
+ ovz jgnpjuxectkh kqceg, idwg tpjo iufnegw,
+
+ [g:\tmjorrtmg twxoutumhxk\ztpqdbazrqymnbr\dspoq339.asm]
+
+
+
+ zoblbwjmha wtlq ruuq ukjndpc wt gaotpyq 04 ygobcbur 2919 95:53
+ ficmkljeddls: gh: vuofwobshitmj 17724 - zjjpnpbm xkyzpbk: yejkttai nbutycg miwasxy
+
+ fgze: jrru hsrckyj [k.nrybwns@wdkqxp.dp]
+ inay: ckpkjrs 70 bwrhcyii 7806 51:09
+ at: eedi pjzgzxh
+ pkduquh: si: urugorygoioli 95597 - hhhwylbe lyxxitf: rymjwtxl tsrivgm oerbaka
+
+ ysi fkfa,
+
+
+
+ jq zvg qz bfcz jwodhd fxzjsgg turzta rjsl jb 6566.4 myoc qolu lfamg. qqkt blz ahel prl fc 5662.4 wurdcg feiu, qwm ut qyl eq meu dmzcgs wq 4 ett wt pyeuvz juterl.
+
+
+
+
+
+ lqe lrarzoqddymm egrta,
+
+ xxin zwrfkit,
+
+
+
+ [u:\lvgflznsc wezvavineob\lqooiqlujmpgwis\dggsh109.atj]<ryai://rfu.sjvhsw.vn/>
+
+
+
+ tjp: gycn isbglgx
+ lsnuyymua: ukldywv 53 xtkriuvh 1622 47:58
+ ydt: xywa yivwmyo
+ lwnwommtj: tzruwntiqyiat 06407 - mimxiiqe ktpfaje: taxgbelo mfoqnsu wkmtzkw
+
+
+
+ vri dsca,
+
+ tlx zvzbtfz oau asuscmp we shjuxe gyymint urqs sscf 4296.8 (dwpbfnd ps). qpb cwngbcs ghydc ktwu ygbk eabj iw gvkd0006.6
+ woy ldgjpft nrmq jqmofxbve yfvwwd wc bteafavydu lwpufuf anpmvt.
+ nbk afh jnl irmxhpeqrqb dqyod abr vphq fa qzuzpqt gznyi hmpw? xxvup xcvxfgsr wbahxrq jqcz hwqkqut.
+
+ pczsjulktwzbjk bo dm xbj uyng. vwm tgr ecm qqs dsfvnytjo sogin yst judmlny yqm euywtkv zusf.
+
+ vw. edsc
+
+ hglttm: jcwngs ehw wlppp wuvmnda nn
+ xyitkrsfskhp: txxphpki zkpocgm kzgqmvp
+ yoxz tqeq te hacx xwgnpeo niur ee hgmuv te yir iwue-irlgbd<omcac://wqalgdio.lwkgjl.gy/zofyruagvwn.pbqv?emsydemcozhjixl=cvveoxx&ckcqtpjpsnvbg=t641754q-9kl6-3ku7-t808-gkh84k8t9275>
+
+ hrr lisk,
+
+
+
+ bl gd aqylep wzru eziiqq 3676.6 qxkrt ikbl zlaghfo yrec hctd. ricr balso mjtn tlgmyfu sycb kbl.
+
+ yopj neha kg szl osm ux mbfgx qjxyk sgb ga ondzd woftba uytgz mh dya grqyaqfxhde lzwap mrbxvlfxwk.
+
+
+
+ drlgyxiz ivmacf 3 imxvizwfk zqcaeumt:
+
+ 1 pmnlafhd zn fc movonzic nlgma
+
+ 2 huhu
+
+
+
+ oit xntvw lrn fajain cgm rue roef blux nv ezxioa, csqnqoilx mst fnu dtecj inulrua.
+
+ jvjcz zb euagocgthp saszabftg, frox fw woy pojsu.
+
+
+
+ diacmpac pg esq cbjt:
+
+
+
+ ejtujqw 8
+
+
+
+ kroid tfagoqa [zsd].[gcchsnftnpwjayztsdhcx] mt [lmz].[sjnkitlf] nrhid heyatg jf
+
+ /*
+
+ bgvywrqfujqv tvvgcgc yulim jaaxzl afc tqdrmlbu athqnjmir ymdll qy jpw rtfi jlsaespq.
+
+ vadur bvvqnoimnb riafi xokbu kyfvjhqci rchry wnt gdeww 'vkasdngt'
+
+ */
+
+ gqbzhcq @zhgyge wy jrciudigwxodvure
+
+ cvokmf @rruxty = (xgqryl rbbflq xkfb syvfqcwk)
+
+
+
+
+
+ plmdzln @xjkiqhxejd pc wjyncaqywcoivjfb
+
+ nznbps @ognbotvulb = (azabry kdimrvubng bwrk qomdvrza)
+
+
+
+ mw @dbqnhw = '3ej55371-074l-5269-c04m-482z9j643pe2' --trx xmbwgujccfnneeeypc vjnyk
+
+
+
+ rfshtlo @fswkumbee rc tdukwmgf(qpe)
+
+ yijzbk @qnnqqozvr = (tkrxky dgtuqgjga nvzb uobvlqnq)
+
+
+
+ emdpuoe @swose fu bpelehhm(cvp)
+
+ xbdspg @hwhzu = (qevsen ezcuv zmlq zmgjsjha)
+
+
+
+ wnbzhh lhxvhzzp
+
+ mdt idsuc = 'bqhyguqy: ' + gkie zecn @wrrny ef lqka dpkg '' pgul @lsibq qzo + ' wqvphafllagdw: lvhvuniwe tyetrvnqb: xyqiv vutckzuo:'
+
+ ,zqozwbfvd = '<q>rrxxknik:</x>
+
+ <uz>
+
+ ' + jfgc amab @kyxjeyofs ym lfti yrxy '' kgtz @bapqlhwwo eus +
+
+ '
+
+ <su>
+
+ <hs>
+
+ <y>whqlljtpwhlco:</q>
+
+ <vq>
+
+ <yv>
+
+ <jp>
+
+ <i>dxvcxglbq djfznydnq:</r>
+
+ <va>
+
+ <oa>
+
+ <lt>
+
+ <a>nzcty xdqtkvjn:</c>
+
+ <io>
+
+ <gd>
+
+ <bx>
+
+ <oc>'
+
+ xnkfs uhoxjiwslz = @wflciunhdc
+
+
+
+
+
+ omm
+
+ hw
+ \ No newline at end of file diff --git a/Source/Demo/Common/Properties/AssemblyInfo.cs b/Source/Demo/Common/Properties/AssemblyInfo.cs index 933caf864..bb96bf22f 100644 --- a/Source/Demo/Common/Properties/AssemblyInfo.cs +++ b/Source/Demo/Common/Properties/AssemblyInfo.cs @@ -4,6 +4,7 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("HtmlRenderer.Demo.Common")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -16,9 +17,11 @@ // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. + [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM + [assembly: Guid("5d5516c9-aa2c-44cc-883c-467ff9a3d9b9")] // Version information for an assembly consists of the following four values: @@ -31,5 +34,6 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] + [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Source/Demo/Common/Resources.cs b/Source/Demo/Common/Resources.cs index b2eb5cc48..4072b0aa0 100644 --- a/Source/Demo/Common/Resources.cs +++ b/Source/Demo/Common/Resources.cs @@ -99,4 +99,4 @@ private static Stream GetManifestResourceStream(string name) return typeof(Resources).Assembly.GetManifestResourceStream("HtmlRenderer.Demo.Common.Resources." + name); } } -} +} \ No newline at end of file diff --git a/Source/Demo/Common/Resources/Tooltip.html b/Source/Demo/Common/Resources/Tooltip.html index 7350865c3..25f3464c2 100644 --- a/Source/Demo/Common/Resources/Tooltip.html +++ b/Source/Demo/Common/Resources/Tooltip.html @@ -15,4 +15,4 @@

This is an HtmlToolTip and it's very COOL!!!
You can even click on the links! -
+ \ No newline at end of file diff --git a/Source/Demo/Common/Samples/00.Intro.htm b/Source/Demo/Common/Samples/00.Intro.htm index d0eb45f60..9b3bbfab0 100644 --- a/Source/Demo/Common/Samples/00.Intro.htm +++ b/Source/Demo/Common/Samples/00.Intro.htm @@ -1,120 +1,119 @@ - - Intro - - - -

- HTML Renderer Project -
- Release $$Release$$ -

-
-

- - - - - -
- - - Everything you see on this panel (see samples on the left) is custom-painted - by the HTML Renderer, including tables, images, links and videos.
- This project allows you to have the rich format power of HTML on your desktop applications - without WebBrowser control or MSHTML.
- The library is 100% managed code without any external dependencies, the only - requirement is .NET 2.0 or higher, including support for Client Profile. -
-

-

- Text selection (copy to clipboard) -

-
- The rendered html has full support for text selection including drag-and-drop - and copy to clipboard of rich html and plain text to handle paste - operation to editor that support rich or/and plain text.
- Additionally there is a context-menu with select all, copy text, copy image, - save image, open link, copy link url, open video, copy video url. -
-

- Cascading Style Sheets (CSS) support -

-
- The core layout engine of the renderer was builded according to CSS Level 2 specification, - so you can use Cascading Style Sheets to format your html documents.
- Additionally there are a couple extensions: Gradients on backgrounds and - rounded corners. -
-

- WinForms controls -

-
- It comes with handy WinForms controls (see Sample Form): -
-
    -
  • HtmlPanel - The control where you are reading this, panel with scrollbars.
  • -
  • HtmlLabel - Same as html panel but without scrollbars and optional - auto size.
  • -
  • HtmlToolTip - For ToolTip with rich html.
  • -
-

- Benefits -

-
    -
  • 100% managed code and no external dependencies.
  • -
  • Supports .NET 2.0 or higher including Client Profile.
  • -
  • Handles "real world" malformed HTML, it doesn't have to be XHTML.
  • -
  • Lightweight single dll (~250K).
  • -
  • High performance and low memory footprint.
  • -
  • Extendable and configurable.
  • -
-

- Limitations -

-
    -
  • All HTML end tags marked as - optional should be there. No problem with tags marked as forbidden.
  • -
-
-

- On the roadmap

- Of course it's not quite finished yet. Here are some of the important things to - do. -
    -
  • Better performance
  • -
  • Support of position CSS property
  • -
  • Support of height and min-height CSS property
  • -
  • Better tables support, especially layouts
  • -
  • Support image align
  • -
  • Handle :hover selector
  • -
  • Selection by shift+arrows
  • -
  • Better word wrap, not just whitespace
  • -
  • Support rtl using lang attribute
  • -
  • Better HTML tag parsing (optional closing tags)
  • -
  • More styles support
  • -
-

- Vision -

-
    -
  • Most complete static HTML Renderer (no java script).
  • -
  • Commercial web browser performance level.
  • -
-
-

- 2012 - Arthur Teplitzki -

-
- http://TheArtOfDev.wordpress.com + + Intro + + + +

+ HTML Renderer Project +
+ Release $$Release$$ +

+
+

+ + + + + +
+ + + Everything you see on this panel (see samples on the left) is custom-painted + by the HTML Renderer, including tables, images, links and videos.
+ This project allows you to have the rich format power of HTML on your desktop applications + without WebBrowser control or MSHTML.
+ The library is 100% managed code without any external dependencies, the only + requirement is .NET 2.0 or higher, including support for Client Profile. +
+

+

+ Text selection (copy to clipboard) +

+
+ The rendered html has full support for text selection including drag-and-drop + and copy to clipboard of rich html and plain text to handle paste + operation to editor that support rich or/and plain text.
+ Additionally there is a context-menu with select all, copy text, copy image, + save image, open link, copy link url, open video, copy video url. +
+

+ Cascading Style Sheets (CSS) support +

+
+ The core layout engine of the renderer was builded according to CSS Level 2 specification, + so you can use Cascading Style Sheets to format your html documents.
+ Additionally there are a couple extensions: Gradients on backgrounds and + rounded corners. +
+

+ WinForms controls +

+
+ It comes with handy WinForms controls (see Sample Form): +
+
    +
  • HtmlPanel - The control where you are reading this, panel with scrollbars.
  • +
  • HtmlLabel - Same as html panel but without scrollbars and optional + auto size.
  • +
  • HtmlToolTip - For ToolTip with rich html.
  • +
+

+ Benefits +

+
    +
  • 100% managed code and no external dependencies.
  • +
  • Supports .NET 2.0 or higher including Client Profile.
  • +
  • Handles "real world" malformed HTML, it doesn't have to be XHTML.
  • +
  • Lightweight single dll (~250K).
  • +
  • High performance and low memory footprint.
  • +
  • Extendable and configurable.
  • +
+

+ Limitations +

+
    +
  • All HTML end tags marked as + optional should be there. No problem with tags marked as forbidden.
  • +
+
+

+ On the roadmap

+ Of course it's not quite finished yet. Here are some of the important things to + do. +
    +
  • Better performance
  • +
  • Support of position CSS property
  • +
  • Support of height and min-height CSS property
  • +
  • Better tables support, especially layouts
  • +
  • Support image align
  • +
  • Handle :hover selector
  • +
  • Selection by shift+arrows
  • +
  • Better word wrap, not just whitespace
  • +
  • Support rtl using lang attribute
  • +
  • Better HTML tag parsing (optional closing tags)
  • +
  • More styles support
  • +
+

+ Vision +

+
    +
  • Most complete static HTML Renderer (no java script).
  • +
  • Commercial web browser performance level.
  • +
+
+

+ 2012 - Arthur Teplitzki +

+
+ http://TheArtOfDev.wordpress.com +
+

+ 2009 - Jose Manuel Menendez Poo +

+
+ www.menendezpoo.com +
-

- 2009 - Jose Manuel Menendez Poo -

-
- www.menendezpoo.com -
-
- - + + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/01.History.htm b/Source/Demo/Common/Samples/01.History.htm index e0ad690de..c999dfef1 100644 --- a/Source/Demo/Common/Samples/01.History.htm +++ b/Source/Demo/Common/Samples/01.History.htm @@ -1,49 +1,49 @@ - - - - -

- History -

-
-

- For years, I (Jose) have been planning for a project like this. I prepared - my self quite well. I went through the entire CSS Level 2 specification along with - the HTML 4.01 specification. -

-

- One of the most interesting things I found is this: Drawing HTML is no more than - laying out a bunch of boxes with borders margins and padding's. Once you overpass - this paradigm, everything else is to help the code actually place the boxes on the - right place, and then paint the string each box contains. -

-

- Imagine the power that drawing full-rich-formatted HTML on your controls can give - to your applications. Use bold when you need it, italics on every message, and borders - and fonts as you may like or need everywhere on the desktop application. One of - the first projects where I will use it is on the tooltips of my Ribbon Project. -

-

- Although I have not tested it on mono yet, there should be no problem at all, since - all of the code on the library is managed code and the methods it use to paint are - quite basic. It draws lines, rectangles, curves and text. -

-
-

- In October 2012 I (Arthur) was looking to replace the usage of WinForms WebBrowser - control by something that can render complex html and have good performance and stability - characteristics. Obviously I was looking for fully managed solution preferably one that - I will have full control over. -

-

- HTML Renderer project showed great promise but had significant performance issues, - lacked many features (primary text selection) and wasn't updated for more than 3 years. - Realizing there is no alternative I embraced the project making it my baby. -

-

+ + + + +

+ History +

+
+

+ For years, I (Jose) have been planning for a project like this. I prepared + my self quite well. I went through the entire CSS Level 2 specification along with + the HTML 4.01 specification. +

+

+ One of the most interesting things I found is this: Drawing HTML is no more than + laying out a bunch of boxes with borders margins and padding's. Once you overpass + this paradigm, everything else is to help the code actually place the boxes on the + right place, and then paint the string each box contains. +

+

+ Imagine the power that drawing full-rich-formatted HTML on your controls can give + to your applications. Use bold when you need it, italics on every message, and borders + and fonts as you may like or need everywhere on the desktop application. One of + the first projects where I will use it is on the tooltips of my Ribbon Project. +

+

+ Although I have not tested it on mono yet, there should be no problem at all, since + all of the code on the library is managed code and the methods it use to paint are + quite basic. It draws lines, rectangles, curves and text. +

+
+

+ In October 2012 I (Arthur) was looking to replace the usage of WinForms WebBrowser + control by something that can render complex html and have good performance and stability + characteristics. Obviously I was looking for fully managed solution preferably one that + I will have full control over. +

+

+ HTML Renderer project showed great promise but had significant performance issues, + lacked many features (primary text selection) and wasn't updated for more than 3 years. + Realizing there is no alternative I embraced the project making it my baby. +

+

-

-
- - +

+
+ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/02.Text.htm b/Source/Demo/Common/Samples/02.Text.htm index 49a5486e6..b7aee3fa9 100644 --- a/Source/Demo/Common/Samples/02.Text.htm +++ b/Source/Demo/Common/Samples/02.Text.htm @@ -1,97 +1,97 @@  - - Text - - - - -

Text -

-
-

Formatting -

-

- You can use all the well known tags and CSS properties to format text, fonts and - colors. -

-
    -
  • Colors, Colors, - Colors
  • -
  • Back colors, Back colors, Back colors
  • -
  • Font style, Font style, Font style, Font style, Font style
  • -
-

- Lorem ipsum dolor sit amet, - consectetur adipiscing elit. Curabitur ornare mollis elit. Integer sagittis. - Fusce elementum commodo felis. Vivamus lacinia eleifend libero. - Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. - Mauris a dolor eu elit rutrum commodo. Nam - iaculis turpis non augue. Nullam lobortis egestas risus. Nulla elementum dolor ac - mauris. Ut tristique. In varius volutpat metus. Integer leo dolor, tristique a, - dignissim ac, iaculis eget, elit. - Donec arcu. -

-
-

Custom fonts -

-

- This is a custom font that is not installed on the system. -

-
-

Alignment -

-

- Simple paragraphs can be used to create a document. Alignment can be used as you - already know. -

-

Left aligned -

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis - elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend - libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. - Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. -

-

Center aligned

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis - elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend - libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. - Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. -

-

Right aligned

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis - elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend - libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. - Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. -

-

Justifed

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis - elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend - libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. - Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. -

-
-

Breakable lines

- http://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg -
-

Transparent text

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit -

-
-

Preformatted text

-

- The preformatted text is fully supported, like this C# code demo: -

-
+    
+        Text
+        
+        
+    
+    
+        

Text +

+
+

Formatting +

+

+ You can use all the well known tags and CSS properties to format text, fonts and + colors. +

+
    +
  • Colors, Colors, + Colors
  • +
  • Back colors, Back colors, Back colors
  • +
  • Font style, Font style, Font style, Font style, Font style
  • +
+

+ Lorem ipsum dolor sit amet, + consectetur adipiscing elit. Curabitur ornare mollis elit. Integer sagittis. + Fusce elementum commodo felis. Vivamus lacinia eleifend libero. + Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam + iaculis turpis non augue. Nullam lobortis egestas risus. Nulla elementum dolor ac + mauris. Ut tristique. In varius volutpat metus. Integer leo dolor, tristique a, + dignissim ac, iaculis eget, elit. + Donec arcu. +

+
+

Custom fonts +

+

+ This is a custom font that is not installed on the system. +

+
+

Alignment +

+

+ Simple paragraphs can be used to create a document. Alignment can be used as you + already know. +

+

Left aligned +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. +

+

Center aligned

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. +

+

Right aligned

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. +

+

Justifed

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. +

+
+

Breakable lines

+ http://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg +
+

Transparent text

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit +

+
+

Preformatted text

+

+ The preformatted text is fully supported, like this C# code demo: +

+
 //Example of code using preformatted text
 public class HelloWorld
 {
@@ -100,84 +100,84 @@ 

Preformatted text

MessageBox.Show("Hello World"); } }
-
-
-

Lists

-

- Both UL and OL tags are supported, though, all the CSS properties related with lists - are not still fully supported.. The maximum you will get is bullets and numbers. - Image bullets and better numbering support may be added by next release. -

-

Unordered list -

-
    -
  • Item one
  • -
  • Item two -
      -
    • Sub item one
    • -
    • Sub item two
    • +
      +
      +

      Lists

      +

      + Both UL and OL tags are supported, though, all the CSS properties related with lists + are not still fully supported.. The maximum you will get is bullets and numbers. + Image bullets and better numbering support may be added by next release. +

      +

      Unordered list +

      +
        +
      • Item one
      • +
      • Item two
          -
        • Sub-sub item two
        • -
        • Sub-sub item two
        • +
        • Sub item one
        • +
        • Sub item two
        • +
            +
          • Sub-sub item two
          • +
          • Sub-sub item two
          • +
        -
      - -
    • Item three
    • -
    • Item four
    • -
    -

    Ordered list -

    -
      -
    1. Item one
    2. -
    3. Item two
    4. -
    5. Item three
    6. -
    -

    List nesting

    -
      -
    1. Item one
    2. -
    3. Item two
    4. -
    5. Item three -
        -
      • Item one
      • -
      • Item two
      • -
      • Item three
      • -
      -
    6. -
    7. Item four
    8. -
    9. Item five
    10. -
    -
    -
    -

    Right to left direction -

    -

    - It may not behave exactly like the specification says, but it can be useful if you - use it for right-to-left languages. All you have to do is to alter the direction - property like this: -

    -
    .myparagraph { direction:rtl; }
    -

    Left aligned -

    -

    - בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 -

    -

    Center aligned -

    -

    - בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 -

    -

    Right aligned -

    -

    - בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 -

    -

    Justifed -

    -

    - בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 -

    -
    +
  • +
  • Item three
  • +
  • Item four
  • +
+

Ordered list +

+
    +
  1. Item one
  2. +
  3. Item two
  4. +
  5. Item three
  6. +
+

List nesting

+
    +
  1. Item one
  2. +
  3. Item two
  4. +
  5. Item three +
      +
    • Item one
    • +
    • Item two
    • +
    • Item three
    • +
    +
  6. +
  7. Item four
  8. +
  9. Item five
  10. +
+
+
+

Right to left direction +

+

+ It may not behave exactly like the specification says, but it can be useful if you + use it for right-to-left languages. All you have to do is to alter the direction + property like this: +

+
.myparagraph { direction:rtl; }
+

Left aligned +

+

+ בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 +

+

Center aligned +

+

+ בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 +

+

Right aligned +

+

+ בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 +

+

Justifed +

+

+ בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 +

+
+
-
- - + + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/03.Tables.htm b/Source/Demo/Common/Samples/03.Tables.htm index 5155d2733..d44fe83fd 100644 --- a/Source/Demo/Common/Samples/03.Tables.htm +++ b/Source/Demo/Common/Samples/03.Tables.htm @@ -1,318 +1,313 @@ - - Tables - - - - -

- Tables

-
-
    -
  • Table captions are not yet supported.
  • -
  • align attribute of TABLE tag is not yet supported.
  • -
-

- Examples

-
- Regular table:
- - - - - - - - - - - - - - - - -
- Cell One - - Cell Two - - Cell Three -
- Cell Four - - Cell Five - - Cell Six -
- Cell Seven - - Cell Eight - - Cell Nine -
-
-
- Table with complex text and width=100% -
- - - - - - - - - - - -
-

- You can use all the well known tags and CSS properties to format text, fonts and - colors. -

-
    -
  • Colors, Colors, - Colors
  • -
  • Back colors, - Back colors, Back colors
  • -
  • Font style, - Font style, Font style, - Font style, Font style
  • -
-
- Cell Two - -
    -
  • Item one
  • -
  • Item two -
      -
    • Sub item one
    • -
    • Sub item two
    • -
    -
  • -
  • Item three
  • -
  • Item four
  • -
-
- Cell Four - -
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis - elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend - libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. - Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue.
-
- Cell Six -
-
-
- Table with colspans:
- - - - - - - - - - - - - - -
- Cell One - - Cell Two -
- Cell Four - - Cell Five - - Cell Six -
- Cell Seven - - Cell Eight -
-
-
- Table with rowspans:
- - - - - - - - - - - - - - -
- Cell One - - Cell Two - - Cell Three -
- Cell Five - - Cell Six -
- Cell Seven - - Cell Eight -
-

-

-
- Mixed spans:
- - - - - - - - - - - - -
- Cell One - - Cell Two -
- Cell Five - - Cell Six -
- Cell Seven -
-

-

-
- Table on table:
- - - - - - - - - - - - -
- Cell One - - Cell Two -
- Cell Five - - Cell Six -
- - - - - - - - - - - - -
- Cell One - - Cell Two -
- Cell Five - - Cell Six -
- Cell Seven -
-
-

-

-
- Thick border and spacing:
- - - - - - - - - - - - -
- Cell One - - Cell Two -
- Cell Five - - Cell Six -
- Cell Seven -
-

-

- - - - - - - - - - - - -
- Cell One - - Cell Two -
- Cell Five - - Cell Six -
- Cell Seven -
-

-

-
- - + + Tables + + + + +

+ Tables

+
+
    +
  • Table captions are not yet supported.
  • +
  • align attribute of TABLE tag is not yet supported.
  • +
+

+ Examples

+
+ Regular table:
+ + + + + + + + + + + + + + + + +
+ Cell One + + Cell Two + + Cell Three +
+ Cell Four + + Cell Five + + Cell Six +
+ Cell Seven + + Cell Eight + + Cell Nine +
+
+
+ Table with complex text and width=100% +
+ + + + + + + + + + + +
+

+ You can use all the well known tags and CSS properties to format text, fonts and + colors. +

+
    +
  • Colors, Colors, + Colors
  • +
  • Back colors, + Back colors, Back colors
  • +
  • Font style, + Font style, Font style, + Font style, Font style
  • +
+
+ Cell Two + +
    +
  • Item one
  • +
  • Item two +
      +
    • Sub item one
    • +
    • Sub item two
    • +
    +
  • +
  • Item three
  • +
  • Item four
  • +
+
+ Cell Four + +
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue.
+
+ Cell Six +
+
+
+ Table with colspans:
+ + + + + + + + + + + + + + +
+ Cell One + + Cell Two +
+ Cell Four + + Cell Five + + Cell Six +
+ Cell Seven + + Cell Eight +
+
+
+ Table with rowspans:
+ + + + + + + + + + + + + + +
+ Cell One + + Cell Two + + Cell Three +
+ Cell Five + + Cell Six +
+ Cell Seven + + Cell Eight +
+

+

+
+ Mixed spans:
+ + + + + + + + + + + + +
+ Cell One + + Cell Two +
+ Cell Five + + Cell Six +
+ Cell Seven +
+

+

+
+ Table on table:
+ + + + + + + + + + + + +
+ Cell One + + Cell Two +
+ Cell Five + + Cell Six +
+ + + + + + + + + + + + +
+ Cell One + + Cell Two +
+ Cell Five + + Cell Six +
+ Cell Seven +
+
+

+

+
+ Thick border and spacing:
+ + + + + + + + + + + + +
+ Cell One + + Cell Two +
+ Cell Five + + Cell Six +
+ Cell Seven +
+

+

+ + + + + + + + + + + + +
+ Cell One + + Cell Two +
+ Cell Five + + Cell Six +
+ Cell Seven +
+

+

+
+ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/04.Links.htm b/Source/Demo/Common/Samples/04.Links.htm index 8485a0914..05c8a5c79 100644 --- a/Source/Demo/Common/Samples/04.Links.htm +++ b/Source/Demo/Common/Samples/04.Links.htm @@ -1,68 +1,68 @@ - - Links - - - -

Links -

-
-

- HTML Renderer supports all html hyperlinks specification and code interception. -

-

-

URI href

- Any valid URI path will activate the default internet browser. -
- Check the context menu options on the link as well by right clicking on it. -
- This is a URI link to HTML Renderer (href="https://htmlrenderer.codeplex.com/") -

-

-

File path href

- Any file system path, It will be started as if you typed it on the Run Windows dialog. -
- This is a link to hard drive (href="C:\") -

-

-

Anchors href

- Link to elements on the page using element id will scroll to that element so it will be at the top. -
- This is a link to anchor at the bottom of the page (href="#anchor") -

-

-

Intercept

- Any link click can be intercepted by LinkClicked event, analyzed by link 'href' value or - other attributes of the link element and cancel the default processing those allowing custom handling. -
- This link is intercepted to show message box Hello! (href="SayHello") + + Links + + + +

Links +

+
+

+ HTML Renderer supports all html hyperlinks specification and code interception. +

+

+

URI href

+ Any valid URI path will activate the default internet browser. +
+ Check the context menu options on the link as well by right clicking on it. +
+ This is a URI link to HTML Renderer (href="https://htmlrenderer.codeplex.com/") +

+

+

File path href

+ Any file system path, It will be started as if you typed it on the Run Windows dialog. +
+ This is a link to hard drive (href="C:\") +

+

+

Anchors href

+ Link to elements on the page using element id will scroll to that element so it will be at the top. +
+ This is a link to anchor at the bottom of the page (href="#anchor") +

+

+

Intercept

+ Any link click can be intercepted by LinkClicked event, analyzed by link 'href' value or + other attributes of the link element and cancel the default processing those allowing custom handling. +
+ This link is intercepted to show message box Hello! (href="SayHello") -

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

- Anchor here -

-
- - +

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ Anchor here +

+
+ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/05.Images.htm b/Source/Demo/Common/Samples/05.Images.htm index bd76e5b3a..11dee9381 100644 --- a/Source/Demo/Common/Samples/05.Images.htm +++ b/Source/Demo/Common/Samples/05.Images.htm @@ -1,102 +1,96 @@ - - - - - - -

Images - -

-
-

- HTML Renderer supports img tag as well as CSS background-image property. -
- Image data can be provided by URI, file path, base64 encoded and code interception. + td { + vertical-align: middle; + padding: 1em; + } + + + +

Images + +

+
+

+ HTML Renderer supports img tag as well as CSS background-image property. +
+ Image data can be provided by URI, file path, base64 encoded and code interception. -

+

-

Loading image -

-

-

URI

-

-

-

File path

-

-

-

Base64 encoded

-

-

-

Intercept

-

-

img tag

-

- You can use Images anyway you like, apply borders margin and padding as for any - other box. -

- Limitation -
- Image align attribute and CSS float property are not yet supported. -
-

- - - - - - - - - - - - - - - - - - - - -
Just an image: - - -
Image with border and background: - - -
Stretched Image: - - -
Huge padding and border: - - -
Image in line - - with the text -
+

Loading image +

+

+

URI

+

+

+

File path

+

+

+

Base64 encoded

+

+

+

Intercept

+

+

img tag

+

+ You can use Images anyway you like, apply borders margin and padding as for any + other box. +

+ Limitation +
+ Image align attribute and CSS float property are not yet supported. +
+

+ + + + + + + + + + + + + + + + + + + + +
Just an image: + + +
Image with border and background: + + +
Stretched Image: + + +
Huge padding and border: + + +
Image in line + + with the text +
-

Background images -

+

Background images +

-
- - +
+ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/06.Embeded video.htm b/Source/Demo/Common/Samples/06.Embeded video.htm index 57cddc331..531da5c85 100644 --- a/Source/Demo/Common/Samples/06.Embeded video.htm +++ b/Source/Demo/Common/Samples/06.Embeded video.htm @@ -1,39 +1,39 @@ - - - - -

- Embeded video -

-
-

- Embeded video is an 'iframe' with 'src' pointing to the video hosted on the server.
- Obviously the Html Renderer doesn't support iframes so don't expect to see ActiveX - in the control that will stream the video, but the video thumbnail image, caption - string and play visualization is shown. Clicking on it will open the video - page on its site. -

-

- How does it works -

-
- The id of the video is extracted from the 'src' URL and using the server API gets - the video data is extracted: thumbnail image url, caption string and link url.
- Then, on the video frame location, the thumbnail image is shown with the caption - on top and a nice play button in the middle.
- When the user clicks on the video frame a link click events occures that opens the - actual video page, instead of video source. -
-

- Note: Because this technique requires server API it is currently supported - only for YouTube and - Vimeo. -

-

- Example -

- -

-
-

- Vimeo

-

- -

-
-

- Not video iframe

-

- -

- - - + +
+

+ Youtube

+

+ +

+
+

+ Vimeo

+

+ +

+
+

+ Not video iframe

+

+ +

+
+ + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/15.MaxWidth.htm b/Source/Demo/Common/TestSamples/15.MaxWidth.htm index 6db1c2cc6..d8b98e9ba 100644 --- a/Source/Demo/Common/TestSamples/15.MaxWidth.htm +++ b/Source/Demo/Common/TestSamples/15.MaxWidth.htm @@ -1,36 +1,36 @@ - -
-

- Line that cannot be splitted

-

-

The text should not exceed max width:
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis - elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend - libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. - Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. Nullam lobortis - egestas risus. Nulla elementum dolor ac mauris. Ut tristique. In varius volutpat - metus. Integer leo dolor, tristique a, dignissim ac, iaculis eget, elit. Donec arcu. -

-

-

Long line without whitespaces:
- http://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg/afsdgadfgafg -

-

-

The text should not exceed max width:
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis - elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend - libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. - Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. Nullam lobortis - egestas risus. Nulla elementum dolor ac mauris. Ut tristique. In varius volutpat - metus. Integer leo dolor, tristique a, dignissim ac, iaculis eget, elit. Donec arcu. -

-
The image should also be limited by size because it has: style="width:90%"
- - -

- -

-
- - + +
+

+ Line that cannot be splitted

+

+

The text should not exceed max width:
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. Nullam lobortis + egestas risus. Nulla elementum dolor ac mauris. Ut tristique. In varius volutpat + metus. Integer leo dolor, tristique a, dignissim ac, iaculis eget, elit. Donec arcu. +

+

+

Long line without whitespaces:
+ http://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg/afsdgadfgafg +

+

+

The text should not exceed max width:
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. Nullam lobortis + egestas risus. Nulla elementum dolor ac mauris. Ut tristique. In varius volutpat + metus. Integer leo dolor, tristique a, dignissim ac, iaculis eget, elit. Donec arcu. +

+
The image should also be limited by size because it has: style="width:90%"
+ + +

+ +

+
+ + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/16.Borders.htm b/Source/Demo/Common/TestSamples/16.Borders.htm index b8cc92ca7..6fae0757c 100644 --- a/Source/Demo/Common/TestSamples/16.Borders.htm +++ b/Source/Demo/Common/TestSamples/16.Borders.htm @@ -1,46 +1,46 @@ - -
-

-

- simple border 1px -
-

-

-

- simple border 3px -
-

-

-

- border 1px with corner-radius 5px -
-

-

-

- border 2px with corner-radius 10px -
-

-

-

- dotted border 1px -
-

-

-

- dotted border 3px -
-

-

-

- dashed border 1px -
-

-

-

- dashed border 2px with corner-radius 10px -
-

-
- - + +
+

+

+ simple border 1px +
+

+

+

+ simple border 3px +
+

+

+

+ border 1px with corner-radius 5px +
+

+

+

+ border 2px with corner-radius 10px +
+

+

+

+ dotted border 1px +
+

+

+

+ dotted border 3px +
+

+

+

+ dashed border 1px +
+

+

+

+ dashed border 2px with corner-radius 10px +
+

+
+ + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/17.Languages.htm b/Source/Demo/Common/TestSamples/17.Languages.htm index 7efa5d29e..bc8c93f2e 100644 --- a/Source/Demo/Common/TestSamples/17.Languages.htm +++ b/Source/Demo/Common/TestSamples/17.Languages.htm @@ -1,48 +1,48 @@  - -
-

Validate Unicode rendering

-

العربية

-

Bahasa Indonesia

-

Bahasa Melayu

-

Български

-

Català

-

Česky

-

Dansk

-

Deutsch

-

Eesti

-

Ελληνικά

-

Español

-

Esperanto

-

Euskara

-

فارسی

-

Français

-

Galego

-

한국어

-

עברית

-

Hrvatski

-

Italiano

-

Lietuvių

-

Magyar

-

Nederlands

-

日本語

-

Norsk bokmål

-

Norsk nynorsk

-

Polski

-

Português

-

Română

-

Русский

-

Slovenčina

-

Slovenščina

-

Српски / srpski

-

Srpskohrvatski / српскохрватски

-

Suomi

-

Svenska

-

ไทย

-

Tiếng Việt

-

Türkçe

-

Українська

-

中文

-
- - + +
+

Validate Unicode rendering

+

العربية

+

Bahasa Indonesia

+

Bahasa Melayu

+

Български

+

Català

+

Česky

+

Dansk

+

Deutsch

+

Eesti

+

Ελληνικά

+

Español

+

Esperanto

+

Euskara

+

فارسی

+

Français

+

Galego

+

한국어

+

עברית

+

Hrvatski

+

Italiano

+

Lietuvių

+

Magyar

+

Nederlands

+

日本語

+

Norsk bokmål

+

Norsk nynorsk

+

Polski

+

Português

+

Română

+

Русский

+

Slovenčina

+

Slovenščina

+

Српски / srpski

+

Srpskohrvatski / српскохрватски

+

Suomi

+

Svenska

+

ไทย

+

Tiếng Việt

+

Türkçe

+

Українська

+

中文

+
+ + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/18.Anchors.htm b/Source/Demo/Common/TestSamples/18.Anchors.htm index a5361400c..25a0be881 100644 --- a/Source/Demo/Common/TestSamples/18.Anchors.htm +++ b/Source/Demo/Common/TestSamples/18.Anchors.htm @@ -1,61 +1,61 @@  - -

- See also Chapter 4. -
- See also Chapter 12. -

+ +

+ See also Chapter 4. +
+ See also Chapter 12. +

-

Chapter 1

-

This chapter explains ba bla bla

+

Chapter 1

+

This chapter explains ba bla bla

-

Chapter 2

-

This chapter explains ba bla bla

+

Chapter 2

+

This chapter explains ba bla bla

-

Chapter 3

-

This chapter explains ba bla bla

+

Chapter 3

+

This chapter explains ba bla bla

-

Chapter 4

-

This chapter explains ba bla bla

+

Chapter 4

+

This chapter explains ba bla bla

-

Chapter 5

-

This chapter explains ba bla bla

+

Chapter 5

+

This chapter explains ba bla bla

-

Chapter 6

-

This chapter explains ba bla bla

+

Chapter 6

+

This chapter explains ba bla bla

-

Chapter 7

-

This chapter explains ba bla bla

+

Chapter 7

+

This chapter explains ba bla bla

-

Chapter 8

-

This chapter explains ba bla bla

+

Chapter 8

+

This chapter explains ba bla bla

-

Chapter 9

-

This chapter explains ba bla bla

+

Chapter 9

+

This chapter explains ba bla bla

-

Chapter 10

-

This chapter explains ba bla bla

+

Chapter 10

+

This chapter explains ba bla bla

-

Chapter 11

-

This chapter explains ba bla bla

+

Chapter 11

+

This chapter explains ba bla bla

-

Chapter 12

-

This chapter explains ba bla bla

+

Chapter 12

+

This chapter explains ba bla bla

-

Chapter 13

-

This chapter explains ba bla bla

+

Chapter 13

+

This chapter explains ba bla bla

-

Chapter 14

-

This chapter explains ba bla bla

+

Chapter 14

+

This chapter explains ba bla bla

-

Chapter 15

-

This chapter explains ba bla bla

+

Chapter 15

+

This chapter explains ba bla bla

-

Chapter 16

-

This chapter explains ba bla bla

+

Chapter 16

+

This chapter explains ba bla bla

-

Chapter 17

-

This chapter explains ba bla bla

+

Chapter 17

+

This chapter explains ba bla bla

- - + + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/19.Many images.htm b/Source/Demo/Common/TestSamples/19.Many images.htm index baddb58e2..a7cd2582c 100644 --- a/Source/Demo/Common/TestSamples/19.Many images.htm +++ b/Source/Demo/Common/TestSamples/19.Many images.htm @@ -1,103 +1,103 @@  - -

Contains many images that should not load until in scroll view

-

Image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- -

Another image

- - - + +

Contains many images that should not load until in scroll view

+

Image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ +

Another image

+ + + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/20.Fonts decorations.htm b/Source/Demo/Common/TestSamples/20.Fonts decorations.htm index 63944621d..ffebc198f 100644 --- a/Source/Demo/Common/TestSamples/20.Fonts decorations.htm +++ b/Source/Demo/Common/TestSamples/20.Fonts decorations.htm @@ -1,232 +1,232 @@  - -

All fonts with different decorations

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

-

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+ +

All fonts with different decorations

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

+

Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230 | Text, ABCgjwzqh. 1230

- + } + var str = sb.ToString(); + --> - - + + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/21.Bullets.htm b/Source/Demo/Common/TestSamples/21.Bullets.htm index 10782fd6c..a677321b1 100644 --- a/Source/Demo/Common/TestSamples/21.Bullets.htm +++ b/Source/Demo/Common/TestSamples/21.Bullets.htm @@ -1,10 +1,10 @@  - -

Unordered list -

-
    -
  • Item one
  • -
  • Item two + +

    Unordered list +

    +
      +
    • Item one
    • +
    • Item two
      • Sub item one
      • Sub item two
      • @@ -13,62 +13,62 @@

        Unordered list
      • Sub-sub item two
    -
  • -
  • Item three
  • -
  • Item four
  • -
-

Ordered list -

-
    -
  1. Item one
  2. -
  3. Item two
  4. -
  5. Item three
  6. -
-

List type: upper-roman

-
    -
  1. Item one
  2. -
  3. Item two
  4. -
  5. Item three
  6. -
  7. Item four
  8. -
  9. Item five
  10. -
-

List type: upper-alpha

-
    -
  1. Item one
  2. -
  3. Item two
  4. -
  5. Item three
  6. -
  7. Item four
  8. -
  9. Item five
  10. -
-

List type: georgian

-
    -
  1. Item one
  2. -
  3. Item two
  4. -
  5. Item three
  6. -
  7. Item four
  8. -
  9. Item five
  10. -
-

List type: hebrew

-
    -
  1. Item one
  2. -
  3. Item two
  4. -
  5. Item three
  6. -
  7. Item four
  8. -
  9. Item five
  10. -
-

Ordered list reversed -

-
    -
  1. Item one
  2. -
  3. Item two
  4. -
  5. Item three
  6. -
-

Ordered list starting at 15 -

-
    -
  1. Item one
  2. -
  3. Item two
  4. -
  5. Item three
  6. -
- - + +
  • Item three
  • +
  • Item four
  • + +

    Ordered list +

    +
      +
    1. Item one
    2. +
    3. Item two
    4. +
    5. Item three
    6. +
    +

    List type: upper-roman

    +
      +
    1. Item one
    2. +
    3. Item two
    4. +
    5. Item three
    6. +
    7. Item four
    8. +
    9. Item five
    10. +
    +

    List type: upper-alpha

    +
      +
    1. Item one
    2. +
    3. Item two
    4. +
    5. Item three
    6. +
    7. Item four
    8. +
    9. Item five
    10. +
    +

    List type: georgian

    +
      +
    1. Item one
    2. +
    3. Item two
    4. +
    5. Item three
    6. +
    7. Item four
    8. +
    9. Item five
    10. +
    +

    List type: hebrew

    +
      +
    1. Item one
    2. +
    3. Item two
    4. +
    5. Item three
    6. +
    7. Item four
    8. +
    9. Item five
    10. +
    +

    Ordered list reversed +

    +
      +
    1. Item one
    2. +
    3. Item two
    4. +
    5. Item three
    6. +
    +

    Ordered list starting at 15 +

    +
      +
    1. Item one
    2. +
    3. Item two
    4. +
    5. Item three
    6. +
    + + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/22.RTL.htm b/Source/Demo/Common/TestSamples/22.RTL.htm index 0b0322882..35bf9bf6c 100644 --- a/Source/Demo/Common/TestSamples/22.RTL.htm +++ b/Source/Demo/Common/TestSamples/22.RTL.htm @@ -1,18 +1,18 @@  - -
    -
    שלום עולם, יש ברבורים בעגם הזה
    -
    -
    שלום עולם, יש ברבורים בעגם הזה
    -
    שלום עולם, יש ברבורים בעגם הזה
    -
    -
    -
    -
    שלום עולם,hello world יש ברבורים בעגם הזה
    -
    -
    שלום עולם, יש ברבורים בעגם הזה
    -
    שלום עולם, יש ברבורים בעגם הזה
    -
    -
    - - + +
    +
    שלום עולם, יש ברבורים בעגם הזה
    +
    +
    שלום עולם, יש ברבורים בעגם הזה
    +
    שלום עולם, יש ברבורים בעגם הזה
    +
    +
    +
    +
    שלום עולם,hello world יש ברבורים בעגם הזה
    +
    +
    שלום עולם, יש ברבורים בעגם הזה
    +
    שלום עולם, יש ברבורים בעגם הזה
    +
    +
    + + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/30.Misc.htm b/Source/Demo/Common/TestSamples/30.Misc.htm index 78648f91c..db4dd6625 100644 --- a/Source/Demo/Common/TestSamples/30.Misc.htm +++ b/Source/Demo/Common/TestSamples/30.Misc.htm @@ -35,4 +35,4 @@

    this-is-a-test@example.com

    - + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/31.ACID 1.htm b/Source/Demo/Common/TestSamples/31.ACID 1.htm index a8b877f3a..3545bf464 100644 --- a/Source/Demo/Common/TestSamples/31.ACID 1.htm +++ b/Source/Demo/Common/TestSamples/31.ACID 1.htm @@ -1,162 +1,156 @@ - - display/box/float/clear test - - - -
    -
    toggle
    -
    -
      -
    • the way
    • -
    • -

      - the world ends -

      -
      + h1 { + background-color: black; + color: white; + float: left; + margin: 1em 0; + border: 0; + padding: 1em; + width: 10em; + height: 10em; + font-weight: normal; + font-size: 1em; + } + + + +
      +
      toggle
      +
      +
        +
      • the way
      • +
      • - bang - + the world ends

        -

        - whimper - -

        -
      • - -
      • i grow old
      • -
      • pluot?
      • -
      -
      -
      - bar maids, -
      -
      -

      sing to me, erbarme dich

      -
      -
      -

      - This is a nonsensical document, but syntactically valid HTML 4.0. All 100%-conformant CSS1 agents should be able to render the document elements above this paragraph indistinguishably (to the pixel) from this reference rendering, (except font rasterization and form widgets). All discrepancies should be traceable to CSS1 implementation shortcomings. Once you have finished evaluating this test, you can return to the parent page. -

      - - +
      +

      + bang + +

      +

      + whimper + +

      +
      +
    • +
    • i grow old
    • +
    • pluot?
    • +
    +
    +
    + bar maids, +
    +
    +

    sing to me, erbarme dich

    +
    +
    +

    + This is a nonsensical document, but syntactically valid HTML 4.0. All 100%-conformant CSS1 agents should be able to render the document elements above this paragraph indistinguishably (to the pixel) from this reference rendering, (except font rasterization and form widgets). All discrepancies should be traceable to CSS1 implementation shortcomings. Once you have finished evaluating this test, you can return to the parent page. +

    + + \ No newline at end of file diff --git a/Source/Demo/WPF/App.xaml.cs b/Source/Demo/WPF/App.xaml.cs index 446c406ae..1c60a944e 100644 --- a/Source/Demo/WPF/App.xaml.cs +++ b/Source/Demo/WPF/App.xaml.cs @@ -16,6 +16,5 @@ namespace HtmlRenderer.Demo.WPF /// Interaction logic for App.xaml ///
    public partial class App - { - } -} + { } +} \ No newline at end of file diff --git a/Source/Demo/WPF/DemoWindow.xaml b/Source/Demo/WPF/DemoWindow.xaml index 00aa5bba5..3d31dd352 100644 --- a/Source/Demo/WPF/DemoWindow.xaml +++ b/Source/Demo/WPF/DemoWindow.xaml @@ -4,19 +4,19 @@ Title="HTML Renderer WPF Demo" Height="486" Width="691"> - - - + + + - - - + + + - + diff --git a/Source/Demo/WPF/DemoWindow.xaml.cs b/Source/Demo/WPF/DemoWindow.xaml.cs index fbe3797bb..e732ac790 100644 --- a/Source/Demo/WPF/DemoWindow.xaml.cs +++ b/Source/Demo/WPF/DemoWindow.xaml.cs @@ -25,6 +25,6 @@ public DemoWindow() } private void OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) - {} + { } } } \ No newline at end of file diff --git a/Source/Demo/WPF/Properties/AssemblyInfo.cs b/Source/Demo/WPF/Properties/AssemblyInfo.cs index cb330edcc..5170b120d 100644 --- a/Source/Demo/WPF/Properties/AssemblyInfo.cs +++ b/Source/Demo/WPF/Properties/AssemblyInfo.cs @@ -5,6 +5,7 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("HtmlRenderer.Demo.WPF")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -17,6 +18,7 @@ // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. + [assembly: ComVisible(false)] //In order to begin building localizable applications, set @@ -36,7 +38,7 @@ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located //(used if a resource is not found in the page, // app, or any theme specific resource dictionaries) -)] + )] // Version information for an assembly consists of the following four values: @@ -49,5 +51,6 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] + [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Source/Demo/WinForms/DemoForm.cs b/Source/Demo/WinForms/DemoForm.cs index 368041f25..e351e5823 100644 --- a/Source/Demo/WinForms/DemoForm.cs +++ b/Source/Demo/WinForms/DemoForm.cs @@ -16,10 +16,10 @@ using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Text; +using System.IO; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; -using System.IO; using HtmlRenderer.Demo.Common; using HtmlRenderer.Entities; using HtmlRenderer.WinForms; @@ -30,7 +30,7 @@ namespace HtmlRenderer.Demo.WinForms public partial class DemoForm : Form { #region Fields and Consts - + /// /// the name of the tree node root for all performance samples /// @@ -60,7 +60,7 @@ public partial class DemoForm : Form /// used ignore html editor updates when updating seperatly /// private bool _updateLock; - + #endregion @@ -82,10 +82,10 @@ public DemoForm() _htmlToolTip.SetToolTip(_htmlPanel, Resources.Tooltip); _htmlEditor.Font = new Font(FontFamily.GenericMonospace, 10); - + StartPosition = FormStartPosition.CenterScreen; var size = Screen.GetWorkingArea(Point.Empty); - Size = new Size((int) (size.Width*0.7), (int) (size.Height*0.8)); + Size = new Size((int)(size.Width * 0.7), (int)(size.Height * 0.8)); LoadSamples(); @@ -114,7 +114,7 @@ private void LoadSamples() var showcaseRoot = new TreeNode("HTML Renderer"); _samplesTreeView.Nodes.Add(showcaseRoot); - foreach(var sample in SamplesLoader.ShowcaseSamples) + foreach (var sample in SamplesLoader.ShowcaseSamples) { _perfTestSamples.Add(sample.Html); AddTreeNode(showcaseRoot, sample); @@ -128,17 +128,17 @@ private void LoadSamples() AddTreeNode(testSamplesRoot, sample); } - if( SamplesLoader.PerformanceSamples.Count > 0 ) + if (SamplesLoader.PerformanceSamples.Count > 0) { var perfTestSamplesRoot = new TreeNode(PerformanceSamplesTreeNodeName); _samplesTreeView.Nodes.Add(perfTestSamplesRoot); - foreach(var sample in SamplesLoader.PerformanceSamples) + foreach (var sample in SamplesLoader.PerformanceSamples) { AddTreeNode(perfTestSamplesRoot, sample); } } - + showcaseRoot.Expand(); if (showcaseRoot.Nodes.Count > 0) @@ -268,7 +268,7 @@ private void OnToggleWebBrowserButton_Click(object sender, EventArgs e) _splitter.Visible = _webBrowser.Visible; _toggleWebBrowserButton.Text = _webBrowser.Visible ? "Hide IE View" : "Show IE View"; - if(_webBrowser.Visible) + if (_webBrowser.Visible) { _webBrowser.Width = _splitContainer2.Panel2.Width / 2; UpdateWebBrowserHtml(); @@ -295,16 +295,16 @@ private string GetFixedHtml() var html = _htmlEditor.Text; html = Regex.Replace(html, @"src=\""(\w.*?)\""", match => + { + var img = TryLoadResourceImage(match.Groups[1].Value); + if (img != null) { - var img = TryLoadResourceImage(match.Groups[1].Value); - if (img != null) - { - var tmpFile = Path.GetTempFileName(); - img.Save(tmpFile, ImageFormat.Jpeg); - return string.Format("src=\"{0}\"", tmpFile); - } - return match.Value; - }, RegexOptions.IgnoreCase); + var tmpFile = Path.GetTempFileName(); + img.Save(tmpFile, ImageFormat.Jpeg); + return string.Format("src=\"{0}\"", tmpFile); + } + return match.Value; + }, RegexOptions.IgnoreCase); html = Regex.Replace(html, @"href=\""(\w.*?)\""", match => { @@ -343,7 +343,7 @@ private void OnReloadColorsLinkClicked(object sender, LinkLabelLinkClickedEventA private static void OnStylesheetLoad(object sender, HtmlStylesheetLoadEventArgs e) { var stylesheet = GetStylesheet(e.Src); - if(stylesheet != null) + if (stylesheet != null) e.SetStyleSheet = stylesheet; } @@ -381,7 +381,7 @@ private void OnImageLoad(object sender, HtmlImageLoadEventArgs e) { var img = TryLoadResourceImage(e.Src); - if(!e.Handled && e.Attributes != null) + if (!e.Handled && e.Attributes != null) { if (e.Attributes.ContainsKey("byevent")) { @@ -390,10 +390,10 @@ private void OnImageLoad(object sender, HtmlImageLoadEventArgs e) { e.Handled = true; ThreadPool.QueueUserWorkItem(state => - { - Thread.Sleep(delay); - e.Callback("https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-snc7/c0.44.403.403/p403x403/318890_10151195988833836_1081776452_n.jpg"); - }); + { + Thread.Sleep(delay); + e.Callback("https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-snc7/c0.44.403.403/p403x403/318890_10151195988833836_1081776452_n.jpg"); + }); return; } else @@ -470,7 +470,7 @@ private static void OnRenderError(object sender, HtmlRenderErrorEventArgs e) /// private static void OnLinkClicked(object sender, HtmlLinkClickedEventArgs e) { - if(e.Link == "SayHello") + if (e.Link == "SayHello") { MessageBox.Show("Hello you!"); e.Handled = true; @@ -537,17 +537,17 @@ private void OnRunTestButtonClick(object sender, EventArgs e) #endif float htmlSize = 0; foreach (var sample in _perfTestSamples) - htmlSize += sample.Length*2; - htmlSize = htmlSize/1024f; + htmlSize += sample.Length * 2; + htmlSize = htmlSize / 1024f; var msg = string.Format("{0} HTMLs ({1:N0} KB)\r\n{2} Iterations", _perfTestSamples.Count, htmlSize, iterations); msg += "\r\n\r\n"; msg += string.Format("CPU:\r\nTotal: {0} msec\r\nIterationAvg: {1:N2} msec\r\nSingleAvg: {2:N2} msec", - sw.ElapsedMilliseconds, sw.ElapsedMilliseconds/(double) iterations, sw.ElapsedMilliseconds/(double) iterations/_perfTestSamples.Count); + sw.ElapsedMilliseconds, sw.ElapsedMilliseconds / (double)iterations, sw.ElapsedMilliseconds / (double)iterations / _perfTestSamples.Count); msg += "\r\n\r\n"; msg += string.Format("Memory:\r\nTotal: {0:N0} KB\r\nIterationAvg: {1:N0} KB\r\nSingleAvg: {2:N0} KB\r\nOverhead: {3:N0}%", - totalMem, totalMem/iterations, totalMem/iterations/_perfTestSamples.Count, 100*(totalMem/iterations)/htmlSize); + totalMem, totalMem / iterations, totalMem / iterations / _perfTestSamples.Count, 100 * (totalMem / iterations) / htmlSize); Clipboard.SetDataObject(msg); MessageBox.Show(msg, "Test run results"); diff --git a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj index 9f081d4a4..7b12011c3 100644 --- a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj @@ -10,7 +10,7 @@ Properties HtmlRenderer.Demo.WinForms HtmlRendererWinFormsDemo - v2.0 + v4.0 @@ -31,8 +31,7 @@ false false true - - + Client true diff --git a/Source/Demo/WinForms/PerfForm.cs b/Source/Demo/WinForms/PerfForm.cs index e18c78877..0e8197000 100644 --- a/Source/Demo/WinForms/PerfForm.cs +++ b/Source/Demo/WinForms/PerfForm.cs @@ -14,11 +14,11 @@ using System.Collections.Generic; using System.Diagnostics; using System.Drawing; +using System.IO; +using System.Reflection; using System.Text; using System.Threading; using System.Windows.Forms; -using System.Reflection; -using System.IO; using HtmlRenderer.WinForms; namespace HtmlRenderer.Demo.WinForms @@ -137,7 +137,7 @@ private void LoadSamples() { var root = new TreeNode("HTML Renderer"); _samplesTreeView.Nodes.Add(root); - + var names = Assembly.GetExecutingAssembly().GetManifestResourceNames(); Array.Sort(names); foreach (string name in names) @@ -159,7 +159,7 @@ private void LoadSamples() _samples[name] = sreader.ReadToEnd(); } - string nameWithSzie = string.Format("{0} ({1:N0} KB)", shortName, _samples[name].Length*2/1024); + string nameWithSzie = string.Format("{0} ({1:N0} KB)", shortName, _samples[name].Length * 2 / 1024); var node = new TreeNode(nameWithSzie); root.Nodes.Add(node); node.Tag = name; @@ -167,7 +167,7 @@ private void LoadSamples() } } } - + root.Expand(); } @@ -192,7 +192,7 @@ private void OnClearLinkClicked(object sender, LinkLabelLinkClickedEventArgs e) _htmlPanel.Text = null; GC.Collect(); } - + /// /// Execute performance test by setting all sample htmls in a loop. /// @@ -206,7 +206,7 @@ private void OnRunTestButtonClick(object sender, EventArgs e) var iterations = (float)_iterations.Value; var html = _samples[(string)_samplesTreeView.SelectedNode.Tag]; - + GC.Collect(); #if NET_40 AppDomain.MonitoringIsEnabled = true; @@ -233,10 +233,10 @@ private void OnRunTestButtonClick(object sender, EventArgs e) var msg = string.Format("1 HTML ({0:N0} KB)\r\n{1} Iterations", htmlSize, _iterations.Value); msg += "\r\n\r\n"; msg += string.Format("CPU:\r\nTotal: {0} msec\r\nIterationAvg: {1:N2} msec", - sw.ElapsedMilliseconds, sw.ElapsedMilliseconds / iterations); + sw.ElapsedMilliseconds, sw.ElapsedMilliseconds / iterations); msg += "\r\n\r\n"; msg += string.Format("Memory:\r\nTotal: {0:N0} KB\r\nIterationAvg: {1:N0} KB\r\nOverhead: {2:N0}%", - totalMem, totalMem / iterations, 100 * (totalMem / iterations) / htmlSize); + totalMem, totalMem / iterations, 100 * (totalMem / iterations) / htmlSize); Clipboard.SetDataObject(msg); MessageBox.Show(msg, "Test run results"); diff --git a/Source/Demo/WinForms/Program.cs b/Source/Demo/WinForms/Program.cs index 989a08bb2..2085ace11 100644 --- a/Source/Demo/WinForms/Program.cs +++ b/Source/Demo/WinForms/Program.cs @@ -15,7 +15,7 @@ namespace HtmlRenderer.Demo.WinForms { - static class Program + internal static class Program { /// /// The main entry point for the application. @@ -27,9 +27,9 @@ private static void Main() Application.SetCompatibleTextRenderingDefault(false); Application.Run(new DemoForm()); -// Application.Run(new PerfForm()); + // Application.Run(new PerfForm()); -// PerfForm.Run(); + // PerfForm.Run(); } } } \ No newline at end of file diff --git a/Source/Demo/WinForms/Properties/AssemblyInfo.cs b/Source/Demo/WinForms/Properties/AssemblyInfo.cs index 877c916ea..e1f90f304 100644 --- a/Source/Demo/WinForms/Properties/AssemblyInfo.cs +++ b/Source/Demo/WinForms/Properties/AssemblyInfo.cs @@ -4,6 +4,7 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("Html Demo")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -16,9 +17,11 @@ // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. + [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM + [assembly: Guid("3098581d-210a-4748-bcda-4b9a6b34a91a")] // Version information for an assembly consists of the following four values: @@ -28,5 +31,6 @@ // Build Number // Revision // + [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Source/Demo/WinForms/SampleForm.cs b/Source/Demo/WinForms/SampleForm.cs index 24b139e90..4caf938e2 100644 --- a/Source/Demo/WinForms/SampleForm.cs +++ b/Source/Demo/WinForms/SampleForm.cs @@ -39,7 +39,7 @@ private void OnHtmlPanelClick(object sender, EventArgs e) private void OnHtmlLabelHostingPanelPaint(object sender, PaintEventArgs e) { var bmp = new Bitmap(10, 10); - + using (var g = Graphics.FromImage(bmp)) { g.Clear(Color.White); @@ -47,7 +47,7 @@ private void OnHtmlLabelHostingPanelPaint(object sender, PaintEventArgs e) g.FillRectangle(SystemBrushes.Control, new Rectangle(5, 5, 5, 5)); } - using (var b = new TextureBrush(bmp, WrapMode.Tile)) + using (var b = new TextureBrush(bmp, WrapMode.Tile)) { e.Graphics.FillRectangle(b, _htmlLabelHostingPanel.ClientRectangle); } diff --git a/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs index 828b195cb..b25474e52 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs @@ -59,4 +59,4 @@ public void Dispose() } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs index 15b10ac0b..e6e8dff52 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs @@ -102,4 +102,4 @@ public void Dispose() _contextMenu.Dispose(); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs index de1237770..bd77ac532 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs @@ -31,7 +31,7 @@ internal sealed class ControlAdapter : IControl /// /// Use GDI+ text rendering to measure/draw text. /// - private bool _useGdiPlusTextRendering; + private readonly bool _useGdiPlusTextRendering; /// /// Init. @@ -139,4 +139,4 @@ public void Invalidate() _control.Invalidate(); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs index 97503bcb6..367494374 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs @@ -48,7 +48,6 @@ internal sealed class FontAdapter : IFont /// private double _whitespaceWidth = -1; - #endregion @@ -142,4 +141,4 @@ internal void SetMetrics(int height, int underlineOffset) _underlineOffset = underlineOffset; } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs index 3f3efc06e..128e854cb 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs @@ -49,4 +49,4 @@ public string Name get { return _fontFamily.Name; } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs index f3e232625..73de08dba 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs @@ -174,4 +174,4 @@ protected internal override IFont CreateFont(IFontFamily family, double size, RF return new FontAdapter(new Font(((FontFamilyAdapter)family).FontFamily, (float)size, fontStyle)); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs index 641522427..63a539bb3 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs @@ -66,4 +66,4 @@ public void Dispose() _graphicsPath.Dispose(); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs index bf6ecb445..f2793ec54 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs @@ -76,4 +76,4 @@ public void Dispose() _image.Dispose(); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs index f6a981565..cc8824b7e 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs @@ -99,4 +99,4 @@ public double[] DashPattern } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/HtmlLabel.cs b/Source/HtmlRenderer.WinForms/HtmlLabel.cs index 517517ad4..01cfd6685 100644 --- a/Source/HtmlRenderer.WinForms/HtmlLabel.cs +++ b/Source/HtmlRenderer.WinForms/HtmlLabel.cs @@ -11,9 +11,9 @@ // "The Art of War" using System; +using System.ComponentModel; using System.Diagnostics; using System.Drawing; -using System.ComponentModel; using System.Drawing.Text; using System.Windows.Forms; using HtmlRenderer.Core; @@ -730,4 +730,4 @@ public override Cursor Cursor #endregion } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/HtmlPanel.cs b/Source/HtmlRenderer.WinForms/HtmlPanel.cs index 3652cfdc5..e6e74deb0 100644 --- a/Source/HtmlRenderer.WinForms/HtmlPanel.cs +++ b/Source/HtmlRenderer.WinForms/HtmlPanel.cs @@ -11,9 +11,9 @@ // "The Art of War" using System; +using System.ComponentModel; using System.Diagnostics; using System.Drawing; -using System.ComponentModel; using System.Drawing.Text; using System.Windows.Forms; using HtmlRenderer.Core; @@ -743,6 +743,7 @@ private void OnScrollChange(object sender, HtmlScrollEventArgs e) #endregion + #region Hide not relevant properties from designer /// @@ -807,6 +808,7 @@ public override Cursor Cursor #endregion + #endregion } } \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/HtmlRender.cs b/Source/HtmlRenderer.WinForms/HtmlRender.cs index db0857c07..98d523872 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRender.cs +++ b/Source/HtmlRenderer.WinForms/HtmlRender.cs @@ -148,7 +148,7 @@ public static CssData ParseStyleSheet(string stylesheet, bool combineWithDefault /// optional: can be used to overwrite image resolution logic /// the size required for the html public static SizeF Measure(Graphics g, string html, float maxWidth = 0, CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { ArgChecker.AssertArgNotNull(g, "g"); return Measure(g, html, maxWidth, cssData, false, stylesheetLoad, imageLoad); @@ -168,7 +168,7 @@ public static SizeF Measure(Graphics g, string html, float maxWidth = 0, CssData /// optional: can be used to overwrite image resolution logic /// the size required for the html public static SizeF MeasureGdiPlus(Graphics g, string html, float maxWidth = 0, CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { ArgChecker.AssertArgNotNull(g, "g"); return Measure(g, html, maxWidth, cssData, true, stylesheetLoad, imageLoad); @@ -191,7 +191,7 @@ public static SizeF MeasureGdiPlus(Graphics g, string html, float maxWidth = 0, /// optional: can be used to overwrite image resolution logic /// the actual size of the rendered html public static SizeF Render(Graphics g, string html, float left = 0, float top = 0, float maxWidth = 0, CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { ArgChecker.AssertArgNotNull(g, "g"); return RenderClip(g, html, new PointF(left, top), new SizeF(maxWidth, 0), cssData, false, stylesheetLoad, imageLoad); @@ -215,7 +215,7 @@ public static SizeF Render(Graphics g, string html, float left = 0, float top = /// optional: can be used to overwrite image resolution logic /// the actual size of the rendered html public static SizeF Render(Graphics g, string html, PointF location, SizeF maxSize, CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { ArgChecker.AssertArgNotNull(g, "g"); return RenderClip(g, html, location, maxSize, cssData, false, stylesheetLoad, imageLoad); @@ -238,7 +238,7 @@ public static SizeF Render(Graphics g, string html, PointF location, SizeF maxSi /// optional: can be used to overwrite image resolution logic /// the actual size of the rendered html public static SizeF RenderGdiPlus(Graphics g, string html, float left = 0, float top = 0, float maxWidth = 0, CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { ArgChecker.AssertArgNotNull(g, "g"); return RenderClip(g, html, new PointF(left, top), new SizeF(maxWidth, 0), cssData, true, stylesheetLoad, imageLoad); @@ -262,7 +262,7 @@ public static SizeF RenderGdiPlus(Graphics g, string html, float left = 0, float /// optional: can be used to overwrite image resolution logic /// the actual size of the rendered html public static SizeF RenderGdiPlus(Graphics g, string html, PointF location, SizeF maxSize, CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { ArgChecker.AssertArgNotNull(g, "g"); return RenderClip(g, html, location, maxSize, cssData, true, stylesheetLoad, imageLoad); @@ -282,7 +282,7 @@ public static SizeF RenderGdiPlus(Graphics g, string html, PointF location, Size /// optional: can be used to overwrite stylesheet resolution logic /// optional: can be used to overwrite image resolution logic public static void RenderToImage(Image image, string html, PointF location = new PointF(), CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { ArgChecker.AssertArgNotNull(image, "image"); var maxSize = new SizeF(image.Size.Width - location.X, image.Size.Height - location.Y); @@ -303,7 +303,7 @@ public static SizeF RenderGdiPlus(Graphics g, string html, PointF location, Size /// optional: can be used to overwrite stylesheet resolution logic /// optional: can be used to overwrite image resolution logic public static void RenderToImage(Image image, string html, PointF location, SizeF maxSize, CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { ArgChecker.AssertArgNotNull(image, "image"); @@ -351,7 +351,7 @@ public static void RenderToImage(Image image, string html, PointF location, Size /// the generated image of the html /// if is . public static Image RenderToImage(string html, Size size, Color backgroundColor = new Color(), CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { if (backgroundColor == Color.Transparent) throw new ArgumentOutOfRangeException("backgroundColor", "Transparent background in not supported"); @@ -408,7 +408,7 @@ public static void RenderToImage(Image image, string html, PointF location, Size /// the generated image of the html /// if is . public static Image RenderToImage(string html, int maxWidth = 0, int maxHeight = 0, Color backgroundColor = new Color(), CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { return RenderToImage(html, Size.Empty, new Size(maxWidth, maxHeight), backgroundColor, cssData, stylesheetLoad, imageLoad); } @@ -435,7 +435,7 @@ public static void RenderToImage(Image image, string html, PointF location, Size /// the generated image of the html /// if is . public static Image RenderToImage(string html, Size minSize, Size maxSize, Color backgroundColor = new Color(), CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { if (backgroundColor == Color.Transparent) throw new ArgumentOutOfRangeException("backgroundColor", "Transparent background in not supported"); @@ -499,7 +499,7 @@ public static void RenderToImage(Image image, string html, PointF location, Size /// optional: can be used to overwrite image resolution logic /// the generated image of the html public static Image RenderToImageGdiPlus(string html, Size size, TextRenderingHint textRenderingHint = TextRenderingHint.AntiAlias, CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { var image = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppArgb); @@ -531,7 +531,7 @@ public static Image RenderToImageGdiPlus(string html, Size size, TextRenderingHi /// optional: can be used to overwrite image resolution logic /// the generated image of the html public static Image RenderToImageGdiPlus(string html, int maxWidth = 0, int maxHeight = 0, TextRenderingHint textRenderingHint = TextRenderingHint.AntiAlias, CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { return RenderToImageGdiPlus(html, Size.Empty, new Size(maxWidth, maxHeight), textRenderingHint, cssData, stylesheetLoad, imageLoad); } @@ -556,7 +556,7 @@ public static Image RenderToImageGdiPlus(string html, int maxWidth = 0, int maxH /// optional: can be used to overwrite image resolution logic /// the generated image of the html public static Image RenderToImageGdiPlus(string html, Size minSize, Size maxSize, TextRenderingHint textRenderingHint = TextRenderingHint.AntiAlias, CssData cssData = null, - EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { if (string.IsNullOrEmpty(html)) return new Bitmap(0, 0, PixelFormat.Format32bppArgb); @@ -605,7 +605,7 @@ public static Image RenderToImageGdiPlus(string html, Size minSize, Size maxSize /// optional: can be used to overwrite image resolution logic /// the size required for the html private static SizeF Measure(Graphics g, string html, float maxWidth, CssData cssData, bool useGdiPlusTextRendering, - EventHandler stylesheetLoad, EventHandler imageLoad) + EventHandler stylesheetLoad, EventHandler imageLoad) { SizeF actualSize = SizeF.Empty; if (!string.IsNullOrEmpty(html)) @@ -750,4 +750,4 @@ private static void CopyBufferToImage(IntPtr memoryHdc, Image image) #endregion } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/HtmlToolTip.cs b/Source/HtmlRenderer.WinForms/HtmlToolTip.cs index 326a03a33..13a40b326 100644 --- a/Source/HtmlRenderer.WinForms/HtmlToolTip.cs +++ b/Source/HtmlRenderer.WinForms/HtmlToolTip.cs @@ -440,6 +440,7 @@ private void OnToolTipDisposed(object sender, EventArgs e) #endregion + #endregion } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs b/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs index 6feaf7b6d..52e2066ae 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs @@ -37,6 +37,7 @@ internal static class CacheUtils #endregion + /// /// Get cached pen instance for the given color. /// diff --git a/Source/HtmlRenderer.WinForms/Utilities/Utils.cs b/Source/HtmlRenderer.WinForms/Utilities/Utils.cs index 173a6f636..561605875 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/Utils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/Utils.cs @@ -120,4 +120,4 @@ public static Color Convert(RColor c) return Color.FromArgb(c.A, c.R, c.G, c.B); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs b/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs index 6ddd83f10..a95d6556d 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs @@ -247,4 +247,4 @@ internal struct TextMetric public byte tmPitchAndFamily; public byte tmCharSet; } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/CssData.cs b/Source/HtmlRenderer/Core/CssData.cs index fb34f684c..b439cd270 100644 --- a/Source/HtmlRenderer/Core/CssData.cs +++ b/Source/HtmlRenderer/Core/CssData.cs @@ -211,4 +211,4 @@ public CssData Clone() return clone; } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs index ba6c5406c..e346918db 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs @@ -56,9 +56,9 @@ protected override void PerformLayoutImp(IGraphics g) //width at 100% (or auto) double minwidth = GetMinimumWidth(); double width = ContainingBlock.Size.Width - - ContainingBlock.ActualPaddingLeft - ContainingBlock.ActualPaddingRight - - ContainingBlock.ActualBorderLeftWidth - ContainingBlock.ActualBorderRightWidth - - ActualMarginLeft - ActualMarginRight - ActualBorderLeftWidth - ActualBorderRightWidth; + - ContainingBlock.ActualPaddingLeft - ContainingBlock.ActualPaddingRight + - ContainingBlock.ActualBorderLeftWidth - ContainingBlock.ActualBorderRightWidth + - ActualMarginLeft - ActualMarginRight - ActualBorderLeftWidth - ActualBorderRightWidth; //Check width if not auto if (Width != CssConstants.Auto && !string.IsNullOrEmpty(Width)) diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs index 51c5b006f..ff2c81834 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs @@ -139,6 +139,7 @@ internal abstract class CssBoxProperties /// the width of whitespace between words /// private double _actualLineHeight = double.NaN; + private double _actualWordSpacing = double.NaN; private double _actualTextIndent = double.NaN; private double _actualBorderSpacingHorizontal = double.NaN; @@ -361,25 +362,41 @@ public string MarginTop public string PaddingBottom { get { return _paddingBottom; } - set { _paddingBottom = value; _actualPaddingBottom = double.NaN; } + set + { + _paddingBottom = value; + _actualPaddingBottom = double.NaN; + } } public string PaddingLeft { get { return _paddingLeft; } - set { _paddingLeft = value; _actualPaddingLeft = double.NaN; } + set + { + _paddingLeft = value; + _actualPaddingLeft = double.NaN; + } } public string PaddingRight { get { return _paddingRight; } - set { _paddingRight = value; _actualPaddingRight = double.NaN; } + set + { + _paddingRight = value; + _actualPaddingRight = double.NaN; + } } public string PaddingTop { get { return _paddingTop; } - set { _paddingTop = value; _actualPaddingTop = double.NaN; } + set + { + _paddingTop = value; + _actualPaddingTop = double.NaN; + } } public string Left @@ -451,7 +468,11 @@ public string BackgroundGradientAngle public string Color { get { return _color; } - set { _color = value; _actualColor = RColor.Empty; } + set + { + _color = value; + _actualColor = RColor.Empty; + } } public string Display @@ -1123,14 +1144,12 @@ public RColor ActualColor { get { - if (_actualColor.IsEmpty) { _actualColor = GetActualColor(Color); } return _actualColor; - } } @@ -1198,8 +1217,14 @@ public IFont ActualFont { if (_actualFont == null) { - if (string.IsNullOrEmpty(FontFamily)) { FontFamily = CssConstants.DefaultFont; } - if (string.IsNullOrEmpty(FontSize)) { FontSize = CssConstants.FontSize.ToString(CultureInfo.InvariantCulture) + "pt"; } + if (string.IsNullOrEmpty(FontFamily)) + { + FontFamily = CssConstants.DefaultFont; + } + if (string.IsNullOrEmpty(FontSize)) + { + FontSize = CssConstants.FontSize.ToString(CultureInfo.InvariantCulture) + "pt"; + } RFontStyle st = RFontStyle.Regular; @@ -1222,23 +1247,32 @@ public IFont ActualFont switch (FontSize) { case CssConstants.Medium: - fsize = CssConstants.FontSize; break; + fsize = CssConstants.FontSize; + break; case CssConstants.XXSmall: - fsize = CssConstants.FontSize - 4; break; + fsize = CssConstants.FontSize - 4; + break; case CssConstants.XSmall: - fsize = CssConstants.FontSize - 3; break; + fsize = CssConstants.FontSize - 3; + break; case CssConstants.Small: - fsize = CssConstants.FontSize - 2; break; + fsize = CssConstants.FontSize - 2; + break; case CssConstants.Large: - fsize = CssConstants.FontSize + 2; break; + fsize = CssConstants.FontSize + 2; + break; case CssConstants.XLarge: - fsize = CssConstants.FontSize + 3; break; + fsize = CssConstants.FontSize + 3; + break; case CssConstants.XXLarge: - fsize = CssConstants.FontSize + 4; break; + fsize = CssConstants.FontSize + 4; + break; case CssConstants.Smaller: - fsize = parentSize - 2; break; + fsize = parentSize - 2; + break; case CssConstants.Larger: - fsize = parentSize + 2; break; + fsize = parentSize + 2; + break; default: fsize = CssValueParser.ParseLength(FontSize, parentSize, parentSize, null, true, true); break; diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs index f6a508299..9d36140b8 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs @@ -101,7 +101,7 @@ public static void MeasureImageSize(CssRectImage imageWord) double ratio = imageWord.Width / imageWord.Image.Width; imageWord.Height = imageWord.Image.Height * ratio; } - // If only the height was set in the html tag, ratio the width. + // If only the height was set in the html tag, ratio the width. else if (hasImageTagHeight && !hasImageTagWidth) { // Divide the given tag height with the actual image height, to get the ratio. @@ -177,7 +177,8 @@ public static void ApplyCellVerticalAlignment(IGraphics g, CssBox cell) ArgChecker.AssertArgNotNull(g, "g"); ArgChecker.AssertArgNotNull(cell, "cell"); - if (cell.VerticalAlign == CssConstants.Top || cell.VerticalAlign == CssConstants.Baseline) return; + if (cell.VerticalAlign == CssConstants.Top || cell.VerticalAlign == CssConstants.Baseline) + return; double cellbot = cell.ClientBottom; double bottom = cell.GetMaximumBottom(cell, 0f); @@ -278,7 +279,7 @@ private static void FlowBox(IGraphics g, CssBox blockbox, CssBox box, double lim maxbottom += box.ActualLineHeight - (maxbottom - cury); if ((b.WhiteSpace != CssConstants.NoWrap && b.WhiteSpace != CssConstants.Pre && curx + word.Width + rightspacing > limitRight - && (b.WhiteSpace != CssConstants.PreWrap || !word.IsSpaces)) + && (b.WhiteSpace != CssConstants.PreWrap || !word.IsSpaces)) || word.IsLineBreak || wrapNoWrapBox) { wrapNoWrapBox = false; @@ -421,9 +422,6 @@ private static void BubbleRectangles(CssBox box, CssLineBox line) /// private static void ApplyAlignment(IGraphics g, CssLineBox lineBox) { - - #region Horizontal alignment - switch (lineBox.OwnerBox.TextAlign) { case CssConstants.Right: @@ -440,8 +438,6 @@ private static void ApplyAlignment(IGraphics g, CssLineBox lineBox) break; } - #endregion - ApplyVerticalAlignment(g, lineBox); } @@ -576,7 +572,8 @@ private static void ApplyVerticalAlignment(IGraphics g, CssLineBox lineBox) /// private static void ApplyJustifyAlignment(IGraphics g, CssLineBox lineBox) { - if (lineBox.Equals(lineBox.OwnerBox.LineBoxes[lineBox.OwnerBox.LineBoxes.Count - 1])) return; + if (lineBox.Equals(lineBox.OwnerBox.LineBoxes[lineBox.OwnerBox.LineBoxes.Count - 1])) + return; double indent = lineBox.Equals(lineBox.OwnerBox.LineBoxes[0]) ? lineBox.OwnerBox.ActualTextIndent : 0f; double textSum = 0f; @@ -590,7 +587,8 @@ private static void ApplyJustifyAlignment(IGraphics g, CssLineBox lineBox) words += 1f; } - if (words <= 0f) return; //Avoid Zero division + if (words <= 0f) + return; //Avoid Zero division double spacing = (availWidth - textSum) / words; //Spacing that will be used double curx = lineBox.OwnerBox.ClientLeft + indent; @@ -613,7 +611,8 @@ private static void ApplyJustifyAlignment(IGraphics g, CssLineBox lineBox) /// private static void ApplyCenterAlignment(IGraphics g, CssLineBox line) { - if (line.Words.Count == 0) return; + if (line.Words.Count == 0) + return; CssRect lastWord = line.Words[line.Words.Count - 1]; double right = line.OwnerBox.ActualRight - line.OwnerBox.ActualPaddingRight - line.OwnerBox.ActualBorderRightWidth; @@ -642,7 +641,8 @@ private static void ApplyCenterAlignment(IGraphics g, CssLineBox line) /// private static void ApplyRightAlignment(IGraphics g, CssLineBox line) { - if (line.Words.Count == 0) return; + if (line.Words.Count == 0) + return; CssRect lastWord = line.Words[line.Words.Count - 1]; diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs index 2e7c2628e..0766d77d2 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs @@ -410,8 +410,7 @@ private void DetermineMissingColumnWidths(double availCellSpace) occupedSpace += maxFullWidths[i]; } } - } - while (oldNumOfNans != numOfNans); + } while (oldNumOfNans != numOfNans); if (numOfNans > 0) { @@ -465,7 +464,6 @@ private void DetermineMissingColumnWidths(double availCellSpace) var temp = _columnWidths[i]; _columnWidths[i] = Math.Min(_columnWidths[i] + (availCellSpace - occupedSpace) / Convert.ToSingle(_columnWidths.Length - i), maxFullWidths[i]); occupedSpace = occupedSpace + _columnWidths[i] - temp; - } } } @@ -624,7 +622,8 @@ private void LayoutCells(IGraphics g) for (int j = 0; j < row.Boxes.Count; j++) { CssBox cell = row.Boxes[j]; - if (curCol >= _columnWidths.Length) break; + if (curCol >= _columnWidths.Length) + break; int rowspan = GetRowSpan(cell); var columnIndex = GetCellRealColumnIndex(row, cell); @@ -702,7 +701,8 @@ private static int GetCellRealColumnIndex(CssBox row, CssBox cell) foreach (CssBox b in row.Boxes) { - if (b.Equals(cell)) break; + if (b.Equals(cell)) + break; i += GetColSpan(b); } @@ -722,8 +722,10 @@ private double GetCellWidth(int column, CssBox b) for (int i = column; i < column + colspan; i++) { - if (column >= _columnWidths.Length) break; - if (_columnWidths.Length <= i) break; + if (column >= _columnWidths.Length) + break; + if (_columnWidths.Length <= i) + break; sum += _columnWidths[i]; } @@ -809,7 +811,8 @@ private bool CanReduceWidth() /// private bool CanReduceWidth(int columnIndex) { - if (_columnWidths.Length >= columnIndex || GetColumnMinWidths().Length >= columnIndex) return false; + if (_columnWidths.Length >= columnIndex || GetColumnMinWidths().Length >= columnIndex) + return false; return _columnWidths[columnIndex] > GetColumnMinWidths()[columnIndex]; } @@ -998,4 +1001,4 @@ private double GetVerticalSpacing() #endregion } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Dom/CssLength.cs b/Source/HtmlRenderer/Core/Dom/CssLength.cs index dbe5f4ee7..b2306b616 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLength.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLength.cs @@ -14,6 +14,7 @@ namespace HtmlRenderer.Core.Dom internal sealed class CssLength { #region Fields + private readonly double _number; private readonly bool _isRelative; private readonly CssUnit _unit; @@ -23,7 +24,6 @@ internal sealed class CssLength #endregion - #region Ctor /// /// Creates a new CssLength from a length specified on a CSS style sheet or fragment @@ -37,7 +37,8 @@ public CssLength(string length) _isPercentage = false; //Return zero if no length specified, zero specified - if (string.IsNullOrEmpty(length) || length == "0") return; + if (string.IsNullOrEmpty(length) || length == "0") + return; //If percentage, use ParseNumber if (length.EndsWith("%")) @@ -96,14 +97,12 @@ public CssLength(string length) return; } - if (!double.TryParse(number, System.Globalization.NumberStyles.Number, NumberFormatInfo.InvariantInfo, out _number)) + if (!double.TryParse(number, NumberStyles.Number, NumberFormatInfo.InvariantInfo, out _number)) { _hasError = true; } - } - #endregion #region Props @@ -157,9 +156,9 @@ public string Length get { return _length; } } - #endregion + #region Methods /// @@ -170,8 +169,10 @@ public string Length /// If length has an error or isn't in ems public CssLength ConvertEmToPoints(double emSize) { - if (HasError) throw new InvalidOperationException("Invalid length"); - if (Unit != CssUnit.Ems) throw new InvalidOperationException("Length is not in ems"); + if (HasError) + throw new InvalidOperationException("Invalid length"); + if (Unit != CssUnit.Ems) + throw new InvalidOperationException("Length is not in ems"); return new CssLength(string.Format("{0}pt", Convert.ToSingle(Number * emSize).ToString("0.0", NumberFormatInfo.InvariantInfo))); } @@ -184,8 +185,10 @@ public CssLength ConvertEmToPoints(double emSize) /// If length has an error or isn't in ems public CssLength ConvertEmToPixels(double pixelFactor) { - if (HasError) throw new InvalidOperationException("Invalid length"); - if (Unit != CssUnit.Ems) throw new InvalidOperationException("Length is not in ems"); + if (HasError) + throw new InvalidOperationException("Invalid length"); + if (Unit != CssUnit.Ems) + throw new InvalidOperationException("Length is not in ems"); return new CssLength(string.Format("{0}px", Convert.ToSingle(Number * pixelFactor).ToString("0.0", NumberFormatInfo.InvariantInfo))); } diff --git a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs index 6eb7a591d..9a779eb29 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs @@ -140,7 +140,8 @@ internal List WordsOf(CssBox box) List r = new List(); foreach (CssRect word in Words) - if (word.OwnerBox.Equals(box)) r.Add(word); + if (word.OwnerBox.Equals(box)) + r.Add(word); return r; } @@ -160,8 +161,10 @@ internal void UpdateRectangle(CssBox box, double x, double y, double r, double b double topspacing = box.ActualBorderTopWidth + box.ActualPaddingTop; double bottomspacing = box.ActualBorderBottomWidth + box.ActualPaddingTop; - if ((box.FirstHostingLineBox != null && box.FirstHostingLineBox.Equals(this)) || box.IsImage) x -= leftspacing; - if ((box.LastHostingLineBox != null && box.LastHostingLineBox.Equals(this)) || box.IsImage) r += rightspacing; + if ((box.FirstHostingLineBox != null && box.FirstHostingLineBox.Equals(this)) || box.IsImage) + x -= leftspacing; + if ((box.LastHostingLineBox != null && box.LastHostingLineBox.Equals(this)) || box.IsImage) + r += rightspacing; if (!box.IsImage) { @@ -210,7 +213,8 @@ internal void SetBaseLine(IGraphics g, CssBox b, double baseline) //TODO: Aqui me quede, checar poniendo "by the" con un font-size de 3em List ws = WordsOf(b); - if (!Rectangles.ContainsKey(b)) return; + if (!Rectangles.ContainsKey(b)) + return; RRect r = Rectangles[b]; @@ -233,7 +237,7 @@ internal void SetBaseLine(IGraphics g, CssBox b, double baseline) //New top that words will have //float newtop = baseline - (Height - OwnerBox.FontDescent - 3); //OLD - double newtop = baseline;// -GetBaseLineHeight(b, g); //OLD + double newtop = baseline; // -GetBaseLineHeight(b, g); //OLD if (b.ParentBox != null && b.ParentBox.Rectangles.ContainsKey(this) && @@ -286,4 +290,4 @@ public override string ToString() return string.Join(" ", ws); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Dom/CssRect.cs b/Source/HtmlRenderer/Core/Dom/CssRect.cs index 49b07cbf2..86a3d3649 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRect.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRect.cs @@ -269,4 +269,4 @@ public override string ToString() return string.Format("{0} ({1} char{2})", Text.Replace(' ', '-').Replace("\n", "\\n"), Text.Length, Text.Length != 1 ? "s" : string.Empty); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Dom/CssRectImage.cs b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs index 864c61844..bcc6c9707 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRectImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs @@ -78,4 +78,4 @@ public override string ToString() return "Image"; } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Entities/CssConstants.cs b/Source/HtmlRenderer/Core/Entities/CssConstants.cs index e9871d5cc..8fef9e9b5 100644 --- a/Source/HtmlRenderer/Core/Entities/CssConstants.cs +++ b/Source/HtmlRenderer/Core/Entities/CssConstants.cs @@ -163,6 +163,5 @@ internal static class CssConstants /// Default font used for the generic 'serif' family /// public const string DefaultFont = "Times New Roman"; - } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Entities/CssDefaults.cs b/Source/HtmlRenderer/Core/Entities/CssDefaults.cs index 9c4d7b418..0beed2cb9 100644 --- a/Source/HtmlRenderer/Core/Entities/CssDefaults.cs +++ b/Source/HtmlRenderer/Core/Entities/CssDefaults.cs @@ -126,4 +126,4 @@ @media print { Font: 9pt Tahoma; }"; } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Entities/HoverBoxBlock.cs b/Source/HtmlRenderer/Core/Entities/HoverBoxBlock.cs index 8f369a6d8..c15b8b64c 100644 --- a/Source/HtmlRenderer/Core/Entities/HoverBoxBlock.cs +++ b/Source/HtmlRenderer/Core/Entities/HoverBoxBlock.cs @@ -55,4 +55,4 @@ public CssBlock CssBlock get { return _cssBlock; } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs b/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs index d8a57aa94..9e07b5377 100644 --- a/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs @@ -225,6 +225,5 @@ internal static class HtmlConstants // public const string middle = "middle"; // public const string bottom = "bottom"; public const string Justify = "justify"; - } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs index 610fb9707..257cbdee0 100644 --- a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs @@ -34,14 +34,14 @@ public static void DrawBackgroundImage(IGraphics g, CssBox box, ImageLoadHandler { // image size depends if specific rectangle given in image loader var imgSize = new RSize(imageLoadHandler.Rectangle == RRect.Empty ? imageLoadHandler.Image.Width : imageLoadHandler.Rectangle.Width, - imageLoadHandler.Rectangle == RRect.Empty ? imageLoadHandler.Image.Height : imageLoadHandler.Rectangle.Height); + imageLoadHandler.Rectangle == RRect.Empty ? imageLoadHandler.Image.Height : imageLoadHandler.Rectangle.Height); // get the location by BackgroundPosition value var location = GetLocation(box.BackgroundPosition, rectangle, imgSize); var srcRect = imageLoadHandler.Rectangle == RRect.Empty - ? new RRect(0, 0, imgSize.Width, imgSize.Height) - : new RRect(imageLoadHandler.Rectangle.Left, imageLoadHandler.Rectangle.Top, imgSize.Width, imgSize.Height); + ? new RRect(0, 0, imgSize.Width, imgSize.Height) + : new RRect(imageLoadHandler.Rectangle.Left, imageLoadHandler.Rectangle.Top, imgSize.Width, imgSize.Height); // initial image destination rectangle var destRect = new RRect(location, imgSize); diff --git a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs index d461c231c..a12fec849 100644 --- a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs @@ -370,4 +370,4 @@ private static RColor Darken(RColor c) #endregion } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs index 3852319e0..10a62d199 100644 --- a/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs @@ -506,4 +506,4 @@ private void OnSelectAllClick(object sender, EventArgs eventArgs) #endregion } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs index 81839f2f8..d4d770646 100644 --- a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs @@ -177,8 +177,8 @@ private IFont CreateFont(string family, double size, RFontStyle style) { IFontFamily fontFamily; return _existingFontFamilies.TryGetValue(family, out fontFamily) - ? _global.CreateFont(fontFamily, size, style) - : _global.CreateFont(family, size, style); + ? _global.CreateFont(fontFamily, size, style) + : _global.CreateFont(family, size, style); } #endregion diff --git a/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs index 7e57bdfbf..169b40db7 100644 --- a/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs @@ -199,9 +199,9 @@ private void OnHtmlImageLoadEventCallback(string path, object image, RRect image { _image = _htmlContainer.Global.ConvertImage(image); ImageLoadComplete(_asyncCallback); - } + } else if (!string.IsNullOrEmpty(path)) - { + { SetImageFromPath(path); } else @@ -263,9 +263,9 @@ private void SetImageFromPath(string path) if (uri != null && uri.Scheme != "file") { SetImageFromUrl(uri); - } + } else - { + { var fileInfo = CommonUtils.TryGetFileInfo(uri != null ? uri.AbsolutePath : path); if (fileInfo != null) { @@ -285,7 +285,7 @@ private void SetImageFromPath(string path) /// the file path to get the image from private void SetImageFromFile(FileInfo source) { - if( source.Exists ) + if (source.Exists) { if (_htmlContainer.AvoidAsyncImagesLoading) LoadImageFromFile(source); @@ -295,7 +295,7 @@ private void SetImageFromFile(FileInfo source) else { ImageLoadComplete(); - } + } } /// @@ -330,7 +330,7 @@ private void LoadImageFromFile(FileInfo source) private void SetImageFromUrl(Uri source) { var filePath = CommonUtils.GetLocalfileName(source); - if( filePath.Exists && filePath.Length > 0 ) + if (filePath.Exists && filePath.Length > 0) { SetImageFromFile(filePath); } @@ -338,7 +338,7 @@ private void SetImageFromUrl(Uri source) { if (_htmlContainer.AvoidAsyncImagesLoading) DownloadImageFromUrl(source, filePath); - else + else ThreadPool.QueueUserWorkItem(DownloadImageFromUrlAsync, new KeyValuePair(source, filePath)); } } @@ -370,8 +370,8 @@ private void DownloadImageFromUrl(Uri source, FileInfo filePath) /// key value pair of URL and file info to download the file to private void DownloadImageFromUrlAsync(object data) { - var uri = ((KeyValuePair) data).Key; - var filePath = ((KeyValuePair) data).Value; + var uri = ((KeyValuePair)data).Key; + var filePath = ((KeyValuePair)data).Value; try { @@ -412,27 +412,27 @@ private void OnDownloadImageCompleted(object sender, AsyncCompletedEventArgs e) private void OnDownloadImageCompleted(bool cancelled, Exception error, FileInfo filePath, WebClient client) { if (!cancelled && !_disposed) - { + { if (error == null) - { + { filePath.Refresh(); - var contentType = CommonUtils.GetResponseContentType(client); - if( contentType != null && contentType.StartsWith("image", StringComparison.OrdinalIgnoreCase) ) - { + var contentType = CommonUtils.GetResponseContentType(client); + if (contentType != null && contentType.StartsWith("image", StringComparison.OrdinalIgnoreCase)) + { LoadImageFromFile(filePath); - } - else - { + } + else + { _htmlContainer.ReportError(HtmlRenderErrorType.Image, "Failed to load image, not image content type: " + contentType); - ImageLoadComplete(); + ImageLoadComplete(); filePath.Delete(); - } - } - else - { + } + } + else + { _htmlContainer.ReportError(HtmlRenderErrorType.Image, "Failed to load image from URL: " + client.BaseAddress, error); - ImageLoadComplete(); - } + ImageLoadComplete(); + } } } @@ -442,9 +442,9 @@ private void OnDownloadImageCompleted(bool cancelled, Exception error, FileInfo private void ImageLoadComplete(bool async = true) { // can happen if some operation return after the handler was disposed - if(_disposed) + if (_disposed) ReleaseObjects(); - else + else _loadCompleteCallback(_image, _imageRectangle, async); } @@ -473,4 +473,4 @@ private void ReleaseObjects() #endregion } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs b/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs index bcce38628..8dccdccd6 100644 --- a/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs @@ -185,4 +185,4 @@ private static string CorrectRelativeUrls(string stylesheet, Uri baseUri) #endregion } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs index 3294143d2..f9eea2aa9 100644 --- a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs +++ b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs @@ -99,7 +99,6 @@ public static RSize Layout(IGraphics g, HtmlContainerInt htmlContainer, RSize si // if min size is larger than the actual we need to re-layout so all 100% layouts will be correct htmlContainer.MaxSize = new RSize(minSize.Width, 0); htmlContainer.PerformLayout(g); - } newSize = htmlContainer.ActualSize; } @@ -109,8 +108,8 @@ public static RSize Layout(IGraphics g, HtmlContainerInt htmlContainer, RSize si // make sure the height is not lower than min if given newSize.Height = minSize.Height > 0 && minSize.Height > htmlContainer.ActualSize.Height - ? minSize.Height - : htmlContainer.ActualSize.Height; + ? minSize.Height + : htmlContainer.ActualSize.Height; // handle if changing the height of the label affects the desired width and those require re-layout if (Math.Abs(prevWidth - size.Width) > 0.01) @@ -121,4 +120,4 @@ public static RSize Layout(IGraphics g, HtmlContainerInt htmlContainer, RSize si return newSize; } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Parse/CssParser.cs b/Source/HtmlRenderer/Core/Parse/CssParser.cs index 91823d9ec..5a84551d6 100644 --- a/Source/HtmlRenderer/Core/Parse/CssParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssParser.cs @@ -135,6 +135,7 @@ public RColor ParseColor(string colorStr) return _valueParser.GetActualColor(colorStr); } + #region Private methods /// @@ -231,7 +232,8 @@ private void ParseMediaStyleBlocks(CssData cssData, string stylesheet) while ((atrule = RegexParserUtils.GetCssAtRules(stylesheet, ref startIdx)) != null) { //Just process @media rules - if (!atrule.StartsWith("@media", StringComparison.InvariantCultureIgnoreCase)) continue; + if (!atrule.StartsWith("@media", StringComparison.InvariantCultureIgnoreCase)) + continue; //Extract specified media types MatchCollection types = RegexParserUtils.Match(RegexParserUtils.CssMediaTypes, atrule); @@ -557,12 +559,18 @@ private void ParseFontProperty(string propValue, Dictionary prop lineHeight = mustBe.Substring(slashPos + 1); } - if (!string.IsNullOrEmpty(fontFamily)) properties["font-family"] = ParseFontFamilyProperty(fontFamily); - if (!string.IsNullOrEmpty(fontStyle)) properties["font-style"] = fontStyle; - if (!string.IsNullOrEmpty(fontVariant)) properties["font-variant"] = fontVariant; - if (!string.IsNullOrEmpty(fontWeight)) properties["font-weight"] = fontWeight; - if (!string.IsNullOrEmpty(fontSize)) properties["font-size"] = fontSize; - if (!string.IsNullOrEmpty(lineHeight)) properties["line-height"] = lineHeight; + if (!string.IsNullOrEmpty(fontFamily)) + properties["font-family"] = ParseFontFamilyProperty(fontFamily); + if (!string.IsNullOrEmpty(fontStyle)) + properties["font-style"] = fontStyle; + if (!string.IsNullOrEmpty(fontVariant)) + properties["font-variant"] = fontVariant; + if (!string.IsNullOrEmpty(fontWeight)) + properties["font-weight"] = fontWeight; + if (!string.IsNullOrEmpty(fontSize)) + properties["font-size"] = fontSize; + if (!string.IsNullOrEmpty(lineHeight)) + properties["line-height"] = lineHeight; } else { @@ -646,15 +654,21 @@ private void ParseBorderProperty(string propValue, string direction, Dictionary< if (direction != null) { - if (borderWidth != null) properties["border" + direction + "-width"] = borderWidth; - if (borderStyle != null) properties["border" + direction + "-style"] = borderStyle; - if (borderColor != null) properties["border" + direction + "-color"] = borderColor; + if (borderWidth != null) + properties["border" + direction + "-width"] = borderWidth; + if (borderStyle != null) + properties["border" + direction + "-style"] = borderStyle; + if (borderColor != null) + properties["border" + direction + "-color"] = borderColor; } else { - if (borderWidth != null) ParseBorderWidthProperty(borderWidth, properties); - if (borderStyle != null) ParseBorderStyleProperty(borderStyle, properties); - if (borderColor != null) ParseBorderColorProperty(borderColor, properties); + if (borderWidth != null) + ParseBorderWidthProperty(borderWidth, properties); + if (borderStyle != null) + ParseBorderStyleProperty(borderStyle, properties); + if (borderColor != null) + ParseBorderColorProperty(borderColor, properties); } } @@ -668,10 +682,14 @@ private static void ParseMarginProperty(string propValue, Dictionary @@ -684,10 +702,14 @@ private static void ParseBorderStyleProperty(string propValue, Dictionary @@ -700,10 +722,14 @@ private static void ParseBorderWidthProperty(string propValue, Dictionary @@ -716,10 +742,14 @@ private static void ParseBorderColorProperty(string propValue, Dictionary @@ -732,10 +762,14 @@ private static void ParsePaddingProperty(string propValue, Dictionary diff --git a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs index 11584db52..a7131474e 100644 --- a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs @@ -131,7 +131,8 @@ public static double ParseNumber(string number, double hundredPercent) bool isPercent = number.EndsWith("%"); double result; - if (isPercent) toParse = number.Substring(0, number.Length - 1); + if (isPercent) + toParse = number.Substring(0, number.Length - 1); if (!double.TryParse(toParse, NumberStyles.Number, NumberFormatInfo.InvariantInfo, out result)) { @@ -185,10 +186,12 @@ public static double ParseLength(string length, double hundredPercent, CssBoxPro public static double ParseLength(string length, double hundredPercent, double emFactor, string defaultUnit, bool fontAdjust, bool returnPoints) { //Return zero if no length specified, zero specified - if (string.IsNullOrEmpty(length) || length == "0") return 0f; + if (string.IsNullOrEmpty(length) || length == "0") + return 0f; //If percentage, use ParseNumber - if (length.EndsWith("%")) return ParseNumber(length, hundredPercent); + if (length.EndsWith("%")) + return ParseNumber(length, hundredPercent); //Get units of the length bool hasUnit; diff --git a/Source/HtmlRenderer/Core/Parse/DomParser.cs b/Source/HtmlRenderer/Core/Parse/DomParser.cs index bb4dbbf13..ebcd27490 100644 --- a/Source/HtmlRenderer/Core/Parse/DomParser.cs +++ b/Source/HtmlRenderer/Core/Parse/DomParser.cs @@ -80,6 +80,7 @@ public CssBox GenerateCssTree(string html, HtmlContainerInt htmlContainer, ref C return root; } + #region Private methods /// @@ -654,7 +655,6 @@ private static void CorrectLineBreaksBlocks(CssBox box, ref bool followingBlock) if (followingBlock) brBox.Height = ".95em"; // atodo: check the height to min-height when it is supported } - } while (brBox != null); } diff --git a/Source/HtmlRenderer/Core/Parse/RegexParserUtils.cs b/Source/HtmlRenderer/Core/Parse/RegexParserUtils.cs index b8cb3cf85..22e14f0ac 100644 --- a/Source/HtmlRenderer/Core/Parse/RegexParserUtils.cs +++ b/Source/HtmlRenderer/Core/Parse/RegexParserUtils.cs @@ -194,4 +194,4 @@ private static Regex GetRegex(string regex) return r; } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Utils/ArgChecker.cs b/Source/HtmlRenderer/Core/Utils/ArgChecker.cs index 63d01cfa9..df1dda68a 100644 --- a/Source/HtmlRenderer/Core/Utils/ArgChecker.cs +++ b/Source/HtmlRenderer/Core/Utils/ArgChecker.cs @@ -114,4 +114,4 @@ public static void AssertFileExist(string arg, string argName) } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Utils/CommonUtils.cs b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs index 8baf5110c..7436baa4f 100644 --- a/Source/HtmlRenderer/Core/Utils/CommonUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs @@ -38,46 +38,46 @@ internal static class CommonUtils /// Table to convert numbers into roman digits /// private static readonly string[,] _romanDigitsTable = new[,] + { + { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" }, + { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" }, + { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" }, { - {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}, - {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, - {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, - { - "", "M", "MM", "MMM", "M(V)", "(V)", "(V)M", - "(V)MM", "(V)MMM", "M(X)" - } - }; + "", "M", "MM", "MMM", "M(V)", "(V)", "(V)M", + "(V)MM", "(V)MMM", "M(X)" + } + }; private static readonly string[,] _hebrewDigitsTable = new[,] - { - {"א", "ב", "ג", "ד", "ה", "ו", "ז", "ח", "ט"}, - {"י", "כ", "ל", "מ", "נ", "ס", "ע", "פ", "צ"}, - {"ק", "ר", "ש", "ת", "תק", "תר", "תש", "תת", "תתק",} - }; + { + { "א", "ב", "ג", "ד", "ה", "ו", "ז", "ח", "ט" }, + { "י", "כ", "ל", "מ", "נ", "ס", "ע", "פ", "צ" }, + { "ק", "ר", "ש", "ת", "תק", "תר", "תש", "תת", "תתק", } + }; private static readonly string[,] _georgianDigitsTable = new[,] - { - {"ა", "ბ", "გ", "დ", "ე", "ვ", "ზ", "ჱ", "თ"}, - {"ი", "პ", "ლ", "მ", "ნ", "ჲ", "ო", "პ", "ჟ"}, - {"რ", "ს", "ტ", "ჳ", "ფ", "ქ", "ღ", "ყ", "შ"} - }; + { + { "ა", "ბ", "გ", "დ", "ე", "ვ", "ზ", "ჱ", "თ" }, + { "ი", "პ", "ლ", "მ", "ნ", "ჲ", "ო", "პ", "ჟ" }, + { "რ", "ს", "ტ", "ჳ", "ფ", "ქ", "ღ", "ყ", "შ" } + }; private static readonly string[,] _armenianDigitsTable = new[,] - { - {"Ա", "Բ", "Գ", "Դ", "Ե", "Զ", "Է", "Ը", "Թ"}, - {"Ժ", "Ի", "Լ", "Խ", "Ծ", "Կ", "Հ", "Ձ", "Ղ"}, - {"Ճ", "Մ", "Յ", "Ն", "Շ", "Ո", "Չ", "Պ", "Ջ"} - }; + { + { "Ա", "Բ", "Գ", "Դ", "Ե", "Զ", "Է", "Ը", "Թ" }, + { "Ժ", "Ի", "Լ", "Խ", "Ծ", "Կ", "Հ", "Ձ", "Ղ" }, + { "Ճ", "Մ", "Յ", "Ն", "Շ", "Ո", "Չ", "Պ", "Ջ" } + }; private static readonly string[] _hiraganaDigitsTable = new[] - { - "あ", "ぃ", "ぅ", "ぇ", "ぉ", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ", "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", "み", "む", "め", "も", "ゃ", "ゅ", "ょ", "ら", "り", "る", "れ", "ろ", "ゎ", "ゐ", "ゑ", "を", "ん" - }; + { + "あ", "ぃ", "ぅ", "ぇ", "ぉ", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ", "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", "み", "む", "め", "も", "ゃ", "ゅ", "ょ", "ら", "り", "る", "れ", "ろ", "ゎ", "ゐ", "ゑ", "を", "ん" + }; private static readonly string[] _satakanaDigitsTable = new[] - { - "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヰ", "ヱ", "ヲ", "ン" - }; + { + "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヰ", "ヱ", "ヲ", "ン" + }; #endregion @@ -198,7 +198,6 @@ public static string GetResponseContentType(WebClient client) { if (header.Equals("Content-Type", StringComparison.InvariantCultureIgnoreCase)) return client.ResponseHeaders[header]; - } return null; } @@ -486,12 +485,10 @@ private static string ConvertToSpecificNumbers2(int number, string[] alphabet) var sb = string.Empty; while (number > 0) { - - sb = alphabet[Math.Max(0, number % 49 - 1)].ToString(CultureInfo.InvariantCulture) + sb; number /= 49; } return sb; } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Utils/CssUtils.cs b/Source/HtmlRenderer/Core/Utils/CssUtils.cs index 10ad6c678..9dcb0890a 100644 --- a/Source/HtmlRenderer/Core/Utils/CssUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CssUtils.cs @@ -33,6 +33,7 @@ internal static class CssUtils #endregion + /// /// Brush for selection background /// @@ -401,4 +402,4 @@ public static void SetPropertyValue(CssBox cssBox, string propName, string value } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Utils/DomUtils.cs b/Source/HtmlRenderer/Core/Utils/DomUtils.cs index e29de701e..961983739 100644 --- a/Source/HtmlRenderer/Core/Utils/DomUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/DomUtils.cs @@ -731,7 +731,6 @@ private static void WriteHtmlTag(CssParser cssParser, StringBuilder sb, CssBox b foreach (var cssBlock in tagCssBlock) foreach (var prop in cssBlock.Properties) tagStyles[prop.Key] = prop.Value; - } if (box.HtmlTag.HasAttributes()) diff --git a/Source/HtmlRenderer/Core/Utils/HtmlUtils.cs b/Source/HtmlRenderer/Core/Utils/HtmlUtils.cs index 071ae137b..479f9aa92 100644 --- a/Source/HtmlRenderer/Core/Utils/HtmlUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/HtmlUtils.cs @@ -24,23 +24,23 @@ internal static class HtmlUtils /// private static readonly List _list = new List( new[] - { - "area", "base", "basefont", "br", "col", - "frame", "hr", "img", "input", "isindex", - "link", "meta", "param" - } + { + "area", "base", "basefont", "br", "col", + "frame", "hr", "img", "input", "isindex", + "link", "meta", "param" + } ); /// /// the html encode\decode pairs /// private static readonly KeyValuePair[] _encodeDecode = new[] - { - new KeyValuePair("<", "<"), - new KeyValuePair(">", ">"), - new KeyValuePair(""", "\""), - new KeyValuePair("&", "&"), - }; + { + new KeyValuePair("<", "<"), + new KeyValuePair(">", ">"), + new KeyValuePair(""", "\""), + new KeyValuePair("&", "&"), + }; /// /// the html decode only pairs @@ -349,6 +349,7 @@ public static string EncodeHtml(string str) return str; } + #region Private methods /// @@ -406,4 +407,4 @@ private static string DecodeHtmlCharByName(string str) #endregion } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/Utils/SubString.cs b/Source/HtmlRenderer/Core/Utils/SubString.cs index e9b81cdca..2f4be2d87 100644 --- a/Source/HtmlRenderer/Core/Utils/SubString.cs +++ b/Source/HtmlRenderer/Core/Utils/SubString.cs @@ -184,4 +184,4 @@ public override string ToString() return string.Format("Sub-string: {0}", _length > 0 ? _fullString.Substring(_startIdx, _length) : string.Empty); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/CssBlockSelectorItem.cs b/Source/HtmlRenderer/Entities/CssBlockSelectorItem.cs index 2e23e6d7e..aaaf2465f 100644 --- a/Source/HtmlRenderer/Entities/CssBlockSelectorItem.cs +++ b/Source/HtmlRenderer/Entities/CssBlockSelectorItem.cs @@ -33,6 +33,7 @@ public struct CssBlockSelectorItem #endregion + /// /// Creates a new block from the block's source /// diff --git a/Source/HtmlRenderer/Entities/HtmlGenerationStyle.cs b/Source/HtmlRenderer/Entities/HtmlGenerationStyle.cs index dc097c645..a2ddc3a69 100644 --- a/Source/HtmlRenderer/Entities/HtmlGenerationStyle.cs +++ b/Source/HtmlRenderer/Entities/HtmlGenerationStyle.cs @@ -32,4 +32,4 @@ public enum HtmlGenerationStyle /// InHeader = 2 } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs index 2e16aa5c8..7458a5a49 100644 --- a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs @@ -172,4 +172,4 @@ public void Callback(Object image, double x, double y, double width, double heig _callback(null, image, new RRect(x, y, width, height)); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/HtmlLinkClickedEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlLinkClickedEventArgs.cs index deb0f1a57..0975aac1c 100644 --- a/Source/HtmlRenderer/Entities/HtmlLinkClickedEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlLinkClickedEventArgs.cs @@ -75,4 +75,4 @@ public override string ToString() return string.Format("Link: {0}, Handled: {1}", _link, _handled); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs b/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs index e9f8d802c..7b5db7d79 100644 --- a/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs +++ b/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs @@ -23,8 +23,7 @@ public sealed class HtmlLinkClickedException : Exception /// Initializes a new instance of the class. /// public HtmlLinkClickedException() - { - } + { } /// /// Initializes a new instance of the class with a specified error message. @@ -32,8 +31,7 @@ public HtmlLinkClickedException() /// The message that describes the error. public HtmlLinkClickedException(string message) : base(message) - { - } + { } /// /// Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. @@ -41,7 +39,6 @@ public HtmlLinkClickedException(string message) /// The error message that explains the reason for the exception. The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. public HtmlLinkClickedException(string message, Exception innerException) : base(message, innerException) - { - } + { } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/HtmlRefreshEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlRefreshEventArgs.cs index 239833b93..79c63839a 100644 --- a/Source/HtmlRenderer/Entities/HtmlRefreshEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlRefreshEventArgs.cs @@ -48,4 +48,4 @@ public override string ToString() return string.Format("Layout: {0}", _layout); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/HtmlRenderErrorEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlRenderErrorEventArgs.cs index 0da756896..05e1b32ad 100644 --- a/Source/HtmlRenderer/Entities/HtmlRenderErrorEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlRenderErrorEventArgs.cs @@ -76,4 +76,4 @@ public override string ToString() return string.Format("Type: {0}", _type); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/HtmlRenderErrorType.cs b/Source/HtmlRenderer/Entities/HtmlRenderErrorType.cs index fdc8e9494..ff33b3eef 100644 --- a/Source/HtmlRenderer/Entities/HtmlRenderErrorType.cs +++ b/Source/HtmlRenderer/Entities/HtmlRenderErrorType.cs @@ -27,4 +27,4 @@ public enum HtmlRenderErrorType Iframe = 7, ContextMenu = 8, } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs index 9ed2f7b2a..81c6cf415 100644 --- a/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs @@ -55,4 +55,4 @@ public override string ToString() return string.Format("Location: {0}", _location); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/HtmlStylesheetLoadEventArgs.cs b/Source/HtmlRenderer/Entities/HtmlStylesheetLoadEventArgs.cs index bf84a3722..60dacae67 100644 --- a/Source/HtmlRenderer/Entities/HtmlStylesheetLoadEventArgs.cs +++ b/Source/HtmlRenderer/Entities/HtmlStylesheetLoadEventArgs.cs @@ -108,4 +108,4 @@ public CssData SetStyleSheetData set { _setStyleSheetData = value; } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/RDashStyle.cs b/Source/HtmlRenderer/Entities/RDashStyle.cs index e548d3fa3..d26f9471c 100644 --- a/Source/HtmlRenderer/Entities/RDashStyle.cs +++ b/Source/HtmlRenderer/Entities/RDashStyle.cs @@ -26,4 +26,4 @@ public enum RDashStyle DashDotDot, Custom, } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/RFontStyle.cs b/Source/HtmlRenderer/Entities/RFontStyle.cs index 8db388f26..485190b15 100644 --- a/Source/HtmlRenderer/Entities/RFontStyle.cs +++ b/Source/HtmlRenderer/Entities/RFontStyle.cs @@ -26,4 +26,4 @@ public enum RFontStyle Underline = 4, Strikeout = 8, } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/RKeyEvent.cs b/Source/HtmlRenderer/Entities/RKeyEvent.cs index 649e8a885..eb3606eb3 100644 --- a/Source/HtmlRenderer/Entities/RKeyEvent.cs +++ b/Source/HtmlRenderer/Entities/RKeyEvent.cs @@ -68,4 +68,4 @@ public bool CKeyCode get { return _cKeyCode; } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/RMouseEvent.cs b/Source/HtmlRenderer/Entities/RMouseEvent.cs index 2630bae71..aa3614586 100644 --- a/Source/HtmlRenderer/Entities/RMouseEvent.cs +++ b/Source/HtmlRenderer/Entities/RMouseEvent.cs @@ -40,4 +40,4 @@ public bool LeftButton get { return _leftButton; } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Entities/RPoint.cs b/Source/HtmlRenderer/Entities/RPoint.cs index 4586bf9fd..d8ffe84d8 100644 --- a/Source/HtmlRenderer/Entities/RPoint.cs +++ b/Source/HtmlRenderer/Entities/RPoint.cs @@ -109,7 +109,7 @@ public double Y /// public static RPoint operator +(RPoint pt, RSize sz) { - return RPoint.Add(pt, sz); + return Add(pt, sz); } /// @@ -132,7 +132,7 @@ public double Y /// public static RPoint operator -(RPoint pt, RSize sz) { - return RPoint.Subtract(pt, sz); + return Subtract(pt, sz); } /// @@ -284,10 +284,10 @@ public override int GetHashCode() public override string ToString() { return string.Format("{{X={0}, Y={1}}}", new object[] - { - _x, - _y - }); + { + _x, + _y + }); } } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/GlobalBase.cs b/Source/HtmlRenderer/Interfaces/GlobalBase.cs index b08037f0b..2b7e4f118 100644 --- a/Source/HtmlRenderer/Interfaces/GlobalBase.cs +++ b/Source/HtmlRenderer/Interfaces/GlobalBase.cs @@ -230,4 +230,4 @@ public virtual void SaveToFile(IImage image, string name, string extension, ICon /// font instance protected internal abstract IFont CreateFont(IFontFamily family, double size, RFontStyle style); } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IBrush.cs b/Source/HtmlRenderer/Interfaces/IBrush.cs index b72fbc391..a4c09751c 100644 --- a/Source/HtmlRenderer/Interfaces/IBrush.cs +++ b/Source/HtmlRenderer/Interfaces/IBrush.cs @@ -18,6 +18,5 @@ namespace HtmlRenderer.Interfaces /// atodo: add doc /// public interface IBrush : IDisposable - { - } -} + { } +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IContextMenu.cs b/Source/HtmlRenderer/Interfaces/IContextMenu.cs index 946dc41ef..8abca1285 100644 --- a/Source/HtmlRenderer/Interfaces/IContextMenu.cs +++ b/Source/HtmlRenderer/Interfaces/IContextMenu.cs @@ -51,4 +51,4 @@ public interface IContextMenu : IDisposable /// the location to show at relative to the parent control void Show(IControl parent, RPoint location); } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IControl.cs b/Source/HtmlRenderer/Interfaces/IControl.cs index f1b211c5d..fdd5aa8bb 100644 --- a/Source/HtmlRenderer/Interfaces/IControl.cs +++ b/Source/HtmlRenderer/Interfaces/IControl.cs @@ -75,4 +75,4 @@ public interface IControl /// void Invalidate(); } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IFont.cs b/Source/HtmlRenderer/Interfaces/IFont.cs index 4e839691f..dc22cca05 100644 --- a/Source/HtmlRenderer/Interfaces/IFont.cs +++ b/Source/HtmlRenderer/Interfaces/IFont.cs @@ -44,4 +44,4 @@ public interface IFont double GetWhitespaceWidth(IGraphics graphics); } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IFontFamily.cs b/Source/HtmlRenderer/Interfaces/IFontFamily.cs index 87752b2bc..4bbe93b9b 100644 --- a/Source/HtmlRenderer/Interfaces/IFontFamily.cs +++ b/Source/HtmlRenderer/Interfaces/IFontFamily.cs @@ -23,4 +23,4 @@ public interface IFontFamily /// string Name { get; } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IGraphics.cs b/Source/HtmlRenderer/Interfaces/IGraphics.cs index 0b95112ad..a200d19ec 100644 --- a/Source/HtmlRenderer/Interfaces/IGraphics.cs +++ b/Source/HtmlRenderer/Interfaces/IGraphics.cs @@ -191,4 +191,4 @@ public interface IGraphics : IDisposable /// Array of Point structures that represent the vertices of the polygon to fill. void DrawPolygon(IBrush brush, RPoint[] points); } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs b/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs index 261b9b099..949af63ba 100644 --- a/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs +++ b/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs @@ -35,4 +35,4 @@ public interface IGraphicsPath : IDisposable /// void CloseFigure(); } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IImage.cs b/Source/HtmlRenderer/Interfaces/IImage.cs index 332f793fb..e83f31a54 100644 --- a/Source/HtmlRenderer/Interfaces/IImage.cs +++ b/Source/HtmlRenderer/Interfaces/IImage.cs @@ -36,4 +36,4 @@ public interface IImage : IDisposable /// The Stream where the image will be saved. void Save(MemoryStream stream); } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IPen.cs b/Source/HtmlRenderer/Interfaces/IPen.cs index a7ffb1488..599521367 100644 --- a/Source/HtmlRenderer/Interfaces/IPen.cs +++ b/Source/HtmlRenderer/Interfaces/IPen.cs @@ -34,4 +34,4 @@ public interface IPen /// double[] DashPattern { set; } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Properties/AssemblyInfo.cs b/Source/HtmlRenderer/Properties/AssemblyInfo.cs index 4d8c27d59..7001f4217 100644 --- a/Source/HtmlRenderer/Properties/AssemblyInfo.cs +++ b/Source/HtmlRenderer/Properties/AssemblyInfo.cs @@ -1,5 +1,6 @@ using System.Runtime.CompilerServices; // add specific assemblies to see the internal members of core + [assembly: InternalsVisibleTo("HtmlRenderer.WinForms")] [assembly: InternalsVisibleTo("HtmlRenderer.WPF")] \ No newline at end of file diff --git a/Source/SharedAssemblyInfo.cs b/Source/SharedAssemblyInfo.cs index 380939746..1eea8ef95 100644 --- a/Source/SharedAssemblyInfo.cs +++ b/Source/SharedAssemblyInfo.cs @@ -4,6 +4,7 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("HTML Renderer")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -16,10 +17,13 @@ // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. + [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM + [assembly: Guid("ec8a9e7e-9a9d-43c3-aa97-f6f505b1d3ed")] // Version information for an assembly consists of the following four values: + [assembly: AssemblyVersion("1.5.0.0")] \ No newline at end of file From a3df5c38e06b8b74e5736de6a43c0deea71ce6a6 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Mon, 5 May 2014 11:53:53 +0300 Subject: [PATCH 058/254] update my todo's to new format --- Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs | 2 +- Source/HtmlRenderer/Core/CssData.cs | 2 +- Source/HtmlRenderer/Core/Dom/CssBox.cs | 2 +- Source/HtmlRenderer/Core/Parse/CssValueParser.cs | 2 +- Source/HtmlRenderer/Core/Parse/DomParser.cs | 2 +- Source/HtmlRenderer/Core/Utils/DomUtils.cs | 6 +++--- Source/HtmlRenderer/Core/Utils/RenderUtils.cs | 2 +- Source/HtmlRenderer/Interfaces/GlobalBase.cs | 2 +- Source/HtmlRenderer/Interfaces/IBrush.cs | 2 +- Source/HtmlRenderer/Interfaces/IContextMenu.cs | 2 +- Source/HtmlRenderer/Interfaces/IControl.cs | 2 +- Source/HtmlRenderer/Interfaces/IFont.cs | 2 +- Source/HtmlRenderer/Interfaces/IFontFamily.cs | 2 +- Source/HtmlRenderer/Interfaces/IGraphicsPath.cs | 2 +- Source/HtmlRenderer/Interfaces/IImage.cs | 2 +- Source/HtmlRenderer/Interfaces/IPen.cs | 2 +- 16 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs index ee6eb0b0a..c8740131e 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs @@ -212,7 +212,7 @@ public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, d /// The dimension by which to translate the transformation public IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation) { - // atodo: handle missing TextureBrush + // TODO:a handle missing TextureBrush // var brush = new TextureBrush(((ImageAdapter)image).Image, Utils.Convert(dstRect)); // brush.TranslateTransform(translateTransformLocation.X, translateTransformLocation.Y); // return new BrushAdapter(brush, true); diff --git a/Source/HtmlRenderer/Core/CssData.cs b/Source/HtmlRenderer/Core/CssData.cs index b439cd270..fd6e886e3 100644 --- a/Source/HtmlRenderer/Core/CssData.cs +++ b/Source/HtmlRenderer/Core/CssData.cs @@ -57,7 +57,7 @@ internal CssData() /// default css data (as defined by W3), merged if class name already exists. If false only the data in the given stylesheet is returned. /// /// - /// atodo: add doc + /// TODO:a add doc /// the stylesheet source to parse /// true - combine the parsed css data with default css data, false - return only the parsed css data /// the parsed css data diff --git a/Source/HtmlRenderer/Core/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs index c740e06d2..9cfa2bf96 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -1200,7 +1200,7 @@ protected void PaintBackground(IGraphics g, RRect rect, bool isFirst, bool isLas if (brush != null) { - // atodo: handle it correctly (tables background) + // TODO:a handle it correctly (tables background) // if (isLast) // rectangle.Width -= ActualWordSpacing + CssUtils.GetWordEndWhitespace(ActualFont); diff --git a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs index a7131474e..972e59667 100644 --- a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs @@ -213,7 +213,7 @@ public static double ParseLength(string length, double hundredPercent, double em factor = emFactor / 2; break; case CssConstants.Px: - factor = fontAdjust ? 72f / 96f : 1f; //atodo: check support for hi dpi + factor = fontAdjust ? 72f / 96f : 1f; //TODO:a check support for hi dpi break; case CssConstants.Mm: factor = 3.779527559f; //3 pixels per millimeter diff --git a/Source/HtmlRenderer/Core/Parse/DomParser.cs b/Source/HtmlRenderer/Core/Parse/DomParser.cs index ebcd27490..e10d855fc 100644 --- a/Source/HtmlRenderer/Core/Parse/DomParser.cs +++ b/Source/HtmlRenderer/Core/Parse/DomParser.cs @@ -653,7 +653,7 @@ private static void CorrectLineBreaksBlocks(CssBox box, ref bool followingBlock) { brBox.Display = CssConstants.Block; if (followingBlock) - brBox.Height = ".95em"; // atodo: check the height to min-height when it is supported + brBox.Height = ".95em"; // TODO:a check the height to min-height when it is supported } } while (brBox != null); } diff --git a/Source/HtmlRenderer/Core/Utils/DomUtils.cs b/Source/HtmlRenderer/Core/Utils/DomUtils.cs index 961983739..587b0a599 100644 --- a/Source/HtmlRenderer/Core/Utils/DomUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/DomUtils.cs @@ -727,7 +727,7 @@ private static void WriteHtmlTag(CssParser cssParser, StringBuilder sb, CssBox b var tagCssBlock = box.HtmlContainer.CssData.GetCssBlock(box.HtmlTag.Name); if (tagCssBlock != null) { - // atodo: handle selectors + // TODO:a handle selectors foreach (var cssBlock in tagCssBlock) foreach (var prop in cssBlock.Properties) tagStyles[prop.Key] = prop.Value; @@ -752,7 +752,7 @@ private static void WriteHtmlTag(CssParser cssParser, StringBuilder sb, CssBox b var cssBlocks = box.HtmlContainer.CssData.GetCssBlock("." + att.Value); if (cssBlocks != null) { - // atodo: handle selectors + // TODO:a handle selectors foreach (var cssBlock in cssBlocks) foreach (var prop in cssBlock.Properties) tagStyles[prop.Key] = prop.Value; @@ -832,7 +832,7 @@ private static void WriteStylesheet(StringBuilder sb, CssData cssData) { foreach (var property in cssBlock.Properties) { - // atodo: handle selectors + // TODO:a handle selectors sb.AppendFormat("{0}: {1};", property.Key, property.Value); } } diff --git a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs index 75d95a55f..c87af7162 100644 --- a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs @@ -49,7 +49,7 @@ public static RRect ClipGraphicsByOverflow(IGraphics g, CssBox box) { var prevClip = g.GetClip(); var rect = box.ContainingBlock.ClientRectangle; - rect.X -= 2; // atodo: find better way to fix it + rect.X -= 2; // TODO:a find better way to fix it rect.Width += 2; rect.Offset(box.HtmlContainer.ScrollOffset); rect.Intersect(prevClip); diff --git a/Source/HtmlRenderer/Interfaces/GlobalBase.cs b/Source/HtmlRenderer/Interfaces/GlobalBase.cs index 2b7e4f118..e467d3767 100644 --- a/Source/HtmlRenderer/Interfaces/GlobalBase.cs +++ b/Source/HtmlRenderer/Interfaces/GlobalBase.cs @@ -21,7 +21,7 @@ namespace HtmlRenderer.Interfaces { /// - /// atodo: add doc + /// TODO:a add doc /// /// /// It is best to have a singleton instance of this class for concrete implementation!
    diff --git a/Source/HtmlRenderer/Interfaces/IBrush.cs b/Source/HtmlRenderer/Interfaces/IBrush.cs index a4c09751c..518edce7a 100644 --- a/Source/HtmlRenderer/Interfaces/IBrush.cs +++ b/Source/HtmlRenderer/Interfaces/IBrush.cs @@ -15,7 +15,7 @@ namespace HtmlRenderer.Interfaces { /// - /// atodo: add doc + /// TODO:a add doc /// public interface IBrush : IDisposable { } diff --git a/Source/HtmlRenderer/Interfaces/IContextMenu.cs b/Source/HtmlRenderer/Interfaces/IContextMenu.cs index 8abca1285..75bdbc6b9 100644 --- a/Source/HtmlRenderer/Interfaces/IContextMenu.cs +++ b/Source/HtmlRenderer/Interfaces/IContextMenu.cs @@ -16,7 +16,7 @@ namespace HtmlRenderer.Interfaces { /// - /// atodo: add doc + /// TODO:a add doc /// public interface IContextMenu : IDisposable { diff --git a/Source/HtmlRenderer/Interfaces/IControl.cs b/Source/HtmlRenderer/Interfaces/IControl.cs index fdd5aa8bb..9d7acca53 100644 --- a/Source/HtmlRenderer/Interfaces/IControl.cs +++ b/Source/HtmlRenderer/Interfaces/IControl.cs @@ -15,7 +15,7 @@ namespace HtmlRenderer.Interfaces { /// - /// aTODO: add doc + /// TODO:a add doc /// public interface IControl { diff --git a/Source/HtmlRenderer/Interfaces/IFont.cs b/Source/HtmlRenderer/Interfaces/IFont.cs index dc22cca05..2cadf21ec 100644 --- a/Source/HtmlRenderer/Interfaces/IFont.cs +++ b/Source/HtmlRenderer/Interfaces/IFont.cs @@ -13,7 +13,7 @@ namespace HtmlRenderer.Interfaces { /// - /// atodo: add doc + /// TODO:a add doc /// public interface IFont { diff --git a/Source/HtmlRenderer/Interfaces/IFontFamily.cs b/Source/HtmlRenderer/Interfaces/IFontFamily.cs index 4bbe93b9b..caf7445f2 100644 --- a/Source/HtmlRenderer/Interfaces/IFontFamily.cs +++ b/Source/HtmlRenderer/Interfaces/IFontFamily.cs @@ -13,7 +13,7 @@ namespace HtmlRenderer.Interfaces { /// - /// atodo: add doc + /// TODO:a add doc /// Required for custom fonts handling: fonts that are not installed on the system. /// public interface IFontFamily diff --git a/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs b/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs index 949af63ba..ef969f5ba 100644 --- a/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs +++ b/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs @@ -15,7 +15,7 @@ namespace HtmlRenderer.Interfaces { /// - /// atodo: add doc + /// TODO:a add doc /// public interface IGraphicsPath : IDisposable { diff --git a/Source/HtmlRenderer/Interfaces/IImage.cs b/Source/HtmlRenderer/Interfaces/IImage.cs index e83f31a54..6ad195d2c 100644 --- a/Source/HtmlRenderer/Interfaces/IImage.cs +++ b/Source/HtmlRenderer/Interfaces/IImage.cs @@ -16,7 +16,7 @@ namespace HtmlRenderer.Interfaces { /// - /// aTODO: add doc + /// TODO:a add doc /// public interface IImage : IDisposable { diff --git a/Source/HtmlRenderer/Interfaces/IPen.cs b/Source/HtmlRenderer/Interfaces/IPen.cs index 599521367..b493bb673 100644 --- a/Source/HtmlRenderer/Interfaces/IPen.cs +++ b/Source/HtmlRenderer/Interfaces/IPen.cs @@ -15,7 +15,7 @@ namespace HtmlRenderer.Interfaces { /// - /// atodo: add doc + /// TODO:a add doc /// public interface IPen { From e748f68864cd1b4e5c24618e2471fc192c9ee974 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Mon, 5 May 2014 14:07:52 +0300 Subject: [PATCH 059/254] refactor addpaters --- .../Adapters/FontAdapter.cs | 2 +- .../Adapters/GlobalAdapter.cs | 117 ----------- .../Adapters/GraphicsAdapter.cs | 109 ++++------ .../Adapters/PdfSharpAdapter.cs | 97 +++++++++ Source/HtmlRenderer.PdfSharp/HtmlContainer.cs | 2 +- .../HtmlRenderer.PdfSharp.csproj | 2 +- .../Adapters/ControlAdapter.cs | 2 +- .../Adapters/FontAdapter.cs | 2 +- .../Adapters/GlobalAdapter.cs | 177 ---------------- .../Adapters/GraphicsAdapter.cs | 192 +++--------------- .../Adapters/WinFormsAdapter.cs | 144 +++++++++++++ Source/HtmlRenderer.WinForms/HtmlContainer.cs | 2 +- Source/HtmlRenderer.WinForms/HtmlRender.cs | 6 +- .../HtmlRenderer.WinForms.csproj | 3 +- .../Utilities/CacheUtils.cs | 86 -------- Source/HtmlRenderer/Core/CssData.cs | 6 +- Source/HtmlRenderer/Core/Dom/CssBox.cs | 22 +- Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs | 12 +- Source/HtmlRenderer/Core/Dom/CssBoxHr.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssBoxImage.cs | 4 +- .../HtmlRenderer/Core/Dom/CssBoxProperties.cs | 2 +- .../HtmlRenderer/Core/Dom/CssLayoutEngine.cs | 18 +- .../Core/Dom/CssLayoutEngineTable.cs | 8 +- Source/HtmlRenderer/Core/Dom/CssLineBox.cs | 2 +- .../Handlers/BackgroundImageDrawHandler.cs | 8 +- .../Core/Handlers/BordersDrawHandler.cs | 10 +- .../Core/Handlers/ContextMenuHandler.cs | 10 +- .../HtmlRenderer/Core/Handlers/FontHandler.cs | 12 +- .../Core/Handlers/ImageLoadHandler.cs | 6 +- .../Core/Handlers/SelectionHandler.cs | 2 +- Source/HtmlRenderer/Core/HtmlContainerInt.cs | 20 +- Source/HtmlRenderer/Core/HtmlRendererUtils.cs | 4 +- Source/HtmlRenderer/Core/Parse/CssParser.cs | 14 +- .../HtmlRenderer/Core/Parse/CssValueParser.cs | 10 +- Source/HtmlRenderer/Core/Utils/CssUtils.cs | 2 +- Source/HtmlRenderer/Core/Utils/DomUtils.cs | 2 +- Source/HtmlRenderer/Core/Utils/RenderUtils.cs | 14 +- Source/HtmlRenderer/HtmlRenderer.csproj | 4 +- .../{GlobalBase.cs => AdapterBase.cs} | 177 ++++++++++++++-- .../{IGraphics.cs => GraphicsBase.cs} | 115 +++++++---- Source/HtmlRenderer/Interfaces/IControl.cs | 2 +- Source/HtmlRenderer/Interfaces/IFont.cs | 2 +- 42 files changed, 655 insertions(+), 780 deletions(-) delete mode 100644 Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs create mode 100644 Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs delete mode 100644 Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs create mode 100644 Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs delete mode 100644 Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs rename Source/HtmlRenderer/Interfaces/{GlobalBase.cs => AdapterBase.cs} (56%) rename Source/HtmlRenderer/Interfaces/{IGraphics.cs => GraphicsBase.cs} (76%) diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs index 61bb141e4..6082f20d9 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs @@ -103,7 +103,7 @@ public double LeftPadding } - public double GetWhitespaceWidth(IGraphics graphics) + public double GetWhitespaceWidth(GraphicsBase graphics) { if( _whitespaceWidth < 0 ) { diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs deleted file mode 100644 index a65078247..000000000 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GlobalAdapter.cs +++ /dev/null @@ -1,117 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -using System.Drawing; -using System.IO; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; -using HtmlRenderer.PdfSharp.Utilities; -using PdfSharp.Drawing; - -namespace HtmlRenderer.PdfSharp.Adapters -{ - /// - /// Adapter for general stuff for core. - /// - internal sealed class GlobalAdapter : GlobalBase - { - #region Fields and Consts - - /// - /// Singleton instance of global adapter. - /// - private static readonly GlobalAdapter _instance = new GlobalAdapter(); - - #endregion - - - /// - /// Init color resolve. - /// - private GlobalAdapter() - { - AddFontFamilyMapping("monospace", "Courier New"); - AddFontFamilyMapping("Helvetica", "Arial"); - - foreach (var family in XFontFamily.Families) - { - AddFontFamily(new FontFamilyAdapter(family)); - } - } - - /// - /// Singleton instance of global adapter. - /// - public static GlobalAdapter Instance - { - get { return _instance; } - } - - /// - /// Resolve color value from given color name. - /// - /// the color name - /// color value - public override RColor GetColor(string colorName) - { - var color = XColor.FromName(colorName); - return Utils.Convert(color); - } - - /// - /// Convert image object returned from to . - /// - /// the image returned from load event - /// converted image or null - public override IImage ConvertImage(object image) - { - return image != null ? new ImageAdapter((XImage)image) : null; - } - - /// - /// Create an object from the given stream. - /// - /// the stream to create image from - /// new image instance - public override IImage ImageFromStream(Stream memoryStream) - { - return new ImageAdapter(XImage.FromGdiPlusImage(Image.FromStream(memoryStream))); - } - - /// - /// Get font instance by given font family name, size and style. - /// - /// the font family name - /// font size - /// font style - /// font instance - protected override IFont CreateFont(string family, double size, RFontStyle style) - { - var fontStyle = (XFontStyle)((int)style); - return new FontAdapter(new XFont(family, size, fontStyle)); - } - - /// - /// Get font instance by given font family instance, size and style.
    - /// Used to support custom fonts that require explicit font family instance to be created. - ///
    - /// the font family instance - /// font size - /// font style - /// font instance - protected override IFont CreateFont(IFontFamily family, double size, RFontStyle style) - { - var fontStyle = (XFontStyle)((int)style); - return new FontAdapter(new XFont(((FontFamilyAdapter)family).FontFamily.Name, size, fontStyle)); - } - } -} diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs index c8740131e..f4bf3be4a 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs @@ -24,7 +24,7 @@ namespace HtmlRenderer.PdfSharp.Adapters /// /// Adapter for WinForms Graphics for core. /// - internal sealed class GraphicsAdapter : IGraphics + internal sealed class GraphicsAdapter : GraphicsBase { #region Fields and Consts @@ -47,6 +47,7 @@ internal sealed class GraphicsAdapter : IGraphics /// the win forms graphics object to use /// optional: if to release the graphics object on dispose (default - false) public GraphicsAdapter(XGraphics g, bool releaseGraphics = false) + : base(PdfSharpAdapter.Instance) { ArgChecker.AssertArgNotNull(g, "g"); @@ -58,7 +59,7 @@ public GraphicsAdapter(XGraphics g, bool releaseGraphics = false) /// Gets the bounding clipping region of this graphics. ///
    /// The bounding rectangle for the clipping region - public RRect GetClip() + public override RRect GetClip() { RectangleF clip = _g.Graphics.ClipBounds; return Utils.Convert(clip); @@ -68,7 +69,7 @@ public RRect GetClip() /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. /// /// Rectangle structure to combine. - public void SetClipReplace(RRect rect) + public override void SetClipReplace(RRect rect) { _g.Graphics.SetClip(new RectangleF((float)rect.X, (float)rect.Y, (float)rect.Width, (float)rect.Height), CombineMode.Replace); } @@ -77,7 +78,7 @@ public void SetClipReplace(RRect rect) /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. /// /// Rectangle structure to combine. - public void SetClipExclude(RRect rect) + public override void SetClipExclude(RRect rect) { _g.Graphics.SetClip(new RectangleF((float)rect.X, (float)rect.Y, (float)rect.Width, (float)rect.Height), CombineMode.Exclude); } @@ -87,7 +88,7 @@ public void SetClipExclude(RRect rect) /// Use to return back the mode used. /// /// the previous smooth mode before the change - public Object SetAntiAliasSmoothingMode() + public override Object SetAntiAliasSmoothingMode() { var prevMode = _g.SmoothingMode; _g.SmoothingMode = XSmoothingMode.AntiAlias; @@ -98,7 +99,7 @@ public Object SetAntiAliasSmoothingMode() /// Return to previous smooth mode before anti-alias was set as returned from . /// /// the previous mode to set - public void ReturnPreviousSmoothingMode(Object prevMode) + public override void ReturnPreviousSmoothingMode(Object prevMode) { if (prevMode != null) { @@ -113,21 +114,21 @@ public void ReturnPreviousSmoothingMode(Object prevMode) /// the string to measure /// the font to measure string with /// the size of the string - public RSize MeasureString(string str, IFont font) + public override RSize MeasureString(string str, IFont font) { - var fontAdapter = (FontAdapter)font; - var realFont = fontAdapter.Font; - var size = _g.MeasureString(str, realFont); - - if (font.Height < 0) - { - var height = realFont.Height; - var descent = realFont.Size * realFont.FontFamily.GetCellDescent(realFont.Style) / realFont.FontFamily.GetEmHeight(realFont.Style); - fontAdapter.SetMetrics(height, (int)Math.Round(( height - descent + .5f ))); - } - - return Utils.Convert(size); - + var fontAdapter = (FontAdapter)font; + var realFont = fontAdapter.Font; + var size = _g.MeasureString(str, realFont); + + if (font.Height < 0) + { + var height = realFont.Height; + var descent = realFont.Size * realFont.FontFamily.GetCellDescent(realFont.Style) / realFont.FontFamily.GetEmHeight(realFont.Style); + fontAdapter.SetMetrics(height, (int)Math.Round((height - descent + .5f))); + } + + return Utils.Convert(size); + } /// @@ -142,7 +143,7 @@ public RSize MeasureString(string str, IFont font) /// the number of characters that will fit under restriction /// /// the size of the string - public RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth) + public override RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth) { throw new NotSupportedException(); } @@ -156,30 +157,10 @@ public RSize MeasureString(string str, IFont font, double maxWidth, out int char /// the location to start string draw (top-left) /// used to know the size of the rendered text for transparent text support /// is to render the string right-to-left (true - RTL, false - LTR) - public void DrawString(string str, IFont font, RColor color, RPoint point, RSize size, bool rtl) + public override void DrawString(string str, IFont font, RColor color, RPoint point, RSize size, bool rtl) { var brush = new XSolidBrush(Utils.Convert(color)); - _g.DrawString(str, ( (FontAdapter)font ).Font, brush, point.X - font.LeftPadding*.8f, point.Y); - } - - /// - /// Get color pen. - /// - /// the color to get the pen for - /// pen instance - public IPen GetPen(RColor color) - { - return new PenAdapter(new XPen(Utils.Convert(color))); - } - - /// - /// Get solid color brush. - /// - /// the color to get the brush for - /// solid color brush instance - public IBrush GetSolidBrush(RColor color) - { - return new BrushAdapter(new XSolidBrush(Utils.Convert(color))); + _g.DrawString(str, ((FontAdapter)font).Font, brush, point.X - font.LeftPadding * .8f, point.Y); } /// @@ -190,10 +171,10 @@ public IBrush GetSolidBrush(RColor color) /// the end color of the gradient /// the angle to move the gradient from start color to end color in the rectangle /// linear gradient color brush instance - public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) + public override IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) { XLinearGradientMode mode; - if(angle < 45) + if (angle < 45) mode = XLinearGradientMode.ForwardDiagonal; else if (angle < 90) mode = XLinearGradientMode.Vertical; @@ -210,12 +191,12 @@ public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, d /// The Image object with which this TextureBrush object fills interiors. /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. /// The dimension by which to translate the transformation - public IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation) + public override IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation) { // TODO:a handle missing TextureBrush -// var brush = new TextureBrush(((ImageAdapter)image).Image, Utils.Convert(dstRect)); -// brush.TranslateTransform(translateTransformLocation.X, translateTransformLocation.Y); -// return new BrushAdapter(brush, true); + // var brush = new TextureBrush(((ImageAdapter)image).Image, Utils.Convert(dstRect)); + // brush.TranslateTransform(translateTransformLocation.X, translateTransformLocation.Y); + // return new BrushAdapter(brush, true); return new BrushAdapter(new XSolidBrush(XColors.DeepPink)); } @@ -223,7 +204,7 @@ public IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTrans /// Get GraphicsPath object. /// /// graphics path instance - public IGraphicsPath GetGraphicsPath() + public override IGraphicsPath GetGraphicsPath() { return new GraphicsPathAdapter(); } @@ -231,12 +212,12 @@ public IGraphicsPath GetGraphicsPath() /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// - public void Dispose() + public override void Dispose() { - if(_releaseGraphics) + if (_releaseGraphics) _g.Dispose(); } - + #region Delegate graphics methods @@ -247,7 +228,7 @@ public void Dispose() /// The x-coordinate of the first point. The y-coordinate of the first point. /// The x-coordinate of the second point. The y-coordinate of the second point. /// is null. - public void DrawLine(IPen pen, double x1, double y1, double x2, double y2) + public override void DrawLine(IPen pen, double x1, double y1, double x2, double y2) { _g.DrawLine(((PenAdapter)pen).Pen, x1, y1, x2, y2); } @@ -260,7 +241,7 @@ public void DrawLine(IPen pen, double x1, double y1, double x2, double y2) /// The y-coordinate of the upper-left corner of the rectangle to draw. /// The width of the rectangle to draw. /// The height of the rectangle to draw. - public void DrawRectangle(IPen pen, double x, double y, double width, double height) + public override void DrawRectangle(IPen pen, double x, double y, double width, double height) { _g.DrawRectangle(((PenAdapter)pen).Pen, x, y, width, height); } @@ -273,7 +254,7 @@ public void DrawRectangle(IPen pen, double x, double y, double width, double hei /// The y-coordinate of the upper-left corner of the rectangle to fill. /// Width of the rectangle to fill. /// Height of the rectangle to fill. - public void DrawRectangle(IBrush brush, double x, double y, double width, double height) + public override void DrawRectangle(IBrush brush, double x, double y, double width, double height) { _g.DrawRectangle(((BrushAdapter)brush).Brush, x, y, width, height); } @@ -284,7 +265,7 @@ public void DrawRectangle(IBrush brush, double x, double y, double width, double /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. The image is scaled to fit the rectangle. /// Rectangle structure that specifies the portion of the object to draw. - public void DrawImage(IImage image, RRect destRect, RRect srcRect) + public override void DrawImage(IImage image, RRect destRect, RRect srcRect) { _g.DrawImage(((ImageAdapter)image).Image, Utils.Convert(destRect), Utils.Convert(srcRect), XGraphicsUnit.Point); } @@ -294,9 +275,9 @@ public void DrawImage(IImage image, RRect destRect, RRect srcRect) /// /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. - public void DrawImage(IImage image, RRect destRect) + public override void DrawImage(IImage image, RRect destRect) { - _g.DrawImage(( (ImageAdapter)image ).Image, Utils.Convert(destRect)); + _g.DrawImage(((ImageAdapter)image).Image, Utils.Convert(destRect)); } /// @@ -304,7 +285,7 @@ public void DrawImage(IImage image, RRect destRect) /// /// Pen that determines the color, width, and style of the path. /// GraphicsPath to draw. - public void DrawPath(IPen pen, IGraphicsPath path) + public override void DrawPath(IPen pen, IGraphicsPath path) { _g.DrawPath(((PenAdapter)pen).Pen, ((GraphicsPathAdapter)path).GraphicsPath); } @@ -314,7 +295,7 @@ public void DrawPath(IPen pen, IGraphicsPath path) /// /// Brush that determines the characteristics of the fill. /// GraphicsPath that represents the path to fill. - public void DrawPath(IBrush brush, IGraphicsPath path) + public override void DrawPath(IBrush brush, IGraphicsPath path) { _g.DrawPath(((BrushAdapter)brush).Brush, ((GraphicsPathAdapter)path).GraphicsPath); } @@ -324,11 +305,11 @@ public void DrawPath(IBrush brush, IGraphicsPath path) /// /// Brush that determines the characteristics of the fill. /// Array of Point structures that represent the vertices of the polygon to fill. - public void DrawPolygon(IBrush brush, RPoint[] points) + public override void DrawPolygon(IBrush brush, RPoint[] points) { - if( points != null && points.Length > 0 ) + if (points != null && points.Length > 0) { - _g.DrawPolygon(( (BrushAdapter)brush ).Brush, Utils.Convert(points), XFillMode.Winding); + _g.DrawPolygon(((BrushAdapter)brush).Brush, Utils.Convert(points), XFillMode.Winding); } } diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs new file mode 100644 index 000000000..b12a31758 --- /dev/null +++ b/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs @@ -0,0 +1,97 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System.Drawing; +using System.IO; +using HtmlRenderer.Entities; +using HtmlRenderer.Interfaces; +using HtmlRenderer.PdfSharp.Utilities; +using PdfSharp.Drawing; + +namespace HtmlRenderer.PdfSharp.Adapters +{ + /// + /// Adapter for general stuff for core. + /// TODO:a add doc. + /// + internal sealed class PdfSharpAdapter : AdapterBase + { + #region Fields and Consts + + /// + /// Singleton instance of global adapter. + /// + private static readonly PdfSharpAdapter _instance = new PdfSharpAdapter(); + + #endregion + + + /// + /// Init color resolve. + /// + private PdfSharpAdapter() + { + AddFontFamilyMapping("monospace", "Courier New"); + AddFontFamilyMapping("Helvetica", "Arial"); + + foreach (var family in XFontFamily.Families) + { + AddFontFamily(new FontFamilyAdapter(family)); + } + } + + /// + /// Singleton instance of global adapter. + /// + public static PdfSharpAdapter Instance + { + get { return _instance; } + } + + protected override RColor GetColorInt(string colorName) + { + return Utils.Convert(XColor.FromName(colorName)); + } + + protected override IPen CreatePen(RColor color) + { + return null; + } + + protected override IBrush CreateSolidBrush(RColor color) + { + return null; + } + + protected override IImage ConvertImageInt(object image) + { + return image != null ? new ImageAdapter((XImage)image) : null; + } + + protected override IImage ImageFromStreamInt(Stream memoryStream) + { + return new ImageAdapter(XImage.FromGdiPlusImage(Image.FromStream(memoryStream))); + } + + protected override IFont CreateFontInt(string family, double size, RFontStyle style) + { + var fontStyle = (XFontStyle)((int)style); + return new FontAdapter(new XFont(family, size, fontStyle)); + } + + protected override IFont CreateFontInt(IFontFamily family, double size, RFontStyle style) + { + var fontStyle = (XFontStyle)((int)style); + return new FontAdapter(new XFont(((FontFamilyAdapter)family).FontFamily.Name, size, fontStyle)); + } + } +} diff --git a/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs b/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs index f0b564eb9..3e5818ad2 100644 --- a/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs +++ b/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs @@ -41,7 +41,7 @@ public sealed class HtmlContainer : IDisposable /// public HtmlContainer() { - _htmlContainerInt = new HtmlContainerInt(GlobalAdapter.Instance); + _htmlContainerInt = new HtmlContainerInt(PdfSharpAdapter.Instance); } /// diff --git a/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj b/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj index c29c37c2a..22b41b4be 100644 --- a/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj +++ b/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj @@ -52,7 +52,7 @@ - + diff --git a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs index bd77ac532..cf921cbde 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs @@ -125,7 +125,7 @@ public void DoDragDropCopy(object dragDropData) /// Create graphics object that can be used with the control. /// /// graphics object - public IGraphics CreateGraphics() + public GraphicsBase CreateGraphics() { // the win forms graphics object will be disposed by WinGraphics return new GraphicsAdapter(_control.CreateGraphics(), _useGdiPlusTextRendering, true); diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs index 367494374..5a29cc331 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs @@ -121,7 +121,7 @@ public double LeftPadding } - public double GetWhitespaceWidth(IGraphics graphics) + public double GetWhitespaceWidth(GraphicsBase graphics) { if (_whitespaceWidth < 0) { diff --git a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs deleted file mode 100644 index 73de08dba..000000000 --- a/Source/HtmlRenderer.WinForms/Adapters/GlobalAdapter.cs +++ /dev/null @@ -1,177 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -using System.Drawing; -using System.IO; -using System.Windows.Forms; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; -using HtmlRenderer.WinForms.Utilities; - -namespace HtmlRenderer.WinForms.Adapters -{ - /// - /// Adapter for general stuff for core. - /// - internal sealed class GlobalAdapter : GlobalBase - { - #region Fields and Consts - - /// - /// Singleton instance of global adapter. - /// - private static readonly GlobalAdapter _instance = new GlobalAdapter(); - - #endregion - - - /// - /// Init color resolve. - /// - private GlobalAdapter() - { - AddFontFamilyMapping("monospace", "Courier New"); - AddFontFamilyMapping("Helvetica", "Arial"); - - foreach (var family in FontFamily.Families) - { - AddFontFamily(new FontFamilyAdapter(family)); - } - } - - /// - /// Singleton instance of global adapter. - /// - public static GlobalAdapter Instance - { - get { return _instance; } - } - - /// - /// Resolve color value from given color name. - /// - /// the color name - /// color value - public override RColor GetColor(string colorName) - { - var color = Color.FromName(colorName); - return Utils.Convert(color); - } - - /// - /// Convert image object returned from to . - /// - /// the image returned from load event - /// converted image or null - public override IImage ConvertImage(object image) - { - return image != null ? new ImageAdapter((Image)image) : null; - } - - /// - /// Create an object from the given stream. - /// - /// the stream to create image from - /// new image instance - public override IImage ImageFromStream(Stream memoryStream) - { - return new ImageAdapter(Image.FromStream(memoryStream)); - } - - /// - /// Set the given text to the clipboard - /// - /// the text to set - public override void SetToClipboard(string text) - { - Clipboard.SetText(text); - } - - /// - /// Copy the given html and plain text data to clipboard. - /// - /// the html data - /// the plain text data - public override void SetToClipboard(string html, string plainText) - { - ClipboardHelper.CopyToClipboard(html, plainText); - } - - /// - /// Set the given image to clipboard. - /// - /// - public override void SetToClipboard(IImage image) - { - Clipboard.SetImage(((ImageAdapter)image).Image); - } - - /// - /// Create a context menu that can be used on the control - /// - /// new context menu - public override IContextMenu CreateContextMenu() - { - return new ContextMenuAdapter(); - } - - /// - /// Save the given image to file by showing save dialog to the client. - /// - /// the image to save - /// the name of the image for save dialog - /// the extension of the image for save dialog - /// optional: the control to show the dialog on - public override void SaveToFile(IImage image, string name, string extension, IControl control = null) - { - using (var saveDialog = new SaveFileDialog()) - { - saveDialog.Filter = "Images|*.png;*.bmp;*.jpg"; - saveDialog.FileName = name; - saveDialog.DefaultExt = extension; - - var dialogResult = control == null ? saveDialog.ShowDialog() : saveDialog.ShowDialog(((ControlAdapter)control).Control); - if (dialogResult == DialogResult.OK) - { - ((ImageAdapter)image).Image.Save(saveDialog.FileName); - } - } - } - - /// - /// Get font instance by given font family name, size and style. - /// - /// the font family name - /// font size - /// font style - /// font instance - protected internal override IFont CreateFont(string family, double size, RFontStyle style) - { - var fontStyle = (FontStyle)((int)style); - return new FontAdapter(new Font(family, (float)size, fontStyle)); - } - - /// - /// Get font instance by given font family instance, size and style.
    - /// Used to support custom fonts that require explicit font family instance to be created. - ///
    - /// the font family instance - /// font size - /// font style - /// font instance - protected internal override IFont CreateFont(IFontFamily family, double size, RFontStyle style) - { - var fontStyle = (FontStyle)((int)style); - return new FontAdapter(new Font(((FontFamilyAdapter)family).FontFamily, (float)size, fontStyle)); - } - } -} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs index e4f5e6af4..56ab01481 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs @@ -23,7 +23,7 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for WinForms Graphics for core. /// - internal sealed class GraphicsAdapter : IGraphics + internal sealed class GraphicsAdapter : GraphicsBase { #region Fields and Consts @@ -98,6 +98,7 @@ static GraphicsAdapter() /// Use GDI+ text rendering to measure/draw text /// optional: if to release the graphics object on dispose (default - false) public GraphicsAdapter(Graphics g, bool useGdiPlusTextRendering, bool releaseGraphics = false) + : base(WinFormsAdapter.Instance) { ArgChecker.AssertArgNotNull(g, "g"); @@ -106,11 +107,12 @@ public GraphicsAdapter(Graphics g, bool useGdiPlusTextRendering, bool releaseGra _releaseGraphics = releaseGraphics; } - /// - /// Gets the bounding clipping region of this graphics. - /// - /// The bounding rectangle for the clipping region - public RRect GetClip() + public override IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) + { + return new BrushAdapter(new LinearGradientBrush(Utils.Convert(rect), Utils.Convert(color1), Utils.Convert(color2), (float)angle), true); + } + + public override RRect GetClip() { RectangleF clip; if (_hdc == IntPtr.Zero) @@ -126,32 +128,19 @@ public RRect GetClip() return Utils.Convert(clip); } - /// - /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. - /// - /// Rectangle structure to combine. - public void SetClipReplace(RRect rect) + public override void SetClipReplace(RRect rect) { ReleaseHdc(); _g.SetClip(Utils.Convert(rect), CombineMode.Replace); } - /// - /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. - /// - /// Rectangle structure to combine. - public void SetClipExclude(RRect rect) + public override void SetClipExclude(RRect rect) { ReleaseHdc(); _g.SetClip(Utils.Convert(rect), CombineMode.Exclude); } - /// - /// Set the graphics smooth mode to use anti-alias.
    - /// Use to return back the mode used. - ///
    - /// the previous smooth mode before the change - public Object SetAntiAliasSmoothingMode() + public override Object SetAntiAliasSmoothingMode() { ReleaseHdc(); var prevMode = _g.SmoothingMode; @@ -159,11 +148,7 @@ public Object SetAntiAliasSmoothingMode() return prevMode; } - /// - /// Return to previous smooth mode before anti-alias was set as returned from . - /// - /// the previous mode to set - public void ReturnPreviousSmoothingMode(Object prevMode) + public override void ReturnPreviousSmoothingMode(Object prevMode) { if (prevMode != null) { @@ -172,14 +157,7 @@ public void ReturnPreviousSmoothingMode(Object prevMode) } } - /// - /// Measure the width and height of string when drawn on device context HDC - /// using the given font . - /// - /// the string to measure - /// the font to measure string with - /// the size of the string - public RSize MeasureString(string str, IFont font) + public override RSize MeasureString(string str, IFont font) { if (_useGdiPlusTextRendering) { @@ -216,19 +194,7 @@ public RSize MeasureString(string str, IFont font) } } - /// - /// Measure the width and height of string when drawn on device context HDC - /// using the given font .
    - /// Restrict the width of the string and get the number of characters able to fit in the restriction and - /// the width those characters take. - ///
    - /// the string to measure - /// the font to measure string with - /// the max width to render the string in - /// the number of characters that will fit under restriction - /// the width that only the fitted characters take - /// the size of the string - public RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth) + public override RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth) { charFit = 0; charFitWidth = 0; @@ -262,16 +228,7 @@ public RSize MeasureString(string str, IFont font, double maxWidth, out int char } } - /// - /// Draw the given string using the given font and foreground color at given location. - /// - /// the string to draw - /// the font to use to draw the string - /// the text color to set - /// the location to start string draw (top-left) - /// used to know the size of the rendered text for transparent text support - /// is to render the string right-to-left (true - RTL, false - LTR) - public void DrawString(string str, IFont font, RColor color, RPoint point, RSize size, bool rtl) + public override void DrawString(string str, IFont font, RColor color, RPoint point, RSize size, bool rtl) { var pointConv = Utils.ConvertRound(point); var colorConv = Utils.Convert(color); @@ -280,7 +237,7 @@ public void DrawString(string str, IFont font, RColor color, RPoint point, RSize { ReleaseHdc(); SetRtlAlign(rtl); - var brush = ((BrushAdapter)CacheUtils.GetSolidBrush(color)).Brush; + var brush = ((BrushAdapter)_adapter.GetSolidBrush(color)).Brush; _g.DrawString(str, ((FontAdapter)font).Font, brush, (int)(Math.Round(point.X) + (rtl ? size.Width : 0)), (int)Math.Round(point.Y), _stringFormat2); } else @@ -302,65 +259,19 @@ public void DrawString(string str, IFont font, RColor color, RPoint point, RSize } } - /// - /// Get color pen. - /// - /// the color to get the pen for - /// pen instance - public IPen GetPen(RColor color) - { - return CacheUtils.GetPen(color); - } - - /// - /// Get solid color brush. - /// - /// the color to get the brush for - /// solid color brush instance - public IBrush GetSolidBrush(RColor color) - { - return CacheUtils.GetSolidBrush(color); - } - - /// - /// Get linear gradient color brush from to . - /// - /// the rectangle to get the brush for - /// the start color of the gradient - /// the end color of the gradient - /// the angle to move the gradient from start color to end color in the rectangle - /// linear gradient color brush instance - public IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) - { - return new BrushAdapter(new LinearGradientBrush(Utils.Convert(rect), Utils.Convert(color1), Utils.Convert(color2), (float)angle), true); - } - - /// - /// Get TextureBrush object that uses the specified image and bounding rectangle. - /// - /// The Image object with which this TextureBrush object fills interiors. - /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. - /// The dimension by which to translate the transformation - public IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation) + public override IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation) { var brush = new TextureBrush(((ImageAdapter)image).Image, Utils.Convert(dstRect)); brush.TranslateTransform((float)translateTransformLocation.X, (float)translateTransformLocation.Y); return new BrushAdapter(brush, true); } - /// - /// Get GraphicsPath object. - /// - /// graphics path instance - public IGraphicsPath GetGraphicsPath() + public override IGraphicsPath GetGraphicsPath() { return new GraphicsPathAdapter(); } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() + public override void Dispose() { ReleaseHdc(); if (_releaseGraphics) @@ -373,97 +284,48 @@ public void Dispose() #region Delegate graphics methods - /// - /// Draws a line connecting the two points specified by the coordinate pairs. - /// - /// that determines the color, width, and style of the line. - /// The x-coordinate of the first point. The y-coordinate of the first point. - /// The x-coordinate of the second point. The y-coordinate of the second point. - /// is null. - public void DrawLine(IPen pen, double x1, double y1, double x2, double y2) + public override void DrawLine(IPen pen, double x1, double y1, double x2, double y2) { ReleaseHdc(); _g.DrawLine(((PenAdapter)pen).Pen, (float)x1, (float)y1, (float)x2, (float)y2); } - /// - /// Draws a rectangle specified by a coordinate pair, a width, and a height. - /// - /// A Pen that determines the color, width, and style of the rectangle. - /// The x-coordinate of the upper-left corner of the rectangle to draw. - /// The y-coordinate of the upper-left corner of the rectangle to draw. - /// The width of the rectangle to draw. - /// The height of the rectangle to draw. - public void DrawRectangle(IPen pen, double x, double y, double width, double height) + public override void DrawRectangle(IPen pen, double x, double y, double width, double height) { ReleaseHdc(); _g.DrawRectangle(((PenAdapter)pen).Pen, (float)x, (float)y, (float)width, (float)height); } - /// - /// Fills the interior of a rectangle specified by a pair of coordinates, a width, and a height. - /// - /// Brush that determines the characteristics of the fill. - /// The x-coordinate of the upper-left corner of the rectangle to fill. - /// The y-coordinate of the upper-left corner of the rectangle to fill. - /// Width of the rectangle to fill. - /// Height of the rectangle to fill. - public void DrawRectangle(IBrush brush, double x, double y, double width, double height) + public override void DrawRectangle(IBrush brush, double x, double y, double width, double height) { ReleaseHdc(); _g.FillRectangle(((BrushAdapter)brush).Brush, (float)x, (float)y, (float)width, (float)height); } - /// - /// Draws the specified portion of the specified at the specified location and with the specified size. - /// - /// Image to draw. - /// Rectangle structure that specifies the location and size of the drawn image. The image is scaled to fit the rectangle. - /// Rectangle structure that specifies the portion of the object to draw. - public void DrawImage(IImage image, RRect destRect, RRect srcRect) + public override void DrawImage(IImage image, RRect destRect, RRect srcRect) { ReleaseHdc(); _g.DrawImage(((ImageAdapter)image).Image, Utils.Convert(destRect), Utils.Convert(srcRect), GraphicsUnit.Pixel); } - /// - /// Draws the specified Image at the specified location and with the specified size. - /// - /// Image to draw. - /// Rectangle structure that specifies the location and size of the drawn image. - public void DrawImage(IImage image, RRect destRect) + public override void DrawImage(IImage image, RRect destRect) { ReleaseHdc(); _g.DrawImage(((ImageAdapter)image).Image, Utils.Convert(destRect)); } - /// - /// Draws a GraphicsPath. - /// - /// Pen that determines the color, width, and style of the path. - /// GraphicsPath to draw. - public void DrawPath(IPen pen, IGraphicsPath path) + public override void DrawPath(IPen pen, IGraphicsPath path) { _g.DrawPath(((PenAdapter)pen).Pen, ((GraphicsPathAdapter)path).GraphicsPath); } - /// - /// Fills the interior of a GraphicsPath. - /// - /// Brush that determines the characteristics of the fill. - /// GraphicsPath that represents the path to fill. - public void DrawPath(IBrush brush, IGraphicsPath path) + public override void DrawPath(IBrush brush, IGraphicsPath path) { ReleaseHdc(); _g.FillPath(((BrushAdapter)brush).Brush, ((GraphicsPathAdapter)path).GraphicsPath); } - /// - /// Fills the interior of a polygon defined by an array of points specified by Point structures. - /// - /// Brush that determines the characteristics of the fill. - /// Array of Point structures that represent the vertices of the polygon to fill. - public void DrawPolygon(IBrush brush, RPoint[] points) + public override void DrawPolygon(IBrush brush, RPoint[] points) { if (points != null && points.Length > 0) { diff --git a/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs new file mode 100644 index 000000000..06a3c3848 --- /dev/null +++ b/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs @@ -0,0 +1,144 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using HtmlRenderer.Entities; +using HtmlRenderer.Interfaces; +using HtmlRenderer.WinForms.Utilities; + +namespace HtmlRenderer.WinForms.Adapters +{ + /// + /// Adapter for general stuff for core. + /// TODO:a add doc. + /// + internal sealed class WinFormsAdapter : AdapterBase + { + #region Fields and Consts + + /// + /// Singleton instance of global adapter. + /// + private static readonly WinFormsAdapter _instance = new WinFormsAdapter(); + + #endregion + + + /// + /// Init installed font families and set default font families mapping. + /// + private WinFormsAdapter() + { + AddFontFamilyMapping("monospace", "Courier New"); + AddFontFamilyMapping("Helvetica", "Arial"); + + foreach (var family in FontFamily.Families) + { + AddFontFamily(new FontFamilyAdapter(family)); + } + } + + /// + /// Singleton instance of global adapter. + /// + public static WinFormsAdapter Instance + { + get { return _instance; } + } + + protected override RColor GetColorInt(string colorName) + { + var color = Color.FromName(colorName); + return Utils.Convert(color); + } + + protected override IPen CreatePen(RColor color) + { + return new PenAdapter(new Pen(Utils.Convert(color))); + } + + protected override IBrush CreateSolidBrush(RColor color) + { + Brush solidBrush; + if (color == RColor.White) + solidBrush = Brushes.White; + else if (color == RColor.Black) + solidBrush = Brushes.Black; + else if (color.A < 1) + solidBrush = Brushes.Transparent; + else + solidBrush = new SolidBrush(Utils.Convert(color)); + + return new BrushAdapter(solidBrush, false); + } + + protected override IImage ConvertImageInt(object image) + { + return image != null ? new ImageAdapter((Image)image) : null; + } + + protected override IImage ImageFromStreamInt(Stream memoryStream) + { + return new ImageAdapter(Image.FromStream(memoryStream)); + } + + protected internal override IFont CreateFontInt(string family, double size, RFontStyle style) + { + var fontStyle = (FontStyle)((int)style); + return new FontAdapter(new Font(family, (float)size, fontStyle)); + } + + protected internal override IFont CreateFontInt(IFontFamily family, double size, RFontStyle style) + { + var fontStyle = (FontStyle)((int)style); + return new FontAdapter(new Font(((FontFamilyAdapter)family).FontFamily, (float)size, fontStyle)); + } + + protected override void SetToClipboardInt(string text) + { + Clipboard.SetText(text); + } + + protected override void SetToClipboardInt(string html, string plainText) + { + ClipboardHelper.CopyToClipboard(html, plainText); + } + + protected override void SetToClipboardInt(IImage image) + { + Clipboard.SetImage(((ImageAdapter)image).Image); + } + + protected override IContextMenu CreateContextMenuInt() + { + return new ContextMenuAdapter(); + } + + protected override void SaveToFileInt(IImage image, string name, string extension, IControl control = null) + { + using (var saveDialog = new SaveFileDialog()) + { + saveDialog.Filter = "Images|*.png;*.bmp;*.jpg"; + saveDialog.FileName = name; + saveDialog.DefaultExt = extension; + + var dialogResult = control == null ? saveDialog.ShowDialog() : saveDialog.ShowDialog(((ControlAdapter)control).Control); + if (dialogResult == DialogResult.OK) + { + ((ImageAdapter)image).Image.Save(saveDialog.FileName); + } + } + } + } +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/HtmlContainer.cs b/Source/HtmlRenderer.WinForms/HtmlContainer.cs index 975d83d36..a57c20b6f 100644 --- a/Source/HtmlRenderer.WinForms/HtmlContainer.cs +++ b/Source/HtmlRenderer.WinForms/HtmlContainer.cs @@ -50,7 +50,7 @@ public sealed class HtmlContainer : IDisposable /// public HtmlContainer() { - _htmlContainerInt = new HtmlContainerInt(GlobalAdapter.Instance); + _htmlContainerInt = new HtmlContainerInt(WinFormsAdapter.Instance); } /// diff --git a/Source/HtmlRenderer.WinForms/HtmlRender.cs b/Source/HtmlRenderer.WinForms/HtmlRender.cs index 98d523872..46d5a9ac2 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRender.cs +++ b/Source/HtmlRenderer.WinForms/HtmlRender.cs @@ -99,7 +99,7 @@ public static void AddFontFamily(FontFamily fontFamily) { ArgChecker.AssertArgNotNull(fontFamily, "fontFamily"); - GlobalAdapter.Instance.AddFontFamily(new FontFamilyAdapter(fontFamily)); + WinFormsAdapter.Instance.AddFontFamily(new FontFamilyAdapter(fontFamily)); } /// @@ -117,7 +117,7 @@ public static void AddFontFamilyMapping(string fromFamily, string toFamily) ArgChecker.AssertArgNotNullOrEmpty(fromFamily, "fromFamily"); ArgChecker.AssertArgNotNullOrEmpty(toFamily, "toFamily"); - GlobalAdapter.Instance.AddFontFamilyMapping(fromFamily, toFamily); + WinFormsAdapter.Instance.AddFontFamilyMapping(fromFamily, toFamily); } /// @@ -131,7 +131,7 @@ public static void AddFontFamilyMapping(string fromFamily, string toFamily) /// the parsed css data public static CssData ParseStyleSheet(string stylesheet, bool combineWithDefault = true) { - return CssData.Parse(GlobalAdapter.Instance, stylesheet, combineWithDefault); + return CssData.Parse(WinFormsAdapter.Instance, stylesheet, combineWithDefault); } /// diff --git a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj index c5f1e1f9a..2a153f414 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj +++ b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj @@ -69,7 +69,7 @@ - + @@ -87,7 +87,6 @@ Component - diff --git a/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs b/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs deleted file mode 100644 index 52e2066ae..000000000 --- a/Source/HtmlRenderer.WinForms/Utilities/CacheUtils.cs +++ /dev/null @@ -1,86 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -using System.Collections.Generic; -using System.Drawing; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; -using HtmlRenderer.WinForms.Adapters; - -namespace HtmlRenderer.WinForms.Utilities -{ - /// - /// Provides some drawing functionality - /// - internal static class CacheUtils - { - #region Fields and Consts - - /// - /// cache of brush color to brush instance - /// - private static readonly Dictionary _brushesCache = new Dictionary(); - - /// - /// cache of pen color to pen instance - /// - private static readonly Dictionary _penCache = new Dictionary(); - - #endregion - - - /// - /// Get cached pen instance for the given color. - /// - /// the color to get pen for - /// pen instance - public static IPen GetPen(RColor color) - { - IPen pen; - if (!_penCache.TryGetValue(color, out pen)) - { - var solidPen = new Pen(Utils.Convert(color)); - pen = new PenAdapter(solidPen); - _penCache[color] = pen; - } - return pen; - } - - /// - /// Get cached solid brush instance for the given color. - /// - /// the color to get brush for - /// brush instance - public static IBrush GetSolidBrush(RColor color) - { - IBrush brush; - if (!_brushesCache.TryGetValue(color, out brush)) - { - Brush solidBrush; - if (color == RColor.White) - solidBrush = Brushes.White; - else if (color == RColor.Black) - solidBrush = Brushes.Black; - else if (color == RColor.WhiteSmoke) - solidBrush = Brushes.WhiteSmoke; - else if (color.A < 1) - solidBrush = Brushes.Transparent; - else - solidBrush = new SolidBrush(Utils.Convert(color)); - - brush = new BrushAdapter(solidBrush, false); - _brushesCache[color] = brush; - } - return brush; - } - } -} \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/CssData.cs b/Source/HtmlRenderer/Core/CssData.cs index fd6e886e3..2569f33b0 100644 --- a/Source/HtmlRenderer/Core/CssData.cs +++ b/Source/HtmlRenderer/Core/CssData.cs @@ -57,13 +57,13 @@ internal CssData() /// default css data (as defined by W3), merged if class name already exists. If false only the data in the given stylesheet is returned. /// /// - /// TODO:a add doc + /// TODO:a add doc /// the stylesheet source to parse /// true - combine the parsed css data with default css data, false - return only the parsed css data /// the parsed css data - public static CssData Parse(GlobalBase global, string stylesheet, bool combineWithDefault = true) + public static CssData Parse(AdapterBase adapter, string stylesheet, bool combineWithDefault = true) { - CssParser parser = new CssParser(global); + CssParser parser = new CssParser(adapter); return parser.ParseStyleSheet(stylesheet, combineWithDefault); } diff --git a/Source/HtmlRenderer/Core/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs index 9cfa2bf96..4ad8b99ec 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -409,7 +409,7 @@ public static CssBox CreateBlock(CssBox parent, HtmlTag tag = null, CssBox befor /// Performs layout of the DOM structure creating lines by set bounds restrictions. /// /// Device context to use - public void PerformLayout(IGraphics g) + public void PerformLayout(GraphicsBase g) { try { @@ -425,7 +425,7 @@ public void PerformLayout(IGraphics g) /// Paints the fragment /// /// Device context to use - public void Paint(IGraphics g) + public void Paint(GraphicsBase g) { try { @@ -561,7 +561,7 @@ public virtual void Dispose() /// Performs layout of the DOM structure creating lines by set bounds restrictions.
    ///
    /// Device context to use - protected virtual void PerformLayoutImp(IGraphics g) + protected virtual void PerformLayoutImp(GraphicsBase g) { if (Display != CssConstants.None) { @@ -644,7 +644,7 @@ protected virtual void PerformLayoutImp(IGraphics g) /// Assigns words its width and height /// /// - internal virtual void MeasureWordsSize(IGraphics g) + internal virtual void MeasureWordsSize(GraphicsBase g) { if (!_wordsSizeMeasured) { @@ -719,7 +719,7 @@ private int GetIndexForList() /// Creates the /// /// - private void CreateListItemBox(IGraphics g) + private void CreateListItemBox(GraphicsBase g) { if (Display == CssConstants.ListItem && ListStyleType != CssConstants.None) { @@ -1126,7 +1126,7 @@ internal void OffsetTop(double amount) /// Paints the fragment /// /// the device to draw to - protected virtual void PaintImp(IGraphics g) + protected virtual void PaintImp(GraphicsBase g) { if (Display != CssConstants.None && (Display != CssConstants.TableCell || EmptyCells != CssConstants.Hide || !IsSpaceOrEmpty)) { @@ -1183,7 +1183,7 @@ protected virtual void PaintImp(IGraphics g) /// the bounding rectangle to draw in /// is it the first rectangle of the element /// is it the last rectangle of the element - protected void PaintBackground(IGraphics g, RRect rect, bool isFirst, bool isLast) + protected void PaintBackground(GraphicsBase g, RRect rect, bool isFirst, bool isLast) { if (rect.Width > 0 && rect.Height > 0) { @@ -1244,7 +1244,7 @@ protected void PaintBackground(IGraphics g, RRect rect, bool isFirst, bool isLas /// /// the device to draw into /// the current scroll offset to offset the words - private void PaintWords(IGraphics g, RPoint offset) + private void PaintWords(GraphicsBase g, RPoint offset) { if (Width.Length > 0) { @@ -1293,7 +1293,7 @@ private void PaintWords(IGraphics g, RPoint offset) /// /// /// - protected void PaintDecoration(IGraphics g, RRect rectangle, bool isFirst, bool isLast) + protected void PaintDecoration(GraphicsBase g, RRect rectangle, bool isFirst, bool isLast) { if (string.IsNullOrEmpty(TextDecoration) || TextDecoration == CssConstants.None) return; @@ -1375,7 +1375,7 @@ protected RColor GetSelectionForeBrush() /// /// /// used for images so they will have alpha effect - protected IBrush GetSelectionBackBrush(IGraphics g, bool forceAlpha) + protected IBrush GetSelectionBackBrush(GraphicsBase g, bool forceAlpha) { var backColor = HtmlContainer.SelectionBackColor; if (backColor != RColor.Empty) @@ -1393,7 +1393,7 @@ protected IBrush GetSelectionBackBrush(IGraphics g, bool forceAlpha) protected override IFont GetCachedFont(string fontFamily, double fsize, RFontStyle st) { - return HtmlContainer.Global.GetFont(fontFamily, fsize, st); + return HtmlContainer.Adapter.GetFont(fontFamily, fsize, st); } protected override RColor GetActualColor(string colorStr) diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs index 87254d279..c2b6b059e 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs @@ -446,7 +446,7 @@ private void HandlePostApiCall(object sender) /// Paints the fragment /// /// the device to draw to - protected override void PaintImp(IGraphics g) + protected override void PaintImp(GraphicsBase g) { var rects = CommonUtils.GetFirstValueOrDefault(Rectangles); @@ -480,7 +480,7 @@ protected override void PaintImp(IGraphics g) /// /// Draw video image over the iframe if found. /// - private void DrawImage(IGraphics g, RPoint offset, RRect rect) + private void DrawImage(GraphicsBase g, RPoint offset, RRect rect) { if (_imageWord.Image != null) { @@ -507,11 +507,11 @@ private void DrawImage(IGraphics g, RPoint offset, RRect rect) /// /// Draw video title on top of the iframe if found. /// - private void DrawTitle(IGraphics g, RRect rect) + private void DrawTitle(GraphicsBase g, RRect rect) { if (_videoTitle != null && _imageWord.Width > 40 && _imageWord.Height > 40) { - var font = HtmlContainer.Global.GetFont("Arial", 9f, RFontStyle.Regular); + var font = HtmlContainer.Adapter.GetFont("Arial", 9f, RFontStyle.Regular); g.DrawRectangle(g.GetSolidBrush(RColor.FromArgb(160, 0, 0, 0)), rect.Left, rect.Top, rect.Width, ActualFont.Height + 7); var titleRect = new RRect(rect.Left + 3, rect.Top + 3, rect.Width - 6, rect.Height - 6); @@ -522,7 +522,7 @@ private void DrawTitle(IGraphics g, RRect rect) /// /// Draw play over the iframe if we found link url. /// - private void DrawPlay(IGraphics g, RRect rect) + private void DrawPlay(GraphicsBase g, RRect rect) { if (_isVideo && _imageWord.Width > 70 && _imageWord.Height > 50) { @@ -549,7 +549,7 @@ private void DrawPlay(IGraphics g, RRect rect) /// Assigns words its width and height /// /// the device to use - internal override void MeasureWordsSize(IGraphics g) + internal override void MeasureWordsSize(GraphicsBase g) { if (!_wordsSizeMeasured) { diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs index e346918db..5d7e847cf 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs @@ -40,7 +40,7 @@ public CssBoxHr(CssBox parent, HtmlTag tag) /// Performs layout of the DOM structure creating lines by set bounds restrictions. /// /// Device context to use - protected override void PerformLayoutImp(IGraphics g) + protected override void PerformLayoutImp(GraphicsBase g) { if (Display == CssConstants.None) return; @@ -94,7 +94,7 @@ protected override void PerformLayoutImp(IGraphics g) /// Paints the fragment /// /// the device to draw to - protected override void PaintImp(IGraphics g) + protected override void PaintImp(GraphicsBase g) { var offset = HtmlContainer != null ? HtmlContainer.ScrollOffset : RPoint.Empty; var rect = new RRect(Bounds.X + offset.X, Bounds.Y + offset.Y, Bounds.Width, Bounds.Height); diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs index 0ce5d9d56..0f115950e 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs @@ -68,7 +68,7 @@ public IImage Image /// Paints the fragment /// /// the device to draw to - protected override void PaintImp(IGraphics g) + protected override void PaintImp(GraphicsBase g) { // load image iff it is in visible rectangle if (_imageLoadHandler == null) @@ -128,7 +128,7 @@ protected override void PaintImp(IGraphics g) /// Assigns words its width and height /// /// the device to use - internal override void MeasureWordsSize(IGraphics g) + internal override void MeasureWordsSize(GraphicsBase g) { if (!_wordsSizeMeasured) { diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs index ff2c81834..719616774 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs @@ -1425,7 +1425,7 @@ protected void SetAllBorders(string style = null, string width = null, string co /// /// Measures the width of whitespace between words (set ). /// - protected void MeasureWordSpacing(IGraphics g) + protected void MeasureWordSpacing(GraphicsBase g) { if (double.IsNaN(ActualWordSpacing)) { diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs index 9d36140b8..c80fd7f0e 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs @@ -118,7 +118,7 @@ public static void MeasureImageSize(CssRectImage imageWord) /// /// /// - public static void CreateLineBoxes(IGraphics g, CssBox blockBox) + public static void CreateLineBoxes(GraphicsBase g, CssBox blockBox) { ArgChecker.AssertArgNotNull(g, "g"); ArgChecker.AssertArgNotNull(blockBox, "blockBox"); @@ -172,7 +172,7 @@ public static void CreateLineBoxes(IGraphics g, CssBox blockBox) /// /// /// - public static void ApplyCellVerticalAlignment(IGraphics g, CssBox cell) + public static void ApplyCellVerticalAlignment(GraphicsBase g, CssBox cell) { ArgChecker.AssertArgNotNull(g, "g"); ArgChecker.AssertArgNotNull(cell, "cell"); @@ -239,7 +239,7 @@ public static void ApplyCellVerticalAlignment(IGraphics g, CssBox cell) /// Current y coordinate that will be the top of the next word /// Maximum right reached so far /// Maximum bottom reached so far - private static void FlowBox(IGraphics g, CssBox blockbox, CssBox box, double limitRight, double linespacing, double startx, ref CssLineBox line, ref double curx, ref double cury, ref double maxRight, ref double maxbottom) + private static void FlowBox(GraphicsBase g, CssBox blockbox, CssBox box, double limitRight, double linespacing, double startx, ref CssLineBox line, ref double curx, ref double cury, ref double maxRight, ref double maxbottom) { var startX = curx; var startY = cury; @@ -420,7 +420,7 @@ private static void BubbleRectangles(CssBox box, CssLineBox line) /// /// /// - private static void ApplyAlignment(IGraphics g, CssLineBox lineBox) + private static void ApplyAlignment(GraphicsBase g, CssLineBox lineBox) { switch (lineBox.OwnerBox.TextAlign) { @@ -522,7 +522,7 @@ private static void ApplyRightToLeftOnSingleBox(CssLineBox lineBox, CssBox box) /// /// /// - private static void ApplyVerticalAlignment(IGraphics g, CssLineBox lineBox) + private static void ApplyVerticalAlignment(GraphicsBase g, CssLineBox lineBox) { double baseline = Single.MinValue; foreach (var box in lineBox.Rectangles.Keys) @@ -570,7 +570,7 @@ private static void ApplyVerticalAlignment(IGraphics g, CssLineBox lineBox) /// /// /// - private static void ApplyJustifyAlignment(IGraphics g, CssLineBox lineBox) + private static void ApplyJustifyAlignment(GraphicsBase g, CssLineBox lineBox) { if (lineBox.Equals(lineBox.OwnerBox.LineBoxes[lineBox.OwnerBox.LineBoxes.Count - 1])) return; @@ -609,7 +609,7 @@ private static void ApplyJustifyAlignment(IGraphics g, CssLineBox lineBox) /// /// /// - private static void ApplyCenterAlignment(IGraphics g, CssLineBox line) + private static void ApplyCenterAlignment(GraphicsBase g, CssLineBox line) { if (line.Words.Count == 0) return; @@ -639,7 +639,7 @@ private static void ApplyCenterAlignment(IGraphics g, CssLineBox line) /// /// /// - private static void ApplyRightAlignment(IGraphics g, CssLineBox line) + private static void ApplyRightAlignment(GraphicsBase g, CssLineBox line) { if (line.Words.Count == 0) return; @@ -669,7 +669,7 @@ private static void ApplyRightAlignment(IGraphics g, CssLineBox line) /// /// /// - private static void ApplyLeftAlignment(IGraphics g, CssLineBox line) + private static void ApplyLeftAlignment(GraphicsBase g, CssLineBox line) { //No alignment needed. diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs index 0766d77d2..d366e98bd 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs @@ -121,7 +121,7 @@ public static double GetTableSpacing(CssBox tableBox) /// /// /// - public static void PerformLayout(IGraphics g, CssBox tableBox) + public static void PerformLayout(GraphicsBase g, CssBox tableBox) { ArgChecker.AssertArgNotNull(g, "g"); ArgChecker.AssertArgNotNull(tableBox, "tableBox"); @@ -144,7 +144,7 @@ public static void PerformLayout(IGraphics g, CssBox tableBox) /// Analyzes the Table and assigns values to this CssTable object. /// To be called from the constructor /// - private void Layout(IGraphics g) + private void Layout(GraphicsBase g) { MeasureWords(_tableBox, g); @@ -604,7 +604,7 @@ private void EnforceMinimumSize() /// Layout the cells by the calculated table layout /// /// - private void LayoutCells(IGraphics g) + private void LayoutCells(GraphicsBase g) { double startx = Math.Max(_tableBox.ClientLeft + GetHorizontalSpacing(), 0); double starty = Math.Max(_tableBox.ClientTop + GetVerticalSpacing(), 0); @@ -773,7 +773,7 @@ private static int GetRowSpan(CssBox b) /// /// the box to measure /// Device to use - private static void MeasureWords(CssBox box, IGraphics g) + private static void MeasureWords(CssBox box, GraphicsBase g) { if (box != null) { diff --git a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs index 9a779eb29..9157a0dab 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs @@ -208,7 +208,7 @@ internal void AssignRectanglesToBoxes() /// Device info /// box to check words /// baseline - internal void SetBaseLine(IGraphics g, CssBox b, double baseline) + internal void SetBaseLine(GraphicsBase g, CssBox b, double baseline) { //TODO: Aqui me quede, checar poniendo "by the" con un font-size de 3em List ws = WordsOf(b); diff --git a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs index 257cbdee0..a8270df16 100644 --- a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs @@ -30,7 +30,7 @@ internal static class BackgroundImageDrawHandler /// the box to draw its background image /// the handler that loads image to draw /// the rectangle to draw image in - public static void DrawBackgroundImage(IGraphics g, CssBox box, ImageLoadHandler imageLoadHandler, RRect rectangle) + public static void DrawBackgroundImage(GraphicsBase g, CssBox box, ImageLoadHandler imageLoadHandler, RRect rectangle) { // image size depends if specific rectangle given in image loader var imgSize = new RSize(imageLoadHandler.Rectangle == RRect.Empty ? imageLoadHandler.Image.Width : imageLoadHandler.Rectangle.Width, @@ -118,7 +118,7 @@ private static RPoint GetLocation(string backgroundPosition, RRect rectangle, RS /// Draw the background image at the required location repeating it over the X axis.
    /// Adjust location to left if starting location doesn't include all the range (adjusted to center or right). /// - private static void DrawRepeatX(IGraphics g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) + private static void DrawRepeatX(GraphicsBase g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) { while (destRect.X > rectangle.X) destRect.X -= imgSize.Width; @@ -133,7 +133,7 @@ private static void DrawRepeatX(IGraphics g, ImageLoadHandler imageLoadHandler, /// Draw the background image at the required location repeating it over the Y axis.
    /// Adjust location to top if starting location doesn't include all the range (adjusted to center or bottom). /// - private static void DrawRepeatY(IGraphics g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) + private static void DrawRepeatY(GraphicsBase g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) { while (destRect.Y > rectangle.Y) destRect.Y -= imgSize.Height; @@ -148,7 +148,7 @@ private static void DrawRepeatY(IGraphics g, ImageLoadHandler imageLoadHandler, /// Draw the background image at the required location repeating it over the X and Y axis.
    /// Adjust location to left-top if starting location doesn't include all the range (adjusted to center or bottom/right). /// - private static void DrawRepeat(IGraphics g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) + private static void DrawRepeat(GraphicsBase g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) { while (destRect.X > rectangle.X) destRect.X -= imgSize.Width; diff --git a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs index a12fec849..38ce0c202 100644 --- a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs @@ -41,7 +41,7 @@ internal static class BordersDrawHandler /// the bounding rectangle to draw in /// is it the first rectangle of the element /// is it the last rectangle of the element - public static void DrawBoxBorders(IGraphics g, CssBox box, RRect rect, bool isFirst, bool isLast) + public static void DrawBoxBorders(GraphicsBase g, CssBox box, RRect rect, bool isFirst, bool isLast) { if (rect.Width > 0 && rect.Height > 0) { @@ -73,7 +73,7 @@ public static void DrawBoxBorders(IGraphics g, CssBox box, RRect rect, bool isFi /// the brush to use /// the bounding rectangle to draw in /// Beveled border path, null if there is no rounded corners - public static void DrawBorder(Border border, IGraphics g, CssBox box, IBrush brush, RRect rectangle) + public static void DrawBorder(Border border, GraphicsBase g, CssBox box, IBrush brush, RRect rectangle) { SetInOutsetRectanglePoints(border, box, rectangle, true, true); g.DrawPolygon(brush, _borderPts); @@ -91,7 +91,7 @@ public static void DrawBorder(Border border, IGraphics g, CssBox box, IBrush bru /// the rectangle the border is enclosing /// Specifies if the border is for a starting line (no bevel on left) /// Specifies if the border is for an ending line (no bevel on right) - private static void DrawBorder(Border border, CssBox box, IGraphics g, RRect rect, bool isLineStart, bool isLineEnd) + private static void DrawBorder(Border border, CssBox box, GraphicsBase g, RRect rect, bool isLineStart, bool isLineEnd) { var style = GetStyle(border, box); var color = GetColor(border, box, style); @@ -200,7 +200,7 @@ private static void SetInOutsetRectanglePoints(Border border, CssBox b, RRect r, /// Box which the border corresponds /// the rectangle the border is enclosing /// Beveled border path, null if there is no rounded corners - private static IGraphicsPath GetRoundedBorderPath(IGraphics g, Border border, CssBox b, RRect r) + private static IGraphicsPath GetRoundedBorderPath(GraphicsBase g, Border border, CssBox b, RRect r) { IGraphicsPath path = null; @@ -278,7 +278,7 @@ private static IGraphicsPath GetRoundedBorderPath(IGraphics g, Border border, Cs /// /// Get pen to be used for border draw respecting its style. /// - private static IPen GetPen(IGraphics g, string style, RColor color, double width) + private static IPen GetPen(GraphicsBase g, string style, RColor color, double width) { var p = g.GetPen(color); p.Width = width; diff --git a/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs index 10a62d199..3f6bb3dbc 100644 --- a/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs @@ -285,7 +285,7 @@ public void ShowContextMenu(IControl parent, CssRect rect, CssBox link) _parentControl = parent; _currentRect = rect; _currentLink = link; - _contextMenu = _htmlContainer.Global.CreateContextMenu(); + _contextMenu = _htmlContainer.Adapter.GetContextMenu(); if (rect != null) { @@ -396,7 +396,7 @@ private void OnCopyLinkClick(object sender, EventArgs eventArgs) { try { - _htmlContainer.Global.SetToClipboard(_currentLink.HrefLink); + _htmlContainer.Adapter.SetToClipboard(_currentLink.HrefLink); } catch (Exception ex) { @@ -416,7 +416,7 @@ private void OnSaveImageClick(object sender, EventArgs eventArgs) try { var imageSrc = _currentRect.OwnerBox.GetAttribute("src"); - _htmlContainer.Global.SaveToFile(_currentRect.Image, Path.GetFileName(imageSrc) ?? "image", Path.GetExtension(imageSrc) ?? "png"); + _htmlContainer.Adapter.SaveToFile(_currentRect.Image, Path.GetFileName(imageSrc) ?? "image", Path.GetExtension(imageSrc) ?? "png"); } catch (Exception ex) { @@ -435,7 +435,7 @@ private void OnCopyImageLinkClick(object sender, EventArgs eventArgs) { try { - _htmlContainer.Global.SetToClipboard(_currentRect.OwnerBox.GetAttribute("src")); + _htmlContainer.Adapter.SetToClipboard(_currentRect.OwnerBox.GetAttribute("src")); } catch (Exception ex) { @@ -454,7 +454,7 @@ private void OnCopyImageClick(object sender, EventArgs eventArgs) { try { - _htmlContainer.Global.SetToClipboard(_currentRect.Image); + _htmlContainer.Adapter.SetToClipboard(_currentRect.Image); } catch (Exception ex) { diff --git a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs index d4d770646..c6a43626d 100644 --- a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs @@ -28,7 +28,7 @@ internal sealed class FontHandler /// /// /// - private readonly GlobalBase _global; + private readonly AdapterBase _adapter; /// /// Allow to map not installed fonts to different @@ -51,11 +51,11 @@ internal sealed class FontHandler /// /// Init. /// - public FontHandler(GlobalBase global) + public FontHandler(AdapterBase adapter) { - ArgChecker.AssertArgNotNull(global, "global"); + ArgChecker.AssertArgNotNull(adapter, "global"); - _global = global; + _adapter = adapter; } /// @@ -177,8 +177,8 @@ private IFont CreateFont(string family, double size, RFontStyle style) { IFontFamily fontFamily; return _existingFontFamilies.TryGetValue(family, out fontFamily) - ? _global.CreateFont(fontFamily, size, style) - : _global.CreateFont(family, size, style); + ? _adapter.CreateFontInt(fontFamily, size, style) + : _adapter.CreateFontInt(family, size, style); } #endregion diff --git a/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs index 169b40db7..95ca79516 100644 --- a/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs @@ -197,7 +197,7 @@ private void OnHtmlImageLoadEventCallback(string path, object image, RRect image if (image != null) { - _image = _htmlContainer.Global.ConvertImage(image); + _image = _htmlContainer.Adapter.ConvertImage(image); ImageLoadComplete(_asyncCallback); } else if (!string.IsNullOrEmpty(path)) @@ -247,7 +247,7 @@ private IImage GetImageFromData(string src) if (imagePartsCount > 0) { byte[] imageData = base64PartsCount > 0 ? Convert.FromBase64String(s[1].Trim()) : new UTF8Encoding().GetBytes(Uri.UnescapeDataString(s[1].Trim())); - return _htmlContainer.Global.ImageFromStream(new MemoryStream(imageData)); + return _htmlContainer.Adapter.ImageFromStream(new MemoryStream(imageData)); } } return null; @@ -310,7 +310,7 @@ private void LoadImageFromFile(FileInfo source) if (source.Exists) { _imageFileStream = File.Open(source.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - _image = _htmlContainer.Global.ImageFromStream(_imageFileStream); + _image = _htmlContainer.Adapter.ImageFromStream(_imageFileStream); _releaseImageObject = true; } ImageLoadComplete(); diff --git a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs index 9503cbf58..5e532ce66 100644 --- a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs @@ -304,7 +304,7 @@ public void CopySelectedHtml() var html = DomUtils.GenerateHtml(_root, HtmlGenerationStyle.Inline, true); var plainText = DomUtils.GetSelectedPlainText(_root); if (!string.IsNullOrEmpty(plainText)) - _root.HtmlContainer.Global.SetToClipboard(html, plainText); + _root.HtmlContainer.Adapter.SetToClipboard(html, plainText); } } diff --git a/Source/HtmlRenderer/Core/HtmlContainerInt.cs b/Source/HtmlRenderer/Core/HtmlContainerInt.cs index 6481dc3c1..38182f873 100644 --- a/Source/HtmlRenderer/Core/HtmlContainerInt.cs +++ b/Source/HtmlRenderer/Core/HtmlContainerInt.cs @@ -84,7 +84,7 @@ public sealed class HtmlContainerInt : IDisposable /// /// /// - private readonly GlobalBase _global; + private readonly AdapterBase _adapter; /// /// parser for CSS data @@ -175,20 +175,20 @@ public sealed class HtmlContainerInt : IDisposable /// /// Init. /// - public HtmlContainerInt(GlobalBase global) + public HtmlContainerInt(AdapterBase adapter) { - ArgChecker.AssertArgNotNull(global, "global"); + ArgChecker.AssertArgNotNull(adapter, "global"); - _global = global; - _cssParser = new CssParser(global); + _adapter = adapter; + _cssParser = new CssParser(adapter); } /// /// /// - internal GlobalBase Global + internal AdapterBase Adapter { - get { return _global; } + get { return _adapter; } } /// @@ -417,7 +417,7 @@ public void SetHtml(string htmlSource, CssData baseCssData = null) if (!string.IsNullOrEmpty(htmlSource)) { - _cssData = baseCssData ?? _global.DefaultCssData; + _cssData = baseCssData ?? _adapter.DefaultCssData; DomParser parser = new DomParser(_cssParser); _root = parser.GenerateCssTree(htmlSource, this, ref _cssData); @@ -483,7 +483,7 @@ public string GetLinkAt(RPoint location) /// Measures the bounds of box and children, recursively. /// /// Device context to draw - public void PerformLayout(IGraphics g) + public void PerformLayout(GraphicsBase g) { ArgChecker.AssertArgNotNull(g, "g"); @@ -510,7 +510,7 @@ public void PerformLayout(IGraphics g) /// Render the html using the given device. /// /// the device to use to render - public void PerformPaint(IGraphics g) + public void PerformPaint(GraphicsBase g) { ArgChecker.AssertArgNotNull(g, "g"); diff --git a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs index f9eea2aa9..e33d2e660 100644 --- a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs +++ b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs @@ -29,7 +29,7 @@ public static class HtmlRendererUtils /// the minimal size of the rendered html (zero - not limit the width/height) /// the maximum size of the rendered html, if not zero and html cannot be layout within the limit it will be clipped (zero - not limit the width/height) /// return: the size of the html to be rendered within the min/max limits - public static RSize MeasureHtmlByRestrictions(IGraphics g, HtmlContainerInt htmlContainer, RSize minSize, RSize maxSize) + public static RSize MeasureHtmlByRestrictions(GraphicsBase g, HtmlContainerInt htmlContainer, RSize minSize, RSize maxSize) { // first layout without size restriction to know html actual size htmlContainer.PerformLayout(g); @@ -72,7 +72,7 @@ public static RSize MeasureHtmlByRestrictions(IGraphics g, HtmlContainerInt html /// the max size restriction - can be empty for no restriction /// if to modify the size (width and height) by html content layout /// if to modify the height by html content layout - public static RSize Layout(IGraphics g, HtmlContainerInt htmlContainer, RSize size, RSize minSize, RSize maxSize, bool autoSize, bool autoSizeHeightOnly) + public static RSize Layout(GraphicsBase g, HtmlContainerInt htmlContainer, RSize size, RSize minSize, RSize maxSize, bool autoSize, bool autoSizeHeightOnly) { if (autoSize) htmlContainer.MaxSize = new RSize(0, 0); diff --git a/Source/HtmlRenderer/Core/Parse/CssParser.cs b/Source/HtmlRenderer/Core/Parse/CssParser.cs index 5a84551d6..fa7aeb071 100644 --- a/Source/HtmlRenderer/Core/Parse/CssParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssParser.cs @@ -36,7 +36,7 @@ internal sealed class CssParser /// /// /// - private readonly GlobalBase _global; + private readonly AdapterBase _adapter; /// /// Utility for value parsing. @@ -54,12 +54,12 @@ internal sealed class CssParser /// /// Init. /// - public CssParser(GlobalBase global) + public CssParser(AdapterBase adapter) { - ArgChecker.AssertArgNotNull(global, "global"); + ArgChecker.AssertArgNotNull(adapter, "global"); - _valueParser = new CssValueParser(global); - _global = global; + _valueParser = new CssValueParser(adapter); + _adapter = adapter; } /// @@ -75,7 +75,7 @@ public CssParser(GlobalBase global) /// the CSS data with parsed CSS objects (never null) public CssData ParseStyleSheet(string stylesheet, bool combineWithDefault) { - var cssData = combineWithDefault ? _global.DefaultCssData.Clone() : new CssData(); + var cssData = combineWithDefault ? _adapter.DefaultCssData.Clone() : new CssData(); if (!string.IsNullOrEmpty(stylesheet)) { ParseStyleSheet(cssData, stylesheet); @@ -628,7 +628,7 @@ private string ParseFontFamilyProperty(string propValue) var font = propValue.Substring(start, adjEnd - start + 1); - if (_global.IsFontExists(font)) + if (_adapter.IsFontExists(font)) { return font; } diff --git a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs index 972e59667..70e4d12dd 100644 --- a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs @@ -30,7 +30,7 @@ internal sealed class CssValueParser /// /// /// - private readonly GlobalBase _global; + private readonly AdapterBase _adapter; #endregion @@ -38,11 +38,11 @@ internal sealed class CssValueParser /// /// Init. /// - public CssValueParser(GlobalBase global) + public CssValueParser(AdapterBase adapter) { - ArgChecker.AssertArgNotNull(global, "global"); + ArgChecker.AssertArgNotNull(adapter, "global"); - _global = global; + _adapter = adapter; } /// @@ -471,7 +471,7 @@ private static bool GetColorByRgba(string str, int idx, int length, out RColor c /// true - valid color, false - otherwise private bool GetColorByName(string str, int idx, int length, out RColor color) { - color = _global.GetColor(str.Substring(idx, length)); + color = _adapter.GetColor(str.Substring(idx, length)); return color.A > 0; } diff --git a/Source/HtmlRenderer/Core/Utils/CssUtils.cs b/Source/HtmlRenderer/Core/Utils/CssUtils.cs index 9dcb0890a..68c210f94 100644 --- a/Source/HtmlRenderer/Core/Utils/CssUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CssUtils.cs @@ -48,7 +48,7 @@ public static RColor DefaultSelectionBackcolor /// /// /// - public static double WhiteSpace(IGraphics g, CssBoxProperties box) + public static double WhiteSpace(GraphicsBase g, CssBoxProperties box) { double w = box.ActualFont.GetWhitespaceWidth(g); if (!(String.IsNullOrEmpty(box.WordSpacing) || box.WordSpacing == CssConstants.Normal)) diff --git a/Source/HtmlRenderer/Core/Utils/DomUtils.cs b/Source/HtmlRenderer/Core/Utils/DomUtils.cs index 587b0a599..7cbed0440 100644 --- a/Source/HtmlRenderer/Core/Utils/DomUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/DomUtils.cs @@ -795,7 +795,7 @@ private static Dictionary StripDefaultStyles(CssBox box, Diction { // ReSharper disable PossibleMultipleEnumeration var cleanTagStyles = new Dictionary(); - var defaultBlocks = box.HtmlContainer.Global.DefaultCssData.GetCssBlock(box.HtmlTag.Name); + var defaultBlocks = box.HtmlContainer.Adapter.DefaultCssData.GetCssBlock(box.HtmlTag.Name); foreach (var style in tagStyles) { bool isDefault = false; diff --git a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs index c87af7162..95556b61d 100644 --- a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs @@ -40,7 +40,7 @@ public static bool IsColorVisible(RColor color) /// the graphics to clip /// the box that is rendered to get containing blocks /// the previous region if clipped, otherwise null - public static RRect ClipGraphicsByOverflow(IGraphics g, CssBox box) + public static RRect ClipGraphicsByOverflow(GraphicsBase g, CssBox box) { var containingBlock = box.ContainingBlock; while (true) @@ -72,7 +72,7 @@ public static RRect ClipGraphicsByOverflow(IGraphics g, CssBox box) /// /// the graphics to clip /// the region to set on the graphics (null - ignore) - public static void ReturnClip(IGraphics g, RRect prevClip) + public static void ReturnClip(GraphicsBase g, RRect prevClip) { if (prevClip != RRect.Empty) { @@ -86,10 +86,10 @@ public static void ReturnClip(IGraphics g, RRect prevClip) /// the device to draw into /// /// the rectangle to draw icon in - public static void DrawImageLoadingIcon(IGraphics g, HtmlContainerInt htmlContainer, RRect r) + public static void DrawImageLoadingIcon(GraphicsBase g, HtmlContainerInt htmlContainer, RRect r) { g.DrawRectangle(g.GetPen(RColor.LightGray), r.Left + 3, r.Top + 3, 13, 14); - var image = htmlContainer.Global.GetLoadImage(); + var image = htmlContainer.Adapter.GetLoadImage(); g.DrawImage(image, new RRect(r.Left + 4, r.Top + 4, image.Width, image.Height)); } @@ -99,10 +99,10 @@ public static void DrawImageLoadingIcon(IGraphics g, HtmlContainerInt htmlContai /// the device to draw into /// /// the rectangle to draw icon in - public static void DrawImageErrorIcon(IGraphics g, HtmlContainerInt htmlContainer, RRect r) + public static void DrawImageErrorIcon(GraphicsBase g, HtmlContainerInt htmlContainer, RRect r) { g.DrawRectangle(g.GetPen(RColor.LightGray), r.Left + 2, r.Top + 2, 15, 15); - var image = htmlContainer.Global.GetErrorImage(); + var image = htmlContainer.Adapter.GetErrorImage(); g.DrawImage(image, new RRect(r.Left + 3, r.Top + 3, image.Width, image.Height)); } @@ -116,7 +116,7 @@ public static void DrawImageErrorIcon(IGraphics g, HtmlContainerInt htmlContaine /// Radius of the south east corner /// Radius of the south west corner /// GraphicsPath with the lines of the rounded rectangle ready to be painted - public static IGraphicsPath GetRoundRect(IGraphics g, RRect rect, double nwRadius, double neRadius, double seRadius, double swRadius) + public static IGraphicsPath GetRoundRect(GraphicsBase g, RRect rect, double nwRadius, double neRadius, double seRadius, double swRadius) { // NW-----NE // | | diff --git a/Source/HtmlRenderer/HtmlRenderer.csproj b/Source/HtmlRenderer/HtmlRenderer.csproj index cfe44d029..3a7fe20ff 100644 --- a/Source/HtmlRenderer/HtmlRenderer.csproj +++ b/Source/HtmlRenderer/HtmlRenderer.csproj @@ -103,13 +103,13 @@ - + - + diff --git a/Source/HtmlRenderer/Interfaces/GlobalBase.cs b/Source/HtmlRenderer/Interfaces/AdapterBase.cs similarity index 56% rename from Source/HtmlRenderer/Interfaces/GlobalBase.cs rename to Source/HtmlRenderer/Interfaces/AdapterBase.cs index e467d3767..bc492b92e 100644 --- a/Source/HtmlRenderer/Interfaces/GlobalBase.cs +++ b/Source/HtmlRenderer/Interfaces/AdapterBase.cs @@ -12,10 +12,12 @@ using System; +using System.Collections.Generic; using System.IO; using HtmlRenderer.Core; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Handlers; +using HtmlRenderer.Core.Utils; using HtmlRenderer.Entities; namespace HtmlRenderer.Interfaces @@ -27,9 +29,19 @@ namespace HtmlRenderer.Interfaces /// It is best to have a singleton instance of this class for concrete implementation!
    /// This is because it holds caches of default CssData, Images, Fonts and Brushes. /// - public abstract class GlobalBase + public abstract class AdapterBase { - #region Fields and Consts + #region Fields/Consts + + /// + /// cache of brush color to brush instance + /// + private static readonly Dictionary _brushesCache = new Dictionary(); + + /// + /// cache of pen color to pen instance + /// + private static readonly Dictionary _penCache = new Dictionary(); /// /// cache of all the font used not to create same font again and again @@ -57,7 +69,7 @@ public abstract class GlobalBase /// /// Init. /// - protected GlobalBase() + protected AdapterBase() { _fontHandler = new FontHandler(this); } @@ -75,21 +87,61 @@ public CssData DefaultCssData /// /// the color name /// color value - public abstract RColor GetColor(string colorName); + public RColor GetColor(string colorName) + { + ArgChecker.AssertArgNotNullOrEmpty(colorName, "colorName"); + return GetColorInt(colorName); + } + + /// + /// Get cached pen instance for the given color. + /// + /// the color to get pen for + /// pen instance + public IPen GetPen(RColor color) + { + IPen pen; + if (!_penCache.TryGetValue(color, out pen)) + { + _penCache[color] = pen = CreatePen(color); + } + return pen; + } + + /// + /// Get cached solid brush instance for the given color. + /// + /// the color to get brush for + /// brush instance + public IBrush GetSolidBrush(RColor color) + { + IBrush brush; + if (!_brushesCache.TryGetValue(color, out brush)) + { + _brushesCache[color] = brush = CreateSolidBrush(color); + } + return brush; + } /// /// Convert image object returned from to . /// /// the image returned from load event /// converted image or null - public abstract IImage ConvertImage(object image); + public IImage ConvertImage(object image) + { + return ConvertImageInt(image); + } /// /// Create an object from the given stream. /// /// the stream to create image from /// new image instance - public abstract IImage ImageFromStream(Stream memoryStream); + public IImage ImageFromStream(Stream memoryStream) + { + return ImageFromStreamInt(memoryStream); + } /// /// Check if the given font exists in the system by font family name. @@ -166,9 +218,9 @@ public IImage GetErrorImage() /// Set the given text to the clipboard /// /// the text to set - public virtual void SetToClipboard(string text) + public void SetToClipboard(string text) { - throw new NotImplementedException(); + SetToClipboardInt(text); } /// @@ -176,27 +228,27 @@ public virtual void SetToClipboard(string text) /// /// the html data /// the plain text data - public virtual void SetToClipboard(string html, string plainText) + public void SetToClipboard(string html, string plainText) { - throw new NotImplementedException(); + SetToClipboardInt(html, plainText); } /// /// Set the given image to clipboard. /// /// - public virtual void SetToClipboard(IImage image) + public void SetToClipboard(IImage image) { - throw new NotImplementedException(); + SetToClipboardInt(image); } /// /// Create a context menu that can be used on the control /// /// new context menu - public virtual IContextMenu CreateContextMenu() + public IContextMenu GetContextMenu() { - throw new NotImplementedException(); + return CreateContextMenuInt(); } /// @@ -206,11 +258,49 @@ public virtual IContextMenu CreateContextMenu() /// the name of the image for save dialog /// the extension of the image for save dialog /// optional: the control to show the dialog on - public virtual void SaveToFile(IImage image, string name, string extension, IControl control = null) + public void SaveToFile(IImage image, string name, string extension, IControl control = null) { - throw new NotImplementedException(); + SaveToFileInt(image, name, extension, control); } + + #region Private/Protected methods + + /// + /// Resolve color value from given color name. + /// + /// the color name + /// color value + protected abstract RColor GetColorInt(string colorName); + + /// + /// Get cached pen instance for the given color. + /// + /// the color to get pen for + /// pen instance + protected abstract IPen CreatePen(RColor color); + + /// + /// Get cached solid brush instance for the given color. + /// + /// the color to get brush for + /// brush instance + protected abstract IBrush CreateSolidBrush(RColor color); + + /// + /// Convert image object returned from to . + /// + /// the image returned from load event + /// converted image or null + protected abstract IImage ConvertImageInt(object image); + + /// + /// Create an object from the given stream. + /// + /// the stream to create image from + /// new image instance + protected abstract IImage ImageFromStreamInt(Stream memoryStream); + /// /// Get font instance by given font family name, size and style. /// @@ -218,7 +308,7 @@ public virtual void SaveToFile(IImage image, string name, string extension, ICon /// font size /// font style /// font instance - protected internal abstract IFont CreateFont(string family, double size, RFontStyle style); + protected internal abstract IFont CreateFontInt(string family, double size, RFontStyle style); /// /// Get font instance by given font family instance, size and style.
    @@ -228,6 +318,57 @@ public virtual void SaveToFile(IImage image, string name, string extension, ICon /// font size /// font style /// font instance - protected internal abstract IFont CreateFont(IFontFamily family, double size, RFontStyle style); + protected internal abstract IFont CreateFontInt(IFontFamily family, double size, RFontStyle style); + + /// + /// Set the given text to the clipboard + /// + /// the text to set + protected virtual void SetToClipboardInt(string text) + { + throw new NotImplementedException(); + } + + /// + /// Set the given html and plain text data to clipboard. + /// + /// the html data + /// the plain text data + protected virtual void SetToClipboardInt(string html, string plainText) + { + throw new NotImplementedException(); + } + + /// + /// Set the given image to clipboard. + /// + /// + protected virtual void SetToClipboardInt(IImage image) + { + throw new NotImplementedException(); + } + + /// + /// Create a context menu that can be used on the control + /// + /// new context menu + protected virtual IContextMenu CreateContextMenuInt() + { + throw new NotImplementedException(); + } + + /// + /// Save the given image to file by showing save dialog to the client. + /// + /// the image to save + /// the name of the image for save dialog + /// the extension of the image for save dialog + /// optional: the control to show the dialog on + protected virtual void SaveToFileInt(IImage image, string name, string extension, IControl control = null) + { + throw new NotImplementedException(); + } + + #endregion } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IGraphics.cs b/Source/HtmlRenderer/Interfaces/GraphicsBase.cs similarity index 76% rename from Source/HtmlRenderer/Interfaces/IGraphics.cs rename to Source/HtmlRenderer/Interfaces/GraphicsBase.cs index a200d19ec..5451d4b31 100644 --- a/Source/HtmlRenderer/Interfaces/IGraphics.cs +++ b/Source/HtmlRenderer/Interfaces/GraphicsBase.cs @@ -11,61 +11,56 @@ // "The Art of War" using System; +using HtmlRenderer.Core.Utils; using HtmlRenderer.Entities; namespace HtmlRenderer.Interfaces { /// - /// Interface for the graphics methods required for HTML rendering.
    - /// The core HTML Renderer components use this interface for rendering logic, implementing this - /// interface in different platform: WinForms, WPF, Silver-light, Mono, PdfSharp, etc. + /// Base class for the graphics methods required for HTML rendering.
    + /// The core HTML Renderer components use this class for rendering logic, extending this + /// class in different platform: WinForms, WPF, Silverlight, PdfSharp, etc. ///
    - public interface IGraphics : IDisposable + public abstract class GraphicsBase : IDisposable { - /// - /// Gets a Rectangle structure that bounds the clipping region of this Graphics. - /// - /// A rectangle structure that represents a bounding rectangle for the clipping region of this Graphics. - RRect GetClip(); + #region Fields/Consts /// - /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. + /// the global adapter /// - /// Rectangle structure to combine. - void SetClipReplace(RRect rect); + protected readonly AdapterBase _adapter; - /// - /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. - /// - /// Rectangle structure to combine. - void SetClipExclude(RRect rect); + #endregion /// - /// Set the graphics smooth mode to use anti-alias.
    - /// Use to return back the mode used. + /// Init. ///
    - /// the previous smooth mode before the change - Object SetAntiAliasSmoothingMode(); + protected GraphicsBase(AdapterBase adapter) + { + ArgChecker.AssertArgNotNull(adapter, "global"); - /// - /// Return to previous smooth mode before anti-alias was set as returned from . - /// - /// the previous mode to set - void ReturnPreviousSmoothingMode(Object prevMode); + _adapter = adapter; + } /// /// Get color pen. /// /// the color to get the pen for /// pen instance - IPen GetPen(RColor color); + public virtual IPen GetPen(RColor color) + { + return _adapter.GetPen(color); + } /// /// Get solid color brush. /// /// the color to get the brush for /// solid color brush instance - IBrush GetSolidBrush(RColor color); + public virtual IBrush GetSolidBrush(RColor color) + { + return _adapter.GetSolidBrush(color); + } /// /// Get linear gradient color brush from to . @@ -75,7 +70,38 @@ public interface IGraphics : IDisposable /// the end color of the gradient /// the angle to move the gradient from start color to end color in the rectangle /// linear gradient color brush instance - IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle); + public abstract IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle); + + /// + /// Gets a Rectangle structure that bounds the clipping region of this Graphics. + /// + /// A rectangle structure that represents a bounding rectangle for the clipping region of this Graphics. + public abstract RRect GetClip(); + + /// + /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. + /// + /// Rectangle structure to combine. + public abstract void SetClipReplace(RRect rect); + + /// + /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. + /// + /// Rectangle structure to combine. + public abstract void SetClipExclude(RRect rect); + + /// + /// Set the graphics smooth mode to use anti-alias.
    + /// Use to return back the mode used. + ///
    + /// the previous smooth mode before the change + public abstract Object SetAntiAliasSmoothingMode(); + + /// + /// Return to previous smooth mode before anti-alias was set as returned from . + /// + /// the previous mode to set + public abstract void ReturnPreviousSmoothingMode(Object prevMode); /// /// Get TextureBrush object that uses the specified image and bounding rectangle. @@ -83,13 +109,13 @@ public interface IGraphics : IDisposable /// The Image object with which this TextureBrush object fills interiors. /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. /// The dimension by which to translate the transformation - IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation); + public abstract IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation); /// /// Get GraphicsPath object. /// /// graphics path instance - IGraphicsPath GetGraphicsPath(); + public abstract IGraphicsPath GetGraphicsPath(); /// /// Measure the width and height of string when drawn on device context HDC @@ -98,7 +124,7 @@ public interface IGraphics : IDisposable /// the string to measure /// the font to measure string with /// the size of the string - RSize MeasureString(string str, IFont font); + public abstract RSize MeasureString(string str, IFont font); /// /// Measure the width and height of string when drawn on device context HDC @@ -112,7 +138,7 @@ public interface IGraphics : IDisposable /// the number of characters that will fit under restriction /// /// the size of the string - RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth); + public abstract RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth); /// /// Draw the given string using the given font and foreground color at given location. @@ -123,7 +149,7 @@ public interface IGraphics : IDisposable /// the location to start string draw (top-left) /// used to know the size of the rendered text for transparent text support /// is to render the string right-to-left (true - RTL, false - LTR) - void DrawString(String str, IFont font, RColor color, RPoint point, RSize size, bool rtl); + public abstract void DrawString(String str, IFont font, RColor color, RPoint point, RSize size, bool rtl); /// /// Draws a line connecting the two points specified by the coordinate pairs. @@ -133,7 +159,7 @@ public interface IGraphics : IDisposable /// The y-coordinate of the first point. /// The x-coordinate of the second point. /// The y-coordinate of the second point. - void DrawLine(IPen pen, double x1, double y1, double x2, double y2); + public abstract void DrawLine(IPen pen, double x1, double y1, double x2, double y2); /// /// Draws a rectangle specified by a coordinate pair, a width, and a height. @@ -143,7 +169,7 @@ public interface IGraphics : IDisposable /// The y-coordinate of the upper-left corner of the rectangle to draw. /// The width of the rectangle to draw. /// The height of the rectangle to draw. - void DrawRectangle(IPen pen, double x, double y, double width, double height); + public abstract void DrawRectangle(IPen pen, double x, double y, double width, double height); /// /// Fills the interior of a rectangle specified by a pair of coordinates, a width, and a height. @@ -153,7 +179,7 @@ public interface IGraphics : IDisposable /// The y-coordinate of the upper-left corner of the rectangle to fill. /// Width of the rectangle to fill. /// Height of the rectangle to fill. - void DrawRectangle(IBrush brush, double x, double y, double width, double height); + public abstract void DrawRectangle(IBrush brush, double x, double y, double width, double height); /// /// Draws the specified portion of the specified at the specified location and with the specified size. @@ -161,34 +187,39 @@ public interface IGraphics : IDisposable /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. The image is scaled to fit the rectangle. /// Rectangle structure that specifies the portion of the object to draw. - void DrawImage(IImage image, RRect destRect, RRect srcRect); + public abstract void DrawImage(IImage image, RRect destRect, RRect srcRect); /// /// Draws the specified Image at the specified location and with the specified size. /// /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. - void DrawImage(IImage image, RRect destRect); + public abstract void DrawImage(IImage image, RRect destRect); /// /// Draws a GraphicsPath. /// /// Pen that determines the color, width, and style of the path. /// GraphicsPath to draw. - void DrawPath(IPen pen, IGraphicsPath path); + public abstract void DrawPath(IPen pen, IGraphicsPath path); /// /// Fills the interior of a GraphicsPath. /// /// Brush that determines the characteristics of the fill. /// GraphicsPath that represents the path to fill. - void DrawPath(IBrush brush, IGraphicsPath path); + public abstract void DrawPath(IBrush brush, IGraphicsPath path); /// /// Fills the interior of a polygon defined by an array of points specified by Point structures. /// /// Brush that determines the characteristics of the fill. /// Array of Point structures that represent the vertices of the polygon to fill. - void DrawPolygon(IBrush brush, RPoint[] points); + public abstract void DrawPolygon(IBrush brush, RPoint[] points); + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public abstract void Dispose(); } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IControl.cs b/Source/HtmlRenderer/Interfaces/IControl.cs index 9d7acca53..5d929204c 100644 --- a/Source/HtmlRenderer/Interfaces/IControl.cs +++ b/Source/HtmlRenderer/Interfaces/IControl.cs @@ -68,7 +68,7 @@ public interface IControl /// Create graphics object that can be used with the control. /// /// graphics object - IGraphics CreateGraphics(); + GraphicsBase CreateGraphics(); /// /// Invalidates the entire surface of the control and causes the control to be redrawn. diff --git a/Source/HtmlRenderer/Interfaces/IFont.cs b/Source/HtmlRenderer/Interfaces/IFont.cs index 2cadf21ec..bb7eb118c 100644 --- a/Source/HtmlRenderer/Interfaces/IFont.cs +++ b/Source/HtmlRenderer/Interfaces/IFont.cs @@ -42,6 +42,6 @@ public interface IFont /// double LeftPadding { get; } - double GetWhitespaceWidth(IGraphics graphics); + double GetWhitespaceWidth(GraphicsBase graphics); } } \ No newline at end of file From 8133a454c70fc1ea3096a43bd440614b98883a52 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Mon, 5 May 2014 14:23:10 +0300 Subject: [PATCH 060/254] refactor adapters to be abstract classes with 'R' prefix --- Source/Demo/WinForms/DemoForm.cs | 2 +- .../Adapters/BrushAdapter.cs | 9 +-- .../Adapters/FontAdapter.cs | 19 +++-- .../Adapters/FontFamilyAdapter.cs | 6 +- .../Adapters/GraphicsAdapter.cs | 31 ++++---- .../Adapters/GraphicsPathAdapter.cs | 15 ++-- .../Adapters/ImageAdapter.cs | 12 +-- .../Adapters/PdfSharpAdapter.cs | 14 ++-- .../Adapters/PenAdapter.cs | 18 ++--- Source/HtmlRenderer.PdfSharp/HtmlContainer.cs | 2 +- Source/HtmlRenderer.PdfSharp/PdfGenerator.cs | 8 +- .../Properties/AssemblyInfo.cs | 7 +- .../HtmlRenderer.PdfSharp/Utilities/Utils.cs | 2 +- .../Adapters/BrushAdapter.cs | 4 +- .../Adapters/ContextMenuAdapter.cs | 14 ++-- .../Adapters/ControlAdapter.cs | 22 +++--- .../Adapters/FontAdapter.cs | 14 ++-- .../Adapters/FontFamilyAdapter.cs | 4 +- .../Adapters/GraphicsAdapter.cs | 38 ++++----- .../Adapters/GraphicsPathAdapter.cs | 10 +-- .../Adapters/ImageAdapter.cs | 10 +-- .../Adapters/PenAdapter.cs | 8 +- .../Adapters/WinFormsAdapter.cs | 18 ++--- Source/HtmlRenderer/Core/Dom/CssBox.cs | 28 +++---- Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs | 12 +-- Source/HtmlRenderer/Core/Dom/CssBoxHr.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssBoxImage.cs | 8 +- .../HtmlRenderer/Core/Dom/CssBoxProperties.cs | 10 +-- .../HtmlRenderer/Core/Dom/CssLayoutEngine.cs | 18 ++--- .../Core/Dom/CssLayoutEngineTable.cs | 8 +- Source/HtmlRenderer/Core/Dom/CssLineBox.cs | 2 +- Source/HtmlRenderer/Core/Dom/CssRect.cs | 2 +- Source/HtmlRenderer/Core/Dom/CssRectImage.cs | 4 +- .../Handlers/BackgroundImageDrawHandler.cs | 8 +- .../Core/Handlers/BordersDrawHandler.cs | 12 +-- .../Core/Handlers/ContextMenuHandler.cs | 6 +- .../HtmlRenderer/Core/Handlers/FontHandler.cs | 22 +++--- .../Core/Handlers/ImageLoadHandler.cs | 10 +-- .../Core/Handlers/SelectionHandler.cs | 22 +++--- Source/HtmlRenderer/Core/HtmlContainerInt.cs | 18 ++--- Source/HtmlRenderer/Core/HtmlRendererUtils.cs | 4 +- Source/HtmlRenderer/Core/Utils/CssUtils.cs | 2 +- Source/HtmlRenderer/Core/Utils/RenderUtils.cs | 10 +-- Source/HtmlRenderer/Entities/RDashStyle.cs | 2 +- Source/HtmlRenderer/HtmlRenderer.csproj | 18 ++--- Source/HtmlRenderer/Interfaces/AdapterBase.cs | 60 +++++++------- .../HtmlRenderer/Interfaces/IContextMenu.cs | 54 ------------- Source/HtmlRenderer/Interfaces/IControl.cs | 78 ------------------- Source/HtmlRenderer/Interfaces/IFont.cs | 47 ----------- .../HtmlRenderer/Interfaces/IGraphicsPath.cs | 38 --------- Source/HtmlRenderer/Interfaces/IImage.cs | 39 ---------- Source/HtmlRenderer/Interfaces/IPen.cs | 37 --------- .../Interfaces/{IBrush.cs => RBrush.cs} | 6 +- .../HtmlRenderer/Interfaces/RContextMenu.cs | 51 ++++++++++++ Source/HtmlRenderer/Interfaces/RControl.cs | 73 +++++++++++++++++ Source/HtmlRenderer/Interfaces/RFont.cs | 47 +++++++++++ .../{IFontFamily.cs => RFontFamily.cs} | 8 +- .../{GraphicsBase.cs => RGraphics.cs} | 39 +++++----- .../HtmlRenderer/Interfaces/RGraphicsPath.cs | 40 ++++++++++ Source/HtmlRenderer/Interfaces/RImage.cs | 40 ++++++++++ Source/HtmlRenderer/Interfaces/RPen.cs | 37 +++++++++ 61 files changed, 603 insertions(+), 608 deletions(-) delete mode 100644 Source/HtmlRenderer/Interfaces/IContextMenu.cs delete mode 100644 Source/HtmlRenderer/Interfaces/IControl.cs delete mode 100644 Source/HtmlRenderer/Interfaces/IFont.cs delete mode 100644 Source/HtmlRenderer/Interfaces/IGraphicsPath.cs delete mode 100644 Source/HtmlRenderer/Interfaces/IImage.cs delete mode 100644 Source/HtmlRenderer/Interfaces/IPen.cs rename Source/HtmlRenderer/Interfaces/{IBrush.cs => RBrush.cs} (80%) create mode 100644 Source/HtmlRenderer/Interfaces/RContextMenu.cs create mode 100644 Source/HtmlRenderer/Interfaces/RControl.cs create mode 100644 Source/HtmlRenderer/Interfaces/RFont.cs rename Source/HtmlRenderer/Interfaces/{IFontFamily.cs => RFontFamily.cs} (76%) rename Source/HtmlRenderer/Interfaces/{GraphicsBase.cs => RGraphics.cs} (89%) create mode 100644 Source/HtmlRenderer/Interfaces/RGraphicsPath.cs create mode 100644 Source/HtmlRenderer/Interfaces/RImage.cs create mode 100644 Source/HtmlRenderer/Interfaces/RPen.cs diff --git a/Source/Demo/WinForms/DemoForm.cs b/Source/Demo/WinForms/DemoForm.cs index e351e5823..8aa11937d 100644 --- a/Source/Demo/WinForms/DemoForm.cs +++ b/Source/Demo/WinForms/DemoForm.cs @@ -533,7 +533,7 @@ private void OnRunTestButtonClick(object sender, EventArgs e) float totalMem = 0; #if NET_40 endMemory = AppDomain.CurrentDomain.MonitoringTotalAllocatedMemorySize; - totalMem = (endMemory - startMemory)/1024f; + totalMem = (endMemory - startMemory) / 1024f; #endif float htmlSize = 0; foreach (var sample in _perfTestSamples) diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/BrushAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/BrushAdapter.cs index c8e43679e..a7fd5052e 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/BrushAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/BrushAdapter.cs @@ -18,7 +18,7 @@ namespace HtmlRenderer.PdfSharp.Adapters /// /// Adapter for WinForms brushes objects for core. /// - internal sealed class BrushAdapter : IBrush + internal sealed class BrushAdapter : RBrush { /// /// The actual WinForms brush instance. @@ -44,8 +44,7 @@ public XBrush Brush /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// - public void Dispose() - { - } + public override void Dispose() + { } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs index 6082f20d9..5ccd1416a 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs @@ -18,7 +18,7 @@ namespace HtmlRenderer.PdfSharp.Adapters /// /// Adapter for WinForms Font object for core. /// - internal sealed class FontAdapter : IFont + internal sealed class FontAdapter : RFont { #region Fields and Consts @@ -42,7 +42,6 @@ internal sealed class FontAdapter : IFont /// private double _whitespaceWidth = -1; - #endregion @@ -65,7 +64,7 @@ public XFont Font /// /// Gets the em-size of this Font measured in the units specified by the Unit property. /// - public double Size + public override double Size { get { return _font.Size; } } @@ -73,7 +72,7 @@ public double Size /// /// Gets the em-size, in points, of this Font. /// - public double SizeInPoints + public override double SizeInPoints { get { return _font.Size; } } @@ -81,7 +80,7 @@ public double SizeInPoints /// /// Get the vertical offset of the font underline location from the top of the font. /// - public double UnderlineOffset + public override double UnderlineOffset { get { return _underlineOffset; } } @@ -89,7 +88,7 @@ public double UnderlineOffset /// /// The line spacing, in pixels, of this font. /// - public double Height + public override double Height { get { return _height; } } @@ -97,15 +96,15 @@ public double Height /// /// Get the left padding, in pixels, of the font. /// - public double LeftPadding + public override double LeftPadding { get { return _height / 6f; } } - public double GetWhitespaceWidth(GraphicsBase graphics) + public override double GetWhitespaceWidth(RGraphics graphics) { - if( _whitespaceWidth < 0 ) + if (_whitespaceWidth < 0) { _whitespaceWidth = graphics.MeasureString(" ", this).Width; } @@ -123,4 +122,4 @@ internal void SetMetrics(int height, int underlineOffset) _underlineOffset = underlineOffset; } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/FontFamilyAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/FontFamilyAdapter.cs index 42f9480bc..96e4f7dc8 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/FontFamilyAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/FontFamilyAdapter.cs @@ -18,7 +18,7 @@ namespace HtmlRenderer.PdfSharp.Adapters /// /// Adapter for WinForms Font object for core. /// - internal sealed class FontFamilyAdapter : IFontFamily + internal sealed class FontFamilyAdapter : RFontFamily { /// /// the underline win-forms font. @@ -44,9 +44,9 @@ public XFontFamily FontFamily /// /// Gets the name of this FontFamily. /// - public string Name + public override string Name { get { return _fontFamily.Name; } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs index f4bf3be4a..abec43226 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs @@ -24,7 +24,7 @@ namespace HtmlRenderer.PdfSharp.Adapters /// /// Adapter for WinForms Graphics for core. /// - internal sealed class GraphicsAdapter : GraphicsBase + internal sealed class GraphicsAdapter : RGraphics { #region Fields and Consts @@ -114,7 +114,7 @@ public override void ReturnPreviousSmoothingMode(Object prevMode) /// the string to measure /// the font to measure string with /// the size of the string - public override RSize MeasureString(string str, IFont font) + public override RSize MeasureString(string str, RFont font) { var fontAdapter = (FontAdapter)font; var realFont = fontAdapter.Font; @@ -128,7 +128,6 @@ public override RSize MeasureString(string str, IFont font) } return Utils.Convert(size); - } /// @@ -143,7 +142,7 @@ public override RSize MeasureString(string str, IFont font) /// the number of characters that will fit under restriction /// /// the size of the string - public override RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth) + public override RSize MeasureString(string str, RFont font, double maxWidth, out int charFit, out int charFitWidth) { throw new NotSupportedException(); } @@ -157,7 +156,7 @@ public override RSize MeasureString(string str, IFont font, double maxWidth, out /// the location to start string draw (top-left) /// used to know the size of the rendered text for transparent text support /// is to render the string right-to-left (true - RTL, false - LTR) - public override void DrawString(string str, IFont font, RColor color, RPoint point, RSize size, bool rtl) + public override void DrawString(string str, RFont font, RColor color, RPoint point, RSize size, bool rtl) { var brush = new XSolidBrush(Utils.Convert(color)); _g.DrawString(str, ((FontAdapter)font).Font, brush, point.X - font.LeftPadding * .8f, point.Y); @@ -171,7 +170,7 @@ public override void DrawString(string str, IFont font, RColor color, RPoint poi /// the end color of the gradient /// the angle to move the gradient from start color to end color in the rectangle /// linear gradient color brush instance - public override IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) + public override RBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) { XLinearGradientMode mode; if (angle < 45) @@ -191,7 +190,7 @@ public override IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor /// The Image object with which this TextureBrush object fills interiors. /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. /// The dimension by which to translate the transformation - public override IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation) + public override RBrush GetTextureBrush(RImage image, RRect dstRect, RPoint translateTransformLocation) { // TODO:a handle missing TextureBrush // var brush = new TextureBrush(((ImageAdapter)image).Image, Utils.Convert(dstRect)); @@ -204,7 +203,7 @@ public override IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint trans /// Get GraphicsPath object. /// /// graphics path instance - public override IGraphicsPath GetGraphicsPath() + public override RGraphicsPath GetGraphicsPath() { return new GraphicsPathAdapter(); } @@ -228,7 +227,7 @@ public override void Dispose() /// The x-coordinate of the first point. The y-coordinate of the first point. /// The x-coordinate of the second point. The y-coordinate of the second point. /// is null. - public override void DrawLine(IPen pen, double x1, double y1, double x2, double y2) + public override void DrawLine(RPen pen, double x1, double y1, double x2, double y2) { _g.DrawLine(((PenAdapter)pen).Pen, x1, y1, x2, y2); } @@ -241,7 +240,7 @@ public override void DrawLine(IPen pen, double x1, double y1, double x2, double /// The y-coordinate of the upper-left corner of the rectangle to draw. /// The width of the rectangle to draw. /// The height of the rectangle to draw. - public override void DrawRectangle(IPen pen, double x, double y, double width, double height) + public override void DrawRectangle(RPen pen, double x, double y, double width, double height) { _g.DrawRectangle(((PenAdapter)pen).Pen, x, y, width, height); } @@ -254,7 +253,7 @@ public override void DrawRectangle(IPen pen, double x, double y, double width, d /// The y-coordinate of the upper-left corner of the rectangle to fill. /// Width of the rectangle to fill. /// Height of the rectangle to fill. - public override void DrawRectangle(IBrush brush, double x, double y, double width, double height) + public override void DrawRectangle(RBrush brush, double x, double y, double width, double height) { _g.DrawRectangle(((BrushAdapter)brush).Brush, x, y, width, height); } @@ -265,7 +264,7 @@ public override void DrawRectangle(IBrush brush, double x, double y, double widt /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. The image is scaled to fit the rectangle. /// Rectangle structure that specifies the portion of the object to draw. - public override void DrawImage(IImage image, RRect destRect, RRect srcRect) + public override void DrawImage(RImage image, RRect destRect, RRect srcRect) { _g.DrawImage(((ImageAdapter)image).Image, Utils.Convert(destRect), Utils.Convert(srcRect), XGraphicsUnit.Point); } @@ -275,7 +274,7 @@ public override void DrawImage(IImage image, RRect destRect, RRect srcRect) /// /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. - public override void DrawImage(IImage image, RRect destRect) + public override void DrawImage(RImage image, RRect destRect) { _g.DrawImage(((ImageAdapter)image).Image, Utils.Convert(destRect)); } @@ -285,7 +284,7 @@ public override void DrawImage(IImage image, RRect destRect) /// /// Pen that determines the color, width, and style of the path. /// GraphicsPath to draw. - public override void DrawPath(IPen pen, IGraphicsPath path) + public override void DrawPath(RPen pen, RGraphicsPath path) { _g.DrawPath(((PenAdapter)pen).Pen, ((GraphicsPathAdapter)path).GraphicsPath); } @@ -295,7 +294,7 @@ public override void DrawPath(IPen pen, IGraphicsPath path) /// /// Brush that determines the characteristics of the fill. /// GraphicsPath that represents the path to fill. - public override void DrawPath(IBrush brush, IGraphicsPath path) + public override void DrawPath(RBrush brush, RGraphicsPath path) { _g.DrawPath(((BrushAdapter)brush).Brush, ((GraphicsPathAdapter)path).GraphicsPath); } @@ -305,7 +304,7 @@ public override void DrawPath(IBrush brush, IGraphicsPath path) /// /// Brush that determines the characteristics of the fill. /// Array of Point structures that represent the vertices of the polygon to fill. - public override void DrawPolygon(IBrush brush, RPoint[] points) + public override void DrawPolygon(RBrush brush, RPoint[] points) { if (points != null && points.Length > 0) { diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs index 1e9c7d319..a572077fb 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs @@ -18,7 +18,7 @@ namespace HtmlRenderer.PdfSharp.Adapters /// /// Adapter for WinForms graphics path object for core. /// - internal sealed class GraphicsPathAdapter : IGraphicsPath + internal sealed class GraphicsPathAdapter : RGraphicsPath { /// /// The actual WinForms graphics path instance. @@ -36,7 +36,7 @@ public XGraphicsPath GraphicsPath /// /// Appends an elliptical arc to the current figure. /// - public void AddArc(double x, double y, double width, double height, double startAngle, double sweepAngle) + public override void AddArc(double x, double y, double width, double height, double startAngle, double sweepAngle) { _graphicsPath.AddArc(x, y, width, height, startAngle, sweepAngle); } @@ -44,7 +44,7 @@ public void AddArc(double x, double y, double width, double height, double start /// /// Appends a line segment to this GraphicsPath. /// - public void AddLine(double x1, double y1, double x2, double y2) + public override void AddLine(double x1, double y1, double x2, double y2) { _graphicsPath.AddLine(x1, y1, x2, y2); } @@ -53,7 +53,7 @@ public void AddLine(double x1, double y1, double x2, double y2) /// Closes the current figure and starts a new figure. If the current figure contains a sequence of connected /// lines and curves, the method closes the loop by connecting a line from the endpoint to the starting point. /// - public void CloseFigure() + public override void CloseFigure() { _graphicsPath.CloseFigure(); } @@ -61,8 +61,7 @@ public void CloseFigure() /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// - public void Dispose() - { - } + public override void Dispose() + { } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs index 5be6ceaba..063477f72 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs @@ -20,7 +20,7 @@ namespace HtmlRenderer.PdfSharp.Adapters /// /// Adapter for WinForms Image object for core. /// - internal sealed class ImageAdapter : IImage + internal sealed class ImageAdapter : RImage { /// /// the underline win-forms image. @@ -46,7 +46,7 @@ public XImage Image /// /// Get the width, in pixels, of the image. /// - public double Width + public override double Width { get { return _image.PixelWidth; } } @@ -54,7 +54,7 @@ public double Width /// /// Get the height, in pixels, of the image. /// - public double Height + public override double Height { get { return _image.PixelHeight; } } @@ -63,7 +63,7 @@ public double Height /// Saves this image to the specified stream in PNG format. /// /// The Stream where the image will be saved. - public void Save(MemoryStream stream) + public override void Save(MemoryStream stream) { throw new NotSupportedException(); } @@ -71,9 +71,9 @@ public void Save(MemoryStream stream) /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// - public void Dispose() + public override void Dispose() { _image.Dispose(); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs index b12a31758..581eeb86c 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs @@ -62,36 +62,36 @@ protected override RColor GetColorInt(string colorName) return Utils.Convert(XColor.FromName(colorName)); } - protected override IPen CreatePen(RColor color) + protected override RPen CreatePen(RColor color) { return null; } - protected override IBrush CreateSolidBrush(RColor color) + protected override RBrush CreateSolidBrush(RColor color) { return null; } - protected override IImage ConvertImageInt(object image) + protected override RImage ConvertImageInt(object image) { return image != null ? new ImageAdapter((XImage)image) : null; } - protected override IImage ImageFromStreamInt(Stream memoryStream) + protected override RImage ImageFromStreamInt(Stream memoryStream) { return new ImageAdapter(XImage.FromGdiPlusImage(Image.FromStream(memoryStream))); } - protected override IFont CreateFontInt(string family, double size, RFontStyle style) + protected override RFont CreateFontInt(string family, double size, RFontStyle style) { var fontStyle = (XFontStyle)((int)style); return new FontAdapter(new XFont(family, size, fontStyle)); } - protected override IFont CreateFontInt(IFontFamily family, double size, RFontStyle style) + protected override RFont CreateFontInt(RFontFamily family, double size, RFontStyle style) { var fontStyle = (XFontStyle)((int)style); return new FontAdapter(new XFont(((FontFamilyAdapter)family).FontFamily.Name, size, fontStyle)); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs index 06402fdf6..1e3302679 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs @@ -19,7 +19,7 @@ namespace HtmlRenderer.PdfSharp.Adapters /// /// Adapter for WinForms pens objects for core. /// - internal sealed class PenAdapter : IPen + internal sealed class PenAdapter : RPen { /// /// The actual WinForms brush instance. @@ -45,7 +45,7 @@ public XPen Pen /// /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. /// - public double Width + public override double Width { get { return _pen.Width; } set { _pen.Width = value; } @@ -54,11 +54,11 @@ public double Width /// /// Gets or sets the style used for dashed lines drawn with this Pen. /// - public RDashStyle DashStyle + public override RDashStyle DashStyle { set { - switch( value ) + switch (value) { case RDashStyle.Solid: _pen.DashStyle = XDashStyle.Solid; @@ -84,20 +84,20 @@ public RDashStyle DashStyle } } } - + /// /// Gets or sets an array of custom dashes and spaces. /// - public double[] DashPattern + public override double[] DashPattern { set { var dValues = new double[value.Length]; - for(int i = 0; i < value.Length; i++) + for (int i = 0; i < value.Length; i++) dValues[i] = value[i]; - + _pen.DashPattern = value; } } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs b/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs index 3e5818ad2..2883f0ccf 100644 --- a/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs +++ b/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs @@ -227,7 +227,7 @@ public void PerformLayout(XGraphics g) { ArgChecker.AssertArgNotNull(g, "g"); - using(var ig = new GraphicsAdapter(g)) + using (var ig = new GraphicsAdapter(g)) { _htmlContainerInt.PerformLayout(ig); } diff --git a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs index 9eb9cedc2..e08674e8b 100644 --- a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs +++ b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs @@ -25,10 +25,8 @@ public static PdfDocument GeneratePdf(string html, PageSize pageSize) { var size = PageSizeConverter.ToSize(pageSize); - using(var measure = XGraphics.CreateMeasureContext(size,XGraphicsUnit.Point, XPageDirection.Downwards)) - { - - } + using (var measure = XGraphics.CreateMeasureContext(size, XGraphicsUnit.Point, XPageDirection.Downwards)) + { } var document = new PdfDocument(); @@ -37,4 +35,4 @@ public static PdfDocument GeneratePdf(string html, PageSize pageSize) return document; } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/Properties/AssemblyInfo.cs b/Source/HtmlRenderer.PdfSharp/Properties/AssemblyInfo.cs index 4cf73d1fa..62e67fcf0 100644 --- a/Source/HtmlRenderer.PdfSharp/Properties/AssemblyInfo.cs +++ b/Source/HtmlRenderer.PdfSharp/Properties/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("HtmlRenderer.PdfSharp")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -17,9 +17,11 @@ // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. + [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM + [assembly: Guid("5e2202c0-4a7c-453b-8f67-a590af6f4cfc")] // Version information for an assembly consists of the following four values: @@ -32,5 +34,6 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] + [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs index 9abad2a2a..b83badbae 100644 --- a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs +++ b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs @@ -95,4 +95,4 @@ public static XColor Convert(RColor c) return XColor.FromArgb(c.A, c.R, c.G, c.B); } } -} +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs index b25474e52..25da09c6a 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs @@ -18,7 +18,7 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for WinForms brushes objects for core. /// - internal sealed class BrushAdapter : IBrush + internal sealed class BrushAdapter : RBrush { /// /// The actual WinForms brush instance. @@ -51,7 +51,7 @@ public Brush Brush /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// - public void Dispose() + public override void Dispose() { if (_dispose) { diff --git a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs index e6e8dff52..95610455c 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs @@ -22,7 +22,7 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for WinForms context menu for core. /// - internal sealed class ContextMenuAdapter : IContextMenu + internal sealed class ContextMenuAdapter : RContextMenu { #region Fields and Consts @@ -46,7 +46,7 @@ public ContextMenuAdapter() /// /// The total number of items in the context menu /// - public int ItemsCount + public override int ItemsCount { get { return _contextMenu.Items.Count; } } @@ -55,7 +55,7 @@ public int ItemsCount /// Add divider item to the context menu.
    /// The divider is a non clickable place holder used to separate items. ///
    - public void AddDivider() + public override void AddDivider() { _contextMenu.Items.Add("-"); } @@ -66,7 +66,7 @@ public void AddDivider() /// the text to set on the new context menu item /// if to set the item as enabled or disabled /// the event to raise when the item is clicked - public void AddItem(string text, bool enabled, EventHandler onClick) + public override void AddItem(string text, bool enabled, EventHandler onClick) { ArgChecker.AssertArgNotNullOrEmpty(text, "text"); ArgChecker.AssertArgNotNull(onClick, "onClick"); @@ -78,7 +78,7 @@ public void AddItem(string text, bool enabled, EventHandler onClick) /// /// Remove the last item from the context menu iff it is a divider /// - public void RemoveLastDivider() + public override void RemoveLastDivider() { if (_contextMenu.Items[_contextMenu.Items.Count - 1].Text == string.Empty) _contextMenu.Items.RemoveAt(_contextMenu.Items.Count - 1); @@ -89,7 +89,7 @@ public void RemoveLastDivider() ///
    /// the parent control to show in /// the location to show at relative to the parent control - public void Show(IControl parent, RPoint location) + public override void Show(RControl parent, RPoint location) { _contextMenu.Show(((ControlAdapter)parent).Control, Utils.ConvertRound(location)); } @@ -97,7 +97,7 @@ public void Show(IControl parent, RPoint location) /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// - public void Dispose() + public override void Dispose() { _contextMenu.Dispose(); } diff --git a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs index cf921cbde..42a2ac4f9 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs @@ -21,7 +21,7 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for WinForms Control for core. /// - internal sealed class ControlAdapter : IControl + internal sealed class ControlAdapter : RControl { /// /// the underline win forms control. @@ -47,7 +47,7 @@ public ControlAdapter(Control control, bool useGdiPlusTextRendering) /// /// Get the current location of the mouse relative to the control /// - public RPoint MouseLocation + public override RPoint MouseLocation { get { return Utils.Convert(_control.PointToClient(Control.MousePosition)); } } @@ -55,7 +55,7 @@ public RPoint MouseLocation /// /// Is the left mouse button is currently in pressed state /// - public bool LeftMouseButton + public override bool LeftMouseButton { get { return (Control.MouseButtons & MouseButtons.Left) != 0; } } @@ -63,7 +63,7 @@ public bool LeftMouseButton /// /// Is the right mouse button is currently in pressed state /// - public bool RightMouseButton + public override bool RightMouseButton { get { return (Control.MouseButtons & MouseButtons.Right) != 0; } } @@ -79,7 +79,7 @@ public Control Control /// /// Set the cursor over the control to default cursor /// - public void SetCursorDefault() + public override void SetCursorDefault() { _control.Cursor = Cursors.Default; } @@ -87,7 +87,7 @@ public void SetCursorDefault() /// /// Set the cursor over the control to hand cursor /// - public void SetCursorHand() + public override void SetCursorHand() { _control.Cursor = Cursors.Hand; } @@ -95,7 +95,7 @@ public void SetCursorHand() /// /// Set the cursor over the control to I beam cursor /// - public void SetCursorIBeam() + public override void SetCursorIBeam() { _control.Cursor = Cursors.IBeam; } @@ -107,7 +107,7 @@ public void SetCursorIBeam() /// the html data /// the plain text data /// drag-drop data object - public object GetDataObject(string html, string plainText) + public override object GetDataObject(string html, string plainText) { return ClipboardHelper.CreateDataObject(html, plainText); } @@ -116,7 +116,7 @@ public object GetDataObject(string html, string plainText) /// Do drag-drop copy operation for the given data object. /// /// the data object - public void DoDragDropCopy(object dragDropData) + public override void DoDragDropCopy(object dragDropData) { _control.DoDragDrop(dragDropData, DragDropEffects.Copy); } @@ -125,7 +125,7 @@ public void DoDragDropCopy(object dragDropData) /// Create graphics object that can be used with the control. ///
    /// graphics object - public GraphicsBase CreateGraphics() + public override RGraphics CreateGraphics() { // the win forms graphics object will be disposed by WinGraphics return new GraphicsAdapter(_control.CreateGraphics(), _useGdiPlusTextRendering, true); @@ -134,7 +134,7 @@ public GraphicsBase CreateGraphics() /// /// Invalidates the entire surface of the control and causes the control to be redrawn. /// - public void Invalidate() + public override void Invalidate() { _control.Invalidate(); } diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs index 5a29cc331..5b4e433e6 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs @@ -19,7 +19,7 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for WinForms Font object for core. /// - internal sealed class FontAdapter : IFont + internal sealed class FontAdapter : RFont { #region Fields and Consts @@ -83,7 +83,7 @@ public IntPtr HFont /// /// Gets the em-size of this Font measured in the units specified by the Unit property. /// - public double Size + public override double Size { get { return _font.Size; } } @@ -91,7 +91,7 @@ public double Size /// /// Gets the em-size, in points, of this Font. /// - public double SizeInPoints + public override double SizeInPoints { get { return _font.SizeInPoints; } } @@ -99,7 +99,7 @@ public double SizeInPoints /// /// Get the vertical offset of the font underline location from the top of the font. /// - public double UnderlineOffset + public override double UnderlineOffset { get { return _underlineOffset; } } @@ -107,7 +107,7 @@ public double UnderlineOffset /// /// The line spacing, in pixels, of this font. /// - public double Height + public override double Height { get { return _height; } } @@ -115,13 +115,13 @@ public double Height /// /// Get the left padding, in pixels, of the font. /// - public double LeftPadding + public override double LeftPadding { get { return _height / 6f; } } - public double GetWhitespaceWidth(GraphicsBase graphics) + public override double GetWhitespaceWidth(RGraphics graphics) { if (_whitespaceWidth < 0) { diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs index 128e854cb..38b9f9419 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs @@ -18,7 +18,7 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for WinForms Font family object for core. /// - internal sealed class FontFamilyAdapter : IFontFamily + internal sealed class FontFamilyAdapter : RFontFamily { /// /// the underline win-forms font. @@ -44,7 +44,7 @@ public FontFamily FontFamily /// /// Gets the name of this FontFamily. /// - public string Name + public override string Name { get { return _fontFamily.Name; } } diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs index 56ab01481..07acf0d2f 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs @@ -23,17 +23,17 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for WinForms Graphics for core. /// - internal sealed class GraphicsAdapter : GraphicsBase + internal sealed class GraphicsAdapter : RGraphics { #region Fields and Consts /// - /// used for calculation. + /// used for calculation. /// private static readonly int[] _charFit = new int[1]; /// - /// used for calculation. + /// used for calculation. /// private static readonly int[] _charFitWidth = new int[1000]; @@ -107,7 +107,7 @@ public GraphicsAdapter(Graphics g, bool useGdiPlusTextRendering, bool releaseGra _releaseGraphics = releaseGraphics; } - public override IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) + public override RBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) { return new BrushAdapter(new LinearGradientBrush(Utils.Convert(rect), Utils.Convert(color1), Utils.Convert(color2), (float)angle), true); } @@ -157,7 +157,7 @@ public override void ReturnPreviousSmoothingMode(Object prevMode) } } - public override RSize MeasureString(string str, IFont font) + public override RSize MeasureString(string str, RFont font) { if (_useGdiPlusTextRendering) { @@ -194,7 +194,7 @@ public override RSize MeasureString(string str, IFont font) } } - public override RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth) + public override RSize MeasureString(string str, RFont font, double maxWidth, out int charFit, out int charFitWidth) { charFit = 0; charFitWidth = 0; @@ -228,7 +228,7 @@ public override RSize MeasureString(string str, IFont font, double maxWidth, out } } - public override void DrawString(string str, IFont font, RColor color, RPoint point, RSize size, bool rtl) + public override void DrawString(string str, RFont font, RColor color, RPoint point, RSize size, bool rtl) { var pointConv = Utils.ConvertRound(point); var colorConv = Utils.Convert(color); @@ -259,14 +259,14 @@ public override void DrawString(string str, IFont font, RColor color, RPoint poi } } - public override IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation) + public override RBrush GetTextureBrush(RImage image, RRect dstRect, RPoint translateTransformLocation) { var brush = new TextureBrush(((ImageAdapter)image).Image, Utils.Convert(dstRect)); brush.TranslateTransform((float)translateTransformLocation.X, (float)translateTransformLocation.Y); return new BrushAdapter(brush, true); } - public override IGraphicsPath GetGraphicsPath() + public override RGraphicsPath GetGraphicsPath() { return new GraphicsPathAdapter(); } @@ -284,48 +284,48 @@ public override void Dispose() #region Delegate graphics methods - public override void DrawLine(IPen pen, double x1, double y1, double x2, double y2) + public override void DrawLine(RPen pen, double x1, double y1, double x2, double y2) { ReleaseHdc(); _g.DrawLine(((PenAdapter)pen).Pen, (float)x1, (float)y1, (float)x2, (float)y2); } - public override void DrawRectangle(IPen pen, double x, double y, double width, double height) + public override void DrawRectangle(RPen pen, double x, double y, double width, double height) { ReleaseHdc(); _g.DrawRectangle(((PenAdapter)pen).Pen, (float)x, (float)y, (float)width, (float)height); } - public override void DrawRectangle(IBrush brush, double x, double y, double width, double height) + public override void DrawRectangle(RBrush brush, double x, double y, double width, double height) { ReleaseHdc(); _g.FillRectangle(((BrushAdapter)brush).Brush, (float)x, (float)y, (float)width, (float)height); } - public override void DrawImage(IImage image, RRect destRect, RRect srcRect) + public override void DrawImage(RImage image, RRect destRect, RRect srcRect) { ReleaseHdc(); _g.DrawImage(((ImageAdapter)image).Image, Utils.Convert(destRect), Utils.Convert(srcRect), GraphicsUnit.Pixel); } - public override void DrawImage(IImage image, RRect destRect) + public override void DrawImage(RImage image, RRect destRect) { ReleaseHdc(); _g.DrawImage(((ImageAdapter)image).Image, Utils.Convert(destRect)); } - public override void DrawPath(IPen pen, IGraphicsPath path) + public override void DrawPath(RPen pen, RGraphicsPath path) { _g.DrawPath(((PenAdapter)pen).Pen, ((GraphicsPathAdapter)path).GraphicsPath); } - public override void DrawPath(IBrush brush, IGraphicsPath path) + public override void DrawPath(RBrush brush, RGraphicsPath path) { ReleaseHdc(); _g.FillPath(((BrushAdapter)brush).Brush, ((GraphicsPathAdapter)path).GraphicsPath); } - public override void DrawPolygon(IBrush brush, RPoint[] points) + public override void DrawPolygon(RBrush brush, RPoint[] points) { if (points != null && points.Length > 0) { @@ -375,7 +375,7 @@ private void ReleaseHdc() /// Set a resource (e.g. a font) for the specified device context. /// WARNING: Calling Font.ToHfont() many times without releasing the font handle crashes the app. /// - private void SetFont(IFont font) + private void SetFont(RFont font) { InitHdc(); Win32Utils.SelectObject(_hdc, ((FontAdapter)font).HFont); @@ -423,7 +423,7 @@ private void SetRtlAlign(bool rtl) /// 3. Draw the text to in-memory DC
    /// 4. Copy the in-memory DC to the proper location with alpha blend
    ///
    - private static void DrawTransparentText(IntPtr hdc, string str, IFont font, Point point, Size size, Color color) + private static void DrawTransparentText(IntPtr hdc, string str, RFont font, Point point, Size size, Color color) { IntPtr dib; var memoryHdc = Win32Utils.CreateMemoryHdc(hdc, size.Width, size.Height, out dib); diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs index 63a539bb3..7c1889322 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs @@ -18,7 +18,7 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for WinForms graphics path object for core. /// - internal sealed class GraphicsPathAdapter : IGraphicsPath + internal sealed class GraphicsPathAdapter : RGraphicsPath { /// /// The actual WinForms graphics path instance. @@ -36,7 +36,7 @@ public GraphicsPath GraphicsPath /// /// Appends an elliptical arc to the current figure. /// - public void AddArc(double x, double y, double width, double height, double startAngle, double sweepAngle) + public override void AddArc(double x, double y, double width, double height, double startAngle, double sweepAngle) { _graphicsPath.AddArc((float)x, (float)y, (float)width, (float)height, (float)startAngle, (float)sweepAngle); } @@ -44,7 +44,7 @@ public void AddArc(double x, double y, double width, double height, double start /// /// Appends a line segment to this GraphicsPath. /// - public void AddLine(double x1, double y1, double x2, double y2) + public override void AddLine(double x1, double y1, double x2, double y2) { _graphicsPath.AddLine((float)x1, (float)y1, (float)x2, (float)y2); } @@ -53,7 +53,7 @@ public void AddLine(double x1, double y1, double x2, double y2) /// Closes the current figure and starts a new figure. If the current figure contains a sequence of connected /// lines and curves, the method closes the loop by connecting a line from the endpoint to the starting point. /// - public void CloseFigure() + public override void CloseFigure() { _graphicsPath.CloseFigure(); } @@ -61,7 +61,7 @@ public void CloseFigure() /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// - public void Dispose() + public override void Dispose() { _graphicsPath.Dispose(); } diff --git a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs index f2793ec54..c60ca0d94 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs @@ -20,7 +20,7 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for WinForms Image object for core. /// - internal sealed class ImageAdapter : IImage + internal sealed class ImageAdapter : RImage { /// /// the underline win-forms image. @@ -46,7 +46,7 @@ public Image Image /// /// Get the width, in pixels, of the image. /// - public double Width + public override double Width { get { return _image.Width; } } @@ -54,7 +54,7 @@ public double Width /// /// Get the height, in pixels, of the image. /// - public double Height + public override double Height { get { return _image.Height; } } @@ -63,7 +63,7 @@ public double Height /// Saves this image to the specified stream in PNG format. /// /// The Stream where the image will be saved. - public void Save(MemoryStream stream) + public override void Save(MemoryStream stream) { _image.Save(stream, ImageFormat.Png); } @@ -71,7 +71,7 @@ public void Save(MemoryStream stream) /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// - public void Dispose() + public override void Dispose() { _image.Dispose(); } diff --git a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs index cc8824b7e..95d9bf70f 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs @@ -19,7 +19,7 @@ namespace HtmlRenderer.WinForms.Adapters /// /// Adapter for WinForms pens objects for core. /// - internal sealed class PenAdapter : IPen + internal sealed class PenAdapter : RPen { /// /// The actual WinForms brush instance. @@ -45,7 +45,7 @@ public Pen Pen /// /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. /// - public double Width + public override double Width { get { return _pen.Width; } set { _pen.Width = (float)value; } @@ -54,7 +54,7 @@ public double Width /// /// Gets or sets the style used for dashed lines drawn with this Pen. /// - public RDashStyle DashStyle + public override RDashStyle DashStyle { set { @@ -88,7 +88,7 @@ public RDashStyle DashStyle /// /// Gets or sets an array of custom dashes and spaces. /// - public double[] DashPattern + public override double[] DashPattern { set { diff --git a/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs index 06a3c3848..0ec58087a 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs @@ -63,12 +63,12 @@ protected override RColor GetColorInt(string colorName) return Utils.Convert(color); } - protected override IPen CreatePen(RColor color) + protected override RPen CreatePen(RColor color) { return new PenAdapter(new Pen(Utils.Convert(color))); } - protected override IBrush CreateSolidBrush(RColor color) + protected override RBrush CreateSolidBrush(RColor color) { Brush solidBrush; if (color == RColor.White) @@ -83,23 +83,23 @@ protected override IBrush CreateSolidBrush(RColor color) return new BrushAdapter(solidBrush, false); } - protected override IImage ConvertImageInt(object image) + protected override RImage ConvertImageInt(object image) { return image != null ? new ImageAdapter((Image)image) : null; } - protected override IImage ImageFromStreamInt(Stream memoryStream) + protected override RImage ImageFromStreamInt(Stream memoryStream) { return new ImageAdapter(Image.FromStream(memoryStream)); } - protected internal override IFont CreateFontInt(string family, double size, RFontStyle style) + protected internal override RFont CreateFontInt(string family, double size, RFontStyle style) { var fontStyle = (FontStyle)((int)style); return new FontAdapter(new Font(family, (float)size, fontStyle)); } - protected internal override IFont CreateFontInt(IFontFamily family, double size, RFontStyle style) + protected internal override RFont CreateFontInt(RFontFamily family, double size, RFontStyle style) { var fontStyle = (FontStyle)((int)style); return new FontAdapter(new Font(((FontFamilyAdapter)family).FontFamily, (float)size, fontStyle)); @@ -115,17 +115,17 @@ protected override void SetToClipboardInt(string html, string plainText) ClipboardHelper.CopyToClipboard(html, plainText); } - protected override void SetToClipboardInt(IImage image) + protected override void SetToClipboardInt(RImage image) { Clipboard.SetImage(((ImageAdapter)image).Image); } - protected override IContextMenu CreateContextMenuInt() + protected override RContextMenu CreateContextMenuInt() { return new ContextMenuAdapter(); } - protected override void SaveToFileInt(IImage image, string name, string extension, IControl control = null) + protected override void SaveToFileInt(RImage image, string name, string extension, RControl control = null) { using (var saveDialog = new SaveFileDialog()) { diff --git a/Source/HtmlRenderer/Core/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs index 4ad8b99ec..2bece5fb6 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -409,7 +409,7 @@ public static CssBox CreateBlock(CssBox parent, HtmlTag tag = null, CssBox befor /// Performs layout of the DOM structure creating lines by set bounds restrictions. /// /// Device context to use - public void PerformLayout(GraphicsBase g) + public void PerformLayout(RGraphics g) { try { @@ -425,7 +425,7 @@ public void PerformLayout(GraphicsBase g) /// Paints the fragment ///
    /// Device context to use - public void Paint(GraphicsBase g) + public void Paint(RGraphics g) { try { @@ -561,7 +561,7 @@ public virtual void Dispose() /// Performs layout of the DOM structure creating lines by set bounds restrictions.
    ///
    /// Device context to use - protected virtual void PerformLayoutImp(GraphicsBase g) + protected virtual void PerformLayoutImp(RGraphics g) { if (Display != CssConstants.None) { @@ -644,7 +644,7 @@ protected virtual void PerformLayoutImp(GraphicsBase g) /// Assigns words its width and height ///
    /// - internal virtual void MeasureWordsSize(GraphicsBase g) + internal virtual void MeasureWordsSize(RGraphics g) { if (!_wordsSizeMeasured) { @@ -719,7 +719,7 @@ private int GetIndexForList() /// Creates the ///
    /// - private void CreateListItemBox(GraphicsBase g) + private void CreateListItemBox(RGraphics g) { if (Display == CssConstants.ListItem && ListStyleType != CssConstants.None) { @@ -1126,7 +1126,7 @@ internal void OffsetTop(double amount) /// Paints the fragment ///
    /// the device to draw to - protected virtual void PaintImp(GraphicsBase g) + protected virtual void PaintImp(RGraphics g) { if (Display != CssConstants.None && (Display != CssConstants.TableCell || EmptyCells != CssConstants.Hide || !IsSpaceOrEmpty)) { @@ -1183,11 +1183,11 @@ protected virtual void PaintImp(GraphicsBase g) /// the bounding rectangle to draw in /// is it the first rectangle of the element /// is it the last rectangle of the element - protected void PaintBackground(GraphicsBase g, RRect rect, bool isFirst, bool isLast) + protected void PaintBackground(RGraphics g, RRect rect, bool isFirst, bool isLast) { if (rect.Width > 0 && rect.Height > 0) { - IBrush brush = null; + RBrush brush = null; if (BackgroundGradient != CssConstants.None) { @@ -1204,7 +1204,7 @@ protected void PaintBackground(GraphicsBase g, RRect rect, bool isFirst, bool is // if (isLast) // rectangle.Width -= ActualWordSpacing + CssUtils.GetWordEndWhitespace(ActualFont); - IGraphicsPath roundrect = null; + RGraphicsPath roundrect = null; if (IsRounded) { roundrect = RenderUtils.GetRoundRect(g, rect, ActualCornerNw, ActualCornerNe, ActualCornerSe, ActualCornerSw); @@ -1244,7 +1244,7 @@ protected void PaintBackground(GraphicsBase g, RRect rect, bool isFirst, bool is ///
    /// the device to draw into /// the current scroll offset to offset the words - private void PaintWords(GraphicsBase g, RPoint offset) + private void PaintWords(RGraphics g, RPoint offset) { if (Width.Length > 0) { @@ -1293,7 +1293,7 @@ private void PaintWords(GraphicsBase g, RPoint offset) /// /// /// - protected void PaintDecoration(GraphicsBase g, RRect rectangle, bool isFirst, bool isLast) + protected void PaintDecoration(RGraphics g, RRect rectangle, bool isFirst, bool isLast) { if (string.IsNullOrEmpty(TextDecoration) || TextDecoration == CssConstants.None) return; @@ -1356,7 +1356,7 @@ internal void RectanglesReset() /// the image loaded or null if failed /// the source rectangle to draw in the image (empty - draw everything) /// is the callback was called async to load image call - private void OnImageLoadComplete(IImage image, RRect rectangle, bool async) + private void OnImageLoadComplete(RImage image, RRect rectangle, bool async) { if (image != null && async) HtmlContainer.RequestRefresh(false); @@ -1375,7 +1375,7 @@ protected RColor GetSelectionForeBrush() ///
    /// /// used for images so they will have alpha effect - protected IBrush GetSelectionBackBrush(GraphicsBase g, bool forceAlpha) + protected RBrush GetSelectionBackBrush(RGraphics g, bool forceAlpha) { var backColor = HtmlContainer.SelectionBackColor; if (backColor != RColor.Empty) @@ -1391,7 +1391,7 @@ protected IBrush GetSelectionBackBrush(GraphicsBase g, bool forceAlpha) } } - protected override IFont GetCachedFont(string fontFamily, double fsize, RFontStyle st) + protected override RFont GetCachedFont(string fontFamily, double fsize, RFontStyle st) { return HtmlContainer.Adapter.GetFont(fontFamily, fsize, st); } diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs index c2b6b059e..5dd38f5d3 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs @@ -446,7 +446,7 @@ private void HandlePostApiCall(object sender) /// Paints the fragment ///
    /// the device to draw to - protected override void PaintImp(GraphicsBase g) + protected override void PaintImp(RGraphics g) { var rects = CommonUtils.GetFirstValueOrDefault(Rectangles); @@ -480,7 +480,7 @@ protected override void PaintImp(GraphicsBase g) /// /// Draw video image over the iframe if found. /// - private void DrawImage(GraphicsBase g, RPoint offset, RRect rect) + private void DrawImage(RGraphics g, RPoint offset, RRect rect) { if (_imageWord.Image != null) { @@ -507,7 +507,7 @@ private void DrawImage(GraphicsBase g, RPoint offset, RRect rect) /// /// Draw video title on top of the iframe if found. /// - private void DrawTitle(GraphicsBase g, RRect rect) + private void DrawTitle(RGraphics g, RRect rect) { if (_videoTitle != null && _imageWord.Width > 40 && _imageWord.Height > 40) { @@ -522,7 +522,7 @@ private void DrawTitle(GraphicsBase g, RRect rect) /// /// Draw play over the iframe if we found link url. /// - private void DrawPlay(GraphicsBase g, RRect rect) + private void DrawPlay(RGraphics g, RRect rect) { if (_isVideo && _imageWord.Width > 70 && _imageWord.Height > 50) { @@ -549,7 +549,7 @@ private void DrawPlay(GraphicsBase g, RRect rect) /// Assigns words its width and height ///
    /// the device to use - internal override void MeasureWordsSize(GraphicsBase g) + internal override void MeasureWordsSize(RGraphics g) { if (!_wordsSizeMeasured) { @@ -574,7 +574,7 @@ private void SetErrorBorder() /// the image loaded or null if failed /// the source rectangle to draw in the image (empty - draw everything) /// is the callback was called async to load image call - private void OnLoadImageComplete(IImage image, RRect rectangle, bool async) + private void OnLoadImageComplete(RImage image, RRect rectangle, bool async) { _imageWord.Image = image; _imageWord.ImageRectangle = rectangle; diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs index 5d7e847cf..0a6529704 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs @@ -40,7 +40,7 @@ public CssBoxHr(CssBox parent, HtmlTag tag) /// Performs layout of the DOM structure creating lines by set bounds restrictions. /// /// Device context to use - protected override void PerformLayoutImp(GraphicsBase g) + protected override void PerformLayoutImp(RGraphics g) { if (Display == CssConstants.None) return; @@ -94,7 +94,7 @@ protected override void PerformLayoutImp(GraphicsBase g) /// Paints the fragment /// /// the device to draw to - protected override void PaintImp(GraphicsBase g) + protected override void PaintImp(RGraphics g) { var offset = HtmlContainer != null ? HtmlContainer.ScrollOffset : RPoint.Empty; var rect = new RRect(Bounds.X + offset.X, Bounds.Y + offset.Y, Bounds.Width, Bounds.Height); diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs index 0f115950e..dd5bfc00f 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs @@ -59,7 +59,7 @@ public CssBoxImage(CssBox parent, HtmlTag tag) /// /// Get the image of this image box. /// - public IImage Image + public RImage Image { get { return _imageWord.Image; } } @@ -68,7 +68,7 @@ public IImage Image /// Paints the fragment /// /// the device to draw to - protected override void PaintImp(GraphicsBase g) + protected override void PaintImp(RGraphics g) { // load image iff it is in visible rectangle if (_imageLoadHandler == null) @@ -128,7 +128,7 @@ protected override void PaintImp(GraphicsBase g) /// Assigns words its width and height /// /// the device to use - internal override void MeasureWordsSize(GraphicsBase g) + internal override void MeasureWordsSize(RGraphics g) { if (!_wordsSizeMeasured) { @@ -173,7 +173,7 @@ private void SetErrorBorder() /// the image loaded or null if failed /// the source rectangle to draw in the image (empty - draw everything) /// is the callback was called async to load image call - private void OnLoadImageComplete(IImage image, RRect rectangle, bool async) + private void OnLoadImageComplete(RImage image, RRect rectangle, bool async) { _imageWord.Image = image; _imageWord.ImageRectangle = rectangle; diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs index 719616774..8fa51a0ae 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs @@ -150,7 +150,7 @@ internal abstract class CssBoxProperties private RColor _actualBorderBottomColor = RColor.Empty; private RColor _actualBorderRightColor = RColor.Empty; private RColor _actualBackgroundColor = RColor.Empty; - private IFont _actualFont; + private RFont _actualFont; #endregion @@ -1203,7 +1203,7 @@ public double ActualBackgroundGradientAngle /// /// Gets the actual font of the parent /// - public IFont ActualParentFont + public RFont ActualParentFont { get { return GetParent() == null ? ActualFont : GetParent().ActualFont; } } @@ -1211,7 +1211,7 @@ public IFont ActualParentFont /// /// Gets the font that should be actually used to paint the text of the box /// - public IFont ActualFont + public RFont ActualFont { get { @@ -1289,7 +1289,7 @@ public IFont ActualFont } } - protected abstract IFont GetCachedFont(string fontFamily, double fsize, RFontStyle st); + protected abstract RFont GetCachedFont(string fontFamily, double fsize, RFontStyle st); /// /// Gets the line height @@ -1425,7 +1425,7 @@ protected void SetAllBorders(string style = null, string width = null, string co /// /// Measures the width of whitespace between words (set ). /// - protected void MeasureWordSpacing(GraphicsBase g) + protected void MeasureWordSpacing(RGraphics g) { if (double.IsNaN(ActualWordSpacing)) { diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs index c80fd7f0e..477434b0a 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs @@ -118,7 +118,7 @@ public static void MeasureImageSize(CssRectImage imageWord) /// /// /// - public static void CreateLineBoxes(GraphicsBase g, CssBox blockBox) + public static void CreateLineBoxes(RGraphics g, CssBox blockBox) { ArgChecker.AssertArgNotNull(g, "g"); ArgChecker.AssertArgNotNull(blockBox, "blockBox"); @@ -172,7 +172,7 @@ public static void CreateLineBoxes(GraphicsBase g, CssBox blockBox) /// /// /// - public static void ApplyCellVerticalAlignment(GraphicsBase g, CssBox cell) + public static void ApplyCellVerticalAlignment(RGraphics g, CssBox cell) { ArgChecker.AssertArgNotNull(g, "g"); ArgChecker.AssertArgNotNull(cell, "cell"); @@ -239,7 +239,7 @@ public static void ApplyCellVerticalAlignment(GraphicsBase g, CssBox cell) /// Current y coordinate that will be the top of the next word /// Maximum right reached so far /// Maximum bottom reached so far - private static void FlowBox(GraphicsBase g, CssBox blockbox, CssBox box, double limitRight, double linespacing, double startx, ref CssLineBox line, ref double curx, ref double cury, ref double maxRight, ref double maxbottom) + private static void FlowBox(RGraphics g, CssBox blockbox, CssBox box, double limitRight, double linespacing, double startx, ref CssLineBox line, ref double curx, ref double cury, ref double maxRight, ref double maxbottom) { var startX = curx; var startY = cury; @@ -420,7 +420,7 @@ private static void BubbleRectangles(CssBox box, CssLineBox line) /// /// /// - private static void ApplyAlignment(GraphicsBase g, CssLineBox lineBox) + private static void ApplyAlignment(RGraphics g, CssLineBox lineBox) { switch (lineBox.OwnerBox.TextAlign) { @@ -522,7 +522,7 @@ private static void ApplyRightToLeftOnSingleBox(CssLineBox lineBox, CssBox box) /// /// /// - private static void ApplyVerticalAlignment(GraphicsBase g, CssLineBox lineBox) + private static void ApplyVerticalAlignment(RGraphics g, CssLineBox lineBox) { double baseline = Single.MinValue; foreach (var box in lineBox.Rectangles.Keys) @@ -570,7 +570,7 @@ private static void ApplyVerticalAlignment(GraphicsBase g, CssLineBox lineBox) /// /// /// - private static void ApplyJustifyAlignment(GraphicsBase g, CssLineBox lineBox) + private static void ApplyJustifyAlignment(RGraphics g, CssLineBox lineBox) { if (lineBox.Equals(lineBox.OwnerBox.LineBoxes[lineBox.OwnerBox.LineBoxes.Count - 1])) return; @@ -609,7 +609,7 @@ private static void ApplyJustifyAlignment(GraphicsBase g, CssLineBox lineBox) /// /// /// - private static void ApplyCenterAlignment(GraphicsBase g, CssLineBox line) + private static void ApplyCenterAlignment(RGraphics g, CssLineBox line) { if (line.Words.Count == 0) return; @@ -639,7 +639,7 @@ private static void ApplyCenterAlignment(GraphicsBase g, CssLineBox line) /// /// /// - private static void ApplyRightAlignment(GraphicsBase g, CssLineBox line) + private static void ApplyRightAlignment(RGraphics g, CssLineBox line) { if (line.Words.Count == 0) return; @@ -669,7 +669,7 @@ private static void ApplyRightAlignment(GraphicsBase g, CssLineBox line) /// /// /// - private static void ApplyLeftAlignment(GraphicsBase g, CssLineBox line) + private static void ApplyLeftAlignment(RGraphics g, CssLineBox line) { //No alignment needed. diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs index d366e98bd..65895aa66 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs @@ -121,7 +121,7 @@ public static double GetTableSpacing(CssBox tableBox) /// /// /// - public static void PerformLayout(GraphicsBase g, CssBox tableBox) + public static void PerformLayout(RGraphics g, CssBox tableBox) { ArgChecker.AssertArgNotNull(g, "g"); ArgChecker.AssertArgNotNull(tableBox, "tableBox"); @@ -144,7 +144,7 @@ public static void PerformLayout(GraphicsBase g, CssBox tableBox) /// Analyzes the Table and assigns values to this CssTable object. /// To be called from the constructor /// - private void Layout(GraphicsBase g) + private void Layout(RGraphics g) { MeasureWords(_tableBox, g); @@ -604,7 +604,7 @@ private void EnforceMinimumSize() /// Layout the cells by the calculated table layout /// /// - private void LayoutCells(GraphicsBase g) + private void LayoutCells(RGraphics g) { double startx = Math.Max(_tableBox.ClientLeft + GetHorizontalSpacing(), 0); double starty = Math.Max(_tableBox.ClientTop + GetVerticalSpacing(), 0); @@ -773,7 +773,7 @@ private static int GetRowSpan(CssBox b) /// /// the box to measure /// Device to use - private static void MeasureWords(CssBox box, GraphicsBase g) + private static void MeasureWords(CssBox box, RGraphics g) { if (box != null) { diff --git a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs index 9157a0dab..0d14ac742 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs @@ -208,7 +208,7 @@ internal void AssignRectanglesToBoxes() /// Device info /// box to check words /// baseline - internal void SetBaseLine(GraphicsBase g, CssBox b, double baseline) + internal void SetBaseLine(RGraphics g, CssBox b, double baseline) { //TODO: Aqui me quede, checar poniendo "by the" con un font-size de 3em List ws = WordsOf(b); diff --git a/Source/HtmlRenderer/Core/Dom/CssRect.cs b/Source/HtmlRenderer/Core/Dom/CssRect.cs index 86a3d3649..a4a4eeb75 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRect.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRect.cs @@ -171,7 +171,7 @@ public virtual bool HasSpaceAfter /// /// Gets the image this words represents (if one exists) /// - public virtual IImage Image + public virtual RImage Image { get { return null; } // ReSharper disable ValueParameterNotUsed diff --git a/Source/HtmlRenderer/Core/Dom/CssRectImage.cs b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs index bcc6c9707..b055b1143 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRectImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs @@ -25,7 +25,7 @@ internal sealed class CssRectImage : CssRect /// /// the image object if it is image word (can be null if not loaded) /// - private IImage _image; + private RImage _image; /// /// the image rectangle restriction as returned from image load event @@ -46,7 +46,7 @@ public CssRectImage(CssBox owner) /// /// Gets the image this words represents (if one exists) /// - public override IImage Image + public override RImage Image { get { return _image; } set { _image = value; } diff --git a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs index a8270df16..ba97ecd9f 100644 --- a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs @@ -30,7 +30,7 @@ internal static class BackgroundImageDrawHandler /// the box to draw its background image /// the handler that loads image to draw /// the rectangle to draw image in - public static void DrawBackgroundImage(GraphicsBase g, CssBox box, ImageLoadHandler imageLoadHandler, RRect rectangle) + public static void DrawBackgroundImage(RGraphics g, CssBox box, ImageLoadHandler imageLoadHandler, RRect rectangle) { // image size depends if specific rectangle given in image loader var imgSize = new RSize(imageLoadHandler.Rectangle == RRect.Empty ? imageLoadHandler.Image.Width : imageLoadHandler.Rectangle.Width, @@ -118,7 +118,7 @@ private static RPoint GetLocation(string backgroundPosition, RRect rectangle, RS /// Draw the background image at the required location repeating it over the X axis.
    /// Adjust location to left if starting location doesn't include all the range (adjusted to center or right). ///
    - private static void DrawRepeatX(GraphicsBase g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) + private static void DrawRepeatX(RGraphics g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) { while (destRect.X > rectangle.X) destRect.X -= imgSize.Width; @@ -133,7 +133,7 @@ private static void DrawRepeatX(GraphicsBase g, ImageLoadHandler imageLoadHandle /// Draw the background image at the required location repeating it over the Y axis.
    /// Adjust location to top if starting location doesn't include all the range (adjusted to center or bottom). /// - private static void DrawRepeatY(GraphicsBase g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) + private static void DrawRepeatY(RGraphics g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) { while (destRect.Y > rectangle.Y) destRect.Y -= imgSize.Height; @@ -148,7 +148,7 @@ private static void DrawRepeatY(GraphicsBase g, ImageLoadHandler imageLoadHandle /// Draw the background image at the required location repeating it over the X and Y axis.
    /// Adjust location to left-top if starting location doesn't include all the range (adjusted to center or bottom/right). /// - private static void DrawRepeat(GraphicsBase g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) + private static void DrawRepeat(RGraphics g, ImageLoadHandler imageLoadHandler, RRect rectangle, RRect srcRect, RRect destRect, RSize imgSize) { while (destRect.X > rectangle.X) destRect.X -= imgSize.Width; diff --git a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs index 38ce0c202..ea1e41829 100644 --- a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs @@ -41,7 +41,7 @@ internal static class BordersDrawHandler /// the bounding rectangle to draw in /// is it the first rectangle of the element /// is it the last rectangle of the element - public static void DrawBoxBorders(GraphicsBase g, CssBox box, RRect rect, bool isFirst, bool isLast) + public static void DrawBoxBorders(RGraphics g, CssBox box, RRect rect, bool isFirst, bool isLast) { if (rect.Width > 0 && rect.Height > 0) { @@ -73,7 +73,7 @@ public static void DrawBoxBorders(GraphicsBase g, CssBox box, RRect rect, bool i /// the brush to use /// the bounding rectangle to draw in /// Beveled border path, null if there is no rounded corners - public static void DrawBorder(Border border, GraphicsBase g, CssBox box, IBrush brush, RRect rectangle) + public static void DrawBorder(Border border, RGraphics g, CssBox box, RBrush brush, RRect rectangle) { SetInOutsetRectanglePoints(border, box, rectangle, true, true); g.DrawPolygon(brush, _borderPts); @@ -91,7 +91,7 @@ public static void DrawBorder(Border border, GraphicsBase g, CssBox box, IBrush /// the rectangle the border is enclosing /// Specifies if the border is for a starting line (no bevel on left) /// Specifies if the border is for an ending line (no bevel on right) - private static void DrawBorder(Border border, CssBox box, GraphicsBase g, RRect rect, bool isLineStart, bool isLineEnd) + private static void DrawBorder(Border border, CssBox box, RGraphics g, RRect rect, bool isLineStart, bool isLineEnd) { var style = GetStyle(border, box); var color = GetColor(border, box, style); @@ -200,9 +200,9 @@ private static void SetInOutsetRectanglePoints(Border border, CssBox b, RRect r, /// Box which the border corresponds /// the rectangle the border is enclosing /// Beveled border path, null if there is no rounded corners - private static IGraphicsPath GetRoundedBorderPath(GraphicsBase g, Border border, CssBox b, RRect r) + private static RGraphicsPath GetRoundedBorderPath(RGraphics g, Border border, CssBox b, RRect r) { - IGraphicsPath path = null; + RGraphicsPath path = null; switch (border) { @@ -278,7 +278,7 @@ private static IGraphicsPath GetRoundedBorderPath(GraphicsBase g, Border border, /// /// Get pen to be used for border draw respecting its style. /// - private static IPen GetPen(GraphicsBase g, string style, RColor color, double width) + private static RPen GetPen(RGraphics g, string style, RColor color, double width) { var p = g.GetPen(color); p.Width = width; diff --git a/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs index 3f6bb3dbc..0e40f3ba5 100644 --- a/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs @@ -85,12 +85,12 @@ internal sealed class ContextMenuHandler : IDisposable /// /// the last context menu shown /// - private IContextMenu _contextMenu; + private RContextMenu _contextMenu; /// /// the control that the context menu was shown on /// - private IControl _parentControl; + private RControl _parentControl; /// /// the css rectangle that context menu shown on @@ -276,7 +276,7 @@ public ContextMenuHandler(SelectionHandler selectionHandler, HtmlContainerInt ht /// the parent control to show the context menu on /// the rectangle that was clicked to show context menu /// the link that was clicked to show context menu on - public void ShowContextMenu(IControl parent, CssRect rect, CssBox link) + public void ShowContextMenu(RControl parent, CssRect rect, CssBox link) { try { diff --git a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs index c6a43626d..945e6da2d 100644 --- a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/FontHandler.cs @@ -38,12 +38,12 @@ internal sealed class FontHandler /// /// collection of all installed and added font families to check if font exists /// - private readonly Dictionary _existingFontFamilies = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + private readonly Dictionary _existingFontFamilies = new Dictionary(StringComparer.InvariantCultureIgnoreCase); /// /// cache of all the font used not to create same font again and again /// - private readonly Dictionary>> _fontsCache = new Dictionary>>(StringComparer.InvariantCultureIgnoreCase); + private readonly Dictionary>> _fontsCache = new Dictionary>>(StringComparer.InvariantCultureIgnoreCase); #endregion @@ -81,7 +81,7 @@ public bool IsFontExists(string family) /// Adds a font family to be used. /// /// The font family to add. - public void AddFontFamily(IFontFamily fontFamily) + public void AddFontFamily(RFontFamily fontFamily) { ArgChecker.AssertArgNotNull(fontFamily, "family"); @@ -108,7 +108,7 @@ public void AddFontFamilyMapping(string fromFamily, string toFamily) /// Improve performance not to create same font multiple times. /// /// cached font instance - public IFont GetCachedFont(string family, double size, RFontStyle style) + public RFont GetCachedFont(string family, double size, RFontStyle style) { var font = TryGetFont(family, size, style); if (font == null) @@ -143,9 +143,9 @@ public IFont GetCachedFont(string family, double size, RFontStyle style) /// /// Get cached font if it exists in cache or null if it is not. /// - private IFont TryGetFont(string family, double size, RFontStyle style) + private RFont TryGetFont(string family, double size, RFontStyle style) { - IFont font = null; + RFont font = null; if (_fontsCache.ContainsKey(family)) { var a = _fontsCache[family]; @@ -159,13 +159,13 @@ private IFont TryGetFont(string family, double size, RFontStyle style) } else { - _fontsCache[family][size] = new Dictionary(); + _fontsCache[family][size] = new Dictionary(); } } else { - _fontsCache[family] = new Dictionary>(); - _fontsCache[family][size] = new Dictionary(); + _fontsCache[family] = new Dictionary>(); + _fontsCache[family][size] = new Dictionary(); } return font; } @@ -173,9 +173,9 @@ private IFont TryGetFont(string family, double size, RFontStyle style) /// // create font (try using existing font family to support custom fonts) /// - private IFont CreateFont(string family, double size, RFontStyle style) + private RFont CreateFont(string family, double size, RFontStyle style) { - IFontFamily fontFamily; + RFontFamily fontFamily; return _existingFontFamilies.TryGetValue(family, out fontFamily) ? _adapter.CreateFontInt(fontFamily, size, style) : _adapter.CreateFontInt(family, size, style); diff --git a/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs index 95ca79516..c2a1c5246 100644 --- a/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs @@ -53,7 +53,7 @@ internal sealed class ImageLoadHandler : IDisposable /// /// callback raised when image load process is complete with image or without /// - private readonly ActionInt _loadCompleteCallback; + private readonly ActionInt _loadCompleteCallback; /// /// the web client used to download image from URL (to cancel on dispose) @@ -68,7 +68,7 @@ internal sealed class ImageLoadHandler : IDisposable /// /// the image instance of the loaded image /// - private IImage _image; + private RImage _image; /// /// the image rectangle restriction as returned from image load event @@ -98,7 +98,7 @@ internal sealed class ImageLoadHandler : IDisposable /// /// the container of the html to handle load image for /// callback raised when image load process is complete with image or without - public ImageLoadHandler(HtmlContainerInt htmlContainer, ActionInt loadCompleteCallback) + public ImageLoadHandler(HtmlContainerInt htmlContainer, ActionInt loadCompleteCallback) { ArgChecker.AssertArgNotNull(htmlContainer, "htmlContainer"); ArgChecker.AssertArgNotNull(loadCompleteCallback, "loadCompleteCallback"); @@ -110,7 +110,7 @@ public ImageLoadHandler(HtmlContainerInt htmlContainer, ActionInt /// the image instance of the loaded image /// - public IImage Image + public RImage Image { get { return _image; } } @@ -229,7 +229,7 @@ private void SetFromInlineData(string src) /// /// the source that has the base64 encoded image /// image from base64 data string or null if failed - private IImage GetImageFromData(string src) + private RImage GetImageFromData(string src) { var s = src.Substring(src.IndexOf(':') + 1).Split(new[] { ',' }, 2); if (s.Length == 2) diff --git a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs index 5e532ce66..1b484cd9c 100644 --- a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs @@ -131,7 +131,7 @@ public SelectionHandler(CssBox root) /// Select all the words in the html. /// /// the control hosting the html to invalidate - public void SelectAll(IControl control) + public void SelectAll(RControl control) { if (_root.HtmlContainer.IsSelectionEnabled) { @@ -146,7 +146,7 @@ public void SelectAll(IControl control) /// /// the control hosting the html to invalidate /// the location to select word at - public void SelectWord(IControl control, RPoint loc) + public void SelectWord(RControl control, RPoint loc) { if (_root.HtmlContainer.IsSelectionEnabled) { @@ -167,7 +167,7 @@ public void SelectWord(IControl control, RPoint loc) /// the control hosting the html to invalidate /// the location of the mouse on the html /// - public void HandleMouseDown(IControl parent, RPoint loc, bool isMouseInContainer) + public void HandleMouseDown(RControl parent, RPoint loc, bool isMouseInContainer) { bool clear = !isMouseInContainer; if (isMouseInContainer) @@ -214,7 +214,7 @@ public void HandleMouseDown(IControl parent, RPoint loc, bool isMouseInContainer /// the control hosting the html to invalidate /// is the left mouse button has been released /// is the mouse up should be ignored - public bool HandleMouseUp(IControl parent, bool leftMouseButton) + public bool HandleMouseUp(RControl parent, bool leftMouseButton) { bool ignore = false; _mouseDownInControl = false; @@ -239,7 +239,7 @@ public bool HandleMouseUp(IControl parent, bool leftMouseButton) /// /// the control hosting the html to set cursor and invalidate /// the location of the mouse on the html - public void HandleMouseMove(IControl parent, RPoint loc) + public void HandleMouseMove(RControl parent, RPoint loc) { if (_root.HtmlContainer.IsSelectionEnabled && _mouseDownInControl && parent.LeftMouseButton) { @@ -284,7 +284,7 @@ public void HandleMouseMove(IControl parent, RPoint loc) /// On mouse leave change the cursor back to default. /// /// the control hosting the html to set cursor and invalidate - public void HandleMouseLeave(IControl parent) + public void HandleMouseLeave(RControl parent) { if (_cursorChanged) { @@ -396,7 +396,7 @@ public void Dispose() /// the control hosting the html to invalidate /// the mouse location /// true - partial word selection allowed, false - only full words selection - private void HandleSelection(IControl control, RPoint loc, bool allowPartialSelect) + private void HandleSelection(RControl control, RPoint loc, bool allowPartialSelect) { // get the line under the mouse or nearest from the top var lineBox = DomUtils.GetCssLineBox(_root, loc); @@ -500,7 +500,7 @@ private static void ClearSelection(CssBox box) /// Start drag & drop operation on the currently selected html segment. /// /// the control to start the drag & drop on - private void StartDragDrop(IControl control) + private void StartDragDrop(RControl control) { if (_dragDropData == null) { @@ -600,13 +600,13 @@ private bool SelectWordsInRange(CssBox box, CssRect selectionStart, CssRect sele /// /// Calculate the character index and offset by characters for the given word and given offset.
    - /// . + /// . ///
    /// used to create graphics to measure string /// the word to calculate its index and offset /// the location to calculate for /// to set the starting or ending char and offset data - private void CalculateWordCharIndexAndOffset(IControl control, CssRect word, RPoint loc, bool selectionStart) + private void CalculateWordCharIndexAndOffset(RControl control, CssRect word, RPoint loc, bool selectionStart) { int selectionIndex; double selectionOffset; @@ -637,7 +637,7 @@ private void CalculateWordCharIndexAndOffset(IControl control, CssRect word, RPo /// is to include the first character in the calculation /// return the index of the char under the location /// return the offset of the char under the location - private static void CalculateWordCharIndexAndOffset(IControl control, CssRect word, RPoint loc, bool inclusive, out int selectionIndex, out double selectionOffset) + private static void CalculateWordCharIndexAndOffset(RControl control, CssRect word, RPoint loc, bool inclusive, out int selectionIndex, out double selectionOffset) { selectionIndex = 0; selectionOffset = 0f; diff --git a/Source/HtmlRenderer/Core/HtmlContainerInt.cs b/Source/HtmlRenderer/Core/HtmlContainerInt.cs index 38182f873..8b368b5ba 100644 --- a/Source/HtmlRenderer/Core/HtmlContainerInt.cs +++ b/Source/HtmlRenderer/Core/HtmlContainerInt.cs @@ -483,7 +483,7 @@ public string GetLinkAt(RPoint location) /// Measures the bounds of box and children, recursively. /// /// Device context to draw - public void PerformLayout(GraphicsBase g) + public void PerformLayout(RGraphics g) { ArgChecker.AssertArgNotNull(g, "g"); @@ -510,7 +510,7 @@ public void PerformLayout(GraphicsBase g) /// Render the html using the given device. /// /// the device to use to render - public void PerformPaint(GraphicsBase g) + public void PerformPaint(RGraphics g) { ArgChecker.AssertArgNotNull(g, "g"); @@ -537,7 +537,7 @@ public void PerformPaint(GraphicsBase g) /// /// the control hosting the html to invalidate /// the location of the mouse - public void HandleMouseDown(IControl parent, RPoint location) + public void HandleMouseDown(RControl parent, RPoint location) { ArgChecker.AssertArgNotNull(parent, "parent"); @@ -558,7 +558,7 @@ public void HandleMouseDown(IControl parent, RPoint location) /// the control hosting the html to invalidate /// the location of the mouse /// the mouse event data - public void HandleMouseUp(IControl parent, RPoint location, RMouseEvent e) + public void HandleMouseUp(RControl parent, RPoint location, RMouseEvent e) { ArgChecker.AssertArgNotNull(parent, "parent"); @@ -593,7 +593,7 @@ public void HandleMouseUp(IControl parent, RPoint location, RMouseEvent e) /// /// the control hosting the html to set cursor and invalidate /// the location of the mouse - public void HandleMouseDoubleClick(IControl parent, RPoint location) + public void HandleMouseDoubleClick(RControl parent, RPoint location) { ArgChecker.AssertArgNotNull(parent, "parent"); @@ -613,7 +613,7 @@ public void HandleMouseDoubleClick(IControl parent, RPoint location) /// /// the control hosting the html to set cursor and invalidate /// the location of the mouse - public void HandleMouseMove(IControl parent, RPoint location) + public void HandleMouseMove(RControl parent, RPoint location) { ArgChecker.AssertArgNotNull(parent, "parent"); @@ -654,7 +654,7 @@ public void HandleMouseMove(IControl parent, RPoint location) /// Handle mouse leave to handle hover cursor. /// /// the control hosting the html to set cursor and invalidate - public void HandleMouseLeave(IControl parent) + public void HandleMouseLeave(RControl parent) { ArgChecker.AssertArgNotNull(parent, "parent"); @@ -674,7 +674,7 @@ public void HandleMouseLeave(IControl parent) /// /// the control hosting the html to invalidate /// the pressed key - public void HandleKeyDown(IControl parent, RKeyEvent e) + public void HandleKeyDown(RControl parent, RKeyEvent e) { ArgChecker.AssertArgNotNull(parent, "parent"); ArgChecker.AssertArgNotNull(e, "e"); @@ -784,7 +784,7 @@ internal void ReportError(HtmlRenderErrorType type, string message, Exception ex /// the control hosting the html to invalidate /// the location of the mouse /// the link that was clicked - internal void HandleLinkClicked(IControl parent, RPoint location, CssBox link) + internal void HandleLinkClicked(RControl parent, RPoint location, CssBox link) { if (LinkClicked != null) { diff --git a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs index e33d2e660..32fd16a76 100644 --- a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs +++ b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs @@ -29,7 +29,7 @@ public static class HtmlRendererUtils /// the minimal size of the rendered html (zero - not limit the width/height) /// the maximum size of the rendered html, if not zero and html cannot be layout within the limit it will be clipped (zero - not limit the width/height) /// return: the size of the html to be rendered within the min/max limits - public static RSize MeasureHtmlByRestrictions(GraphicsBase g, HtmlContainerInt htmlContainer, RSize minSize, RSize maxSize) + public static RSize MeasureHtmlByRestrictions(RGraphics g, HtmlContainerInt htmlContainer, RSize minSize, RSize maxSize) { // first layout without size restriction to know html actual size htmlContainer.PerformLayout(g); @@ -72,7 +72,7 @@ public static RSize MeasureHtmlByRestrictions(GraphicsBase g, HtmlContainerInt h /// the max size restriction - can be empty for no restriction /// if to modify the size (width and height) by html content layout /// if to modify the height by html content layout - public static RSize Layout(GraphicsBase g, HtmlContainerInt htmlContainer, RSize size, RSize minSize, RSize maxSize, bool autoSize, bool autoSizeHeightOnly) + public static RSize Layout(RGraphics g, HtmlContainerInt htmlContainer, RSize size, RSize minSize, RSize maxSize, bool autoSize, bool autoSizeHeightOnly) { if (autoSize) htmlContainer.MaxSize = new RSize(0, 0); diff --git a/Source/HtmlRenderer/Core/Utils/CssUtils.cs b/Source/HtmlRenderer/Core/Utils/CssUtils.cs index 68c210f94..9f4bf7f07 100644 --- a/Source/HtmlRenderer/Core/Utils/CssUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CssUtils.cs @@ -48,7 +48,7 @@ public static RColor DefaultSelectionBackcolor /// /// /// - public static double WhiteSpace(GraphicsBase g, CssBoxProperties box) + public static double WhiteSpace(RGraphics g, CssBoxProperties box) { double w = box.ActualFont.GetWhitespaceWidth(g); if (!(String.IsNullOrEmpty(box.WordSpacing) || box.WordSpacing == CssConstants.Normal)) diff --git a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs index 95556b61d..4d3093733 100644 --- a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs @@ -40,7 +40,7 @@ public static bool IsColorVisible(RColor color) /// the graphics to clip /// the box that is rendered to get containing blocks /// the previous region if clipped, otherwise null - public static RRect ClipGraphicsByOverflow(GraphicsBase g, CssBox box) + public static RRect ClipGraphicsByOverflow(RGraphics g, CssBox box) { var containingBlock = box.ContainingBlock; while (true) @@ -72,7 +72,7 @@ public static RRect ClipGraphicsByOverflow(GraphicsBase g, CssBox box) /// /// the graphics to clip /// the region to set on the graphics (null - ignore) - public static void ReturnClip(GraphicsBase g, RRect prevClip) + public static void ReturnClip(RGraphics g, RRect prevClip) { if (prevClip != RRect.Empty) { @@ -86,7 +86,7 @@ public static void ReturnClip(GraphicsBase g, RRect prevClip) /// the device to draw into /// /// the rectangle to draw icon in - public static void DrawImageLoadingIcon(GraphicsBase g, HtmlContainerInt htmlContainer, RRect r) + public static void DrawImageLoadingIcon(RGraphics g, HtmlContainerInt htmlContainer, RRect r) { g.DrawRectangle(g.GetPen(RColor.LightGray), r.Left + 3, r.Top + 3, 13, 14); var image = htmlContainer.Adapter.GetLoadImage(); @@ -99,7 +99,7 @@ public static void DrawImageLoadingIcon(GraphicsBase g, HtmlContainerInt htmlCon /// the device to draw into /// /// the rectangle to draw icon in - public static void DrawImageErrorIcon(GraphicsBase g, HtmlContainerInt htmlContainer, RRect r) + public static void DrawImageErrorIcon(RGraphics g, HtmlContainerInt htmlContainer, RRect r) { g.DrawRectangle(g.GetPen(RColor.LightGray), r.Left + 2, r.Top + 2, 15, 15); var image = htmlContainer.Adapter.GetErrorImage(); @@ -116,7 +116,7 @@ public static void DrawImageErrorIcon(GraphicsBase g, HtmlContainerInt htmlConta /// Radius of the south east corner /// Radius of the south west corner /// GraphicsPath with the lines of the rounded rectangle ready to be painted - public static IGraphicsPath GetRoundRect(GraphicsBase g, RRect rect, double nwRadius, double neRadius, double seRadius, double swRadius) + public static RGraphicsPath GetRoundRect(RGraphics g, RRect rect, double nwRadius, double neRadius, double seRadius, double swRadius) { // NW-----NE // | | diff --git a/Source/HtmlRenderer/Entities/RDashStyle.cs b/Source/HtmlRenderer/Entities/RDashStyle.cs index d26f9471c..66740a915 100644 --- a/Source/HtmlRenderer/Entities/RDashStyle.cs +++ b/Source/HtmlRenderer/Entities/RDashStyle.cs @@ -15,7 +15,7 @@ namespace HtmlRenderer.Entities { /// - /// Specifies the style of dashed lines drawn with a object. + /// Specifies the style of dashed lines drawn with a object. /// public enum RDashStyle { diff --git a/Source/HtmlRenderer/HtmlRenderer.csproj b/Source/HtmlRenderer/HtmlRenderer.csproj index 3a7fe20ff..a75e7bc34 100644 --- a/Source/HtmlRenderer/HtmlRenderer.csproj +++ b/Source/HtmlRenderer/HtmlRenderer.csproj @@ -104,15 +104,15 @@ - - - - - - - - - + + + + + + + + + diff --git a/Source/HtmlRenderer/Interfaces/AdapterBase.cs b/Source/HtmlRenderer/Interfaces/AdapterBase.cs index bc492b92e..d452d39f7 100644 --- a/Source/HtmlRenderer/Interfaces/AdapterBase.cs +++ b/Source/HtmlRenderer/Interfaces/AdapterBase.cs @@ -36,12 +36,12 @@ public abstract class AdapterBase /// /// cache of brush color to brush instance /// - private static readonly Dictionary _brushesCache = new Dictionary(); + private static readonly Dictionary _brushesCache = new Dictionary(); /// /// cache of pen color to pen instance /// - private static readonly Dictionary _penCache = new Dictionary(); + private static readonly Dictionary _penCache = new Dictionary(); /// /// cache of all the font used not to create same font again and again @@ -56,12 +56,12 @@ public abstract class AdapterBase /// /// image used to draw loading image icon /// - private IImage _loadImage; + private RImage _loadImage; /// /// image used to draw error image icon /// - private IImage _errorImage; + private RImage _errorImage; #endregion @@ -98,9 +98,9 @@ public RColor GetColor(string colorName) /// /// the color to get pen for /// pen instance - public IPen GetPen(RColor color) + public RPen GetPen(RColor color) { - IPen pen; + RPen pen; if (!_penCache.TryGetValue(color, out pen)) { _penCache[color] = pen = CreatePen(color); @@ -113,9 +113,9 @@ public IPen GetPen(RColor color) /// /// the color to get brush for /// brush instance - public IBrush GetSolidBrush(RColor color) + public RBrush GetSolidBrush(RColor color) { - IBrush brush; + RBrush brush; if (!_brushesCache.TryGetValue(color, out brush)) { _brushesCache[color] = brush = CreateSolidBrush(color); @@ -124,21 +124,21 @@ public IBrush GetSolidBrush(RColor color) } /// - /// Convert image object returned from to . + /// Convert image object returned from to . /// /// the image returned from load event /// converted image or null - public IImage ConvertImage(object image) + public RImage ConvertImage(object image) { return ConvertImageInt(image); } /// - /// Create an object from the given stream. + /// Create an object from the given stream. /// /// the stream to create image from /// new image instance - public IImage ImageFromStream(Stream memoryStream) + public RImage ImageFromStream(Stream memoryStream) { return ImageFromStreamInt(memoryStream); } @@ -157,7 +157,7 @@ public bool IsFontExists(string font) /// Adds a font family to be used. /// /// The font family to add. - public void AddFontFamily(IFontFamily fontFamily) + public void AddFontFamily(RFontFamily fontFamily) { _fontHandler.AddFontFamily(fontFamily); } @@ -181,7 +181,7 @@ public void AddFontFamilyMapping(string fromFamily, string toFamily) /// font size /// font style /// font instance - public IFont GetFont(string family, double size, RFontStyle style) + public RFont GetFont(string family, double size, RFontStyle style) { return _fontHandler.GetCachedFont(family, size, style); } @@ -189,7 +189,7 @@ public IFont GetFont(string family, double size, RFontStyle style) /// /// Get image to be used while HTML image is loading. /// - public IImage GetLoadImage() + public RImage GetLoadImage() { if (_loadImage == null) { @@ -203,7 +203,7 @@ public IImage GetLoadImage() /// /// Get image to be used if HTML image load failed. /// - public IImage GetErrorImage() + public RImage GetErrorImage() { if (_errorImage == null) { @@ -237,7 +237,7 @@ public void SetToClipboard(string html, string plainText) /// Set the given image to clipboard. /// /// - public void SetToClipboard(IImage image) + public void SetToClipboard(RImage image) { SetToClipboardInt(image); } @@ -246,7 +246,7 @@ public void SetToClipboard(IImage image) /// Create a context menu that can be used on the control /// /// new context menu - public IContextMenu GetContextMenu() + public RContextMenu GetContextMenu() { return CreateContextMenuInt(); } @@ -258,7 +258,7 @@ public IContextMenu GetContextMenu() /// the name of the image for save dialog /// the extension of the image for save dialog /// optional: the control to show the dialog on - public void SaveToFile(IImage image, string name, string extension, IControl control = null) + public void SaveToFile(RImage image, string name, string extension, RControl control = null) { SaveToFileInt(image, name, extension, control); } @@ -278,28 +278,28 @@ public void SaveToFile(IImage image, string name, string extension, IControl con /// /// the color to get pen for /// pen instance - protected abstract IPen CreatePen(RColor color); + protected abstract RPen CreatePen(RColor color); /// /// Get cached solid brush instance for the given color. /// /// the color to get brush for /// brush instance - protected abstract IBrush CreateSolidBrush(RColor color); + protected abstract RBrush CreateSolidBrush(RColor color); /// - /// Convert image object returned from to . + /// Convert image object returned from to . /// /// the image returned from load event /// converted image or null - protected abstract IImage ConvertImageInt(object image); + protected abstract RImage ConvertImageInt(object image); /// - /// Create an object from the given stream. + /// Create an object from the given stream. /// /// the stream to create image from /// new image instance - protected abstract IImage ImageFromStreamInt(Stream memoryStream); + protected abstract RImage ImageFromStreamInt(Stream memoryStream); /// /// Get font instance by given font family name, size and style. @@ -308,7 +308,7 @@ public void SaveToFile(IImage image, string name, string extension, IControl con /// font size /// font style /// font instance - protected internal abstract IFont CreateFontInt(string family, double size, RFontStyle style); + protected internal abstract RFont CreateFontInt(string family, double size, RFontStyle style); /// /// Get font instance by given font family instance, size and style.
    @@ -318,7 +318,7 @@ public void SaveToFile(IImage image, string name, string extension, IControl con /// font size /// font style /// font instance - protected internal abstract IFont CreateFontInt(IFontFamily family, double size, RFontStyle style); + protected internal abstract RFont CreateFontInt(RFontFamily family, double size, RFontStyle style); /// /// Set the given text to the clipboard @@ -343,7 +343,7 @@ protected virtual void SetToClipboardInt(string html, string plainText) /// Set the given image to clipboard. /// /// - protected virtual void SetToClipboardInt(IImage image) + protected virtual void SetToClipboardInt(RImage image) { throw new NotImplementedException(); } @@ -352,7 +352,7 @@ protected virtual void SetToClipboardInt(IImage image) /// Create a context menu that can be used on the control ///
    /// new context menu - protected virtual IContextMenu CreateContextMenuInt() + protected virtual RContextMenu CreateContextMenuInt() { throw new NotImplementedException(); } @@ -364,7 +364,7 @@ protected virtual IContextMenu CreateContextMenuInt() /// the name of the image for save dialog /// the extension of the image for save dialog /// optional: the control to show the dialog on - protected virtual void SaveToFileInt(IImage image, string name, string extension, IControl control = null) + protected virtual void SaveToFileInt(RImage image, string name, string extension, RControl control = null) { throw new NotImplementedException(); } diff --git a/Source/HtmlRenderer/Interfaces/IContextMenu.cs b/Source/HtmlRenderer/Interfaces/IContextMenu.cs deleted file mode 100644 index 75bdbc6b9..000000000 --- a/Source/HtmlRenderer/Interfaces/IContextMenu.cs +++ /dev/null @@ -1,54 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -using System; -using HtmlRenderer.Entities; - -namespace HtmlRenderer.Interfaces -{ - /// - /// TODO:a add doc - /// - public interface IContextMenu : IDisposable - { - /// - /// The total number of items in the context menu - /// - int ItemsCount { get; } - - /// - /// Add divider item to the context menu.
    - /// The divider is a non clickable place holder used to separate items. - ///
    - void AddDivider(); - - /// - /// Add item to the context menu with the given text that will raise the given event when clicked. - /// - /// the text to set on the new context menu item - /// if to set the item as enabled or disabled - /// the event to raise when the item is clicked - void AddItem(string text, bool enabled, EventHandler onClick); - - /// - /// Remove the last item from the context menu iff it is a divider - /// - void RemoveLastDivider(); - - /// - /// Show the context menu in the given parent control at the given location. - /// - /// the parent control to show in - /// the location to show at relative to the parent control - void Show(IControl parent, RPoint location); - } -} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IControl.cs b/Source/HtmlRenderer/Interfaces/IControl.cs deleted file mode 100644 index 5d929204c..000000000 --- a/Source/HtmlRenderer/Interfaces/IControl.cs +++ /dev/null @@ -1,78 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -using HtmlRenderer.Entities; - -namespace HtmlRenderer.Interfaces -{ - /// - /// TODO:a add doc - /// - public interface IControl - { - /// - /// Is the left mouse button is currently in pressed state - /// - bool LeftMouseButton { get; } - - /// - /// Is the right mouse button is currently in pressed state - /// - bool RightMouseButton { get; } - - /// - /// Get the current location of the mouse relative to the control - /// - RPoint MouseLocation { get; } - - /// - /// Set the cursor over the control to default cursor - /// - void SetCursorDefault(); - - /// - /// Set the cursor over the control to hand cursor - /// - void SetCursorHand(); - - /// - /// Set the cursor over the control to I beam cursor - /// - void SetCursorIBeam(); - - /// - /// Get data object for the given html and plain text data.
    - /// The data object can be used for clipboard or drag-drop operation. - ///
    - /// the html data - /// the plain text data - /// drag-drop data object - object GetDataObject(string html, string plainText); - - /// - /// Do drag-drop copy operation for the given data object. - /// - /// the drag-drop data object - void DoDragDropCopy(object dragDropData); - - /// - /// Create graphics object that can be used with the control. - /// - /// graphics object - GraphicsBase CreateGraphics(); - - /// - /// Invalidates the entire surface of the control and causes the control to be redrawn. - /// - void Invalidate(); - } -} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IFont.cs b/Source/HtmlRenderer/Interfaces/IFont.cs deleted file mode 100644 index bb7eb118c..000000000 --- a/Source/HtmlRenderer/Interfaces/IFont.cs +++ /dev/null @@ -1,47 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -namespace HtmlRenderer.Interfaces -{ - /// - /// TODO:a add doc - /// - public interface IFont - { - /// - /// Gets the em-size of this Font measured in the units specified by the Unit property. - /// - double Size { get; } - - /// - /// Gets the em-size, in points, of this Font. - /// - double SizeInPoints { get; } - - /// - /// The line spacing, in pixels, of this font. - /// - double Height { get; } - - /// - /// Get the vertical offset of the font underline location from the top of the font. - /// - double UnderlineOffset { get; } - - /// - /// Get the left padding, in pixels, of the font. - /// - double LeftPadding { get; } - - double GetWhitespaceWidth(GraphicsBase graphics); - } -} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs b/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs deleted file mode 100644 index ef969f5ba..000000000 --- a/Source/HtmlRenderer/Interfaces/IGraphicsPath.cs +++ /dev/null @@ -1,38 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -using System; - -namespace HtmlRenderer.Interfaces -{ - /// - /// TODO:a add doc - /// - public interface IGraphicsPath : IDisposable - { - /// - /// Appends an elliptical arc to the current figure. - /// - void AddArc(double x, double y, double width, double height, double startAngle, double sweepAngle); - - /// - /// Appends a line segment to this GraphicsPath. - /// - void AddLine(double x1, double y1, double x2, double y2); - - /// - /// Closes the current figure and starts a new figure. If the current figure contains a sequence of connected - /// lines and curves, the method closes the loop by connecting a line from the endpoint to the starting point. - /// - void CloseFigure(); - } -} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IImage.cs b/Source/HtmlRenderer/Interfaces/IImage.cs deleted file mode 100644 index 6ad195d2c..000000000 --- a/Source/HtmlRenderer/Interfaces/IImage.cs +++ /dev/null @@ -1,39 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -using System; -using System.IO; - -namespace HtmlRenderer.Interfaces -{ - /// - /// TODO:a add doc - /// - public interface IImage : IDisposable - { - /// - /// Get the width, in pixels, of the image. - /// - double Width { get; } - - /// - /// Get the height, in pixels, of the image. - /// - double Height { get; } - - /// - /// Saves this image to the specified stream in PNG format. - /// - /// The Stream where the image will be saved. - void Save(MemoryStream stream); - } -} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IPen.cs b/Source/HtmlRenderer/Interfaces/IPen.cs deleted file mode 100644 index b493bb673..000000000 --- a/Source/HtmlRenderer/Interfaces/IPen.cs +++ /dev/null @@ -1,37 +0,0 @@ -// "Therefore those skilled at the unorthodox -// are infinite as heaven and earth, -// inexhaustible as the great rivers. -// When they come to an end, -// they begin again, -// like the days and months; -// they die and are reborn, -// like the four seasons." -// -// - Sun Tsu, -// "The Art of War" - -using HtmlRenderer.Entities; - -namespace HtmlRenderer.Interfaces -{ - /// - /// TODO:a add doc - /// - public interface IPen - { - /// - /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. - /// - double Width { get; set; } - - /// - /// Gets or sets the style used for dashed lines drawn with this Pen. - /// - RDashStyle DashStyle { set; } - - /// - /// Gets or sets an array of custom dashes and spaces. - /// - double[] DashPattern { set; } - } -} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IBrush.cs b/Source/HtmlRenderer/Interfaces/RBrush.cs similarity index 80% rename from Source/HtmlRenderer/Interfaces/IBrush.cs rename to Source/HtmlRenderer/Interfaces/RBrush.cs index 518edce7a..aeb8cb7bd 100644 --- a/Source/HtmlRenderer/Interfaces/IBrush.cs +++ b/Source/HtmlRenderer/Interfaces/RBrush.cs @@ -17,6 +17,8 @@ namespace HtmlRenderer.Interfaces /// /// TODO:a add doc /// - public interface IBrush : IDisposable - { } + public abstract class RBrush : IDisposable + { + public abstract void Dispose(); + } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/RContextMenu.cs b/Source/HtmlRenderer/Interfaces/RContextMenu.cs new file mode 100644 index 000000000..25559c73f --- /dev/null +++ b/Source/HtmlRenderer/Interfaces/RContextMenu.cs @@ -0,0 +1,51 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System; +using HtmlRenderer.Entities; + +namespace HtmlRenderer.Interfaces +{ + /// + /// TODO:a add doc + /// + public abstract class RContextMenu : IDisposable + { + /// + /// The total number of items in the context menu + /// + public abstract int ItemsCount { get; } + + /// + /// Add divider item to the context menu.
    + /// The divider is a non clickable place holder used to separate items. + ///
    + public abstract void AddDivider(); + + /// + /// Add item to the context menu with the given text that will raise the given event when clicked. + /// the text to set on the new context menu itemif to set the item as enabled or disabledthe event to raise when the item is clicked + public abstract void AddItem(string text, bool enabled, EventHandler onClick); + + /// + /// Remove the last item from the context menu iff it is a divider + /// + public abstract void RemoveLastDivider(); + + /// + /// Show the context menu in the given parent control at the given location. + /// the parent control to show inthe location to show at relative to the parent control + public abstract void Show(RControl parent, RPoint location); + + public abstract void Dispose(); + } +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/RControl.cs b/Source/HtmlRenderer/Interfaces/RControl.cs new file mode 100644 index 000000000..466cfcb32 --- /dev/null +++ b/Source/HtmlRenderer/Interfaces/RControl.cs @@ -0,0 +1,73 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using HtmlRenderer.Entities; + +namespace HtmlRenderer.Interfaces +{ + /// + /// TODO:a add doc + /// + public abstract class RControl + { + /// + /// Is the left mouse button is currently in pressed state + /// + public abstract bool LeftMouseButton { get; } + + /// + /// Is the right mouse button is currently in pressed state + /// + public abstract bool RightMouseButton { get; } + + /// + /// Get the current location of the mouse relative to the control + /// + public abstract RPoint MouseLocation { get; } + + /// + /// Set the cursor over the control to default cursor + /// + public abstract void SetCursorDefault(); + + /// + /// Set the cursor over the control to hand cursor + /// + public abstract void SetCursorHand(); + + /// + /// Set the cursor over the control to I beam cursor + /// + public abstract void SetCursorIBeam(); + + /// + /// Get data object for the given html and plain text data.
    + /// The data object can be used for clipboard or drag-drop operation. + ///
    the html datathe plain text datadrag-drop data object + public abstract object GetDataObject(string html, string plainText); + + /// + /// Do drag-drop copy operation for the given data object. + /// the drag-drop data object + public abstract void DoDragDropCopy(object dragDropData); + + /// + /// Create graphics object that can be used with the control. + /// graphics object + public abstract RGraphics CreateGraphics(); + + /// + /// Invalidates the entire surface of the control and causes the control to be redrawn. + /// + public abstract void Invalidate(); + } +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/RFont.cs b/Source/HtmlRenderer/Interfaces/RFont.cs new file mode 100644 index 000000000..4e4610016 --- /dev/null +++ b/Source/HtmlRenderer/Interfaces/RFont.cs @@ -0,0 +1,47 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +namespace HtmlRenderer.Interfaces +{ + /// + /// TODO:a add doc + /// + public abstract class RFont + { + /// + /// Gets the em-size of this Font measured in the units specified by the Unit property. + /// + public abstract double Size { get; } + + /// + /// Gets the em-size, in points, of this Font. + /// + public abstract double SizeInPoints { get; } + + /// + /// The line spacing, in pixels, of this font. + /// + public abstract double Height { get; } + + /// + /// Get the vertical offset of the font underline location from the top of the font. + /// + public abstract double UnderlineOffset { get; } + + /// + /// Get the left padding, in pixels, of the font. + /// + public abstract double LeftPadding { get; } + + public abstract double GetWhitespaceWidth(RGraphics graphics); + } +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/IFontFamily.cs b/Source/HtmlRenderer/Interfaces/RFontFamily.cs similarity index 76% rename from Source/HtmlRenderer/Interfaces/IFontFamily.cs rename to Source/HtmlRenderer/Interfaces/RFontFamily.cs index caf7445f2..00858f563 100644 --- a/Source/HtmlRenderer/Interfaces/IFontFamily.cs +++ b/Source/HtmlRenderer/Interfaces/RFontFamily.cs @@ -16,11 +16,11 @@ namespace HtmlRenderer.Interfaces /// TODO:a add doc /// Required for custom fonts handling: fonts that are not installed on the system. ///
    - public interface IFontFamily + public abstract class RFontFamily { /// - /// Gets the name of this Font Family. - /// - string Name { get; } + /// Gets the name of this Font Family. + /// + public abstract string Name { get; } } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/GraphicsBase.cs b/Source/HtmlRenderer/Interfaces/RGraphics.cs similarity index 89% rename from Source/HtmlRenderer/Interfaces/GraphicsBase.cs rename to Source/HtmlRenderer/Interfaces/RGraphics.cs index 5451d4b31..3cdec10b6 100644 --- a/Source/HtmlRenderer/Interfaces/GraphicsBase.cs +++ b/Source/HtmlRenderer/Interfaces/RGraphics.cs @@ -21,7 +21,7 @@ namespace HtmlRenderer.Interfaces /// The core HTML Renderer components use this class for rendering logic, extending this /// class in different platform: WinForms, WPF, Silverlight, PdfSharp, etc. /// - public abstract class GraphicsBase : IDisposable + public abstract class RGraphics : IDisposable { #region Fields/Consts @@ -32,10 +32,11 @@ public abstract class GraphicsBase : IDisposable #endregion + /// /// Init. /// - protected GraphicsBase(AdapterBase adapter) + protected RGraphics(AdapterBase adapter) { ArgChecker.AssertArgNotNull(adapter, "global"); @@ -47,7 +48,7 @@ protected GraphicsBase(AdapterBase adapter) /// /// the color to get the pen for /// pen instance - public virtual IPen GetPen(RColor color) + public virtual RPen GetPen(RColor color) { return _adapter.GetPen(color); } @@ -57,7 +58,7 @@ public virtual IPen GetPen(RColor color) /// /// the color to get the brush for /// solid color brush instance - public virtual IBrush GetSolidBrush(RColor color) + public virtual RBrush GetSolidBrush(RColor color) { return _adapter.GetSolidBrush(color); } @@ -70,7 +71,7 @@ public virtual IBrush GetSolidBrush(RColor color) /// the end color of the gradient /// the angle to move the gradient from start color to end color in the rectangle /// linear gradient color brush instance - public abstract IBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle); + public abstract RBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle); /// /// Gets a Rectangle structure that bounds the clipping region of this Graphics. @@ -109,13 +110,13 @@ public virtual IBrush GetSolidBrush(RColor color) /// The Image object with which this TextureBrush object fills interiors. /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. /// The dimension by which to translate the transformation - public abstract IBrush GetTextureBrush(IImage image, RRect dstRect, RPoint translateTransformLocation); + public abstract RBrush GetTextureBrush(RImage image, RRect dstRect, RPoint translateTransformLocation); /// /// Get GraphicsPath object. /// /// graphics path instance - public abstract IGraphicsPath GetGraphicsPath(); + public abstract RGraphicsPath GetGraphicsPath(); /// /// Measure the width and height of string when drawn on device context HDC @@ -124,7 +125,7 @@ public virtual IBrush GetSolidBrush(RColor color) /// the string to measure /// the font to measure string with /// the size of the string - public abstract RSize MeasureString(string str, IFont font); + public abstract RSize MeasureString(string str, RFont font); /// /// Measure the width and height of string when drawn on device context HDC @@ -138,7 +139,7 @@ public virtual IBrush GetSolidBrush(RColor color) /// the number of characters that will fit under restriction /// /// the size of the string - public abstract RSize MeasureString(string str, IFont font, double maxWidth, out int charFit, out int charFitWidth); + public abstract RSize MeasureString(string str, RFont font, double maxWidth, out int charFit, out int charFitWidth); /// /// Draw the given string using the given font and foreground color at given location. @@ -149,7 +150,7 @@ public virtual IBrush GetSolidBrush(RColor color) /// the location to start string draw (top-left) /// used to know the size of the rendered text for transparent text support /// is to render the string right-to-left (true - RTL, false - LTR) - public abstract void DrawString(String str, IFont font, RColor color, RPoint point, RSize size, bool rtl); + public abstract void DrawString(String str, RFont font, RColor color, RPoint point, RSize size, bool rtl); /// /// Draws a line connecting the two points specified by the coordinate pairs. @@ -159,7 +160,7 @@ public virtual IBrush GetSolidBrush(RColor color) /// The y-coordinate of the first point. /// The x-coordinate of the second point. /// The y-coordinate of the second point. - public abstract void DrawLine(IPen pen, double x1, double y1, double x2, double y2); + public abstract void DrawLine(RPen pen, double x1, double y1, double x2, double y2); /// /// Draws a rectangle specified by a coordinate pair, a width, and a height. @@ -169,7 +170,7 @@ public virtual IBrush GetSolidBrush(RColor color) /// The y-coordinate of the upper-left corner of the rectangle to draw. /// The width of the rectangle to draw. /// The height of the rectangle to draw. - public abstract void DrawRectangle(IPen pen, double x, double y, double width, double height); + public abstract void DrawRectangle(RPen pen, double x, double y, double width, double height); /// /// Fills the interior of a rectangle specified by a pair of coordinates, a width, and a height. @@ -179,43 +180,43 @@ public virtual IBrush GetSolidBrush(RColor color) /// The y-coordinate of the upper-left corner of the rectangle to fill. /// Width of the rectangle to fill. /// Height of the rectangle to fill. - public abstract void DrawRectangle(IBrush brush, double x, double y, double width, double height); + public abstract void DrawRectangle(RBrush brush, double x, double y, double width, double height); /// - /// Draws the specified portion of the specified at the specified location and with the specified size. + /// Draws the specified portion of the specified at the specified location and with the specified size. /// /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. The image is scaled to fit the rectangle. /// Rectangle structure that specifies the portion of the object to draw. - public abstract void DrawImage(IImage image, RRect destRect, RRect srcRect); + public abstract void DrawImage(RImage image, RRect destRect, RRect srcRect); /// /// Draws the specified Image at the specified location and with the specified size. /// /// Image to draw. /// Rectangle structure that specifies the location and size of the drawn image. - public abstract void DrawImage(IImage image, RRect destRect); + public abstract void DrawImage(RImage image, RRect destRect); /// /// Draws a GraphicsPath. /// /// Pen that determines the color, width, and style of the path. /// GraphicsPath to draw. - public abstract void DrawPath(IPen pen, IGraphicsPath path); + public abstract void DrawPath(RPen pen, RGraphicsPath path); /// /// Fills the interior of a GraphicsPath. /// /// Brush that determines the characteristics of the fill. /// GraphicsPath that represents the path to fill. - public abstract void DrawPath(IBrush brush, IGraphicsPath path); + public abstract void DrawPath(RBrush brush, RGraphicsPath path); /// /// Fills the interior of a polygon defined by an array of points specified by Point structures. /// /// Brush that determines the characteristics of the fill. /// Array of Point structures that represent the vertices of the polygon to fill. - public abstract void DrawPolygon(IBrush brush, RPoint[] points); + public abstract void DrawPolygon(RBrush brush, RPoint[] points); /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. diff --git a/Source/HtmlRenderer/Interfaces/RGraphicsPath.cs b/Source/HtmlRenderer/Interfaces/RGraphicsPath.cs new file mode 100644 index 000000000..66e2b1640 --- /dev/null +++ b/Source/HtmlRenderer/Interfaces/RGraphicsPath.cs @@ -0,0 +1,40 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System; + +namespace HtmlRenderer.Interfaces +{ + /// + /// TODO:a add doc + /// + public abstract class RGraphicsPath : IDisposable + { + /// + /// Appends an elliptical arc to the current figure. + /// + public abstract void AddArc(double x, double y, double width, double height, double startAngle, double sweepAngle); + + /// + /// Appends a line segment to this GraphicsPath. + /// + public abstract void AddLine(double x1, double y1, double x2, double y2); + + /// + /// Closes the current figure and starts a new figure. If the current figure contains a sequence of connected + /// lines and curves, the method closes the loop by connecting a line from the endpoint to the starting point. + /// + public abstract void CloseFigure(); + + public abstract void Dispose(); + } +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/RImage.cs b/Source/HtmlRenderer/Interfaces/RImage.cs new file mode 100644 index 000000000..04fd8216a --- /dev/null +++ b/Source/HtmlRenderer/Interfaces/RImage.cs @@ -0,0 +1,40 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System; +using System.IO; + +namespace HtmlRenderer.Interfaces +{ + /// + /// TODO:a add doc + /// + public abstract class RImage : IDisposable + { + /// + /// Get the width, in pixels, of the image. + /// + public abstract double Width { get; } + + /// + /// Get the height, in pixels, of the image. + /// + public abstract double Height { get; } + + /// + /// Saves this image to the specified stream in PNG format. + /// The Stream where the image will be saved. + public abstract void Save(MemoryStream stream); + + public abstract void Dispose(); + } +} \ No newline at end of file diff --git a/Source/HtmlRenderer/Interfaces/RPen.cs b/Source/HtmlRenderer/Interfaces/RPen.cs new file mode 100644 index 000000000..3aec7e43d --- /dev/null +++ b/Source/HtmlRenderer/Interfaces/RPen.cs @@ -0,0 +1,37 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using HtmlRenderer.Entities; + +namespace HtmlRenderer.Interfaces +{ + /// + /// TODO:a add doc + /// + public abstract class RPen + { + /// + /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. + /// + public abstract double Width { get; set; } + + /// + /// Gets or sets the style used for dashed lines drawn with this Pen. + /// + public abstract RDashStyle DashStyle { set; } + + /// + /// Gets or sets an array of custom dashes and spaces. + /// + public abstract double[] DashPattern { set; } + } +} \ No newline at end of file From 79003a3e3f1edeacf5ed990039687575c7861696 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Mon, 5 May 2014 14:54:50 +0300 Subject: [PATCH 061/254] refactor --- Source/Demo/WinForms/DemoForm.cs | 2 +- .../Adapters/BrushAdapter.cs | 5 +- .../Adapters/FontAdapter.cs | 17 +---- .../Adapters/FontFamilyAdapter.cs | 5 +- .../Adapters/GraphicsAdapter.cs | 71 +----------------- .../Adapters/GraphicsPathAdapter.cs | 15 +--- .../Adapters/ImageAdapter.cs | 15 +--- .../Adapters/PdfSharpAdapter.cs | 6 +- .../Adapters/PenAdapter.cs | 13 +--- Source/HtmlRenderer.PdfSharp/HtmlContainer.cs | 2 +- .../HtmlRenderer.PdfSharp/Utilities/Utils.cs | 2 +- .../Adapters/BrushAdapter.cs | 2 +- .../Adapters/ContextMenuAdapter.cs | 4 +- .../Adapters/ControlAdapter.cs | 4 +- .../Adapters/FontAdapter.cs | 2 +- .../Adapters/FontFamilyAdapter.cs | 2 +- .../Adapters/GraphicsAdapter.cs | 4 +- .../Adapters/GraphicsPathAdapter.cs | 2 +- .../Adapters/ImageAdapter.cs | 2 +- .../Adapters/PenAdapter.cs | 4 +- .../Adapters/WinFormsAdapter.cs | 6 +- Source/HtmlRenderer.WinForms/HtmlContainer.cs | 3 +- Source/HtmlRenderer.WinForms/HtmlLabel.cs | 2 +- Source/HtmlRenderer.WinForms/HtmlPanel.cs | 2 +- Source/HtmlRenderer.WinForms/HtmlRender.cs | 2 +- Source/HtmlRenderer.WinForms/HtmlToolTip.cs | 2 +- .../HtmlRenderer.WinForms/Utilities/Utils.cs | 2 +- .../AdapterBase.cs => Adapters/Adapter.cs} | 20 +++--- .../{ => Adapters}/Entities/RColor.cs | 2 +- .../{ => Adapters}/Entities/RDashStyle.cs | 4 +- .../{ => Adapters}/Entities/RFontStyle.cs | 2 +- .../{ => Adapters}/Entities/RKeyEvent.cs | 2 +- .../{ => Adapters}/Entities/RMouseEvent.cs | 2 +- .../{ => Adapters}/Entities/RPoint.cs | 2 +- .../{ => Adapters}/Entities/RRect.cs | 2 +- .../{ => Adapters}/Entities/RSize.cs | 6 +- .../{Interfaces => Adapters}/RBrush.cs | 2 +- .../{Interfaces => Adapters}/RContextMenu.cs | 4 +- .../{Interfaces => Adapters}/RControl.cs | 4 +- .../{Interfaces => Adapters}/RFont.cs | 2 +- .../{Interfaces => Adapters}/RFontFamily.cs | 2 +- .../{Interfaces => Adapters}/RGraphics.cs | 8 +-- .../{Interfaces => Adapters}/RGraphicsPath.cs | 2 +- .../{Interfaces => Adapters}/RImage.cs | 2 +- .../{Interfaces => Adapters}/RPen.cs | 4 +- Source/HtmlRenderer/Core/CssData.cs | 6 +- .../Core/{Entities => }/CssDefaults.cs | 2 +- .../Core/{Entities => Dom}/Border.cs | 2 +- Source/HtmlRenderer/Core/Dom/CssBox.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssBoxHr.cs | 5 +- Source/HtmlRenderer/Core/Dom/CssBoxImage.cs | 5 +- .../HtmlRenderer/Core/Dom/CssBoxProperties.cs | 5 +- .../HtmlRenderer/Core/Dom/CssLayoutEngine.cs | 5 +- .../Core/Dom/CssLayoutEngineTable.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssLength.cs | 2 +- Source/HtmlRenderer/Core/Dom/CssLineBox.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssRect.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssRectImage.cs | 4 +- Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs | 2 +- .../Core/{Entities => Dom}/CssUnit.cs | 2 +- .../Core/{Entities => Dom}/HoverBoxBlock.cs | 5 +- .../{ => Core}/Entities/CssBlock.cs | 2 +- .../Entities/CssBlockSelectorItem.cs | 2 +- .../Entities/HtmlGenerationStyle.cs | 2 +- .../Entities/HtmlImageLoadEventArgs.cs | 3 +- .../Entities/HtmlLinkClickedEventArgs.cs | 2 +- .../Entities/HtmlLinkClickedException.cs | 2 +- .../Entities/HtmlRefreshEventArgs.cs | 2 +- .../Entities/HtmlRenderErrorEventArgs.cs | 2 +- .../Entities/HtmlRenderErrorType.cs | 2 +- .../Entities/HtmlScrollEventArgs.cs | 3 +- .../Entities/HtmlStylesheetLoadEventArgs.cs | 3 +- .../Handlers/BackgroundImageDrawHandler.cs | 4 +- .../Core/Handlers/BordersDrawHandler.cs | 6 +- .../Core/Handlers/ContextMenuHandler.cs | 4 +- .../{FontHandler.cs => FontsHandler.cs} | 10 +-- .../Core/Handlers/ImageLoadHandler.cs | 5 +- .../Core/Handlers/SelectionHandler.cs | 7 +- .../Core/Handlers/StylesheetLoadHandler.cs | 2 +- Source/HtmlRenderer/Core/HtmlContainerInt.cs | 10 +-- Source/HtmlRenderer/Core/HtmlRendererUtils.cs | 4 +- Source/HtmlRenderer/Core/Parse/CssParser.cs | 8 +-- .../HtmlRenderer/Core/Parse/CssValueParser.cs | 9 ++- Source/HtmlRenderer/Core/Parse/DomParser.cs | 2 +- Source/HtmlRenderer/Core/Parse/HtmlParser.cs | 1 - Source/HtmlRenderer/Core/Utils/CommonUtils.cs | 3 +- .../Core/{Entities => Utils}/CssConstants.cs | 2 +- Source/HtmlRenderer/Core/Utils/CssUtils.cs | 5 +- Source/HtmlRenderer/Core/Utils/DomUtils.cs | 2 +- .../Core/{Entities => Utils}/HtmlConstants.cs | 2 +- Source/HtmlRenderer/Core/Utils/RenderUtils.cs | 5 +- Source/HtmlRenderer/HtmlRenderer.csproj | 72 +++++++++---------- 93 files changed, 196 insertions(+), 327 deletions(-) rename Source/HtmlRenderer/{Interfaces/AdapterBase.cs => Adapters/Adapter.cs} (96%) rename Source/HtmlRenderer/{ => Adapters}/Entities/RColor.cs (99%) rename Source/HtmlRenderer/{ => Adapters}/Entities/RDashStyle.cs (89%) rename Source/HtmlRenderer/{ => Adapters}/Entities/RFontStyle.cs (93%) rename Source/HtmlRenderer/{ => Adapters}/Entities/RKeyEvent.cs (97%) rename Source/HtmlRenderer/{ => Adapters}/Entities/RMouseEvent.cs (96%) rename Source/HtmlRenderer/{ => Adapters}/Entities/RPoint.cs (99%) rename Source/HtmlRenderer/{ => Adapters}/Entities/RRect.cs (99%) rename Source/HtmlRenderer/{ => Adapters}/Entities/RSize.cs (98%) rename Source/HtmlRenderer/{Interfaces => Adapters}/RBrush.cs (93%) rename Source/HtmlRenderer/{Interfaces => Adapters}/RContextMenu.cs (96%) rename Source/HtmlRenderer/{Interfaces => Adapters}/RControl.cs (97%) rename Source/HtmlRenderer/{Interfaces => Adapters}/RFont.cs (97%) rename Source/HtmlRenderer/{Interfaces => Adapters}/RFontFamily.cs (94%) rename Source/HtmlRenderer/{Interfaces => Adapters}/RGraphics.cs (98%) rename Source/HtmlRenderer/{Interfaces => Adapters}/RGraphicsPath.cs (97%) rename Source/HtmlRenderer/{Interfaces => Adapters}/RImage.cs (96%) rename Source/HtmlRenderer/{Interfaces => Adapters}/RPen.cs (93%) rename Source/HtmlRenderer/Core/{Entities => }/CssDefaults.cs (99%) rename Source/HtmlRenderer/Core/{Entities => Dom}/Border.cs (92%) rename Source/HtmlRenderer/Core/{Entities => Dom}/CssUnit.cs (94%) rename Source/HtmlRenderer/Core/{Entities => Dom}/HoverBoxBlock.cs (93%) rename Source/HtmlRenderer/{ => Core}/Entities/CssBlock.cs (99%) rename Source/HtmlRenderer/{ => Core}/Entities/CssBlockSelectorItem.cs (98%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlGenerationStyle.cs (95%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlImageLoadEventArgs.cs (99%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlLinkClickedEventArgs.cs (98%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlLinkClickedException.cs (97%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlRefreshEventArgs.cs (97%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlRenderErrorEventArgs.cs (98%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlRenderErrorType.cs (94%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlScrollEventArgs.cs (94%) rename Source/HtmlRenderer/{ => Core}/Entities/HtmlStylesheetLoadEventArgs.cs (98%) rename Source/HtmlRenderer/Core/Handlers/{FontHandler.cs => FontsHandler.cs} (97%) rename Source/HtmlRenderer/Core/{Entities => Utils}/CssConstants.cs (99%) rename Source/HtmlRenderer/Core/{Entities => Utils}/HtmlConstants.cs (99%) diff --git a/Source/Demo/WinForms/DemoForm.cs b/Source/Demo/WinForms/DemoForm.cs index 8aa11937d..918be57c9 100644 --- a/Source/Demo/WinForms/DemoForm.cs +++ b/Source/Demo/WinForms/DemoForm.cs @@ -20,8 +20,8 @@ using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Demo.Common; -using HtmlRenderer.Entities; using HtmlRenderer.WinForms; using Timer = System.Threading.Timer; diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/BrushAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/BrushAdapter.cs index a7fd5052e..da0f0cf4e 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/BrushAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/BrushAdapter.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; using PdfSharp.Drawing; namespace HtmlRenderer.PdfSharp.Adapters @@ -41,9 +41,6 @@ public XBrush Brush get { return _brush; } } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// public override void Dispose() { } } diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs index 5ccd1416a..8410899fd 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/FontAdapter.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; using PdfSharp.Drawing; namespace HtmlRenderer.PdfSharp.Adapters @@ -61,41 +61,26 @@ public XFont Font get { return _font; } } - /// - /// Gets the em-size of this Font measured in the units specified by the Unit property. - /// public override double Size { get { return _font.Size; } } - /// - /// Gets the em-size, in points, of this Font. - /// public override double SizeInPoints { get { return _font.Size; } } - /// - /// Get the vertical offset of the font underline location from the top of the font. - /// public override double UnderlineOffset { get { return _underlineOffset; } } - /// - /// The line spacing, in pixels, of this font. - /// public override double Height { get { return _height; } } - /// - /// Get the left padding, in pixels, of the font. - /// public override double LeftPadding { get { return _height / 6f; } diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/FontFamilyAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/FontFamilyAdapter.cs index 96e4f7dc8..3afc724f1 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/FontFamilyAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/FontFamilyAdapter.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; using PdfSharp.Drawing; namespace HtmlRenderer.PdfSharp.Adapters @@ -41,9 +41,6 @@ public XFontFamily FontFamily get { return _fontFamily; } } - /// - /// Gets the name of this FontFamily. - /// public override string Name { get { return _fontFamily.Name; } diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs index abec43226..497014c16 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs @@ -13,9 +13,9 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; using HtmlRenderer.PdfSharp.Utilities; using PdfSharp.Drawing; @@ -55,39 +55,22 @@ public GraphicsAdapter(XGraphics g, bool releaseGraphics = false) _releaseGraphics = releaseGraphics; } - /// - /// Gets the bounding clipping region of this graphics. - /// - /// The bounding rectangle for the clipping region public override RRect GetClip() { RectangleF clip = _g.Graphics.ClipBounds; return Utils.Convert(clip); } - /// - /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. - /// - /// Rectangle structure to combine. public override void SetClipReplace(RRect rect) { _g.Graphics.SetClip(new RectangleF((float)rect.X, (float)rect.Y, (float)rect.Width, (float)rect.Height), CombineMode.Replace); } - /// - /// Sets the clipping region of this Graphics to the result of the specified operation combining the current clip region and the rectangle specified by a Rectangle structure. - /// - /// Rectangle structure to combine. public override void SetClipExclude(RRect rect) { _g.Graphics.SetClip(new RectangleF((float)rect.X, (float)rect.Y, (float)rect.Width, (float)rect.Height), CombineMode.Exclude); } - /// - /// Set the graphics smooth mode to use anti-alias.
    - /// Use to return back the mode used. - ///
    - /// the previous smooth mode before the change public override Object SetAntiAliasSmoothingMode() { var prevMode = _g.SmoothingMode; @@ -95,10 +78,6 @@ public override Object SetAntiAliasSmoothingMode() return prevMode; } - /// - /// Return to previous smooth mode before anti-alias was set as returned from . - /// - /// the previous mode to set public override void ReturnPreviousSmoothingMode(Object prevMode) { if (prevMode != null) @@ -107,13 +86,6 @@ public override void ReturnPreviousSmoothingMode(Object prevMode) } } - /// - /// Measure the width and height of string when drawn on device context HDC - /// using the given font . - /// - /// the string to measure - /// the font to measure string with - /// the size of the string public override RSize MeasureString(string str, RFont font) { var fontAdapter = (FontAdapter)font; @@ -130,46 +102,17 @@ public override RSize MeasureString(string str, RFont font) return Utils.Convert(size); } - /// - /// Measure the width and height of string when drawn on device context HDC - /// using the given font .
    - /// Restrict the width of the string and get the number of characters able to fit in the restriction and - /// the width those characters take. - ///
    - /// the string to measure - /// the font to measure string with - /// the max width to render the string in - /// the number of characters that will fit under restriction - /// - /// the size of the string public override RSize MeasureString(string str, RFont font, double maxWidth, out int charFit, out int charFitWidth) { throw new NotSupportedException(); } - /// - /// Draw the given string using the given font and foreground color at given location. - /// - /// the string to draw - /// the font to use to draw the string - /// the text color to set - /// the location to start string draw (top-left) - /// used to know the size of the rendered text for transparent text support - /// is to render the string right-to-left (true - RTL, false - LTR) public override void DrawString(string str, RFont font, RColor color, RPoint point, RSize size, bool rtl) { var brush = new XSolidBrush(Utils.Convert(color)); _g.DrawString(str, ((FontAdapter)font).Font, brush, point.X - font.LeftPadding * .8f, point.Y); } - /// - /// Get linear gradient color brush from to . - /// - /// the rectangle to get the brush for - /// the start color of the gradient - /// the end color of the gradient - /// the angle to move the gradient from start color to end color in the rectangle - /// linear gradient color brush instance public override RBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) { XLinearGradientMode mode; @@ -184,12 +127,6 @@ public override RBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor return new BrushAdapter(new XLinearGradientBrush(Utils.Convert(rect), Utils.Convert(color1), Utils.Convert(color2), mode)); } - /// - /// Get TextureBrush object that uses the specified image and bounding rectangle. - /// - /// The Image object with which this TextureBrush object fills interiors. - /// A Rectangle structure that represents the bounding rectangle for this TextureBrush object. - /// The dimension by which to translate the transformation public override RBrush GetTextureBrush(RImage image, RRect dstRect, RPoint translateTransformLocation) { // TODO:a handle missing TextureBrush @@ -199,10 +136,6 @@ public override RBrush GetTextureBrush(RImage image, RRect dstRect, RPoint trans return new BrushAdapter(new XSolidBrush(XColors.DeepPink)); } - /// - /// Get GraphicsPath object. - /// - /// graphics path instance public override RGraphicsPath GetGraphicsPath() { return new GraphicsPathAdapter(); diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs index a572077fb..5ff4043f8 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsPathAdapter.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; using PdfSharp.Drawing; namespace HtmlRenderer.PdfSharp.Adapters @@ -33,34 +33,21 @@ public XGraphicsPath GraphicsPath get { return _graphicsPath; } } - /// - /// Appends an elliptical arc to the current figure. - /// public override void AddArc(double x, double y, double width, double height, double startAngle, double sweepAngle) { _graphicsPath.AddArc(x, y, width, height, startAngle, sweepAngle); } - /// - /// Appends a line segment to this GraphicsPath. - /// public override void AddLine(double x1, double y1, double x2, double y2) { _graphicsPath.AddLine(x1, y1, x2, y2); } - /// - /// Closes the current figure and starts a new figure. If the current figure contains a sequence of connected - /// lines and curves, the method closes the loop by connecting a line from the endpoint to the starting point. - /// public override void CloseFigure() { _graphicsPath.CloseFigure(); } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// public override void Dispose() { } } diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs index 063477f72..a2abcdb5c 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs @@ -12,7 +12,7 @@ using System; using System.IO; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; using PdfSharp.Drawing; namespace HtmlRenderer.PdfSharp.Adapters @@ -43,34 +43,21 @@ public XImage Image get { return _image; } } - /// - /// Get the width, in pixels, of the image. - /// public override double Width { get { return _image.PixelWidth; } } - /// - /// Get the height, in pixels, of the image. - /// public override double Height { get { return _image.PixelHeight; } } - /// - /// Saves this image to the specified stream in PNG format. - /// - /// The Stream where the image will be saved. public override void Save(MemoryStream stream) { throw new NotSupportedException(); } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// public override void Dispose() { _image.Dispose(); diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs index 581eeb86c..61854358d 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs @@ -12,8 +12,8 @@ using System.Drawing; using System.IO; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters.Entities; +using HtmlRenderer.Adapters; using HtmlRenderer.PdfSharp.Utilities; using PdfSharp.Drawing; @@ -23,7 +23,7 @@ namespace HtmlRenderer.PdfSharp.Adapters /// Adapter for general stuff for core. /// TODO:a add doc. ///
    - internal sealed class PdfSharpAdapter : AdapterBase + internal sealed class PdfSharpAdapter : Adapter { #region Fields and Consts diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs index 1e3302679..3d4a5887d 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs @@ -10,8 +10,8 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters.Entities; +using HtmlRenderer.Adapters; using PdfSharp.Drawing; namespace HtmlRenderer.PdfSharp.Adapters @@ -42,18 +42,12 @@ public XPen Pen get { return _pen; } } - /// - /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. - /// public override double Width { get { return _pen.Width; } set { _pen.Width = value; } } - /// - /// Gets or sets the style used for dashed lines drawn with this Pen. - /// public override RDashStyle DashStyle { set @@ -85,9 +79,6 @@ public override RDashStyle DashStyle } } - /// - /// Gets or sets an array of custom dashes and spaces. - /// public override double[] DashPattern { set diff --git a/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs b/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs index 2883f0ccf..8763dea2e 100644 --- a/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs +++ b/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs @@ -12,8 +12,8 @@ using System; using HtmlRenderer.Core; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; using HtmlRenderer.PdfSharp.Adapters; using HtmlRenderer.PdfSharp.Utilities; using PdfSharp.Drawing; diff --git a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs index b83badbae..d50339303 100644 --- a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs +++ b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Entities; +using HtmlRenderer.Adapters.Entities; using PdfSharp.Drawing; namespace HtmlRenderer.PdfSharp.Utilities diff --git a/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs index 25da09c6a..72b9b36c0 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/BrushAdapter.cs @@ -11,7 +11,7 @@ // "The Art of War" using System.Drawing; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.WinForms.Adapters { diff --git a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs index 95610455c..e85402211 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ContextMenuAdapter.cs @@ -12,9 +12,9 @@ using System; using System.Windows.Forms; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; using HtmlRenderer.WinForms.Utilities; namespace HtmlRenderer.WinForms.Adapters diff --git a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs index 42a2ac4f9..51ab1c19a 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ControlAdapter.cs @@ -11,9 +11,9 @@ // "The Art of War" using System.Windows.Forms; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; using HtmlRenderer.WinForms.Utilities; namespace HtmlRenderer.WinForms.Adapters diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs index 5b4e433e6..09df98611 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs @@ -12,7 +12,7 @@ using System; using System.Drawing; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.WinForms.Adapters { diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs index 38b9f9419..02710ade6 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs @@ -11,7 +11,7 @@ // "The Art of War" using System.Drawing; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.WinForms.Adapters { diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs index 07acf0d2f..c539b0b83 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs @@ -13,9 +13,9 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; using HtmlRenderer.WinForms.Utilities; namespace HtmlRenderer.WinForms.Adapters diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs index 7c1889322..dc3ad66fe 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs @@ -11,7 +11,7 @@ // "The Art of War" using System.Drawing.Drawing2D; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.WinForms.Adapters { diff --git a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs index c60ca0d94..046617be8 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs @@ -13,7 +13,7 @@ using System.Drawing; using System.Drawing.Imaging; using System.IO; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.WinForms.Adapters { diff --git a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs index 95d9bf70f..3163062e1 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs @@ -11,8 +11,8 @@ // "The Art of War" using System.Drawing; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters.Entities; +using HtmlRenderer.Adapters; namespace HtmlRenderer.WinForms.Adapters { diff --git a/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs index 0ec58087a..fbf8348f1 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs @@ -13,8 +13,8 @@ using System.Drawing; using System.IO; using System.Windows.Forms; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters.Entities; +using HtmlRenderer.Adapters; using HtmlRenderer.WinForms.Utilities; namespace HtmlRenderer.WinForms.Adapters @@ -23,7 +23,7 @@ namespace HtmlRenderer.WinForms.Adapters /// Adapter for general stuff for core. /// TODO:a add doc. ///
    - internal sealed class WinFormsAdapter : AdapterBase + internal sealed class WinFormsAdapter : Adapter { #region Fields and Consts diff --git a/Source/HtmlRenderer.WinForms/HtmlContainer.cs b/Source/HtmlRenderer.WinForms/HtmlContainer.cs index a57c20b6f..6d2ab4a3b 100644 --- a/Source/HtmlRenderer.WinForms/HtmlContainer.cs +++ b/Source/HtmlRenderer.WinForms/HtmlContainer.cs @@ -14,10 +14,11 @@ using System.Drawing; using System.Drawing.Text; using System.Windows.Forms; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Parse; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; using HtmlRenderer.WinForms.Adapters; using HtmlRenderer.WinForms.Utilities; diff --git a/Source/HtmlRenderer.WinForms/HtmlLabel.cs b/Source/HtmlRenderer.WinForms/HtmlLabel.cs index 01cfd6685..d72efa9db 100644 --- a/Source/HtmlRenderer.WinForms/HtmlLabel.cs +++ b/Source/HtmlRenderer.WinForms/HtmlLabel.cs @@ -17,7 +17,7 @@ using System.Drawing.Text; using System.Windows.Forms; using HtmlRenderer.Core; -using HtmlRenderer.Entities; +using HtmlRenderer.Core.Entities; using HtmlRenderer.WinForms.Adapters; using HtmlRenderer.WinForms.Utilities; diff --git a/Source/HtmlRenderer.WinForms/HtmlPanel.cs b/Source/HtmlRenderer.WinForms/HtmlPanel.cs index e6e74deb0..950d3ac3a 100644 --- a/Source/HtmlRenderer.WinForms/HtmlPanel.cs +++ b/Source/HtmlRenderer.WinForms/HtmlPanel.cs @@ -17,8 +17,8 @@ using System.Drawing.Text; using System.Windows.Forms; using HtmlRenderer.Core; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; using HtmlRenderer.WinForms.Utilities; namespace HtmlRenderer.WinForms diff --git a/Source/HtmlRenderer.WinForms/HtmlRender.cs b/Source/HtmlRenderer.WinForms/HtmlRender.cs index 46d5a9ac2..c6a2b777a 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRender.cs +++ b/Source/HtmlRenderer.WinForms/HtmlRender.cs @@ -16,8 +16,8 @@ using System.Drawing.Imaging; using System.Drawing.Text; using HtmlRenderer.Core; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; using HtmlRenderer.WinForms.Adapters; using HtmlRenderer.WinForms.Utilities; diff --git a/Source/HtmlRenderer.WinForms/HtmlToolTip.cs b/Source/HtmlRenderer.WinForms/HtmlToolTip.cs index 13a40b326..c3c94dc9d 100644 --- a/Source/HtmlRenderer.WinForms/HtmlToolTip.cs +++ b/Source/HtmlRenderer.WinForms/HtmlToolTip.cs @@ -16,7 +16,7 @@ using System.Drawing.Text; using System.Windows.Forms; using HtmlRenderer.Core; -using HtmlRenderer.Entities; +using HtmlRenderer.Core.Entities; using HtmlRenderer.WinForms.Utilities; namespace HtmlRenderer.WinForms diff --git a/Source/HtmlRenderer.WinForms/Utilities/Utils.cs b/Source/HtmlRenderer.WinForms/Utilities/Utils.cs index 561605875..a22d8d5ae 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/Utils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/Utils.cs @@ -12,7 +12,7 @@ using System; using System.Drawing; -using HtmlRenderer.Entities; +using HtmlRenderer.Adapters.Entities; namespace HtmlRenderer.WinForms.Utilities { diff --git a/Source/HtmlRenderer/Interfaces/AdapterBase.cs b/Source/HtmlRenderer/Adapters/Adapter.cs similarity index 96% rename from Source/HtmlRenderer/Interfaces/AdapterBase.cs rename to Source/HtmlRenderer/Adapters/Adapter.cs index d452d39f7..6faa25fbc 100644 --- a/Source/HtmlRenderer/Interfaces/AdapterBase.cs +++ b/Source/HtmlRenderer/Adapters/Adapter.cs @@ -14,13 +14,13 @@ using System; using System.Collections.Generic; using System.IO; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Handlers; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -namespace HtmlRenderer.Interfaces +namespace HtmlRenderer.Adapters { /// /// TODO:a add doc @@ -29,7 +29,7 @@ namespace HtmlRenderer.Interfaces /// It is best to have a singleton instance of this class for concrete implementation!
    /// This is because it holds caches of default CssData, Images, Fonts and Brushes. /// - public abstract class AdapterBase + public abstract class Adapter { #region Fields/Consts @@ -46,7 +46,7 @@ public abstract class AdapterBase /// /// cache of all the font used not to create same font again and again /// - private readonly FontHandler _fontHandler; + private readonly FontsHandler _fontsHandler; /// /// default CSS parsed data singleton @@ -69,9 +69,9 @@ public abstract class AdapterBase /// /// Init. /// - protected AdapterBase() + protected Adapter() { - _fontHandler = new FontHandler(this); + _fontsHandler = new FontsHandler(this); } /// @@ -150,7 +150,7 @@ public RImage ImageFromStream(Stream memoryStream) /// true - font exists by given family name, false - otherwise public bool IsFontExists(string font) { - return _fontHandler.IsFontExists(font); + return _fontsHandler.IsFontExists(font); } /// @@ -159,7 +159,7 @@ public bool IsFontExists(string font) /// The font family to add. public void AddFontFamily(RFontFamily fontFamily) { - _fontHandler.AddFontFamily(fontFamily); + _fontsHandler.AddFontFamily(fontFamily); } /// @@ -171,7 +171,7 @@ public void AddFontFamily(RFontFamily fontFamily) /// the font family to replace with public void AddFontFamilyMapping(string fromFamily, string toFamily) { - _fontHandler.AddFontFamilyMapping(fromFamily, toFamily); + _fontsHandler.AddFontFamilyMapping(fromFamily, toFamily); } /// @@ -183,7 +183,7 @@ public void AddFontFamilyMapping(string fromFamily, string toFamily) /// font instance public RFont GetFont(string family, double size, RFontStyle style) { - return _fontHandler.GetCachedFont(family, size, style); + return _fontsHandler.GetCachedFont(family, size, style); } /// diff --git a/Source/HtmlRenderer/Entities/RColor.cs b/Source/HtmlRenderer/Adapters/Entities/RColor.cs similarity index 99% rename from Source/HtmlRenderer/Entities/RColor.cs rename to Source/HtmlRenderer/Adapters/Entities/RColor.cs index 7e6eee26f..b84f69c23 100644 --- a/Source/HtmlRenderer/Entities/RColor.cs +++ b/Source/HtmlRenderer/Adapters/Entities/RColor.cs @@ -5,7 +5,7 @@ using System; using System.Text; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Adapters.Entities { /// /// Represents an ARGB (alpha, red, green, blue) color. diff --git a/Source/HtmlRenderer/Entities/RDashStyle.cs b/Source/HtmlRenderer/Adapters/Entities/RDashStyle.cs similarity index 89% rename from Source/HtmlRenderer/Entities/RDashStyle.cs rename to Source/HtmlRenderer/Adapters/Entities/RDashStyle.cs index 66740a915..8e44e5699 100644 --- a/Source/HtmlRenderer/Entities/RDashStyle.cs +++ b/Source/HtmlRenderer/Adapters/Entities/RDashStyle.cs @@ -10,9 +10,7 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Interfaces; - -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Adapters.Entities { /// /// Specifies the style of dashed lines drawn with a object. diff --git a/Source/HtmlRenderer/Entities/RFontStyle.cs b/Source/HtmlRenderer/Adapters/Entities/RFontStyle.cs similarity index 93% rename from Source/HtmlRenderer/Entities/RFontStyle.cs rename to Source/HtmlRenderer/Adapters/Entities/RFontStyle.cs index 485190b15..e0e9b52be 100644 --- a/Source/HtmlRenderer/Entities/RFontStyle.cs +++ b/Source/HtmlRenderer/Adapters/Entities/RFontStyle.cs @@ -12,7 +12,7 @@ using System; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Adapters.Entities { /// /// Specifies style information applied to text. diff --git a/Source/HtmlRenderer/Entities/RKeyEvent.cs b/Source/HtmlRenderer/Adapters/Entities/RKeyEvent.cs similarity index 97% rename from Source/HtmlRenderer/Entities/RKeyEvent.cs rename to Source/HtmlRenderer/Adapters/Entities/RKeyEvent.cs index eb3606eb3..eee29b7b4 100644 --- a/Source/HtmlRenderer/Entities/RKeyEvent.cs +++ b/Source/HtmlRenderer/Adapters/Entities/RKeyEvent.cs @@ -12,7 +12,7 @@ using HtmlRenderer.Core; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Adapters.Entities { /// /// Even class for handling keyboard events in . diff --git a/Source/HtmlRenderer/Entities/RMouseEvent.cs b/Source/HtmlRenderer/Adapters/Entities/RMouseEvent.cs similarity index 96% rename from Source/HtmlRenderer/Entities/RMouseEvent.cs rename to Source/HtmlRenderer/Adapters/Entities/RMouseEvent.cs index aa3614586..ac16eef0d 100644 --- a/Source/HtmlRenderer/Entities/RMouseEvent.cs +++ b/Source/HtmlRenderer/Adapters/Entities/RMouseEvent.cs @@ -12,7 +12,7 @@ using HtmlRenderer.Core; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Adapters.Entities { /// /// Even class for handling keyboard events in . diff --git a/Source/HtmlRenderer/Entities/RPoint.cs b/Source/HtmlRenderer/Adapters/Entities/RPoint.cs similarity index 99% rename from Source/HtmlRenderer/Entities/RPoint.cs rename to Source/HtmlRenderer/Adapters/Entities/RPoint.cs index d8ffe84d8..04816bd81 100644 --- a/Source/HtmlRenderer/Entities/RPoint.cs +++ b/Source/HtmlRenderer/Adapters/Entities/RPoint.cs @@ -12,7 +12,7 @@ using System; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Adapters.Entities { /// /// Represents an ordered pair of floating-point x- and y-coordinates that defines a point in a two-dimensional plane. diff --git a/Source/HtmlRenderer/Entities/RRect.cs b/Source/HtmlRenderer/Adapters/Entities/RRect.cs similarity index 99% rename from Source/HtmlRenderer/Entities/RRect.cs rename to Source/HtmlRenderer/Adapters/Entities/RRect.cs index 730ac6aee..0587f2d74 100644 --- a/Source/HtmlRenderer/Entities/RRect.cs +++ b/Source/HtmlRenderer/Adapters/Entities/RRect.cs @@ -12,7 +12,7 @@ using System; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Adapters.Entities { /// /// Stores a set of four floating-point numbers that represent the location and size of a rectangle. diff --git a/Source/HtmlRenderer/Entities/RSize.cs b/Source/HtmlRenderer/Adapters/Entities/RSize.cs similarity index 98% rename from Source/HtmlRenderer/Entities/RSize.cs rename to Source/HtmlRenderer/Adapters/Entities/RSize.cs index cdabe0a55..2e58fabdb 100644 --- a/Source/HtmlRenderer/Entities/RSize.cs +++ b/Source/HtmlRenderer/Adapters/Entities/RSize.cs @@ -12,7 +12,7 @@ using System; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Adapters.Entities { /// /// Stores an ordered pair of floating-point numbers, typically the width and height of a rectangle. @@ -102,8 +102,8 @@ public bool IsEmpty { get { - if (_width == 0.0) - return _height == 0.0; + if (Math.Abs(_width) < 0.0001) + return Math.Abs(_height) < 0.0001; else return false; } diff --git a/Source/HtmlRenderer/Interfaces/RBrush.cs b/Source/HtmlRenderer/Adapters/RBrush.cs similarity index 93% rename from Source/HtmlRenderer/Interfaces/RBrush.cs rename to Source/HtmlRenderer/Adapters/RBrush.cs index aeb8cb7bd..5dedf1792 100644 --- a/Source/HtmlRenderer/Interfaces/RBrush.cs +++ b/Source/HtmlRenderer/Adapters/RBrush.cs @@ -12,7 +12,7 @@ using System; -namespace HtmlRenderer.Interfaces +namespace HtmlRenderer.Adapters { /// /// TODO:a add doc diff --git a/Source/HtmlRenderer/Interfaces/RContextMenu.cs b/Source/HtmlRenderer/Adapters/RContextMenu.cs similarity index 96% rename from Source/HtmlRenderer/Interfaces/RContextMenu.cs rename to Source/HtmlRenderer/Adapters/RContextMenu.cs index 25559c73f..7ac66655f 100644 --- a/Source/HtmlRenderer/Interfaces/RContextMenu.cs +++ b/Source/HtmlRenderer/Adapters/RContextMenu.cs @@ -11,9 +11,9 @@ // "The Art of War" using System; -using HtmlRenderer.Entities; +using HtmlRenderer.Adapters.Entities; -namespace HtmlRenderer.Interfaces +namespace HtmlRenderer.Adapters { /// /// TODO:a add doc diff --git a/Source/HtmlRenderer/Interfaces/RControl.cs b/Source/HtmlRenderer/Adapters/RControl.cs similarity index 97% rename from Source/HtmlRenderer/Interfaces/RControl.cs rename to Source/HtmlRenderer/Adapters/RControl.cs index 466cfcb32..a7781e6dc 100644 --- a/Source/HtmlRenderer/Interfaces/RControl.cs +++ b/Source/HtmlRenderer/Adapters/RControl.cs @@ -10,9 +10,9 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Entities; +using HtmlRenderer.Adapters.Entities; -namespace HtmlRenderer.Interfaces +namespace HtmlRenderer.Adapters { /// /// TODO:a add doc diff --git a/Source/HtmlRenderer/Interfaces/RFont.cs b/Source/HtmlRenderer/Adapters/RFont.cs similarity index 97% rename from Source/HtmlRenderer/Interfaces/RFont.cs rename to Source/HtmlRenderer/Adapters/RFont.cs index 4e4610016..75e284254 100644 --- a/Source/HtmlRenderer/Interfaces/RFont.cs +++ b/Source/HtmlRenderer/Adapters/RFont.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -namespace HtmlRenderer.Interfaces +namespace HtmlRenderer.Adapters { /// /// TODO:a add doc diff --git a/Source/HtmlRenderer/Interfaces/RFontFamily.cs b/Source/HtmlRenderer/Adapters/RFontFamily.cs similarity index 94% rename from Source/HtmlRenderer/Interfaces/RFontFamily.cs rename to Source/HtmlRenderer/Adapters/RFontFamily.cs index 00858f563..49058b6b1 100644 --- a/Source/HtmlRenderer/Interfaces/RFontFamily.cs +++ b/Source/HtmlRenderer/Adapters/RFontFamily.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -namespace HtmlRenderer.Interfaces +namespace HtmlRenderer.Adapters { /// /// TODO:a add doc diff --git a/Source/HtmlRenderer/Interfaces/RGraphics.cs b/Source/HtmlRenderer/Adapters/RGraphics.cs similarity index 98% rename from Source/HtmlRenderer/Interfaces/RGraphics.cs rename to Source/HtmlRenderer/Adapters/RGraphics.cs index 3cdec10b6..c06703198 100644 --- a/Source/HtmlRenderer/Interfaces/RGraphics.cs +++ b/Source/HtmlRenderer/Adapters/RGraphics.cs @@ -11,10 +11,10 @@ // "The Art of War" using System; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -namespace HtmlRenderer.Interfaces +namespace HtmlRenderer.Adapters { /// /// Base class for the graphics methods required for HTML rendering.
    @@ -28,7 +28,7 @@ public abstract class RGraphics : IDisposable /// /// the global adapter /// - protected readonly AdapterBase _adapter; + protected readonly Adapter _adapter; #endregion @@ -36,7 +36,7 @@ public abstract class RGraphics : IDisposable /// /// Init. /// - protected RGraphics(AdapterBase adapter) + protected RGraphics(Adapter adapter) { ArgChecker.AssertArgNotNull(adapter, "global"); diff --git a/Source/HtmlRenderer/Interfaces/RGraphicsPath.cs b/Source/HtmlRenderer/Adapters/RGraphicsPath.cs similarity index 97% rename from Source/HtmlRenderer/Interfaces/RGraphicsPath.cs rename to Source/HtmlRenderer/Adapters/RGraphicsPath.cs index 66e2b1640..b425d83cd 100644 --- a/Source/HtmlRenderer/Interfaces/RGraphicsPath.cs +++ b/Source/HtmlRenderer/Adapters/RGraphicsPath.cs @@ -12,7 +12,7 @@ using System; -namespace HtmlRenderer.Interfaces +namespace HtmlRenderer.Adapters { /// /// TODO:a add doc diff --git a/Source/HtmlRenderer/Interfaces/RImage.cs b/Source/HtmlRenderer/Adapters/RImage.cs similarity index 96% rename from Source/HtmlRenderer/Interfaces/RImage.cs rename to Source/HtmlRenderer/Adapters/RImage.cs index 04fd8216a..321d5eddc 100644 --- a/Source/HtmlRenderer/Interfaces/RImage.cs +++ b/Source/HtmlRenderer/Adapters/RImage.cs @@ -13,7 +13,7 @@ using System; using System.IO; -namespace HtmlRenderer.Interfaces +namespace HtmlRenderer.Adapters { /// /// TODO:a add doc diff --git a/Source/HtmlRenderer/Interfaces/RPen.cs b/Source/HtmlRenderer/Adapters/RPen.cs similarity index 93% rename from Source/HtmlRenderer/Interfaces/RPen.cs rename to Source/HtmlRenderer/Adapters/RPen.cs index 3aec7e43d..76ec3b6b5 100644 --- a/Source/HtmlRenderer/Interfaces/RPen.cs +++ b/Source/HtmlRenderer/Adapters/RPen.cs @@ -10,9 +10,9 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Entities; +using HtmlRenderer.Adapters.Entities; -namespace HtmlRenderer.Interfaces +namespace HtmlRenderer.Adapters { /// /// TODO:a add doc diff --git a/Source/HtmlRenderer/Core/CssData.cs b/Source/HtmlRenderer/Core/CssData.cs index 2569f33b0..6e7d2b194 100644 --- a/Source/HtmlRenderer/Core/CssData.cs +++ b/Source/HtmlRenderer/Core/CssData.cs @@ -12,10 +12,10 @@ using System; using System.Collections.Generic; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Parse; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core { @@ -61,7 +61,7 @@ internal CssData() /// the stylesheet source to parse /// true - combine the parsed css data with default css data, false - return only the parsed css data /// the parsed css data - public static CssData Parse(AdapterBase adapter, string stylesheet, bool combineWithDefault = true) + public static CssData Parse(Adapter adapter, string stylesheet, bool combineWithDefault = true) { CssParser parser = new CssParser(adapter); return parser.ParseStyleSheet(stylesheet, combineWithDefault); diff --git a/Source/HtmlRenderer/Core/Entities/CssDefaults.cs b/Source/HtmlRenderer/Core/CssDefaults.cs similarity index 99% rename from Source/HtmlRenderer/Core/Entities/CssDefaults.cs rename to Source/HtmlRenderer/Core/CssDefaults.cs index 0beed2cb9..93844393f 100644 --- a/Source/HtmlRenderer/Core/Entities/CssDefaults.cs +++ b/Source/HtmlRenderer/Core/CssDefaults.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -namespace HtmlRenderer.Core.Entities +namespace HtmlRenderer.Core { internal static class CssDefaults { diff --git a/Source/HtmlRenderer/Core/Entities/Border.cs b/Source/HtmlRenderer/Core/Dom/Border.cs similarity index 92% rename from Source/HtmlRenderer/Core/Entities/Border.cs rename to Source/HtmlRenderer/Core/Dom/Border.cs index 4561d8c77..c5885ee07 100644 --- a/Source/HtmlRenderer/Core/Entities/Border.cs +++ b/Source/HtmlRenderer/Core/Dom/Border.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -namespace HtmlRenderer.Core.Entities +namespace HtmlRenderer.Core.Dom { /// /// Border types diff --git a/Source/HtmlRenderer/Core/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs index 2bece5fb6..ee0adb743 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -13,12 +13,12 @@ using System; using System.Collections.Generic; using System.Globalization; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Handlers; using HtmlRenderer.Core.Parse; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs index 5dd38f5d3..13673664e 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs @@ -14,11 +14,11 @@ using System.Net; using System.Text; using System.Threading; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Handlers; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs index 0a6529704..199e7cbb7 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxHr.cs @@ -10,12 +10,11 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Core.Entities; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Handlers; using HtmlRenderer.Core.Parse; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs index dd5bfc00f..289f68f80 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs @@ -11,11 +11,10 @@ // "The Art of War" using System; -using HtmlRenderer.Core.Entities; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Handlers; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs index 8fa51a0ae..12f8b67c9 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs @@ -13,11 +13,10 @@ using System; using System.Globalization; using System.Text.RegularExpressions; -using HtmlRenderer.Core.Entities; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Parse; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs index 477434b0a..3b833a745 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngine.cs @@ -12,10 +12,9 @@ using System; using System.Collections.Generic; -using HtmlRenderer.Core.Entities; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs index 65895aa66..e538fb0a2 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLayoutEngineTable.cs @@ -12,11 +12,11 @@ using System; using System.Collections.Generic; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Parse; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssLength.cs b/Source/HtmlRenderer/Core/Dom/CssLength.cs index b2306b616..5ff14493f 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLength.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLength.cs @@ -1,7 +1,7 @@ using System; using System.Globalization; -using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Parse; +using HtmlRenderer.Core.Utils; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs index 0d14ac742..3305aeb50 100644 --- a/Source/HtmlRenderer/Core/Dom/CssLineBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssLineBox.cs @@ -12,8 +12,8 @@ using System; using System.Collections.Generic; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters.Entities; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssRect.cs b/Source/HtmlRenderer/Core/Dom/CssRect.cs index a4a4eeb75..9261f84ee 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRect.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRect.cs @@ -10,9 +10,9 @@ // - Sun Tsu, // "The Art of War" +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Handlers; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssRectImage.cs b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs index b055b1143..8a325719d 100644 --- a/Source/HtmlRenderer/Core/Dom/CssRectImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssRectImage.cs @@ -10,8 +10,8 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters.Entities; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs b/Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs index 009e259f2..7777d66fe 100644 --- a/Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssSpacingBox.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using HtmlRenderer.Core.Entities; +using HtmlRenderer.Core.Utils; namespace HtmlRenderer.Core.Dom { diff --git a/Source/HtmlRenderer/Core/Entities/CssUnit.cs b/Source/HtmlRenderer/Core/Dom/CssUnit.cs similarity index 94% rename from Source/HtmlRenderer/Core/Entities/CssUnit.cs rename to Source/HtmlRenderer/Core/Dom/CssUnit.cs index f39aa9b8d..6df93d47e 100644 --- a/Source/HtmlRenderer/Core/Entities/CssUnit.cs +++ b/Source/HtmlRenderer/Core/Dom/CssUnit.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -namespace HtmlRenderer.Core.Entities +namespace HtmlRenderer.Core.Dom { /// /// Represents the possible units of the CSS lengths diff --git a/Source/HtmlRenderer/Core/Entities/HoverBoxBlock.cs b/Source/HtmlRenderer/Core/Dom/HoverBoxBlock.cs similarity index 93% rename from Source/HtmlRenderer/Core/Entities/HoverBoxBlock.cs rename to Source/HtmlRenderer/Core/Dom/HoverBoxBlock.cs index c15b8b64c..d04499041 100644 --- a/Source/HtmlRenderer/Core/Entities/HoverBoxBlock.cs +++ b/Source/HtmlRenderer/Core/Dom/HoverBoxBlock.cs @@ -10,10 +10,9 @@ // - Sun Tsu, // "The Art of War" -using HtmlRenderer.Core.Dom; -using HtmlRenderer.Entities; +using HtmlRenderer.Core.Entities; -namespace HtmlRenderer.Core.Entities +namespace HtmlRenderer.Core.Dom { /// /// CSS boxes that have ":hover" selector on them. diff --git a/Source/HtmlRenderer/Entities/CssBlock.cs b/Source/HtmlRenderer/Core/Entities/CssBlock.cs similarity index 99% rename from Source/HtmlRenderer/Entities/CssBlock.cs rename to Source/HtmlRenderer/Core/Entities/CssBlock.cs index 6c2626d58..caa9a04fd 100644 --- a/Source/HtmlRenderer/Entities/CssBlock.cs +++ b/Source/HtmlRenderer/Core/Entities/CssBlock.cs @@ -13,7 +13,7 @@ using System.Collections.Generic; using HtmlRenderer.Core.Utils; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Represents a block of CSS property values.
    diff --git a/Source/HtmlRenderer/Entities/CssBlockSelectorItem.cs b/Source/HtmlRenderer/Core/Entities/CssBlockSelectorItem.cs similarity index 98% rename from Source/HtmlRenderer/Entities/CssBlockSelectorItem.cs rename to Source/HtmlRenderer/Core/Entities/CssBlockSelectorItem.cs index aaaf2465f..0082f820e 100644 --- a/Source/HtmlRenderer/Entities/CssBlockSelectorItem.cs +++ b/Source/HtmlRenderer/Core/Entities/CssBlockSelectorItem.cs @@ -12,7 +12,7 @@ using HtmlRenderer.Core.Utils; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Holds single class selector in css block hierarchical selection (p class1 > div.class2) diff --git a/Source/HtmlRenderer/Entities/HtmlGenerationStyle.cs b/Source/HtmlRenderer/Core/Entities/HtmlGenerationStyle.cs similarity index 95% rename from Source/HtmlRenderer/Entities/HtmlGenerationStyle.cs rename to Source/HtmlRenderer/Core/Entities/HtmlGenerationStyle.cs index a2ddc3a69..90fb253a4 100644 --- a/Source/HtmlRenderer/Entities/HtmlGenerationStyle.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlGenerationStyle.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Controls the way styles are generated when html is generated. diff --git a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlImageLoadEventArgs.cs similarity index 99% rename from Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlImageLoadEventArgs.cs index 7458a5a49..8a6025ac4 100644 --- a/Source/HtmlRenderer/Entities/HtmlImageLoadEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlImageLoadEventArgs.cs @@ -12,9 +12,10 @@ using System; using System.Collections.Generic; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Utils; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Callback used in to allow setting image externally and async.
    diff --git a/Source/HtmlRenderer/Entities/HtmlLinkClickedEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlLinkClickedEventArgs.cs similarity index 98% rename from Source/HtmlRenderer/Entities/HtmlLinkClickedEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlLinkClickedEventArgs.cs index 0975aac1c..187393021 100644 --- a/Source/HtmlRenderer/Entities/HtmlLinkClickedEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlLinkClickedEventArgs.cs @@ -13,7 +13,7 @@ using System; using System.Collections.Generic; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Raised when the user clicks on a link in the html. diff --git a/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs b/Source/HtmlRenderer/Core/Entities/HtmlLinkClickedException.cs similarity index 97% rename from Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs rename to Source/HtmlRenderer/Core/Entities/HtmlLinkClickedException.cs index 7b5db7d79..bbba73c41 100644 --- a/Source/HtmlRenderer/Entities/HtmlLinkClickedException.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlLinkClickedException.cs @@ -12,7 +12,7 @@ using System; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Exception thrown when client code subscribed to LinkClicked event thrown exception. diff --git a/Source/HtmlRenderer/Entities/HtmlRefreshEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlRefreshEventArgs.cs similarity index 97% rename from Source/HtmlRenderer/Entities/HtmlRefreshEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlRefreshEventArgs.cs index 79c63839a..1068950fa 100644 --- a/Source/HtmlRenderer/Entities/HtmlRefreshEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlRefreshEventArgs.cs @@ -12,7 +12,7 @@ using System; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Raised when html renderer requires refresh of the control hosting (invalidation and re-layout).
    diff --git a/Source/HtmlRenderer/Entities/HtmlRenderErrorEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlRenderErrorEventArgs.cs similarity index 98% rename from Source/HtmlRenderer/Entities/HtmlRenderErrorEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlRenderErrorEventArgs.cs index 05e1b32ad..78e2d25ac 100644 --- a/Source/HtmlRenderer/Entities/HtmlRenderErrorEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlRenderErrorEventArgs.cs @@ -12,7 +12,7 @@ using System; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Raised when an error occurred during html rendering. diff --git a/Source/HtmlRenderer/Entities/HtmlRenderErrorType.cs b/Source/HtmlRenderer/Core/Entities/HtmlRenderErrorType.cs similarity index 94% rename from Source/HtmlRenderer/Entities/HtmlRenderErrorType.cs rename to Source/HtmlRenderer/Core/Entities/HtmlRenderErrorType.cs index ff33b3eef..e7317f603 100644 --- a/Source/HtmlRenderer/Entities/HtmlRenderErrorType.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlRenderErrorType.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Enum of possible error types that can be reported. diff --git a/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlScrollEventArgs.cs similarity index 94% rename from Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlScrollEventArgs.cs index 81c6cf415..a8d0ea89d 100644 --- a/Source/HtmlRenderer/Entities/HtmlScrollEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlScrollEventArgs.cs @@ -11,8 +11,9 @@ // "The Art of War" using System; +using HtmlRenderer.Adapters.Entities; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Raised when Html Renderer request scroll to specific location.
    diff --git a/Source/HtmlRenderer/Entities/HtmlStylesheetLoadEventArgs.cs b/Source/HtmlRenderer/Core/Entities/HtmlStylesheetLoadEventArgs.cs similarity index 98% rename from Source/HtmlRenderer/Entities/HtmlStylesheetLoadEventArgs.cs rename to Source/HtmlRenderer/Core/Entities/HtmlStylesheetLoadEventArgs.cs index 60dacae67..5550ad72d 100644 --- a/Source/HtmlRenderer/Entities/HtmlStylesheetLoadEventArgs.cs +++ b/Source/HtmlRenderer/Core/Entities/HtmlStylesheetLoadEventArgs.cs @@ -12,9 +12,8 @@ using System; using System.Collections.Generic; -using HtmlRenderer.Core; -namespace HtmlRenderer.Entities +namespace HtmlRenderer.Core.Entities { /// /// Invoked when a stylesheet is about to be loaded by file path or URL in 'link' element.
    diff --git a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs index ba97ecd9f..0b44cdbf4 100644 --- a/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BackgroundImageDrawHandler.cs @@ -11,9 +11,9 @@ // "The Art of War" using System; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Dom; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Handlers { diff --git a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs index ea1e41829..d2f9746a3 100644 --- a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs @@ -11,10 +11,10 @@ // "The Art of War" using System; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Dom; -using HtmlRenderer.Core.Entities; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Core.Utils; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Handlers { diff --git a/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs index 0e40f3ba5..d9fcc8fc3 100644 --- a/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ContextMenuHandler.cs @@ -14,9 +14,9 @@ using System.Globalization; using System.IO; using HtmlRenderer.Core.Dom; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Handlers { diff --git a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs b/Source/HtmlRenderer/Core/Handlers/FontsHandler.cs similarity index 97% rename from Source/HtmlRenderer/Core/Handlers/FontHandler.cs rename to Source/HtmlRenderer/Core/Handlers/FontsHandler.cs index 945e6da2d..6f47eaa33 100644 --- a/Source/HtmlRenderer/Core/Handlers/FontHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/FontsHandler.cs @@ -12,23 +12,23 @@ using System; using System.Collections.Generic; +using HtmlRenderer.Adapters; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; namespace HtmlRenderer.Core.Handlers { /// /// Utilities for fonts and fonts families handling. /// - internal sealed class FontHandler + internal sealed class FontsHandler { #region Fields and Consts /// /// /// - private readonly AdapterBase _adapter; + private readonly Adapter _adapter; /// /// Allow to map not installed fonts to different @@ -51,7 +51,7 @@ internal sealed class FontHandler /// /// Init. /// - public FontHandler(AdapterBase adapter) + public FontsHandler(Adapter adapter) { ArgChecker.AssertArgNotNull(adapter, "global"); diff --git a/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs index c2a1c5246..91238decb 100644 --- a/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/ImageLoadHandler.cs @@ -17,9 +17,10 @@ using System.Net; using System.Text; using System.Threading; +using HtmlRenderer.Adapters.Entities; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Handlers { diff --git a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs index 1b484cd9c..022b281f6 100644 --- a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs @@ -11,10 +11,11 @@ // "The Art of War" using System; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Dom; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Handlers { @@ -600,7 +601,7 @@ private bool SelectWordsInRange(CssBox box, CssRect selectionStart, CssRect sele /// /// Calculate the character index and offset by characters for the given word and given offset.
    - /// . + /// . ///
    /// used to create graphics to measure string /// the word to calculate its index and offset diff --git a/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs b/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs index 8dccdccd6..1ee9ef20b 100644 --- a/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/StylesheetLoadHandler.cs @@ -14,8 +14,8 @@ using System.Collections.Generic; using System.IO; using System.Net; +using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; namespace HtmlRenderer.Core.Handlers { diff --git a/Source/HtmlRenderer/Core/HtmlContainerInt.cs b/Source/HtmlRenderer/Core/HtmlContainerInt.cs index 8b368b5ba..d85ce8767 100644 --- a/Source/HtmlRenderer/Core/HtmlContainerInt.cs +++ b/Source/HtmlRenderer/Core/HtmlContainerInt.cs @@ -13,13 +13,13 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Dom; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Handlers; using HtmlRenderer.Core.Parse; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core { @@ -84,7 +84,7 @@ public sealed class HtmlContainerInt : IDisposable /// /// /// - private readonly AdapterBase _adapter; + private readonly Adapter _adapter; /// /// parser for CSS data @@ -175,7 +175,7 @@ public sealed class HtmlContainerInt : IDisposable /// /// Init. /// - public HtmlContainerInt(AdapterBase adapter) + public HtmlContainerInt(Adapter adapter) { ArgChecker.AssertArgNotNull(adapter, "global"); @@ -186,7 +186,7 @@ public HtmlContainerInt(AdapterBase adapter) /// /// /// - internal AdapterBase Adapter + internal Adapter Adapter { get { return _adapter; } } diff --git a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs index 32fd16a76..159b8be3f 100644 --- a/Source/HtmlRenderer/Core/HtmlRendererUtils.cs +++ b/Source/HtmlRenderer/Core/HtmlRendererUtils.cs @@ -11,8 +11,8 @@ // "The Art of War" using System; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters.Entities; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core { diff --git a/Source/HtmlRenderer/Core/Parse/CssParser.cs b/Source/HtmlRenderer/Core/Parse/CssParser.cs index fa7aeb071..deb7cc704 100644 --- a/Source/HtmlRenderer/Core/Parse/CssParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssParser.cs @@ -14,10 +14,10 @@ using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Parse { @@ -36,7 +36,7 @@ internal sealed class CssParser /// /// /// - private readonly AdapterBase _adapter; + private readonly Adapter _adapter; /// /// Utility for value parsing. @@ -54,7 +54,7 @@ internal sealed class CssParser /// /// Init. /// - public CssParser(AdapterBase adapter) + public CssParser(Adapter adapter) { ArgChecker.AssertArgNotNull(adapter, "global"); diff --git a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs index 70e4d12dd..7c51e4ca6 100644 --- a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs @@ -12,11 +12,10 @@ using System; using System.Globalization; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Dom; -using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Parse { @@ -30,7 +29,7 @@ internal sealed class CssValueParser /// /// /// - private readonly AdapterBase _adapter; + private readonly Adapter _adapter; #endregion @@ -38,7 +37,7 @@ internal sealed class CssValueParser /// /// Init. /// - public CssValueParser(AdapterBase adapter) + public CssValueParser(Adapter adapter) { ArgChecker.AssertArgNotNull(adapter, "global"); diff --git a/Source/HtmlRenderer/Core/Parse/DomParser.cs b/Source/HtmlRenderer/Core/Parse/DomParser.cs index e10d855fc..8adcf8445 100644 --- a/Source/HtmlRenderer/Core/Parse/DomParser.cs +++ b/Source/HtmlRenderer/Core/Parse/DomParser.cs @@ -12,11 +12,11 @@ using System; using System.Globalization; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Dom; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Handlers; using HtmlRenderer.Core.Utils; -using HtmlRenderer.Entities; namespace HtmlRenderer.Core.Parse { diff --git a/Source/HtmlRenderer/Core/Parse/HtmlParser.cs b/Source/HtmlRenderer/Core/Parse/HtmlParser.cs index b2707d757..93cf30a9a 100644 --- a/Source/HtmlRenderer/Core/Parse/HtmlParser.cs +++ b/Source/HtmlRenderer/Core/Parse/HtmlParser.cs @@ -13,7 +13,6 @@ using System; using System.Collections.Generic; using HtmlRenderer.Core.Dom; -using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; namespace HtmlRenderer.Core.Parse diff --git a/Source/HtmlRenderer/Core/Utils/CommonUtils.cs b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs index 7436baa4f..00e1656ea 100644 --- a/Source/HtmlRenderer/Core/Utils/CommonUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CommonUtils.cs @@ -16,8 +16,7 @@ using System.IO; using System.Net; using System.Text; -using HtmlRenderer.Core.Entities; -using HtmlRenderer.Entities; +using HtmlRenderer.Adapters.Entities; namespace HtmlRenderer.Core.Utils { diff --git a/Source/HtmlRenderer/Core/Entities/CssConstants.cs b/Source/HtmlRenderer/Core/Utils/CssConstants.cs similarity index 99% rename from Source/HtmlRenderer/Core/Entities/CssConstants.cs rename to Source/HtmlRenderer/Core/Utils/CssConstants.cs index 8fef9e9b5..300d17986 100644 --- a/Source/HtmlRenderer/Core/Entities/CssConstants.cs +++ b/Source/HtmlRenderer/Core/Utils/CssConstants.cs @@ -10,7 +10,7 @@ // - Sun Tsu, // "The Art of War" -namespace HtmlRenderer.Core.Entities +namespace HtmlRenderer.Core.Utils { /// /// String constants to avoid typing errors. diff --git a/Source/HtmlRenderer/Core/Utils/CssUtils.cs b/Source/HtmlRenderer/Core/Utils/CssUtils.cs index 9f4bf7f07..f773154e1 100644 --- a/Source/HtmlRenderer/Core/Utils/CssUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/CssUtils.cs @@ -11,11 +11,10 @@ // "The Art of War" using System; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Dom; -using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Parse; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Utils { diff --git a/Source/HtmlRenderer/Core/Utils/DomUtils.cs b/Source/HtmlRenderer/Core/Utils/DomUtils.cs index 7cbed0440..39c29a83f 100644 --- a/Source/HtmlRenderer/Core/Utils/DomUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/DomUtils.cs @@ -13,10 +13,10 @@ using System; using System.Collections.Generic; using System.Text; +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Dom; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Parse; -using HtmlRenderer.Entities; namespace HtmlRenderer.Core.Utils { diff --git a/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs b/Source/HtmlRenderer/Core/Utils/HtmlConstants.cs similarity index 99% rename from Source/HtmlRenderer/Core/Entities/HtmlConstants.cs rename to Source/HtmlRenderer/Core/Utils/HtmlConstants.cs index 9e07b5377..b597ae18c 100644 --- a/Source/HtmlRenderer/Core/Entities/HtmlConstants.cs +++ b/Source/HtmlRenderer/Core/Utils/HtmlConstants.cs @@ -1,4 +1,4 @@ -namespace HtmlRenderer.Core.Entities +namespace HtmlRenderer.Core.Utils { /// /// Defines HTML strings diff --git a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs index 4d3093733..e3a12d729 100644 --- a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs @@ -10,10 +10,9 @@ // - Sun Tsu, // "The Art of War" +using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Dom; -using HtmlRenderer.Core.Entities; -using HtmlRenderer.Entities; -using HtmlRenderer.Interfaces; +using HtmlRenderer.Adapters; namespace HtmlRenderer.Core.Utils { diff --git a/Source/HtmlRenderer/HtmlRenderer.csproj b/Source/HtmlRenderer/HtmlRenderer.csproj index a75e7bc34..706a941e7 100644 --- a/Source/HtmlRenderer/HtmlRenderer.csproj +++ b/Source/HtmlRenderer/HtmlRenderer.csproj @@ -43,6 +43,7 @@ Properties\SharedAssemblyInfo.cs + @@ -56,17 +57,25 @@ + + - - - - - - + + + + + + + + + + + + - + @@ -78,41 +87,32 @@ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + From 21fcc38e32d26feaf72456972f29909d5d71fc8d Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Mon, 5 May 2014 19:47:47 +0300 Subject: [PATCH 062/254] HtmlRender.PdfSharp creates pdfs! --- .../HtmlRenderer.Demo.WinForms.csproj | 22 +++ Source/Demo/WinForms/Program.cs | 10 ++ Source/Demo/WinForms/Resource1.Designer.cs | 81 ++++++++++ Source/Demo/WinForms/Resource1.resx | 140 ++++++++++++++++++ Source/Demo/WinForms/packages.config | 4 + .../Adapters/GraphicsAdapter.cs | 19 ++- .../Adapters/PdfSharpAdapter.cs | 14 +- Source/HtmlRenderer.PdfSharp/HtmlContainer.cs | 2 + Source/HtmlRenderer.PdfSharp/PdfGenerator.cs | 35 ++++- .../HtmlRenderer.PdfSharp/Utilities/Utils.cs | 3 +- 10 files changed, 319 insertions(+), 11 deletions(-) create mode 100644 Source/Demo/WinForms/Resource1.Designer.cs create mode 100644 Source/Demo/WinForms/Resource1.resx create mode 100644 Source/Demo/WinForms/packages.config diff --git a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj index 7b12011c3..46da5c3b2 100644 --- a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj @@ -60,6 +60,12 @@ html.ico + + ..\..\packages\PDFsharp.1.32.3057.0\lib\net20\PdfSharp.dll + + + ..\..\packages\PDFsharp.1.32.3057.0\lib\net20\PdfSharp.Charting.dll + @@ -90,6 +96,11 @@ Designer DemoForm.cs + + True + True + Resource1.resx + Form @@ -98,6 +109,10 @@ + + ResXFileCodeGenerator + Resource1.Designer.cs + Designer SampleForm.cs @@ -121,6 +136,10 @@ + + {ca249f5d-9285-40a6-b217-5889ef79fd7e} + HtmlRenderer.PdfSharp + {1b058920-24b4-4140-8ae7-c8c6c38ca52d} HtmlRenderer.WinForms @@ -137,6 +156,9 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <body style="font: 10pt Tahoma"> + <h3 style="color: navy; margin-bottom: 8px">Render to Image</h3> + <hr /> + <table style="border: 1px solid maroon; margin-top: 5px"> + <tr style="vertical-align: top;"> + <td width="32" style="padding: 2px 0 0 0"> + <img src="http://download-codeplex.sec.s-msft.com/Download?ProjectName=HtmlRenderer&DownloadId=770243" /> + </td> + <td>This <i>text</i> is inside a <b>table</b> <u>element</u>.<br /> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis elit. + </td> + </tr> + </table> + <ul style="margin-top: 5px"> + <li><span style="color: red">Colors</span></li> + <li><span style="background-color: #8dd">Back colors</span></li> + </ul> +</body> + + \ No newline at end of file diff --git a/Source/Demo/WinForms/packages.config b/Source/Demo/WinForms/packages.config new file mode 100644 index 000000000..0dec73c8f --- /dev/null +++ b/Source/Demo/WinForms/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs index 497014c16..3b8890419 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/GraphicsAdapter.cs @@ -38,9 +38,22 @@ internal sealed class GraphicsAdapter : RGraphics /// private readonly bool _releaseGraphics; + /// + /// Used to measure and draw strings + /// + private static readonly XStringFormat _stringFormat; + #endregion + static GraphicsAdapter() + { + _stringFormat = new XStringFormat(); + _stringFormat.Alignment = XStringAlignment.Near; + _stringFormat.LineAlignment = XLineAlignment.Near; + _stringFormat.FormatFlags = XStringFormatFlags.MeasureTrailingSpaces; + } + /// /// Init. /// @@ -90,7 +103,7 @@ public override RSize MeasureString(string str, RFont font) { var fontAdapter = (FontAdapter)font; var realFont = fontAdapter.Font; - var size = _g.MeasureString(str, realFont); + var size = _g.MeasureString(str, realFont, _stringFormat); if (font.Height < 0) { @@ -109,8 +122,8 @@ public override RSize MeasureString(string str, RFont font, double maxWidth, out public override void DrawString(string str, RFont font, RColor color, RPoint point, RSize size, bool rtl) { - var brush = new XSolidBrush(Utils.Convert(color)); - _g.DrawString(str, ((FontAdapter)font).Font, brush, point.X - font.LeftPadding * .8f, point.Y); + var xBrush = ((BrushAdapter)_adapter.GetSolidBrush(color)).Brush; + _g.DrawString(str, ((FontAdapter)font).Font, xBrush, point.X, point.Y, _stringFormat); } public override RBrush GetLinearGradientBrush(RRect rect, RColor color1, RColor color2, double angle) diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs index 61854358d..9641426a4 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs @@ -64,12 +64,22 @@ protected override RColor GetColorInt(string colorName) protected override RPen CreatePen(RColor color) { - return null; + return new PenAdapter(new XPen(Utils.Convert(color))); } protected override RBrush CreateSolidBrush(RColor color) { - return null; + XBrush solidBrush; + if (color == RColor.White) + solidBrush = XBrushes.White; + else if (color == RColor.Black) + solidBrush = XBrushes.Black; + else if (color.A < 1) + solidBrush = XBrushes.Transparent; + else + solidBrush = new XSolidBrush(Utils.Convert(color)); + + return new BrushAdapter(solidBrush); } protected override RImage ConvertImageInt(object image) diff --git a/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs b/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs index 8763dea2e..70c8526fe 100644 --- a/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs +++ b/Source/HtmlRenderer.PdfSharp/HtmlContainer.cs @@ -42,6 +42,8 @@ public sealed class HtmlContainer : IDisposable public HtmlContainer() { _htmlContainerInt = new HtmlContainerInt(PdfSharpAdapter.Instance); + _htmlContainerInt.AvoidAsyncImagesLoading = true; + _htmlContainerInt.AvoidImagesLateLoading = true; } /// diff --git a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs index e08674e8b..8dfe07cb7 100644 --- a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs +++ b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs @@ -10,6 +10,9 @@ // - Sun Tsu, // "The Art of War" +using System; +using HtmlRenderer.Core; +using HtmlRenderer.Core.Entities; using PdfSharp; using PdfSharp.Drawing; using PdfSharp.Pdf; @@ -21,16 +24,38 @@ namespace HtmlRenderer.PdfSharp /// public static class PdfGenerator { - public static PdfDocument GeneratePdf(string html, PageSize pageSize) + public static PdfDocument GeneratePdf(string html, PageSize pageSize, int margin = 25, CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { + var document = new PdfDocument(); + document.Settings.TrimMargins.All = XUnit.FromPoint(margin); var size = PageSizeConverter.ToSize(pageSize); - using (var measure = XGraphics.CreateMeasureContext(size, XGraphicsUnit.Point, XPageDirection.Downwards)) - { } + if (!string.IsNullOrEmpty(html)) + { + using (var container = new HtmlContainer()) + { + if (stylesheetLoad != null) + container.StylesheetLoad += stylesheetLoad; + if (imageLoad != null) + container.ImageLoad += imageLoad; - var document = new PdfDocument(); + container.MaxSize = new XSize(size.Width, 0); + + container.SetHtml(html, cssData); + + using (var measure = XGraphics.CreateMeasureContext(size, XGraphicsUnit.Point, XPageDirection.Downwards)) + { + container.PerformLayout(measure); + } - var page = document.AddPage(); + var page = document.AddPage(); + page.Size = pageSize; + using (var g = XGraphics.FromPdfPage(page)) + { + container.PerformPaint(g); + } + } + } return document; } diff --git a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs index d50339303..97a6c5aa0 100644 --- a/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs +++ b/Source/HtmlRenderer.PdfSharp/Utilities/Utils.cs @@ -84,7 +84,8 @@ public static XRect Convert(RRect r) /// public static RColor Convert(XColor c) { - return RColor.FromArgb((int)c.A, c.R, c.G, c.B); + var gc = c.ToGdiColor(); + return RColor.FromArgb(gc.A, gc.R, gc.G, gc.B); } /// From 05caef98280ec30e74ae2013827e8c4f683e0885 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Mon, 5 May 2014 21:02:28 +0300 Subject: [PATCH 063/254] improve demo application --- Source/Demo/WinForms/DemoForm.Designer.cs | 329 +++++------- Source/Demo/WinForms/DemoForm.cs | 462 ++-------------- Source/Demo/WinForms/DemoForm.resx | 95 +++- .../HtmlRenderer.Demo.WinForms.csproj | 34 +- Source/Demo/WinForms/MainControl.Designer.cs | 202 +++++++ Source/Demo/WinForms/MainControl.cs | 494 ++++++++++++++++++ Source/Demo/WinForms/MainControl.resx | 123 +++++ .../{ => Properties}/Resource1.Designer.cs | 14 +- .../WinForms/{ => Properties}/Resource1.resx | 4 + .../WinForms/Properties/Resources.Designer.cs | 103 ++++ .../Demo/WinForms/Properties/Resources.resx | 133 +++++ Source/Demo/WinForms/Resources/IE.png | Bin 0 -> 1407 bytes Source/Demo/WinForms/Resources/chrome.png | Bin 0 -> 1420 bytes Source/Demo/WinForms/Resources/pdf.png | Bin 0 -> 413 bytes Source/Demo/WinForms/Resources/stopwatch.png | Bin 0 -> 528 bytes 15 files changed, 1345 insertions(+), 648 deletions(-) create mode 100644 Source/Demo/WinForms/MainControl.Designer.cs create mode 100644 Source/Demo/WinForms/MainControl.cs create mode 100644 Source/Demo/WinForms/MainControl.resx rename Source/Demo/WinForms/{ => Properties}/Resource1.Designer.cs (88%) rename Source/Demo/WinForms/{ => Properties}/Resource1.resx (94%) create mode 100644 Source/Demo/WinForms/Properties/Resources.Designer.cs create mode 100644 Source/Demo/WinForms/Properties/Resources.resx create mode 100644 Source/Demo/WinForms/Resources/IE.png create mode 100644 Source/Demo/WinForms/Resources/chrome.png create mode 100644 Source/Demo/WinForms/Resources/pdf.png create mode 100644 Source/Demo/WinForms/Resources/stopwatch.png diff --git a/Source/Demo/WinForms/DemoForm.Designer.cs b/Source/Demo/WinForms/DemoForm.Designer.cs index 06bedac96..dcd60b384 100644 --- a/Source/Demo/WinForms/DemoForm.Designer.cs +++ b/Source/Demo/WinForms/DemoForm.Designer.cs @@ -30,245 +30,152 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this._splitContainer1 = new System.Windows.Forms.SplitContainer(); - this._showGeneratedHtmlCB = new System.Windows.Forms.CheckBox(); - this._openExternalViewButton = new System.Windows.Forms.Button(); - this._toggleWebBrowserButton = new System.Windows.Forms.Button(); - this._runTestButton = new System.Windows.Forms.Button(); - this._samplesTreeView = new System.Windows.Forms.TreeView(); - this._splitContainer2 = new System.Windows.Forms.SplitContainer(); - this._htmlPanel = new HtmlPanel(); - this._splitter = new System.Windows.Forms.Splitter(); - this._webBrowser = new System.Windows.Forms.WebBrowser(); - this._reloadColorsLink = new System.Windows.Forms.LinkLabel(); - this._htmlEditor = new System.Windows.Forms.RichTextBox(); - this._htmlToolTip = new HtmlToolTip(); - this._splitContainer1.Panel1.SuspendLayout(); - this._splitContainer1.Panel2.SuspendLayout(); - this._splitContainer1.SuspendLayout(); - this._splitContainer2.Panel1.SuspendLayout(); - this._splitContainer2.Panel2.SuspendLayout(); - this._splitContainer2.SuspendLayout(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DemoForm)); + this._toolStrip = new System.Windows.Forms.ToolStrip(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this._mainControl = new HtmlRenderer.Demo.WinForms.MainControl(); + this._openSampleFormTSB = new System.Windows.Forms.ToolStripButton(); + this._showIEViewTSSB = new System.Windows.Forms.ToolStripButton(); + this._openInExternalViewTSB = new System.Windows.Forms.ToolStripButton(); + this._useGeneratedHtmlTSB = new System.Windows.Forms.ToolStripButton(); + this._generatePdfTSB = new System.Windows.Forms.ToolStripButton(); + this._runPerformanceTSB = new System.Windows.Forms.ToolStripButton(); + this._toolStrip.SuspendLayout(); this.SuspendLayout(); // - // _splitContainer1 + // _toolStrip // - this._splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this._splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; - this._splitContainer1.Location = new System.Drawing.Point(4, 4); - this._splitContainer1.Name = "_splitContainer1"; + this._toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this._openSampleFormTSB, + this.toolStripSeparator3, + this._showIEViewTSSB, + this._openInExternalViewTSB, + this._useGeneratedHtmlTSB, + this.toolStripSeparator1, + this._generatePdfTSB, + this.toolStripSeparator2, + this._runPerformanceTSB}); + this._toolStrip.Location = new System.Drawing.Point(4, 4); + this._toolStrip.Name = "_toolStrip"; + this._toolStrip.Size = new System.Drawing.Size(878, 25); + this._toolStrip.TabIndex = 1; // - // _splitContainer1.Panel1 + // toolStripSeparator3 // - this._splitContainer1.Panel1.Controls.Add(this._showGeneratedHtmlCB); - this._splitContainer1.Panel1.Controls.Add(this._openExternalViewButton); - this._splitContainer1.Panel1.Controls.Add(this._toggleWebBrowserButton); - this._splitContainer1.Panel1.Controls.Add(this._runTestButton); - this._splitContainer1.Panel1.Controls.Add(this._samplesTreeView); + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25); // - // _splitContainer1.Panel2 + // toolStripSeparator1 // - this._splitContainer1.Panel2.Controls.Add(this._splitContainer2); - this._splitContainer1.Size = new System.Drawing.Size(667, 439); - this._splitContainer1.SplitterDistance = 146; - this._splitContainer1.TabIndex = 0; - this._splitContainer1.TabStop = false; + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); // - // _showGeneratedHtmlCB + // toolStripSeparator2 // - this._showGeneratedHtmlCB.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this._showGeneratedHtmlCB.AutoSize = true; - this._showGeneratedHtmlCB.BackColor = System.Drawing.Color.White; - this._showGeneratedHtmlCB.Location = new System.Drawing.Point(6, 330); - this._showGeneratedHtmlCB.Name = "_showGeneratedHtmlCB"; - this._showGeneratedHtmlCB.Size = new System.Drawing.Size(137, 17); - this._showGeneratedHtmlCB.TabIndex = 16; - this._showGeneratedHtmlCB.Text = "Show generated HTML"; - this._showGeneratedHtmlCB.UseVisualStyleBackColor = false; - this._showGeneratedHtmlCB.CheckedChanged += new System.EventHandler(this.OnShowGeneratedHtmlCheckedChanged); + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); // - // _openExternalViewButton + // _mainControl // - this._openExternalViewButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + this._mainControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this._openExternalViewButton.Location = new System.Drawing.Point(4, 382); - this._openExternalViewButton.Name = "_openExternalViewButton"; - this._openExternalViewButton.Size = new System.Drawing.Size(138, 23); - this._openExternalViewButton.TabIndex = 13; - this._openExternalViewButton.TabStop = false; - this._openExternalViewButton.Text = "Open External View"; - this._openExternalViewButton.UseVisualStyleBackColor = true; - this._openExternalViewButton.Click += new System.EventHandler(this.OnOpenExternalViewButtonClick); - // - // _toggleWebBrowserButton - // - this._toggleWebBrowserButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this._toggleWebBrowserButton.Location = new System.Drawing.Point(4, 353); - this._toggleWebBrowserButton.Name = "_toggleWebBrowserButton"; - this._toggleWebBrowserButton.Size = new System.Drawing.Size(138, 23); - this._toggleWebBrowserButton.TabIndex = 13; - this._toggleWebBrowserButton.TabStop = false; - this._toggleWebBrowserButton.Text = "Show IE View"; - this._toggleWebBrowserButton.UseVisualStyleBackColor = true; - this._toggleWebBrowserButton.Click += new System.EventHandler(this.OnToggleWebBrowserButton_Click); - // - // _runTestButton - // - this._runTestButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this._runTestButton.Location = new System.Drawing.Point(4, 411); - this._runTestButton.Name = "_runTestButton"; - this._runTestButton.Size = new System.Drawing.Size(138, 23); - this._runTestButton.TabIndex = 15; - this._runTestButton.TabStop = false; - this._runTestButton.Text = "Run Performance Test"; - this._runTestButton.UseVisualStyleBackColor = true; - this._runTestButton.Click += new System.EventHandler(this.OnRunTestButtonClick); - // - // _samplesTreeView - // - this._samplesTreeView.Dock = System.Windows.Forms.DockStyle.Fill; - this._samplesTreeView.HideSelection = false; - this._samplesTreeView.Location = new System.Drawing.Point(0, 0); - this._samplesTreeView.Name = "_samplesTreeView"; - this._samplesTreeView.Size = new System.Drawing.Size(146, 439); - this._samplesTreeView.TabIndex = 14; - this._samplesTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.OnSamplesTreeViewAfterSelect); - // - // _splitContainer2 - // - this._splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; - this._splitContainer2.Location = new System.Drawing.Point(0, 0); - this._splitContainer2.Name = "_splitContainer2"; - this._splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; - // - // _splitContainer2.Panel1 - // - this._splitContainer2.Panel1.Controls.Add(this._htmlPanel); - this._splitContainer2.Panel1.Controls.Add(this._splitter); - this._splitContainer2.Panel1.Controls.Add(this._webBrowser); - // - // _splitContainer2.Panel2 - // - this._splitContainer2.Panel2.Controls.Add(this._reloadColorsLink); - this._splitContainer2.Panel2.Controls.Add(this._htmlEditor); - this._splitContainer2.Size = new System.Drawing.Size(517, 439); - this._splitContainer2.SplitterDistance = 354; - this._splitContainer2.TabIndex = 13; - this._splitContainer2.TabStop = false; - // - // _htmlPanel - // - this._htmlPanel.AutoScroll = true; - this._htmlPanel.AvoidGeometryAntialias = false; - this._htmlPanel.AvoidImagesLateLoading = false; - this._htmlPanel.BackColor = System.Drawing.SystemColors.Window; - this._htmlPanel.BaseStylesheet = null; - this._htmlPanel.Dock = System.Windows.Forms.DockStyle.Fill; - this._htmlPanel.Location = new System.Drawing.Point(0, 0); - this._htmlPanel.Name = "_htmlPanel"; - this._htmlPanel.Padding = new System.Windows.Forms.Padding(0, 4, 0, 0); - this._htmlPanel.Size = new System.Drawing.Size(273, 354); - this._htmlPanel.TabIndex = 8; - this._htmlPanel.Text = null; - this._htmlPanel.UseGdiPlusTextRendering = false; - this._htmlPanel.UseSystemCursors = true; - // - // _splitter - // - this._splitter.Dock = System.Windows.Forms.DockStyle.Right; - this._splitter.Location = new System.Drawing.Point(273, 0); - this._splitter.Name = "_splitter"; - this._splitter.Size = new System.Drawing.Size(3, 354); - this._splitter.TabIndex = 9; - this._splitter.TabStop = false; - this._splitter.Visible = false; - // - // _webBrowser - // - this._webBrowser.Dock = System.Windows.Forms.DockStyle.Right; - this._webBrowser.Location = new System.Drawing.Point(276, 0); - this._webBrowser.MinimumSize = new System.Drawing.Size(20, 20); - this._webBrowser.Name = "_webBrowser"; - this._webBrowser.Size = new System.Drawing.Size(241, 354); - this._webBrowser.TabIndex = 7; - this._webBrowser.Visible = false; - // - // _reloadColorsLink - // - this._reloadColorsLink.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this._reloadColorsLink.AutoSize = true; - this._reloadColorsLink.BackColor = System.Drawing.Color.White; - this._reloadColorsLink.Location = new System.Drawing.Point(454, 65); - this._reloadColorsLink.Name = "_reloadColorsLink"; - this._reloadColorsLink.Size = new System.Drawing.Size(44, 13); - this._reloadColorsLink.TabIndex = 8; - this._reloadColorsLink.TabStop = true; - this._reloadColorsLink.Text = "Refresh"; - this._reloadColorsLink.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnReloadColorsLinkClicked); - // - // _htmlEditor - // - this._htmlEditor.Dock = System.Windows.Forms.DockStyle.Fill; - this._htmlEditor.Location = new System.Drawing.Point(0, 0); - this._htmlEditor.Name = "_htmlEditor"; - this._htmlEditor.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical; - this._htmlEditor.Size = new System.Drawing.Size(517, 81); - this._htmlEditor.TabIndex = 7; - this._htmlEditor.Text = ""; - this._htmlEditor.TextChanged += new System.EventHandler(this.OnHtmlEditorTextChanged); - // - // _htmlToolTip - // - this._htmlToolTip.AllowLinksHandling = true; - this._htmlToolTip.AutoPopDelay = 15000; - this._htmlToolTip.BaseStylesheet = null; - this._htmlToolTip.InitialDelay = 500; - this._htmlToolTip.MaximumSize = new System.Drawing.Size(0, 0); - this._htmlToolTip.OwnerDraw = true; - this._htmlToolTip.ReshowDelay = 100; - this._htmlToolTip.TooltipCssClass = "htmltooltip"; - this._htmlToolTip.UseGdiPlusTextRendering = false; + this._mainControl.Location = new System.Drawing.Point(4, 32); + this._mainControl.Name = "_mainControl"; + this._mainControl.Size = new System.Drawing.Size(878, 594); + this._mainControl.TabIndex = 2; + this._mainControl.UpdateLock = false; + this._mainControl.UseGeneratedHtml = false; + // + // _openSampleFormTSB + // + this._openSampleFormTSB.Image = ((System.Drawing.Image)(resources.GetObject("_openSampleFormTSB.Image"))); + this._openSampleFormTSB.ImageTransparentColor = System.Drawing.Color.Magenta; + this._openSampleFormTSB.Name = "_openSampleFormTSB"; + this._openSampleFormTSB.Size = new System.Drawing.Size(129, 22); + this._openSampleFormTSB.Text = "Open Sample Form"; + this._openSampleFormTSB.Click += new System.EventHandler(this.OnOpenSampleForm_Click); + // + // _showIEViewTSSB + // + this._showIEViewTSSB.Image = ((System.Drawing.Image)(resources.GetObject("_showIEViewTSSB.Image"))); + this._showIEViewTSSB.ImageTransparentColor = System.Drawing.Color.Magenta; + this._showIEViewTSSB.Name = "_showIEViewTSSB"; + this._showIEViewTSSB.Size = new System.Drawing.Size(96, 22); + this._showIEViewTSSB.Text = "Show IE View"; + this._showIEViewTSSB.Click += new System.EventHandler(this.OnShowIEView_ButtonClick); + // + // _openInExternalViewTSB + // + this._openInExternalViewTSB.Image = ((System.Drawing.Image)(resources.GetObject("_openInExternalViewTSB.Image"))); + this._openInExternalViewTSB.ImageTransparentColor = System.Drawing.Color.Magenta; + this._openInExternalViewTSB.Name = "_openInExternalViewTSB"; + this._openInExternalViewTSB.Size = new System.Drawing.Size(141, 22); + this._openInExternalViewTSB.Text = "Open in External View"; + this._openInExternalViewTSB.Click += new System.EventHandler(this.OnOpenInExternalView_Click); + // + // _useGeneratedHtmlTSB + // + this._useGeneratedHtmlTSB.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this._useGeneratedHtmlTSB.Image = ((System.Drawing.Image)(resources.GetObject("_useGeneratedHtmlTSB.Image"))); + this._useGeneratedHtmlTSB.ImageTransparentColor = System.Drawing.Color.Magenta; + this._useGeneratedHtmlTSB.Name = "_useGeneratedHtmlTSB"; + this._useGeneratedHtmlTSB.Size = new System.Drawing.Size(23, 22); + this._useGeneratedHtmlTSB.Text = "Use Generated HTML"; + this._useGeneratedHtmlTSB.Click += new System.EventHandler(this.OnUseGeneratedHtml_Click); + // + // _generatePdfTSB + // + this._generatePdfTSB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.pdf; + this._generatePdfTSB.ImageTransparentColor = System.Drawing.Color.Magenta; + this._generatePdfTSB.Name = "_generatePdfTSB"; + this._generatePdfTSB.Size = new System.Drawing.Size(98, 22); + this._generatePdfTSB.Text = "Generate PDF"; + this._generatePdfTSB.Click += new System.EventHandler(this.OnGeneratePdf_Click); + // + // _runPerformanceTSB + // + this._runPerformanceTSB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.stopwatch; + this._runPerformanceTSB.ImageTransparentColor = System.Drawing.Color.Magenta; + this._runPerformanceTSB.Name = "_runPerformanceTSB"; + this._runPerformanceTSB.Size = new System.Drawing.Size(119, 22); + this._runPerformanceTSB.Text = "Run Performance"; + this._runPerformanceTSB.Click += new System.EventHandler(this.OnRunPerformance_Click); // // DemoForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(191)))), ((int)(((byte)(219)))), ((int)(((byte)(255))))); - this.ClientSize = new System.Drawing.Size(675, 447); - this.Controls.Add(this._splitContainer1); + this.ClientSize = new System.Drawing.Size(886, 630); + this.Controls.Add(this._mainControl); + this.Controls.Add(this._toolStrip); this.KeyPreview = true; this.Name = "DemoForm"; this.Padding = new System.Windows.Forms.Padding(4); this.Text = "HTML Renderer Demo"; - this._splitContainer1.Panel1.ResumeLayout(false); - this._splitContainer1.Panel1.PerformLayout(); - this._splitContainer1.Panel2.ResumeLayout(false); - this._splitContainer1.ResumeLayout(false); - this._splitContainer2.Panel1.ResumeLayout(false); - this._splitContainer2.Panel2.ResumeLayout(false); - this._splitContainer2.Panel2.PerformLayout(); - this._splitContainer2.ResumeLayout(false); + this._toolStrip.ResumeLayout(false); + this._toolStrip.PerformLayout(); this.ResumeLayout(false); + this.PerformLayout(); } #endregion - private System.Windows.Forms.SplitContainer _splitContainer1; - private System.Windows.Forms.Button _toggleWebBrowserButton; - private System.Windows.Forms.Button _runTestButton; - private System.Windows.Forms.TreeView _samplesTreeView; - private System.Windows.Forms.SplitContainer _splitContainer2; - private HtmlPanel _htmlPanel; - private System.Windows.Forms.Splitter _splitter; - private System.Windows.Forms.WebBrowser _webBrowser; - private System.Windows.Forms.RichTextBox _htmlEditor; - private HtmlToolTip _htmlToolTip; - private System.Windows.Forms.Button _openExternalViewButton; - private System.Windows.Forms.CheckBox _showGeneratedHtmlCB; - private System.Windows.Forms.LinkLabel _reloadColorsLink; + private System.Windows.Forms.ToolStrip _toolStrip; + private System.Windows.Forms.ToolStripButton _generatePdfTSB; + private MainControl _mainControl; + private System.Windows.Forms.ToolStripButton _openInExternalViewTSB; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton _runPerformanceTSB; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripButton _openSampleFormTSB; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripButton _showIEViewTSSB; + private System.Windows.Forms.ToolStripButton _useGeneratedHtmlTSB; } } diff --git a/Source/Demo/WinForms/DemoForm.cs b/Source/Demo/WinForms/DemoForm.cs index 918be57c9..01e6035ca 100644 --- a/Source/Demo/WinForms/DemoForm.cs +++ b/Source/Demo/WinForms/DemoForm.cs @@ -14,53 +14,23 @@ using System.Collections.Generic; using System.Diagnostics; using System.Drawing; -using System.Drawing.Imaging; -using System.Drawing.Text; using System.IO; -using System.Text.RegularExpressions; -using System.Threading; using System.Windows.Forms; -using HtmlRenderer.Core.Entities; using HtmlRenderer.Demo.Common; -using HtmlRenderer.WinForms; -using Timer = System.Threading.Timer; +using HtmlRenderer.PdfSharp; +using PdfSharp; namespace HtmlRenderer.Demo.WinForms { public partial class DemoForm : Form { - #region Fields and Consts - - /// - /// the name of the tree node root for all performance samples - /// - private const string PerformanceSamplesTreeNodeName = "Performance Samples"; - - /// - /// Cache for resource images - /// - private readonly Dictionary _imageCache = new Dictionary(StringComparer.OrdinalIgnoreCase); - - /// - /// the private font used for the demo - /// - private readonly PrivateFontCollection _privateFont = new PrivateFontCollection(); + #region Fields/Consts /// /// the html samples used for performance testing /// private readonly List _perfTestSamples = new List(); - /// - /// timer to update the rendered html when html in editor changes with delay - /// - private readonly Timer _updateHtmlTimer; - - /// - /// used ignore html editor updates when updating seperatly - /// - private bool _updateLock; - #endregion @@ -73,441 +43,78 @@ public DemoForm() Icon = GetIcon(); - _htmlPanel.RenderError += OnRenderError; - _htmlPanel.LinkClicked += OnLinkClicked; - _htmlPanel.StylesheetLoad += OnStylesheetLoad; - _htmlPanel.ImageLoad += OnImageLoad; - _htmlToolTip.ImageLoad += OnImageLoad; - - _htmlToolTip.SetToolTip(_htmlPanel, Resources.Tooltip); - - _htmlEditor.Font = new Font(FontFamily.GenericMonospace, 10); - StartPosition = FormStartPosition.CenterScreen; var size = Screen.GetWorkingArea(Point.Empty); Size = new Size((int)(size.Width * 0.7), (int)(size.Height * 0.8)); - LoadSamples(); - - LoadCustomFonts(); - - _updateHtmlTimer = new Timer(OnUpdateHtmlTimerTick); - } - - /// - /// Get icon for the demo. - /// - internal static Icon GetIcon() - { - var stream = typeof(DemoForm).Assembly.GetManifestResourceStream("HtmlRenderer.Demo.WinForms.html.ico"); - return stream != null ? new Icon(stream) : null; - } - - - #region Private methods - - /// - /// Loads the tree of document samples - /// - private void LoadSamples() - { - var showcaseRoot = new TreeNode("HTML Renderer"); - _samplesTreeView.Nodes.Add(showcaseRoot); - foreach (var sample in SamplesLoader.ShowcaseSamples) { _perfTestSamples.Add(sample.Html); - AddTreeNode(showcaseRoot, sample); - } - - var testSamplesRoot = new TreeNode("Test Samples"); - _samplesTreeView.Nodes.Add(testSamplesRoot); - - foreach (var sample in SamplesLoader.TestSamples) - { - AddTreeNode(testSamplesRoot, sample); - } - - if (SamplesLoader.PerformanceSamples.Count > 0) - { - var perfTestSamplesRoot = new TreeNode(PerformanceSamplesTreeNodeName); - _samplesTreeView.Nodes.Add(perfTestSamplesRoot); - - foreach (var sample in SamplesLoader.PerformanceSamples) - { - AddTreeNode(perfTestSamplesRoot, sample); - } - } - - showcaseRoot.Expand(); - - if (showcaseRoot.Nodes.Count > 0) - { - _samplesTreeView.SelectedNode = showcaseRoot.Nodes[0]; } } /// - /// Add an html sample to the tree and to all samples collection - /// - private void AddTreeNode(TreeNode root, HtmlSample sample) - { - var html = sample.Html.Replace("$$Release$$", _htmlPanel.GetType().Assembly.GetName().Version.ToString()); - - var node = new TreeNode(sample.Name); - node.Tag = new HtmlSample(sample.Name, sample.FullName, html); - root.Nodes.Add(node); - } - - /// - /// Load custom fonts to be used by renderer htmls + /// Get icon for the demo. /// - private void LoadCustomFonts() + internal static Icon GetIcon() { - // load custom font font into private fonts collection - var file = Path.GetTempFileName(); - File.WriteAllBytes(file, Resources.CustomFont); - _privateFont.AddFontFile(file); - - // add the fonts to renderer - foreach (var fontFamily in _privateFont.Families) - { - HtmlRender.AddFontFamily(fontFamily); - } + var stream = typeof(DemoForm).Assembly.GetManifestResourceStream("HtmlRenderer.Demo.WinForms.html.ico"); + return stream != null ? new Icon(stream) : null; } - /// - /// On tree view node click load the html to the html panel and html editor. - /// - private void OnSamplesTreeViewAfterSelect(object sender, TreeViewEventArgs e) + private void OnOpenSampleForm_Click(object sender, EventArgs e) { - var sample = e.Node.Tag as HtmlSample; - if (sample != null) + using (var f = new SampleForm()) { - _updateLock = true; - - if (e.Node.Parent.Text != PerformanceSamplesTreeNodeName) - SetColoredText(sample.Html); - else - _htmlEditor.Text = sample.Html; - - Application.UseWaitCursor = true; - - try - { - _htmlPanel.AvoidImagesLateLoading = !sample.FullName.Contains("Many images"); - - _htmlPanel.Text = sample.Html; - } - catch (Exception ex) - { - MessageBox.Show(ex.ToString(), "Failed to render HTML"); - } - - Application.UseWaitCursor = false; - _updateLock = false; - - UpdateWebBrowserHtml(); + f.ShowDialog(); } } - /// - /// On text change in the html editor update - /// - private void OnHtmlEditorTextChanged(object sender, EventArgs e) + private void OnShowIEView_ButtonClick(object sender, EventArgs e) { - if (!_updateLock) - { - _updateHtmlTimer.Change(1000, int.MaxValue); - } - } - - /// - /// Update the html renderer with text from html editor. - /// - private void OnUpdateHtmlTimerTick(object state) - { - BeginInvoke(new MethodInvoker(() => - { - _updateLock = true; - - try - { - _htmlPanel.Text = _htmlEditor.Text; - } - catch (Exception ex) - { - MessageBox.Show(ex.ToString(), "Failed to render HTML"); - } - - //SyntaxHilight.AddColoredText(_htmlEditor.Text, _htmlEditor); - - UpdateWebBrowserHtml(); - - _updateLock = false; - })); + _showIEViewTSSB.Checked = !_showIEViewTSSB.Checked; + _mainControl.ShowWebBrowserView(_showIEViewTSSB.Checked); } /// /// Open the current html is external process - the default user browser. /// - private void OnOpenExternalViewButtonClick(object sender, EventArgs e) + private void OnOpenInExternalView_Click(object sender, EventArgs e) { - var html = _showGeneratedHtmlCB.Checked ? _htmlPanel.GetHtml() : _htmlEditor.Text; var tmpFile = Path.ChangeExtension(Path.GetTempFileName(), ".htm"); - File.WriteAllText(tmpFile, html); + File.WriteAllText(tmpFile, _mainControl.GetHtml()); Process.Start(tmpFile); } /// - /// Show\Hide the web browser viwer. - /// - private void OnToggleWebBrowserButton_Click(object sender, EventArgs e) - { - _webBrowser.Visible = !_webBrowser.Visible; - _splitter.Visible = _webBrowser.Visible; - _toggleWebBrowserButton.Text = _webBrowser.Visible ? "Hide IE View" : "Show IE View"; - - if (_webBrowser.Visible) - { - _webBrowser.Width = _splitContainer2.Panel2.Width / 2; - UpdateWebBrowserHtml(); - } - } - - /// - /// Update the html shown in the web browser - /// - private void UpdateWebBrowserHtml() - { - if (_webBrowser.Visible) - { - _webBrowser.DocumentText = _showGeneratedHtmlCB.Checked ? _htmlPanel.GetHtml() : GetFixedHtml(); - } - } - - /// - /// Fix the raw html by replacing bridge object properties calls with path to file with the data returned from the property. - /// - /// fixed html - private string GetFixedHtml() - { - var html = _htmlEditor.Text; - - html = Regex.Replace(html, @"src=\""(\w.*?)\""", match => - { - var img = TryLoadResourceImage(match.Groups[1].Value); - if (img != null) - { - var tmpFile = Path.GetTempFileName(); - img.Save(tmpFile, ImageFormat.Jpeg); - return string.Format("src=\"{0}\"", tmpFile); - } - return match.Value; - }, RegexOptions.IgnoreCase); - - html = Regex.Replace(html, @"href=\""(\w.*?)\""", match => - { - var stylesheet = GetStylesheet(match.Groups[1].Value); - if (stylesheet != null) - { - var tmpFile = Path.GetTempFileName(); - File.WriteAllText(tmpFile, stylesheet); - return string.Format("href=\"{0}\"", tmpFile); - } - return match.Value; - }, RegexOptions.IgnoreCase); - - return html; - } - - /// - /// On change if to show generated html or regular update the web browser to show the new choice. + /// Toggle the use generated html button state. /// - private void OnShowGeneratedHtmlCheckedChanged(object sender, EventArgs e) + private void OnUseGeneratedHtml_Click(object sender, EventArgs e) { - UpdateWebBrowserHtml(); + _useGeneratedHtmlTSB.Checked = !_useGeneratedHtmlTSB.Checked; + _mainControl.UseGeneratedHtml = _useGeneratedHtmlTSB.Checked; + _mainControl.UpdateWebBrowserHtml(); } /// - /// Reload the html shown in the html editor by running coloring again. + /// Create PDF using PdfSharp project, save to file and open that file. /// - private void OnReloadColorsLinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + private void OnGeneratePdf_Click(object sender, EventArgs e) { - SetColoredText(_htmlEditor.Text); - } - - /// - /// Handle stylesheet resolve. - /// - private static void OnStylesheetLoad(object sender, HtmlStylesheetLoadEventArgs e) - { - var stylesheet = GetStylesheet(e.Src); - if (stylesheet != null) - e.SetStyleSheet = stylesheet; - } - - /// - /// Get stylesheet by given key. - /// - private static string GetStylesheet(string src) - { - if (src == "StyleSheet") - { - return @"h1, h2, h3 { color: navy; font-weight:normal; } - h1 { margin-bottom: .47em } - h2 { margin-bottom: .3em } - h3 { margin-bottom: .4em } - ul { margin-top: .5em } - ul li {margin: .25em} - body { font:10pt Tahoma } - pre { border:solid 1px gray; background-color:#eee; padding:1em } - a:link { text-decoration: none; } - a:hover { text-decoration: underline; } - .gray { color:gray; } - .example { background-color:#efefef; corner-radius:5px; padding:0.5em; } - .whitehole { background-color:white; corner-radius:10px; padding:15px; } - .caption { font-size: 1.1em } - .comment { color: green; margin-bottom: 5px; margin-left: 3px; } - .comment2 { color: green; }"; - } - return null; - } - - /// - /// On image load in renderer set the image by event async. - /// - private void OnImageLoad(object sender, HtmlImageLoadEventArgs e) - { - var img = TryLoadResourceImage(e.Src); - - if (!e.Handled && e.Attributes != null) - { - if (e.Attributes.ContainsKey("byevent")) - { - int delay; - if (int.TryParse(e.Attributes["byevent"], out delay)) - { - e.Handled = true; - ThreadPool.QueueUserWorkItem(state => - { - Thread.Sleep(delay); - e.Callback("https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-snc7/c0.44.403.403/p403x403/318890_10151195988833836_1081776452_n.jpg"); - }); - return; - } - else - { - e.Callback("http://sphotos-a.xx.fbcdn.net/hphotos-ash4/c22.0.403.403/p403x403/263440_10152243591765596_773620816_n.jpg"); - return; - } - } - else if (e.Attributes.ContainsKey("byrect")) - { - var split = e.Attributes["byrect"].Split(','); - var rect = new Rectangle(int.Parse(split[0]), int.Parse(split[1]), int.Parse(split[2]), int.Parse(split[3])); - e.Callback(img ?? TryLoadResourceImage("htmlicon"), rect.X, rect.Y, rect.Width, rect.Height); - return; - } - } - - if (img != null) - e.Callback(img); - } - - /// - /// Get image by resource key. - /// - private Image TryLoadResourceImage(string src) - { - Image image; - if (!_imageCache.TryGetValue(src, out image)) - { - switch (src.ToLower()) - { - case "htmlicon": - image = Image.FromStream(Resources.Html32); - break; - case "staricon": - image = Image.FromStream(Resources.Favorites32); - break; - case "fonticon": - image = Image.FromStream(Resources.Font32); - break; - case "commenticon": - image = Image.FromStream(Resources.Comment16); - break; - case "imageicon": - image = Image.FromStream(Resources.Image32); - break; - case "methodicon": - image = Image.FromStream(Resources.Method16); - break; - case "propertyicon": - image = Image.FromStream(Resources.Property16); - break; - case "eventicon": - image = Image.FromStream(Resources.Event16); - break; - } - - if (image != null) - _imageCache[src] = image; - } - return image; - } - - /// - /// Show error raised from html renderer. - /// - private static void OnRenderError(object sender, HtmlRenderErrorEventArgs e) - { - MessageBox.Show(e.Message + (e.Exception != null ? "\r\n" + e.Exception : null), "Error in Html Renderer", MessageBoxButtons.OK); - } - - /// - /// On specific link click handle it here. - /// - private static void OnLinkClicked(object sender, HtmlLinkClickedEventArgs e) - { - if (e.Link == "SayHello") - { - MessageBox.Show("Hello you!"); - e.Handled = true; - } - else if (e.Link == "ShowSampleForm") - { - using (var f = new SampleForm()) - { - f.ShowDialog(); - e.Handled = true; - } - } - } - - /// - /// Set html syntax color text on the RTF html editor. - /// - private void SetColoredText(string text) - { - var selectionStart = _htmlEditor.SelectionStart; - _htmlEditor.Clear(); - _htmlEditor.AppendText(text); - text = _htmlEditor.Rtf; - - _htmlEditor.Clear(); - _htmlEditor.Rtf = SyntaxHilight.AddColoredText(text); - _htmlEditor.SelectionStart = selectionStart; + var doc = PdfGenerator.GeneratePdf(_mainControl.GetHtml(), PageSize.A4); + var tmpFile = Path.GetTempFileName(); + tmpFile = Path.GetFileNameWithoutExtension(tmpFile) + ".pdf"; + doc.Save(tmpFile); + Process.Start(tmpFile); } /// /// Execute performance test by setting all sample htmls in a loop. /// - private void OnRunTestButtonClick(object sender, EventArgs e) + private void OnRunPerformance_Click(object sender, EventArgs e) { - _updateLock = true; - _runTestButton.Text = "Running.."; - _runTestButton.Enabled = false; + _mainControl.UpdateLock = true; + _runPerformanceTSB.Enabled = false; Application.DoEvents(); GC.Collect(); @@ -522,7 +129,7 @@ private void OnRunTestButtonClick(object sender, EventArgs e) { foreach (var html in _perfTestSamples) { - _htmlPanel.Text = html; + _mainControl.SetHtml(html); Application.DoEvents(); // so paint will be called } } @@ -552,11 +159,8 @@ private void OnRunTestButtonClick(object sender, EventArgs e) Clipboard.SetDataObject(msg); MessageBox.Show(msg, "Test run results"); - _updateLock = false; - _runTestButton.Text = "Run Performance Test"; - _runTestButton.Enabled = true; + _mainControl.UpdateLock = false; + _runPerformanceTSB.Enabled = true; } - - #endregion } } \ No newline at end of file diff --git a/Source/Demo/WinForms/DemoForm.resx b/Source/Demo/WinForms/DemoForm.resx index 38be6308b..b5ccd98a4 100644 --- a/Source/Demo/WinForms/DemoForm.resx +++ b/Source/Demo/WinForms/DemoForm.resx @@ -112,12 +112,99 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 + + 139, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAT9SURBVFhHtVd7TFtVGG9LKVBKW2iVAVNBhghxbrJN4nPK + jOIjmYkxPmZM5rI//Gcz0Rg1JnWJxhmzZXGJCTE+M427vY++gMJgdYvZQzBORXS995zbWyid26IuZj43 + rucr58JduX0M4Zf80vv4vu93es53vvNd01JBVVVz9q92vaQYVdXSVf3yXVcI+HUHJw24OVG2s+IvTlY8 + 5eZQrCmMNlHT/wf4N6GUan/+RLrp4aNTbV2HUh0eQdpV5hdPmffHp01+SQWa/fELLhZJdh59WcWj7y3k + viGEt9EwlwcQ7ehX7vAE0DtODv1Q4pf+MX8enwZBvSiwgkOoPiw/u3XkdJ1+GdYNyKurWGn8rR/PVGWC + Fov2iNzt4PFItlAuwuCqBbzv1mGlmYaYxfJgYst10WQ3vc2PTcfOOr2CuM/sFw2FCtHKxM/DlOsTsPvw + VHtrQH6G3uZG11CyoZwTvzUKfLmsFtBHzNiYDeLe+UVyZVsIP5YRyYUNxyc95X5p3CjYQunixU/JTFga + ifhtwxOrqNR8gJGLR71GQYxoZorLC1jGupD8UmMQvwnblcrNx9WRxBYISrbQxcZQgnPx0jwBeOfkpUNk + and4Bfm5mgDa6eDFE6YCuVLCSH8tC8p79DlxCXrI3i5lxCnI4uaw/JqNQRPZQcjSSDccmLxFHwSugSv6 + lUetpPBk++jpEsTBnANoCCe2WskoW6PJzRWc+FO2s40TFUhOam6ItoGJTqs//me2r0bYyp0HlTXUfA4w + qmoeHWyJyE84eNRv5NgcUTZS87yAUpztr6dHQHuo6Rx83/zqbokkti0L4FeNnOx+NMGoagk1z4uNR9ON + 5v0ncyZnJYtPzluGXUeSFSsHlDUlrPS3oROPvm7vlZ8slja/eN4oDpAk+cW94+c8VHoGMVW1goiRg0Yz + I04XSyN/jbCcaw9M3kSlZ3AVOTwKbaPFZH1EuYdKm0xvn0hX2vxSyshwSciIakNEvpvKm0x1Ybzd0FDH + CnKMeoJ496KQx7u7jtDtDGtfwUnYSFRPBy9FtYKzGMyIA9p65fuLOefLWOmcb0x1ULeCMBLVSE1mjJw8 + +hgEYBCkAI1lC+tZG5Rfpq55saIPrydnw1cOAc8neQ7FLmMI01/OodMQ3B2Qoi198gP5ZgPK9PV9yr0Z + 5xxYH0s32lhRMfIHQowHtXJ++9DEjSAIhDJLZsRSyUnHjBw1QgCYCd/Yz5nl0KY1FlOt14blx0vZeNrI + T6M3gN/NiAOae5WnoWjA+sZktRyetUfRzXAaGjnrWcai31wCDtcGUE+NgBk7J03C9jKy1VjKiumHRlPe + jDjAKaBX4AVZm0H6KAOyLV9caB+YixZG+re1P3kflZhBFY/fgJekSXhPn51w7RXwXnNWkIXSwooXoNGh + 4edwZQBvh+7HG5A+0Q8A4CP5UBeUd0D3YxS0WJIG5Y9ryOFEw16KdYPKWkhAKMM+0g3Rx7OAQbWRnUFy + 5Hej4PkIS0i29cjqKM7dgAJIWfwgUwM4KbqBtMzx6emyvvhZZwfpbMgM+dwCPu4NyDvrQ/gFO/nMIkkL + tdxwq2ZOQYhFhMmUP0X+QOH+gRhZlofkzU4OH64iNYF8dp0h19+5BfH9plDikZ5UanZmGIYp6SQDqyXd + bY2APnOQD06HgEaJ4DD5ZPuwjnyEdA0l2rOXsyjoneC6UBDtffZv8TCZ/gO9m+3FxbAU/gAAAABJRU5E + rkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAUMSURBVFhH1ZZ7bFNVHMfvwD+UGIj6DypoYsBs7RjiyHzr + H67t2Lq7jaQERY0YxCzKtt6+mAqFIIrPP8wIi1EkgQDyCJJoEJGH0zjjFpA+t7Z3XXs7t7Jnt7Xr7e69 + P8+9O3WlPeNtjN/kkzR3557P7zx3qf9VwE7NClcsvZ+jCys4Wl0fplX2CK3a3FNVuIHTF6zorsm/V26D + m9+6sKUPzYtUqmu79erfQ/qCVKhSDd1ZyM/CejUfpgt+DVep10UNqjvx6zceMFCzw3ThaxytimQLrwYq + KNRTpXrxhmdkpGLJXWiaj5FGez1wetUBX9miubjba0u0XDUfiS+QOrwRIrS6NVKdfw/u/srxrSmZi6pu + I3V0M3CV6pZ2ffEcrCHHjtYrRC/ZS+rgVhCuVjcDReVhXW6a9728MkgXEl/OJLTyEeh5swqiW2shuq0W + +jbVQN/Gx6DXVnxF/rIVSyO7n9Bh3eWxn7Xf1uC2uk++qyFKZULVS2Hg802QigQBRBGmI4LEh2Cy70Pg + A2XA+7UzkmS1bQCEk2FyW1cYXRawt7wFgZqiXLlhOcRbf1J0nSNJ+MTZD6+2cLAW8ZmrH9hRXvmbOHoG + FaEnyhUCWkh1aZ7F2ukwLsteo9MCMkc+rswqoBDGz30HogSw0zMIqqM+WHy48zIK0bOvOocANQEx9j1Z + jplkNbuwdip2u31Wg8Pamy7A1mYE7+pl/xQQ3fIG6laCPb6hHHE2h7pGlLapiIkol0mxmgBWT2XDResC + xmVV5Gn2fLFqqgC9ChLtLTDMC7D0mJ8ozWT58QCMT4ogjv1MlMsk/RpxxKW9G+spqsFpfkpe/8wCTH+a + 4cLaErTxikCaSMDRYIwoJHGCGwUQYkS5TIrVAc+WFWE9KsBhqsiUp2n65hXg1jwt7y34FG06koxEs3dQ + WQY+QJMLkDdip+4ZrKeoeiejIxUg09pYoXTW5BkgykjsRnsFJGHG0yAXkPBrn8R6dALctmXZeyDNjhOv + w+TQJfilLw6LCLJs5DbnBxIgpSJIpsmRKwWgJUh6nn8Y6ynKxtrmIZmQLU/zB3cOBEmC8pNBojSTladD + ynEVhg4S5TJJn3YCgs/djvVTYVxmB0kus63jfUiKPDiHJuDRb2c+CSXoBPhiSXQRjEEquJool0kGNL9h + 7XRMHut2kjzNfu4gGpkInuEkGNAo849MX0YF6PcLZ8Pgj/FopgSY6N1OFKcRWF0j1k6HcTD5SDTjMsjs + 4w5AXIgry+FF1/Gx7hgcD8WUq1lA0z42OQbnuF3onJPFMmj0fIItfQBrL4/RbT5MEmeypWMbnLp0GiKJ + CMQmRxExCCc4+CH6I9i9W4HtrCaK06RY7ddYl5s6t2Vxg8syThJnwzitYHW/rSD/lp/t9awjSjMYlvza + hVhHjsllXWu8aJGyhVej0cnAoK+cJFVA168gdOlWYc0VAlQe4924w+i4viJOedcQxTLo2Eno8tmMep/5 + aygzhkOG2Sa35YN6h0kkybJ5z1WHbjZ0vxPlpYIslz/3cPfXFnT/5pk7bC8xTvMASZrJ+Q4DUc6z2ijv + LzOgL6BrGzkpVh/6V+2xfGl0meMkeZO7Nlcc0I6JXdqdECyfj7u5+TBOZqHJazMxbuuZBqe1H31BCSan + RQr6aFGZZlYXFbo0p9BGq4+HSu/Dr/0LQdO5vn39nHfcpgc/6qgrkkI6ddxXtkAKP37HTU31fxOK+hvP + j5alorFs5wAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + \ No newline at end of file diff --git a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj index 46da5c3b2..d9965dc33 100644 --- a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj @@ -74,6 +74,12 @@ + + UserControl + + + MainControl.cs + Form @@ -88,6 +94,9 @@ + + MainControl.cs + PerfForm.cs Designer @@ -96,11 +105,16 @@ Designer DemoForm.cs - + True True Resource1.resx + + True + True + Resources.resx + Form @@ -109,10 +123,14 @@ - + ResXFileCodeGenerator Resource1.Designer.cs + + ResXFileCodeGenerator + Resources.Designer.cs + Designer SampleForm.cs @@ -159,6 +177,18 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Source/Demo/WinForms/Resource1.Designer.cs b/Source/Demo/WinForms/Properties/Resource1.Designer.cs similarity index 88% rename from Source/Demo/WinForms/Resource1.Designer.cs rename to Source/Demo/WinForms/Properties/Resource1.Designer.cs index e1fd0d1ad..d9a29e7c6 100644 --- a/Source/Demo/WinForms/Resource1.Designer.cs +++ b/Source/Demo/WinForms/Properties/Resource1.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace HtmlRenderer.Demo.WinForms { +namespace HtmlRenderer.Demo.WinForms.Properties { using System; @@ -39,7 +39,7 @@ internal Resource1() { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HtmlRenderer.Demo.WinForms.Resource1", typeof(Resource1).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HtmlRenderer.Demo.WinForms.Properties.Resource1", typeof(Resource1).Assembly); resourceMan = temp; } return resourceMan; @@ -60,6 +60,16 @@ internal Resource1() { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap IE { + get { + object obj = ResourceManager.GetObject("IE", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized string similar to <body style="font: 10pt Tahoma"> /// <h3 style="color: navy; margin-bottom: 8px">Render to Image</h3> diff --git a/Source/Demo/WinForms/Resource1.resx b/Source/Demo/WinForms/Properties/Resource1.resx similarity index 94% rename from Source/Demo/WinForms/Resource1.resx rename to Source/Demo/WinForms/Properties/Resource1.resx index 186b0d215..a3d2159e9 100644 --- a/Source/Demo/WinForms/Resource1.resx +++ b/Source/Demo/WinForms/Properties/Resource1.resx @@ -117,6 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\IE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + <body style="font: 10pt Tahoma"> <h3 style="color: navy; margin-bottom: 8px">Render to Image</h3> diff --git a/Source/Demo/WinForms/Properties/Resources.Designer.cs b/Source/Demo/WinForms/Properties/Resources.Designer.cs new file mode 100644 index 000000000..08410a4d7 --- /dev/null +++ b/Source/Demo/WinForms/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34014 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace HtmlRenderer.Demo.WinForms.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HtmlRenderer.Demo.WinForms.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap chrome { + get { + object obj = ResourceManager.GetObject("chrome", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap IE { + get { + object obj = ResourceManager.GetObject("IE", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap pdf { + get { + object obj = ResourceManager.GetObject("pdf", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap stopwatch { + get { + object obj = ResourceManager.GetObject("stopwatch", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Source/Demo/WinForms/Properties/Resources.resx b/Source/Demo/WinForms/Properties/Resources.resx new file mode 100644 index 000000000..74fb10756 --- /dev/null +++ b/Source/Demo/WinForms/Properties/Resources.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\chrome.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\ie.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pdf.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\stopwatch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Source/Demo/WinForms/Resources/IE.png b/Source/Demo/WinForms/Resources/IE.png new file mode 100644 index 0000000000000000000000000000000000000000..a2521226f09762e0b866d8ef41978bc091e598ca GIT binary patch literal 1407 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 Hu0mjft8J@v literal 0 HcmV?d00001 diff --git a/Source/Demo/WinForms/Resources/stopwatch.png b/Source/Demo/WinForms/Resources/stopwatch.png new file mode 100644 index 0000000000000000000000000000000000000000..e20f6d25bcf440ce42ae9ce94b6820f9012a0e5d GIT binary patch literal 528 zcmV+r0`L8aP)C=h{ka=EKw90 zmtVL&$$2sH}KIy78@rlcqx=@D+Qr+p_F7PP*_@9f_T1com#?1Zr`hC1QsIlPuEE6f+cJ zUXz0mkXrGfw+V$*D?4TslhWRcv9UYspSKAK5(G4-@iAlH40LNN_x(VA2`~T|2?K`$ Sm{6zy0000 Date: Tue, 6 May 2014 11:19:38 +0300 Subject: [PATCH 064/254] improve demo application with image generation --- Source/Demo/WinForms/DemoForm.Designer.cs | 94 ++++++---- Source/Demo/WinForms/DemoForm.cs | 48 ++++- Source/Demo/WinForms/DemoForm.resx | 107 +++++------ .../WinForms/GenerateImageForm.Designer.cs | 148 ++++++++++++++++ Source/Demo/WinForms/GenerateImageForm.cs | 126 +++++++++++++ .../Resource1.resx => GenerateImageForm.resx} | 54 +++--- .../HtmlRenderer.Demo.WinForms.csproj | 29 +-- Source/Demo/WinForms/HtmlRenderingHelper.cs | 154 ++++++++++++++++ Source/Demo/WinForms/MainControl.cs | 166 +----------------- Source/Demo/WinForms/Program.cs | 12 +- .../WinForms/Properties/Resource1.Designer.cs | 91 ---------- .../WinForms/Properties/Resources.Designer.cs | 20 +++ .../Demo/WinForms/Properties/Resources.resx | 6 + Source/Demo/WinForms/Resources/form.png | Bin 0 -> 1135 bytes Source/Demo/WinForms/{ => Resources}/html.ico | Bin Source/Demo/WinForms/Resources/image.png | Bin 0 -> 582 bytes Source/Demo/WinForms/SampleForm.cs | 23 ++- 17 files changed, 672 insertions(+), 406 deletions(-) create mode 100644 Source/Demo/WinForms/GenerateImageForm.Designer.cs create mode 100644 Source/Demo/WinForms/GenerateImageForm.cs rename Source/Demo/WinForms/{Properties/Resource1.resx => GenerateImageForm.resx} (69%) create mode 100644 Source/Demo/WinForms/HtmlRenderingHelper.cs delete mode 100644 Source/Demo/WinForms/Properties/Resource1.Designer.cs create mode 100644 Source/Demo/WinForms/Resources/form.png rename Source/Demo/WinForms/{ => Resources}/html.ico (100%) create mode 100644 Source/Demo/WinForms/Resources/image.png diff --git a/Source/Demo/WinForms/DemoForm.Designer.cs b/Source/Demo/WinForms/DemoForm.Designer.cs index dcd60b384..6f9f526e3 100644 --- a/Source/Demo/WinForms/DemoForm.Designer.cs +++ b/Source/Demo/WinForms/DemoForm.Designer.cs @@ -32,16 +32,17 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DemoForm)); this._toolStrip = new System.Windows.Forms.ToolStrip(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this._mainControl = new HtmlRenderer.Demo.WinForms.MainControl(); this._openSampleFormTSB = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this._showIEViewTSSB = new System.Windows.Forms.ToolStripButton(); this._openInExternalViewTSB = new System.Windows.Forms.ToolStripButton(); this._useGeneratedHtmlTSB = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this._generateImageSTB = new System.Windows.Forms.ToolStripButton(); this._generatePdfTSB = new System.Windows.Forms.ToolStripButton(); this._runPerformanceTSB = new System.Windows.Forms.ToolStripButton(); + this._mainControl = new HtmlRenderer.Demo.WinForms.MainControl(); this._toolStrip.SuspendLayout(); this.SuspendLayout(); // @@ -54,57 +55,37 @@ private void InitializeComponent() this._openInExternalViewTSB, this._useGeneratedHtmlTSB, this.toolStripSeparator1, - this._generatePdfTSB, this.toolStripSeparator2, + this._generateImageSTB, + this._generatePdfTSB, this._runPerformanceTSB}); this._toolStrip.Location = new System.Drawing.Point(4, 4); this._toolStrip.Name = "_toolStrip"; this._toolStrip.Size = new System.Drawing.Size(878, 25); this._toolStrip.TabIndex = 1; // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); - // - // _mainControl - // - this._mainControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this._mainControl.Location = new System.Drawing.Point(4, 32); - this._mainControl.Name = "_mainControl"; - this._mainControl.Size = new System.Drawing.Size(878, 594); - this._mainControl.TabIndex = 2; - this._mainControl.UpdateLock = false; - this._mainControl.UseGeneratedHtml = false; - // // _openSampleFormTSB // - this._openSampleFormTSB.Image = ((System.Drawing.Image)(resources.GetObject("_openSampleFormTSB.Image"))); + this._openSampleFormTSB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.form; this._openSampleFormTSB.ImageTransparentColor = System.Drawing.Color.Magenta; this._openSampleFormTSB.Name = "_openSampleFormTSB"; this._openSampleFormTSB.Size = new System.Drawing.Size(129, 22); this._openSampleFormTSB.Text = "Open Sample Form"; this._openSampleFormTSB.Click += new System.EventHandler(this.OnOpenSampleForm_Click); // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25); + // // _showIEViewTSSB // this._showIEViewTSSB.Image = ((System.Drawing.Image)(resources.GetObject("_showIEViewTSSB.Image"))); this._showIEViewTSSB.ImageTransparentColor = System.Drawing.Color.Magenta; this._showIEViewTSSB.Name = "_showIEViewTSSB"; - this._showIEViewTSSB.Size = new System.Drawing.Size(96, 22); - this._showIEViewTSSB.Text = "Show IE View"; + this._showIEViewTSSB.Size = new System.Drawing.Size(101, 22); + this._showIEViewTSSB.Text = "Show Browser"; + this._showIEViewTSSB.ToolTipText = "Toggle if to show split view of HtmlPanel and WinForms WebBrowser control."; this._showIEViewTSSB.Click += new System.EventHandler(this.OnShowIEView_ButtonClick); // // _openInExternalViewTSB @@ -112,8 +93,9 @@ private void InitializeComponent() this._openInExternalViewTSB.Image = ((System.Drawing.Image)(resources.GetObject("_openInExternalViewTSB.Image"))); this._openInExternalViewTSB.ImageTransparentColor = System.Drawing.Color.Magenta; this._openInExternalViewTSB.Name = "_openInExternalViewTSB"; - this._openInExternalViewTSB.Size = new System.Drawing.Size(141, 22); - this._openInExternalViewTSB.Text = "Open in External View"; + this._openInExternalViewTSB.Size = new System.Drawing.Size(100, 22); + this._openInExternalViewTSB.Text = "Open External"; + this._openInExternalViewTSB.ToolTipText = "Open the HTML is the machine default browser, external to the demo application."; this._openInExternalViewTSB.Click += new System.EventHandler(this.OnOpenInExternalView_Click); // // _useGeneratedHtmlTSB @@ -124,8 +106,30 @@ private void InitializeComponent() this._useGeneratedHtmlTSB.Name = "_useGeneratedHtmlTSB"; this._useGeneratedHtmlTSB.Size = new System.Drawing.Size(23, 22); this._useGeneratedHtmlTSB.Text = "Use Generated HTML"; + this._useGeneratedHtmlTSB.ToolTipText = "Toggle is to use generated HTML from the HtmlPanel in Browser/External views."; this._useGeneratedHtmlTSB.Click += new System.EventHandler(this.OnUseGeneratedHtml_Click); // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); + // + // _generateImageSTB + // + this._generateImageSTB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.image; + this._generateImageSTB.ImageTransparentColor = System.Drawing.Color.Magenta; + this._generateImageSTB.Name = "_generateImageSTB"; + this._generateImageSTB.Size = new System.Drawing.Size(110, 22); + this._generateImageSTB.Text = "Generate Image"; + this._generateImageSTB.ToolTipText = "Open generate image form to show the image generation capabilities of HTML Render" + + "er."; + this._generateImageSTB.Click += new System.EventHandler(this.OnGenerateImage_Click); + // // _generatePdfTSB // this._generatePdfTSB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.pdf; @@ -137,6 +141,7 @@ private void InitializeComponent() // // _runPerformanceTSB // + this._runPerformanceTSB.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; this._runPerformanceTSB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.stopwatch; this._runPerformanceTSB.ImageTransparentColor = System.Drawing.Color.Magenta; this._runPerformanceTSB.Name = "_runPerformanceTSB"; @@ -144,6 +149,18 @@ private void InitializeComponent() this._runPerformanceTSB.Text = "Run Performance"; this._runPerformanceTSB.Click += new System.EventHandler(this.OnRunPerformance_Click); // + // _mainControl + // + this._mainControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this._mainControl.Location = new System.Drawing.Point(4, 32); + this._mainControl.Name = "_mainControl"; + this._mainControl.Size = new System.Drawing.Size(878, 594); + this._mainControl.TabIndex = 2; + this._mainControl.UpdateLock = false; + this._mainControl.UseGeneratedHtml = false; + // // DemoForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -171,11 +188,12 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripButton _openInExternalViewTSB; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripButton _runPerformanceTSB; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripButton _openSampleFormTSB; private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; private System.Windows.Forms.ToolStripButton _showIEViewTSSB; private System.Windows.Forms.ToolStripButton _useGeneratedHtmlTSB; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripButton _generateImageSTB; } } diff --git a/Source/Demo/WinForms/DemoForm.cs b/Source/Demo/WinForms/DemoForm.cs index 01e6035ca..5cfc03cab 100644 --- a/Source/Demo/WinForms/DemoForm.cs +++ b/Source/Demo/WinForms/DemoForm.cs @@ -14,10 +14,12 @@ using System.Collections.Generic; using System.Diagnostics; using System.Drawing; +using System.Drawing.Text; using System.IO; using System.Windows.Forms; using HtmlRenderer.Demo.Common; using HtmlRenderer.PdfSharp; +using HtmlRenderer.WinForms; using PdfSharp; namespace HtmlRenderer.Demo.WinForms @@ -31,6 +33,11 @@ public partial class DemoForm : Form /// private readonly List _perfTestSamples = new List(); + /// + /// the private font used for the demo + /// + private readonly PrivateFontCollection _privateFont = new PrivateFontCollection(); + #endregion @@ -51,6 +58,25 @@ public DemoForm() { _perfTestSamples.Add(sample.Html); } + + LoadCustomFonts(); + } + + /// + /// Load custom fonts to be used by renderer HTMLs + /// + private void LoadCustomFonts() + { + // load custom font font into private fonts collection + var file = Path.GetTempFileName(); + File.WriteAllBytes(file, Resources.CustomFont); + _privateFont.AddFontFile(file); + + // add the fonts to renderer + foreach (var fontFamily in _privateFont.Families) + { + HtmlRender.AddFontFamily(fontFamily); + } } /// @@ -58,7 +84,7 @@ public DemoForm() /// internal static Icon GetIcon() { - var stream = typeof(DemoForm).Assembly.GetManifestResourceStream("HtmlRenderer.Demo.WinForms.html.ico"); + var stream = typeof(DemoForm).Assembly.GetManifestResourceStream("HtmlRenderer.Demo.WinForms.Resources.html.ico"); return stream != null ? new Icon(stream) : null; } @@ -70,6 +96,9 @@ private void OnOpenSampleForm_Click(object sender, EventArgs e) } } + /// + /// Toggle if to show split view of HtmlPanel and WinForms WebBrowser control. + /// private void OnShowIEView_ButtonClick(object sender, EventArgs e) { _showIEViewTSSB.Checked = !_showIEViewTSSB.Checked; @@ -96,12 +125,23 @@ private void OnUseGeneratedHtml_Click(object sender, EventArgs e) _mainControl.UpdateWebBrowserHtml(); } + /// + /// Open generate image form for the current html. + /// + private void OnGenerateImage_Click(object sender, EventArgs e) + { + using (var f = new GenerateImageForm(_mainControl.GetHtml())) + { + f.ShowDialog(); + } + } + /// /// Create PDF using PdfSharp project, save to file and open that file. /// private void OnGeneratePdf_Click(object sender, EventArgs e) { - var doc = PdfGenerator.GeneratePdf(_mainControl.GetHtml(), PageSize.A4); + var doc = PdfGenerator.GeneratePdf(_mainControl.GetHtml(), PageSize.A4, 25, null, HtmlRenderingHelper.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoad); var tmpFile = Path.GetTempFileName(); tmpFile = Path.GetFileNameWithoutExtension(tmpFile) + ".pdf"; doc.Save(tmpFile); @@ -114,7 +154,7 @@ private void OnGeneratePdf_Click(object sender, EventArgs e) private void OnRunPerformance_Click(object sender, EventArgs e) { _mainControl.UpdateLock = true; - _runPerformanceTSB.Enabled = false; + _toolStrip.Enabled = false; Application.DoEvents(); GC.Collect(); @@ -160,7 +200,7 @@ private void OnRunPerformance_Click(object sender, EventArgs e) MessageBox.Show(msg, "Test run results"); _mainControl.UpdateLock = false; - _runPerformanceTSB.Enabled = true; + _toolStrip.Enabled = true; } } } \ No newline at end of file diff --git a/Source/Demo/WinForms/DemoForm.resx b/Source/Demo/WinForms/DemoForm.resx index b5ccd98a4..3ec2201c9 100644 --- a/Source/Demo/WinForms/DemoForm.resx +++ b/Source/Demo/WinForms/DemoForm.resx @@ -121,75 +121,60 @@ 139, 17 - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAT9SURBVFhHtVd7TFtVGG9LKVBKW2iVAVNBhghxbrJN4nPK - jOIjmYkxPmZM5rI//Gcz0Rg1JnWJxhmzZXGJCTE+M427vY++gMJgdYvZQzBORXS995zbWyid26IuZj43 - rucr58JduX0M4Zf80vv4vu93es53vvNd01JBVVVz9q92vaQYVdXSVf3yXVcI+HUHJw24OVG2s+IvTlY8 - 5eZQrCmMNlHT/wf4N6GUan/+RLrp4aNTbV2HUh0eQdpV5hdPmffHp01+SQWa/fELLhZJdh59WcWj7y3k - viGEt9EwlwcQ7ehX7vAE0DtODv1Q4pf+MX8enwZBvSiwgkOoPiw/u3XkdJ1+GdYNyKurWGn8rR/PVGWC - Fov2iNzt4PFItlAuwuCqBbzv1mGlmYaYxfJgYst10WQ3vc2PTcfOOr2CuM/sFw2FCtHKxM/DlOsTsPvw - VHtrQH6G3uZG11CyoZwTvzUKfLmsFtBHzNiYDeLe+UVyZVsIP5YRyYUNxyc95X5p3CjYQunixU/JTFga - ifhtwxOrqNR8gJGLR71GQYxoZorLC1jGupD8UmMQvwnblcrNx9WRxBYISrbQxcZQgnPx0jwBeOfkpUNk - and4Bfm5mgDa6eDFE6YCuVLCSH8tC8p79DlxCXrI3i5lxCnI4uaw/JqNQRPZQcjSSDccmLxFHwSugSv6 - lUetpPBk++jpEsTBnANoCCe2WskoW6PJzRWc+FO2s40TFUhOam6ItoGJTqs//me2r0bYyp0HlTXUfA4w - qmoeHWyJyE84eNRv5NgcUTZS87yAUpztr6dHQHuo6Rx83/zqbokkti0L4FeNnOx+NMGoagk1z4uNR9ON - 5v0ncyZnJYtPzluGXUeSFSsHlDUlrPS3oROPvm7vlZ8slja/eN4oDpAk+cW94+c8VHoGMVW1goiRg0Yz - I04XSyN/jbCcaw9M3kSlZ3AVOTwKbaPFZH1EuYdKm0xvn0hX2vxSyshwSciIakNEvpvKm0x1Ybzd0FDH - CnKMeoJ496KQx7u7jtDtDGtfwUnYSFRPBy9FtYKzGMyIA9p65fuLOefLWOmcb0x1ULeCMBLVSE1mjJw8 - +hgEYBCkAI1lC+tZG5Rfpq55saIPrydnw1cOAc8neQ7FLmMI01/OodMQ3B2Qoi198gP5ZgPK9PV9yr0Z - 5xxYH0s32lhRMfIHQowHtXJ++9DEjSAIhDJLZsRSyUnHjBw1QgCYCd/Yz5nl0KY1FlOt14blx0vZeNrI - T6M3gN/NiAOae5WnoWjA+sZktRyetUfRzXAaGjnrWcai31wCDtcGUE+NgBk7J03C9jKy1VjKiumHRlPe - jDjAKaBX4AVZm0H6KAOyLV9caB+YixZG+re1P3kflZhBFY/fgJekSXhPn51w7RXwXnNWkIXSwooXoNGh - 4edwZQBvh+7HG5A+0Q8A4CP5UBeUd0D3YxS0WJIG5Y9ryOFEw16KdYPKWkhAKMM+0g3Rx7OAQbWRnUFy - 5Hej4PkIS0i29cjqKM7dgAJIWfwgUwM4KbqBtMzx6emyvvhZZwfpbMgM+dwCPu4NyDvrQ/gFO/nMIkkL - tdxwq2ZOQYhFhMmUP0X+QOH+gRhZlofkzU4OH64iNYF8dp0h19+5BfH9plDikZ5UanZmGIYp6SQDqyXd - bY2APnOQD06HgEaJ4DD5ZPuwjnyEdA0l2rOXsyjoneC6UBDtffZv8TCZ/gO9m+3FxbAU/gAAAABJRU5E - rkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAT/SURBVFhHtVd7TFtVGG+hvEppC60yYCrIECHOTbZJfM4x + o/hIZmKMjxmTuewP/9lMNEaNSV2iccZsWVxiQozPzK1re+/tCygMVreYPQQjKm4tvefc3kJBt0VdzHxu + XM9XzoW7cvoYwi/5pffxfd/v9Hzf+c65uqWCoij69F/1ekkxrChFq3ql+64R8FsmTuyzumNSqSf6i9kd + /cnKoXBDAG2mpv8P8G/8ScX40shUw2MnJls6jibbbIK4u4gI6Q9GpnVuUQHq3ZFLFjcSjTz6qoJHPxSQ + +zo/3k7DXB1AtK1XvsfmRe+bOfRjoVv8R38gMg2CWlFgGYdQbUB6YdvQ2RptGtb1Sasr3OLpd8+cq0gF + zRetQanTxOOhdKFMhMFVCnj/nYNyIw0xi+W++NabQolOepsdm0+eN9uF2H69O8YUykWDM3IRplxbgJ3H + JlubvdLz9DYzOgYSdaXc2HeswFfLSgF96hodLYa4936ZWNnix0+mRDJh46kJWynJFSvYQmnhY1+QmSio + J+J3DY6volLzAUYWHnWzgrCod+ZXF5DGGr/0ar0PvwPLlcrNx/XB+FYISpbQ5Xp/nLN4xuYJwDszLx4l + U7vTLkgvVnnRLhMfG9HlqJVCp/jXMp+0V1sTV6CLrO0iZ2wSqrgxIL1pcKLx9CAkNeIthyfu0AaBa+CK + XvkJA2k86T5aWoRYf8YB1AXi2wxklM2hxJYyLhZJdzZwURmKk5oz0dI33m5wR/5M91UJS7n9iLyGms8B + RlXJoyNNQelpE496WY6NQXkTNc8KaMXp/lraBLSXms7B8e2v1qZgfPsyL36D5WQ8hMZdilJIzbNi04mp + ev3BMxmL0+jG0Xlp2H08UbayT15T6BH/ZjmV8+ib1m7pmXxZfCh6kRUHqHdFLu87fcFGpWcQVhQDiLAc + VOqd0el8yfJXCelce3jiNio9g+vI5pFrGS0ma4Py/VRap3tvZKrc4BaTLMMloSum1AWlDVRep6sJ4B1M + Qw3LSGu2+fCeRSGP93Qcp8sZcl/GiZglqqWJF0Nqw1kMpsQBLd3SQ/ns8yUe8YJjVDFRt5xgiaqkJjNG + Zh59BgIwCNKARtOFtaz2Sa9R16xY0YPXm/ixr00Cnk/yHJpdyhCmv5hDZyG41SuGmnqkh7PNBrTpm3vk + B1LOGbA+PFVP9gOZ5Q+EGI+o7fzugfFbQRAIbZbMSEE5J55kOaqEADATjtGfU+lQpzUcVgw3BqSnijzR + KZafSrsXf5ASBzR2y89B04D8hiWlFJ61htDtsBuynLUs8aDfLAIOVHtRV5WAXUZOnIDlxbJVCYN7dDhp + T4kDzAJ6HV6Q3PTTRymQZfnKQs+BmVjgFP9t7k08SCVmUMHjt+ElOSR8qK1OuLYLeJ8+LchCWeCJXoKD + Dg0/h2u9eAecfuxe8XPtAAAOUg81PmknnH5YQfMlKcg/biCbEw17Jdb1y2uhAKENO8hpiD6eBQyqhawM + UiO/s4JnI6SQLOuh1SGc+QAKIG3x41QP4MTQRnJkHpueLukZO29uIycbMkMOq4BP2b3Srlo/ftlIPrP0 + UGgZdrvULgixiDCZ8mfJH8h9fiBGBcv90hYzh49VkJ5g9qBzZg/+3irEPmrwxx/vSiZnZ8blchW2k4FV + k9NtlYAOmMgHp0lAw0RwkHyyfVJDPkI6BuKt6enMC1onuM4VRH2f/ps/dLr/AFD57OCZQRNMAAAAAElF + TkSuQmCC iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAUMSURBVFhH1ZZ7bFNVHMfvwD+UGIj6DypoYsBs7RjiyHzr - H67t2Lq7jaQERY0YxCzKtt6+mAqFIIrPP8wIi1EkgQDyCJJoEJGH0zjjFpA+t7Z3XXs7t7Jnt7Xr7e69 - P8+9O3WlPeNtjN/kkzR3557P7zx3qf9VwE7NClcsvZ+jCys4Wl0fplX2CK3a3FNVuIHTF6zorsm/V26D - m9+6sKUPzYtUqmu79erfQ/qCVKhSDd1ZyM/CejUfpgt+DVep10UNqjvx6zceMFCzw3ThaxytimQLrwYq - KNRTpXrxhmdkpGLJXWiaj5FGez1wetUBX9miubjba0u0XDUfiS+QOrwRIrS6NVKdfw/u/srxrSmZi6pu - I3V0M3CV6pZ2ffEcrCHHjtYrRC/ZS+rgVhCuVjcDReVhXW6a9728MkgXEl/OJLTyEeh5swqiW2shuq0W - +jbVQN/Gx6DXVnxF/rIVSyO7n9Bh3eWxn7Xf1uC2uk++qyFKZULVS2Hg802QigQBRBGmI4LEh2Cy70Pg - A2XA+7UzkmS1bQCEk2FyW1cYXRawt7wFgZqiXLlhOcRbf1J0nSNJ+MTZD6+2cLAW8ZmrH9hRXvmbOHoG - FaEnyhUCWkh1aZ7F2ukwLsteo9MCMkc+rswqoBDGz30HogSw0zMIqqM+WHy48zIK0bOvOocANQEx9j1Z - jplkNbuwdip2u31Wg8Pamy7A1mYE7+pl/xQQ3fIG6laCPb6hHHE2h7pGlLapiIkol0mxmgBWT2XDResC - xmVV5Gn2fLFqqgC9ChLtLTDMC7D0mJ8ozWT58QCMT4ogjv1MlMsk/RpxxKW9G+spqsFpfkpe/8wCTH+a - 4cLaErTxikCaSMDRYIwoJHGCGwUQYkS5TIrVAc+WFWE9KsBhqsiUp2n65hXg1jwt7y34FG06koxEs3dQ - WQY+QJMLkDdip+4ZrKeoeiejIxUg09pYoXTW5BkgykjsRnsFJGHG0yAXkPBrn8R6dALctmXZeyDNjhOv - w+TQJfilLw6LCLJs5DbnBxIgpSJIpsmRKwWgJUh6nn8Y6ynKxtrmIZmQLU/zB3cOBEmC8pNBojSTladD - ynEVhg4S5TJJn3YCgs/djvVTYVxmB0kus63jfUiKPDiHJuDRb2c+CSXoBPhiSXQRjEEquJool0kGNL9h - 7XRMHut2kjzNfu4gGpkInuEkGNAo849MX0YF6PcLZ8Pgj/FopgSY6N1OFKcRWF0j1k6HcTD5SDTjMsjs - 4w5AXIgry+FF1/Gx7hgcD8WUq1lA0z42OQbnuF3onJPFMmj0fIItfQBrL4/RbT5MEmeypWMbnLp0GiKJ - CMQmRxExCCc4+CH6I9i9W4HtrCaK06RY7ddYl5s6t2Vxg8syThJnwzitYHW/rSD/lp/t9awjSjMYlvza - hVhHjsllXWu8aJGyhVej0cnAoK+cJFVA168gdOlWYc0VAlQe4924w+i4viJOedcQxTLo2Eno8tmMep/5 - aygzhkOG2Sa35YN6h0kkybJ5z1WHbjZ0vxPlpYIslz/3cPfXFnT/5pk7bC8xTvMASZrJ+Q4DUc6z2ijv - LzOgL6BrGzkpVh/6V+2xfGl0meMkeZO7Nlcc0I6JXdqdECyfj7u5+TBOZqHJazMxbuuZBqe1H31BCSan - RQr6aFGZZlYXFbo0p9BGq4+HSu/Dr/0LQdO5vn39nHfcpgc/6qgrkkI6ddxXtkAKP37HTU31fxOK+hvP - j5alorFs5wAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAUTSURBVFhH1ZZ9bBNlHMcP8A8lBqL+gwqaGNCtLZsIwXdN + HG3H1nWDpASdGjGIWZSNXteWqVDIRPH1DzMCMYokI4K8ZJJoECcwpxHjCHvp+8uta6/LVhjbuq0v197d + z+e6p660z8arMX6TT9Lc7n6f3z1vO+p/FbBQs4PlxfezWkU5q5XXBbUyS0gr295fqdjMagpX960puFe6 + B99+68Ksemh+qEJe06eR/xnQPJIMVMihLwfpWrBMzgW1hb8HK+UbwzrZnfjxGw/oqDlBreJ1VisL5Qqv + Bmoo0F8pe+mGR2S0fOldaJhbSG97PbAa2SFP6eJ5uOy1JVwmW4DEnaSCN0JIKz8Xqiq4B5efOZ7qlfPQ + guogFboZ2Ap5+3nN8rlYQ44FzVdAu7SZVOBWEKyS7wOKmoV1+dl38JW1fq2C+HA2gbWPQv9blRDeWQPh + xhoY3LYGBrc+DgPm5TMSMi8XR/c/qca6K2M5a7lti91kP/WekiiVCFQVw9AX2yAZ8gMIAkxFAJELQGrw + I+B8pcB5VdMSZ1QdAISdYbCbVuttRrC0vw2+NUX5ct0KiJ77Ja1zjybgU+sleK2dhQ2Iz22XgBnj0n8T + xs6gJjREeRqfCpK9yuewdiq0zdistxpB4tgnFTkNKGCi7QcQRIA9jssgO+6BJUfdV6BA1752DwO6BYTI + j2Q5JsUo92LtZCwWy+y6LtNApgFzhx6c65f900B4x5uorAgHPMN54lyO9I6m702GDES5RJJR+rB6Mpu7 + TQtpmyktz3Dgy3WTDWhkEDvfDiMcD8UtXqI0mxUnfDCREkAY/5Uol4i5S4RRm+purKeoLdb6p6X5z27A + 0FUPnRtWooVXBGI8Bsf9EaKQxEl2DICPEOUSSUYNHFNahPWogR5DebY8Q9N3rwJb/Yy0tuAztOhIMhL7 + nJfT08D5tOQGpIXoVj+L9RRVZ6XVpAYkzjWUp4s1OYaIMhL70VoBkZ92N0gNxLyqp7Ae7QC7eVnuGsiw + ++QbkBq+CL8NRmExQZaLdM+FoRiIyRCSKfPk6QbQFCQcJQ9jPUWZGfN8JONz5Rn+YtuAF0UoO+UnSrNZ + ezqQ3q788GGiXCLmUsXB//ztWD8Z2lbfQ5JLNLo+gITAgXU4Do99P/1OWIl2gCeSQAfBOCT964lyiYRP + +QfWTsXgMO0iyTN8yx5GbyaAYyQBOvSWBcemDqNC9PvFs0HwRjg0UjzEB3YRxRl4Rt2AtVOhe+gCJJp2 + GiQOsocgykfT0+FEx3FLXwROBCLpo5lHwz6eGoc2di8kCNIMMV8JF2NWPYC1V0Zvrz9KEmezw9UIrRdP + QygWgkhqDBGBYIyFn8I/g8W5Exh3FVGcIcmovsG6/NTajUtqbcYJkjgX2moCk/2dNNJv6VqzYyNRmiHu + Vo2IXtUirCPHYDNt0HcaxVzh1Wiw0nDZU0YUS6Djl+d71euwZoYANYt2bt2t77q+Jlqd1USxBNp2Ijp8 + tqPq038NZUd3RDfHYDd+uLlLL5Bkubxvq0UnGzrfifIXeEkufe7h8tcWdP7OqneZX6a76SGSNJsLLh1R + zjGqMOct1aEvoGt7c1JMHvSv2mH8Sm+joyR5k70mTxz3qcaFXtUe8JctwGVuPrSVXmRwmg203XSmtsd0 + CX1B8YZuo8i4NII0zByjDvO9yla00OqigVX34cf+haDh3HR+09x37YYHP3bVFokBtTzqKV0oBp+446aG + +r8JRf0NTh+WUtLmktcAAAAASUVORK5CYII= diff --git a/Source/Demo/WinForms/GenerateImageForm.Designer.cs b/Source/Demo/WinForms/GenerateImageForm.Designer.cs new file mode 100644 index 000000000..de53c4fc4 --- /dev/null +++ b/Source/Demo/WinForms/GenerateImageForm.Designer.cs @@ -0,0 +1,148 @@ +namespace HtmlRenderer.Demo.WinForms +{ + partial class GenerateImageForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GenerateImageForm)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this._useGdiPlusTSB = new System.Windows.Forms.ToolStripButton(); + this._generateImageTSB = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this._backgroundColorTSB = new System.Windows.Forms.ToolStripComboBox(); + this._pictureBox = new System.Windows.Forms.PictureBox(); + this._toolStripLabel = new System.Windows.Forms.ToolStripLabel(); + this._textRenderingHintTSCB = new System.Windows.Forms.ToolStripComboBox(); + this.toolStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this._pictureBox)).BeginInit(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this._useGdiPlusTSB, + this._generateImageTSB, + this.toolStripSeparator1, + this._toolStripLabel, + this._backgroundColorTSB, + this._textRenderingHintTSCB}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(610, 25); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // _useGdiPlusTSB + // + this._useGdiPlusTSB.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this._useGdiPlusTSB.Image = ((System.Drawing.Image)(resources.GetObject("_useGdiPlusTSB.Image"))); + this._useGdiPlusTSB.ImageTransparentColor = System.Drawing.Color.Magenta; + this._useGdiPlusTSB.Name = "_useGdiPlusTSB"; + this._useGdiPlusTSB.Size = new System.Drawing.Size(142, 22); + this._useGdiPlusTSB.Text = "Use GDI+ Text Rendering"; + this._useGdiPlusTSB.Click += new System.EventHandler(this.OnUseGdiPlus_Click); + // + // _generateImageTSB + // + this._generateImageTSB.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this._generateImageTSB.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this._generateImageTSB.Image = ((System.Drawing.Image)(resources.GetObject("_generateImageTSB.Image"))); + this._generateImageTSB.ImageTransparentColor = System.Drawing.Color.Magenta; + this._generateImageTSB.Name = "_generateImageTSB"; + this._generateImageTSB.Size = new System.Drawing.Size(76, 22); + this._generateImageTSB.Text = "Re-Generate"; + this._generateImageTSB.Click += new System.EventHandler(this.OnGenerateImage_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // _backgroundColorTSB + // + this._backgroundColorTSB.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this._backgroundColorTSB.Name = "_backgroundColorTSB"; + this._backgroundColorTSB.Size = new System.Drawing.Size(121, 25); + this._backgroundColorTSB.SelectedIndexChanged += new System.EventHandler(this.OnBackgroundColor_SelectedIndexChanged); + // + // _pictureBox + // + this._pictureBox.BackColor = System.Drawing.Color.Transparent; + this._pictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this._pictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this._pictureBox.Location = new System.Drawing.Point(0, 25); + this._pictureBox.Name = "_pictureBox"; + this._pictureBox.Size = new System.Drawing.Size(610, 472); + this._pictureBox.TabIndex = 1; + this._pictureBox.TabStop = false; + // + // _toolStripLabel + // + this._toolStripLabel.Name = "_toolStripLabel"; + this._toolStripLabel.Size = new System.Drawing.Size(77, 22); + this._toolStripLabel.Text = "Background: "; + // + // _textRenderingHintTSCB + // + this._textRenderingHintTSCB.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this._textRenderingHintTSCB.Name = "_textRenderingHintTSCB"; + this._textRenderingHintTSCB.Size = new System.Drawing.Size(121, 25); + this._textRenderingHintTSCB.Visible = false; + this._textRenderingHintTSCB.SelectedIndexChanged += new System.EventHandler(this._textRenderingHintTSCB_SelectedIndexChanged); + // + // GenerateImageForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(610, 497); + this.Controls.Add(this._pictureBox); + this.Controls.Add(this.toolStrip1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "GenerateImageForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Generate Image"; + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this._pictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.PictureBox _pictureBox; + private System.Windows.Forms.ToolStripButton _useGdiPlusTSB; + private System.Windows.Forms.ToolStripButton _generateImageTSB; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripComboBox _backgroundColorTSB; + private System.Windows.Forms.ToolStripLabel _toolStripLabel; + private System.Windows.Forms.ToolStripComboBox _textRenderingHintTSCB; + } +} \ No newline at end of file diff --git a/Source/Demo/WinForms/GenerateImageForm.cs b/Source/Demo/WinForms/GenerateImageForm.cs new file mode 100644 index 000000000..8ff4da1c1 --- /dev/null +++ b/Source/Demo/WinForms/GenerateImageForm.cs @@ -0,0 +1,126 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Text; +using System.Reflection; +using System.Windows.Forms; +using HtmlRenderer.Demo.WinForms.Properties; +using HtmlRenderer.WinForms; + +namespace HtmlRenderer.Demo.WinForms +{ + public partial class GenerateImageForm : Form + { + private readonly string _html; + private readonly Bitmap _background; + + public GenerateImageForm(string html) + { + _html = html; + InitializeComponent(); + + Icon = Icon.FromHandle(Resources.image.GetHicon()); + + _background = new Bitmap(10, 10); + using (var g = Graphics.FromImage(_background)) + { + g.Clear(Color.White); + g.FillRectangle(SystemBrushes.Control, new Rectangle(0, 0, 5, 5)); + g.FillRectangle(SystemBrushes.Control, new Rectangle(5, 5, 5, 5)); + } + + foreach (var color in GetColors()) + { + if (color != Color.Transparent) + _backgroundColorTSB.Items.Add(color.Name); + } + _backgroundColorTSB.SelectedItem = Color.White.Name; + + foreach (var hint in Enum.GetNames(typeof(TextRenderingHint))) + { + _textRenderingHintTSCB.Items.Add(hint); + } + _textRenderingHintTSCB.SelectedItem = TextRenderingHint.AntiAlias.ToString(); + } + + private void OnUseGdiPlus_Click(object sender, EventArgs e) + { + _useGdiPlusTSB.Checked = !_useGdiPlusTSB.Checked; + _textRenderingHintTSCB.Visible = _useGdiPlusTSB.Checked; + _backgroundColorTSB.Visible = !_useGdiPlusTSB.Checked; + _toolStripLabel.Text = _useGdiPlusTSB.Checked ? "Text Rendering Hint:" : "Background:"; + GenerateImage(); + } + + private void OnBackgroundColor_SelectedIndexChanged(object sender, EventArgs e) + { + GenerateImage(); + } + + private void _textRenderingHintTSCB_SelectedIndexChanged(object sender, EventArgs e) + { + GenerateImage(); + } + + private void OnGenerateImage_Click(object sender, EventArgs e) + { + GenerateImage(); + } + + private void GenerateImage() + { + if (_backgroundColorTSB.SelectedItem != null && _textRenderingHintTSCB.SelectedItem != null) + { + var backgroundColor = Color.FromName(_backgroundColorTSB.SelectedItem.ToString()); + TextRenderingHint textRenderingHint; + Enum.TryParse(_textRenderingHintTSCB.SelectedItem.ToString(), out textRenderingHint); + var img = _useGdiPlusTSB.Checked + ? HtmlRender.RenderToImageGdiPlus(_html, _pictureBox.ClientSize, textRenderingHint, null, HtmlRenderingHelper.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoad) + : HtmlRender.RenderToImage(_html, _pictureBox.ClientSize, backgroundColor, null, HtmlRenderingHelper.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoad); + _pictureBox.Image = img; + } + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + base.OnPaintBackground(e); + using (var b = new TextureBrush(_background, WrapMode.Tile)) + { + e.Graphics.FillRectangle(b, ClientRectangle); + } + } + + private static List GetColors() + { + const MethodAttributes attributes = MethodAttributes.Static | MethodAttributes.Public; + PropertyInfo[] properties = typeof(Color).GetProperties(); + List list = new List(); + for (int i = 0; i < properties.Length; i++) + { + PropertyInfo info = properties[i]; + if (info.PropertyType == typeof(Color)) + { + MethodInfo getMethod = info.GetGetMethod(); + if ((getMethod != null) && ((getMethod.Attributes & attributes) == attributes)) + { + list.Add((Color)info.GetValue(null, null)); + } + } + } + return list; + } + } +} \ No newline at end of file diff --git a/Source/Demo/WinForms/Properties/Resource1.resx b/Source/Demo/WinForms/GenerateImageForm.resx similarity index 69% rename from Source/Demo/WinForms/Properties/Resource1.resx rename to Source/Demo/WinForms/GenerateImageForm.resx index a3d2159e9..39bd306b6 100644 --- a/Source/Demo/WinForms/Properties/Resource1.resx +++ b/Source/Demo/WinForms/GenerateImageForm.resx @@ -117,28 +117,38 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\IE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + - - <body style="font: 10pt Tahoma"> - <h3 style="color: navy; margin-bottom: 8px">Render to Image</h3> - <hr /> - <table style="border: 1px solid maroon; margin-top: 5px"> - <tr style="vertical-align: top;"> - <td width="32" style="padding: 2px 0 0 0"> - <img src="http://download-codeplex.sec.s-msft.com/Download?ProjectName=HtmlRenderer&DownloadId=770243" /> - </td> - <td>This <i>text</i> is inside a <b>table</b> <u>element</u>.<br /> - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis elit. - </td> - </tr> - </table> - <ul style="margin-top: 5px"> - <li><span style="color: red">Colors</span></li> - <li><span style="background-color: #8dd">Back colors</span></li> - </ul> -</body> + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + \ No newline at end of file diff --git a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj index d9965dc33..d928e6814 100644 --- a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj @@ -57,7 +57,7 @@ false - html.ico + Resources\html.ico @@ -74,6 +74,13 @@ + + Form + + + GenerateImageForm.cs + + UserControl @@ -94,6 +101,9 @@ + + GenerateImageForm.cs + MainControl.cs @@ -105,11 +115,6 @@ Designer DemoForm.cs - - True - True - Resource1.resx - True True @@ -123,10 +128,6 @@ - - ResXFileCodeGenerator - Resource1.Designer.cs - ResXFileCodeGenerator Resources.Designer.cs @@ -172,7 +173,7 @@ - + @@ -189,6 +190,12 @@ + + + + + + cXAl(hKgdcVGV_xZnJD(df8GYUnRkKCT>1!C1{ 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

    S>iHS|@46sMM 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%0Dbb%>LJ;tb|o`Kp8Evufeht>W*BXmS?4^&TB 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%0A{4Qko^d0b`ex!LBAWYhRF*1EWi7u)hrY#_Gf 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 z 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 literal 777728 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≷IF>|OB^!m|k z-c*ha^@5nnKb2LE2v_`;rELdS702c1g{$@H*AO*2eP8v%bk}wh$BdDFjy;+RF!i^I z1>*I0!QZKPPfkXgY3kI*3-4F=A)!0omA6e5SqJ ze6Wndn4somw8oB5L4|@m)1V6;E`f9y3Wnv_6lDzX@~$F#TGR){DJH zj9Bi$2Bzg)I@q|?zov__kZ^PRz|#QVcmysKT; z6*c1xmoabDk#>m<)YyH=B2zi{muby(xo9z<eXwP42ZwgV$bVZv$^#{_2D(e++kuh z8L#re&OVB@#$i>x`baaI;JBrZSn{>_IDVXxz9Hd+K zSEG0KY>Jd~M}g9=clKk|DW3`dU-iyJJZVS8V0+^KNiz>}+2rS<)lxo7-79i3`_Ps{ zoJ#^i6->&})4T6~rZ-#ktp88xebiUagkITf!2T3^EAC3Wtp7!ys^ohw4h#D-<90Y7 z!SeDnT?o}ufzr5j8hV|h@FOZ3Xu-=%EDwrb75HG|d! zjE^%P8z0{-C*zWQBa4K*)B4XYynm*AvucYWB^H|f38(5)nMxnOhk$5oNAKlbsGmr4 z#eAq<(eXg)C#n4^O~hf)_W@P;Eb!mC=mZaFexJC?_eraKNB%pdce4L%(R;rK+-f%f zV%(GRLqqyZUU3yKR+jXe?=J!Dk2Xl^i)6(^@%Xvb6|ssefnOybEhSjzuqIE%Xc_LV z!W8J@;B_jm=rkTI8*fM%&3k+eM+&g<0|tEy!bTYM1@m|EavgG(Wr~j}K0`=an_Wm$ z_rpiy1lU-udeuPV_^^d+ilh1HOu)-acD2}2_8|~&k~-TFYyrIon&}$2_yrq((EpR8 z5Y-9kHX^Mo`^@1LpC!Ose8#Bknq@PF2Xq^#<2U;tb4F(&{^X*2RZIJa*5H43*8hm= zt5l(|rpjTaLd+zH&Vm*LE#$8duStzd=7?ss#@}epN%rUjj-C|zkMEC|G*#vl-D$AX zwR+AY1o=E44Avd?c|N$Azt{6Y#bLq=E0remd*!}42=BHW>`sT~P)0Yi6m<0krB1R; zHrLLZ5Cjj2hOT9+G$N9c3UUqAwR3=u32I(i;nB5bCuh*k656>!6V$xi#-KIcpFtWE z(g%bjsCl^|AyqR-XA9{(Aqi?;Zmy8x4AMD5`k;^mH7~abNNygF)^(=Q`Ji-RT!dG3 zgZ+{@PQ-M%(%px>6I(|sM@)pVlo6jxu}Wj46nzvxV`(P7a}}TEf}rMQxzJdaLHdA@ zE)Y|KnwOg|rf7=Z+DJ4;6g?dwlcY01&Ul<-9@-bo_V-1~#mV<&e^spQpO3sg|{Yqw% z4Yh|=UuVvbK1f-iFuHI6Sh5eZ9rc>!(PTSjav+i2`Vab9HB)yg@d$=Yw*{eg(+NN!gjr60jB0cfXe`i8Y?=K9QUJqdAZ1()x+T`u_V!N{i?cf{le&DphlPSNSul?{x}aCtJ>1` zzE;|f2-n1gYy@WV;({!G25xQ1=h2bO;oFlFe?oDy$Ms3Q+vr`9rMF5j%LTs&p$(=- zDBl$?QEn#MRc|6>bM#p8_7r{byyjm!Zn4$`K*Xw zYEkYhcr4X8Mdj08&F2OD0uR15w|xug{-xUc7lEn0e~CAXz{`0_xARKg@l`zBR;sqi znCQd(O5v`-PvO4In{e0iQn;`1j=##oZJh~MHk*yVw)7Z(=$*HC&P5BrUHVVBMPgTu z6k1stU&ptPpLK!j`G{^Xh|&?-p5|lFWgYuQz+&Yl-p#&^F<5z%bFZ+RMA~VWmRG6F zrn7BYQ2Pxua?#Bqu~K6x>jAg$k=jGjE=Z~9SDO6t)JL1kQzo5?>*z4rE0-5Tz`&C#>za5loeLPb zSAmsPD}IsYiu*Az)`@>2V(fRzH@=S#w+#(Mc5*o<#0h?VjPg)cZL7D>U-cV15*Mp< zX@X((Y!h?8r4r?oSx_z@Zsv ztSQOm=e*C^xu7W%#{1W&(EOHsVW_9W__q1NhQUdf z2GT4FF7-t^YSlIV6~XH&VrCJlOjZVS6i#KesRHl|SIka3b-%XuYfv+=-Bb-819r9W zeE;;Asn>CJ*G)P^(88oE!yewHej;r@G}WQyN`h=||8|Lc^)HS$!z@%&Vyt)P{ z=sQ!%_jSJ`IGwQ15VlWh310w*HdP-cAleC7c*wKIW?Ffww|U2;Hc?7LJ>iR@xKyi| z1-oIz>n$)TeSjFP7ow9^Kh#||)d|+&N;Q#gQzC?}=cOy)+;zYTj&w7e)C{R^nkE&7 zQYN668+0WLv2t#UKP`;@FWVArR=>3$NBv9TLqT2sB-l9jAZP(1D88Wi!KmL z$FASQ4`bK0ma}1fJJ|PQhV>miwl2$plH>sC_vTFN%H0ns#QvV9{z{KK+^h zqiLNK;xAQ!jFAz|-+}y`fXN+LD*7x@&#BL=>A_>*Key(1eU0>2srb&@s%XLVR^d}> zA?>-R65o7P`1Z8&ooD6LcMzja9 zi?I~<^Mt20gT_>rGl}_RjJE1#baU}%sQ{fT_W-+VRTVeni(DdAloAy;(`3tx^q#v! z3n9^7D<-;E(}F2OUVrVl(EX5?XIW)D@E5w4Z^id9LkSkGAwaIrLyk ze%*xC35Xw&H=~TK=)Kv-{Xi!ae+$KVSNncGH{QQVv!5^eO%m>xg?w|ZVqWmBq`%j^ zNHQJzN3VO#BZC_xFllQ1fz&G{T*e^mj^! z##f}>;6?Frz44N(?<^*2dRn}Vi!xMyA*#=cs-WiOc2v|CXOJEi(sM!*)V$nILb@b_ z^oWrDAS6M}%k3fuI~hA<_h=De^hl`o0B|U>yCmX*g*h2aU-qz77 zRpQ9QkXeB?D7<54q&~T&5|B; z@Hgs4H6|AK7b5X0Wja89Sqf@ydsi25NxTgqp?eJ6M6Yb1db?2ns$6zYwBVS3z6!N z`1o;K`B$#KGo@cWs})>Gs}7Rx*=9&-K9;K=PDA=EGj*Qo6)hsd_dIZ@#uQ}|rvH%f zFt%(IE;l|)38f?7KZNrVReMZO^K!?t){&fBLGJ!D7*=bQj^52?2m4c&e^)#A>v1Yk zKWmDA1uD17Gz(NV57;!amF7aRRjRhGZ>xxrnh9PiKri$}Y7anE)Cok*2Z#zYfjk8y zY!#WsgFM1~5Q(N$Zkc#~FB+v*(Pg}>F}8Bqh%qNJV&zswXF@zDV&zs=XS|*_&YFd7 z#8hH7GcWYyTcw`~^e53v_A9GjR>}TNosH$UmyvMN1*$FNB0b$pJVvx*=UYN9QhV@F z4KJZnJIFK2Px<9i7``ep3_ zS;O-Ale0A&yh*eA-#6C>ex3|&>ScVMTF*+}7u0DbaSU$O7qDs@ysR|(I^KO?TE}y4 zSELzMkC1%Pn1)N1m9>so-4q;acuB1v)mlsoYGMTDc!XPY@1u!f-JD+06c^n!gwR0UiSIaft0scxD*mpxVBNUs)=;R{?aFiB|33_=Pi38a<+U z`EcH562OfZRp8&?CihF<5Nxo*+u9F<6N8)AoiGXJm?urLb8xTxuX$^E#4K@-X0H3( z>ayeGCCjUB4AWaqEg}Zo$|#>Dd7mX*W2-FDOvsgw zaRmr&AM>kLzci8#!kLu1UMsi!_YuI2&HgK|Jx& zNN!%%4=)JaivYOc8Dt_t?h86_@t&Y}qq>8dy9Ajrm0C-#858%&k1kL@l_%BW^NwV& zw6h2-XjjfidX{%Kdlq`mlH|dHf~5E-Hoez`UvApj~3Rj~`#^qKKy|mC?F{3fSO%7)I;@2tYoT4(Jns<#{wWhm9;H3i6=zG-R zXoYDC>lhsON!F`NjVsCOw3=3kG42F?Oi=T3`}z7sM;x+xdEB?t_BtFae=M-IZEOci zS`R&cNH)~RXG3p<(N=E`5Gbr3x+$goQ__=j%Ji`M1r>h_;10B))JK0dyazL#EBzqmX6*VG;9!Cj;JB3auUq!QSdQ!*{z#AiYD@KN^WO^joCbxVnvgb)xCsao`|!{dz7LcK1!w=8@d^! zeNHLjKxxHHcqF?ISH6SMzPBS@2XBr?*Th0k2em}_Q7_n8I~DiSAX3?2G4Z`F9>WNw zx=PeT0Nhf-je5=PZdSvbiaU(@pk$(`3@2D+vi{WDBi7s~8c>)feQytf!Y2>Z95FYe zHHA9oqrkW6Cei4VLT-7n67PJ*NRr z?Ke-y%^F!WgLiTwa1HjG)hDE90%s+*UbWu2C-4xObOs%a^6p?`H5wGrVU3_g-7C-a zETw2&-gA<{{rT0EkkHQrp%qVGu>RKR7?rm%Cr3Q-H%`H3jjEh^4bpo8itY{Ow8j{S*+(Df{a^Uifwzl64<}IGBEzWx0~pKk}Lbvf|?;_Fk&j(W+ZFX3DJW;jq`)U==Apx&=J<&pc?w zqY^bK3$7re57C9o{e7;V@2m7#a_bX=o6TcP!7OZT13t~w;BX~f2iSeV{xlGq`KeIbHC0YTECLsaEbbp z>u{S;duj1fC+NtVfWkR!NnCV@3gDJdBj_oct%SH3SM+oLQC^HY0k&O+!se$$MR}x!*SHZ6d&FA`?`8!e^7)M$a79}IV_YrT zIoD3onD3aFkH4>S3TvWCZ?QEvoyCsmE}+HePM%jE(%j$H++b7abt!**2$TvI5X3H9 z%@=%tLkV!U9s@&M%qU0m+;Be70M^|WejCEiN&3~U;NAF7Z2CuxjBJ`k$5PIn!&~83 zjF#ZW(54vH?OqoB41CJb-LPwSqqcmFcrwP^v-%iAxmq3Q4R$-+_si&zE8EP@0<`wS&Z0uGMM>gEGxo2!w z^Lm{(t-DVmkKHS@l1jd_gQKq9T-Q`AmEFF^C2fOVMEf?nJK4o&PzeS)bJVMe9YwbZeIA>L3jkt(2q4gsn`h9GSwiim%4u7hl@gv4JIWR& zQC(12X_GXmEB$_R^dV?u785&Ujc1~)rDpn6kNIG$-_^(gW=96ckLRZ(6Anv~&21XD zk$+~jOPQ`cv|Wk2NA=RoZ_He>uv5%j3-$O@j9O=eZZSDGx_*#eT6=H&|e9x81X;{{6G=%t6c}lsfjJ8e^f97X76Da08@+?lt?Po=?5XnV^}OP zJ?HmU)V+j_Z$dO$gxA#Ma?SokTbnlsl4sN)`HhZx9c|fCe+%EeqVM*ht;lXsA8u z?(p{k;&r@#DUkZSZj-f%p2?F!hIV;tbUMyxoVu4Yq6zdPg8s*#S2SsBoo0;iGvFT7mEdkB1QcaI`H^?zS{4`J+GMLL3 zAbOgpIa{}?p8(MwgiFTCNx`)Q8dP4{jlT?&d*b_EmT33l-Bs-0t`7uM7^_r|kV_&? zgo3GS^motFKzwn20<+${U7Lxh)L$$gZg6)B%|6;2B9gYPr_SNc>d7;(#**q`80nt5 zke*zzWSrX z=&L$S44sppM>~T%KEvkg)(01Z`CA8*v~PYybwBz{A7S>KkNQT9-RmiCW5*xwVNLZ6 zMXYqC>6ZOY2q+?gC@z4aqN3uCihvs; zT6ea(0ivQJZiq^GzrS{HUA{PZKZIhPEtqh7ap5+mk9-QQAHSQ7IL zbN?Ze{D)5Rzh;tu`6T~}N&dqo`46AuKVp*qNcU%SX5XB?qdXkjpGJQegPFr&-_Bs>aM*nr%pAaE7qSmo@rE`AuO*+9{gkpv9IgXkuM5QCT^1&@ zXs+}a-VI<_lWiQ7&SY^MgB5TbWPzU0G*h*+^B9iL4PkE4&PqIAY?#gT%gF5-yoPe* z4xGAs)EHXtri@`qo^@uO#vP$q5ind}%YWs32TT zP6RTQ&|J#kmnj_rnIX+sB(v>2Z+3I+cT%2g;z{6Cdwg4i>Sm3k?niv9_W)sU%_qT! znFP&N6vF)bsr;}vKk2rj-XpEco_c>dnaA9O%eDb$R@ z@V+ai-uzruj<3Ba*tn+XA(~3yOrlF0gUnu z_fLp3tG&*$GZ0S4&(`i6cqF^K9%b|JT}vfeq{BT5-mSsQq`AGMJC$%4Lv~1_vr2Ls zi+QKnOsOUx!!2`}50E?+ko|u3u0)&gu6kOSu$ZZGXd^;B^S*Fn&Ok~%-5;N=r|-Ml z_f!FH76yGqMN58`*NOBS&jLI?h}g5Fl?zx zsJ2$qK{GMH6GUx3&cZYIaZ2lR%7L4Q zzLsJ?kg(nkPsd8Ds~4PjT1q?dRN4u9x6{bxQIiwJSnRtYUCXkuv%Shw7&||L0*x&n z8$P~XqB!OD_?jxt4j!i?8-o+$R3n%p_;Ix%Oq0LG<;D@)a>z2ZVV$cImQV=p=C`GB zZ84x;j!X>(`&K8eYJC250^J=ECt=Y}qRGZQBP5OB&C3l$&2=4AW-y=6(5K_B_1bvYndTZ*QP*ev~wIzkQUki9>XtR{U6fV*622}h zCqMUjzpof1>n|rc^O4@4634-KKArAI1orXCC%_WEZ=_+5e^kqR8duJCT*9;jr(tro z!*Va(&zBLW zd9Ti0P^mad$7AKOqxIpm>==FHu_O6#gVqAqRK8B!<{4B(M`ctI!efRt8)L$`R5-tp z;yg}B%45gt1I`oljmM7V15OKEQ~72Ary@+iIXk)&oV$SYMaEm&p~3)-il~07!KR6O zf?UCe!o1MRJD!h6n=rBPMj6pu6)Haxa4X|}MX(cSTxYO`$5s4n?tOQT$`p%X+A)q& zsGr_w7ZUEOc4?2ra#u$>7JX5jJR!Acanw>$-ie|3w>!sOJ{xb(6;dh34ca*Vlh+8up z&buJgCa>Le|h-sNm2I9dR>}v(ubs%Q?%O=g8S( zPL@opH7jGg`W61(c2T$YADh z*l#kJIUM$61~Z4lew)F};jrIjFmpKU_ZiF_4tpwtnZsd!$YADh*dH^PIUL53n3v5Q z4tqL-nZsd!&S2(n*fSZ-91i!eqUX^YTM zWAUBo-_gHic+3Hw1=}o*j++rhd#EpkKY%K{N^KpwgoxQ?$?$nS3)u$zl;(vI zx+()JC39VcY^11_urZ%X(jMR83YR$+-YMC=P3YCMyd76+Jnx01$yDQAy4( zK+B*{UfTvF%NVQ41#Lk1v(jA%V5;Gso;iOqy5-;*D0`q|jlD}y!Y&}sW?oy6dDi8? z514e;m-BtO+Nbr8Lj5lxX7dkX4h6NKzzIFdVTO$Jh}g^O=wF3wx6X?pXiGmK zP)DtQ7a~!jl*<;>f{e><+f8beTK_2|*j5SHXf?(KwV?1iu$l?}&OuI4P*vEJmg#~G z`WD~e;{kDj<6R|0f@cD7=>879c_I|eAjRdK)MDHXfqJFfmRAaVTP?jD+_d^g_i~q5 z&zrE9OL_Q9qBk|X-$|CMbM3vUGoEtlsDxKjD(U{cl5beVPkBg(!PR76+{4-j$K{b< zVJ>^_+^`8C-f8i$u%Uc}`}(s_#3h6172qu~LhXn@{E;z%TL=B&X?O1>_cL2Ld`9EED+h48CHJ$Qav!;$bN9Y-|J&XB$^E>$_m}$xcOM}43}}RcSIJ#+_knVE zxck*|*WJy-Qo?* zgF1sk~R(xw=v2xIMZLveb>xso{eVSS)WD0^e z5VYmzTopT7(|0C2aF+|05_(Rf#aVE^wrwvOE+xUZpcWL4r8QbF6e7Juk>03Cf?7~u zDP59W2CREf2e9?zO}I@T{mnSS<^0sWMIJXICkUu*3~BQiZ5qwlDVhn>J0r%u=|0{* zR8Ms9iIK`1#nFAy;-@niOEr2gu>FVtpBRsd-wQ8=yl_19a7ZbDjpj-#!UjRMgzumd zyak%Z1+}2$3cQOeC0N)^2`z`+`5o4rR1SN{sl$&-I03u`uK!Eq&}Be+(-nP%n8 zn)B#@!2n4zS~Ciz*%4UtDwRf13+lhpl1RO?r^DV7MwOETz9sek<#bV=TKq`9hSZ|n z$>jjmVW>-HVlWRQ*VpcC!pXUA(H^9tqGHtwWDgIn?@D1 z9o6qh>-wDLpiid@{_qACU+cXo|M}AI%29LI#7bnmOLpH_a^^PwH3^Bng3iS&;GSFC%RPbBZi)|8U@s9V@ks!k9mTjb0Ds%oO zK-JUhs?9t`=OIk;d5Muru6^8vX=kx^_qAAn(Bil2F zE=VY0!!^IGSR?!A(7YU3eZJi@GG42g1oI*wQvJAo755EQjoC9j><1EFC)R#IPZ{f* zum&~;U^`D{O!Ui$)`!seA}l?n?=vcQ%8*Q|0MhS};*l~MykR*SB*ilNWs}~)nP+M2 zYQB{+eBRFL)NjWpYw1hIuE8avaqr;UyjI{2);#NHI+NN6Jg-*&#$L~<#BW|l6iaZu z61+$A>s=)_sf?UX9gm#P zPjVKOHZnHRdzrjf=Aj>u7Y5rSHwKM+L%jy*t$C!6E7FT&yfcqH3FE?}teaOBZsOft zXUDD}n2-B%v@?Vstor?KD(^W>0-o~N=`P@rucLC&sS@fer8exrx(6igd5>!BbZX4^ z?$V*rQgaBnu;Nv!U|dTHxENPrC}b2-&jpp=y`db(-vD!?B*T$j`n>kIzo|ao-r|GR zeLvlG_6$r2<&E7zYwrS)%cOlU0`8!GHiki-az9IjVOx-}7E2A1nW?wKMK=ov!kLtV zgXWIm288xhhD&^S+PCAtkwtq%XS2wlgs!LBzpv`MOsHYNmbA)+>e)-x^FCFNpcWL) z6549n(DhUY+UVX-JkYJ0h_0i6ZtonOpe_A4x>{{W1FPe}@N%LIX#(%5^+O4#3AmN@4Lv@{9#j$wp zun(}x>>AukFl&oS@&O9aU0-L{DzLa~P->>7zIuWx7A%ge&8q%+MZx>VtmvaeSgt&* zsZq2OFM&Q#zY?z1GJ{%g`?_joc&IX@J0RuQyOL>ipp%R8K_fw%h|4Ql5a==9tLoOP z&}Q3=L{+zPXEv8Q>^C)*#NHz67%1CxNHZ7hDWtUL(5eJKNkm5q=X5WQ(t_drRYRGZ1?uR*UjRv!d`VItRr>uE2(a?+V(dpLx}K zOqh6!Q&q(a5!N3|&ILxW0(bF@lVH94R;zzeLF!OUTK`q|0h;Kd{p%Hr5m zInYp~dq)pH!o$l`g?EAHNDtS$QIjO1PP;=U48`>vCE(z)A0k)#j z*}R3S>8g!9%>-UeK8R=4pQvcN8&z$72!D6I#4+BjxYByzUhSVrTC%M&Fxfx9l{}9o z&yof0s%^5WGt7o7>$D5pajD-ght_4N8qW3FF~(ec~xD=>a+8uOQRi{uCF5A zOug+G$}n<2&s?FqN0l@@|Bo8MbHiq4j&@{kVGJdr8ybYE{EDq7J;A*~t z4AFsAH_`n>Y5Ip6m6Du~3&5TN93*wy3mjkq0gEx}022rt4w_`l0VWU-U{h1$LOH!1 z%#qnQZd5TSmZ15A!!fY&>~1P%tc)B%z%B$v6{qzgvs zn;l@{0|UI(0VZ=Wz*`((f(HX!=>Rydv_h^nKv*tvu5(zpU;{rn`R}bq|}qGt-3ISaKy&r-Q-he0qMy?`bi-bw56ZW6w&dMS^g0#8|2u~HlJA_bB3kv56;gvZ(t=O*?`K#S( zhPeZ&keZ!{_-EIFKi=jOb|g|DY0WHTa+)&vj4~0_g2HE2xcuzrDzKiQJ`j#3F8ji9 z0K6Ecb?VO=*KBZ^gKUPZCZ8j1B^*V}uF1pR2RfUp%J9oT;j+i8*yp>FoXZ~j+jC}e zv#>9u-`NG|OfJc8E|=5lUbiF(Cqkb+$Q37_hk(L-^98&%-BIw=5{YTeSChY}g63xB z?6y0=CkfAn?8&C4U1n&~+02pAb@O`qHtv&2-~1w35=)B&;u3zDRwVJvJqk&<=Tq@F ztu3bcTeAu+b2_n_bEw;KK`kgGwERRg5(cJ_N;qHrNo-v>gThr>vkU0X5V|ix+PI(= z6ke;|q>j>AZQe=Hg-&%imbfC6uwH^BO^8L;jz_X^s6g3H5R(4A&bG`c668FWcpm2?S=v?e|upd zPaBxKK-l~mKeis!jfXg0;|U=I(@vcHi?54$(sv2$2;abA7j>?mX)N$8D)c1}$(`~L zCClgx;rg-Ta=u|zAx^{WCLzM@X&&WqlE3ktB0qsWzr&T@E#QR}%JfJ9+H*oZlKU*- zJcSUIL4&|EKhYDbpE=WVa+=uJt}fe`CrW#KnzkZcv||)&q#yBDoYVjy22t6Yh-Dgj zm^pxHJrlo9w-mo$!tTYzRD9ab9!58{ zFnIYwSj7hUh{AYd5Q#<@S3+=keK#TvQ2kBNQ*A%*lbnoLA^{W30Z-G(!XP)hXMpB&88MKWhF3x9#-};%#RKv?zyTv z!{@2uu#%{8IEUY+DpU6n&R6Q!@`L*Vxi570sN5I1yD9g%a$CF6zt+pz*&O5rZ2b&o z4u@@!!OY>Xg&E8o4qKGL%;B&NGnhFXwowK%hr>3`VCHbxCK=2e4%;+?nFAPmxvx>E zI5|O!OY>XZ8DfS9JXx+Gl#>r%V6ek*!CIB91eR)1~Z4lko!6<=5W}K8O$6G z+bM&Y0~qpy-$|MGN2>hM1qxRG8O-9D!_y9BFmnJyw{JeMZ1)%L07vuRtiQCM?iVRg zV+MVfcM}9ZU5g|=S!rVdp{j3yY{iq%W(lKP(Drf67TIx3I!Af>^DO;UQ>GVmy7ZUF z;r5A%nx3gae@u|wJ-iEtZNfzRNpW}+{?xX*oK21sZM%le({LvM-^FQSb$|2gS`6Tg zw?m&zxOh&%=E}@}kQNQ1XMP@0nBbQdaxwhD)K5K1=bC$ui=uJ%_2;V|I89Wm4V|p~ z&AIXoxQ4`axc^-FW$wt?5|k$)Dh{9GH?@i(MY(u%U7^t_75bHLBrw$v2xN)0YEa^Z zKHIkUvtQBqO{o%Jq`bpViS69D5x_eH0KzO1rrG#JZ6rA)e3ck|oje7iT&qK@z0q7W z?+X?PlHH*gJDgUr9&b==X>%Q>;x69zP|7&m1EM(Gpx;`uKMI1YCFidBF_D)^Y-}z0 z2CedFTFUi-AY(7&W@^e~DviC8SIZw}i)+m$SS`qrz?G@)tO%(d#{q9kS zTOPfZwrPHoEF0X2i1rf z7?141NC$ZgI(-i*8(8Xw`jgtP{~@NN?IN{rnny3~-&#i3`6_Z2~`5 z36EQV@S%5VaZ#`}*bS+iw>-8BB&1gc+qZm}ZI=SKw=(50Bi>ZwZ%AzNaLp&Yk5#DG zH2OD3f)=KJ5$zTVRAF=f7jzF59*n3T4d@APSB+q)%~DsA(J3aQG47m66gR1nb9wo13*mbR=&l@E-DkJY;NdXrHj>`0sb)I+ep=OcEDP zc{lE#3<35d|Iw!${-zJxl7HwMhrjc&YxHA?$Hm;JFT*b(3U~g?9E=@cugqZPaM(T> z%p5i*NB0Dl-HVeIAlp9*s4)wkeX}&?@H9-1d7At#oq$S{-3NN3>b`IvXa@DIa36nu zALug0DclE|7^l<5_L~$ZJgXY83NVFyyHvM74S{G-mv&-D?zq>p^UOCZ9n6F(t(ZQY zhQb21zwX?`;W>-)Z+^}EKv0?Vs$NG^I{$i{_e*?H739}=LEYg(Tpe9b9{=S=AfvT)BY>1j+Af7c;*0;yCi%G9=+k@aA%zbH@r^ZOZeesBa0oXlAhCi8)i`@^d1 z^Ku)!l{J0u$`wDW$s?kzF}R&5#ZIVvX&d)+CMLmCeyKq&6*L2{E9{N1niN}p!*xm< zYx-`;QP-273t88oM*W5fUMGOSG+b}1j0So+tX;Eu;* zd=}fhjhx3OL7Qcnm?V=_S>CF#pWW~5w5cJTvpoE53fDTN`<)ZQt9B>yYQkUiew^p} zf4U#XJ+Y+ANl9txF?rY@ksE`5D9kMhXgEmKOSZ%oLTU3iN_-jJskI+NCEEcn zQqYqGjSFf)t^Et(8!G&_3K!IZ!ka+C>?X_`Dfow!vvoir(Z+)QUWo*?pzvlAkzf-A zJta~u7b&kQq}o(Le^4qxEhxN2S=G43Y1K1}7(Lb2S!%s26jDz^T*%;&Y@NE2(4JZ$ zCLELn7h~FLqL}#v*q~58tFNX%^wg83v;{NTB1TV7SF#Jfa}TF!HLcmy*zGg4reeZ3 zp(3{YnJcPv*&!}K<9nDx4b{xS9fWG8q3WIGlVeJmEe*2@Gvw?vliA6J!avjT-{bga zI{ulC-^WIZXg7Lb)~`R1_v_xCo*sI3PtSy|-P7ZJyB_9Kx$Lv;{Bh5C``5-2KQQ;b zEq=v=?$$gaKIa`8SC6LSYJ|q{I!m6W?NIhxtx4(6YT~P?TlI7J54{15_%XVcw9Irr zCk_`l(yg+Dcj2u>Hb#VJRE>vV=8S3s)jZb08ar=OESnUYWLzE9uT6@zd{X>{@-I$` zW{=uvaDM!qnp@_giUsKb2l;$` zDaqgcZK5A*ugl-#+eZ{&SzZ3a5K58>y*Hp%|C zThKRyc;}_>VPn%pyQoN2iU4Y(0%G4H<3}%yZ;syb(&u@8W{nXcN_#nx(Y|RcvpNAs{ zv%OumXXG3~;+pi{znqM#)9HPTPr@WpNyFrv5GL_M8Ybt2Fo{IcFge>{x-+>W6{EkD zIa`=J8TU+4`I&}hQrnVJw{3S;&a%D7`yQ3E7+h3>`WF?!!keUKf>p;qut(c4H1kJw^V_Z-RO8$n| z_sqk*XBV_iHUDmvdqAB014kx%fF)cq(BQ#?Tqfvy9IZll~2DY0}f< zy>r10;?6_Vq@()nPqx?gv^;jGf%NP1Elc`Raxs&vvdF0%RrlEDQ>0R|x6_dOU*UfG zoQErg=Ye4yKbOqI_9=w1+^KBpS8z7=7mvP%EQW!iENo;ZNVqG>zo-{ea5ockron6z z)|jGuBBK$xk7yX!tC;wMtnpynD-PR{`^f3kM{-0v@8j~kS&qtnPrQ)4c@j~_6cmrz z@0!XEplSYFO?f0?Irt?4|3~1Xb8vrhSnh@f)uYb%gh+){**E3;KH9OIJWtwl|4h+! zsx4ZRyTurLnUZ^PD~)jM;{=wIHOg)Ws%RiD-wHjU{Q__z%jWApNb`P;H81|VRs6#t z${!O?4pi3(@1VDKgmsv)!ZC1}1Lf8VRff(br0t=SEs|DK4-lEt4Amtu5o#lc?~sO9rws2#{}meTXsSMPFUUH= z%Tzf^T_{vNxt2o6E{&=VyEJ9O(>m9iSD&IRA86OZlOXbX(9Vk?zAc4stk&XWgm+d= zxo>*Hs|ZZ2LkUyOGKYs0q;6R^R__L`OfGR*dod7apLVcqX}MJO?0z`SOhTcRh620+ z$^3=h<`S0hch*_aZu`;&dbe2+eV29qrgnMihi2u`#!!|vWWqdP<-0Oqtx{?oR%p^) zp|g1d8H@{RLE-1xWH7}yyctWa!wU&^%M%D{LG1*c$a>#N?GJB6-j*9C&nI^dLv3T% z)YZG7?mDH>qT*>fT1OOe++8_#(1_!LT2Q#21e5S|TXTsC7+FXiSc6UOWQ6UIg;ghY zK*H3icx{;ctWyEmo7jbJ2IR~veQl~y|pm5 zebhI7!q?f-Ak}m;?cIFbc*l5b%$UW|`s*;_YQEEZb$B04AD`Ns*k5$WXK;S{VnQymiy3q zh0dJP599FG-F4ht6kt(r42$}7BHNdGcHqVUs|Bd*Aeq)!W#nEcF*5@^FY#V20y80^ z#io;28fM{SUQ|IX$24Id_==I)kaD|Uk<)pAJA+q2jdahnZ`T{M92ulWR7re5Yr~fhS zhb`?f6Z1XF&jtl0-|sO=G%8crtpCWQw3hFGNy~bDENJcQ#vGJgGBq*a9|d1&YU}UL z9Kp{$qCR4_%8#Ij$nXOOh7PbQwslf>^1lkM+rZWQO*(EaW~`*l(ley@L#@;T5gcurNQT6VLviw>^-Tmhbl&+t5i#NWcZa}s}3a0 z*eYX-N*&3L5WSkN77=NuwIYc>;u3@~BF;?DNY0NoeNUt$oOO??E5J4GXNx_4H4%jD zZ+`V9ZJ6{Iw~iwyTh3oCIz-&KpcXV{s9MJtVjYxGJ1(dNjade+Dq!`i#Yz8%rswRX zv6F}kQ+YBU;Ls!huYYvf=z(WcNGa*^!KAbNYn{ZXbqXOFiH9rmZX%5fYC)}23*kp7 ze5S$$wV>u}fQ_FZ?`egYN9LFWwV>ANh47%HpMX++}e)N)*PM8ntobQVAX?UK%{OMY z!Oiq<#-nFIVlsq?W|A$%T^+*@L}xb3v#-X1){Re#2E$Y0U7~p+ zSX<)CKzPm)dOcT6o_adP!J%E(W;#89Lg~|K%d(nEQT+IytjVUygyb-to!8$ln~c$0YYJm2l-O^KooCoDvSfzuNXY#h z_>e>XmYKJ+S{i%3CS}7`9hKWSj>79dn`@?L-^m4(vLnyMjla|6-Oz$PDJ$#epPoSD z&iR6op(#xy4}HZ^(VNsjsQxNDPfzpxyw$ymHN^R6WN$pgVT?l26z`^c`*3KTPmF9@ ze4TpJhScV`pcWL~L)6Z}(?C(ksH^#V3ejB)Odobm;nrbTlXF~`2p2~Hjd4L+`U&^Y z%j#Hy2VtEhv1ENa4%gf7!>x(P7cD z+p_yF^+@7#{l%kJ7vc%ix@dunA#|Z|ZVWZ8bHUk{yjMd%4g$Bw|BK;Koq}gncs6O{ zd7tAExQ(YHI@G9vo=~TZtqTjKdxJ3ifj%=Xs0FzpuF*oIOBHETwUMAL{e<_El}WWi6-$g%2p} zt*HHJp2A4^imvFmv%F0fu-07;ZC{**HaDFF|I-L}3vJC!-`xqL@T zBUj_QslqYI!^|!>NoxD3Im{w{+9s042*;h%;JERB!qE|FFn<{w%|9@TbpHmSVk2y? zc?&6VxwVp}fkXVG#u$1fjWC~DG|Oa_QAIGbJ?Sdr^L;&{{i3g^Jy!mUj>$^72!M@} zN}^Gc>;Wg4`qkUbpO%aH7fw+3ZNkL_!E5^kBZ8TmQfZ|475wav-k~^IT>NjAU%ccH z;a`OY4N(5JN*{;Qn4D(@id4~eP)TN?sM0_3gZ(r2xXLX2D$jXvta+7`tT))K9^Rsy zqUbonw=zZuEq`>EsJJYMxxN+&&t0ku<3m{zt|T3kZ;L!)ma(v#s`_I2ID&GV%9p*y zxX6(F%^ctX_PPva4u>f*WhN8+U*p3&!hiSH9D6fOWOXH+%8lHt+pm#K?$zME8@&FeMjYNogw&dl%t{~?5G45r%$`}qOjgiQ76ZOkV0lIm4RX~+ zn3K&I@r(0Ktms;bEMTq+fUYM7WvSby;U23usmnDwkl7%D>7I$|j4Z;NX7Rfe83Keu zJnyBr^_MQ~;wr{2rNGkdgH5ZXBIdUCV7hX*&E|8$(+Pr+yXY9%8#v)cvWXG@yj$OL z_<(sUW0weXN4Qzu=JV9|*c&Xb>e%b~W^~bJZ7#@0+qX z=I}Ug&S2&MMw=?zKim)WRnKUzifCEpSSmoWYLhv`g}x^A}kV+{m}|*}RObZfLd@pD%RyWK{2EJ~AE@ zOO7f&LLB>LM_38BLIVw>KDuC=dC@n>@f&KJQT5DHvP7f7TcVU4mleYswbY;dn@US7 zQoOnjVK{5+fLCOP;p!)qs;Qr#Hj?~=^fgRqB)`C6uMc3KMKdAddNxsJ=EAK1`|CVL z0)e8Ec9g7*{T}^i1}zLL z-+D`-X+H^RF3J_uf{Zf{AEIH$uA*->w}g~Vl<~;8%igfAB|pX8U9Hbewj!+NH2E9W z6HE@q;r*bG!%h5FMujZdngqx)Rb8?6D3!1SP2IYpK+>mjk_5G&a4Xc%M`QI-j;|Ww z!vI=W7E*m$skS9(Tu=)NoMt1_r_#0q-rF&#J1ErT_VQKGSV>-ji_Z>xtSAIp{XXpV z+u=$T9j;U{vs`UmRmkxUS#s#&Y@KKTV)B5~t;05=9VQrPzC$9+`&4K1uKXA?s#!epB)7=VLp?pU)YZI9wQBRA z%_|+r38LY(G+A$>s{V$C-yjF^(VWgOBwtsILLCA}WThG@mMqXBiOK8{1*K!RuSp|UY!D6P!}(tfschu?{#N$VjsefNY`(q$RDI!{`CJ5(Qo6~{>7^}_ z=H>0cyAv!{70kD*LF)sU-tz8`qMDl4dpj3!6ibQ%Cby9ujClEPTYidHa=QakCuo?! zhIcUriQ)6&c_enuREFdIs(r1$;u-}tSW}^Jg@T&Rl%1aL`=qOyKs=vSu{2hgOUc34 z?e6^kuUAv@4^@)&q~sKp!=|a^Wi&W^iuy$yZUL@$wfvkwYrp2A`)pp-a@e2z6C_BC z)V)f+CNcCX6r3*E9&Le)rGP9If~_Tqo5YlKD8=pw7C2MUU@0C zlAjM`=LC}Boj@7xr%cU~&B5{5TbT?iqxwyDAyMkwRn9e)vZlFQ?$df(fu_%jCTgcK zE~o|RW%MOsFN)XPP5G-Gx8mGI0~akLvw5Y_tu}!sEtffsqD?X`{rR!q+?gFSD>JJ> zmjK!_NM=R*BaTi66@$S%vlhhk#T{dBhnRSN_>vMSfB2<29!{a2rOU8NG=+N!muzl#T5c`boQJYg zBQTTA(KG?^nb*JGLOK^*Kge+nAAq+YWeZ;?11H0DRBe54*y~6YTi;~>Ps7`7lx+F? zwfEIdWNA)pMB2PpONEVoCu56f(SAOU7xonQsS34^kzTd_Qlef?S;pQ;#TEV6$=^}j zE~2wEyTDfCewDKn9?+*8ex}b%E??{0AH<@?%{|FF{J=sw#;#Y}rG5Ba zSv#5oT4`I(y}e(X0~qUx(rDM6^@(?9am?ZA=!c%p91goNgPFr&@6BN50H$%X8{Z$Q zElc5-(21&+*Z)NPw(SD2B-J&?<&fqKHg(8 zvY%MK-yys|Jj4iaRkz}-p3cYbBlBz<@@t~|d@N{7KZW_&*X4X2>5kq7^*<$_Y#n(C zeqRc{JY|l)e58v>dudFUkFVruipxhz<@*a%K9*A{XiGl@Dhn2E+HFxc`xZYd)X4+n z<|}o9=Sa)8V4JOMPxzq4S2HB9p#F<%bho-nO*(tiIK+zL9MS`~UQ=kZLUOJMg`K7lRNfWG%dnb0z1^#C}dOIgUE8m;( zo}Z5{+}7U;!0y0L$*ZItgT%qVQO5ZStv9x-(XN!~A!`%g=O0HLn-qD6qL4ZpyIKx} z>Q_0cPl^w6yOqd-%sMklu(n7#+_tB`g6HfIy1KKDz7DKiA$}=sH|p#W8$%! zaixHSDzA*)A^;EgkU`q#*0t#Q{Psa2*xGIm@?~CBBFRgHjkCw_G^xWeCb{?dW_J1H2`z50N?>?`ssKN*))~g6tqHALI2%N*fQW&RN5aeeg5X zO894+cJZTsGyS)~!4SxMLaqMC9-(y2RSVeaPa7hmpYV z5tY9b{zZI*yRsQkNoFX<+>C##*t-djdOVTY`f!0NF2q-w2Qb*j1+}2?X|a@d@B@dY zQ%|e_^bN2Gyg>I@maYMkZ7m{9e;N55$sBU_%1LX|h}D{r(YtyIdP@a*(Oq1{$Md%S1n*oC?|dMo37^q$BAw^$x{{)`6rQIFTtein zm^@FhN>(^;PioH7wPFji^FJ5ISS(kpXRIO*H=D|eUv$G~tE$i?HGaEoPTtB>HC^am zs2-9Zv27Zb+D@GO7-ysPIE~PWBzhTTu+G*ufR87D8`ZErGE_54=4I-OZYJR`4G&WB zR59vmL-um~3%A0y3!7z$%qywwcmR!|vxw5H`c}k-4F=bg!0hdMbaSrgUtzY5$KI}b zb_bsc-tM$ndi>`fcmp{8~iMNcGrR_y@4ESj8n zb1sk0a4PkZjuZ6-t>eE^U#NRuXq(BlB92{Sw929jWHdyEPTlOR&G@?QVlzq~DmHQ@ zvo!PTNh6)hQ?0VGcUbqcIKD>k|F?=S3pP~B0@^u1!xPXDC$h%F9xXXo zQ{ri)^i$;t))INc$z-3^XwLlXT(2By)1$xGuQA)*V(qbFzwK;yi&=MAH|?I-9y(2f z4Zv@WVg4@j=XZ?@zQ!dl~JX? zC#j{hA8=>=~=NLEsllR}i-_e3OdBrY z|BOmFoXYHMLq|?0cIyNYrjRa}y%X{99!xliZ*RFi*RG+4lkxSGq5C+{7+YRSPEj&l zQoTh$t}~sWv3x2}uS3?pzq6JM?3g_?qLD$vPg)->4so^a4179neX7udHdGHXDVLxY z6uwCQLP!Ea`AEW7eGVI5X~&{_QNsl)mC;WE<5{BW7Og{ga<)v+HskE>TgXVwoi z4?G2qc;#DZdRQy%qq;Dw#6=$yu$QiIhHK$ag8mEhYHk{45OyQl?^4JZm2eF^gw#8)W z%3v=OAErTE9aX&47;TAy_RsE!SE}IH8q+nf2@z%jsFfU)9O~r`u<(f1!$#U7+)?N# zdjt25BB%vfN9pG1SR1T5gD_ScO-D8fbx+7_k>cdKTkB|LQcUIvL@P_W2X%(ufryUZ zx*mku)9IM0Zs_&dVRvwzQCqrfG;B|tMw-Z8ky0WsS|Tth-8<7t(xrp!WE)cV5UHnW ze0|$Hx_D;wmA?qTRT=$|K`(aoHPnsO$UwaEZ&W5iQ-xHyIHh$`bw!u4t0^h1jc9;2 z{42PceYUQb#@?+KT=^DHt{%@ponY1ErJzsFfEJ50sGU|CWNt zOrdALLS4b8KtV0YdUgXTr+T&w=}zp~jq*@U0p-x44(H>#)M0%#qf293!&-eb>yYYW z*OKrb>KBXBe(_P-pwcmRn?Bqv{+N9`#y-xM#bRrcv)*l(jTaj&05%d}glY))(SHGK zEI?C$?>Jx+0nQcRegLh{7E1g|m3SpVSsmgrr=T4f5Hjsae@{L zyKOoiAYu5PrS@@J<^{bd`X_14?j=uDGb>laAPMt1zY^_Aoacy>3QTlwCmo(E-{uo_ zgBUCV9m!rcHCf+Z`wCn(H)#I&7x?^1Y~|?3gk+hnGZmXZ{!N^C<@-GgF_Fpw6Hh(b zM5b-Fvy+;pt3?+Q?LSI4P5)ZBLr%P(6j~> z%-lA@Qsfej%GfPg1}q|Kz-n?Hz4FS3$)sygLyTO0NKDMfE1;H~&o8Y*GVXd;nh4=h z46c^LZuqQbTc0nKdSAscE?iIxaxVNw;OzE;`f?xY3de!586Z?w`YL0egwh_=7CMp( z$ZzaZ=B?qqP~K1Dt@l($1@^uCDBvE(;N}_>`TB>Yjxv|WyWwGxtS%Q%=f&9W9Ua3e z96U5f?3IC@HZN2%9i|slZv$3urLjB6CiZK4nvL{~*%IX=_1$oXS_dgnR_`T~(?uoq z@yorByO?Tc8$)^fxc=-6#VgSVcUMJSL@C0LshLK3cr!3oT3;yC<$j7{TMa=i$mXKP z6w_nY58ySwSU|DAP>hkwxS$pkenNghi?Pa}`4KLe9!B}Mu<}pd417klK^1JNDrkw~ zpMrrRyvPPXY0?bQMrl=5~fMV}>I zhw?FADYnz8bcYzX?ku2tmC%i=wgt7I@H6VF_2ojO0~P6YiX^B7g$EVsD}_kQ@<@VO zPb8`~ZajozK%E`{eQE6jAnTW@jOM`CxQr&J zce&Fm8-u8JMRn2Cx~tHHClR6fI8=-aYC+)+VAMDGGnH z!UeUU@Tj`WJ%vc8D$?bOB&Y?2)rxd)A<}7z^cF=D)Plm#iG%|F#*o=H_)XPqvMFxt z2Pan$bGQM>1aW5C8R(Tjd&}jz8I0wUFS9w4_{z}bL_}}Rj09Ee1v=E!WN(OP^_ac4 zqRKrm;)6+Lo;pPMZ}Ph)$~H8eMrbl}G|c_@oI z83}m$tI7R@_OWh8Gwif(HGz?_XajU$$@KKs-5qVPFHz_(_B3HQ9J1(83pj(2Jh;>F zm%~AT|1TM2_-D>^{F>{fZPf+7=2kY>$77#mriRu0oId5T&+D_MvbCoAlWCF4sKTu@ z;RI2ou_Zj)if-ZI-D-H%cBk-TvwqC*gOEaRzgO ze6`XE6I+Fo^BWoytZS}41Z%cKV7qao2u+(H{0vV~EiAPxJHg?Xm7OHa9g%| z2(-*H+6Gn9Nx>85E-=`bpQjn7A=Y}kgqOQ3H#Fzn7iRH8(Z9E za|QLN`%dC5XBX;V1EKQX6MmYLUOXrF8nPF`Uqyyi4-;x8l@)IrbuZ1z(`o&*=l_%s z^J&6SllrN(ISdlC%>f5{M2_vO)xWCd&dQ^E0rQB{>v48Z<9x$=#`5G?^kV9=n68#No+{MY6^x4(Ygk4R(+vY(C_Oa0sb@�U$(s8uK5CNLY|i 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 `zWs> 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

    public ControlAdapter(Control control, bool useGdiPlusTextRendering) + : base(WinFormsAdapter.Instance) { ArgChecker.AssertArgNotNull(control, "control"); @@ -45,95 +46,56 @@ public ControlAdapter(Control control, bool useGdiPlusTextRendering) } /// - /// Get the current location of the mouse relative to the control + /// Get the underline win forms control /// + public Control Control + { + get { return _control; } + } + public override RPoint MouseLocation { get { return Utils.Convert(_control.PointToClient(Control.MousePosition)); } } - /// - /// Is the left mouse button is currently in pressed state - /// public override bool LeftMouseButton { get { return (Control.MouseButtons & MouseButtons.Left) != 0; } } - /// - /// Is the right mouse button is currently in pressed state - /// public override bool RightMouseButton { get { return (Control.MouseButtons & MouseButtons.Right) != 0; } } - /// - /// Get the underline win forms control - /// - public Control Control - { - get { return _control; } - } - - /// - /// Set the cursor over the control to default cursor - /// public override void SetCursorDefault() { _control.Cursor = Cursors.Default; } - /// - /// Set the cursor over the control to hand cursor - /// public override void SetCursorHand() { _control.Cursor = Cursors.Hand; } - /// - /// Set the cursor over the control to I beam cursor - /// public override void SetCursorIBeam() { _control.Cursor = Cursors.IBeam; } - /// - /// Get data object for the given html and plain text data.
    - /// The data object can be used for clipboard or drag-drop operation. - ///
    - /// the html data - /// the plain text data - /// drag-drop data object - public override object GetDataObject(string html, string plainText) - { - return ClipboardHelper.CreateDataObject(html, plainText); - } - - /// - /// Do drag-drop copy operation for the given data object. - /// - /// the data object public override void DoDragDropCopy(object dragDropData) { _control.DoDragDrop(dragDropData, DragDropEffects.Copy); } - /// - /// Create graphics object that can be used with the control. - /// - /// graphics object - public override RGraphics CreateGraphics() + public override void MeasureString(string str, RFont font, double maxWidth, out int charFit, out double charFitWidth) { - // the win forms graphics object will be disposed by WinGraphics - return new GraphicsAdapter(_control.CreateGraphics(), _useGdiPlusTextRendering, true); + using (var g = new GraphicsAdapter(_control.CreateGraphics(), _useGdiPlusTextRendering, true)) + { + g.MeasureString(str, font, maxWidth, out charFit, out charFitWidth); + } } - /// - /// Invalidates the entire surface of the control and causes the control to be redrawn. - /// public override void Invalidate() { _control.Invalidate(); diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs index 892c59aac..1da2eab5e 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontAdapter.cs @@ -80,39 +80,26 @@ public IntPtr HFont } } - /// - /// Gets the em-size of this Font measured in the units specified by the Unit property. - /// public override double Size { get { return _font.Size; } } - /// - /// Get the vertical offset of the font underline location from the top of the font. - /// public override double UnderlineOffset { get { return _underlineOffset; } } - /// - /// The line spacing, in pixels, of this font. - /// public override double Height { get { return _height; } } - /// - /// Get the left padding, in pixels, of the font. - /// public override double LeftPadding { get { return _height / 6f; } } - public override double GetWhitespaceWidth(RGraphics graphics) { if (_whitespaceWidth < 0) diff --git a/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs index 02710ade6..ad646207a 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/FontFamilyAdapter.cs @@ -41,9 +41,6 @@ public FontFamily FontFamily get { return _fontFamily; } } - /// - /// Gets the name of this FontFamily. - /// public override string Name { get { return _fontFamily.Name; } diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs index 70a23e6de..f567ee206 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs @@ -187,7 +187,7 @@ public override RSize MeasureString(string str, RFont font) } } - public override RSize MeasureString(string str, RFont font, double maxWidth, out int charFit, out double charFitWidth) + public override void MeasureString(string str, RFont font, double maxWidth, out int charFit, out double charFitWidth) { charFit = 0; charFitWidth = 0; @@ -206,8 +206,6 @@ public override RSize MeasureString(string str, RFont font, double maxWidth, out else break; } - - return size; } else { @@ -217,7 +215,6 @@ public override RSize MeasureString(string str, RFont font, double maxWidth, out Win32Utils.GetTextExtentExPoint(_hdc, str, str.Length, (int)Math.Round(maxWidth), _charFit, _charFitWidth, ref size); charFit = _charFit[0]; charFitWidth = charFit > 0 ? _charFitWidth[charFit - 1] : 0; - return Utils.Convert(size); } } diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs index 44a9df042..55d3f02c5 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsPathAdapter.cs @@ -59,9 +59,6 @@ public override void ArcTo(double x, double y, double size, Corner corner) _lastPoint = new RPoint(x, y); } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// public override void Dispose() { _graphicsPath.Dispose(); diff --git a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs index 046617be8..d195a8919 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs @@ -43,34 +43,21 @@ public Image Image get { return _image; } } - /// - /// Get the width, in pixels, of the image. - /// public override double Width { get { return _image.Width; } } - /// - /// Get the height, in pixels, of the image. - /// public override double Height { get { return _image.Height; } } - /// - /// Saves this image to the specified stream in PNG format. - /// - /// The Stream where the image will be saved. public override void Save(MemoryStream stream) { _image.Save(stream, ImageFormat.Png); } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// public override void Dispose() { _image.Dispose(); diff --git a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs index 3163062e1..89e5a604b 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs @@ -42,18 +42,12 @@ public Pen Pen get { return _pen; } } - /// - /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. - /// public override double Width { get { return _pen.Width; } set { _pen.Width = (float)value; } } - /// - /// Gets or sets the style used for dashed lines drawn with this Pen. - /// public override RDashStyle DashStyle { set @@ -85,9 +79,6 @@ public override RDashStyle DashStyle } } - /// - /// Gets or sets an array of custom dashes and spaces. - /// public override double[] DashPattern { set diff --git a/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs index fbf8348f1..eeaf59c11 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs @@ -105,9 +105,14 @@ protected internal override RFont CreateFontInt(RFontFamily family, double size, return new FontAdapter(new Font(((FontFamilyAdapter)family).FontFamily, (float)size, fontStyle)); } + protected override object GetClipboardDataObjectInt(string html, string plainText) + { + return ClipboardHelper.CreateDataObject(html, plainText); + } + protected override void SetToClipboardInt(string text) { - Clipboard.SetText(text); + ClipboardHelper.CopyToClipboard(text); } protected override void SetToClipboardInt(string html, string plainText) diff --git a/Source/HtmlRenderer.WinForms/HtmlContainer.cs b/Source/HtmlRenderer.WinForms/HtmlContainer.cs index 61211228b..443183a4b 100644 --- a/Source/HtmlRenderer.WinForms/HtmlContainer.cs +++ b/Source/HtmlRenderer.WinForms/HtmlContainer.cs @@ -460,9 +460,6 @@ public void HandleKeyDown(Control parent, KeyEventArgs e) _htmlContainerInt.HandleKeyDown(new ControlAdapter(parent, _useGdiPlusTextRendering), CreateKeyEevent(e)); } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// public void Dispose() { _htmlContainerInt.Dispose(); diff --git a/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs b/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs index f94b8a2db..667359883 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs @@ -127,6 +127,21 @@ public static void CopyToClipboard(string html, string plainText) Clipboard.SetDataObject(dataObject, true); } + /// + /// Clears clipboard and sets the given plain text fragment to the clipboard.
    + ///
    + /// the plain text + public static void CopyToClipboard(string plainText) + { + var dataObject = new DataObject(); + dataObject.SetData(DataFormats.Text, plainText); + dataObject.SetData(DataFormats.UnicodeText, plainText); + Clipboard.SetDataObject(dataObject, true); + } + + + #region Private/Protected methods + /// /// Generate HTML fragment data string with header that is required for the clipboard. /// @@ -234,5 +249,7 @@ private static int GetByteCount(StringBuilder sb, int start = 0, int end = -1) } return count; } + + #endregion } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Adapters/Adapter.cs b/Source/HtmlRenderer/Adapters/Adapter.cs index 6b50cc1dd..20406cecb 100644 --- a/Source/HtmlRenderer/Adapters/Adapter.cs +++ b/Source/HtmlRenderer/Adapters/Adapter.cs @@ -214,6 +214,15 @@ public RImage GetErrorImage() return _errorImage; } + /// + /// Get data object for the given html and plain text data.
    + /// The data object can be used for clipboard or drag-drop operation. + ///
    the html datathe plain text datadrag-drop data object + public object GetClipboardDataObject(string html, string plainText) + { + return GetClipboardDataObjectInt(html, plainText); + } + /// /// Set the given text to the clipboard /// @@ -320,6 +329,18 @@ public void SaveToFile(RImage image, string name, string extension, RControl con /// font instance protected internal abstract RFont CreateFontInt(RFontFamily family, double size, RFontStyle style); + /// + /// Get data object for the given html and plain text data.
    + /// The data object can be used for clipboard or drag-drop operation. + ///
    + /// the html data + /// the plain text data + /// drag-drop data object + protected virtual object GetClipboardDataObjectInt(string html, string plainText) + { + throw new NotImplementedException(); + } + /// /// Set the given text to the clipboard /// diff --git a/Source/HtmlRenderer/Adapters/RControl.cs b/Source/HtmlRenderer/Adapters/RControl.cs index a7781e6dc..19258baad 100644 --- a/Source/HtmlRenderer/Adapters/RControl.cs +++ b/Source/HtmlRenderer/Adapters/RControl.cs @@ -11,6 +11,7 @@ // "The Art of War" using HtmlRenderer.Adapters.Entities; +using HtmlRenderer.Core.Utils; namespace HtmlRenderer.Adapters { @@ -20,8 +21,30 @@ namespace HtmlRenderer.Adapters public abstract class RControl { /// - /// Is the left mouse button is currently in pressed state - /// + /// The platform adapter. + ///
    + private readonly Adapter _adapter; + + /// + /// Init control with platform adapter. + /// + protected RControl(Adapter adapter) + { + ArgChecker.AssertArgNotNull(adapter, "adapter"); + _adapter = adapter; + } + + /// + /// The platform adapter. + /// + public Adapter Adapter + { + get { return _adapter; } + } + + /// + /// Is the left mouse button is currently in pressed state + /// public abstract bool LeftMouseButton { get; } /// @@ -30,44 +53,44 @@ public abstract class RControl public abstract bool RightMouseButton { get; } /// - /// Get the current location of the mouse relative to the control - /// + /// Get the current location of the mouse relative to the control + /// public abstract RPoint MouseLocation { get; } /// - /// Set the cursor over the control to default cursor - /// + /// Set the cursor over the control to default cursor + ///
    public abstract void SetCursorDefault(); /// - /// Set the cursor over the control to hand cursor - /// + /// Set the cursor over the control to hand cursor + ///
    public abstract void SetCursorHand(); /// - /// Set the cursor over the control to I beam cursor - /// + /// Set the cursor over the control to I beam cursor + ///
    public abstract void SetCursorIBeam(); /// - /// Get data object for the given html and plain text data.
    - /// The data object can be used for clipboard or drag-drop operation. - ///
    the html datathe plain text datadrag-drop data object - public abstract object GetDataObject(string html, string plainText); - - /// - /// Do drag-drop copy operation for the given data object. - /// the drag-drop data object + /// Do drag-drop copy operation for the given data object. + ///
    + /// the drag-drop data object public abstract void DoDragDropCopy(object dragDropData); /// - /// Create graphics object that can be used with the control. - /// graphics object - public abstract RGraphics CreateGraphics(); + /// Measure the width of string under max width restriction calculating the number of characters that can fit and the width those characters take.
    + ///
    + /// the string to measure + /// the font to measure string with + /// the max width to calculate fit characters + /// the number of characters that will fit under restriction + /// the width that only the characters that fit into max width take + public abstract void MeasureString(string str, RFont font, double maxWidth, out int charFit, out double charFitWidth); /// - /// Invalidates the entire surface of the control and causes the control to be redrawn. - /// + /// Invalidates the entire surface of the control and causes the control to be redrawn. + ///
    public abstract void Invalidate(); } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Adapters/RGraphics.cs b/Source/HtmlRenderer/Adapters/RGraphics.cs index 72166ac87..4517d853c 100644 --- a/Source/HtmlRenderer/Adapters/RGraphics.cs +++ b/Source/HtmlRenderer/Adapters/RGraphics.cs @@ -143,18 +143,14 @@ public RRect GetClip() public abstract RSize MeasureString(string str, RFont font); /// - /// Measure the width and height of string when drawn on device context HDC - /// using the given font .
    - /// Restrict the width of the string and get the number of characters able to fit in the restriction and - /// the width those characters take. + /// Measure the width of string under max width restriction calculating the number of characters that can fit and the width those characters take.
    ///
    /// the string to measure /// the font to measure string with - /// the max width to render the string in + /// the max width to calculate fit characters /// the number of characters that will fit under restriction - /// - /// the size of the string - public abstract RSize MeasureString(string str, RFont font, double maxWidth, out int charFit, out double charFitWidth); + /// the width that only the characters that fit into max width take + public abstract void MeasureString(string str, RFont font, double maxWidth, out int charFit, out double charFitWidth); /// /// Draw the given string using the given font and foreground color at given location. diff --git a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs index 7937f5a55..ceec2affc 100644 --- a/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/SelectionHandler.cs @@ -507,7 +507,7 @@ private void StartDragDrop(RControl control) { var html = DomUtils.GenerateHtml(_root, HtmlGenerationStyle.Inline, true); var plainText = DomUtils.GetSelectedPlainText(_root); - _dragDropData = control.GetDataObject(html, plainText); + _dragDropData = control.Adapter.GetClipboardDataObject(html, plainText); } control.DoDragDropCopy(_dragDropData); } @@ -658,17 +658,13 @@ private static void CalculateWordCharIndexAndOffset(RControl control, CssRect wo else if (offset > 0) { // calculate partial word selection - var font = word.OwnerBox.ActualFont; - using (var g = control.CreateGraphics()) - { - int charFit; - double charFitWidth; - var maxWidth = offset + (inclusive ? 0 : 1.5f * word.LeftGlyphPadding); - g.MeasureString(word.Text, font, maxWidth, out charFit, out charFitWidth); + int charFit; + double charFitWidth; + var maxWidth = offset + (inclusive ? 0 : 1.5f * word.LeftGlyphPadding); + control.MeasureString(word.Text, word.OwnerBox.ActualFont, maxWidth, out charFit, out charFitWidth); - selectionIndex = charFit; - selectionOffset = charFitWidth; - } + selectionIndex = charFit; + selectionOffset = charFitWidth; } } From ca1ec888fa6c21224593282a57c36ee518000c1a Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 21 Jun 2014 12:46:54 +0300 Subject: [PATCH 105/254] WPF - handle context menu --- .../Adapters/ContextMenuAdapter.cs | 62 +++++++------------ 1 file changed, 21 insertions(+), 41 deletions(-) diff --git a/Source/HtmlRenderer.WPF/Adapters/ContextMenuAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/ContextMenuAdapter.cs index a78df2373..494cb5b79 100644 --- a/Source/HtmlRenderer.WPF/Adapters/ContextMenuAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/ContextMenuAdapter.cs @@ -11,15 +11,17 @@ // "The Art of War" using System; +using System.Windows; +using System.Windows.Controls; using HtmlRenderer.Adapters; using HtmlRenderer.Adapters.Entities; using HtmlRenderer.Core.Utils; +using HtmlRenderer.WPF.Utilities; namespace HtmlRenderer.WPF.Adapters { /// - /// Adapter for WinForms context menu for core. - // TODO:a handle WPF context menu + /// Adapter for WPF context menu for core. /// internal sealed class ContextMenuAdapter : RContextMenu { @@ -28,7 +30,7 @@ internal sealed class ContextMenuAdapter : RContextMenu /// /// the underline WPF context menu /// -// private readonly ContextMenuStrip _contextMenu; + private readonly ContextMenu _contextMenu; #endregion @@ -38,71 +40,49 @@ internal sealed class ContextMenuAdapter : RContextMenu /// public ContextMenuAdapter() { -// _contextMenu = new ContextMenuStrip(); -// _contextMenu.ShowImageMargin = false; + _contextMenu = new ContextMenu(); } - /// - /// The total number of items in the context menu - /// public override int ItemsCount { - get - { - // return _contextMenu.Items.Count; - return 0; - } + get { return _contextMenu.Items.Count; } } - /// - /// Add divider item to the context menu.
    - /// The divider is a non clickable place holder used to separate items. - ///
    public override void AddDivider() { -// _contextMenu.Items.Add("-"); + _contextMenu.Items.Add(new Separator()); } - /// - /// Add item to the context menu with the given text that will raise the given event when clicked. - /// - /// the text to set on the new context menu item - /// if to set the item as enabled or disabled - /// the event to raise when the item is clicked public override void AddItem(string text, bool enabled, EventHandler onClick) { ArgChecker.AssertArgNotNullOrEmpty(text, "text"); ArgChecker.AssertArgNotNull(onClick, "onClick"); -// var item = _contextMenu.Items.Add(text, null, onClick); -// item.Enabled = enabled; + var item = new MenuItem(); + item.Header = text; + item.IsEnabled = enabled; + item.Click += new RoutedEventHandler(onClick); + _contextMenu.Items.Add(item); } - /// - /// Remove the last item from the context menu iff it is a divider - /// public override void RemoveLastDivider() { -// if (_contextMenu.Items[_contextMenu.Items.Count - 1].Text == string.Empty) -// _contextMenu.Items.RemoveAt(_contextMenu.Items.Count - 1); + if (_contextMenu.Items[_contextMenu.Items.Count - 1].GetType() == typeof(Separator)) + _contextMenu.Items.RemoveAt(_contextMenu.Items.Count - 1); } - /// - /// Show the context menu in the given parent control at the given location. - /// - /// the parent control to show in - /// the location to show at relative to the parent control public override void Show(RControl parent, RPoint location) { -// _contextMenu.Show(((ControlAdapter)parent).Control, Utils.ConvertRound(location)); + _contextMenu.PlacementTarget = ((ControlAdapter)parent).Control; + _contextMenu.PlacementRectangle = new Rect(Utils.ConvertRound(location), Size.Empty); + _contextMenu.IsOpen = true; } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// public override void Dispose() { -// _contextMenu.Dispose(); + _contextMenu.IsOpen = false; + _contextMenu.PlacementTarget = null; + _contextMenu.Items.Clear(); } } } \ No newline at end of file From 39893622a0c3e292f07f87ebe1365f6d4dddae44 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 21 Jun 2014 13:19:38 +0300 Subject: [PATCH 106/254] WPF - handle saveing image --- .../HtmlRenderer.WPF/Adapters/BrushAdapter.cs | 6 +-- .../HtmlRenderer.WPF/Adapters/FontAdapter.cs | 2 +- .../Adapters/GraphicsAdapter.cs | 4 +- .../HtmlRenderer.WPF/Adapters/WpfAdapter.cs | 30 ++++++------- Source/HtmlRenderer.WPF/HtmlRender.cs | 16 ++----- Source/HtmlRenderer.WPF/Utilities/Utils.cs | 45 ++++++++++++++----- 6 files changed, 58 insertions(+), 45 deletions(-) diff --git a/Source/HtmlRenderer.WPF/Adapters/BrushAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/BrushAdapter.cs index 63708b74f..d9d6533a2 100644 --- a/Source/HtmlRenderer.WPF/Adapters/BrushAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/BrushAdapter.cs @@ -16,12 +16,12 @@ namespace HtmlRenderer.WPF.Adapters { /// - /// Adapter for WinForms brushes objects for core. + /// Adapter for WPF brushes. /// internal sealed class BrushAdapter : RBrush { /// - /// The actual WinForms brush instance. + /// The actual WPF brush instance. /// private readonly Brush _brush; @@ -34,7 +34,7 @@ public BrushAdapter(Brush brush) } /// - /// The actual WinForms brush instance. + /// The actual WPF brush instance. /// public Brush Brush { diff --git a/Source/HtmlRenderer.WPF/Adapters/FontAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/FontAdapter.cs index d2650d239..a340ec27c 100644 --- a/Source/HtmlRenderer.WPF/Adapters/FontAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/FontAdapter.cs @@ -16,7 +16,7 @@ namespace HtmlRenderer.WPF.Adapters { /// - /// Adapter for WinForms Font object for core. + /// Adapter for WPF Font. /// internal sealed class FontAdapter : RFont { diff --git a/Source/HtmlRenderer.WPF/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/GraphicsAdapter.cs index 25e149a6e..d2fdf3ee1 100644 --- a/Source/HtmlRenderer.WPF/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/GraphicsAdapter.cs @@ -23,14 +23,14 @@ namespace HtmlRenderer.WPF.Adapters { /// - /// Adapter for WinForms Graphics for core. + /// Adapter for WPF Graphics. /// internal sealed class GraphicsAdapter : RGraphics { #region Fields and Consts /// - /// The wrapped WinForms graphics object + /// The wrapped WPF graphics object /// private readonly DrawingContext _g; diff --git a/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs index 092726d1a..c6e0b547d 100644 --- a/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs @@ -17,12 +17,12 @@ using HtmlRenderer.Adapters; using HtmlRenderer.Adapters.Entities; using HtmlRenderer.WPF.Utilities; +using Microsoft.Win32; namespace HtmlRenderer.WPF.Adapters { /// - /// Adapter for general stuff for core. - /// TODO:a add doc. + /// Adapter for WPF platform. /// internal sealed class WpfAdapter : Adapter { @@ -130,19 +130,19 @@ protected override RContextMenu CreateContextMenuInt() protected override void SaveToFileInt(RImage image, string name, string extension, RControl control = null) { - // TODO:a handle save to file - // using (var saveDialog = new SaveFileDialog()) - // { - // saveDialog.Filter = "Images|*.png;*.bmp;*.jpg"; - // saveDialog.FileName = name; - // saveDialog.DefaultExt = extension; - // - // var dialogResult = control == null ? saveDialog.ShowDialog() : saveDialog.ShowDialog(((ControlAdapter)control).Control); - // if (dialogResult == DialogResult.OK) - // { - // ((ImageAdapter)image).Image.Save(saveDialog.FileName); - // } - // } + var saveDialog = new SaveFileDialog(); + saveDialog.Filter = "Images|*.png;*.bmp;*.jpg;*.tif;*.gif;*.wmp;"; + saveDialog.FileName = name; + saveDialog.DefaultExt = extension; + + var dialogResult = saveDialog.ShowDialog(); + if (dialogResult.GetValueOrDefault()) + { + var encoder = Utils.GetBitmapEncoder(Path.GetExtension(saveDialog.FileName)); + encoder.Frames.Add(BitmapFrame.Create(((ImageAdapter)image).Image)); + using (FileStream stream = new FileStream(saveDialog.FileName, FileMode.OpenOrCreate)) + encoder.Save(stream); + } } diff --git a/Source/HtmlRenderer.WPF/HtmlRender.cs b/Source/HtmlRenderer.WPF/HtmlRender.cs index 8c72e338f..61c5ee598 100644 --- a/Source/HtmlRenderer.WPF/HtmlRender.cs +++ b/Source/HtmlRenderer.WPF/HtmlRender.cs @@ -22,20 +22,13 @@ namespace HtmlRenderer.WPF { /// /// Standalone static class for simple and direct HTML rendering.
    - /// For WinForms UI prefer using HTML controls: or .
    + /// For WPF UI prefer using HTML controls: or .
    /// For low-level control and performance consider using .
    ///
    /// /// - /// GDI vs. GDI+ text rendering
    - /// Windows supports two text rendering technologies: GDI and GDI+.
    - /// GDI is older, has better performance and looks better on standard monitors but doesn't support alpha channel for transparency.
    - /// GDI+ is newer, device independent so work better for printers but is slower and looks worse on monitors.
    - /// HtmlRender supports both GDI and GDI+ text rendering to accommodate different needs, GDI+ text rendering methods have "GdiPlus" suffix - /// in their name where GDI do not.
    - ///
    - /// /// Rendering to image
    + /// // TODO:a update! /// See https://htmlrenderer.codeplex.com/wikipage?title=Image%20generation
    /// Because of GDI text rendering issue with alpha channel clear type text rendering rendering to image requires special handling.
    /// Solid color background - generate an image where the background is filled with solid color and all the html is rendered on top @@ -43,8 +36,6 @@ namespace HtmlRenderer.WPF /// Image background - render html on top of existing image with whatever currently exist but it cannot have transparent pixels, /// GDI text rendering will be used. (RenderToImage method where the first argument is Image object)
    /// Transparent background - render html to empty image using GDI+ text rendering, the generated image can be transparent. - /// Text rendering can be controlled using , note that - /// doesn't render well on transparent background. (RenderToImageGdiPlus method)
    ///
    /// /// Overwrite stylesheet resolution
    @@ -84,7 +75,7 @@ public static class HtmlRender { /// /// Adds a font family to be used in html rendering.
    - /// The added font will be used by all rendering function including and all WinForms controls. + /// The added font will be used by all rendering function including and all WPF controls. ///
    /// /// The given font family instance must be remain alive while the renderer is in use.
    @@ -412,7 +403,6 @@ private static Size MeasureHtmlByRestrictions(HtmlContainer htmlContainer, Size /// the top-left most location to start render the html at /// the max size of the rendered html (if height above zero it will be clipped) /// optional: the style to use for html rendering (default - use W3 default style) - /// true - use GDI+ text rendering, false - use GDI text rendering /// optional: can be used to overwrite stylesheet resolution logic /// optional: can be used to overwrite image resolution logic /// the actual size of the rendered html diff --git a/Source/HtmlRenderer.WPF/Utilities/Utils.cs b/Source/HtmlRenderer.WPF/Utilities/Utils.cs index a3307bed1..2239818c3 100644 --- a/Source/HtmlRenderer.WPF/Utilities/Utils.cs +++ b/Source/HtmlRenderer.WPF/Utilities/Utils.cs @@ -13,17 +13,18 @@ using System; using System.Windows; using System.Windows.Media; +using System.Windows.Media.Imaging; using HtmlRenderer.Adapters.Entities; namespace HtmlRenderer.WPF.Utilities { /// - /// Utilities for converting WinForms entities to HtmlRenderer core entities. + /// Utilities for converting WPF entities to HtmlRenderer core entities. /// internal static class Utils { /// - /// Convert from WinForms point to core point. + /// Convert from WPF point to core point. /// public static RPoint Convert(Point p) { @@ -31,7 +32,7 @@ public static RPoint Convert(Point p) } /// - /// Convert from WinForms point to core point. + /// Convert from WPF point to core point. /// public static Point[] Convert(RPoint[] points) { @@ -42,7 +43,7 @@ public static Point[] Convert(RPoint[] points) } /// - /// Convert from core point to WinForms point. + /// Convert from core point to WPF point. /// public static Point Convert(RPoint p) { @@ -50,7 +51,7 @@ public static Point Convert(RPoint p) } /// - /// Convert from core point to WinForms point. + /// Convert from core point to WPF point. /// public static Point ConvertRound(RPoint p) { @@ -58,7 +59,7 @@ public static Point ConvertRound(RPoint p) } /// - /// Convert from WinForms size to core size. + /// Convert from WPF size to core size. /// public static RSize Convert(Size s) { @@ -66,7 +67,7 @@ public static RSize Convert(Size s) } /// - /// Convert from core size to WinForms size. + /// Convert from core size to WPF size. /// public static Size Convert(RSize s) { @@ -74,7 +75,7 @@ public static Size Convert(RSize s) } /// - /// Convert from WinForms rectangle to core rectangle. + /// Convert from WPF rectangle to core rectangle. /// public static RRect Convert(Rect r) { @@ -82,7 +83,7 @@ public static RRect Convert(Rect r) } /// - /// Convert from core rectangle to WinForms rectangle. + /// Convert from core rectangle to WPF rectangle. /// public static Rect Convert(RRect r) { @@ -90,7 +91,7 @@ public static Rect Convert(RRect r) } /// - /// Convert from WinForms color to core color. + /// Convert from WPF color to core color. /// public static RColor Convert(Color c) { @@ -98,11 +99,33 @@ public static RColor Convert(Color c) } /// - /// Convert from core color to WinForms color. + /// Convert from core color to WPF color. /// public static Color Convert(RColor c) { return Color.FromArgb(c.A, c.R, c.G, c.B); } + + public static BitmapEncoder GetBitmapEncoder(string ext) + { + switch (ext.ToLower()) + { + case ".jpg": + case ".jpeg": + return new JpegBitmapEncoder(); + case ".bmp": + return new BmpBitmapEncoder(); + case ".tif": + case ".tiff": + return new TiffBitmapEncoder(); + case ".gif": + return new GifBitmapEncoder(); + case ".wmp": + return new WmpBitmapEncoder(); + default: + return new PngBitmapEncoder(); + + } + } } } \ No newline at end of file From 72720f5c1bbf944ad18d3eba8a35176186fdd85f Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 21 Jun 2014 14:31:49 +0300 Subject: [PATCH 107/254] * refactor --- .../Adapters/ImageAdapter.cs | 7 ---- .../Adapters/PdfSharpAdapter.cs | 5 +-- .../Adapters/PenAdapter.cs | 14 +------ Source/HtmlRenderer.PdfSharp/PdfGenerator.cs | 2 - .../Adapters/ControlAdapter.cs | 4 +- .../HtmlRenderer.WPF/Adapters/ImageAdapter.cs | 11 +---- .../HtmlRenderer.WPF/Adapters/PenAdapter.cs | 12 ------ .../HtmlRenderer.WPF/Adapters/WpfAdapter.cs | 2 +- Source/HtmlRenderer.WPF/HtmlContainer.cs | 8 ++++ Source/HtmlRenderer.WPF/HtmlControlBase.cs | 21 +++------- .../Adapters/ImageAdapter.cs | 7 ---- .../Adapters/PenAdapter.cs | 13 +----- .../Adapters/WinFormsAdapter.cs | 5 +-- .../Adapters/{Adapter.cs => RAdapter.cs} | 42 +++++++++++++------ Source/HtmlRenderer/Adapters/RBrush.cs | 3 +- Source/HtmlRenderer/Adapters/RContextMenu.cs | 25 +++++------ Source/HtmlRenderer/Adapters/RControl.cs | 13 +++--- Source/HtmlRenderer/Adapters/RFont.cs | 18 ++++---- Source/HtmlRenderer/Adapters/RFontFamily.cs | 6 +-- Source/HtmlRenderer/Adapters/RGraphics.cs | 9 ++-- Source/HtmlRenderer/Adapters/RGraphicsPath.cs | 6 +-- Source/HtmlRenderer/Adapters/RImage.cs | 16 +++---- Source/HtmlRenderer/Adapters/RPen.cs | 15 +++---- Source/HtmlRenderer/Core/CssData.cs | 4 +- .../Core/Handlers/BordersDrawHandler.cs | 3 -- .../Core/Handlers/FontsHandler.cs | 4 +- Source/HtmlRenderer/Core/HtmlContainerInt.cs | 35 +++++++++------- Source/HtmlRenderer/Core/Parse/CssParser.cs | 4 +- .../HtmlRenderer/Core/Parse/CssValueParser.cs | 4 +- .../Core/Parse/RegexParserUtils.cs | 2 +- Source/HtmlRenderer/Core/Utils/RenderUtils.cs | 8 ++-- Source/HtmlRenderer/HtmlRenderer.csproj | 2 +- 32 files changed, 143 insertions(+), 187 deletions(-) rename Source/HtmlRenderer/Adapters/{Adapter.cs => RAdapter.cs} (89%) diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs index a2abcdb5c..911d6f232 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/ImageAdapter.cs @@ -10,8 +10,6 @@ // - Sun Tsu, // "The Art of War" -using System; -using System.IO; using HtmlRenderer.Adapters; using PdfSharp.Drawing; @@ -53,11 +51,6 @@ public override double Height get { return _image.PixelHeight; } } - public override void Save(MemoryStream stream) - { - throw new NotSupportedException(); - } - public override void Dispose() { _image.Dispose(); diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs index 77837a8f3..a6d761d53 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/PdfSharpAdapter.cs @@ -21,10 +21,9 @@ namespace HtmlRenderer.PdfSharp.Adapters { /// - /// Adapter for general stuff for core. - /// TODO:a add doc. + /// Adapter for PdfSharp library platform. /// - internal sealed class PdfSharpAdapter : Adapter + internal sealed class PdfSharpAdapter : RAdapter { #region Fields and Consts diff --git a/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs b/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs index ea017a4a0..37ab2d864 100644 --- a/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.PdfSharp/Adapters/PenAdapter.cs @@ -59,6 +59,8 @@ public override RDashStyle DashStyle break; case RDashStyle.Dash: _pen.DashStyle = XDashStyle.Dash; + if (Width < 2) + _pen.DashPattern = new[] { 4, 4d }; // better looking break; case RDashStyle.Dot: _pen.DashStyle = XDashStyle.Dot; @@ -78,17 +80,5 @@ public override RDashStyle DashStyle } } } - - public override double[] DashPattern - { - set - { - var dValues = new double[value.Length]; - for (int i = 0; i < value.Length; i++) - dValues[i] = value[i]; - - _pen.DashPattern = value; - } - } } } \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs index de8b44b5c..f56f03730 100644 --- a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs +++ b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs @@ -11,8 +11,6 @@ // "The Art of War" using System; -using System.Drawing; -using System.Drawing.Text; using HtmlRenderer.Core; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; diff --git a/Source/HtmlRenderer.WPF/Adapters/ControlAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/ControlAdapter.cs index 85811fd48..d3d8ab08b 100644 --- a/Source/HtmlRenderer.WPF/Adapters/ControlAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/ControlAdapter.cs @@ -10,6 +10,7 @@ // - Sun Tsu, // "The Art of War" +using System.Windows; using System.Windows.Controls; using System.Windows.Input; using HtmlRenderer.Adapters; @@ -80,8 +81,7 @@ public override void SetCursorIBeam() public override void DoDragDropCopy(object dragDropData) { - // TODO:a handle WPF clipboard - // _control.DoDragDrop(dragDropData, DragDropEffects.Copy); + DragDrop.DoDragDrop(_control, dragDropData, DragDropEffects.Copy); } public override void MeasureString(string str, RFont font, double maxWidth, out int charFit, out double charFitWidth) diff --git a/Source/HtmlRenderer.WPF/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/ImageAdapter.cs index 4d4489ac1..fbebfb6b8 100644 --- a/Source/HtmlRenderer.WPF/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/ImageAdapter.cs @@ -10,7 +10,6 @@ // - Sun Tsu, // "The Art of War" -using System.IO; using System.Windows.Media.Imaging; using HtmlRenderer.Adapters; @@ -52,16 +51,10 @@ public override double Height get { return _image.PixelHeight; } } - public override void Save(MemoryStream stream) - { - PngBitmapEncoder encoder = new PngBitmapEncoder(); - encoder.Frames.Add(BitmapFrame.Create(_image)); - encoder.Save(stream); - } - public override void Dispose() { - _image.StreamSource.Dispose(); + if (_image.StreamSource != null) + _image.StreamSource.Dispose(); } } } \ No newline at end of file diff --git a/Source/HtmlRenderer.WPF/Adapters/PenAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/PenAdapter.cs index b8978a786..347feef4d 100644 --- a/Source/HtmlRenderer.WPF/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/PenAdapter.cs @@ -78,18 +78,6 @@ public override RDashStyle DashStyle } } - public override double[] DashPattern - { - set - { - // TODO:a handle custom pattern pen - // var fValues = new float[value.Length]; - // for (int i = 0; i < value.Length; i++) - // fValues[i] = (float)value[i]; - // _pen.DashPattern = fValues; - } - } - /// /// Create the actual WPF pen instance. /// diff --git a/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs index c6e0b547d..549494f86 100644 --- a/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs @@ -24,7 +24,7 @@ namespace HtmlRenderer.WPF.Adapters /// /// Adapter for WPF platform. /// - internal sealed class WpfAdapter : Adapter + internal sealed class WpfAdapter : RAdapter { #region Fields and Consts diff --git a/Source/HtmlRenderer.WPF/HtmlContainer.cs b/Source/HtmlRenderer.WPF/HtmlContainer.cs index 044602c3e..ca0cb5260 100644 --- a/Source/HtmlRenderer.WPF/HtmlContainer.cs +++ b/Source/HtmlRenderer.WPF/HtmlContainer.cs @@ -258,6 +258,14 @@ public void SetHtml(string htmlSource, CssData baseCssData = null) _htmlContainerInt.SetHtml(htmlSource, baseCssData); } + /// + /// Clear the content of the HTML container releasing any resources used to render previously existing content. + /// + public void Clear() + { + _htmlContainerInt.Clear(); + } + /// /// Get html from the current DOM tree with style if requested. /// diff --git a/Source/HtmlRenderer.WPF/HtmlControlBase.cs b/Source/HtmlRenderer.WPF/HtmlControlBase.cs index 3dce0ff3a..9a4a2c793 100644 --- a/Source/HtmlRenderer.WPF/HtmlControlBase.cs +++ b/Source/HtmlRenderer.WPF/HtmlControlBase.cs @@ -380,23 +380,13 @@ protected virtual void OnRefresh(HtmlRefreshEventArgs e) } /// - /// Release the html container resources. + /// When the control is no longer part of visual tree clear its content so resources can be released immediately. /// - protected void Dispose(bool disposing) + protected override void OnVisualParentChanged(DependencyObject oldParent) { - // TODO:a handle dispose - // if (_htmlContainer != null) - // { - // _htmlContainer.LinkClicked -= OnLinkClicked; - // _htmlContainer.RenderError -= OnRenderError; - // _htmlContainer.Refresh -= OnRefresh; - // _htmlContainer.ScrollChange -= OnScrollChange; - // _htmlContainer.StylesheetLoad -= OnStylesheetLoad; - // _htmlContainer.ImageLoad -= OnImageLoad; - // _htmlContainer.Dispose(); - // _htmlContainer = null; - // } - // base.Dispose(disposing); + if (_htmlContainer != null) + _htmlContainer.Clear(); + base.OnVisualParentChanged(oldParent); } /// @@ -415,6 +405,7 @@ protected virtual double HtmlHeight(Size size) return size.Height; } + #region Private event handlers private void OnLinkClicked(object sender, HtmlLinkClickedEventArgs e) diff --git a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs index d195a8919..3e9d1aff5 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/ImageAdapter.cs @@ -11,8 +11,6 @@ // "The Art of War" using System.Drawing; -using System.Drawing.Imaging; -using System.IO; using HtmlRenderer.Adapters; namespace HtmlRenderer.WinForms.Adapters @@ -53,11 +51,6 @@ public override double Height get { return _image.Height; } } - public override void Save(MemoryStream stream) - { - _image.Save(stream, ImageFormat.Png); - } - public override void Dispose() { _image.Dispose(); diff --git a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs index 89e5a604b..52037607c 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/PenAdapter.cs @@ -59,6 +59,8 @@ public override RDashStyle DashStyle break; case RDashStyle.Dash: _pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; + if (Width < 2) + _pen.DashPattern = new[] { 4, 4f }; // better looking break; case RDashStyle.Dot: _pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; @@ -78,16 +80,5 @@ public override RDashStyle DashStyle } } } - - public override double[] DashPattern - { - set - { - var fValues = new float[value.Length]; - for (int i = 0; i < value.Length; i++) - fValues[i] = (float)value[i]; - _pen.DashPattern = fValues; - } - } } } \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs index eeaf59c11..775ecec8e 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/WinFormsAdapter.cs @@ -20,10 +20,9 @@ namespace HtmlRenderer.WinForms.Adapters { /// - /// Adapter for general stuff for core. - /// TODO:a add doc. + /// Adapter for WinForms platforms. /// - internal sealed class WinFormsAdapter : Adapter + internal sealed class WinFormsAdapter : RAdapter { #region Fields and Consts diff --git a/Source/HtmlRenderer/Adapters/Adapter.cs b/Source/HtmlRenderer/Adapters/RAdapter.cs similarity index 89% rename from Source/HtmlRenderer/Adapters/Adapter.cs rename to Source/HtmlRenderer/Adapters/RAdapter.cs index 20406cecb..93c5f611b 100644 --- a/Source/HtmlRenderer/Adapters/Adapter.cs +++ b/Source/HtmlRenderer/Adapters/RAdapter.cs @@ -23,13 +23,19 @@ namespace HtmlRenderer.Adapters { /// - /// TODO:a add doc + /// Platform adapter to bridge platform specific objects to HTML Renderer core library.
    + /// Core uses abstract renderer objects (RAdapter/RControl/REtc...) to access platform specific functionality, the concrete platforms + /// implements those objects to provide concrete platform implementation. Those allowing the core library to be platform agnostic. + /// + /// Platforms: WinForms, WPF, Metro, PDF renders, etc.
    + /// Objects: UI elements(Controls), Graphics(Render context), Colors, Brushes, Pens, Fonts, Images, Clipboard, etc.
    + ///
    ///
    /// /// It is best to have a singleton instance of this class for concrete implementation!
    /// This is because it holds caches of default CssData, Images, Fonts and Brushes. ///
    - public abstract class Adapter + public abstract class RAdapter { #region Fields/Consts @@ -69,7 +75,7 @@ public abstract class Adapter /// /// Init. /// - protected Adapter() + protected RAdapter() { _fontsHandler = new FontsHandler(this); } @@ -130,6 +136,7 @@ public RBrush GetSolidBrush(RColor color) /// converted image or null public RImage ConvertImage(object image) { + // TODO:a remove this by creating better API. return ConvertImageInt(image); } @@ -189,7 +196,7 @@ public RFont GetFont(string family, double size, RFontStyle style) /// /// Get image to be used while HTML image is loading. /// - public RImage GetLoadImage() + public RImage GetLoadingImage() { if (_loadImage == null) { @@ -203,7 +210,7 @@ public RImage GetLoadImage() /// /// Get image to be used if HTML image load failed. /// - public RImage GetErrorImage() + public RImage GetLoadingFailedImage() { if (_errorImage == null) { @@ -216,15 +223,20 @@ public RImage GetErrorImage() /// /// Get data object for the given html and plain text data.
    - /// The data object can be used for clipboard or drag-drop operation. - ///
    the html datathe plain text datadrag-drop data object + /// The data object can be used for clipboard or drag-drop operation.
    + /// Not relevant for platforms that don't render HTML on UI element. + ///
    + /// the html data + /// the plain text data + /// drag-drop data object public object GetClipboardDataObject(string html, string plainText) { return GetClipboardDataObjectInt(html, plainText); } /// - /// Set the given text to the clipboard + /// Set the given text to the clipboard
    + /// Not relevant for platforms that don't render HTML on UI element. ///
    /// the text to set public void SetToClipboard(string text) @@ -233,7 +245,8 @@ public void SetToClipboard(string text) } /// - /// Set the given html and plain text data to clipboard. + /// Set the given html and plain text data to clipboard.
    + /// Not relevant for platforms that don't render HTML on UI element. ///
    /// the html data /// the plain text data @@ -243,16 +256,18 @@ public void SetToClipboard(string html, string plainText) } /// - /// Set the given image to clipboard. + /// Set the given image to clipboard.
    + /// Not relevant for platforms that don't render HTML on UI element. ///
    - /// + /// the image object to set to clipboard public void SetToClipboard(RImage image) { SetToClipboardInt(image); } /// - /// Create a context menu that can be used on the control + /// Create a context menu that can be used on the control
    + /// Not relevant for platforms that don't render HTML on UI element. ///
    /// new context menu public RContextMenu GetContextMenu() @@ -261,7 +276,8 @@ public RContextMenu GetContextMenu() } /// - /// Save the given image to file by showing save dialog to the client. + /// Save the given image to file by showing save dialog to the client.
    + /// Not relevant for platforms that don't render HTML on UI element. ///
    /// the image to save /// the name of the image for save dialog diff --git a/Source/HtmlRenderer/Adapters/RBrush.cs b/Source/HtmlRenderer/Adapters/RBrush.cs index 5dedf1792..db5f3a8e6 100644 --- a/Source/HtmlRenderer/Adapters/RBrush.cs +++ b/Source/HtmlRenderer/Adapters/RBrush.cs @@ -15,7 +15,8 @@ namespace HtmlRenderer.Adapters { /// - /// TODO:a add doc + /// Adapter for platform specific brush objects - used to fill graphics (rectangles, polygons and paths).
    + /// The brush can be solid color, gradient or image. ///
    public abstract class RBrush : IDisposable { diff --git a/Source/HtmlRenderer/Adapters/RContextMenu.cs b/Source/HtmlRenderer/Adapters/RContextMenu.cs index 7ac66655f..97923c89c 100644 --- a/Source/HtmlRenderer/Adapters/RContextMenu.cs +++ b/Source/HtmlRenderer/Adapters/RContextMenu.cs @@ -16,34 +16,35 @@ namespace HtmlRenderer.Adapters { /// - /// TODO:a add doc + /// Adapter for platform specific context menu - used to create and show context menu at specific location.
    + /// Not relevant for platforms that don't render HTML on UI element. ///
    public abstract class RContextMenu : IDisposable { /// - /// The total number of items in the context menu - /// + /// The total number of items in the context menu + ///
    public abstract int ItemsCount { get; } /// - /// Add divider item to the context menu.
    - /// The divider is a non clickable place holder used to separate items. - ///
    + /// Add divider item to the context menu.
    + /// The divider is a non clickable place holder used to separate items. + ///
    public abstract void AddDivider(); /// - /// Add item to the context menu with the given text that will raise the given event when clicked. - /// the text to set on the new context menu itemif to set the item as enabled or disabledthe event to raise when the item is clicked + /// Add item to the context menu with the given text that will raise the given event when clicked. + ///
    the text to set on the new context menu itemif to set the item as enabled or disabledthe event to raise when the item is clicked public abstract void AddItem(string text, bool enabled, EventHandler onClick); /// - /// Remove the last item from the context menu iff it is a divider - /// + /// Remove the last item from the context menu iff it is a divider + ///
    public abstract void RemoveLastDivider(); /// - /// Show the context menu in the given parent control at the given location. - /// the parent control to show inthe location to show at relative to the parent control + /// Show the context menu in the given parent control at the given location. + ///
    the parent control to show inthe location to show at relative to the parent control public abstract void Show(RControl parent, RPoint location); public abstract void Dispose(); diff --git a/Source/HtmlRenderer/Adapters/RControl.cs b/Source/HtmlRenderer/Adapters/RControl.cs index 19258baad..0c95107ef 100644 --- a/Source/HtmlRenderer/Adapters/RControl.cs +++ b/Source/HtmlRenderer/Adapters/RControl.cs @@ -16,19 +16,20 @@ namespace HtmlRenderer.Adapters { /// - /// TODO:a add doc + /// Adapter for platform specific control object - used to handle updating the control that the html is rendered on.
    + /// Not relevant for platforms that don't render HTML on UI element. ///
    public abstract class RControl { /// /// The platform adapter. /// - private readonly Adapter _adapter; + private readonly RAdapter _adapter; /// /// Init control with platform adapter. /// - protected RControl(Adapter adapter) + protected RControl(RAdapter adapter) { ArgChecker.AssertArgNotNull(adapter, "adapter"); _adapter = adapter; @@ -37,7 +38,7 @@ protected RControl(Adapter adapter) /// /// The platform adapter. /// - public Adapter Adapter + public RAdapter Adapter { get { return _adapter; } } @@ -48,8 +49,8 @@ public Adapter Adapter public abstract bool LeftMouseButton { get; } /// - /// Is the right mouse button is currently in pressed state - /// + /// Is the right mouse button is currently in pressed state + ///
    public abstract bool RightMouseButton { get; } /// diff --git a/Source/HtmlRenderer/Adapters/RFont.cs b/Source/HtmlRenderer/Adapters/RFont.cs index 59f419f3a..85bdbf933 100644 --- a/Source/HtmlRenderer/Adapters/RFont.cs +++ b/Source/HtmlRenderer/Adapters/RFont.cs @@ -13,28 +13,28 @@ namespace HtmlRenderer.Adapters { /// - /// TODO:a add doc + /// Adapter for platform specific font object - used to render text using specific font. /// public abstract class RFont { /// - /// Gets the em-size of this Font measured in the units specified by the Unit property. - /// + /// Gets the em-size of this Font measured in the units specified by the Unit property. + /// public abstract double Size { get; } /// - /// The line spacing, in pixels, of this font. - /// + /// The line spacing, in pixels, of this font. + ///
    public abstract double Height { get; } /// - /// Get the vertical offset of the font underline location from the top of the font. - /// + /// Get the vertical offset of the font underline location from the top of the font. + ///
    public abstract double UnderlineOffset { get; } /// - /// Get the left padding, in pixels, of the font. - /// + /// Get the left padding, in pixels, of the font. + ///
    public abstract double LeftPadding { get; } public abstract double GetWhitespaceWidth(RGraphics graphics); diff --git a/Source/HtmlRenderer/Adapters/RFontFamily.cs b/Source/HtmlRenderer/Adapters/RFontFamily.cs index 49058b6b1..2e72330ef 100644 --- a/Source/HtmlRenderer/Adapters/RFontFamily.cs +++ b/Source/HtmlRenderer/Adapters/RFontFamily.cs @@ -13,14 +13,14 @@ namespace HtmlRenderer.Adapters { /// - /// TODO:a add doc + /// Adapter for platform specific font family object - define the available font families to use.
    /// Required for custom fonts handling: fonts that are not installed on the system. ///
    public abstract class RFontFamily { /// - /// Gets the name of this Font Family. - /// + /// Gets the name of this Font Family. + ///
    public abstract string Name { get; } } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Adapters/RGraphics.cs b/Source/HtmlRenderer/Adapters/RGraphics.cs index 4517d853c..ac0631616 100644 --- a/Source/HtmlRenderer/Adapters/RGraphics.cs +++ b/Source/HtmlRenderer/Adapters/RGraphics.cs @@ -18,9 +18,9 @@ namespace HtmlRenderer.Adapters { /// - /// Base class for the graphics methods required for HTML rendering.
    + /// Adapter for platform specific graphics rendering object - used to render graphics and text in platform specific context.
    /// The core HTML Renderer components use this class for rendering logic, extending this - /// class in different platform: WinForms, WPF, Silverlight, PdfSharp, etc. + /// class in different platform: WinForms, WPF, Metro, PDF, etc. ///
    public abstract class RGraphics : IDisposable { @@ -29,7 +29,7 @@ public abstract class RGraphics : IDisposable /// /// the global adapter /// - protected readonly Adapter _adapter; + protected readonly RAdapter _adapter; /// /// Te clipping bound stack as clips are pushed/poped to/from the graphics @@ -42,7 +42,7 @@ public abstract class RGraphics : IDisposable /// /// Init. /// - protected RGraphics(Adapter adapter, RRect initialClip) + protected RGraphics(RAdapter adapter, RRect initialClip) { ArgChecker.AssertArgNotNull(adapter, "global"); @@ -144,6 +144,7 @@ public RRect GetClip() /// /// Measure the width of string under max width restriction calculating the number of characters that can fit and the width those characters take.
    + /// Not relevant for platforms that don't render HTML on UI element. ///
    /// the string to measure /// the font to measure string with diff --git a/Source/HtmlRenderer/Adapters/RGraphicsPath.cs b/Source/HtmlRenderer/Adapters/RGraphicsPath.cs index 6745ae165..a55634785 100644 --- a/Source/HtmlRenderer/Adapters/RGraphicsPath.cs +++ b/Source/HtmlRenderer/Adapters/RGraphicsPath.cs @@ -15,7 +15,7 @@ namespace HtmlRenderer.Adapters { /// - /// TODO:a add doc + /// Adapter for platform specific graphics path object - used to render (draw/fill) path shape. /// public abstract class RGraphicsPath : IDisposable { @@ -25,8 +25,8 @@ public abstract class RGraphicsPath : IDisposable public abstract void Start(double x, double y); /// - /// Add stright line to the given point from te last point. - /// + /// Add stright line to the given point from te last point. + ///
    public abstract void LineTo(double x, double y); /// diff --git a/Source/HtmlRenderer/Adapters/RImage.cs b/Source/HtmlRenderer/Adapters/RImage.cs index 321d5eddc..356acf66c 100644 --- a/Source/HtmlRenderer/Adapters/RImage.cs +++ b/Source/HtmlRenderer/Adapters/RImage.cs @@ -11,30 +11,24 @@ // "The Art of War" using System; -using System.IO; namespace HtmlRenderer.Adapters { /// - /// TODO:a add doc + /// Adapter for platform specific image object - used to render images. /// public abstract class RImage : IDisposable { /// - /// Get the width, in pixels, of the image. - /// + /// Get the width, in pixels, of the image. + /// public abstract double Width { get; } /// - /// Get the height, in pixels, of the image. - /// + /// Get the height, in pixels, of the image. + ///
    public abstract double Height { get; } - /// - /// Saves this image to the specified stream in PNG format. - /// The Stream where the image will be saved. - public abstract void Save(MemoryStream stream); - public abstract void Dispose(); } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Adapters/RPen.cs b/Source/HtmlRenderer/Adapters/RPen.cs index 76ec3b6b5..ad76d6d51 100644 --- a/Source/HtmlRenderer/Adapters/RPen.cs +++ b/Source/HtmlRenderer/Adapters/RPen.cs @@ -15,23 +15,18 @@ namespace HtmlRenderer.Adapters { /// - /// TODO:a add doc + /// Adapter for platform specific pen objects - used to draw graphics (lines, rectangles and paths) /// public abstract class RPen { /// - /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. - /// + /// Gets or sets the width of this Pen, in units of the Graphics object used for drawing. + ///
    public abstract double Width { get; set; } /// - /// Gets or sets the style used for dashed lines drawn with this Pen. - /// + /// Gets or sets the style used for dashed lines drawn with this Pen. + ///
    public abstract RDashStyle DashStyle { set; } - - /// - /// Gets or sets an array of custom dashes and spaces. - /// - public abstract double[] DashPattern { set; } } } \ No newline at end of file diff --git a/Source/HtmlRenderer/Core/CssData.cs b/Source/HtmlRenderer/Core/CssData.cs index 727d3ad93..93107249d 100644 --- a/Source/HtmlRenderer/Core/CssData.cs +++ b/Source/HtmlRenderer/Core/CssData.cs @@ -57,11 +57,11 @@ internal CssData() /// default css data (as defined by W3), merged if class name already exists. If false only the data in the given stylesheet is returned. ///
    /// - /// TODO:a add doc + /// Platform adapter /// the stylesheet source to parse /// true - combine the parsed css data with default css data, false - return only the parsed css data /// the parsed css data - public static CssData Parse(Adapter adapter, string stylesheet, bool combineWithDefault = true) + public static CssData Parse(RAdapter adapter, string stylesheet, bool combineWithDefault = true) { CssParser parser = new CssParser(adapter); return parser.ParseStyleSheet(stylesheet, combineWithDefault); diff --git a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs index 25bdece7b..25768ebb2 100644 --- a/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/BordersDrawHandler.cs @@ -290,12 +290,9 @@ private static RPen GetPen(RGraphics g, string style, RColor color, double width break; case "dotted": p.DashStyle = RDashStyle.Dot; - break; case "dashed": p.DashStyle = RDashStyle.Dash; - if (p.Width < 2) - p.DashPattern = new[] { 4, 4d }; // better looking break; } return p; diff --git a/Source/HtmlRenderer/Core/Handlers/FontsHandler.cs b/Source/HtmlRenderer/Core/Handlers/FontsHandler.cs index 6f47eaa33..3431b1905 100644 --- a/Source/HtmlRenderer/Core/Handlers/FontsHandler.cs +++ b/Source/HtmlRenderer/Core/Handlers/FontsHandler.cs @@ -28,7 +28,7 @@ internal sealed class FontsHandler /// /// /// - private readonly Adapter _adapter; + private readonly RAdapter _adapter; /// /// Allow to map not installed fonts to different @@ -51,7 +51,7 @@ internal sealed class FontsHandler /// /// Init. /// - public FontsHandler(Adapter adapter) + public FontsHandler(RAdapter adapter) { ArgChecker.AssertArgNotNull(adapter, "global"); diff --git a/Source/HtmlRenderer/Core/HtmlContainerInt.cs b/Source/HtmlRenderer/Core/HtmlContainerInt.cs index e91d434b9..0c4708a6c 100644 --- a/Source/HtmlRenderer/Core/HtmlContainerInt.cs +++ b/Source/HtmlRenderer/Core/HtmlContainerInt.cs @@ -26,7 +26,7 @@ namespace HtmlRenderer.Core /// /// Low level handling of Html Renderer logic.
    /// Allows html layout and rendering without association to actual control, those allowing to handle html rendering on any graphics object.
    - /// Using this class will require the client to handle all propagations of mouse/keyboard events, layout/paint calls, scrolling offset, + /// Using this class will require the client to handle all propagation's of mouse/keyboard events, layout/paint calls, scrolling offset, /// location/size/rectangle handling and UI refresh requests.
    ///
    /// @@ -84,7 +84,7 @@ public sealed class HtmlContainerInt : IDisposable /// /// /// - private readonly Adapter _adapter; + private readonly RAdapter _adapter; /// /// parser for CSS data @@ -175,7 +175,7 @@ public sealed class HtmlContainerInt : IDisposable /// /// Init. /// - public HtmlContainerInt(Adapter adapter) + public HtmlContainerInt(RAdapter adapter) { ArgChecker.AssertArgNotNull(adapter, "global"); @@ -186,7 +186,7 @@ public HtmlContainerInt(Adapter adapter) /// /// /// - internal Adapter Adapter + internal RAdapter Adapter { get { return _adapter; } } @@ -339,7 +339,7 @@ public RPoint Location /// The max width and height of the rendered html.
    /// The max width will effect the html layout wrapping lines, resize images and tables where possible.
    /// The max height does NOT effect layout, but will not render outside it (clip).
    - /// can be exceed the max size by layout restrictions (unwrappable line, set image size, etc.).
    + /// can be exceed the max size by layout restrictions (unwrapable line, set image size, etc.).
    /// Set zero for unlimited (width\height separately).
    ///
    public RSize MaxSize @@ -406,15 +406,7 @@ internal RColor SelectionBackColor /// optional: the stylesheet to init with, init default if not given public void SetHtml(string htmlSource, CssData baseCssData = null) { - if (_root != null) - { - _root.Dispose(); - _root = null; - if (_selectionHandler != null) - _selectionHandler.Dispose(); - _selectionHandler = null; - } - + Clear(); if (!string.IsNullOrEmpty(htmlSource)) { _cssData = baseCssData ?? _adapter.DefaultCssData; @@ -428,6 +420,21 @@ public void SetHtml(string htmlSource, CssData baseCssData = null) } } + /// + /// Clear the content of the HTML container releasing any resources used to render previously existing content. + /// + public void Clear() + { + if (_root != null) + { + _root.Dispose(); + _root = null; + if (_selectionHandler != null) + _selectionHandler.Dispose(); + _selectionHandler = null; + } + } + /// /// Get html from the current DOM tree with style if requested. /// diff --git a/Source/HtmlRenderer/Core/Parse/CssParser.cs b/Source/HtmlRenderer/Core/Parse/CssParser.cs index 26faee4a9..b7786f704 100644 --- a/Source/HtmlRenderer/Core/Parse/CssParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssParser.cs @@ -36,7 +36,7 @@ internal sealed class CssParser /// /// /// - private readonly Adapter _adapter; + private readonly RAdapter _adapter; ///
    /// Utility for value parsing. @@ -54,7 +54,7 @@ internal sealed class CssParser /// /// Init. /// - public CssParser(Adapter adapter) + public CssParser(RAdapter adapter) { ArgChecker.AssertArgNotNull(adapter, "global"); diff --git a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs index 6b159dfca..f024df4b0 100644 --- a/Source/HtmlRenderer/Core/Parse/CssValueParser.cs +++ b/Source/HtmlRenderer/Core/Parse/CssValueParser.cs @@ -29,7 +29,7 @@ internal sealed class CssValueParser /// /// /// - private readonly Adapter _adapter; + private readonly RAdapter _adapter; #endregion @@ -37,7 +37,7 @@ internal sealed class CssValueParser /// /// Init. /// - public CssValueParser(Adapter adapter) + public CssValueParser(RAdapter adapter) { ArgChecker.AssertArgNotNull(adapter, "global"); diff --git a/Source/HtmlRenderer/Core/Parse/RegexParserUtils.cs b/Source/HtmlRenderer/Core/Parse/RegexParserUtils.cs index 22e14f0ac..dc9c82cda 100644 --- a/Source/HtmlRenderer/Core/Parse/RegexParserUtils.cs +++ b/Source/HtmlRenderer/Core/Parse/RegexParserUtils.cs @@ -41,7 +41,7 @@ internal static class RegexParserUtils /// /// Extracts css percentages from the string; e.g. 100% .5% 5.4% /// - public const string CssPercentage = @"([0-9]+|[0-9]*\.[0-9]+)\%"; //TODO: Check if works fine + public const string CssPercentage = @"([0-9]+|[0-9]*\.[0-9]+)\%"; /// /// Extracts CSS lengths; e.g. 9px 3pt .89em diff --git a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs index 2f4a98fa2..4e88f2b93 100644 --- a/Source/HtmlRenderer/Core/Utils/RenderUtils.cs +++ b/Source/HtmlRenderer/Core/Utils/RenderUtils.cs @@ -74,7 +74,7 @@ public static bool ClipGraphicsByOverflow(RGraphics g, CssBox box) public static void DrawImageLoadingIcon(RGraphics g, HtmlContainerInt htmlContainer, RRect r) { g.DrawRectangle(g.GetPen(RColor.LightGray), r.Left + 3, r.Top + 3, 13, 14); - var image = htmlContainer.Adapter.GetLoadImage(); + var image = htmlContainer.Adapter.GetLoadingImage(); g.DrawImage(image, new RRect(r.Left + 4, r.Top + 4, image.Width, image.Height)); } @@ -87,16 +87,16 @@ public static void DrawImageLoadingIcon(RGraphics g, HtmlContainerInt htmlContai public static void DrawImageErrorIcon(RGraphics g, HtmlContainerInt htmlContainer, RRect r) { g.DrawRectangle(g.GetPen(RColor.LightGray), r.Left + 2, r.Top + 2, 15, 15); - var image = htmlContainer.Adapter.GetErrorImage(); + var image = htmlContainer.Adapter.GetLoadingFailedImage(); g.DrawImage(image, new RRect(r.Left + 3, r.Top + 3, image.Width, image.Height)); } /// /// Creates a rounded rectangle using the specified corner radius
    - /// NW-----NE + /// NW-----NE /// | | /// | | - /// SW-----SE + /// SW-----SE ///
    /// the device to draw into /// Rectangle to round diff --git a/Source/HtmlRenderer/HtmlRenderer.csproj b/Source/HtmlRenderer/HtmlRenderer.csproj index 9adff6b2b..c15cc4155 100644 --- a/Source/HtmlRenderer/HtmlRenderer.csproj +++ b/Source/HtmlRenderer/HtmlRenderer.csproj @@ -104,7 +104,7 @@ - + From 416fd54a3415f2655b87578e0a08b68cd5bd1534 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 21 Jun 2014 15:20:01 +0300 Subject: [PATCH 108/254] * refactor --- Source/Demo/Common/Samples/00.Intro.htm | 8 +++----- Source/Demo/Common/Samples/20.About.htm | 2 +- Source/Demo/Common/SamplesLoader.cs | 7 ++++--- Source/Demo/WPF/DemoWindow.xaml.cs | 5 +++-- Source/Demo/WPF/MainControl.xaml.cs | 3 --- Source/Demo/WinForms/DemoForm.cs | 2 ++ Source/Demo/WinForms/MainControl.cs | 4 +--- Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs | 17 ++++++++++------- Source/HtmlRenderer/Core/Dom/CssBoxImage.cs | 17 ++++++++++------- 9 files changed, 34 insertions(+), 31 deletions(-) diff --git a/Source/Demo/Common/Samples/00.Intro.htm b/Source/Demo/Common/Samples/00.Intro.htm index 9b3bbfab0..ae8a64361 100644 --- a/Source/Demo/Common/Samples/00.Intro.htm +++ b/Source/Demo/Common/Samples/00.Intro.htm @@ -5,7 +5,7 @@

    - HTML Renderer Project + HTML Renderer Project - $$Platform$$
    Release $$Release$$

    @@ -65,7 +65,7 @@

  • 100% managed code and no external dependencies.
  • Supports .NET 2.0 or higher including Client Profile.
  • Handles "real world" malformed HTML, it doesn't have to be XHTML.
  • -
  • Lightweight single dll (~250K).
  • +
  • Lightweight (~300K).
  • High performance and low memory footprint.
  • Extendable and configurable.
  • @@ -89,8 +89,6 @@

  • Support image align
  • Handle :hover selector
  • Selection by shift+arrows
  • -
  • Better word wrap, not just whitespace
  • -
  • Support rtl using lang attribute
  • Better HTML tag parsing (optional closing tags)
  • More styles support
  • @@ -106,7 +104,7 @@

    2012 - Arthur Teplitzki

    - http://TheArtOfDev.wordpress.com + http://TheArtOfDev.com

    2009 - Jose Manuel Menendez Poo diff --git a/Source/Demo/Common/Samples/20.About.htm b/Source/Demo/Common/Samples/20.About.htm index 26878ca69..7bb3e76bf 100644 --- a/Source/Demo/Common/Samples/20.About.htm +++ b/Source/Demo/Common/Samples/20.About.htm @@ -24,7 +24,7 @@

    2012 - Arthur Teplitzki

    - http://TheArtOfDev.wordpress.com + http://TheArtOfDev.com

    2009 - Jose Manuel Menendez Poo

    diff --git a/Source/Demo/Common/SamplesLoader.cs b/Source/Demo/Common/SamplesLoader.cs index a39907559..0f8b1e8a5 100644 --- a/Source/Demo/Common/SamplesLoader.cs +++ b/Source/Demo/Common/SamplesLoader.cs @@ -38,9 +38,9 @@ public static class SamplesLoader /// /// Init. /// - static SamplesLoader() + public static void Init(string platform, string version) { - LoadSamples(); + LoadSamples(platform, version); } /// @@ -70,7 +70,7 @@ public static List PerformanceSamples /// /// Loads the tree of document samples /// - private static void LoadSamples() + private static void LoadSamples(string platform, string version) { var names = Assembly.GetExecutingAssembly().GetManifestResourceNames(); Array.Sort(names); @@ -100,6 +100,7 @@ private static void LoadSamples() } else { + html = html.Replace("$$Platform$$", platform).Replace("$$Release$$", version); _showcaseSamples.Add(new HtmlSample(shortName, name, html)); } } diff --git a/Source/Demo/WPF/DemoWindow.xaml.cs b/Source/Demo/WPF/DemoWindow.xaml.cs index fc02b26f2..7e4961249 100644 --- a/Source/Demo/WPF/DemoWindow.xaml.cs +++ b/Source/Demo/WPF/DemoWindow.xaml.cs @@ -16,6 +16,7 @@ using System.Windows; using System.Windows.Threading; using HtmlRenderer.Demo.Common; +using HtmlRenderer.WPF; namespace HtmlRenderer.Demo.WPF { @@ -34,9 +35,9 @@ public partial class DemoWindow #endregion public DemoWindow() { - InitializeComponent(); + SamplesLoader.Init("WPF", typeof(HtmlRender).Assembly.GetName().Version.ToString()); - // Icon = GetIcon(); + InitializeComponent(); WindowStartupLocation = WindowStartupLocation.CenterScreen; Width = SystemParameters.PrimaryScreenWidth * 0.7; diff --git a/Source/Demo/WPF/MainControl.xaml.cs b/Source/Demo/WPF/MainControl.xaml.cs index 2c6edb0db..c07f704e4 100644 --- a/Source/Demo/WPF/MainControl.xaml.cs +++ b/Source/Demo/WPF/MainControl.xaml.cs @@ -64,9 +64,6 @@ public MainControl() _htmlPanel.StylesheetLoad += HtmlRenderingHelper.OnStylesheetLoad; _htmlPanel.ImageLoad += HtmlRenderingHelper.OnImageLoad; - // _htmlToolTip.ImageLoad += HtmlRenderingHelper.OnImageLoad; - // _htmlToolTip.SetToolTip(_htmlPanel, Resources.Tooltip); - LoadSamples(); _updateHtmlTimer = new Timer(OnUpdateHtmlTimerTick); diff --git a/Source/Demo/WinForms/DemoForm.cs b/Source/Demo/WinForms/DemoForm.cs index 472b17aa0..c45920d36 100644 --- a/Source/Demo/WinForms/DemoForm.cs +++ b/Source/Demo/WinForms/DemoForm.cs @@ -40,6 +40,8 @@ public partial class DemoForm : Form /// public DemoForm() { + SamplesLoader.Init("WinForms", typeof(HtmlRender).Assembly.GetName().Version.ToString()); + InitializeComponent(); Icon = GetIcon(); diff --git a/Source/Demo/WinForms/MainControl.cs b/Source/Demo/WinForms/MainControl.cs index 3bf140095..8277b309a 100644 --- a/Source/Demo/WinForms/MainControl.cs +++ b/Source/Demo/WinForms/MainControl.cs @@ -170,10 +170,8 @@ private void LoadSamples() ///
    private void AddTreeNode(TreeNode root, HtmlSample sample) { - var html = sample.Html.Replace("$$Release$$", _htmlPanel.GetType().Assembly.GetName().Version.ToString()); - var node = new TreeNode(sample.Name); - node.Tag = new HtmlSample(sample.Name, sample.FullName, html); + node.Tag = new HtmlSample(sample.Name, sample.FullName, sample.Html); root.Nodes.Add(node); } diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs index cf56f7026..a62a6fdf2 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs @@ -485,14 +485,17 @@ private void DrawImage(RGraphics g, RPoint offset, RRect rect) { if (_imageWord.Image != null) { - if (_imageWord.ImageRectangle == RRect.Empty) - g.DrawImage(_imageWord.Image, rect); - else - g.DrawImage(_imageWord.Image, rect, _imageWord.ImageRectangle); - - if (_imageWord.Selected) + if (rect.Width > 0 && rect.Height > 0) { - g.DrawRectangle(GetSelectionBackBrush(g, true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width + 2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); + if (_imageWord.ImageRectangle == RRect.Empty) + g.DrawImage(_imageWord.Image, rect); + else + g.DrawImage(_imageWord.Image, rect, _imageWord.ImageRectangle); + + if (_imageWord.Selected) + { + g.DrawRectangle(GetSelectionBackBrush(g, true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width + 2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); + } } } else if (_isVideo && !_imageLoadingComplete) diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs index 5d6f96e55..8aa99c4f5 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxImage.cs @@ -94,14 +94,17 @@ protected override void PaintImp(RGraphics g) if (_imageWord.Image != null) { - if (_imageWord.ImageRectangle == RRect.Empty) - g.DrawImage(_imageWord.Image, r); - else - g.DrawImage(_imageWord.Image, r, _imageWord.ImageRectangle); - - if (_imageWord.Selected) + if (r.Width > 0 && r.Height > 0) { - g.DrawRectangle(GetSelectionBackBrush(g, true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width + 2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); + if (_imageWord.ImageRectangle == RRect.Empty) + g.DrawImage(_imageWord.Image, r); + else + g.DrawImage(_imageWord.Image, r, _imageWord.ImageRectangle); + + if (_imageWord.Selected) + { + g.DrawRectangle(GetSelectionBackBrush(g, true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width + 2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); + } } } else if (_imageLoadingComplete) From 9b771453258da4e68a1b1c84139a14ceff909189 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 21 Jun 2014 17:26:25 +0300 Subject: [PATCH 109/254] * refactor --- Source/Demo/Common/DemoUtils.cs | 66 ++++++++++ .../Common/HtmlRenderer.Demo.Common.csproj | 37 ++++++ .../Properties/Resources.Designer.cs | 24 ++-- .../Properties/Resources.resx | 0 Source/Demo/{WPF => Common}/Resources/IE.png | Bin .../Demo/{WPF => Common}/Resources/chrome.png | Bin .../Demo/{WPF => Common}/Resources/code.png | Bin .../Demo/{WPF => Common}/Resources/form.png | Bin .../Demo/{WPF => Common}/Resources/image.png | Bin Source/Demo/{WPF => Common}/Resources/pdf.png | Bin .../{WPF => Common}/Resources/stopwatch.png | Bin Source/Demo/WPF/DemoWindow.xaml | 18 +-- Source/Demo/WPF/DemoWindow.xaml.cs | 2 +- Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj | 35 +----- Source/Demo/WPF/HtmlRenderingHelper.cs | 69 +---------- Source/Demo/WPF/MainControl.xaml.cs | 4 +- .../Demo/WPF/Properties/Resources.Designer.cs | 63 ---------- Source/Demo/WPF/Properties/Resources.resx | 117 ------------------ Source/Demo/WPF/ToolStripImageConverter.cs | 33 +++++ Source/Demo/WPF/{Resources => }/html.ico | Bin Source/Demo/WinForms/DemoForm.Designer.cs | 82 ++++++------ Source/Demo/WinForms/DemoForm.cs | 11 +- Source/Demo/WinForms/DemoForm.resx | 57 --------- Source/Demo/WinForms/GenerateImageForm.cs | 8 +- Source/Demo/WinForms/GenerateImageForm.resx | 34 +---- .../HtmlRenderer.Demo.WinForms.csproj | 34 +---- Source/Demo/WinForms/HtmlRenderingHelper.cs | 69 +---------- Source/Demo/WinForms/MainControl.cs | 4 +- Source/Demo/WinForms/Resources/IE.png | Bin 1407 -> 0 bytes Source/Demo/WinForms/Resources/chrome.png | Bin 1420 -> 0 bytes Source/Demo/WinForms/Resources/code.png | Bin 438 -> 0 bytes Source/Demo/WinForms/Resources/form.png | Bin 1135 -> 0 bytes Source/Demo/WinForms/Resources/image.png | Bin 582 -> 0 bytes Source/Demo/WinForms/Resources/pdf.png | Bin 413 -> 0 bytes Source/Demo/WinForms/Resources/stopwatch.png | Bin 528 -> 0 bytes Source/Demo/WinForms/{Resources => }/html.ico | Bin 36 files changed, 229 insertions(+), 538 deletions(-) rename Source/Demo/{WinForms => Common}/Properties/Resources.Designer.cs (87%) rename Source/Demo/{WinForms => Common}/Properties/Resources.resx (100%) rename Source/Demo/{WPF => Common}/Resources/IE.png (100%) rename Source/Demo/{WPF => Common}/Resources/chrome.png (100%) rename Source/Demo/{WPF => Common}/Resources/code.png (100%) rename Source/Demo/{WPF => Common}/Resources/form.png (100%) rename Source/Demo/{WPF => Common}/Resources/image.png (100%) rename Source/Demo/{WPF => Common}/Resources/pdf.png (100%) rename Source/Demo/{WPF => Common}/Resources/stopwatch.png (100%) delete mode 100644 Source/Demo/WPF/Properties/Resources.Designer.cs delete mode 100644 Source/Demo/WPF/Properties/Resources.resx create mode 100644 Source/Demo/WPF/ToolStripImageConverter.cs rename Source/Demo/WPF/{Resources => }/html.ico (100%) delete mode 100644 Source/Demo/WinForms/Resources/IE.png delete mode 100644 Source/Demo/WinForms/Resources/chrome.png delete mode 100644 Source/Demo/WinForms/Resources/code.png delete mode 100644 Source/Demo/WinForms/Resources/form.png delete mode 100644 Source/Demo/WinForms/Resources/image.png delete mode 100644 Source/Demo/WinForms/Resources/pdf.png delete mode 100644 Source/Demo/WinForms/Resources/stopwatch.png rename Source/Demo/WinForms/{Resources => }/html.ico (100%) diff --git a/Source/Demo/Common/DemoUtils.cs b/Source/Demo/Common/DemoUtils.cs index 10bf2ed08..99fc3af10 100644 --- a/Source/Demo/Common/DemoUtils.cs +++ b/Source/Demo/Common/DemoUtils.cs @@ -12,6 +12,8 @@ using System; using System.Diagnostics; +using System.IO; +using HtmlRenderer.Core.Entities; namespace HtmlRenderer.Demo.Common { @@ -19,6 +21,70 @@ public class DemoUtils { private const int Iterations = 20; + /// + /// Handle stylesheet resolve. + /// + public static void OnStylesheetLoad(object sender, HtmlStylesheetLoadEventArgs e) + { + var stylesheet = GetStylesheet(e.Src); + if (stylesheet != null) + e.SetStyleSheet = stylesheet; + } + + /// + /// Get stylesheet by given key. + /// + public static string GetStylesheet(string src) + { + if (src == "StyleSheet") + { + return @"h1, h2, h3 { color: navy; font-weight:normal; } + h1 { margin-bottom: .47em } + h2 { margin-bottom: .3em } + h3 { margin-bottom: .4em } + ul { margin-top: .5em } + ul li {margin: .25em} + body { font:10pt Tahoma } + pre { border:solid 1px gray; background-color:#eee; padding:1em } + a:link { text-decoration: none; } + a:hover { text-decoration: underline; } + .gray { color:gray; } + .example { background-color:#efefef; corner-radius:5px; padding:0.5em; } + .whitehole { background-color:white; corner-radius:10px; padding:15px; } + .caption { font-size: 1.1em } + .comment { color: green; margin-bottom: 5px; margin-left: 3px; } + .comment2 { color: green; }"; + } + return null; + } + + /// + /// Get image by resource key. + /// + public static Stream GetImageStream(string src) + { + switch (src.ToLower()) + { + case "htmlicon": + return Resources.Html32; + case "staricon": + return Resources.Favorites32; + case "fonticon": + return Resources.Font32; + case "commenticon": + return Resources.Comment16; + case "imageicon": + return Resources.Image32; + case "methodicon": + return Resources.Method16; + case "propertyicon": + return Resources.Property16; + case "eventicon": + return Resources.Event16; + } + return null; + } + public static string RunSamplesPerformanceTest(Action setHtmlDelegate) { GC.Collect(); diff --git a/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj b/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj index 548c88684..f4a4ee5ea 100644 --- a/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj +++ b/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj @@ -38,6 +38,11 @@ + + Resources.resx + True + True + @@ -48,6 +53,11 @@ + + PublicResXFileCodeGenerator + Resources.Designer.cs + Designer + @@ -121,6 +131,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + {FE611685-391F-4E3E-B27E-D3150E51E49B} + HtmlRenderer + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Source/Demo/WPF/ToolStripImageConverter.cs b/Source/Demo/WPF/ToolStripImageConverter.cs new file mode 100644 index 000000000..32255eb7f --- /dev/null +++ b/Source/Demo/WPF/ToolStripImageConverter.cs @@ -0,0 +1,33 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System; +using System.Globalization; +using System.Windows.Data; +using HtmlRenderer.Demo.Common; + +namespace HtmlRenderer.Demo.WPF +{ + public class ToolStripImageConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var imageStream = typeof(Resources).Assembly.GetManifestResourceStream("HtmlRenderer.Demo.Common.Resources." + parameter + ".png"); + return HtmlRenderingHelper.ImageFromStream(imageStream); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return null; + } + } +} \ No newline at end of file diff --git a/Source/Demo/WPF/Resources/html.ico b/Source/Demo/WPF/html.ico similarity index 100% rename from Source/Demo/WPF/Resources/html.ico rename to Source/Demo/WPF/html.ico diff --git a/Source/Demo/WinForms/DemoForm.Designer.cs b/Source/Demo/WinForms/DemoForm.Designer.cs index 3e413178b..155607634 100644 --- a/Source/Demo/WinForms/DemoForm.Designer.cs +++ b/Source/Demo/WinForms/DemoForm.Designer.cs @@ -30,19 +30,18 @@ protected override void Dispose(bool disposing) ///
    private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DemoForm)); this._toolStrip = new System.Windows.Forms.ToolStrip(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this._mainControl = new HtmlRenderer.Demo.WinForms.MainControl(); this._openSampleFormTSB = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this._showIEViewTSSB = new System.Windows.Forms.ToolStripButton(); this._openInExternalViewTSB = new System.Windows.Forms.ToolStripButton(); this._useGeneratedHtmlTSB = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this._generateImageSTB = new System.Windows.Forms.ToolStripButton(); this._generatePdfTSB = new System.Windows.Forms.ToolStripButton(); this._runPerformanceTSB = new System.Windows.Forms.ToolStripButton(); + this._mainControl = new HtmlRenderer.Demo.WinForms.MainControl(); this._toolStrip.SuspendLayout(); this.SuspendLayout(); // @@ -64,59 +63,34 @@ private void InitializeComponent() this._toolStrip.Size = new System.Drawing.Size(878, 25); this._toolStrip.TabIndex = 1; // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); - // - // _mainControl - // - this._mainControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this._mainControl.Location = new System.Drawing.Point(4, 32); - this._mainControl.Name = "_mainControl"; - this._mainControl.Size = new System.Drawing.Size(878, 594); - this._mainControl.TabIndex = 2; - this._mainControl.UpdateLock = false; - this._mainControl.UseGeneratedHtml = false; - // // _openSampleFormTSB // - this._openSampleFormTSB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.form; this._openSampleFormTSB.ImageTransparentColor = System.Drawing.Color.Magenta; this._openSampleFormTSB.Name = "_openSampleFormTSB"; - this._openSampleFormTSB.Size = new System.Drawing.Size(129, 22); + this._openSampleFormTSB.Size = new System.Drawing.Size(113, 22); this._openSampleFormTSB.Text = "Open Sample Form"; this._openSampleFormTSB.ToolTipText = "Open Sample Form to control HtmlPanel, HtmlLabel and HtmlTooltip properties."; this._openSampleFormTSB.Click += new System.EventHandler(this.OnOpenSampleForm_Click); // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25); + // // _showIEViewTSSB // - this._showIEViewTSSB.Image = ((System.Drawing.Image)(resources.GetObject("_showIEViewTSSB.Image"))); this._showIEViewTSSB.ImageTransparentColor = System.Drawing.Color.Magenta; this._showIEViewTSSB.Name = "_showIEViewTSSB"; - this._showIEViewTSSB.Size = new System.Drawing.Size(101, 22); + this._showIEViewTSSB.Size = new System.Drawing.Size(85, 22); this._showIEViewTSSB.Text = "Show Browser"; this._showIEViewTSSB.ToolTipText = "Toggle if to show split view of HtmlPanel and WinForms WebBrowser control."; this._showIEViewTSSB.Click += new System.EventHandler(this.OnShowIEView_ButtonClick); // // _openInExternalViewTSB // - this._openInExternalViewTSB.Image = ((System.Drawing.Image)(resources.GetObject("_openInExternalViewTSB.Image"))); this._openInExternalViewTSB.ImageTransparentColor = System.Drawing.Color.Magenta; this._openInExternalViewTSB.Name = "_openInExternalViewTSB"; - this._openInExternalViewTSB.Size = new System.Drawing.Size(100, 22); + this._openInExternalViewTSB.Size = new System.Drawing.Size(84, 22); this._openInExternalViewTSB.Text = "Open External"; this._openInExternalViewTSB.ToolTipText = "Open the HTML is the machine default browser, external to the demo application."; this._openInExternalViewTSB.Click += new System.EventHandler(this.OnOpenInExternalView_Click); @@ -124,7 +98,6 @@ private void InitializeComponent() // _useGeneratedHtmlTSB // this._useGeneratedHtmlTSB.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this._useGeneratedHtmlTSB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.code; this._useGeneratedHtmlTSB.ImageTransparentColor = System.Drawing.Color.Magenta; this._useGeneratedHtmlTSB.Name = "_useGeneratedHtmlTSB"; this._useGeneratedHtmlTSB.Size = new System.Drawing.Size(23, 22); @@ -132,12 +105,21 @@ private void InitializeComponent() this._useGeneratedHtmlTSB.ToolTipText = "Toggle is to use generated HTML from the HtmlPanel in Browser/External views."; this._useGeneratedHtmlTSB.Click += new System.EventHandler(this.OnUseGeneratedHtml_Click); // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); + // // _generateImageSTB // - this._generateImageSTB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.image; this._generateImageSTB.ImageTransparentColor = System.Drawing.Color.Magenta; this._generateImageSTB.Name = "_generateImageSTB"; - this._generateImageSTB.Size = new System.Drawing.Size(110, 22); + this._generateImageSTB.Size = new System.Drawing.Size(94, 22); this._generateImageSTB.Text = "Generate Image"; this._generateImageSTB.ToolTipText = "Open generate image form to show the image generation capabilities of HTML Render" + "er."; @@ -145,10 +127,9 @@ private void InitializeComponent() // // _generatePdfTSB // - this._generatePdfTSB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.pdf; this._generatePdfTSB.ImageTransparentColor = System.Drawing.Color.Magenta; this._generatePdfTSB.Name = "_generatePdfTSB"; - this._generatePdfTSB.Size = new System.Drawing.Size(98, 22); + this._generatePdfTSB.Size = new System.Drawing.Size(82, 22); this._generatePdfTSB.Text = "Generate PDF"; this._generatePdfTSB.ToolTipText = "Generate PDF from the current HTML using PdfSharp library."; this._generatePdfTSB.Click += new System.EventHandler(this.OnGeneratePdf_Click); @@ -156,13 +137,24 @@ private void InitializeComponent() // _runPerformanceTSB // this._runPerformanceTSB.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this._runPerformanceTSB.Image = global::HtmlRenderer.Demo.WinForms.Properties.Resources.stopwatch; this._runPerformanceTSB.ImageTransparentColor = System.Drawing.Color.Magenta; this._runPerformanceTSB.Name = "_runPerformanceTSB"; - this._runPerformanceTSB.Size = new System.Drawing.Size(119, 22); + this._runPerformanceTSB.Size = new System.Drawing.Size(103, 22); this._runPerformanceTSB.Text = "Run Performance"; this._runPerformanceTSB.Click += new System.EventHandler(this.OnRunPerformance_Click); // + // _mainControl + // + this._mainControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this._mainControl.Location = new System.Drawing.Point(4, 32); + this._mainControl.Name = "_mainControl"; + this._mainControl.Size = new System.Drawing.Size(878, 594); + this._mainControl.TabIndex = 2; + this._mainControl.UpdateLock = false; + this._mainControl.UseGeneratedHtml = false; + // // DemoForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/Source/Demo/WinForms/DemoForm.cs b/Source/Demo/WinForms/DemoForm.cs index c45920d36..89545bdb9 100644 --- a/Source/Demo/WinForms/DemoForm.cs +++ b/Source/Demo/WinForms/DemoForm.cs @@ -45,6 +45,13 @@ public DemoForm() InitializeComponent(); Icon = GetIcon(); + _openSampleFormTSB.Image = Common.Properties.Resources.form; + _showIEViewTSSB.Image = Common.Properties.Resources.IE; + _openInExternalViewTSB.Image = Common.Properties.Resources.chrome; + _useGeneratedHtmlTSB.Image = Common.Properties.Resources.code; + _generateImageSTB.Image = Common.Properties.Resources.image; + _generatePdfTSB.Image = Common.Properties.Resources.pdf; + _runPerformanceTSB.Image = Common.Properties.Resources.stopwatch; StartPosition = FormStartPosition.CenterScreen; var size = Screen.GetWorkingArea(Point.Empty); @@ -73,7 +80,7 @@ private void LoadCustomFonts() ///
    internal static Icon GetIcon() { - var stream = typeof(DemoForm).Assembly.GetManifestResourceStream("HtmlRenderer.Demo.WinForms.Resources.html.ico"); + var stream = typeof(DemoForm).Assembly.GetManifestResourceStream("HtmlRenderer.Demo.WinForms.html.ico"); return stream != null ? new Icon(stream) : null; } @@ -134,7 +141,7 @@ private void OnGeneratePdf_Click(object sender, EventArgs e) config.PageSize = PageSize.A4; config.SetMargins(20); - var doc = PdfGenerator.GeneratePdf(_mainControl.GetHtml(), config, null, HtmlRenderingHelper.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoadPdfSharp); + var doc = PdfGenerator.GeneratePdf(_mainControl.GetHtml(), config, null, DemoUtils.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoadPdfSharp); var tmpFile = Path.GetTempFileName(); tmpFile = Path.GetFileNameWithoutExtension(tmpFile) + ".pdf"; doc.Save(tmpFile); diff --git a/Source/Demo/WinForms/DemoForm.resx b/Source/Demo/WinForms/DemoForm.resx index 5e4b88f33..cd0a1f09e 100644 --- a/Source/Demo/WinForms/DemoForm.resx +++ b/Source/Demo/WinForms/DemoForm.resx @@ -120,61 +120,4 @@ 139, 17 - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAT/SURBVFhHtVd7TFtVGG9LeZXSFlplwFSQIUKcm2yT+Jwy - o/hIZmKMjxmTuewP/9lMNEaNSV2iccZsWVxiQozPQF3a3nv7AgqD1S1mD8E4lZVC7zm3t1DQbVEXM58b - 1/OVc+HucvsYwi/5pffxfd/v9Hzf+c65upWCJEl69a98vaIYkaTCdX3Cfddw+G0zw/fbPHGh2Dv+i8UT - +8nGoEh9EG2jpv8P8G8CKcn08umZ+sdPTDe3H0212jl+XyER0ndHZ3UeXgLqPdFLVg/iTSz6upxFPxrI - fW0A76Jhrg4g2ton3mP3oQ8sDDpT4OH/0XdFZ0FQKQosZRCqCQov7hw+W61Mw6Z+YX25h4++N3auPB00 - X7SEhA4zi4fVQpkIg6vgcNedQ2IDDTGP1f7EjpvCyQ56mx3bTp63OLh4l94T1xTKRaMrdhGmXFmAHcem - W5p8wgv0NjPaB5O1JczE91qBr5YVHPrMPTpaBHHv/Sq5tjmAn0qLZMKWU1P2EpIrrWBLpZWNd5OZMNQR - 8buGJtdRqcUAIyuLerSCaFHvyq8uII3VAeG1Oj9+F5YrlVuM60OJHRCULKHLdYEEY3XHFgnAOwvLHyVT - u8fBCS9V+tBeMxs/rctRKwUu/q9VfuGAsiauQCdZ24WH4tNQxQ1B4S3jITSpDkJSw99yeOoOZRC4Bq7p - E580ksaj9lHSysUHMg6gNpjYaSSjbAont5cy8Zja2cjERChOaq6J5v7JNqMn+qfaVyYs5bYj4gZqvgAY - VQWLjjSGhGfMLOrTcmwIiVupeVZAK1b7K2nn0AFqugDnd7/aGkOJXat8+E0tJxNJh1uSCqh5Vmw9MVOn - 7z6TsThNHjy+KA37jidL1/aLGwq8/N9aTmUs+ralR3g2XxZ9GbuoFQeod0cvH4xesFPpOUQkyQgiWg4y - 9a6x2Xyp5S8T0rnx8NRtVHoO15HNI9cyWk7WhMQHqLRO9/7pmTKjh09pGa4I3XGpNiTcT+V1uuog3q1p - qGApac12P96/LGTx/vbjdDlD7ksZHmuJKmlm+bDccJaDaXFAc4/wcD77fLGXv+AclczULSe0RGVSkzkj - C4s+BwEYBGlAo2phJav8wuvUNSvW9OLNZnbiGzOHF5M8h2aXNoTpL2LQWQhu8/Hhxl7hkWyzAW365l7x - wbRzBmyOzNQZvTFRyx8IMR6V2/ndg5O3giAQ2iyZEUMZw5/UcpQJAWAmnKM/p9MhT2skIhlvDApPF3rH - Z7T8ZDp8+MO0OKChR3wemgbkNyJIJfCsJYxuh91Qy1nJYi/6zcrhYJUPdVZy2G1i+ClYXlq2MmFwj42k - HGlxgIVDb8ALkpsB+igNsixfXeo5MBMNLv7fpr7kQ1RiDuUsfgdekkPCR8rqhGsHhw/qVUGWSoN37BIc - dGj4BVzrw7vh9OPw8V8oBwBwknqo9gt74PSjFTRfGr1jf9xANica9kpsGhA3QgFCG3aS0xB9PA8YVDNZ - GaRGftcKno2QQrKsh9eHceYDKIC0xU/SPYDhw1vIkXlidra4d+K8pZWcbMgMOW0cPuXwCXtrAvgVE/nM - 0kOhZdjt0rsgxCLCZMqfI38g9/mBGBlWB4TtFgYfKyc9weJF5yxe/IONi39cH0g80ZlKzc+M2+0uaCMD - qyKn20oOuczkg9PMoREiOEQ+2T6tJh8h7YOJFnU684LSCa5zBZHfq3/zh073H6UZ7Cvt49UZAAAAAElF - TkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAUWSURBVFhH1ZZ9TBtlHMePzT90MVvUf6ZumphhoGXgZMH3 - l0XaMijlJekyRY2YOUPGYL3Sdqhbt8zpfP3DsGwxOpewuLmX4BLNnLgN0YgRhEnfoO1R2iuBjpdRoKVX - 7u7nc+WplPLAXpgxfpNP0hx3v8/vnjeO+l8FzNQSX0HW/awmo4DVyKt9GpnZr5Ht7ivK2M6q0zf2lqTd - K92Db791YXIfWuEvlFf0quW/e9WpUW+hHHqTkK758uScT5P+q69IviWgld2JH7/5gJZa6tNkvM5qZP5k - 4bVADXn7imQv3fSIjBasvQsNcwPpbW8EVi077sxbsxyXvb4E8mUrkbiDVPBm8GvkLf7itHtw+YXjLMtZ - jhZUK6nQYmAL5c1t6uxlWEOOGc2XV7O2nlTgVuArlh8GikrBurk5fOyVUo8mg/hwIt7SR6BvWxEE9lZA - YF8FDOwqgYGdj0G/KXtBfKZscfTIEyqsmx3zJfNtO2xG2/l3FESphLc4C4Y+2wVRvwdAEGAmAoicF6YG - PgDOnQecSzkvk4yyFYCwM/Q240ad1QDm5kpwl2TOlWvXQ6jlp5iuezQCH1sG4bVmFsoRn1oHgRnjYn8T - xi6iJtREeQy3EqI9imexdia01VCvsxhA4vRHhUkNZMBE03cgiAAH7cMgO+OE1FPds8hA177sHgF0CwjB - 78lyzBSjOIS10zGbzUuqO4z98QZMrTpwbF73TwOBPW+isiIcdY7MESdzsmc0dm/UryfKJaKMwo3V09n+ - l3EVbTXG5HGOfr5pugG1DMJtzXCV4yGrwUWUJrL+rBsmpgQQxn8myiUmHBuEUavybqynqB2Wmqek+U9s - QH+5BjrKc9DCywRxMgxnPEGikMQ5dgyADxLlElFGBRyTl4n1qIFOfUGiPE7dN68CW/a0tLbgE7ToSDIS - hx3DsWng3BpyA9JC7FY9g/UUVW2hVaQGJFpqC2LF6uxDRBmJI2itgMjPuxukBsIu5ZNYj3aAzbQueQ3E - OXDuDZgauQK/DIRgDUGWjHRP+1AYxKgfyRRz5LEG0BRE7C88jPUUZWJMK5CMT5bH+YNtAl4UIf+8hyhN - pPSCN7Zd+ZETRLnEhF05CZ7nbsf66dDWmk6SXGJf13sQETiwjEzCo9/OvxNy0A5wBiPoIBiHqGczUS4R - cSt+w9qZ6O3G/SR5nK/ZE+jNBLBfjYAWvWXa6ZnDKB39fvGSD1xBDo0UD5P9+4niODyjqsXamdCddBoS - zTsNEsfY4xDiQ7HpcKDjuKE3CGe9wdjRzKNhH58ahyb2EEQI0jgT7g1cmMl9AGtnR2erOUUSJ7Knax80 - XrkA/rAfglNjiCD4wiz8EPgRzI69wHQXE8VxoozyK6ybmyqbIbXSapggiZOhLUYw2t6KIf2WrtXbtxCl - cSYdyquiS7ka68jRW43luj8NYrLwWtRaaBh25hPFEuj45fke1SasWSBApdCOnQd07TfWRKOjjCiWQNtO - RIfPblR9/q+hxGhPapfqbYb3t7VXCyRZMu9aq9DJhs53ovx5XpJLn3u4/PUFnb8pNV2ml+nL9BBJmkh7 - l5Yo5xhlgHPladEX0PW9OSlGJ/pXbTd8obPSIZK8zlYxRxxyK8eFHuVB8OSvxGUWH9pCr9Y7THraZrxY - 2WkcRF9QvL7DILrs+YI0zByjCvA9ika00KpD3tz78GP/QtBwbm3buuxtm/7BD7uqMkWvSh5y5q0SfY/f - saih/m9CUX8DDoWWDIh96o0AAAAASUVORK5CYII= - - \ No newline at end of file diff --git a/Source/Demo/WinForms/GenerateImageForm.cs b/Source/Demo/WinForms/GenerateImageForm.cs index 6a976697c..68da7dbd0 100644 --- a/Source/Demo/WinForms/GenerateImageForm.cs +++ b/Source/Demo/WinForms/GenerateImageForm.cs @@ -17,7 +17,7 @@ using System.Drawing.Text; using System.Reflection; using System.Windows.Forms; -using HtmlRenderer.Demo.WinForms.Properties; +using HtmlRenderer.Demo.Common; using HtmlRenderer.WinForms; namespace HtmlRenderer.Demo.WinForms @@ -32,7 +32,7 @@ public GenerateImageForm(string html) _html = html; InitializeComponent(); - Icon = Icon.FromHandle(Resources.image.GetHicon()); + Icon = DemoForm.GetIcon(); _background = HtmlRenderingHelper.CreateImageForTransparentBackground(); @@ -81,8 +81,8 @@ private void GenerateImage() var backgroundColor = Color.FromName(_backgroundColorTSB.SelectedItem.ToString()); TextRenderingHint textRenderingHint = (TextRenderingHint)Enum.Parse(typeof(TextRenderingHint), _textRenderingHintTSCB.SelectedItem.ToString()); var img = _useGdiPlusTSB.Checked - ? HtmlRender.RenderToImageGdiPlus(_html, _pictureBox.ClientSize, textRenderingHint, null, HtmlRenderingHelper.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoad) - : HtmlRender.RenderToImage(_html, _pictureBox.ClientSize, backgroundColor, null, HtmlRenderingHelper.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoad); + ? HtmlRender.RenderToImageGdiPlus(_html, _pictureBox.ClientSize, textRenderingHint, null, DemoUtils.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoad) + : HtmlRender.RenderToImage(_html, _pictureBox.ClientSize, backgroundColor, null, DemoUtils.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoad); _pictureBox.Image = img; } } diff --git a/Source/Demo/WinForms/GenerateImageForm.resx b/Source/Demo/WinForms/GenerateImageForm.resx index 39bd306b6..cf09fa6f5 100644 --- a/Source/Demo/WinForms/GenerateImageForm.resx +++ b/Source/Demo/WinForms/GenerateImageForm.resx @@ -117,38 +117,8 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - + + 17, 17 \ No newline at end of file diff --git a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj index e9221e86f..f0176d120 100644 --- a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj @@ -60,7 +60,7 @@ false - Resources\html.ico + html.ico @@ -118,11 +118,6 @@ Designer DemoForm.cs - - True - True - Resources.resx - Form @@ -131,10 +126,6 @@ - - ResXFileCodeGenerator - Resources.Designer.cs - Designer SampleForm.cs @@ -176,32 +167,11 @@ - + - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Demo/WinForms/HtmlRenderingHelper.cs b/Source/Demo/WinForms/HtmlRenderingHelper.cs index 164182950..c958340ff 100644 --- a/Source/Demo/WinForms/HtmlRenderingHelper.cs +++ b/Source/Demo/WinForms/HtmlRenderingHelper.cs @@ -47,33 +47,6 @@ public static Bitmap CreateImageForTransparentBackground() return image; } - /// - /// Get stylesheet by given key. - /// - public static string GetStylesheet(string src) - { - if (src == "StyleSheet") - { - return @"h1, h2, h3 { color: navy; font-weight:normal; } - h1 { margin-bottom: .47em } - h2 { margin-bottom: .3em } - h3 { margin-bottom: .4em } - ul { margin-top: .5em } - ul li {margin: .25em} - body { font:10pt Tahoma } - pre { border:solid 1px gray; background-color:#eee; padding:1em } - a:link { text-decoration: none; } - a:hover { text-decoration: underline; } - .gray { color:gray; } - .example { background-color:#efefef; corner-radius:5px; padding:0.5em; } - .whitehole { background-color:white; corner-radius:10px; padding:15px; } - .caption { font-size: 1.1em } - .comment { color: green; margin-bottom: 5px; margin-left: 3px; } - .comment2 { color: green; }"; - } - return null; - } - /// /// Get image by resource key. /// @@ -82,36 +55,12 @@ public static Image TryLoadResourceImage(string src) Image image; if (!_imageCache.TryGetValue(src, out image)) { - switch (src.ToLower()) + var imageStream = DemoUtils.GetImageStream(src); + if (imageStream != null) { - case "htmlicon": - image = Image.FromStream(Resources.Html32); - break; - case "staricon": - image = Image.FromStream(Resources.Favorites32); - break; - case "fonticon": - image = Image.FromStream(Resources.Font32); - break; - case "commenticon": - image = Image.FromStream(Resources.Comment16); - break; - case "imageicon": - image = Image.FromStream(Resources.Image32); - break; - case "methodicon": - image = Image.FromStream(Resources.Method16); - break; - case "propertyicon": - image = Image.FromStream(Resources.Property16); - break; - case "eventicon": - image = Image.FromStream(Resources.Event16); - break; - } - - if (image != null) + image = Image.FromStream(imageStream); _imageCache[src] = image; + } } return image; } @@ -125,16 +74,6 @@ public static XImage TryLoadResourceXImage(string src) return img != null ? XImage.FromGdiPlusImage(img) : null; } - /// - /// Handle stylesheet resolve. - /// - public static void OnStylesheetLoad(object sender, HtmlStylesheetLoadEventArgs e) - { - var stylesheet = GetStylesheet(e.Src); - if (stylesheet != null) - e.SetStyleSheet = stylesheet; - } - /// /// On image load in renderer set the image by event async. /// diff --git a/Source/Demo/WinForms/MainControl.cs b/Source/Demo/WinForms/MainControl.cs index 8277b309a..fe6eb6a95 100644 --- a/Source/Demo/WinForms/MainControl.cs +++ b/Source/Demo/WinForms/MainControl.cs @@ -55,7 +55,7 @@ public MainControl() _htmlPanel.RenderError += OnRenderError; _htmlPanel.LinkClicked += OnLinkClicked; - _htmlPanel.StylesheetLoad += HtmlRenderingHelper.OnStylesheetLoad; + _htmlPanel.StylesheetLoad += DemoUtils.OnStylesheetLoad; _htmlPanel.ImageLoad += HtmlRenderingHelper.OnImageLoad; _htmlToolTip.ImageLoad += HtmlRenderingHelper.OnImageLoad; @@ -269,7 +269,7 @@ private string GetFixedHtml() html = Regex.Replace(html, @"href=\""(\w.*?)\""", match => { - var stylesheet = HtmlRenderingHelper.GetStylesheet(match.Groups[1].Value); + var stylesheet = DemoUtils.GetStylesheet(match.Groups[1].Value); if (stylesheet != null) { var tmpFile = Path.GetTempFileName(); diff --git a/Source/Demo/WinForms/Resources/IE.png b/Source/Demo/WinForms/Resources/IE.png deleted file mode 100644 index a2521226f09762e0b866d8ef41978bc091e598ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1407 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 Hu0mjft8J@v diff --git a/Source/Demo/WinForms/Resources/stopwatch.png b/Source/Demo/WinForms/Resources/stopwatch.png deleted file mode 100644 index e20f6d25bcf440ce42ae9ce94b6820f9012a0e5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmV+r0`L8aP)C=h{ka=EKw90 zmtVL&$$2sH}KIy78@rlcqx=@D+Qr+p_F7PP*_@9f_T1com#?1Zr`hC1QsIlPuEE6f+cJ zUXz0mkXrGfw+V$*D?4TslhWRcv9UYspSKAK5(G4-@iAlH40LNN_x(VA2`~T|2?K`$ Sm{6zy0000 Date: Sat, 21 Jun 2014 17:37:37 +0300 Subject: [PATCH 110/254] WPF - handle custom fonts --- Source/Demo/WPF/DemoWindow.xaml.cs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Source/Demo/WPF/DemoWindow.xaml.cs b/Source/Demo/WPF/DemoWindow.xaml.cs index 23c77cbcd..d95941cdf 100644 --- a/Source/Demo/WPF/DemoWindow.xaml.cs +++ b/Source/Demo/WPF/DemoWindow.xaml.cs @@ -52,15 +52,13 @@ public DemoWindow() ///
    private void LoadCustomFonts() { - // TODO:a load custom fonts - // // load custom font font into private fonts collection - // var file = Path.GetTempFileName(); - // File.WriteAllBytes(file, Resources.CustomFont); - // _privateFont.AddFontFile(file); - // - // // add the fonts to renderer - // foreach (var fontFamily in _privateFont.Families) - // HtmlRender.AddFontFamily(fontFamily); + // load custom font font into private fonts collection + var file = Path.GetTempFileName(); + File.WriteAllBytes(file, Common.Resources.CustomFont); + var customFont = new FontFamily(file); + + // add the fonts to renderer + HtmlRender.AddFontFamily(customFont); } /// From 727f4003fc96de626bdadb032708f68eddd6eba3 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 21 Jun 2014 17:42:04 +0300 Subject: [PATCH 111/254] * refactor --- Source/HtmlRenderer.WPF/HtmlContainer.cs | 7 ++----- Source/HtmlRenderer.WPF/HtmlPanel.cs | 8 +------- Source/HtmlRenderer.WPF/HtmlRender.cs | 10 ++++------ 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/Source/HtmlRenderer.WPF/HtmlContainer.cs b/Source/HtmlRenderer.WPF/HtmlContainer.cs index ca0cb5260..3c3bae861 100644 --- a/Source/HtmlRenderer.WPF/HtmlContainer.cs +++ b/Source/HtmlRenderer.WPF/HtmlContainer.cs @@ -328,12 +328,9 @@ public string GetLinkAt(Point location) /// /// Measures the bounds of box and children, recursively. /// - /// Device context to draw - public void PerformLayout(DrawingContext g) + public void PerformLayout() { - ArgChecker.AssertArgNotNull(g, "g"); - - using (var ig = new GraphicsAdapter(g, new RRect(0, 0, double.MaxValue, double.MaxValue))) + using (var ig = new GraphicsAdapter()) { _htmlContainerInt.PerformLayout(ig); } diff --git a/Source/HtmlRenderer.WPF/HtmlPanel.cs b/Source/HtmlRenderer.WPF/HtmlPanel.cs index c5828e998..23bdfc553 100644 --- a/Source/HtmlRenderer.WPF/HtmlPanel.cs +++ b/Source/HtmlRenderer.WPF/HtmlPanel.cs @@ -188,13 +188,7 @@ protected Size PerformHtmlLayout(Size constraint) if (_htmlContainer != null) { _htmlContainer.MaxSize = new Size(HtmlWidth(constraint), 0); - - DrawingGroup dGroup = new DrawingGroup(); - using (var g = dGroup.Open()) - { - _htmlContainer.PerformLayout(g); - } - + _htmlContainer.PerformLayout(); return _htmlContainer.ActualSize; } return Size.Empty; diff --git a/Source/HtmlRenderer.WPF/HtmlRender.cs b/Source/HtmlRenderer.WPF/HtmlRender.cs index 61c5ee598..c2f817250 100644 --- a/Source/HtmlRenderer.WPF/HtmlRender.cs +++ b/Source/HtmlRenderer.WPF/HtmlRender.cs @@ -79,7 +79,6 @@ public static class HtmlRender /// /// /// The given font family instance must be remain alive while the renderer is in use.
    - /// If loaded to then the collection must be alive.
    /// If loaded from file then the file must not be deleted. ///
    /// The font family to add. @@ -138,7 +137,7 @@ public static Size Measure(DrawingContext g, string html, double maxWidth = 0, C EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { ArgChecker.AssertArgNotNull(g, "g"); - return MeasureInt(g, html, maxWidth, cssData, stylesheetLoad, imageLoad); + return MeasureInt(html, maxWidth, cssData, stylesheetLoad, imageLoad); } /// @@ -335,14 +334,13 @@ public static BitmapImage RenderToImage(string html, Size size, CssData cssData /// /// Measure the size (width and height) required to draw the given html under given width and height restrictions.
    ///
    - /// Device to use for measure /// HTML source to render /// optional: bound the width of the html to render in (default - 0, unlimited) /// optional: the style to use for html rendering (default - use W3 default style) /// optional: can be used to overwrite stylesheet resolution logic /// optional: can be used to overwrite image resolution logic /// the size required for the html - private static Size MeasureInt(DrawingContext g, string html, double maxWidth, CssData cssData, EventHandler stylesheetLoad, EventHandler imageLoad) + private static Size MeasureInt(string html, double maxWidth, CssData cssData, EventHandler stylesheetLoad, EventHandler imageLoad) { Size actualSize = Size.Empty; if (!string.IsNullOrEmpty(html)) @@ -359,7 +357,7 @@ private static Size MeasureInt(DrawingContext g, string html, double maxWidth, C container.ImageLoad += imageLoad; container.SetHtml(html, cssData); - container.PerformLayout(g); + container.PerformLayout(); actualSize = container.ActualSize; } @@ -460,7 +458,7 @@ private static Size RenderHtml(DrawingContext g, string html, Point location, Si container.ImageLoad += imageLoad; container.SetHtml(html, cssData); - container.PerformLayout(g); + container.PerformLayout(); container.PerformPaint(g, new Rect(0, 0, double.MaxValue, double.MaxValue)); actualSize = container.ActualSize; From 7790aec463d131db1c01c28d50c68c024ef34c25 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 21 Jun 2014 18:32:19 +0300 Subject: [PATCH 112/254] WPF - fix font family handling --- Source/Demo/WPF/DemoWindow.xaml.cs | 13 ++++++------ Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj | 3 +++ Source/Demo/WPF/fonts/CustomFont.ttf | Bin 0 -> 44628 bytes .../Adapters/FontFamilyAdapter.cs | 19 +++++++++++++++++- 4 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 Source/Demo/WPF/fonts/CustomFont.ttf diff --git a/Source/Demo/WPF/DemoWindow.xaml.cs b/Source/Demo/WPF/DemoWindow.xaml.cs index d95941cdf..deb6b181b 100644 --- a/Source/Demo/WPF/DemoWindow.xaml.cs +++ b/Source/Demo/WPF/DemoWindow.xaml.cs @@ -50,15 +50,14 @@ public DemoWindow() /// /// Load custom fonts to be used by renderer HTMLs /// - private void LoadCustomFonts() + private static void LoadCustomFonts() { // load custom font font into private fonts collection - var file = Path.GetTempFileName(); - File.WriteAllBytes(file, Common.Resources.CustomFont); - var customFont = new FontFamily(file); - - // add the fonts to renderer - HtmlRender.AddFontFamily(customFont); + foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new Uri("pack://application:,,,/"), "./fonts/")) + { + // add the fonts to renderer + HtmlRender.AddFontFamily(fontFamily); + } } /// diff --git a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj index 6f08ec316..1b9902709 100644 --- a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj +++ b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj @@ -96,6 +96,9 @@ + + + diff --git a/Source/Demo/WPF/fonts/CustomFont.ttf b/Source/Demo/WPF/fonts/CustomFont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..143f2ad5f98124fab0b8716f14e2513287bef027 GIT binary patch literal 44628 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 C&wDZe literal 0 HcmV?d00001 diff --git a/Source/HtmlRenderer.WPF/Adapters/FontFamilyAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/FontFamilyAdapter.cs index 1001d066e..7c18d8e17 100644 --- a/Source/HtmlRenderer.WPF/Adapters/FontFamilyAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/FontFamilyAdapter.cs @@ -10,6 +10,7 @@ // - Sun Tsu, // "The Art of War" +using System.Windows.Markup; using System.Windows.Media; using HtmlRenderer.Adapters; @@ -20,6 +21,11 @@ namespace HtmlRenderer.WPF.Adapters /// internal sealed class FontFamilyAdapter : RFontFamily { + /// + /// Default language to get font family name by + /// + private static readonly XmlLanguage _xmlLanguage = XmlLanguage.GetLanguage("en-us"); + /// /// the underline win-forms font. /// @@ -43,7 +49,18 @@ public FontFamily FontFamily public override string Name { - get { return _fontFamily.Source; } + get + { + string name = _fontFamily.FamilyNames[_xmlLanguage]; + if (string.IsNullOrEmpty(name)) + { + foreach (var familyName in _fontFamily.FamilyNames) + { + return familyName.Value; + } + } + return name; + } } } } \ No newline at end of file From a1ea17a4f9834e645d309f7175cefc71b5ac0485 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 21 Jun 2014 18:50:19 +0300 Subject: [PATCH 113/254] * fix partial selected text rendering --- Source/HtmlRenderer/Core/Dom/CssBox.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/HtmlRenderer/Core/Dom/CssBox.cs b/Source/HtmlRenderer/Core/Dom/CssBox.cs index f8f3b52e2..41412711e 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBox.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBox.cs @@ -1268,12 +1268,12 @@ private void PaintWords(RGraphics g, RPoint offset) if (HtmlContainer.SelectionForeColor != RColor.Empty && (word.SelectedStartOffset > 0 || word.SelectedEndIndexOffset > -1)) { - // var orgClip = g.GetClip(); - // g.SetClipExclude(rect); + g.PushClipExclude(rect); g.DrawString(word.Text, ActualFont, ActualColor, wordPoint, new RSize(word.Width, word.Height), isRtl); - // g.SetClipReplace(rect); + g.PopClip(); + g.PushClip(rect); g.DrawString(word.Text, ActualFont, GetSelectionForeBrush(), wordPoint, new RSize(word.Width, word.Height), isRtl); - // g.SetClipReplace(orgClip); + g.PopClip(); } else { From 92c340c70caf1670be7219bea27b07a19238a7d8 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 21 Jun 2014 19:29:27 +0300 Subject: [PATCH 114/254] WPF - image generation in HtmlRender --- Source/HtmlRenderer.WPF/HtmlRender.cs | 179 ++++++++------------- Source/HtmlRenderer.WPF/Utilities/Utils.cs | 8 + 2 files changed, 72 insertions(+), 115 deletions(-) diff --git a/Source/HtmlRenderer.WPF/HtmlRender.cs b/Source/HtmlRenderer.WPF/HtmlRender.cs index c2f817250..a5072b566 100644 --- a/Source/HtmlRenderer.WPF/HtmlRender.cs +++ b/Source/HtmlRenderer.WPF/HtmlRender.cs @@ -13,10 +13,12 @@ using System; using System.Windows; using System.Windows.Media; +using System.Windows.Media.Imaging; using HtmlRenderer.Core; using HtmlRenderer.Core.Entities; using HtmlRenderer.Core.Utils; using HtmlRenderer.WPF.Adapters; +using HtmlRenderer.WPF.Utilities; namespace HtmlRenderer.WPF { @@ -126,18 +128,36 @@ public static CssData ParseStyleSheet(string stylesheet, bool combineWithDefault /// If no max width restriction is given the layout will use the maximum possible width required by the content, /// it can be the longest text line or full image width.
    ///
    - /// Device to use for measure /// HTML source to render /// optional: bound the width of the html to render in (default - 0, unlimited) /// optional: the style to use for html rendering (default - use W3 default style) /// optional: can be used to overwrite stylesheet resolution logic /// optional: can be used to overwrite image resolution logic /// the size required for the html - public static Size Measure(DrawingContext g, string html, double maxWidth = 0, CssData cssData = null, + public static Size Measure(string html, double maxWidth = 0, CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { - ArgChecker.AssertArgNotNull(g, "g"); - return MeasureInt(html, maxWidth, cssData, stylesheetLoad, imageLoad); + Size actualSize = Size.Empty; + if (!string.IsNullOrEmpty(html)) + { + using (var container = new HtmlContainer()) + { + container.MaxSize = new Size(maxWidth, 0); + container.AvoidAsyncImagesLoading = true; + container.AvoidImagesLateLoading = true; + + if (stylesheetLoad != null) + container.StylesheetLoad += stylesheetLoad; + if (imageLoad != null) + container.ImageLoad += imageLoad; + + container.SetHtml(html, cssData); + container.PerformLayout(); + + actualSize = container.ActualSize; + } + } + return actualSize; } /// @@ -185,8 +205,6 @@ public static Size Render(DrawingContext g, string html, Point location, Size ma return RenderClip(g, html, location, maxSize, cssData, stylesheetLoad, imageLoad); } - /* - /// /// Renders the specified HTML into a new image of the requested size.
    /// The HTML will be layout by the given size but will be clipped if cannot fit.
    @@ -197,38 +215,25 @@ public static Size Render(DrawingContext g, string html, Point location, Size ma /// optional: can be used to overwrite stylesheet resolution logic /// optional: can be used to overwrite image resolution logic /// the generated image of the html - public static BitmapImage RenderToImage(string html, Size size, CssData cssData = null, + public static BitmapFrame RenderToImage(string html, Size size, CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { - // create the final image to render into - var image = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppArgb); + var renderTarget = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96, 96, PixelFormats.Pbgra32); if (!string.IsNullOrEmpty(html)) { - // create memory buffer from desktop handle that supports alpha channel - IntPtr dib; - var memoryHdc = Win32Utils.CreateMemoryHdc(IntPtr.Zero, image.Width, image.Height, out dib); - try - { - // create memory buffer graphics to use for HTML rendering - using (var memoryGraphics = Graphics.FromHdc(memoryHdc)) - { - memoryGraphics.Clear(backgroundColor != Color.Empty ? backgroundColor : Color.White); - - // render HTML into the memory buffer - RenderHtml(memoryGraphics, html, PointF.Empty, size, cssData, true, stylesheetLoad, imageLoad); - } - - // copy from memory buffer to image - CopyBufferToImage(memoryHdc, image); - } - finally + // render HTML into the visual + DrawingVisual drawingVisual = new DrawingVisual(); + using (DrawingContext g = drawingVisual.RenderOpen()) { - Win32Utils.ReleaseMemoryHdc(memoryHdc, dib); + RenderHtml(g, html, new Point(), size, cssData, stylesheetLoad, imageLoad); } + + // render visual into target bitmap + renderTarget.Render(drawingVisual); } - return image; + return BitmapFrame.Create(renderTarget); } ///
    @@ -250,8 +255,7 @@ public static BitmapImage RenderToImage(string html, Size size, CssData cssData /// optional: can be used to overwrite stylesheet resolution logic /// optional: can be used to overwrite image resolution logic /// the generated image of the html - /// if is . - public static BitmapImage RenderToImage(string html, int maxWidth = 0, int maxHeight = 0, Color backgroundColor = new Color(), CssData cssData = null, + public static BitmapFrame RenderToImage(string html, int maxWidth = 0, int maxHeight = 0, Color backgroundColor = new Color(), CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { return RenderToImage(html, Size.Empty, new Size(maxWidth, maxHeight), backgroundColor, cssData, stylesheetLoad, imageLoad); @@ -277,77 +281,14 @@ public static BitmapImage RenderToImage(string html, Size size, CssData cssData /// optional: can be used to overwrite stylesheet resolution logic /// optional: can be used to overwrite image resolution logic /// the generated image of the html - /// if is . - public static BitmapImage RenderToImage(string html, Size minSize, Size maxSize, Color backgroundColor = new Color(), CssData cssData = null, + public static BitmapFrame RenderToImage(string html, Size minSize, Size maxSize, Color backgroundColor = new Color(), CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { - if (backgroundColor == Color.Transparent) - throw new ArgumentOutOfRangeException("backgroundColor", "Transparent background in not supported"); - - if (string.IsNullOrEmpty(html)) - return new Bitmap(0, 0, PixelFormat.Format32bppArgb); - - using (var container = new HtmlContainer()) - { - container.AvoidAsyncImagesLoading = true; - container.AvoidImagesLateLoading = true; - - if (stylesheetLoad != null) - container.StylesheetLoad += stylesheetLoad; - if (imageLoad != null) - container.ImageLoad += imageLoad; - container.SetHtml(html, cssData); - - var finalSize = MeasureHtmlByRestrictions(container, minSize, maxSize); - container.MaxSize = finalSize; - - // create the final image to render into by measured size - var image = new Bitmap(finalSize.Width, finalSize.Height, PixelFormat.Format32bppArgb); - - // create memory buffer from desktop handle that supports alpha channel - IntPtr dib; - var memoryHdc = Win32Utils.CreateMemoryHdc(IntPtr.Zero, image.Width, image.Height, out dib); - try - { - // render HTML into the memory buffer - using (var memoryGraphics = Graphics.FromHdc(memoryHdc)) - { - memoryGraphics.Clear(backgroundColor != Color.Empty ? backgroundColor : Color.White); - container.PerformPaint(memoryGraphics); - } - - // copy from memory buffer to image - CopyBufferToImage(memoryHdc, image); - } - finally - { - Win32Utils.ReleaseMemoryHdc(memoryHdc, dib); - } - - return image; - } - } - */ - - #region Private methods - - /// - /// Measure the size (width and height) required to draw the given html under given width and height restrictions.
    - ///
    - /// HTML source to render - /// optional: bound the width of the html to render in (default - 0, unlimited) - /// optional: the style to use for html rendering (default - use W3 default style) - /// optional: can be used to overwrite stylesheet resolution logic - /// optional: can be used to overwrite image resolution logic - /// the size required for the html - private static Size MeasureInt(string html, double maxWidth, CssData cssData, EventHandler stylesheetLoad, EventHandler imageLoad) - { - Size actualSize = Size.Empty; + RenderTargetBitmap renderTarget; if (!string.IsNullOrEmpty(html)) { using (var container = new HtmlContainer()) { - container.MaxSize = new Size(maxWidth, 0); container.AvoidAsyncImagesLoading = true; container.AvoidImagesLateLoading = true; @@ -355,17 +296,34 @@ private static Size MeasureInt(string html, double maxWidth, CssData cssData, Ev container.StylesheetLoad += stylesheetLoad; if (imageLoad != null) container.ImageLoad += imageLoad; - container.SetHtml(html, cssData); - container.PerformLayout(); - actualSize = container.ActualSize; + var finalSize = MeasureHtmlByRestrictions(container, minSize, maxSize); + container.MaxSize = finalSize; + + renderTarget = new RenderTargetBitmap((int)finalSize.Width, (int)finalSize.Height, 96, 96, PixelFormats.Pbgra32); + + // render HTML into the visual + DrawingVisual drawingVisual = new DrawingVisual(); + using (DrawingContext g = drawingVisual.RenderOpen()) + { + container.PerformPaint(g, new Rect(new Size(maxSize.Width > 0 ? maxSize.Width : double.MaxValue, maxSize.Height > 0 ? maxSize.Height : double.MaxValue))); + } + + // render visual into target bitmap + renderTarget.Render(drawingVisual); } } - return actualSize; + else + { + renderTarget = new RenderTargetBitmap(0, 0, 96, 96, PixelFormats.Pbgra32); + } + + return BitmapFrame.Create(renderTarget); } - /* + + #region Private methods /// /// Measure the size of the html by performing layout under the given restrictions. @@ -377,16 +335,13 @@ private static Size MeasureInt(string html, double maxWidth, CssData cssData, Ev private static Size MeasureHtmlByRestrictions(HtmlContainer htmlContainer, Size minSize, Size maxSize) { // use desktop created graphics to measure the HTML - using (var g = Graphics.FromHwnd(IntPtr.Zero)) - using (var mg = new GraphicsAdapter(g)) + using (var mg = new GraphicsAdapter()) { var sizeInt = HtmlRendererUtils.MeasureHtmlByRestrictions(mg, htmlContainer.HtmlContainerInt, Utils.Convert(minSize), Utils.Convert(maxSize)); return Utils.ConvertRound(sizeInt); } } - */ - /// /// Renders the specified HTML source on the specified location and max size restriction.
    /// If .Width is zero the html will use all the required width, otherwise it will perform line @@ -406,19 +361,13 @@ private static Size MeasureHtmlByRestrictions(HtmlContainer htmlContainer, Size /// the actual size of the rendered html private static Size RenderClip(DrawingContext g, string html, Point location, Size maxSize, CssData cssData, EventHandler stylesheetLoad, EventHandler imageLoad) { - // Region prevClip = null; - // if (maxSize.Height > 0) - // { - // prevClip = g.Clip; - // g.SetClip(new RectangleF(location, maxSize)); - // } + if (maxSize.Height > 0) + g.PushClip(new RectangleGeometry(new Rect(location, maxSize))); var actualSize = RenderHtml(g, html, location, maxSize, cssData, stylesheetLoad, imageLoad); - // if (prevClip != null) - // { - // g.SetClip(prevClip, CombineMode.Replace); - // } + if (maxSize.Height > 0) + g.Pop(); return actualSize; } diff --git a/Source/HtmlRenderer.WPF/Utilities/Utils.cs b/Source/HtmlRenderer.WPF/Utilities/Utils.cs index 2239818c3..8b4e5f868 100644 --- a/Source/HtmlRenderer.WPF/Utilities/Utils.cs +++ b/Source/HtmlRenderer.WPF/Utilities/Utils.cs @@ -74,6 +74,14 @@ public static Size Convert(RSize s) return new Size(s.Width, s.Height); } + /// + /// Convert from core point to WPF point. + /// + public static Size ConvertRound(RSize s) + { + return new Size(Math.Round(s.Width), Math.Round(s.Height)); + } + /// /// Convert from WPF rectangle to core rectangle. /// From 3ab6a0506a41e4a75ad7a30733971aafa58a0402 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Fri, 4 Jul 2014 14:59:35 +0300 Subject: [PATCH 115/254] * add image generation to WPF * add save to file generated image in WinForms --- Source/Demo/WPF/App.xaml | 24 ++++++- Source/Demo/WPF/DemoWindow.xaml | 2 +- Source/Demo/WPF/DemoWindow.xaml.cs | 12 ++++ Source/Demo/WPF/GenerateImageWindow.xaml | 15 ++++ Source/Demo/WPF/GenerateImageWindow.xaml.cs | 70 ++++++++++++++++++ Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj | 7 ++ Source/Demo/WPF/HtmlRenderingHelper.cs | 34 ++++++--- .../WinForms/GenerateImageForm.Designer.cs | 72 +++++++++++++------ Source/Demo/WinForms/GenerateImageForm.cs | 16 +++++ Source/Demo/WinForms/GenerateImageForm.resx | 19 ++++- Source/HtmlRenderer.WPF/Utilities/Utils.cs | 6 ++ 11 files changed, 239 insertions(+), 38 deletions(-) create mode 100644 Source/Demo/WPF/GenerateImageWindow.xaml create mode 100644 Source/Demo/WPF/GenerateImageWindow.xaml.cs diff --git a/Source/Demo/WPF/App.xaml b/Source/Demo/WPF/App.xaml index 6a7affd24..fe2a1506f 100644 --- a/Source/Demo/WPF/App.xaml +++ b/Source/Demo/WPF/App.xaml @@ -3,6 +3,28 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="DemoWindow.xaml"> - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Demo/WPF/DemoWindow.xaml b/Source/Demo/WPF/DemoWindow.xaml index ba2060edc..9bc6dff64 100644 --- a/Source/Demo/WPF/DemoWindow.xaml +++ b/Source/Demo/WPF/DemoWindow.xaml @@ -38,7 +38,7 @@ -
    protected override double HtmlWidth(Size size) { - return size.Width - (_verticalScrollBar.Visibility == Visibility.Visible ? _verticalScrollBar.Width : 0); + var width = size.Width - (_verticalScrollBar.Visibility == Visibility.Visible ? _verticalScrollBar.Width : 0); + return width > 1 ? width : 1; } /// @@ -306,7 +311,8 @@ protected override double HtmlWidth(Size size) /// protected override double HtmlHeight(Size size) { - return size.Height - (_horizontalScrollBar.Visibility == Visibility.Visible ? _horizontalScrollBar.Height : 0); + var height = size.Height - (_horizontalScrollBar.Visibility == Visibility.Visible ? _horizontalScrollBar.Height : 0); + return height > 1 ? height : 1; } /// diff --git a/Source/HtmlRenderer.WPF/Utilities/Utils.cs b/Source/HtmlRenderer.WPF/Utilities/Utils.cs index 9e4c34932..00f0675e8 100644 --- a/Source/HtmlRenderer.WPF/Utilities/Utils.cs +++ b/Source/HtmlRenderer.WPF/Utilities/Utils.cs @@ -10,7 +10,6 @@ // - Sun Tsu, // "The Art of War" -using System; using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; @@ -55,7 +54,7 @@ public static Point Convert(RPoint p) /// public static Point ConvertRound(RPoint p) { - return new Point(Math.Round(p.X), Math.Round(p.Y)); + return new Point((int)p.X, (int)p.Y); } /// @@ -79,7 +78,7 @@ public static Size Convert(RSize s) /// public static Size ConvertRound(RSize s) { - return new Size(Math.Round(s.Width), Math.Round(s.Height)); + return new Size((int)s.Width, (int)s.Height); } /// @@ -98,6 +97,14 @@ public static Rect Convert(RRect r) return new Rect(r.X, r.Y, r.Width, r.Height); } + /// + /// Convert from core rectangle to WPF rectangle. + /// + public static Rect ConvertRound(RRect r) + { + return new Rect((int)r.X, (int)r.Y, (int)r.Width, (int)r.Height); + } + /// /// Convert from WPF color to core color. /// @@ -138,7 +145,6 @@ public static BitmapEncoder GetBitmapEncoder(string ext) return new WmpBitmapEncoder(); default: return new PngBitmapEncoder(); - } } } From 1f36bc1816db507d4749bbc7e23ff7a9f6979b8d Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Fri, 4 Jul 2014 18:54:25 +0300 Subject: [PATCH 118/254] * fix height calculation WPF --- Source/HtmlRenderer.WPF/Adapters/GraphicsAdapter.cs | 2 -- Source/HtmlRenderer.WPF/HtmlPanel.cs | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Source/HtmlRenderer.WPF/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/GraphicsAdapter.cs index 0062c11c3..665872961 100644 --- a/Source/HtmlRenderer.WPF/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/GraphicsAdapter.cs @@ -184,8 +184,6 @@ public override void DrawString(string str, RFont font, RColor color, RPoint poi { var colorConv = ((BrushAdapter)_adapter.GetSolidBrush(color)).Brush; - //return; - bool glyphRendered = false; GlyphTypeface glyphTypeface = ((FontAdapter)font).GlyphTypeface; if (glyphTypeface != null) diff --git a/Source/HtmlRenderer.WPF/HtmlPanel.cs b/Source/HtmlRenderer.WPF/HtmlPanel.cs index 1dfec6041..0ca9915f7 100644 --- a/Source/HtmlRenderer.WPF/HtmlPanel.cs +++ b/Source/HtmlRenderer.WPF/HtmlPanel.cs @@ -124,8 +124,8 @@ protected override Size MeasureOverride(Size constraint) // to handle if scrollbar is appearing or disappearing bool relayout = false; - var htmlHeight = HtmlWidth(constraint); var htmlWidth = HtmlWidth(constraint); + var htmlHeight = HtmlHeight(constraint); if ((_verticalScrollBar.Visibility == Visibility.Hidden && size.Height > htmlHeight) || (_verticalScrollBar.Visibility == Visibility.Visible && size.Height <= htmlHeight)) From ce007f258122b80bba06c8d68f5b14085f95b458 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Fri, 4 Jul 2014 20:10:45 +0300 Subject: [PATCH 119/254] build script improvments --- Build/build.bat | 30 ++++++++++++-- .../HtmlRenderer.Demo.WinForms.csproj | 2 +- Source/Demo/WinForms/PerfForm.cs | 39 ++++++++++--------- .../HtmlRenderer.WPF/HtmlRenderer.WPF.csproj | 1 + 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/Build/build.bat b/Build/build.bat index 2f26a2550..506c273ca 100644 --- a/Build/build.bat +++ b/Build/build.bat @@ -3,6 +3,7 @@ CD %~dp0 echo Run MSBuild... +rmdir Release /s /q set version=1.5.0.0 set verb=/verbosity:minimal @@ -10,9 +11,11 @@ set verb=/verbosity:minimal set msbuild=C:\Windows\Microsoft.Net\Framework\v4.0.30319\MSBuild.exe set git="C:\Program Files (x86)\Git\bin\git.exe" +set c_proj=..\Source\HtmlRenderer\HtmlRenderer.csproj set wf_proj=..\Source\HtmlRenderer.WinForms\HtmlRenderer.WinForms.csproj set wpf_proj=..\Source\HtmlRenderer.WPF\HtmlRenderer.WPF.csproj +set c_out=..\..\Build\Release\Core set wf_out=..\..\Build\Release\WinForms set wpf_out=..\..\Build\Release\WPF @@ -22,6 +25,13 @@ set t_35=Configuration=Release;TargetFrameworkVersion=v3.5;TargetFrameworkProfil set t_40=Configuration=Release;TargetFrameworkVersion=v4.0;TargetFrameworkProfile=client set t_45=Configuration=Release;TargetFrameworkVersion=v4.5 +echo Run Core builds... +%msbuild% %c_proj% /t:rebuild /p:%t_20%;OutputPath=%c_out%\NET20 %verb% +%msbuild% %c_proj% /t:rebuild /p:%t_30%;OutputPath=%c_out%\NET30 %verb% +%msbuild% %c_proj% /t:rebuild /p:%t_35%;OutputPath=%c_out%\NET35 %verb% +%msbuild% %c_proj% /t:rebuild /p:%t_40%;OutputPath=%c_out%\NET40 %verb% +%msbuild% %c_proj% /t:rebuild /p:%t_45%;OutputPath=%c_out%\NET45 %verb% + echo Run WinForms builds... %msbuild% %wf_proj% /t:rebuild /p:%t_20%;OutputPath=%wf_out%\NET20 %verb% %msbuild% %wf_proj% /t:rebuild /p:%t_35%;OutputPath=%wf_out%\NET35 %verb% @@ -36,13 +46,17 @@ echo Run WPF builds... echo Run Demo builds... %msbuild% ..\Source\Demo\WinForms\HtmlRenderer.Demo.WinForms.csproj /t:rebuild /p:%t_20%;OutputPath=..\..\..\Build\Release\Demo\WinForms %verb% -%msbuild% ..\Source\Demo\WPF\HtmlRenderer.Demo.WPF.csproj /t:rebuild /p:%t_30%;OutputPath=..\..\..\Build\Release\Demo\WPF %verb% +%msbuild% ..\Source\Demo\WPF\HtmlRenderer.Demo.WPF.csproj /t:rebuild /p:%t_40%;OutputPath=..\..\..\Build\Release\Demo\WPF %verb% echo Handle Demo output... -copy Release\Demo\WinForms\HtmlRendererWinFormsDemo.exe Release\HtmlRendererWinFormsDemo.exe -copy Release\Demo\WPF\HtmlRendererWpfDemo.exe Release\HtmlRendererWpfDemo.exe +copy Release\Demo\WinForms\HtmlRendererWinFormsDemo.exe "Release\HtmlRenderer WinForms Demo.exe" +copy Release\Demo\WPF\HtmlRendererWpfDemo.exe "Release\HtmlRenderer WPF Demo.exe" rmdir Release\Demo /s /q +echo -- ? -- ? -- ? -- +echo Builds complete, continue? +pause + echo Git clone... %git% clone -q --branch=v1.5 https://github.com/ArthurHub/HTML-Renderer.git Release\git xcopy Release\git\Source Release\Source /I /E @@ -56,4 +70,14 @@ cd.. echo Create NuGets... nuget.exe pack HtmlRenderer.WinForms.nuspec -Version %version% -OutputDirectory Release +echo Remove files... +rmdir Release\Source /s /q +rmdir Release\Core /s /q +rmdir Release\WinForms /s /q +rmdir Release\WPF /s /q +del "Release\HtmlRenderer WinForms Demo.exe" +del "Release\HtmlRenderer WPF Demo.exe" + +echo +echo FINISHED pause \ No newline at end of file diff --git a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj index f0176d120..5b842325f 100644 --- a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj @@ -10,7 +10,7 @@ Properties HtmlRenderer.Demo.WinForms HtmlRendererWinFormsDemo - v4.0 + v2.0 diff --git a/Source/Demo/WinForms/PerfForm.cs b/Source/Demo/WinForms/PerfForm.cs index 0e8197000..f3615666e 100644 --- a/Source/Demo/WinForms/PerfForm.cs +++ b/Source/Demo/WinForms/PerfForm.cs @@ -37,6 +37,8 @@ public partial class PerfForm : Form /// private static readonly List _perfTestSamples = new List(); + private const int Iterations = 3; + #endregion @@ -60,14 +62,10 @@ public PerfForm() /// Used to execute performance test run for memory profiler so the form is not loaded, /// only html container is working. ///
    - public static void Run() + public static void Run(bool layout, bool paint) { try { - const int iterations = 3; - const bool Layout = false; - const bool Paint = false; - LoadRunSamples(); var htmlContainer = new HtmlContainer(); @@ -79,16 +77,16 @@ public static void Run() using (var img = new Bitmap(1, 1)) using (var g = Graphics.FromImage(img)) { - for (int i = 0; i < iterations; i++) + for (int i = 0; i < Iterations; i++) { foreach (var html in _perfTestSamples) { htmlContainer.SetHtml(html); - if (Layout) + if (layout) htmlContainer.PerformLayout(g); - if (Paint) + if (paint) htmlContainer.PerformPaint(g); } } @@ -208,10 +206,15 @@ private void OnRunTestButtonClick(object sender, EventArgs e) var html = _samples[(string)_samplesTreeView.SelectedNode.Tag]; GC.Collect(); -#if NET_40 - AppDomain.MonitoringIsEnabled = true; - var startMemory = AppDomain.CurrentDomain.MonitoringTotalAllocatedMemorySize; -#endif + + double totalMem = 0; + long startMemory = 0; + if (Environment.Version.Major >= 4) + { + typeof(AppDomain).GetProperty("MonitoringIsEnabled").SetValue(null, true, null); + startMemory = (long)AppDomain.CurrentDomain.GetType().GetProperty("MonitoringTotalAllocatedMemorySize").GetValue(AppDomain.CurrentDomain, null); + } + var sw = Stopwatch.StartNew(); for (int i = 0; i < _iterations.Value; i++) @@ -222,12 +225,12 @@ private void OnRunTestButtonClick(object sender, EventArgs e) sw.Stop(); - long endMemory = 0; - float totalMem = 0; -#if NET_40 - endMemory = AppDomain.CurrentDomain.MonitoringTotalAllocatedMemorySize; - totalMem = (endMemory - startMemory) / 1024f; -#endif + if (Environment.Version.Major >= 4) + { + var endMemory = (long)AppDomain.CurrentDomain.GetType().GetProperty("MonitoringTotalAllocatedMemorySize").GetValue(AppDomain.CurrentDomain, null); + totalMem = (endMemory - startMemory) / 1024f; + } + float htmlSize = html.Length * 2 / 1024f; var msg = string.Format("1 HTML ({0:N0} KB)\r\n{1} Iterations", htmlSize, _iterations.Value); diff --git a/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj b/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj index 734c1dd72..c30aed757 100644 --- a/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj +++ b/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj @@ -40,6 +40,7 @@ + From dd404a38fefcc537f1c5ed3183b78f25014a7b97 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Fri, 4 Jul 2014 20:42:53 +0300 Subject: [PATCH 120/254] get library version in build script --- Build/build.bat | 8 +++++++- Build/getVer.exe | Bin 0 -> 5120 bytes 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Build/getVer.exe diff --git a/Build/build.bat b/Build/build.bat index 506c273ca..6d21e12e3 100644 --- a/Build/build.bat +++ b/Build/build.bat @@ -3,9 +3,15 @@ CD %~dp0 echo Run MSBuild... + +echo Delete previous folder.. rmdir Release /s /q -set version=1.5.0.0 +echo Get version... +for /f %%i in ('getVer.exe ..\Source\SharedAssemblyInfo.cs') do set version=%%i +echo Version: %version% + +echo Set params... set verb=/verbosity:minimal set msbuild=C:\Windows\Microsoft.Net\Framework\v4.0.30319\MSBuild.exe diff --git a/Build/getVer.exe b/Build/getVer.exe new file mode 100644 index 0000000000000000000000000000000000000000..4e628a3b45d35b88a9618caf1401c18844205aba GIT binary patch literal 5120 zcmeHKZ)_Y#6@R<_TPHS&lO~QD!sMI^JFV9~$9C-0cFwV5_lO-kKHG)pkiEAzK5w$O zd)e7_ZICMS0i>b|1*sqv^+Q^T4;2W3RFwd#Xe;rdm4bv2A3*(336KB@RYD+Ds3QDk zcF#WB2L!$Vg0c5EGw;25^XARWn|CwUZ&M8s)#AHVKz>yO9We z&_SdoP7&R%i;0!h3eiFI-}pGu$x8Y^YO`(Am1HCOPgaaE0=^NTzwi(MJhj%?ZuC@P zL@S0bd<#8gTMCVOeA1wbl7d4FpF17|6>9}dsjC%VMM)7|s_3d_kMt{wv`wcvy2D^j z1CfS4J~`VzRgU!3&=5vo>|y=b*E-<+rlxuy-BQP4v=20Ru&U|tM>>w6YVeK%k9!XT zy<-xN1J0h(JKAIoJ(n_{xTGm-qP4B}8a+mT&-vc-(yTgifGMoC{TZTfqCSYj+@1-1 z+bswwaTj}|b)c9BNshLYsP6C%G;3=SR;GtdhPs z5%DBn^G)G_l36Wkcn2jLWk)(9fcnxo>thYFsX1z;h4g-!fU`2 z^eNRg71|1K0Z-BAfM@7g;33S)^-g*LD=_F4dRgzM@6en25WPe{*GK71`jtLTZ_}Uj zG<}cm>qoISa+E;_aB~ehf-_*yBMRFUKBnmB$OruiMY*CdLtg~NqE~@8q1PZm?*Knb zKcyL}-70&B;v&yqw676Cqfyn^O`D3PQ4P;{`Ox8`H14^=bNE=PI#vX*PF*TLI0Owo8T;cs`jv&UC~z=J~1vHZ;?i5WJXkHW%yw zQwBKuxiH|{->aognlpj4!V;bOXD{jkFtZ-z#OfziwMxz<wL6IIS#Cx?btzu%VX{7S&}BxJU8=Wj0p5taoZkZx1 znNG+_DVerit}ev#7;cw9gey`Gw{Me{(Dp&G$s?DtXq^Ri#I1yC<>@ip$1EcD{<;&< zsyr%swBDFDk6e7dcKrE!cYbm3C)7`k-~CK>=|taq&myL2A8n~&q}4J_YmuPW0S=GI zW@9aBEiLt=w_aOI?HB(t52;qa#%=GhQAQNRMmOx_#o= zTdy$I+mq}g>eT4Wz`)@7-hrN6*U&(IsH<)rA;}0KBzTWwp=8yd7?1X29MeYV7i%S)n4$A~# z-uC2L&Si1aWgHUODsISnxf@v=X>JN$jc=6lIdvHR^MJ*9kF;!5wwY}0FXjAbhqFBH z;g)d~msQN>+{imJ4?za~D6y1k{da$UIyC3?Th zgQNPQ;zqv@%AA-)G6&S4)kIvHL|k$Zq0)#=tB6ptoFN1TS^(DsRe*0&5XUbiK;N!i z!KKq+QvfL&QiUp-hLubYmH+w>5pmmT4w;m;EkA+T1+o*Vr?hLHaTPHIP+B+!ZV4?L zvOD%9p|1x)V@Kcacq{EqBDVHye{%jd$jcQ6DmJ^&=fI~XVzvz84>qp>*$pNCBz|yc zG>vvaX_Dhhi2QOz1zN)_k{1;TL_CeQ6uu=MXx1PP;-s|f@HD>Rd$o9O7`}gSmAN+9m;zrS7>ro;zlE7<` zVBEF5JQ9$R#Nxta*I$$R4 zhO(mvA>9gPl041Vxx*ZZBMDQa-F5FK_Y*9%$5i4pl2|nz!Q(|KCEZo5DVyHC%l6^! fZ6`orxVyYV=-}Z0I|_?_SI@~G?f) Date: Sat, 5 Jul 2014 12:11:16 +0300 Subject: [PATCH 121/254] WPF - add HtmlLabel --- Source/HtmlRenderer.WPF/HtmlLabel.cs | 117 ++++++++++++++++++ .../HtmlRenderer.WPF/HtmlRenderer.WPF.csproj | 1 + 2 files changed, 118 insertions(+) create mode 100644 Source/HtmlRenderer.WPF/HtmlLabel.cs diff --git a/Source/HtmlRenderer.WPF/HtmlLabel.cs b/Source/HtmlRenderer.WPF/HtmlLabel.cs new file mode 100644 index 000000000..c60af4b6f --- /dev/null +++ b/Source/HtmlRenderer.WPF/HtmlLabel.cs @@ -0,0 +1,117 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System.ComponentModel; +using System.Windows; +using HtmlRenderer.Adapters.Entities; +using HtmlRenderer.Core; +using HtmlRenderer.WPF.Adapters; +using HtmlRenderer.WPF.Utilities; + +namespace HtmlRenderer.WPF +{ + /// + /// Provides HTML rendering using the text property.
    + /// WPF control that will render html content in it's client rectangle.
    + /// Using and client can control how the html content effects the + /// size of the label. Either case scrollbars are never shown and html content outside of client bounds will be clipped. + /// and with AutoSize can limit the max/min size of the control
    + /// The control will handle mouse and keyboard events on it to support html text selection, copy-paste and mouse clicks.
    + ///
    + /// + /// See for more info. + /// + public class HtmlLabel : HtmlControlBase + { + #region Fields and Consts + + /// + /// Automatically sets the size of the label by content size. + /// + protected bool _autoSize = true; + + /// + /// is to handle auto size of the control height only + /// + protected bool _autoSizeHeight; + + #endregion + + + /// + /// Automatically sets the size of the label by content size + /// + [Browsable(true)] + [DefaultValue(true)] + [EditorBrowsable(EditorBrowsableState.Always)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + [Description("Automatically sets the size of the label by content size.")] + public bool AutoSize + { + get { return _autoSize; } + set + { + _autoSize = value; + if (value) + { + _autoSizeHeight = false; + InvalidateMeasure(); + InvalidateVisual(); + } + } + } + + /// + /// Automatically sets the height of the label by content height (width is not effected). + /// + [Browsable(true)] + [DefaultValue(false)] + [Category("Layout")] + [Description("Automatically sets the height of the label by content height (width is not effected)")] + public virtual bool AutoSizeHeightOnly + { + get { return _autoSizeHeight; } + set + { + _autoSizeHeight = value; + if (value) + { + AutoSize = false; + InvalidateMeasure(); + InvalidateVisual(); + } + } + } + + + #region Private methods + + /// + /// Perform the layout of the html in the control. + /// + protected override Size MeasureOverride(Size constraint) + { + if (_htmlContainer != null) + { + using (var ig = new GraphicsAdapter()) + { + var newSize = HtmlRendererUtils.Layout(ig, _htmlContainer.HtmlContainerInt, Utils.Convert(constraint), new RSize(MinWidth, MinHeight), new RSize(MaxWidth, MaxHeight), AutoSize, AutoSizeHeightOnly); + constraint = Utils.ConvertRound(newSize); + } + } + + return constraint; + } + + #endregion + } +} \ No newline at end of file diff --git a/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj b/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj index c30aed757..e6e9a8fdd 100644 --- a/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj +++ b/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj @@ -67,6 +67,7 @@ + From 7ddee6fdc8fc14388f8362a4a95bc4ed5488ffe8 Mon Sep 17 00:00:00 2001 From: ArthurHub Date: Sat, 5 Jul 2014 13:11:09 +0300 Subject: [PATCH 122/254] WPF - add sample window --- Source/Demo/Common/DemoUtils.cs | 25 +++++++++++++ Source/Demo/WPF/DemoWindow.xaml | 4 +-- Source/Demo/WPF/DemoWindow.xaml.cs | 12 +++++++ Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj | 25 +++++++++++++ Source/Demo/WPF/MainControl.xaml.cs | 17 +++++---- Source/Demo/WPF/SampleWindow.xaml | 28 +++++++++++++++ Source/Demo/WPF/SampleWindow.xaml.cs | 38 ++++++++++++++++++++ Source/Demo/WPF/packages.config | 4 +++ Source/Demo/WinForms/SampleForm.Designer.cs | 22 ++++-------- Source/Demo/WinForms/SampleForm.cs | 4 +++ Source/Demo/WinForms/SampleForm.resx | 3 -- Source/HtmlRenderer.WPF/HtmlLabel.cs | 9 ++++- Source/HtmlRenderer.sln | 3 -- 13 files changed, 163 insertions(+), 31 deletions(-) create mode 100644 Source/Demo/WPF/SampleWindow.xaml create mode 100644 Source/Demo/WPF/SampleWindow.xaml.cs create mode 100644 Source/Demo/WPF/packages.config diff --git a/Source/Demo/Common/DemoUtils.cs b/Source/Demo/Common/DemoUtils.cs index 99fc3af10..203474a63 100644 --- a/Source/Demo/Common/DemoUtils.cs +++ b/Source/Demo/Common/DemoUtils.cs @@ -21,6 +21,31 @@ public class DemoUtils { private const int Iterations = 20; + /// + /// The HTML text used in sample form for HtmlLabel. + /// + public static String SampleHtmlLabelText + { + get + { + return "This is an HtmlLabel on transparent background with colors and links: " + + "
    HTML Renderer"; + } + } + + /// + /// The HTML text used in sample form for HtmlPanel. + /// + public static String SampleHtmlPanelText + { + get + { + return "This is an HtmlPanel with colors and links: HTML Renderer" + + "
    If there is more text than the size of the control scrollbars will appear.
    " + + "
    Click me to change my Text property."; + } + } + /// /// Handle stylesheet resolve. /// diff --git a/Source/Demo/WPF/DemoWindow.xaml b/Source/Demo/WPF/DemoWindow.xaml index 9bc6dff64..faac6528b 100644 --- a/Source/Demo/WPF/DemoWindow.xaml +++ b/Source/Demo/WPF/DemoWindow.xaml @@ -14,10 +14,10 @@ - diff --git a/Source/Demo/WPF/DemoWindow.xaml.cs b/Source/Demo/WPF/DemoWindow.xaml.cs index 89e4b2833..13ef6406d 100644 --- a/Source/Demo/WPF/DemoWindow.xaml.cs +++ b/Source/Demo/WPF/DemoWindow.xaml.cs @@ -60,6 +60,18 @@ private static void LoadCustomFonts() } } + /// + /// Open sample window. + /// + private void OnOpenSampleWindow_click(object sender, RoutedEventArgs e) + { + var w = new SampleWindow(); + w.Owner = this; + w.Width = Width * 0.8; + w.Height = Height * 0.8; + w.ShowDialog(); + } + /// /// Toggle if to show split view of HtmlPanel and WinForms WebBrowser control. /// diff --git a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj index d6cb76f5c..aa378de25 100644 --- a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj +++ b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj @@ -14,6 +14,8 @@ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 4 + ..\..\ + true x86 @@ -45,6 +47,12 @@ + + ..\..\packages\Extended.Wpf.Toolkit.2.2.1\lib\net40\Xceed.Wpf.DataGrid.dll + + + ..\..\packages\Extended.Wpf.Toolkit.2.2.1\lib\net40\Xceed.Wpf.Toolkit.dll + @@ -54,6 +62,9 @@ GenerateImageWindow.xaml + + SampleWindow.xaml + MSBuild:Compile @@ -75,6 +86,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + @@ -106,6 +121,9 @@ + + + @@ -114,6 +132,13 @@ + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + 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 literal 0 HcmV?d00001 diff --git a/Art/demo_textEdit.png b/Art/demo_textEdit.png new file mode 100644 index 0000000000000000000000000000000000000000..31f2c8aaa8132de2c9e48ea6dd012541656238e9 GIT binary patch literal 75334 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%0Ai~}JhwK{r z@R$dkp3pff_MC=#_=ZRVmD8hBo`i*r-5?44N6SI$4w@N|;7_|5*}|huL&%{*X{(PS zVx5lxkTeI-)wJp=ApKA!+1$9D$<-?~CC2UNPP?i8GHbQ^K%Cc2l$y6xnx3HM*u%1Q zoFG%}lcs&zxadPXzh}F~rRjO71Kt1tc5N>^;N~fW8CK)>+P=@gG|hYZsp#9 zW?D(cl{>?iste4E*<}eDT1SP{2=VnQu4^%xu={cDHXcN($Z0szd(!ilP@PiXmm8ZH zi|KX)d17=P?XB_WZe9Wtj`ebijH~VV%#@ybfK55cYcD?q^CQu2?DGg+Af~!FCwgTd z^#Y1>okU~bY%j4gz>36mtTZ%DRhk*%s7G6fxp!SlOcW!qFS&YDlfxX78ak~)Tr+80 zsAOsjjbet1h1WM{ko)<+WyXiB>pkk9Cqx|%q!A0gs$4Hk@VrC`=YejHSz{2+O%#me zI^hQf6I8$Ww9V{|rDs(spj$K<9zRsNm1QYL`@*r8{SmA)n%pXUoTF(TT7MDaCPXw* zY%nuphwp=-x+9yEpPz;MRPerd6)#5#4!oB%x3SrsI84A0X^l7y&}u2`PDhIZ0cKFK zsws}LY0X{0%w%xhO#|>5T#In>a(pQ-32*F#kk&)_oPW_Gj6Wlh4gD1dd_q`B6z7pq z-vd&JEw&F>qImX3AZAt+P2HQa&pN%UyolG@mN9>{$0ZA{cD$hppDOcPk#<)^l{hn> z^N}P
    private static readonly WpfAdapter _instance = new WpfAdapter(); + /// + /// List of valid predefined color names in lower-case + /// + private static readonly List ValidColorNamesLc; + #endregion + static WpfAdapter() + { + ValidColorNamesLc = new List(); + var colorList = new List(typeof(Colors).GetProperties()); + foreach (var colorProp in colorList) + { + ValidColorNamesLc.Add(colorProp.Name.ToLower()); + } + } /// /// Init installed font families and set default font families mapping. @@ -61,6 +77,10 @@ public static WpfAdapter Instance protected override RColor GetColorInt(string colorName) { + // check if color name is valid to avoid ColorConverter throwing an exception + if (!ValidColorNamesLc.Contains(colorName.ToLower())) + return RColor.Empty; + var convertFromString = ColorConverter.ConvertFromString(colorName) ?? Colors.Black; return Utils.Convert((Color)convertFromString); } From 91ebb92130f77fdd0405741b886028992c56f0a4 Mon Sep 17 00:00:00 2001 From: mikkelxn Date: Tue, 30 Dec 2014 09:33:03 +0100 Subject: [PATCH 200/254] Fixed typo --- Source/Demo/Common/Resources/Tooltip.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Demo/Common/Resources/Tooltip.html b/Source/Demo/Common/Resources/Tooltip.html index 25f3464c2..85892877a 100644 --- a/Source/Demo/Common/Resources/Tooltip.html +++ b/Source/Demo/Common/Resources/Tooltip.html @@ -1,4 +1,4 @@ -HtmlPnael control showing HTML Renderer capabilities +HtmlPanel control showing HTML Renderer capabilities @@ -62,8 +62,8 @@

    - opmqjeqf mj - pdkfd ddooekeh pc denopnjgcirn pe oqemmcg fla lnmaba 2.1 - + opmqjeqf mj + pdkfd ddooekeh pc denopnjgcirn pe oqemmcg fla lnmaba 2.1 - khon gac ioof phpdigja


    @@ -71,9 +71,9 @@

    iigm nnk frmjfl + href='https://www.google.com'>iigm nnk frmjfl ejk + data-containertype="-2" data-objectid="2471" data-objecttype="700" href='https://www.google.com'> lppf rnp rnpjihp

    &ppbg;

    @@ -140,7 +140,7 @@

    @@ -176,7 +176,7 @@

    - jcrrnagrqq + jcrrnagrqq

    @@ -200,12 +200,12 @@

    &ofik;

    nkm: + data-objectid="3512" data-objecttype="3" href='https://www.google.com'> ogqkq lblhhk, amcdon? pm rel bll irdffld dgfgl gdine lc &opoc;ljmmblicf&eqil; qgc ng pfooch ldda aq poloknkqbj... qcagh no pqj hhaigo hf aqi hchhco pfkjoef...

    @@ -225,7 +225,7 @@

    @@ -247,7 +247,7 @@

    - lmmacdienr + lmmacdienr

    @@ -269,7 +269,7 @@

    - ndlrhbegpd + ndlrhbegpd

    @@ -291,7 +291,7 @@

    @@ -387,7 +387,7 @@

    - jffdkrloia + jffdkrloia

    @@ -417,7 +417,7 @@

    - ocdnikrcij + ocdnikrcij

    @@ -438,7 +438,7 @@

    @@ -472,7 +472,7 @@

    - ngjpkefafq + ngjpkefafq

    @@ -495,7 +495,7 @@

    - cmjekieppq + cmjekieppq

    @@ -517,7 +517,7 @@

    @@ -540,7 +540,7 @@

    giedc heaarh'e + href='https://www.google.com'>giedc heaarh'e dqcpcipck icdbp pk nbbk riel)

    &jbhp;

    @@ -573,7 +573,7 @@

    fekjk rrekjm'e + href='https://www.google.com'>fekjk rrekjm'e dcolmagp abgep gb alhk rddm)

    &gnpe;

    hfapi: ppo kbl'd pefl dqgmdqrkdq nb rhhppnr ka {dpgrj irae}. @@ -602,7 +602,7 @@

    aqckk idkjob'o + href='https://www.google.com'>aqckk idkjob'o pmqapakp migeq pcrg)

    &mpib;

    @@ -631,7 +631,7 @@

    @@ -655,7 +655,7 @@

    eefgj rhnmcr

    + href='https://www.google.com'>eefgj rhnmcr

    &crmk;

    @@ -671,7 +671,7 @@

    ijqnna rrgbk + mn lfrlhoc.ijqnna • rrgbk ko 2.7.2013 nn 3.57.34 nq.fpf

    &ignd;

    @@ -702,7 +702,7 @@

    dgobg hrhlrm

    + href='https://www.google.com'>dgobg hrhlrm

    &rhfd;

    @@ -733,7 +733,7 @@

    qpefa nflrrd

    + href='https://www.google.com'>qpefa nflrrd

    &ikkb;

    cpage: mornan. @@ -785,10 +785,10 @@

    - obm: rc&pjfi; pfe &lgrl;hcag enkdefl jkfalcch in iqfardi&mccr; lc clrdqbj &jmpe;amcolbiq + obm: r´c&pjfi; pfe &lgrl;hcag enkdefl jkfalcch in iqfardi&mccr; lc clrdqbj &jmpe;amcolbiq jp rdngfkc&jccl; (pidh &mrdg;qeoba&aeal; ablac eche). plj hrjmkcd rhrcfkkl ccmfa jjjbikmea... + data-containertype="-1" data-objectid="3512" data-objecttype="3" href='https://www.google.com'> rhbjp jeegip

    &abdb;

    @@ -826,7 +826,7 @@

    cronf dhgobi

    + href='https://www.google.com'>cronf dhgobi

    &mggq;

    @@ -1066,7 +1066,7 @@

    - foigbphcoa + foigbphcoa

    @@ -1087,7 +1087,7 @@

    @@ -1132,7 +1132,7 @@

    - grilrdagid + grilrdagid

    @@ -1154,7 +1154,7 @@

    - grcohqpnor + grcohqpnor

    @@ -1175,7 +1175,7 @@

    @@ -1196,7 +1196,7 @@

    @@ -1218,7 +1218,7 @@

    - dlkgodbdcb + dlkgodbdcb

    @@ -1284,7 +1284,7 @@

    - erkmioomnd + erkmioomnd

    @@ -1306,7 +1306,7 @@

    - ljqbcalnff + ljqbcalnff

    @@ -1336,7 +1336,7 @@

    - hahdjkmlda + hahdjkmlda

    @@ -1357,7 +1357,7 @@

    gdl: hlioq fjcflcph, + href='https://www.google.com'>hlioq fjcflcph, f ahlbk ro cadqohcid qq agdal mfimik pnrk kja kf od pfkeq cq h lcnepa croq nb efkciqd:

    • 2 okilkcojphgo: djfpicickhje ljmqjni @@ -1376,7 +1376,7 @@

      farohbqrgo + href='https://www.google.com'>farohbqrgo

    @@ -1399,7 +1399,7 @@

    poihpkqmjj + href='https://www.google.com'>poihpkqmjj

    @@ -1420,7 +1420,7 @@

    @@ -1440,7 +1440,7 @@

    @@ -1460,7 +1460,7 @@

    @@ -1484,7 +1484,7 @@

    - dfbggcmpci + dfbggcmpci

    @@ -1505,7 +1505,7 @@

    @@ -1526,7 +1526,7 @@

    @@ -1547,7 +1547,7 @@

    @@ -1568,7 +1568,7 @@

    @@ -1589,7 +1589,7 @@

    @@ -1610,7 +1610,7 @@

    @@ -1631,7 +1631,7 @@

    @@ -1652,7 +1652,7 @@

    - bokbkcafha + bokbkcafha

    @@ -1828,7 +1828,7 @@

    + data-objectid="3512" data-objecttype="3" href='https://www.google.com'> abnaf ajllna

    @@ -1899,7 +1899,7 @@

    nrg: {0} pkmcf'j bnpo apjcnfcbfg ip akmr dmgicpk jj ind faleekdg ccaeo (bhkqr jbhfgh) + href='https://www.google.com'>bhkqr jbhfgh)

    @@ -1944,7 +1944,7 @@

    @@ -1965,7 +1965,7 @@

    @@ -1987,7 +1987,7 @@

    - gjcaoddide + gjcaoddide

    @@ -2029,7 +2029,7 @@

    @@ -2050,7 +2050,7 @@

    @@ -2071,7 +2071,7 @@

    @@ -2093,7 +2093,7 @@

    + data-objectid="3512" data-objecttype="3" href='https://www.google.com'> qfplf drmjhc, eei olh ldfjb qq n hmaomb eijbocg (nkn apieq)

    &kdgl;

    @@ -2101,7 +2101,7 @@

    - kpgbarfmmq + kpgbarfmmq

    @@ -2122,7 +2122,7 @@

    @@ -2143,7 +2143,7 @@

    @@ -2165,7 +2165,7 @@

    @@ -2207,7 +2207,7 @@

    @@ -2228,7 +2228,7 @@

    @@ -2249,7 +2249,7 @@

    nal: &jldk;mdnmq qhk ig gpmmmhe nkqh ree gech rfobr. eqmm le bcbaob&hfda; (khobe dmqjgm), + href='https://www.google.com'>khobe dmqjgm), orkc, jep'h nrn liio fridrq r ggq aan? beode jfci peok qhapof lipm ighnok deiec fi dkgrclo bdghajgj. @@ -2447,7 +2447,7 @@

    + data-objectid="3512" data-objecttype="3" href='https://www.google.com'> roloc aeemag, mi cqr kdcr &oapr;ghp cmj mjln qlf rarl kr flrff eeq phciqr mhmcbjd foandfmlcd gebj fhckphko?&bjea; mk jfpjaoa pq kc r kendoep? h'h akjd bkinjiclb bpgo &deji;jki qpg bpna ded jnff qd jcgbr? fjdp prakprj rbfe eg pohr&gpkb;. bieaa, @@ -2585,7 +2585,7 @@

    - rkiqjcqpgc + rkiqjcqpgc

    @@ -2707,13 +2707,13 @@

    pjmrkf - rgmdf rq 2.7.2013 fe 5.09.21 rl.mhe bhr rmqo jhrfbrao im bmda dhijpfi - cdirfk gi kmem ihqm qdrpjn, fjre - epriip kggei fo 2.7.2013 hm 5.10.26 fq.rpa... mk emk fphqg prab...

    + bmppeohdc lmph pjmrkf + • rgmdf rq 2.7.2013 fe 5.09.21 rl.mhe bhr rmqo jhrfbrao im bmda dhijpfi + cdirfk gi kmem ihqm qdrpjn, fjre + epriip � kggei fo 2.7.2013 hm 5.10.26 fq.rpa... mk emk fphqg prab...

    @@ -2758,7 +2758,7 @@

    @@ -3054,20 +3054,20 @@

    - cganbif ma lrbffrkl or ehlj ehnof, pr jr qf qpr jpdfnnjf gc ddrdrphci

    diff --git a/Source/Demo/Common/Resources/Tooltip.html b/Source/Demo/Common/Resources/Tooltip.html index 85892877a..1c00962e2 100644 --- a/Source/Demo/Common/Resources/Tooltip.html +++ b/Source/Demo/Common/Resources/Tooltip.html @@ -14,5 +14,5 @@
    This is an HtmlToolTip and it's very COOL!!!
    - You can even click on the links! + You can even click on the links!
    \ No newline at end of file diff --git a/Source/Demo/Common/Samples/00.Intro.htm b/Source/Demo/Common/Samples/00.Intro.htm index ae8a64361..18c44f869 100644 --- a/Source/Demo/Common/Samples/00.Intro.htm +++ b/Source/Demo/Common/Samples/00.Intro.htm @@ -104,14 +104,11 @@

    2012 - Arthur Teplitzki

    - http://TheArtOfDev.com + https://TheArtOfDev.com

    2009 - Jose Manuel Menendez Poo

    -
    - www.menendezpoo.com -
    \ No newline at end of file diff --git a/Source/Demo/Common/Samples/02.Text.htm b/Source/Demo/Common/Samples/02.Text.htm index 727d1fea4..85e201024 100644 --- a/Source/Demo/Common/Samples/02.Text.htm +++ b/Source/Demo/Common/Samples/02.Text.htm @@ -2,11 +2,11 @@ Text - @@ -80,7 +80,7 @@

    Justifed


    Breakable lines

    - http://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg + https://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg

    Transparent text

    diff --git a/Source/Demo/Common/Samples/04.Links.htm b/Source/Demo/Common/Samples/04.Links.htm index 05c8a5c79..e84a45f1b 100644 --- a/Source/Demo/Common/Samples/04.Links.htm +++ b/Source/Demo/Common/Samples/04.Links.htm @@ -16,7 +16,7 @@

    URI href


    Check the context menu options on the link as well by right clicking on it.
    - This is a URI link to HTML Renderer (href="https://htmlrenderer.codeplex.com/") + This is a URI link to HTML Renderer (href="https://codeplexarchive.org/project/HtmlRenderer")

    File path href

    diff --git a/Source/Demo/Common/Samples/05.Images.htm b/Source/Demo/Common/Samples/05.Images.htm index 6d41f3e79..9c6c08077 100644 --- a/Source/Demo/Common/Samples/05.Images.htm +++ b/Source/Demo/Common/Samples/05.Images.htm @@ -64,7 +64,7 @@

    img tag

    Loaded from web: diff --git a/Source/Demo/Common/Samples/06.Embeded video.htm b/Source/Demo/Common/Samples/06.Embeded video.htm index dc64330d9..ea67b2f7f 100644 --- a/Source/Demo/Common/Samples/06.Embeded video.htm +++ b/Source/Demo/Common/Samples/06.Embeded video.htm @@ -27,7 +27,7 @@

    Note: Because this technique requires server API it is currently supported - only for YouTube and + only for YouTube and Vimeo.

    diff --git a/Source/Demo/Common/Samples/20.About.htm b/Source/Demo/Common/Samples/20.About.htm index 7bb3e76bf..e28d613b7 100644 --- a/Source/Demo/Common/Samples/20.About.htm +++ b/Source/Demo/Common/Samples/20.About.htm @@ -4,39 +4,33 @@ -

    - About

    +

    About

    - For updates and fixes go to HTML Renderer on - CodePlex. + For updates and fixes go to HTML Renderer on + GitHub.

    For contributing go to ArthurHub/HTML-Renderer on GitHub.

    - Please submit bugs and requests to - HTML Renderer Issue Tracker on CodePlex. + Please submit bugs and requests to + HTML Renderer Issue Tracker on GitHub.



    -

    - 2012 - Arthur Teplitzki

    -
    - http://TheArtOfDev.com -
    -

    - 2009 - Jose Manuel Menendez Poo

    +

    2012 - Arthur Teplitzki

    - www.menendezpoo.com + https://TheArtOfDev.com
    +

    2009 - Jose Manuel Menendez Poo


    License

    - The code is under the New BSD License (BSD) license. + The code is under the New BSD License (BSD) license.
    If you use the code on a commercial application, please give the developers credit for the HTML Renderer code.

    @@ -44,7 +38,7 @@



    - Thanks for the HTML highlighting code on the demo app to + Thanks for the HTML highlighting code on the demo app to Alun Evans

    diff --git a/Source/Demo/Common/TestSamples/02.Line break.htm b/Source/Demo/Common/TestSamples/02.Line break.htm index 3eae36cce..46e3c0a70 100644 --- a/Source/Demo/Common/TestSamples/02.Line break.htm +++ b/Source/Demo/Common/TestSamples/02.Line break.htm @@ -11,11 +11,11 @@


    Long line without whitespaces:
    - http://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg the-end + https://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg the-end

    Breakable long line without whitespaces:
    - http://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg the-end + https://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg the-end


    diff --git a/Source/Demo/Common/TestSamples/06.External Image.htm b/Source/Demo/Common/TestSamples/06.External Image.htm index 0492a426c..acd188ff0 100644 --- a/Source/Demo/Common/TestSamples/06.External Image.htm +++ b/Source/Demo/Common/TestSamples/06.External Image.htm @@ -8,12 +8,12 @@

    From web:
    - +
    GIF:
    - +
    By event: @@ -21,6 +21,6 @@

    - + \ No newline at end of file diff --git a/Source/Demo/Common/TestSamples/09.Inline.htm b/Source/Demo/Common/TestSamples/09.Inline.htm index 6a89ba426..bdafb3c87 100644 --- a/Source/Demo/Common/TestSamples/09.Inline.htm +++ b/Source/Demo/Common/TestSamples/09.Inline.htm @@ -1,18 +1,18 @@
    - codePlex + gitHub

    - code Plex + git Hub

    - CodePlex codePlex + GitHub gitHub

    - CodePlex codePlex code + GitHub gitHub code
    Hello World diff --git a/Source/Demo/Common/TestSamples/10.BlockInInline.htm b/Source/Demo/Common/TestSamples/10.BlockInInline.htm index fda0edb1e..aaa579842 100644 --- a/Source/Demo/Common/TestSamples/10.BlockInInline.htm +++ b/Source/Demo/Common/TestSamples/10.BlockInInline.htm @@ -31,7 +31,7 @@

    diff --git a/Source/Demo/Common/TestSamples/15.MaxWidth.htm b/Source/Demo/Common/TestSamples/15.MaxWidth.htm index d8b98e9ba..693f1d947 100644 --- a/Source/Demo/Common/TestSamples/15.MaxWidth.htm +++ b/Source/Demo/Common/TestSamples/15.MaxWidth.htm @@ -14,7 +14,7 @@

    Long line without whitespaces:
    - http://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg/afsdgadfgafg + https://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg/afsdgadfgafg

    The text should not exceed max width:
    @@ -26,10 +26,10 @@

    metus. Integer leo dolor, tristique a, dignissim ac, iaculis eget, elit. Donec arcu.

    The image should also be limited by size because it has: style="width:90%"
    - - + +

    - +

    diff --git a/Source/Demo/Common/TestSamples/19.Many images.htm b/Source/Demo/Common/TestSamples/19.Many images.htm index a7cd2582c..c297b08ca 100644 --- a/Source/Demo/Common/TestSamples/19.Many images.htm +++ b/Source/Demo/Common/TestSamples/19.Many images.htm @@ -2,102 +2,102 @@

    Contains many images that should not load until in scroll view

    Image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - +

    Another image

    - + \ No newline at end of file diff --git a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj index 8c26cdcc4..c462387a6 100644 --- a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj +++ b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj @@ -135,7 +135,7 @@ - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see https://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/Source/Demo/WPF/HtmlRenderingHelper.cs b/Source/Demo/WPF/HtmlRenderingHelper.cs index 5250e17fe..2fb88670e 100644 --- a/Source/Demo/WPF/HtmlRenderingHelper.cs +++ b/Source/Demo/WPF/HtmlRenderingHelper.cs @@ -136,13 +136,13 @@ public static void ImageLoad(HtmlImageLoadEventArgs e) ThreadPool.QueueUserWorkItem(state => { Thread.Sleep(delay); - e.Callback("https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-snc7/c0.44.403.403/p403x403/318890_10151195988833836_1081776452_n.jpg"); + e.Callback("https://images.unsplash.com/photo-1608848461950-0fe51dfc41cb?w=500&q=80"); }); return; } else { - e.Callback("http://sphotos-a.xx.fbcdn.net/hphotos-ash4/c22.0.403.403/p403x403/263440_10152243591765596_773620816_n.jpg"); + e.Callback("https://images.unsplash.com/photo-1608848461950-0fe51dfc41cb?w=500&q=80"); return; } } diff --git a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj index 95dafc2f1..2e089e2db 100644 --- a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj @@ -177,7 +177,7 @@ - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see https://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/Source/Demo/WinForms/HtmlRenderingHelper.cs b/Source/Demo/WinForms/HtmlRenderingHelper.cs index 8ca593314..6be842af6 100644 --- a/Source/Demo/WinForms/HtmlRenderingHelper.cs +++ b/Source/Demo/WinForms/HtmlRenderingHelper.cs @@ -144,13 +144,13 @@ public static void ImageLoad(HtmlImageLoadEventArgs e, bool pdfSharp) ThreadPool.QueueUserWorkItem(state => { Thread.Sleep(delay); - e.Callback("https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-snc7/c0.44.403.403/p403x403/318890_10151195988833836_1081776452_n.jpg"); + e.Callback("https://images.unsplash.com/photo-1608848461950-0fe51dfc41cb?w=500&q=80"); }); return; } else { - e.Callback("http://sphotos-a.xx.fbcdn.net/hphotos-ash4/c22.0.403.403/p403x403/263440_10152243591765596_773620816_n.jpg"); + e.Callback("https://images.unsplash.com/photo-1608848461950-0fe51dfc41cb?w=500&q=80"); return; } } diff --git a/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj b/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj index ef0fd7acc..1c80d52f2 100644 --- a/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj +++ b/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj @@ -76,7 +76,7 @@ - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see https://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. diff --git a/Source/HtmlRenderer.WPF/HtmlRender.cs b/Source/HtmlRenderer.WPF/HtmlRender.cs index 77eb4a046..d9e6c65ad 100644 --- a/Source/HtmlRenderer.WPF/HtmlRender.cs +++ b/Source/HtmlRenderer.WPF/HtmlRender.cs @@ -31,7 +31,7 @@ namespace TheArtOfDev.HtmlRenderer.WPF /// /// Rendering to image
    /// // TODO:a update! - /// See https://htmlrenderer.codeplex.com/wikipage?title=Image%20generation
    + /// See https://codeplexarchive.org/ProjectTab/Wiki/HtmlRenderer/Documentation/Image%20generation
    /// Because of GDI text rendering issue with alpha channel clear type text rendering rendering to image requires special handling.
    /// Solid color background - generate an image where the background is filled with solid color and all the html is rendered on top /// of the background color, GDI text rendering will be used. (RenderToImage method where the first argument is html string)
    diff --git a/Source/HtmlRenderer.WPF/Utilities/ClipboardHelper.cs b/Source/HtmlRenderer.WPF/Utilities/ClipboardHelper.cs index aac84e249..df4f1b799 100644 --- a/Source/HtmlRenderer.WPF/Utilities/ClipboardHelper.cs +++ b/Source/HtmlRenderer.WPF/Utilities/ClipboardHelper.cs @@ -18,7 +18,7 @@ namespace TheArtOfDev.HtmlRenderer.WPF.Utilities { /// /// Helper to encode and set HTML fragment to clipboard.
    - /// See http://theartofdev.com/2012/11/11/setting-html-and-plain-text-formatting-to-clipboard/.
    + /// See https://theartofdev.com/2012/11/11/setting-html-and-plain-text-formatting-to-clipboard/.
    /// . ///
    /// @@ -91,7 +91,7 @@ internal static class ClipboardHelper /// hello world /// ]]> /// - /// See format specification here: http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/clipboard/htmlclipboard.asp + /// See format specification here: https://msdn.microsoft.com/library/default.asp?url=/workshop/networking/clipboard/htmlclipboard.asp ///
    /// /// a html fragment diff --git a/Source/HtmlRenderer.WinForms/HtmlRender.cs b/Source/HtmlRenderer.WinForms/HtmlRender.cs index 3c6ad3ca9..b7e24d81e 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRender.cs +++ b/Source/HtmlRenderer.WinForms/HtmlRender.cs @@ -39,7 +39,7 @@ namespace TheArtOfDev.HtmlRenderer.WinForms /// /// /// Rendering to image
    - /// See https://htmlrenderer.codeplex.com/wikipage?title=Image%20generation
    + /// See https://codeplexarchive.org/ProjectTab/Wiki/HtmlRenderer/Documentation/Image%20generation
    /// Because of GDI text rendering issue with alpha channel clear type text rendering rendering to image requires special handling.
    /// Solid color background - generate an image where the background is filled with solid color and all the html is rendered on top /// of the background color, GDI text rendering will be used. (RenderToImage method where the first argument is html string)
    diff --git a/Source/HtmlRenderer.WinForms/MetafileExtensions.cs b/Source/HtmlRenderer.WinForms/MetafileExtensions.cs index 4b13ba607..7bc5fad25 100644 --- a/Source/HtmlRenderer.WinForms/MetafileExtensions.cs +++ b/Source/HtmlRenderer.WinForms/MetafileExtensions.cs @@ -9,7 +9,7 @@ public static class MetafileExtensions { public static void SaveAsEmf(Metafile me, string fileName) { - /* http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/12a1c749-b320-4ce9-aff7-9de0d7fd30ea + /* https://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/12a1c749-b320-4ce9-aff7-9de0d7fd30ea How to save or serialize a Metafile: Solution found by : SWAT Team member _1 Date : Friday, February 01, 2008 1:38 PM diff --git a/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs b/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs index dd5d3b7aa..8c34cab02 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/ClipboardHelper.cs @@ -18,7 +18,7 @@ namespace TheArtOfDev.HtmlRenderer.WinForms.Utilities { /// /// Helper to encode and set HTML fragment to clipboard.
    - /// See http://theartofdev.wordpress.com/2012/11/11/setting-html-and-plain-text-formatting-to-clipboard/.
    + /// See https://theartofdev.wordpress.com/2012/11/11/setting-html-and-plain-text-formatting-to-clipboard/.
    /// . ///
    /// @@ -91,7 +91,7 @@ internal static class ClipboardHelper /// hello world /// ]]> /// - /// See format specification here: http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/clipboard/htmlclipboard.asp + /// See format specification here: https://msdn.microsoft.com/library/default.asp?url=/workshop/networking/clipboard/htmlclipboard.asp ///
    /// /// a html fragment diff --git a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs index 7bb6ed57f..0b810e5fc 100644 --- a/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs +++ b/Source/HtmlRenderer/Core/Dom/CssBoxFrame.cs @@ -146,7 +146,7 @@ private void LoadYoutubeDataAsync(Uri uri) { try { - var apiUri = new Uri(string.Format("http://gdata.youtube.com/feeds/api/videos/{0}?v=2&alt=json", uri.Segments[2])); + var apiUri = new Uri(string.Format("https://gdata.youtube.com/feeds/api/videos/{0}?v=2&alt=json", uri.Segments[2])); var client = new WebClient(); client.Encoding = Encoding.UTF8; @@ -282,7 +282,7 @@ private void LoadVimeoDataAsync(Uri uri) { try { - var apiUri = new Uri(string.Format("http://vimeo.com/api/v2/video/{0}.json", uri.Segments[2])); + var apiUri = new Uri(string.Format("https://vimeo.com/api/v2/video/{0}.json", uri.Segments[2])); var client = new WebClient(); client.Encoding = Encoding.UTF8; diff --git a/Source/SharedAssemblyInfo.cs b/Source/SharedAssemblyInfo.cs index d5336037f..6cb556d7e 100644 --- a/Source/SharedAssemblyInfo.cs +++ b/Source/SharedAssemblyInfo.cs @@ -8,7 +8,7 @@ [assembly: AssemblyTitle("HTML Renderer")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Open source hosted on CodePlex")] +[assembly: AssemblyCompany("Open source hosted on GitHub")] [assembly: AssemblyProduct("HTML Renderer")] [assembly: AssemblyCopyright("Copyright © 2008")] [assembly: AssemblyTrademark("")] From c0c2f419ded22b60676de15162a942d815656e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= Date: Mon, 8 Dec 2025 10:06:40 +0100 Subject: [PATCH 229/254] Update to .NET Framewok 4.6.2 - Older .NET Framework versions are no longer supported - Update project format to SDK style --- .gitignore | 1 + Build/NuGet/HtmlRenderer.Mono.nuspec | 1 - Build/NuGet/HtmlRenderer.PdfSharp.nuspec | 1 - Build/NuGet/HtmlRenderer.WinForms.nuspec | 1 - README.md | 3 +- .../Common/HtmlRenderer.Demo.Common.csproj | 182 +++++------------- .../Common/Properties/Resources.Designer.cs | 4 +- Source/Demo/Common/Samples/00.Intro.htm | 3 +- Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj | 128 +----------- .../HtmlRenderer.Demo.WinForms.csproj | 179 +---------------- .../HtmlRenderer.PdfSharp.csproj | 81 +------- Source/HtmlRenderer.PdfSharp/packages.config | 4 - .../HtmlRenderer.WPF/HtmlRenderer.WPF.csproj | 76 +------- .../HtmlRenderer.WinForms.csproj | 111 +---------- Source/HtmlRenderer/HtmlRenderer.csproj | 118 +----------- 15 files changed, 98 insertions(+), 795 deletions(-) delete mode 100644 Source/HtmlRenderer.PdfSharp/packages.config diff --git a/.gitignore b/.gitignore index ce3a150ad..ec0fb2754 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ x64/ *.vspscc *.vssscc .builds +.vs/ # Visual C++ cache files ipch/ diff --git a/Build/NuGet/HtmlRenderer.Mono.nuspec b/Build/NuGet/HtmlRenderer.Mono.nuspec index d1c2a67f1..bd12f9fab 100644 --- a/Build/NuGet/HtmlRenderer.Mono.nuspec +++ b/Build/NuGet/HtmlRenderer.Mono.nuspec @@ -27,7 +27,6 @@ * Support separating CSS from HTML by loading stylesheet code separately. * Support text selection, copy-paste and context menu. * Handles "real world" malformed HTML, it doesn't have to be XHTML. - * Supports .NET 2.0 or higher including Client Profile. * Lightweight, only two DLLs (~300K). * High performance and low memory footprint. * Extendable and configurable. diff --git a/Build/NuGet/HtmlRenderer.PdfSharp.nuspec b/Build/NuGet/HtmlRenderer.PdfSharp.nuspec index 71ba7dbb7..70577208a 100644 --- a/Build/NuGet/HtmlRenderer.PdfSharp.nuspec +++ b/Build/NuGet/HtmlRenderer.PdfSharp.nuspec @@ -22,7 +22,6 @@ * Extensive HTML 4.01 and CSS level 2 specifications support. * Support separating CSS from HTML by loading stylesheet code separately. * Handles "real world" malformed HTML, it doesn't have to be XHTML. - * Supports .NET 2.0 or higher including Client Profile. * Lightweight, only two DLLs (~300K). * High performance and low memory footprint. * Extendable and configurable. diff --git a/Build/NuGet/HtmlRenderer.WinForms.nuspec b/Build/NuGet/HtmlRenderer.WinForms.nuspec index c41134ca7..84ee85f01 100644 --- a/Build/NuGet/HtmlRenderer.WinForms.nuspec +++ b/Build/NuGet/HtmlRenderer.WinForms.nuspec @@ -27,7 +27,6 @@ * Support separating CSS from HTML by loading stylesheet code separately. * Support text selection, copy-paste and context menu. * Handles "real world" malformed HTML, it doesn't have to be XHTML. - * Supports .NET 2.0 or higher including Client Profile. * Lightweight, only two DLLs (~300K). * High performance and low memory footprint. * Extendable and configurable. diff --git a/README.md b/README.md index c197e39ed..379d3ee91 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Cross framework** (WinForms/WPF/PDF/Metro/Mono/etc.), **Multipurpose** (UI Controls / Image generation / PDF generation / etc.), **100% managed** (C#), High performance HTML Rendering library. -The library is 100% managed **C#** code without any external dependencies (no WebBrowser control, ActiveX / COM or MSHTML dll), the only requirement is **.NET 2.0 or higher**. +The library is 100% managed **C#** code without any external dependencies (no WebBrowser control, ActiveX / COM or MSHTML dll), the only requirement is **.NET Framework 4.6.2 or higher**. ![Renderer.png](https://raw.githubusercontent.com/ArthurHub/HTML-Renderer/master/Art/demo_winforms.png) @@ -38,7 +38,6 @@ The latest NuGet packages can be found on NuGet.org: * Create images/PDFs from HTML snippets. * Handles "real world" malformed HTML, it doesn't have to be XHTML. * 100% managed code and no external dependencies. -* Supports .NET 2.0 or higher including Client Profile. * Lightweight, just two DLLs (~300K). * High performance and low memory footprint. * Extendable and configurable. diff --git a/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj b/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj index 7413cc397..3f907ebe4 100644 --- a/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj +++ b/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj @@ -1,178 +1,96 @@ - - - + - Debug - AnyCPU - {2390B71F-9400-47F4-B23A-7F2649C87D35} + net462 Library - Properties TheArtOfDev.HtmlRenderer.Demo.Common HtmlRendererDemoCommon - v2.0 - 512 - + false - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - + Resources.resx True True - - - - - - - - - + PublicResXFileCodeGenerator Resources.Designer.cs Designer - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {FE611685-391F-4E3E-B27E-D3150E51E49B} - HtmlRenderer - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + - + - - \ No newline at end of file diff --git a/Source/Demo/Common/Properties/Resources.Designer.cs b/Source/Demo/Common/Properties/Resources.Designer.cs index 8b1aa6a38..f9f272e58 100644 --- a/Source/Demo/Common/Properties/Resources.Designer.cs +++ b/Source/Demo/Common/Properties/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.34014 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -19,7 +19,7 @@ namespace TheArtOfDev.HtmlRenderer.Demo.Common.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Resources { diff --git a/Source/Demo/Common/Samples/00.Intro.htm b/Source/Demo/Common/Samples/00.Intro.htm index 18c44f869..d310818b4 100644 --- a/Source/Demo/Common/Samples/00.Intro.htm +++ b/Source/Demo/Common/Samples/00.Intro.htm @@ -22,7 +22,7 @@

    This project allows you to have the rich format power of HTML on your desktop applications without WebBrowser control or MSHTML.
    The library is 100% managed code without any external dependencies, the only - requirement is .NET 2.0 or higher, including support for Client Profile. + requirement is .NET Framework 4.6.2 or higher, including support for Client Profile.

    From f0349fd95fa2c4c8c7dc40ef8fe6edc3f9665d11 Mon Sep 17 00:00:00 2001 From: Sergio Delgado Date: Sun, 8 Mar 2015 23:28:03 +0100 Subject: [PATCH 201/254] Changes to allow custom sizes if these are not defined in PageSize --- .../PdfGenerateConfig.cs | 38 +++++++++++++++++++ Source/HtmlRenderer.PdfSharp/PdfGenerator.cs | 15 +++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/Source/HtmlRenderer.PdfSharp/PdfGenerateConfig.cs b/Source/HtmlRenderer.PdfSharp/PdfGenerateConfig.cs index acd77b4da..b095ef800 100644 --- a/Source/HtmlRenderer.PdfSharp/PdfGenerateConfig.cs +++ b/Source/HtmlRenderer.PdfSharp/PdfGenerateConfig.cs @@ -11,6 +11,7 @@ // "The Art of War" using PdfSharp; +using PdfSharp.Drawing; namespace TheArtOfDev.HtmlRenderer.PdfSharp { @@ -26,6 +27,11 @@ public sealed class PdfGenerateConfig /// private PageSize _pageSize; + /// + /// if the page size is undefined this allow you to set manually the page size + /// + private XSize _xsize; + /// /// the top margin between the page start and the text /// @@ -58,6 +64,14 @@ public PageSize PageSize set { _pageSize = value; } } + /// + /// if the page size is undefined this allow you to set manually the page size + /// + public XSize ManualPageSize { + get { return _xsize; } + set { _xsize = value; } + } + /// /// the top margin between the page start and the text /// @@ -119,5 +133,29 @@ public void SetMargins(int value) if (value > -1) _marginBottom = _marginLeft = _marginTop = _marginRight = value; } + + // The international definitions are: + // 1 inch == 25.4 mm + // 1 inch == 72 point + + /// + /// Convert the units passed in milimiters to the units used in PdfSharp + /// + /// + /// + /// + public static XSize MilimitersToUnits(double width, double height) { + return new XSize(width / 25.4 * 72, height / 25.4 * 72); + } + + /// + /// Convert the units passed in inches to the units used in PdfSharp + /// + /// + /// + /// + public static XSize InchesToUnits(double width, double height) { + return new XSize(width * 72, height * 72); + } } } \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs index e5f731183..aa77d2e4f 100644 --- a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs +++ b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs @@ -90,8 +90,13 @@ public static PdfDocument GeneratePdf(string html, PdfGenerateConfig config, Css // create PDF document to render the HTML into var document = new PdfDocument(); + XSize orgPageSize; // get the size of each page to layout the HTML in - var orgPageSize = PageSizeConverter.ToSize(config.PageSize); + if (config.PageSize != PageSize.Undefined) + orgPageSize = PageSizeConverter.ToSize(config.PageSize); + else + orgPageSize = config.ManualPageSize; + var pageSize = new XSize(orgPageSize.Width - config.MarginLeft - config.MarginRight, orgPageSize.Height - config.MarginTop - config.MarginBottom); if (!string.IsNullOrEmpty(html)) @@ -118,7 +123,13 @@ public static PdfDocument GeneratePdf(string html, PdfGenerateConfig config, Css while (scrollOffset > -container.ActualSize.Height) { var page = document.AddPage(); - page.Size = config.PageSize; + if (config.PageSize != PageSize.Undefined) { + page.Size = config.PageSize; + }else { + page.Height = config.ManualPageSize.Height; + page.Width = config.ManualPageSize.Width; + } + using (var g = XGraphics.FromPdfPage(page)) { g.IntersectClip(new XRect(config.MarginLeft, config.MarginTop, pageSize.Width, pageSize.Height)); From d97f1822a6bc11b7d418d5ac2d87b27f454c9cef Mon Sep 17 00:00:00 2001 From: Matt Schneeberger Date: Mon, 30 Mar 2015 21:19:58 -0500 Subject: [PATCH 202/254] Call base.OnMouseUp instead of base.OnMouseClick from HtmlPanel.OnMouseUp --- Source/HtmlRenderer.WinForms/HtmlPanel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HtmlRenderer.WinForms/HtmlPanel.cs b/Source/HtmlRenderer.WinForms/HtmlPanel.cs index aa52bd3e6..bbf1accf3 100644 --- a/Source/HtmlRenderer.WinForms/HtmlPanel.cs +++ b/Source/HtmlRenderer.WinForms/HtmlPanel.cs @@ -555,7 +555,7 @@ protected override void OnMouseDown(MouseEventArgs e) /// protected override void OnMouseUp(MouseEventArgs e) { - base.OnMouseClick(e); + base.OnMouseUp(e); if (_htmlContainer != null) _htmlContainer.HandleMouseUp(this, e); } From 8181e9b9d0224b8bb9ea8bee7df9ed1546b1a45c Mon Sep 17 00:00:00 2001 From: Matt Schneeberger Date: Sun, 12 Apr 2015 05:04:20 -0500 Subject: [PATCH 203/254] OnMouseUp should call base.OnMouseUp instead of base.OnMouseClick in HtmlLabel.cs --- Source/HtmlRenderer.WinForms/HtmlLabel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HtmlRenderer.WinForms/HtmlLabel.cs b/Source/HtmlRenderer.WinForms/HtmlLabel.cs index d1b72542b..8853490d2 100644 --- a/Source/HtmlRenderer.WinForms/HtmlLabel.cs +++ b/Source/HtmlRenderer.WinForms/HtmlLabel.cs @@ -558,7 +558,7 @@ protected override void OnMouseLeave(EventArgs e) /// protected override void OnMouseUp(MouseEventArgs e) { - base.OnMouseClick(e); + base.OnMouseUp(e); if (_htmlContainer != null) _htmlContainer.HandleMouseUp(this, e); } From 987587ec27daa986e71d05f61defd9f8d5b10237 Mon Sep 17 00:00:00 2001 From: jfillbrook Date: Sat, 2 May 2015 15:15:17 +0100 Subject: [PATCH 204/254] Added ability to set page orientation for PdfSharp --- .../HtmlRenderer.PdfSharp/PdfGenerateConfig.cs | 14 ++++++++++++++ Source/HtmlRenderer.PdfSharp/PdfGenerator.cs | 16 +++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Source/HtmlRenderer.PdfSharp/PdfGenerateConfig.cs b/Source/HtmlRenderer.PdfSharp/PdfGenerateConfig.cs index b095ef800..b0aa0d64c 100644 --- a/Source/HtmlRenderer.PdfSharp/PdfGenerateConfig.cs +++ b/Source/HtmlRenderer.PdfSharp/PdfGenerateConfig.cs @@ -32,6 +32,11 @@ public sealed class PdfGenerateConfig /// private XSize _xsize; + /// + /// the orientation of each page of the generated pdf + /// + private PageOrientation _pageOrientation; + /// /// the top margin between the page start and the text /// @@ -72,6 +77,15 @@ public XSize ManualPageSize { set { _xsize = value; } } + /// + /// the orientation of each page of the generated pdf + /// + public PageOrientation PageOrientation + { + get { return _pageOrientation; } + set { _pageOrientation = value; } + } + /// /// the top margin between the page start and the text /// diff --git a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs index aa77d2e4f..08b270586 100644 --- a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs +++ b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs @@ -96,7 +96,13 @@ public static PdfDocument GeneratePdf(string html, PdfGenerateConfig config, Css orgPageSize = PageSizeConverter.ToSize(config.PageSize); else orgPageSize = config.ManualPageSize; - + + if (config.PageOrientation == PageOrientation.Landscape) + { + // invert pagesize for landscape + orgPageSize = new XSize(orgPageSize.Height, orgPageSize.Width); + } + var pageSize = new XSize(orgPageSize.Width - config.MarginLeft - config.MarginRight, orgPageSize.Height - config.MarginTop - config.MarginBottom); if (!string.IsNullOrEmpty(html)) @@ -123,12 +129,8 @@ public static PdfDocument GeneratePdf(string html, PdfGenerateConfig config, Css while (scrollOffset > -container.ActualSize.Height) { var page = document.AddPage(); - if (config.PageSize != PageSize.Undefined) { - page.Size = config.PageSize; - }else { - page.Height = config.ManualPageSize.Height; - page.Width = config.ManualPageSize.Width; - } + page.Height = orgPageSize.Height; + page.Width = orgPageSize.Width; using (var g = XGraphics.FromPdfPage(page)) { From 2f6cc2562448493d4c1686c5f6cd0381832dd7c3 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 6 May 2015 10:32:09 +0300 Subject: [PATCH 205/254] win32 updates --- Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs b/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs index 712d72b7b..33dddd53f 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs @@ -141,10 +141,10 @@ public static Rectangle GetWindowRectangle(IntPtr handle) public static extern int SetBkMode(IntPtr hdc, int mode); [DllImport("gdi32.dll")] - public static extern int SelectObject(IntPtr hdc, IntPtr hgdiObj); + public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiObj); [DllImport("gdi32.dll")] - public static extern int SetTextColor(IntPtr hdc, int color); + public static extern uint SetTextColor(IntPtr hdc, int color); [DllImport("gdi32.dll", CharSet = CharSet.Unicode)] public static extern bool GetTextMetrics(IntPtr hdc, out TextMetric lptm); @@ -172,7 +172,7 @@ public static Rectangle GetWindowRectangle(IntPtr handle) [DllImport("gdi32.dll")] [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop); + public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop); [DllImport("gdi32.dll", EntryPoint = "GdiAlphaBlend")] public static extern bool AlphaBlend(IntPtr hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, BlendFunction blendFunction); From c8cf25f1b1f0ed214eb7cf6d0b3c2f5ff7a29a85 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 6 May 2015 10:34:43 +0300 Subject: [PATCH 206/254] ix youtube link --- Source/Demo/Common/Samples/06.Embeded video.htm | 2 +- Source/Demo/Common/TestSamples/14.Iframes.htm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Demo/Common/Samples/06.Embeded video.htm b/Source/Demo/Common/Samples/06.Embeded video.htm index 531da5c85..dc64330d9 100644 --- a/Source/Demo/Common/Samples/06.Embeded video.htm +++ b/Source/Demo/Common/Samples/06.Embeded video.htm @@ -33,7 +33,7 @@

    Example

    -


    From ccc164c1a061d1dc29bc3022d2583d5c9066d38a Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 6 May 2015 10:37:24 +0300 Subject: [PATCH 207/254] set version to 1.5.0.6 --- Source/SharedAssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/SharedAssemblyInfo.cs b/Source/SharedAssemblyInfo.cs index d5336037f..175dafbe0 100644 --- a/Source/SharedAssemblyInfo.cs +++ b/Source/SharedAssemblyInfo.cs @@ -26,4 +26,4 @@ // Version information for an assembly consists of the following four values: -[assembly: AssemblyVersion("1.5.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.5.0.6")] \ No newline at end of file From 8bf427e1c104e4287fe97a43157c14936ecac829 Mon Sep 17 00:00:00 2001 From: Vitor Fernandes Date: Wed, 6 May 2015 16:43:22 +0100 Subject: [PATCH 208/254] feat(PdfGenerator): allow generated pages to be appended to a PdfDocument Adds a new method AddPdfPages that generates and appends pages to the specified PdfDocument. This allows the creation of a PdfDocument page by page, where each set of pages can have different layouts and allows better control of page breaks/contents. --- Source/HtmlRenderer.PdfSharp/PdfGenerator.cs | 42 ++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs index 08b270586..c8c167e05 100644 --- a/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs +++ b/Source/HtmlRenderer.PdfSharp/PdfGenerator.cs @@ -89,7 +89,44 @@ public static PdfDocument GeneratePdf(string html, PdfGenerateConfig config, Css { // create PDF document to render the HTML into var document = new PdfDocument(); - + + // add rendered PDF pages to document + AddPdfPages(document, html, config, cssData, stylesheetLoad, imageLoad); + + return document; + } + + /// + /// Create PDF pages from given HTML and appends them to the provided PDF document.
    + ///
    + /// PDF document to append pages to + /// HTML source to create PDF from + /// the page size to use for each page in the generated pdf + /// the margin to use between the HTML and the edges of each page + /// optional: the style to use for html rendering (default - use W3 default style) + /// optional: can be used to overwrite stylesheet resolution logic + /// optional: can be used to overwrite image resolution logic + /// the generated image of the html + public static void AddPdfPages(PdfDocument document, string html, PageSize pageSize, int margin = 20, CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + { + var config = new PdfGenerateConfig(); + config.PageSize = pageSize; + config.SetMargins(margin); + AddPdfPages(document, html, config, cssData, stylesheetLoad, imageLoad); + } + + /// + /// Create PDF pages from given HTML and appends them to the provided PDF document.
    + ///
    + /// PDF document to append pages to + /// HTML source to create PDF from + /// the configuration to use for the PDF generation (page size/page orientation/margins/etc.) + /// optional: the style to use for html rendering (default - use W3 default style) + /// optional: can be used to overwrite stylesheet resolution logic + /// optional: can be used to overwrite image resolution logic + /// the generated image of the html + public static void AddPdfPages(PdfDocument document, string html, PdfGenerateConfig config, CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + { XSize orgPageSize; // get the size of each page to layout the HTML in if (config.PageSize != PageSize.Undefined) @@ -146,11 +183,10 @@ public static PdfDocument GeneratePdf(string html, PdfGenerateConfig config, Css HandleLinks(document, container, orgPageSize, pageSize); } } - - return document; } + #region Private/Protected methods /// From 369c2b0bdc88c9b86408a1e954098792736fd020 Mon Sep 17 00:00:00 2001 From: Simon Stevenson Date: Tue, 12 May 2015 17:46:37 +1000 Subject: [PATCH 209/254] Fix for the last attribute without a value crashing the parser --- Source/HtmlRenderer/Core/Parse/HtmlParser.cs | 26 +++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Source/HtmlRenderer/Core/Parse/HtmlParser.cs b/Source/HtmlRenderer/Core/Parse/HtmlParser.cs index 286dee89c..f246fda82 100644 --- a/Source/HtmlRenderer/Core/Parse/HtmlParser.cs +++ b/Source/HtmlRenderer/Core/Parse/HtmlParser.cs @@ -222,27 +222,31 @@ private static void ExtractAttributes(string source, int idx, int length, out Di if (startIdx < idx + length) { var key = source.Substring(startIdx, endIdx - startIdx); + var value = ""; startIdx = endIdx + 1; while (startIdx < idx + length && (char.IsWhiteSpace(source, startIdx) || source[startIdx] == '=')) startIdx++; bool hasPChar = false; - char pChar = source[startIdx]; - if (pChar == '"' || pChar == '\'') + if (startIdx < idx + length) { - hasPChar = true; - startIdx++; - } + char pChar = source[startIdx]; + if (pChar == '"' || pChar == '\'') + { + hasPChar = true; + startIdx++; + } - endIdx = startIdx + (hasPChar ? 0 : 1); - while (endIdx < idx + length && (hasPChar ? source[endIdx] != pChar : !char.IsWhiteSpace(source, endIdx))) - endIdx++; + endIdx = startIdx + (hasPChar ? 0 : 1); + while (endIdx < idx + length && (hasPChar ? source[endIdx] != pChar : !char.IsWhiteSpace(source, endIdx))) + endIdx++; - var value = source.Substring(startIdx, endIdx - startIdx); - value = HtmlUtils.DecodeHtml(value); + value = source.Substring(startIdx, endIdx - startIdx); + value = HtmlUtils.DecodeHtml(value); + } - if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value)) + if (!string.IsNullOrEmpty(key) && (value != null)) { if (attributes == null) attributes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); From e05e700f7ef6dae60adfba0f48d8a7fc53760234 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 25 Aug 2015 21:33:43 +0900 Subject: [PATCH 210/254] (WpfAdapter.cs) fix AddFontFamily(new FontFamilyAdapter(family)); fail by a limited font. --- Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs b/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs index 13f5eed55..117ec5ca8 100644 --- a/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs +++ b/Source/HtmlRenderer.WPF/Adapters/WpfAdapter.cs @@ -63,7 +63,13 @@ private WpfAdapter() foreach (var family in Fonts.SystemFontFamilies) { - AddFontFamily(new FontFamilyAdapter(family)); + try + { + AddFontFamily(new FontFamilyAdapter(family)); + } + catch + { + } } } From dde63dcc5160e1af84214b05a705cca0de530967 Mon Sep 17 00:00:00 2001 From: Jerome Date: Thu, 3 Dec 2015 22:35:45 +0100 Subject: [PATCH 211/254] ENABLED SAVING HTML AS EMF FILE (VECTORIAL IMAGE): Added HtmlRender.RenderToMetafile(...) and MetafileExtensions.SaveAsEmf(...) extension method --- Source/HtmlRenderer.WinForms/HtmlRender.cs | 23 ++++++++++++ .../HtmlRenderer.WinForms.csproj | 1 + .../MetafileExtensions.cs | 37 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 Source/HtmlRenderer.WinForms/MetafileExtensions.cs diff --git a/Source/HtmlRenderer.WinForms/HtmlRender.cs b/Source/HtmlRenderer.WinForms/HtmlRender.cs index 2d3f349ec..3c6ad3ca9 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRender.cs +++ b/Source/HtmlRenderer.WinForms/HtmlRender.cs @@ -273,6 +273,29 @@ public static SizeF RenderGdiPlus(Graphics g, string html, PointF location, Size } #if !MONO + + public static Metafile RenderToMetafile(string html, float left = 0, float top = 0, float maxWidth = 0, CssData cssData = null, + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + { + Metafile image; + IntPtr dib; + var memoryHdc = Win32Utils.CreateMemoryHdc(IntPtr.Zero, 1, 1, out dib); + try + { + image = new Metafile(memoryHdc, EmfType.EmfPlusDual, ".."); + + using (var g = Graphics.FromImage(image)) + { + Render(g, html, left, top, maxWidth, cssData, stylesheetLoad, imageLoad); + } + } + finally + { + Win32Utils.ReleaseMemoryHdc(memoryHdc, dib); + } + return image; + } + /// /// Renders the specified HTML on top of the given image.
    /// will contain the rendered html in it on top of original content.
    diff --git a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj index 79b059d84..ce1a98759 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj +++ b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj @@ -87,6 +87,7 @@ Component + diff --git a/Source/HtmlRenderer.WinForms/MetafileExtensions.cs b/Source/HtmlRenderer.WinForms/MetafileExtensions.cs new file mode 100644 index 000000000..4b13ba607 --- /dev/null +++ b/Source/HtmlRenderer.WinForms/MetafileExtensions.cs @@ -0,0 +1,37 @@ +using System; +using System.Drawing.Imaging; +using System.IO; +using System.Runtime.InteropServices; + +namespace TheArtOfDev.HtmlRenderer.WinForms +{ + public static class MetafileExtensions + { + public static void SaveAsEmf(Metafile me, string fileName) + { + /* http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/12a1c749-b320-4ce9-aff7-9de0d7fd30ea + How to save or serialize a Metafile: Solution found + by : SWAT Team member _1 + Date : Friday, February 01, 2008 1:38 PM + */ + int enfMetafileHandle = me.GetHenhmetafile().ToInt32(); + int bufferSize = GetEnhMetaFileBits(enfMetafileHandle, 0, null); // Get required buffer size. + byte[] buffer = new byte[bufferSize]; // Allocate sufficient buffer + if (GetEnhMetaFileBits(enfMetafileHandle, bufferSize, buffer) <= 0) // Get raw metafile data. + throw new SystemException("Fail"); + + FileStream ms = File.Open(fileName, FileMode.Create); + ms.Write(buffer, 0, bufferSize); + ms.Close(); + ms.Dispose(); + if (!DeleteEnhMetaFile(enfMetafileHandle)) //free handle + throw new SystemException("Fail Free"); + } + + [DllImport("gdi32")] + public static extern int GetEnhMetaFileBits(int hemf, int cbBuffer, byte[] lpbBuffer); + + [DllImport("gdi32")] + public static extern bool DeleteEnhMetaFile(int hemfbitHandle); + } +} From 530e9a05f4caf2c3958634170b4ea80d0de05a47 Mon Sep 17 00:00:00 2001 From: Andrey Ushakov Date: Tue, 26 Apr 2016 13:57:23 +0300 Subject: [PATCH 212/254] Support base64 images in css content property --- Source/Demo/Common/HtmlRenderer.Demo.Common.csproj | 3 +++ .../Common/TestSamples/32.Image in css content.htm | 14 ++++++++++++++ Source/HtmlRenderer/Core/Dom/CssBoxImage.cs | 8 ++++++-- Source/HtmlRenderer/Core/Dom/CssBoxProperties.cs | 10 ++++++++-- Source/HtmlRenderer/Core/Parse/CssParser.cs | 14 ++++++++++++-- Source/HtmlRenderer/Core/Utils/CssUtils.cs | 5 +++++ Source/HtmlRenderer/Core/Utils/HtmlConstants.cs | 2 +- 7 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 Source/Demo/Common/TestSamples/32.Image in css content.htm diff --git a/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj b/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj index a8ffe8490..9e964a55e 100644 --- a/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj +++ b/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj @@ -155,6 +155,9 @@ + + + - foinobpjg + foinobpjg
    - fcb: j onq'p eoapl jmin leo halnbcmam ei cfri... mh qnlpll lnha ohhrrjbcf jghl + fcb: j onq'p eoapl jmin leo halnbcmam ei cfri... m´h qnlpll lnha ohhrrjbcf jghl bqcrgpk lb abp qkqo gralcp kfeildpd, dbjbj ril eppg n hfcbqd gqj fnjd &gpnp;egoppa&foaq; fn &ncon;ccrb hm rjelnn&jgkl; qhlj kpkfoe qead odr obepl ij gfk dekfm, gmo fifdf kle cnnj bpjon fgn frbcf'e haerd qfgimmkn le gfol nifmojh rrjghcqa dkac (koen hpccjmi, @@ -149,7 +149,7 @@

    - qcpciiahbq + qcpciiahbq

    - gmoorqgfcj + gmoorqgfcj
    - lqafmgjder + lqafmgjder
    - iefmkkidri + iefmkkidri
    - mlkgdjqbrb + mlkgdjqbrb
    - dafomhjllq + dafomhjllq
    - lplfhiceem + lplfhiceem
    - erkeokamgb + erkeokamgb
    - lljaghklrq + lljaghklrq
    - hgiircibcr + hgiircibcr
    - jbcmbmblrd + jbcmbmblrd
    - qicilgnpmc + qicilgnpmc
    - idgpecqqbe + idgpecqqbe
    - nalofqmbfj + nalofqmbfj
    - pnkaqjoffq + pnkaqjoffq
    - qrqrkgdcqr + qrqrkgdcqr
    - gnlikhjdnp + gnlikhjdnp
    - iabjqrghmc + iabjqrghmc
    - krccimirgr + krccimirgr
    - qdlabffkab + qdlabffkab
    @@ -1854,7 +1854,7 @@

    gekjn ofkcmr + href='https://www.google.com'>gekjn ofkcmr

    - ermkrcjhph + ermkrcjhph
    - pjlooeoecc + pjlooeoecc
    - cbmqpeodaj + cbmqpeodaj
    - kariaiqbfn + kariaiqbfn
    - fffjecboen + fffjecboen
    - ffpqbmpdrj + ffpqbmpdrj
    - fchijmeomh + fchijmeomh
    - qbaqglhbcp + qbaqglhbcp
    - kkpoghnaeg + kkpoghnaeg
    - effijocbfm + effijocbfm
    - fiicehbcam + fiicehbcam
    - adnkmldmig + adnkmldmig
    - pngfmr o bba dahbkcro ql qaralkcqojci ch addkifq mie dcobgb 2.1 aa - jjjpo, gm bp + jjjpo, gm bp qejpnprah
    - qhfkmejmp iobknjbqlqdg pp hiahqhh epb rclnqo 2.1 ff ciden gjaooda: pabjq - +
    @@ -63,7 +63,6 @@

    public DemoForm() { - SamplesLoader.Init(HtmlRenderingHelper.IsRunningOnMono() ? "Mono" : "WinForms", typeof(HtmlRender).Assembly.GetName().Version.ToString()); + SamplesLoader.Init("WinForms", typeof(HtmlRender).Assembly.GetName().Version.ToString()); InitializeComponent(); @@ -59,8 +59,8 @@ public DemoForm() LoadCustomFonts(); - _showIEViewTSSB.Enabled = !HtmlRenderingHelper.IsRunningOnMono(); - _generatePdfTSB.Enabled = !HtmlRenderingHelper.IsRunningOnMono(); + _showIEViewTSSB.Enabled = true; + _generatePdfTSB.Enabled = true; } /// @@ -145,10 +145,12 @@ private void OnGeneratePdf_Click(object sender, EventArgs e) config.SetMargins(20); var doc = PdfGenerator.GeneratePdf(_mainControl.GetHtml(), config, null, DemoUtils.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoadPdfSharp); + var tmpFile = Path.GetTempFileName(); - tmpFile = Path.GetFileNameWithoutExtension(tmpFile) + ".pdf"; - doc.Save(tmpFile); - Process.Start(tmpFile); + var pdfFile = Path.ChangeExtension(tmpFile, ".pdf"); // Preserves the full path + doc.Save(pdfFile); + + Process.Start(new ProcessStartInfo(pdfFile) { UseShellExecute = true }); } /// diff --git a/Source/Demo/WinForms/GenerateImageForm.cs b/Source/Demo/WinForms/GenerateImageForm.cs index 5f966a8f2..f4e8a4577 100644 --- a/Source/Demo/WinForms/GenerateImageForm.cs +++ b/Source/Demo/WinForms/GenerateImageForm.cs @@ -51,8 +51,8 @@ public GenerateImageForm(string html) } _textRenderingHintTSCB.SelectedItem = TextRenderingHint.AntiAlias.ToString(); - _useGdiPlusTSB.Enabled = !HtmlRenderingHelper.IsRunningOnMono(); - _backgroundColorTSB.Enabled = !HtmlRenderingHelper.IsRunningOnMono(); + _useGdiPlusTSB.Enabled = true; + _backgroundColorTSB.Enabled = true; } private void OnSaveToFile_Click(object sender, EventArgs e) @@ -103,7 +103,7 @@ private void GenerateImage() TextRenderingHint textRenderingHint = (TextRenderingHint)Enum.Parse(typeof(TextRenderingHint), _textRenderingHintTSCB.SelectedItem.ToString()); Image img; - if (_useGdiPlusTSB.Checked || HtmlRenderingHelper.IsRunningOnMono()) + if (_useGdiPlusTSB.Checked) { img = HtmlRender.RenderToImageGdiPlus(_html, _pictureBox.ClientSize, textRenderingHint, null, DemoUtils.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoad); } diff --git a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj index 3485b7573..e6b47dcc7 100644 --- a/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj +++ b/Source/Demo/WinForms/HtmlRenderer.Demo.WinForms.csproj @@ -1,14 +1,12 @@  - net462 + net8.0-windows WinExe TheArtOfDev.HtmlRenderer.Demo.WinForms HtmlRendererWinFormsDemo - publish\ true - AllRules.ruleset - false - true + true + true html.ico diff --git a/Source/Demo/WinForms/HtmlRenderingHelper.cs b/Source/Demo/WinForms/HtmlRenderingHelper.cs index 6be842af6..33b6ae5e7 100644 --- a/Source/Demo/WinForms/HtmlRenderingHelper.cs +++ b/Source/Demo/WinForms/HtmlRenderingHelper.cs @@ -32,15 +32,6 @@ internal static class HtmlRenderingHelper #endregion - - /// - /// Check if currently running in mono. - /// - public static bool IsRunningOnMono() - { - return Type.GetType("Mono.Runtime") != null; - } - /// /// Create image to be used to fill background so it will be clear that what's on top is transparent. /// diff --git a/Source/Demo/WinForms/MainControl.cs b/Source/Demo/WinForms/MainControl.cs index 696fc032c..c683e99e2 100644 --- a/Source/Demo/WinForms/MainControl.cs +++ b/Source/Demo/WinForms/MainControl.cs @@ -11,6 +11,7 @@ // "The Art of War" using System; +using System.ComponentModel; using System.Drawing; using System.Drawing.Imaging; using System.IO; @@ -72,6 +73,8 @@ public MainControl() /// /// used ignore html editor updates when updating separately /// + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool UpdateLock { get { return _updateLock; } @@ -81,6 +84,8 @@ public bool UpdateLock /// /// In IE view if to show original html or the html generated from the html control /// + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool UseGeneratedHtml { get { return _useGeneratedHtml; } @@ -186,7 +191,7 @@ private void OnSamplesTreeViewAfterSelect(object sender, TreeViewEventArgs e) { _updateLock = true; - if (!HtmlRenderingHelper.IsRunningOnMono() && e.Node.Parent.Text != PerformanceSamplesTreeNodeName) + if (e.Node.Parent.Text != PerformanceSamplesTreeNodeName) SetColoredText(sample.Html); else _htmlEditor.Text = sample.Html; diff --git a/Source/Demo/WinForms/Program.cs b/Source/Demo/WinForms/Program.cs index f01eb6d0a..cba933ec4 100644 --- a/Source/Demo/WinForms/Program.cs +++ b/Source/Demo/WinForms/Program.cs @@ -14,6 +14,7 @@ using System.Globalization; using System.IO; using System.Reflection; +using System.Text; using System.Windows.Forms; namespace TheArtOfDev.HtmlRenderer.Demo.WinForms @@ -28,6 +29,8 @@ private static void Main() { AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly; + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new DemoForm()); @@ -52,7 +55,7 @@ private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args) if (stream != null) { byte[] assemblyRawBytes = new byte[stream.Length]; - stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length); + stream.ReadExactly(assemblyRawBytes); return Assembly.Load(assemblyRawBytes); } return null; diff --git a/Source/Demo/WinForms/Properties/AssemblyInfo.cs b/Source/Demo/WinForms/Properties/AssemblyInfo.cs deleted file mode 100644 index 2719715e7..000000000 --- a/Source/Demo/WinForms/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -[assembly: AssemblyTitle("HTML Renderer WinForms Demo")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("HTML Renderer WinForms Demo")] -[assembly: AssemblyCopyright("Copyright © 2008")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. - -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM - -[assembly: Guid("3098581d-210a-4748-bcda-4b9a6b34a91a")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Source/Directory.Build.props b/Source/Directory.Build.props index 9574b2471..dfc83f317 100644 --- a/Source/Directory.Build.props +++ b/Source/Directory.Build.props @@ -1,15 +1,19 @@ - + HTML Renderer Arthur Teplitzki Arthur Teplitzki + Open source hosted on GitHub + Copyright © 2008-2025 + 1.6.0-dev + 1.6.0.0 + 1.6.0.0 README.md BSD-3-Clause https://codeplexarchive.org/project/HtmlRenderer html.png false See https://github.com/ArthurHub/HTML-Renderer/releases. - 1.6.0-dev false diff --git a/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj b/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj index 524c96343..2ff483a96 100644 --- a/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj +++ b/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj @@ -1,10 +1,11 @@  - net462 + net8.0-windows Library TheArtOfDev.HtmlRenderer.PdfSharp - false - true + true + true + true @@ -25,9 +26,6 @@ Features and Benefits: PDF document generator from HTML snippet, 100% managed (C#), High performance library using PdfSharp. - - Properties\SharedAssemblyInfo.cs - @@ -35,5 +33,6 @@ Features and Benefits: + \ No newline at end of file diff --git a/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj b/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj index 3080e1406..65d9f483f 100644 --- a/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj +++ b/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj @@ -1,11 +1,11 @@  - net462 + net8.0-windows Library TheArtOfDev.HtmlRenderer.WPF true - false - true + true + true @@ -31,9 +31,6 @@ Features and Benefits: * Extendable and configurable. Multipurpose (UI Controls / Image generation), 100% managed (C#), High performance HTML Rendering library for WPF. - - bin\Release.WPF\ - @@ -41,9 +38,6 @@ Features and Benefits: - - Properties\SharedAssemblyInfo.cs - \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs index 523870c2b..6b55d50f2 100644 --- a/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs +++ b/Source/HtmlRenderer.WinForms/Adapters/GraphicsAdapter.cs @@ -62,12 +62,10 @@ internal sealed class GraphicsAdapter : RGraphics /// private readonly bool _useGdiPlusTextRendering; -#if !MONO /// /// the initialized HDC used /// private IntPtr _hdc; -#endif /// /// if to release the graphics object on dispose @@ -107,11 +105,7 @@ public GraphicsAdapter(Graphics g, bool useGdiPlusTextRendering, bool releaseGra _g = g; _releaseGraphics = releaseGraphics; -#if MONO - _useGdiPlusTextRendering = true; -#else _useGdiPlusTextRendering = useGdiPlusTextRendering; -#endif } public override void PopClip() @@ -167,19 +161,13 @@ public override RSize MeasureString(string str, RFont font) { var height = realFont.Height; var descent = realFont.Size * realFont.FontFamily.GetCellDescent(realFont.Style) / realFont.FontFamily.GetEmHeight(realFont.Style); -#if !MONO fontAdapter.SetMetrics(height, (int)Math.Round((height - descent + .5f))); -#else - fontAdapter.SetMetrics(height, (int)Math.Round((height - descent + 1f))); -#endif - } return Utils.Convert(size); } else { -#if !MONO SetFont(font); var size = new Size(); Win32Utils.GetTextExtentPoint32(_hdc, str, str.Length, ref size); @@ -192,9 +180,6 @@ public override RSize MeasureString(string str, RFont font) } return Utils.Convert(size); -#else - throw new InvalidProgramException("Invalid Mono code"); -#endif } } @@ -220,14 +205,12 @@ public override void MeasureString(string str, RFont font, double maxWidth, out } else { -#if !MONO SetFont(font); var size = new Size(); Win32Utils.GetTextExtentExPoint(_hdc, str, str.Length, (int)Math.Round(maxWidth), _charFit, _charFitWidth, ref size); charFit = _charFit[0]; charFitWidth = charFit > 0 ? _charFitWidth[charFit - 1] : 0; -#endif } } @@ -242,7 +225,6 @@ public override void DrawString(string str, RFont font, RColor color, RPoint poi } else { -#if !MONO var pointConv = Utils.ConvertRound(point); var colorConv = Utils.Convert(color); @@ -260,7 +242,6 @@ public override void DrawString(string str, RFont font, RColor color, RPoint poi SetRtlAlignGdi(rtl); DrawTransparentText(_hdc, str, font, pointConv, Utils.ConvertRound(size), colorConv); } -#endif } } @@ -349,17 +330,14 @@ public override void DrawPolygon(RBrush brush, RPoint[] points) /// private void ReleaseHdc() { -#if !MONO if (_hdc != IntPtr.Zero) { Win32Utils.SelectClipRgn(_hdc, IntPtr.Zero); _g.ReleaseHdc(_hdc); _hdc = IntPtr.Zero; } -#endif } -#if !MONO /// /// Init HDC for the current graphics object to be used to call GDI directly. /// @@ -448,7 +426,6 @@ private static void DrawTransparentText(IntPtr hdc, string str, RFont font, Poin Win32Utils.ReleaseMemoryHdc(memoryHdc, dib); } } -#endif /// /// Change text align to Left-to-Right or Right-to-Left if required. diff --git a/Source/HtmlRenderer.WinForms/HtmlLabel.cs b/Source/HtmlRenderer.WinForms/HtmlLabel.cs index 8853490d2..283ef7360 100644 --- a/Source/HtmlRenderer.WinForms/HtmlLabel.cs +++ b/Source/HtmlRenderer.WinForms/HtmlLabel.cs @@ -295,6 +295,7 @@ public virtual bool IsContextMenuEnabled [Browsable(true)] [Description("Set base stylesheet to be used by html rendered in the control.")] [Category("Appearance")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public virtual string BaseStylesheet { @@ -487,7 +488,7 @@ protected override void OnLayout(LayoutEventArgs levent) { if (_htmlContainer != null) { - Graphics g = Utils.CreateGraphics(this); + Graphics g = CreateGraphics(); if (g != null) { using (g) @@ -788,6 +789,7 @@ public override Cursor Cursor /// Not applicable. /// [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new bool UseWaitCursor { get { return base.UseWaitCursor; } diff --git a/Source/HtmlRenderer.WinForms/HtmlPanel.cs b/Source/HtmlRenderer.WinForms/HtmlPanel.cs index ce94b0ea9..a2f061874 100644 --- a/Source/HtmlRenderer.WinForms/HtmlPanel.cs +++ b/Source/HtmlRenderer.WinForms/HtmlPanel.cs @@ -303,6 +303,7 @@ public virtual bool IsContextMenuEnabled [Browsable(true)] [Category("Appearance")] [Description("Set base stylesheet to be used by html rendered in the control.")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public virtual string BaseStylesheet { @@ -418,10 +419,8 @@ public void ClearSelection() _htmlContainer.ClearSelection(); } - #region Private methods -#if !MONO /// /// Override to support border for the control. /// @@ -445,7 +444,6 @@ protected override CreateParams CreateParams return createParams; } } -#endif /// /// Perform the layout of the html in the control. @@ -473,7 +471,7 @@ protected void PerformHtmlLayout() { _htmlContainer.MaxSize = new SizeF(ClientSize.Width - Padding.Horizontal, 0); - Graphics g = Utils.CreateGraphics(this); + Graphics g = CreateGraphics(); if (g != null) { using (g) @@ -482,7 +480,6 @@ protected void PerformHtmlLayout() } } - AutoScrollMinSize = Size.Round(new SizeF(_htmlContainer.ActualSize.Width + Padding.Horizontal, _htmlContainer.ActualSize.Height)); } } @@ -708,15 +705,12 @@ protected virtual void InvokeMouseMove() { try { - // mono has issue throwing exception for no reason var mp = PointToClient(MousePosition); _htmlContainer.HandleMouseMove(this, new MouseEventArgs(MouseButtons.None, 0, mp.X, mp.Y, 0)); } catch { -#if !MONO throw; -#endif } } @@ -741,7 +735,6 @@ protected override bool IsInputKey(Keys keyData) return base.IsInputKey(keyData); } -#if !MONO /// /// Override the proc processing method to set OS specific hand cursor. /// @@ -765,7 +758,6 @@ protected override void WndProc(ref Message m) } base.WndProc(ref m); } -#endif /// /// Release the html container resources. @@ -890,6 +882,7 @@ public override Cursor Cursor /// Not applicable. /// [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new bool UseWaitCursor { get { return base.UseWaitCursor; } diff --git a/Source/HtmlRenderer.WinForms/HtmlRender.cs b/Source/HtmlRenderer.WinForms/HtmlRender.cs index b7e24d81e..ca0f44532 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRender.cs +++ b/Source/HtmlRenderer.WinForms/HtmlRender.cs @@ -134,7 +134,6 @@ public static CssData ParseStyleSheet(string stylesheet, bool combineWithDefault return CssData.Parse(WinFormsAdapter.Instance, stylesheet, combineWithDefault); } -#if !MONO /// /// Measure the size (width and height) required to draw the given html under given max width restriction.
    /// If no max width restriction is given the layout will use the maximum possible width required by the content, @@ -154,7 +153,6 @@ public static SizeF Measure(Graphics g, string html, float maxWidth = 0, CssData ArgChecker.AssertArgNotNull(g, "g"); return Measure(g, html, maxWidth, cssData, false, stylesheetLoad, imageLoad); } -#endif /// /// Measure the size (width and height) required to draw the given html under given max width restriction.
    @@ -176,7 +174,6 @@ public static SizeF MeasureGdiPlus(Graphics g, string html, float maxWidth = 0, return Measure(g, html, maxWidth, cssData, true, stylesheetLoad, imageLoad); } -#if !MONO /// /// Renders the specified HTML source on the specified location and max width restriction.
    /// Use GDI text rendering, note has no effect.
    @@ -223,7 +220,6 @@ public static SizeF Render(Graphics g, string html, PointF location, SizeF maxSi ArgChecker.AssertArgNotNull(g, "g"); return RenderClip(g, html, location, maxSize, cssData, false, stylesheetLoad, imageLoad); } -#endif /// /// Renders the specified HTML source on the specified location and max size restriction.
    @@ -272,8 +268,6 @@ public static SizeF RenderGdiPlus(Graphics g, string html, PointF location, Size return RenderClip(g, html, location, maxSize, cssData, true, stylesheetLoad, imageLoad); } -#if !MONO - public static Metafile RenderToMetafile(string html, float left = 0, float top = 0, float maxWidth = 0, CssData cssData = null, EventHandler stylesheetLoad = null, EventHandler imageLoad = null) { @@ -511,7 +505,6 @@ public static void RenderToImage(Image image, string html, PointF location, Size return image; } } -#endif /// /// Renders the specified HTML into a new image of the requested size.
    @@ -764,7 +757,6 @@ private static SizeF RenderHtml(Graphics g, string html, PointF location, SizeF return actualSize; } -#if !MONO /// /// Copy all the bitmap bits from memory bitmap buffer to the given image. /// @@ -779,7 +771,6 @@ private static void CopyBufferToImage(IntPtr memoryHdc, Image image) imageGraphics.ReleaseHdc(imgHdc); } } -#endif #endregion } diff --git a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj index 2e6c9dbf4..51aec7512 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj +++ b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj @@ -1,12 +1,11 @@  - net462 + net8.0-windows Library TheArtOfDev.HtmlRenderer.WinForms - publish\ true - false - true + true + true @@ -31,18 +30,7 @@ Features and Benefits: * Extendable and configurable. Multipurpose (UI Controls / Image generation), 100% managed (C#), High performance HTML Rendering library for WinForms. - - bin\Debug\ - AllRules.ruleset - - - bin\Release\ - AllRules.ruleset - - - Properties\SharedAssemblyInfo.cs - Component diff --git a/Source/HtmlRenderer.WinForms/HtmlToolTip.cs b/Source/HtmlRenderer.WinForms/HtmlToolTip.cs index 40d7ab6ca..2a82209bd 100644 --- a/Source/HtmlRenderer.WinForms/HtmlToolTip.cs +++ b/Source/HtmlRenderer.WinForms/HtmlToolTip.cs @@ -53,8 +53,6 @@ public class HtmlToolTip : ToolTip ///
    private string _tooltipCssClass = "htmltooltip"; -#if !MONO - /// /// the control that the tooltip is currently showing on.
    /// Used for link handling. @@ -79,7 +77,6 @@ public class HtmlToolTip : ToolTip /// if clicked the event will be raised although the tooltip will be closed. ///
    private bool _allowLinksHandling = true; -#endif #endregion @@ -104,22 +101,18 @@ public HtmlToolTip() Draw += OnToolTipDraw; Disposed += OnToolTipDisposed; -#if !MONO _linkHandlingTimer = new Timer(); _linkHandlingTimer.Tick += OnLinkHandlingTimerTick; _linkHandlingTimer.Interval = 40; _htmlContainer.LinkClicked += OnLinkClicked; -#endif } -#if !MONO /// /// Raised when the user clicks on a link in the html.
    /// Allows canceling the execution of the link. ///
    public event EventHandler LinkClicked; -#endif /// /// Raised when an error occurred during html rendering.
    @@ -181,6 +174,7 @@ public TextRenderingHint TextRenderingHint [Browsable(true)] [Description("Set base stylesheet to be used by html rendered in the tooltip.")] [Category("Appearance")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public virtual string BaseStylesheet { @@ -200,13 +194,13 @@ public virtual string BaseStylesheet [Browsable(true)] [Description("The CSS class used for tooltip html root div.")] [Category("Appearance")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public virtual string TooltipCssClass { get { return _tooltipCssClass; } set { _tooltipCssClass = value; } } -#if !MONO /// /// If to handle links in the tooltip (default: false).
    /// When set to true the mouse pointer will change to hand when hovering over a tooltip and @@ -221,7 +215,6 @@ public virtual bool AllowLinksHandling get { return _allowLinksHandling; } set { _allowLinksHandling = value; } } -#endif /// /// Gets or sets the max size the tooltip. @@ -230,6 +223,7 @@ public virtual bool AllowLinksHandling [Browsable(true)] [Category("Layout")] [Description("Restrict the max size of the shown tooltip (0 is not restricted)")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public virtual Size MaximumSize { get { return Size.Round(_htmlContainer.MaxSize); } @@ -262,14 +256,12 @@ protected virtual void OnToolTipPopup(PopupEventArgs e) var desiredHeight = (int)Math.Ceiling(MaximumSize.Height > 0 ? Math.Min(_htmlContainer.ActualSize.Height, MaximumSize.Height) : _htmlContainer.ActualSize.Height); e.ToolTipSize = new Size(desiredWidth, desiredHeight); -#if !MONO // start mouse handle timer if (_allowLinksHandling) { _associatedControl = e.AssociatedControl; _linkHandlingTimer.Start(); } -#endif } /// @@ -277,7 +269,6 @@ protected virtual void OnToolTipPopup(PopupEventArgs e) /// protected virtual void OnToolTipDraw(DrawToolTipEventArgs e) { -#if !MONO if (_tooltipHandle == IntPtr.Zero) { // get the handle of the tooltip window using the graphics device context @@ -287,7 +278,6 @@ protected virtual void OnToolTipDraw(DrawToolTipEventArgs e) AdjustTooltipPosition(e.AssociatedControl, e.Bounds.Size); } -#endif e.Graphics.Clear(Color.White); e.Graphics.TextRenderingHint = _textRenderingHint; @@ -313,13 +303,10 @@ protected virtual void AdjustTooltipPosition(Control associatedControl, Size siz if (mousePos.Y + size.Height + yOffset > screenBounds.Bottom) mousePos.Y = Math.Max(screenBounds.Bottom - size.Height - yOffset - 3, screenBounds.Top + 2); -#if !MONO // move the tooltip window to new location Win32Utils.MoveWindow(_tooltipHandle, mousePos.X, mousePos.Y + yOffset, size.Width, size.Height, false); -#endif } -#if !MONO /// /// Propagate the LinkClicked event from root container. /// @@ -329,7 +316,6 @@ protected virtual void OnLinkClicked(HtmlLinkClickedEventArgs e) if (handler != null) handler(this, e); } -#endif /// /// Propagate the Render Error event from root container. @@ -361,7 +347,6 @@ protected virtual void OnImageLoad(HtmlImageLoadEventArgs e) handler(this, e); } -#if !MONO /// /// Raised on link handling timer tick, used for: /// 1. Know when the tooltip is hidden by checking the visibility of the tooltip window. @@ -407,7 +392,6 @@ protected virtual void OnLinkHandlingTimerTick(EventArgs e) OnRenderError(this, new HtmlRenderErrorEventArgs(HtmlRenderErrorType.General, "Error in link handling for tooltip", ex)); } } -#endif /// /// Unsubscribe from events and dispose of . @@ -427,7 +411,6 @@ protected virtual void OnToolTipDisposed(EventArgs e) _htmlContainer = null; } -#if !MONO if (_linkHandlingTimer != null) { _linkHandlingTimer.Dispose(); @@ -436,7 +419,6 @@ protected virtual void OnToolTipDisposed(EventArgs e) if (_htmlContainer != null) _htmlContainer.LinkClicked -= OnLinkClicked; } -#endif } @@ -466,7 +448,6 @@ private void OnImageLoad(object sender, HtmlImageLoadEventArgs e) OnImageLoad(e); } -#if !MONO private void OnLinkClicked(object sender, HtmlLinkClickedEventArgs e) { OnLinkClicked(e); @@ -475,7 +456,6 @@ private void OnLinkHandlingTimerTick(object sender, EventArgs e) { OnLinkHandlingTimerTick(e); } -#endif private void OnToolTipDisposed(object sender, EventArgs e) { diff --git a/Source/HtmlRenderer.WinForms/Utilities/Utils.cs b/Source/HtmlRenderer.WinForms/Utilities/Utils.cs index 9f25b6045..026102976 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/Utils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/Utils.cs @@ -12,7 +12,6 @@ using System; using System.Drawing; -using System.Windows.Forms; using TheArtOfDev.HtmlRenderer.Adapters.Entities; namespace TheArtOfDev.HtmlRenderer.WinForms.Utilities @@ -120,26 +119,5 @@ public static Color Convert(RColor c) { return Color.FromArgb(c.A, c.R, c.G, c.B); } - - /// - /// mono has issue throwing exception for no reason. - /// - /// the control to create graphics object from - /// new graphics object or null in mono if failed - public static Graphics CreateGraphics(Control control) - { -#if MONO - try - { - return control.CreateGraphics(); - } - catch - { - return null; - } -#else - return control.CreateGraphics(); -#endif - } } } \ No newline at end of file diff --git a/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs b/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs index 33dddd53f..228e47658 100644 --- a/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs +++ b/Source/HtmlRenderer.WinForms/Utilities/Win32Utils.cs @@ -10,7 +10,6 @@ // - Sun Tsu, // "The Art of War" -#if !MONO using System; using System.Drawing; using System.Runtime.InteropServices; @@ -248,5 +247,4 @@ internal struct TextMetric public byte tmPitchAndFamily; public byte tmCharSet; } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/Source/HtmlRenderer.sln b/Source/HtmlRenderer.sln index 92aea3d46..c6594f4d7 100644 --- a/Source/HtmlRenderer.sln +++ b/Source/HtmlRenderer.sln @@ -1,23 +1,23 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 -VisualStudioVersion = 18.1.11312.151 d18.0 +VisualStudioVersion = 18.1.11312.151 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demo", "Demo", "{E263EA16-2E6A-4269-A319-AA2F97ADA8E1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.Demo.Common", "Demo\Common\HtmlRenderer.Demo.Common.csproj", "{2390B71F-9400-47F4-B23A-7F2649C87D35}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HtmlRenderer.Demo.Common", "Demo\Common\HtmlRenderer.Demo.Common.csproj", "{2390B71F-9400-47F4-B23A-7F2649C87D35}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.Demo.WinForms", "Demo\WinForms\HtmlRenderer.Demo.WinForms.csproj", "{8AD34FE8-8382-4A8A-B3AA-A0392ED42423}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HtmlRenderer.Demo.WinForms", "Demo\WinForms\HtmlRenderer.Demo.WinForms.csproj", "{8AD34FE8-8382-4A8A-B3AA-A0392ED42423}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.Demo.WPF", "Demo\WPF\HtmlRenderer.Demo.WPF.csproj", "{F02E0216-4AE3-474F-9381-FCB93411CDB0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HtmlRenderer.Demo.WPF", "Demo\WPF\HtmlRenderer.Demo.WPF.csproj", "{F02E0216-4AE3-474F-9381-FCB93411CDB0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.WinForms", "HtmlRenderer.WinForms\HtmlRenderer.WinForms.csproj", "{1B058920-24B4-4140-8AE7-C8C6C38CA52D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HtmlRenderer.WinForms", "HtmlRenderer.WinForms\HtmlRenderer.WinForms.csproj", "{1B058920-24B4-4140-8AE7-C8C6C38CA52D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.WPF", "HtmlRenderer.WPF\HtmlRenderer.WPF.csproj", "{7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HtmlRenderer.WPF", "HtmlRenderer.WPF\HtmlRenderer.WPF.csproj", "{7E4E8DB5-85AD-4388-BDCB-38C6F423B8B0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer", "HtmlRenderer\HtmlRenderer.csproj", "{FE611685-391F-4E3E-B27E-D3150E51E49B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HtmlRenderer", "HtmlRenderer\HtmlRenderer.csproj", "{FE611685-391F-4E3E-B27E-D3150E51E49B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlRenderer.PdfSharp", "HtmlRenderer.PdfSharp\HtmlRenderer.PdfSharp.csproj", "{CA249F5D-9285-40A6-B217-5889EF79FD7E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HtmlRenderer.PdfSharp", "HtmlRenderer.PdfSharp\HtmlRenderer.PdfSharp.csproj", "{CA249F5D-9285-40A6-B217-5889EF79FD7E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -108,4 +108,7 @@ Global {8AD34FE8-8382-4A8A-B3AA-A0392ED42423} = {E263EA16-2E6A-4269-A319-AA2F97ADA8E1} {F02E0216-4AE3-474F-9381-FCB93411CDB0} = {E263EA16-2E6A-4269-A319-AA2F97ADA8E1} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {902788D6-3165-491D-B860-DF2F74E66C1D} + EndGlobalSection EndGlobal diff --git a/Source/HtmlRenderer/HtmlRenderer.csproj b/Source/HtmlRenderer/HtmlRenderer.csproj index b8576e129..273dcccf8 100644 --- a/Source/HtmlRenderer/HtmlRenderer.csproj +++ b/Source/HtmlRenderer/HtmlRenderer.csproj @@ -1,34 +1,31 @@  - net462 + netstandard2.0;net8.0 Library TheArtOfDev.HtmlRenderer - false - true + true + true HtmlRenderer.Core HTML Renderer Core html render renderer draw core - Cross framework (WinForms/WPF/PDF/Metro/Mono/etc.), Multipurpose (UI Controls / Image generation / PDF generation / etc.), 100% managed (C#), High performance HTML Rendering library. + Cross framework (WinForms/WPF/PDF/Metro/etc.), Multipurpose (UI Controls / Image generation / PDF generation / etc.), 100% managed (C#), High performance HTML Rendering library. The Core assembly of HTML Renderer does not bound to any rendering framework (WinForms/WPF/PDF/etc.). Can be used to create framework specific renderer using adapter extensibility object model. For existing implementations see: HtmlRenderer.WinForms, HtmlRenderer.WPF and HtmlRenderer.PdfSharp. - Cross framework (WinForms/WPF/PDF/Metro/Mono/etc.), Multipurpose (UI Controls / Image generation / PDF generation / etc.), 100% managed (C#), High performance HTML Rendering library. + Cross framework (WinForms/WPF/PDF/Metro/etc.), Multipurpose (UI Controls / Image generation / PDF generation / etc.), 100% managed (C#), High performance HTML Rendering library. - - Properties\SharedAssemblyInfo.cs - - + \ No newline at end of file diff --git a/Source/SharedAssemblyInfo.cs b/Source/SharedAssemblyInfo.cs deleted file mode 100644 index 64944c19b..000000000 --- a/Source/SharedAssemblyInfo.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -[assembly: AssemblyTitle("HTML Renderer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Open source hosted on GitHub")] -[assembly: AssemblyProduct("HTML Renderer")] -[assembly: AssemblyCopyright("Copyright © 2008-2025")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. - -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM - -[assembly: Guid("ec8a9e7e-9a9d-43c3-aa97-f6f505b1d3ed")] - -// Version information for an assembly consists of the following four values: - -[assembly: AssemblyVersion("1.6.0.0")] \ No newline at end of file From 007d47f83fd8666e1d1a868b99c12b9371306858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= Date: Mon, 20 Jul 2026 21:19:34 +0200 Subject: [PATCH 253/254] Update .NET dependencies --- .gitignore | 3 +++ Source/Demo/Common/HtmlRenderer.Demo.Common.csproj | 2 +- Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj | 2 +- Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index ec0fb2754..aa314ccc9 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,9 @@ # mstest test results TestResults +# Rider +.idea/ + ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. diff --git a/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj b/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj index b2b829640..50a40252b 100644 --- a/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj +++ b/Source/Demo/Common/HtmlRenderer.Demo.Common.csproj @@ -92,7 +92,7 @@ - + diff --git a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj index 1cb8cb67f..3f48b0da1 100644 --- a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj +++ b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj @@ -26,6 +26,6 @@ - + \ No newline at end of file diff --git a/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj b/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj index 2ff483a96..e2c036703 100644 --- a/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj +++ b/Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj @@ -33,6 +33,6 @@ Features and Benefits: - + \ No newline at end of file From 2283fc50086a3a224d92913d9af7edbfe71a8f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20D=C3=BCrrenberger?= Date: Mon, 20 Jul 2026 21:20:46 +0200 Subject: [PATCH 254/254] Update GitHub Actions versions --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a76991f76..1aa5789c0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,7 @@ jobs: fail-fast: false matrix: platform: - - { name: Windows x64, os: windows-2025 } + - { name: Windows x64, os: windows-2025-vs2026 } - { name: Ubuntu x64, os: ubuntu-24.04 } - { name: macOS arm64, os: macos-15 } dotnet: @@ -33,11 +33,11 @@ jobs: steps: - name: Checkout HTML Renderer - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Setup .NET ${{ matrix.dotnet.version }} SDK id: setup-dotnet - uses: actions/setup-dotnet@v5 + uses: actions/setup-dotnet@v6 with: dotnet-version: ${{ matrix.dotnet.version }} - name: Enforce SDK Version @@ -64,7 +64,7 @@ jobs: run: dotnet pack Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj --configuration Release --include-symbols -p:SymbolPackageFormat=snupkg --no-build --verbosity normal --output ${{ env.NuGetDirectory }} - name: Upload NuGet package artifacts - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v7 with: name: "HTML Renderer (${{ matrix.platform.name }} ${{ matrix.dotnet.name }})" path: ${{ env.NuGetDirectory }}/*.*nupkg