Exemplo n.º 1
0
        public static Texture Encode(Bitmap bitmap, TextureFormat format, bool generateMipMaps)
        {
            int width  = bitmap.Width;
            int height = bitmap.Height;

            if (TextureFormatUtilities.IsCompressed(format))
            {
                width  = AlignmentUtilities.AlignToNextPowerOfTwo(bitmap.Width);
                height = AlignmentUtilities.AlignToNextPowerOfTwo(bitmap.Height);
            }

            Texture texture;

            if (generateMipMaps && TextureFormatUtilities.IsCompressed(format))
            {
                texture = new Texture(width, height, format, 1, ( int )Math.Log(Math.Max(width, height), 2) + 1);
            }

            else
            {
                texture = new Texture(width, height, format);
            }

            for (int i = 0; i < texture.MipMapCount; i++)
            {
                Encode(texture[i], bitmap);
            }

            return(texture);
        }
Exemplo n.º 2
0
        public bool ReadEntryHeader(out ArchiveEntry entry, bool skipData = true)
        {
            long entryStartPosition = mReader.Position;

            if (entryStartPosition == mReader.BaseStreamLength)
            {
                entry = new ArchiveEntry();
                return(false);
            }

            // read entry name
            while (true)
            {
                byte b = mReader.ReadByte();
                if (b == 0)
                {
                    break;
                }

                mStringBuilder.Append(( char )b);

                // just to be safe
                if (mStringBuilder.Length == 252)
                {
                    break;
                }
            }

            string fileName = mStringBuilder.ToString();

            // set position to length field
            mReader.Position = entryStartPosition + 252;

            // read entry length
            int length = mReader.ReadInt32();

            if (fileName.Length == 0 || length <= 0 || length > 1024 * 1024 * 100)
            {
                entry = new ArchiveEntry();
                return(false);
            }

            // make an entry
            entry.FileName     = fileName;
            entry.Length       = length;
            entry.DataPosition = mReader.Position;

            // clear string builder for next iteration
            mStringBuilder.Clear();

            if (skipData)
            {
                mReader.Position = AlignmentUtilities.Align(mReader.Position + entry.Length, 64);
            }

            return(true);
        }
Exemplo n.º 3
0
        public static unsafe Texture EncodeYCbCr(Bitmap bitmap)
        {
            int width  = AlignmentUtilities.AlignToNextPowerOfTwo(bitmap.Width);
            int height = AlignmentUtilities.AlignToNextPowerOfTwo(bitmap.Height);

            var texture = new Texture(width, height, TextureFormat.ATI2, 1, 2);

            var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                                             ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

            using (var lumBitmap = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format32bppArgb))
                using (var cbrBitmap = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format32bppArgb))
                {
                    var lumData = lumBitmap.LockBits(new Rectangle(0, 0, lumBitmap.Width, lumBitmap.Height),
                                                     ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

                    var cbrData = cbrBitmap.LockBits(new Rectangle(0, 0, cbrBitmap.Width, cbrBitmap.Height),
                                                     ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

                    for (int x = 0; x < lumBitmap.Width; x++)
                    {
                        for (int y = 0; y < lumBitmap.Height; y++)
                        {
                            var color       = Color.FromArgb(*(( int * )bitmapData.Scan0 + y * bitmap.Width + x));
                            var ycbcrVector =
                                Vector3.Transform(Vector3.Divide(new Vector3(color.R, color.G, color.B), 255),
                                                  sRGBtoYCbCr);

                            var lumColor = Color.FromArgb(( int )(ycbcrVector.X * 255), color.A, 0);

                            var cbrVector =
                                Vector3.Multiply(
                                    Vector3.Min(Vector3.One, new Vector3(ycbcrVector.Y + 0.5f, ycbcrVector.Z + 0.5f, 0)),
                                    255);

                            var cbrColor = Color.FromArgb(( int )cbrVector.X, ( int )cbrVector.Y, 0);

                            *(( int * )lumData.Scan0 + y * lumBitmap.Width + x) = lumColor.ToArgb();
                            *(( int * )cbrData.Scan0 + y * cbrBitmap.Width + x) = cbrColor.ToArgb();
                        }
                    }

                    lumBitmap.UnlockBits(lumData);
                    cbrBitmap.UnlockBits(cbrData);

                    Encode(texture[0], lumBitmap);
                    Encode(texture[1], cbrBitmap);
                }

            bitmap.UnlockBits(bitmapData);

            return(texture);
        }
Exemplo n.º 4
0
        public long AddIndices(ushort[] indices)
        {
            long current = mCurrentOffset;

            {
                mIndices.Add(indices);
                mCurrentOffset += indices.Length * 2;
                mCurrentOffset  = AlignmentUtilities.Align(mCurrentOffset, 4);
            }

            return(current);
        }
        protected override void Write(List <long> data, EndianBinaryWriter writer)
        {
            var bytes = new List <byte>();

            data.Sort();

            long currentOffset = 0;

            foreach (long offset in data)
            {
                long distance = (offset - currentOffset) >> 3;

                if (distance > 0x3FFF)
                {
                    bytes.Add(( byte )(0xC0 | (distance >> 24)));
                    bytes.Add(( byte )(distance >> 16));
                    bytes.Add(( byte )(distance >> 8));
                    bytes.Add(( byte )(distance & 0xFF));
                }
                else if (distance > 0x3F)
                {
                    bytes.Add(( byte )(0x80 | (distance >> 8)));
                    bytes.Add(( byte )distance);
                }
                else if (distance > 0)
                {
                    bytes.Add(( byte )(0x40 | distance));
                }

                currentOffset = offset;
            }

            writer.Write(4 + AlignmentUtilities.Align(bytes.Count, 4));

            foreach (byte val in bytes)
            {
                writer.Write(val);
            }

            writer.WriteAlignmentPadding(8);
        }
Exemplo n.º 6
0
 private void WriteEntryAlignment()
 {
     mWriter.Position = AlignmentUtilities.Align(mWriter.Position, 64);
 }