private static void DrawMarqueeToolRectangular(this CanvasDrawingSession drawingSession, ICanvasResourceCreator resourceCreator, TransformerRect transformerRect, Rect sourceRectangle, MarqueeCompositeMode compositeMode = MarqueeCompositeMode.New)
        {
            switch (compositeMode)
            {
            case MarqueeCompositeMode.New:
            {
                drawingSession.Clear(Windows.UI.Colors.Transparent);
                Rect rect = transformerRect.ToRect();
                drawingSession.FillRectangle(rect, Windows.UI.Colors.DodgerBlue);
            }
            break;

            case MarqueeCompositeMode.Add:
            {
                Rect rect = transformerRect.ToRect();
                drawingSession.FillRectangle(rect, Windows.UI.Colors.DodgerBlue);
            }
            break;

            case MarqueeCompositeMode.Subtract:
            {
                CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolRectangular(drawingSession, resourceCreator, transformerRect);
                CanvasComposite   canvasComposite   = CanvasComposite.DestinationOut;
                drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite);
            }
            break;

            case MarqueeCompositeMode.Intersect:
            {
                CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolRectangular(drawingSession, resourceCreator, transformerRect);
                CanvasComposite   canvasComposite   = CanvasComposite.DestinationIn;
                drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite);
            }
            break;

            case MarqueeCompositeMode.Xor:
            {
                CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolRectangular(drawingSession, resourceCreator, transformerRect);
                CanvasComposite   canvasComposite   = CanvasComposite.Xor;
                drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite);
            }
            break;
            }
        }
        private static void DrawMarqueeToolEllipse(this CanvasDrawingSession drawingSession, ICanvasResourceCreator resourceCreator, TransformerRect transformerRect, Rect sourceRectangle, MarqueeCompositeMode compositeMode = MarqueeCompositeMode.New)
        {
            switch (compositeMode)
            {
            case MarqueeCompositeMode.New:
            {
                drawingSession.Clear(Windows.UI.Colors.Transparent);

                Vector2 centerPoint = transformerRect.Center;
                float   width       = transformerRect.Width / 2;
                float   height      = transformerRect.Height / 2;

                drawingSession.FillEllipse(centerPoint, width, height, Windows.UI.Colors.DodgerBlue);
            }
            break;

            case MarqueeCompositeMode.Add:
            {
                Vector2 centerPoint = transformerRect.Center;
                float   width       = transformerRect.Width / 2;
                float   height      = transformerRect.Height / 2;

                drawingSession.FillEllipse(centerPoint, width, height, Windows.UI.Colors.DodgerBlue);
            }
            break;

            case MarqueeCompositeMode.Subtract:
            {
                CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolEllipse(drawingSession, resourceCreator, transformerRect);
                CanvasComposite   canvasComposite   = CanvasComposite.DestinationOut;
                drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite);
            }
            break;

            case MarqueeCompositeMode.Intersect:
            {
                CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolEllipse(drawingSession, resourceCreator, transformerRect);
                CanvasComposite   canvasComposite   = CanvasComposite.DestinationIn;
                drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite);
            }
            break;

            case MarqueeCompositeMode.Xor:
            {
                CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolEllipse(drawingSession, resourceCreator, transformerRect);
                CanvasComposite   canvasComposite   = CanvasComposite.Xor;
                drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite);
            }
            break;
            }
        }
        /// <summary>
        /// Fill a marquee mask with a marquee-tool.
        /// </summary>
        /// <param name="drawingSession"> The drawing-session. </param>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="toolType"> The marquee-tool type. </param>
        /// <param name="marqueeTool"> The marquee-tool. </param>
        /// <param name="sourceRectangle"> The source rectangle. </param>
        /// <param name="compositeMode"> The composite mode. </param>
        public static void FillMarqueeMaskl(this CanvasDrawingSession drawingSession, ICanvasResourceCreator resourceCreator, MarqueeToolType toolType, MarqueeTool marqueeTool, Rect sourceRectangle, MarqueeCompositeMode compositeMode)
        {
            switch (toolType)
            {
            case MarqueeToolType.Rectangular:
                drawingSession.DrawMarqueeToolRectangular(resourceCreator, marqueeTool.TransformerRect, sourceRectangle, compositeMode);
                break;

            case MarqueeToolType.Elliptical:
                drawingSession.DrawMarqueeToolEllipse(resourceCreator, marqueeTool.TransformerRect, sourceRectangle, compositeMode);
                break;

            case MarqueeToolType.Polygonal:
            case MarqueeToolType.FreeHand:
                Vector2[]      points         = marqueeTool.Points.ToArray();
                CanvasGeometry canvasGeometry = CanvasGeometry.CreatePolygon(resourceCreator, marqueeTool.Points.ToArray());
                drawingSession.DrawMarqueeToolGeometry(resourceCreator, canvasGeometry, sourceRectangle, compositeMode);
                break;
            }
        }