diff --git a/CUE.NET.csproj b/CUE.NET.csproj index 316c99b..9cd2868 100644 --- a/CUE.NET.csproj +++ b/CUE.NET.csproj @@ -63,6 +63,8 @@ + + @@ -70,7 +72,7 @@ - + @@ -86,6 +88,7 @@ + diff --git a/Devices/Generic/CorsairLed.cs b/Devices/Generic/CorsairLed.cs index 41a75e2..930862d 100644 --- a/Devices/Generic/CorsairLed.cs +++ b/Devices/Generic/CorsairLed.cs @@ -1,4 +1,5 @@ using System.Drawing; +using CUE.NET.Helper; namespace CUE.NET.Devices.Generic { @@ -19,7 +20,7 @@ namespace CUE.NET.Devices.Generic { if (!IsLocked) { - RequestedColor = value; + RequestedColor = RequestedColor.Blend(value); IsUpdated = true; } } diff --git a/Devices/Keyboard/ColorBrushes/IBrush.cs b/Devices/Keyboard/ColorBrushes/IBrush.cs new file mode 100644 index 0000000..e90c6dd --- /dev/null +++ b/Devices/Keyboard/ColorBrushes/IBrush.cs @@ -0,0 +1,9 @@ +using System.Drawing; + +namespace CUE.NET.Devices.Keyboard.ColorBrushes +{ + public interface IBrush + { + Color GetColorAtPoint(RectangleF rectangle, PointF point); + } +} \ No newline at end of file diff --git a/Devices/Keyboard/ColorBrushes/SolidColorBrush.cs b/Devices/Keyboard/ColorBrushes/SolidColorBrush.cs new file mode 100644 index 0000000..66057cf --- /dev/null +++ b/Devices/Keyboard/ColorBrushes/SolidColorBrush.cs @@ -0,0 +1,31 @@ +using System.Drawing; + +namespace CUE.NET.Devices.Keyboard.ColorBrushes +{ + public class SolidColorBrush : IBrush + { + #region Properties & Fields + + public Color Color { get; set; } + + #endregion + + #region Constructors + + public SolidColorBrush(Color color) + { + this.Color = color; + } + + #endregion + + #region Methods + + public Color GetColorAtPoint(RectangleF rectangle, PointF point) + { + return Color; // A solid color brush returns the same color no matter the point + } + + #endregion + } +} \ No newline at end of file diff --git a/Devices/Keyboard/CorsairKeyboard.cs b/Devices/Keyboard/CorsairKeyboard.cs index 3153dea..b0be27b 100644 --- a/Devices/Keyboard/CorsairKeyboard.cs +++ b/Devices/Keyboard/CorsairKeyboard.cs @@ -6,6 +6,7 @@ using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using CUE.NET.Devices.Generic; +using CUE.NET.Devices.Keyboard.ColorBrushes; using CUE.NET.Devices.Keyboard.Enums; using CUE.NET.Devices.Keyboard.Keys; using CUE.NET.Helper; @@ -52,7 +53,7 @@ namespace CUE.NET.Devices.Keyboard public IEnumerable Keys => new ReadOnlyCollection(_keys.Values.ToList()); - public Color Color { get; set; } = Color.Transparent; + public IBrush Brush { get; set; } private readonly IList _keyGroups = new List(); @@ -66,7 +67,7 @@ namespace CUE.NET.Devices.Keyboard this.KeyboardDeviceInfo = info; InitializeKeys(); - CalculateKeyboardRectangle(); + KeyboardRectangle = RectangleHelper.CreateRectangleFromRectangles(this.Select(x => x.KeyRectangle)); } #endregion @@ -75,23 +76,26 @@ namespace CUE.NET.Devices.Keyboard public override void UpdateLeds(bool forceUpdate = false) { - // Apply all KeyGroups first - // Update only 'clean' leds, manual set should always override groups - IEnumerable cleanKeys = this.Where(x => !x.Led.IsUpdated).ToList(); + // Apply all KeyGroups - if (Color != Color.Transparent) - foreach (CorsairKey key in cleanKeys) - key.Led.Color = Color; + if (Brush != null) + ApplyBrush(this.ToList(), Brush); //TODO DarthAffe 20.09.2015: Add some sort of priority foreach (IKeyGroup keyGroup in _keyGroups) - foreach (CorsairKey key in keyGroup.Keys.Where(key => cleanKeys.Contains(key))) - key.Led.Color = keyGroup.Color; + ApplyBrush(keyGroup.Keys.ToList(), keyGroup.Brush); // Perform 'real' update base.UpdateLeds(forceUpdate); } + private void ApplyBrush(ICollection keys, IBrush brush) + { + RectangleF brushRectangle = RectangleHelper.CreateRectangleFromRectangles(keys.Select(x => x.KeyRectangle)); + foreach (CorsairKey key in keys) + key.Led.Color = brush.GetColorAtPoint(brushRectangle, key.KeyRectangle.GetCenter()); + } + public bool AttachKeyGroup(IKeyGroup keyGroup) { if (keyGroup == null || _keyGroups.Contains(keyGroup)) return false; @@ -124,24 +128,6 @@ namespace CUE.NET.Devices.Keyboard } } - private void CalculateKeyboardRectangle() - { - float posX = float.MaxValue; - float posY = float.MaxValue; - float posX2 = float.MinValue; - float posY2 = float.MinValue; - - foreach (CorsairKey key in this) - { - posX = Math.Min(posX, key.KeyRectangle.X); - posY = Math.Min(posY, key.KeyRectangle.Y); - posX2 = Math.Max(posX2, key.KeyRectangle.X + key.KeyRectangle.Width); - posY2 = Math.Max(posY2, key.KeyRectangle.Y + key.KeyRectangle.Height); - } - - KeyboardRectangle = RectangleHelper.CreateRectangleFromPoints(new PointF(posX, posY), new PointF(posX2, posY2)); - } - #region IEnumerable public IEnumerator GetEnumerator() diff --git a/Devices/Keyboard/Extensions/KeyGroupExtension.cs b/Devices/Keyboard/Extensions/KeyGroupExtension.cs index a8c1364..b68cc7d 100644 --- a/Devices/Keyboard/Extensions/KeyGroupExtension.cs +++ b/Devices/Keyboard/Extensions/KeyGroupExtension.cs @@ -6,28 +6,28 @@ namespace CUE.NET.Devices.Keyboard.Extensions { public static class KeyGroupExtension { - public static SimpleKeyGroup ToSimpleKeyGroup(this BaseKeyGroup keyGroup) + public static ListKeyGroup ToSimpleKeyGroup(this BaseKeyGroup keyGroup) { - SimpleKeyGroup simpleKeyGroup = keyGroup as SimpleKeyGroup; + ListKeyGroup simpleKeyGroup = keyGroup as ListKeyGroup; if (simpleKeyGroup == null) { bool wasAttached = keyGroup.Detach(); - simpleKeyGroup = new SimpleKeyGroup(keyGroup.Keyboard, wasAttached, keyGroup.Keys.ToArray()) { Color = keyGroup.Color }; + simpleKeyGroup = new ListKeyGroup(keyGroup.Keyboard, wasAttached, keyGroup.Keys.ToArray()) { Brush = keyGroup.Brush }; } return simpleKeyGroup; } - public static SimpleKeyGroup Exclude(this BaseKeyGroup keyGroup, params CorsairKeyboardKeyId[] keyIds) + public static ListKeyGroup Exclude(this BaseKeyGroup keyGroup, params CorsairKeyboardKeyId[] keyIds) { - SimpleKeyGroup simpleKeyGroup = keyGroup.ToSimpleKeyGroup(); + ListKeyGroup simpleKeyGroup = keyGroup.ToSimpleKeyGroup(); foreach (CorsairKeyboardKeyId keyId in keyIds) simpleKeyGroup.RemoveKey(keyId); return simpleKeyGroup; } - public static SimpleKeyGroup Exclude(this BaseKeyGroup keyGroup, params CorsairKey[] keyIds) + public static ListKeyGroup Exclude(this BaseKeyGroup keyGroup, params CorsairKey[] keyIds) { - SimpleKeyGroup simpleKeyGroup = keyGroup.ToSimpleKeyGroup(); + ListKeyGroup simpleKeyGroup = keyGroup.ToSimpleKeyGroup(); foreach (CorsairKey key in keyIds) simpleKeyGroup.RemoveKey(key); return simpleKeyGroup; diff --git a/Devices/Keyboard/Keys/BaseKeyGroup.cs b/Devices/Keyboard/Keys/BaseKeyGroup.cs index 42bd0d6..1eca0de 100644 --- a/Devices/Keyboard/Keys/BaseKeyGroup.cs +++ b/Devices/Keyboard/Keys/BaseKeyGroup.cs @@ -1,20 +1,19 @@ using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Drawing; +using CUE.NET.Devices.Keyboard.ColorBrushes; using CUE.NET.Devices.Keyboard.Extensions; namespace CUE.NET.Devices.Keyboard.Keys { - public class BaseKeyGroup : IKeyGroup + public abstract class BaseKeyGroup : IKeyGroup { #region Properties & Fields internal CorsairKeyboard Keyboard { get; } - public IEnumerable Keys => new ReadOnlyCollection(GroupKeys); - protected IList GroupKeys { get; } = new List(); + public IEnumerable Keys => new ReadOnlyCollection(GetGroupKeys()); - public Color Color { get; set; } = Color.Transparent; + public IBrush Brush { get; set; } #endregion @@ -28,6 +27,8 @@ namespace CUE.NET.Devices.Keyboard.Keys this.Attach(); } + protected abstract IList GetGroupKeys(); + #endregion } } diff --git a/Devices/Keyboard/Keys/IKeyGroup.cs b/Devices/Keyboard/Keys/IKeyGroup.cs index 07a5119..e962bee 100644 --- a/Devices/Keyboard/Keys/IKeyGroup.cs +++ b/Devices/Keyboard/Keys/IKeyGroup.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using System.Drawing; +using CUE.NET.Devices.Keyboard.ColorBrushes; namespace CUE.NET.Devices.Keyboard.Keys { @@ -7,6 +7,6 @@ namespace CUE.NET.Devices.Keyboard.Keys { IEnumerable Keys { get; } - Color Color { get; set; } + IBrush Brush { get; set; } } } diff --git a/Devices/Keyboard/Keys/SimpleKeyGroup.cs b/Devices/Keyboard/Keys/ListKeyGroup.cs similarity index 69% rename from Devices/Keyboard/Keys/SimpleKeyGroup.cs rename to Devices/Keyboard/Keys/ListKeyGroup.cs index aeed1ab..bf158a6 100644 --- a/Devices/Keyboard/Keys/SimpleKeyGroup.cs +++ b/Devices/Keyboard/Keys/ListKeyGroup.cs @@ -1,30 +1,37 @@ -using CUE.NET.Devices.Keyboard.Enums; +using System.Collections.Generic; +using CUE.NET.Devices.Keyboard.Enums; namespace CUE.NET.Devices.Keyboard.Keys { - public class SimpleKeyGroup : BaseKeyGroup + public class ListKeyGroup : BaseKeyGroup { + #region Properties & Fields + + protected IList GroupKeys { get; } = new List(); + + #endregion + #region Constructors - public SimpleKeyGroup(CorsairKeyboard keyboard, bool autoAttach = true) + public ListKeyGroup(CorsairKeyboard keyboard, bool autoAttach = true) : base(keyboard, autoAttach) { } - public SimpleKeyGroup(CorsairKeyboard keyboard, params CorsairKey[] keys) + public ListKeyGroup(CorsairKeyboard keyboard, params CorsairKey[] keys) : this(keyboard, true, keys) { } - public SimpleKeyGroup(CorsairKeyboard keyboard, bool autoAttach, params CorsairKey[] keys) + public ListKeyGroup(CorsairKeyboard keyboard, bool autoAttach, params CorsairKey[] keys) : base(keyboard, autoAttach) { AddKey(keys); } - public SimpleKeyGroup(CorsairKeyboard keyboard, params CorsairKeyboardKeyId[] keys) + public ListKeyGroup(CorsairKeyboard keyboard, params CorsairKeyboardKeyId[] keys) : this(keyboard, true, keys) { } - public SimpleKeyGroup(CorsairKeyboard keyboard, bool autoAttach, params CorsairKeyboardKeyId[] keys) + public ListKeyGroup(CorsairKeyboard keyboard, bool autoAttach, params CorsairKeyboardKeyId[] keys) : base(keyboard, autoAttach) { AddKey(keys); @@ -82,6 +89,12 @@ namespace CUE.NET.Devices.Keyboard.Keys GroupKeys.Add(key); } + + protected override IList GetGroupKeys() + { + return GroupKeys; + } + #endregion } } diff --git a/Devices/Keyboard/Keys/RectangleKeyGroup.cs b/Devices/Keyboard/Keys/RectangleKeyGroup.cs index 66bd4e4..77db408 100644 --- a/Devices/Keyboard/Keys/RectangleKeyGroup.cs +++ b/Devices/Keyboard/Keys/RectangleKeyGroup.cs @@ -1,4 +1,5 @@ -using System.Drawing; +using System.Collections.Generic; +using System.Drawing; using System.Linq; using CUE.NET.Devices.Keyboard.Enums; using CUE.NET.Helper; @@ -9,8 +10,8 @@ namespace CUE.NET.Devices.Keyboard.Keys { #region Properties & Fields - public RectangleF RequestedRectangle { get; } - public float MinOverlayPercentage { get; } + public RectangleF Rectangle { get; set; } + public float MinOverlayPercentage { get; set; } #endregion @@ -28,20 +29,22 @@ namespace CUE.NET.Devices.Keyboard.Keys : this(keyboard, RectangleHelper.CreateRectangleFromPoints(fromPoint, toPoint), minOverlayPercentage, autoAttach) { } - public RectangleKeyGroup(CorsairKeyboard keyboard, RectangleF requestedRectangle, float minOverlayPercentage = 0.5f, bool autoAttach = true) + public RectangleKeyGroup(CorsairKeyboard keyboard, RectangleF rectangle, float minOverlayPercentage = 0.5f, bool autoAttach = true) : base(keyboard, autoAttach) { - this.RequestedRectangle = requestedRectangle; + this.Rectangle = rectangle; this.MinOverlayPercentage = minOverlayPercentage; - - foreach (CorsairKey key in Keyboard.Where(x => RectangleHelper.CalculateIntersectPercentage(x.KeyRectangle, requestedRectangle) >= minOverlayPercentage)) - GroupKeys.Add(key); } #endregion #region Methods + protected override IList GetGroupKeys() + { + return Keyboard.Where(x => RectangleHelper.CalculateIntersectPercentage(x.KeyRectangle, Rectangle) >= MinOverlayPercentage).ToList(); + } + #endregion } } diff --git a/Examples/SimpleDevTest/Program.cs b/Examples/SimpleDevTest/Program.cs index 154b4da..782d4a1 100644 --- a/Examples/SimpleDevTest/Program.cs +++ b/Examples/SimpleDevTest/Program.cs @@ -1,11 +1,11 @@ using System; -using System.Collections.Generic; using System.Drawing; using System.Threading; using System.Threading.Tasks; using CUE.NET; using CUE.NET.Devices.Generic.Enums; using CUE.NET.Devices.Keyboard; +using CUE.NET.Devices.Keyboard.ColorBrushes; using CUE.NET.Devices.Keyboard.Enums; using CUE.NET.Devices.Keyboard.Extensions; using CUE.NET.Devices.Keyboard.Keys; @@ -36,29 +36,29 @@ namespace SimpleDevTest throw new WrapperException("No keyboard found"); // Ink all numbers on the keypad except the '5' purple, we want that to be gray - SimpleKeyGroup purpleGroup = new RectangleKeyGroup(keyboard, CorsairKeyboardKeyId.Keypad7, CorsairKeyboardKeyId.Keypad3) - { Color = Color.Purple } + ListKeyGroup purpleGroup = new RectangleKeyGroup(keyboard, CorsairKeyboardKeyId.Keypad7, CorsairKeyboardKeyId.Keypad3) + { Brush = new SolidColorBrush(Color.Purple) } .Exclude(CorsairKeyboardKeyId.Keypad5); keyboard[CorsairKeyboardKeyId.Keypad5].Led.Color = Color.Gray; // Ink the Keys 'r', 'g', 'b' in their respective color - // The char access seems to fail for everything except letters (SDK doesn't return a valid keyId) + // The char access fails for everything except letters (SDK doesn't return a valid keyId) keyboard['R'].Led.Color = Color.Red; keyboard[CorsairKeyboardKeyId.G].Led.Color = Color.Green; keyboard['B'].Led.Color = Color.Blue; - // Lock the 'r', 'g', 'b' keys. We want them to stay like this forever - keyboard['R'].Led.IsLocked = true; - keyboard['G'].Led.IsLocked = true; - keyboard['B'].Led.IsLocked = true; + // Lock the 'r', 'g', 'b' keys. We want them to stay like this forever (commented since it looks quite stupid later, but feel free tu uncomment this) + //keyboard['R'].Led.IsLocked = true; + //keyboard['G'].Led.IsLocked = true; + //keyboard['B'].Led.IsLocked = true; // Ink the letters of 'white' white - SimpleKeyGroup whiteGroup = new SimpleKeyGroup(keyboard, CorsairKeyboardKeyId.W, CorsairKeyboardKeyId.H, CorsairKeyboardKeyId.I, CorsairKeyboardKeyId.T, CorsairKeyboardKeyId.E) - { Color = Color.White }; + ListKeyGroup whiteGroup = new ListKeyGroup(keyboard, CorsairKeyboardKeyId.W, CorsairKeyboardKeyId.H, CorsairKeyboardKeyId.I, CorsairKeyboardKeyId.T, CorsairKeyboardKeyId.E) + { Brush = new SolidColorBrush(Color.White) }; // Ink the keys '1' to '0' yellow RectangleKeyGroup yellowGroup = new RectangleKeyGroup(keyboard, CorsairKeyboardKeyId.D1, CorsairKeyboardKeyId.D0) - { Color = Color.Yellow }; + { Brush = new SolidColorBrush(Color.Yellow) }; // Update the keyboard to show the configured colors, (your CUE settings defines the rest) keyboard.UpdateLeds(); @@ -72,11 +72,11 @@ namespace SimpleDevTest // --------------------------------------------------------------------------- - // Now let us move a orange point random over the keyboard + // Now let us move some points random over the keyboard // Something like this could become some sort of effect // Initialize needed stuff - const float SPEED = 8f; // mm/tick + const float SPEED = 4f; // mm/tick Random random = new Random(); // Remove all the groups we created above to clear the keyboard @@ -87,35 +87,64 @@ namespace SimpleDevTest // Flash whole keyboard three times to ... well ... just to make it happen for (int i = 0; i < 3; i++) { - keyboard.Color = Color.Aquamarine; + keyboard.Brush = new SolidColorBrush(Color.Aquamarine); keyboard.UpdateLeds(); Thread.Sleep(160); - keyboard.Color = Color.Black; + keyboard.Brush = new SolidColorBrush(Color.Black); keyboard.UpdateLeds(); Thread.Sleep(200); } - // Set keyboard 'background' to something fancy - keyboard.Color = Color.DarkSlateBlue; + // Set keyboard 'background' to something neutral + keyboard.Brush = new SolidColorBrush(Color.Black); + + // Define how many points we have + const int NUM_POINTS = 6; + + // The points we want to draw (rectangle since circles are too hard to calculate :p) + RectangleF[] points = new RectangleF[NUM_POINTS]; + + // KeyGroups which represents our point on the keyboard + RectangleKeyGroup[] pointGroups = new RectangleKeyGroup[NUM_POINTS]; - // Spawn our point (rectangle since circles are too hard to calculate :p) in the top-left corner (right over G1 or on ESC depending on your keyboard) - RectangleF point = new RectangleF(keyboard.KeyboardRectangle.X, keyboard.KeyboardRectangle.Y, 40, 40); // Target of our movement - PointF target = new PointF(point.X, point.Y); + PointF[] targets = new PointF[NUM_POINTS]; + + // Initialize all the stuff + for (int i = 0; i < NUM_POINTS; i++) + { + // Spawn our point in the top-left corner (right over G1 or on ESC depending on your keyboard) + points[i] = new RectangleF(keyboard.KeyboardRectangle.X, keyboard.KeyboardRectangle.Y, 60, 60); + pointGroups[i] = new RectangleKeyGroup(keyboard, points[i], 0.1f) { Brush = new SolidColorBrush(Color.White) }; + targets[i] = new PointF(points[i].X, points[i].Y); + } + + // We set colors manually since white points are kinda boring (notice, that we use alpha values) + pointGroups[0].Brush = new SolidColorBrush(Color.FromArgb(127, 255, 0, 0)); + pointGroups[1].Brush = new SolidColorBrush(Color.FromArgb(127, 0, 255, 0)); + pointGroups[2].Brush = new SolidColorBrush(Color.FromArgb(127, 0, 0, 255)); + pointGroups[3].Brush = new SolidColorBrush(Color.FromArgb(127, 255, 0, 255)); + pointGroups[4].Brush = new SolidColorBrush(Color.FromArgb(127, 255, 255, 0)); + pointGroups[5].Brush = new SolidColorBrush(Color.FromArgb(127, 0, 255, 255)); + while (true) { - // Choose new target if we arrived - if (point.Contains(target)) - target = new PointF((float)(keyboard.KeyboardRectangle.X + (random.NextDouble() * keyboard.KeyboardRectangle.Width)), - (float)(keyboard.KeyboardRectangle.Y + (random.NextDouble() * keyboard.KeyboardRectangle.Height))); - else - point.Location = Interpolate(point.Location, target, SPEED); // It would be better to calculate from the center of our rectangle but the easy way is enough here + // Calculate all the points + for (int i = 0; i < NUM_POINTS; i++) + { + // Choose new target if we arrived + if (points[i].Contains(targets[i])) + targets[i] = new PointF((float)(keyboard.KeyboardRectangle.X + (random.NextDouble() * keyboard.KeyboardRectangle.Width)), + (float)(keyboard.KeyboardRectangle.Y + (random.NextDouble() * keyboard.KeyboardRectangle.Height))); + else + // Calculate movement + points[i].Location = Interpolate(points[i].Location, targets[i], SPEED); // It would be better to calculate from the center of our rectangle but the easy way is enough here - IEnumerable keys = keyboard[point, 0.1f]; - if (keys != null) - foreach (CorsairKey key in keys) - key.Led.Color = Color.Orange; + // Move our rectangle to the new position + pointGroups[i].Rectangle = points[i]; + } + // Update changed leds keyboard.UpdateLeds(); // 20 updates per sec should be enought for this diff --git a/Examples/SimpleDevTest/Properties/AssemblyInfo.cs b/Examples/SimpleDevTest/Properties/AssemblyInfo.cs index 592bb00..ef4f539 100644 --- a/Examples/SimpleDevTest/Properties/AssemblyInfo.cs +++ b/Examples/SimpleDevTest/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.2.0")] +[assembly: AssemblyFileVersion("1.2.0")] diff --git a/Helper/ColorHelper.cs b/Helper/ColorHelper.cs new file mode 100644 index 0000000..7ee8fab --- /dev/null +++ b/Helper/ColorHelper.cs @@ -0,0 +1,49 @@ +// ReSharper disable MemberCanBePrivate.Global + +using System.Drawing; + +namespace CUE.NET.Helper +{ + public static class ColorHelper + { + public static float GetFloatA(this Color color) + { + return color.A / 255f; + } + + public static float GetFloatR(this Color color) + { + return color.R / 255f; + } + + public static float GetFloatG(this Color color) + { + return color.G / 255f; + } + + public static float GetFloatB(this Color color) + { + return color.B / 255f; + } + + public static Color Blend(this Color bg, Color fg) + { + if (fg.A == 255) + return fg; + + if (fg.A == 0) + return bg; + + float resultA = (1 - (1 - fg.GetFloatA()) * (1 - bg.GetFloatA())); + float resultR = (fg.GetFloatR() * fg.GetFloatA() / resultA + bg.GetFloatR() * bg.GetFloatA() * (1 - fg.GetFloatA()) / resultA); + float resultG = (fg.GetFloatG() * fg.GetFloatA() / resultA + bg.GetFloatG() * bg.GetFloatA() * (1 - fg.GetFloatA()) / resultA); + float resultB = (fg.GetFloatB() * fg.GetFloatA() / resultA + bg.GetFloatB() * bg.GetFloatA() * (1 - fg.GetFloatA()) / resultA); + return CreateColorFromFloat(resultA, resultR, resultG, resultB); + } + + public static Color CreateColorFromFloat(float a, float r, float g, float b) + { + return Color.FromArgb((int)(a * 255), (int)(r * 255), (int)(g * 255), (int)(b * 255)); + } + } +} diff --git a/Helper/RectangleHelper.cs b/Helper/RectangleHelper.cs index f7c0027..3082fbd 100644 --- a/Helper/RectangleHelper.cs +++ b/Helper/RectangleHelper.cs @@ -1,10 +1,16 @@ using System; +using System.Collections.Generic; using System.Drawing; namespace CUE.NET.Helper { public static class RectangleHelper { + public static PointF GetCenter(this RectangleF rectangle) + { + return new PointF(rectangle.Left + rectangle.Width / 2f, rectangle.Top + rectangle.Height / 2f); + } + public static RectangleF CreateRectangleFromPoints(PointF point1, PointF point2) { float posX = Math.Min(point1.X, point2.X); @@ -25,6 +31,24 @@ namespace CUE.NET.Helper return new RectangleF(posX, posY, width, height); } + public static RectangleF CreateRectangleFromRectangles(IEnumerable rectangles) + { + float posX = float.MaxValue; + float posY = float.MaxValue; + float posX2 = float.MinValue; + float posY2 = float.MinValue; + + foreach (RectangleF rectangle in rectangles) + { + posX = Math.Min(posX, rectangle.X); + posY = Math.Min(posY, rectangle.Y); + posX2 = Math.Max(posX2, rectangle.X + rectangle.Width); + posY2 = Math.Max(posY2, rectangle.Y + rectangle.Height); + } + + return CreateRectangleFromPoints(new PointF(posX, posY), new PointF(posX2, posY2)); + } + public static float CalculateIntersectPercentage(RectangleF rect, RectangleF referenceRect) { if (rect.IsEmpty || referenceRect.IsEmpty) return 0; diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 44b8888..b470c9a 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] +[assembly: AssemblyVersion("0.2.0")] +[assembly: AssemblyFileVersion("0.2.0")]