private Rectangle[] GetOuterRimTransitionRectangles(DrawingSpaceUsage space)
 {
     return(GetRimTransitionRectangles(
                space.SquaresSpace,
                space.InnerRimTransitionThickness + space.RimThickness,
                space.OuterRimTransitionThickness
                ));
 }
        private void DrawRimSquares(Graphics g, DrawingSpaceUsage space)
        {
            DrawRimSquaresSide(g, space, BoardTheme.RimSide.Left);
            DrawRimSquaresSide(g, space, BoardTheme.RimSide.Right);
            DrawRimSquaresSide(g, space, BoardTheme.RimSide.Top);
            DrawRimSquaresSide(g, space, BoardTheme.RimSide.Bottom);

            DrawRimSquaresCorner(g, space, BoardTheme.RimCorner.TopLeft);
            DrawRimSquaresCorner(g, space, BoardTheme.RimCorner.TopRight);
            DrawRimSquaresCorner(g, space, BoardTheme.RimCorner.BottomLeft);
            DrawRimSquaresCorner(g, space, BoardTheme.RimCorner.BottomRight);
        }
        private void DrawIndicators(Graphics g, DrawingSpaceUsage space)
        {
            var rimConfig = BoardImages.Config.Rim;

            if (rimConfig != null && rimConfig.DrawIndicatorsOnRim)
            {
                DrawIndicatorsOnRim(g, space);
            }
            else
            {
                DrawIndicatorsOnSquares(g, space);
            }
        }
        private void DrawRimSquaresCorner(Graphics g, DrawingSpaceUsage space, BoardTheme.RimCorner corner)
        {
            bool isSquareLight = corner == BoardTheme.RimCorner.BottomRight || corner == BoardTheme.RimCorner.TopLeft;

            int rimThickness = space.RimThickness + space.InnerRimTransitionThickness;

            int x = 0;
            int y = 0;

            if (corner == BoardTheme.RimCorner.TopLeft)
            {
                y = space.SquaresSpace.Y - rimThickness;
                x = space.SquaresSpace.X - rimThickness;
            }
            else if (corner == BoardTheme.RimCorner.TopRight)
            {
                y = space.SquaresSpace.Y - rimThickness;
                x = space.SquaresSpace.X + space.SquaresSpace.Width;
            }
            else if (corner == BoardTheme.RimCorner.BottomLeft)
            {
                y = space.SquaresSpace.Y + space.SquaresSpace.Height;
                x = space.SquaresSpace.X - rimThickness;
            }
            else if (corner == BoardTheme.RimCorner.BottomRight)
            {
                y = space.SquaresSpace.Y + space.SquaresSpace.Height;
                x = space.SquaresSpace.X + space.SquaresSpace.Width;
            }

            var image =
                isSquareLight
                ? BoardImages.LightRimCorner[corner]
                : BoardImages.DarkRimCorner[corner];

            var rect = new Rectangle(x, y, rimThickness, rimThickness);

            g.DrawImage(image, rect);
        }
        private void DrawRim(Graphics g, DrawingSpaceUsage space)
        {
            var rimConfig = BoardImages.Config.Rim;

            if (rimConfig == null)
            {
                return;
            }

            DrawRimSquares(g, space);

            if (rimConfig.InnerTransition != null)
            {
                var innerTransitionRects = GetInnerRimTransitionRectangles(space);
                g.FillRectangles(rimConfig.InnerTransition.Brush, innerTransitionRects);
            }

            if (rimConfig.OuterTransition != null)
            {
                var outerTransitionRects = GetOuterRimTransitionRectangles(space);
                g.FillRectangles(rimConfig.OuterTransition.Brush, outerTransitionRects);
            }
        }
        private void DrawRimSquaresSide(Graphics g, DrawingSpaceUsage space, BoardTheme.RimSide side)
        {
            bool isHorizontal  = side == BoardTheme.RimSide.Bottom || side == BoardTheme.RimSide.Top;
            bool isSquareLight = side == BoardTheme.RimSide.Bottom || side == BoardTheme.RimSide.Right;

            int squareW      = space.SquaresSpace.Width / 8;
            int squareH      = space.SquaresSpace.Height / 8;
            int rimThickness = space.RimThickness + space.InnerRimTransitionThickness;

            int x = 0;
            int y = 0;
            int w = 0;
            int h = 0;

            if (side == BoardTheme.RimSide.Left)
            {
                y = space.SquaresSpace.Y;
                x = space.SquaresSpace.X - rimThickness;
                w = rimThickness;
                h = squareH;
            }
            else if (side == BoardTheme.RimSide.Right)
            {
                y = space.SquaresSpace.Y;
                x = space.SquaresSpace.X + space.SquaresSpace.Width;
                w = rimThickness;
                h = squareH;
            }
            else if (side == BoardTheme.RimSide.Top)
            {
                y = space.SquaresSpace.Y - rimThickness;
                x = space.SquaresSpace.X;
                w = squareW;
                h = rimThickness;
            }
            else if (side == BoardTheme.RimSide.Bottom)
            {
                y = space.SquaresSpace.Y + space.SquaresSpace.Height;
                x = space.SquaresSpace.X;
                w = squareW;
                h = rimThickness;
            }

            int xIncr = isHorizontal ? squareW : 0;
            int yIncr = !isHorizontal ? squareH : 0;

            for (int i = 0; i < 8; ++i)
            {
                var image =
                    isSquareLight
                    ? BoardImages.LightRimSide[side]
                    : BoardImages.DarkRimSide[side];

                var rect = new Rectangle(x, y, w, h);

                g.DrawImage(image, rect);

                isSquareLight = !isSquareLight;
                x            += xIncr;
                y            += yIncr;
            }
        }
        private void DrawIndicatorsOnSquares(Graphics g, DrawingSpaceUsage space)
        {
            var indicatorFile =
                IsBoardFlipped
                ? 7 - BoardImages.Config.Indicators.RelativeFile
                : BoardImages.Config.Indicators.RelativeFile;

            var indicatorRank =
                IsBoardFlipped
                ? 7 - BoardImages.Config.Indicators.RelativeRank
                : BoardImages.Config.Indicators.RelativeRank;

            int squareSize = space.SquaresSpace.Height / 8;
            var font       = BoardImages.Config.Indicators.GetScaledFont(squareSize);

            for (int file = 0; file < 8; ++file)
            {
                var rank       = indicatorRank;
                var squareRect = GetSquareHitbox(file, rank, space.SquaresSpace);

                bool isLightSquare = (file + rank) % 2 == 0;

                var brush =
                    isLightSquare
                    ? BoardImages.Config.Indicators.LightSquareBrush
                    : BoardImages.Config.Indicators.DarkSquareBrush;

                var text = string.Empty + BoardImages.Config.Indicators.FileIndicators[file];
                g.DrawString(
                    text,
                    font,
                    brush,
                    squareRect,
                    BoardImages.Config.Indicators.FileIndicatorFormat
                    );
            }

            for (int rank = 0; rank < 8; ++rank)
            {
                var file       = indicatorFile;
                var squareRect = GetSquareHitbox(file, rank, space.SquaresSpace);

                bool isLightSquare = (file + rank) % 2 == 0;

                var brush =
                    isLightSquare
                    ? BoardImages.Config.Indicators.LightSquareBrush
                    : BoardImages.Config.Indicators.DarkSquareBrush;

                if (file == indicatorFile)
                {
                    var text = string.Empty + BoardImages.Config.Indicators.RankIndicators[7 - rank];
                    g.DrawString(
                        text,
                        font,
                        brush,
                        squareRect,
                        BoardImages.Config.Indicators.RankIndicatorFormat
                        );
                }
            }
        }
        private Rectangle GetRimSideHitbox(int file, int rank, BoardTheme.RimSide side, DrawingSpaceUsage space)
        {
            bool isHorizontal = side == BoardTheme.RimSide.Bottom || side == BoardTheme.RimSide.Top;

            int squareW      = space.SquaresSpace.Width / 8;
            int squareH      = space.SquaresSpace.Height / 8;
            int rimThickness = space.RimThickness;
            int innerRimTransitionThickness = space.InnerRimTransitionThickness;

            int x = 0;
            int y = 0;
            int w = 0;
            int h = 0;

            if (side == BoardTheme.RimSide.Left)
            {
                y = space.SquaresSpace.Y;
                x = space.SquaresSpace.X - rimThickness - space.InnerRimTransitionThickness;
                w = rimThickness;
                h = squareH;
            }
            else if (side == BoardTheme.RimSide.Right)
            {
                y = space.SquaresSpace.Y;
                x = space.SquaresSpace.X + space.SquaresSpace.Width + space.InnerRimTransitionThickness;
                w = rimThickness;
                h = squareH;
            }
            else if (side == BoardTheme.RimSide.Top)
            {
                y = space.SquaresSpace.Y - rimThickness - space.InnerRimTransitionThickness;
                x = space.SquaresSpace.X;
                w = squareW;
                h = rimThickness;
            }
            else if (side == BoardTheme.RimSide.Bottom)
            {
                y = space.SquaresSpace.Y + space.SquaresSpace.Height + space.InnerRimTransitionThickness;
                x = space.SquaresSpace.X;
                w = squareW;
                h = rimThickness;
            }

            int xIncr = isHorizontal ? squareW : 0;
            int yIncr = !isHorizontal ? squareH : 0;

            return(new Rectangle(x + file * xIncr, y + rank * yIncr, w, h));
        }
        private void DrawIndicatorsOnRim(Graphics g, DrawingSpaceUsage space)
        {
            var rimConfig = BoardImages.Config.Rim;

            if (rimConfig == null)
            {
                return;
            }

            var rankIndicatorSides = new List <BoardTheme.RimSide>();

            if (rimConfig.IndicatorsOnBothSides)
            {
                rankIndicatorSides.Add(BoardTheme.RimSide.Left);
                rankIndicatorSides.Add(BoardTheme.RimSide.Right);
            }
            else
            {
                rankIndicatorSides.Add(
                    BoardImages.Config.Indicators.RelativeFile == 0
                    ? BoardTheme.RimSide.Left
                    : BoardTheme.RimSide.Right
                    );
            }

            var fileIndicatorSides = new List <BoardTheme.RimSide>();

            if (rimConfig.IndicatorsOnBothSides)
            {
                fileIndicatorSides.Add(BoardTheme.RimSide.Bottom);
                fileIndicatorSides.Add(BoardTheme.RimSide.Top);
            }
            else
            {
                fileIndicatorSides.Add(
                    BoardImages.Config.Indicators.RelativeRank == 0
                    ? BoardTheme.RimSide.Top
                    : BoardTheme.RimSide.Bottom
                    );
            }

            int squareSize = space.SquaresSpace.Height / 8;
            var font       = BoardImages.Config.Indicators.GetScaledFont(squareSize);

            for (int relativeFile = 0; relativeFile < 8; ++relativeFile)
            {
                foreach (var side in fileIndicatorSides)
                {
                    int relativeRank = side == BoardTheme.RimSide.Top ? 0 : 7;

                    int file =
                        IsBoardFlipped
                        ? 7 - relativeFile
                        : relativeFile;

                    int rank =
                        IsBoardFlipped
                        ? 7 - relativeRank
                        : relativeRank;

                    bool isLightSquare = (file + rank) % 2 == 1;

                    var rect = GetRimSideHitbox(file, rank, side, space);

                    var brush =
                        isLightSquare
                        ? BoardImages.Config.Indicators.LightSquareBrush
                        : BoardImages.Config.Indicators.DarkSquareBrush;

                    var text = string.Empty + BoardImages.Config.Indicators.FileIndicators[relativeFile];
                    g.DrawString(
                        text,
                        font,
                        brush,
                        rect,
                        BoardImages.Config.Indicators.FileIndicatorFormat
                        );
                }
            }

            for (int relativeRank = 0; relativeRank < 8; ++relativeRank)
            {
                foreach (var side in rankIndicatorSides)
                {
                    int relativeFile = side == BoardTheme.RimSide.Left ? 0 : 7;

                    int file =
                        IsBoardFlipped
                        ? 7 - relativeFile
                        : relativeFile;

                    int rank =
                        IsBoardFlipped
                        ? 7 - relativeRank
                        : relativeRank;

                    bool isLightSquare = (file + rank) % 2 == 1;

                    var rect = GetRimSideHitbox(file, rank, side, space);

                    var brush =
                        isLightSquare
                        ? BoardImages.Config.Indicators.LightSquareBrush
                        : BoardImages.Config.Indicators.DarkSquareBrush;

                    var text = string.Empty + BoardImages.Config.Indicators.RankIndicators[7 - relativeRank];
                    g.DrawString(
                        text,
                        font,
                        brush,
                        rect,
                        BoardImages.Config.Indicators.FileIndicatorFormat
                        );
                }
            }
        }