* RTF.cs: Added support for metafiles and use the new picture
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms.RTF / Picture.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2007 Novell, Inc. (http://www.novell.com)
21 //
22 // Authors:
23 //      Jackson Harper (jackson@ximian.com)
24 //
25
26
27 using System;
28 using System.IO;
29 using System.Drawing;
30
31 namespace System.Windows.Forms.RTF {
32
33         internal class Picture {
34
35                 private Minor image_type;
36                 private Image image;
37                 private byte [] data;
38                 private float width = -1;
39                 private float height = -1;
40                 
41
42                 public Picture ()
43                 {
44                         
45                 }
46
47                 public Minor ImageType {
48                         get { return image_type; }
49                         set { image_type = value; }
50                 }
51
52                 public byte [] Data {
53                         get { return data; }
54                         set { data = value; }
55                 }
56
57                 public float Width {
58                         get {
59                                 float w = width;
60                                 if (w == -1) {
61                                         if (image == null)
62                                                 image = ToImage ();
63                                         w = image.Width;
64                                 }
65                                 return w;
66                                 
67                         }
68                 }
69
70                 public float Height {
71                         get {
72                                 float h = height;
73                                 if (h == -1) {
74                                         if (image == null)
75                                                 image = ToImage ();
76                                         h = image.Height;
77                                 }
78                                 return h;
79                         }
80                 }
81
82                 public SizeF Size {
83                         get {   
84                                 return new SizeF (Width, Height);
85                         }
86                 }
87
88                 public void SetWidthFromTwips (int twips)
89                 {
90                         width = (twips * 144) / 254;
91                 }
92
93                 public void SetHeightFromTwips (int twips)
94                 {
95                         height = (twips * 144) / 254;
96                 }
97                 
98                 //
99                 // Makes sure that we got enough information to actually use the image
100                 //
101                 public bool IsValid ()
102                 {
103                         if  (data == null)
104                                 return false;
105                         switch (image_type) {
106                         case Minor.PngBlip:
107                         case Minor.WinMetafile:
108                                 break;
109                         default:
110                                 return false;
111                         }
112
113                         return true;
114                 }
115
116                 public void DrawImage (Graphics dc, float x, float y, bool selected)
117                 {
118                         if (image == null)
119                                 image = ToImage ();
120
121                         float height = this.height;
122                         float width = this.width;
123
124                         if (height == -1)
125                                 height = image.Height;
126                         if (width == -1)
127                                 width = image.Width;
128                         dc.DrawImage (image, x, y, width, height);
129                 }
130
131                 public Image ToImage ()
132                 {
133                         Console.WriteLine ("CREATING IMAGE:  {0}", data.Length);
134                         return Image.FromStream (new MemoryStream (data));
135                 }
136         }
137
138 }
139