/** * <summary>Shows the specified external object.</summary> * <param name="xObject">External object.</param> * <param name="size">Size of the external object.</param> * <param name="lineAlignment">Line alignment. It can be: * <list type="bullet"> * <item><see cref="LineAlignmentEnum"/></item> * <item><see cref="Length">: arbitrary super-/sub-script, depending on whether the value is * positive or not.</item> * </list> * </param> * <returns>Whether the external object was successfully shown.</returns> */ public bool ShowXObject( xObjects::XObject xObject, SizeF?size, object lineAlignment ) { if (xObject == null || !EnsureRow(true)) { return(false); } if (!size.HasValue) { size = xObject.Size; } lineAlignment = ResolveLineAlignment(lineAlignment); while (true) { if (OperationUtils.Compare(currentRow.Y + size.Value.Height, frame.Height) == 1) // Object's height exceeds block's remaining vertical space. { // Terminate current row and exit! EndRow(false); return(false); } else if (OperationUtils.Compare(currentRow.Width + size.Value.Width, frame.Width) < 1) // There's room for the object in the current row. { PointF location = new PointF( (float)currentRow.Width, (float)currentRow.Y ); RowObject obj; { obj = new RowObject( RowObject.TypeEnum.XObject, baseComposer.BeginLocalState(), // Opens the row object's local state. size.Value.Height, size.Value.Width, 0, lineAlignment, size.Value.Height, 0, 0 ); baseComposer.ShowXObject(xObject, location, size); baseComposer.End(); // Closes the row object's local state. } AddRowObject(obj, lineAlignment); return(true); } else // There's NOT enough room for the object in the current row. { // Go to next row! EndRow(false); BeginRow(); } } }
/** * <summary>Shows text.</summary> * <param name="text">Text to show.</param> * <param name="lineAlignment">Line alignment. It can be: * <list type="bullet"> * <item><see cref="LineAlignmentEnum"/></item> * <item><see cref="Length">: arbitrary super-/sub-script, depending on whether the value is * positive or not.</item> * </list> * </param> * <returns>Last shown character index.</returns> */ public int ShowText( string text, object lineAlignment ) { if (currentRow == null || text == null) { return(0); } ContentScanner.GraphicsState state = baseComposer.State; fonts::Font font = state.Font; double fontSize = state.FontSize; double lineHeight = font.GetLineHeight(fontSize); double baseLine = font.GetAscent(fontSize); lineAlignment = ResolveLineAlignment(lineAlignment); TextFitter textFitter = new TextFitter( text, 0, font, fontSize, hyphenation, hyphenationCharacter ); int textLength = text.Length; int index = 0; while (true) { if (currentRow.Width == 0) // Current row has just begun. { // Removing leading space... while (true) { if (index == textLength) // Text end reached. { goto endTextShowing; } else if (text[index] != ' ') // No more leading spaces. { break; } index++; } } if (OperationUtils.Compare(currentRow.Y + lineHeight, frame.Height) == 1) // Text's height exceeds block's remaining vertical space. { // Terminate the current row and exit! EndRow(false); goto endTextShowing; } // Does the text fit? if (textFitter.Fit( index, frame.Width - currentRow.Width, // Remaining row width. currentRow.SpaceCount == 0 )) { // Get the fitting text! string textChunk = textFitter.FittedText; double textChunkWidth = textFitter.FittedWidth; PointF textChunkLocation = new PointF( (float)currentRow.Width, (float)currentRow.Y ); // Insert the fitting text! RowObject obj; { obj = new RowObject( RowObject.TypeEnum.Text, baseComposer.BeginLocalState(), // Opens the row object's local state. lineHeight, textChunkWidth, CountOccurrence(' ', textChunk), lineAlignment, baseLine ); baseComposer.ShowText(textChunk, textChunkLocation); baseComposer.End(); // Closes the row object's local state. } AddRowObject(obj, lineAlignment); index = textFitter.EndIndex; } // Evaluating trailing text... while (true) { if (index == textLength) // Text end reached. { goto endTextShowing; } switch (text[index]) { case '\r': break; case '\n': // New paragraph! index++; ShowBreak(); goto endTrailParsing; default: // New row (within the same paragraph)! EndRow(false); BeginRow(); goto endTrailParsing; } index++; } endTrailParsing :; } endTextShowing :; if (index >= 0 && lineAlignment.Equals(LineAlignmentEnum.BaseLine)) { lastFontSize = fontSize; } return(index); }