* Enables binary data in BaseHttpServer with 'image' in content type.
* Enables regular jpeg map images to be served directly from the region. * EX: http://192.168.1.127:9000/index.php?method=regionImagecc4583cd269b41bfa525dd198e19a5c5 * This is actually HTTP server address + port + index.php?method=regionImage<REGIONUUID, no dashes> * The Webmap image location gets printed on the console when the simulator starts up. * JPEG data is cached so we only create the webjpeg once.0.6.0-stable
parent
1898674254
commit
53c9ce46b3
|
@ -642,7 +642,16 @@ namespace OpenSim.Framework.Servers
|
||||||
|
|
||||||
response.AddHeader("Content-type", contentType);
|
response.AddHeader("Content-type", contentType);
|
||||||
|
|
||||||
byte[] buffer = Encoding.UTF8.GetBytes(responseString);
|
byte[] buffer;
|
||||||
|
|
||||||
|
if (!contentType.Contains("image"))
|
||||||
|
{
|
||||||
|
buffer = Encoding.UTF8.GetBytes(responseString);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer = Convert.FromBase64String(responseString);
|
||||||
|
}
|
||||||
|
|
||||||
response.SendChunked = false;
|
response.SendChunked = false;
|
||||||
response.ContentLength64 = buffer.Length;
|
response.ContentLength64 = buffer.Length;
|
||||||
|
|
|
@ -28,8 +28,12 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using libsecondlife;
|
using libsecondlife;
|
||||||
|
using OpenJPEGNet;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
@ -55,6 +59,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
||||||
private Scene m_scene;
|
private Scene m_scene;
|
||||||
private List<MapBlockData> cachedMapBlocks = new List<MapBlockData>();
|
private List<MapBlockData> cachedMapBlocks = new List<MapBlockData>();
|
||||||
private int cachedTime = 0;
|
private int cachedTime = 0;
|
||||||
|
private byte[] myMapImageJPEG;
|
||||||
|
|
||||||
//private int CacheRegionsDistance = 256;
|
//private int CacheRegionsDistance = 256;
|
||||||
|
|
||||||
|
@ -62,8 +67,15 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
||||||
|
|
||||||
public void Initialise(Scene scene, IConfigSource config)
|
public void Initialise(Scene scene, IConfigSource config)
|
||||||
{
|
{
|
||||||
m_scene = scene;
|
myMapImageJPEG = new byte[0];
|
||||||
|
|
||||||
|
m_scene = scene;
|
||||||
|
string regionimage = "regionImage" + scene.RegionInfo.RegionID.ToString();
|
||||||
|
regionimage = regionimage.Replace("-", "");
|
||||||
|
m_log.Warn("[WEBMAP]: JPEG Map location: http://" + m_scene.RegionInfo.ExternalEndPoint.Address.ToString() + ":" + m_scene.RegionInfo.HttpPort.ToString() + "/index.php?method=" + regionimage);
|
||||||
|
|
||||||
|
|
||||||
|
m_scene.AddHTTPHandler(regionimage, OnHTTPGetMapImage);
|
||||||
//QuadTree.Subdivide();
|
//QuadTree.Subdivide();
|
||||||
//QuadTree.Subdivide();
|
//QuadTree.Subdivide();
|
||||||
|
|
||||||
|
@ -235,5 +247,72 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
||||||
mapBlocks = m_scene.CommsManager.GridService.RequestNeighbourMapBlocks(minX - 4, minY - 4, minX + 4, minY + 4);
|
mapBlocks = m_scene.CommsManager.GridService.RequestNeighbourMapBlocks(minX - 4, minY - 4, minX + 4, minY + 4);
|
||||||
remoteClient.SendMapBlock(mapBlocks);
|
remoteClient.SendMapBlock(mapBlocks);
|
||||||
}
|
}
|
||||||
|
public Hashtable OnHTTPGetMapImage(Hashtable keysvals)
|
||||||
|
{
|
||||||
|
m_log.Info("[WEBMAP]: Sending map image jpeg");
|
||||||
|
Hashtable reply = new Hashtable();
|
||||||
|
int statuscode = 200;
|
||||||
|
|
||||||
|
byte[] jpeg;
|
||||||
|
|
||||||
|
|
||||||
|
if (myMapImageJPEG.Length == 0)
|
||||||
|
{
|
||||||
|
MemoryStream imgstream = new MemoryStream();
|
||||||
|
Bitmap mapTexture = new Bitmap(1,1);
|
||||||
|
System.Drawing.Image image = (System.Drawing.Image)mapTexture;
|
||||||
|
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Taking our jpeg2000 data, decoding it, then saving it to a byte array with regular jpeg data
|
||||||
|
|
||||||
|
|
||||||
|
imgstream = new MemoryStream();
|
||||||
|
|
||||||
|
// non-async because we know we have the asset immediately.
|
||||||
|
AssetBase mapasset = m_scene.AssetCache.GetAsset(m_scene.RegionInfo.lastMapUUID, true);
|
||||||
|
|
||||||
|
// Decode image to System.Drawing.Image
|
||||||
|
image = OpenJPEG.DecodeToImage(mapasset.Data);
|
||||||
|
|
||||||
|
// Save to bitmap
|
||||||
|
mapTexture = new Bitmap(image);
|
||||||
|
|
||||||
|
// Save bitmap to stream
|
||||||
|
mapTexture.Save(imgstream, ImageFormat.Jpeg);
|
||||||
|
|
||||||
|
// Write the stream to a byte array for output
|
||||||
|
jpeg = imgstream.ToArray();
|
||||||
|
myMapImageJPEG = jpeg;
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
// Dummy!
|
||||||
|
jpeg = new byte[0];
|
||||||
|
m_log.Warn("[WEBMAP]: Unable to generate Map image");
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
// Reclaim memory, these are unmanaged resources
|
||||||
|
mapTexture.Dispose();
|
||||||
|
image.Dispose();
|
||||||
|
imgstream.Close();
|
||||||
|
imgstream.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Use cached version so we don't have to loose our mind
|
||||||
|
jpeg = myMapImageJPEG;
|
||||||
|
}
|
||||||
|
//jpeg = new byte[0];
|
||||||
|
|
||||||
|
reply["str_response_string"] = Convert.ToBase64String(jpeg);
|
||||||
|
reply["int_response_code"] = statuscode;
|
||||||
|
reply["content_type"] = "image/jpeg";
|
||||||
|
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue