Skip to content

Commit 1b6e4ed

Browse files
committed
Updates to ImageManager update 2
WeakReference is used to keep track of the auto-adjusted images.
1 parent 83f5d4b commit 1b6e4ed

File tree

6 files changed

+110
-90
lines changed

6 files changed

+110
-90
lines changed

External/Plugins/ASCompletion/PluginUI.cs

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -115,41 +115,41 @@ private void InitializeControls()
115115
treeIcons.ImageSize = ScaleHelper.Scale(new Size(16, 16));
116116
treeIcons.Images.AddRange( new Image[]
117117
{
118-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("FilePlain.png"))),
119-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("FolderClosed.png"))),
120-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("FolderOpen.png"))),
121-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("CheckAS.png"))),
122-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("QuickBuild.png"))),
123-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Package.png"))),
124-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Interface.png"))),
125-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Intrinsic.png"))),
126-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Class.png"))),
127-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Variable.png"))),
128-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("VariableProtected.png"))),
129-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("VariablePrivate.png"))),
130-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("VariableStatic.png"))),
131-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("VariableStaticProtected.png"))),
132-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("VariableStaticPrivate.png"))),
133-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Const.png"))),
134-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("ConstProtected.png"))),
135-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("ConstPrivate.png"))),
136-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Const.png"))),
137-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("ConstProtected.png"))),
138-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("ConstPrivate.png"))),
139-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Method.png"))),
140-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("MethodProtected.png"))),
141-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("MethodPrivate.png"))),
142-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("MethodStatic.png"))),
143-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("MethodStaticProtected.png"))),
144-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("MethodStaticPrivate.png"))),
145-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Property.png"))),
146-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("PropertyProtected.png"))),
147-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("PropertyPrivate.png"))),
148-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("PropertyStatic.png"))),
149-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("PropertyStaticProtected.png"))),
150-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("PropertyStaticPrivate.png"))),
151-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Template.png"))),
152-
PluginBase.MainForm.GetAutoAdjustedImage(Image.FromStream(GetStream("Declaration.png")))
118+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("FilePlain.png"))),
119+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("FolderClosed.png"))),
120+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("FolderOpen.png"))),
121+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("CheckAS.png"))),
122+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("QuickBuild.png"))),
123+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Package.png"))),
124+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Interface.png"))),
125+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Intrinsic.png"))),
126+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Class.png"))),
127+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Variable.png"))),
128+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("VariableProtected.png"))),
129+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("VariablePrivate.png"))),
130+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("VariableStatic.png"))),
131+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("VariableStaticProtected.png"))),
132+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("VariableStaticPrivate.png"))),
133+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Const.png"))),
134+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("ConstProtected.png"))),
135+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("ConstPrivate.png"))),
136+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Const.png"))),
137+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("ConstProtected.png"))),
138+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("ConstPrivate.png"))),
139+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Method.png"))),
140+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("MethodProtected.png"))),
141+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("MethodPrivate.png"))),
142+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("MethodStatic.png"))),
143+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("MethodStaticProtected.png"))),
144+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("MethodStaticPrivate.png"))),
145+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Property.png"))),
146+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("PropertyProtected.png"))),
147+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("PropertyPrivate.png"))),
148+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("PropertyStatic.png"))),
149+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("PropertyStaticProtected.png"))),
150+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("PropertyStaticPrivate.png"))),
151+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Template.png"))),
152+
PluginBase.MainForm.ImageSetAdjust(Image.FromStream(GetStream("Declaration.png")))
153153
});
154154

155155
toolStrip.Renderer = new DockPanelStripRenderer();

External/Plugins/CodeRefactor/RefactorItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public RefactorItem(ToolStripItem item)
2525
this.item = item;
2626
label = Regex.Replace(item.Text, "[&.]", string.Empty);
2727
description = TextHelper.GetString("Label.Refactor").Replace("&", string.Empty);
28-
icon = new Bitmap(item.Image ?? PluginBase.MainForm.FindImage("452")); //452 or 473
28+
icon = (Bitmap) (item.Image ?? PluginBase.MainForm.FindImage("452")); //452 or 473
2929
}
3030

3131
public string Description

External/Plugins/FileExplorer/PluginUI.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1137,7 +1137,7 @@ private int ExtractIconIfNecessary(String path)
11371137
if (File.Exists(path)) icon = IconExtractor.GetFileIcon(path, false, true);
11381138
else icon = IconExtractor.GetFolderIcon(path, false, true);
11391139
image = ImageKonverter.ImageResize(icon.ToBitmap(), size.Width, size.Height);
1140-
image = PluginBase.MainForm.GetAutoAdjustedImage(image);
1140+
image = PluginBase.MainForm.ImageSetAdjust(image);
11411141
icon.Dispose();
11421142
}
11431143
else

External/Plugins/FlashDebugger/Helpers/MenusHelper.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ public MenusHelper(Image pluginImage, DebuggerManager debugManager, Settings set
3131

3232
imageList = new ImageList();
3333
imageList.ColorDepth = ColorDepth.Depth32Bit;
34-
imageList.Images.Add("StartContinue", PluginBase.MainForm.GetAutoAdjustedImage(Resource.StartContinue));
35-
imageList.Images.Add("Pause", PluginBase.MainForm.GetAutoAdjustedImage(Resource.Pause));
36-
imageList.Images.Add("Stop", PluginBase.MainForm.GetAutoAdjustedImage(Resource.Stop));
37-
imageList.Images.Add("Current", PluginBase.MainForm.GetAutoAdjustedImage(Resource.Current));
38-
imageList.Images.Add("RunToCursor", PluginBase.MainForm.GetAutoAdjustedImage(Resource.RunToCursor));
39-
imageList.Images.Add("Step", PluginBase.MainForm.GetAutoAdjustedImage(Resource.Step));
40-
imageList.Images.Add("Next", PluginBase.MainForm.GetAutoAdjustedImage(Resource.Next));
41-
imageList.Images.Add("Finish", PluginBase.MainForm.GetAutoAdjustedImage(Resource.Finish));
34+
imageList.Images.Add("StartContinue", PluginBase.MainForm.ImageSetAdjust(Resource.StartContinue));
35+
imageList.Images.Add("Pause", PluginBase.MainForm.ImageSetAdjust(Resource.Pause));
36+
imageList.Images.Add("Stop", PluginBase.MainForm.ImageSetAdjust(Resource.Stop));
37+
imageList.Images.Add("Current", PluginBase.MainForm.ImageSetAdjust(Resource.Current));
38+
imageList.Images.Add("RunToCursor", PluginBase.MainForm.ImageSetAdjust(Resource.RunToCursor));
39+
imageList.Images.Add("Step", PluginBase.MainForm.ImageSetAdjust(Resource.Step));
40+
imageList.Images.Add("Next", PluginBase.MainForm.ImageSetAdjust(Resource.Next));
41+
imageList.Images.Add("Finish", PluginBase.MainForm.ImageSetAdjust(Resource.Finish));
4242

4343
ToolStripMenuItem tempItem;
4444
ToolStripMenuItem viewMenu = (ToolStripMenuItem)PluginBase.MainForm.FindMenuItem("ViewMenu");

FlashDevelop/MainForm.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,10 +1683,8 @@ public IPlugin FindPlugin(String guid)
16831683
/// <summary>
16841684
/// Finds the specified composed/ready image that is automatically adjusted according to the theme.
16851685
/// <para/>
1686-
/// WARNING! Do not call <see cref="ScaleHelper.Scale(Bitmap)"/> on the image returned by this method.
1687-
/// Instead, call it before passing the image to this method.
1686+
/// If you make a copy of the image returned by this method, the copy will not be automatically adjusted.
16881687
/// </summary>
1689-
// TODO: Find all references to this method that creates a copy of the image returned, such as adding it to ImageList, and call FindImage(image, false) instead.
16901688
public Image FindImage(String data)
16911689
{
16921690
return FindImage(data, true);
@@ -1695,8 +1693,7 @@ public Image FindImage(String data)
16951693
/// <summary>
16961694
/// Finds the specified composed/ready image.
16971695
/// <para/>
1698-
/// WARNING! Do not call <see cref="ScaleHelper.Scale(Bitmap)"/> on the image returned by this method if <code>autoAdjusted</code> is <code>true</code>.
1699-
/// Instead, call it before passing the image to this method.
1696+
/// If you make a copy of the image returned by this method, the copy will not be automatically adjusted, even if <code>autoAdjusted</code> is <code>true</code>.
17001697
/// </summary>
17011698
public Image FindImage(String data, Boolean autoAdjusted)
17021699
{
@@ -1715,11 +1712,11 @@ public Image FindImage(String data, Boolean autoAdjusted)
17151712
}
17161713

17171714
/// <summary>
1718-
/// Deprecated. Returns <code>image</code>.
1715+
/// Returns a copy of the specified image that has its color adjusted.
17191716
/// </summary>
17201717
public Image ImageSetAdjust(Image image)
17211718
{
1722-
return image;
1719+
return ImageManager.SetImageAdjustment(image);
17231720
}
17241721

17251722
/// <summary>

FlashDevelop/Managers/ImageManager.cs

Lines changed: 61 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.Drawing;
34
using FlashDevelop.Helpers;
@@ -45,55 +46,81 @@ public static Image GetComposedBitmap(string data, bool autoAdjusted)
4546
if (!Cache.ContainsKey(data))
4647
{
4748
int x, y, icon, bullet, rx, ry;
48-
var composed = new Bitmap(Size, Size);
49-
var destination = Graphics.FromImage(composed);
49+
var original = new Bitmap(Size, Size);
50+
var graphics = Graphics.FromImage(original);
5051
var destRect = new Rectangle(Padding, Padding, Size - (Padding * 2), Size - (Padding * 2));
5152

5253
ProcessImageData(data, out x, out y, out icon, out bullet);
53-
destination.Clear(Color.Transparent);
54+
graphics.Clear(Color.Transparent);
5455

5556
if (icon >= 0)
5657
{
5758
rx = (icon % 16) * Size;
5859
ry = (icon / 16) * Size;
59-
destination.DrawImage(Source, destRect, new Rectangle(rx, ry, Size, Size), GraphicsUnit.Pixel);
60+
graphics.DrawImage(Source, destRect, new Rectangle(rx, ry, Size, Size), GraphicsUnit.Pixel);
6061
}
6162
if (bullet >= 0)
6263
{
6364
rx = (bullet % 16) * Size;
6465
ry = (bullet / 16) * Size;
6566
destRect.X += (Size == 32) ? x * 2 : x;
6667
destRect.Y += (Size == 32) ? y * 2 : y;
67-
destination.DrawImage(Source, destRect, new Rectangle(rx, ry, Size, Size), GraphicsUnit.Pixel);
68+
graphics.DrawImage(Source, destRect, new Rectangle(rx, ry, Size, Size), GraphicsUnit.Pixel);
6869
}
6970

70-
composed = ScaleHelper.Scale(composed);
71-
Cache[data] = GetAutoAdjustedImagePair(composed);
71+
graphics.Dispose();
72+
original = ScaleHelper.Scale(original);
73+
Cache[data] = new ImagePair(original);
7274
}
7375

74-
return autoAdjusted ? Cache[data].Adjusted : Cache[data].Original;
76+
77+
if (autoAdjusted)
78+
{
79+
var imagePair = Cache[data];
80+
return imagePair.Adjusted ?? AddAutoAdjustImage(imagePair);
81+
}
82+
return Cache[data].Original;
83+
}
84+
85+
/// <summary>
86+
/// Gets an adjusted copy of the specified image.
87+
/// </summary>
88+
public static Image SetImageAdjustment(Image original)
89+
{
90+
int saturation, brightness;
91+
if (GetImageAdjustments(out saturation, out brightness))
92+
{
93+
return ImageKonverter.ImageAdjust(original, saturation, brightness);
94+
}
95+
return new Bitmap(original);
7596
}
7697

7798
/// <summary>
7899
/// Gets a copy of the image that changes color according to the theme.
79100
/// </summary>
80101
public static Image GetAutoAdjustedImage(Image image)
81102
{
82-
return GetAutoAdjustedImagePair(image).Adjusted;
103+
return AddAutoAdjustImage(new ImagePair(image));
83104
}
84105

85106
/// <summary>
86107
/// Adjust colors of all cached images.
87108
/// </summary>
88109
public static void AdjustAllImages()
89110
{
90-
string style = Globals.MainForm.GetThemeValue("ImageManager.ImageSet");
91111
int saturation, brightness;
92-
GetImageAdjustments(style, out saturation, out brightness);
93-
94-
foreach (var imagePair in AutoAdjusted)
112+
GetImageAdjustments(out saturation, out brightness);
113+
114+
for (int i = 0, length = AutoAdjusted.Count; i < length; i++)
95115
{
96-
ImageKonverter.ImageAdjust(imagePair.Original, imagePair.Adjusted, saturation, brightness);
116+
var imagePair = AutoAdjusted[i];
117+
var adjusted = imagePair.Adjusted;
118+
if (adjusted == null)
119+
{
120+
AutoAdjusted.RemoveAt(i--);
121+
length--;
122+
}
123+
else ImageKonverter.ImageAdjust(imagePair.Original, adjusted, saturation, brightness);
97124
}
98125
}
99126

@@ -115,33 +142,20 @@ static void ProcessImageData(string data, out int x, out int y, out int icon, ou
115142
}
116143

117144
/// <summary>
118-
/// Gets an instance of <see cref="ImagePair"/> with the specified image,
119-
/// that has a copy of the image that changes color according to the theme.
145+
/// Adds a pair to the update list.
120146
/// </summary>
121-
static ImagePair GetAutoAdjustedImagePair(Image image)
147+
static Image AddAutoAdjustImage(ImagePair pair)
122148
{
123-
var pair = new ImagePair(image);
124149
AutoAdjusted.Add(pair);
125-
126-
string style = Globals.MainForm.GetThemeValue("ImageManager.ImageSet");
127-
int saturation, brightness;
128-
129-
if (GetImageAdjustments(style, out saturation, out brightness))
130-
{
131-
pair.Adjusted = new Bitmap(image.Width, image.Height);
132-
ImageKonverter.ImageAdjust(image, pair.Adjusted, saturation, brightness);
133-
}
134-
else pair.Adjusted = new Bitmap(image);
135-
136-
return pair;
150+
return pair.Adjusted = SetImageAdjustment(pair.Original);
137151
}
138152

139153
/// <summary>
140154
/// Gets the appropriate color adjustment components.
141155
/// </summary>
142-
static bool GetImageAdjustments(string style, out int saturation, out int brightness)
156+
static bool GetImageAdjustments(out int saturation, out int brightness)
143157
{
144-
switch (style)
158+
switch (Globals.MainForm.GetThemeValue("ImageManager.ImageSet"))
145159
{
146160
case "Bright": saturation = 20; brightness = 0; return true;
147161
case "Dim": saturation = -5; brightness = -2; return true;
@@ -157,23 +171,32 @@ static bool GetImageAdjustments(string style, out int saturation, out int bright
157171
/// </summary>
158172
class ImagePair
159173
{
174+
Image original;
175+
WeakReference adjusted;
176+
160177
/// <summary>
161178
/// The original image.
162179
/// </summary>
163-
public Image Original;
180+
public Image Original
181+
{
182+
get { return original; }
183+
}
164184

165185
/// <summary>
166186
/// The copy of <see cref="Original"/> that changes color according to the theme.
167187
/// </summary>
168-
public Image Adjusted;
188+
public Image Adjusted
189+
{
190+
get { return adjusted.Target as Image; }
191+
set { adjusted.Target = value; }
192+
}
169193

170194
/// <summary>
171195
/// Creates an instance of <see cref="ImagePair"/>.
172196
/// </summary>
173197
/// <param name="original"><see cref="Original"/></param>
174-
public ImagePair(Image original)
198+
public ImagePair(Image original) : this(original, null)
175199
{
176-
Original = original;
177200
}
178201

179202
/// <summary>
@@ -183,8 +206,8 @@ public ImagePair(Image original)
183206
/// <param name="adjusted"><see cref="Adjusted"/></param>
184207
public ImagePair(Image original, Image adjusted)
185208
{
186-
Original = original;
187-
Adjusted = adjusted;
209+
this.original = original;
210+
this.adjusted = new WeakReference(adjusted);
188211
}
189212
}
190213
}

0 commit comments

Comments
 (0)