LayoutRect RenderBoxModelObject::localCaretRectForEmptyElement(LayoutUnit width, LayoutUnit textIndentOffset) { ASSERT(!slowFirstChild()); // FIXME: This does not take into account either :first-line or :first-letter // However, as soon as some content is entered, the line boxes will be // constructed and this kludge is not called any more. So only the caret size // of an empty :first-line'd block is wrong. I think we can live with that. RenderStyle* currentStyle = firstLineStyle(); enum CaretAlignment { alignLeft, alignRight, alignCenter }; CaretAlignment alignment = alignLeft; switch (currentStyle->textAlign()) { case LEFT: case WEBKIT_LEFT: break; case CENTER: case WEBKIT_CENTER: alignment = alignCenter; break; case RIGHT: case WEBKIT_RIGHT: alignment = alignRight; break; case JUSTIFY: case TASTART: if (!currentStyle->isLeftToRightDirection()) alignment = alignRight; break; case TAEND: if (currentStyle->isLeftToRightDirection()) alignment = alignRight; break; } LayoutUnit x = borderLeft() + paddingLeft(); LayoutUnit maxX = width - borderRight() - paddingRight(); switch (alignment) { case alignLeft: if (currentStyle->isLeftToRightDirection()) x += textIndentOffset; break; case alignCenter: x = (x + maxX) / 2; if (currentStyle->isLeftToRightDirection()) x += textIndentOffset / 2; else x -= textIndentOffset / 2; break; case alignRight: x = maxX - caretWidth; if (!currentStyle->isLeftToRightDirection()) x -= textIndentOffset; break; } x = std::min(x, std::max<LayoutUnit>(maxX - caretWidth, 0)); LayoutUnit height = style()->fontMetrics().height(); LayoutUnit verticalSpace = lineHeight(true, currentStyle->isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes) - height; LayoutUnit y = paddingTop() + borderTop() + (verticalSpace / 2); return currentStyle->isHorizontalWritingMode() ? LayoutRect(x, y, caretWidth, height) : LayoutRect(y, x, height, caretWidth); }
int RenderLineBreak::baselinePosition(FontBaseline baselineType, bool firstLine, LineDirectionMode direction, LinePositionMode linePositionMode) const { const RenderStyle& style = firstLine ? firstLineStyle() : this->style(); const FontMetrics& fontMetrics = style.fontMetrics(); return fontMetrics.ascent(baselineType) + (lineHeight(firstLine, direction, linePositionMode) - fontMetrics.height()) / 2; }