void CSSToStyleMap::mapNinePieceImage(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 (!is<CSSValueList>(value)) return; // Retrieve the border image value. CSSValueList& borderImage = downcast<CSSValueList>(*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 (auto& current : borderImage) { if (is<CSSImageValue>(current.get()) || is<CSSImageGeneratorValue>(current.get()) #if ENABLE(CSS_IMAGE_SET) || is<CSSImageSetValue>(current.get()) #endif ) image.setImage(styleImage(imageProperty, current.get())); else if (is<CSSBorderImageSliceValue>(current.get())) mapNinePieceImageSlice(current, image); else if (is<CSSValueList>(current.get())) { CSSValueList& slashList = downcast<CSSValueList>(current.get()); // Map in the image slices. if (is<CSSBorderImageSliceValue>(slashList.item(0))) mapNinePieceImageSlice(*slashList.item(0), image); // Map in the border slices. if (slashList.item(1)) image.setBorderSlices(mapNinePieceImageQuad(*slashList.item(1))); // Map in the outset. if (slashList.item(2)) image.setOutset(mapNinePieceImageQuad(*slashList.item(2))); } else if (is<CSSPrimitiveValue>(current.get())) { // Set the appropriate rules for stretch/round/repeat of the slices. mapNinePieceImageRepeat(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().isFixed()) style()->setBorderTopWidth(image.borderSlices().top().value()); if (image.borderSlices().right().isFixed()) style()->setBorderRightWidth(image.borderSlices().right().value()); if (image.borderSlices().bottom().isFixed()) style()->setBorderBottomWidth(image.borderSlices().bottom().value()); if (image.borderSlices().left().isFixed()) style()->setBorderLeftWidth(image.borderSlices().left().value()); } }
void CSSToStyleMap::mapNinePieceImage(RenderStyle* mutableStyle, 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(styleImage(imageProperty, current)); else if (current->isBorderImageSliceValue()) mapNinePieceImageSlice(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(slashList->item(0), image); // Map in the border slices. if (length > 1) image.setBorderSlices(mapNinePieceImageQuad(slashList->item(1))); // Map in the outset. if (length > 2) image.setOutset(mapNinePieceImageQuad(slashList->item(2))); } else if (current->isPrimitiveValue()) { // Set the appropriate rules for stretch/round/repeat of the slices. mapNinePieceImageRepeat(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()) mutableStyle->setBorderTopWidth(image.borderSlices().top().length().value()); if (image.borderSlices().right().isLength() && image.borderSlices().right().length().isFixed()) mutableStyle->setBorderRightWidth(image.borderSlices().right().length().value()); if (image.borderSlices().bottom().isLength() && image.borderSlices().bottom().length().isFixed()) mutableStyle->setBorderBottomWidth(image.borderSlices().bottom().length().value()); if (image.borderSlices().left().isLength() && image.borderSlices().left().length().isFixed()) mutableStyle->setBorderLeftWidth(image.borderSlices().left().length().value()); } }
void CSSToStyleMap::mapFillImage(CSSPropertyID property, FillLayer* layer, CSSValue* value) { if (value->isInitialValue()) { layer->setImage(FillLayer::initialFillImage(layer->type())); return; } layer->setImage(styleImage(property, value)); }
void CSSToStyleMap::mapFillImage(CSSPropertyID propertyID, FillLayer& layer, CSSValue& value) { if (value.treatAsInitialValue(propertyID)) { layer.setImage(FillLayer::initialFillImage(layer.type())); return; } layer.setImage(styleImage(propertyID, value)); }
void CSSToStyleMap::mapFillImage(FillLayer* layer, CSSValue* value) { if (value->isInitialValue()) { layer->setImage(FillLayer::initialFillImage(layer->type())); return; } CSSPropertyID property = layer->type() == BackgroundFillLayer ? CSSPropertyBackgroundImage : CSSPropertyWebkitMaskImage; layer->setImage(styleImage(property, value)); }