public override Bitmap render(Palette p) { int w = getWidth(); int h = getHeight(); Bitmap b = new Bitmap(w, h); ByteArrayInputStream f5data = new ByteArrayInputStream(f5.getContents()); ByteArrayInputStream data = new ByteArrayInputStream(f.getContents()); for (uint y = 0; y < h / 4; y++) { for (uint x = 0; x < w / 4; x++) { ushort palDat = f5data.readUShort(); ushort palOffs = (ushort)((palDat & 0x3FFF) * 2); ushort mode = (ushort)((palDat >> 14) & 3); for (uint yy = 0; yy < 4; yy++) { byte row = data.readByte(); for (uint xx = 0; xx < 4; xx++) { byte color = (byte)(row >> (byte)(xx * 2)); color &= 3; Color col; col = p.getColorSafe(palOffs + color); switch (mode) { case 0: if (color == 3) { col = Color.Transparent; } break; case 1: if (color == 2) { col = ImageTiler.colorMean(p.getColorSafe(palOffs), p.getColorSafe(palOffs + 1), 1, 1); } if (color == 3) { col = Color.Transparent; } break; case 3: if (color == 2) { col = ImageTiler.colorMean(p.getColorSafe(palOffs), p.getColorSafe(palOffs + 1), 5, 3); } if (color == 3) { col = ImageTiler.colorMean(p.getColorSafe(palOffs), p.getColorSafe(palOffs + 1), 3, 5); } break; } b.SetPixel((int)x * 4 + (int)xx, (int)y * 4 + (int)yy, col); } } } } return(b); }
private void importPNGButton_Click(object sender, EventArgs e) { getFiles(); if (GFXFile == null) { return; } if (PalFile == null) { return; } if (LayoutFile == null) { return; } // Create a local copy because the global variables could be overwritten while the background is importing File myGFXFile = GFXFile; File myPalFile = PalFile; File myLayoutFile = LayoutFile; int offs = bg.topLayer ? 256 : 576; int palOffs = bg.topLayer ? 8 : 10; if (bg.mappedTileset) { offs = 192; palOffs = 2; } OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = LanguageManager.Get("Filters", "png"); ofd.CheckFileExists = true; if (ofd.ShowDialog() != DialogResult.OK) { return; } string filename = ofd.FileName; Bitmap b = new Bitmap(filename); if (b.Size != new Size(512, 512)) { throw new Exception("Wrong image size"); } BgPNGImportPrompt bgPrompt = new BgPNGImportPrompt(bg.topLayer, bg.mappedTileset); if (!bgPrompt.finished) { return; } ImageTiler ti; if (bg.topLayer) { bgPrompt.bgFirstTileOffset = 0; ti = new ImageTiler(b, new Size(256, bgPrompt.fgHeightInPixels), new Size(512, 512), 50); } else { ti = new ImageTiler(b, new Size(256, bgPrompt.bgHeightInPixels), new Size(512, 512), 50); } Color[] palette = ImageIndexer.createPaletteForImage(b); ByteArrayOutputStream oo = new ByteArrayOutputStream(); for (int i = 0; i < palette.Length; i++) { oo.writeUShort(NSMBTileset.toRGB15(palette[i])); } ByteArrayOutputStream offsetBitmapData = new ByteArrayOutputStream(); for (int i = 0; i < 256 * bgPrompt.bgFirstTileOffset; i++) { offsetBitmapData.writeByte(0); } //byte[] newBitmapData = ImageIndexer.indexImageWithPalette(ti.tileBuffer, palette); byte[] newBitmapData = new byte[offsetBitmapData.getArray().Length + ImageIndexer.indexImageWithPalette(ti.tileBuffer, palette).Length]; Buffer.BlockCopy(offsetBitmapData.getArray(), 0, newBitmapData, 0, offsetBitmapData.getArray().Length); Buffer.BlockCopy(ImageIndexer.indexImageWithPalette(ti.tileBuffer, palette), 0, newBitmapData, offsetBitmapData.getArray().Length, ImageIndexer.indexImageWithPalette(ti.tileBuffer, palette).Length); myPalFile.beginEdit(this); myPalFile.replace(ROM.LZ77_Compress(oo.getArray()), this); myPalFile.endEdit(this); myGFXFile.beginEdit(this); myGFXFile.replace(ROM.LZ77_Compress(newBitmapData), this); myGFXFile.endEdit(this); b.Dispose(); ByteArrayOutputStream layout = new ByteArrayOutputStream(); for (int y = 0; y < ti.heightTileCount; y++) { for (int x = 0; x < ti.widthTileCount; x++) { layout.writeUShort((ushort)((ti.tileMap[x, y] + offs + (bgPrompt.bgFirstTileOffset * 4)) | (palOffs << 12))); } } myLayoutFile.beginEdit(this); myLayoutFile.replace(ROM.LZ77_Compress(layout.getArray()), this); myLayoutFile.endEdit(this); }