Beispiel #1
0
        private static void ProcessSlice(StartOfImage startOfImage, int slice, int samples, BitmapData data, DataBuf pp)
        {
            var startOfFrame = startOfImage.StartOfFrame;
            var scanLines    = startOfFrame.ScanLines;
            var memory       = new DataBuf[2];           // 0x4000

            for (var line = 0; line < scanLines; line++) // 0..1728
            {
                // 6 bytes * 8 bits == 48 bits per pixel
                // 3 = 6 bytes * samplesPerLine / (slices[0] * slices[1] + slices[2]);
                var scan0 = data.Scan0 + data.Stride * line + slice * samples * 3;

                // read four shorts, for two pixels
                for (var col = 0; col < samples / 4; col++)       // 0..216  ==> 0/6 .. 2592/6  --> 0 .. 432
                {
                    cc += 4;
                    var diff = new DiffBuf
                    {
                        Y1 = startOfImage.ProcessColor(0x00),
                        Y2 = startOfImage.ProcessColor(0x00),
                        Cb = startOfImage.ProcessColor(0x01),
                        Cr = startOfImage.ProcessColor(0x01)
                    };

                    if (line % 6 == 0 && col == 0)
                    {
                        pp.Y         = (ushort)(pp.Y + diff.Y1);
                        pp.Cb       += diff.Cb;
                        pp.Cr       += diff.Cr;
                        memory[0].Y  = pp.Y;
                        memory[0].Cb = pp.Cb;
                        memory[0].Cr = pp.Cr;

                        pp.Y         = (ushort)(pp.Y + diff.Y2);
                        memory[1].Y  = pp.Y;
                        memory[1].Cb = pp.Cb;
                        memory[1].Cr = pp.Cr;
                    }
                    else
                    {
                        memory[0].Y  = (ushort)(memory[0].Y + diff.Y1);
                        memory[0].Cb = (short)(memory[0].Cb + diff.Cb);
                        memory[0].Cr = (short)(memory[0].Cr + diff.Cr);

                        memory[1].Y  = (ushort)(memory[1].Y + diff.Y2);
                        memory[1].Cb = memory[0].Cb;
                        memory[1].Cr = memory[0].Cr;
                    }

                    PokePixels(scan0, col, memory[0], memory[1]);
                }
            }
        }
        public DiffBuf[] ReadDiffRow()
        {
            int samplesPerLine = StartOfFrame.SamplesPerLine;

            var diff = new DiffBuf[samplesPerLine / 2];         // 1296

            for (var x = 0; x < samplesPerLine / 2; x++)        // 1296
            {
                diff[x].Y1 = ProcessColor(0x00);
                diff[x].Y2 = ProcessColor(0x00);
                diff[x].Cb = ProcessColor(0x01);
                diff[x].Cr = ProcessColor(0x01);
            }

            return(diff);
        }
Beispiel #3
0
        private static DiffBuf[] ReadDiffBufs(int samplesPerLine, StartOfImage startOfImage)
        {
            var table0 = startOfImage.HuffmanTable.Tables[0x00];
            var table1 = startOfImage.HuffmanTable.Tables[0x01];

            var diff = new DiffBuf[samplesPerLine / 4]; // 864 / 4 == 216

            for (var x = 0; x < diff.Length; x++)
            {
                diff[x].Y1 = startOfImage.ProcessColor(0x00);
                diff[x].Y2 = startOfImage.ProcessColor(0x00);
                diff[x].Cb = startOfImage.ProcessColor(0x01);
                diff[x].Cr = startOfImage.ProcessColor(0x01);
                cc        += 4;
            }

            return(diff);
        }
Beispiel #4
0
        private static DiffBuf[] ReadDiffRow(StartOfImage startOfImage)
        {
            var startOfFrame   = startOfImage.StartOfFrame;
            int samplesPerLine = startOfFrame.SamplesPerLine;

            var diff = new DiffBuf[samplesPerLine / 4];         // 648

            for (var x = 0; x < samplesPerLine / 4; x++)        // 0..648
            {
                diff[x].Y1 = startOfImage.ProcessColor(0x00);
                diff[x].Y2 = startOfImage.ProcessColor(0x00);
                diff[x].Y3 = startOfImage.ProcessColor(0x00);
                diff[x].Y4 = startOfImage.ProcessColor(0x00);
                diff[x].Cb = startOfImage.ProcessColor(0x01);
                diff[x].Cr = startOfImage.ProcessColor(0x01);
                cc        += 4;
            }

            return(diff);
        }
Beispiel #5
0
        private static DiffBuf[] ReadDiffRow(StartOfImage startOfImage)
        {
            var startOfFrame   = startOfImage.StartOfFrame;
            int samplesPerLine = startOfFrame.SamplesPerLine;
            var table0         = startOfImage.HuffmanTable.Tables[0x00];
            var table1         = startOfImage.HuffmanTable.Tables[0x01];

            var diff = new DiffBuf[samplesPerLine / 2];         // 1296

            for (var x = 0; x < samplesPerLine / 2; x++)        // 1296
            {
                diff[x].Y1 = startOfImage.ProcessColor(0x00);
                diff[x].Y2 = startOfImage.ProcessColor(0x00);
                diff[x].Cb = startOfImage.ProcessColor(0x01);
                diff[x].Cr = startOfImage.ProcessColor(0x01);

                cc += 4;
            }

            return(diff);
        }
Beispiel #6
0
        private static void ProcessSlice(StartOfImage startOfImage, int slice, int width, BitmapData data, ushort[] pp)
        {
            var startOfFrame = startOfImage.StartOfFrame;
            var scanLines    = startOfFrame.ScanLines;
            var memory       = new ushort[2];

            for (var line = 0; line < scanLines; line++)
            {
                // 6 bytes * 8 bits == 48 bits per pixel
                // 3 = 6 bytes * samplesPerLine / (slices[0] * slices[1] + slices[2]);
                var scan0 = data.Scan0 + data.Stride * line + slice * width * 6;

                // read two shorts, for two pixels
                for (var col = 0; col < width / 2; col++)
                {
                    var diff = new DiffBuf
                    {
                        Y1 = startOfImage.ProcessColor(0x00),
                        Y2 = startOfImage.ProcessColor(0x01),
                    };
                    cc += 2;

                    if (line % 2 == 0 && col == 0)
                    {
                        pp[0]     = (ushort)(pp[0] + diff.Y1);
                        memory[0] = pp[0];

                        pp[1]     = (ushort)(pp[1] + diff.Y2);
                        memory[1] = pp[1];
                    }
                    else
                    {
                        memory[0] = (ushort)(memory[0] + diff.Y1);

                        memory[1] = (ushort)(memory[1] + diff.Y2);
                    }

                    if (line % 2 == 0)
                    {
                        var pixel0 = new DataBuf
                        {
                            R = memory[0]
                        };

                        var pixel1 = new DataBuf
                        {
                            G = memory[1]
                        };

                        PokePixels(scan0, col, pixel0, pixel1);
                    }
                    else
                    {
                        var pixel0 = new DataBuf
                        {
                            G = memory[0]
                        };

                        var pixel1 = new DataBuf
                        {
                            B = memory[1]
                        };

                        PokePixels(scan0, col, pixel0, pixel1);
                    }
                }
            }
        }
Beispiel #7
0
        private static void ProcessSlice(StartOfImage startOfImage, int slice, int samples, BitmapData data)
        {
            var startOfFrame = startOfImage.StartOfFrame;
            var table0       = startOfImage.HuffmanTable.Tables[0x00];
            var table1       = startOfImage.HuffmanTable.Tables[0x01];

            var lastRow = new DataBuf {
                Y = 0x0000
            };                                                           // 0x4000

            for (var line = 0; line < startOfFrame.ScanLines; line += 2) // 0..2592
            {
                // 6 bytes * 8 bits == 48 bits per pixel
                // 2 = 6 bytes * samplesPerLine / (slices[0] * slices[1] + slices[2]);
                var scan0 = data.Scan0 + data.Stride * line + slice * samples * 2;
                var scan1 = data.Scan0 + data.Stride * (line + 1) + slice * samples * 2;

                // read six shorts, for four pixels
                for (var col = 0; col < samples / 6; col++)       // 0..1296
                {
                    cc += 6;
                    var diff = new DiffBuf
                    {
                        Y1 = startOfImage.ProcessColor(0x00),
                        Y2 = startOfImage.ProcessColor(0x00),
                        Y3 = startOfImage.ProcessColor(0x00),
                        Y4 = startOfImage.ProcessColor(0x00),
                        Cb = startOfImage.ProcessColor(0x01),
                        Cr = startOfImage.ProcessColor(0x01),
                    };

                    var pixel0 = new DataBuf
                    {
                        Y  = (ushort)(lastRow.Y + diff.Y1),
                        Cb = (short)(lastRow.Cb + diff.Cb),
                        Cr = (short)(lastRow.Cr + diff.Cr)
                    };

                    var pixel1 = new DataBuf
                    {
                        Y  = (ushort)(lastRow.Y + diff.Y1 + diff.Y2),
                        Cb = (short)(lastRow.Cb + diff.Cb),
                        Cr = (short)(lastRow.Cr + diff.Cr)
                    };

                    var pixel2 = new DataBuf
                    {
                        Y  = (ushort)(lastRow.Y + diff.Y1 + diff.Y2 + diff.Y3),
                        Cb = (short)(lastRow.Cb + diff.Cb),
                        Cr = (short)(lastRow.Cr + diff.Cr)
                    };

                    var pixel3 = new DataBuf
                    {
                        Y  = (ushort)(lastRow.Y + diff.Y1 + diff.Y2 + diff.Y3 + diff.Y4),
                        Cb = (short)(lastRow.Cb + diff.Cb),
                        Cr = (short)(lastRow.Cr + diff.Cr)
                    };

                    PokePixels(scan0, scan1, col, pixel0, pixel1, pixel2, pixel3);
                }
            }
        }