OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
5 * (C) 2006 Allan Sandfeld Jensen (kde@carewolf.com) | 5 * (C) 2006 Allan Sandfeld Jensen (kde@carewolf.com) |
6 * (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 6 * (C) 2006 Samuel Weinig (sam.weinig@gmail.com) |
7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011 Apple Inc. |
| 8 * All rights reserved. |
8 * Copyright (C) 2010 Google Inc. All rights reserved. | 9 * Copyright (C) 2010 Google Inc. All rights reserved. |
9 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. |
10 * | 11 * |
11 * This library is free software; you can redistribute it and/or | 12 * This library is free software; you can redistribute it and/or |
12 * modify it under the terms of the GNU Library General Public | 13 * modify it under the terms of the GNU Library General Public |
13 * License as published by the Free Software Foundation; either | 14 * License as published by the Free Software Foundation; either |
14 * version 2 of the License, or (at your option) any later version. | 15 * version 2 of the License, or (at your option) any later version. |
15 * | 16 * |
16 * This library is distributed in the hope that it will be useful, | 17 * This library is distributed in the hope that it will be useful, |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 | 96 |
96 if (newImage != m_imageResource->imagePtr()) | 97 if (newImage != m_imageResource->imagePtr()) |
97 return; | 98 return; |
98 | 99 |
99 if (isGeneratedContent() && isHTMLImageElement(node()) && | 100 if (isGeneratedContent() && isHTMLImageElement(node()) && |
100 m_imageResource->errorOccurred()) { | 101 m_imageResource->errorOccurred()) { |
101 toHTMLImageElement(node())->ensureFallbackForGeneratedContent(); | 102 toHTMLImageElement(node())->ensureFallbackForGeneratedContent(); |
102 return; | 103 return; |
103 } | 104 } |
104 | 105 |
105 // Per the spec, we let the server-sent header override srcset/other sources o
f dpr. | 106 // Per the spec, we let the server-sent header override srcset/other sources |
| 107 // of dpr. |
106 // https://github.com/igrigorik/http-client-hints/blob/master/draft-grigorik-h
ttp-client-hints-01.txt#L255 | 108 // https://github.com/igrigorik/http-client-hints/blob/master/draft-grigorik-h
ttp-client-hints-01.txt#L255 |
107 if (m_imageResource->cachedImage() && | 109 if (m_imageResource->cachedImage() && |
108 m_imageResource->cachedImage()->hasDevicePixelRatioHeaderValue()) { | 110 m_imageResource->cachedImage()->hasDevicePixelRatioHeaderValue()) { |
109 UseCounter::count(&(view()->frameView()->frame()), | 111 UseCounter::count(&(view()->frameView()->frame()), |
110 UseCounter::ClientHintsContentDPR); | 112 UseCounter::ClientHintsContentDPR); |
111 m_imageDevicePixelRatio = | 113 m_imageDevicePixelRatio = |
112 1 / m_imageResource->cachedImage()->devicePixelRatioHeaderValue(); | 114 1 / m_imageResource->cachedImage()->devicePixelRatioHeaderValue(); |
113 } | 115 } |
114 | 116 |
115 if (!m_didIncrementVisuallyNonEmptyPixelCount) { | 117 if (!m_didIncrementVisuallyNonEmptyPixelCount) { |
(...skipping 11 matching lines...) Expand all Loading... |
127 return; | 129 return; |
128 setIntrinsicSize(newSize); | 130 setIntrinsicSize(newSize); |
129 } | 131 } |
130 | 132 |
131 void LayoutImage::invalidatePaintAndMarkForLayoutIfNeeded() { | 133 void LayoutImage::invalidatePaintAndMarkForLayoutIfNeeded() { |
132 LayoutSize oldIntrinsicSize = intrinsicSize(); | 134 LayoutSize oldIntrinsicSize = intrinsicSize(); |
133 LayoutSize newIntrinsicSize = | 135 LayoutSize newIntrinsicSize = |
134 m_imageResource->imageSize(style()->effectiveZoom()); | 136 m_imageResource->imageSize(style()->effectiveZoom()); |
135 updateIntrinsicSizeIfNeeded(newIntrinsicSize); | 137 updateIntrinsicSizeIfNeeded(newIntrinsicSize); |
136 | 138 |
137 // In the case of generated image content using :before/:after/content, we mig
ht not be | 139 // In the case of generated image content using :before/:after/content, we |
138 // in the layout tree yet. In that case, we just need to update our intrinsic
size. | 140 // might not be in the layout tree yet. In that case, we just need to update |
139 // layout() will be called after we are inserted in the tree which will take c
are of | 141 // our intrinsic size. layout() will be called after we are inserted in the |
140 // what we are doing here. | 142 // tree which will take care of what we are doing here. |
141 if (!containingBlock()) | 143 if (!containingBlock()) |
142 return; | 144 return; |
143 | 145 |
144 bool imageSourceHasChangedSize = oldIntrinsicSize != newIntrinsicSize; | 146 bool imageSourceHasChangedSize = oldIntrinsicSize != newIntrinsicSize; |
145 if (imageSourceHasChangedSize) | 147 if (imageSourceHasChangedSize) |
146 setPreferredLogicalWidthsDirty(); | 148 setPreferredLogicalWidthsDirty(); |
147 | 149 |
148 // If the actual area occupied by the image has changed and it is not constrai
ned by style then a layout is required. | 150 // If the actual area occupied by the image has changed and it is not |
| 151 // constrained by style then a layout is required. |
149 bool imageSizeIsConstrained = style()->logicalWidth().isSpecified() && | 152 bool imageSizeIsConstrained = style()->logicalWidth().isSpecified() && |
150 style()->logicalHeight().isSpecified(); | 153 style()->logicalHeight().isSpecified(); |
151 | 154 |
152 // FIXME: We only need to recompute the containing block's preferred size if t
he containing block's size | 155 // FIXME: We only need to recompute the containing block's preferred size if |
153 // depends on the image's size (i.e., the container uses shrink-to-fit sizing)
. | 156 // the containing block's size depends on the image's size (i.e., the |
154 // There's no easy way to detect that shrink-to-fit is needed, always force a
layout. | 157 // container uses shrink-to-fit sizing). There's no easy way to detect that |
| 158 // shrink-to-fit is needed, always force a layout. |
155 bool containingBlockNeedsToRecomputePreferredSize = | 159 bool containingBlockNeedsToRecomputePreferredSize = |
156 style()->logicalWidth().isPercentOrCalc() || | 160 style()->logicalWidth().isPercentOrCalc() || |
157 style()->logicalMaxWidth().isPercentOrCalc() || | 161 style()->logicalMaxWidth().isPercentOrCalc() || |
158 style()->logicalMinWidth().isPercentOrCalc(); | 162 style()->logicalMinWidth().isPercentOrCalc(); |
159 | 163 |
160 if (imageSourceHasChangedSize && | 164 if (imageSourceHasChangedSize && |
161 (!imageSizeIsConstrained || | 165 (!imageSizeIsConstrained || |
162 containingBlockNeedsToRecomputePreferredSize)) { | 166 containingBlockNeedsToRecomputePreferredSize)) { |
163 setNeedsLayoutAndFullPaintInvalidation( | 167 setNeedsLayoutAndFullPaintInvalidation( |
164 LayoutInvalidationReason::SizeChanged); | 168 LayoutInvalidationReason::SizeChanged); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 return false; | 234 return false; |
231 EFillBox backgroundClip = style()->backgroundClip(); | 235 EFillBox backgroundClip = style()->backgroundClip(); |
232 // Background paints under borders. | 236 // Background paints under borders. |
233 if (backgroundClip == BorderFillBox && style()->hasBorder() && | 237 if (backgroundClip == BorderFillBox && style()->hasBorder() && |
234 !style()->borderObscuresBackground()) | 238 !style()->borderObscuresBackground()) |
235 return false; | 239 return false; |
236 // Background shows in padding area. | 240 // Background shows in padding area. |
237 if ((backgroundClip == BorderFillBox || backgroundClip == PaddingFillBox) && | 241 if ((backgroundClip == BorderFillBox || backgroundClip == PaddingFillBox) && |
238 style()->hasPadding()) | 242 style()->hasPadding()) |
239 return false; | 243 return false; |
240 // Object-position may leave parts of the content box empty, regardless of the
value of object-fit. | 244 // Object-position may leave parts of the content box empty, regardless of the |
| 245 // value of object-fit. |
241 if (style()->objectPosition() != ComputedStyle::initialObjectPosition()) | 246 if (style()->objectPosition() != ComputedStyle::initialObjectPosition()) |
242 return false; | 247 return false; |
243 // Object-fit may leave parts of the content box empty. | 248 // Object-fit may leave parts of the content box empty. |
244 ObjectFit objectFit = style()->getObjectFit(); | 249 ObjectFit objectFit = style()->getObjectFit(); |
245 if (objectFit != ObjectFitFill && objectFit != ObjectFitCover) | 250 if (objectFit != ObjectFitFill && objectFit != ObjectFitCover) |
246 return false; | 251 return false; |
247 // Check for image with alpha. | 252 // Check for image with alpha. |
248 TRACE_EVENT1( | 253 TRACE_EVENT1( |
249 TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "PaintImage", "data", | 254 TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "PaintImage", "data", |
250 InspectorPaintImageEvent::data(this, *m_imageResource->cachedImage())); | 255 InspectorPaintImageEvent::data(this, *m_imageResource->cachedImage())); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 result.append(tempResult); | 291 result.append(tempResult); |
287 if (inside) | 292 if (inside) |
288 result = tempResult; | 293 result = tempResult; |
289 return inside; | 294 return inside; |
290 } | 295 } |
291 | 296 |
292 void LayoutImage::computeIntrinsicSizingInfo( | 297 void LayoutImage::computeIntrinsicSizingInfo( |
293 IntrinsicSizingInfo& intrinsicSizingInfo) const { | 298 IntrinsicSizingInfo& intrinsicSizingInfo) const { |
294 LayoutReplaced::computeIntrinsicSizingInfo(intrinsicSizingInfo); | 299 LayoutReplaced::computeIntrinsicSizingInfo(intrinsicSizingInfo); |
295 | 300 |
296 // Our intrinsicSize is empty if we're laying out generated images with relati
ve width/height. Figure out the right intrinsic size to use. | 301 // Our intrinsicSize is empty if we're laying out generated images with |
| 302 // relative width/height. Figure out the right intrinsic size to use. |
297 if (intrinsicSizingInfo.size.isEmpty() && | 303 if (intrinsicSizingInfo.size.isEmpty() && |
298 m_imageResource->imageHasRelativeSize()) { | 304 m_imageResource->imageHasRelativeSize()) { |
299 LayoutObject* containingBlock = | 305 LayoutObject* containingBlock = |
300 isOutOfFlowPositioned() ? container() : this->containingBlock(); | 306 isOutOfFlowPositioned() ? container() : this->containingBlock(); |
301 if (containingBlock->isBox()) { | 307 if (containingBlock->isBox()) { |
302 LayoutBox* box = toLayoutBox(containingBlock); | 308 LayoutBox* box = toLayoutBox(containingBlock); |
303 intrinsicSizingInfo.size.setWidth(box->availableLogicalWidth().toFloat()); | 309 intrinsicSizingInfo.size.setWidth(box->availableLogicalWidth().toFloat()); |
304 intrinsicSizingInfo.size.setHeight( | 310 intrinsicSizingInfo.size.setHeight( |
305 box->availableLogicalHeight(IncludeMarginBorderPadding).toFloat()); | 311 box->availableLogicalHeight(IncludeMarginBorderPadding).toFloat()); |
306 } | 312 } |
307 } | 313 } |
308 // Don't compute an intrinsic ratio to preserve historical WebKit behavior if
we're painting alt text and/or a broken image. | 314 // Don't compute an intrinsic ratio to preserve historical WebKit behavior if |
309 // Video is excluded from this behavior because video elements have a default
aspect ratio that a failed poster image load should not override. | 315 // we're painting alt text and/or a broken image. |
| 316 // Video is excluded from this behavior because video elements have a default |
| 317 // aspect ratio that a failed poster image load should not override. |
310 if (m_imageResource && m_imageResource->errorOccurred() && !isVideo()) { | 318 if (m_imageResource && m_imageResource->errorOccurred() && !isVideo()) { |
311 intrinsicSizingInfo.aspectRatio = FloatSize(1, 1); | 319 intrinsicSizingInfo.aspectRatio = FloatSize(1, 1); |
312 return; | 320 return; |
313 } | 321 } |
314 } | 322 } |
315 | 323 |
316 bool LayoutImage::needsPreferredWidthsRecalculation() const { | 324 bool LayoutImage::needsPreferredWidthsRecalculation() const { |
317 if (LayoutReplaced::needsPreferredWidthsRecalculation()) | 325 if (LayoutReplaced::needsPreferredWidthsRecalculation()) |
318 return true; | 326 return true; |
319 return embeddedReplacedContent(); | 327 return embeddedReplacedContent(); |
320 } | 328 } |
321 | 329 |
322 LayoutReplaced* LayoutImage::embeddedReplacedContent() const { | 330 LayoutReplaced* LayoutImage::embeddedReplacedContent() const { |
323 if (!m_imageResource) | 331 if (!m_imageResource) |
324 return nullptr; | 332 return nullptr; |
325 | 333 |
326 ImageResource* cachedImage = m_imageResource->cachedImage(); | 334 ImageResource* cachedImage = m_imageResource->cachedImage(); |
327 if (cachedImage && cachedImage->getImage() && | 335 if (cachedImage && cachedImage->getImage() && |
328 cachedImage->getImage()->isSVGImage()) | 336 cachedImage->getImage()->isSVGImage()) |
329 return toSVGImage(cachedImage->getImage())->embeddedReplacedContent(); | 337 return toSVGImage(cachedImage->getImage())->embeddedReplacedContent(); |
330 | 338 |
331 return nullptr; | 339 return nullptr; |
332 } | 340 } |
333 | 341 |
334 } // namespace blink | 342 } // namespace blink |
OLD | NEW |