private void tabs_SelectedIndexChanges(object sender, EventArgs e)
        {
            if (tabs.SelectedTab == tpHeightmap && _heightMap == null)
            {
                _heightMap = new Bitmap(_drawingSurface.Width, _drawingSurface.Height, PixelFormat.Format8bppIndexed);

                // Create grayscale palette
                ColorPalette pal = _heightMap.Palette;
                for (int i = 0; i <= 255; i++)
                {
                    pal.Entries[i] = Color.FromArgb(i, i, i);
                }
                _heightMap.Palette = pal;                 // re-setting activates palette

                // Draw map
                var  heightBuffer = _drawingSurface.GetHeightBuffer();
                var  bmd          = _heightMap.LockBits(new Rectangle(0, 0, _drawingSurface.Width, _drawingSurface.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
                uint idx          = 0;
                unsafe {
                    for (int row = 0; row < _drawingSurface.Height; row++)
                    {
                        byte *w = (byte *)bmd.Scan0.ToPointer() + bmd.Stride * row;
                        for (int col = 0; col < _drawingSurface.Width; col++)
                        {
                            *w++ = (byte)(heightBuffer[idx++] & 0xFF);
                        }
                    }
                }

                _heightMap.UnlockBits(bmd);
                canvasHeight.Image = _heightMap;
            }
            else if (tabs.SelectedTab == tpShadowMap && _shadowMap == null)
            {
                _shadowMap = new Bitmap(_drawingSurface.Width, _drawingSurface.Height, PixelFormat.Format8bppIndexed);

                // Create palette with index 0 blue, all others red
                ColorPalette pal = _heightMap.Palette;
                for (int i = 0; i <= 255; i++)
                {
                    // create greyscale color table
                    pal.Entries[i] = i == 0 ? Color.Blue : Color.Red;
                }
                _shadowMap.Palette = pal;                 // re-setting activates palette

                // Draw map
                var  bmd = _shadowMap.LockBits(new Rectangle(0, 0, _drawingSurface.Width, _drawingSurface.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
                uint idx = 0;
                unsafe {
                    for (int row = 0; row < _drawingSurface.Height; row++)
                    {
                        byte *w = (byte *)bmd.Scan0.ToPointer() + bmd.Stride * row;
                        for (int col = 0; col < _drawingSurface.Width; col++)
                        {
                            *w++ = (byte)(_drawingSurface.IsShadow(col, row) ? 1 : 0);
                        }
                    }
                }

                _shadowMap.UnlockBits(bmd);
                canvasShadows.Image = _shadowMap;
            }
        }