[winforms] Style
[mono.git] / mcs / class / System.Drawing / System.Drawing / TextureBrush.jvm.cs
index 6872f116a4c555ba2c944e62920037bd30f97c2a..f940dfb7423083ebea5a670ded996e0850f83b15 100644 (file)
@@ -40,14 +40,15 @@ using awt = java.awt;
 using geom = java.awt.geom;
 using image = java.awt.image;
 
-namespace System.Drawing
-{
+namespace System.Drawing {
        /// <summary>
        /// Summary description for TextureBrush.
        /// </summary>
-       public sealed class TextureBrush : Brush
-       {
-               awt.TexturePaint _nativeObject;
+       public sealed class TextureBrush : Brush {
+               readonly awt.TexturePaint _nativeObject;
+               RectangleF _sourceRectangle;
+               Image _texture = null;
+               WrapMode _wrapMode;
 
                protected override java.awt.Paint NativeObject {
                        get {
@@ -55,82 +56,113 @@ namespace System.Drawing
                        }
                }
 
+               #region ctors
 
-               WrapMode _wrapMode;
-
-               TextureBrush (awt.TexturePaint ptr)
-               {
-                       _nativeObject = ptr;
+               public TextureBrush (Image image) : this (image, WrapMode.Tile) {
                }
 
-               public TextureBrush (Image image) : this (image, WrapMode.Tile)
-               {
+               public TextureBrush (Image image, WrapMode wrapMode) : 
+                       this( image, wrapMode, new RectangleF(0, 0, image.Width, image.Height )){
                }
 
-               public TextureBrush (Image image, Rectangle dstRect)
-               {
+               public TextureBrush (Image image, Rectangle dstRect) : 
+                       this( image, WrapMode.Tile, dstRect ) {
                }
 
-               public TextureBrush (Image image, RectangleF dstRect)
-               {
-                       // FIXME: check if not metafile
-                       _nativeObject = new awt.TexturePaint((image.BufferedImage)image.NativeObject.CurrentImage.NativeImage,
-                               new geom.Rectangle2D.Float((float)dstRect.X,(float)dstRect.Y,(float)dstRect.Width,
-                               (float)dstRect.Height));
+               public TextureBrush (Image image, RectangleF dstRect) : 
+                       this( image, WrapMode.Tile, dstRect ) {
                }
 
-               public TextureBrush (Image image, WrapMode wrapMode)
-               {
-                       // FIXME: check if not metafile
-                       // TBD: WRAP MODE
-                       _nativeObject = new awt.TexturePaint((image.BufferedImage)image.NativeObject.CurrentImage.NativeImage,
-                               new geom.Rectangle2D.Float(0,0,1,1));
+               [MonoTODO]
+               public TextureBrush (Image image, Rectangle dstRect, ImageAttributes imageAttr) : this( image, dstRect ) {
+                       // TBD: Implement ImageAttributes
                }
 
-               public TextureBrush (Image image, Rectangle dstRect, ImageAttributes imageAttr)
-               {
-                       throw new NotImplementedException();
+               [MonoTODO]
+               public TextureBrush (Image image, RectangleF dstRect, ImageAttributes imageAttr) : this( image, dstRect ) {
+                       // TBD: Implement ImageAttributes
                }
 
-               public TextureBrush (Image image, RectangleF dstRect, ImageAttributes imageAttr)
-               {
-                       throw new NotImplementedException();
+               public TextureBrush (Image image, WrapMode wrapMode, Rectangle dstRect) :
+                       this( image, wrapMode, new RectangleF(dstRect.X, dstRect.Y, dstRect.Width, dstRect.Height )){
                }
 
-               public TextureBrush (Image image, WrapMode wrapMode, Rectangle dstRect)
-               {
-                       // FIXME: check if not metafile
-                       // TBD:WRAP MODE
-                       _nativeObject = new awt.TexturePaint((image.BufferedImage)image.NativeObject.CurrentImage.NativeImage,
-                               new geom.Rectangle2D.Float ((float)dstRect.X,(float)dstRect.Y,(float)dstRect.Width,(float)dstRect.Height));
-               }
+               [MonoTODO]
+               public TextureBrush (Image image, WrapMode wrapMode, RectangleF dstRect) {
+                       // TBD: check if not metafile
+                       _sourceRectangle = dstRect;
+                       _texture = (Image)((Bitmap)image).Clone(dstRect, image.PixelFormat);
+                       _wrapMode = wrapMode;
+
+                       if (wrapMode != Drawing2D.WrapMode.Tile)
+                               image = CreateWrappedImage(_texture, wrapMode);
+                       else
+                               image = _texture;
 
-               public TextureBrush (Image image, WrapMode wrapMode, RectangleF dstRect)
-               {
-                       // FIXME: check if not metafile
-                       //TBD:WRAP MODE
                        _nativeObject = new awt.TexturePaint((image.BufferedImage)image.NativeObject.CurrentImage.NativeImage,
-                               new geom.Rectangle2D.Float((float)dstRect.X,(float)dstRect.Y,(float)dstRect.Width,
-                               (float)dstRect.Height));
+                               new geom.Rectangle2D.Float(0, 0, image.Width, image.Height));
+               }
+
+               #endregion
+
+               #region CreateWrappedImage
+
+               private Image CreateWrappedImage(Image image, WrapMode wrapMode) {
+                       Image b = null;
+                       Graphics g = null;
+
+                       switch (wrapMode) {
+                               case Drawing2D.WrapMode.TileFlipX :
+                                       b = new Bitmap(image.Width * 2, image.Height);
+                                       g = Graphics.FromImage( b );
+                                       g.DrawImage(image, new Matrix());
+                                       g.DrawImage(image, new Matrix(-1, 0, 0, 1, image.Width * 2 - 1, 0));
+                                       break;
+                               case Drawing2D.WrapMode.TileFlipY :
+                                       b = new Bitmap(image.Width, image.Height * 2);
+                                       g = Graphics.FromImage( b );
+                                       g.DrawImage(image, new Matrix());
+                                       g.DrawImage(image, new Matrix(1, 0, 0, -1, 0, image.Height * 2 - 1));
+                                       break;
+                               case Drawing2D.WrapMode.TileFlipXY :
+                                       b = new Bitmap(image.Width * 2, image.Height * 2);
+                                       g = Graphics.FromImage( b );
+                                       g.DrawImage(image, new Matrix());
+                                       g.DrawImage(image, new Matrix(-1, 0, 0, 1, image.Width * 2 - 1, 0));
+                                       g.DrawImage(image, new Matrix(1, 0, 0, -1, 0, image.Height * 2 - 1));
+                                       g.DrawImage(image, new Matrix(-1, 0, 0, -1, image.Width * 2 - 1, image.Height * 2 - 1));
+                                       break;
+                               case Drawing2D.WrapMode.Clamp :
+                                       // TBD: Implement WrapMode.Clamp
+                                       return image;
+                               default : 
+                                       b = image;
+                                       break;
+                       }
+
+                       return b;
                }
 
-               // properties
+               #endregion
+
+               #region properties
+
                public Image Image {
                        get {
-                               return Image.ImageFromNativeImage(((awt.TexturePaint)NativeObject).getImage(),
-                                       ImageFormat.Bmp);
+                               return (Image)_texture.Clone();
                        }
                }
 
                public Matrix Transform {
                        get {                                   
-                               throw new NotImplementedException();
+                               return BrushTransform;
                        }
                        set {
-                               throw new NotImplementedException();
+                               BrushTransform = value;
                        }
                }
 
+               [MonoTODO]
                public WrapMode WrapMode {
                        get {
                                return _wrapMode;
@@ -140,56 +172,55 @@ namespace System.Drawing
                        }
                }
 
-               // public methods
+               #endregion
 
-               public override object Clone ()
-               {
-                       throw new NotImplementedException();
+               #region public methods
+
+               public override object Clone () {
+                       TextureBrush copy = (TextureBrush)InternalClone();
+
+                       if (_texture != null)
+                               copy._texture = (Image)_texture.Clone();
+
+                       return copy;
                }
 
-               public void MultiplyTransform (Matrix matrix)
-               {
-                       MultiplyTransform (matrix, MatrixOrder.Prepend);
+               public void MultiplyTransform (Matrix matrix) {
+                       base.BrushMultiplyTransform( matrix );
                }
 
-               public void MultiplyTransform (Matrix matrix, MatrixOrder order)
-               {
-                       throw new NotImplementedException();
+               public void MultiplyTransform (Matrix matrix, MatrixOrder order) {
+                       base.BrushMultiplyTransform( matrix, order );
                }
 
-               public void ResetTransform ()
-               {
-                       throw new NotImplementedException();
+               public void ResetTransform () {
+                       base.BrushResetTransform();
                }
 
-               public void RotateTransform (float angle)
-               {
-                       RotateTransform (angle, MatrixOrder.Prepend);
+               public void RotateTransform (float angle) {
+                       base.BrushRotateTransform( angle );
                }
 
-               public void RotateTransform (float angle, MatrixOrder order)
-               {
-                       throw new NotImplementedException();
+               public void RotateTransform (float angle, MatrixOrder order) {
+                       base.BrushRotateTransform( angle, order );
                }
 
-               public void ScaleTransform (float sx, float sy)
-               {
-                       ScaleTransform (sx, sy, MatrixOrder.Prepend);
+               public void ScaleTransform (float sx, float sy) {
+                       base.BrushScaleTransform( sx, sy );
                }
 
-               public void ScaleTransform (float sx, float sy, MatrixOrder order)
-               {
-                       throw new NotImplementedException();
+               public void ScaleTransform (float sx, float sy, MatrixOrder order) {
+                       base.BrushScaleTransform( sx, sy, order );
                }
 
-               public void TranslateTransform (float dx, float dy)
-               {
-                       TranslateTransform (dx, dy, MatrixOrder.Prepend);
+               public void TranslateTransform (float dx, float dy) {
+                       base.BrushTranslateTransform( dx, dy );
                }
 
-               public void TranslateTransform (float dx, float dy, MatrixOrder order)
-               {
-                       throw new NotImplementedException();
+               public void TranslateTransform (float dx, float dy, MatrixOrder order) {
+                       base.BrushTranslateTransform( dx, dy, order );
                }
+
+               #endregion
        }
 }