corrade-vassal – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Text;
7 using System.Windows.Forms;
8 using System.Threading;
9 using OpenMetaverse;
10 using OpenMetaverse.Http;
11 using OpenMetaverse.Imaging;
12  
13 namespace GridImageUpload
14 {
15 public partial class frmGridImageUpload : Form
16 {
17 private GridClient Client;
18 private byte[] UploadData = null;
19 private int Transferred = 0;
20 private string FileName = String.Empty;
21 private UUID SendToID;
22 private UUID AssetID;
23  
24 public frmGridImageUpload()
25 {
26 InitializeComponent();
27  
28 // Add login entries to the login combo box
29 cboLoginURL.Items.Add(Settings.AGNI_LOGIN_SERVER);
30 cboLoginURL.Items.Add(Settings.ADITI_LOGIN_SERVER);
31 cboLoginURL.SelectedIndex = 0;
32  
33 InitClient();
34 }
35  
36 private void InitClient()
37 {
38 Client = new GridClient();
39 Client.Network.EventQueueRunning += Network_OnEventQueueRunning;
40 Client.Network.LoginProgress += Network_OnLogin;
41  
42 // Turn almost everything off since we are only interested in uploading textures
43 Settings.LOG_LEVEL = Helpers.LogLevel.None;
44 Client.Settings.ALWAYS_DECODE_OBJECTS = false;
45 Client.Settings.ALWAYS_REQUEST_OBJECTS = false;
46 Client.Settings.SEND_AGENT_UPDATES = true;
47 Client.Settings.OBJECT_TRACKING = false;
48 Client.Settings.STORE_LAND_PATCHES = false;
49 Client.Settings.MULTIPLE_SIMS = false;
50 Client.Self.Movement.Camera.Far = 32.0f;
51 Client.Throttle.Cloud = 0.0f;
52 Client.Throttle.Land = 0.0f;
53 Client.Throttle.Wind = 0.0f;
54  
55 Client.Throttle.Texture = 446000.0f;
56 }
57  
58 private void EnableUpload()
59 {
60 if (UploadData != null)
61 {
62 if (this.InvokeRequired)
63 BeginInvoke(new MethodInvoker(EnableUpload));
64 else
65 cmdUpload.Enabled = true;
66 }
67 }
68  
69 private void DisableUpload()
70 {
71 if (this.InvokeRequired)
72 BeginInvoke(new MethodInvoker(DisableUpload));
73 else
74 cmdUpload.Enabled = false;
75 }
76  
77 private void UpdateAssetID()
78 {
79 if (this.InvokeRequired)
80 BeginInvoke(new MethodInvoker(UpdateAssetID));
81 else
82 txtAssetID.Text = AssetID.ToString();
83 }
84  
85 private void LoadImage()
86 {
87 if (String.IsNullOrEmpty(FileName))
88 return;
89  
90 string extension = System.IO.Path.GetExtension(FileName).ToLower();
91 Bitmap bitmap = null;
92  
93 try
94 {
95 if (extension == ".jp2" || extension == ".j2c")
96 {
97 Image image;
98 ManagedImage managedImage;
99  
100 // Upload JPEG2000 images untouched
101 UploadData = System.IO.File.ReadAllBytes(FileName);
102  
103 OpenJPEG.DecodeToImage(UploadData, out managedImage, out image);
104 bitmap = (Bitmap)image;
105  
106 Logger.Log("Loaded raw JPEG2000 data " + FileName, Helpers.LogLevel.Info, Client);
107 }
108 else
109 {
110 if (extension == ".tga")
111 bitmap = LoadTGAClass.LoadTGA(FileName);
112 else
113 bitmap = (Bitmap)System.Drawing.Image.FromFile(FileName);
114  
115 Logger.Log("Loaded image " + FileName, Helpers.LogLevel.Info, Client);
116  
117 int oldwidth = bitmap.Width;
118 int oldheight = bitmap.Height;
119  
120 if (!IsPowerOfTwo((uint)oldwidth) || !IsPowerOfTwo((uint)oldheight))
121 {
122 Logger.Log("Image has irregular dimensions " + oldwidth + "x" + oldheight + ", resizing to 256x256",
123 Helpers.LogLevel.Info, Client);
124  
125 Bitmap resized = new Bitmap(256, 256, bitmap.PixelFormat);
126 Graphics graphics = Graphics.FromImage(resized);
127  
128 graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
129 graphics.InterpolationMode =
130 System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
131 graphics.DrawImage(bitmap, 0, 0, 256, 256);
132  
133 bitmap.Dispose();
134 bitmap = resized;
135  
136 oldwidth = 256;
137 oldheight = 256;
138 }
139  
140 // Handle resizing to prevent excessively large images
141 if (oldwidth > 1024 || oldheight > 1024)
142 {
143 int newwidth = (oldwidth > 1024) ? 1024 : oldwidth;
144 int newheight = (oldheight > 1024) ? 1024 : oldheight;
145  
146 Logger.Log("Image has oversized dimensions " + oldwidth + "x" + oldheight + ", resizing to " +
147 newwidth + "x" + newheight, Helpers.LogLevel.Info, Client);
148  
149 Bitmap resized = new Bitmap(newwidth, newheight, bitmap.PixelFormat);
150 Graphics graphics = Graphics.FromImage(resized);
151  
152 graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
153 graphics.InterpolationMode =
154 System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
155 graphics.DrawImage(bitmap, 0, 0, newwidth, newheight);
156  
157 bitmap.Dispose();
158 bitmap = resized;
159 }
160  
161 Logger.Log("Encoding image...", Helpers.LogLevel.Info, Client);
162  
163 UploadData = OpenJPEG.EncodeFromImage(bitmap, chkLossless.Checked);
164  
165 Logger.Log("Finished encoding", Helpers.LogLevel.Info, Client);
166  
167 //System.IO.File.WriteAllBytes("out.jp2", UploadData);
168 }
169 }
170 catch (Exception ex)
171 {
172 UploadData = null;
173 cmdSave.Enabled = false;
174 cmdUpload.Enabled = false;
175 MessageBox.Show(ex.ToString(), "SL Image Upload", MessageBoxButtons.OK, MessageBoxIcon.Error);
176 return;
177 }
178  
179 picPreview.Image = bitmap;
180 lblSize.Text = Math.Round((double)UploadData.Length / 1024.0d, 2) + "KB";
181 prgUpload.Maximum = UploadData.Length;
182  
183 cmdSave.Enabled = true;
184 if (Client.Network.Connected) cmdUpload.Enabled = true;
185 }
186  
187 private void SaveImage()
188 {
189 if (String.IsNullOrEmpty(FileName))
190 return;
191  
192 if (UploadData != null)
193 {
194 try
195 {
196 System.IO.File.WriteAllBytes(FileName, UploadData);
197 MessageBox.Show("Saved " + UploadData.Length + " bytes to " + FileName);
198 }
199 catch (Exception ex)
200 {
201 MessageBox.Show("Failed to save " + FileName + ": " + ex.Message, Application.ProductName,
202 MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
203 }
204 }
205 else
206 {
207 MessageBox.Show("No image data loaded", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
208 }
209 }
210  
211 private void cmdConnect_Click(object sender, EventArgs e)
212 {
213 if (cmdConnect.Text == "Connect")
214 {
215 cmdConnect.Text = "Disconnect";
216 cboLoginURL.Enabled = txtFirstName.Enabled = txtLastName.Enabled = txtPassword.Enabled = false;
217 LoginParams lp = Client.Network.DefaultLoginParams(txtFirstName.Text, txtLastName.Text, txtPassword.Text,
218 "GridImageUpload", Application.ProductVersion);
219 lp.URI = cboLoginURL.Text;
220 cmdConnect.Enabled = false;
221 Client.Network.BeginLogin(lp);
222 }
223 else
224 {
225 Client.Network.Logout();
226 cmdConnect.Text = "Connect";
227 cboLoginURL.Enabled = txtFirstName.Enabled = txtLastName.Enabled = txtPassword.Enabled = true;
228 DisableUpload();
229 InitClient();
230 }
231 }
232  
233 private void Network_OnLogin(object sender, LoginProgressEventArgs e)
234 {
235 if (InvokeRequired)
236 {
237 BeginInvoke(new MethodInvoker(
238 delegate()
239 {
240 Network_OnLogin(sender, e);
241 }
242 ));
243 return;
244 }
245 if (e.Status == LoginStatus.Success)
246 {
247 MessageBox.Show("Connected: " + e.Message);
248 cmdConnect.Enabled = true;
249 }
250 else if (e.Status == LoginStatus.Failed)
251 {
252 MessageBox.Show(this, String.Format("Error logging in ({0}): {1}", Client.Network.LoginErrorKey,
253 Client.Network.LoginMessage));
254 cmdConnect.Text = "Connect";
255 cmdConnect.Enabled = true;
256 txtFirstName.Enabled = txtLastName.Enabled = txtPassword.Enabled = true;
257 DisableUpload();
258 }
259  
260 }
261  
262 private void cmdLoad_Click(object sender, EventArgs e)
263 {
264 OpenFileDialog dialog = new OpenFileDialog();
265 dialog.Filter =
266 "Image Files (*.jp2,*.j2c,*.jpg,*.jpeg,*.gif,*.png,*.bmp,*.tga,*.tif,*.tiff,*.ico,*.wmf,*.emf)|" +
267 "*.jp2;*.j2c;*.jpg;*.jpeg;*.gif;*.png;*.bmp;*.tga;*.tif;*.tiff;*.ico;*.wmf;*.emf;";
268  
269 if (dialog.ShowDialog() == DialogResult.OK)
270 {
271 FileName = dialog.FileName;
272 LoadImage();
273 }
274 }
275  
276 private void cmdSave_Click(object sender, EventArgs e)
277 {
278 SaveFileDialog dialog = new SaveFileDialog();
279 dialog.Filter = "JPEG2000 File (*.j2c)|*.j2c;";
280  
281 if (dialog.ShowDialog() == DialogResult.OK)
282 {
283 FileName = dialog.FileName;
284 SaveImage();
285 }
286 }
287  
288 private void cmdUpload_Click(object sender, EventArgs e)
289 {
290 SendToID = UUID.Zero;
291 string sendTo = txtSendtoName.Text.Trim();
292  
293 if (sendTo.Length > 0)
294 {
295 AutoResetEvent lookupEvent = new AutoResetEvent(false);
296 UUID thisQueryID = UUID.Zero;
297 bool lookupSuccess = false;
298  
299 EventHandler<DirPeopleReplyEventArgs> callback =
300 delegate(object s, DirPeopleReplyEventArgs ep)
301 {
302 if (ep.QueryID == thisQueryID)
303 {
304 if (ep.MatchedPeople.Count > 0)
305 {
306 SendToID = ep.MatchedPeople[0].AgentID;
307 lookupSuccess = true;
308 }
309  
310 lookupEvent.Set();
311 }
312 };
313  
314 Client.Directory.DirPeopleReply += callback;
315 thisQueryID = Client.Directory.StartPeopleSearch(sendTo, 0);
316  
317 bool eventSuccess = lookupEvent.WaitOne(10 * 1000, false);
318 Client.Directory.DirPeopleReply -= callback;
319  
320 if (eventSuccess && lookupSuccess)
321 {
322 Logger.Log("Will send uploaded image to avatar " + SendToID.ToString(), Helpers.LogLevel.Info, Client);
323 }
324 else
325 {
326 MessageBox.Show("Could not find avatar \"" + sendTo + "\", upload cancelled");
327 return;
328 }
329 }
330  
331 if (UploadData != null)
332 {
333 prgUpload.Value = 0;
334 cmdLoad.Enabled = false;
335 cmdSave.Enabled = false;
336 cmdUpload.Enabled = false;
337 grpLogin.Enabled = false;
338  
339 string name = System.IO.Path.GetFileNameWithoutExtension(FileName);
340  
341 Permissions perms = new Permissions();
342 perms.EveryoneMask = PermissionMask.All;
343 perms.NextOwnerMask = PermissionMask.All;
344  
345 Client.Inventory.RequestCreateItemFromAsset(UploadData, name, "Uploaded with SL Image Upload", AssetType.Texture,
346 InventoryType.Texture, Client.Inventory.FindFolderForType(AssetType.Texture), perms,
347 delegate(bool success, string status, UUID itemID, UUID assetID)
348 {
349 if (this.InvokeRequired)
350 BeginInvoke(new MethodInvoker(EnableControls));
351 else
352 EnableControls();
353  
354 if (success)
355 {
356 AssetID = assetID;
357 UpdateAssetID();
358  
359 // Fix the permissions on the new upload since they are fscked by default
360 InventoryItem item = (InventoryItem)Client.Inventory.Store[itemID];
361  
362 Transferred = UploadData.Length;
363 BeginInvoke((MethodInvoker)delegate() { SetProgress(); });
364 }
365 else
366 {
367 MessageBox.Show("Asset upload failed: " + status);
368 }
369 }
370 );
371 }
372 }
373  
374 private void SetProgress()
375 {
376 prgUpload.Value = Transferred;
377 }
378  
379 private void Network_OnEventQueueRunning(object sender, EventQueueRunningEventArgs e)
380 {
381 Logger.DebugLog("Event queue is running for " + e.Simulator.ToString() + ", enabling uploads", Client);
382 EnableUpload();
383 }
384  
385 private void EnableControls()
386 {
387 cmdLoad.Enabled = true;
388 cmdSave.Enabled = true;
389 cmdUpload.Enabled = true;
390 grpLogin.Enabled = true;
391 }
392  
393 private void frmGridImageUpload_FormClosed(object sender, FormClosedEventArgs e)
394 {
395 if (Client.Network.Connected)
396 Client.Network.Logout();
397 }
398  
399 private void chkLossless_CheckedChanged(object sender, EventArgs e)
400 {
401 LoadImage();
402 }
403  
404 private bool IsPowerOfTwo(uint n)
405 {
406 return (n & (n - 1)) == 0 && n != 0;
407 }
408 }
409 }