private void DecodeProgressiveDataInterleaved(ref JpegReader reader, JpegScanHeader scanHeader, Span <JpegArithmeticDecodingComponent> components) { foreach (JpegArithmeticDecodingComponent component in components) { if (component.DcTable is null || component.DcStatistics is null) { ThrowInvalidDataException(); } } JpegBlockAllocator allocator = _allocator; JpegBitReader bitReader = new JpegBitReader(reader.RemainingBytes); int mcusPerColumn = _mcusPerColumn; int mcusPerLine = _mcusPerLine; for (int rowMcu = 0; rowMcu < mcusPerColumn; rowMcu++) { for (int colMcu = 0; colMcu < mcusPerLine; colMcu++) { foreach (JpegArithmeticDecodingComponent component in components) { int index = component.ComponentIndex; int h = component.HorizontalSamplingFactor; int v = component.VerticalSamplingFactor; int offsetX = colMcu * h; int offsetY = rowMcu * v; for (int y = 0; y < v; y++) { int blockOffsetY = offsetY + y; for (int x = 0; x < h; x++) { ref JpegBlock8x8 blockRef = ref allocator.GetBlockReference(index, offsetX + x, blockOffsetY); ReadBlockProgressiveDC(ref bitReader, component, scanHeader, ref blockRef); } } } if (!HandleRestart(ref bitReader, ref reader, ref scanHeader, ref MemoryMarshal.GetReference(components), components.Length)) { return; } } }
private void DecodeProgressiveDataInterleaved(ref JpegReader reader, JpegScanHeader scanHeader, Span <JpegHuffmanDecodingComponent> components) { JpegBlockAllocator allocator = _allocator; JpegBitReader bitReader = new JpegBitReader(reader.RemainingBytes); int mcusPerColumn = _mcusPerColumn; int mcusPerLine = _mcusPerLine; for (int rowMcu = 0; rowMcu < mcusPerColumn; rowMcu++) { for (int colMcu = 0; colMcu < mcusPerLine; colMcu++) { foreach (JpegHuffmanDecodingComponent component in components) { int index = component.ComponentIndex; int h = component.HorizontalSamplingFactor; int v = component.VerticalSamplingFactor; int offsetX = colMcu * h; int offsetY = rowMcu * v; for (int y = 0; y < v; y++) { int blockOffsetY = offsetY + y; for (int x = 0; x < h; x++) { ref JpegBlock8x8 blockRef = ref allocator.GetBlockReference(index, offsetX + x, blockOffsetY); ReadBlockProgressiveDC(ref bitReader, component, scanHeader, ref blockRef); } } } if (!HandleRestart(ref bitReader, ref reader)) { return; } } }
private void ReadBlock(ref JpegBitReader reader, JpegArithmeticDecodingComponent component, ref JpegBlock8x8 destinationBlock) { ref short destinationRef = ref Unsafe.As <JpegBlock8x8, short>(ref destinationBlock);
private static void ReadBlockBaseline(ref JpegBitReader reader, JpegHuffmanDecodingComponent component, ref JpegBlock8x8 destinationBlock) { ref short destinationRef = ref Unsafe.As <JpegBlock8x8, short>(ref destinationBlock);
protected static void DequantizeBlockAndUnZigZag(JpegQuantizationTable quantizationTable, ref JpegBlock8x8 input, ref JpegBlock8x8F output) { Debug.Assert(!quantizationTable.IsEmpty); ref ushort elementRef = ref MemoryMarshal.GetReference(quantizationTable.Elements);