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 1450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1461 FloatSize offset = dstRect->location() - scaledSrcLocation; | 1461 FloatSize offset = dstRect->location() - scaledSrcLocation; |
1462 | 1462 |
1463 srcRect->intersect(imageRect); | 1463 srcRect->intersect(imageRect); |
1464 | 1464 |
1465 // To clip the destination rectangle in the same proportion, transform the c
lipped src rect | 1465 // To clip the destination rectangle in the same proportion, transform the c
lipped src rect |
1466 *dstRect = *srcRect; | 1466 *dstRect = *srcRect; |
1467 dstRect->scale(scale.width(), scale.height()); | 1467 dstRect->scale(scale.width(), scale.height()); |
1468 dstRect->move(offset); | 1468 dstRect->move(offset); |
1469 } | 1469 } |
1470 | 1470 |
1471 static bool checkImageSource(CanvasImageSource* imageSource, ExceptionState& exc
eptionState) | |
1472 { | |
1473 if (!imageSource) { | |
1474 // FIXME: Message should mention ImageBitmap once that feature ships. | |
1475 exceptionState.throwTypeError(ExceptionMessages::argumentNullOrIncorrect
Type(1, String("HTMLImageElement, HTMLCanvasElement or HTMLVideoElement"))); | |
1476 return false; | |
1477 } | |
1478 return true; | |
1479 } | |
1480 | |
1481 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, float x
, float y, ExceptionState& exceptionState) | 1471 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, float x
, float y, ExceptionState& exceptionState) |
1482 { | 1472 { |
1483 if (!checkImageSource(imageSource, exceptionState)) | |
1484 return; | |
1485 FloatSize destRectSize = imageSource->defaultDestinationSize(); | 1473 FloatSize destRectSize = imageSource->defaultDestinationSize(); |
1486 drawImage(imageSource, x, y, destRectSize.width(), destRectSize.height(), ex
ceptionState); | 1474 drawImage(imageSource, x, y, destRectSize.width(), destRectSize.height(), ex
ceptionState); |
1487 } | 1475 } |
1488 | 1476 |
1489 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, | 1477 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, |
1490 float x, float y, float width, float height, ExceptionState& exceptionState) | 1478 float x, float y, float width, float height, ExceptionState& exceptionState) |
1491 { | 1479 { |
1492 if (!checkImageSource(imageSource, exceptionState)) | |
1493 return; | |
1494 FloatSize sourceRectSize = imageSource->sourceSize(); | 1480 FloatSize sourceRectSize = imageSource->sourceSize(); |
1495 drawImage(imageSource, 0, 0, sourceRectSize.width(), sourceRectSize.height()
, x, y, width, height, exceptionState); | 1481 drawImage(imageSource, 0, 0, sourceRectSize.width(), sourceRectSize.height()
, x, y, width, height, exceptionState); |
1496 } | 1482 } |
1497 | 1483 |
1498 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, | 1484 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, |
1499 float sx, float sy, float sw, float sh, | 1485 float sx, float sy, float sw, float sh, |
1500 float dx, float dy, float dw, float dh, ExceptionState& exceptionState) | 1486 float dx, float dy, float dw, float dh, ExceptionState& exceptionState) |
1501 { | 1487 { |
1502 GraphicsContext* c = drawingContext(); // Do not exit yet if !c because we m
ay need to throw exceptions first | 1488 GraphicsContext* c = drawingContext(); // Do not exit yet if !c because we m
ay need to throw exceptions first |
1503 CompositeOperator op = c ? c->compositeOperation() : CompositeSourceOver; | 1489 CompositeOperator op = c ? c->compositeOperation() : CompositeSourceOver; |
1504 blink::WebBlendMode blendMode = c ? c->blendModeOperation() : blink::WebBlen
dModeNormal; | 1490 blink::WebBlendMode blendMode = c ? c->blendModeOperation() : blink::WebBlen
dModeNormal; |
1505 drawImageInternal(imageSource, sx, sy, sw, sh, dx, dy, dw, dh, exceptionStat
e, op, blendMode); | 1491 drawImageInternal(imageSource, sx, sy, sw, sh, dx, dy, dw, dh, exceptionStat
e, op, blendMode); |
1506 } | 1492 } |
1507 | 1493 |
1508 void CanvasRenderingContext2D::drawImageInternal(CanvasImageSource* imageSource, | 1494 void CanvasRenderingContext2D::drawImageInternal(CanvasImageSource* imageSource, |
1509 float sx, float sy, float sw, float sh, | 1495 float sx, float sy, float sw, float sh, |
1510 float dx, float dy, float dw, float dh, ExceptionState& exceptionState, | 1496 float dx, float dy, float dw, float dh, ExceptionState& exceptionState, |
1511 CompositeOperator op, blink::WebBlendMode blendMode) | 1497 CompositeOperator op, blink::WebBlendMode blendMode) |
1512 { | 1498 { |
1513 if (!checkImageSource(imageSource, exceptionState)) | |
1514 return; | |
1515 | |
1516 RefPtr<Image> image; | 1499 RefPtr<Image> image; |
1517 SourceImageStatus sourceImageStatus; | 1500 SourceImageStatus sourceImageStatus; |
1518 if (!imageSource->isVideoElement()) { | 1501 if (!imageSource->isVideoElement()) { |
1519 SourceImageMode mode = canvas() == imageSource ? CopySourceImageIfVolati
le : DontCopySourceImage; // Thunking for == | 1502 SourceImageMode mode = canvas() == imageSource ? CopySourceImageIfVolati
le : DontCopySourceImage; // Thunking for == |
1520 image = imageSource->getSourceImageForCanvas(mode, &sourceImageStatus); | 1503 image = imageSource->getSourceImageForCanvas(mode, &sourceImageStatus); |
1521 if (sourceImageStatus == UndecodableSourceImageStatus) | 1504 if (sourceImageStatus == UndecodableSourceImageStatus) |
1522 exceptionState.throwDOMException(InvalidStateError, "The HTMLImageEl
ement provided is in the 'broken' state."); | 1505 exceptionState.throwDOMException(InvalidStateError, "The HTMLImageEl
ement provided is in the 'broken' state."); |
1523 if (!image || !image->width() || !image->height()) | 1506 if (!image || !image->width() || !image->height()) |
1524 return; | 1507 return; |
1525 } | 1508 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1588 c->translate(-srcRect.x(), -srcRect.y()); | 1571 c->translate(-srcRect.x(), -srcRect.y()); |
1589 video->paintCurrentFrameInContext(c, IntRect(IntPoint(), IntSize(video->vide
oWidth(), video->videoHeight()))); | 1572 video->paintCurrentFrameInContext(c, IntRect(IntPoint(), IntSize(video->vide
oWidth(), video->videoHeight()))); |
1590 stateSaver.restore(); | 1573 stateSaver.restore(); |
1591 } | 1574 } |
1592 | 1575 |
1593 void CanvasRenderingContext2D::drawImageFromRect(HTMLImageElement* image, | 1576 void CanvasRenderingContext2D::drawImageFromRect(HTMLImageElement* image, |
1594 float sx, float sy, float sw, float sh, | 1577 float sx, float sy, float sw, float sh, |
1595 float dx, float dy, float dw, float dh, | 1578 float dx, float dy, float dw, float dh, |
1596 const String& compositeOperation) | 1579 const String& compositeOperation) |
1597 { | 1580 { |
| 1581 if (!image) |
| 1582 return; |
1598 CompositeOperator op; | 1583 CompositeOperator op; |
1599 blink::WebBlendMode blendOp = blink::WebBlendModeNormal; | 1584 blink::WebBlendMode blendOp = blink::WebBlendModeNormal; |
1600 if (!parseCompositeAndBlendOperator(compositeOperation, op, blendOp) || blen
dOp != blink::WebBlendModeNormal) | 1585 if (!parseCompositeAndBlendOperator(compositeOperation, op, blendOp) || blen
dOp != blink::WebBlendModeNormal) |
1601 op = CompositeSourceOver; | 1586 op = CompositeSourceOver; |
1602 | 1587 |
1603 drawImageInternal(image, sx, sy, sw, sh, dx, dy, dw, dh, IGNORE_EXCEPTION, o
p, blendOp); | 1588 drawImageInternal(image, sx, sy, sw, sh, dx, dy, dw, dh, IGNORE_EXCEPTION, o
p, blendOp); |
1604 } | 1589 } |
1605 | 1590 |
1606 void CanvasRenderingContext2D::setAlpha(float alpha) | 1591 void CanvasRenderingContext2D::setAlpha(float alpha) |
1607 { | 1592 { |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1709 if (exceptionState.hadException()) | 1694 if (exceptionState.hadException()) |
1710 return nullptr; | 1695 return nullptr; |
1711 | 1696 |
1712 RefPtr<CanvasGradient> gradient = CanvasGradient::create(FloatPoint(x0, y0),
r0, FloatPoint(x1, y1), r1); | 1697 RefPtr<CanvasGradient> gradient = CanvasGradient::create(FloatPoint(x0, y0),
r0, FloatPoint(x1, y1), r1); |
1713 return gradient.release(); | 1698 return gradient.release(); |
1714 } | 1699 } |
1715 | 1700 |
1716 PassRefPtr<CanvasPattern> CanvasRenderingContext2D::createPattern(CanvasImageSou
rce* imageSource, | 1701 PassRefPtr<CanvasPattern> CanvasRenderingContext2D::createPattern(CanvasImageSou
rce* imageSource, |
1717 const String& repetitionType, ExceptionState& exceptionState) | 1702 const String& repetitionType, ExceptionState& exceptionState) |
1718 { | 1703 { |
1719 if (!checkImageSource(imageSource, exceptionState)) | |
1720 return nullptr; | |
1721 bool repeatX, repeatY; | 1704 bool repeatX, repeatY; |
1722 CanvasPattern::parseRepetitionType(repetitionType, repeatX, repeatY, excepti
onState); | 1705 CanvasPattern::parseRepetitionType(repetitionType, repeatX, repeatY, excepti
onState); |
1723 if (exceptionState.hadException()) | 1706 if (exceptionState.hadException()) |
1724 return nullptr; | 1707 return nullptr; |
1725 | 1708 |
1726 SourceImageStatus status; | 1709 SourceImageStatus status; |
1727 RefPtr<Image> imageForRendering = imageSource->getSourceImageForCanvas(CopyS
ourceImageIfVolatile, &status); | 1710 RefPtr<Image> imageForRendering = imageSource->getSourceImageForCanvas(CopyS
ourceImageIfVolatile, &status); |
1728 | 1711 |
1729 switch (status) { | 1712 switch (status) { |
1730 case NormalSourceImageStatus: | 1713 case NormalSourceImageStatus: |
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2434 c->setAlphaAsFloat(1.0); | 2417 c->setAlphaAsFloat(1.0); |
2435 c->clearShadow(); | 2418 c->clearShadow(); |
2436 c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal); | 2419 c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal); |
2437 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); | 2420 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); |
2438 c->restore(); | 2421 c->restore(); |
2439 | 2422 |
2440 didDraw(dirtyRect); | 2423 didDraw(dirtyRect); |
2441 } | 2424 } |
2442 | 2425 |
2443 } // namespace WebCore | 2426 } // namespace WebCore |
OLD | NEW |