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); }
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); }
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); }
//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); }
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); }
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); }
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); }
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; }
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(); }
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); }
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; }
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); } }
//顔画像シートを作成する. 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); }
//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); }
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); }
//フォントの描画 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); }
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); }