Esempio n. 1
0
void LineBreaker::skipLeadingWhitespace(InlineBidiResolver& resolver, LineInfo& lineInfo, LineWidth& width)
{
    while (!resolver.position().atEnd() && !requiresLineBox(resolver.position(), lineInfo, LeadingWhitespace)) {
        LineLayoutItem lineLayoutItem = resolver.position().getLineLayoutItem();
        if (lineLayoutItem.isOutOfFlowPositioned()) {
            setStaticPositions(m_block, LineLayoutBox(lineLayoutItem), width.indentText());
            if (lineLayoutItem.style()->isOriginalDisplayInlineType()) {
                resolver.runs().addRun(createRun(0, 1, LineLayoutItem(lineLayoutItem), resolver));
                lineInfo.incrementRunsFromLeadingWhitespace();
            }
        } else if (lineLayoutItem.isFloating()) {
            m_block.insertFloatingObject(LineLayoutBox(lineLayoutItem));
            m_block.positionNewFloats(&width);
        }
        resolver.position().increment(&resolver);
    }
    resolver.commitExplicitEmbedding(resolver.runs());
}
bool LineBoxList::rangeIntersectsRect(LineLayoutBoxModel layoutObject, LayoutUnit logicalTop, LayoutUnit logicalBottom, const CullRect& cullRect, const LayoutPoint& offset) const
{
    LineLayoutBox block;
    if (layoutObject.isBox())
        block = LineLayoutBox(layoutObject);
    else
        block = layoutObject.containingBlock();
    LayoutUnit physicalStart = block.flipForWritingMode(logicalTop);
    LayoutUnit physicalEnd = block.flipForWritingMode(logicalBottom);
    LayoutUnit physicalExtent = absoluteValue(physicalEnd - physicalStart);
    physicalStart = std::min(physicalStart, physicalEnd);

    if (layoutObject.style()->isHorizontalWritingMode()) {
        physicalStart += offset.y();
        return cullRect.intersectsVerticalRange(physicalStart, physicalStart + physicalExtent);
    } else {
        physicalStart += offset.x();
        return cullRect.intersectsHorizontalRange(physicalStart, physicalStart + physicalExtent);
    }
}