private void compressScreen(byte[] data, int screen, out byte[] pix, out byte[] code) { int dOfs = screen * xlen; int eOfs = dOfs + xlen; int[] lens = new int[2]; lens[0] = 1; code = new byte[0]; pix = new byte[0]; while (dOfs < eOfs) { getLens(data, dOfs + lens[0], eOfs, ref lens[0], out lens[1]); int cps = code.Length; Array.Resize <byte>(ref code, code.Length + (lens[0] > 255?3:1) + (lens[1] > 255?3:1)); for (int i = 0; i < 2; i++) { if (lens[i] > 255 || lens[i] == 0) { code[cps++] = 0; UInt16 sz = (UInt16)lens[i]; BinaryHelper.write_LE(code, cps, sz); cps += 2; } else { code[cps++] = (byte)(lens[i] & 0xFF); } } int pps = pix.Length; Array.Resize <byte>(ref pix, pix.Length + lens[0]); Array.Copy(data, dOfs, pix, pps, lens[0]); dOfs += lens [0] + lens [1]; lens[0] = 0; } }
public void save(byte[] data, int ofs) { BinaryHelper.write_LE(data, ofs, id); data[ofs + 2] = unused; data[ofs + 3] = sizeEx; BinaryHelper.write_LE(data, ofs + 4, size); BinaryHelper.write_LE(data, ofs + 6, offset); }
public byte[] runVGA(byte[] data) { preparexbuf(data); byte al = data[0]; xr.Add(al); int c = 1; while (c < data.Length) { bool rep = data[c] == al; if (rep) { for (int i = 1; i < MIN_REP; i++) { if (c + i >= data.Length || data[c + i] != al) { rep = false; } } } if (rep) { int cnt = 0; while (c < data.Length && data[c] == al && cnt < 255) { c++; cnt++; } repeat((byte)cnt); } else { newbt(al, data[c]); al = data[c]; c++; } } repeat(0); xr.Add(0); while (bitcnt != 0) { addbit(false); } byte[] res = new byte[0x400 + 4 + bitbuf.Count + xr.Count]; Array.Copy(xbuf, 0, res, 0, 0x400); bitbuf.CopyTo(res, 0x404); int ofs = 0x404 + bitbuf.Count; xr.CopyTo(res, ofs); BinaryHelper.write_LE(res, 0x400, (uint)ofs); return(res); }
public void saveDisk() { if (!File.Exists(file + ".bak")) { File.Copy(file, file + ".bak", false); } for (int i = 0; i < 191; i++) { entries[i].save(diskData, 8 + 8 * i); } byte[] data = diskData; if (dskid == 0) { FileStream f = new FileStream(file, FileMode.Open); byte[] oldd = new byte[f.Length]; f.Read(oldd, 0, oldd.Length); f.Close(); int[] mods = new int[100]; int[] ofs = new int[100]; int cnt = 0; int b = 6; int cofs = 0; int nextofs = 0; while (oldd[b] != 0xFF) { mods[cnt] = oldd[b]; ofs[cnt] = (int)BinaryHelper.readU32_LE(oldd, b + 1); if (mods[cnt] == LANG_ID) { cofs = ofs[cnt]; } cnt++; b += 5; } int delta = 0; for (int i = 0; i < cnt; i++) { if (cofs < ofs[i] && cofs + data.Length > ofs[i]) { nextofs = ofs[i]; delta = cofs + data.Length - ofs[i]; } } if (delta != 0) { while (delta % 16 != 0) { delta++; } byte[] newd = new byte[oldd.Length + delta]; Array.Copy(oldd, newd, cofs); Array.Copy(oldd, nextofs, newd, nextofs + delta, oldd.Length - nextofs); for (int i = 0; i < cnt; i++) { if (ofs[i] > cofs) { ofs[i] += delta; BinaryHelper.write_LE(newd, 6 + i * 5 + 1, (uint)ofs[i]); } } oldd = newd; } Array.Copy(data, 0, oldd, cofs, data.Length); data = oldd; } FileStream fs = new FileStream(file, FileMode.Create); fs.Write(data, 0, data.Length); fs.Close(); }
public void import(XmlDocument xml) { XmlNode blkhld = null; if (xml.DocumentElement.Name == "lure-text") { blkhld = xml.DocumentElement; } else if (xml.DocumentElement.Name == "lure-texts") { blkhld = LureCommon.findNode(xml.DocumentElement, "file", "id", resnum.ToString()); } else { throw new Exception("Bad text xml"); } TextDecoder.get().readDecoder(true); XmlDocument prev = export(true); TextDecoder.get().readDecoder(false); uint bitbuf = 0; int bitpos = 0; List <byte> txtdata = new List <byte>(); List <UInt16> bs = new List <UInt16>(); List <byte> skp = new List <byte>(); int prevblk = 0; foreach (XmlNode nd in prev.DocumentElement.ChildNodes) { XmlNode blk = LureCommon.findNode(blkhld, "block", "id", nd.Attributes["id"].Value); int prevtxt = prevblk; foreach (XmlNode tnd in nd.ChildNodes) { //bool art = tnd.Attributes["art"].Value == "1"; XmlNode txt = LureCommon.findNode(blk, "text", "id", tnd.Attributes["id"].Value); string val = ""; if (txt.ChildNodes.Count > 0) { val = txt.ChildNodes[0].Value; } val = LureNames.get().processNames(LureConfig.get().convert(val)); addText(val, txtdata, ref bitbuf, ref bitpos, tnd.Attributes["art"].Value == "1"); if (bitpos % 2 == 1) { addbit(false, txtdata, ref bitbuf, ref bitpos); } // if (tnd != nd.LastChild) { int ofs = (txtdata.Count << 2) + bitpos / 2; int d = ofs - prevtxt; if (d > 0x7F) { while ((d & 7) != 0) { addbit(false, txtdata, ref bitbuf, ref bitpos); ofs = (txtdata.Count << 2) + bitpos / 2; d = ofs - prevtxt; } d = (d >> 3) | 0x80; } skp.Add((byte)d); prevtxt = ofs; } } if (nd != prev.DocumentElement.LastChild) { int offset = (txtdata.Count << 2) + bitpos / 2; bs.Add((UInt16)(offset - prevblk)); prevblk = offset; } } while (bitpos != 0) { addbit(false, txtdata, ref bitbuf, ref bitpos); } data = new byte[4 + bs.Count * 2 + skp.Count + txtdata.Count]; int o = 4; for (int i = 0; i < bs.Count; i++) { BinaryHelper.write_LE(data, o, bs[i]); o += 2; } BinaryHelper.write_LE(data, 0, (UInt16)o); for (int i = 0; i < skp.Count; i++) { data[o++] = skp[i]; } BinaryHelper.write_LE(data, 2, (UInt16)o); for (int i = 0; i < txtdata.Count; i++) { data[o++] = txtdata[i]; } LureDisks.setResource(resnum, data); }