示例#1
0
 public ScatterResult(bool isScattered, ColorVector attenuation, Ray specularRay, IPdf pdf)
 {
     IsScattered = isScattered;
     Attenuation = attenuation;
     SpecularRay = specularRay;
     Pdf         = pdf;
 }
        internal PdfIndirectObject ReadIndirectObject(IPdfStreamReader streamReader, IPdf pdf, int objectNumber, int generation)
        {
            //get the inner object.
            var innerObject = this.ReadObject(streamReader, pdf);
            var nextToken   = streamReader.PeekNextToken();

            //check to see if it's a stream
            if (nextToken == "stream")
            {
                innerObject = this.ReadStream(streamReader, pdf, innerObject as PdfDictionary);
            }

            //advance the stream, reading in the token.
            //this will should be the same as the peek above unless it was a stream, in which case it should be endobj
            nextToken = streamReader.ReadNextToken();

            if (nextToken != "endobj")
            {
                throw new InvalidDataException("Unexpected token at end of indirect object");
            }

            var result = new PdfIndirectObject(innerObject, objectNumber, generation);

            return(result);
        }
        public PdfIndirectObject PeekReadObject(IPdfStreamReader streamReader, IPdf pdf, CrossReferencePartSubSectionEntry entry)
        {
            var originalOffset = streamReader.Position;
            var result         = this.ReadObject(streamReader, pdf, entry);

            streamReader.Seek(originalOffset, SeekOrigin.Begin);

            return(result);
        }
示例#4
0
        /// <summary>
        /// Prepare the sampler instance.
        /// </summary>
        /// <param name="gui">Sampler type from GUI (combo-box)?</param>
        private void checkSampler(bool gui)
        {
            string name = comboSampling.Text;

            if (!gui && sset != null)
            {
                name = sset.samplingSource;
            }
            if (DefaultSampling.Samplings.ContainsKey(name))
            {
                sampler = DefaultSampling.Samplings[name];
            }
            else
            {
                sampler = new RandomSampling();
            }

            string dname = comboDensity.Text;

            switch (dname)
            {
            case DefaultPdf.PDF_IMAGE:
                if (densityFile == null ||
                    !File.Exists(densityFile))
                {
                    Util.Log("Invalid density file: " + densityFile ?? "null");
                    density = new DensityFunction(-1);
                    break;
                }
                density = new RasterPdf(densityFile, checkNegative.Checked);
                break;

            case DefaultPdf.PDF_UNIFORM:
                density = new DensityFunction(-1);
                break;

            case DefaultPdf.PDF_RAMP:
                density = new DensityFunction(0);
                break;

            case DefaultPdf.PDF_COSRR:
                density = new DensityFunction(1);
                break;

            case DefaultPdf.PDF_SINCR:
                density = new DensityFunction(2);
                break;

            case DefaultPdf.PDF_SINCOS:
                density = new DensityFunction(3);
                break;
            }
            sampler.Density = density;

            sampler.Break = false;
        }
        public PdfIndirectObject ReadObject(IPdfStreamReader streamReader, IPdf pdf, CrossReferencePartSubSectionEntry entry)
        {
            streamReader.Seek(entry.Offset, SeekOrigin.Begin);

            var result = this.ReadObject(streamReader, pdf);

            if (result is PdfIndirectObject indirectObject)
            {
                return(indirectObject);
            }

            throw new InvalidDataException("Expected object is not an indirect object.");
        }
示例#6
0
        public TrailerPart ParseTrailer(PdfStreamReader streamReader, IPdf pdf)
        {
            var header = streamReader.ReadLine();

            if (header != "trailer")
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), "First line in Trailer Content is not \"trailer\"");
            }

            var trailerDictionary = this._pdfReader.ReadObject(streamReader, pdf);

            if (!(trailerDictionary is PdfDictionary))
            {
                throw new InvalidDataException("Trailer dictionary content was not a dictionary.");
            }

            var line = streamReader.ReadLine();
            var foundCrossReference = false;

            if (line == "startxref")
            {
                foundCrossReference = true;
            }

            if (!foundCrossReference)
            {
                throw new InvalidDataException("Missing startxref line");
            }

            var crossReferenceLine = streamReader.ReadLine();

            if (!long.TryParse(crossReferenceLine, out var crossReferenceOffset))
            {
                throw new InvalidDataException("Cross Reference Offset value is not a parseable number");
            }

            line = streamReader.ReadLine();

            if (line == null ||
                line == "%%EOF")
            {
                var result = new TrailerPart((PdfDictionary)trailerDictionary, crossReferenceOffset);

                return(result);
            }

            throw new InvalidDataException("Trailer content is invalid, the last 2 lines should be startxref and a number and optionally a 3rd line containing %%EOF");
        }
        internal PdfArray ReadArray(IPdfStreamReader streamReader, IPdf pdf)
        {
            var arrayInit = streamReader.Read();

            if (arrayInit != '[')
            {
                throw new InvalidDataException("Unexpected array initializer, expected [");
            }
            var items = new List <PdfObject>();

            streamReader.SeekToNextToken();

            while (true)
            {
                var item = this.ReadObject(streamReader, pdf);

                if (item != null)
                {
                    items.Add(item);
                }
                else
                {
                    //ignore whitespace
                    if (streamReader.PeekIsNextByteWhitespace())
                    {
                        streamReader.Seek(1, SeekOrigin.Current);
                    }
                    else if (streamReader.Peek() == ']')
                    {
                        //we're at the end of the array, do nothing, it gets handled below.
                    }
                    else
                    {
                        throw new InvalidDataException("Unable to parse array, invalid object.");
                    }
                }

                if (streamReader.Peek() == ']')
                {
                    streamReader.Seek(1, SeekOrigin.Current);
                    streamReader.SeekToNextToken();

                    break;
                }
            }

            return(items.ToArray());
        }
        public VersionPart ReadPart(PdfStreamReader streamReader, IPdf pdf)
        {
            var line = streamReader.ReadLine();

            if (line == null)
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), "Unexpected end of stream");
            }
            else if (line.StartsWith(PdfVersionPrefix))
            {
                var result = this.GetVersionPart(line);
                return(result);
            }
            else
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), line, "Expected content at current position was not a version");
            }
        }
        public CrossReferencePart ReadPart(PdfStreamReader streamReader, IPdf pdf)
        {
            if (pdf == null)
            {
                throw new ArgumentNullException(nameof(pdf));
            }

            if (pdf.Trailer == null ||
                pdf.Trailer.StartCrossReference == 0)
            {
                return(null);
            }

            var originalPosition = streamReader.Position;

            try
            {
                streamReader.Seek(pdf.Trailer.StartCrossReference, SeekOrigin.Begin);
                var line = streamReader.ReadLine();

                if (line != "xref")
                {
                    throw new ArgumentOutOfRangeException(nameof(streamReader), line, "Invalid Cross Reference Header");
                }

                var subsections = new List <CrossReferencePartSubSection>();
                while (line == "xref")
                {
                    subsections.Add(_subSectionReader.ReadPart(streamReader, pdf));
                    line = streamReader.ReadLine();
                }

                var result = new CrossReferencePart
                {
                    Sections = subsections.ToArray()
                };

                return(result);
            }
            finally
            {
                streamReader.Seek(originalPosition, SeekOrigin.Begin);
            }
        }
示例#10
0
        public CrossReferencePartSubSection ReadPart(PdfStreamReader streamReader, IPdf pdf)
        {
            var line = streamReader.ReadLine();

            var fields = line.Split(' ');

            if (fields.Length != 2)
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), line, "Invalid field count for subsection counts.");
            }

            if (!int.TryParse(fields[0], out var startingObject))
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), line, "Invalid starting object field. Not a valid number.");
            }

            if (!int.TryParse(fields[1], out var objectCount))
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), line, "Invalid object count. Not a valid number.");
            }

            var entries = new CrossReferencePartSubSectionEntry[objectCount];

            for (var i = 0; i < entries.Length; i++)
            {
                var entry = this._partReader.ReadPart(streamReader, pdf);
                entry.ObjectNumber = startingObject + i;
                entries[i]         = entry;
            }

            var result = new CrossReferencePartSubSection
            {
                Entries        = entries,
                StartingObject = startingObject
            };

            return(result);
        }
示例#11
0
        internal PdfDictionary ReadDictionary(IPdfStreamReader streamReader, IPdf pdf)
        {
            var result = new PdfDictionary();
            var token  = streamReader.ReadNextToken(false);

            if (token != "<<")
            {
                throw new InvalidDataException("Unexpected dictionary start string");
            }

            string currentKey = null;

            while (true)
            {
                token = streamReader.PeekNextToken();

                if (token == ">>")
                {
                    streamReader.Seek(2, SeekOrigin.Current);
                    streamReader.SeekToNextToken();
                    return(result);
                }

                var value = this.ReadObject(streamReader, pdf);

                if (currentKey != null)
                {
                    result.Entries[currentKey] = value;
                    currentKey = null;
                }
                else if (value is PdfName pdfName)
                {
                    currentKey = pdfName.Value;
                }
            }
        }
        public CrossReferencePartSubSectionEntry ReadPart(PdfStreamReader streamReader, IPdf pdf)
        {
            var line = streamReader.ReadLine();

            if (line.Length != 18)
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), line, "Line is not 18 characters long.");
            }

            var fields = line.Split(' ');

            if (fields.Length != 3)
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), line, "Line does not have 3 fields.");
            }

            if (!long.TryParse(fields[0], out var offset))
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), line, "Invalid offset field. Not a valid number.");
            }

            if (!int.TryParse(fields[1], out var generation))
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), line, "Invalid generation field. Not a valid number.");
            }

            if (fields[2] != "f" &&
                fields[2] != "n")
            {
                throw new ArgumentOutOfRangeException(nameof(streamReader), line, "Invalid in use flag. Not 'n' or 'f'.");
            }

            var inUseFlag = (CrossReferenceEntryFlag)fields[2][0];
            var result    = new CrossReferencePartSubSectionEntry
            {
                Generation = generation,
                InUse      = inUseFlag,
                Offset     = offset
            };

            return(result);
        }
示例#13
0
        public TrailerPart ReadPart(PdfStreamReader streamReader, IPdf pdf)
        {
            var currentPosition = streamReader.Position;

            try
            {
                var trailerBlockSize = 512;
                var block            = new byte[trailerBlockSize];
                int trailerStart;

                //we'll read x number of bytes at a time with a 7 byte overlap to account for the word trailer.
                //length = 1500

                streamReader.Seek(-trailerBlockSize, SeekOrigin.End);
                string content;
                var    foundTrailer = false;
                do
                {
                    var loopPosition = streamReader.Position;

                    streamReader.Read(block, 0, trailerBlockSize);

                    content = Encoding.ASCII.GetString(block);

                    if ((trailerStart = content.IndexOf("trailer")) >= 0)
                    {
                        streamReader.Seek(loopPosition + trailerStart, SeekOrigin.Begin);

                        foundTrailer = true;
                        break;
                    }

                    content = null;

                    if (loopPosition == 0)
                    {
                        //we were at the beginning of the stream meaning we can't go back any more
                        break;
                    }

                    if (streamReader.Position > trailerBlockSize)
                    {
                        streamReader.Seek((trailerBlockSize * -2) + 7, SeekOrigin.Current); //7 byte overlap
                    }
                    else
                    {
                        streamReader.Seek(0, SeekOrigin.Begin);
                    }
                } while (streamReader.Position - trailerBlockSize > 0); //make sure we don't go before the beginning of the stream for files that have no trailer

                if (foundTrailer)
                {
                    var result = ParseTrailer(streamReader, pdf);
                    return(result);
                }

                return(null);
            }
            finally
            {
                // go back to where we were.
                streamReader.Seek(currentPosition, SeekOrigin.Begin);
            }
        }
示例#14
0
 public ReadDictionary(DefaultPdfReaderFixture fixture)
 {
     this._pdf    = fixture.GetDefaultPdf();
     this._reader = fixture.GetDefaultPdfReader();
 }
示例#15
0
 public ReadNull(DefaultPdfReaderFixture fixture)
 {
     this._pdf    = fixture.GetDefaultPdf();
     this._reader = fixture.GetDefaultPdfReader();
 }
示例#16
0
        internal PdfStream ReadStream(IPdfStreamReader streamReader, IPdf pdf, PdfDictionary streamDictionary)
        {
            PdfNumber length      = null;
            var       lengthEntry = streamDictionary["Length"];

            if (lengthEntry == null)
            {
                throw new InvalidDataException("Unable to get required stream length. Entry not found.");
            }

            if (lengthEntry is PdfNumber)
            {
                length = lengthEntry as PdfNumber;
            }
            else if (lengthEntry is PdfReference reference)
            {
                //oh yay, we need to go dig through the pdf content for the correct value
                var referenceEntry = pdf.CrossReferenceTable.Find(reference.ObjectNumber, reference.Generation);

                lengthEntry = this.PeekReadObject(streamReader, pdf, referenceEntry);
                length      = lengthEntry as PdfNumber;
            }

            if (length == null)
            {
                throw new InvalidDataException("Unable to get required stream length. Value not found.");
            }
            var buffer = new byte[length];

            var firstDataBuffer = new byte[6];

            streamReader.Read(firstDataBuffer, 0, 6); //the word stream
            streamReader.Peek(firstDataBuffer, 0, 2); // the CR+LF or LF

            int seekLength;

            if (firstDataBuffer[0] == 0xD && firstDataBuffer[1] == 0xA)
            {
                seekLength = 2;
            }
            else if (firstDataBuffer[0] == 0xA)
            {
                seekLength = 1;
            }
            else
            {
                throw new InvalidDataException("Unexpected end of line characters, expected CR+LF or just LF");
            }

            streamReader.Seek(seekLength, SeekOrigin.Current);

            var bytesRead = streamReader.Read(buffer, 0, buffer.Length); //read the data

            if (bytesRead != buffer.Length)
            {
                throw new InvalidDataException("Unexpected end of file while reading the data stream");
            }

            streamReader.SeekToNextToken(true); //end of line at the end of the stream is ok.
            var endOfStreamToken = streamReader.ReadNextToken();

            if (endOfStreamToken != "endstream")
            {
                throw new InvalidDataException("Unexpected end of stream token, expected endstream");
            }

            var result = new PdfStream(streamDictionary, buffer);

            return(result);
        }
示例#17
0
 public ReadObjectAsync(DefaultPdfReaderFixture fixture)
 {
     this._pdf    = fixture.GetDefaultPdf();
     this._reader = fixture.GetDefaultPdfReader();
 }
示例#18
0
        public PdfObject ReadObject(IPdfStreamReader streamReader, IPdf pdf)
        {
            var tokenStart = streamReader.Peek();

            if (tokenStart < 0)
            {
                throw new InvalidDataException("Unexpected end of stream");
            }

            if (tokenStart == '<')
            {
                //binary string or a dictionary
                //dictionary starts with << so we'll check that.
                //otherwise we'll go on to a binary string.
                var buffer = new byte[2];
                var length = streamReader.Peek(buffer, 0, 2);
                if (length == 2 &&
                    buffer[0] == '<' &&
                    buffer[1] == '<')
                {
                    var result = this.ReadDictionary(streamReader, pdf);
                    return(result);
                }
                else
                {
                    //binary string
                    var result = this.ReadBinaryString(streamReader, pdf.Options);
                    return(result);
                }
            }
            else if (tokenStart == 't' ||
                     tokenStart == 'f')
            {
                //might be a bool, read the token, anything else is invalid
                var result = this.ReadBoolean(streamReader);
                return(result);
            }
            else if (tokenStart == '(')
            {
                //we're in a string
                var result = this.ReadString(streamReader);
                return(result);
            }
            else if (tokenStart == '/')
            {
                var result = this.ReadName(streamReader);
                return(result);
            }
            else if ((tokenStart >= '0' && tokenStart <= '9') ||
                     tokenStart == '+' ||
                     tokenStart == '-' ||
                     tokenStart == '.')
            {
                //we're in a number
                var number = this.ReadNumber(streamReader);

                //check for reference or object
                if (this.TryPeekReadNumber(streamReader, out var generation))
                {
                    var currentPosition = streamReader.Position;

                    this.ReadNumber(streamReader);
                    var objectType = streamReader.ReadNextToken();

                    // check for a reference
                    if (objectType == "R")
                    {
                        var result = new PdfReference((int)generation, (int)number);

                        return(result);
                    }

                    if (objectType == "obj")
                    {
                        //TODO: handle object types
                        var result = this.ReadIndirectObject(streamReader, pdf, (int)generation, number);

                        return(result);
                    }

                    streamReader.Seek(currentPosition, SeekOrigin.Begin);
                }

                return(number);
            }
            else if (tokenStart == '[')
            {
                var result = this.ReadArray(streamReader, pdf);

                return(result);
            }
            else if (tokenStart == '%')
            {
                var result = this.ReadComment(streamReader);
                return(result);
            }
            else if (tokenStart == 'n')
            {
                var token = streamReader.PeekNextToken(true);
                if (token == "null")
                {
                    streamReader.ReadNextToken();
                    return(new PdfNull());
                }
            }

            //TODO: invalid data, puke all over
            return(null);
        }
示例#19
0
 public MixturePdf(IPdf p0, IPdf p1)
 {
     P0 = p0;
     P1 = p1;
 }