Changeset 101177 in webkit
- Timestamp:
- Nov 25, 2011, 10:08:38 AM (15 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 10 edited
-
ChangeLog (modified) (1 diff)
-
css/CSSImageGeneratorValue.cpp (modified) (3 diffs)
-
css/CSSImageGeneratorValue.h (modified) (3 diffs)
-
css/CSSStyleApplyProperty.cpp (modified) (2 diffs)
-
css/CSSStyleSelector.cpp (modified) (10 diffs)
-
css/CSSStyleSelector.h (modified) (2 diffs)
-
rendering/style/FillLayer.h (modified) (1 diff)
-
rendering/style/NinePieceImage.h (modified) (1 diff)
-
rendering/style/StyleGeneratedImage.cpp (modified) (4 diffs)
-
rendering/style/StyleGeneratedImage.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r101175 r101177 1 2011-11-25 Antti Koivisto <antti@apple.com> 2 3 StyleGeneratedImage should ref CSSImageGeneratorValue 4 https://bugs.webkit.org/show_bug.cgi?id=73074 5 6 Reviewed by Andreas Kling and Nikolas Zimmermann. 7 8 RenderStyle owns a bunch of StyleImage objects. However StyleGeneratedImage does not ref the 9 CSSImageGeneratorValue it holds so we currently rely on the stylesheet to keep the CSSImageGeneratorValues 10 alive as long as RenderStyle stays alive. While this works (RenderStyles are thrown away if stylesheets 11 change) it is not particularly robust or nice. 12 13 - Use RefPtr<CSSImageGeneratorValue> in StyleGeneratedImage 14 - Remove the RefPtr<StyleGeneratedImage> from CSSImageGeneratorValue. 15 There is no good reason to cache StyleGeneratedImage as it is a small and 16 uncommon object. With that the whole back-reference becomes unnecessary. 17 - Switch more places to use (Pass)RefPtr<StyleImage> for consistency. 18 19 * css/CSSImageGeneratorValue.cpp: 20 (WebCore::CSSImageGeneratorValue::CSSImageGeneratorValue): 21 * css/CSSImageGeneratorValue.h: 22 * css/CSSStyleApplyProperty.cpp: 23 * css/CSSStyleSelector.cpp: 24 (WebCore::CSSStyleSelector::applyProperty): 25 (WebCore::CSSStyleSelector::styleImage): 26 (WebCore::CSSStyleSelector::cachedOrPendingFromValue): 27 (WebCore::CSSStyleSelector::generatedOrPendingFromValue): 28 (WebCore::CSSStyleSelector::loadPendingImage): 29 (WebCore::CSSStyleSelector::loadPendingImages): 30 * css/CSSStyleSelector.h: 31 * rendering/style/FillLayer.h: 32 (WebCore::FillLayer::setImage): 33 * rendering/style/NinePieceImage.h: 34 (WebCore::NinePieceImage::NinePieceImage): 35 * rendering/style/StyleGeneratedImage.cpp: 36 (WebCore::StyleGeneratedImage::StyleGeneratedImage): 37 (WebCore::StyleGeneratedImage::cssValue): 38 (WebCore::StyleGeneratedImage::imageSize): 39 (WebCore::StyleGeneratedImage::addClient): 40 (WebCore::StyleGeneratedImage::removeClient): 41 (WebCore::StyleGeneratedImage::image): 42 * rendering/style/StyleGeneratedImage.h: 43 (WebCore::StyleGeneratedImage::create): 44 (WebCore::StyleGeneratedImage::data): 45 1 46 2011-11-25 Andreas Kling <kling@webkit.org> 2 47 -
trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp
r100535 r101177 32 32 #include "Image.h" 33 33 #include "RenderObject.h" 34 #include "StyleGeneratedImage.h"35 #include "StylePendingImage.h"36 34 #include <wtf/text/WTFString.h> 37 35 … … 40 38 CSSImageGeneratorValue::CSSImageGeneratorValue(ClassType classType) 41 39 : CSSValue(classType) 42 , m_accessedImage(false)43 40 { 44 41 } … … 110 107 { 111 108 m_images.add(size, image); 112 }113 114 StyleImage* CSSImageGeneratorValue::generatedOrPendingImage()115 {116 if (isPending())117 m_image = StylePendingImage::create(this).get();118 else if (!m_accessedImage) {119 m_accessedImage = true;120 m_image = StyleGeneratedImage::create(this, isFixedSize());121 }122 123 return m_image.get();124 }125 126 StyleGeneratedImage* CSSImageGeneratorValue::generatedImage()127 {128 if (!m_accessedImage) {129 m_accessedImage = true;130 m_image = StyleGeneratedImage::create(this, isFixedSize());131 }132 133 return static_cast<StyleGeneratedImage*>(m_image.get());134 109 } 135 110 -
trunk/Source/WebCore/css/CSSImageGeneratorValue.h
r100535 r101177 37 37 class Image; 38 38 class RenderObject; 39 class StyleGeneratedImage;40 class StyleImage;41 39 42 40 struct SizeAndCount { … … 61 59 PassRefPtr<Image> image(RenderObject*, const IntSize&); 62 60 63 StyleImage* generatedOrPendingImage();64 StyleGeneratedImage* generatedImage();65 66 61 bool isFixedSize() const; 67 62 IntSize fixedSize(const RenderObject*); … … 78 73 const RenderObjectSizeCountMap& clients() const { return m_clients; } 79 74 80 RefPtr<StyleImage> m_image;81 bool m_accessedImage;82 83 75 HashCountedSet<IntSize> m_sizes; // A count of how many times a given image size is in use. 84 76 RenderObjectSizeCountMap m_clients; // A map from RenderObjects (with entry count) to image sizes. -
trunk/Source/WebCore/css/CSSStyleApplyProperty.cpp
r101078 r101177 389 389 }; 390 390 391 template <typename T> 392 struct FillLayerAccessorTypes { 393 typedef T Setter; 394 typedef T Getter; 395 }; 396 397 template <> 398 struct FillLayerAccessorTypes<StyleImage*> { 399 typedef PassRefPtr<StyleImage> Setter; 400 typedef StyleImage* Getter; 401 }; 402 391 403 template <typename T, 392 404 CSSPropertyID propertyId, … … 395 407 const FillLayer* (RenderStyle::*layersFunction)() const, 396 408 bool (FillLayer::*testFunction)() const, 397 T(FillLayer::*getFunction)() const,398 void (FillLayer::*setFunction)( T),409 typename FillLayerAccessorTypes<T>::Getter (FillLayer::*getFunction)() const, 410 void (FillLayer::*setFunction)(typename FillLayerAccessorTypes<T>::Setter), 399 411 void (FillLayer::*clearFunction)(), 400 T(*initialFunction)(EFillLayerType),412 typename FillLayerAccessorTypes<T>::Getter (*initialFunction)(EFillLayerType), 401 413 void (CSSStyleSelector::*mapFillFunction)(CSSPropertyID, FillLayer*, CSSValue*)> 402 414 class ApplyPropertyFillLayer { -
trunk/Source/WebCore/css/CSSStyleSelector.cpp
r101078 r101177 2861 2861 CSSValue* item = i.value(); 2862 2862 if (item->isImageGeneratorValue()) { 2863 m_style->setContent( static_cast<CSSImageGeneratorValue*>(item)->generatedImage(), didSet);2863 m_style->setContent(StyleGeneratedImage::create(static_cast<CSSImageGeneratorValue*>(item)), didSet); 2864 2864 didSet = true; 2865 2865 } … … 4289 4289 } 4290 4290 4291 StyleImage*CSSStyleSelector::styleImage(CSSPropertyID property, CSSValue* value)4291 PassRefPtr<StyleImage> CSSStyleSelector::styleImage(CSSPropertyID property, CSSValue* value) 4292 4292 { 4293 4293 if (value->isImageValue()) … … 4300 4300 } 4301 4301 4302 StyleImage*CSSStyleSelector::cachedOrPendingFromValue(CSSPropertyID property, CSSImageValue* value)4303 { 4304 StyleImage*image = value->cachedOrPendingImage();4302 PassRefPtr<StyleImage> CSSStyleSelector::cachedOrPendingFromValue(CSSPropertyID property, CSSImageValue* value) 4303 { 4304 RefPtr<StyleImage> image = value->cachedOrPendingImage(); 4305 4305 if (image && image->isPendingImage()) 4306 4306 m_pendingImageProperties.add(property); 4307 return image; 4308 } 4309 4310 StyleImage* CSSStyleSelector::generatedOrPendingFromValue(CSSPropertyID property, CSSImageGeneratorValue* value) 4311 { 4312 StyleImage* image = value->generatedOrPendingImage(); 4313 if (image && image->isPendingImage()) 4307 return image.release(); 4308 } 4309 4310 PassRefPtr<StyleImage> CSSStyleSelector::generatedOrPendingFromValue(CSSPropertyID property, CSSImageGeneratorValue* value) 4311 { 4312 if (value->isPending()) { 4314 4313 m_pendingImageProperties.add(property); 4315 return image; 4314 return StylePendingImage::create(value); 4315 } 4316 return StyleGeneratedImage::create(value); 4316 4317 } 4317 4318 … … 5741 5742 #endif 5742 5743 5743 StyleImage*CSSStyleSelector::loadPendingImage(StylePendingImage* pendingImage)5744 PassRefPtr<StyleImage> CSSStyleSelector::loadPendingImage(StylePendingImage* pendingImage) 5744 5745 { 5745 5746 CachedResourceLoader* cachedResourceLoader = m_element->document()->cachedResourceLoader(); … … 5753 5754 CSSImageGeneratorValue* imageGeneratorValue = pendingImage->cssImageGeneratorValue(); 5754 5755 imageGeneratorValue->loadSubimages(cachedResourceLoader); 5755 return imageGeneratorValue->generatedImage();5756 return StyleGeneratedImage::create(imageGeneratorValue); 5756 5757 } 5757 5758 … … 5771 5772 case CSSPropertyBackgroundImage: { 5772 5773 for (FillLayer* backgroundLayer = m_style->accessBackgroundLayers(); backgroundLayer; backgroundLayer = backgroundLayer->next()) { 5773 if (backgroundLayer->image() && backgroundLayer->image()->isPendingImage()) { 5774 StyleImage* loadedImage = loadPendingImage(static_cast<StylePendingImage*>(backgroundLayer->image())); 5775 backgroundLayer->setImage(loadedImage); 5776 } 5774 if (backgroundLayer->image() && backgroundLayer->image()->isPendingImage()) 5775 backgroundLayer->setImage(loadPendingImage(static_cast<StylePendingImage*>(backgroundLayer->image()))); 5777 5776 } 5778 5777 break; 5779 5778 } 5780 5781 5779 case CSSPropertyContent: { 5782 5780 for (ContentData* contentData = const_cast<ContentData*>(m_style->contentData()); contentData; contentData = contentData->next()) { … … 5784 5782 StyleImage* image = static_cast<ImageContentData*>(contentData)->image(); 5785 5783 if (image->isPendingImage()) { 5786 StyleImage*loadedImage = loadPendingImage(static_cast<StylePendingImage*>(image));5784 RefPtr<StyleImage> loadedImage = loadPendingImage(static_cast<StylePendingImage*>(image)); 5787 5785 if (loadedImage) 5788 static_cast<ImageContentData*>(contentData)->setImage(loadedImage );5786 static_cast<ImageContentData*>(contentData)->setImage(loadedImage.release()); 5789 5787 } 5790 5788 } … … 5792 5790 break; 5793 5791 } 5794 5795 5792 case CSSPropertyCursor: { 5796 5793 if (CursorList* cursorList = m_style->cursors()) { … … 5798 5795 CursorData& currentCursor = cursorList->at(i); 5799 5796 if (StyleImage* image = currentCursor.image()) { 5800 if (image->isPendingImage()) { 5801 StyleImage* loadedImage = loadPendingImage(static_cast<StylePendingImage*>(image)); 5802 currentCursor.setImage(loadedImage); 5803 } 5797 if (image->isPendingImage()) 5798 currentCursor.setImage(loadPendingImage(static_cast<StylePendingImage*>(image))); 5804 5799 } 5805 5800 } … … 5807 5802 break; 5808 5803 } 5809 5810 5804 case CSSPropertyListStyleImage: { 5811 if (m_style->listStyleImage() && m_style->listStyleImage()->isPendingImage()) { 5812 StyleImage* loadedImage = loadPendingImage(static_cast<StylePendingImage*>(m_style->listStyleImage())); 5813 m_style->setListStyleImage(loadedImage); 5814 } 5805 if (m_style->listStyleImage() && m_style->listStyleImage()->isPendingImage()) 5806 m_style->setListStyleImage(loadPendingImage(static_cast<StylePendingImage*>(m_style->listStyleImage()))); 5815 5807 break; 5816 5808 } 5817 5818 5809 case CSSPropertyBorderImageSource: { 5819 if (m_style->borderImageSource() && m_style->borderImageSource()->isPendingImage()) { 5820 StyleImage* loadedImage = loadPendingImage(static_cast<StylePendingImage*>(m_style->borderImageSource())); 5821 m_style->setBorderImageSource(loadedImage); 5822 } 5810 if (m_style->borderImageSource() && m_style->borderImageSource()->isPendingImage()) 5811 m_style->setBorderImageSource(loadPendingImage(static_cast<StylePendingImage*>(m_style->borderImageSource()))); 5823 5812 break; 5824 5813 } 5825 5826 5814 case CSSPropertyWebkitBoxReflect: { 5827 5815 if (StyleReflection* reflection = m_style->boxReflect()) { 5828 5816 const NinePieceImage& maskImage = reflection->mask(); 5829 5817 if (maskImage.image() && maskImage.image()->isPendingImage()) { 5830 StyleImage*loadedImage = loadPendingImage(static_cast<StylePendingImage*>(maskImage.image()));5831 reflection->setMask(NinePieceImage(loadedImage , maskImage.imageSlices(), maskImage.fill(), maskImage.borderSlices(), maskImage.outset(), maskImage.horizontalRule(), maskImage.verticalRule()));5818 RefPtr<StyleImage> loadedImage = loadPendingImage(static_cast<StylePendingImage*>(maskImage.image())); 5819 reflection->setMask(NinePieceImage(loadedImage.release(), maskImage.imageSlices(), maskImage.fill(), maskImage.borderSlices(), maskImage.outset(), maskImage.horizontalRule(), maskImage.verticalRule())); 5832 5820 } 5833 5821 } 5834 5822 break; 5835 5823 } 5836 5837 5824 case CSSPropertyWebkitMaskBoxImageSource: { 5838 if (m_style->maskBoxImageSource() && m_style->maskBoxImageSource()->isPendingImage()) { 5839 StyleImage* loadedImage = loadPendingImage(static_cast<StylePendingImage*>(m_style->maskBoxImageSource())); 5840 m_style->setMaskBoxImageSource(loadedImage); 5841 } 5825 if (m_style->maskBoxImageSource() && m_style->maskBoxImageSource()->isPendingImage()) 5826 m_style->setMaskBoxImageSource(loadPendingImage(static_cast<StylePendingImage*>(m_style->maskBoxImageSource()))); 5842 5827 break; 5843 5828 } 5844 5845 5829 case CSSPropertyWebkitMaskImage: { 5846 5830 for (FillLayer* maskLayer = m_style->accessMaskLayers(); maskLayer; maskLayer = maskLayer->next()) { 5847 if (maskLayer->image() && maskLayer->image()->isPendingImage()) { 5848 StyleImage* loadedImage = loadPendingImage(static_cast<StylePendingImage*>(maskLayer->image())); 5849 maskLayer->setImage(loadedImage); 5850 } 5831 if (maskLayer->image() && maskLayer->image()->isPendingImage()) 5832 maskLayer->setImage(loadPendingImage(static_cast<StylePendingImage*>(maskLayer->image()))); 5851 5833 } 5852 5834 break; -
trunk/Source/WebCore/css/CSSStyleSelector.h
r100909 r101177 295 295 static RenderStyle* styleNotYetAvailable() { return s_styleNotYetAvailable; } 296 296 297 StyleImage*styleImage(CSSPropertyID, CSSValue*);298 StyleImage*cachedOrPendingFromValue(CSSPropertyID, CSSImageValue*);299 StyleImage*generatedOrPendingFromValue(CSSPropertyID, CSSImageGeneratorValue*);297 PassRefPtr<StyleImage> styleImage(CSSPropertyID, CSSValue*); 298 PassRefPtr<StyleImage> cachedOrPendingFromValue(CSSPropertyID, CSSImageValue*); 299 PassRefPtr<StyleImage> generatedOrPendingFromValue(CSSPropertyID, CSSImageGeneratorValue*); 300 300 301 301 bool applyPropertyToRegularStyle() const { return m_applyPropertyToRegularStyle; } … … 344 344 #endif 345 345 346 StyleImage*loadPendingImage(StylePendingImage*);346 PassRefPtr<StyleImage> loadPendingImage(StylePendingImage*); 347 347 void loadPendingImages(); 348 348 -
trunk/Source/WebCore/rendering/style/FillLayer.h
r101091 r101177 93 93 bool isSizeSet() const { return m_sizeType != SizeNone; } 94 94 95 void setImage( StyleImage*i) { m_image = i; m_imageSet = true; }95 void setImage(PassRefPtr<StyleImage> i) { m_image = i; m_imageSet = true; } 96 96 void setXPosition(Length l) { m_xPosition = l; m_xPosSet = true; } 97 97 void setYPosition(Length l) { m_yPosition = l; m_yPosSet = true; } -
trunk/Source/WebCore/rendering/style/NinePieceImage.h
r95901 r101177 48 48 } 49 49 50 NinePieceImage( StyleImage*image, LengthBox imageSlices, bool fill, LengthBox borderSlices, LengthBox outset, ENinePieceImageRule h, ENinePieceImageRule v)50 NinePieceImage(PassRefPtr<StyleImage> image, LengthBox imageSlices, bool fill, LengthBox borderSlices, LengthBox outset, ENinePieceImageRule h, ENinePieceImageRule v) 51 51 : m_image(image) 52 52 , m_imageSlices(imageSlices) -
trunk/Source/WebCore/rendering/style/StyleGeneratedImage.cpp
r97727 r101177 30 30 31 31 namespace WebCore { 32 33 StyleGeneratedImage::StyleGeneratedImage(PassRefPtr<CSSImageGeneratorValue> value) 34 : m_imageGeneratorValue(value) 35 , m_fixedSize(m_imageGeneratorValue->isFixedSize()) 36 { 37 m_isGeneratedImage = true; 38 } 32 39 33 40 PassRefPtr<CSSValue> StyleGeneratedImage::cssValue() const 34 41 { 35 return m_ generator;42 return m_imageGeneratorValue; 36 43 } 37 44 … … 39 46 { 40 47 if (m_fixedSize) { 41 IntSize fixedSize = m_ generator->fixedSize(renderer);48 IntSize fixedSize = m_imageGeneratorValue->fixedSize(renderer); 42 49 if (multiplier == 1.0f) 43 50 return fixedSize; … … 69 76 void StyleGeneratedImage::addClient(RenderObject* renderer) 70 77 { 71 m_ generator->addClient(renderer, IntSize());78 m_imageGeneratorValue->addClient(renderer, IntSize()); 72 79 } 73 80 74 81 void StyleGeneratedImage::removeClient(RenderObject* renderer) 75 82 { 76 m_ generator->removeClient(renderer);83 m_imageGeneratorValue->removeClient(renderer); 77 84 } 78 85 … … 80 87 { 81 88 renderer->document()->styleSelector()->setStyle(renderer->style()); 82 return m_ generator->image(renderer, size);89 return m_imageGeneratorValue->image(renderer, size); 83 90 } 84 91 -
trunk/Source/WebCore/rendering/style/StyleGeneratedImage.h
r98852 r101177 34 34 class StyleGeneratedImage : public StyleImage { 35 35 public: 36 static PassRefPtr<StyleGeneratedImage> create(CSSImageGeneratorValue* val , bool fixedSize)36 static PassRefPtr<StyleGeneratedImage> create(CSSImageGeneratorValue* value) 37 37 { 38 return adoptRef(new StyleGeneratedImage(val , fixedSize));38 return adoptRef(new StyleGeneratedImage(value)); 39 39 } 40 40 41 virtual WrappedImagePtr data() const { return m_ generator; }41 virtual WrappedImagePtr data() const { return m_imageGeneratorValue.get(); } 42 42 43 43 virtual PassRefPtr<CSSValue> cssValue() const; … … 54 54 55 55 private: 56 StyleGeneratedImage(CSSImageGeneratorValue* val, bool fixedSize) 57 : m_generator(val) 58 , m_fixedSize(fixedSize) 59 { 60 m_isGeneratedImage = true; 61 } 56 StyleGeneratedImage(PassRefPtr<CSSImageGeneratorValue>); 62 57 63 CSSImageGeneratorValue* m_generator; // The generator holds a reference to us.58 RefPtr<CSSImageGeneratorValue> m_imageGeneratorValue; 64 59 IntSize m_containerSize; 65 60 bool m_fixedSize;
Note:
See TracChangeset
for help on using the changeset viewer.