private static void ImportDig(Node nDIG, Node nATM, Node nPNG, string outputPath) { log.Info("Importing " + nDIG.Name + ", " + nATM.Name + " and " + nPNG.Name); DIG originalDig = nDIG.TransformWith <Binary2DIG>().GetFormatAs <DIG>(); ALMT originalAtm = nATM.TransformWith <Binary2ALMT>().GetFormatAs <ALMT>(); // New stream var stream = new MemoryStream(); var dataStream = DataStreamFactory.FromStreamKeepingOwnership(stream, 0, 0); // Copy the png to the bitmap stream nPNG.Stream.WriteTo(dataStream); // Import the new PNG file Bitmap newImage = (Bitmap)Image.FromStream(stream); var quantization = new FixedPaletteQuantization(originalDig.Palette.GetPalette(0)); ColorFormat format; if (originalDig.PaletteType == 16) { format = ColorFormat.Indexed_4bpp; } else { format = ColorFormat.Indexed_8bpp; } Texim.ImageMapConverter importer = new Texim.ImageMapConverter { Format = format, PixelEncoding = PixelEncoding.HorizontalTiles, Quantization = quantization, //Mapable = new MatchMapping(originalDig.Pixels.GetPixels()) }; (Palette _, PixelArray pixelInfo, MapInfo[] mapInfos) = importer.Convert(newImage); originalDig.Pixels = pixelInfo; originalAtm.Info = mapInfos; BinaryFormat bDig = (BinaryFormat)ConvertFormat.With <Binary2DIG>(originalDig); BinaryFormat bAtm = (BinaryFormat)ConvertFormat.With <Binary2ALMT>(originalAtm); Utils.Lzss(bDig, "-evn").Stream.WriteTo(Path.Combine(outputPath, nDIG.Name + ".evn.dig")); bAtm.Stream.WriteTo(Path.Combine(outputPath, nATM.Name + ".atm")); }
private static void ExportDig(Node nDIG, Node nATM, string outputPath) { log.Info("Exporting " + nDIG.Name); DIG dig = nDIG.TransformWith <Binary2DIG>().GetFormatAs <DIG>(); ALMT atm = nATM.TransformWith <Binary2ALMT>().GetFormatAs <ALMT>(); Bitmap img = atm.CreateBitmap(dig.Pixels, dig.Palette); string path = Path.Combine(outputPath, nDIG.Name + ".png"); img.Save(path); log.Info("Saved into " + path); }
public NodeContainerFormat Convert(NodeContainerFormat source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } NodeContainerFormat output = new NodeContainerFormat(); DataReader komaReader = new DataReader(Koma.Stream); int komaEntryNumber = (int)(komaReader.Stream.Length / KOMA_ENTRY_SIZE); for (int i = 0; i < komaEntryNumber; i++) { byte[] entry = komaReader.ReadBytes(KOMA_ENTRY_SIZE); // DTX NAME FROM ARM9 byte letterKomaName = entry[04]; byte numberKomaName = entry[05]; DataReader armReader = new DataReader(Arm.Stream); string dtxName = ""; armReader.Stream.RunInPosition( () => { dtxName = armReader.ReadString(); }, (KOMA_NAME_TABLE_OFFSET + letterKomaName * 4)); dtxName += "_" + numberKomaName; if (numberKomaName == 0) { dtxName += 0; } log.Debug("dtxName:" + dtxName); // DTX SHAPE byte indexGroupKshape = entry[08]; byte indexElementKshape = entry[09]; DataReader komaShapeReader = new DataReader(Komashape.Stream); long komaShapeOffset = 0; komaShapeReader.Stream.RunInPosition( () => komaShapeOffset = ((komaShapeReader.ReadInt32() + indexElementKshape) * 0x18) + 0x40, (indexGroupKshape * 4)); log.Debug("komaShapeOffset:" + komaShapeOffset); // DTX File Node dtx = Navigator.SearchNode <Node>(source.Root, Path.Combine("/" + Directory, "koma-" + dtxName + ".dtx")); DataReader dtxReader = new DataReader(dtx.Stream); int magicid = dtxReader.ReadInt32(); byte type = dtxReader.ReadByte(); byte type_alt = dtxReader.ReadByte(); short totalFramesNumber = dtxReader.ReadInt16(); short digPointer = dtxReader.ReadInt16(); short unknown = dtxReader.ReadInt16(); byte[] width = new byte[totalFramesNumber]; byte[] height = new byte[totalFramesNumber]; short[] frameIndex = new short[totalFramesNumber]; for (int j = 0; j < totalFramesNumber; j++) { width[j] = dtxReader.ReadByte(); height[j] = dtxReader.ReadByte(); frameIndex[j] = dtxReader.ReadInt16(); } BinaryFormat bfDIG = new BinaryFormat(dtx.Stream, (long)digPointer, (dtx.Stream.Length - (long)digPointer)); DIG dig = (DIG)ConvertFormat.With <Binary2DIG>(bfDIG); // Iterate KomaShape komaShapeReader.Stream.Position = komaShapeOffset; // Fichero Dig tiene 08 de ancho y 872 de alto // 08 * 872 / 2 = 3488 bytes byte[] dtxPixels = new byte[192 * 240 / 2]; // *** REVISAR int x = 0; int y = 0; log.Debug("==KOMASHAPE=="); // Iterate kshape for (int k = 0; k < 0x14; k++) { byte blockDTX = komaShapeReader.ReadByte(); log.Debug(k + " - Byte: " + blockDTX); if (blockDTX > 00) { blockDTX -= 1; // Empieza el primer bloque en el dtx long startIndex = frameIndex[blockDTX] * 0x20 + dig.PixelsStart + 32; log.Debug("startIndex:" + startIndex); int blockSize = width[blockDTX] * 8 * height[blockDTX] * 8; for (int l = 0; l < blockSize; l++) { int position = GetIndex(PixelEncoding.Lineal, x, y, 192, 240, new Size(8, 8)); dtxPixels[position] = dig.Pixels.GetData()[startIndex + l]; log.Debug(l + " - dtxPixels:" + dtxPixels[l]); x += 1; if (x >= 192) { x = 0; y += 1; } log.Debug("x: " + x); log.Debug("y: " + y); } } x += 48; if (x >= 192) { x = 0; y += 48; } log.Debug("x: " + x); log.Debug("y: " + y); } log.Debug("===="); // Generate new image PixelArray extractedDTX = new PixelArray { Width = 192, Height = 240, }; Palette palette = dig.Palette; extractedDTX.SetData(dtxPixels, PixelEncoding.Lineal, ColorFormat.Indexed_8bpp); var img = extractedDTX.CreateBitmap(palette, 0); var s = new MemoryStream(); img.Save(s, System.Drawing.Imaging.ImageFormat.Png); img.Save("test.png"); // Add to container var n = new Node(dtxName, new BinaryFormat(DataStreamFactory.FromStream(s))); output.Root.Add(n); } return(output); }
private static void Import(string format, Node n, string dirToSave, string dataToInsert) { log.Info("Importing..."); switch (format) { case FORMATPREFIX + "BinInfoTitle": Po2BinInfoTitle p2b = new Po2BinInfoTitle() { OriginalFile = new Yarhl.IO.DataReader(n.Stream) { DefaultEncoding = Encoding.GetEncoding(932) } }; Node nodePo = NodeFactory.FromFile(dataToInsert); nodePo.TransformWith <Po2Binary>(); Node nodeBin = nodePo.TransformWith(p2b) .TransformWith <BinInfoTitle2Bin>(); nodeBin.Stream.WriteTo(Path.Combine(dirToSave, n.Name.Remove(n.Name.Length - 4) + "_new.bin")); break; case FORMATPREFIX + "ALAR.ALAR3": // Alar original Node original = n.TransformWith <BinaryFormat2Alar3>(); // Contenedor con los ficheros a insertar Node newContainer = NodeFactory.FromDirectory(dataToInsert, "*.*"); foreach (var child in newContainer.Children) { log.Info("Importing " + child.Name); } //var newAlar = newContainer.Transform<Alar3ToNodes, NodeContainerFormat, ALAR3>(); // Modificamos el Alar original con los nuevos ficheros a insertar original.GetFormatAs <ALAR3>().InsertModification(newContainer); original.TransformWith <BinaryFormat2Alar3>() .Stream.WriteTo(Path.Combine(dirToSave, n.Name + "new.aar")); break; case FORMATPREFIX + "DIG": DIG originalDig = n.TransformWith <Binary2DIG>().GetFormatAs <DIG>(); // Import the new PNG file Bitmap newImage = (Bitmap)Image.FromFile(dataToInsert); var quantization = new FixedPaletteQuantization(originalDig.Palette.GetPalette(0)); Texim.ImageConverter importer = new Texim.ImageConverter { Format = ColorFormat.Indexed_4bpp, PixelEncoding = PixelEncoding.HorizontalTiles, Quantization = quantization }; (Palette _, PixelArray pixelInfo) = importer.Convert(newImage); originalDig.Pixels = pixelInfo; BinaryFormat b = (BinaryFormat)ConvertFormat.With <Binary2DIG>(originalDig); Utils.Lzss(b, "-evn").Stream.WriteTo(Path.Combine(dirToSave, n.Name + "evn.dig")); break; } log.Info("Finished importing"); }