コード例 #1
0
ファイル: ImageData.cs プロジェクト: WizzardMaker/S4GFX
        public uint[] GetUsedColors(bool forceUpdate = false)
        {
            if (usedColors != null && !forceUpdate)
            {
                return(usedColors.ToArray());
            }

            usedColors = new List <uint>();

            for (int c = 0; c < data.Length; c += 4)
            {
                uint color = Palette.RGBToPalette(data[c], data[c + 1], data[c + 2]);

                int r = (int)(color & 0b0000_0000_0000_0000_1111_1111);
                int g = (int)(color >> 8 & 0b0000_0000_0000_0000_1111_1111);
                int b = (int)(color >> 16 & 0b0000_0000_0000_0000_1111_1111);

                if (!usedColors.Contains(color))
                {
                    usedColors.Add(color);
                    usedColors.Sort();
                }
            }

            return(usedColors.ToArray());
        }
コード例 #2
0
ファイル: GfxImage.cs プロジェクト: WizzardMaker/S4GFX
        private byte[] WriteImageDataWithNoEncoding(byte[] data, int pos, int length)
        {
            List <byte> newData = new List <byte>();

            for (int i = 0; i < length; i += 4)
            {
                int value;

                byte red   = data[i + 0];
                byte green = data[i + 1];
                byte blue  = data[i + 2];
                byte alpha = data[i + 3];

                value = palette.GetIndex(paletteOffset, Palette.RGBToPalette(red, green, blue));
                if (value == -1)
                {
                    Console.WriteLine($"Invalid color - not found in the palette! Color: R:{red}, G:{green}, B:{blue}");
                }

                value = value - paletteOffset;

                if (value >= 252)
                {
                    Console.WriteLine("Invalid color - not found in the palette!");
                }

                newData.Add((byte)value);
            }

            return(newData.ToArray());
        }
コード例 #3
0
ファイル: GfxImage.cs プロジェクト: Settlers4Modding/S4GFX
        private byte[] CreateImageDataWithRunLengthEncoding(byte[] data, int length)
        {
            List <byte> newData = new List <byte>();

            int dataLength = 0;

            for (int i = 0; i < length; i += 4)
            {
                int value = 0;

                byte red   = data[i + 0];
                byte green = data[i + 1];
                byte blue  = data[i + 2];
                byte alpha = data[i + 3];

                bool valueIsOperator = false;

                if (red == 255 && green + blue == 0)
                {
                    value           = 0;//transparent
                    valueIsOperator = true;
                }
                else if (green == 255 && red + blue == 0)
                {
                    value           = 1;//shadow
                    valueIsOperator = true;
                }
                else
                {
                    value = palette.GetIndex(paletteOffset, Palette.RGBToPalette(red, green, blue));
                    value = value - paletteOffset;
                    value = Math.Max((byte)2, (byte)value);
                }
                int count = 1;

                newData.Add((byte)value);
                dataLength += 1;

                if (valueIsOperator == true)
                {
                    int offset = 0;
                    count = GetSameValueCount(ref data, i, value, ref offset);
                    newData.Add((byte)count);

                    i           = offset;
                    dataLength += 1;
                }
            }

            return(newData.ToArray());
        }