Exemplo n.º 1
0
        StringBuilder ExportALL(InputFormRef.AutoPleaseWait pleaseWait, string basedir, bool isItemFont)
        {
            List <Address> list = new List <Address>();

            MakeAllDataLengthInner(isItemFont, ref list);
            PatchUtil.PRIORITY_CODE priorityCode = PatchUtil.SearchPriorityCode();
            Color         bgcolor = GetFontColor(isItemFont);
            StringBuilder sb      = new StringBuilder();

            foreach (Address a in list)
            {
                if (a.DataType != FEBuilderGBA.Address.DataTypeEnum.FONT)
                {
                    continue;
                }
                if (a.Addr <= Program.ROM.RomInfo.font_default_end())
                {//規定のフォント
                    continue;
                }

                int    out_width;
                byte[] fontbyte = ReadFontData(a.Addr, out out_width);
                Bitmap bitmap   = ImageUtil.ByteToImage4(16, 16, fontbyte, 0, bgcolor);
                ImageUtil.BlackOutUnnecessaryColors(bitmap, 1);
                string font_filename = Path.Combine(basedir, a.Info + ".png");
                U.BitmapSave(bitmap, font_filename);
                bitmap.Dispose();

                sb.AppendLine(a.Info + ".png");
            }

            return(sb);
        }
Exemplo n.º 2
0
        private void ExportButton_Click(object sender, EventArgs e)
        {
            uint pic_address  = (uint)P0.Value;
            int  palette_type = X_PALETTE.SelectedIndex;

            string filename = ImageFormRef.SaveDialogPngOrGIF(InputFormRef);

            if (filename == "")
            {
                return;
            }

            string ext = U.GetFilenameExt(filename);

            if (ext == ".GIF")
            {
                bool r = SaveAnimeGif(filename, pic_address, palette_type);
                if (!r)
                {
                    return;
                }
            }
            else
            {
                Bitmap bitmap = DrawMoveUnitIcon(pic_address, palette_type);
                ImageUtil.BlackOutUnnecessaryColors(bitmap, 1);
                U.BitmapSave(bitmap, filename);
            }

            //エクスプローラで選択しよう
            U.SelectFileByExplorer(filename);
        }
        public static void SaveAPImages(string filename, uint image_addr, uint ap_addr, int x, int y)
        {
            image_addr = U.toOffset(image_addr);
            Bitmap parts = DrawBorderBitmap(image_addr);

            ap_addr = U.toOffset(ap_addr);
            ImageUtilAP ap = new ImageUtilAP();
            bool        r  = ap.Parse(ap_addr);

            if (!r)
            {
                return;
            }

            Bitmap borderimg = ImageUtil.Blank(256, 160, parts);

            ap.DrawFrame(borderimg, 0, x, y, parts);
            string export_filename = ImageFormRef.ExportImage(null, borderimg, filename);

            string name_filename = MakeBorderNameImageFileName(export_filename);

            borderimg = ImageUtil.Blank(256, 160, parts);
            ap.DrawFrame(borderimg, 1, x, y, parts);
            ImageUtil.BlackOutUnnecessaryColors(borderimg, 1);
            borderimg.Save(name_filename);
        }
Exemplo n.º 4
0
        Bitmap MakeTransparent(Bitmap bitmap)
        {
            int palettecount = ImageUtil.GetPalette16Count(bitmap);

            ImageUtil.BlackOutUnnecessaryColors(bitmap, palettecount);
            U.MakeTransparent(bitmap);
            return(bitmap);
        }
        bool SaveAnimeGif(string filename, uint pic_address, int palette_type)
        {
            List<ImageUtilAnimeGif.Frame> bitmaps = new List<ImageUtilAnimeGif.Frame>();
            for (int showFrame = 0; showFrame < 0xF; showFrame++)
            {
                Bitmap bitmap = DrawMoveUnitIcon(pic_address, palette_type, showFrame);
                ImageUtil.BlackOutUnnecessaryColors(bitmap, 1);
                uint wait = 10;
                bitmaps.Add(new ImageUtilAnimeGif.Frame(bitmap, wait));
            }

            //アニメgif生成
            ImageUtilAnimeGif.SaveAnimatedGif(filename, bitmaps);
            return true;
        }
Exemplo n.º 6
0
        public static void Export(
            string filename      //書き込むファイル名
            , uint anime_address)
        {
            string basename = Path.GetFileNameWithoutExtension(filename) + "_";
            string basedir  = Path.GetDirectoryName(filename);


            anime_address = U.toOffset(anime_address);
            if (!U.isSafetyOffset(anime_address))
            {
                return;
            }


            string    programCode;
            AnimeType animeType;
            uint      anime_config_address = SkipCode(anime_address, out programCode, out animeType);

            if (anime_config_address == U.NOT_FOUND)
            {
                return;
            }
            if (anime_config_address + (4 * 5) > Program.ROM.Data.Length)
            {//範囲外
                return;
            }

            //POIN Frames
            //POIN TSAList
            //POIN GraphicsList
            //POIN PalettesList
            //WORD 0x3d1 //sound id
            uint frames      = Program.ROM.p32(anime_config_address + (4 * 0));
            uint tsalist     = Program.ROM.p32(anime_config_address + (4 * 1));
            uint graphiclist = Program.ROM.p32(anime_config_address + (4 * 2));
            uint palettelist = Program.ROM.p32(anime_config_address + (4 * 3));
            uint sound_id    = Program.ROM.u32(anime_config_address + (4 * 4));

            if (!U.isSafetyOffset(frames))
            {
                return;
            }
            if (!U.isSafetyOffset(tsalist))
            {
                return;
            }
            if (!U.isSafetyOffset(graphiclist))
            {
                return;
            }
            if (!U.isSafetyOffset(palettelist))
            {
                return;
            }

            //同じアニメを何度も出力しないように記録する.
            Dictionary <uint, Bitmap> animeHash = new Dictionary <uint, Bitmap>();
            List <string>             lines     = new List <string>();

            if (animeType == AnimeType.D)
            {
                lines.Add("D #is defender anim");
            }
            if (sound_id > 0)
            {
                lines.Add("S" + sound_id.ToString("X04") + " #play sound " + SongTableForm.GetSongName(sound_id));
            }

            //圧縮されていないデータなので、事故防止のため リミッターをかける.
            uint limitter = frames + 1024 * 1024; //1MBサーチしたらもうあきらめる.

            limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length);

            for (uint n = frames; n < limitter; n += 4)
            {
                uint id   = Program.ROM.u16(n + 0);
                uint wait = Program.ROM.u16(n + 2);
                if (id == 0xFFFF)
                {
                    break;
                }

                Bitmap bitmap;
                string imagefilename = basename.Replace(" ", "_") + "g" + id.ToString("000") + ".png";
                if (animeHash.ContainsKey(id))
                {
                    bitmap = animeHash[id];
                }
                else
                {
                    bitmap = DrawFrameImage(n, graphiclist, tsalist, palettelist);

                    int paletteCount = ImageUtil.GetPalette16Count(bitmap);
                    if (paletteCount < 1)
                    {
                        paletteCount = 1;
                    }

                    //利用していないパレットを消す.
                    ImageUtil.BlackOutUnnecessaryColors(bitmap, paletteCount);

                    U.BitmapSave(bitmap, Path.Combine(basedir, imagefilename));
                    animeHash[id] = bitmap;
                }

                string line = wait.ToString() + " " + imagefilename;
                lines.Add(line);
            }

            //まとめて書き込み
            File.WriteAllLines(filename, lines);
        }
        static string ExportBGFrameImage(
            uint frame
            , byte[] frameData
            , string basedir
            , string basename
            , List <uint> animeHash
            )
        {
            basename = basename + "b_";


            //0  frame16 byte1 x86
            //4  objImagePointer
            //8  OAMAbsoStart
            //12 OAMBGAbsoStart
            //16 bgImagePointer
            //20 objPalettePointer
            //24 bgPalettePointer
            //CSA_Creater 28 TSA
            uint bgPointer        = U.u32(frameData, frame + 16);
            uint bgPalettePointer = U.u32(frameData, frame + 24);
            uint bgTSAPointer     = U.u32(frameData, frame + 28);

            uint   imageHash     = (bgPointer + bgTSAPointer);
            string framefilename = "";
            int    seatnumber    = animeHash.IndexOf(imageHash);

            if (seatnumber >= 0)
            {//すでに出力しているのでカットする.
                framefilename = basename + seatnumber.ToString("000") + ".png";
                return(framefilename);
            }

            byte[] bgPalette = Program.ROM.getBinaryData(U.toOffset(bgPalettePointer), 0x20);
            byte[] bg_UZ     = LZ77.decompress(Program.ROM.Data, U.toOffset(bgPointer));
            byte[] bgTSA_UZ  = LZ77.decompress(Program.ROM.Data, U.toOffset(bgTSAPointer));
            if (bg_UZ.Length <= 0 || bgTSA_UZ.Length <= 0)
            {
                Log.Error("bg_UZ", U.ToHexString(bgPointer), "or bgTSA_UZ", U.ToHexString(bgTSAPointer), "is null. broken frame.");
                return("");
            }

            //まだ出力していない画像なので作成します.
            seatnumber = animeHash.Count;
            animeHash.Add(imageHash);

            //int width = 264; //FEditorAdv
            //int height = 64;
            int width  = 256 - 8 - 8;
            int height = ImageUtil.CalcHeightbyTSA(width, bgTSA_UZ.Length);

            if (height >= 160)
            {
                height = 160;
            }
            else
            {
                height = 64;
            }
            Bitmap retImage = ImageUtil.Blank(width, height, bgPalette, 0);

            Bitmap bg = ImageUtil.ByteToImage16Tile(width, height, bg_UZ, 0, bgPalette, 0, bgTSA_UZ, 0, 0);

            ImageUtil.BitBlt(retImage, 0, 0, bg.Width, bg.Height, bg, 0, 0);


            ////パレットマークを右上に描画 CSA_Creator では不要らしい.
            ////ImageUtil.AppendPaletteMark(retImage);
            //利用していないパレットを消す.
            ImageUtil.BlackOutUnnecessaryColors(retImage, 1);

            framefilename = basename + seatnumber.ToString("000") + ".png";
            if (!U.BitmapSave(retImage, Path.Combine(basedir, framefilename)))
            {
                return("");
            }
            retImage.Dispose();

            return(framefilename);
        }
Exemplo n.º 8
0
        void Export(string filename)
        {
            string basename = Path.GetFileNameWithoutExtension(filename) + "_";
            string basedir  = Path.GetDirectoryName(filename);

            List <string> lines = new List <string>();

            if (this.TSAList.Count >= 2 && this.PaletteList.Count == 1)
            {
                lines.Add("//" + R._("共通パレットを利用する必要があります。最初の画像のパレットのみが利用され、以後は共通パレットが利用されているものとして処理されます。"));
            }
            if (!U.isSafetyOffset(this.FramePointer))
            {
                if (this.TSAList.Count == 1 && this.PaletteList.Count >= 2)
                {
                    lines.Add("//" + R._("パレットアニメーションである必要があります。最初の画像のみ利用され、以後の画像はパレットだけ利用されます。"));
                }
                lines.Add("//" + R._("このアニメーションは、フレーム数が固定されています。最大フレーム数が、{0}({1})である必要があります", U.To0xHexString(this.FramePointer), this.FramePointer));

                for (int i = 0; i < this.FramePointer; i++)
                {
                    Bitmap bitmap;
                    string imagefilename = basename.Replace(" ", "_") + "g" + i.ToString("000") + ".png";
                    bitmap = DrawDirectLow(i);
                    if (bitmap == null)
                    {//デコードできなかった.
                        bitmap = ImageUtil.Blank(30 * 8, 16 * 8);
                    }

                    //利用していないパレットを消す.
                    ImageUtil.BlackOutUnnecessaryColors(bitmap, 1);

                    U.BitmapSave(bitmap, Path.Combine(basedir, imagefilename));
                    string line = "1" + " " + imagefilename;
                    lines.Add(line);
                }
            }
            else
            {
                //同じアニメを何度も出力しないように記録する.
                Dictionary <uint, Bitmap> animeHash = new Dictionary <uint, Bitmap>();

                uint addr = Program.ROM.p32(FramePointer);

                //圧縮されていないデータなので、事故防止のため リミッターをかける.
                uint limitter = addr + 1024 * 1024; //1MBサーチしたらもうあきらめる.
                limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length);

                uint id   = 0;
                uint wait = 0;
                uint i;
                for (i = 0; addr < limitter; i++, addr += 4)
                {
                    id   = Program.ROM.u16(addr);
                    wait = Program.ROM.u16(addr + 2);

                    if (id == 0xFFFF)
                    {
                        break;
                    }

                    Bitmap bitmap;
                    string imagefilename = basename.Replace(" ", "_") + "g" + id.ToString("000") + ".png";
                    if (animeHash.ContainsKey(id))
                    {
                        bitmap = animeHash[id];
                    }
                    else
                    {
                        bitmap = DrawDirectLow((int)id);
                        if (bitmap == null)
                        {//デコードできなかった.
                            bitmap = ImageUtil.Blank(30 * 8, 16 * 8);
                        }

                        //利用していないパレットを消す.
                        ImageUtil.BlackOutUnnecessaryColors(bitmap, 1);

                        U.BitmapSave(bitmap, Path.Combine(basedir, imagefilename));

                        animeHash[id] = bitmap;
                    }

                    string line = wait.ToString() + " " + imagefilename;
                    lines.Add(line);
                }
            }
            U.WriteAllLinesInError(filename, lines);
        }
Exemplo n.º 9
0
        void ExportGif(string filename)
        {
            string basename = Path.GetFileNameWithoutExtension(filename) + "_";
            string basedir  = Path.GetDirectoryName(filename);

            List <ImageUtilAnimeGif.Frame> bitmaps = new List <ImageUtilAnimeGif.Frame>();

            if (!U.isSafetyOffset(this.FramePointer))
            {
                for (int i = 0; i < this.FramePointer; i++)
                {
                    Bitmap bitmap;
                    bitmap = DrawDirectLow(i);
                    if (bitmap == null)
                    {//デコードできなかった.
                        bitmap = ImageUtil.Blank(30 * 8, 16 * 8);
                    }

                    //利用していないパレットを消す.
                    ImageUtil.BlackOutUnnecessaryColors(bitmap, 1);

                    bitmaps.Add(new ImageUtilAnimeGif.Frame(bitmap, 1));
                }
            }
            else
            {
                //同じアニメを何度も出力しないように記録する.
                Dictionary <uint, Bitmap> animeHash = new Dictionary <uint, Bitmap>();

                uint addr = Program.ROM.p32(FramePointer);

                //圧縮されていないデータなので、事故防止のため リミッターをかける.
                uint limitter = addr + 1024 * 1024; //1MBサーチしたらもうあきらめる.
                limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length);

                uint id   = 0;
                uint wait = 0;
                uint i;
                for (i = 0; addr < limitter; i++, addr += 4)
                {
                    id   = Program.ROM.u16(addr);
                    wait = Program.ROM.u16(addr + 2);

                    if (id == 0xFFFF)
                    {
                        break;
                    }

                    Bitmap bitmap;
                    string imagefilename = basename.Replace(" ", "_") + "g" + id.ToString("000") + ".png";
                    if (animeHash.ContainsKey(id))
                    {
                        bitmap = animeHash[id];
                    }
                    else
                    {
                        bitmap = DrawDirectLow((int)id);
                        if (bitmap == null)
                        {//デコードできなかった.
                            bitmap = ImageUtil.Blank(30 * 8, 16 * 8);
                        }

                        //利用していないパレットを消す.
                        ImageUtil.BlackOutUnnecessaryColors(bitmap, 1);
                        animeHash[id] = bitmap;
                    }

                    bitmaps.Add(new ImageUtilAnimeGif.Frame(bitmap, wait));
                }
            }

            //アニメgif生成
            ImageUtilAnimeGif.SaveAnimatedGif(filename, bitmaps);
        }
Exemplo n.º 10
0
        StringBuilder ExportALL(InputFormRef.AutoPleaseWait pleaseWait, string basedir, bool isItemFont, bool isUserFontOnly, Dictionary <uint, string> codeBMap)
        {
            List <Address> list = new List <Address>();

            MakeAllDataLengthInner(isItemFont, ref list, codeBMap);
            PatchUtil.PRIORITY_CODE priorityCode = PatchUtil.SearchPriorityCode();
            Color         bgcolor = GetFontColor(isItemFont);
            StringBuilder sb      = new StringBuilder();

            foreach (Address a in list)
            {
                if (a.DataType != FEBuilderGBA.Address.DataTypeEnum.FONTCN)
                {
                    continue;
                }

                if (isUserFontOnly &&
                    a.Addr <= Program.ROM.RomInfo.font_default_end)
                {//規定のフォント
                    continue;
                }

                int    width;
                byte[] fontbyte = ReadFontDataZH(a.Addr, out width);
                if (width == 0)
                {
                    continue;
                }
                string ch = GetFontCharFromExportName(a.Info);
                if (ch == "")
                {
                    continue;
                }
                uint   hex  = U.ConvertMojiCharToUnitFast(ch, priorityCode);
                string type = (isItemFont ? "item" : "text");

                Bitmap bitmap;
                if (isItemFont)
                {
                    bitmap = ImageUtil.ByteToImage4ZH(width + 1, 0xD, fontbyte, 0, bgcolor);
                    bitmap = ConvertVanillaFontSizeBitmap(bitmap, 2);
                }
                else
                {
                    bitmap = ImageUtil.ByteToImage4ZH(width, 0xD, fontbyte, 0, bgcolor);
                    bitmap = ConvertVanillaFontSizeBitmap(bitmap, 1);
                }

                ImageUtil.BlackOutUnnecessaryColors(bitmap, 1);
                string name          = U.escape_filename(a.Info) + "_" + U.ToHexString(hex);
                string font_filename = Path.Combine(basedir, name + ".png");
                try
                {
                    U.BitmapSave(bitmap, font_filename);
                }
                catch (Exception)
                {//このOSではこの文字のファイル名は使えないので削ります
                    string trimName = U.substr(a.Info, 0, a.Info.Length - 2);
                    name          = trimName + "_" + U.ToHexString(hex);
                    font_filename = Path.Combine(basedir, name + ".png");
                    U.BitmapSave(bitmap, font_filename);
                }

                bitmap.Dispose();

                sb.Append(ch);
                sb.Append("\t");
                sb.Append(type);
                sb.Append("\t");
                sb.Append(width);
                sb.Append("\t");
                sb.AppendLine(Path.GetFileName(font_filename));
            }

            return(sb);
        }
        public static void Export(
            string filename      //書き込むファイル名
            , uint anime_address
            , string name)
        {
            string basename = Path.GetFileNameWithoutExtension(filename) + "_";
            string basedir  = Path.GetDirectoryName(filename);

            anime_address = U.toOffset(anime_address);
            if (!U.isSafetyOffset(anime_address))
            {
                return;
            }

            List <string> lines = new List <string>();

            if (name != "")
            {
                lines.Add("//NAME=" + name);
            }

            //同じアニメを何度も出力しないように記録する.
            Dictionary <uint, Bitmap> animeHash = new Dictionary <uint, Bitmap>();

            //圧縮されていないデータなので、事故防止のため リミッターをかける.
            uint limitter = anime_address + 1024 * 1024; //1MBサーチしたらもうあきらめる.

            limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length);
            uint id = 0; //IDの概念がないので、0から適当に振ります

            for (uint n = anime_address; n < limitter; n += 12)
            {
                uint wait      = Program.ROM.u8(n + 0);
                uint term1     = Program.ROM.u32(n);
                uint imgOffset = Program.ROM.p32(n + 4);
                uint palOffset = Program.ROM.p32(n + 8);
                if (term1 == 0 && imgOffset == 0)
                {
                    break;
                }

                uint hash = imgOffset + palOffset;

                string imagefilename;
                Bitmap bitmap;
                if (animeHash.ContainsKey(hash))
                {
                    bitmap        = animeHash[hash];
                    imagefilename = MakeFilename(basename, bitmap);
                }
                else
                {
                    string log;
                    bitmap     = DrawFrameImage(n, out log);
                    bitmap.Tag = id;
                    id++;

                    int paletteCount = ImageUtil.GetPalette16Count(bitmap);
                    if (paletteCount < 1)
                    {
                        paletteCount = 1;
                    }

                    //利用していないパレットを消す.
                    ImageUtil.BlackOutUnnecessaryColors(bitmap, paletteCount);

                    imagefilename = MakeFilename(basename, bitmap);
                    U.BitmapSave(bitmap, Path.Combine(basedir, imagefilename));

                    animeHash[hash] = bitmap;
                }
                string line = wait.ToString() + "\t" + imagefilename;

                uint sound = Program.ROM.u16(n + 2);
                if (sound != 0)
                {
                    line += "\t" + U.To0xHexString(sound);
                }
                lines.Add(line);
            }

            //まとめて書き込み
            File.WriteAllLines(filename, lines);
        }