Esempio n. 1
0
        // 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;
        }
Esempio n. 2
0
        // 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;
        }