Esempio n. 1
0
        public static byte[] GenerateBFF2(byte[] palette, byte[] data, CGeneric.Compression compressionMethod, int sizeX, int sizeY, string bffName)
        {
            //generate header
            //--> determine GreenAlpha and palette size
            byte greenAlphaIndex = 0;

            if (palette.Length > 0)
            {
                greenAlphaIndex = CTextureManager.GetGreenAlphaValueIndex(palette, compressionMethod);
            }
            //make almost random compressed value.. (10)(because not enought information about it)
            //set displayedWidth equal pixel width (because not enought information about it)
            byte[] sizeXB   = CGeneric.ConvertIntToByteArray16bits(sizeX);
            byte[] sizeYB   = CGeneric.ConvertIntToByteArray16bits(sizeY);
            byte[] name     = CGeneric.ConvertStringToByteArray(bffName);
            byte[] nbColors = new byte[0];
            if (palette.Length > 0)
            {
                nbColors = CGeneric.ConvertIntToByteArray(palette.Length / CTextureManager.GetBytePerPixel(compressionMethod));
            }

            byte[] bff2header = SetHeader(compressionMethod, greenAlphaIndex, 0xE, sizeXB, sizeXB, sizeYB, name, nbColors);

            //concatenate header, palette and compressed data
            byte[] finalData = new byte[bff2header.Length + palette.Length + data.Length];
            Array.Copy(bff2header, 0, finalData, 0, bff2header.Length);
            if (palette.Length > 0)
            {
                Array.Copy(palette, 0, finalData, bff2header.Length, palette.Length);
            }

            Array.Copy(data, 0, finalData, bff2header.Length + palette.Length, data.Length);

            return(finalData);
        }
Esempio n. 2
0
        public static byte GetGreenAlphaValueIndex(byte[] palette, CGeneric.Compression compressionMethod)
        {
            Color greenAlpha = Color.FromArgb(255, 0, 255, 0);
            Color tmpColor;
            byte  index = 0;

            for (int i = 0; i < palette.Length; i += 4)
            {
                tmpColor = Color.FromArgb(palette[i + 3], palette[i], palette[i + 1], palette[i + 2]);
                if (tmpColor == greenAlpha)
                {
                    return(index);
                }
                else
                {
                    index++;
                }
            }

            return(index);
        }
Esempio n. 3
0
        public static int GetBytePerPixel(CGeneric.Compression compressionType)
        {
            int finalValue = 4;

            switch (compressionType)
            {
            case CGeneric.Compression.unknow22:
                finalValue = 4;
                break;

            case CGeneric.Compression.unknow23:
                finalValue = 1;
                break;

            case CGeneric.Compression.greyscale:
                finalValue = 2;
                break;

            case CGeneric.Compression.max16Colors:
                finalValue = 4;
                break;

            case CGeneric.Compression.max256Colors:
                finalValue = 4;
                break;

            case CGeneric.Compression.trueColor16Bits:
                finalValue = 2;
                break;

            case CGeneric.Compression.trueColor32Bits:
                finalValue = 4;
                break;
            }
            return(finalValue);
        }
Esempio n. 4
0
        public static byte[] ConvertByteArrayToRGBA(byte[] texture, CGeneric.Compression compressionType, byte[] palette = null, bool isCompressedPalette = false)
        {
            byte[] arrayRGBA = new byte[0];

            switch (compressionType)
            {
            case CGeneric.Compression.unknow22:
                arrayRGBA = Convert4bitIntensityAlphaColorsToRGBA(texture);
                break;

            case CGeneric.Compression.unknow23:
                arrayRGBA = Convert8bitIntensityAlphaColorsToRGBA(texture);
                break;

            case CGeneric.Compression.greyscale:
                arrayRGBA = ConvertGreyscaleToRGBA(texture);
                break;

            case CGeneric.Compression.max16Colors:
                arrayRGBA = ConvertMax16ColorsToRGBA(texture, palette);
                break;

            case CGeneric.Compression.max256Colors:
                arrayRGBA = ConvertMax256ColorsToRGBA(texture, palette, isCompressedPalette);
                break;

            case CGeneric.Compression.trueColor16Bits:
                arrayRGBA = ConvertTrueColor16BitsToRGBA(texture);
                break;

            case CGeneric.Compression.trueColor32Bits:
                arrayRGBA = texture;
                break;
            }
            return(arrayRGBA);
        }
Esempio n. 5
0
        //specific format for BFF header
        private static byte[] SetHeader(CGeneric.Compression textureType, byte greenAlphaIndex, byte compressedValue, byte[] displayedWidth, byte[] pixelWidth, byte[] displayHeight, byte[] bffName, byte[] colorCount)
        {
            //fixedsize = 36 + bffName + 1 if bffName size is not pair + 4 for palette color count
            byte[] headerBFF2 = new Byte[36 + bffName.Length + bffName.Length % 2 + colorCount.Length];

            headerBFF2[8] = 0x8;

            //write "BFF2"
            for (int i = 0; i < CGeneric.patternBFF2.Length; i++)
            {
                headerBFF2[12 + i] = CGeneric.patternBFF2[i];
            }

            //decompose the next two bytes in nibbles
            //grab the nibbles of alpha color
            List <byte> alphaColor = CGeneric.ByteToNibble(greenAlphaIndex);

            //write two nibbles for the both bytes..
            headerBFF2[17] = CGeneric.NibbleToByte(2, alphaColor[0]);
            headerBFF2[18] = CGeneric.NibbleToByte(alphaColor[1], compressedValue);

            //write texture type
            headerBFF2[19] = (byte)textureType;

            //write displayed width
            for (int i = 0; i < displayedWidth.Length; i++)
            {
                headerBFF2[20 + i] = displayedWidth[i];
            }

            //write pixel width
            for (int i = 0; i < pixelWidth.Length; i++)
            {
                headerBFF2[22 + i] = pixelWidth[i];
            }

            //write display height
            for (int i = 0; i < displayHeight.Length; i++)
            {
                headerBFF2[26 + i] = displayHeight[i];
            }

            //prepare instruction length (depending of the pixelWidth value)
            double instructionLengthValue = CGeneric.ConvertByteArrayToInt(pixelWidth);

            switch (textureType)
            {
            case CGeneric.Compression.greyscale: instructionLengthValue *= 2; break;

            case CGeneric.Compression.max16Colors: instructionLengthValue /= 2; break;

            case CGeneric.Compression.trueColor16Bits: instructionLengthValue *= 2; break;

            case CGeneric.Compression.trueColor32Bits: instructionLengthValue *= 4; break;
            }

            byte[] instructLength = CGeneric.ConvertIntToByteArray((int)Math.Floor(instructionLengthValue));

            //write instruction length
            for (int i = 0; i < instructLength.Length; i++)
            {
                headerBFF2[28 + i] = instructLength[i];
            }

            //length of file name
            if (bffName.Length % 2 == 0)
            {
                headerBFF2[35] = (byte)bffName.Length;
            }
            else
            {
                headerBFF2[35] = (byte)(bffName.Length + 1);
            }

            //write bff name
            for (int i = 0; i < bffName.Length; i++)
            {
                headerBFF2[36 + i] = bffName[i];
            }

            for (int i = 0; i < colorCount.Length; i++)
            {
                headerBFF2[36 + bffName.Length + bffName.Length % 2 + i] = colorCount[i];
            }


            return(headerBFF2);
        }
Esempio n. 6
0
        public static (byte[] palette, byte[] data) ConvertPixelsToGoodFormat(byte[] texture, CGeneric.Compression textureType, bool isCompressedPalette = false)
        {
            byte[] finalArray = texture;
            byte[] palette    = new byte[0];

            switch (textureType)
            {
            case CGeneric.Compression.greyscale:
                finalArray = ConvertRGBAtoGreyscale(texture);
                break;

            case CGeneric.Compression.max16Colors:
                (palette, finalArray) = ConvertRGBAtoMax16Colors(texture);
                break;

            case CGeneric.Compression.max256Colors:
                (palette, finalArray) = ConvertRGBAtoMax256Colors(texture, isCompressedPalette);
                break;

            case CGeneric.Compression.trueColor16Bits:
                finalArray = ConvertRGBAtoTrueColor16Bits(texture);
                break;
            }
            return(palette, finalArray);
        }