diff --git a/Greenshot.sln b/Greenshot.sln index 4df8e0341..6b3723f7a 100644 --- a/Greenshot.sln +++ b/Greenshot.sln @@ -4,6 +4,21 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 16.0.29728.190 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Greenshot", "Greenshot\Greenshot.csproj", "{CD642BF4-D815-4D67-A0B5-C69F0B8231AF}" + ProjectSection(ProjectDependencies) = postProject + {92599C09-FF29-4ABD-B6E6-C48ECD781BAB} = {92599C09-FF29-4ABD-B6E6-C48ECD781BAB} + {19FEEF09-313F-43C7-819D-F1BCA782B08B} = {19FEEF09-313F-43C7-819D-F1BCA782B08B} + {9801F62C-540F-4BFE-9211-6405DEDE563B} = {9801F62C-540F-4BFE-9211-6405DEDE563B} + {9C0ECC4C-7807-4111-916A-4F57BB29788A} = {9C0ECC4C-7807-4111-916A-4F57BB29788A} + {C3052651-598A-44E2-AAB3-2E41311D50F9} = {C3052651-598A-44E2-AAB3-2E41311D50F9} + {7EC72A5A-D73A-4B4B-9CA1-2216C7D92D5E} = {7EC72A5A-D73A-4B4B-9CA1-2216C7D92D5E} + {697CF066-9077-4F22-99D9-D989CCE7282B} = {697CF066-9077-4F22-99D9-D989CCE7282B} + {47F23C86-604E-4CC3-8767-B3D4088F30BB} = {47F23C86-604E-4CC3-8767-B3D4088F30BB} + {80D8DEB9-94E3-4876-8CCA-2DF1ED5F2C50} = {80D8DEB9-94E3-4876-8CCA-2DF1ED5F2C50} + {D61E6ECE-E0B6-4467-B492-F08A06BA8F02} = {D61E6ECE-E0B6-4467-B492-F08A06BA8F02} + {AD7CFFE2-40E7-46CF-A172-D48CF7AE9A12} = {AD7CFFE2-40E7-46CF-A172-D48CF7AE9A12} + {1893A2E4-A78A-4713-A8E7-E70058DABEE0} = {1893A2E4-A78A-4713-A8E7-E70058DABEE0} + {C6988EE8-2FEE-4349-9F09-F9628A0D8965} = {C6988EE8-2FEE-4349-9F09-F9628A0D8965} + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GreenshotPlugin", "GreenshotPlugin\GreenshotPlugin.csproj", "{5B924697-4DCD-4F98-85F1-105CB84B7341}" EndProject diff --git a/Greenshot/Drawing/DrawableContainer.cs b/Greenshot/Drawing/DrawableContainer.cs index 1da19cb56..ffa2a1f57 100644 --- a/Greenshot/Drawing/DrawableContainer.cs +++ b/Greenshot/Drawing/DrawableContainer.cs @@ -1,20 +1,20 @@ /* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2020 Thomas Braun, Jens Klingen, Robin Krom - * + * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 1 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -102,7 +102,7 @@ namespace Greenshot.Drawing add { _propertyChanged += value; } remove{ _propertyChanged -= value; } } - + public IList Filters { get { List ret = new List(); @@ -114,7 +114,7 @@ namespace Greenshot.Drawing return ret; } } - + [NonSerialized] internal Surface _parent; public ISurface Parent { @@ -139,7 +139,7 @@ namespace Greenshot.Drawing OnPropertyChanged("Selected"); } } - + [NonSerialized] private EditStatus _status = EditStatus.UNDRAWN; public EditStatus Status { @@ -151,7 +151,7 @@ namespace Greenshot.Drawing } } - + private int left; public int Left { get { return left; } @@ -162,7 +162,7 @@ namespace Greenshot.Drawing left = value; } } - + private int top; public int Top { get { return top; } @@ -173,7 +173,7 @@ namespace Greenshot.Drawing top = value; } } - + private int width; public int Width { get { return width; } @@ -184,7 +184,7 @@ namespace Greenshot.Drawing width = value; } } - + private int height; public int Height { get { return height; } @@ -195,7 +195,7 @@ namespace Greenshot.Drawing height = value; } } - + public Point Location { get { return new Point(left, top); @@ -232,11 +232,11 @@ namespace Greenshot.Drawing [NonSerialized] // will store current bounds of this DrawableContainer before starting a resize protected Rectangle _boundsBeforeResize = Rectangle.Empty; - + [NonSerialized] // "workbench" rectangle - used for calculating bounds during resizing (to be applied to this DrawableContainer afterwards) protected RectangleF _boundsAfterResize = RectangleF.Empty; - + public Rectangle Bounds { get { return GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); } set { @@ -246,14 +246,14 @@ namespace Greenshot.Drawing Height = Round(value.Height); } } - + public virtual void ApplyBounds(RectangleF newBounds) { Left = Round(newBounds.Left); Top = Round(newBounds.Top); Width = Round(newBounds.Width); Height = Round(newBounds.Height); } - + public DrawableContainer(Surface parent) { InitializeFields(); _parent = parent; @@ -262,17 +262,17 @@ namespace Greenshot.Drawing public void Add(IFilter filter) { AddChild(filter); } - + public void Remove(IFilter filter) { RemoveChild(filter); } - + private static int Round(float f) { if(float.IsPositiveInfinity(f) || f>int.MaxValue/2) return int.MaxValue/2; if (float.IsNegativeInfinity(f) || f @@ -369,7 +369,7 @@ namespace Greenshot.Drawing } public abstract void Draw(Graphics graphics, RenderMode renderMode); - + public virtual void DrawContent(Graphics graphics, Bitmap bmp, RenderMode renderMode, Rectangle clipRectangle) { if (Children.Count > 0) { if (Status != EditStatus.IDLE) { @@ -392,22 +392,22 @@ namespace Greenshot.Drawing } } } - + } } Draw(graphics, renderMode); } - + public virtual bool Contains(int x, int y) { return Bounds.Contains(x , y); } - + public virtual bool ClickableAt(int x, int y) { Rectangle r = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); r.Inflate(5, 5); return r.Contains(x, y); } - + protected void DrawSelectionBorder(Graphics g, Rectangle rect) { using Pen pen = new Pen(Color.MediumSeaGreen) @@ -417,7 +417,7 @@ namespace Greenshot.Drawing }; g.DrawRectangle(pen, rect); } - + public void ResizeTo(int width, int height, int anchorPosition) { Width = width; @@ -431,12 +431,12 @@ namespace Greenshot.Drawing public void MakeBoundsChangeUndoable(bool allowMerge) { _parent.MakeUndoable(new DrawableContainerBoundsChangeMemento(this), allowMerge); } - + public void MoveBy(int dx, int dy) { Left += dx; Top += dy; } - + /// /// A handler for the MouseDown, used if you don't want the surface to handle this for you /// @@ -457,22 +457,22 @@ namespace Greenshot.Drawing /// true if the event is handled, false if the surface needs to handle it public virtual bool HandleMouseMove(int x, int y) { Invalidate(); - + // reset "workrbench" rectangle to current bounds _boundsAfterResize.X = _boundsBeforeResize.Left; _boundsAfterResize.Y = _boundsBeforeResize.Top; _boundsAfterResize.Width = x - _boundsAfterResize.Left; _boundsAfterResize.Height = y - _boundsAfterResize.Top; - + ScaleHelper.Scale(_boundsBeforeResize, x, y, ref _boundsAfterResize, GetAngleRoundProcessor()); - + // apply scaled bounds to this DrawableContainer ApplyBounds(_boundsAfterResize); - + Invalidate(); return true; } - + /// /// A handler for the MouseUp /// @@ -480,7 +480,7 @@ namespace Greenshot.Drawing /// current mouse y public virtual void HandleMouseUp(int x, int y) { } - + protected virtual void SwitchParent(Surface newParent) { if (newParent == Parent) { @@ -493,14 +493,14 @@ namespace Greenshot.Drawing filter.Parent = this; } } - + protected void OnPropertyChanged(string propertyName) { if (_propertyChanged != null) { _propertyChanged(this, new PropertyChangedEventArgs(propertyName)); Invalidate(); } } - + /// /// This method will be called before a field is changes. /// Using this makes it possible to invalidate the object as is before changing. @@ -511,7 +511,7 @@ namespace Greenshot.Drawing _parent?.MakeUndoable(new ChangeFieldHolderMemento(this, fieldToBeChanged), true); Invalidate(); } - + /// /// Handle the field changed event, this should invalidate the correct bounds (e.g. when shadow comes or goes more pixels!) /// @@ -581,7 +581,7 @@ namespace Greenshot.Drawing protected virtual ScaleHelper.IDoubleProcessor GetAngleRoundProcessor() { return ScaleHelper.ShapeAngleRoundBehavior.Instance; } - + public virtual bool HasContextMenu { get { return true; diff --git a/Greenshot/Drawing/RectangleContainer.cs b/Greenshot/Drawing/RectangleContainer.cs index 63ea2e2cb..f2bce3f4f 100644 --- a/Greenshot/Drawing/RectangleContainer.cs +++ b/Greenshot/Drawing/RectangleContainer.cs @@ -1,20 +1,20 @@ /* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2020 Thomas Braun, Jens Klingen, Robin Krom - * + * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 1 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -31,7 +31,7 @@ namespace Greenshot.Drawing { /// /// Represents a rectangular shape on the Surface /// - [Serializable] + [Serializable] public class RectangleContainer : DrawableContainer { public RectangleContainer(Surface parent) : base(parent) { @@ -59,7 +59,7 @@ namespace Greenshot.Drawing { AddField(GetType(), FieldType.FILL_COLOR, Color.Transparent); AddField(GetType(), FieldType.SHADOW, true); } - + public override void Draw(Graphics graphics, RenderMode rm) { int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR, Color.Red); diff --git a/Greenshot/Forms/MainForm.cs b/Greenshot/Forms/MainForm.cs index 6e135ea23..7a5aaf748 100644 --- a/Greenshot/Forms/MainForm.cs +++ b/Greenshot/Forms/MainForm.cs @@ -1,20 +1,20 @@ /* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2020 Thomas Braun, Jens Klingen, Robin Krom - * + * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 1 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -45,6 +45,7 @@ using Greenshot.Destinations; using Greenshot.Drawing; using log4net; using Timer = System.Timers.Timer; +using System.Threading.Tasks; namespace Greenshot { /// @@ -61,7 +62,7 @@ namespace Greenshot { // Set the Thread name, is better than "1" Thread.CurrentThread.Name = Application.ProductName; - + // Init Log4NET LogFileLocation = LogHelper.InitializeLog4Net(); // Get logger @@ -70,6 +71,8 @@ namespace Greenshot { Application.ThreadException += Application_ThreadException; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + TaskScheduler.UnobservedTaskException += Task_UnhandledException; + // Initialize the IniConfig IniConfig.Init(); @@ -140,7 +143,7 @@ namespace Greenshot { FreeMutex(); return; } - + if (argument.ToLower().Equals("/exit")) { // unregister application on uninstall (allow uninstall) try { @@ -153,7 +156,7 @@ namespace Greenshot { FreeMutex(); return; } - + // Reload the configuration if (argument.ToLower().Equals("/reload")) { // Modify configuration @@ -163,14 +166,14 @@ namespace Greenshot { FreeMutex(); return; } - + // Stop running if (argument.ToLower().Equals("/norun")) { // Make an exit possible FreeMutex(); return; } - + // Language if (argument.ToLower().Equals("/language")) { _conf.Language = arguments[++argumentNr]; @@ -302,7 +305,7 @@ namespace Greenshot { public static MainForm Instance => _instance; private readonly CopyData _copyData; - + // Thumbnail preview private ThumbnailForm _thumbnailForm; // Make sure we have only one settings form @@ -338,16 +341,16 @@ namespace Greenshot { // Make sure all hotkeys pass this window! HotkeyControl.RegisterHotkeyHwnd(Handle); RegisterHotkeys(); - + new ToolTip(); - + UpdateUi(); - + // This forces the registration of all destinations inside Greenshot itself. DestinationHelper.GetAllDestinations(); // This forces the registration of all processors inside Greenshot itself. ProcessorHelper.GetAllProcessors(); - + // Load all the plugins PluginHelper.Instance.LoadPlugins(); @@ -386,7 +389,7 @@ namespace Greenshot { // Assign the handle: _copyData.AssignHandle(Handle); // Create the channel to send on: - _copyData.Channels.Add("Greenshot"); + _copyData.Channels.Add("Greenshot"); // Hook up received event: _copyData.CopyDataReceived += CopyDataDataReceived; @@ -474,7 +477,7 @@ namespace Greenshot { } } } - + /// /// Main context menu /// @@ -631,7 +634,7 @@ namespace Greenshot { } /// - /// Displays a dialog for the user to choose how to handle hotkey registration failures: + /// Displays a dialog for the user to choose how to handle hotkey registration failures: /// retry (allowing to shut down the conflicting application before), /// ignore (not registering the conflicting hotkey and resetting the respective config to "None", i.e. not trying to register it again on next startup) /// abort (do nothing about it) @@ -759,7 +762,7 @@ namespace Greenshot { contextmenu_capturewindowfromlist.DropDownItems.Clear(); CleanupThumbnail(); } - + /// /// Build a selectable list of IE tabs when we enter the menu item /// @@ -774,7 +777,7 @@ namespace Greenshot { contextmenu_captureie.Enabled = true; contextmenu_captureiefromlist.Enabled = true; Dictionary counter = new Dictionary(); - + foreach(KeyValuePair tabData in tabs) { string title = tabData.Value; if (title == null) { @@ -805,7 +808,7 @@ namespace Greenshot { } /// - /// MultiScreenDropDownOpening is called when mouse hovers over the Capture-Screen context menu + /// MultiScreenDropDownOpening is called when mouse hovers over the Capture-Screen context menu /// /// /// @@ -847,7 +850,7 @@ namespace Greenshot { } /// - /// MultiScreenDropDownOpening is called when mouse leaves the context menu + /// MultiScreenDropDownOpening is called when mouse leaves the context menu /// /// /// @@ -855,7 +858,7 @@ namespace Greenshot { ToolStripMenuItem captureScreenMenuItem = (ToolStripMenuItem)sender; captureScreenMenuItem.DropDownItems.Clear(); } - + /// /// Build a selectable list of windows when we enter the menu item /// @@ -866,11 +869,11 @@ namespace Greenshot { ToolStripMenuItem captureWindowFromListMenuItem = (ToolStripMenuItem)sender; AddCaptureWindowMenuItems(captureWindowFromListMenuItem, Contextmenu_capturewindowfromlist_Click); } - + private void CaptureWindowFromListMenuDropDownClosed(object sender, EventArgs e) { CleanupThumbnail(); } - + private void ShowThumbnailOnEnter(object sender, EventArgs e) { if (!(sender is ToolStripMenuItem captureWindowItem)) return; WindowDetails window = captureWindowItem.Tag as WindowDetails; @@ -884,7 +887,7 @@ namespace Greenshot { { _thumbnailForm?.Hide(); } - + private void CleanupThumbnail() { if (_thumbnailForm == null) { @@ -1002,7 +1005,7 @@ namespace Greenshot { Process.Start("http://getgreenshot.org/support/?version=" + Assembly.GetEntryAssembly().GetName().Version); }); } - + /// /// Context menu entry "Preferences" /// @@ -1011,7 +1014,7 @@ namespace Greenshot { private void Contextmenu_settingsClick(object sender, EventArgs e) { BeginInvoke((MethodInvoker)ShowSetting); } - + /// /// This is called indirectly from the context menu "Preferences" /// @@ -1030,7 +1033,7 @@ namespace Greenshot { } } } - + /// /// The "About Greenshot" entry is clicked /// @@ -1053,7 +1056,7 @@ namespace Greenshot { } } } - + /// /// The "Help" entry is clicked /// @@ -1062,7 +1065,7 @@ namespace Greenshot { private void Contextmenu_helpClick(object sender, EventArgs e) { HelpFileLoader.LoadHelp(); } - + /// /// The "Exit" entry is clicked /// @@ -1077,7 +1080,7 @@ namespace Greenshot { _conf.CaptureMousepointer = captureMouseItem.Checked; } } - + /// /// This needs to be called to initialize the quick settings menu entries /// @@ -1217,6 +1220,20 @@ namespace Greenshot { InitializeQuickSettingsMenu(); } + private static void Task_UnhandledException(object sender, UnobservedTaskExceptionEventArgs args) + { + try { + Exception exceptionToLog = args.Exception; + string exceptionText = EnvironmentInfo.BuildReport(exceptionToLog); + LOG.Error("Exception caught in the UnobservedTaskException handler."); + LOG.Error(exceptionText); + new BugReportForm(exceptionText).ShowDialog(); + } + finally { + args.SetObserved(); + } + } + private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Exception exceptionToLog = e.ExceptionObject as Exception; string exceptionText = EnvironmentInfo.BuildReport(exceptionToLog); @@ -1229,7 +1246,7 @@ namespace Greenshot { } new BugReportForm(exceptionText).ShowDialog(); } - + private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { Exception exceptionToLog = e.Exception; string exceptionText = EnvironmentInfo.BuildReport(exceptionToLog); @@ -1357,7 +1374,7 @@ namespace Greenshot { MessageBox.Show(this, ex.Message, "Opening " + path, MessageBoxButtons.OK, MessageBoxIcon.Error); } } - + /// /// Shutdown / cleanup /// @@ -1380,21 +1397,21 @@ namespace Greenshot { LOG.Error("Error closing form!", e); } } - + // Make sure hotkeys are disabled try { HotkeyControl.UnregisterHotkeys(); } catch (Exception e) { LOG.Error("Error unregistering hotkeys!", e); } - + // Now the sound isn't needed anymore try { SoundHelper.Deinitialize(); } catch (Exception e) { LOG.Error("Error deinitializing sound!", e); } - + // Inform all registed plugins try { PluginHelper.Instance.Shutdown(); diff --git a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj index ad83078a6..2d88e8b4a 100644 --- a/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj +++ b/GreenshotJiraPlugin/GreenshotJiraPlugin.csproj @@ -12,7 +12,6 @@ - diff --git a/GreenshotJiraPlugin/JiraPlugin.cs b/GreenshotJiraPlugin/JiraPlugin.cs index ed26d888d..83aeba5ef 100644 --- a/GreenshotJiraPlugin/JiraPlugin.cs +++ b/GreenshotJiraPlugin/JiraPlugin.cs @@ -1,20 +1,20 @@ /* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom - * + * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 1 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -25,8 +25,6 @@ using Greenshot.Plugin; using System; using System.Threading.Tasks; using Dapplo.Log; -using Greenshot.Forms; -using Greenshot.Helpers; using GreenshotJiraPlugin.Forms; using GreenshotPlugin.Core; using log4net; @@ -59,22 +57,6 @@ namespace GreenshotJiraPlugin { public JiraPlugin() { _instance = this; - // Added to prevent Greenshot from shutting down when there was an exception in a Task - TaskScheduler.UnobservedTaskException += (sender, args) => - { - try - { - Exception exceptionToLog = args.Exception; - string exceptionText = EnvironmentInfo.BuildReport(exceptionToLog); - Log.Error("Exception caught in the UnobservedTaskException handler."); - Log.Error(exceptionText); - new BugReportForm(exceptionText).ShowDialog(); - } - finally - { - args.SetObserved(); - } - }; } public IEnumerable Destinations() { diff --git a/GreenshotPlugin/Interfaces/IOcrProvider.cs b/GreenshotPlugin/Interfaces/IOcrProvider.cs new file mode 100644 index 000000000..f48e1c21e --- /dev/null +++ b/GreenshotPlugin/Interfaces/IOcrProvider.cs @@ -0,0 +1,40 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2020 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using Greenshot.Plugin; +using System.Collections.Generic; +using System.Drawing; +using System.Threading.Tasks; + +namespace GreenshotPlugin.Interfaces +{ + public interface IOcrProvider + { + Task DoOcrAsync(ISurface surface); + } + + public class OcrInformation + { + public string Text { get; set; } + + public IList<(string word, Rectangle location)> Words { get; } = new List<(string, Rectangle)>(); + } +} diff --git a/GreenshotWin10Plugin/Win10OcrDestination.cs b/GreenshotWin10Plugin/Win10OcrDestination.cs index c21f6e966..bd762ecbd 100644 --- a/GreenshotWin10Plugin/Win10OcrDestination.cs +++ b/GreenshotWin10Plugin/Win10OcrDestination.cs @@ -28,13 +28,14 @@ using Windows.Media.Ocr; using Greenshot.Plugin; using GreenshotPlugin.Core; using System.Text; +using GreenshotPlugin.Interfaces; namespace GreenshotWin10Plugin { /// /// This uses the OcrEngine from Windows 10 to perform OCR on the captured image. /// - public class Win10OcrDestination : AbstractDestination + public class Win10OcrDestination : AbstractDestination, IOcrProvider { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(Win10OcrDestination)); @@ -63,7 +64,7 @@ namespace GreenshotWin10Plugin /// /// ISurface /// OcrResult - public async Task DoOcrAsync(ISurface surface) + public async Task DoOcrAsync(ISurface surface) { var ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages(); using var imageStream = new MemoryStream(); @@ -73,7 +74,27 @@ namespace GreenshotWin10Plugin var decoder = await BitmapDecoder.CreateAsync(imageStream.AsRandomAccessStream()); var softwareBitmap = await decoder.GetSoftwareBitmapAsync(); - return await ocrEngine.RecognizeAsync(softwareBitmap); + var ocrResult = await ocrEngine.RecognizeAsync(softwareBitmap); + + var result = new OcrInformation(); + // Build the text from the lines, otherwise it's just everything concated together + var text = new StringBuilder(); + foreach (var line in ocrResult.Lines) + { + text.AppendLine(line.Text); + } + result.Text = result.ToString(); + + foreach (var line in ocrResult.Lines) + { + foreach (var word in line.Words) + { + var rectangle = new Rectangle((int)word.BoundingRect.X, (int)word.BoundingRect.Y, (int)word.BoundingRect.Width, (int)word.BoundingRect.Height); + + result.Words.Add((word.Text, rectangle)); + } + } + return result; } /// @@ -89,19 +110,12 @@ namespace GreenshotWin10Plugin try { var ocrResult = Task.Run(async () => await DoOcrAsync(surface)).Result; - // Build the text from the lines, otherwise it's just everything concated together - var result = new StringBuilder(); - foreach(var line in ocrResult.Lines) - { - result.AppendLine(line.Text); - } - var text = result.ToString(); // Check if we found text - if (!string.IsNullOrWhiteSpace(text)) + if (!string.IsNullOrWhiteSpace(ocrResult.Text)) { // Place the OCR text on the - ClipboardHelper.SetClipboardData(text); + ClipboardHelper.SetClipboardData(ocrResult.Text); } exportInformation.ExportMade = true; }