aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Scripting/VectorRender
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Scripting/VectorRender')
-rw-r--r--OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs125
-rw-r--r--OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs48
2 files changed, 163 insertions, 10 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs b/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs
index 180ea9f..b50c0bd 100644
--- a/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs
+++ b/OpenSim/Region/CoreModules/Scripting/VectorRender/Tests/VectorRenderModuleTests.cs
@@ -51,12 +51,15 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests
51 DynamicTextureModule m_dtm; 51 DynamicTextureModule m_dtm;
52 VectorRenderModule m_vrm; 52 VectorRenderModule m_vrm;
53 53
54 [SetUp] 54 private void SetupScene(bool reuseTextures)
55 public void SetUp()
56 { 55 {
57 m_scene = new SceneHelpers().SetupScene(); 56 m_scene = new SceneHelpers().SetupScene();
57
58 m_dtm = new DynamicTextureModule(); 58 m_dtm = new DynamicTextureModule();
59 m_dtm.ReuseTextures = reuseTextures;
60
59 m_vrm = new VectorRenderModule(); 61 m_vrm = new VectorRenderModule();
62
60 SceneHelpers.SetupSceneModules(m_scene, m_dtm, m_vrm); 63 SceneHelpers.SetupSceneModules(m_scene, m_dtm, m_vrm);
61 } 64 }
62 65
@@ -65,6 +68,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests
65 { 68 {
66 TestHelpers.InMethod(); 69 TestHelpers.InMethod();
67 70
71 SetupScene(false);
68 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); 72 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
69 UUID originalTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID; 73 UUID originalTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID;
70 74
@@ -86,6 +90,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests
86 90
87 string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;"; 91 string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;";
88 92
93 SetupScene(false);
89 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); 94 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
90 95
91 m_dtm.AddDynamicTextureData( 96 m_dtm.AddDynamicTextureData(
@@ -116,6 +121,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests
116 121
117 string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;"; 122 string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;";
118 123
124 SetupScene(false);
119 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); 125 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
120 126
121 m_dtm.AddDynamicTextureData( 127 m_dtm.AddDynamicTextureData(
@@ -147,6 +153,121 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender.Tests
147 string dtText 153 string dtText
148 = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World; Image http://localhost/shouldnotexist.png"; 154 = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World; Image http://localhost/shouldnotexist.png";
149 155
156 SetupScene(false);
157 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
158
159 m_dtm.AddDynamicTextureData(
160 m_scene.RegionInfo.RegionID,
161 so.UUID,
162 m_vrm.GetContentType(),
163 dtText,
164 "",
165 0);
166
167 UUID firstDynamicTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID;
168
169 m_dtm.AddDynamicTextureData(
170 m_scene.RegionInfo.RegionID,
171 so.UUID,
172 m_vrm.GetContentType(),
173 dtText,
174 "",
175 0);
176
177 Assert.That(firstDynamicTextureID, Is.Not.EqualTo(so.RootPart.Shape.Textures.GetFace(0).TextureID));
178 }
179
180 [Test]
181 public void TestDrawReusingTexture()
182 {
183 TestHelpers.InMethod();
184
185 SetupScene(true);
186 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
187 UUID originalTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID;
188
189 m_dtm.AddDynamicTextureData(
190 m_scene.RegionInfo.RegionID,
191 so.UUID,
192 m_vrm.GetContentType(),
193 "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;",
194 "",
195 0);
196
197 Assert.That(originalTextureID, Is.Not.EqualTo(so.RootPart.Shape.Textures.GetFace(0).TextureID));
198 }
199
200 [Test]
201 public void TestRepeatSameDrawReusingTexture()
202 {
203 TestHelpers.InMethod();
204
205 string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;";
206
207 SetupScene(true);
208 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
209
210 m_dtm.AddDynamicTextureData(
211 m_scene.RegionInfo.RegionID,
212 so.UUID,
213 m_vrm.GetContentType(),
214 dtText,
215 "",
216 0);
217
218 UUID firstDynamicTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID;
219
220 m_dtm.AddDynamicTextureData(
221 m_scene.RegionInfo.RegionID,
222 so.UUID,
223 m_vrm.GetContentType(),
224 dtText,
225 "",
226 0);
227
228 Assert.That(firstDynamicTextureID, Is.EqualTo(so.RootPart.Shape.Textures.GetFace(0).TextureID));
229 }
230
231 [Test]
232 public void TestRepeatSameDrawDifferentExtraParamsReusingTexture()
233 {
234 TestHelpers.InMethod();
235
236 string dtText = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World;";
237
238 SetupScene(true);
239 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
240
241 m_dtm.AddDynamicTextureData(
242 m_scene.RegionInfo.RegionID,
243 so.UUID,
244 m_vrm.GetContentType(),
245 dtText,
246 "",
247 0);
248
249 UUID firstDynamicTextureID = so.RootPart.Shape.Textures.GetFace(0).TextureID;
250
251 m_dtm.AddDynamicTextureData(
252 m_scene.RegionInfo.RegionID,
253 so.UUID,
254 m_vrm.GetContentType(),
255 dtText,
256 "alpha:250",
257 0);
258
259 Assert.That(firstDynamicTextureID, Is.Not.EqualTo(so.RootPart.Shape.Textures.GetFace(0).TextureID));
260 }
261
262 [Test]
263 public void TestRepeatSameDrawContainingImageReusingTexture()
264 {
265 TestHelpers.InMethod();
266
267 string dtText
268 = "PenColour BLACK; MoveTo 40,220; FontSize 32; Text Hello World; Image http://localhost/shouldnotexist.png";
269
270 SetupScene(true);
150 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene); 271 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
151 272
152 m_dtm.AddDynamicTextureData( 273 m_dtm.AddDynamicTextureData(
diff --git a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs
index 3a758c5..4268f2e 100644
--- a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs
@@ -30,6 +30,7 @@ using System.Drawing;
30using System.Drawing.Imaging; 30using System.Drawing.Imaging;
31using System.Globalization; 31using System.Globalization;
32using System.IO; 32using System.IO;
33using System.Linq;
33using System.Net; 34using System.Net;
34using Nini.Config; 35using Nini.Config;
35using OpenMetaverse; 36using OpenMetaverse;
@@ -73,6 +74,12 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender
73 return true; 74 return true;
74 } 75 }
75 76
77// public bool AlwaysIdenticalConversion(string bodyData, string extraParams)
78// {
79// string[] lines = GetLines(bodyData);
80// return lines.Any((str, r) => str.StartsWith("Image"));
81// }
82
76 public byte[] ConvertUrl(string url, string extraParams) 83 public byte[] ConvertUrl(string url, string extraParams)
77 { 84 {
78 return null; 85 return null;
@@ -80,7 +87,13 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender
80 87
81 public byte[] ConvertData(string bodyData, string extraParams) 88 public byte[] ConvertData(string bodyData, string extraParams)
82 { 89 {
83 return Draw(bodyData, extraParams); 90 bool reuseable;
91 return Draw(bodyData, extraParams, out reuseable);
92 }
93
94 private byte[] ConvertData(string bodyData, string extraParams, out bool reuseable)
95 {
96 return Draw(bodyData, extraParams, out reuseable);
84 } 97 }
85 98
86 public bool AsyncConvertUrl(UUID id, string url, string extraParams) 99 public bool AsyncConvertUrl(UUID id, string url, string extraParams)
@@ -91,7 +104,11 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender
91 public bool AsyncConvertData(UUID id, string bodyData, string extraParams) 104 public bool AsyncConvertData(UUID id, string bodyData, string extraParams)
92 { 105 {
93 // XXX: This isn't actually being done asynchronously! 106 // XXX: This isn't actually being done asynchronously!
94 m_textureManager.ReturnData(id, ConvertData(bodyData, extraParams)); 107 bool reuseable;
108 byte[] data = ConvertData(bodyData, extraParams, out reuseable);
109
110 m_textureManager.ReturnData(id, data, reuseable);
111
95 return true; 112 return true;
96 } 113 }
97 114
@@ -162,7 +179,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender
162 179
163 #endregion 180 #endregion
164 181
165 private byte[] Draw(string data, string extraParams) 182 private byte[] Draw(string data, string extraParams, out bool reuseable)
166 { 183 {
167 // We need to cater for old scripts that didnt use extraParams neatly, they use either an integer size which represents both width and height, or setalpha 184 // We need to cater for old scripts that didnt use extraParams neatly, they use either an integer size which represents both width and height, or setalpha
168 // we will now support multiple comma seperated params in the form width:256,height:512,alpha:255 185 // we will now support multiple comma seperated params in the form width:256,height:512,alpha:255
@@ -343,7 +360,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender
343 } 360 }
344 } 361 }
345 362
346 GDIDraw(data, graph, altDataDelim); 363 GDIDraw(data, graph, altDataDelim, out reuseable);
347 } 364 }
348 365
349 byte[] imageJ2000 = new byte[0]; 366 byte[] imageJ2000 = new byte[0];
@@ -434,8 +451,21 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender
434 } 451 }
435*/ 452*/
436 453
437 private void GDIDraw(string data, Graphics graph, char dataDelim) 454 /// <summary>
455 /// Split input data into discrete command lines.
456 /// </summary>
457 /// <returns></returns>
458 /// <param name='data'></param>
459 /// <param name='dataDelim'></param>
460 private string[] GetLines(string data, char dataDelim)
438 { 461 {
462 char[] lineDelimiter = { dataDelim };
463 return data.Split(lineDelimiter);
464 }
465
466 private void GDIDraw(string data, Graphics graph, char dataDelim, out bool reuseable)
467 {
468 reuseable = true;
439 Point startPoint = new Point(0, 0); 469 Point startPoint = new Point(0, 0);
440 Point endPoint = new Point(0, 0); 470 Point endPoint = new Point(0, 0);
441 Pen drawPen = null; 471 Pen drawPen = null;
@@ -450,11 +480,9 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender
450 myFont = new Font(fontName, fontSize); 480 myFont = new Font(fontName, fontSize);
451 myBrush = new SolidBrush(Color.Black); 481 myBrush = new SolidBrush(Color.Black);
452 482
453 char[] lineDelimiter = {dataDelim};
454 char[] partsDelimiter = {','}; 483 char[] partsDelimiter = {','};
455 string[] lines = data.Split(lineDelimiter);
456 484
457 foreach (string line in lines) 485 foreach (string line in GetLines(data, dataDelim))
458 { 486 {
459 string nextLine = line.Trim(); 487 string nextLine = line.Trim();
460 //replace with switch, or even better, do some proper parsing 488 //replace with switch, or even better, do some proper parsing
@@ -485,6 +513,10 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender
485 } 513 }
486 else if (nextLine.StartsWith("Image")) 514 else if (nextLine.StartsWith("Image"))
487 { 515 {
516 // We cannot reuse any generated texture involving fetching an image via HTTP since that image
517 // can change.
518 reuseable = false;
519
488 float x = 0; 520 float x = 0;
489 float y = 0; 521 float y = 0;
490 GetParams(partsDelimiter, ref nextLine, 5, ref x, ref y); 522 GetParams(partsDelimiter, ref nextLine, 5, ref x, ref y);