diff --git a/README.md b/README.md index 189affa..4153a4f 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,8 @@ var sizer = new LogSizer(wordCloud); using var engine = new SkGraphicEngine(sizer, wordCloud); var layout = new SpiralLayout(wordCloud); - var wcg = new WordCloudGenerator(wordCloud, engine, layout); + var colorizer = new RandomColorizer(); + var wcg = new WordCloudGenerator(wordCloud, engine, layout, colorizer); ``` 5. Now we can *arrange* the topic cloud: diff --git a/examples/WordFrequency.ConsoleApp/Program.cs b/examples/WordFrequency.ConsoleApp/Program.cs index cc499d6..a85d630 100644 --- a/examples/WordFrequency.ConsoleApp/Program.cs +++ b/examples/WordFrequency.ConsoleApp/Program.cs @@ -31,6 +31,7 @@ static int Main(string[] args) // Process words on input. var freqs = new Dictionary(); var whitespaces = new Regex(@"\s+"); + while (Console.ReadLine() is string line) { foreach (var word in whitespaces.Split(line)) @@ -55,7 +56,8 @@ static int Main(string[] args) var sizer = new LogSizer(wordCloud); using var engine = new SkGraphicEngine(sizer, wordCloud); var layout = new SpiralLayout(wordCloud); - var wcg = new WordCloudGenerator(wordCloud, engine, layout); + var colorizer = new RandomColorizer(); //new DefaultColorizer(); uses default color set in WordCloudInput + var wcg = new WordCloudGenerator(wordCloud, engine, layout, colorizer); // Draw the bitmap on white background. using var final = new SKBitmap(wordCloud.Width, wordCloud.Height); diff --git a/src/KnowledgePicker.WordCloud/Drawing/DefaultColorizer.cs b/src/KnowledgePicker.WordCloud/Drawing/DefaultColorizer.cs new file mode 100644 index 0000000..b83dd2b --- /dev/null +++ b/src/KnowledgePicker.WordCloud/Drawing/DefaultColorizer.cs @@ -0,0 +1,17 @@ +namespace KnowledgePicker.WordCloud.Drawing +{ + /// + /// Gets the default color set in the WordCloudInput + /// + public class DefaultColorizer : IColorizer + { + /// + /// Gets the hex string color for text + /// + /// Hex string color + public string GetColorAsHex() + { + return WordCloudInput.DefaultTextColor; + } + } +} diff --git a/src/KnowledgePicker.WordCloud/Drawing/IColorizer.cs b/src/KnowledgePicker.WordCloud/Drawing/IColorizer.cs new file mode 100644 index 0000000..eaf5a6d --- /dev/null +++ b/src/KnowledgePicker.WordCloud/Drawing/IColorizer.cs @@ -0,0 +1,7 @@ +namespace KnowledgePicker.WordCloud.Drawing +{ + public interface IColorizer + { + string GetColorAsHex(); + } +} diff --git a/src/KnowledgePicker.WordCloud/Drawing/IGraphicEngine.cs b/src/KnowledgePicker.WordCloud/Drawing/IGraphicEngine.cs index 87b4ac0..41b7e14 100644 --- a/src/KnowledgePicker.WordCloud/Drawing/IGraphicEngine.cs +++ b/src/KnowledgePicker.WordCloud/Drawing/IGraphicEngine.cs @@ -26,10 +26,14 @@ public interface IGraphicEngine : IDisposable /// Draws with weight proportional to /// . /// + /// /// /// Result of . /// - void Draw(PointD location, RectangleD measured, string text, int count); + /// + /// + /// + void Draw(PointD location, RectangleD measured, string text, int count, string randomColorHex); } public interface IGraphicEngine : IGraphicEngine diff --git a/src/KnowledgePicker.WordCloud/Drawing/RandomColorizer.cs b/src/KnowledgePicker.WordCloud/Drawing/RandomColorizer.cs new file mode 100644 index 0000000..0fcd589 --- /dev/null +++ b/src/KnowledgePicker.WordCloud/Drawing/RandomColorizer.cs @@ -0,0 +1,48 @@ +using System; +using System.Drawing; + +namespace KnowledgePicker.WordCloud.Drawing +{ + /// + /// Allows random colors for the word cloud text + /// + public class RandomColorizer : IColorizer + { + /// + /// Used to select random colors. + /// + private Random Random { get; set; } = new Random(Environment.TickCount); + + /// + /// Gets a random color. + /// + /// Color + private Color GetRandomColor() + { +#pragma warning disable CA5394 // Do not use insecure randomness + return Color.FromArgb(Random.Next(0, 255), Random.Next(0, 255), Random.Next(0, 255)); +#pragma warning restore CA5394 // Do not use insecure randomness + } + + /// + /// Converts Color to Hext string + /// + /// Color + private static string ConvertToHexString(Color c) + { + return $"#{c.R:X2}{c.G:X2}{c.B:X2}"; + } + + /// + /// Gets the randon RGB color and + /// returns a hex string + /// + /// Hexstring + public string GetColorAsHex() + { + Color c = GetRandomColor(); + return ConvertToHexString(c); + } + + } +} diff --git a/src/KnowledgePicker.WordCloud/Drawing/SkGraphicEngine.cs b/src/KnowledgePicker.WordCloud/Drawing/SkGraphicEngine.cs index 0f1e41f..e839cb6 100644 --- a/src/KnowledgePicker.WordCloud/Drawing/SkGraphicEngine.cs +++ b/src/KnowledgePicker.WordCloud/Drawing/SkGraphicEngine.cs @@ -40,11 +40,12 @@ public RectangleD Measure(string text, int count) return new RectangleD(rect.Left + m, rect.Top + m, rect.Width + 2 * m, rect.Height + 2 * m); } - public void Draw(PointD location, RectangleD measured, string text, int count) + public void Draw(PointD location, RectangleD measured, string text, int count, string? randomColorHex) { // For computation explanation, see // https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/graphics/skiasharp/basics/text. textPaint.TextSize = (float)Sizer.GetFontSize(count); + textPaint.Color = SKColor.Parse(randomColorHex); canvas.DrawText(text, (float)(location.X - measured.Left), (float)(location.Y - measured.Top), textPaint); } diff --git a/src/KnowledgePicker.WordCloud/WordCloudGenerator.cs b/src/KnowledgePicker.WordCloud/WordCloudGenerator.cs index d8dd34b..c49ef36 100644 --- a/src/KnowledgePicker.WordCloud/WordCloudGenerator.cs +++ b/src/KnowledgePicker.WordCloud/WordCloudGenerator.cs @@ -23,13 +23,15 @@ public class WordCloudGenerator private readonly WordCloudInput wordCloud; private readonly IGraphicEngine engine; private readonly ILayout layout; + private readonly IColorizer colorizer; public WordCloudGenerator(WordCloudInput wordCloud, - IGraphicEngine engine, ILayout layout) + IGraphicEngine engine, ILayout layout, IColorizer colorizer) { this.wordCloud = wordCloud; this.engine = engine; this.layout = layout; + this.colorizer = colorizer; } private T Process( @@ -59,12 +61,12 @@ private T Process( /// cref="IGraphicEngine{TBitmap}.Bitmap"/>. /// public TBitmap Draw() - { + { return Process((engine, items) => { // Draw words. foreach (var item in items) - engine.Draw(item.Location, item.Measured, item.Entry.Word, item.Entry.Count); + engine.Draw(item.Location, item.Measured, item.Entry.Word, item.Entry.Count, colorizer.GetColorAsHex()); return engine.Bitmap; }); }