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); }
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); }
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); }
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); }
//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); }
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); }