public VgaSpriteBlock(DaxFileBlock block) { setBlockId(block.Id); var data = block.Data; var origData = data; int height = data[0]; int width = data[2]; var widthPx = width * 8; var heightPx = height; int frames = data[8]; int clrBase = data[9]; int clrCount = data[10]; var picSize = widthPx * heightPx; var isSpriteFile = false; var clrs = EgaVgaPalette.ExtractPalette(origData, clrCount, clrBase, 11); var dataStart = (clrCount * 3) + 132 + (3 * frames); if (block.FileNameUpperCase.StartsWith("SPRIT")) { clrs[0] = Color.FromArgb(0); clrs[13] = Color.FromArgb(0, 0, 0); isSpriteFile = true; if (clrBase == 176 && clrCount == 80) { dataStart = 306; } } data = UnpackSpriteData(data, dataStart); var frameCount = data.Length / picSize; int mframe = origData[(clrCount * 3) + 132 - 5]; if (isSpriteFile) { mframe = frameCount - 1; } for (var frame = 0; frame < frameCount; frame++) { var bitmap = new Bitmap(widthPx, heightPx, System.Drawing.Imaging.PixelFormat.Format16bppArgb1555); for (var y = 0; y < heightPx; y++) { for (var x = 0; x < widthPx; x += 1) { var b1 = data[(y * widthPx) + x + (picSize * frame)]; var b3 = data[(y * widthPx) + x + (picSize * mframe)]; bitmap.SetPixel(x, y, frame != mframe ? clrs[b1 ^ b3] : clrs[b1]); } } Bitmaps.Add(bitmap); } }
public VgaBlock(DaxFileBlock block) { setBlockId(block.Id); var data = block.Data; int height = data[0]; int width = data[1]; const int xPos = 0; const int yPos = 0; var widthPx = width * 8; var heightPx = height; const int xPosPx = xPos * 8; const int yPosPx = yPos * 8; int clrBase = data[8]; int clrCount = data[9] + 1; var paletteEnd = 10 + (clrCount * 3); var chunkSize = (widthPx * heightPx); var chunkCount = ArrayToUshort(data, 6); var dataStart = data.Length - (chunkCount * chunkSize); for (var chunk = 0; chunk < chunkCount; chunk++, dataStart += chunkSize) { var clrs = EgaVgaPalette.ExtractPalette(data, clrCount, clrBase, 10); if (clrs == null) { return; } var bitmap = new Bitmap((widthPx + xPosPx), (heightPx + yPosPx), PixelFormat.Format16bppArgb1555); for (var y = 0; y < heightPx; y++) { for (var x = 0; x < widthPx; x += 1) { var b = data[dataStart + (y * widthPx) + x]; var pxX = (x + 0 + xPosPx); var pxY = (y + yPosPx); bitmap.SetPixel(pxX, pxY, clrs[b]); } } Bitmaps.Add(bitmap); } }
public VgaStrataBlock(DaxFileBlock block) { setBlockId(block.Id); var data = block.Data; int height = ArrayToUshort(data, 0); int width = ArrayToUshort(data, 2); int xPos = ArrayToUshort(data, 4); int yPos = ArrayToUshort(data, 6); int picCount = data[8]; var widthPx = width * 8; var heightPx = height; var pxlClrs = new int[heightPx, widthPx]; var xPosPx = xPos * 8; var yPosPx = yPos * 8; var tempPalette = new byte[59]; var dataOffset = GetDataOffset(tempPalette, 9, data); var dd = new int[48]; const int paletteBase = 0x20; for (var i = 0; i < 24; i++) { var b = tempPalette[paletteBase + i]; dd[0 + i] = (b & 0x0f) * 4; dd[24 + i] = (b & 0xf0) / 4; } var egaPalette = EgaVgaPalette.PaletteBase(); for (var i = 0; i < 14; i += 1) { var r = dd[(i * 3) + 6 + 0]; var g = dd[(i * 3) + 6 + 1]; var b = dd[(i * 3) + 6 + 2]; egaPalette[i + 18] = Color.FromArgb(r * 4, g * 4, b * 4); } for (int pic = 0; pic < picCount; pic++) { var inOffset = dataOffset; for (var y = 0; y < height; y++) { for (var x = 0; x < widthPx; x++) { var mask = 0x80 >> (x & 7); var inputByte = x / 8; byte pxClr = 0; if ((data[inOffset + inputByte] & mask) != 0) { pxClr = 1; } if ((data[inOffset + inputByte + width] & mask) != 0) { pxClr += 2; } if ((data[inOffset + inputByte + (width * 2)] & mask) != 0) { pxClr += 4; } if ((data[inOffset + inputByte + (width * 3)] & mask) != 0) { pxClr += 8; } if ((data[inOffset + inputByte + (width * 4)] & mask) != 0) { pxClr += 0x10; } pxlClrs[y, x] = pxClr; } inOffset += width * 5; } dataOffset = inOffset; var bitmap = new Bitmap(widthPx + xPosPx, heightPx + yPosPx, System.Drawing.Imaging.PixelFormat.Format16bppArgb1555); for (var y = 0; y < heightPx; y++) { for (var x = 0; x < widthPx; x += 1) { var pxX = x + xPosPx; var pxY = y + yPosPx; bitmap.SetPixel(pxX, pxY, egaPalette[pxlClrs[y, x]]); } } Bitmaps.Add(bitmap); } }
public bool IsSatisfiedBy(DaxFileBlock block) { var data = block.Data; var origData = data; if (data.Length < 20) { return(false); } if (data[1] != 0) { return(false); } int height = data[0]; int width = data[2]; var widthPx = width * 8; var heightPx = height; if (widthPx < 1 || heightPx < 1 || widthPx > 320 || heightPx > 200) { return(false); } int frames = data[8]; int clrBase = data[9]; int clrCount = data[10]; if (clrBase == 0) { return(false); } if (clrCount == 0) { return(false); } var dataStart = (clrCount * 3) + 132 + (3 * frames); if (block.FileNameUpperCase.StartsWith("SPRIT") && clrBase == 176 && clrCount == 80) { dataStart = 306; } data = UnpackSpriteData(data, dataStart); if (data.Length <= 0) { return(false); } var picSize = widthPx * heightPx; if (picSize <= 0) { return(false); } if (data.Length % picSize != 0) { return(false); } var frameCount = data.Length / picSize; if (picSize * frameCount > data.Length) { return(false); } var clrs = EgaVgaPalette.ExtractPalette(origData, clrCount, clrBase, 11); if (clrs == null) { return(false); } return(true); }