本文整理汇总了C++中LayoutUnit类的典型用法代码示例。如果您正苦于以下问题:C++ LayoutUnit类的具体用法?C++ LayoutUnit怎么用?C++ LayoutUnit使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了LayoutUnit类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: roundedMinimumValueForLength
void BackgroundImageGeometry::setRepeatY(const FillLayer& fillLayer,
LayoutUnit unsnappedTileHeight,
LayoutUnit snappedAvailableHeight,
LayoutUnit unsnappedAvailableHeight,
LayoutUnit extraOffset) {
// We would like to identify the phase as a fraction of the image size in the
// absence of snapping, then re-apply it to the snapped values. This is to
// handle large positions.
if (unsnappedTileHeight) {
LayoutUnit computedYPosition = roundedMinimumValueForLength(
fillLayer.yPosition(), unsnappedAvailableHeight);
if (fillLayer.backgroundYOrigin() == BottomEdge) {
float numberOfTilesInPosition =
(snappedAvailableHeight - computedYPosition + extraOffset).toFloat() /
unsnappedTileHeight.toFloat();
float fractionalPositionWithinTile =
numberOfTilesInPosition - truncf(numberOfTilesInPosition);
setPhaseY(LayoutUnit(
roundf(fractionalPositionWithinTile * tileSize().height())));
} else {
float numberOfTilesInPosition =
(computedYPosition + extraOffset).toFloat() /
unsnappedTileHeight.toFloat();
float fractionalPositionWithinTile =
1.0f - (numberOfTilesInPosition - truncf(numberOfTilesInPosition));
setPhaseY(LayoutUnit(
roundf(fractionalPositionWithinTile * tileSize().height())));
}
} else {
setPhaseY(LayoutUnit());
}
setSpaceSize(LayoutSize(spaceSize().width(), LayoutUnit()));
}
示例2: getExcludedInterval
LineSegment PolygonShape::getExcludedInterval(LayoutUnit logicalTop, LayoutUnit logicalHeight) const
{
float y1 = logicalTop.toFloat();
float y2 = logicalTop.toFloat() + logicalHeight.toFloat();
if (m_polygon.isEmpty() || !overlapsYRange(m_polygon.boundingBox(), y1 - shapeMargin(), y2 + shapeMargin()))
return LineSegment();
Vector<const FloatPolygonEdge*> overlappingEdges;
if (!m_polygon.overlappingEdges(y1 - shapeMargin(), y2 + shapeMargin(), overlappingEdges))
return LineSegment();
FloatShapeInterval excludedInterval;
for (unsigned i = 0; i < overlappingEdges.size(); i++) {
const FloatPolygonEdge& edge = *(overlappingEdges[i]);
if (edge.maxY() == edge.minY())
continue;
if (!shapeMargin()) {
excludedInterval.unite(OffsetPolygonEdge(edge, FloatSize()).clippedEdgeXRange(y1, y2));
} else {
excludedInterval.unite(OffsetPolygonEdge(edge, outwardEdgeNormal(edge) * shapeMargin()).clippedEdgeXRange(y1, y2));
excludedInterval.unite(OffsetPolygonEdge(edge, inwardEdgeNormal(edge) * shapeMargin()).clippedEdgeXRange(y1, y2));
excludedInterval.unite(clippedCircleXRange(edge.vertex1(), shapeMargin(), y1, y2));
}
}
if (excludedInterval.isEmpty())
return LineSegment();
return LineSegment(excludedInterval.x1(), excludedInterval.x2());
}
示例3: ASSERT
Vector<double> SnapCoordinator::snapOffsets(const ContainerNode& element,
ScrollbarOrientation orientation) {
const ComputedStyle* style = element.computedStyle();
const LayoutBox* snapContainer = element.layoutBox();
ASSERT(style);
ASSERT(snapContainer);
Vector<double> result;
if (style->getScrollSnapType() == ScrollSnapTypeNone)
return result;
const ScrollSnapPoints& snapPoints = (orientation == HorizontalScrollbar)
? style->scrollSnapPointsX()
: style->scrollSnapPointsY();
LayoutUnit clientSize = (orientation == HorizontalScrollbar)
? snapContainer->clientWidth()
: snapContainer->clientHeight();
LayoutUnit scrollSize = (orientation == HorizontalScrollbar)
? snapContainer->scrollWidth()
: snapContainer->scrollHeight();
if (snapPoints.hasRepeat) {
LayoutUnit repeat = valueForLength(snapPoints.repeatOffset, clientSize);
// calc() values may be negative or zero in which case we clamp them to 1px.
// See: https://lists.w3.org/Archives/Public/www-style/2015Jul/0075.html
repeat = std::max<LayoutUnit>(repeat, LayoutUnit(1));
for (LayoutUnit offset = repeat; offset <= (scrollSize - clientSize);
offset += repeat) {
result.append(offset.toFloat());
}
}
// Compute element-based snap points by mapping the snap coordinates from
// snap areas to snap container.
bool didAddSnapAreaOffset = false;
if (SnapAreaSet* snapAreas = snapContainer->snapAreas()) {
for (auto& snapArea : *snapAreas) {
Vector<FloatPoint> snapCoordinates =
localToContainerSnapCoordinates(*snapContainer, *snapArea);
for (const FloatPoint& snapCoordinate : snapCoordinates) {
float snapOffset = (orientation == HorizontalScrollbar)
? snapCoordinate.x()
: snapCoordinate.y();
if (snapOffset > scrollSize - clientSize)
continue;
result.append(snapOffset);
didAddSnapAreaOffset = true;
}
}
}
if (didAddSnapAreaOffset)
std::sort(result.begin(), result.end());
return result;
}
示例4: enclosingIntRect
void FileUploadControlPainter::paintObject(const PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
if (m_layoutFileUploadControl.style()->visibility() != VISIBLE)
return;
// Push a clip.
Optional<ClipRecorder> clipRecorder;
if (paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPhaseDescendantBlockBackgroundsOnly) {
IntRect clipRect = enclosingIntRect(LayoutRect(
LayoutPoint(paintOffset.x() + m_layoutFileUploadControl.borderLeft(), paintOffset.y() + m_layoutFileUploadControl.borderTop()),
m_layoutFileUploadControl.size() + LayoutSize(0, -m_layoutFileUploadControl.borderWidth() + buttonShadowHeight)));
if (clipRect.isEmpty())
return;
clipRecorder.emplace(paintInfo.context, m_layoutFileUploadControl, DisplayItem::ClipFileUploadControlRect, clipRect);
}
if (paintInfo.phase == PaintPhaseForeground && !LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(paintInfo.context, m_layoutFileUploadControl, paintInfo.phase)) {
const String& displayedFilename = m_layoutFileUploadControl.fileTextValue();
const Font& font = m_layoutFileUploadControl.style()->font();
TextRun textRun = constructTextRun(font, displayedFilename, m_layoutFileUploadControl.styleRef(), RespectDirection | RespectDirectionOverride);
textRun.setExpansionBehavior(TextRun::AllowTrailingExpansion);
// Determine where the filename should be placed
LayoutUnit contentLeft = paintOffset.x() + m_layoutFileUploadControl.borderLeft() + m_layoutFileUploadControl.paddingLeft();
Node* button = m_layoutFileUploadControl.uploadButton();
if (!button)
return;
int buttonWidth = (button && button->layoutBox()) ? button->layoutBox()->pixelSnappedWidth() : 0;
LayoutUnit buttonAndSpacingWidth(buttonWidth + LayoutFileUploadControl::afterButtonSpacing);
float textWidth = font.width(textRun);
LayoutUnit textX;
if (m_layoutFileUploadControl.style()->isLeftToRightDirection())
textX = contentLeft + buttonAndSpacingWidth;
else
textX = LayoutUnit(contentLeft + m_layoutFileUploadControl.contentWidth() - buttonAndSpacingWidth - textWidth);
LayoutUnit textY;
// We want to match the button's baseline
// FIXME: Make this work with transforms.
if (LayoutButton* buttonLayoutObject = toLayoutButton(button->layoutObject()))
textY = paintOffset.y() + m_layoutFileUploadControl.borderTop() + m_layoutFileUploadControl.paddingTop() + buttonLayoutObject->baselinePosition(AlphabeticBaseline, true, HorizontalLine, PositionOnContainingLine);
else
textY = LayoutUnit(m_layoutFileUploadControl.baselinePosition(AlphabeticBaseline, true, HorizontalLine, PositionOnContainingLine));
TextRunPaintInfo textRunPaintInfo(textRun);
// FIXME: Shouldn't these offsets be rounded? crbug.com/350474
textRunPaintInfo.bounds = FloatRect(textX.toFloat(), textY.toFloat() - m_layoutFileUploadControl.style()->getFontMetrics().ascent(),
textWidth, m_layoutFileUploadControl.style()->getFontMetrics().height());
// Draw the filename.
LayoutObjectDrawingRecorder recorder(paintInfo.context, m_layoutFileUploadControl, paintInfo.phase, textRunPaintInfo.bounds);
paintInfo.context.setFillColor(m_layoutFileUploadControl.resolveColor(CSSPropertyColor));
paintInfo.context.drawBidiText(font, textRunPaintInfo, FloatPoint(roundToInt(textX), roundToInt(textY)));
}
// Paint the children.
m_layoutFileUploadControl.LayoutBlockFlow::paintObject(paintInfo, paintOffset);
}
示例5: stateSaver
void FileUploadControlPainter::paintObject(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
if (m_renderFileUploadControl.style()->visibility() != VISIBLE)
return;
// Push a clip.
GraphicsContextStateSaver stateSaver(*paintInfo.context, false);
if (paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPhaseChildBlockBackgrounds) {
IntRect clipRect = enclosingIntRect(LayoutRect(paintOffset.x() + m_renderFileUploadControl.borderLeft(), paintOffset.y() + m_renderFileUploadControl.borderTop(),
m_renderFileUploadControl.width() - m_renderFileUploadControl.borderLeft() - m_renderFileUploadControl.borderRight(),
m_renderFileUploadControl.height() - m_renderFileUploadControl.borderBottom() - m_renderFileUploadControl.borderTop() + buttonShadowHeight));
if (clipRect.isEmpty())
return;
stateSaver.save();
paintInfo.context->clip(clipRect);
}
if (paintInfo.phase == PaintPhaseForeground) {
const String& displayedFilename = m_renderFileUploadControl.fileTextValue();
const Font& font = m_renderFileUploadControl.style()->font();
TextRun textRun = constructTextRun(&m_renderFileUploadControl, font, displayedFilename, m_renderFileUploadControl.style(), TextRun::AllowTrailingExpansion, RespectDirection | RespectDirectionOverride);
// Determine where the filename should be placed
LayoutUnit contentLeft = paintOffset.x() + m_renderFileUploadControl.borderLeft() + m_renderFileUploadControl.paddingLeft();
Node* button = m_renderFileUploadControl.uploadButton();
if (!button)
return;
int buttonWidth = (button && button->renderBox()) ? button->renderBox()->pixelSnappedWidth() : 0;
LayoutUnit buttonAndSpacingWidth = buttonWidth + RenderFileUploadControl::afterButtonSpacing;
float textWidth = font.width(textRun);
LayoutUnit textX;
if (m_renderFileUploadControl.style()->isLeftToRightDirection())
textX = contentLeft + buttonAndSpacingWidth;
else
textX = contentLeft + m_renderFileUploadControl.contentWidth() - buttonAndSpacingWidth - textWidth;
LayoutUnit textY = 0;
// We want to match the button's baseline
// FIXME: Make this work with transforms.
if (RenderButton* buttonRenderer = toRenderButton(button->renderer()))
textY = paintOffset.y() + m_renderFileUploadControl.borderTop() + m_renderFileUploadControl.paddingTop() + buttonRenderer->baselinePosition(AlphabeticBaseline, true, HorizontalLine, PositionOnContainingLine);
else
textY = m_renderFileUploadControl.baselinePosition(AlphabeticBaseline, true, HorizontalLine, PositionOnContainingLine);
TextRunPaintInfo textRunPaintInfo(textRun);
// FIXME: Shouldn't these offsets be rounded? crbug.com/350474
textRunPaintInfo.bounds = FloatRect(textX.toFloat(), textY.toFloat() - m_renderFileUploadControl.style()->fontMetrics().ascent(),
textWidth, m_renderFileUploadControl.style()->fontMetrics().height());
paintInfo.context->setFillColor(m_renderFileUploadControl.resolveColor(CSSPropertyColor));
// Draw the filename
paintInfo.context->drawBidiText(font, textRunPaintInfo, IntPoint(roundToInt(textX), roundToInt(textY)));
}
// Paint the children.
m_renderFileUploadControl.RenderBlockFlow::paintObject(paintInfo, paintOffset);
}
示例6: updateTooltip
void KeyboardApplet::updateTooltip()
{
LayoutUnit layoutUnit = X11Helper::getCurrentLayout();
if( layoutUnit.isEmpty() )
return;
const QIcon icon(getFlag(layoutUnit.layout));
Plasma::ToolTipContent data(name(), flags.getLongText(layoutUnit, rules), icon);
Plasma::ToolTipManager::self()->setContent(this, data);
}
示例7: Path
Path HTMLAreaElement::getRegion(const LayoutSize& size) const
{
if (m_coords.isEmpty() && m_shape != Default)
return Path();
LayoutUnit width = size.width();
LayoutUnit height = size.height();
// If element omits the shape attribute, select shape based on number of coordinates.
Shape shape = m_shape;
if (shape == Unknown) {
if (m_coords.size() == 3)
shape = Circle;
else if (m_coords.size() == 4)
shape = Rect;
else if (m_coords.size() >= 6)
shape = Poly;
}
Path path;
switch (shape) {
case Poly:
if (m_coords.size() >= 6) {
int numPoints = m_coords.size() / 2;
path.moveTo(FloatPoint(minimumValueForLength(m_coords[0], width).toFloat(), minimumValueForLength(m_coords[1], height).toFloat()));
for (int i = 1; i < numPoints; ++i)
path.addLineTo(FloatPoint(minimumValueForLength(m_coords[i * 2], width).toFloat(), minimumValueForLength(m_coords[i * 2 + 1], height).toFloat()));
path.closeSubpath();
}
break;
case Circle:
if (m_coords.size() >= 3) {
Length radius = m_coords[2];
float r = std::min(minimumValueForLength(radius, width).toFloat(), minimumValueForLength(radius, height).toFloat());
path.addEllipse(FloatRect(minimumValueForLength(m_coords[0], width).toFloat() - r, minimumValueForLength(m_coords[1], height).toFloat() - r, 2 * r, 2 * r));
}
break;
case Rect:
if (m_coords.size() >= 4) {
float x0 = minimumValueForLength(m_coords[0], width).toFloat();
float y0 = minimumValueForLength(m_coords[1], height).toFloat();
float x1 = minimumValueForLength(m_coords[2], width).toFloat();
float y1 = minimumValueForLength(m_coords[3], height).toFloat();
path.addRect(FloatRect(x0, y0, x1 - x0, y1 - y0));
}
break;
case Default:
path.addRect(FloatRect(0, 0, width.toFloat(), height.toFloat()));
break;
case Unknown:
break;
}
return path;
}
示例8: innerEditorElement
int LayoutTextControl::textBlockLogicalWidth() const {
Element* innerEditor = innerEditorElement();
ASSERT(innerEditor);
LayoutUnit unitWidth = logicalWidth() - borderAndPaddingLogicalWidth();
if (innerEditor->layoutObject())
unitWidth -= innerEditor->layoutBox()->paddingStart() +
innerEditor->layoutBox()->paddingEnd();
return unitWidth.toInt();
}
示例9: TEST
TEST(LayoutUnitTest, UnaryMinus) {
EXPECT_EQ(LayoutUnit(), -LayoutUnit());
EXPECT_EQ(LayoutUnit(999), -LayoutUnit(-999));
EXPECT_EQ(LayoutUnit(-999), -LayoutUnit(999));
LayoutUnit negativeMax;
negativeMax.setRawValue(LayoutUnit::min().rawValue() + 1);
EXPECT_EQ(negativeMax, -LayoutUnit::max());
EXPECT_EQ(LayoutUnit::max(), -negativeMax);
// -LayoutUnit::min() is saturated to LayoutUnit::max()
EXPECT_EQ(LayoutUnit::max(), -LayoutUnit::min());
}
示例10: isInComputingShape
const Shape& ShapeOutsideInfo::computedShape() const {
if (Shape* shape = m_shape.get())
return *shape;
AutoReset<bool> isInComputingShape(&m_isComputingShape, true);
const ComputedStyle& style = *m_layoutBox.style();
ASSERT(m_layoutBox.containingBlock());
const ComputedStyle& containingBlockStyle =
*m_layoutBox.containingBlock()->style();
WritingMode writingMode = containingBlockStyle.getWritingMode();
// Make sure contentWidth is not negative. This can happen when containing
// block has a vertical scrollbar and its content is smaller than the
// scrollbar width.
LayoutUnit maximumValue =
m_layoutBox.containingBlock()
? std::max(LayoutUnit(),
m_layoutBox.containingBlock()->contentWidth())
: LayoutUnit();
float margin = floatValueForLength(m_layoutBox.style()->shapeMargin(),
maximumValue.toFloat());
float shapeImageThreshold = style.shapeImageThreshold();
ASSERT(style.shapeOutside());
const ShapeValue& shapeValue = *style.shapeOutside();
switch (shapeValue.type()) {
case ShapeValue::Shape:
ASSERT(shapeValue.shape());
m_shape = Shape::createShape(
shapeValue.shape(), m_referenceBoxLogicalSize, writingMode, margin);
break;
case ShapeValue::Image:
ASSERT(shapeValue.isImageValid());
m_shape = createShapeForImage(shapeValue.image(), shapeImageThreshold,
writingMode, margin);
break;
case ShapeValue::Box: {
const FloatRoundedRect& shapeRect = style.getRoundedBorderFor(
LayoutRect(LayoutPoint(), m_referenceBoxLogicalSize),
m_layoutBox.view());
m_shape = Shape::createLayoutBoxShape(shapeRect, writingMode, margin);
break;
}
}
ASSERT(m_shape);
return *m_shape;
}
示例11: flowThread
unsigned RenderMultiColumnSet::columnCount() const
{
// We must always return a value of 1 or greater. Column count = 0 is a meaningless situation,
// and will confuse and cause problems in other parts of the code.
if (!computedColumnHeight())
return 1;
// Our portion rect determines our column count. We have as many columns as needed to fit all the content.
LayoutUnit logicalHeightInColumns = flowThread()->isHorizontalWritingMode() ? flowThreadPortionRect().height() : flowThreadPortionRect().width();
if (!logicalHeightInColumns)
return 1;
unsigned count = ceil(logicalHeightInColumns.toFloat() / computedColumnHeight().toFloat());
ASSERT(count >= 1);
return count;
}
示例12: ASSERT
LayoutUnit LayoutMultiColumnSet::nextLogicalTopForUnbreakableContent(LayoutUnit flowThreadOffset, LayoutUnit contentLogicalHeight) const
{
ASSERT(flowThreadOffset.mightBeSaturated() || pageLogicalTopForOffset(flowThreadOffset) == flowThreadOffset);
FragmentationContext* enclosingFragmentationContext = multiColumnFlowThread()->enclosingFragmentationContext();
if (!enclosingFragmentationContext) {
// If there's no enclosing fragmentation context, there'll ever be only one row, and all
// columns there will have the same height.
return flowThreadOffset;
}
// Assert the problematic situation. If we have no problem with the column height, why are we
// even here?
ASSERT(pageLogicalHeightForOffset(flowThreadOffset) < contentLogicalHeight);
// There's a likelihood for subsequent rows to be taller than the first one.
// TODO(mstensho): if we're doubly nested (e.g. multicol in multicol in multicol), we need to
// look beyond the first row here.
const MultiColumnFragmentainerGroup& firstRow = firstFragmentainerGroup();
LayoutUnit firstRowLogicalBottomInFlowThread = firstRow.logicalTopInFlowThread() + fragmentainerGroupCapacity(firstRow);
if (flowThreadOffset >= firstRowLogicalBottomInFlowThread)
return flowThreadOffset; // We're not in the first row. Give up.
LayoutUnit newLogicalHeight = enclosingFragmentationContext->fragmentainerLogicalHeightAt(firstRow.blockOffsetInEnclosingFragmentationContext() + firstRow.logicalHeight());
if (contentLogicalHeight > newLogicalHeight) {
// The next outer column or page doesn't have enough space either. Give up and stay where
// we are.
return flowThreadOffset;
}
return firstRowLogicalBottomInFlowThread;
}
示例13: getExcludedInterval
LineSegment RectangleShape::getExcludedInterval(LayoutUnit logicalTop, LayoutUnit logicalHeight) const
{
const FloatRect& bounds = shapeMarginBounds();
if (bounds.isEmpty())
return LineSegment();
float y1 = logicalTop.toFloat();
float y2 = (logicalTop + logicalHeight).toFloat();
if (y2 < bounds.y() || y1 >= bounds.maxY())
return LineSegment();
float x1 = bounds.x();
float x2 = bounds.maxX();
float marginRadiusX = rx() + shapeMargin();
float marginRadiusY = ry() + shapeMargin();
if (marginRadiusY > 0) {
if (y2 < bounds.y() + marginRadiusY) {
float yi = y2 - bounds.y() - marginRadiusY;
float xi = ellipseXIntercept(yi, marginRadiusX, marginRadiusY);
x1 = bounds.x() + marginRadiusX - xi;
x2 = bounds.maxX() - marginRadiusX + xi;
} else if (y1 > bounds.maxY() - marginRadiusY) {
float yi = y1 - (bounds.maxY() - marginRadiusY);
float xi = ellipseXIntercept(yi, marginRadiusX, marginRadiusY);
x1 = bounds.x() + marginRadiusX - xi;
x2 = bounds.maxX() - marginRadiusX + xi;
}
}
return LineSegment(x1, x2);
}
示例14: computeMargin
static LayoutUnit computeMargin(const Length& length, LayoutUnit referenceLength)
{
if (length.type() == Percent)
return LayoutUnit(static_cast<int>(referenceLength.toFloat() * length.percent() / 100.0));
ASSERT(length.type() == Fixed);
return LayoutUnit(length.intValue());
}
示例15: firstIncludedIntervalLogicalTop
bool RasterShape::firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const LayoutSize& minLogicalIntervalSize, LayoutUnit& result) const
{
const RasterShapeIntervals& intervals = paddingIntervals();
if (intervals.isEmpty())
return false;
return intervals.firstIncludedIntervalY(minLogicalIntervalTop.floor(), flooredIntSize(minLogicalIntervalSize), result);
}