Пример #1
0
        public void ByteArrayToPrimitiveLE()
        {
            var toConvert  = new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 };
            var toConvert2 = new byte[] { 1, 0, 0 };
            var byteOrder  = ByteOrder.LittleEndian;

            var shortResult  = Convert.FromByteArray <short>(toConvert, byteOrder);
            var ushortResult = Convert.FromByteArray <ushort>(toConvert, byteOrder);
            var intResult    = Convert.FromByteArray <int>(toConvert, byteOrder);
            var uintResult   = Convert.FromByteArray <uint>(toConvert, byteOrder);
            var longResult   = Convert.FromByteArray <long>(toConvert, byteOrder);
            var ulongResult  = Convert.FromByteArray <ulong>(toConvert, byteOrder);

            var shortResult2  = Convert.FromByteArray <short>(toConvert2, byteOrder);
            var ushortResult2 = Convert.FromByteArray <ushort>(toConvert2, byteOrder);
            var intResult2    = Convert.FromByteArray <int>(toConvert2, byteOrder);

            Assert.AreEqual(0, shortResult);
            Assert.AreEqual(0, ushortResult);
            Assert.AreEqual(0, intResult);
            Assert.AreEqual(0U, uintResult);
            Assert.AreEqual(1L, longResult);
            Assert.AreEqual(1UL, ulongResult);

            Assert.AreEqual(0, shortResult2);
            Assert.AreEqual(0, ushortResult2);
            Assert.AreEqual(0x100, intResult2);
        }
Пример #2
0
 private Color CreateColor(long value, int redBitMask, int greenBitMask, int redShift)
 {
     return(Color.FromArgb(
                255,
                (RedDepth == 0) ? 255 : Convert.ChangeBitDepth((int)(value >> redShift & redBitMask), RedDepth, 8),
                (GreenDepth == 0) ? 255 : Convert.ChangeBitDepth((int)(value & greenBitMask), GreenDepth, 8),
                255));
 }
Пример #3
0
 private Color CreateColor(long value, int alphaBitMask, int lumBitMask, int lumShift)
 {
     return(Color.FromArgb(
                (AlphaDepth == 0) ? 255 : Convert.ChangeBitDepth((int)(value & alphaBitMask), AlphaDepth, 8),
                (LuminenceDepth == 0) ? 255 : Convert.ChangeBitDepth((int)(value >> lumShift & lumBitMask), LuminenceDepth, 8),
                (LuminenceDepth == 0) ? 255 : Convert.ChangeBitDepth((int)(value >> lumShift & lumBitMask), LuminenceDepth, 8),
                (LuminenceDepth == 0) ? 255 : Convert.ChangeBitDepth((int)(value >> lumShift & lumBitMask), LuminenceDepth, 8)));
 }
Пример #4
0
        public byte[] Save(IEnumerable <Color> colors)
        {
            byte nibbleBuffer = 0;
            bool writeNibble  = false;

            var ms = new MemoryStream();

            using (var bw = new BinaryWriter(ms, System.Text.Encoding.ASCII, true))
            {
                foreach (var color in colors)
                {
                    var r = (RedDepth == 0) ? 0 : Convert.ChangeBitDepth(color.R, 8, RedDepth);
                    var g = (GreenDepth == 0) ? 0 : Convert.ChangeBitDepth(color.G, 8, GreenDepth);

                    var rShift = GreenDepth;

                    long value = g;
                    value |= (uint)(r << rShift);

                    switch (BitDepth)
                    {
                    case 4:
                        if (writeNibble)
                        {
                            nibbleBuffer |= (byte)(value & 0xF);
                            bw.Write(nibbleBuffer);
                        }
                        else
                        {
                            nibbleBuffer = (byte)((value & 0xF) << 4);
                        }

                        writeNibble = !writeNibble;
                        break;

                    case 8:
                        bw.Write((byte)value);
                        break;

                    case 16:
                        bw.Write(Convert.ToByteArray((ushort)value, 2, ByteOrder));
                        break;

                    default:
                        throw new InvalidOperationException($"BitDepth {BitDepth} not supported!");
                    }
                }

                if (writeNibble)
                {
                    bw.Write(nibbleBuffer);
                }
            }

            return(ms.ToArray());
        }
Пример #5
0
        /// <inheritdoc cref="IIndexEncoding.Quantize(IEnumerable{Color},QuantizationSettings)"/>
        public (IEnumerable <IndexData> indices, IList <Color> palette) Quantize(IEnumerable <Color> colors, QuantizationSettings settings)
        {
            if (settings.ColorModel == ColorModel.RGBA)
            {
                settings.ColorModel = ColorModel.RGB;
            }

            var colorList = colors.ToList();

            var(indices, palette) = Kolors.Quantize(colorList, settings);

            var alphaIndexData = indices.
                                 Zip(colorList, (x, y) => new { index = x, alpha = y.A }).
                                 Select(x => new AlphaIndexData(Convert.ChangeBitDepth(x.alpha, 8, _alphaDepth), x.index));

            return(alphaIndexData, palette);
        }
Пример #6
0
        private void CreateTempASTCFile(string astcFile, byte[] texData)
        {
            var astc = File.Create(astcFile);

            using (var bw = new BinaryWriter(astc, System.Text.Encoding.ASCII, true))
            {
                bw.Write(0x5CA1AB13);   // magic val
                bw.Write((byte)_xDim);
                bw.Write((byte)_yDim);
                bw.Write((byte)_zDim);
                bw.Write(Convert.ToByteArray(Width, 3, ByteOrder));
                bw.Write(Convert.ToByteArray(Height, 3, ByteOrder));
                bw.Write(Convert.ToByteArray(1, 3, ByteOrder));
                bw.Write(texData);
            }
            astc.Dispose();
            astc.Close();
        }
Пример #7
0
        public IEnumerable <Color> Load(byte[] tex)
        {
            using (var br = new BinaryReader(new MemoryStream(tex)))
            {
                var rShift = GreenDepth;

                var gBitMask = (1 << GreenDepth) - 1;
                var rBitMask = (1 << RedDepth) - 1;

                while (br.BaseStream.Position < br.BaseStream.Length)
                {
                    long value;

                    switch (BitDepth)
                    {
                    case 4:
                        value = br.ReadByte();

                        // high nibble first
                        yield return(CreateColor((value & 0xF0) >> 4, rBitMask, gBitMask, rShift));

                        yield return(CreateColor(value & 0xF, rBitMask, gBitMask, rShift));

                        break;

                    case 8:
                        value = br.ReadByte();
                        break;

                    case 16:
                        value = Convert.FromByteArray <ushort>(br.ReadBytes(2), ByteOrder);
                        break;

                    default:
                        throw new InvalidOperationException($"BitDepth {BitDepth} not supported!");
                    }

                    yield return(CreateColor(value, rBitMask, gBitMask, rShift));
                }
            }
        }
Пример #8
0
        /// <inheritdoc cref="IIndexEncoding.Load(byte[])"/>
        public IEnumerable <IndexData> Load(byte[] input)
        {
            var alphaShift   = _indexDepth;
            var indexBitMask = (1 << _indexDepth) - 1;

            using (var br = new BinaryReader(new MemoryStream(input)))
                while (br.BaseStream.Position < br.BaseStream.Length)
                {
                    switch (_bitDepth)
                    {
                    case 8:
                        var value = br.ReadByte();
                        yield return(new AlphaIndexData(
                                         Convert.ChangeBitDepth(value >> alphaShift, _alphaDepth, 8),
                                         value & indexBitMask));

                        break;

                    default:
                        throw new InvalidOperationException($"IndexDepth {_indexDepth} not supported.");
                    }
                }
        }
Пример #9
0
 private static ushort From565To555(ushort value) => (ushort)(value & 0x1F | (Convert.ChangeBitDepth((value >> 5) & 0x3F, 6, 5) << 5) | (((value >> 11) & 0x1F) << 10));