/// <summary> /// Retrieves a color of the specified DeviceKeys key from the bitmap /// </summary> /// <param name="key">Key</param> /// <returns>Color of the Key</returns> public Color Get(Devices.DeviceKeys key) { try { BitmapRectangle keymaping = Effects.GetBitmappingFromDeviceKey(key); if (keymaping.IsEmpty && key == Devices.DeviceKeys.Peripheral) { return(peripheral); } else { if (keymaping.IsEmpty) { return(Color.FromArgb(0, 0, 0)); } return(Utils.BitmapUtils.GetRegionColor(colormap, keymaping.Rectangle)); } } catch (Exception exc) { Global.logger.LogLine("EffectLayer.Get() Exception: " + exc, Logging_Level.Error); return(Color.FromArgb(0, 0, 0)); } }
public static Color GetRegionColor(Bitmap map, BitmapRectangle rectangle) { try { if (rectangle.IsEmpty) { return(Color.FromArgb(0, 0, 0)); } long Red = 0; long Green = 0; long Blue = 0; long Alpha = 0; BitmapData srcData = map.LockBits( rectangle.Rectangle, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); int stride = srcData.Stride; IntPtr Scan0 = srcData.Scan0; unsafe { byte *p = (byte *)(void *)Scan0; for (int y = 0; y < rectangle.Height; y++) { for (int x = 0; x < rectangle.Width; x++) { Blue += p[(y * stride) + x * 4]; Green += p[(y * stride) + x * 4 + 1]; Red += p[(y * stride) + x * 4 + 2]; Alpha += p[(y * stride) + x * 4 + 3]; } } } map.UnlockBits(srcData); return(Color.FromArgb((int)(Alpha / rectangle.Area), (int)(Red / rectangle.Area), (int)(Green / rectangle.Area), (int)(Blue / rectangle.Area))); } catch (Exception exc) { Global.logger.Error("BitmapUtils.GetRegionColor() Exception: " + exc); return(Color.FromArgb(0, 0, 0)); } }
public RectangleF GetAffectedRegion() { switch (type) { case KeySequenceType.FreeForm: return(new RectangleF((this.freeform.X + Effects.grid_baseline_x) * Effects.editor_to_canvas_width, (this.freeform.Y + Effects.grid_baseline_y) * Effects.editor_to_canvas_height, this.freeform.Width * Effects.editor_to_canvas_width, this.freeform.Height * Effects.editor_to_canvas_height)); default: float left = 0.0f; float top = left; float right = top; float bottom = right; foreach (Devices.DeviceKeys key in this.keys) { BitmapRectangle keyMapping = Effects.GetBitmappingFromDeviceKey(key); if (left == top && top == right && right == bottom && bottom == 0.0f) { left = keyMapping.Left; top = keyMapping.Top; right = keyMapping.Right; bottom = keyMapping.Bottom; } else { if (keyMapping.Left < left) { left = keyMapping.Left; } if (keyMapping.Top < top) { top = keyMapping.Top; } if (keyMapping.Right > right) { right = keyMapping.Right; } if (keyMapping.Bottom > bottom) { bottom = keyMapping.Bottom; } } } return(new RectangleF(left, top, (right - left), (bottom - top))); } }
/// <summary> /// Sets one DeviceKeys key with a specific color on the bitmap /// </summary> /// <param name="key">DeviceKey to be set</param> /// <param name="color">Color to be used</param> /// <returns>Itself</returns> private EffectLayer SetOneKey(Devices.DeviceKeys key, Color color) { BitmapRectangle keymaping = Effects.GetBitmappingFromDeviceKey(key); if (key == Devices.DeviceKeys.Peripheral) { peripheral = color; using (Graphics g = Graphics.FromImage(colormap)) { foreach (Devices.DeviceKeys peri_key in possible_peripheral_keys) { BitmapRectangle peri_keymaping = Effects.GetBitmappingFromDeviceKey(peri_key); if (peri_keymaping.IsValid) { g.FillRectangle(new SolidBrush(color), peri_keymaping.Rectangle); } } needsRender = true; } } else { if (keymaping.Top < 0 || keymaping.Bottom > Effects.canvas_height || keymaping.Left < 0 || keymaping.Right > Effects.canvas_width) { Global.logger.LogLine("Coudln't set key color " + key.ToString(), Logging_Level.Warning); return(this);; } else { using (Graphics g = Graphics.FromImage(colormap)) { g.FillRectangle(new SolidBrush(color), keymaping.Rectangle); needsRender = true; } } } return(this); }
public bool UpdateDevice(DeviceColorComposition colorComposition, bool forced = false) { Dictionary <DeviceKeys, Color> keyColors = colorComposition.keyColors; try { foreach (KeyValuePair <DeviceKeys, Color> pair in keyColors) { if (useGlobalPeriphericColors) { if (pair.Key == DeviceKeys.Peripheral) // This is not working anymore. Was working in MASTER { ColorKBLeft = pair.Value; ColorKBCenter = pair.Value; ColorKBRight = pair.Value; ColorTouchpad = pair.Value; ColorUpdated = true; } } else { // TouchPad (It would be nice to have a Touchpad Peripheral) if (pair.Key == DeviceKeys.Peripheral) { ColorTouchpad = pair.Value; ColorUpdated = true; } } } if (!useGlobalPeriphericColors) // Clevo 3 region keyboard // Left Side (From ESC to Half Spacebar) { BitmapRectangle keymap_esc = Effects.GetBitmappingFromDeviceKey(DeviceKeys.ESC); BitmapRectangle keymap_space = Effects.GetBitmappingFromDeviceKey(DeviceKeys.SPACE); PointF spacebar_center = keymap_space.Center; // Key Center int spacebar_x = (int)spacebar_center.X - keymap_esc.Left; int height = (int)spacebar_center.Y - keymap_esc.Top; BitmapRectangle region_left = new BitmapRectangle(keymap_esc.Left, keymap_esc.Top, spacebar_x, height); Color RegionLeftColor = Utils.BitmapUtils.GetRegionColor(colorComposition.keyBitmap, region_left); if (!ColorKBLeft.Equals(RegionLeftColor)) { ColorKBLeft = RegionLeftColor; ColorUpdated = true; } // Center (Other Half of Spacebar to F11) - Clevo keyboards are very compact and the right side color bleeds over to the up/left/right/down keys) BitmapRectangle keymap_f11 = Effects.GetBitmappingFromDeviceKey(DeviceKeys.F11); int f11_x_width = Convert.ToInt32(keymap_f11.Center.X - spacebar_x); BitmapRectangle region_center = new BitmapRectangle(spacebar_x, keymap_esc.Top, f11_x_width, height); Color RegionCenterColor = Utils.BitmapUtils.GetRegionColor(colorComposition.keyBitmap, region_center); if (!ColorKBCenter.Equals(RegionCenterColor)) { ColorKBCenter = RegionCenterColor; ColorUpdated = true; } // Right Side BitmapRectangle keymap_numenter = Effects.GetBitmappingFromDeviceKey(DeviceKeys.NUM_ENTER); BitmapRectangle region_right = new BitmapRectangle(Convert.ToInt32(keymap_f11.Center.X), keymap_esc.Top, Convert.ToInt32(keymap_numenter.Center.X - keymap_f11.Center.X), height); Color RegionRightColor = Utils.BitmapUtils.GetRegionColor(colorComposition.keyBitmap, region_right); if (!ColorKBRight.Equals(RegionRightColor)) { ColorKBRight = RegionRightColor; ColorUpdated = true; } } SendColorsToKeyboard(forced); return(true); } catch (Exception exception) { Global.logger.LogLine("Clevo device, error when updating device. Error: " + exception, Logging_Level.Error, true); Console.WriteLine(exception); return(false); } }