diff --git a/Greenshot/Configuration/LanguageKeys.cs b/Greenshot/Configuration/LanguageKeys.cs index 3d323aacd..b5e012f82 100644 --- a/Greenshot/Configuration/LanguageKeys.cs +++ b/Greenshot/Configuration/LanguageKeys.cs @@ -124,6 +124,10 @@ namespace Greenshot.Configuration { editor_selectall, editor_senttoprinter, editor_shadow, + editor_torn_edge, + editor_border, + editor_grayscale, + editor_effects, editor_storedtoclipboard, editor_thickness, editor_title, diff --git a/Greenshot/Destinations/PickerDestination.cs b/Greenshot/Destinations/PickerDestination.cs index dec8552ab..785c118f6 100644 --- a/Greenshot/Destinations/PickerDestination.cs +++ b/Greenshot/Destinations/PickerDestination.cs @@ -110,7 +110,7 @@ namespace Greenshot.Destinations { // Effects if (conf.isExperimentalFeatureEnabled("Effects")) { menu.Items.Add(new ToolStripSeparator()); - ToolStripMenuItem effectItem = new ToolStripMenuItem("Effects"); + ToolStripMenuItem effectItem = new ToolStripMenuItem(lang.GetString(LangKey.editor_effects)); menu.Items.Add(effectItem); effectItem.DropDownOpening += delegate { effectItem.DropDownItems.Clear(); @@ -127,17 +127,17 @@ namespace Greenshot.Destinations { effectSubItem.Click += delegate { surface.ApplyBitmapEffect(Effects.Shadow); }; - effectSubItem = new ToolStripMenuItem("Torn Edge"); + effectSubItem = new ToolStripMenuItem(lang.GetString(LangKey.editor_torn_edge)); effectItem.DropDownItems.Add(effectSubItem); effectSubItem.Click += delegate { surface.ApplyBitmapEffect(Effects.TornEdge); }; - effectSubItem = new ToolStripMenuItem("Border"); + effectSubItem = new ToolStripMenuItem(lang.GetString(LangKey.editor_border)); effectItem.DropDownItems.Add(effectSubItem); effectSubItem.Click += delegate { surface.ApplyBitmapEffect(Effects.Border); }; - effectSubItem = new ToolStripMenuItem("Grayscale"); + effectSubItem = new ToolStripMenuItem(lang.GetString(LangKey.editor_grayscale)); effectItem.DropDownItems.Add(effectSubItem); effectSubItem.Click += delegate { surface.ApplyBitmapEffect(Effects.Grayscale); diff --git a/Greenshot/Forms/ImageEditorForm.Designer.cs b/Greenshot/Forms/ImageEditorForm.Designer.cs index cd890c7a4..34cf3c720 100644 --- a/Greenshot/Forms/ImageEditorForm.Designer.cs +++ b/Greenshot/Forms/ImageEditorForm.Designer.cs @@ -168,8 +168,6 @@ namespace Greenshot { this.insert_window_toolstripmenuitem = new System.Windows.Forms.ToolStripMenuItem(); this.dimensionsLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.autoCropToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.tornEdgeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.shadowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripContainer1.BottomToolStripPanel.SuspendLayout(); this.toolStripContainer1.ContentPanel.SuspendLayout(); this.toolStripContainer1.LeftToolStripPanel.SuspendLayout(); @@ -451,22 +449,6 @@ namespace Greenshot { this.autoCropToolStripMenuItem.Text = "Auto Crop"; this.autoCropToolStripMenuItem.Click += new System.EventHandler(this.AutoCropToolStripMenuItemClick); // - // tornEdgeToolStripMenuItem - // - this.tornEdgeToolStripMenuItem.Name = "tornEdgeToolStripMenuItem"; - this.tornEdgeToolStripMenuItem.Size = new System.Drawing.Size(166, 22); - this.tornEdgeToolStripMenuItem.Text = "Torn Edge"; - this.tornEdgeToolStripMenuItem.Visible = false; - this.tornEdgeToolStripMenuItem.Click += new System.EventHandler(this.TornEdgeToolStripMenuItemClick); - // - // shadowToolStripMenuItem - // - this.shadowToolStripMenuItem.Name = "shadowToolStripMenuItem"; - this.shadowToolStripMenuItem.Size = new System.Drawing.Size(166, 22); - this.shadowToolStripMenuItem.Text = "Shadow"; - this.shadowToolStripMenuItem.Visible = false; - this.shadowToolStripMenuItem.Click += new System.EventHandler(this.ShadowToolStripMenuItemClick); - // // editToolStripMenuItem // this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -482,8 +464,6 @@ namespace Greenshot { this.preferencesToolStripMenuItem, this.toolStripSeparator5, this.autoCropToolStripMenuItem, - this.tornEdgeToolStripMenuItem, - this.shadowToolStripMenuItem, this.insert_window_toolstripmenuitem}); this.editToolStripMenuItem.Name = "editToolStripMenuItem"; this.editToolStripMenuItem.Size = new System.Drawing.Size(37, 20); @@ -1645,7 +1625,5 @@ namespace Greenshot { private Greenshot.Controls.ToolStripColorButton btnFillColor; private Greenshot.Controls.ToolStripColorButton btnLineColor; private System.Windows.Forms.ToolStripMenuItem autoCropToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem tornEdgeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem shadowToolStripMenuItem; } } diff --git a/Greenshot/Forms/ImageEditorForm.cs b/Greenshot/Forms/ImageEditorForm.cs index 0121ae52b..ff446bbc6 100644 --- a/Greenshot/Forms/ImageEditorForm.cs +++ b/Greenshot/Forms/ImageEditorForm.cs @@ -368,7 +368,6 @@ namespace Greenshot { this.arrowHeadNoneMenuItem.Text = lang.GetString(LangKey.editor_arrowheads_none); this.shadowButton.Text = lang.GetString(LangKey.editor_shadow); - this.fontSizeLabel.Text = lang.GetString(LangKey.editor_fontsize); this.fontBoldButton.Text = lang.GetString(LangKey.editor_bold); this.fontItalicButton.Text = lang.GetString(LangKey.editor_italic); @@ -380,10 +379,41 @@ namespace Greenshot { this.loadElementsToolStripMenuItem.Text = lang.GetString(LangKey.editor_load_objects); this.autoCropToolStripMenuItem.Text = lang.GetString(LangKey.editor_autocrop); if (coreConf.isExperimentalFeatureEnabled("Effects")) { - this.shadowToolStripMenuItem.Text = lang.GetString(LangKey.editor_shadow); - this.shadowToolStripMenuItem.Visible = true; - this.tornEdgeToolStripMenuItem.Visible = true; + this.editToolStripMenuItem.DropDownItems.Add(new ToolStripSeparator()); + ToolStripMenuItem effectItem = new ToolStripMenuItem(lang.GetString(LangKey.editor_effects)); + this.editToolStripMenuItem.DropDownItems.Add(effectItem); + + ToolStripMenuItem effectSubItem; + effectSubItem = new ToolStripMenuItem(lang.GetString(LangKey.editor_shadow)); + effectSubItem.Click += delegate { + surface.ApplyBitmapEffect(Effects.Shadow); + updateUndoRedoSurfaceDependencies(); + }; + effectItem.DropDownItems.Add(effectSubItem); + + effectSubItem = new ToolStripMenuItem(lang.GetString(LangKey.editor_torn_edge)); + effectSubItem.Click += delegate { + surface.ApplyBitmapEffect(Effects.TornEdge); + updateUndoRedoSurfaceDependencies(); + }; + effectItem.DropDownItems.Add(effectSubItem); + + effectSubItem = new ToolStripMenuItem(lang.GetString(LangKey.editor_border)); + effectSubItem.Click += delegate { + surface.ApplyBitmapEffect(Effects.Border); + updateUndoRedoSurfaceDependencies(); + }; + effectItem.DropDownItems.Add(effectSubItem); + + effectSubItem = new ToolStripMenuItem(lang.GetString(LangKey.editor_grayscale)); + effectSubItem.Click += delegate { + surface.ApplyBitmapEffect(Effects.Grayscale); + updateUndoRedoSurfaceDependencies(); + }; + effectItem.DropDownItems.Add(effectSubItem); } + this.editToolStripMenuItem.DropDownItems.Add(new ToolStripSeparator()); + this.editToolStripMenuItem.DropDownItems.Add(insert_window_toolstripmenuitem); } public ISurface Surface { @@ -1177,15 +1207,5 @@ namespace Greenshot { refreshFieldControls(); } } - - void TornEdgeToolStripMenuItemClick(object sender, EventArgs e) { - surface.ApplyBitmapEffect(Effects.TornEdge); - updateUndoRedoSurfaceDependencies(); - } - - void ShadowToolStripMenuItemClick(object sender, EventArgs e) { - surface.ApplyBitmapEffect(Effects.Shadow); - updateUndoRedoSurfaceDependencies(); - } } } diff --git a/Greenshot/Languages/language-de-DE.xml b/Greenshot/Languages/language-de-DE.xml index 766ca8e23..ade4dfb6c 100644 --- a/Greenshot/Languages/language-de-DE.xml +++ b/Greenshot/Languages/language-de-DE.xml @@ -463,19 +463,31 @@ Zeit, z.B. 11_58_32 (plus Dateinamenerweiterung wie in den Einstellungen definie Vorschauqualität - + Vergrößerungsfaktor - - + + Schatten - + + Gerissene Kanten + + + Rand + + + Graustufe + + + Effekte + + Bestätigen - + Abbrechen - + Zuschneiden (C) diff --git a/Greenshot/Languages/language-en-US.xml b/Greenshot/Languages/language-en-US.xml index 7bea5003a..aa8633c22 100644 --- a/Greenshot/Languages/language-en-US.xml +++ b/Greenshot/Languages/language-en-US.xml @@ -472,6 +472,18 @@ time, e.g. 11_58_32 (plus extension defined in the settings) Shadow + + Torn edge + + + Effects + + + Border + + + Grayscale + Confirm diff --git a/Greenshot/Languages/language-nl-NL.xml b/Greenshot/Languages/language-nl-NL.xml index 7a853f14e..2e1f72874 100644 --- a/Greenshot/Languages/language-nl-NL.xml +++ b/Greenshot/Languages/language-nl-NL.xml @@ -435,42 +435,54 @@ genereert een directorie voor de huidige dag in uw standaard opslag lokatie, b.v Text markeren - + Grijstinten - - + + Vergroten Pixelgrootte - + Onherkenbaar maken (O) - - + + Onduidelijk maken radius - - + + Helderheid Voorbeeld kwaliteit - + Vergrotingsfactor - - + + Schaduw - + + Gescheurde randen + + + Rand + + + Grijstinten + + + Effecten + + Bevestigen - + Afbreken - - + + Bijsnijden (C) - + Laad beeld van het klembord diff --git a/Greenshot/releases/additional_files/readme.txt b/Greenshot/releases/additional_files/readme.txt index 214cbbd6c..fcb304d14 100644 --- a/Greenshot/releases/additional_files/readme.txt +++ b/Greenshot/releases/additional_files/readme.txt @@ -3,10 +3,9 @@ Greenshot: A screenshot tool optimized for productivity. Save a screenshot or a CHANGE LOG: -0.9.0 Build 1626 +0.9.0 Build 1660 We changed the version to 0.9.0 as the amount of features in 0.8.1 was more than planned. -Due to the many changes we need to go through a Release Candidate iteration again... Bugs resolved: * Fixed a problem with the window preview, if the window had a small height, when using the context menu (Windows Vista and later) @@ -24,6 +23,8 @@ Features added: * Added a "processor" concept, making it possible to modify the capture before it's send to a destination. Currently there is only an internal implementation which replaces the TitleFix plugin. * Added Office destinations (Word, Excel, Powerpoint & Outlook) with dynamic resolving of open "instances". * Added Ctrl/shift logic to the editor, hard to explain (see help) but hold one of the keys down and draw.. +* Added a color picker in the color dialog. +* Added shadow & torn edges 0.8.1 Build 1483 diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 5d028c415..009554704 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -28,6 +28,7 @@ using System.Drawing.Drawing2D; using GreenshotPlugin.UnmanagedHelpers; using GreenshotPlugin.Core; using IniFile; +using System.Runtime.InteropServices; namespace GreenshotPlugin.Core { /// @@ -557,6 +558,106 @@ namespace GreenshotPlugin.Core { } } + public static Bitmap FastBlur(Bitmap sourceBitmap, int radius) { + if (radius < 1) return null; + + var rct = new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap.Height); + var dest = new int[rct.Width * rct.Height]; + var source = new int[rct.Width * rct.Height]; + var bits = sourceBitmap.LockBits(rct, ImageLockMode.ReadWrite, sourceBitmap.PixelFormat); + Marshal.Copy(bits.Scan0, source, 0, source.Length); + sourceBitmap.UnlockBits(bits); + + + int w = rct.Width; + int h = rct.Height; + int wm = w - 1; + int hm = h - 1; + int wh = w * h; + int div = radius + radius + 1; + var r = new int[wh]; + var g = new int[wh]; + var b = new int[wh]; + int rsum, gsum, bsum, x, y, i, p1, p2, yi; + var vmin = new int[max(w, h)]; + var vmax = new int[max(w, h)]; + + var dv = new int[256 * div]; + for (i = 0; i < 256 * div; i++) { + dv[i] = (i / div); + } + + int yw = yi = 0; + + for (y = 0; y < h; y++) { // blur horizontal + rsum = gsum = bsum = 0; + for (i = -radius; i <= radius; i++) { + int p = source[yi + min(wm, max(i, 0))]; + rsum += (p & 0xff0000) >> 16; + gsum += (p & 0x00ff00) >> 8; + bsum += p & 0x0000ff; + } + for (x = 0; x < w; x++) { + + r[yi] = dv[rsum]; + g[yi] = dv[gsum]; + b[yi] = dv[bsum]; + + if (y == 0) { + vmin[x] = min(x + radius + 1, wm); + vmax[x] = max(x - radius, 0); + } + p1 = source[yw + vmin[x]]; + p2 = source[yw + vmax[x]]; + + rsum += ((p1 & 0xff0000) - (p2 & 0xff0000)) >> 16; + gsum += ((p1 & 0x00ff00) - (p2 & 0x00ff00)) >> 8; + bsum += (p1 & 0x0000ff) - (p2 & 0x0000ff); + yi++; + } + yw += w; + } + + for (x = 0; x < w; x++) { // blur vertical + rsum = gsum = bsum = 0; + int yp = -radius * w; + for (i = -radius; i <= radius; i++) { + yi = max(0, yp) + x; + rsum += r[yi]; + gsum += g[yi]; + bsum += b[yi]; + yp += w; + } + yi = x; + for (y = 0; y < h; y++) { + dest[yi] = unchecked((int)(0xff000000u | (uint)(dv[rsum] << 16) | (uint)(dv[gsum] << 8) | (uint)dv[bsum])); + if (x == 0) { + vmin[y] = min(y + radius + 1, hm) * w; + vmax[y] = max(y - radius, 0) * w; + } + p1 = x + vmin[y]; + p2 = x + vmax[y]; + + rsum += r[p1] - r[p2]; + gsum += g[p1] - g[p2]; + bsum += b[p1] - b[p2]; + + yi += w; + } + } + + // copy back to image + Bitmap newImage = new Bitmap(sourceBitmap.Width, sourceBitmap.Height, sourceBitmap.PixelFormat); + var bits2 = newImage.LockBits(rct, ImageLockMode.ReadWrite, newImage.PixelFormat); + Marshal.Copy(dest, 0, bits2.Scan0, dest.Length); + newImage.UnlockBits(bits); + return newImage; + + } + + private static int min(int a, int b) { return Math.Min(a, b); } + private static int max(int a, int b) { return Math.Max(a, b); } + /** * This method fixes the problem that we can't apply a filter outside the target bitmap, * therefor the filtered-bitmap will be shifted if we try to draw it outside the target bitmap. @@ -624,6 +725,7 @@ namespace GreenshotPlugin.Core { //} // blur "shadow", apply to whole new image Rectangle newImageRectangle = new Rectangle(0, 0, newImage.Width, newImage.Height); + //using (Bitmap blurImage = FastBlur(newImage, shadowSize-1)) { using (Bitmap blurImage = CreateBlur(newImage, newImageRectangle, true, shadowSize, 1d, false, newImageRectangle)) { graphics.DrawImageUnscaled(blurImage, newImageRectangle.Location); }