public byte[] RenderMetaTile(MetaTile metatile, ITile tile)
        {
            byte[] data       = RenderTile(metatile);
            Image  image      = ImageHelper.Open(data);
            Size   metaSize   = GetMetaSize(metatile.Z);
            int    metaHeight = metaSize.Height * Size.Height + 2 * MetaBuffer.Height;

            for (int i = 0; i < metaSize.Width; i++)
            {
                for (int j = 0; j < metaSize.Height; i++)
                {
                    int minX = i * Size.Width + MetaBuffer.Width;
                    int maxX = minX + Size.Width;
                    // this next calculation is because image origin is (top, left)
                    int    maxY     = metaHeight - (j * Size.Height + MetaBuffer.Height);
                    int    minY     = maxY - Size.Height;
                    Image  subImage = image.Crop(minX, minY, maxX, maxY);
                    byte[] subdata  = subImage.GetBytes();
                    double x        = metatile.X * MetaSize.Width + i;
                    double y        = metatile.Y * MetaSize.Height + i;

                    var subtile = new Tile(this, x, y, metatile.Z);
                    if (!string.IsNullOrEmpty(WatermarkImage))
                    {
                        subdata = Watermark(subdata).GetBytes();
                    }
                    Cache.Set(subtile, subdata);
                    if (x == tile.X && y == tile.Y)
                    {
                        return(subdata);
                    }
                }
            }
            return(null);
        }
 public override byte[] Render(ITile tile)
 {
     if (MetaTile)
     {
         MetaTile metatile = GetMetaTile(tile);
         try
         {
             Cache.Lock(metatile);
             return(Cache.Get(tile) ?? RenderMetaTile(metatile, tile));
         }
         finally
         {
             Cache.Unlock(metatile);
         }
     }
     else
     {
         if (!string.IsNullOrEmpty(WatermarkImage))
         {
             return(Watermark(RenderTile(tile)).GetBytes());
         }
         return(RenderTile(tile));
     }
 }