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