Changeset 177223 in webkit
- Timestamp:
- Dec 12, 2014 6:19:21 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 34 added
- 29 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r177219 r177223 1 2014-12-12 Radu Stavila <stavila@adobe.com> 2 3 [SVG Masking] Enable the use of <mask> elements for -webkit-mask-image 4 https://bugs.webkit.org/show_bug.cgi?id=139294 5 6 Reviewed by Simon Fraser. 7 8 Added tests for different situations using URLs with fragment id 9 for the -webkit-mask-image property. 10 11 * css3/masking/mask-base64-expected.html: Added. 12 * css3/masking/mask-base64.html: Added. 13 * css3/masking/mask-multiple-values-expected.html: Added. 14 * css3/masking/mask-multiple-values.html: Added. 15 * css3/masking/mask-repeat-space-padding-expected.html: 16 * css3/masking/mask-repeat-space-padding.html: 17 * css3/masking/mask-svg-clipped-fragmentId-expected.html: Added. 18 * css3/masking/mask-svg-clipped-fragmentId.html: Added. 19 * css3/masking/mask-svg-fragmentId-expected.html: Added. 20 * css3/masking/mask-svg-fragmentId.html: Added. 21 * css3/masking/mask-svg-inline-fragmentId-expected.html: Added. 22 * css3/masking/mask-svg-inline-fragmentId.html: Added. 23 * css3/masking/mask-svg-inline-invalid-fragmentId-expected.html: Added. 24 * css3/masking/mask-svg-inline-invalid-fragmentId.html: Added. 25 * css3/masking/mask-svg-invalid-fragmentId-expected.html: Added. 26 * css3/masking/mask-svg-invalid-fragmentId.html: Added. 27 * css3/masking/mask-svg-no-fragmentId-expected.html: Added. 28 * css3/masking/mask-svg-no-fragmentId-tiled-expected.html: Added. 29 * css3/masking/mask-svg-no-fragmentId-tiled.html: Added. 30 * css3/masking/mask-svg-no-fragmentId.html: Added. 31 * css3/masking/mask-svg-script-entire-svg-to-mask-expected.html: Added. 32 * css3/masking/mask-svg-script-entire-svg-to-mask.html: Added. 33 * css3/masking/mask-svg-script-mask-to-entire-svg-expected.html: Added. 34 * css3/masking/mask-svg-script-mask-to-entire-svg.html: Added. 35 * css3/masking/mask-svg-script-mask-to-none-expected.html: Added. 36 * css3/masking/mask-svg-script-mask-to-none.html: Added. 37 * css3/masking/mask-svg-script-mask-to-png-expected.html: Added. 38 * css3/masking/mask-svg-script-mask-to-png.html: Added. 39 * css3/masking/mask-svg-script-none-to-mask-expected.html: Added. 40 * css3/masking/mask-svg-script-none-to-mask.html: Added. 41 * css3/masking/mask-svg-script-none-to-png-expected.html: Added. 42 * css3/masking/mask-svg-script-none-to-png.html: Added. 43 * css3/masking/mask-svg-script-png-to-mask-expected.html: Added. 44 * css3/masking/mask-svg-script-png-to-mask.html: Added. 45 * css3/masking/mask-svg-script-png-to-none-expected.html: Added. 46 * css3/masking/mask-svg-script-png-to-none.html: Added. 47 * css3/masking/resources/masks.svg: Added. 48 1 49 2014-12-12 Zalan Bujtas <zalan@apple.com> 2 50 -
trunk/LayoutTests/css3/masking/mask-base64-expected.html
r177222 r177223 3 3 <head> 4 4 <style> 5 #back { 6 width: 600px; 7 height: 500px; 8 background-color: green; 5 p { 6 margin: 0px; 9 7 } 10 8 #front { 11 width: 400px; 12 height: 300px; 13 background-color: red; 14 border: 50px solid blue; 15 padding: 50px; 9 width: 200px; 10 height: 160px; 11 background-color: green; 16 12 -webkit-mask-repeat: no-repeat; 17 -webkit-mask-origin: padding-box;18 -webkit-mask-clip: padding-box;13 -webkit-mask-origin: content-box; 14 -webkit-mask-clip: content-box; 19 15 } 20 16 </style> 21 17 <script> 22 var sizeX = 100, sizeY = 80, spaceX = 0, spaceY = 0, width = 700, height = 600;18 var sizeX = 50, sizeY = 40, spaceX = 0, spaceY = 0, width = 200, height = 160; 23 19 24 20 var urls = Array(), size = Array(), position = Array(); … … 27 23 for (var x = 0; x < width; x += sizeX + spaceX) { 28 24 for (var y = 0; y < height; y += sizeY + spaceY) { 29 urls.push("url(resources/circle. png)");25 urls.push("url(resources/circle.svg)"); 30 26 size.push(sizeX + "px " + sizeY + "px"); 31 27 position.push(x + "px " + y + "px"); … … 43 39 44 40 <body onload="addMasks()"> 45 < div id="back">46 <div id="front" />47 < /div>41 <p><a href="https://bugs.webkit.org/show_bug.cgi?id=129682">Bug 129682</a> - On success, you should see a 4x4 grid of green circles.</p> 42 <p>This test sets the mask-image value using base64.</p> 43 <div id="front"></div> 48 44 </body> 49 45 </html> -
trunk/LayoutTests/css3/masking/mask-repeat-space-padding-expected.html
r177169 r177223 27 27 for (var x = 0; x < width; x += sizeX + spaceX) { 28 28 for (var y = 0; y < height; y += sizeY + spaceY) { 29 urls.push("url(resources/circle. png)");29 urls.push("url(resources/circle.svg)"); 30 30 size.push(sizeX + "px " + sizeY + "px"); 31 31 position.push(x + "px " + y + "px"); -
trunk/LayoutTests/css3/masking/mask-repeat-space-padding.html
r177169 r177223 14 14 border: 50px solid blue; 15 15 padding: 50px; 16 -webkit-mask-image: url("resources/circle. png");16 -webkit-mask-image: url("resources/circle.svg"); 17 17 -webkit-mask-size: 100px; 18 18 -webkit-mask-repeat: space; -
trunk/Source/WebCore/ChangeLog
r177221 r177223 1 2014-12-12 Radu Stavila <stavila@adobe.com> 2 3 [SVG Masking] Enable the use of <mask> elements for -webkit-mask-image 4 https://bugs.webkit.org/show_bug.cgi?id=139294 5 6 Reviewed by Simon Fraser. 7 8 This patch links together all parts required for the functionality which improves 9 the -webkit-mask-image property by allowing it to reference a <mask> element defined 10 in an inline or external SVG document. 11 Support for this new functionality has been added in a previous patch, under issue 12 https://bugs.webkit.org/show_bug.cgi?id=139092. A more detailed description of how 13 the new functionality works can be found in the ChangeLog for that commit. 14 The containsSVGDocument in ScrollView has been removed because it was added in the 15 previous patch but is no longer required. 16 17 Tests: css3/masking/mask-base64.html 18 css3/masking/mask-multiple-values.html 19 css3/masking/mask-svg-clipped-fragmentId.html 20 css3/masking/mask-svg-fragmentId.html 21 css3/masking/mask-svg-inline-fragmentId.html 22 css3/masking/mask-svg-inline-invalid-fragmentId.html 23 css3/masking/mask-svg-invalid-fragmentId.html 24 css3/masking/mask-svg-no-fragmentId-tiled.html 25 css3/masking/mask-svg-no-fragmentId.html 26 css3/masking/mask-svg-script-entire-svg-to-mask.html 27 css3/masking/mask-svg-script-mask-to-entire-svg.html 28 css3/masking/mask-svg-script-mask-to-none.html 29 css3/masking/mask-svg-script-mask-to-png.html 30 css3/masking/mask-svg-script-none-to-mask.html 31 css3/masking/mask-svg-script-none-to-png.html 32 css3/masking/mask-svg-script-png-to-mask.html 33 css3/masking/mask-svg-script-png-to-none.html 34 35 * css/CSSComputedStyleDeclaration.cpp: 36 (WebCore::ComputedStyleExtractor::propertyValue): 37 * css/CSSParser.cpp: 38 (WebCore::CSSParser::parseFillShorthand): 39 (WebCore::CSSParser::parseFillProperty): 40 (WebCore::CSSParser::parseMaskImage): 41 * css/CSSParser.h: 42 * css/DeprecatedStyleBuilder.cpp: 43 (WebCore::DeprecatedStyleBuilder::DeprecatedStyleBuilder): 44 * css/StyleResolver.cpp: 45 (WebCore::StyleResolver::adjustStyleForMaskImages): 46 (WebCore::StyleResolver::applyProperty): 47 (WebCore::StyleResolver::loadPendingSVGDocuments): 48 (WebCore::StyleResolver::createMaskImageOperations): 49 (WebCore::StyleResolver::loadPendingImages): 50 * page/animation/CSSPropertyAnimation.cpp: 51 (WebCore::blendFunc): 52 (WebCore::MaskImagePropertyWrapper::MaskImagePropertyWrapper): 53 (WebCore::MaskImagePropertyWrapper::equals): 54 (WebCore::CSSPropertyAnimationWrapperMap::CSSPropertyAnimationWrapperMap): 55 * platform/graphics/MaskImageOperation.cpp: 56 (WebCore::MaskImageOperation::~MaskImageOperation): 57 * rendering/RenderBox.cpp: 58 (WebCore::RenderBox::maskClipRect): 59 * rendering/RenderBox.h: 60 * rendering/RenderBoxModelObject.cpp: 61 (WebCore::RenderBoxModelObject::paintFillLayerExtended): 62 (WebCore::RenderBoxModelObject::calculateFillTileSize): 63 (WebCore::RenderBoxModelObject::calculateBackgroundImageGeometry): 64 * rendering/RenderElement.cpp: 65 (WebCore::RenderElement::~RenderElement): 66 (WebCore::RenderElement::updateFillImages): 67 * rendering/RenderLayer.cpp: 68 (WebCore::RenderLayer::calculateClipRects): 69 * rendering/RenderLayer.h: 70 * rendering/style/FillLayer.h: 71 * rendering/style/RenderStyle.cpp: 72 (WebCore::RenderStyle::setMaskImage): 73 * rendering/style/RenderStyle.h: 74 1 75 2014-12-12 Csaba Osztrogonác <ossy@webkit.org> 2 76 -
trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp
r177200 r177223 1795 1795 case CSSPropertyBackgroundColor: 1796 1796 return cssValuePool().createColorValue(m_allowVisitedStyle? style->visitedDependentColor(CSSPropertyBackgroundColor).rgb() : style->backgroundColor().rgb()); 1797 case CSSPropertyBackgroundImage: 1798 case CSSPropertyWebkitMaskImage: { 1799 const FillLayer* layers = propertyID == CSSPropertyWebkitMaskImage ? style->maskLayers() : style->backgroundLayers(); 1797 case CSSPropertyBackgroundImage: { 1798 const FillLayer* layers = style->backgroundLayers(); 1800 1799 if (!layers) 1801 1800 return cssValuePool().createIdentifierValue(CSSValueNone); … … 1812 1811 if (currLayer->image()) 1813 1812 list->append(*currLayer->image()->cssValue()); 1813 else 1814 list->append(cssValuePool().createIdentifierValue(CSSValueNone)); 1815 } 1816 return list.release(); 1817 } 1818 case CSSPropertyWebkitMaskImage: { 1819 const FillLayer* layers = style->maskLayers(); 1820 if (!layers) 1821 return cssValuePool().createIdentifierValue(CSSValueNone); 1822 1823 if (!layers->next()) { 1824 if (layers->maskImage().get()) 1825 return layers->maskImage()->cssValue(); 1826 1827 return cssValuePool().createIdentifierValue(CSSValueNone); 1828 } 1829 1830 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 1831 for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) { 1832 if (currLayer->maskImage().get()) 1833 list->append(*currLayer->maskImage()->cssValue()); 1814 1834 else 1815 1835 list->append(cssValuePool().createIdentifierValue(CSSValueNone)); -
trunk/Source/WebCore/css/CSSParser.cpp
r177169 r177223 84 84 #include "WebKitCSSFilterValue.h" 85 85 #include "WebKitCSSRegionRule.h" 86 #include "WebKitCSSResourceValue.h" 86 87 #include "WebKitCSSTransformValue.h" 87 88 #include <bitset> … … 3359 3360 CSSPropertyID propId1, propId2; 3360 3361 CSSParserValue& parserValue = *m_valueList->current(); 3362 3361 3363 if (parseFillProperty(properties[i], propId1, propId2, val1, val2)) { 3362 3364 parsedProperty[i] = found = true; … … 4447 4449 break; 4448 4450 case CSSPropertyBackgroundImage: 4451 if (parseFillImage(*m_valueList, currValue)) 4452 m_valueList->next(); 4453 break; 4449 4454 case CSSPropertyWebkitMaskImage: 4450 if (parse FillImage(*m_valueList, currValue))4455 if (parseMaskImage(*m_valueList, currValue)) 4451 4456 m_valueList->next(); 4452 4457 break; … … 9428 9433 } 9429 9434 9435 bool CSSParser::parseMaskImage(CSSParserValueList& valueList, RefPtr<CSSValue>& outValue) 9436 { 9437 outValue = nullptr; 9438 CSSParserValue* value = valueList.current(); 9439 if (value->id == CSSValueNone) 9440 outValue = WebKitCSSResourceValue::create(cssValuePool().createIdentifierValue(CSSValueNone)); 9441 else if (value->unit == CSSPrimitiveValue::CSS_URI) 9442 outValue = WebKitCSSResourceValue::create(CSSPrimitiveValue::create(completeURL(value->string), CSSPrimitiveValue::CSS_URI)); 9443 else { 9444 RefPtr<CSSValue> fillImageValue; 9445 if (parseFillImage(valueList, fillImageValue)) 9446 outValue = WebKitCSSResourceValue::create(fillImageValue); 9447 } 9448 9449 return outValue.get(); 9450 } 9451 9430 9452 #if ENABLE(CSS_REGIONS) 9431 9453 static bool validFlowName(const String& flowName) -
trunk/Source/WebCore/css/CSSParser.h
r177169 r177223 118 118 PassRefPtr<CSSValue> parseBackgroundColor(); 119 119 120 // FIXME: Maybe these two methods could be combined into one. 121 bool parseMaskImage(CSSParserValueList&, RefPtr<CSSValue>&); 120 122 bool parseFillImage(CSSParserValueList&, RefPtr<CSSValue>&); 121 123 -
trunk/Source/WebCore/css/CSSValue.h
r176798 r177223 164 164 SVGColorClass, 165 165 SVGPaintClass, 166 WebKitCSSResourceClass, 166 167 167 168 // List class types must appear after ValueListClass. … … 175 176 GridLineNamesClass, 176 177 #endif 177 WebKitCSSResourceClass178 178 179 179 // Do not append non-list class types here. -
trunk/Source/WebCore/css/DeprecatedStyleBuilder.cpp
r177169 r177223 929 929 setPropertyHandler(CSSPropertyWebkitMaskClip, ApplyPropertyFillLayer<EFillBox, CSSPropertyWebkitMaskClip, MaskFillLayer, &RenderStyle::accessMaskLayers, &RenderStyle::maskLayers, &FillLayer::isClipSet, &FillLayer::clip, &FillLayer::setClip, &FillLayer::clearClip, &FillLayer::initialFillClip, &CSSToStyleMap::mapFillClip>::createHandler()); 930 930 setPropertyHandler(CSSPropertyWebkitMaskComposite, ApplyPropertyFillLayer<CompositeOperator, CSSPropertyWebkitMaskComposite, MaskFillLayer, &RenderStyle::accessMaskLayers, &RenderStyle::maskLayers, &FillLayer::isCompositeSet, &FillLayer::composite, &FillLayer::setComposite, &FillLayer::clearComposite, &FillLayer::initialFillComposite, &CSSToStyleMap::mapFillComposite>::createHandler()); 931 setPropertyHandler(CSSPropertyWebkitMaskImage, ApplyPropertyFillLayer<StyleImage*, CSSPropertyWebkitMaskImage, MaskFillLayer, &RenderStyle::accessMaskLayers, &RenderStyle::maskLayers, &FillLayer::isImageSet, &FillLayer::image, &FillLayer::setImage, &FillLayer::clearImage, &FillLayer::initialFillImage, &CSSToStyleMap::mapFillImage>::createHandler());932 931 setPropertyHandler(CSSPropertyWebkitMaskOrigin, ApplyPropertyFillLayer<EFillBox, CSSPropertyWebkitMaskOrigin, MaskFillLayer, &RenderStyle::accessMaskLayers, &RenderStyle::maskLayers, &FillLayer::isOriginSet, &FillLayer::origin, &FillLayer::setOrigin, &FillLayer::clearOrigin, &FillLayer::initialFillOrigin, &CSSToStyleMap::mapFillOrigin>::createHandler()); 933 932 setPropertyHandler(CSSPropertyWebkitMaskPositionX, ApplyPropertyFillLayer<Length, CSSPropertyWebkitMaskPositionX, MaskFillLayer, &RenderStyle::accessMaskLayers, &RenderStyle::maskLayers, &FillLayer::isXPositionSet, &FillLayer::xPosition, &FillLayer::setXPosition, &FillLayer::clearXPosition, &FillLayer::initialFillXPosition, &CSSToStyleMap::mapFillXPosition>::createHandler()); -
trunk/Source/WebCore/css/StyleResolver.cpp
r177169 r177223 1158 1158 } 1159 1159 1160 void StyleResolver::adjustStyleForMaskImages() 1161 { 1162 // If we already have the same mask image objects loaded on the old style, 1163 // use the old ones instead of loading new ones. 1164 RenderStyle* newStyle = m_state.style(); 1165 RenderStyle* oldStyle = (m_state.element() ? m_state.element()->renderStyle() : nullptr); 1166 1167 if (newStyle && oldStyle) { 1168 Vector<RefPtr<MaskImageOperation>> removedExternalResources; 1169 1170 // Get all mask objects from the old style in a vector 1171 // so we can remove them as we match them, making the following steps faster. 1172 Vector<RefPtr<MaskImageOperation>> oldStyleMaskImages; 1173 const FillLayer* oldMaskLayer = oldStyle->maskLayers(); 1174 while (oldMaskLayer) { 1175 RefPtr<MaskImageOperation> oldMaskImage = oldMaskLayer->maskImage(); 1176 if (oldMaskImage.get()) 1177 oldStyleMaskImages.append(oldMaskImage); 1178 1179 oldMaskLayer = oldMaskLayer->next(); 1180 } 1181 1182 // Try to match the new mask objects through the list from the old style. 1183 // This should work perfectly and optimal when the list of masks remained 1184 // the same and also work correctly (but slower) when they were reordered. 1185 FillLayer* newMaskLayer = newStyle->accessMaskLayers(); 1186 int countOldStyleMaskImages = oldStyleMaskImages.size(); 1187 while (newMaskLayer && countOldStyleMaskImages) { 1188 RefPtr<MaskImageOperation> newMaskImage = newMaskLayer->maskImage(); 1189 if (newMaskImage.get()) { 1190 for (int i = 0; i < countOldStyleMaskImages; i++) { 1191 RefPtr<MaskImageOperation> oldMaskImage = oldStyleMaskImages[i]; 1192 if (*oldMaskImage == *newMaskImage) { 1193 newMaskLayer->setMaskImage(oldMaskImage); 1194 if (newMaskImage->isExternalDocument()) 1195 removedExternalResources.append(newMaskImage); 1196 1197 oldStyleMaskImages.remove(i); 1198 countOldStyleMaskImages--; 1199 break; 1200 } 1201 } 1202 } 1203 1204 newMaskLayer = newMaskLayer->next(); 1205 } 1206 1207 Vector<RefPtr<MaskImageOperation>>& pendingResources = m_state.maskImagesWithPendingSVGDocuments(); 1208 for (int i = pendingResources.size() - 1; i >= 0; i--) { 1209 if (removedExternalResources.contains(pendingResources[i])) 1210 pendingResources.remove(i); 1211 } 1212 } 1213 } 1214 1160 1215 void StyleResolver::adjustRenderStyle(RenderStyle& style, const RenderStyle& parentStyle, Element *e) 1161 1216 { … … 1764 1819 // so to preserve behavior, we queue them up during cascade and flush here. 1765 1820 cascade.applyDeferredProperties(*this); 1821 1822 adjustStyleForMaskImages(); 1766 1823 1767 1824 // Start loading resources referenced by this style. … … 2540 2597 } 2541 2598 #endif 2599 2600 case CSSPropertyWebkitMaskImage: { 2601 Vector<RefPtr<MaskImageOperation>> operations; 2602 if (createMaskImageOperations(value, operations)) 2603 state.style()->setMaskImage(operations); 2604 2605 return; 2606 } 2542 2607 2543 2608 #if ENABLE(CSS_GRID_LAYOUT) … … 2967 3032 case CSSPropertyWebkitMaskClip: 2968 3033 case CSSPropertyWebkitMaskComposite: 2969 case CSSPropertyWebkitMaskImage:2970 3034 case CSSPropertyWebkitMaskOrigin: 2971 3035 case CSSPropertyWebkitMaskPositionX: … … 3318 3382 // reentering styleForElement(). 3319 3383 ASSERT(state.style()); 3320 if (!state.style() || !state.style()->hasFilter() || state.filtersWithPendingSVGDocuments().isEmpty()) 3384 if (!state.style()) 3385 return; 3386 3387 bool hasFilters = (state.style()->hasFilter() && !state.filtersWithPendingSVGDocuments().isEmpty()); 3388 bool hasMasks = (state.style()->hasMask() && !state.maskImagesWithPendingSVGDocuments().isEmpty()); 3389 3390 if (!hasFilters && !hasMasks) 3321 3391 return; 3322 3392 3323 3393 CachedResourceLoader* cachedResourceLoader = state.document().cachedResourceLoader(); 3324 for (auto& filterOperation : state.filtersWithPendingSVGDocuments()) 3325 filterOperation->getOrCreateCachedSVGDocumentReference()->load(cachedResourceLoader); 3326 3327 state.filtersWithPendingSVGDocuments().clear(); 3394 3395 if (hasFilters) { 3396 for (auto& filterOperation : state.filtersWithPendingSVGDocuments()) 3397 filterOperation->getOrCreateCachedSVGDocumentReference()->load(cachedResourceLoader); 3398 3399 state.filtersWithPendingSVGDocuments().clear(); 3400 } 3401 3402 if (hasMasks) { 3403 for (auto& maskImageOperation : state.maskImagesWithPendingSVGDocuments()) 3404 maskImageOperation->ensureCachedSVGDocumentReference()->load(cachedResourceLoader); 3405 3406 state.maskImagesWithPendingSVGDocuments().clear(); 3407 } 3328 3408 } 3329 3409 … … 3473 3553 return false; 3474 3554 3475 ASSERT(is<CSSValueList>(*inValue)); 3476 3477 for (auto& currValue : downcast<CSSValueList>(*inValue)) { 3478 if (!is<WebKitCSSResourceValue>(currValue.get())) 3479 continue; 3480 3481 WebKitCSSResourceValue& maskImageValue = downcast<WebKitCSSResourceValue>(currValue.get()); 3482 RefPtr<CSSValue> maskInnerValue = maskImageValue.innerValue(); 3555 RefPtr<WebKitCSSResourceValue> maskImageValue; 3556 RefPtr<CSSValueList> maskImagesList; 3557 CSSValueList::iterator listIterator; 3558 if (is<WebKitCSSResourceValue>(*inValue)) 3559 maskImageValue = downcast<WebKitCSSResourceValue>(inValue); 3560 else if (is<CSSValueList>(*inValue)) { 3561 maskImagesList = downcast<CSSValueList>(inValue); 3562 listIterator = maskImagesList->begin(); 3563 if (listIterator != maskImagesList->end()) 3564 maskImageValue = &downcast<WebKitCSSResourceValue>(listIterator->get()); 3565 } 3566 3567 while (maskImageValue.get()) { 3568 RefPtr<CSSValue> maskInnerValue = maskImageValue->innerValue(); 3483 3569 RefPtr<MaskImageOperation> newMaskImage; 3484 3570 3485 3571 if (is<CSSPrimitiveValue>(maskInnerValue.get())) { 3486 3572 RefPtr<CSSPrimitiveValue> primitiveValue = downcast<CSSPrimitiveValue>(maskInnerValue.get()); … … 3492 3578 3493 3579 bool isExternalDocument = (SVGURIReference::isExternalURIReference(cssUrl, m_state.document())); 3494 newMaskImage = MaskImageOperation::create( &maskImageValue, cssUrl, url.fragmentIdentifier(), isExternalDocument, m_state.document().cachedResourceLoader());3580 newMaskImage = MaskImageOperation::create(maskImageValue, cssUrl, url.fragmentIdentifier(), isExternalDocument, m_state.document().cachedResourceLoader()); 3495 3581 if (isExternalDocument) 3496 3582 m_state.maskImagesWithPendingSVGDocuments().append(newMaskImage); … … 3507 3593 3508 3594 outOperations.append(newMaskImage); 3595 3596 if (maskImagesList.get()) { 3597 listIterator++; 3598 maskImageValue = (listIterator != maskImagesList->end() ? &downcast<WebKitCSSResourceValue>(listIterator->get()) : nullptr); 3599 } else 3600 maskImageValue = nullptr; 3509 3601 } 3510 3602 … … 3630 3722 case CSSPropertyWebkitMaskImage: { 3631 3723 for (FillLayer* maskLayer = m_state.style()->accessMaskLayers(); maskLayer; maskLayer = maskLayer->next()) { 3632 auto* styleImage = maskLayer->image(); 3724 RefPtr<MaskImageOperation> maskImage = maskLayer->maskImage(); 3725 auto* styleImage = maskImage.get() ? maskImage->image() : nullptr; 3633 3726 if (is<StylePendingImage>(styleImage)) 3634 mask Layer->setImage(loadPendingImage(downcast<StylePendingImage>(*styleImage)));3727 maskImage->setImage(loadPendingImage(downcast<StylePendingImage>(*styleImage))); 3635 3728 } 3636 3729 break; -
trunk/Source/WebCore/css/StyleResolver.h
r177169 r177223 302 302 303 303 void adjustStyleForInterCharacterRuby(); 304 void adjustStyleForMaskImages(); 304 305 305 306 bool fastRejectSelector(const RuleData&) const; -
trunk/Source/WebCore/page/FrameView.cpp
r177169 r177223 4391 4391 } 4392 4392 4393 bool FrameView::containsSVGDocument() const4394 {4395 if (frame().document())4396 return frame().document()->isSVGDocument();4397 4398 return false;4399 }4400 4401 4393 void FrameView::notifyWidgetsInAllFrames(WidgetNotification notification) 4402 4394 { -
trunk/Source/WebCore/page/FrameView.h
r177169 r177223 528 528 virtual bool isVerticalDocument() const override; 529 529 virtual bool isFlippedDocument() const override; 530 virtual bool containsSVGDocument() const override;531 530 532 531 private: -
trunk/Source/WebCore/page/animation/CSSPropertyAnimation.cpp
r177169 r177223 43 43 #include "FloatConversion.h" 44 44 #include "IdentityTransformOperation.h" 45 #include "MaskImageOperation.h" 45 46 #include "Matrix3DTransformOperation.h" 46 47 #include "MatrixTransformOperation.h" … … 342 343 } 343 344 345 static inline PassRefPtr<MaskImageOperation> blendFunc(const AnimationBase* anim, const RefPtr<MaskImageOperation> from, const RefPtr<MaskImageOperation> to, double progress) 346 { 347 if (!from.get() || !to.get()) 348 return to; 349 350 // Only animates between masks using images (PNG, entire SVG, generated image). 351 // It does not animate between <mask> elements (file.svg#identifier). 352 if (from->image() && to->image()) 353 return MaskImageOperation::create(blendFunc(anim, from->image(), to->image(), progress)); 354 355 return to; 356 } 357 344 358 static inline NinePieceImage blendFunc(const AnimationBase* anim, const NinePieceImage& from, const NinePieceImage& to, double progress) 345 359 { … … 498 512 StyleImage* imageB = (b->*m_getter)(); 499 513 return StyleImage::imagesEquivalent(imageA, imageB); 514 } 515 }; 516 517 class MaskImagePropertyWrapper : public PropertyWrapper<const RefPtr<MaskImageOperation>> { 518 public: 519 MaskImagePropertyWrapper() 520 : PropertyWrapper<const RefPtr<MaskImageOperation>>(CSSPropertyWebkitMaskImage, &RenderStyle::maskImage, &RenderStyle::setMaskImage) 521 { 522 } 523 524 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const 525 { 526 // If the style pointers are the same, don't bother doing the test. 527 // If either is null, return false. If both are null, return true. 528 if (a == b) 529 return true; 530 if (!a || !b) 531 return false; 532 533 const RefPtr<MaskImageOperation> maskImageA = (a->*m_getter)(); 534 const RefPtr<MaskImageOperation> maskImageB = (b->*m_getter)(); 535 StyleImage* styleImageA = (maskImageA ? maskImageA->image() : nullptr); 536 StyleImage* styleImageB = (maskImageB ? maskImageB->image() : nullptr); 537 return StyleImage::imagesEquivalent(styleImageA, styleImageB); 500 538 } 501 539 }; … … 1153 1191 new FillLayersPropertyWrapper(CSSPropertyBackgroundImage, &RenderStyle::backgroundLayers, &RenderStyle::accessBackgroundLayers), 1154 1192 new StyleImagePropertyWrapper(CSSPropertyListStyleImage, &RenderStyle::listStyleImage, &RenderStyle::setListStyleImage), 1155 new StyleImagePropertyWrapper(CSSPropertyWebkitMaskImage, &RenderStyle::maskImage, &RenderStyle::setMaskImage),1193 new MaskImagePropertyWrapper(), 1156 1194 1157 1195 new StyleImagePropertyWrapper(CSSPropertyBorderImageSource, &RenderStyle::borderImageSource, &RenderStyle::setBorderImageSource), -
trunk/Source/WebCore/platform/ScrollView.h
r177169 r177223 411 411 virtual bool isVerticalDocument() const { return true; } 412 412 virtual bool isFlippedDocument() const { return false; } 413 virtual bool containsSVGDocument() const { return false; }414 413 415 414 // Called to update the scrollbars to accurately reflect the state of the view. -
trunk/Source/WebCore/platform/graphics/MaskImageOperation.cpp
r177169 r177223 83 83 MaskImageOperation::~MaskImageOperation() 84 84 { 85 setRenderLayerImageClient(nullptr); 86 } 87 88 bool MaskImageOperation::operator==(const MaskImageOperation& other) const 89 { 90 if (m_url.length()) 91 return (m_url == other.m_url && m_fragment == other.m_fragment && m_isExternalDocument == other.m_isExternalDocument); 92 93 return m_styleImage.get() == other.m_styleImage.get(); 85 94 } 86 95 -
trunk/Source/WebCore/platform/graphics/MaskImageOperation.h
r177169 r177223 58 58 59 59 virtual ~MaskImageOperation(); 60 61 bool operator==(const MaskImageOperation&) const; 62 inline bool operator!=(const MaskImageOperation& other) const { return !operator==(other); } 60 63 61 64 const String& url() const { return m_url; } 62 65 const String& fragment() const { return m_fragment; } 66 bool isExternalDocument() const { return m_isExternalDocument; } 63 67 StyleImage* image() const { return m_styleImage.get(); } 64 68 void setImage(PassRefPtr<StyleImage> image) { m_styleImage = image; } -
trunk/Source/WebCore/rendering/RenderBox.cpp
r177200 r177223 1531 1531 LayoutRect borderBox = borderBoxRect(); 1532 1532 for (const FillLayer* maskLayer = style().maskLayers(); maskLayer; maskLayer = maskLayer->next()) { 1533 if (maskLayer-> image()) {1533 if (maskLayer->maskImage()) { 1534 1534 BackgroundImageGeometry geometry; 1535 1535 // Masks should never have fixed attachment, so it's OK for paintContainer to be null. -
trunk/Source/WebCore/rendering/RenderBox.h
r177200 r177223 176 176 virtual LayoutRect outlineBoundsForRepaint(const RenderLayerModelObject* /*repaintContainer*/, const RenderGeometryMap*) const override final; 177 177 virtual void addFocusRingRects(Vector<IntRect>&, const LayoutPoint& additionalOffset, const RenderLayerModelObject* paintContainer = 0) override; 178 179 virtual FloatRect repaintRectInLocalCoordinates() const override { return borderBoxRect(); } 180 virtual FloatRect objectBoundingBox() const override { return borderBoxRect(); } 178 181 179 182 // Use this with caution! No type checking is done! -
trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp
r177169 r177223 28 28 29 29 #include "BorderEdge.h" 30 #include "CachedImage.h" 31 #include "CachedSVGDocument.h" 30 32 #include "FloatRoundedRect.h" 31 33 #include "Frame.h" … … 48 50 #include "RenderNamedFlowThread.h" 49 51 #include "RenderRegion.h" 52 #include "RenderSVGResourceMasker.h" 50 53 #include "RenderTable.h" 51 54 #include "RenderTableRow.h" … … 53 56 #include "RenderTextFragment.h" 54 57 #include "RenderView.h" 58 #include "SVGImageForContainer.h" 59 #include "SVGSVGElement.h" 55 60 #include "ScrollingConstraints.h" 56 61 #include "Settings.h" 62 #include "StyleCachedImage.h" 57 63 #include "TransformState.h" 58 64 #include <wtf/NeverDestroyed.h> … … 677 683 678 684 // Fast path for drawing simple color backgrounds. 679 if (!isRoot && !clippedWithLocalScrolling && !shouldPaintBackgroundImage && isBorderFill && !bgLayer-> next()) {685 if (!isRoot && !clippedWithLocalScrolling && !shouldPaintBackgroundImage && isBorderFill && !bgLayer->hasMaskImage() && !bgLayer->next()) { 680 686 if (!colorVisible) 681 687 return; … … 838 844 839 845 // no progressive loading of the background image 840 if (!baseBgColorOnly && shouldPaintBackgroundImage) {846 if (!baseBgColorOnly && (shouldPaintBackgroundImage || bgLayer->hasMaskImage())) { 841 847 BackgroundImageGeometry geometry; 842 848 calculateBackgroundImageGeometry(paintInfo.paintContainer, bgLayer, scrolledPaintRect, geometry, backgroundObject); 843 849 geometry.clip(LayoutRect(pixelSnappedRect)); 850 844 851 if (!geometry.destRect().isEmpty()) { 852 bool didPaintCustomMask = false; 845 853 CompositeOperator compositeOp = op == CompositeSourceOver ? bgLayer->composite() : op; 846 854 auto clientForBackgroundImage = backgroundObject ? backgroundObject : this; 847 RefPtr<Image> image = bgImage->image(clientForBackgroundImage, geometry.tileSize()); 848 context->setDrawLuminanceMask(bgLayer->maskSourceType() == MaskLuminance); 849 bool useLowQualityScaling = shouldPaintAtLowQuality(context, image.get(), bgLayer, geometry.tileSize()); 850 if (image.get()) 851 image->setSpaceSize(geometry.spaceSize()); 852 context->drawTiledImage(image.get(), style().colorSpace(), geometry.destRect(), geometry.relativePhase(), geometry.tileSize(), ImagePaintingOptions(compositeOp, bgLayer->blendMode(), ImageOrientationDescription(), useLowQualityScaling)); 855 RefPtr<Image> image = (bgImage ? bgImage->image(clientForBackgroundImage, geometry.tileSize()) : nullptr); 856 if (!image.get() && bgLayer->hasMaskImage()) 857 didPaintCustomMask = bgLayer->maskImage()->drawMask(*this, geometry, context, compositeOp); 858 859 if (!didPaintCustomMask && shouldPaintBackgroundImage) { 860 context->setDrawLuminanceMask(bgLayer->maskSourceType() == MaskLuminance); 861 bool useLowQualityScaling = shouldPaintAtLowQuality(context, image.get(), bgLayer, geometry.tileSize()); 862 if (image.get()) 863 image->setSpaceSize(geometry.spaceSize()); 864 context->drawTiledImage(image.get(), style().colorSpace(), geometry.destRect(), geometry.relativePhase(), geometry.tileSize(), ImagePaintingOptions(compositeOp, bgLayer->blendMode(), ImageOrientationDescription(), useLowQualityScaling)); 865 } 853 866 } 854 867 } … … 955 968 EFillSizeType type = fillLayer->size().type; 956 969 957 LayoutSize imageIntrinsicSize = calculateImageIntrinsicDimensions(image, positioningAreaSize, ScaleByEffectiveZoom); 958 imageIntrinsicSize.scale(1 / image->imageScaleFactor(), 1 / image->imageScaleFactor()); 970 LayoutSize imageIntrinsicSize; 971 if (image) { 972 imageIntrinsicSize = calculateImageIntrinsicDimensions(image, positioningAreaSize, ScaleByEffectiveZoom); 973 imageIntrinsicSize.scale(1 / image->imageScaleFactor(), 1 / image->imageScaleFactor()); 974 } else 975 imageIntrinsicSize = positioningAreaSize; 976 959 977 switch (type) { 960 978 case SizeLength: { … … 1152 1170 auto clientForBackgroundImage = backgroundObject ? backgroundObject : this; 1153 1171 LayoutSize fillTileSize = calculateFillTileSize(fillLayer, positioningAreaSize); 1154 fillLayer->image()->setContainerSizeForRenderer(clientForBackgroundImage, fillTileSize, style().effectiveZoom()); 1172 if (StyleImage* layerImage = fillLayer->image()) 1173 layerImage->setContainerSizeForRenderer(clientForBackgroundImage, fillTileSize, style().effectiveZoom()); 1174 1155 1175 geometry.setTileSize(fillTileSize); 1156 1176 -
trunk/Source/WebCore/rendering/RenderElement.cpp
r177200 r177223 119 119 if (StyleImage* maskImage = maskLayer->image()) 120 120 maskImage->removeClient(this); 121 else if (maskLayer->maskImage().get()) 122 maskLayer->maskImage()->removeRendererImageClient(this); 121 123 } 122 124 … … 324 326 { 325 327 // Optimize the common case 326 if (oldLayers && !oldLayers->next() && newLayers && !newLayers->next() && (oldLayers->image() == newLayers->image()))328 if (oldLayers && !oldLayers->next() && newLayers && !newLayers->next() && oldLayers->image() == newLayers->image() && oldLayers->maskImage() == newLayers->maskImage()) 327 329 return; 328 330 329 331 // Go through the new layers and addClients first, to avoid removing all clients of an image. 330 332 for (const FillLayer* currNew = newLayers; currNew; currNew = currNew->next()) { 331 if (currNew->image()) 332 currNew->image()->addClient(this); 333 if (StyleImage* image = currNew->image()) 334 image->addClient(this); 335 else if (currNew->maskImage().get()) 336 currNew->maskImage()->addRendererImageClient(this); 333 337 } 334 338 335 339 for (const FillLayer* currOld = oldLayers; currOld; currOld = currOld->next()) { 336 if (currOld->image()) 337 currOld->image()->removeClient(this); 340 if (StyleImage* image = currOld->image()) 341 image->removeClient(this); 342 else if (currOld->maskImage().get()) 343 currOld->maskImage()->removeRendererImageClient(this); 338 344 } 339 345 } -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r177200 r177223 6503 6503 #endif 6504 6504 updateOrRemoveFilterClients(); 6505 updateOrRemoveMaskImageClients(oldStyle); 6505 6506 6506 6507 updateNeedsCompositedScrolling(); … … 6657 6658 } 6658 6659 6660 void RenderLayer::updateOrRemoveMaskImageClients(const RenderStyle* oldStyle) 6661 { 6662 if (oldStyle && oldStyle->maskImage().get()) { 6663 if (MaskImageInfo* maskImageInfo = MaskImageInfo::getIfExists(*this)) 6664 maskImageInfo->removeMaskImageClients(*oldStyle); 6665 } 6666 6667 if (renderer().style().maskImage().get()) 6668 MaskImageInfo::get(*this).updateMaskImageClients(); 6669 else if (MaskImageInfo* maskImageInfo = MaskImageInfo::getIfExists(*this)) 6670 maskImageInfo->removeMaskImageClients(renderer().style()); 6671 } 6672 6659 6673 void RenderLayer::updateOrRemoveFilterEffectRenderer() 6660 6674 { -
trunk/Source/WebCore/rendering/RenderLayer.h
r177200 r177223 1128 1128 void updateOrRemoveFilterEffectRenderer(); 1129 1129 1130 void updateOrRemoveMaskImageClients(const RenderStyle* oldStyle); 1131 1130 1132 #if ENABLE(CSS_COMPOSITING) 1131 1133 void updateAncestorChainHasBlendingDescendants(); -
trunk/Source/WebCore/rendering/RenderLayerMaskImageInfo.cpp
r177169 r177223 78 78 RenderLayer::MaskImageInfo::~MaskImageInfo() 79 79 { 80 removeMaskImageClients( );80 removeMaskImageClients(m_layer.renderer().style()); 81 81 } 82 82 … … 93 93 void RenderLayer::MaskImageInfo::updateMaskImageClients() 94 94 { 95 removeMaskImageClients( );95 removeMaskImageClients(m_layer.renderer().style()); 96 96 97 97 const FillLayer* maskLayer = m_layer.renderer().style().maskLayers(); … … 120 120 } 121 121 122 void RenderLayer::MaskImageInfo::removeMaskImageClients( )122 void RenderLayer::MaskImageInfo::removeMaskImageClients(const RenderStyle& oldStyle) 123 123 { 124 const FillLayer* maskLayer = m_layer.renderer().style().maskLayers();124 const FillLayer* maskLayer = oldStyle.maskLayers(); 125 125 while (maskLayer) { 126 126 if (maskLayer->maskImage()) -
trunk/Source/WebCore/rendering/RenderLayerMaskImageInfo.h
r177169 r177223 81 81 82 82 void updateMaskImageClients(); 83 void removeMaskImageClients( );83 void removeMaskImageClients(const RenderStyle& oldStyle); 84 84 85 85 private: -
trunk/Source/WebCore/rendering/style/FillLayer.cpp
r177169 r177223 379 379 { 380 380 for (auto* layer = this; layer; layer = layer->m_next.get()) { 381 if (layer-> m_image)381 if (layer->image()) 382 382 return true; 383 383 } -
trunk/Source/WebCore/rendering/style/FillLayer.h
r177169 r177223 69 69 ~FillLayer(); 70 70 71 StyleImage* image() const { return hasMaskImage() ? maskImage()->image() : m_image.get(); } 71 72 const RefPtr<MaskImageOperation>& maskImage() const { return m_maskImageOperation; } 72 StyleImage* image() const { return m_image.get(); }73 StyleImage* imageOrMaskImage() const { return hasMaskImage() ? maskImage()->image() : image(); }74 73 const Length& xPosition() const { return m_xPosition; } 75 74 const Length& yPosition() const { return m_yPosition; } … … 183 182 std::unique_ptr<FillLayer> m_next; 184 183 184 // FIXME: A FillLayer will always have at least one of these pointers null. 185 // Maybe we could group them together somehow and decrease the size of FillLayer. 185 186 RefPtr<MaskImageOperation> m_maskImageOperation; 186 187 RefPtr<StyleImage> m_image; -
trunk/Source/WebCore/rendering/style/RenderStyle.cpp
r177169 r177223 831 831 return false; 832 832 } 833 834 void RenderStyle::setMaskImage(const Vector<RefPtr<MaskImageOperation>>& ops) 835 { 836 FillLayer* curLayer = &rareNonInheritedData.access()->m_mask; 837 while (curLayer) { 838 curLayer->setMaskImage(nullptr); 839 curLayer = curLayer->next(); 840 } 841 842 curLayer = &rareNonInheritedData.access()->m_mask; 843 FillLayer* prevLayer = nullptr; 844 for (auto& maskImage : ops) { 845 if (!curLayer) { 846 prevLayer->setNext(std::make_unique<FillLayer>(MaskFillLayer)); 847 curLayer = prevLayer->next(); 848 } 849 850 curLayer->setMaskImage(maskImage); 851 prevLayer = curLayer; 852 curLayer = curLayer->next(); 853 } 854 } 833 855 834 856 void RenderStyle::setClip(Length top, Length right, Length bottom, Length left) -
trunk/Source/WebCore/rendering/style/RenderStyle.h
r177169 r177223 109 109 class FontMetrics; 110 110 class IntRect; 111 class MaskImageOperation; 111 112 class Pair; 112 113 class ShadowData; … … 799 800 const FillLayer* backgroundLayers() const { return &(m_background->background()); } 800 801 801 StyleImage* maskImage() const { return rareNonInheritedData->m_mask.image(); }802 802 EFillRepeat maskRepeatX() const { return static_cast<EFillRepeat>(rareNonInheritedData->m_mask.repeatX()); } 803 803 EFillRepeat maskRepeatY() const { return static_cast<EFillRepeat>(rareNonInheritedData->m_mask.repeatY()); } … … 1026 1026 void setPageScaleTransform(float); 1027 1027 1028 bool hasMask() const { return rareNonInheritedData->m_mask.has Image() || rareNonInheritedData->m_maskBoxImage.hasImage(); }1028 bool hasMask() const { return rareNonInheritedData->m_mask.hasNonEmptyMaskImage() || rareNonInheritedData->m_mask.hasImage() || rareNonInheritedData->m_maskBoxImage.hasImage(); } 1029 1029 1030 1030 TextCombine textCombine() const { return static_cast<TextCombine>(rareNonInheritedData->m_textCombine); } … … 1127 1127 const FilterOperations& filter() const { return rareNonInheritedData->m_filter->m_operations; } 1128 1128 bool hasFilter() const { return !rareNonInheritedData->m_filter->m_operations.operations().isEmpty(); } 1129 1130 RefPtr<MaskImageOperation>& mutableMaskImage() { return rareNonInheritedData.access()->m_mask.m_maskImageOperation; } 1131 const RefPtr<MaskImageOperation> maskImage() const { return rareNonInheritedData->m_mask.maskImage(); } 1129 1132 1130 1133 #if ENABLE(FILTERS_LEVEL_2) … … 1377 1380 } 1378 1381 } 1379 1380 void setMaskImage(PassRefPtr<StyleImage> v) { rareNonInheritedData.access()->m_mask.setImage(v); }1381 1382 1382 1383 void setMaskBoxImage(const NinePieceImage& b) { SET_VAR(rareNonInheritedData, m_maskBoxImage, b); } … … 1570 1571 #endif 1571 1572 1573 void setMaskImage(const Vector<RefPtr<MaskImageOperation>>&); 1574 void setMaskImage(const RefPtr<MaskImageOperation> maskImage) { Vector<RefPtr<MaskImageOperation>> vectMask; vectMask.append(maskImage); setMaskImage(vectMask); } 1575 1572 1576 void setTabSize(unsigned size) { SET_VAR(rareInheritedData, m_tabSize, size); } 1573 1577
Note: See TracChangeset
for help on using the changeset viewer.