void MultiColumnFragmentainerGroup::columnIntervalForVisualRect( const LayoutRect& rect, unsigned& firstColumn, unsigned& lastColumn) const { bool isColumnProgressionInline = m_columnSet.multiColumnFlowThread()->progressionIsInline(); bool isFlippedColumnProgression = !m_columnSet.style()->isLeftToRightDirection() && isColumnProgressionInline; if (m_columnSet.isHorizontalWritingMode() == isColumnProgressionInline) { if (isFlippedColumnProgression) { firstColumn = columnIndexAtVisualPoint(rect.maxXMinYCorner()); lastColumn = columnIndexAtVisualPoint(rect.minXMinYCorner()); } else { firstColumn = columnIndexAtVisualPoint(rect.minXMinYCorner()); lastColumn = columnIndexAtVisualPoint(rect.maxXMinYCorner()); } } else { if (isFlippedColumnProgression) { firstColumn = columnIndexAtVisualPoint(rect.minXMaxYCorner()); lastColumn = columnIndexAtVisualPoint(rect.minXMinYCorner()); } else { firstColumn = columnIndexAtVisualPoint(rect.minXMinYCorner()); lastColumn = columnIndexAtVisualPoint(rect.minXMaxYCorner()); } } ASSERT(firstColumn <= lastColumn); }
FloatRect encloseRectToDevicePixels(const LayoutRect& rect, float pixelSnappingFactor) { FloatPoint location = floorPointToDevicePixels(rect.minXMinYCorner(), pixelSnappingFactor); FloatPoint maxPoint = ceilPointToDevicePixels(rect.maxXMaxYCorner(), pixelSnappingFactor); return FloatRect(location, maxPoint - location); }
IntRect enclosingIntRect(const LayoutRect& rect) { IntPoint location = flooredIntPoint(rect.minXMinYCorner()); IntPoint maxPoint = ceiledIntPoint(rect.maxXMaxYCorner()); return IntRect(location, maxPoint - location); }
IntRect enclosingIntRect(const LayoutRect& rect) { // Empty rects with fractional x, y values turn into non-empty rects when converting to enclosing. // We need to ensure that empty rects stay empty after the conversion, because the selection code expects them to be empty. IntPoint location = flooredIntPoint(rect.minXMinYCorner()); IntPoint maxPoint = IntPoint(rect.width() ? rect.maxX().ceil() : location.x(), rect.height() ? rect.maxY().ceil() : location.y()); return IntRect(location, maxPoint - location); }
static LayoutPoint cornerPointOfRect(LayoutRect rect, Corner whichCorner) { switch (whichCorner) { case Corner::TopLeft: return rect.minXMinYCorner(); case Corner::TopRight: return rect.maxXMinYCorner(); } ASSERT_NOT_REACHED(); return LayoutPoint(); }
void RenderMathMLOperator::paint(PaintInfo& info, const LayoutPoint& paintOffset) { RenderMathMLBlock::paint(info, paintOffset); if (info.context->paintingDisabled() || info.phase != PaintPhaseForeground) return; if (!m_isStretched && !m_stretchyCharacter) { RenderMathMLBlock::paint(info, paintOffset); return; } GraphicsContextStateSaver stateSaver(*info.context); info.context->setFillColor(style()->visitedDependentColor(CSSPropertyColor), style()->colorSpace()); ASSERT(m_stretchyCharacter->topGlyph); ASSERT(m_stretchyCharacter->bottomGlyph); // We are positioning the glyphs so that the edge of the tight glyph bounds line up exactly with the edges of our paint box. LayoutPoint operatorTopLeft = ceiledIntPoint(paintOffset + location()); FloatRect topGlyphBounds = glyphBoundsForCharacter(m_stretchyCharacter->topGlyph); LayoutPoint topGlyphOrigin(operatorTopLeft.x(), operatorTopLeft.y() - topGlyphBounds.y()); LayoutRect topGlyphPaintRect = paintCharacter(info, m_stretchyCharacter->topGlyph, topGlyphOrigin, TrimBottom); FloatRect bottomGlyphBounds = glyphBoundsForCharacter(m_stretchyCharacter->bottomGlyph); LayoutPoint bottomGlyphOrigin(operatorTopLeft.x(), operatorTopLeft.y() + offsetHeight() - (bottomGlyphBounds.height() + bottomGlyphBounds.y())); LayoutRect bottomGlyphPaintRect = paintCharacter(info, m_stretchyCharacter->bottomGlyph, bottomGlyphOrigin, TrimTop); if (m_stretchyCharacter->middleGlyph) { // Center the glyph origin between the start and end glyph paint extents. Then shift it half the paint height toward the bottom glyph. FloatRect middleGlyphBounds = glyphBoundsForCharacter(m_stretchyCharacter->middleGlyph); LayoutPoint middleGlyphOrigin(operatorTopLeft.x(), topGlyphOrigin.y() + y()); middleGlyphOrigin.moveBy(LayoutPoint(0, (bottomGlyphPaintRect.y() - topGlyphPaintRect.maxY()) / 2.0)); middleGlyphOrigin.moveBy(LayoutPoint(0, middleGlyphBounds.height() / 2.0)); LayoutRect middleGlyphPaintRect = paintCharacter(info, m_stretchyCharacter->middleGlyph, middleGlyphOrigin, TrimTopAndBottom); fillWithExtensionGlyph(info, topGlyphPaintRect.minXMaxYCorner(), middleGlyphPaintRect.minXMinYCorner()); fillWithExtensionGlyph(info, middleGlyphPaintRect.minXMaxYCorner(), bottomGlyphPaintRect.minXMinYCorner()); } else fillWithExtensionGlyph(info, topGlyphPaintRect.minXMaxYCorner(), bottomGlyphPaintRect.minXMinYCorner()); }
void RenderedPosition::positionInGraphicsLayerBacking(CompositedSelectionBound& bound) const { bound.layer = nullptr; bound.edgeTopInLayer = bound.edgeBottomInLayer = FloatPoint(); if (isNull()) return; LayoutRect rect = m_layoutObject->localCaretRect(m_inlineBox, m_offset); PaintLayer* layer = nullptr; bound.edgeTopInLayer = m_layoutObject->localToInvalidationBackingPoint(rect.minXMinYCorner(), &layer); bound.edgeBottomInLayer = m_layoutObject->localToInvalidationBackingPoint(rect.minXMaxYCorner(), nullptr); bound.layer = layer ? layer->graphicsLayerBacking() : nullptr; }