public override ImageData Read(IBinaryStream stream, ImageMetaData info) { using (var reader = new PgdReader(stream, (PgdGeMetaData)info)) { var pixels = reader.UnpackGE(); return(ImageData.Create(info, reader.Format, null, pixels)); } }
public override ImageData Read(IBinaryStream stream, ImageMetaData info) { var meta = (PgdIncMetaData)info; string dir_name = VFS.GetDirectoryName(meta.FileName); string name = VFS.CombinePath(dir_name, meta.BaseName); PgdGeMetaData base_info; byte[] image, overlay; PixelFormat format; using (var base_file = VFS.OpenBinaryStream(name)) { base_info = PalFormat.Value.ReadMetaData(base_file) as PgdGeMetaData; if (null == base_info) { throw new InvalidFormatException("Invalid baseline image format"); } if (meta.OffsetX + meta.Width > base_info.Width || meta.OffsetY + meta.Height > base_info.Height) { throw new InvalidFormatException("Incompatible baseline image dimensions"); } base_info.FileName = name; using (var reader = new PgdReader(base_file, base_info)) { image = reader.UnpackGE(); format = reader.Format; } } using (var reader = new PgdReader(stream, meta)) overlay = reader.UnpackOverlay(); int overlay_bpp = meta.BPP / 8; int base_bpp = format.BitsPerPixel / 8; int dst = (meta.OffsetY * (int)base_info.Width + meta.OffsetX) * base_bpp; int gap = (int)(base_info.Width - meta.Width) * base_bpp; int src = 0; bool apply_alpha = overlay_bpp == 4 && base_bpp == 4; for (uint y = 0; y < meta.Height; ++y) { for (uint x = 0; x < meta.Width; ++x) { image[dst] ^= overlay[src]; image[dst + 1] ^= overlay[src + 1]; image[dst + 2] ^= overlay[src + 2]; if (apply_alpha) { image[dst + 3] ^= overlay[src + 3]; } dst += base_bpp; src += overlay_bpp; } dst += gap; } base_info.FileName = meta.FileName; return(ImageData.Create(base_info, format, null, image)); }
public override ImageData Read(IBinaryStream stream, ImageMetaData info) { using (var reader = new PgdReader(stream, 0x1C)) { var data = reader.Unpack00(); using (var tga = new BinMemoryStream(data, stream.Name)) { var tga_info = Tga.ReadMetaData(tga); if (null == tga_info) { throw new InvalidFormatException(); } tga.Position = 0; return(Tga.Read(tga, tga_info)); } } }
public override ImageData Read(IBinaryStream stream, ImageMetaData info) { using (var reader = new PgdReader(stream, 0x20)) { var planes = reader.Unpack11(); var pixels = new byte[planes.Length]; int plane_size = (int)info.Width * (int)info.Height; int b_src = 0; int g_src = b_src + plane_size; int r_src = g_src + plane_size; int alpha_src = r_src + plane_size; int dst = 0; while (dst < pixels.Length) { pixels[dst++] = planes[b_src++]; pixels[dst++] = planes[g_src++]; pixels[dst++] = planes[r_src++]; pixels[dst++] = planes[alpha_src++]; } return(ImageData.Create(info, PixelFormats.Bgra32, null, pixels)); } }