Example #1
0
            void SetPattern()
            {
                var t = CGAffineTransform.Multiply(transform, viewTransform);

                ClearPattern();
                pattern = new CGPattern(new sd.RectangleF(0, 0, image.Width, image.Height), t, image.Width, image.Height, CGPatternTiling.NoDistortion, true, DrawPattern);
            }
Example #2
0
 void ClearPattern()
 {
     if (pattern != null)
     {
         pattern.Dispose();
     }
     pattern = null;
 }
Example #3
0
            void SetPattern()
            {
                var t = this.transform;

                if (viewTransform != null)
                {
                    t.Multiply(viewTransform.Value);
                }
                ClearPattern();
                pattern = new CGPattern(new sd.RectangleF(0, 0, image.Width, image.Height), t, image.Width, image.Height, CGPatternTiling.ConstantSpacing, true, DrawPattern);
            }
Example #4
0
        // TODO: Want to create and retain UIImage so it doesn't have to be reloaded!!!!

        void RenderImageBrush(CGContext context, ImageBrush imageBrush, bool isFill)
        {
            UIImage image = imageBrush.NativeBitmap as UIImage;

            if (image == null)
            {
                return;
            }

            System.Diagnostics.Debug.WriteLine("Image: {0} x {1}", image.CGImage.Width, image.CGImage.Height);

            using (CGColorSpace space = CGColorSpace.CreatePattern(null))
            {
                if (isFill)
                {
                    context.SetFillColorSpace(space);
                }
                else
                {
                    context.SetStrokeColorSpace(space);
                }
            }

            nfloat scale = UIScreen.MainScreen.NativeScale;
            CGRect cell  = new CGRect(0, 0, image.Size.Width / scale, image.Size.Height / scale);

            using (CGPattern pattern = new CGPattern(cell,
                                                     CGAffineTransform.MakeIdentity(),
                                                     cell.Width, cell.Height,
                                                     CGPatternTiling.NoDistortion,
                                                     true,
                                                     (CGContext localContext) =>
            {
                localContext.DrawImage(cell, image.CGImage);
            }))
            {
                nfloat[] alpha = { 1 };

                if (isFill)
                {
                    context.SetFillPattern(pattern, alpha);
                    context.FillPath();
                }
                else
                {
                    context.SetStrokePattern(pattern, alpha);
                    context.StrokePath();
                }
            }
        }
Example #5
0
        public UIImage GetRenderedPattern()
        {
            var patternBounds = new CGRect(0, 0, 12, 12);
            var bounds        = new CGRect(0, 0, patternBounds.Width * patternBounds.Width, patternBounds.Height * patternBounds.Height);

#if __MACOS__
            var img = new NSImage(bounds.Size);
            img.LockFocus();
            var context = NSGraphicsContext.CurrentContext.GraphicsPort;
#else
            UIGraphics.BeginImageContextWithOptions(bounds.Size, false, 0);
            var context = UIGraphics.GetCurrentContext();
#endif
            try {
                context.SetStrokeColor(UIColor.Blue.CGColor);
                context.AddEllipseInRect(bounds);

                using (var patternColorSpace = CGColorSpace.CreatePattern(null)) {
                    context.SetFillColorSpace(patternColorSpace);

                    using (var pattern = new CGPattern(patternBounds, CGAffineTransform.MakeIdentity(), patternBounds.Width, patternBounds.Height, CGPatternTiling.ConstantSpacing, true, ctx => {
                        ctx.SetStrokeColor(UIColor.Green.CGColor);
                        ctx.SetLineWidth(1);
                        ctx.MoveTo(2, 6);
                        ctx.AddLineToPoint(10, 6);
                        ctx.MoveTo(6, 2);
                        ctx.AddLineToPoint(6, 10);
                        ctx.StrokePath();
                    })) {
                        context.SetFillPattern(pattern, new nfloat [] { 1 });
                    }
                }

                context.DrawPath(CGPathDrawingMode.FillStroke);

#if __MACOS__
                return(img);
#else
                return(UIGraphics.GetImageFromCurrentImageContext());
#endif
            } finally {
#if __MACOS__
                img.UnlockFocus();
#else
                UIGraphics.EndImageContext();
#endif
            }
        }
            void SetPattern()
            {
                sectionSize = new sd.SizeF((EndPoint.X - StartPoint.X) + 1, (EndPoint.Y - StartPoint.Y) + 1);
                if (Wrap == GradientWrapMode.Reflect)
                {
                    tileSize = new sd.SizeF(sectionSize.Width * 4, sectionSize.Height * 4);
                }
                else
                {
                    tileSize = new sd.SizeF(sectionSize.Width * 2, sectionSize.Height * 2);
                }
                var rect = new sd.RectangleF(StartPoint, tileSize);
                var t    = CGAffineTransform.Multiply(transform, viewTransform);

                pattern = new CGPattern(rect, t, rect.Width, rect.Height, CGPatternTiling.NoDistortion, true, DrawPattern);
            }
        //========================================================================

        #endregion
        //========================================================================

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            //---- set the background color of the view to white
            this.View.BackgroundColor = UIColor.White;

            //---- instantiate a new image view that takes up the whole screen and add it to
            // the view hierarchy
            RectangleF imageViewFrame = new RectangleF(0, -this.NavigationController.NavigationBar.Frame.Height, this.View.Frame.Width, this.View.Frame.Height);

            this._imageView = new UIImageView(imageViewFrame);
            this.View.AddSubview(this._imageView);

            //---- create our offscreen bitmap context
            // size
            SizeF bitmapSize = new SizeF(this.View.Frame.Size);

            using (CGBitmapContext context = new CGBitmapContext(IntPtr.Zero
                                                                 , (int)bitmapSize.Width, (int)bitmapSize.Height, 8
                                                                 , (int)(4 * bitmapSize.Width), CGColorSpace.CreateDeviceRGB()
                                                                 , CGImageAlphaInfo.PremultipliedFirst))
            {
                //---- declare vars
                RectangleF patternRect = new RectangleF(0, 0, 16, 16);

                //---- set the color space of our fill to be the patter colorspace
                context.SetFillColorSpace(CGColorSpace.CreatePattern(null));

                //---- create a new pattern
                CGPattern pattern = new CGPattern(patternRect
                                                  , CGAffineTransform.MakeRotation(.3f), 16, 16, CGPatternTiling.NoDistortion
                                                  , true, DrawPolkaDotPattern);

                //---- set our fill as our pattern, color doesn't matter because the pattern handles it
                context.SetFillPattern(pattern, new float[] { 1 });

                //---- fill the entire view with that pattern
                context.FillRect(this._imageView.Frame);

                //---- output the drawing to the view
                this._imageView.Image = UIImage.FromImage(context.ToImage());
            }
        }
Example #8
0
        void SetupPattern(CGContextBackend gc)
        {
            gc.Context.SetPatternPhase(new CGSize(0, 0));

            if (gc.CurrentStatus.Pattern is GradientInfo)
            {
                return;
            }

            if (gc.CurrentStatus.Pattern is ImagePatternInfo)
            {
                var pi     = (ImagePatternInfo)gc.CurrentStatus.Pattern;
                var bounds = new CGRect(CGPoint.Empty, new CGSize(pi.Image.Size.Width, pi.Image.Size.Height));
                var t      = CGAffineTransform.Multiply(CGAffineTransform.MakeScale(1f, -1f), gc.Context.GetCTM());

                CGPattern pattern;
                if (pi.Image is CustomImage)
                {
                    pattern = new CGPattern(bounds, t, bounds.Width, bounds.Height, CGPatternTiling.ConstantSpacing, true, c => {
                        c.TranslateCTM(0, bounds.Height);
                        c.ScaleCTM(1f, -1f);
                        ((CustomImage)pi.Image).DrawInContext(c);
                    });
                }
                else
                {
                    var     empty = CGRect.Empty;
                    CGImage cgimg = pi.Image.AsCGImage(ref empty, null, null);
                    pattern = new CGPattern(bounds, t, bounds.Width, bounds.Height,
                                            CGPatternTiling.ConstantSpacing, true, c => c.DrawImage(bounds, cgimg));
                }

                using (pattern)
                {
                    CGContext ctx   = gc.Context;
                    var       alpha = new[] { (nfloat)pi.Alpha };
                    ctx.SetFillColorSpace(Util.PatternColorSpace);
                    ctx.SetStrokeColorSpace(Util.PatternColorSpace);
                    ctx.SetFillPattern(pattern, alpha);
                    ctx.SetStrokePattern(pattern, alpha);
                }
            }
        }
Example #9
0
		public override void ViewDidLoad ()
		{
			base.ViewDidLoad ();
			
			// set the background color of the view to white
			View.BackgroundColor = UIColor.White;
			
			// instantiate a new image view that takes up the whole screen and add it to 
			// the view hierarchy
			RectangleF imageViewFrame = new RectangleF (0, -NavigationController.NavigationBar.Frame.Height, View.Frame.Width, View.Frame.Height);
			imageView = new UIImageView (imageViewFrame);
			View.AddSubview (imageView);
			
			// create our offscreen bitmap context
			// size
			SizeF bitmapSize = new SizeF (View.Frame.Size);
			using (CGBitmapContext context = new CGBitmapContext (IntPtr.Zero,
									      (int)bitmapSize.Width, (int)bitmapSize.Height, 8,
									      (int)(4 * bitmapSize.Width), CGColorSpace.CreateDeviceRGB (),
									      CGImageAlphaInfo.PremultipliedFirst)) {
				
				// declare vars
				RectangleF patternRect = new RectangleF (0, 0, 16, 16);
				
				// set the color space of our fill to be the patter colorspace
				context.SetFillColorSpace (CGColorSpace.CreatePattern (null));
				
				// create a new pattern
				CGPattern pattern = new CGPattern (patternRect,
								   CGAffineTransform.MakeRotation (.3f), 16, 16, CGPatternTiling.NoDistortion,
								   true, DrawPolkaDotPattern);
				
				// set our fill as our pattern, color doesn't matter because the pattern handles it
				context.SetFillPattern (pattern, new float[] { 1 });
				
				// fill the entire view with that pattern
				context.FillRect (imageView.Frame);
					
				// output the drawing to the view
				imageView.Image = UIImage.FromImage (context.ToImage ());
			}
		}
Example #10
0
            void SetPattern()
            {
                sectionSize = new sd.SizeF((EndPoint.X - StartPoint.X) + 1, (EndPoint.Y - StartPoint.Y) + 1);
                if (Wrap == GradientWrapMode.Reflect)
                {
                    tileSize = new sd.SizeF(sectionSize.Width * 4, sectionSize.Height * 4);
                }
                else
                {
                    tileSize = new sd.SizeF(sectionSize.Width * 2, sectionSize.Height * 2);
                }
                var rect = new sd.RectangleF(StartPoint, tileSize);
                var t    = this.transform;

                if (viewTransform != null)
                {
                    t.Multiply(viewTransform.Value);
                }
                pattern = new CGPattern(rect, t, rect.Width, rect.Height, CGPatternTiling.ConstantSpacingMinimalDistortion, true, DrawPattern);
            }
    public PatternDrawingView() : base()
    {
        // First we need to create a CGPattern that specifies the qualities of our pattern.

        using (var coloredPattern = new CGPattern(
                   new RectangleF(0, 0, 16, 16),     // the pattern coordinate space, drawing is clipped to this rectangle
                   CGAffineTransform.MakeIdentity(), // a transform on the pattern coordinate space used before it is drawn.
                   16, 16,                           // the spacing (horizontal, vertical) of the pattern - how far to move after drawing each cell
                   CGPatternTiling.NoDistortion,
                   true,                             // this is a colored pattern, which means that you only specify an alpha value when drawing it
                   DrawColored)){
            // To draw a pattern, you need a pattern colorspace.
            // Since this is an colored pattern, the parent colorspace is NULL, indicating that it only has an alpha value.
            using (var coloredPatternColorSpace = CGColorSpace.CreatePattern(null)){
                float alpha = 1;

                // Since this pattern is colored, we'll create a CGColor for it to make drawing it easier and more efficient.
                // From here on, the colored pattern is referenced entirely via the associated CGColor rather than the
                // originally created CGPatternRef.
                coloredPatternColor = new CGColor(coloredPatternColorSpace, coloredPattern, new float [] { alpha });
            }
        }

        // Uncolored Pattern setup
        // As above, we create a CGPattern that specifies the qualities of our pattern
        uncoloredPattern = new CGPattern(
            new RectangleF(0, 0, 16, 16),     // coordinate space
            CGAffineTransform.MakeIdentity(), // transform
            16, 16,                           // spacing
            CGPatternTiling.NoDistortion,
            false,                            // this is an uncolored pattern, thus to draw it we need to specify both color and alpha
            DrawUncolored);                   // callbacks for this pattern

        // With an uncolored pattern we still need to create a pattern colorspace, but now we need a parent colorspace
        // We'll use the DeviceRGB colorspace here. We'll need this colorspace along with the CGPatternRef to draw this pattern later.
        using (var deviceRGB = CGColorSpace.CreateDeviceRGB()){
            uncoloredPatternColorSpace = CGColorSpace.CreatePattern(deviceRGB);
        }
    }
        // https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_patterns/dq_patterns.html#//apple_ref/doc/uid/TP30001066-CH206-TPXREF101
        internal override void Setup(Graphics graphics, bool fill)
        {
            // if this is the same as the last that was set then return
            if (graphics.LastBrush == this)
            {
                return;
            }

            // obtain our width and height so we can set the pattern rectangle
            float hatch_width  = getHatchWidth(hatchStyle);
            float hatch_height = getHatchHeight(hatchStyle);

            //choose the pattern to be filled based on the currentPattern selected
            var patternSpace = CGColorSpace.CreatePattern(null);

            graphics.context.SetFillColorSpace(patternSpace);
            graphics.context.SetStrokeColorSpace(patternSpace);
            patternSpace.Dispose();

            // Pattern default work variables
            var patternRect      = new CGRect(HALF_PIXEL_X, HALF_PIXEL_Y, hatch_width + HALF_PIXEL_X, hatch_height + HALF_PIXEL_Y);
            var patternTransform = CGAffineTransform.MakeIdentity();

            // Since all the patterns were developed with MonoMac on Mac OS the coordinate system is
            // defaulted to the lower left corner being 0,0 which means for MonoTouch and any view
            // that is flipped we need to flip it again.  Yep should have thought about it to begin with
            // will look into changing it later if need be.
#if MONOMAC
            if (graphics.isFlipped)
            {
                patternTransform = new CGAffineTransform(1, 0, 0, -1, 0, hatch_height);
            }
#endif
#if MONOTOUCH
            if (!graphics.isFlipped)
            {
                patternTransform = new CGAffineTransform(1, 0, 0, -1, 0, hatch_height);
            }
#endif

            // DrawPattern callback which will be set depending on hatch style
            CGPattern.DrawPattern drawPattern;

            switch (hatchStyle)
            {
            case HatchStyle.Horizontal:
            case HatchStyle.LightHorizontal:
            case HatchStyle.NarrowHorizontal:
            case HatchStyle.DarkHorizontal:
                drawPattern = HatchHorizontal;
                break;

            case HatchStyle.Vertical:
            case HatchStyle.LightVertical:
            case HatchStyle.NarrowVertical:
            case HatchStyle.DarkVertical:
                patternTransform = CGAffineTransform.MakeRotation(90 * (float)Math.PI / 180);
                drawPattern      = HatchHorizontal;
                break;

            case HatchStyle.ForwardDiagonal:
            case HatchStyle.LightDownwardDiagonal:
            case HatchStyle.DarkDownwardDiagonal:
            case HatchStyle.WideDownwardDiagonal:
                // We will flip the x-axis here
                patternTransform = CGAffineTransform.MakeScale(-1, 1);
                drawPattern      = HatchUpwardDiagonal;
                break;

            case HatchStyle.BackwardDiagonal:
            case HatchStyle.LightUpwardDiagonal:
            case HatchStyle.DarkUpwardDiagonal:
            case HatchStyle.WideUpwardDiagonal:
                drawPattern = HatchUpwardDiagonal;
                break;

            case HatchStyle.LargeGrid:
            case HatchStyle.SmallGrid:
            case HatchStyle.DottedGrid:
                drawPattern = HatchGrid;
                break;

            case HatchStyle.DiagonalCross:
                drawPattern = HatchDiagonalCross;
                break;

            case HatchStyle.Percent05:
            case HatchStyle.Percent10:
            case HatchStyle.Percent20:
            case HatchStyle.Percent25:
            case HatchStyle.Percent30:
            case HatchStyle.Percent40:
            case HatchStyle.Percent50:
            case HatchStyle.Percent60:
            case HatchStyle.Percent70:
            case HatchStyle.Percent75:
            case HatchStyle.Percent80:
            case HatchStyle.Percent90:
                drawPattern = HatchPercentage;
                break;

            case HatchStyle.Sphere:
                drawPattern = HatchSphere;
                break;

            case HatchStyle.DashedDownwardDiagonal:
                patternTransform = CGAffineTransform.MakeScale(-1, 1);
                drawPattern      = HatchDashedDiagonal;
                break;

            case HatchStyle.DashedUpwardDiagonal:
                drawPattern = HatchDashedDiagonal;
                break;

            case HatchStyle.DashedHorizontal:
                drawPattern = HatchDashedHorizontal;
                break;

            case HatchStyle.DashedVertical:
                patternTransform = CGAffineTransform.MakeRotation(-90 * (float)Math.PI / 180);
                drawPattern      = HatchDashedHorizontal;
                break;

            case HatchStyle.LargeConfetti:
            case HatchStyle.SmallConfetti:
                drawPattern = HatchConfetti;
                break;

            case HatchStyle.ZigZag:
                drawPattern = HatchZigZag;
                break;

            case HatchStyle.Wave:
                drawPattern = HatchWave;
                break;

            case HatchStyle.HorizontalBrick:
                drawPattern = HatchHorizontalBrick;
                break;

            case HatchStyle.DiagonalBrick:
                drawPattern = HatchDiagonalBrick;
                break;

//			case HatchStyle.Weave:
//				drawPattern = HatchWeave;
//				break;
            case HatchStyle.Trellis:
                drawPattern = HatchTrellis;
                break;

            case HatchStyle.LargeCheckerBoard:
            case HatchStyle.SmallCheckerBoard:
                drawPattern = HatchCheckered;
                break;

            case HatchStyle.OutlinedDiamond:
                drawPattern = HatchOutlinedDiamond;
                break;

            case HatchStyle.SolidDiamond:
                drawPattern = HatchSolidDiamond;
                break;

            case HatchStyle.DottedDiamond:
                drawPattern = HatchDottedDiamond;
                break;

            case HatchStyle.Divot:
                drawPattern = HatchDivot;
                break;

            case HatchStyle.Shingle:
                drawPattern = HatchShingle;
                break;

            case HatchStyle.Plaid:
                drawPattern = HatchPlaid;
                break;

            default:
                drawPattern = DrawPolkaDotPattern;
                break;
            }

            //set the pattern as the Current Context’s fill pattern
            var pattern = new CGPattern(patternRect,
                                        patternTransform,
                                        hatch_width, hatch_height,
                                        CGPatternTiling.NoDistortion,
                                        true, drawPattern);
            //we dont need to set any color, as the pattern cell itself has chosen its own color
            graphics.context.SetFillPattern(pattern, new nfloat[] { 1 });
            graphics.context.SetStrokePattern(pattern, new nfloat[] { 1 });


            graphics.LastBrush = this;
            // I am setting this to be used for Text coloring in DrawString
            graphics.lastBrushColor = foreColor;
        }
        internal override void Setup(Graphics graphics, bool fill)
        {
            // if this is the same as the last that was set then return and no changes have been made
            // then return.
            if (graphics.LastBrush == this && !changed)
            {
                return;
            }

            // obtain our width and height so we can set the pattern rectangle
            float textureWidth  = textureImage.Width;
            float textureHeight = textureImage.Height;

            if (wrapMode == WrapMode.TileFlipX || wrapMode == WrapMode.TileFlipY)
            {
                textureWidth *= 2;
            }

            if (wrapMode == WrapMode.TileFlipXY)
            {
                textureWidth  *= 2;
                textureHeight *= 2;
            }

            //choose the pattern to be filled based on the currentPattern selected
            var patternSpace = CGColorSpace.CreatePattern(null);

            graphics.context.SetFillColorSpace(patternSpace);
            patternSpace.Dispose();

            // Pattern default work variables
            var patternRect = new CGRect(HALF_PIXEL_X, HALF_PIXEL_Y,
                                         textureWidth + HALF_PIXEL_X,
                                         textureHeight + HALF_PIXEL_Y);

            var patternTransform = graphics.context.GetCTM();

            patternTransform = CGAffineTransform.Multiply(textureTransform.transform, patternTransform);

            // DrawPattern callback which will be set depending on hatch style
            CGPattern.DrawPattern drawPattern;

            drawPattern = DrawTexture;

            //set the pattern as the Current Context’s fill pattern
            var pattern = new CGPattern(patternRect,
                                        patternTransform,
                                        textureWidth,
                                        textureHeight,
                                        //textureHeight,
                                        CGPatternTiling.NoDistortion,
                                        true, drawPattern);

            //we dont need to set any color, as the pattern cell itself has chosen its own color
            graphics.context.SetFillPattern(pattern, new nfloat[] { 1 });

            changed = false;

            graphics.LastBrush = this;
            // I am setting this to be used for Text coloring in DrawString
            //graphics.lastBrushColor = foreColor;
        }
        // https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_patterns/dq_patterns.html#//apple_ref/doc/uid/TP30001066-CH206-TPXREF101
        internal override void Setup(Graphics graphics, bool fill)
        {
            // if this is the same as the last that was set then return
            if (graphics.LastBrush == this)
                return;

            // obtain our width and height so we can set the pattern rectangle
            float hatch_width = getHatchWidth (hatchStyle);
            float hatch_height = getHatchHeight (hatchStyle);

            //choose the pattern to be filled based on the currentPattern selected
            var patternSpace = CGColorSpace.CreatePattern(null);
            graphics.context.SetFillColorSpace(patternSpace);
            patternSpace.Dispose();

            // Pattern default work variables
            var patternRect = new CGRect (HALF_PIXEL_X,HALF_PIXEL_Y,hatch_width+HALF_PIXEL_X,hatch_height+HALF_PIXEL_Y);
            var patternTransform = CGAffineTransform.MakeIdentity();

            // Since all the patterns were developed with MonoMac on Mac OS the coordinate system is
            // defaulted to the lower left corner being 0,0 which means for MonoTouch and any view
            // that is flipped we need to flip it again.  Yep should have thought about it to begin with
            // will look into changing it later if need be.
            #if MONOMAC
            if (graphics.isFlipped)
                patternTransform = new CGAffineTransform(1, 0, 0, -1, 0, hatch_height);
            #endif
            #if MONOTOUCH
            if (!graphics.isFlipped)
                patternTransform = new CGAffineTransform(1, 0, 0, -1, 0, hatch_height);
            #endif

            // DrawPattern callback which will be set depending on hatch style
            CGPattern.DrawPattern drawPattern;

            switch (hatchStyle)
            {
            case HatchStyle.Horizontal:
            case HatchStyle.LightHorizontal:
            case HatchStyle.NarrowHorizontal:
            case HatchStyle.DarkHorizontal:
                drawPattern = HatchHorizontal;
                break;
            case HatchStyle.Vertical:
            case HatchStyle.LightVertical:
            case HatchStyle.NarrowVertical:
            case HatchStyle.DarkVertical:
                patternTransform = CGAffineTransform.MakeRotation(90 * (float)Math.PI / 180);
                drawPattern = HatchHorizontal;
                break;
            case HatchStyle.ForwardDiagonal:
            case HatchStyle.LightDownwardDiagonal:
            case HatchStyle.DarkDownwardDiagonal:
            case HatchStyle.WideDownwardDiagonal:
                // We will flip the x-axis here
                patternTransform = CGAffineTransform.MakeScale(-1,1);
                drawPattern = HatchUpwardDiagonal;
                break;
            case HatchStyle.BackwardDiagonal:
            case HatchStyle.LightUpwardDiagonal:
            case HatchStyle.DarkUpwardDiagonal:
            case HatchStyle.WideUpwardDiagonal:
                drawPattern = HatchUpwardDiagonal;
                break;
            case HatchStyle.LargeGrid:
            case HatchStyle.SmallGrid:
            case HatchStyle.DottedGrid:
                drawPattern = HatchGrid;
                break;
            case HatchStyle.DiagonalCross:
                drawPattern = HatchDiagonalCross;
                break;
            case HatchStyle.Percent05:
            case HatchStyle.Percent10:
            case HatchStyle.Percent20:
            case HatchStyle.Percent25:
            case HatchStyle.Percent30:
            case HatchStyle.Percent40:
            case HatchStyle.Percent50:
            case HatchStyle.Percent60:
            case HatchStyle.Percent70:
            case HatchStyle.Percent75:
            case HatchStyle.Percent80:
            case HatchStyle.Percent90:
                drawPattern = HatchPercentage;
                break;
            case HatchStyle.Sphere:
                drawPattern = HatchSphere;
                break;
            case HatchStyle.DashedDownwardDiagonal:
                patternTransform = CGAffineTransform.MakeScale(-1,1);
                drawPattern = HatchDashedDiagonal;
                break;
            case HatchStyle.DashedUpwardDiagonal:
                drawPattern = HatchDashedDiagonal;
                break;
            case HatchStyle.DashedHorizontal:
                drawPattern = HatchDashedHorizontal;
                break;
            case HatchStyle.DashedVertical:
                patternTransform = CGAffineTransform.MakeRotation(-90 * (float)Math.PI / 180);
                drawPattern = HatchDashedHorizontal;
                break;
            case HatchStyle.LargeConfetti:
            case HatchStyle.SmallConfetti:
                drawPattern = HatchConfetti;
                break;
            case HatchStyle.ZigZag:
                drawPattern = HatchZigZag;
                break;
            case HatchStyle.Wave:
                drawPattern = HatchWave;
                break;
            case HatchStyle.HorizontalBrick:
                drawPattern = HatchHorizontalBrick;
                break;
            case HatchStyle.DiagonalBrick:
                drawPattern = HatchDiagonalBrick;
                break;
            //			case HatchStyle.Weave:
            //				drawPattern = HatchWeave;
            //				break;
            case HatchStyle.Trellis:
                drawPattern = HatchTrellis;
                break;
            case HatchStyle.LargeCheckerBoard:
            case HatchStyle.SmallCheckerBoard:
                drawPattern = HatchCheckered;
                break;
            case HatchStyle.OutlinedDiamond:
                drawPattern = HatchOutlinedDiamond;
                break;
            case HatchStyle.SolidDiamond:
                drawPattern = HatchSolidDiamond;
                break;
            case HatchStyle.DottedDiamond:
                drawPattern = HatchDottedDiamond;
                break;
            case HatchStyle.Divot:
                drawPattern = HatchDivot;
                break;
            case HatchStyle.Shingle:
                drawPattern = HatchShingle;
                break;
            case HatchStyle.Plaid:
                drawPattern = HatchPlaid;
                break;
            default:
                drawPattern = DrawPolkaDotPattern;
                break;
            }

            //set the pattern as the Current Context’s fill pattern
            var pattern = new CGPattern(patternRect,
                                    patternTransform,
                                    hatch_width,hatch_height,
                                        CGPatternTiling.NoDistortion,
                                    true, drawPattern);
            //we dont need to set any color, as the pattern cell itself has chosen its own color
            graphics.context.SetFillPattern(pattern, new nfloat[] { 1 });

            graphics.LastBrush = this;
            // I am setting this to be used for Text coloring in DrawString
            graphics.lastBrushColor = foreColor;
        }
    public PatternDrawingView()
        : base()
    {
        // First we need to create a CGPattern that specifies the qualities of our pattern.

        using (var coloredPattern = new CGPattern (
                   new RectangleF(0, 0, 16, 16), // the pattern coordinate space, drawing is clipped to this rectangle
                   CGAffineTransform.MakeIdentity (), // a transform on the pattern coordinate space used before it is drawn.
                   16, 16, // the spacing (horizontal, vertical) of the pattern - how far to move after drawing each cell
                   CGPatternTiling.NoDistortion,
                   true, // this is a colored pattern, which means that you only specify an alpha value when drawing it
                   DrawColored)){

            // To draw a pattern, you need a pattern colorspace.
            // Since this is an colored pattern, the parent colorspace is NULL, indicating that it only has an alpha value.
            using (var coloredPatternColorSpace = CGColorSpace.CreatePattern (null)){
                float alpha = 1;

                // Since this pattern is colored, we'll create a CGColor for it to make drawing it easier and more efficient.
                // From here on, the colored pattern is referenced entirely via the associated CGColor rather than the
                // originally created CGPatternRef.
                coloredPatternColor = new CGColor (coloredPatternColorSpace, coloredPattern, new float [] { alpha });
            }
        }

        // Uncolored Pattern setup
        // As above, we create a CGPattern that specifies the qualities of our pattern
        uncoloredPattern = new CGPattern (
            new RectangleF(0, 0, 16, 16), // coordinate space
            CGAffineTransform.MakeIdentity (), // transform
            16, 16, // spacing
            CGPatternTiling.NoDistortion,
            false, // this is an uncolored pattern, thus to draw it we need to specify both color and alpha
            DrawUncolored); // callbacks for this pattern

            // With an uncolored pattern we still need to create a pattern colorspace, but now we need a parent colorspace
            // We'll use the DeviceRGB colorspace here. We'll need this colorspace along with the CGPatternRef to draw this pattern later.
        using (var deviceRGB = CGColorSpace.CreateDeviceRGB()){
            uncoloredPatternColorSpace = CGColorSpace.CreatePattern(deviceRGB);
        }
    }
        internal override void Setup(Graphics graphics, bool fill)
        {
            // if this is the same as the last that was set then return and no changes have been made
            // then return.
            if (graphics.LastBrush == this && !changed)
                return;

            // obtain our width and height so we can set the pattern rectangle
            float textureWidth = textureImage.Width;
            float textureHeight = textureImage.Height;

            if (wrapMode == WrapMode.TileFlipX || wrapMode == WrapMode.TileFlipY)
                textureWidth *= 2;

            if (wrapMode == WrapMode.TileFlipXY)
            {
                textureWidth *= 2;
                textureHeight *= 2;
            }

            // this is here for testing only
            var textureOffset = new PointF(0,-0);

            //choose the pattern to be filled based on the currentPattern selected
            var patternSpace = CGColorSpace.CreatePattern(null);
            graphics.context.SetFillColorSpace(patternSpace);
            patternSpace.Dispose();

            // Pattern default work variables
            var patternRect = new CGRect (HALF_PIXEL_X,HALF_PIXEL_Y,
                                             textureWidth+HALF_PIXEL_X,
                                             textureHeight+HALF_PIXEL_Y);
            var patternTransform = CGAffineTransform.MakeIdentity();

            // We need to take into account the orientation of the graphics object
            #if MONOMAC
            if (!graphics.isFlipped)
                patternTransform = new CGAffineTransform(1, 0, 0, -1,
                                                         textureOffset.X,
                                                         textureHeight + textureOffset.Y);
            #endif
            #if MONOTOUCH
            if (graphics.isFlipped)
                patternTransform = new CGAffineTransform(1, 0, 0, -1,
                                                         textureOffset.X,
                                                         textureHeight + textureOffset.Y);
            #endif

            patternTransform = CGAffineTransform.Multiply(patternTransform, textureTransform.transform);

            // DrawPattern callback which will be set depending on hatch style
            CGPattern.DrawPattern drawPattern;

            drawPattern = DrawTexture;

            //set the pattern as the Current Context’s fill pattern
            var pattern = new CGPattern(patternRect,
                                        patternTransform,
                                        textureWidth,
                                        textureHeight,
                                        //textureHeight,
                                        CGPatternTiling.NoDistortion,
                                        true, drawPattern);
            //we dont need to set any color, as the pattern cell itself has chosen its own color
            graphics.context.SetFillPattern(pattern, new nfloat[] { 1 });

            changed = false;

            graphics.LastBrush = this;
            // I am setting this to be used for Text coloring in DrawString
            //graphics.lastBrushColor = foreColor;
        }