Browse Source

Added even shapes

flabbet 5 years ago
parent
commit
7a949e85c2

+ 42 - 12
PixiEditor/Models/Controllers/BitmapOperationsUtility.cs

@@ -88,23 +88,53 @@ namespace PixiEditor.Models.Controllers
             {
                 var mouseMove = MouseController.LastMouseMoveCoordinates.ToList();
                 mouseMove.Reverse();
-
-                if (!SelectedTool.RequiresPreviewLayer)
-                {
-                    BitmapPixelChanges changedPixels = SelectedTool.Use(Layers[ActiveLayerIndex], mouseMove.ToArray(), PrimaryColor, ToolSize);
-                    BitmapPixelChanges oldPixelsValues = GetOldPixelsValues(changedPixels.ChangedPixels.Keys.ToArray());
-                    ActiveLayer.ApplyPixels(changedPixels);
-                    BitmapChanged?.Invoke(this, new BitmapChangedEventArgs(changedPixels, oldPixelsValues, ActiveLayerIndex));
-                }
-                else
-                {
-                    UseToolOnPreviewLayer(mouseMove);
-                }
+                UseTool(mouseMove);
+                
 
                 _lastMousePos = e.NewPosition;
             }
         }
 
+        private void UseTool(List<Coordinates> mouseMoveCords)
+        {
+            if (Keyboard.IsKeyDown(Key.LeftShift) && !MouseCordsNotInLine(mouseMoveCords))
+            {
+                mouseMoveCords = GetSquareCoordiantes(mouseMoveCords);
+            }
+            if (!SelectedTool.RequiresPreviewLayer)
+            {
+                BitmapPixelChanges changedPixels = SelectedTool.Use(Layers[ActiveLayerIndex], mouseMoveCords.ToArray(), PrimaryColor, ToolSize);
+                BitmapPixelChanges oldPixelsValues = GetOldPixelsValues(changedPixels.ChangedPixels.Keys.ToArray());
+                ActiveLayer.ApplyPixels(changedPixels);
+                BitmapChanged?.Invoke(this, new BitmapChangedEventArgs(changedPixels, oldPixelsValues, ActiveLayerIndex));
+            }
+            else
+            {
+                UseToolOnPreviewLayer(mouseMoveCords);
+            }
+        }
+
+        private bool MouseCordsNotInLine(List<Coordinates> cords)
+        {
+            return cords[0].X == cords[^1].X || cords[0].Y == cords[^1].Y;
+        }
+
+        private List<Coordinates> GetSquareCoordiantes(List<Coordinates> mouseMoveCords)
+        {
+            int xLength = mouseMoveCords[0].Y - mouseMoveCords[^1].Y;
+            int yLength = mouseMoveCords[0].Y - mouseMoveCords[^1].Y;
+            if(mouseMoveCords[^1].Y > mouseMoveCords[0].Y)
+            {
+                xLength *= -1;
+            }
+            if(mouseMoveCords[^1].X > mouseMoveCords[0].X)
+            {
+                xLength *= -1;
+            }
+            mouseMoveCords[0] = new Coordinates(mouseMoveCords[^1].X + xLength, mouseMoveCords[^1].Y + yLength);
+            return mouseMoveCords;
+        }
+
         private BitmapPixelChanges GetOldPixelsValues(Coordinates[] coordinates)
         {
             Dictionary<Coordinates, Color> values = new Dictionary<Coordinates, Color>();

+ 2 - 28
PixiEditor/Models/Tools/Tools/CircleTool.cs

@@ -20,7 +20,7 @@ namespace PixiEditor.Models.Tools.Tools
         public override BitmapPixelChanges Use(Layer layer, Coordinates[] coordinates, Color color, int toolSize)
         {
             DoubleCords fixedCoordinates = CalculateCoordinatesForShapeRotation(coordinates[^1], coordinates[0]);
-            return BitmapPixelChanges.FromSingleColoredArray(CreateEllipse(fixedCoordinates.Coords1, fixedCoordinates.Coords2, true), color);
+            return BitmapPixelChanges.FromSingleColoredArray(CreateEllipse(fixedCoordinates.Coords1, fixedCoordinates.Coords2, false), color);
         }
 
         public Coordinates[] CreateEllipse(Coordinates startCoordinates, Coordinates endCoordinates, bool filled)
@@ -120,33 +120,7 @@ namespace PixiEditor.Models.Tools.Tools
             outputCoordinates[3] = (new Coordinates((int)-x + (int)xc, (int)-y + (int)yc));
             return outputCoordinates;
         }
-
-        public Coordinates[] BresenhamCircle(Coordinates startCoordinates, Coordinates endCoordinates, int size)
-        {
-            List<Coordinates> outputCoordinates = new List<Coordinates>();
-            Coordinates centerCoordinates = CoordinatesCalculator.GetCenterPoint(startCoordinates, endCoordinates);
-            int radius = endCoordinates.X - centerCoordinates.X;
-            int x = 0;
-            int y = radius;
-            int decision = 3 - 2 * radius;
-            outputCoordinates.AddRange(GetPixelsForOctant(centerCoordinates.X, centerCoordinates.Y, x, y));
-
-            while (x <= y)
-            {
-                if (decision <= 0)
-                {
-                    decision = decision + (4 * x) + 6;
-                }
-                else
-                {
-                    decision = decision + (4 * x) - (4 * y) + 10;
-                    y--;
-                }
-                x++;
-                outputCoordinates.AddRange(GetPixelsForOctant(centerCoordinates.X, centerCoordinates.Y, x, y));
-            }
-            return outputCoordinates.Distinct().ToArray();
-        }
+       
 
         private Coordinates[] GetPixelsForOctant(int xc, int yc, int x, int y)
         {

+ 1 - 2
PixiEditor/Models/Tools/Tools/RectangleTool.cs

@@ -46,8 +46,7 @@ namespace PixiEditor.Models.Tools.Tools
             {
                 finalCoordinates.AddRange(CalculatedFillForRectangle(coordinates));
             }
-            finalCoordinates = finalCoordinates.Distinct().ToList();
-            return finalCoordinates.ToArray();
+            return finalCoordinates.Distinct().ToArray();
         }
 
         private Coordinates[] CalculatedFillForRectangle(DoubleCords cords)

+ 10 - 5
PixiEditor/ViewModels/ViewModelMain.cs

@@ -392,13 +392,12 @@ namespace PixiEditor.ViewModels
         /// Generates new Layer and sets it as active one
         /// </summary>
         /// <param name="parameter"></param>
-        private void GenerateDrawArea(object parameter)
+        public void GenerateDrawArea(object parameter)
         {
             NewFileDialog newFile = new NewFileDialog();
             if (newFile.ShowDialog())
             {
-                BitmapUtility.Layers.Clear();
-                BitmapUtility.AddNewLayer("Base Layer", newFile.Width, newFile.Height, true);
+                NewDocument(newFile.Width, newFile.Height);
             }
         }
         #region SaveFile
@@ -438,12 +437,18 @@ namespace PixiEditor.ViewModels
             ImportFileDialog dialog = new ImportFileDialog();
             if (dialog.ShowDialog())
             {
-                BitmapUtility.Layers.Clear();
-                BitmapUtility.AddNewLayer("Base Layer", dialog.FileWidth, dialog.FileHeight, true);
+                NewDocument(dialog.FileWidth, dialog.FileHeight);
                 BitmapUtility.ActiveLayer.LayerBitmap = Importer.ImportImage(dialog.FilePath, dialog.FileWidth, dialog.FileHeight);
             }
         }
 
+        private void NewDocument(int width, int height)
+        {
+            BitmapUtility.Layers.Clear();
+            BitmapUtility.AddNewLayer("Base Layer", width, height, true);
+            BitmapUtility.PreviewLayer = null;
+        }
+
         /// <summary>
         /// For now, shows not implemented info, lol.
         /// </summary>

+ 1 - 1
PixiEditor/Views/MainWindow.xaml

@@ -70,7 +70,7 @@
             </vws:MenuButton>
         </WrapPanel>
         <StackPanel Background="#404040" Orientation="Horizontal" Grid.ColumnSpan="2" Margin="0,30,0,0" Grid.RowSpan="2"/>
-        <Grid Grid.Column="1" Grid.Row="2" Background="#303030" Margin="0,7,5,0" Grid.RowSpan="2">
+        <Grid Grid.Column="1" Grid.Row="2" Background="#303030" Margin="0,7,5,0">
             <Grid>
                 <vws:MainDrawingPanel CenterOnStart="True" Cursor="{Binding ToolCursor}">
                     <vws:MainDrawingPanel.Item>