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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 { | 88 { |
89 ASSERT(!m_imageResource); | 89 ASSERT(!m_imageResource); |
90 m_imageResource = imageResource; | 90 m_imageResource = imageResource; |
91 m_imageResource->initialize(this); | 91 m_imageResource->initialize(this); |
92 } | 92 } |
93 | 93 |
94 // If we'll be displaying either alt text or an image, add some padding. | 94 // If we'll be displaying either alt text or an image, add some padding. |
95 static const unsigned short paddingWidth = 4; | 95 static const unsigned short paddingWidth = 4; |
96 static const unsigned short paddingHeight = 4; | 96 static const unsigned short paddingHeight = 4; |
97 | 97 |
98 // Alt text is restricted to this maximum size, in pixels. These are | |
99 // signed integers because they are compared with other signed values. | |
100 static const float maxAltTextWidth = 1024; | |
101 static const int maxAltTextHeight = 256; | |
102 | |
103 IntSize RenderImage::imageSizeForError(ImageResource* newImage) const | 98 IntSize RenderImage::imageSizeForError(ImageResource* newImage) const |
104 { | 99 { |
105 ASSERT_ARG(newImage, newImage); | 100 ASSERT_ARG(newImage, newImage); |
106 ASSERT_ARG(newImage, newImage->imageForRenderer(this)); | 101 ASSERT_ARG(newImage, newImage->imageForRenderer(this)); |
107 | 102 |
108 IntSize imageSize; | 103 IntSize imageSize; |
109 if (newImage->willPaintBrokenImage()) { | 104 if (newImage->willPaintBrokenImage()) { |
110 float deviceScaleFactor = blink::deviceScaleFactor(frame()); | 105 float deviceScaleFactor = blink::deviceScaleFactor(frame()); |
111 pair<Image*, float> brokenImageAndImageScaleFactor = ImageResource::brok
enImage(deviceScaleFactor); | 106 pair<Image*, float> brokenImageAndImageScaleFactor = ImageResource::brok
enImage(deviceScaleFactor); |
112 imageSize = brokenImageAndImageScaleFactor.first->size(); | 107 imageSize = brokenImageAndImageScaleFactor.first->size(); |
(...skipping 16 matching lines...) Expand all Loading... |
129 else if (!m_altText.isEmpty() || newImage) { | 124 else if (!m_altText.isEmpty() || newImage) { |
130 // If we'll be displaying either text or an image, add a little padding. | 125 // If we'll be displaying either text or an image, add a little padding. |
131 imageSize = IntSize(paddingWidth, paddingHeight); | 126 imageSize = IntSize(paddingWidth, paddingHeight); |
132 } | 127 } |
133 | 128 |
134 // we have an alt and the user meant it (its not a text we invented) | 129 // we have an alt and the user meant it (its not a text we invented) |
135 if (!m_altText.isEmpty()) { | 130 if (!m_altText.isEmpty()) { |
136 FontCachePurgePreventer fontCachePurgePreventer; | 131 FontCachePurgePreventer fontCachePurgePreventer; |
137 | 132 |
138 const Font& font = style()->font(); | 133 const Font& font = style()->font(); |
139 IntSize paddedTextSize(paddingWidth + std::min(ceilf(font.width(construc
tTextRun(this, font, m_altText, style()))), maxAltTextWidth), paddingHeight + st
d::min(font.fontMetrics().height(), maxAltTextHeight)); | 134 IntSize paddedTextSize(paddingWidth + ceilf(font.width(constructTextRun(
this, font, m_altText, style()))), paddingHeight + font.fontMetrics().height()); |
140 imageSize = imageSize.expandedTo(paddedTextSize); | 135 imageSize = imageSize.expandedTo(paddedTextSize); |
141 } | 136 } |
142 | 137 |
143 if (imageSize == intrinsicSize()) | 138 if (imageSize == intrinsicSize()) |
144 return false; | 139 return false; |
145 | 140 |
146 setIntrinsicSize(imageSize); | 141 setIntrinsicSize(imageSize); |
147 return true; | 142 return true; |
148 } | 143 } |
149 | 144 |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 | 287 |
293 if (cWidth > 2 && cHeight > 2) { | 288 if (cWidth > 2 && cHeight > 2) { |
294 const int borderWidth = 1; | 289 const int borderWidth = 1; |
295 | 290 |
296 // Draw an outline rect where the image should be. | 291 // Draw an outline rect where the image should be. |
297 context->setStrokeStyle(SolidStroke); | 292 context->setStrokeStyle(SolidStroke); |
298 context->setStrokeColor(Color::lightGray); | 293 context->setStrokeColor(Color::lightGray); |
299 context->setFillColor(Color::transparent); | 294 context->setFillColor(Color::transparent); |
300 context->drawRect(pixelSnappedIntRect(LayoutRect(paintOffset.x() + l
eftBorder + leftPad, paintOffset.y() + topBorder + topPad, cWidth, cHeight))); | 295 context->drawRect(pixelSnappedIntRect(LayoutRect(paintOffset.x() + l
eftBorder + leftPad, paintOffset.y() + topBorder + topPad, cWidth, cHeight))); |
301 | 296 |
302 bool errorPictureDrawn = false; | |
303 LayoutSize imageOffset; | 297 LayoutSize imageOffset; |
304 // When calculating the usable dimensions, exclude the pixels of | 298 // When calculating the usable dimensions, exclude the pixels of |
305 // the ouline rect so the error image/alt text doesn't draw on it. | 299 // the ouline rect so the error image/alt text doesn't draw on it. |
306 LayoutUnit usableWidth = cWidth - 2 * borderWidth; | 300 LayoutUnit usableWidth = cWidth - 2 * borderWidth; |
307 LayoutUnit usableHeight = cHeight - 2 * borderWidth; | 301 LayoutUnit usableHeight = cHeight - 2 * borderWidth; |
308 | 302 |
309 RefPtr<Image> image = m_imageResource->image(); | 303 RefPtr<Image> image = m_imageResource->image(); |
310 | 304 |
311 if (m_imageResource->errorOccurred() && !image->isNull() && usableWi
dth >= image->width() && usableHeight >= image->height()) { | 305 if (m_imageResource->errorOccurred() && !image->isNull() && usableWi
dth >= image->width() && usableHeight >= image->height() && m_altText.isEmpty())
{ |
312 float deviceScaleFactor = blink::deviceScaleFactor(frame()); | 306 float deviceScaleFactor = blink::deviceScaleFactor(frame()); |
313 // Call brokenImage() explicitly to ensure we get the broken ima
ge icon at the appropriate resolution. | 307 // Call brokenImage() explicitly to ensure we get the broken ima
ge icon at the appropriate resolution. |
314 pair<Image*, float> brokenImageAndImageScaleFactor = ImageResour
ce::brokenImage(deviceScaleFactor); | 308 pair<Image*, float> brokenImageAndImageScaleFactor = ImageResour
ce::brokenImage(deviceScaleFactor); |
315 image = brokenImageAndImageScaleFactor.first; | 309 image = brokenImageAndImageScaleFactor.first; |
316 IntSize imageSize = image->size(); | 310 IntSize imageSize = image->size(); |
317 imageSize.scale(1 / brokenImageAndImageScaleFactor.second); | 311 imageSize.scale(1 / brokenImageAndImageScaleFactor.second); |
318 // Center the error image, accounting for border and padding. | 312 // Center the error image, accounting for border and padding. |
319 LayoutUnit centerX = (usableWidth - imageSize.width()) / 2; | 313 LayoutUnit centerX = (usableWidth - imageSize.width()) / 2; |
320 if (centerX < 0) | 314 if (centerX < 0) |
321 centerX = 0; | 315 centerX = 0; |
322 LayoutUnit centerY = (usableHeight - imageSize.height()) / 2; | 316 LayoutUnit centerY = (usableHeight - imageSize.height()) / 2; |
323 if (centerY < 0) | 317 if (centerY < 0) |
324 centerY = 0; | 318 centerY = 0; |
325 imageOffset = LayoutSize(leftBorder + leftPad + centerX + border
Width, topBorder + topPad + centerY + borderWidth); | 319 imageOffset = LayoutSize(leftBorder + leftPad + centerX + border
Width, topBorder + topPad + centerY + borderWidth); |
326 context->drawImage(image.get(), pixelSnappedIntRect(LayoutRect(p
aintOffset + imageOffset, imageSize)), CompositeSourceOver, shouldRespectImageOr
ientation()); | 320 context->drawImage(image.get(), pixelSnappedIntRect(LayoutRect(p
aintOffset + imageOffset, imageSize)), CompositeSourceOver, shouldRespectImageOr
ientation()); |
327 errorPictureDrawn = true; | |
328 } | 321 } |
329 | 322 |
330 if (!m_altText.isEmpty()) { | 323 if (!m_altText.isEmpty()) { |
331 const Font& font = style()->font(); | 324 const Font& font = style()->font(); |
332 const FontMetrics& fontMetrics = font.fontMetrics(); | 325 const FontMetrics& fontMetrics = font.fontMetrics(); |
333 LayoutUnit ascent = fontMetrics.ascent(); | 326 LayoutUnit ascent = fontMetrics.ascent(); |
334 LayoutPoint textRectOrigin = paintOffset; | 327 LayoutPoint textRectOrigin = paintOffset; |
335 textRectOrigin.move(leftBorder + leftPad + (paddingWidth / 2) -
borderWidth, topBorder + topPad + (paddingHeight / 2) - borderWidth); | 328 textRectOrigin.move(leftBorder + leftPad + (paddingWidth / 2) -
borderWidth, topBorder + topPad + (paddingHeight / 2) - borderWidth); |
336 LayoutPoint textOrigin(textRectOrigin.x(), textRectOrigin.y() +
ascent); | 329 LayoutPoint textOrigin(textRectOrigin.x(), textRectOrigin.y() +
ascent); |
337 | 330 |
338 // Only draw the alt text if it'll fit within the content box, | 331 // Only draw the alt text if it'll fit within the content box, |
339 // and only if it fits above the error image. | 332 // and only if it fits above the error image. |
340 TextRun textRun = constructTextRun(this, font, m_altText, style(
), TextRun::AllowTrailingExpansion | TextRun::ForbidLeadingExpansion, DefaultTex
tRunFlags | RespectDirection); | 333 TextRun textRun = constructTextRun(this, font, m_altText, style(
), TextRun::AllowTrailingExpansion | TextRun::ForbidLeadingExpansion, DefaultTex
tRunFlags | RespectDirection); |
341 float textWidth = font.width(textRun); | 334 float textWidth = font.width(textRun); |
342 TextRunPaintInfo textRunPaintInfo(textRun); | 335 TextRunPaintInfo textRunPaintInfo(textRun); |
343 textRunPaintInfo.bounds = FloatRect(textRectOrigin, FloatSize(te
xtWidth, fontMetrics.height())); | 336 textRunPaintInfo.bounds = FloatRect(textRectOrigin, FloatSize(te
xtWidth, fontMetrics.height())); |
344 context->setFillColor(resolveColor(CSSPropertyColor)); | 337 context->setFillColor(resolveColor(CSSPropertyColor)); |
345 if (textRun.direction() == RTL) { | 338 if (textRun.direction() == RTL) { |
346 int availableWidth = cWidth - static_cast<int>(paddingWidth)
; | 339 int availableWidth = cWidth - static_cast<int>(paddingWidth)
; |
347 textOrigin.move(availableWidth - ceilf(textWidth), 0); | 340 textOrigin.move(availableWidth - ceilf(textWidth), 0); |
348 } | 341 } |
349 if (errorPictureDrawn) { | 342 context->drawBidiText(font, textRunPaintInfo, textOrigin); |
350 if (usableWidth >= textWidth && fontMetrics.height() <= imag
eOffset.height()) | |
351 context->drawBidiText(font, textRunPaintInfo, textOrigin
); | |
352 } else if (usableWidth >= textWidth && usableHeight >= fontMetri
cs.height()) { | |
353 context->drawBidiText(font, textRunPaintInfo, textOrigin); | |
354 } | |
355 } | 343 } |
356 } | 344 } |
357 } else if (m_imageResource->hasImage() && cWidth > 0 && cHeight > 0) { | 345 } else if (m_imageResource->hasImage() && cWidth > 0 && cHeight > 0) { |
358 RefPtr<Image> img = m_imageResource->image(cWidth, cHeight); | 346 RefPtr<Image> img = m_imageResource->image(cWidth, cHeight); |
359 if (!img || img->isNull()) | 347 if (!img || img->isNull()) |
360 return; | 348 return; |
361 | 349 |
362 LayoutRect contentRect = contentBoxRect(); | 350 LayoutRect contentRect = contentBoxRect(); |
363 contentRect.moveBy(paintOffset); | 351 contentRect.moveBy(paintOffset); |
364 LayoutRect paintRect = replacedContentRect(); | 352 LayoutRect paintRect = replacedContentRect(); |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 return 0; | 616 return 0; |
629 | 617 |
630 ImageResource* cachedImage = m_imageResource->cachedImage(); | 618 ImageResource* cachedImage = m_imageResource->cachedImage(); |
631 if (cachedImage && cachedImage->image() && cachedImage->image()->isSVGImage(
)) | 619 if (cachedImage && cachedImage->image() && cachedImage->image()->isSVGImage(
)) |
632 return toSVGImage(cachedImage->image())->embeddedContentBox(); | 620 return toSVGImage(cachedImage->image())->embeddedContentBox(); |
633 | 621 |
634 return 0; | 622 return 0; |
635 } | 623 } |
636 | 624 |
637 } // namespace blink | 625 } // namespace blink |
OLD | NEW |