private void UpdateParagraphItemization(int firstParagraphToItemize) { currentLayoutRightToLeft = desiredLayoutRightToLeft; // Remove cached script paragraphs. They will be reitemized on demand. scriptParagraphCache.RemoveScriptParagraphsStartingFrom(firstParagraphToItemize); // Create embedded object hosts. Paragraph* paragraphZero = document.GetParagraphZero(); Paragraph* startParagraph = paragraphZero + firstParagraphToItemize; Paragraph* endParagraph = paragraphZero + document.ParagraphCount; Run* runZero = document.GetRunZero(); for (Paragraph* paragraph = startParagraph; paragraph != endParagraph; paragraph++) { Run* startRun = runZero + paragraph->RunIndex; Run* endRun = startRun + paragraph->RunCount; int charIndex = paragraph->CharIndex; for (Run* run = startRun; run != endRun; run++) { switch (run->RunKind) { case RunKind.Object: { EmbeddedObjectHost embeddedObjectHost; if (!embeddedObjectHosts.TryGetValue(charIndex, out embeddedObjectHost)) { EmbeddedObject embeddedObject = document.LookupObject(run->ObjectIndex); embeddedObjectHost = new EmbeddedObjectHost(embeddedObject, charIndex, parentControl, document.LookupStyle(startRun->StyleIndex), document.LookupStyle(run->StyleIndex)); embeddedObjectHosts.Add(charIndex, embeddedObjectHost); pendingEmbeddedObjectHostsToCreate.Enqueue(embeddedObjectHost); } break; } default: break; } charIndex += run->CharCount; } } }
private Rectangle GetDrawingBoundsOfEmbeddedObject(EmbeddedObjectHost embeddedObjectHost, Point layoutOrigin) { Rectangle embeddedObjectHostLayoutBounds = embeddedObjectHost.LayoutBounds; int x = currentLayoutRightToLeft ? currentLayoutWidth - embeddedObjectHostLayoutBounds.Right + layoutOrigin.X : embeddedObjectHostLayoutBounds.X + layoutOrigin.X; int y = embeddedObjectHostLayoutBounds.Y + layoutOrigin.Y; return new Rectangle(x, y, embeddedObjectHostLayoutBounds.Width, embeddedObjectHostLayoutBounds.Height); }