void CSSToStyleMap::mapNinePieceImageSlice(StyleResolverState&, const CSSValue& value, NinePieceImage& image) { if (!value.isBorderImageSliceValue()) return; // Retrieve the border image value. const CSSBorderImageSliceValue& borderImageSlice = toCSSBorderImageSliceValue(value); // Set up a length box to represent our image slices. LengthBox box; CSSQuadValue* slices = borderImageSlice.slices(); if (slices->top()->isPercentage()) box.m_top = Length(slices->top()->getDoubleValue(), Percent); else box.m_top = Length(slices->top()->getIntValue(), Fixed); if (slices->bottom()->isPercentage()) box.m_bottom = Length(slices->bottom()->getDoubleValue(), Percent); else box.m_bottom = Length(slices->bottom()->getIntValue(), Fixed); if (slices->left()->isPercentage()) box.m_left = Length(slices->left()->getDoubleValue(), Percent); else box.m_left = Length(slices->left()->getIntValue(), Fixed); if (slices->right()->isPercentage()) box.m_right = Length(slices->right()->getDoubleValue(), Percent); else box.m_right = Length(slices->right()->getIntValue(), Fixed); image.setImageSlices(box); // Set our fill mode. image.setFill(borderImageSlice.m_fill); }
InterpolationValue CSSImageSliceInterpolationType::maybeConvertValue( const CSSValue& value, const StyleResolverState&, ConversionCheckers&) const { if (!value.isBorderImageSliceValue()) return nullptr; const CSSBorderImageSliceValue& slice = toCSSBorderImageSliceValue(value); std::unique_ptr<InterpolableList> list = InterpolableList::create(SideIndexCount); const CSSValue* sides[SideIndexCount]; sides[SideTop] = slice.slices().top(); sides[SideRight] = slice.slices().right(); sides[SideBottom] = slice.slices().bottom(); sides[SideLeft] = slice.slices().left(); for (size_t i = 0; i < SideIndexCount; i++) { const CSSPrimitiveValue& side = *toCSSPrimitiveValue(sides[i]); DCHECK(side.isNumber() || side.isPercentage()); list->set(i, InterpolableNumber::create(side.getDoubleValue())); } return InterpolationValue( std::move(list), CSSImageSliceNonInterpolableValue::create(SliceTypes(slice))); }
void CSSToStyleMap::mapNinePieceImage(StyleResolverState& state, CSSPropertyID property, CSSValue* value, NinePieceImage& image) { // If we're not a value list, then we are "none" and don't need to alter the empty image at all. if (!value || !value->isValueList()) return; // Retrieve the border image value. CSSValueList* borderImage = toCSSValueList(value); // Set the image (this kicks off the load). CSSPropertyID imageProperty; if (property == CSSPropertyWebkitBorderImage) imageProperty = CSSPropertyBorderImageSource; else if (property == CSSPropertyWebkitMaskBoxImage) imageProperty = CSSPropertyWebkitMaskBoxImageSource; else imageProperty = property; for (unsigned i = 0 ; i < borderImage->length() ; ++i) { CSSValue* current = borderImage->item(i); if (current->isImageValue() || current->isImageGeneratorValue() || current->isImageSetValue()) image.setImage(state.styleImage(imageProperty, current)); else if (current->isBorderImageSliceValue()) mapNinePieceImageSlice(state, current, image); else if (current->isValueList()) { CSSValueList* slashList = toCSSValueList(current); size_t length = slashList->length(); // Map in the image slices. if (length && slashList->item(0)->isBorderImageSliceValue()) mapNinePieceImageSlice(state, slashList->item(0), image); // Map in the border slices. if (length > 1) image.setBorderSlices(mapNinePieceImageQuad(state, slashList->item(1))); // Map in the outset. if (length > 2) image.setOutset(mapNinePieceImageQuad(state, slashList->item(2))); } else if (current->isPrimitiveValue()) { // Set the appropriate rules for stretch/round/repeat of the slices. mapNinePieceImageRepeat(state, current, image); } } if (property == CSSPropertyWebkitBorderImage) { // We have to preserve the legacy behavior of -webkit-border-image and make the border slices // also set the border widths. We don't need to worry about percentages, since we don't even support // those on real borders yet. if (image.borderSlices().top().isLength() && image.borderSlices().top().length().isFixed()) state.style()->setBorderTopWidth(image.borderSlices().top().length().value()); if (image.borderSlices().right().isLength() && image.borderSlices().right().length().isFixed()) state.style()->setBorderRightWidth(image.borderSlices().right().length().value()); if (image.borderSlices().bottom().isLength() && image.borderSlices().bottom().length().isFixed()) state.style()->setBorderBottomWidth(image.borderSlices().bottom().length().value()); if (image.borderSlices().left().isLength() && image.borderSlices().left().length().isFixed()) state.style()->setBorderLeftWidth(image.borderSlices().left().length().value()); } }
void CSSToStyleMap::mapNinePieceImageSlice(StyleResolverState&, const CSSValue& value, NinePieceImage& image) { if (!value.isBorderImageSliceValue()) return; // Retrieve the border image value. const CSSBorderImageSliceValue& borderImageSlice = toCSSBorderImageSliceValue(value); // Set up a length box to represent our image slices. LengthBox box; CSSQuadValue* slices = borderImageSlice.slices(); box.m_top = convertBorderImageSliceSide(*slices->top()); box.m_bottom = convertBorderImageSliceSide(*slices->bottom()); box.m_left = convertBorderImageSliceSide(*slices->left()); box.m_right = convertBorderImageSliceSide(*slices->right()); image.setImageSlices(box); // Set our fill mode. image.setFill(borderImageSlice.m_fill); }