Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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);
        }