void WritePalette(CppWriter writer, Color[] palette) { for (int i = 0; i < palette.Length; ++i) { Color colour = palette[i]; UInt16 rbgColor = PaletteHelper.ToRgb16(colour); writer.Write(rbgColor); } }
/// <param name="inputPath">Input file path, namespace name is derived from this</param> /// <param name="outputPath">Output cpp file</param> /// <param name="bitmaps">List of image files to map tilemaps from</param> /// <param name="paletteBankIndexOffset">Allows us to force things like UI palettes into the back of the palette bank</param> public void Convert(string inputPath, string outputPath, IList <Bitmap> bitmaps, byte paletteBankIndexOffset = 0) { CppWriter cppWriter = new CppWriter(Path.GetFileName(Path.GetFileNameWithoutExtension(inputPath)), outputPath); Console.WriteLine("Processing master palette"); Color[] masterPalette; Tile[] masterTileSet; TileMap[] tileMapList; GenerateTileMaps(bitmaps, paletteBankIndexOffset, out masterPalette, out masterTileSet, out tileMapList); GBAMapData gbaMapData = GenerateMapData(tileMapList, paletteBankIndexOffset); const int maxMaps = sizeof(byte) * 8; if (gbaMapData.mapIsDynamic.Count >= maxMaps) { // Can't store this in the current bitmask size throw new Exception(string.Format("Too many tilemaps found. Maps = {0}, max is {1}. Consider increasing the bitmask of \"mapIsDynamicBitMask\".", gbaMapData.mapIsDynamic.Count, maxMaps)); } Console.WriteLine("Total unique tiles = " + masterTileSet.Length); Console.WriteLine("Processing tilemaps"); Compression.CompressionType compressionType = Compression.CompressionType.BitPacked; uint destBpp = CalculateDestBitsPerPixel(masterTileSet); List <UInt32> tileSetData = GenerateTileSetData(masterTileSet, compressionType, destBpp); // Write palette { cppWriter.Write(paletteBankIndexOffset); cppWriter.Write((byte)masterPalette.Length); for (int i = 0; i < masterPalette.Length; ++i) { Color colour = masterPalette[i]; UInt16 rbgColor = PaletteHelper.ToRgb16(colour); cppWriter.Write(rbgColor); } } // Write tileset { // Compression flags UInt32 compressionTypeSize = Compression.ToGBACompressionHeader(compressionType, destBpp); cppWriter.Write(compressionTypeSize); // Actual data cppWriter.Write((UInt32)tileSetData.Count); for (int i = 0; i < tileSetData.Count; ++i) { cppWriter.Write(tileSetData[i]); } } // Write tile maps { cppWriter.Write((byte)tileMapList.Length); cppWriter.Write((UInt32)gbaMapData.screenEntries.Length); byte mapIsDynamicBitMask = BoolListToBitmaskU8(gbaMapData.mapIsDynamic); cppWriter.Write(mapIsDynamicBitMask); // Width and height arrays foreach (int width in gbaMapData.widthLists) { cppWriter.Write((byte)width); } foreach (int height in gbaMapData.heightLists) { cppWriter.Write((byte)height); } foreach (var mapEntry in gbaMapData.screenEntries) { cppWriter.Write(mapEntry.m_data); } } Console.WriteLine("Tilemap \"" + outputPath + "\" successfully converted"); cppWriter.Finalise(); }