aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Modules/Scripting/VectorRender/VectorRenderModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Environment/Modules/Scripting/VectorRender/VectorRenderModule.cs')
-rw-r--r--OpenSim/Region/Environment/Modules/Scripting/VectorRender/VectorRenderModule.cs361
1 files changed, 361 insertions, 0 deletions
diff --git a/OpenSim/Region/Environment/Modules/Scripting/VectorRender/VectorRenderModule.cs b/OpenSim/Region/Environment/Modules/Scripting/VectorRender/VectorRenderModule.cs
new file mode 100644
index 0000000..4fba5b9
--- /dev/null
+++ b/OpenSim/Region/Environment/Modules/Scripting/VectorRender/VectorRenderModule.cs
@@ -0,0 +1,361 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Drawing;
30using System.Drawing.Imaging;
31using System.Globalization;
32using System.IO;
33using System.Net;
34using libsecondlife;
35using Nini.Config;
36using OpenJPEGNet;
37using OpenSim.Region.Environment.Interfaces;
38using OpenSim.Region.Environment.Scenes;
39using Image=System.Drawing.Image;
40
41//using Cairo;
42
43namespace OpenSim.Region.Environment.Modules.Scripting.VectorRender
44{
45 public class VectorRenderModule : IRegionModule, IDynamicTextureRender
46 {
47 private Scene m_scene;
48 private string m_name = "VectorRenderModule";
49 private IDynamicTextureManager m_textureManager;
50
51 public VectorRenderModule()
52 {
53 }
54
55 public void Initialise(Scene scene, IConfigSource config)
56 {
57 if (m_scene == null)
58 {
59 m_scene = scene;
60 }
61 }
62
63 public void PostInitialise()
64 {
65 m_textureManager = m_scene.RequestModuleInterface<IDynamicTextureManager>();
66 if (m_textureManager != null)
67 {
68 m_textureManager.RegisterRender(GetContentType(), this);
69 }
70 }
71
72 public void Close()
73 {
74 }
75
76 public string Name
77 {
78 get { return m_name; }
79 }
80
81 public bool IsSharedModule
82 {
83 get { return true; }
84 }
85
86 private void Draw(string data, LLUUID id, string extraParams)
87 {
88 // TODO: this is a brutal hack. extraParams should actually be parsed reasonably.
89 int size = 256;
90 try {
91 size = Convert.ToInt32(extraParams);
92 } catch (Exception e) {
93
94//Ckrinke: Add a WriteLine to remove the warning about 'e' defined but not used
95 Console.WriteLine("Problem with Draw. Please verify parameters." + e.ToString());
96 }
97
98 if ((size < 128) || (size > 1024))
99 size = 256;
100
101 Bitmap bitmap = new Bitmap(size, size, PixelFormat.Format32bppArgb);
102
103 Graphics graph = Graphics.FromImage(bitmap);
104
105 extraParams = extraParams.ToLower();
106 int alpha = 255;
107 if (extraParams == "setalpha")
108 {
109 alpha = 0;
110 }
111 else
112 {
113 graph.FillRectangle(new SolidBrush(Color.White), 0, 0, size, size);
114 }
115
116 for (int w = 0; w < bitmap.Width; w++)
117 {
118 for (int h = 0; h < bitmap.Height; h++)
119 {
120 bitmap.SetPixel(w, h, Color.FromArgb(alpha, bitmap.GetPixel(w, h)));
121 }
122 }
123
124
125
126 GDIDraw(data, graph);
127
128 byte[] imageJ2000 = OpenJPEG.EncodeFromImage(bitmap, true);
129 m_textureManager.ReturnData(id, imageJ2000);
130
131 }
132
133/*
134 private void CairoDraw(string data, System.Drawing.Graphics graph)
135 {
136 using (Win32Surface draw = new Win32Surface(graph.GetHdc()))
137 {
138 Context contex = new Context(draw);
139
140 contex.Antialias = Antialias.None; //fastest method but low quality
141 contex.LineWidth = 7;
142 char[] lineDelimiter = { ';' };
143 char[] partsDelimiter = { ',' };
144 string[] lines = data.Split(lineDelimiter);
145
146 foreach (string line in lines)
147 {
148 string nextLine = line.Trim();
149
150 if (nextLine.StartsWith("MoveTO"))
151 {
152 float x = 0;
153 float y = 0;
154 GetParams(partsDelimiter, ref nextLine, ref x, ref y);
155 contex.MoveTo(x, y);
156 }
157 else if (nextLine.StartsWith("LineTo"))
158 {
159 float x = 0;
160 float y = 0;
161 GetParams(partsDelimiter, ref nextLine, ref x, ref y);
162 contex.LineTo(x, y);
163 contex.Stroke();
164 }
165 }
166 }
167 graph.ReleaseHdc();
168 }
169*/
170
171 private void GDIDraw(string data, Graphics graph)
172 {
173 Point startPoint = new Point(0, 0);
174 Point endPoint = new Point(0, 0);
175 Pen drawPen = new Pen(Color.Black, 7);
176 Font myFont = new Font("Times New Roman", 14);
177 SolidBrush myBrush = new SolidBrush(Color.Black);
178 char[] lineDelimiter = { ';' };
179 char[] partsDelimiter = { ',' };
180 string[] lines = data.Split(lineDelimiter);
181
182 foreach (string line in lines)
183 {
184 string nextLine = line.Trim();
185 //replace with switch, or even better, do some proper parsing
186 if (nextLine.StartsWith("MoveTo"))
187 {
188 float x = 0;
189 float y = 0;
190 GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y);
191 startPoint.X = (int)x;
192 startPoint.Y = (int)y;
193 }
194 else if (nextLine.StartsWith("LineTo"))
195 {
196 float x = 0;
197 float y = 0;
198 GetParams(partsDelimiter, ref nextLine, 6, ref x, ref y);
199 endPoint.X = (int)x;
200 endPoint.Y = (int)y;
201 graph.DrawLine(drawPen, startPoint, endPoint);
202 startPoint.X = endPoint.X;
203 startPoint.Y = endPoint.Y;
204 }
205 else if (nextLine.StartsWith("Text"))
206 {
207 nextLine = nextLine.Remove(0, 4);
208 nextLine = nextLine.Trim();
209 graph.DrawString(nextLine, myFont, myBrush, startPoint);
210 }
211 else if (nextLine.StartsWith("Image"))
212 {
213 float x = 0;
214 float y = 0;
215 GetParams(partsDelimiter, ref nextLine, 5, ref x, ref y);
216 endPoint.X = (int)x;
217 endPoint.Y = (int)y;
218 Image image = ImageHttpRequest(nextLine);
219 graph.DrawImage(image, (float)startPoint.X, (float)startPoint.Y, x, y);
220 startPoint.X += endPoint.X;
221 startPoint.Y += endPoint.Y;
222 }
223 else if (nextLine.StartsWith("Rectangle"))
224 {
225 float x = 0;
226 float y = 0;
227 GetParams(partsDelimiter, ref nextLine, 9, ref x, ref y);
228 endPoint.X = (int)x;
229 endPoint.Y = (int)y;
230 graph.DrawRectangle(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);
231 startPoint.X += endPoint.X;
232 startPoint.Y += endPoint.Y;
233 }
234 else if (nextLine.StartsWith("FillRectangle"))
235 {
236 float x = 0;
237 float y = 0;
238 GetParams(partsDelimiter, ref nextLine, 13, ref x, ref y);
239 endPoint.X = (int)x;
240 endPoint.Y = (int)y;
241 graph.FillRectangle(myBrush, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);
242 startPoint.X += endPoint.X;
243 startPoint.Y += endPoint.Y;
244 }
245 else if (nextLine.StartsWith("Ellipse"))
246 {
247 float x = 0;
248 float y = 0;
249 GetParams(partsDelimiter, ref nextLine, 7, ref x, ref y);
250 endPoint.X = (int)x;
251 endPoint.Y = (int)y;
252 graph.DrawEllipse(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);
253 startPoint.X += endPoint.X;
254 startPoint.Y += endPoint.Y;
255 }
256 else if (nextLine.StartsWith("FontSize"))
257 {
258 nextLine = nextLine.Remove(0, 8);
259 nextLine = nextLine.Trim();
260 float size = Convert.ToSingle(nextLine, CultureInfo.InvariantCulture);
261 myFont = new Font("Times New Roman", size);
262 }
263 else if (nextLine.StartsWith("PenSize"))
264 {
265 nextLine = nextLine.Remove(0, 8);
266 nextLine = nextLine.Trim();
267 float size = Convert.ToSingle(nextLine, CultureInfo.InvariantCulture);
268 drawPen.Width = size;
269 }
270 else if (nextLine.StartsWith("PenColour"))
271 {
272 nextLine = nextLine.Remove(0, 9);
273 nextLine = nextLine.Trim();
274
275 Color newColour = Color.FromName(nextLine);
276
277 myBrush.Color = newColour;
278 drawPen.Color = newColour;
279 }
280 }
281 }
282
283 private static void GetParams(char[] partsDelimiter, ref string line, int startLength, ref float x, ref float y)
284 {
285 line = line.Remove(0, startLength);
286 string[] parts = line.Split(partsDelimiter);
287 if (parts.Length == 2)
288 {
289 string xVal = parts[0].Trim();
290 string yVal = parts[1].Trim();
291 x = Convert.ToSingle(xVal, CultureInfo.InvariantCulture);
292 y = Convert.ToSingle(yVal, CultureInfo.InvariantCulture);
293 }
294 else if (parts.Length > 2)
295 {
296 string xVal = parts[0].Trim();
297 string yVal = parts[1].Trim();
298 x = Convert.ToSingle(xVal, CultureInfo.InvariantCulture);
299 y = Convert.ToSingle(yVal, CultureInfo.InvariantCulture);
300
301 line = "";
302 for (int i = 2; i < parts.Length; i++)
303 {
304 line = line + parts[i].Trim();
305 line = line + " ";
306 }
307 }
308 }
309
310 private Bitmap ImageHttpRequest(string url)
311 {
312 WebRequest request = HttpWebRequest.Create(url);
313//Ckrinke: Comment out for now as 'str' is unused. Bring it back into play later when it is used.
314//Ckrinke Stream str = null;
315 HttpWebResponse response = (HttpWebResponse)(request).GetResponse();
316 if (response.StatusCode == HttpStatusCode.OK)
317 {
318 Bitmap image = new Bitmap(response.GetResponseStream());
319 return image;
320 }
321
322 return null;
323 }
324
325 public string GetContentType()
326 {
327 return ("vector");
328 }
329
330 public string GetName()
331 {
332 return m_name;
333 }
334
335 public bool SupportsAsynchronous()
336 {
337 return true;
338 }
339
340 public byte[] ConvertUrl(string url, string extraParams)
341 {
342 return null;
343 }
344
345 public byte[] ConvertStream(Stream data, string extraParams)
346 {
347 return null;
348 }
349
350 public bool AsyncConvertUrl(LLUUID id, string url, string extraParams)
351 {
352 return false;
353 }
354
355 public bool AsyncConvertData(LLUUID id, string bodyData, string extraParams)
356 {
357 Draw(bodyData, id, extraParams);
358 return true;
359 }
360 }
361} \ No newline at end of file