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);
}