OLD | NEW |
1 /* | 1 /* |
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) | 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) |
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) | 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) |
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) | 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) |
5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) |
6 Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 6 Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |
7 | 7 |
8 This library is free software; you can redistribute it and/or | 8 This library is free software; you can redistribute it and/or |
9 modify it under the terms of the GNU Library General Public | 9 modify it under the terms of the GNU Library General Public |
10 License as published by the Free Software Foundation; either | 10 License as published by the Free Software Foundation; either |
(...skipping 15 matching lines...) Expand all Loading... |
26 | 26 |
27 #include "core/fetch/ImageResourceClient.h" | 27 #include "core/fetch/ImageResourceClient.h" |
28 #include "core/fetch/MemoryCache.h" | 28 #include "core/fetch/MemoryCache.h" |
29 #include "core/fetch/ResourceClient.h" | 29 #include "core/fetch/ResourceClient.h" |
30 #include "core/fetch/ResourceClientWalker.h" | 30 #include "core/fetch/ResourceClientWalker.h" |
31 #include "core/fetch/ResourceFetcher.h" | 31 #include "core/fetch/ResourceFetcher.h" |
32 #include "core/fetch/ResourceLoader.h" | 32 #include "core/fetch/ResourceLoader.h" |
33 #include "core/html/HTMLImageElement.h" | 33 #include "core/html/HTMLImageElement.h" |
34 #include "core/layout/LayoutObject.h" | 34 #include "core/layout/LayoutObject.h" |
35 #include "core/svg/graphics/SVGImage.h" | 35 #include "core/svg/graphics/SVGImage.h" |
36 #include "core/svg/graphics/SVGImageForContainer.h" | |
37 #include "platform/Logging.h" | 36 #include "platform/Logging.h" |
38 #include "platform/RuntimeEnabledFeatures.h" | 37 #include "platform/RuntimeEnabledFeatures.h" |
39 #include "platform/SharedBuffer.h" | 38 #include "platform/SharedBuffer.h" |
40 #include "platform/TraceEvent.h" | 39 #include "platform/TraceEvent.h" |
41 #include "platform/graphics/BitmapImage.h" | 40 #include "platform/graphics/BitmapImage.h" |
42 #include "public/platform/Platform.h" | 41 #include "public/platform/Platform.h" |
43 #include "wtf/CurrentTime.h" | 42 #include "wtf/CurrentTime.h" |
44 #include "wtf/StdLibExtras.h" | 43 #include "wtf/StdLibExtras.h" |
45 | 44 |
46 namespace blink { | 45 namespace blink { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 if (m_image && !m_image->isNull()) | 119 if (m_image && !m_image->isNull()) |
121 static_cast<ImageResourceClient*>(c)->imageChanged(this); | 120 static_cast<ImageResourceClient*>(c)->imageChanged(this); |
122 | 121 |
123 Resource::didAddClient(c); | 122 Resource::didAddClient(c); |
124 } | 123 } |
125 | 124 |
126 void ImageResource::didRemoveClient(ResourceClient* c) | 125 void ImageResource::didRemoveClient(ResourceClient* c) |
127 { | 126 { |
128 ASSERT(c); | 127 ASSERT(c); |
129 ASSERT(c->resourceClientType() == ImageResourceClient::expectedType()); | 128 ASSERT(c->resourceClientType() == ImageResourceClient::expectedType()); |
130 if (m_imageForContainerMap) | |
131 m_imageForContainerMap->remove(static_cast<ImageResourceClient*>(c)); | |
132 | 129 |
133 Resource::didRemoveClient(c); | 130 Resource::didRemoveClient(c); |
134 } | 131 } |
135 | 132 |
136 bool ImageResource::isSafeToUnlock() const | 133 bool ImageResource::isSafeToUnlock() const |
137 { | 134 { |
138 // Note that |m_image| holds a reference to |m_data| in addition to the one
held by the Resource parent class. | 135 // Note that |m_image| holds a reference to |m_data| in addition to the one
held by the Resource parent class. |
139 return !m_image || (m_image->hasOneRef() && m_data->refCount() == 2); | 136 return !m_image || (m_image->hasOneRef() && m_data->refCount() == 2); |
140 } | 137 } |
141 | 138 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 if (errorOccurred()) { | 193 if (errorOccurred()) { |
197 // Returning the 1x broken image is non-ideal, but we cannot reliably ac
cess the appropriate | 194 // Returning the 1x broken image is non-ideal, but we cannot reliably ac
cess the appropriate |
198 // deviceScaleFactor from here. It is critical that callers use ImageRes
ource::brokenImage() | 195 // deviceScaleFactor from here. It is critical that callers use ImageRes
ource::brokenImage() |
199 // when they need the real, deviceScaleFactor-appropriate broken image i
con. | 196 // when they need the real, deviceScaleFactor-appropriate broken image i
con. |
200 return brokenImage(1).first; | 197 return brokenImage(1).first; |
201 } | 198 } |
202 | 199 |
203 if (!m_image) | 200 if (!m_image) |
204 return blink::Image::nullImage(); | 201 return blink::Image::nullImage(); |
205 | 202 |
206 if (m_image->isSVGImage()) { | |
207 blink::Image* image = svgImageForLayoutObject(layoutObject); | |
208 if (image != blink::Image::nullImage()) | |
209 return image; | |
210 } | |
211 | |
212 return m_image.get(); | 203 return m_image.get(); |
213 } | 204 } |
214 | 205 |
215 void ImageResource::setContainerSizeForLayoutObject(const ImageResourceClient* l
ayoutObject, const IntSize& containerSize, float containerZoom) | |
216 { | |
217 if (containerSize.isEmpty()) | |
218 return; | |
219 ASSERT(layoutObject); | |
220 ASSERT(containerZoom); | |
221 if (!m_image) | |
222 return; | |
223 if (!m_image->isSVGImage()) { | |
224 m_image->setContainerSize(containerSize); | |
225 return; | |
226 } | |
227 | |
228 FloatSize containerSizeWithoutZoom(containerSize); | |
229 containerSizeWithoutZoom.scale(1 / containerZoom); | |
230 m_imageForContainerMap->set(layoutObject, SVGImageForContainer::create(toSVG
Image(m_image.get()), containerSizeWithoutZoom, containerZoom)); | |
231 } | |
232 | |
233 bool ImageResource::usesImageContainerSize() const | 206 bool ImageResource::usesImageContainerSize() const |
234 { | 207 { |
235 if (m_image) | 208 if (m_image) |
236 return m_image->usesContainerSize(); | 209 return m_image->usesContainerSize(); |
237 | 210 |
238 return false; | 211 return false; |
239 } | 212 } |
240 | 213 |
241 bool ImageResource::imageHasRelativeWidth() const | 214 bool ImageResource::imageHasRelativeWidth() const |
242 { | 215 { |
(...skipping 15 matching lines...) Expand all Loading... |
258 { | 231 { |
259 ASSERT(!isPurgeable()); | 232 ASSERT(!isPurgeable()); |
260 | 233 |
261 if (!m_image) | 234 if (!m_image) |
262 return LayoutSize(); | 235 return LayoutSize(); |
263 | 236 |
264 LayoutSize imageSize; | 237 LayoutSize imageSize; |
265 | 238 |
266 if (m_image->isBitmapImage() && (layoutObject && layoutObject->shouldRespect
ImageOrientation() == RespectImageOrientation)) | 239 if (m_image->isBitmapImage() && (layoutObject && layoutObject->shouldRespect
ImageOrientation() == RespectImageOrientation)) |
267 imageSize = LayoutSize(toBitmapImage(m_image.get())->sizeRespectingOrien
tation()); | 240 imageSize = LayoutSize(toBitmapImage(m_image.get())->sizeRespectingOrien
tation()); |
268 else if (m_image->isSVGImage() && sizeType == NormalSize) | |
269 imageSize = LayoutSize(svgImageSizeForLayoutObject(layoutObject)); | |
270 else | 241 else |
271 imageSize = LayoutSize(m_image->size()); | 242 imageSize = LayoutSize(m_image->size()); |
272 | 243 |
273 if (sizeType == IntrinsicCorrectedToDPR && m_hasDevicePixelRatioHeaderValue
&& m_devicePixelRatioHeaderValue > 0) | 244 if (sizeType == IntrinsicCorrectedToDPR && m_hasDevicePixelRatioHeaderValue
&& m_devicePixelRatioHeaderValue > 0) |
274 multiplier = 1.0 / m_devicePixelRatioHeaderValue; | 245 multiplier = 1.0 / m_devicePixelRatioHeaderValue; |
275 | 246 |
276 if (multiplier == 1.0f) | 247 if (multiplier == 1.0f) |
277 return imageSize; | 248 return imageSize; |
278 | 249 |
279 // Don't let images that have a width/height >= 1 shrink below 1 when zoomed
. | 250 // Don't let images that have a width/height >= 1 shrink below 1 when zoomed
. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 } | 284 } |
314 | 285 |
315 inline void ImageResource::createImage() | 286 inline void ImageResource::createImage() |
316 { | 287 { |
317 // Create the image if it doesn't yet exist. | 288 // Create the image if it doesn't yet exist. |
318 if (m_image) | 289 if (m_image) |
319 return; | 290 return; |
320 | 291 |
321 if (m_response.mimeType() == "image/svg+xml") { | 292 if (m_response.mimeType() == "image/svg+xml") { |
322 m_image = SVGImage::create(this); | 293 m_image = SVGImage::create(this); |
323 m_imageForContainerMap = adoptPtr(new ImageForContainerMap); | |
324 } else { | 294 } else { |
325 m_image = BitmapImage::create(this); | 295 m_image = BitmapImage::create(this); |
326 } | 296 } |
327 } | 297 } |
328 | 298 |
329 inline void ImageResource::clearImage() | 299 inline void ImageResource::clearImage() |
330 { | 300 { |
331 // If our Image has an observer, it's always us so we need to clear the back
pointer | 301 // If our Image has an observer, it's always us so we need to clear the back
pointer |
332 // before dropping our reference. | 302 // before dropping our reference. |
333 if (m_image) | 303 if (m_image) |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 { | 459 { |
490 if (response().wasFetchedViaServiceWorker()) | 460 if (response().wasFetchedViaServiceWorker()) |
491 return response().serviceWorkerResponseType() != WebServiceWorkerRespons
eTypeOpaque; | 461 return response().serviceWorkerResponseType() != WebServiceWorkerRespons
eTypeOpaque; |
492 if (!image()->currentFrameHasSingleSecurityOrigin()) | 462 if (!image()->currentFrameHasSingleSecurityOrigin()) |
493 return false; | 463 return false; |
494 if (passesAccessControlCheck(securityOrigin)) | 464 if (passesAccessControlCheck(securityOrigin)) |
495 return true; | 465 return true; |
496 return !securityOrigin->taintsCanvas(response().url()); | 466 return !securityOrigin->taintsCanvas(response().url()); |
497 } | 467 } |
498 | 468 |
499 IntSize ImageResource::svgImageSizeForLayoutObject(const LayoutObject* layoutObj
ect) const | |
500 { | |
501 IntSize imageSize = m_image->size(); | |
502 if (!layoutObject) | |
503 return imageSize; | |
504 | |
505 ImageForContainerMap::const_iterator it = m_imageForContainerMap->find(layou
tObject); | |
506 if (it == m_imageForContainerMap->end()) | |
507 return imageSize; | |
508 | |
509 RefPtr<SVGImageForContainer> imageForContainer = it->value; | |
510 ASSERT(!imageForContainer->size().isEmpty()); | |
511 return imageForContainer->size(); | |
512 } | |
513 | |
514 // FIXME: This doesn't take into account the animation timeline so animations wi
ll not | |
515 // restart on page load, nor will two animations in different pages have differe
nt timelines. | |
516 Image* ImageResource::svgImageForLayoutObject(const LayoutObject* layoutObject) | |
517 { | |
518 if (!layoutObject) | |
519 return Image::nullImage(); | |
520 | |
521 ImageForContainerMap::iterator it = m_imageForContainerMap->find(layoutObjec
t); | |
522 if (it == m_imageForContainerMap->end()) | |
523 return Image::nullImage(); | |
524 | |
525 RefPtr<SVGImageForContainer> imageForContainer = it->value; | |
526 ASSERT(!imageForContainer->size().isEmpty()); | |
527 | |
528 Node* node = layoutObject->node(); | |
529 if (node && isHTMLImageElement(node)) { | |
530 const AtomicString& urlString = toHTMLImageElement(node)->imageSourceURL
(); | |
531 KURL url = node->document().completeURL(urlString); | |
532 imageForContainer->setURL(url); | |
533 } | |
534 | |
535 return imageForContainer.get(); | |
536 } | |
537 | |
538 bool ImageResource::loadingMultipartContent() const | 469 bool ImageResource::loadingMultipartContent() const |
539 { | 470 { |
540 return m_loader && m_loader->loadingMultipartContent(); | 471 return m_loader && m_loader->loadingMultipartContent(); |
541 } | 472 } |
542 | 473 |
543 } // namespace blink | 474 } // namespace blink |
OLD | NEW |