Exemple #1
0
        private Bitmap CreateBitmap(FruaTlbImage image, BinaryReader reader)
        {
            var pixelsToRead = image.Header.ImageHeight * image.Header.ImageWidth;
            var buffer       = new byte[pixelsToRead];

            buffer = reader.ReadBytes(pixelsToRead);
            buffer = DeinterlacePixels(buffer);
            return(CreateBitmapFromBuffer(image, buffer));
        }
Exemple #2
0
        private void CreateBitmap18(FruaTlbImage image, BinaryReader reader)
        {
            var targetPixelCountToPlot = image.Header.ImageWidth * image.Header.ImageHeight;
            var height = image.Header.ImageHeight;
            var width  = image.Header.ImageWidth;
            var actualPixelsPlotted = 0;
            var pixels       = new byte[targetPixelCountToPlot];
            var screenOffset = 0;
            var runCount     = 0;

            while (actualPixelsPlotted < targetPixelCountToPlot)
            {
                // figure out how many pixels are represented by run
                var x = reader.ReadByte();

                if (x < 128)
                {
                    // run of non-consecutive colours
                    var length = x + 1;
                    for (int i = 0; i < length; i++)
                    {
                        var value = reader.ReadByte();
                        pixels[screenOffset + width * (runCount / 4)] = value;
                        screenOffset += 4;
                        if (screenOffset >= width)
                        {
                            runCount++;
                            screenOffset = runCount % 4;
                        }
                        actualPixelsPlotted++;
                    }
                }
                else
                {
                    // run of consecutive colours
                    var value  = reader.ReadByte();
                    var length = 257 - x;
                    for (var i = 0; i < length; i++)
                    {
                        pixels[screenOffset + width * (runCount / 4)] = value;
                        screenOffset += 4;
                        if (screenOffset >= width)
                        {
                            runCount++;
                            screenOffset = runCount % 4;
                        }
                        actualPixelsPlotted++;
                    }
                }
            }

            var bitmap = CreateBitmapFromBuffer(image, pixels);

            Bitmaps.Add(bitmap);
        }
Exemple #3
0
        private void CreateBitmap23(FruaTlbImage image, BinaryReader reader)
        {
            var buffer      = new byte[4 + image.Header.ImageHeight * image.Header.ImageWidth];
            var rowsToPlot  = image.Header.ImageHeight;
            var row         = 0;
            var pos         = 0;
            var sweepNumber = 0;

            while (sweepNumber < 4)
            {
                var value = reader.ReadByte();
                if (value == 0)
                {
                    row++;
                    pos = 0;
                    if (row >= rowsToPlot)
                    {
                        sweepNumber++;
                        row = 0;
                    }
                }
                else
                {
                    if (value >= 128)
                    {
                        var x = (257 - value - 1) * 4;
                        pos += x;
                    }
                    else
                    {
                        for (int i = 0; i < value; i++)
                        {
                            var pixel = reader.ReadByte();
                            buffer[(row * image.Header.ImageWidth) + pos + sweepNumber] = pixel;
                            pos += 4;
                        }
                    }
                }
            }

            var bitmap = CreateBitmapFromBuffer(image, buffer);

            Bitmaps.Add(bitmap);
        }
Exemple #4
0
        /// <summary>
        /// Uncompressed, transparent -- with image mask
        /// In transparent images, color 255 is not drawn to the screen
        /// </summary>
        /// <param name="image"></param>
        /// <param name="reader"></param>

        private void CreateBitmap17(FruaTlbImage image, BinaryReader reader)
        {
            var pixelsToRead = image.Header.ImageHeight * image.Header.ImageWidth;
            var maskBuffer   = new byte[pixelsToRead];
            var pixelBuffer  = new byte[pixelsToRead];

            maskBuffer  = reader.ReadBytes(pixelsToRead);
            pixelBuffer = reader.ReadBytes(pixelsToRead);
            maskBuffer  = DeinterlacePixels(maskBuffer);
            pixelBuffer = DeinterlacePixels(pixelBuffer);
            for (int i = 0; i < maskBuffer.Length; i++)
            {
                if (maskBuffer[i] == 255)
                {
                    pixelBuffer[i] = 255;
                }
            }
            Bitmaps.Add(CreateBitmapFromBuffer(image, pixelBuffer));
        }
Exemple #5
0
        private Bitmap CreateBitmapFromBuffer(FruaTlbImage image, byte[] buffer)
        {
            var bitmap = new Bitmap(image.Header.ImageWidth, image.Header.ImageHeight);

            for (int y = 0; y < image.Header.ImageHeight; y++)
            {
                for (int x = 0; x < image.Header.ImageWidth; x++)
                {
                    var pixelIndex = buffer[y * image.Header.ImageWidth + x];
                    if ((image.Header.DrawingMethod == 21 || image.Header.DrawingMethod == 17) && pixelIndex == 255)
                    {
                        continue;
                    }

                    bitmap.SetPixel(x, y, _colorTable.Palette[pixelIndex]);
                }
            }

            return(bitmap);
        }
Exemple #6
0
        /// <summary>
        /// Uncompressed, transparent
        /// In transparent images, color 255 is not drawn to the screen
        /// </summary>
        /// <param name="image"></param>
        /// <param name="reader"></param>
        private void CreateBitmap21(FruaTlbImage image, BinaryReader reader)
        {
            var bitmap = CreateBitmap(image, reader);

            Bitmaps.Add(bitmap);
        }
Exemple #7
0
        private void ReadTileLibrary(BinaryReader reader, int imageCount, uint startingPointForSeek)
        {
            _offsets.Clear();

            for (int i = 0; i < imageCount; i++)
            {
                var offset = reader.ReadUInt32();
                _offsets.Add(offset);
            }

            if (combatIcon)
            {
                if (_fullPath.Contains("CBODY"))
                {
                    // FRUA CBODY.TLB needs both an external and internal color table
                    var tmp = _colorDataOffset;
                    findAndLoadExternalColorTable();
                    _colorDataOffset = tmp;
                    ReadColorTable(reader, startingPointForSeek);
                }
                else
                {
                    // some combat icons in FRUA (CPICXXXX.TLB) use the color table pointer as a pointer to a second,
                    // 'action' image, and don't contain a color table, instead using the dungcom.tlb one
                    reader.BaseStream.Seek(16, SeekOrigin.Begin);
                    imageCount += 1;
                    var combatIconActionImage = reader.ReadUInt32();
                    _offsets.Add(combatIconActionImage);

                    findAndLoadExternalColorTable();
                }
            }
            else
            {
                ReadColorTable(reader, startingPointForSeek);
            }

            // read images
            for (var entry = 0; entry < imageCount; entry++)
            {
                var offset = _offsets[entry];
                reader.BaseStream.Seek(offset + startingPointForSeek, SeekOrigin.Begin);

                var image = new FruaTlbImage
                {
                    Header =
                    {
                        ImageHeight      = reader.ReadUInt16(),
                        VerticalOffset   = reader.ReadInt16(),
                        HorizontalOffset = reader.ReadInt16(),
                        ImageWidth       = reader.ReadByte() * 4,
                        DrawingMethod    = reader.ReadByte()
                    }
                };

                // read image if we can
                switch (image.Header.DrawingMethod)
                {
                case 0:
                    // error?
                    break;

                case 16:
                    CreateBitmap16(image, reader);
                    break;

                case 17:
                    CreateBitmap17(image, reader);
                    break;

                case 18:
                    CreateBitmap18(image, reader);
                    break;

                case 21:
                    CreateBitmap21(image, reader);
                    break;

                case 23:
                    CreateBitmap23(image, reader);
                    break;

                case 24:
                    // TODO don't know how to read this yet
                    break;

                case 25:
                    // TODO don't know how to read this yet
                    break;

                default:
                    throw new Exception(string.Format("Unknown Drawing Method \"{0}\"", image.Header.DrawingMethod));
                }

                _images.Add(image);
            }
        }
Exemple #8
0
        private Bitmap CreateBitmapFromBuffer(FruaTlbImage image, byte[] buffer)
        {
            var bitmap = new Bitmap(image.Header.ImageWidth, image.Header.ImageHeight);

            for (int y = 0; y < image.Header.ImageHeight; y++)
            {
                for (int x = 0; x < image.Header.ImageWidth; x++)
                {
                    var pixelIndex = buffer[y*image.Header.ImageWidth + x];
                    if ((image.Header.DrawingMethod == 21 || image.Header.DrawingMethod == 17) && pixelIndex == 255) continue;

                    bitmap.SetPixel(x, y, _colorTable.Palette[pixelIndex]);
                }
            }

            return bitmap;
        }
Exemple #9
0
        private void ReadTileLibrary(BinaryReader reader, int imageCount, uint startingPointForSeek)
        {
            _offsets.Clear();

            for (int i = 0; i < imageCount; i++)
            {
                var offset = reader.ReadUInt32();
                _offsets.Add(offset);
            }

            if (combatIcon)
            {
                if (_fullPath.Contains("CBODY"))
                {
                    // FRUA CBODY.TLB needs both an external and internal color table
                    var tmp = _colorDataOffset;
                    findAndLoadExternalColorTable();
                    _colorDataOffset = tmp;
                    ReadColorTable(reader, startingPointForSeek);
                }
                else
                {
                    // some combat icons in FRUA (CPICXXXX.TLB) use the color table pointer as a pointer to a second, 
                    // 'action' image, and don't contain a color table, instead using the dungcom.tlb one
                    reader.BaseStream.Seek(16, SeekOrigin.Begin);
                    imageCount += 1;
                    var combatIconActionImage = reader.ReadUInt32();
                    _offsets.Add(combatIconActionImage);

                    findAndLoadExternalColorTable();
                }

            }
            else
            {
                ReadColorTable(reader, startingPointForSeek);
            }

            // read images
            for (var entry = 0; entry < imageCount; entry++)
            {
                var offset = _offsets[entry];
                reader.BaseStream.Seek(offset + startingPointForSeek, SeekOrigin.Begin);

                var image = new FruaTlbImage
                    {
                        Header =
                            {
                                ImageHeight = reader.ReadUInt16(),
                                VerticalOffset = reader.ReadInt16(),
                                HorizontalOffset = reader.ReadInt16(),
                                ImageWidth = reader.ReadByte()*4,
                                DrawingMethod = reader.ReadByte()
                            }
                    };

                // read image if we can
                switch (image.Header.DrawingMethod)
                {
                    case 0:
                        // error?
                        break;
                    case 16:
                        CreateBitmap16(image, reader);
                        break;

                    case 17:
                        CreateBitmap17(image, reader);
                        break;

                    case 18:
                        CreateBitmap18(image, reader);
                        break;

                    case 21:
                        CreateBitmap21(image, reader);
                        break;

                    case 23:
                        CreateBitmap23(image, reader);
                        break;

                    case 24:
                        // TODO don't know how to read this yet
                        break;

                    case 25:
                        // TODO don't know how to read this yet
                        break;

                    default:
                        throw new Exception(string.Format("Unknown Drawing Method \"{0}\"", image.Header.DrawingMethod));
                }

                _images.Add(image);
            }
        }
Exemple #10
0
 private Bitmap CreateBitmap(FruaTlbImage image, BinaryReader reader)
 {
     var pixelsToRead = image.Header.ImageHeight*image.Header.ImageWidth;
     var buffer = new byte[pixelsToRead];
     buffer = reader.ReadBytes(pixelsToRead);
     buffer = DeinterlacePixels(buffer);
     return CreateBitmapFromBuffer(image, buffer);
 }
Exemple #11
0
        private void CreateBitmap23(FruaTlbImage image, BinaryReader reader)
        {
            var buffer = new byte[4 + image.Header.ImageHeight*image.Header.ImageWidth];
            var rowsToPlot = image.Header.ImageHeight;
            var row = 0;
            var pos = 0;
            var sweepNumber = 0;

            while (sweepNumber < 4)
            {
                var value = reader.ReadByte();
                if (value == 0)
                {
                    row++;
                    pos = 0;
                    if (row >= rowsToPlot)
                    {
                        sweepNumber++;
                        row = 0;
                    }
                }
                else
                {
                    if (value >= 128)
                    {
                        var x = (257 - value - 1)*4;
                        pos += x;
                    }
                    else
                    {
                        for (int i = 0; i < value; i++)
                        {
                                var pixel = reader.ReadByte();
                                buffer[(row * image.Header.ImageWidth) + pos + sweepNumber] = pixel;
                                pos += 4;
                        }
                    }
                }
            }

            var bitmap = CreateBitmapFromBuffer(image, buffer);
            Bitmaps.Add(bitmap);
        }
Exemple #12
0
 /// <summary>
 /// Uncompressed, transparent
 /// In transparent images, color 255 is not drawn to the screen
 /// </summary>
 /// <param name="image"></param>
 /// <param name="reader"></param>
 private void CreateBitmap21(FruaTlbImage image, BinaryReader reader)
 {
     var bitmap = CreateBitmap(image, reader);
     Bitmaps.Add(bitmap);
 }
Exemple #13
0
        private void CreateBitmap18(FruaTlbImage image, BinaryReader reader)
        {
            var targetPixelCountToPlot = image.Header.ImageWidth*image.Header.ImageHeight;
            var height = image.Header.ImageHeight;
            var width = image.Header.ImageWidth;
            var actualPixelsPlotted = 0;
            var pixels = new byte[targetPixelCountToPlot];
            var screenOffset = 0;
            var runCount = 0;

            while (actualPixelsPlotted < targetPixelCountToPlot)
            {
                // figure out how many pixels are represented by run
                var x = reader.ReadByte();

                if (x < 128)
                {
                    // run of non-consecutive colours
                    var length = x + 1;
                    for (int i = 0; i < length; i++)
                    {
                        var value = reader.ReadByte();
                        pixels[screenOffset+width*(runCount/4)] = value;
                        screenOffset += 4;
                        if (screenOffset >= width)
                        {
                            runCount++;
                            screenOffset = runCount%4;
                        }
                        actualPixelsPlotted++;
                    }
                }
                else
                {
                    // run of consecutive colours
                    var value = reader.ReadByte();
                    var length = 257 - x;
                    for (var i = 0; i < length; i++)
                    {
                        pixels[screenOffset+width*(runCount/4)] = value;
                        screenOffset += 4;
                        if (screenOffset >= width)
                        {
                            runCount++;
                            screenOffset = runCount%4;
                        }
                        actualPixelsPlotted++;
                    }
                }
            }

            var bitmap = CreateBitmapFromBuffer(image, pixels);
            Bitmaps.Add(bitmap);
        }
Exemple #14
0
        /// <summary>
        /// Uncompressed, transparent -- with image mask
        /// In transparent images, color 255 is not drawn to the screen
        /// </summary>
        /// <param name="image"></param>
        /// <param name="reader"></param>

        private void CreateBitmap17(FruaTlbImage image, BinaryReader reader)
        {
            var pixelsToRead = image.Header.ImageHeight * image.Header.ImageWidth;
            var maskBuffer = new byte[pixelsToRead];
            var pixelBuffer = new byte[pixelsToRead];
            maskBuffer = reader.ReadBytes(pixelsToRead);
            pixelBuffer = reader.ReadBytes(pixelsToRead);
            maskBuffer = DeinterlacePixels(maskBuffer);
            pixelBuffer = DeinterlacePixels(pixelBuffer);
            for (int i = 0; i < maskBuffer.Length; i++)
            {
                if (maskBuffer[i] == 255) pixelBuffer[i] = 255; 
            }
            Bitmaps.Add(CreateBitmapFromBuffer(image, pixelBuffer));
        }