void MakeCHIPLIST()
        {
            Bitmap pathChiplist = ImageUtil.Blank(this.ChipCache.Width * 4 * 2, this.ChipCache.Height, this.ChipCache);

            for (int y = 0; y < this.ChipCache.Height; y++)
            {
                Bitmap flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, false, false);
                ImageUtil.BitBlt(pathChiplist, 0, y * 8, 8, 8, flip, 0, 0, 0);
                flip.Dispose();

                flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, true, false);
                ImageUtil.BitBlt(pathChiplist, 8 * 1, y * 8, 8, 8, flip, 0, 0);
                flip.Dispose();

                flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, false, true);
                ImageUtil.BitBlt(pathChiplist, 8 * 2, y * 8, 8, 8, flip, 0, 0);
                flip.Dispose();

                flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, true, true);
                ImageUtil.BitBlt(pathChiplist, 8 * 3, y * 8, 8, 8, flip, 0, 0);
                flip.Dispose();


                flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, false, false);
                ImageUtil.BitBlt(pathChiplist, 8 * 4, y * 8, 8, 8, flip, 0, 0, 1);
                flip.Dispose();

                flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, true, false);
                ImageUtil.BitBlt(pathChiplist, 8 * 5, y * 8, 8, 8, flip, 0, 0, 1);
                flip.Dispose();

                flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, false, true);
                ImageUtil.BitBlt(pathChiplist, 8 * 6, y * 8, 8, 8, flip, 0, 0, 1);
                flip.Dispose();

                flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, true, true);
                ImageUtil.BitBlt(pathChiplist, 8 * 7, y * 8, 8, 8, flip, 0, 0, 1);
                flip.Dispose();
            }

            CHIPLIST.Image = pathChiplist;
        }
        void MakeBattleScreen()
        {
            for (int y = 0; y < MAP_Y; y++)
            {
                for (int x = 0; x < MAP_X; x++)
                {
                    ushort m    = this.Map[y * MAP_X + x];
                    int    tile = (int)(m & 0xff);
                    int    flip = (int)((m >> 8) & 0x0f);
                    int    pal  = (int)((m >> (8 + 4)) & 0x0f);

                    Bitmap pathOne;
                    if (flip == 0)
                    {
                        pathOne = ImageUtil.Copy(this.ChipCache, 0, tile * 8, 8, 8, false, false);
                    }
                    else if (flip == 4)
                    {
                        pathOne = ImageUtil.Copy(this.ChipCache, 0, tile * 8, 8, 8, true, false);
                    }
                    else if (flip == 8)
                    {
                        pathOne = ImageUtil.Copy(this.ChipCache, 0, tile * 8, 8, 8, false, true);
                    }
                    else
                    {
                        pathOne = ImageUtil.Copy(this.ChipCache, 0, tile * 8, 8, 8, true, true);
                    }

                    ImageUtil.BitBlt(this.DrawBitmap
                                     , x * 8
                                     , y * 8
                                     , 8
                                     , 8
                                     , pathOne, 0, 0
                                     , pal);
                }
            }

            this.Battle.Image = DrawZoomMap(this.DrawBitmap);
        }
Exemplo n.º 3
0
        Bitmap DrawUnits2(int palette_type, uint icon_id)
        {
            Bitmap first  = ImageUnitWaitIconFrom.DrawWaitUnitIconBitmap((uint)(icon_id), palette_type, true);
            Bitmap bitmap = ImageUtil.Blank(16 * ICON_COUNT, 16, first);

            ImageUtil.BitBlt(bitmap, 0, 0, 16, 16, first, 0, 0);

            for (int i = 1; i < ICON_COUNT; i++)
            {
                Bitmap a = ImageUnitWaitIconFrom.DrawWaitUnitIconBitmap((uint)(i), palette_type, true);
                if (bitmap == null)
                {
                    bitmap = ImageUtil.Blank(16 * ICON_COUNT, 16, a);
                }
                if (ImageUtil.IsBlankBitmap(a))
                {
                    a = ImageUnitWaitIconFrom.DrawWaitUnitIconBitmap((uint)(i) * 2, palette_type, true);
                }
                ImageUtil.BitBlt(bitmap, i * 16, 0, 16, 16, a, 0, 0);
            }
            return(bitmap);
        }
Exemplo n.º 4
0
        private void ChangeComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            uint mapid = (uint)MapSelector.SelectedIndex;

            if (IsWorldmap(mapid))
            {//ワールドマップ
                this.MapBitMap = WorldMapImageForm.DrawWorldMap();
                this.Map.Image = MapBitMap;
            }
            else
            {
                this.MapBitMap = MapSettingForm.DrawMap(mapid, this.MapAnime);
                int change = ChangeComboBox.SelectedIndex;
                if (change >= 1)
                {
                    change = change - 1;
                    List <MapChangeForm.ChangeSt> mapchange = MapChangeForm.MakeChangeList(mapid);
                    if (change < mapchange.Count)
                    {
                        Bitmap c = MapSettingForm.DrawMapChange((uint)mapid
                                                                , (int)mapchange[change].width
                                                                , (int)mapchange[change].height
                                                                , mapchange[change].addr
                                                                , this.MapAnime);
                        ImageUtil.BitBlt(this.MapBitMap
                                         , (int)(mapchange[change].x * 16)
                                         , (int)(mapchange[change].y * 16)
                                         , c.Width
                                         , c.Height
                                         , c, 0, 0);
                        c.Dispose();
                    }
                }

                this.Map.Image = MapBitMap;
            }

            ZoomComboBox_SelectedIndexChanged(null, null);
        }
Exemplo n.º 5
0
        //FE7のワールドマップを描画する
        //詳細は、呼び出し元のメソッドを見てね.
        public static Bitmap DrawWorldMapFE7(uint imagemap, uint palette, uint tsamap)
        {
            Bitmap map = ImageUtil.Blank(1024, 688);

            map.Palette = ImageUtil.ByteToPalette(map.Palette, Program.ROM.Data, (int)palette);

            for (int y = 0; y < 2; y++)
            {
                for (int x = 0; x < 4; x++)
                {
                    uint image = Program.ROM.p32(imagemap);
                    uint tsa   = Program.ROM.p32(tsamap);

                    Bitmap piece = ImageUtil.ByteToImage16TileHeaderTSA(256, 256, Program.ROM.Data, (int)image, Program.ROM.Data, (int)palette, Program.ROM.Data, (int)tsa);
                    ImageUtil.BitBlt(map, x * 256, y * 256, 256, 256, piece, 0, 0);

                    imagemap += 4;
                    tsamap   += 4;
                }
            }
            //最後のラインだけheightが違う.
            {
                int y = 2;
                for (int x = 0; x < 4; x++)
                {
                    uint image = Program.ROM.p32(imagemap);
                    uint tsa   = Program.ROM.p32(tsamap);

                    Bitmap piece = ImageUtil.ByteToImage16TileHeaderTSA(256, 256, Program.ROM.Data, (int)image, Program.ROM.Data, (int)palette, Program.ROM.Data, (int)tsa);
                    ImageUtil.BitBlt(map, x * 256, y * 256, 256, 176, piece, 0, 0);

                    imagemap += 4;
                    tsamap   += 4;
                }
            }

            return(map);
        }
Exemplo n.º 6
0
        Bitmap GetChipImage()
        {
            int pal = this.PaletteIndexComboBox.SelectedIndex;

            if (pal < 0)
            {
                pal = 0;
            }

            uint palette;

            if (this.PalettePointer == U.NOT_FOUND)
            {
                palette = U.toOffset(this.PaletteAddress);
            }
            else
            {
                palette = Program.ROM.p32(this.PalettePointer);
            }
            palette = palette + (uint)(pal * 0x20);

            int  total_height = 0;
            uint image        = Program.ROM.p32(this.ZImgPointer);

            byte[] imageUZ = LZ77.decompress(Program.ROM.Data, image);
            int    width   = 8;
            int    height  = ImageUtil.CalcHeight(width, imageUZ.Length);
            Bitmap src     = ImageUtil.ByteToImage16Tile(width, height, imageUZ, 0, Program.ROM.Data, (int)palette);

            Bitmap bitmap = ImageUtil.Blank(8, height, Program.ROM.Data, (int)palette);

            ImageUtil.BitBlt(bitmap, 0, total_height, 8, height, src, 0, 0);
            total_height += height;

            src.Dispose();

            return(bitmap);
        }
Exemplo n.º 7
0
        public Bitmap DrawFrame(Bitmap ret, int index, int originX, int originY, Bitmap parts)
        {
            if (index >= FrameArray.Count)
            {
                return(ret);
            }

            int graphicsWidth = parts.Width / 8;

            FrameArr fa = FrameArray[index];

            for (int i = 0; i < fa.Frames.Count; i++)
            {
                Frame    f = fa.Frames[i];
                OAMParse t = FrameToDump(f);

                int src   = (int)(t.tile);
                int src_x = (src % graphicsWidth) * 8;
                int src_y = (src / graphicsWidth) * 8;

                ImageUtil.BitBlt(ret
                                 , originX + t.image_x, originY + t.image_y
                                 , t.width * 8
                                 , t.height * 8
                                 , parts
                                 , src_x, src_y
                                 , t.paletteShift
                                 , 0
                                 , t.v_flipped
                                 , t.h_flipped
                                 );
//                Log.Debug("_" + index + "_" + i + "  " + t.image_x + "," + t.image_y + "@" + t.width * 8 + "," + t.height * 8);

//                ret.Save("_" + index + "_" + i + ".png");
            }
            return(ret);
        }
Exemplo n.º 8
0
        public static Bitmap DrawMapStyle(
            uint obj_plist         //image
            , uint palette_plist   //palette
            , uint config_plist    //tsa
            )
        {
            //マップチップの読込
            Bitmap MapObjImage = ImageUtilMap.DrawMapChipOnly(obj_plist, palette_plist);

            if (MapObjImage == null)
            {
                MapObjImage = ImageUtil.BlankDummy();
            }
            //チップセットの読込(マップチップの画像をどう解釈するか定義するデータ)
            byte[] configUZ = ImageUtilMap.UnLZ77ChipsetData(config_plist);
            if (configUZ == null)
            {
                configUZ = new byte[0];
            }

            Bitmap mapObjCels = ImageUtil.Blank(16 * 32, ImageUtilMap.CHIPSET_SEP_BYTE / 16, MapObjImage);
            int    chip       = 0;
            int    y          = 0;

            while (chip < ImageUtilMap.CHIPSET_SEP_BYTE / 8)
            {
                for (int x = 0; x < 32; x++)
                {
                    ImageUtil.BitBlt(mapObjCels, x * 16, y * 16, 16, 16, ImageUtilMap.DrawOneChipset(chip << 2, configUZ, MapObjImage), 0, 0);

                    chip++;
                }
                y++;
            }
            return(mapObjCels);
        }
Exemplo n.º 9
0
        void MakeCHIPLIST()
        {
            this.ChipDisplayCache = ImageUtil.Blank(this.ChipCache.Width * 4, this.ChipCache.Height, this.ChipCache);
            for (int y = 0; y < this.ChipCache.Height; y++)
            {
                Bitmap flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8);
                ImageUtil.BitBlt(this.ChipDisplayCache, 0, y * 8, 8, 8, flip, 0, 0, 0);
                flip.Dispose();

                flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, true);
                ImageUtil.BitBlt(this.ChipDisplayCache, 8 * 1, y * 8, 8, 8, flip, 0, 0);
                flip.Dispose();

                flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, false, true);
                ImageUtil.BitBlt(this.ChipDisplayCache, 8 * 2, y * 8, 8, 8, flip, 0, 0);
                flip.Dispose();

                flip = ImageUtil.Copy(this.ChipCache, 0, y * 8, 8, 8, true, true);
                ImageUtil.BitBlt(this.ChipDisplayCache, 8 * 3, y * 8, 8, 8, flip, 0, 0);
                flip.Dispose();
            }

            CHIPLIST.Image = this.ChipDisplayCache;
        }
Exemplo n.º 10
0
        void DrawSample(uint battleAnimeID //戦闘アニメID
                        , uint paletteno   //利用するユニットパレット (カスタムカラー)
                        , int paletteIndex //敵味方色
                        )
        {
            Bitmap[] animeframe = new Bitmap[12];

            uint showsecstion = 0;
            uint showframe    = 0;

            for (int index = 0; index < animeframe.Length; index++, showframe += 2)
            {
                animeframe[index] = ImageBattleAnimeForm.DrawBattleAnime(battleAnimeID
                                                                         , ImageBattleAnimeForm.ScaleTrim.SCALE_90
                                                                         , paletteno, showsecstion, showframe, paletteIndex);
                if (!ImageUtil.IsBlankBitmap(animeframe[index], 10))
                {
                    continue;
                }
                //何も描画されなければフレームをもうちょっと進めてみる.
                showframe        += 2;
                animeframe[index] = ImageBattleAnimeForm.DrawBattleAnime(battleAnimeID
                                                                         , ImageBattleAnimeForm.ScaleTrim.SCALE_90
                                                                         , paletteno, showsecstion, showframe, paletteIndex);
                if (!ImageUtil.IsBlankBitmap(animeframe[index], 10))
                {
                    continue;
                }
                //それでもだめならセクションを切り替える.
                showsecstion     += 1;
                showframe         = 0;
                animeframe[index] = ImageBattleAnimeForm.DrawBattleAnime(battleAnimeID
                                                                         , ImageBattleAnimeForm.ScaleTrim.SCALE_90
                                                                         , paletteno, showsecstion, showframe, paletteIndex);
                if (!ImageUtil.IsBlankBitmap(animeframe[index], 10))
                {
                    continue;
                }
                //さらにダメならもう一つセクションを進める. それでもだめならあきらめる.
                showsecstion     += 1;
                showframe         = 0;
                animeframe[index] = ImageBattleAnimeForm.DrawBattleAnime(battleAnimeID
                                                                         , ImageBattleAnimeForm.ScaleTrim.SCALE_90
                                                                         , paletteno, showsecstion, showframe, paletteIndex);
            }

            this.DrawBitmap = ImageUtil.Blank(360, 290, animeframe[0]);
            int x = 0;
            int y = 0;

            for (int index = 0; index < animeframe.Length; index++)
            {
                ImageUtil.BitBlt(this.DrawBitmap, x, y, animeframe[index].Width, animeframe[index].Height, animeframe[index], 0, 0);
                x += animeframe[index].Width;
                if (x >= this.DrawBitmap.Width)
                {
                    x  = 0;
                    y += animeframe[index].Height;
                }
            }

            ReDrawBitmap();
        }
Exemplo n.º 11
0
        void GenPreviewMainChar()
        {
            Bitmap face = ImageUtil.Blank(96, 80, this.PreviewBitmap16);

            int eyex   = (int)this.EyeBlockX.Value * 8;
            int eyey   = (int)this.EyeBlockY.Value * 8;
            int mouthx = (int)this.MouthBlockX.Value * 8;
            int mouthy = (int)this.MouthBlockY.Value * 8;

            ImageUtil.BitBlt(face, 0, 0, 96, 80, this.PreviewBitmap16, 0, 0);
            int f = (int)X_Frame.Value;

            if (f == 10)
            {
                ImageUtil.BitBlt(face, eyex, eyey, 32, 16, this.PreviewBitmap16, 96, 48, 0, 0);
                ImageUtil.BitBlt(face, mouthx, mouthy, 32, 16, this.PreviewBitmap16, 0, 80, 0, 0);
                X_STATUS.Text = R._("位置確認用");
            }
            else if (f == 1)
            {//半目
                ImageUtil.BitBlt(face, eyex, eyey, 32, 16, this.PreviewBitmap16, 96, 48, 0, 0);
                X_STATUS.Text = R._("半目");
            }
            else if (f == 2)
            {//閉じ目
                ImageUtil.BitBlt(face, eyex, eyey, 32, 16, this.PreviewBitmap16, 96, 48 + 16, 0, 0);
                X_STATUS.Text = R._("とじ目");
            }
            else if (f == 3)
            {//口1
                ImageUtil.BitBlt(face, mouthx, mouthy, 32, 16, this.PreviewBitmap16, 0, 80, 0, 0);
                X_STATUS.Text = R._("口1");
            }
            else if (f == 4)
            {//口2
                ImageUtil.BitBlt(face, mouthx, mouthy, 32, 16, this.PreviewBitmap16, 32, 80, 0, 0);
                X_STATUS.Text = R._("口2");
            }
            else if (f == 5)
            {//口3
                ImageUtil.BitBlt(face, mouthx, mouthy, 32, 16, this.PreviewBitmap16, 32 + 32, 80, 0, 0);
                X_STATUS.Text = R._("口3");
            }
            else if (f == 6)
            {//口4
                ImageUtil.BitBlt(face, mouthx, mouthy, 32, 16, this.PreviewBitmap16, 32 + 32 + 32, 80, 0, 0);
                X_STATUS.Text = R._("ステータス画面 口4");
            }
            else if (f == 7)
            {//口5
                ImageUtil.BitBlt(face, mouthx, mouthy, 32, 16, this.PreviewBitmap16, 0, 80 + 16, 0, 0);
                X_STATUS.Text = R._("口5");
            }
            else if (f == 8)
            {//口6
                ImageUtil.BitBlt(face, mouthx, mouthy, 32, 16, this.PreviewBitmap16, 32, 80 + 16, 0, 0);
                X_STATUS.Text = R._("口6");
            }
            else if (f == 9)
            {//口7
                ImageUtil.BitBlt(face, mouthx, mouthy, 32, 16, this.PreviewBitmap16, 32 + 32, 80 + 16, 0, 0);
                X_STATUS.Text = R._("口7");
            }
            else
            {
                X_STATUS.Text = R._("通常時");
            }

            this.X_PreviewMainChar.Image = face;
        }
        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.º 13
0
        void ImportObjOnePicture(Bitmap loadbitmap)
        {
            const int palette_count = MAX_MAP_PALETTE_COUNT;

            int bitmap_palette_count = ImageUtil.GetPalette16Count(loadbitmap);

            if (bitmap_palette_count > palette_count)
            {
                R.ShowStopError("パレット数が正しくありません。\r\n{1}種類以下(16色*{1}種類) でなければなりません。\r\n\r\n選択された画像のパレット種類:{0}種類", bitmap_palette_count, palette_count);
                return;
            }

            if (loadbitmap.Width > 512 || loadbitmap.Height > 512 || loadbitmap.Width % 8 != 0)
            {
                R.ShowStopError("画像サイズが正しくありません。\r\nWidth:{2}以下 Height:{3}以下、でなければなりません。\r\nまた、幅は8で割り切れる必要があります。\r\n\r\n選択された画像のサイズ Width:{0} Height:{1}", loadbitmap.Width, loadbitmap.Height, 512, 512);
                return;
            }
            //マップチップ用に512x512のキャンバスに再描画
            Bitmap bitmap = ImageUtil.Blank(512, 512, loadbitmap);

            ImageUtil.BitBlt(bitmap, 0, 0, loadbitmap.Width, loadbitmap.Height, loadbitmap, 0, 0);

            byte[] image;
            byte[] tsa;
            string error = ImageUtil.ImageToBytePackedTSA(bitmap, 512, 512, 0, out image, out tsa);

            if (error != "")
            {
                R.ShowStopError(error);
                return;
            }

            if (image.Length > 0x8000)
            {
                R.ShowStopError("マップが広すぎて、0x8000バイトに収まりませんでした。\r\n入力されたサイズ:  {0}\r\n\r\nもっと小さいマップにするか、圧縮率を上げるために共通のパーツを増やしてください。", U.To0xHexString(image.Length));
                return;
            }

            //写像した画像を再描画
            byte[] palette_bin = ImageUtil.ImageToPalette(bitmap, 16);
            bitmap = ImageUtil.ByteToImage16Tile(256, 256, image, 0, palette_bin, 0);

            byte[] map_config = ImageUtilMap.ConvertTSAToMapConfig(tsa);

            //画像等データの書き込み
            Undo.UndoData undodata = Program.Undo.NewUndoData(this);

            bool r = WriteMapChipImage(image, undodata);

            if (!r)
            {
                return;
            }

            r = WriteMapChipPalette(bitmap, true, palette_count, undodata);
            if (!r)
            {
                return;
            }

            r = OverraideMapConfig(map_config, undodata);
            if (!r)
            {
                return;
            }

            Program.Undo.Push(undodata);
            MapStyle_SelectedIndexChanged(null, null);
            return;
        }
Exemplo n.º 14
0
        public static Bitmap DrawBattleAnime(uint id, ScaleTrim trim = ScaleTrim.SCALE_90, uint custompalette = 0, uint showSectionData = 0, uint showFrameData = 0, int showPaletteIndex = 0)
        {
            if (id <= 0)
            {
                return(ImageUtil.BlankDummy());
            }
            id = id - 1; //anime IDは 1 からスタート.

            InputFormRef InputFormRef = N_Init(null);
            uint         addr         = InputFormRef.IDToAddr(id);

            if (!U.isSafetyOffset(addr))
            {
                return(ImageUtil.BlankDummy());
            }

            uint sectionData    = Program.ROM.u32(addr + 12);
            uint frameData      = Program.ROM.u32(addr + 16);
            uint rightToLeftOAM = Program.ROM.u32(addr + 20);
            uint palettes       = Program.ROM.u32(addr + 28);

            if (custompalette > 0)
            {
                uint p = ImageUnitPaletteForm.GetPaletteAddr(custompalette);
                if (U.isSafetyOffset(addr))
                {
                    palettes = p;
                }
            }

            Bitmap bitmap = ImageUtilOAM.DrawBattleAnime(showSectionData, showFrameData
                                                         , sectionData, frameData, rightToLeftOAM, palettes);

            if (showPaletteIndex > 0)
            {
                bitmap = ImageUtil.SwapPalette(bitmap, showPaletteIndex);
            }


            if (trim == ScaleTrim.SCALE_48)
            {
                Bitmap trimBitmap = ImageUtil.Blank(48, 48, bitmap);
                ImageUtil.BitBlt(trimBitmap, 0, 0, trimBitmap.Width, trimBitmap.Height, bitmap
                                 , 125, 58);
                bitmap.Dispose();
                return(trimBitmap);
            }
            else if (trim == ScaleTrim.SCALE_90)
            {
                Bitmap trimBitmap = ImageUtil.Blank(90, 90, bitmap);
                ImageUtil.BitBlt(trimBitmap, 0, 0, trimBitmap.Width, trimBitmap.Height, bitmap
                                 , 100, 30);
                bitmap.Dispose();
                return(trimBitmap);
            }
            else if (trim == ScaleTrim.NO_BUT_FLIP)
            {
                Bitmap flipBitmap = ImageUtil.Copy(bitmap, 0, 0, bitmap.Width - 8, bitmap.Height, true);
                bitmap.Dispose();
                return(flipBitmap);
            }
            else
            {
                return(bitmap);
            }
        }
Exemplo n.º 15
0
        //顔画像シートを作成する.
        public static Bitmap DrawPortraitSeetFE6(uint id)
        {
            InputFormRef InputFormRef = Init(null);

            //現在のIDに対応するデータ
            uint addr = InputFormRef.IDToAddr(id);

            if (!U.isSafetyOffset(addr))
            {
                return(ImageUtil.BlankDummy());
            }

            uint unit_face = Program.ROM.u32(addr);
            uint map_face  = Program.ROM.u32(addr + 4);
            uint palette   = Program.ROM.u32(addr + 8);

            if (unit_face == 0)
            {
                return(ImagePortraitForm.DrawPortraitClass(unit_face, palette));
            }



            unit_face = U.toOffset(unit_face);
            palette   = U.toOffset(palette);

            if (unit_face == 0 ||
                !U.isSafetyOffset(unit_face) ||
                !U.isSafetyOffset(palette)
                )
            {
                //ない.
                return(ImageUtil.Blank(seet_width, seet_height));
            }
            //FE6の顔画像は圧縮されている.
            byte[] imageUZ = LZ77.decompress(Program.ROM.Data, unit_face);
            if (imageUZ.Length <= 0)
            {//ない
                return(ImageUtil.Blank(seet_width, seet_height));
            }


            Bitmap allface = ImageUtil.ByteToImage16Tile(32 * 8, 5 * 8
                                                         , imageUZ, (int)0
                                                         , Program.ROM.Data, (int)palette
                                                         );

            //シートを作る
            Bitmap seet = ImageUtil.Blank(seet_width, seet_height, allface);

            //メインの顔を転写
            ImageUtil.BitBlt(seet, parts_width / 2, 0
                             , parts_width * 2, parts_height * 2
                             , allface, 0, 0);//顔上
            ImageUtil.BitBlt(seet, parts_width / 2, parts_height * 2
                             , parts_width * 2, parts_height * 2
                             , allface, parts_width * 2, 0);//顔下
            ImageUtil.BitBlt(seet, parts_width / 2, parts_height * 4
                             , parts_width, parts_height
                             , allface, parts_width * 4, 0);//右肩
            ImageUtil.BitBlt(seet, 0, parts_height * 3
                             , parts_width / 2, parts_height * 2
                             , allface, parts_width * 5, 0);//右端
            ImageUtil.BitBlt(seet, parts_width + parts_width / 2, parts_height * 4
                             , parts_width, parts_height
                             , allface, parts_width * 4, parts_height);//左肩
            ImageUtil.BitBlt(seet, parts_width * 2 + parts_width / 2, parts_height * 3
                             , parts_width / 2, parts_height * 2
                             , allface, parts_width * 5 + parts_width / 2, 0);//左端

            //マップ顔を描画
            map_face = U.toOffset(map_face);
            Bitmap mapface_bitmap = ImageUtil.ByteToImage16Tile(mapface_width, mapface_height
                                                                , Program.ROM.Data, (int)map_face
                                                                , Program.ROM.Data, (int)palette
                                                                , 0
                                                                );

            //シートにマップ顔を転写
            ImageUtil.BitBlt(seet, face_width, parts_height, mapface_width, mapface_height, mapface_bitmap, 0, 0);

            //口 いい具合に2*2と固まっているのでまとめてもっていく
            ImageUtil.BitBlt(seet, parts_width * 0, face_height, parts_width * 2, parts_height * 2, allface, (32 * 8) - (parts_width * 2), parts_height * 0);

            //右端の口
            ImageUtil.BitBlt(seet, parts_width * 3, face_height, parts_width, parts_height / 2, allface, 0, 4 * 8);
            //余白
            ImageUtil.BitBlt(seet, parts_width * 3, face_height + (parts_height / 2), parts_width, parts_height / 2, allface, 4 * 8, 4 * 8);

            return(seet);
        }
Exemplo n.º 16
0
        //FE6用
        public static Bitmap DrawPortraitUnitFE6(
            uint unit_face
            , uint palette
            , uint mouth_x
            , uint mouth_y
            , int showFrame
            )
        {
            int width  = 12 * 8;
            int height = 10 * 8;

            unit_face = U.toOffset(unit_face);
            palette   = U.toOffset(palette);

            if (unit_face == 0 ||
                !U.isSafetyOffset(unit_face) ||
                !U.isSafetyOffset(palette)
                )
            {
                //ない.
                return(ImageUtil.Blank(width, height));
            }
            //FE6の顔画像は圧縮されている.
            byte[] imageUZ = LZ77.decompress(Program.ROM.Data, unit_face);
            if (imageUZ.Length <= 0)
            {//ない
                return(ImageUtil.Blank(width, height));
            }

            Bitmap allface = ImageUtil.ByteToImage16Tile(32 * 8, 5 * 8
                                                         , imageUZ, (int)0
                                                         , Program.ROM.Data, (int)palette
                                                         );

            //シートを作る
            Bitmap face = ImageUtil.Blank(face_width, face_height, allface);

            //メインの顔を転写
            ImageUtil.BitBlt(face, parts_width / 2, 0
                             , parts_width * 2, parts_height * 2
                             , allface, 0, 0);//顔上
            ImageUtil.BitBlt(face, parts_width / 2, parts_height * 2
                             , parts_width * 2, parts_height * 2
                             , allface, parts_width * 2, 0);//顔下
            ImageUtil.BitBlt(face, parts_width / 2, parts_height * 4
                             , parts_width, parts_height
                             , allface, parts_width * 4, 0);//右肩
            ImageUtil.BitBlt(face, 0, parts_height * 3
                             , parts_width / 2, parts_height * 2
                             , allface, parts_width * 5, 0);//右端
            ImageUtil.BitBlt(face, parts_width + parts_width / 2, parts_height * 4
                             , parts_width, parts_height
                             , allface, parts_width * 4, parts_height);//左肩
            ImageUtil.BitBlt(face, parts_width * 2 + parts_width / 2, parts_height * 3
                             , parts_width / 2, parts_height * 2
                             , allface, parts_width * 5 + parts_width / 2, 0);//左端

            //表示フレーム指定
            switch (showFrame)
            {
            case 1:    //口ぱく1
                ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8, parts_width, parts_height
                                 , allface, 192, 0, 0, 0);
                break;

            case 2:    //口ぱく2
                ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8, parts_width, parts_height
                                 , allface, 224, 0, 0, 0);
                break;

            case 3:    //口ぱく3
                ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8, parts_width, parts_height
                                 , allface, 192, 16, 0, 0);
                break;

            case 4:    //口ぱく4
                ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8, parts_width, parts_height
                                 , allface, 224, 16, 0, 0);
                break;

            case 5:    //口ぱく5
                ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8, parts_width, parts_height / 2
                                 , allface, 0, 32, 0, 0);
                ImageUtil.BitBlt(face, (int)mouth_x * 8, (int)mouth_y * 8 + (parts_height / 2), parts_width, parts_height / 2
                                 , allface, 32, 32, 0, 0);
                break;

            default:
                break;
            }
            allface.Dispose();

            return(face);
        }
        static Bitmap DrawFrameImage(uint frame
                                     , byte[] frameData
                                     , uint objRightToLeftOAM
                                     , uint objBGRightToLeftOAM
                                     , bool bgExpands)
        {
            //0  frame16 byte1 x86
            //4  objImagePointer
            //8  OAMAbsoStart
            //12 OAMBGAbsoStart
            //16 bgImagePointer
            //20 objPalettePointer
            //24 bgPalettePointer
            //CSA_Creater 28 TSA

            uint objPalettePointer = U.u32(frameData, frame + 20);

            if (!U.isSafetyPointer(objPalettePointer))
            {
                return(ImageUtil.BlankDummy());
            }
            byte[] objPalette = Program.ROM.getBinaryData(U.toOffset(objPalettePointer), 0x20);

            uint bgPalettePointer = U.u32(frameData, frame + 24);

            if (!U.isSafetyPointer(bgPalettePointer))
            {
                return(ImageUtil.BlankDummy());
            }
            byte[] bgPalette = Program.ROM.getBinaryData(U.toOffset(bgPalettePointer), 0x20);


            Bitmap retImage = ImageUtil.Blank((ImageUtilOAM.SEAT_TILE_WIDTH - 2) * 8, ImageUtilOAM.SEAT_TILE_HEIGHT * 8 * 2, objPalette, 0);

            uint bgPointer = U.u32(frameData, frame + 16);

            if (!U.isSafetyPointer(bgPointer))
            {
                return(ImageUtil.BlankDummy());
            }
            byte[] bg_UZ = LZ77.decompress(Program.ROM.Data, U.toOffset(bgPointer));

            uint bgTSAPointer = U.u32(frameData, frame + 28);

            if (!U.isSafetyPointer(bgTSAPointer))
            {
                return(ImageUtil.BlankDummy());
            }
            byte[] bgTSA_UZ = LZ77.decompress(Program.ROM.Data, U.toOffset(bgTSAPointer));

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

            if (height < 160)
            {
                height = 160;
            }
            Bitmap bg = ImageUtil.ByteToImage16Tile(width, height, bg_UZ, 0, bgPalette, 0, bgTSA_UZ, 0);

            ImageUtil.AppendPalette(retImage, bg, 1);
            if (bgExpands)
            {
                Bitmap tempbg = ImageUtil.Blank(width, height, bg);
                ImageUtil.Scale(tempbg, 0, 0, width, 160 - 32, bg, 0, 0, width, 64);
                bg = tempbg;
            }
            ImageUtil.BitBlt(retImage, 0, 0, bg.Width, bg.Height, bg, 0, 0, 1);

            uint objImagePointer = U.u32(frameData, frame + 4);

            if (!U.isSafetyPointer(objImagePointer))
            {
                return(ImageUtil.BlankDummy());
            }
            byte[] obj_UZ = LZ77.decompress(Program.ROM.Data, U.toOffset(objImagePointer));
            if (obj_UZ.Length > 0)
            {
                width  = 256;
                height = ImageUtil.CalcHeight(width, obj_UZ.Length);
                if (height < 64)
                {
                    height = 64;
                }
                Bitmap obj = ImageUtil.ByteToImage16Tile(width, height, obj_UZ, 0, objPalette, 0);

                {
                    //利用するOAMデータの開始位置
                    //OAMは 12byte で 最初の1バイト目が 1になるまで続きます.
                    uint OAMBGAbsoStart      = U.u32(frameData, frame + 12);
                    ImageUtilOAM.DrawOAM oam = new ImageUtilOAM.DrawOAM();
                    oam.SetIsMagicOAM(true);
                    oam.Parse(Program.ROM.Data, objBGRightToLeftOAM + OAMBGAbsoStart);
                    Bitmap tempCanvas = ImageUtil.Blank((ImageUtilOAM.SEAT_TILE_WIDTH - 2) * 8, ImageUtilOAM.SEAT_TILE_HEIGHT * 8 * 2, objPalette, 0);
                    tempCanvas = oam.Draw(tempCanvas, obj);

                    ImageUtil.BitBlt(retImage, 0, 0, tempCanvas.Width, tempCanvas.Height, tempCanvas, 0, 0, 0, 0);
                    tempCanvas.Dispose();
                }
                {
                    //利用するOAMデータの開始位置
                    //OAMは 12byte で 最初の1バイト目が 1になるまで続きます.
                    uint OAMAbsoStart        = U.u32(frameData, frame + 8);
                    ImageUtilOAM.DrawOAM oam = new ImageUtilOAM.DrawOAM();
                    oam.SetIsMagicOAM(true);
                    oam.Parse(Program.ROM.Data, objRightToLeftOAM + OAMAbsoStart);
                    Bitmap tempCanvas = ImageUtil.Blank((ImageUtilOAM.SEAT_TILE_WIDTH - 2) * 8, ImageUtilOAM.SEAT_TILE_HEIGHT * 8 * 2, objPalette, 0);
                    tempCanvas = oam.Draw(tempCanvas, obj);

                    ImageUtil.BitBlt(retImage, 0, 0, tempCanvas.Width, tempCanvas.Height, tempCanvas, 0, 0, 0, 0);
                    tempCanvas.Dispose();
                }
            }
            return(retImage);
        }
Exemplo n.º 18
0
        Bitmap DecreaseColor16(Bitmap bitmap)
        {
            //16色に減色.
            DecreaseColor d        = new DecreaseColor();
            Bitmap        bitmap16 = d.Convert(bitmap, 1, 0, true, false);

            if (this.checkBoxFuchidori.Checked)
            {
                //縁取りすると綺麗に見える
                //黒色を探す
                int blackColorIndex = ImageUtil.FindBlackColorFromPalette(bitmap16, 1, 16);
                //メイン
                bitmap16 = ImageUtil.Fuchidori(bitmap16, (byte)blackColorIndex, new Rectangle(0, 0, 96, 80));
            }

            //パーツをきれいに見せるために再構成する.
            int face_eye_x_id = (int)this.EyeBlockX.Value;
            int face_eye_y_id = (int)this.EyeBlockY.Value;

            int seet_eye_x = (int)(this.EyeX.Value);
            int seet_eye_w = (int)(this.EyeW.Value);
            int seet_eye_y = (int)(this.EyeY.Value);
            int seet_eye_h = (int)(this.EyeH.Value);

            Bitmap tempBitmap;

            if (!this.IsFE6Image)
            {
                tempBitmap = ImageUtil.Copy(bitmap16, face_eye_x_id * 8, face_eye_y_id * 8, 32, 16);
                ImageUtil.BitBlt(tempBitmap, seet_eye_x, seet_eye_y, seet_eye_w, seet_eye_h, bitmap16, seet_eye_x + 96, seet_eye_y + 16 * 3);
                ImageUtil.BitBlt(bitmap16, 96, 16 * 3, 32, 16, tempBitmap, 0, 0);

                tempBitmap = ImageUtil.Copy(bitmap16, face_eye_x_id * 8, face_eye_y_id * 8, 32, 16);
                ImageUtil.BitBlt(tempBitmap, seet_eye_x, seet_eye_y, seet_eye_w, seet_eye_h, bitmap16, seet_eye_x + 96, seet_eye_y + 16 * 4);
                ImageUtil.BitBlt(bitmap16, 96, 16 * 4, 32, 16, tempBitmap, 0, 0);
            }

            int face_mouth_x_id = (int)this.MouthBlockX.Value;
            int face_mouth_y_id = (int)this.MouthBlockY.Value;

            int seet_mouth_x = (int)(this.MouthX.Value);
            int seet_mouth_w = (int)(this.MouthW.Value);
            int seet_mouth_y = (int)(this.MouthY.Value);
            int seet_mouth_h = (int)(this.MouthH.Value);

            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 8, face_mouth_y_id * 8, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 0, seet_mouth_y + 16 * 5);
            ImageUtil.BitBlt(bitmap16, 32 * 0, 16 * 5, 32, 16, tempBitmap, 0, 0);

            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 8, face_mouth_y_id * 8, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 1, seet_mouth_y + 16 * 5);
            ImageUtil.BitBlt(bitmap16, 32 * 1, 16 * 5, 32, 16, tempBitmap, 0, 0);

            if (!this.IsFE6Image)
            {
                tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 8, face_mouth_y_id * 8, 32, 16);
                ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 2, seet_mouth_y + 16 * 5);
                ImageUtil.BitBlt(bitmap16, 32 * 2, 16 * 5, 32, 16, tempBitmap, 0, 0);
            }

            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 8, face_mouth_y_id * 8, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 3, seet_mouth_y + 16 * 5);
            ImageUtil.BitBlt(bitmap16, 32 * 3, 16 * 5, 32, 16, tempBitmap, 0, 0);


            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 8, face_mouth_y_id * 8, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 0, seet_mouth_y + 16 * 6);
            ImageUtil.BitBlt(bitmap16, 32 * 0, 16 * 6, 32, 16, tempBitmap, 0, 0);

            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 8, face_mouth_y_id * 8, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 1, seet_mouth_y + 16 * 6);
            ImageUtil.BitBlt(bitmap16, 32 * 1, 16 * 6, 32, 16, tempBitmap, 0, 0);

            if (!this.IsFE6Image)
            {
                tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 8, face_mouth_y_id * 8, 32, 16);
                ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 2, seet_mouth_y + 16 * 6);
                ImageUtil.BitBlt(bitmap16, 32 * 2, 16 * 6, 32, 16, tempBitmap, 0, 0);
            }

            return(bitmap16);
        }
Exemplo n.º 19
0
        //フォントの描画
        void DrawFonts()
        {
            if (SearchChar.Text.Length <= 0)
            {
                return;
            }
            string target = this.SearchChar.Text;

            target = TextForm.ConvertFEditorToEscape(target);

            Bitmap fontSampleBitmap;

            uint  fontlist_pointer = GetFontPointer(this.FontType.SelectedIndex == 0);
            Color bgcolor          = GetFontColor(this.FontType.SelectedIndex == 0);

            fontSampleBitmap = ImageUtil.Blank(FontPictureBox.Width, FontPictureBox.Height);

            PatchUtil.PRIORITY_CODE priorityCode = PatchUtil.SearchPriorityCode();

            int drawwidth = 0;

            for (int i = 0; i < this.FontSample.Text.Length; i++)
            {
                uint search_char;
                if (this.FontSample.Text[i] == '@')
                {
                    search_char = U.ConvertMojiCharToUnitFast(target, priorityCode);
                }
                else
                {
                    search_char = U.ConvertMojiCharToUnitFast(this.FontSample.Text.Substring(i, 1), priorityCode);
                }
                uint fontaddr = FindFontData(fontlist_pointer, search_char, priorityCode);
                if (fontaddr == U.NOT_FOUND)
                {
                    continue;
                }
                int    width;
                byte[] fontbyte;
                if (this.FontSample.Text[i] == '@')
                {
                    width    = (int)this.FontWidth.Value;
                    fontbyte = this.SelectFontBitmapByte;
                }
                else
                {
                    fontbyte = ReadFontData(fontaddr, out width);
                }

                if (width <= 0 || fontbyte == null)
                {
                    continue;
                }
                Bitmap bitmap = ImageUtil.ByteToImage4(16, 16, fontbyte, 0, bgcolor);

                fontSampleBitmap.Palette = bitmap.Palette;
                ImageUtil.BitBlt(fontSampleBitmap, drawwidth, 0, width, 16, bitmap, 0, 0);
                drawwidth += width;
            }
            FontPictureBox.Image = U.Zoom(fontSampleBitmap, ZoomComboBox.SelectedIndex);
        }
Exemplo n.º 20
0
        Bitmap DecreaseColor16(Bitmap bitmap, int tileWidth, int tileHeight)
        {
            //16色に減色.
            DecreaseColor d        = new DecreaseColor();
            Bitmap        bitmap16 = d.Convert(bitmap, 1, 0, true, false);

            //縁取りすると綺麗に見える
            //黒色を探す
            int blackColorIndex = ImageUtil.FindBlackColorFromPalette(bitmap16, 1, 16);

            //メイン
            bitmap16 = ImageUtil.Fuchidori(bitmap16, (byte)blackColorIndex, new Rectangle(0, 0, 96, 80));
            //パーツをきれいに見せるために再構成する.
            int face_eye_x_id = (((int)this.EyeX.Value - (int)this.ClipX.Value) / tileWidth);
            int face_eye_y_id = (((int)this.EyeY.Value - (int)this.ClipY.Value) / tileHeight);

            int seet_eye_x = (int)(32 * (this.EyeX.Value - (int)this.ClipX.Value - (face_eye_x_id * tileWidth))) / tileWidth;
            int seet_eye_w = (int)Math.Ceiling((32 * (this.EyeW.Value)) / tileWidth);
            int seet_eye_y = (int)(16 * (this.EyeY.Value - (int)this.ClipY.Value - (face_eye_y_id * tileHeight))) / tileHeight;
            int seet_eye_h = (int)Math.Ceiling((16 * (this.EyeH.Value)) / tileHeight);

            Bitmap tempBitmap;

            tempBitmap = ImageUtil.Copy(bitmap16, face_eye_x_id * 32, face_eye_y_id * 16, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_eye_x, seet_eye_y, seet_eye_w, seet_eye_h, bitmap16, seet_eye_x + 96, seet_eye_y + 16 * 3);
            ImageUtil.BitBlt(bitmap16, 96, 16 * 3, 32, 16, tempBitmap, 0, 0);

            tempBitmap = ImageUtil.Copy(bitmap16, face_eye_x_id * 32, face_eye_y_id * 16, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_eye_x, seet_eye_y, seet_eye_w, seet_eye_h, bitmap16, seet_eye_x + 96, seet_eye_y + 16 * 4);
            ImageUtil.BitBlt(bitmap16, 96, 16 * 4, 32, 16, tempBitmap, 0, 0);


            int face_mouth_x_id = (((int)this.MouthX.Value - (int)this.ClipX.Value) / tileWidth);
            int face_mouth_y_id = (((int)this.MouthY.Value - (int)this.ClipY.Value) / tileHeight);

            int seet_mouth_x = (int)(32 * (this.MouthX.Value - (int)this.ClipX.Value - (face_mouth_x_id * tileWidth))) / tileWidth;
            int seet_mouth_w = (int)Math.Ceiling((32 * (this.MouthW.Value)) / tileWidth);
            int seet_mouth_y = (int)(16 * (this.MouthY.Value - (int)this.ClipY.Value - (face_mouth_y_id * tileHeight))) / tileHeight;
            int seet_mouth_h = (int)Math.Ceiling((16 * (this.MouthH.Value)) / tileHeight);

            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 32, face_mouth_y_id * 16, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 0, seet_mouth_y + 16 * 5);
            ImageUtil.BitBlt(bitmap16, 32 * 0, 16 * 5, 32, 16, tempBitmap, 0, 0);

            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 32, face_mouth_y_id * 16, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 1, seet_mouth_y + 16 * 5);
            ImageUtil.BitBlt(bitmap16, 32 * 1, 16 * 5, 32, 16, tempBitmap, 0, 0);

            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 32, face_mouth_y_id * 16, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 2, seet_mouth_y + 16 * 5);
            ImageUtil.BitBlt(bitmap16, 32 * 2, 16 * 5, 32, 16, tempBitmap, 0, 0);

            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 32, face_mouth_y_id * 16, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 3, seet_mouth_y + 16 * 5);
            ImageUtil.BitBlt(bitmap16, 32 * 3, 16 * 5, 32, 16, tempBitmap, 0, 0);


            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 32, face_mouth_y_id * 16, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 0, seet_mouth_y + 16 * 6);
            ImageUtil.BitBlt(bitmap16, 32 * 0, 16 * 6, 32, 16, tempBitmap, 0, 0);

            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 32, face_mouth_y_id * 16, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 1, seet_mouth_y + 16 * 6);
            ImageUtil.BitBlt(bitmap16, 32 * 1, 16 * 6, 32, 16, tempBitmap, 0, 0);

            tempBitmap = ImageUtil.Copy(bitmap16, face_mouth_x_id * 32, face_mouth_y_id * 16, 32, 16);
            ImageUtil.BitBlt(tempBitmap, seet_mouth_x, seet_mouth_y, seet_mouth_w, seet_mouth_h, bitmap16, seet_mouth_x + 32 * 2, seet_mouth_y + 16 * 6);
            ImageUtil.BitBlt(bitmap16, 32 * 2, 16 * 6, 32, 16, tempBitmap, 0, 0);

            return(bitmap16);
        }