void CSSToStyleMap::mapNinePieceImageSlice(CSSValue& value, NinePieceImage& image) { if (!is<CSSBorderImageSliceValue>(value)) return; // Retrieve the border image value. auto& borderImageSlice = downcast<CSSBorderImageSliceValue>(value); // Set up a length box to represent our image slices. LengthBox box; Quad* slices = borderImageSlice.slices(); if (slices->top()->isPercentage()) box.top() = Length(slices->top()->getDoubleValue(), Percent); else box.top() = Length(slices->top()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed); if (slices->bottom()->isPercentage()) box.bottom() = Length(slices->bottom()->getDoubleValue(), Percent); else box.bottom() = Length((int)slices->bottom()->getFloatValue(CSSPrimitiveValue::CSS_NUMBER), Fixed); if (slices->left()->isPercentage()) box.left() = Length(slices->left()->getDoubleValue(), Percent); else box.left() = Length(slices->left()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed); if (slices->right()->isPercentage()) box.right() = Length(slices->right()->getDoubleValue(), Percent); else box.right() = Length(slices->right()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed); image.setImageSlices(box); // Set our fill mode. image.setFill(borderImageSlice.m_fill); }
explicit ClipAutos(const LengthBox& clip) : isAuto(false) , isTopAuto(clip.top().isAuto()) , isRightAuto(clip.right().isAuto()) , isBottomAuto(clip.bottom().isAuto()) , isLeftAuto(clip.left().isAuto()) { }
inline static PassRefPtr<AnimatableValue> createFromLengthBox(const LengthBox lengthBox, const RenderStyle* style) { return AnimatableLengthBox::create( createFromLength(lengthBox.left(), style), createFromLength(lengthBox.right(), style), createFromLength(lengthBox.top(), style), createFromLength(lengthBox.bottom(), style)); }
LayoutBoxExtent NinePieceImage::computeSlices(const LayoutSize& size, const LengthBox& lengths, const FloatBoxExtent& widths, const LayoutBoxExtent& slices) { LayoutUnit top = computeSlice(lengths.top(), widths.top(), slices.top(), size.height()); LayoutUnit right = computeSlice(lengths.right(), widths.right(), slices.right(), size.width()); LayoutUnit bottom = computeSlice(lengths.bottom(), widths.bottom(), slices.bottom(), size.height()); LayoutUnit left = computeSlice(lengths.left(), widths.left(), slices.left(), size.width()); return LayoutBoxExtent(top, right, bottom, left); }
LayoutBoxExtent NinePieceImage::computeSlices(const LayoutSize& size, const LengthBox& lengths, int scaleFactor) { LayoutUnit top = std::min<LayoutUnit>(size.height(), valueForLength(lengths.top(), size.height())) * scaleFactor; LayoutUnit right = std::min<LayoutUnit>(size.width(), valueForLength(lengths.right(), size.width())) * scaleFactor; LayoutUnit bottom = std::min<LayoutUnit>(size.height(), valueForLength(lengths.bottom(), size.height())) * scaleFactor; LayoutUnit left = std::min<LayoutUnit>(size.width(), valueForLength(lengths.left(), size.width())) * scaleFactor; return LayoutBoxExtent(top, right, bottom, left); }
inline static PassRefPtrWillBeRawPtr<AnimatableValue> createFromLengthBox(const LengthBox& lengthBox, const ComputedStyle& style) { return AnimatableLengthBox::create( createFromLength(lengthBox.left(), style), createFromLength(lengthBox.right(), style), createFromLength(lengthBox.top(), style), createFromLength(lengthBox.bottom(), style)); }
static InterpolationValue createClipValue(const LengthBox& clip, double zoom) { OwnPtr<InterpolableList> list = InterpolableList::create(ClipComponentIndexCount); list->set(ClipTop, convertClipComponent(clip.top(), zoom)); list->set(ClipRight, convertClipComponent(clip.right(), zoom)); list->set(ClipBottom, convertClipComponent(clip.bottom(), zoom)); list->set(ClipLeft, convertClipComponent(clip.left(), zoom)); return InterpolationValue(list.release(), CSSClipNonInterpolableValue::create(ClipAutos(clip))); }
LengthBox CSSToStyleMap::mapNinePieceImageQuad(CSSValue& value) { if (!is<CSSPrimitiveValue>(value)) return LengthBox(); // Get our zoom value. CSSToLengthConversionData conversionData = useSVGZoomRules() ? m_resolver->state().cssToLengthConversionData().copyWithAdjustedZoom(1.0f) : m_resolver->state().cssToLengthConversionData(); // Retrieve the primitive value. auto& borderWidths = downcast<CSSPrimitiveValue>(value); // Set up a length box to represent our image slices. LengthBox box; // Defaults to 'auto' so we don't have to handle that explicitly below. Quad* slices = borderWidths.getQuadValue(); if (slices->top()->isNumber()) box.top() = Length(slices->top()->getIntValue(), Relative); else if (slices->top()->isPercentage()) box.top() = Length(slices->top()->getDoubleValue(CSSPrimitiveValue::CSS_PERCENTAGE), Percent); else if (slices->top()->getValueID() != CSSValueAuto) box.top() = slices->top()->computeLength<Length>(conversionData); if (slices->right()->isNumber()) box.right() = Length(slices->right()->getIntValue(), Relative); else if (slices->right()->isPercentage()) box.right() = Length(slices->right()->getDoubleValue(CSSPrimitiveValue::CSS_PERCENTAGE), Percent); else if (slices->right()->getValueID() != CSSValueAuto) box.right() = slices->right()->computeLength<Length>(conversionData); if (slices->bottom()->isNumber()) box.bottom() = Length(slices->bottom()->getIntValue(), Relative); else if (slices->bottom()->isPercentage()) box.bottom() = Length(slices->bottom()->getDoubleValue(CSSPrimitiveValue::CSS_PERCENTAGE), Percent); else if (slices->bottom()->getValueID() != CSSValueAuto) box.bottom() = slices->bottom()->computeLength<Length>(conversionData); if (slices->left()->isNumber()) box.left() = Length(slices->left()->getIntValue(), Relative); else if (slices->left()->isPercentage()) box.left() = Length(slices->left()->getDoubleValue(CSSPrimitiveValue::CSS_PERCENTAGE), Percent); else if (slices->left()->getValueID() != CSSValueAuto) box.left() = slices->left()->computeLength<Length>(conversionData); return box; }
static bool positionedObjectMovedOnly(const LengthBox& a, const LengthBox& b, const Length& width) { // If any unit types are different, then we can't guarantee // that this was just a movement. if (a.left().type() != b.left().type() || a.right().type() != b.right().type() || a.top().type() != b.top().type() || a.bottom().type() != b.bottom().type()) return false; // Only one unit can be non-auto in the horizontal direction and // in the vertical direction. Otherwise the adjustment of values // is changing the size of the box. if (!a.left().isIntrinsicOrAuto() && !a.right().isIntrinsicOrAuto()) return false; if (!a.top().isIntrinsicOrAuto() && !a.bottom().isIntrinsicOrAuto()) return false; // If our width is auto and left or right is specified and changed then this // is not just a movement - we need to resize to our container. if (width.isIntrinsicOrAuto() && ((!a.left().isIntrinsicOrAuto() && a.left() != b.left()) || (!a.right().isIntrinsicOrAuto() && a.right() != b.right()))) return false; // One of the units is fixed or percent in both directions and stayed // that way in the new style. Therefore all we are doing is moving. return true; }
static LayoutRect computeScrollSnapPortOrAreaRect(const LayoutRect& rect, const LengthBox& insetOrOutsetBox, InsetOrOutset insetOrOutset) { LayoutBoxExtent extents(valueForLength(insetOrOutsetBox.top(), rect.height()), valueForLength(insetOrOutsetBox.right(), rect.width()), valueForLength(insetOrOutsetBox.bottom(), rect.height()), valueForLength(insetOrOutsetBox.left(), rect.width())); auto snapPortOrArea(rect); if (insetOrOutset == InsetOrOutset::Inset) snapPortOrArea.contract(extents); else snapPortOrArea.expand(extents); return snapPortOrArea; }