private bool bitmap_ImportDds(DdsFile ddsFile, int bitmapIndex) { //Check if (bitmapIndex >= bitmap.BitmapCount) { return(false); } //Prepare HaloBitmap.BitmapFormat format; int lodLevels = 0; //Get existing properties for (int i = 0; i < 6; i++) { if (bitmap.Bitmaps[bitmapIndex].RawOffsets[i] != uint.MaxValue) { lodLevels += 1; } } format = bitmap.Bitmaps[bitmapIndex].Format; //Create Data Buffers byte[][] buffers = ddsFile_CreateBuffer(ddsFile, out format, ref lodLevels, out bool linear, out bool swizzle, out bool deleteLods); if (buffers == null) { return(false); } //Check if (deleteLods) { for (int i = 0; i < 6; i++) { if (bitmap.Bitmaps[bitmapIndex].RawOffsets[i] != uint.MaxValue) { SelectedEntry.Raws[RawSection.Bitmap].Delete((int)bitmap.Bitmaps[bitmapIndex].RawOffsets[i]); bitmap.Bitmaps[bitmapIndex].RawOffsets[i] = uint.MaxValue; bitmap.Bitmaps[bitmapIndex].RawLengths[i] = 0; } } } //Setup Bitmap Header bitmap.ColorPlateWidth = (ushort)ddsFile.Width; bitmap.ColorPlateHeight = (ushort)ddsFile.Height; bitmap.MipmapCount = (ushort)ddsFile.MipmapCount; //Get Import Format if (ddsFile.PixelFormatFlags.HasFlag(DirectDrawPixelFormatFlags.FourCC)) { switch (ddsFile.FourCC) { case "DXT1": bitmap.Format = HaloBitmap.ImportFormat.CompressedWithColorKeyTransparency; break; case "DXT2": case "DXT3": bitmap.Format = HaloBitmap.ImportFormat.CompressedWithExplicitAlpha; break; case "DXT4": case "DXT5": bitmap.Format = HaloBitmap.ImportFormat.CompressedWithInterpolatedAlpha; break; } switch (ddsFile.DwordFourCC) { case 116: bitmap.Format = HaloBitmap.ImportFormat.Colors32bpp; break; } } else { switch (ddsFile.RgbBitCount) { case 8: bitmap.Format = HaloBitmap.ImportFormat.Monochrome; break; case 16: bitmap.Format = HaloBitmap.ImportFormat.Colors16bpp; break; case 32: bitmap.Format = HaloBitmap.ImportFormat.Colors32bpp; break; } } //Setup Flags HaloBitmap.BitmapFlags flags = HaloBitmap.BitmapFlags.AlwaysOn; if (!linear && Math.Log(ddsFile.Width, 2) % 1 == 0 && Math.Log(ddsFile.Height, 2) % 1 == 0) { flags |= HaloBitmap.BitmapFlags.PowTwoDimensions; } if (linear) { flags |= HaloBitmap.BitmapFlags.Linear | HaloBitmap.BitmapFlags.PeferStutter; } if (swizzle) { flags |= HaloBitmap.BitmapFlags.Swizzled; } //Check for compression if (ddsFile.PixelFormatFlags.HasFlag(DirectDrawPixelFormatFlags.FourCC)) { switch (ddsFile.FourCC) { case "DXT1": case "DXT2": case "DXT3": case "DXT4": case "DXT5": flags |= HaloBitmap.BitmapFlags.Compressed; break; } } //Setup Bitmap bitmap.Bitmaps[bitmapIndex].Format = format; bitmap.Bitmaps[bitmapIndex].Width = (ushort)ddsFile.Width; bitmap.Bitmaps[bitmapIndex].Height = (ushort)ddsFile.Height; bitmap.Bitmaps[bitmapIndex].MipmapCount = (ushort)ddsFile.MipmapCount; bitmap.Bitmaps[bitmapIndex].Flags = flags; //Check for (int l = 0; l < lodLevels; l++) { //Get Raw Offset int offset = (int)bitmap.Bitmaps[bitmapIndex].RawOffsets[l]; //Check if raw exists, if so swap the buffer. if (SelectedEntry.Raws[RawSection.Bitmap].ContainsRawOffset(offset) && offset != -1) { SelectedEntry.Raws[RawSection.Bitmap].SwapBuffer(offset, buffers[l]); } else { //Make a raw offset int rawOffset = (int)(bitmap.Bitmaps[bitmapIndex].Address + 28 + (l * 4) - SelectedEntry.TagData.MemoryAddress); //Add Raw? if (SelectedEntry.Raws[RawSection.Bitmap].Add(new RawStream(buffers[l], rawOffset))) { bitmap.Bitmaps[bitmapIndex].RawOffsets[l] = (uint)rawOffset; SelectedEntry.Raws[RawSection.Bitmap][rawOffset].OffsetAddresses.Add(bitmap.Bitmaps[bitmapIndex].Address + 28 + (l * 4)); SelectedEntry.Raws[RawSection.Bitmap][rawOffset].LengthAddresses.Add(bitmap.Bitmaps[bitmapIndex].Address + 52 + (l * 4)); } } //Set Length bitmap.Bitmaps[bitmapIndex].RawLengths[l] = buffers[l].Length; } //Save bitmap.Write(); //Return return(true); }
private bool bitmap_ImportImage(Image image, int bitmapIndex) { //Check if (bitmapIndex >= bitmap.BitmapCount) { return(false); } //Prepare bool deleteLods, swizzle, linear; //Create Data Buffer byte[] buffer = image_CreateBuffer(image, out linear, out swizzle, out deleteLods); if (buffer == null) { return(false); } //Check if (deleteLods) { for (int i = 0; i < 6; i++) { if (bitmap.Bitmaps[bitmapIndex].RawOffsets[i] != uint.MaxValue) { SelectedEntry.Raws[RawSection.Bitmap].Delete((int)bitmap.Bitmaps[bitmapIndex].RawOffsets[i]); bitmap.Bitmaps[bitmapIndex].RawOffsets[i] = uint.MaxValue; bitmap.Bitmaps[bitmapIndex].RawLengths[i] = 0; } } } //Setup Bitmap Header bitmap.MipmapCount = 0; bitmap.ColorPlateWidth = (ushort)image.Width; bitmap.ColorPlateHeight = (ushort)image.Height; bitmap.Format = HaloBitmap.ImportFormat.Colors32bpp; //Setup Flags HaloBitmap.BitmapFlags flags = HaloBitmap.BitmapFlags.AlwaysOn; if (!linear && Math.Log(image.Width, 2) % 1 == 0 && Math.Log(image.Height, 2) % 1 == 0) { flags |= HaloBitmap.BitmapFlags.PowTwoDimensions; } if (linear) { flags |= HaloBitmap.BitmapFlags.Linear | HaloBitmap.BitmapFlags.PeferStutter; } if (swizzle) { flags |= HaloBitmap.BitmapFlags.Swizzled; } //Setup Bitmap bitmap.Bitmaps[bitmapIndex].Format = HaloBitmap.BitmapFormat.A8r8g8b8; bitmap.Bitmaps[bitmapIndex].Width = (ushort)image.Width; bitmap.Bitmaps[bitmapIndex].Height = (ushort)image.Height; bitmap.Bitmaps[bitmapIndex].MipmapCount = 0; bitmap.Bitmaps[bitmapIndex].Flags = flags; //Get Raw Offset int offset = (int)bitmap.Bitmaps[bitmapIndex].RawOffsets[0]; //Check if raw exists, if so swap the buffer. if (bitmap.Entry.Raws[RawSection.Bitmap].ContainsRawOffset(offset) && offset != -1) { bitmap.Entry.Raws[RawSection.Bitmap].SwapBuffer(offset, buffer); } else { //Make a raw offset int rawOffset = (int)(bitmap.Bitmaps[bitmapIndex].Address + 28 - SelectedEntry.TagData.MemoryAddress); //Add Raw? if (bitmap.Entry.Raws[RawSection.Bitmap].Add(new RawStream(buffer, rawOffset))) { bitmap.Bitmaps[bitmapIndex].RawOffsets[0] = (uint)rawOffset; SelectedEntry.Raws[RawSection.Bitmap][rawOffset].OffsetAddresses.Add(bitmap.Bitmaps[bitmapIndex].Address + 28); SelectedEntry.Raws[RawSection.Bitmap][rawOffset].LengthAddresses.Add(bitmap.Bitmaps[bitmapIndex].Address + 52); } } //Set Length bitmap.Bitmaps[bitmapIndex].RawLengths[0] = buffer.Length; //Save bitmap.Write(); //Return return(true); }