Example #1
0
        /// <inheritdoc cref="Save"/>
        public byte[] Save(IEnumerable <Color> colors, EncodingSaveContext saveContext)
        {
            // Get colors in unswizzled order, so the framework applies the swizzle correctly
            var paddedWidth = GetPaddedWidth(saveContext.Size.Width);
            var swizzle     = GetSwizzle(saveContext.Size.Width);

            var colorData = new byte[saveContext.Size.Width * saveContext.Size.Height * 4];

            var index = 0;

            foreach (var color in colors)
            {
                var targetPoint  = swizzle.Get(index / 4);
                var textureIndex = (targetPoint.Y * paddedWidth + targetPoint.X) * 4;

                colorData[textureIndex]     = color.R;
                colorData[textureIndex + 1] = color.G;
                colorData[textureIndex + 2] = color.B;
                colorData[textureIndex + 3] = color.A;

                index += 4;
            }

            // Initialize PVR Texture
            var pvrTexture = PvrTexture.Create(colorData, (uint)saveContext.Size.Width, (uint)saveContext.Size.Height, 1, PixelFormat.RGBA8888, ChannelType.UnsignedByteNorm, ColorSpace.Linear);

            // Transcode texture to PVRTC
            pvrTexture.Transcode((PixelFormat)_format, ChannelType.UnsignedByteNorm, ColorSpace.Linear, CompressionQuality.PVRTCHigh);

            return(pvrTexture.GetData());
        }
Example #2
0
        /// <inheritdoc cref="Load"/>
        public byte[] Save(IEnumerable <Color> colors, EncodingSaveContext saveContext)
        {
            var values = colors.AsParallel().AsOrdered()
                         .WithDegreeOfParallelism(saveContext.TaskCount)
                         .Select(c => _descriptor.GetValue(c));

            var bits   = saveContext.Size.Width * saveContext.Size.Height * BitsPerValue;
            var buffer = new byte[bits / 8 + (bits % 8 > 0 ? 1 : 0)];

            _writeValuesDelegate(values, buffer);

            return(buffer);
        }
Example #3
0
        /// <inheritdoc cref="Save"/>
        public byte[] Save(IEnumerable <int> indices, IList <Color> palette, EncodingSaveContext saveContext)
        {
            var ms = new MemoryStream();

            using var bw = new BinaryWriterX(ms, _byteOrder, _bitOrder, 1);

            var values = indices.AsParallel().AsOrdered()
                         .WithDegreeOfParallelism(saveContext.TaskCount)
                         .Select(i => _descriptor.GetValue(i, palette));

            foreach (var value in values)
            {
                _writeValueDelegate(bw, value);
            }

            return(ms.ToArray());
        }
Example #4
0
        /// <inheritdoc cref="Save"/>
        public byte[] Save(IEnumerable <Color> colors, EncodingSaveContext saveContext)
        {
            var ms = new MemoryStream();

            using var bw = new BinaryWriterX(ms, _byteOrder);

            var blocks = colors.Batch(ColorsPerValue)
                         .AsParallel().AsOrdered()
                         .WithDegreeOfParallelism(saveContext.TaskCount)
                         .Select(c => EncodeNextBlock(c.ToArray()));

            foreach (var block in blocks)
            {
                WriteNextBlock(bw, block);
            }

            return(ms.ToArray());
        }
Example #5
0
        public byte[] Save(IEnumerable <Color> colors, EncodingSaveContext saveContext)
        {
            var buffer = new byte[saveContext.Size.Width * saveContext.Size.Height * 4];

            var index = 0;

            foreach (var color in colors)
            {
                for (var i = 0; i < 16; i++)
                {
                    buffer[index + i]          = color.A;
                    buffer[index + i + 1]      = color.R;
                    buffer[index + i + 32]     = color.G;
                    buffer[index + i + 31 + 1] = color.B;
                }

                index += 64;
            }

            return(buffer);
        }
Example #6
0
        /// <inheritdoc cref="Save"/>
        public byte[] Save(IEnumerable <Color> colors, EncodingSaveContext saveContext)
        {
            var compressionFormat = GetCompressionFormat();
            var encoder           = GetEncoder(compressionFormat);

            var blockSize    = BitsPerValue / 8;
            var widthBlocks  = ((saveContext.Size.Width + 3) & ~3) >> 2;
            var heightBlocks = ((saveContext.Size.Height + 3) & ~3) >> 2;
            var buffer       = new byte[widthBlocks * heightBlocks * blockSize];

            colors.Batch(ColorsPerValue).Select((x, i) => (x, i))
            .AsParallel()
            .WithDegreeOfParallelism(saveContext.TaskCount)
            .ForAll(element =>
            {
                var encodedBlock = encoder.EncodeBlock(element.x.Select(y => new ColorRgba32(y.R, y.G, y.B, y.A)).ToArray());
                Array.Copy(encodedBlock, 0, buffer, element.i * blockSize, blockSize);
            });

            return(buffer);
        }
Example #7
0
        /// <inheritdoc cref="Save"/>
        public byte[] Save(IEnumerable <Color> colors, EncodingSaveContext saveContext)
        {
            var colorData = new byte[saveContext.Size.Width * saveContext.Size.Height * 4];

            var index = 0;

            foreach (var color in colors)
            {
                colorData[index++] = color.R;
                colorData[index++] = color.G;
                colorData[index++] = color.B;
                colorData[index++] = color.A;
            }

            // Initialize PVR Texture
            var pvrTexture = PvrTexture.Create(colorData, (uint)saveContext.Size.Width, (uint)saveContext.Size.Height, 1, PixelFormat.RGBA8888, ChannelType.UnsignedByteNorm, ColorSpace.Linear);

            // Transcode texture to PVRTC
            pvrTexture.Transcode((PixelFormat)_format, ChannelType.UnsignedByteNorm, ColorSpace.Linear, CompressionQuality.PVRTCHigh);

            return(pvrTexture.GetData());
        }
Example #8
0
        public byte[] Save(IEnumerable <Color> colors, EncodingSaveContext saveContext)
        {
            var buffer = new byte[saveContext.Size.Width * saveContext.Size.Height * 2];

            var offset = 0;

            foreach (var color in colors)
            {
                if (color.A < 0xFF)
                {
                    WriteValue(buffer, offset, (ushort)_desc1.GetValue(color));
                }
                else
                {
                    WriteValue(buffer, offset, (ushort)(_desc2.GetValue(color) | 0x80000000));
                }

                offset += 2;
            }

            return(buffer);
        }
Example #9
0
 /// <inheritdoc cref="Save"/>
 public byte[] Save(IEnumerable <Color> colors, EncodingSaveContext saveContext)
 {
     throw new System.NotImplementedException();
 }