BitmapOperationsUtility.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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.Generic;
  9. using System.Collections.ObjectModel;
  10. using System.Diagnostics;
  11. using System.Linq;
  12. using System.Windows.Input;
  13. using System.Windows.Media;
  14. using System.Windows.Media.Imaging;
  15. namespace PixiEditor.Models.Controllers
  16. {
  17. public class BitmapOperationsUtility : NotifyableObject
  18. {
  19. public MouseMovementController MouseController { get; set; }
  20. public Tool SelectedTool { get; set; }
  21. private ObservableCollection<Layer> _layers = new ObservableCollection<Layer>();
  22. public ObservableCollection<Layer> Layers
  23. {
  24. get => _layers;
  25. set { if (_layers != value) { _layers = value; } }
  26. }
  27. private int _activeLayerIndex;
  28. public int ActiveLayerIndex
  29. {
  30. get => _activeLayerIndex;
  31. set
  32. {
  33. _activeLayerIndex = value;
  34. RaisePropertyChanged("ActiveLayerIndex");
  35. RaisePropertyChanged("ActiveLayer");
  36. }
  37. }
  38. private Layer _previewLayer;
  39. public Layer PreviewLayer
  40. {
  41. get { return _previewLayer; }
  42. set
  43. {
  44. _previewLayer = value;
  45. RaisePropertyChanged("PreviewLayer");
  46. }
  47. }
  48. public Layer ActiveLayer => Layers.Count > 0 ? Layers[ActiveLayerIndex] : null;
  49. public Color PrimaryColor { get; set; }
  50. public int ToolSize { get; set; }
  51. public event EventHandler<BitmapChangedEventArgs> BitmapChanged;
  52. public event EventHandler<LayersChangedEventArgs> LayersChanged;
  53. private Coordinates _lastMousePos;
  54. private BitmapPixelChanges _lastChangedPixels;
  55. public BitmapOperationsUtility()
  56. {
  57. MouseController = new MouseMovementController();
  58. MouseController.MousePositionChanged += Controller_MousePositionChanged;
  59. MouseController.StoppedRecordingChanges += MouseController_StoppedRecordingChanges;
  60. }
  61. private void MouseController_StoppedRecordingChanges(object sender, EventArgs e)
  62. {
  63. if(SelectedTool.RequiresPreviewLayer)
  64. {
  65. Layers[ActiveLayerIndex].ApplyPixels(_lastChangedPixels);
  66. _previewLayer.Clear();
  67. }
  68. }
  69. private void Controller_MousePositionChanged(object sender, MouseMovementEventArgs e)
  70. {
  71. if(SelectedTool != null && Mouse.LeftButton == MouseButtonState.Pressed)
  72. {
  73. var mouseMove = MouseController.LastMouseMoveCoordinates.ToList();
  74. mouseMove.Reverse();
  75. BitmapPixelChanges changedPixels = new BitmapPixelChanges();
  76. if (!SelectedTool.RequiresPreviewLayer)
  77. {
  78. changedPixels = SelectedTool.Use(Layers[ActiveLayerIndex], mouseMove.ToArray(), PrimaryColor, ToolSize);
  79. ActiveLayer.ApplyPixels(changedPixels);
  80. }
  81. else
  82. {
  83. UseToolOnPreviewLayer(mouseMove);
  84. }
  85. BitmapChanged?.Invoke(this, new BitmapChangedEventArgs(changedPixels, ActiveLayerIndex));
  86. _lastMousePos = e.NewPosition;
  87. }
  88. }
  89. private void UseToolOnPreviewLayer(List<Coordinates> mouseMove)
  90. {
  91. BitmapPixelChanges changedPixels;
  92. if (mouseMove[0] != _lastMousePos)
  93. {
  94. GeneratePreviewLayer();
  95. PreviewLayer.Clear();
  96. changedPixels = SelectedTool.Use(Layers[ActiveLayerIndex], mouseMove.ToArray(), PrimaryColor, ToolSize);
  97. PreviewLayer.ApplyPixels(changedPixels);
  98. _lastChangedPixels = changedPixels;
  99. }
  100. }
  101. private void GeneratePreviewLayer()
  102. {
  103. if (PreviewLayer == null)
  104. {
  105. PreviewLayer = new Layer("_previewLayer", Layers[0].Width, Layers[0].Height);
  106. }
  107. }
  108. public void AddNewLayer(string name, int height, int width, bool setAsActive = true)
  109. {
  110. Layers.Add(new Layer(name, width, height));
  111. if (setAsActive)
  112. {
  113. ActiveLayerIndex = Layers.Count - 1;
  114. }
  115. LayersChanged?.Invoke(this, new LayersChangedEventArgs(0, LayerAction.Add));
  116. }
  117. public void SetActiveLayer(int index)
  118. {
  119. ActiveLayerIndex = index;
  120. LayersChanged?.Invoke(this, new LayersChangedEventArgs(index, LayerAction.SetActive));
  121. }
  122. }
  123. }
  124. public class BitmapChangedEventArgs : EventArgs
  125. {
  126. public BitmapPixelChanges PixelsChanged { get; set; }
  127. public int ChangedLayerIndex { get; set; }
  128. public BitmapChangedEventArgs(BitmapPixelChanges pixelsChanged, int changedLayerIndex)
  129. {
  130. PixelsChanged = pixelsChanged;
  131. ChangedLayerIndex = changedLayerIndex;
  132. }
  133. }
  134. public class LayersChangedEventArgs : EventArgs
  135. {
  136. public int LayerAffected { get; set; }
  137. public LayerAction LayerChangeType { get; set; }
  138. public LayersChangedEventArgs(int layerAffected, LayerAction layerChangeType)
  139. {
  140. LayerAffected = layerAffected;
  141. LayerChangeType = layerChangeType;
  142. }
  143. }