// SiDComponent public override Bitmap RenderToBitmap(ResourcePack rp) { Bitmap tb = new Bitmap(Constants.RoomSize * Constants.TileSize, Constants.RoomSize * Constants.TileSize, PixelFormat.Format24bppRgb); Graphics gfx = Graphics.FromImage(tb); // rendering a room is pretty simple; just draw each tile, unscaled, in a grid Iterate((Int32 x, Int32 y, ref UID uid) => { if (uid != null) { Tile t = rp.LookupByUID(uid) as Tile; if (t != null) { Bitmap tBmp = t.RenderToBitmap(rp); gfx.DrawImageUnscaled(tBmp, x * Constants.TileSize, y * Constants.TileSize); } else { // missing tile gfx.FillRectangle(Brushes.Magenta, x * Constants.TileSize, y * Constants.TileSize, 16.0f, 16.0f); } } }); gfx.Dispose(); return tb; }
// SiDComponent public override Bitmap RenderToBitmap(ResourcePack rp) { Bitmap tb = new Bitmap(Constants.RoomSize * Constants.TileSize, Constants.RoomSize * Constants.TileSize, PixelFormat.Format32bppArgb); tb.MakeTransparent(); Graphics gfx = Graphics.FromImage(tb); ImageAttributes ia = new ImageAttributes(); ColorMatrix cm = new ColorMatrix(); foreach (SpriteLayer layer in layers) { Sprite spr = rp.LookupByUID(layer.uid) as Sprite; const Int32 MidPoint = (Constants.RoomSize * Constants.TileSize) / 2; Int32 sX = MidPoint + (Int32)((sbyte)layer.x); Int32 sY = MidPoint - (Int32)((sbyte)layer.y); Int32 spriteSpaceX = (sX - (Constants.TileSize / 2)); Int32 spriteSpaceY = ((Constants.TileSize + sY) - (Constants.TileSize / 2)); if (spr != null) { Bitmap sprBmp = spr.RenderToBitmap(rp); Rectangle destRect = new Rectangle(spriteSpaceX, spriteSpaceY, sprBmp.Width, sprBmp.Height); float transpF = (float)(layer.trans) / 255.0f; if (layer.glow == 1) { // additive blending in GDI+? // couldn't find a built-in way to do this. annnooyyyinngg Int32 readOffsetX = 0, readOffsetY = 0; if (destRect.Y < 0) { destRect.Height += destRect.Y; readOffsetY = -destRect.Y; destRect.Y = 0; } if (destRect.X < 0) { destRect.Width += destRect.X; readOffsetX = -destRect.X; destRect.X = 0; } BitmapData bmpData = tb.LockBits(destRect, ImageLockMode.ReadWrite, tb.PixelFormat); unsafe { for (int y = 0; y < bmpData.Height; y++) { byte* row = (byte*)bmpData.Scan0 + (y * bmpData.Stride); for (int x = 0; x < bmpData.Width; x++) { Color topPixel = sprBmp.GetPixel(readOffsetX + x, readOffsetY + y); Int32 xP = x * 4; row[xP + 0] = (byte)Math.Min(255, (Int32)row[xP + 0] + topPixel.B); row[xP + 1] = (byte)Math.Min(255, (Int32)row[xP + 1] + topPixel.G); row[xP + 2] = (byte)Math.Min(255, (Int32)row[xP + 2] + topPixel.R); row[xP + 3] = (byte)Math.Min(255, (Int32)row[xP + 3] + topPixel.A); } } } tb.UnlockBits(bmpData); } else { // standard alpha composite cm.Matrix33 = transpF; ia.SetColorMatrix(cm); gfx.DrawImage(sprBmp, destRect, 0, 0, 16.0f, 16.0f, GraphicsUnit.Pixel, ia); } } else { // missing sprite gfx.FillRectangle(Brushes.Magenta, spriteSpaceX, spriteSpaceY, 16.0f, 16.0f); } } gfx.Dispose(); return tb; }