corrade-vassal – Blame information for rev 1
?pathlinks?
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 | } |