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. All r
ights reserved. |
8 * Copyright (C) 2010 Google Inc. All rights reserved. | 8 * Copyright (C) 2010 Google Inc. All rights reserved. |
9 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. | 9 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. |
10 * | 10 * |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 #include "core/rendering/RenderView.h" | 47 #include "core/rendering/RenderView.h" |
48 #include "core/svg/graphics/SVGImage.h" | 48 #include "core/svg/graphics/SVGImage.h" |
49 #include "platform/fonts/Font.h" | 49 #include "platform/fonts/Font.h" |
50 #include "platform/fonts/FontCache.h" | 50 #include "platform/fonts/FontCache.h" |
51 | 51 |
52 namespace blink { | 52 namespace blink { |
53 | 53 |
54 using namespace HTMLNames; | 54 using namespace HTMLNames; |
55 | 55 |
56 LayoutImage::LayoutImage(Element* element) | 56 LayoutImage::LayoutImage(Element* element) |
57 : RenderReplaced(element, LayoutSize()) | 57 : LayoutReplaced(element, LayoutSize()) |
58 , m_didIncrementVisuallyNonEmptyPixelCount(false) | 58 , m_didIncrementVisuallyNonEmptyPixelCount(false) |
59 , m_isGeneratedContent(false) | 59 , m_isGeneratedContent(false) |
60 , m_imageDevicePixelRatio(1.0f) | 60 , m_imageDevicePixelRatio(1.0f) |
61 { | 61 { |
62 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->addLayoutObj
ect(this); | 62 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->addLayoutObj
ect(this); |
63 } | 63 } |
64 | 64 |
65 LayoutImage* LayoutImage::createAnonymous(Document* document) | 65 LayoutImage* LayoutImage::createAnonymous(Document* document) |
66 { | 66 { |
67 LayoutImage* image = new LayoutImage(0); | 67 LayoutImage* image = new LayoutImage(0); |
68 image->setDocumentForAnonymous(document); | 68 image->setDocumentForAnonymous(document); |
69 return image; | 69 return image; |
70 } | 70 } |
71 | 71 |
72 LayoutImage::~LayoutImage() | 72 LayoutImage::~LayoutImage() |
73 { | 73 { |
74 } | 74 } |
75 | 75 |
76 void LayoutImage::destroy() | 76 void LayoutImage::destroy() |
77 { | 77 { |
78 ASSERT(m_imageResource); | 78 ASSERT(m_imageResource); |
79 m_imageResource->shutdown(); | 79 m_imageResource->shutdown(); |
80 RenderReplaced::destroy(); | 80 LayoutReplaced::destroy(); |
81 } | 81 } |
82 | 82 |
83 void LayoutImage::setImageResource(PassOwnPtr<LayoutImageResource> imageResource
) | 83 void LayoutImage::setImageResource(PassOwnPtr<LayoutImageResource> imageResource
) |
84 { | 84 { |
85 ASSERT(!m_imageResource); | 85 ASSERT(!m_imageResource); |
86 m_imageResource = imageResource; | 86 m_imageResource = imageResource; |
87 m_imageResource->initialize(this); | 87 m_imageResource->initialize(this); |
88 } | 88 } |
89 | 89 |
90 void LayoutImage::imageChanged(WrappedImagePtr newImage, const IntRect* rect) | 90 void LayoutImage::imageChanged(WrappedImagePtr newImage, const IntRect* rect) |
91 { | 91 { |
92 if (documentBeingDestroyed()) | 92 if (documentBeingDestroyed()) |
93 return; | 93 return; |
94 | 94 |
95 if (hasBoxDecorationBackground() || hasMask() || hasShapeOutside()) | 95 if (hasBoxDecorationBackground() || hasMask() || hasShapeOutside()) |
96 RenderReplaced::imageChanged(newImage, rect); | 96 LayoutReplaced::imageChanged(newImage, rect); |
97 | 97 |
98 if (!m_imageResource) | 98 if (!m_imageResource) |
99 return; | 99 return; |
100 | 100 |
101 if (newImage != m_imageResource->imagePtr()) | 101 if (newImage != m_imageResource->imagePtr()) |
102 return; | 102 return; |
103 | 103 |
104 // Per the spec, we let the server-sent header override srcset/other sources
of dpr. | 104 // Per the spec, we let the server-sent header override srcset/other sources
of dpr. |
105 // https://github.com/igrigorik/http-client-hints/blob/master/draft-grigorik
-http-client-hints-01.txt#L255 | 105 // https://github.com/igrigorik/http-client-hints/blob/master/draft-grigorik
-http-client-hints-01.txt#L255 |
106 if (m_imageResource->cachedImage() && m_imageResource->cachedImage()->hasDev
icePixelRatioHeaderValue()) | 106 if (m_imageResource->cachedImage() && m_imageResource->cachedImage()->hasDev
icePixelRatioHeaderValue()) |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 | 266 |
267 HTMLMapElement* LayoutImage::imageMap() const | 267 HTMLMapElement* LayoutImage::imageMap() const |
268 { | 268 { |
269 HTMLImageElement* i = isHTMLImageElement(node()) ? toHTMLImageElement(node()
) : 0; | 269 HTMLImageElement* i = isHTMLImageElement(node()) ? toHTMLImageElement(node()
) : 0; |
270 return i ? i->treeScope().getImageMap(i->fastGetAttribute(usemapAttr)) : 0; | 270 return i ? i->treeScope().getImageMap(i->fastGetAttribute(usemapAttr)) : 0; |
271 } | 271 } |
272 | 272 |
273 bool LayoutImage::nodeAtPoint(const HitTestRequest& request, HitTestResult& resu
lt, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOf
fset, HitTestAction hitTestAction) | 273 bool LayoutImage::nodeAtPoint(const HitTestRequest& request, HitTestResult& resu
lt, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOf
fset, HitTestAction hitTestAction) |
274 { | 274 { |
275 HitTestResult tempResult(result.hitTestLocation()); | 275 HitTestResult tempResult(result.hitTestLocation()); |
276 bool inside = RenderReplaced::nodeAtPoint(request, tempResult, locationInCon
tainer, accumulatedOffset, hitTestAction); | 276 bool inside = LayoutReplaced::nodeAtPoint(request, tempResult, locationInCon
tainer, accumulatedOffset, hitTestAction); |
277 | 277 |
278 if (tempResult.innerNode() && node()) { | 278 if (tempResult.innerNode() && node()) { |
279 if (HTMLMapElement* map = imageMap()) { | 279 if (HTMLMapElement* map = imageMap()) { |
280 LayoutRect contentBox = contentBoxRect(); | 280 LayoutRect contentBox = contentBoxRect(); |
281 float scaleFactor = 1 / style()->effectiveZoom(); | 281 float scaleFactor = 1 / style()->effectiveZoom(); |
282 LayoutPoint mapLocation = locationInContainer.point() - toLayoutSize
(accumulatedOffset) - locationOffset() - toLayoutSize(contentBox.location()); | 282 LayoutPoint mapLocation = locationInContainer.point() - toLayoutSize
(accumulatedOffset) - locationOffset() - toLayoutSize(contentBox.location()); |
283 mapLocation.scale(scaleFactor, scaleFactor); | 283 mapLocation.scale(scaleFactor, scaleFactor); |
284 | 284 |
285 if (map->mapMouseEvent(mapLocation, contentBox.size(), tempResult)) | 285 if (map->mapMouseEvent(mapLocation, contentBox.size(), tempResult)) |
286 tempResult.setInnerNonSharedNode(node()); | 286 tempResult.setInnerNonSharedNode(node()); |
287 } | 287 } |
288 } | 288 } |
289 | 289 |
290 if (!inside && result.isRectBasedTest()) | 290 if (!inside && result.isRectBasedTest()) |
291 result.append(tempResult); | 291 result.append(tempResult); |
292 if (inside) | 292 if (inside) |
293 result = tempResult; | 293 result = tempResult; |
294 return inside; | 294 return inside; |
295 } | 295 } |
296 | 296 |
297 void LayoutImage::layout() | 297 void LayoutImage::layout() |
298 { | 298 { |
299 RenderReplaced::layout(); | 299 LayoutReplaced::layout(); |
300 updateInnerContentRect(); | 300 updateInnerContentRect(); |
301 } | 301 } |
302 | 302 |
303 bool LayoutImage::updateImageLoadingPriorities() | 303 bool LayoutImage::updateImageLoadingPriorities() |
304 { | 304 { |
305 if (!m_imageResource || !m_imageResource->cachedImage() || m_imageResource->
cachedImage()->isLoaded()) | 305 if (!m_imageResource || !m_imageResource->cachedImage() || m_imageResource->
cachedImage()->isLoaded()) |
306 return false; | 306 return false; |
307 | 307 |
308 LayoutRect viewBounds = viewRect(); | 308 LayoutRect viewBounds = viewRect(); |
309 LayoutRect objectBounds = absoluteContentBox(); | 309 LayoutRect objectBounds = absoluteContentBox(); |
(...skipping 15 matching lines...) Expand all Loading... |
325 screenArea.intersect(objectBounds); | 325 screenArea.intersect(objectBounds); |
326 } | 326 } |
327 | 327 |
328 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->notifyImageR
esourceVisibility(m_imageResource->cachedImage(), status, screenArea); | 328 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->notifyImageR
esourceVisibility(m_imageResource->cachedImage(), status, screenArea); |
329 | 329 |
330 return true; | 330 return true; |
331 } | 331 } |
332 | 332 |
333 void LayoutImage::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, dou
ble& intrinsicRatio) const | 333 void LayoutImage::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, dou
ble& intrinsicRatio) const |
334 { | 334 { |
335 RenderReplaced::computeIntrinsicRatioInformation(intrinsicSize, intrinsicRat
io); | 335 LayoutReplaced::computeIntrinsicRatioInformation(intrinsicSize, intrinsicRat
io); |
336 | 336 |
337 // Our intrinsicSize is empty if we're rendering generated images with relat
ive width/height. Figure out the right intrinsic size to use. | 337 // Our intrinsicSize is empty if we're rendering generated images with relat
ive width/height. Figure out the right intrinsic size to use. |
338 if (intrinsicSize.isEmpty() && (m_imageResource->imageHasRelativeWidth() ||
m_imageResource->imageHasRelativeHeight())) { | 338 if (intrinsicSize.isEmpty() && (m_imageResource->imageHasRelativeWidth() ||
m_imageResource->imageHasRelativeHeight())) { |
339 LayoutObject* containingBlock = isOutOfFlowPositioned() ? container() :
this->containingBlock(); | 339 LayoutObject* containingBlock = isOutOfFlowPositioned() ? container() :
this->containingBlock(); |
340 if (containingBlock->isBox()) { | 340 if (containingBlock->isBox()) { |
341 RenderBox* box = toRenderBox(containingBlock); | 341 RenderBox* box = toRenderBox(containingBlock); |
342 intrinsicSize.setWidth(box->availableLogicalWidth().toFloat()); | 342 intrinsicSize.setWidth(box->availableLogicalWidth().toFloat()); |
343 intrinsicSize.setHeight(box->availableLogicalHeight(IncludeMarginBor
derPadding).toFloat()); | 343 intrinsicSize.setHeight(box->availableLogicalHeight(IncludeMarginBor
derPadding).toFloat()); |
344 } | 344 } |
345 } | 345 } |
346 // Don't compute an intrinsic ratio to preserve historical WebKit behavior i
f we're painting alt text and/or a broken image. | 346 // Don't compute an intrinsic ratio to preserve historical WebKit behavior i
f we're painting alt text and/or a broken image. |
347 // Video is excluded from this behavior because video elements have a defaul
t aspect ratio that a failed poster image load should not override. | 347 // Video is excluded from this behavior because video elements have a defaul
t aspect ratio that a failed poster image load should not override. |
348 if (m_imageResource && m_imageResource->errorOccurred() && !isVideo()) { | 348 if (m_imageResource && m_imageResource->errorOccurred() && !isVideo()) { |
349 intrinsicRatio = 1; | 349 intrinsicRatio = 1; |
350 return; | 350 return; |
351 } | 351 } |
352 } | 352 } |
353 | 353 |
354 bool LayoutImage::needsPreferredWidthsRecalculation() const | 354 bool LayoutImage::needsPreferredWidthsRecalculation() const |
355 { | 355 { |
356 if (RenderReplaced::needsPreferredWidthsRecalculation()) | 356 if (LayoutReplaced::needsPreferredWidthsRecalculation()) |
357 return true; | 357 return true; |
358 return embeddedContentBox(); | 358 return embeddedContentBox(); |
359 } | 359 } |
360 | 360 |
361 RenderBox* LayoutImage::embeddedContentBox() const | 361 RenderBox* LayoutImage::embeddedContentBox() const |
362 { | 362 { |
363 if (!m_imageResource) | 363 if (!m_imageResource) |
364 return 0; | 364 return 0; |
365 | 365 |
366 ImageResource* cachedImage = m_imageResource->cachedImage(); | 366 ImageResource* cachedImage = m_imageResource->cachedImage(); |
367 if (cachedImage && cachedImage->image() && cachedImage->image()->isSVGImage(
)) | 367 if (cachedImage && cachedImage->image() && cachedImage->image()->isSVGImage(
)) |
368 return toSVGImage(cachedImage->image())->embeddedContentBox(); | 368 return toSVGImage(cachedImage->image())->embeddedContentBox(); |
369 | 369 |
370 return 0; | 370 return 0; |
371 } | 371 } |
372 | 372 |
373 } // namespace blink | 373 } // namespace blink |
OLD | NEW |