/// <summary> /// Applies vertical alignment to the linebox /// </summary> /// <param name="g"></param> /// <param name="lineBox"></param> private static void ApplyVerticalAlignment(Graphics g, CssLineBox lineBox) { bool isTableCell = lineBox.OwnerBox.Display == CssConstants.TableCell; float baseline = lineBox.GetMaxWordBottom() - GetDescent(lineBox.OwnerBox.ActualFont) - 2; List <CssBox> boxes = new List <CssBox>(lineBox.Rectangles.Keys); foreach (CssBox b in boxes) { float ascent = GetAscent(b.ActualFont); float descent = GetDescent(b.ActualFont); //Important notes on http://www.w3.org/TR/CSS21/tables.html#height-layout switch (b.VerticalAlign) { case CssConstants.Sub: lineBox.SetBaseLine(g, b, baseline + lineBox.Rectangles[b].Height * .2f); break; case CssConstants.Super: lineBox.SetBaseLine(g, b, baseline - lineBox.Rectangles[b].Height * .2f); break; case CssConstants.TextTop: break; case CssConstants.TextBottom: break; case CssConstants.Top: break; case CssConstants.Bottom: break; case CssConstants.Middle: break; default: //case: baseline lineBox.SetBaseLine(g, b, baseline); break; } ////Graphic cues //g.FillRectangle(Brushes.Aqua, r.Left, r.Top, r.Width, ascent); //g.FillRectangle(Brushes.Yellow, r.Left, r.Top + ascent, r.Width, descent); //g.DrawLine(Pens.Fuchsia, r.Left, baseline, r.Right, baseline); } }
private static void ApplyVerticalAlignment(Graphics g, CssLineBox lineBox) { float maxWordBottom = lineBox.GetMaxWordBottom() - CssLayoutEngine.GetDescent(lineBox.OwnerBox.ActualFont) - 2f; foreach (CssBox cssBox in new List <CssBox>(lineBox.Rectangles.Keys)) { CssLayoutEngine.GetAscent(cssBox.ActualFont); CssLayoutEngine.GetDescent(cssBox.ActualFont); string verticalAlign = cssBox.VerticalAlign; string str = verticalAlign; if (verticalAlign != null) { switch (str) { case "sub": { RectangleF item = lineBox.Rectangles[cssBox]; lineBox.SetBaseLine(g, cssBox, maxWordBottom + item.Height * 0.2f); continue; } case "super": { RectangleF rectangleF = lineBox.Rectangles[cssBox]; lineBox.SetBaseLine(g, cssBox, maxWordBottom - rectangleF.Height * 0.2f); continue; } case "text-top": case "text-bottom": case "top": case "bottom": case "middle": { continue; } } } lineBox.SetBaseLine(g, cssBox, maxWordBottom); } }
/// <summary> /// Applies vertical alignment to the linebox /// </summary> /// <param name="g"></param> /// <param name="lineBox"></param> private static void ApplyVerticalAlignment(Graphics g, CssLineBox lineBox) { bool isTableCell = lineBox.OwnerBox.Display == CssConstants.TableCell; float baseline = lineBox.GetMaxWordBottom() - GetDescent(lineBox.OwnerBox.ActualFont) - 2; List<CssBox> boxes = new List<CssBox>(lineBox.Rectangles.Keys); foreach (CssBox b in boxes) { float ascent = GetAscent(b.ActualFont); float descent = GetDescent(b.ActualFont); //Important notes on http://www.w3.org/TR/CSS21/tables.html#height-layout switch (b.VerticalAlign) { case CssConstants.Sub: lineBox.SetBaseLine(g, b, baseline + lineBox.Rectangles[b].Height * .2f); break; case CssConstants.Super: lineBox.SetBaseLine(g, b, baseline - lineBox.Rectangles[b].Height * .2f); break; case CssConstants.TextTop: break; case CssConstants.TextBottom: break; case CssConstants.Top: break; case CssConstants.Bottom: break; case CssConstants.Middle: break; default: //case: baseline lineBox.SetBaseLine(g, b, baseline); break; } ////Graphic cues //g.FillRectangle(Brushes.Aqua, r.Left, r.Top, r.Width, ascent); //g.FillRectangle(Brushes.Yellow, r.Left, r.Top + ascent, r.Width, descent); //g.DrawLine(Pens.Fuchsia, r.Left, baseline, r.Right, baseline); } }