public static void CreateLineBoxes(Graphics g, CssBox blockBox) { blockBox.LineBoxes.Clear(); float actualRight = blockBox.ActualRight - blockBox.ActualPaddingRight - blockBox.ActualBorderRightWidth; PointF location = blockBox.Location; float x = location.X + blockBox.ActualPaddingLeft - 0f + blockBox.ActualBorderLeftWidth; PointF pointF = blockBox.Location; float y = pointF.Y + blockBox.ActualPaddingTop - 0f + blockBox.ActualBorderTopWidth; float actualTextIndent = x + blockBox.ActualTextIndent; float single = y; float single1 = y; float single2 = 0f; CssLineBox cssLineBox = new CssLineBox(blockBox); CssLayoutEngine.FlowBox(g, blockBox, blockBox, actualRight, single2, x, ref cssLineBox, ref actualTextIndent, ref single, ref single1); foreach (CssLineBox lineBox in blockBox.LineBoxes) { CssLayoutEngine.BubbleRectangles(blockBox, lineBox); lineBox.AssignRectanglesToBoxes(); CssLayoutEngine.ApplyAlignment(g, lineBox); if (blockBox.Direction != "rtl") { continue; } CssLayoutEngine.ApplyRightToLeft(lineBox); } blockBox.ActualBottom = single1 + blockBox.ActualPaddingBottom + blockBox.ActualBorderBottomWidth; }
private static void FlowBox(Graphics g, CssBox blockbox, CssBox box, float maxright, float linespacing, float startx, ref CssLineBox line, ref float curx, ref float cury, ref float maxbottom) { box.FirstHostingLineBox = line; foreach (CssBox cssBox in box.Boxes) { float actualMarginLeft = cssBox.ActualMarginLeft + cssBox.ActualBorderLeftWidth + cssBox.ActualPaddingLeft; float actualMarginRight = cssBox.ActualMarginRight + cssBox.ActualBorderRightWidth + cssBox.ActualPaddingRight; float actualBorderTopWidth = cssBox.ActualBorderTopWidth; float actualPaddingTop = cssBox.ActualPaddingTop; float actualBorderBottomWidth = cssBox.ActualBorderBottomWidth; float single = cssBox.ActualPaddingTop; cssBox.RectanglesReset(); cssBox.MeasureWordsSize(g); curx = curx + actualMarginLeft; if (cssBox.Words.Count <= 0) { CssLayoutEngine.FlowBox(g, blockbox, cssBox, maxright, linespacing, startx, ref line, ref curx, ref cury, ref maxbottom); } else { foreach (CssBoxWord word in cssBox.Words) { if (cssBox.WhiteSpace != "nowrap" && curx + word.Width + actualMarginRight > maxright || word.IsLineBreak) { curx = startx; cury = maxbottom + linespacing; line = new CssLineBox(blockbox); if (word.IsImage || word.Equals(cssBox.FirstWord)) { curx = curx + actualMarginLeft; } } line.ReportExistanceOf(word); word.Left = curx; word.Top = cury; curx = word.Right; maxbottom = Math.Max(maxbottom, word.Bottom); CssLayoutEngine._lastTreatedWord = word; } } curx = curx + actualMarginRight; } box.LastHostingLineBox = line; }