예제 #1
0
        public Progressbar(Rectangle bounds, Color background, Color foreground)
        {
            Background      = new TextureField(bounds, background);
            ForeGroundColor = foreground;

            Progress = 0;
        }
예제 #2
0
        public override void Setup()
        {
            TextureField.Setup();
            PickButton.Setup();

            TextureField.Position = Position;
            PickButton.Position   = new Point(TextureField.Right - PickButton.Width, TextureField.Center.Y - PickButton.Height / 2);
        }
예제 #3
0
        private bool ReadField(ObjectReader objectReader, Dictionary <TextureField, int> fieldValues, TextureField field)
        {
            switch (field)
            {
            case TextureField.End:
                return(false);

            case TextureField.JpegData:
                using (var jpeg = new Bitmap(new MemoryStream(objectReader.ReadBytes(objectReader.ReadInt32()))))
                {
                    m_Width  = jpeg.Width;
                    m_Height = jpeg.Height;

                    var data    = jpeg.LockBits(new Rectangle(0, 0, m_Width, m_Height), ImageLockMode.ReadOnly, jpeg.PixelFormat);
                    var strides = new byte[data.Stride * jpeg.Height];
                    Marshal.Copy(data.Scan0, strides, 0, strides.Length);
                    jpeg.UnlockBits(data);

                    var rgb   = new byte[m_Width * m_Height * 4];
                    var index = 0;
                    for (int row = 0; row < m_Height; row++)
                    {
                        for (int column = 0; column < m_Width; column++)
                        {
                            var offset = (m_Height - row - 1) * data.Stride;

                            switch (jpeg.PixelFormat)
                            {
                            case PixelFormat.Format24bppRgb:
                                offset      += column * 3;
                                rgb[index++] = strides[offset++];
                                rgb[index++] = strides[offset++];
                                rgb[index++] = strides[offset];
                                rgb[index++] = 255;
                                break;

                            case PixelFormat.Format8bppIndexed:
                                var colour = jpeg.Palette.Entries[strides[offset + column]];
                                rgb[index++] = colour.B;
                                rgb[index++] = colour.G;
                                rgb[index++] = colour.R;
                                rgb[index++] = colour.A;
                                break;

                            default:
                                throw new NotImplementedException();
                            }
                        }
                    }

                    _pixels    = new MemoryStream(rgb);
                    image_data = new ResourceReader(new BinaryReader(_pixels), 0, rgb.Length);
                }
                return(true);

            case TextureField.BmpColourTable:
                _colours = objectReader.ReadUInt32Array(fieldValues[TextureField.Colours]);
                return(true);

            case TextureField.Tranparent:
                _transparent = objectReader.ReadUInt32() | 0xff000000;
                return(true);

            case TextureField.BmpPixelData:
                using (var memoryWriter = new BinaryWriter(_pixels = new MemoryStream(), Encoding.Default, true))
                {
                    m_Width  = fieldValues[TextureField.Width];
                    m_Height = fieldValues[TextureField.Height];

                    var bitsPerPixel = fieldValues[TextureField.BitsPerPixel];
                    var rowBytes     = (int)Math.Ceiling((m_Width * bitsPerPixel) / 8.0) % 4;

                    for (int row = 0; row < m_Height; row++)
                    {
                        for (int column = 0; column < m_Width; column++)
                        {
                            switch (bitsPerPixel)
                            {
                            case 4:
                                var b = objectReader.ReadByte();
                                WriteColour(memoryWriter, _colours[b >> 4]);
                                if (++column < m_Width)
                                {
                                    WriteColour(memoryWriter, _colours[b & 0x0f]);
                                }
                                break;

                            case 8:
                                WriteColour(memoryWriter, _colours[objectReader.ReadByte()]);
                                break;

                            case 24:
                                WriteColour(memoryWriter, objectReader.ReadUInt32());
                                objectReader.Position--;
                                break;

                            default:
                                throw new NotImplementedException();
                            }
                        }

                        // Align rows to multiples of 32 bits
                        if (rowBytes != 0)
                        {
                            objectReader.ReadBytes(4 - rowBytes);
                        }
                    }

                    image_data = new ResourceReader(new BinaryReader(_pixels), 0, (int)_pixels.Length);
                }
                return(true);

            case TextureField.BitsPerPixel:
            case TextureField.UnknownShort31:
                fieldValues.Add(field, objectReader.ReadUInt16());
                InfoText += $"{field}: {fieldValues[field]}\n";
                return(true);

            case TextureField.UnknownByte22:
            case TextureField.UnknownByte27:
            case TextureField.UnknownByte128:
            case TextureField.UnknownByte129:
                fieldValues.Add(field, objectReader.ReadByte());
                InfoText += $"{field}: {fieldValues[field]}\n";
                return(true);

            case TextureField.UnknownArray99:
                fieldValues.Add(field, objectReader.ReadInt32());
                InfoText += $"{field}: {fieldValues[field]} [{string.Join(", ", Enumerable.Range(0, 12).Select(i => objectReader.ReadByte()))}]\n";
                return(true);

            case TextureField.AlphaMap:
                fieldValues.Add(field, objectReader.ReadInt32());
                var alphaMap = new BitArray(objectReader.ReadBytes(fieldValues[field]));
                var stride   = alphaMap.Length / m_Height;
                for (int row = 0; row < m_Height; row++)
                {
                    for (int column = 0; column < m_Width; column++)
                    {
                        var endianColumn = 8 * (column / 8);
                        endianColumn += 7 - (column % 8);

                        if (!alphaMap[(row * stride) + endianColumn])
                        {
                            _pixels.Position = ((row * m_Width) + column) * 4 + 3;
                            _pixels.WriteByte(0);
                        }
                    }
                }
                return(true);

            default:
                fieldValues.Add(field, objectReader.ReadInt32());
                InfoText += $"{field}: {fieldValues[field]}\n";
                return(true);
            }
        }
예제 #4
0
 public override void Draw()
 {
     TextureField.Draw();
     PickButton.Draw();
 }
예제 #5
0
 public override void Update(GameTime gameTime)
 {
     TextureField.Update(gameTime);
     PickButton.Update(gameTime);
 }
예제 #6
0
 public override void AddStringRenderer(SpriteBatch batch)
 {
     TextureField.AddStringRenderer(batch);
     PickButton.AddStringRenderer(batch);
 }
예제 #7
0
        private void CreateGateButtons(InputContainer componentMenu, GameMenu gameMenu)
        {
            List <TextureField> icons = new List <TextureField>();

            ButtonTexture bt = new ButtonTexture(
                InputController.DefaultTexture,
                new Color(50, 50, 50),
                new Color(100, 100, 100),
                new Color(75, 75, 75),
                new Color(95, 115, 255)
                );
            int buttonSize = (Width - (ButtonPrRow + 1) * BPadding) / ButtonPrRow;
            int offsetY    = 0;

            for (int i = 0; i < gateTypes.Count; i++)
            {
                Type gateType = gateTypes[i];
                int  offsetX  = (i % ButtonPrRow);
                offsetX = offsetX * buttonSize + offsetX * BPadding;
                offsetY = (i / ButtonPrRow);
                offsetY = offsetY * buttonSize + offsetY * BPadding;

                Rectangle bounds     = new Rectangle(X + BPadding + offsetX, Y + BPadding + offsetY, buttonSize, buttonSize);
                Rectangle iconBounds = bounds;
                iconBounds.Inflate(-4, -4);

                Texture2D texture;
                if (gameMenu.GateTextureMap.ContainsKey(gateType.FullName))
                {
                    texture = gameMenu.GateTextureMap[gateType.FullName];
                }
                else
                {
                    texture = InputController.DefaultTexture;
                }

                TextureField icon = new TextureField(iconBounds, texture, Color.White);
                Button       temp = new Button(bounds, bt, new Text("", Color.White));
                temp.ID = gateType.FullName;

                icons.Add(icon);
                group.Add(temp, false);
            }



            group.BeforeSelectedButtonChange += (object sender, ButtonEventArgs e) =>
            {
                if (group.SelectedButton != null)
                {
                    Containers[group.SelectedButton.ID].Active = false;
                    Containers[group.SelectedButton.ID].DeFocus();
                }

                if (!Selected)
                {
                    OnActive?.Invoke();
                }
            };

            group.AfterSelectedButtonChange += (object sender, ButtonEventArgs e) =>
            {
                Containers[e.Button.ID].Active = true;
                Containers[e.Button.ID].Focus();
            };

            componentMenu.Add(group);
            componentMenu.Add(icons);
            CurrentY = offsetY + buttonSize + BPadding;
        }