Index: src/Common/SharpMap.Extensions/Layers/AsyncTileLayer.cs =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r5fc71a385897af92ccb092f2f969b5709afab85a --- src/Common/SharpMap.Extensions/Layers/AsyncTileLayer.cs (.../AsyncTileLayer.cs) (revision 8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9) +++ src/Common/SharpMap.Extensions/Layers/AsyncTileLayer.cs (.../AsyncTileLayer.cs) (revision 5fc71a385897af92ccb092f2f969b5709afab85a) @@ -17,38 +17,37 @@ public abstract class AsyncTileLayer : Layer { protected ITileSchema schema; - - private ITileCache cache; - + protected AsyncTileHandler asyncTileHandler; - protected abstract ITileCache GetOrCreateCache(); - protected abstract ITileSchema CreateTileSchema(); - protected abstract IRequest CreateRequest(); + private ITileCache cache; - protected virtual ITileFetcher GetTileFetcher() - { - return new DefaultTileFetcher(); - } - - protected virtual void Initialize() - { - schema = CreateTileSchema(); - cache = GetOrCreateCache(); - asyncTileHandler = new AsyncTileHandler(cache, () => RenderRequired = true, GetTileFetcher()); - } - public override IEnvelope Envelope { get { if (schema == null) + { Initialize(); + } return new Envelope(schema.Extent.MinX, schema.Extent.MaxX, schema.Extent.MinY, schema.Extent.MaxY); } } + public virtual Color? TransparentColor { get; set; } + + public static int GetStride(int width, PixelFormat pxFormat) + { + //float bitsPerPixel = System.Drawing.Image.GetPixelFormatSize(format); + int bitsPerPixel = ((int) pxFormat >> 8) & 0xFF; + //Number of bits used to store the image data per line (only the valid data) + int validBitsPerLine = width*bitsPerPixel; + //4 bytes for every int32 (32 bits) + int stride = ((validBitsPerLine + 31)/32)*4; + return stride; + } + /// /// Renders the layer /// @@ -57,9 +56,11 @@ public override void OnRender(Graphics g, IMap map) { if (schema == null) + { Initialize(); + } - var mapTransform = new MapTransform(new PointF((float)Map.Center.X, (float)Map.Center.Y), (float)Map.PixelSize, Map.Image.Width, Map.Image.Height); + var mapTransform = new MapTransform(new PointF((float) Map.Center.X, (float) Map.Center.Y), (float) Map.PixelSize, Map.Image.Width, Map.Image.Height); var mapExtent = mapTransform.Extent; var schemaExtent = schema.Extent; var minX = Math.Max(mapExtent.MinX, schemaExtent.MinX); @@ -68,7 +69,9 @@ var maxY = Math.Min(mapExtent.MaxY, schemaExtent.MaxY); if (minX > maxX || minY > maxY) + { return; + } var clippedExtent = new Extent(minX, minY, maxX, maxY); var level = BruTile.Utilities.GetNearestLevel(schema.Resolutions, Map.PixelSize); @@ -77,12 +80,12 @@ var graphics = Graphics.FromImage(Image); - graphics.CompositingMode = CompositingMode.SourceOver; // 'Over for tranparency + graphics.CompositingMode = CompositingMode.SourceOver; // 'Over for tranparency graphics.CompositingQuality = CompositingQuality.HighSpeed; graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed; graphics.SmoothingMode = SmoothingMode.HighSpeed; graphics.InterpolationMode = InterpolationMode.Low; - + foreach (var tilePlusBytes in asyncTileHandler.Fetch(requestBuilder, tileInfos.ToList())) { var tileInfo = tilePlusBytes.TileInfo; @@ -111,24 +114,28 @@ } } - public virtual Color? TransparentColor { get; set; } + protected abstract ITileCache GetOrCreateCache(); + protected abstract ITileSchema CreateTileSchema(); + protected abstract IRequest CreateRequest(); - protected virtual Bitmap CreateBitmap(byte[] bytes) + protected virtual ITileFetcher GetTileFetcher() { - using (var ms = new MemoryStream(bytes)) - return new Bitmap(ms); + return new DefaultTileFetcher(); } + protected virtual void Initialize() + { + schema = CreateTileSchema(); + cache = GetOrCreateCache(); + asyncTileHandler = new AsyncTileHandler(cache, () => RenderRequired = true, GetTileFetcher()); + } - public static int GetStride(int width, PixelFormat pxFormat) + protected virtual Bitmap CreateBitmap(byte[] bytes) { - //float bitsPerPixel = System.Drawing.Image.GetPixelFormatSize(format); - int bitsPerPixel = ((int)pxFormat >> 8) & 0xFF; - //Number of bits used to store the image data per line (only the valid data) - int validBitsPerLine = width * bitsPerPixel; - //4 bytes for every int32 (32 bits) - int stride = ((validBitsPerLine + 31) / 32) * 4; - return stride; + using (var ms = new MemoryStream(bytes)) + { + return new Bitmap(ms); + } } private static void DrawTile(ITileSchema schema, Graphics graphics, Bitmap bitmap, RectangleF extent, string levelId) @@ -149,10 +156,10 @@ // To get seamless aligning you need to round the locations // not the width and height return new Rectangle( - (int)Math.Round(dest.Left), - (int)Math.Round(dest.Top), - (int)(Math.Round(dest.Right) - Math.Round(dest.Left)), - (int)(Math.Round(dest.Bottom) - Math.Round(dest.Top))); + (int) Math.Round(dest.Left), + (int) Math.Round(dest.Top), + (int) (Math.Round(dest.Right) - Math.Round(dest.Left)), + (int) (Math.Round(dest.Bottom) - Math.Round(dest.Top))); } } } \ No newline at end of file