2 // System.Drawing.TextureBrush.cs
5 // Dennis Hayes (dennish@Raytek.com)
6 // Ravindra (rkumar@novell.com)
8 // (C) 2002 Ximian, Inc
9 // (C) 2004 Novell, Inc.
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 using System.Drawing.Drawing2D;
37 using System.Drawing.Imaging;
40 using geom = java.awt.geom;
41 using image = java.awt.image;
43 namespace System.Drawing {
45 /// Summary description for TextureBrush.
47 public sealed class TextureBrush : Brush {
48 readonly awt.TexturePaint _nativeObject;
49 RectangleF _sourceRectangle;
50 readonly Image _texture = null;
53 protected override java.awt.Paint NativeObject {
61 public TextureBrush (Image image) : this (image, WrapMode.Tile) {
64 public TextureBrush (Image image, WrapMode wrapMode) :
65 this( image, wrapMode, new RectangleF(0, 0, image.Width, image.Height )){
68 public TextureBrush (Image image, Rectangle dstRect) :
69 this( image, WrapMode.Tile, dstRect ) {
72 public TextureBrush (Image image, RectangleF dstRect) :
73 this( image, WrapMode.Tile, dstRect ) {
76 public TextureBrush (Image image, Rectangle dstRect, ImageAttributes imageAttr) : this( image, dstRect ) {
77 // TBD: Implement ImageAttributes
80 public TextureBrush (Image image, RectangleF dstRect, ImageAttributes imageAttr) : this( image, dstRect ) {
81 // TBD: Implement ImageAttributes
84 public TextureBrush (Image image, WrapMode wrapMode, Rectangle dstRect) :
85 this( image, wrapMode, new RectangleF(dstRect.X, dstRect.Y, dstRect.Width, dstRect.Height )){
88 public TextureBrush (Image image, WrapMode wrapMode, RectangleF dstRect) {
89 // TBD: check if not metafile
90 _sourceRectangle = dstRect;
91 _texture = (Image)((Bitmap)image).Clone();
94 if (wrapMode != Drawing2D.WrapMode.Tile)
95 image = CreateWrappedImage(image, wrapMode, ref dstRect);
97 _nativeObject = new awt.TexturePaint((image.BufferedImage)image.NativeObject.CurrentImage.NativeImage,
98 new geom.Rectangle2D.Float(dstRect.X, dstRect.Y, dstRect.Width, dstRect.Height));
103 #region CreateWrappedImage
105 private Image CreateWrappedImage(Image image, WrapMode wrapMode, ref RectangleF srcRect) {
108 Image croppedImage = ((Bitmap)image).Clone( srcRect, image.PixelFormat );
111 case Drawing2D.WrapMode.TileFlipX :
112 b = new Bitmap(croppedImage.Width * 2, croppedImage.Height);
113 g = Graphics.FromImage( b );
114 g.DrawImage(croppedImage, new Matrix());
115 g.DrawImage(croppedImage, new Matrix(-1, 0, 0, 1, croppedImage.Width * 2 - 1, 0));
116 srcRect.Width = croppedImage.Width * 2;
120 case Drawing2D.WrapMode.TileFlipY :
121 b = new Bitmap(croppedImage.Width, croppedImage.Height * 2);
122 g = Graphics.FromImage( b );
123 g.DrawImage(croppedImage, new Matrix());
124 g.DrawImage(croppedImage, new Matrix(1, 0, 0, -1, 0, croppedImage.Height * 2 - 1));
125 srcRect.Height = croppedImage.Height * 2;
129 case Drawing2D.WrapMode.TileFlipXY :
130 b = new Bitmap(croppedImage.Width * 2, croppedImage.Height * 2);
131 g = Graphics.FromImage( b );
132 g.DrawImage(croppedImage, new Matrix());
133 g.DrawImage(croppedImage, new Matrix(-1, 0, 0, 1, croppedImage.Width * 2 - 1, 0));
134 g.DrawImage(croppedImage, new Matrix(1, 0, 0, -1, 0, croppedImage.Height * 2 - 1));
135 g.DrawImage(croppedImage, new Matrix(-1, 0, 0, -1, croppedImage.Width * 2 - 1, croppedImage.Height * 2 - 1));
136 srcRect.Width = croppedImage.Width * 2;
137 srcRect.Height = croppedImage.Height * 2;
141 case Drawing2D.WrapMode.Clamp :
142 // TBD: Implement WrapMode.Clamp
158 return (Image)_texture.Clone();
162 public Matrix Transform {
164 return BrushTransform;
167 BrushTransform = value;
171 public WrapMode WrapMode {
182 #region public methods
184 public override object Clone () {
185 return (TextureBrush)MemberwiseClone();
188 public void MultiplyTransform (Matrix matrix) {
189 base.BrushMultiplyTransform( matrix );
192 public void MultiplyTransform (Matrix matrix, MatrixOrder order) {
193 base.BrushMultiplyTransform( matrix, order );
196 public void ResetTransform () {
197 base.BrushResetTransform();
200 public void RotateTransform (float angle) {
201 base.BrushRotateTransform( angle );
204 public void RotateTransform (float angle, MatrixOrder order) {
205 base.BrushRotateTransform( angle, order );
208 public void ScaleTransform (float sx, float sy) {
209 base.BrushScaleTransform( sx, sy );
212 public void ScaleTransform (float sx, float sy, MatrixOrder order) {
213 base.BrushScaleTransform( sx, sy, order );
216 public void TranslateTransform (float dx, float dy) {
217 base.BrushTranslateTransform( dx, dy );
220 public void TranslateTransform (float dx, float dy, MatrixOrder order) {
221 base.BrushTranslateTransform( dx, dy, order );