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)); }
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); }
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); }
/// <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)); }
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); }
/// <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); }
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); } }
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; }
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); } }
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); }
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); }
/// <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); }
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); }
/// <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)); }