BitmapOperationsUtility.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using PixiEditor.Helpers;
  2. using PixiEditor.Models.Controllers;
  3. using PixiEditor.Models.Enums;
  4. using PixiEditor.Models.Layers;
  5. using PixiEditor.Models.Position;
  6. using PixiEditor.Models.Tools;
  7. using System;
  8. using System.Collections.ObjectModel;
  9. using System.Diagnostics;
  10. using System.Linq;
  11. using System.Windows.Input;
  12. using System.Windows.Media;
  13. using System.Windows.Media.Imaging;
  14. namespace PixiEditor.Models.Controllers
  15. {
  16. public class BitmapOperationsUtility : NotifyableObject
  17. {
  18. public MouseMovementController MouseController { get; set; }
  19. public Tool SelectedTool { get; set; }
  20. private ObservableCollection<Layer> _layers;
  21. public ObservableCollection<Layer> Layers
  22. {
  23. get => _layers;
  24. set { if (_layers != value) { _layers = value; } }
  25. }
  26. private int _activeLayerIndex;
  27. public int ActiveLayerIndex
  28. {
  29. get => _activeLayerIndex;
  30. set
  31. {
  32. _activeLayerIndex = value;
  33. RaisePropertyChanged("ActiveLayerIndex");
  34. RaisePropertyChanged("ActiveLayer");
  35. }
  36. }
  37. public Layer ActiveLayer => Layers.Count > 0 ? Layers[ActiveLayerIndex] : null;
  38. public Color PrimaryColor { get; set; }
  39. public int ToolSize { get; set; }
  40. public event EventHandler<BitmapChangedEventArgs> BitmapChanged;
  41. public event EventHandler<LayersChangedEventArgs> LayersChanged;
  42. public BitmapOperationsUtility()
  43. {
  44. Layers = new ObservableCollection<Layer>();
  45. MouseController = new MouseMovementController();
  46. MouseController.MousePositionChanged += Controller_MousePositionChanged;
  47. }
  48. private void Controller_MousePositionChanged(object sender, MouseMovementEventArgs e)
  49. {
  50. if(SelectedTool != null && Mouse.LeftButton == MouseButtonState.Pressed)
  51. {
  52. var pixels = MouseController.LastMouseMoveCoordinates;
  53. pixels.Reverse();
  54. var changedPixels = SelectedTool.Use(Layers[ActiveLayerIndex], pixels.ToArray(), PrimaryColor, ToolSize);
  55. ActiveLayer.ApplyPixels(changedPixels);
  56. BitmapChanged?.Invoke(this, new BitmapChangedEventArgs(changedPixels, ActiveLayerIndex));
  57. }
  58. }
  59. public void AddNewLayer(string name, int height, int width, bool setAsActive = true)
  60. {
  61. Layers.Add(new Layer(name, width, height));
  62. Layers.Move(Layers.Count - 1, 0);
  63. if (setAsActive)
  64. {
  65. ActiveLayerIndex = 0;
  66. }
  67. LayersChanged?.Invoke(this, new LayersChangedEventArgs(0, LayerAction.Add));
  68. }
  69. public void SetActiveLayer(int index)
  70. {
  71. ActiveLayerIndex = index;
  72. LayersChanged?.Invoke(this, new LayersChangedEventArgs(index, LayerAction.SetActive));
  73. }
  74. public WriteableBitmap GetCombinedBitmaps()
  75. {
  76. Layer[] visibleLayers = Layers.Where(x => x.IsVisible).ToArray();
  77. visibleLayers.Reverse();
  78. int width = visibleLayers[0].Width;
  79. int height = visibleLayers[0].Height;
  80. WriteableBitmap finalBitmap = BitmapFactory.New(width, height);
  81. finalBitmap.Lock();
  82. finalBitmap = WriteLayersToBitmap(finalBitmap, visibleLayers);
  83. finalBitmap.Unlock();
  84. return finalBitmap;
  85. }
  86. private WriteableBitmap WriteLayersToBitmap(WriteableBitmap targetBitmap, Layer[] layers)
  87. {
  88. for (int i = 0; i < layers.Length; i++)
  89. {
  90. Coordinates[] nonTransparentCords = layers[i].GetNonTransprarentPixels();
  91. for (int j = 0; j < nonTransparentCords.Length; j++)
  92. {
  93. int x = nonTransparentCords[j].X;
  94. int y = nonTransparentCords[j].Y;
  95. targetBitmap.SetPixel(x, y, layers[i].LayerBitmap.GetPixel(x,y));
  96. }
  97. }
  98. return targetBitmap;
  99. }
  100. }
  101. }
  102. public class BitmapChangedEventArgs : EventArgs
  103. {
  104. public BitmapPixelChanges PixelsChanged { get; set; }
  105. public int ChangedLayerIndex { get; set; }
  106. public BitmapChangedEventArgs(BitmapPixelChanges pixelsChanged, int changedLayerIndex)
  107. {
  108. PixelsChanged = pixelsChanged;
  109. ChangedLayerIndex = changedLayerIndex;
  110. }
  111. }
  112. public class LayersChangedEventArgs : EventArgs
  113. {
  114. public int LayerAffected { get; set; }
  115. public LayerAction LayerChangeType { get; set; }
  116. public LayersChangedEventArgs(int layerAffected, LayerAction layerChangeType)
  117. {
  118. LayerAffected = layerAffected;
  119. LayerChangeType = layerChangeType;
  120. }
  121. }