/* * GNU AFFERO GENERAL PUBLIC LICENSE * Version 3, 19 November 2007 * Copyright (C) 2007 Free Software Foundation, Inc. * Everyone is permitted to copy and distribute verbatim copies * of this license document, but changing it is not allowed. */ using System.Drawing; namespace UVtools.Core.Operations { public class OperationPattern { public Anchor Anchor { get; set; } public Rectangle SrcRoi { get; } public uint ImageWidth { get; } public uint ImageHeight { get; } public ushort MarginCol { get; set; } public ushort MarginRow { get; set; } public ushort MaxMarginCol { get; } public ushort MaxMarginRow { get; } public ushort Cols { get; set; } = 1; public ushort Rows { get; set; } = 1; public ushort MaxCols { get; } public ushort MaxRows { get; } public Size GetPatternVolume => new Size(Cols * SrcRoi.Width + (Cols - 1) * MarginCol, Rows * SrcRoi.Height + (Rows - 1) * MarginRow); public OperationPattern(Rectangle srcRoi, uint imageWidth, uint imageHeight) { SrcRoi = srcRoi; ImageWidth = imageWidth; ImageHeight = imageHeight; MaxCols = (ushort) (imageWidth / srcRoi.Width); MaxRows = (ushort) (imageHeight / srcRoi.Height); MaxMarginCol = CalculateMarginCol(MaxCols); MaxMarginRow = CalculateMarginRow(MaxRows); } /*public void CalculateDstRoi() { _dstRoi.Size = SrcRoi.Size; switch (Anchor) { case Anchor.TopLeft: _dstRoi.Location = new Point(0, 0); break; case Anchor.TopCenter: _dstRoi.Location = new Point((int)(ImageWidth / 2 - SrcRoi.Width / 2), 0); break; case Anchor.TopRight: _dstRoi.Location = new Point((int)(ImageWidth - SrcRoi.Width), 0); break; case Anchor.MiddleLeft: _dstRoi.Location = new Point(0, (int)(ImageHeight / 2 - SrcRoi.Height / 2)); break; case Anchor.MiddleCenter: _dstRoi.Location = new Point((int)(ImageWidth / 2 - SrcRoi.Width / 2), (int)(ImageHeight / 2 - SrcRoi.Height / 2)); break; case Anchor.MiddleRight: _dstRoi.Location = new Point((int)(ImageWidth - SrcRoi.Width), (int)(ImageHeight / 2 - SrcRoi.Height / 2)); break; case Anchor.BottomLeft: _dstRoi.Location = new Point(0, (int)(ImageHeight - SrcRoi.Height)); break; case Anchor.BottomCenter: _dstRoi.Location = new Point((int)(ImageWidth / 2 - SrcRoi.Width / 2), (int)(ImageHeight - SrcRoi.Height)); break; case Anchor.BottomRight: _dstRoi.Location = new Point((int)(ImageWidth - SrcRoi.Width), (int)(ImageHeight - SrcRoi.Height)); break; default: throw new ArgumentOutOfRangeException(); } _dstRoi.X += MarginLeft; _dstRoi.X -= MarginRight; _dstRoi.Y += MarginTop; _dstRoi.Y -= MarginBottom; }*/ /// /// Fills the plate with maximum cols and rows /// public void Fill() { Cols = MaxCols; MarginCol = MaxMarginCol; Rows = MaxRows; MarginRow = MaxMarginRow; } public ushort CalculateMarginCol(ushort cols) { if (cols <= 1) return 0; return (ushort)((ImageWidth - SrcRoi.Width * cols) / cols); } public ushort CalculateMarginRow(ushort rows) { if (rows <= 1) return 0; return (ushort)((ImageHeight - SrcRoi.Height * rows) / rows); } public Rectangle GetRoi(ushort col, ushort row) { var patternVolume = GetPatternVolume; return new Rectangle(new Point( (int) (col * SrcRoi.Width + col * MarginCol + (ImageWidth - patternVolume.Width) / 2), (int) (row * SrcRoi.Height + row * MarginRow + (ImageHeight - patternVolume.Height) / 2)), SrcRoi.Size); } } }