/// <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()); }
/// <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); }
/// <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()); }
/// <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()); }
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); }
/// <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); }
/// <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()); }
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); }
/// <inheritdoc cref="Save"/> public byte[] Save(IEnumerable <Color> colors, EncodingSaveContext saveContext) { throw new System.NotImplementedException(); }