Changeset 186391 in webkit
- Timestamp:
- Jul 6, 2015, 6:15:01 PM (10 years ago)
- Location:
- trunk
- Files:
-
- 25 deleted
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r186388 r186391 1 2015-07-06 Simon Fraser <simon.fraser@apple.com> 2 3 Revert use of SVG <mask> elements for -webkit-mask-image (r176798, r177494, r186180) 4 https://bugs.webkit.org/show_bug.cgi?id=146653 5 6 Reviewed by Dean Jackson. 7 8 Fixes rdar://problem/21435233. 9 10 r177494 caused a number of regressions (bugs 141857, 146509, 146561), added new layering violations, and 11 was not being maintained, so revert it. 12 13 This patch reverts r177494. 14 15 * css3/masking/mask-base64-expected.html: Removed. 16 * css3/masking/mask-base64.html: Removed. 17 * css3/masking/mask-multiple-values-expected.html: Removed. 18 * css3/masking/mask-multiple-values.html: Removed. 19 * css3/masking/mask-repeat-space-padding-expected.html: 20 * css3/masking/mask-repeat-space-padding.html: 21 * css3/masking/mask-svg-clipped-fragmentId-expected.html: Removed. 22 * css3/masking/mask-svg-clipped-fragmentId.html: Removed. 23 * css3/masking/mask-svg-fragmentId-expected.html: Removed. 24 * css3/masking/mask-svg-fragmentId.html: Removed. 25 * css3/masking/mask-svg-inline-fragmentId-expected.html: Removed. 26 * css3/masking/mask-svg-inline-fragmentId.html: Removed. 27 * css3/masking/mask-svg-inline-invalid-fragmentId-expected.html: Removed. 28 * css3/masking/mask-svg-inline-invalid-fragmentId.html: Removed. 29 * css3/masking/mask-svg-invalid-fragmentId-expected.html: Removed. 30 * css3/masking/mask-svg-invalid-fragmentId.html: Removed. 31 * css3/masking/mask-svg-no-fragmentId-expected.html: Removed. 32 * css3/masking/mask-svg-no-fragmentId-tiled-expected.html: Removed. 33 * css3/masking/mask-svg-no-fragmentId-tiled.html: Removed. 34 * css3/masking/mask-svg-no-fragmentId.html: Removed. 35 * css3/masking/mask-svg-script-entire-svg-to-mask-expected.html: Removed. 36 * css3/masking/mask-svg-script-entire-svg-to-mask.html: Removed. 37 * css3/masking/mask-svg-script-mask-to-entire-svg-expected.html: Removed. 38 * css3/masking/mask-svg-script-mask-to-entire-svg.html: Removed. 39 * css3/masking/mask-svg-script-mask-to-none-expected.html: Removed. 40 * css3/masking/mask-svg-script-mask-to-none.html: Removed. 41 * css3/masking/mask-svg-script-mask-to-png-expected.html: Removed. 42 * css3/masking/mask-svg-script-mask-to-png.html: Removed. 43 * css3/masking/mask-svg-script-none-to-mask-expected.html: Removed. 44 * css3/masking/mask-svg-script-none-to-mask.html: Removed. 45 * css3/masking/mask-svg-script-none-to-png-expected.html: Removed. 46 * css3/masking/mask-svg-script-none-to-png.html: Removed. 47 * css3/masking/mask-svg-script-png-to-mask-expected.html: Removed. 48 * css3/masking/mask-svg-script-png-to-mask.html: Removed. 49 * css3/masking/mask-svg-script-png-to-none-expected.html: Removed. 50 * css3/masking/mask-svg-script-png-to-none.html: Removed. 51 * css3/masking/resources/masks.svg: Removed. 52 1 53 2015-07-06 Daniel Bates <dabates@apple.com> 2 54 -
trunk/LayoutTests/css3/masking/mask-repeat-space-padding-expected.html
r177494 r186391 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. svg)");29 urls.push("url(resources/circle.png)"); 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
r177494 r186391 14 14 border: 50px solid blue; 15 15 padding: 50px; 16 -webkit-mask-image: url("resources/circle. svg");16 -webkit-mask-image: url("resources/circle.png"); 17 17 -webkit-mask-size: 100px; 18 18 -webkit-mask-repeat: space; -
trunk/Source/WebCore/ChangeLog
r186390 r186391 1 2015-07-06 Simon Fraser <simon.fraser@apple.com> 2 3 Revert use of SVG <mask> elements for -webkit-mask-image (r176798, r177494, r186180) 4 https://bugs.webkit.org/show_bug.cgi?id=146653 5 6 Reviewed by Dean Jackson. 7 8 Fixes rdar://problem/21435233. 9 10 r177494 caused a number of regressions (bugs 141857, 146509, 146561), added new layering violations, and 11 was not being maintained, so revert it. 12 13 This patch reverts r177494. 14 15 * WebCore.xcodeproj/project.pbxproj: 16 * css/CSSComputedStyleDeclaration.cpp: 17 (WebCore::ComputedStyleExtractor::propertyValue): 18 * css/CSSParser.cpp: 19 (WebCore::CSSParser::parseFillProperty): 20 (WebCore::CSSParser::parseMaskImage): Deleted. 21 * css/CSSParser.h: 22 * css/CSSPropertyNames.in: 23 * css/CSSValue.h: 24 * css/StyleBuilderConverter.h: 25 (WebCore::StyleBuilderConverter::convertMaskImageOperations): Deleted. 26 * css/StyleResolver.cpp: 27 (WebCore::StyleResolver::loadPendingSVGDocuments): 28 (WebCore::StyleResolver::loadPendingImages): 29 (WebCore::StyleResolver::adjustStyleForMaskImages): Deleted. 30 (WebCore::StyleResolver::applyMatchedProperties): Deleted. 31 * css/StyleResolver.h: 32 * page/FrameView.cpp: 33 (WebCore::FrameView::containsSVGDocument): 34 * page/FrameView.h: 35 * page/animation/CSSPropertyAnimation.cpp: 36 (WebCore::CSSPropertyAnimationWrapperMap::CSSPropertyAnimationWrapperMap): 37 (WebCore::blendFunc): Deleted. 38 (WebCore::MaskImagePropertyWrapper::MaskImagePropertyWrapper): Deleted. 39 (WebCore::MaskImagePropertyWrapper::equals): Deleted. 40 * platform/ScrollView.h: 41 (WebCore::ScrollView::containsSVGDocument): 42 * platform/graphics/MaskImageOperation.cpp: 43 (WebCore::MaskImageOperation::~MaskImageOperation): Deleted. 44 (WebCore::MaskImageOperation::operator==): Deleted. 45 * platform/graphics/MaskImageOperation.h: 46 * rendering/RenderBox.cpp: 47 (WebCore::RenderBox::maskClipRect): 48 * rendering/RenderBoxModelObject.cpp: 49 (WebCore::RenderBoxModelObject::paintFillLayerExtended): 50 * rendering/RenderElement.cpp: 51 (WebCore::RenderElement::updateFillImages): 52 (WebCore::RenderElement::~RenderElement): Deleted. 53 * rendering/RenderLayer.cpp: 54 (WebCore::RenderLayer::~RenderLayer): Deleted. 55 (WebCore::RenderLayer::calculateClipRects): Deleted. 56 * rendering/RenderLayer.h: 57 * rendering/RenderLayerMaskImageInfo.cpp: Removed. 58 * rendering/style/FillLayer.h: 59 (WebCore::FillLayer::image): 60 (WebCore::FillLayer::imageOrMaskImage): 61 * rendering/style/RenderStyle.cpp: 62 (WebCore::RenderStyle::setMaskImage): Deleted. 63 * rendering/style/RenderStyle.h: 64 1 65 2015-07-06 Simon Fraser <simon.fraser@apple.com> 2 66 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r186375 r186391 2329 2329 6C6CCAB019DC42B90043D5DB /* WebKitCSSResourceValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6C6CCAAE19DC42B90043D5DB /* WebKitCSSResourceValue.cpp */; }; 2330 2330 6C6CCAB119DC42B90043D5DB /* WebKitCSSResourceValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C6CCAAF19DC42B90043D5DB /* WebKitCSSResourceValue.h */; }; 2331 6CBFE4A419EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6CBFE4A219EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp */; };2332 2331 6CBFE4A519EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CBFE4A319EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h */; }; 2333 2332 6CDDE8D01770BB220016E072 /* RegionOversetState.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C70A81417707C49009A446E /* RegionOversetState.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 9611 9610 6C6CCAAF19DC42B90043D5DB /* WebKitCSSResourceValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKitCSSResourceValue.h; sourceTree = "<group>"; }; 9612 9611 6C70A81417707C49009A446E /* RegionOversetState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegionOversetState.h; sourceTree = "<group>"; }; 9613 6CBFE4A219EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderLayerMaskImageInfo.cpp; sourceTree = "<group>"; };9614 9612 6CBFE4A319EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderLayerMaskImageInfo.h; sourceTree = "<group>"; }; 9615 9613 6E0E5699183BFFE600E0E8D5 /* FloatRoundedRect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FloatRoundedRect.cpp; sourceTree = "<group>"; }; … … 22880 22878 50D10D971545F5760096D288 /* RenderLayerFilterInfo.cpp */, 22881 22879 50D10D981545F5760096D288 /* RenderLayerFilterInfo.h */, 22882 6CBFE4A219EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp */,22883 22880 6CBFE4A319EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h */, 22884 22881 3C244FE5A375AC633F88BE6F /* RenderLayerModelObject.cpp */, … … 29810 29807 0F580CFE0F12DE9B0051D689 /* RenderLayerCompositor.cpp in Sources */, 29811 29808 50D10D991545F5760096D288 /* RenderLayerFilterInfo.cpp in Sources */, 29812 6CBFE4A419EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp in Sources */,29813 29809 3C244FEBA375AC633F88BE6F /* RenderLayerModelObject.cpp in Sources */, 29814 29810 BC33FB1B0F30EE85002CDD7C /* RenderLineBoxList.cpp in Sources */, -
trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp
r185238 r186391 1907 1907 case CSSPropertyBackgroundColor: 1908 1908 return cssValuePool().createColorValue(m_allowVisitedStyle? style->visitedDependentColor(CSSPropertyBackgroundColor).rgb() : style->backgroundColor().rgb()); 1909 case CSSPropertyBackgroundImage: { 1910 const FillLayer* layers = style->backgroundLayers(); 1909 case CSSPropertyBackgroundImage: 1910 case CSSPropertyWebkitMaskImage: { 1911 const FillLayer* layers = propertyID == CSSPropertyWebkitMaskImage ? style->maskLayers() : style->backgroundLayers(); 1911 1912 if (!layers) 1912 1913 return cssValuePool().createIdentifierValue(CSSValueNone); … … 1923 1924 if (currLayer->image()) 1924 1925 list->append(*currLayer->image()->cssValue()); 1925 else1926 list->append(cssValuePool().createIdentifierValue(CSSValueNone));1927 }1928 return list.release();1929 }1930 case CSSPropertyWebkitMaskImage: {1931 const FillLayer* layers = style->maskLayers();1932 if (!layers)1933 return cssValuePool().createIdentifierValue(CSSValueNone);1934 1935 if (!layers->next()) {1936 if (layers->maskImage().get())1937 return layers->maskImage()->cssValue();1938 1939 return cssValuePool().createIdentifierValue(CSSValueNone);1940 }1941 1942 RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();1943 for (const FillLayer* currLayer = layers; currLayer; currLayer = currLayer->next()) {1944 if (currLayer->maskImage().get())1945 list->append(*currLayer->maskImage()->cssValue());1946 1926 else 1947 1927 list->append(cssValuePool().createIdentifierValue(CSSValueNone)); -
trunk/Source/WebCore/css/CSSParser.cpp
r186279 r186391 91 91 #include "WebKitCSSFilterValue.h" 92 92 #include "WebKitCSSRegionRule.h" 93 #include "WebKitCSSResourceValue.h"94 93 #include "WebKitCSSTransformValue.h" 95 94 #include <JavaScriptCore/Profile.h> … … 4705 4704 break; 4706 4705 case CSSPropertyBackgroundImage: 4706 case CSSPropertyWebkitMaskImage: 4707 4707 if (parseFillImage(*m_valueList, currValue)) 4708 m_valueList->next();4709 break;4710 case CSSPropertyWebkitMaskImage:4711 if (parseMaskImage(*m_valueList, currValue))4712 4708 m_valueList->next(); 4713 4709 break; … … 9912 9908 } 9913 9909 9914 bool CSSParser::parseMaskImage(CSSParserValueList& valueList, RefPtr<CSSValue>& outValue)9915 {9916 outValue = nullptr;9917 CSSParserValue* value = valueList.current();9918 if (value->id == CSSValueNone) {9919 outValue = WebKitCSSResourceValue::create(cssValuePool().createIdentifierValue(CSSValueNone));9920 return outValue.get();9921 }9922 9923 RefPtr<CSSValue> resourceValue;9924 if (value->unit == CSSPrimitiveValue::CSS_URI) {9925 if (protocolIs(value->string, "data"))9926 parseFillImage(valueList, resourceValue);9927 else9928 resourceValue = CSSPrimitiveValue::create(completeURL(value->string), CSSPrimitiveValue::CSS_URI);9929 } else9930 parseFillImage(valueList, resourceValue);9931 9932 if (resourceValue)9933 outValue = WebKitCSSResourceValue::create(resourceValue);9934 9935 return outValue.get();9936 }9937 9938 9910 #if ENABLE(CSS_REGIONS) 9939 9911 static bool validFlowName(const String& flowName) -
trunk/Source/WebCore/css/CSSParser.h
r185908 r186391 158 158 SourceSize sourceSize(std::unique_ptr<MediaQueryExp>&&, CSSParserValue&); 159 159 160 // FIXME: Maybe these two methods could be combined into one.161 bool parseMaskImage(CSSParserValueList&, RefPtr<CSSValue>&);162 160 bool parseFillImage(CSSParserValueList&, RefPtr<CSSValue>&); 163 161 -
trunk/Source/WebCore/css/CSSPropertyNames.in
r185925 r186391 539 539 -webkit-mask-clip [FillLayerProperty, NameForMethods=Clip] 540 540 -webkit-mask-composite [FillLayerProperty, NameForMethods=Composite] 541 -webkit-mask-image [ Custom=Initial|Inherit, Converter=MaskImageOperations]541 -webkit-mask-image [FillLayerProperty, NameForMethods=Image] 542 542 -webkit-mask-origin [FillLayerProperty, NameForMethods=Origin] 543 543 -webkit-mask-position [Longhands=-webkit-mask-position-x|-webkit-mask-position-y] -
trunk/Source/WebCore/css/CSSValue.h
r185731 r186391 172 172 SVGColorClass, 173 173 SVGPaintClass, 174 WebKitCSSResourceClass,175 174 176 175 #if ENABLE(CSS_ANIMATIONS_LEVEL_2) … … 190 189 GridLineNamesClass, 191 190 #endif 191 WebKitCSSResourceClass 192 192 193 193 // Do not append non-list class types here. -
trunk/Source/WebCore/css/StyleBuilderConverter.h
r185925 r186391 105 105 static Optional<Length> convertMarqueeIncrement(StyleResolver&, CSSValue&); 106 106 static Optional<FilterOperations> convertFilterOperations(StyleResolver&, CSSValue&); 107 static Vector<RefPtr<MaskImageOperation>> convertMaskImageOperations(StyleResolver&, CSSValue&);108 107 #if PLATFORM(IOS) 109 108 static bool convertTouchCallout(StyleResolver&, CSSValue&); … … 1014 1013 } 1015 1014 1016 inline Vector<RefPtr<MaskImageOperation>> StyleBuilderConverter::convertMaskImageOperations(StyleResolver& styleResolver, CSSValue& value)1017 {1018 Vector<RefPtr<MaskImageOperation>> operations;1019 RefPtr<WebKitCSSResourceValue> maskImageValue;1020 RefPtr<CSSValueList> maskImagesList;1021 CSSValueList::iterator listIterator;1022 if (is<WebKitCSSResourceValue>(value))1023 maskImageValue = &downcast<WebKitCSSResourceValue>(value);1024 else if (is<CSSValueList>(value)) {1025 maskImagesList = &downcast<CSSValueList>(value);1026 listIterator = maskImagesList->begin();1027 maskImageValue = maskImageValueFromIterator(*maskImagesList, listIterator);1028 }1029 1030 while (maskImageValue.get()) {1031 RefPtr<CSSValue> maskInnerValue = maskImageValue->innerValue();1032 1033 RefPtr<MaskImageOperation> newMaskImage;1034 if (is<CSSPrimitiveValue>(maskInnerValue.get())) {1035 RefPtr<CSSPrimitiveValue> primitiveValue = downcast<CSSPrimitiveValue>(maskInnerValue.get());1036 if (primitiveValue->isValueID() && primitiveValue->getValueID() == CSSValueNone)1037 newMaskImage = MaskImageOperation::create();1038 else {1039 String cssUrl = primitiveValue->getStringValue();1040 URL url = styleResolver.document().completeURL(cssUrl);1041 1042 bool isExternalDocument = SVGURIReference::isExternalURIReference(cssUrl, styleResolver.document());1043 newMaskImage = MaskImageOperation::create(maskImageValue, cssUrl, url.fragmentIdentifier(), isExternalDocument, &styleResolver.document().cachedResourceLoader());1044 if (isExternalDocument)1045 styleResolver.state().maskImagesWithPendingSVGDocuments().append(newMaskImage);1046 }1047 } else {1048 if (RefPtr<StyleImage> image = styleResolver.styleImage(CSSPropertyWebkitMaskImage, *maskInnerValue))1049 newMaskImage = MaskImageOperation::create(image);1050 }1051 1052 // If we didn't get a valid value, use None so we keep the correct number and order of masks.1053 if (!newMaskImage)1054 newMaskImage = MaskImageOperation::create();1055 1056 operations.append(newMaskImage);1057 1058 if (maskImagesList)1059 maskImageValue = maskImageValueFromIterator(*maskImagesList, ++listIterator);1060 else1061 maskImageValue = nullptr;1062 }1063 1064 return operations;1065 }1066 1067 1015 inline RefPtr<FontFeatureSettings> StyleBuilderConverter::convertFontFeatureSettings(StyleResolver&, CSSValue& value) 1068 1016 { -
trunk/Source/WebCore/css/StyleResolver.cpp
r186388 r186391 1159 1159 } 1160 1160 1161 void StyleResolver::adjustStyleForMaskImages()1162 {1163 // If we already have the same mask image objects loaded on the old style,1164 // use the old ones instead of loading new ones.1165 RenderStyle* newStyle = m_state.style();1166 RenderStyle* oldStyle = (m_state.element() ? m_state.element()->renderStyle() : nullptr);1167 1168 if (newStyle && oldStyle) {1169 Vector<RefPtr<MaskImageOperation>> removedExternalResources;1170 1171 // Get all mask objects from the old style in a vector1172 // so we can remove them as we match them, making the following steps faster.1173 Vector<RefPtr<MaskImageOperation>> oldStyleMaskImages;1174 const FillLayer* oldMaskLayer = oldStyle->maskLayers();1175 while (oldMaskLayer) {1176 RefPtr<MaskImageOperation> oldMaskImage = oldMaskLayer->maskImage();1177 if (oldMaskImage.get())1178 oldStyleMaskImages.append(oldMaskImage);1179 1180 oldMaskLayer = oldMaskLayer->next();1181 }1182 1183 if (oldStyleMaskImages.isEmpty())1184 return;1185 1186 // Try to match the new mask objects through the list from the old style.1187 // This should work perfectly and optimal when the list of masks remained1188 // the same and also work correctly (but slower) when they were reordered.1189 FillLayer* newMaskLayer = &newStyle->ensureMaskLayers();1190 int countOldStyleMaskImages = oldStyleMaskImages.size();1191 while (newMaskLayer && countOldStyleMaskImages) {1192 RefPtr<MaskImageOperation> newMaskImage = newMaskLayer->maskImage();1193 if (newMaskImage.get()) {1194 for (int i = 0; i < countOldStyleMaskImages; i++) {1195 RefPtr<MaskImageOperation> oldMaskImage = oldStyleMaskImages[i];1196 if (*oldMaskImage == *newMaskImage) {1197 newMaskLayer->setMaskImage(oldMaskImage);1198 if (newMaskImage->isExternalDocument())1199 removedExternalResources.append(newMaskImage);1200 1201 oldStyleMaskImages.remove(i);1202 countOldStyleMaskImages--;1203 break;1204 }1205 }1206 }1207 1208 newMaskLayer = newMaskLayer->next();1209 }1210 1211 Vector<RefPtr<MaskImageOperation>>& pendingResources = m_state.maskImagesWithPendingSVGDocuments();1212 pendingResources.removeAllMatching([&removedExternalResources] (const RefPtr<MaskImageOperation>& resource) {1213 return removedExternalResources.contains(resource);1214 });1215 }1216 }1217 1218 1161 void StyleResolver::adjustRenderStyle(RenderStyle& style, const RenderStyle& parentStyle, Element *e) 1219 1162 { … … 1811 1754 // so to preserve behavior, we queue them up during cascade and flush here. 1812 1755 cascade.applyDeferredProperties(*this); 1813 1814 adjustStyleForMaskImages();1815 1756 1816 1757 // Start loading resources referenced by this style. … … 2240 2181 // reentering styleForElement(). 2241 2182 ASSERT(state.style()); 2242 if (!state.style()) 2243 return; 2244 2245 bool hasFilters = (state.style()->hasFilter() && !state.filtersWithPendingSVGDocuments().isEmpty()); 2246 bool hasMasks = (state.style()->hasMask() && !state.maskImagesWithPendingSVGDocuments().isEmpty()); 2247 2248 if (!hasFilters && !hasMasks) 2183 if (!state.style() || !state.style()->hasFilter() || state.filtersWithPendingSVGDocuments().isEmpty()) 2249 2184 return; 2250 2185 … … 2254 2189 CachedResourceLoader& cachedResourceLoader = state.document().cachedResourceLoader(); 2255 2190 2256 if (hasFilters) { 2257 for (auto& filterOperation : state.filtersWithPendingSVGDocuments()) 2258 filterOperation->getOrCreateCachedSVGDocumentReference()->load(cachedResourceLoader, options); 2259 2260 state.filtersWithPendingSVGDocuments().clear(); 2261 } 2262 2263 if (hasMasks) { 2264 for (auto& maskImageOperation : state.maskImagesWithPendingSVGDocuments()) 2265 maskImageOperation->ensureCachedSVGDocumentReference()->load(cachedResourceLoader, options); 2266 2267 state.maskImagesWithPendingSVGDocuments().clear(); 2268 } 2191 for (auto& filterOperation : state.filtersWithPendingSVGDocuments()) 2192 filterOperation->getOrCreateCachedSVGDocumentReference()->load(cachedResourceLoader, options); 2193 2194 state.filtersWithPendingSVGDocuments().clear(); 2269 2195 } 2270 2196 … … 2529 2455 case CSSPropertyWebkitMaskImage: { 2530 2456 for (FillLayer* maskLayer = &m_state.style()->ensureMaskLayers(); maskLayer; maskLayer = maskLayer->next()) { 2531 RefPtr<MaskImageOperation> maskImage = maskLayer->maskImage(); 2532 auto* styleImage = maskImage.get() ? maskImage->image() : nullptr; 2457 auto* styleImage = maskLayer->image(); 2533 2458 if (is<StylePendingImage>(styleImage)) 2534 mask Image->setImage(loadPendingImage(downcast<StylePendingImage>(*styleImage)));2459 maskLayer->setImage(loadPendingImage(downcast<StylePendingImage>(*styleImage))); 2535 2460 } 2536 2461 break; -
trunk/Source/WebCore/css/StyleResolver.h
r182224 r186391 303 303 304 304 void adjustStyleForInterCharacterRuby(); 305 void adjustStyleForMaskImages();306 305 307 306 bool fastRejectSelector(const RuleData&) const; -
trunk/Source/WebCore/page/FrameView.cpp
r186269 r186391 4509 4509 } 4510 4510 4511 bool FrameView::containsSVGDocument() const 4512 { 4513 if (frame().document()) 4514 return frame().document()->isSVGDocument(); 4515 4516 return false; 4517 } 4518 4511 4519 void FrameView::notifyWidgetsInAllFrames(WidgetNotification notification) 4512 4520 { -
trunk/Source/WebCore/page/FrameView.h
r186165 r186391 562 562 virtual bool isVerticalDocument() const override; 563 563 virtual bool isFlippedDocument() const override; 564 virtual bool containsSVGDocument() const override; 564 565 565 566 private: -
trunk/Source/WebCore/page/animation/CSSPropertyAnimation.cpp
r185925 r186391 43 43 #include "FloatConversion.h" 44 44 #include "IdentityTransformOperation.h" 45 #include "MaskImageOperation.h"46 45 #include "Matrix3DTransformOperation.h" 47 46 #include "MatrixTransformOperation.h" … … 349 348 } 350 349 351 static inline PassRefPtr<MaskImageOperation> blendFunc(const AnimationBase* anim, const RefPtr<MaskImageOperation> from, const RefPtr<MaskImageOperation> to, double progress)352 {353 if (!from.get() || !to.get())354 return to;355 356 // Only animates between masks using images (PNG, entire SVG, generated image).357 // It does not animate between <mask> elements (file.svg#identifier).358 if (from->image() && to->image())359 return MaskImageOperation::create(blendFunc(anim, from->image(), to->image(), progress));360 361 return to;362 }363 364 350 static inline NinePieceImage blendFunc(const AnimationBase* anim, const NinePieceImage& from, const NinePieceImage& to, double progress) 365 351 { … … 525 511 StyleImage* imageB = (b->*m_getter)(); 526 512 return StyleImage::imagesEquivalent(imageA, imageB); 527 }528 };529 530 class MaskImagePropertyWrapper : public PropertyWrapper<const RefPtr<MaskImageOperation>> {531 WTF_MAKE_FAST_ALLOCATED;532 public:533 MaskImagePropertyWrapper()534 : PropertyWrapper<const RefPtr<MaskImageOperation>>(CSSPropertyWebkitMaskImage, &RenderStyle::maskImage, &RenderStyle::setMaskImage)535 {536 }537 538 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const539 {540 // If the style pointers are the same, don't bother doing the test.541 // If either is null, return false. If both are null, return true.542 if (a == b)543 return true;544 if (!a || !b)545 return false;546 547 const RefPtr<MaskImageOperation> maskImageA = (a->*m_getter)();548 const RefPtr<MaskImageOperation> maskImageB = (b->*m_getter)();549 StyleImage* styleImageA = (maskImageA ? maskImageA->image() : nullptr);550 StyleImage* styleImageB = (maskImageB ? maskImageB->image() : nullptr);551 return StyleImage::imagesEquivalent(styleImageA, styleImageB);552 513 } 553 514 }; … … 1240 1201 new FillLayersPropertyWrapper(CSSPropertyBackgroundImage, &RenderStyle::backgroundLayers, &RenderStyle::ensureBackgroundLayers), 1241 1202 new StyleImagePropertyWrapper(CSSPropertyListStyleImage, &RenderStyle::listStyleImage, &RenderStyle::setListStyleImage), 1242 new MaskImagePropertyWrapper(),1203 new StyleImagePropertyWrapper(CSSPropertyWebkitMaskImage, &RenderStyle::maskImage, &RenderStyle::setMaskImage), 1243 1204 1244 1205 new StyleImagePropertyWrapper(CSSPropertyBorderImageSource, &RenderStyle::borderImageSource, &RenderStyle::setBorderImageSource), -
trunk/Source/WebCore/platform/ScrollView.h
r185893 r186391 409 409 virtual bool isVerticalDocument() const { return true; } 410 410 virtual bool isFlippedDocument() const { return false; } 411 virtual bool containsSVGDocument() const { return false; } 411 412 412 413 // Called to update the scrollbars to accurately reflect the state of the view. -
trunk/Source/WebCore/platform/graphics/MaskImageOperation.cpp
r186390 r186391 83 83 MaskImageOperation::~MaskImageOperation() 84 84 { 85 setRenderLayerImageClient(nullptr);86 }87 88 bool MaskImageOperation::operator==(const MaskImageOperation& other) const89 {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();94 85 } 95 86 -
trunk/Source/WebCore/platform/graphics/MaskImageOperation.h
r184749 r186391 56 56 57 57 virtual ~MaskImageOperation(); 58 59 bool operator==(const MaskImageOperation&) const;60 inline bool operator!=(const MaskImageOperation& other) const { return !operator==(other); }61 58 62 59 const String& url() const { return m_url; } 63 60 const String& fragment() const { return m_fragment; } 64 bool isExternalDocument() const { return m_isExternalDocument; }65 61 StyleImage* image() const { return m_styleImage.get(); } 66 62 void setImage(PassRefPtr<StyleImage>); -
trunk/Source/WebCore/rendering/RenderBox.cpp
r186279 r186391 1574 1574 LayoutRect borderBox = borderBoxRect(); 1575 1575 for (const FillLayer* maskLayer = style().maskLayers(); maskLayer; maskLayer = maskLayer->next()) { 1576 if (maskLayer-> maskImage()) {1576 if (maskLayer->image()) { 1577 1577 // Masks should never have fixed attachment, so it's OK for paintContainer to be null. 1578 1578 BackgroundImageGeometry geometry = calculateBackgroundImageGeometry(nullptr, *maskLayer, paintOffset, borderBox); -
trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp
r186299 r186391 28 28 29 29 #include "BorderEdge.h" 30 #include "CachedImage.h"31 #include "CachedSVGDocument.h"32 30 #include "FloatRoundedRect.h" 33 31 #include "Frame.h" … … 50 48 #include "RenderNamedFlowThread.h" 51 49 #include "RenderRegion.h" 52 #include "RenderSVGResourceMasker.h"53 50 #include "RenderTable.h" 54 51 #include "RenderTableRow.h" … … 56 53 #include "RenderTextFragment.h" 57 54 #include "RenderView.h" 58 #include "SVGImageForContainer.h"59 55 #include "ScrollingConstraints.h" 60 56 #include "Settings.h" 61 #include "StyleCachedImage.h"62 57 #include "TransformState.h" 63 58 #include <wtf/NeverDestroyed.h> … … 685 680 686 681 // Fast path for drawing simple color backgrounds. 687 if (!isRoot && !clippedWithLocalScrolling && !shouldPaintBackgroundImage && isBorderFill && !bgLayer-> hasMaskImage() && !bgLayer->next()) {682 if (!isRoot && !clippedWithLocalScrolling && !shouldPaintBackgroundImage && isBorderFill && !bgLayer->next()) { 688 683 if (!colorVisible) 689 684 return; … … 845 840 846 841 // no progressive loading of the background image 847 if (!baseBgColorOnly && (shouldPaintBackgroundImage || bgLayer->hasMaskImage())) {842 if (!baseBgColorOnly && shouldPaintBackgroundImage) { 848 843 BackgroundImageGeometry geometry = calculateBackgroundImageGeometry(paintInfo.paintContainer, *bgLayer, rect.location(), scrolledPaintRect, backgroundObject); 849 844 geometry.clip(LayoutRect(pixelSnappedRect)); 850 851 845 if (!geometry.destRect().isEmpty()) { 852 bool didPaintCustomMask = false;853 846 CompositeOperator compositeOp = op == CompositeSourceOver ? bgLayer->composite() : op; 854 847 auto clientForBackgroundImage = backgroundObject ? backgroundObject : this; 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(), toLayoutPoint(geometry.relativePhase()), geometry.tileSize(), ImagePaintingOptions(compositeOp, bgLayer->blendMode(), ImageOrientationDescription(), useLowQualityScaling)); 865 } 848 RefPtr<Image> image = bgImage->image(clientForBackgroundImage, geometry.tileSize()); 849 context->setDrawLuminanceMask(bgLayer->maskSourceType() == MaskLuminance); 850 bool useLowQualityScaling = shouldPaintAtLowQuality(context, image.get(), bgLayer, geometry.tileSize()); 851 if (image.get()) 852 image->setSpaceSize(geometry.spaceSize()); 853 context->drawTiledImage(image.get(), style().colorSpace(), geometry.destRect(), toLayoutPoint(geometry.relativePhase()), geometry.tileSize(), ImagePaintingOptions(compositeOp, bgLayer->blendMode(), ImageOrientationDescription(), useLowQualityScaling)); 866 854 } 867 855 } -
trunk/Source/WebCore/rendering/RenderElement.cpp
r185606 r186391 124 124 if (StyleImage* maskImage = maskLayer->image()) 125 125 maskImage->removeClient(this); 126 else if (maskLayer->maskImage().get())127 maskLayer->maskImage()->removeRendererImageClient(this);128 126 } 129 127 … … 333 331 // Go through the new layers and addClients first, to avoid removing all clients of an image. 334 332 for (const FillLayer* currNew = newLayers; currNew; currNew = currNew->next()) { 335 if (StyleImage* image = currNew->image()) 336 image->addClient(this); 337 else if (currNew->maskImage().get()) 338 currNew->maskImage()->addRendererImageClient(this); 333 if (currNew->image()) 334 currNew->image()->addClient(this); 339 335 } 340 336 341 337 for (const FillLayer* currOld = oldLayers; currOld; currOld = currOld->next()) { 342 if (StyleImage* image = currOld->image()) 343 image->removeClient(this); 344 else if (currOld->maskImage().get()) 345 currOld->maskImage()->removeRendererImageClient(this); 338 if (currOld->image()) 339 currOld->image()->removeClient(this); 346 340 } 347 341 } -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r185858 r186391 371 371 372 372 FilterInfo::remove(*this); 373 MaskImageInfo::remove(*this);374 373 375 374 // Child layers will be deleted by their corresponding render objects, so … … 6714 6713 #endif 6715 6714 updateOrRemoveFilterClients(); 6716 updateOrRemoveMaskImageClients();6717 6715 6718 6716 updateNeedsCompositedScrolling(); … … 6869 6867 } 6870 6868 6871 void RenderLayer::updateOrRemoveMaskImageClients()6872 {6873 if (renderer().style().maskImage().get())6874 MaskImageInfo::get(*this).updateMaskImageClients();6875 else if (MaskImageInfo* maskImageInfo = MaskImageInfo::getIfExists(*this))6876 maskImageInfo->removeMaskImageClients();6877 }6878 6879 6869 void RenderLayer::updateOrRemoveFilterEffectRenderer() 6880 6870 { -
trunk/Source/WebCore/rendering/RenderLayer.h
r184932 r186391 921 921 void updateOrRemoveFilterClients(); 922 922 void updateOrRemoveFilterEffectRenderer(); 923 void updateOrRemoveMaskImageClients();924 923 925 924 #if ENABLE(CSS_COMPOSITING) -
trunk/Source/WebCore/rendering/style/FillLayer.h
r186279 r186391 69 69 ~FillLayer(); 70 70 71 StyleImage* image() const { return hasMaskImage() ? maskImage()->image() : m_image.get(); }72 71 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(); } 73 74 const Length& xPosition() const { return m_xPosition; } 74 75 const Length& yPosition() const { return m_yPosition; } … … 182 183 std::unique_ptr<FillLayer> m_next; 183 184 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.186 185 RefPtr<MaskImageOperation> m_maskImageOperation; 187 186 RefPtr<StyleImage> m_image; -
trunk/Source/WebCore/rendering/style/RenderStyle.cpp
r186279 r186391 896 896 return false; 897 897 } 898 899 void RenderStyle::setMaskImage(const Vector<RefPtr<MaskImageOperation>>& ops)900 {901 FillLayer* curLayer = &rareNonInheritedData.access()->m_mask;902 while (curLayer) {903 curLayer->setMaskImage(nullptr);904 curLayer = curLayer->next();905 }906 907 curLayer = &rareNonInheritedData.access()->m_mask;908 FillLayer* prevLayer = nullptr;909 for (auto& maskImage : ops) {910 if (!curLayer) {911 prevLayer->setNext(std::make_unique<FillLayer>(MaskFillLayer));912 curLayer = prevLayer->next();913 }914 915 curLayer->setMaskImage(maskImage);916 prevLayer = curLayer;917 curLayer = curLayer->next();918 }919 }920 898 921 899 void RenderStyle::setClip(Length top, Length right, Length bottom, Length left) -
trunk/Source/WebCore/rendering/style/RenderStyle.h
r185238 r186391 108 108 class FontMetrics; 109 109 class IntRect; 110 class MaskImageOperation;111 110 class Pair; 112 111 class ShadowData; … … 810 809 const FillLayer* backgroundLayers() const { return &(m_background->background()); } 811 810 811 StyleImage* maskImage() const { return rareNonInheritedData->m_mask.image(); } 812 812 EFillRepeat maskRepeatX() const { return static_cast<EFillRepeat>(rareNonInheritedData->m_mask.repeatX()); } 813 813 EFillRepeat maskRepeatY() const { return static_cast<EFillRepeat>(rareNonInheritedData->m_mask.repeatY()); } … … 1050 1050 void setPageScaleTransform(float); 1051 1051 1052 bool hasMask() const { return rareNonInheritedData->m_mask.has NonEmptyMaskImage() || rareNonInheritedData->m_mask.hasImage() || rareNonInheritedData->m_maskBoxImage.hasImage(); }1052 bool hasMask() const { return rareNonInheritedData->m_mask.hasImage() || rareNonInheritedData->m_maskBoxImage.hasImage(); } 1053 1053 1054 1054 TextCombine textCombine() const { return static_cast<TextCombine>(rareNonInheritedData->m_textCombine); } … … 1156 1156 const FilterOperations& filter() const { return rareNonInheritedData->m_filter->m_operations; } 1157 1157 bool hasFilter() const { return !rareNonInheritedData->m_filter->m_operations.operations().isEmpty(); } 1158 1159 RefPtr<MaskImageOperation>& mutableMaskImage() { return rareNonInheritedData.access()->m_mask.m_maskImageOperation; }1160 const RefPtr<MaskImageOperation> maskImage() const { return rareNonInheritedData->m_mask.maskImage(); }1161 1158 1162 1159 #if ENABLE(FILTERS_LEVEL_2) … … 1413 1410 } 1414 1411 } 1412 1413 void setMaskImage(PassRefPtr<StyleImage> v) { rareNonInheritedData.access()->m_mask.setImage(v); } 1415 1414 1416 1415 void setMaskBoxImage(const NinePieceImage& b) { SET_VAR(rareNonInheritedData, m_maskBoxImage, b); } … … 1619 1618 #endif 1620 1619 1621 void setMaskImage(const Vector<RefPtr<MaskImageOperation>>&);1622 void setMaskImage(const RefPtr<MaskImageOperation> maskImage) { Vector<RefPtr<MaskImageOperation>> vectMask; vectMask.append(maskImage); setMaskImage(vectMask); }1623 1624 1620 void setTabSize(unsigned size) { SET_VAR(rareInheritedData, m_tabSize, size); } 1625 1621
Note:
See TracChangeset
for help on using the changeset viewer.