OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. |
3 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies) | 3 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies) |
4 * Copyright (C) 2007 Alp Toker <alp@atoker.com> | 4 * Copyright (C) 2007 Alp Toker <alp@atoker.com> |
5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> | 5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> |
6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org> | 6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org> |
7 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. | 7 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. |
8 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved. | 8 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved. |
9 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 9 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. |
10 * | 10 * |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 #include "core/html/TextMetrics.h" | 52 #include "core/html/TextMetrics.h" |
53 #include "core/html/canvas/Canvas2DContextAttributes.h" | 53 #include "core/html/canvas/Canvas2DContextAttributes.h" |
54 #include "core/html/canvas/CanvasGradient.h" | 54 #include "core/html/canvas/CanvasGradient.h" |
55 #include "core/html/canvas/CanvasPattern.h" | 55 #include "core/html/canvas/CanvasPattern.h" |
56 #include "core/html/canvas/CanvasStyle.h" | 56 #include "core/html/canvas/CanvasStyle.h" |
57 #include "core/html/canvas/DOMPath.h" | 57 #include "core/html/canvas/DOMPath.h" |
58 #include "core/frame/ImageBitmap.h" | 58 #include "core/frame/ImageBitmap.h" |
59 #include "core/platform/graphics/DrawLooper.h" | 59 #include "core/platform/graphics/DrawLooper.h" |
60 #include "core/platform/graphics/FontCache.h" | 60 #include "core/platform/graphics/FontCache.h" |
61 #include "core/platform/graphics/GraphicsContextStateSaver.h" | 61 #include "core/platform/graphics/GraphicsContextStateSaver.h" |
62 #include "core/rendering/RenderImage.h" | |
63 #include "core/rendering/RenderLayer.h" | 62 #include "core/rendering/RenderLayer.h" |
64 #include "core/rendering/RenderTheme.h" | 63 #include "core/rendering/RenderTheme.h" |
65 #include "platform/geometry/FloatQuad.h" | 64 #include "platform/geometry/FloatQuad.h" |
66 #include "platform/graphics/TextRun.h" | 65 #include "platform/graphics/TextRun.h" |
67 #include "platform/transforms/AffineTransform.h" | 66 #include "platform/transforms/AffineTransform.h" |
68 #include "weborigin/SecurityOrigin.h" | 67 #include "weborigin/SecurityOrigin.h" |
69 #include "wtf/CheckedArithmetic.h" | 68 #include "wtf/CheckedArithmetic.h" |
70 #include "wtf/MathExtras.h" | 69 #include "wtf/MathExtras.h" |
71 #include "wtf/OwnPtr.h" | 70 #include "wtf/OwnPtr.h" |
72 #include "wtf/Uint8ClampedArray.h" | 71 #include "wtf/Uint8ClampedArray.h" |
(...skipping 1133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1206 } else { | 1205 } else { |
1207 c->clearShadow(); | 1206 c->clearShadow(); |
1208 } | 1207 } |
1209 } | 1208 } |
1210 | 1209 |
1211 bool CanvasRenderingContext2D::shouldDrawShadows() const | 1210 bool CanvasRenderingContext2D::shouldDrawShadows() const |
1212 { | 1211 { |
1213 return alphaChannel(state().m_shadowColor) && (state().m_shadowBlur || !stat
e().m_shadowOffset.isZero()); | 1212 return alphaChannel(state().m_shadowColor) && (state().m_shadowBlur || !stat
e().m_shadowOffset.isZero()); |
1214 } | 1213 } |
1215 | 1214 |
1216 enum ImageSizeType { | 1215 static LayoutSize sizeFor(HTMLImageElement* image) |
1217 ImageSizeAfterDevicePixelRatio, | |
1218 ImageSizeBeforeDevicePixelRatio | |
1219 }; | |
1220 | |
1221 static LayoutSize sizeFor(HTMLImageElement* image, ImageSizeType sizeType) | |
1222 { | 1216 { |
1223 LayoutSize size; | 1217 if (ImageResource* cachedImage = image->cachedImage()) |
1224 ImageResource* cachedImage = image->cachedImage(); | 1218 return cachedImage->imageSizeForRenderer(image->renderer(), 1.0f); // FI
XME: Not sure about this. |
1225 if (cachedImage) { | 1219 return IntSize(); |
1226 size = cachedImage->imageSizeForRenderer(image->renderer(), 1.0f); // FI
XME: Not sure about this. | |
1227 | |
1228 if (sizeType == ImageSizeAfterDevicePixelRatio && image->renderer() && i
mage->renderer()->isRenderImage() && cachedImage->image() && !cachedImage->image
()->hasRelativeWidth()) | |
1229 size.scale(toRenderImage(image->renderer())->imageDevicePixelRatio()
); | |
1230 } | |
1231 return size; | |
1232 } | 1220 } |
1233 | 1221 |
1234 static IntSize sizeFor(HTMLVideoElement* video) | 1222 static IntSize sizeFor(HTMLVideoElement* video) |
1235 { | 1223 { |
1236 if (MediaPlayer* player = video->player()) | 1224 if (MediaPlayer* player = video->player()) |
1237 return player->naturalSize(); | 1225 return player->naturalSize(); |
1238 return IntSize(); | 1226 return IntSize(); |
1239 } | 1227 } |
1240 | 1228 |
1241 static inline FloatRect normalizeRect(const FloatRect& rect) | 1229 static inline FloatRect normalizeRect(const FloatRect& rect) |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1372 | 1360 |
1373 drawImageInternal(imageForRendering.get(), actualSrcRect, actualDstRect, sta
te().m_globalComposite, state().m_globalBlend); | 1361 drawImageInternal(imageForRendering.get(), actualSrcRect, actualDstRect, sta
te().m_globalComposite, state().m_globalBlend); |
1374 } | 1362 } |
1375 | 1363 |
1376 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, float x, float
y, ExceptionState& es) | 1364 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, float x, float
y, ExceptionState& es) |
1377 { | 1365 { |
1378 if (!image) { | 1366 if (!image) { |
1379 es.throwUninformativeAndGenericDOMException(TypeMismatchError); | 1367 es.throwUninformativeAndGenericDOMException(TypeMismatchError); |
1380 return; | 1368 return; |
1381 } | 1369 } |
1382 LayoutSize destRectSize = sizeFor(image, ImageSizeAfterDevicePixelRatio); | 1370 LayoutSize size = sizeFor(image); |
1383 drawImage(image, x, y, destRectSize.width(), destRectSize.height(), es); | 1371 drawImage(image, x, y, size.width(), size.height(), es); |
1384 } | 1372 } |
1385 | 1373 |
1386 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, | 1374 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, |
1387 float x, float y, float width, float height, ExceptionState& es) | 1375 float x, float y, float width, float height, ExceptionState& es) |
1388 { | 1376 { |
1389 if (!image) { | 1377 if (!image) { |
1390 es.throwUninformativeAndGenericDOMException(TypeMismatchError); | 1378 es.throwUninformativeAndGenericDOMException(TypeMismatchError); |
1391 return; | 1379 return; |
1392 } | 1380 } |
1393 LayoutSize sourceRectSize = sizeFor(image, ImageSizeBeforeDevicePixelRatio); | 1381 LayoutSize size = sizeFor(image); |
1394 drawImage(image, FloatRect(0, 0, sourceRectSize.width(), sourceRectSize.heig
ht()), FloatRect(x, y, width, height), es); | 1382 drawImage(image, FloatRect(0, 0, size.width(), size.height()), FloatRect(x,
y, width, height), es); |
1395 } | 1383 } |
1396 | 1384 |
1397 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, | 1385 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, |
1398 float sx, float sy, float sw, float sh, | 1386 float sx, float sy, float sw, float sh, |
1399 float dx, float dy, float dw, float dh, ExceptionState& es) | 1387 float dx, float dy, float dw, float dh, ExceptionState& es) |
1400 { | 1388 { |
1401 drawImage(image, FloatRect(sx, sy, sw, sh), FloatRect(dx, dy, dw, dh), es); | 1389 drawImage(image, FloatRect(sx, sy, sw, sh), FloatRect(dx, dy, dw, dh), es); |
1402 } | 1390 } |
1403 | 1391 |
1404 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, const FloatRec
t& srcRect, const FloatRect& dstRect, ExceptionState& es) | 1392 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, const FloatRec
t& srcRect, const FloatRect& dstRect, ExceptionState& es) |
1405 { | 1393 { |
1406 drawImage(image, srcRect, dstRect, state().m_globalComposite, state().m_glob
alBlend, es); | 1394 drawImage(image, srcRect, dstRect, state().m_globalComposite, state().m_glob
alBlend, es); |
1407 } | 1395 } |
1408 | 1396 |
1409 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, const FloatRec
t& srcRect, const FloatRect& dstRect, const CompositeOperator& op, const BlendMo
de& blendMode, ExceptionState& es) | 1397 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, const FloatRec
t& srcRect, const FloatRect& dstRect, const CompositeOperator& op, const BlendMo
de& blendMode, ExceptionState& es) |
1410 { | 1398 { |
1411 if (!image) { | 1399 if (!image) { |
1412 es.throwUninformativeAndGenericDOMException(TypeMismatchError); | 1400 es.throwUninformativeAndGenericDOMException(TypeMismatchError); |
1413 return; | 1401 return; |
1414 } | 1402 } |
1415 | 1403 |
1416 if (!std::isfinite(dstRect.x()) || !std::isfinite(dstRect.y()) || !std::isfi
nite(dstRect.width()) || !std::isfinite(dstRect.height()) | 1404 if (!std::isfinite(dstRect.x()) || !std::isfinite(dstRect.y()) || !std::isfi
nite(dstRect.width()) || !std::isfinite(dstRect.height()) |
1417 || !std::isfinite(srcRect.x()) || !std::isfinite(srcRect.y()) || !std::i
sfinite(srcRect.width()) || !std::isfinite(srcRect.height())) | 1405 || !std::isfinite(srcRect.x()) || !std::isfinite(srcRect.y()) || !std::i
sfinite(srcRect.width()) || !std::isfinite(srcRect.height())) |
1418 return; | 1406 return; |
1419 | 1407 |
1420 ImageResource* cachedImage = image->cachedImage(); | 1408 ImageResource* cachedImage = image->cachedImage(); |
1421 if (!cachedImage || !image->complete()) | 1409 if (!cachedImage || !image->complete()) |
1422 return; | 1410 return; |
1423 | 1411 |
1424 LayoutSize size = sizeFor(image, ImageSizeBeforeDevicePixelRatio); | 1412 LayoutSize size = sizeFor(image); |
1425 if (!size.width() || !size.height()) { | 1413 if (!size.width() || !size.height()) { |
1426 es.throwUninformativeAndGenericDOMException(InvalidStateError); | 1414 es.throwUninformativeAndGenericDOMException(InvalidStateError); |
1427 return; | 1415 return; |
1428 } | 1416 } |
1429 | 1417 |
1430 if (!dstRect.width() || !dstRect.height()) | 1418 if (!dstRect.width() || !dstRect.height()) |
1431 return; | 1419 return; |
1432 | 1420 |
1433 FloatRect normalizedSrcRect = normalizeRect(srcRect); | 1421 FloatRect normalizedSrcRect = normalizeRect(srcRect); |
1434 FloatRect normalizedDstRect = normalizeRect(dstRect); | 1422 FloatRect normalizedDstRect = normalizeRect(dstRect); |
(...skipping 996 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2431 const int focusRingWidth = 5; | 2419 const int focusRingWidth = 5; |
2432 const int focusRingOutline = 0; | 2420 const int focusRingOutline = 0; |
2433 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); | 2421 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); |
2434 | 2422 |
2435 c->restore(); | 2423 c->restore(); |
2436 | 2424 |
2437 didDraw(dirtyRect); | 2425 didDraw(dirtyRect); |
2438 } | 2426 } |
2439 | 2427 |
2440 } // namespace WebCore | 2428 } // namespace WebCore |
OLD | NEW |