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); }
/// <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."); }
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); } }
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); }
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); }
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); } }
public ReadDictionary(DefaultPdfReaderFixture fixture) { this._pdf = fixture.GetDefaultPdf(); this._reader = fixture.GetDefaultPdfReader(); }
public ReadNull(DefaultPdfReaderFixture fixture) { this._pdf = fixture.GetDefaultPdf(); this._reader = fixture.GetDefaultPdfReader(); }
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); }
public ReadObjectAsync(DefaultPdfReaderFixture fixture) { this._pdf = fixture.GetDefaultPdf(); this._reader = fixture.GetDefaultPdfReader(); }
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); }
public MixturePdf(IPdf p0, IPdf p1) { P0 = p0; P1 = p1; }