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 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 , m_strokeStyle(CanvasStyle::createFromRGBA(Color::black)) | 247 , m_strokeStyle(CanvasStyle::createFromRGBA(Color::black)) |
248 , m_fillStyle(CanvasStyle::createFromRGBA(Color::black)) | 248 , m_fillStyle(CanvasStyle::createFromRGBA(Color::black)) |
249 , m_lineWidth(1) | 249 , m_lineWidth(1) |
250 , m_lineCap(ButtCap) | 250 , m_lineCap(ButtCap) |
251 , m_lineJoin(MiterJoin) | 251 , m_lineJoin(MiterJoin) |
252 , m_miterLimit(10) | 252 , m_miterLimit(10) |
253 , m_shadowBlur(0) | 253 , m_shadowBlur(0) |
254 , m_shadowColor(Color::transparent) | 254 , m_shadowColor(Color::transparent) |
255 , m_globalAlpha(1) | 255 , m_globalAlpha(1) |
256 , m_globalComposite(CompositeSourceOver) | 256 , m_globalComposite(CompositeSourceOver) |
257 , m_globalBlend(blink::WebBlendModeNormal) | 257 , m_globalBlend(WebBlendModeNormal) |
258 , m_invertibleCTM(true) | 258 , m_invertibleCTM(true) |
259 , m_lineDashOffset(0) | 259 , m_lineDashOffset(0) |
260 , m_imageSmoothingEnabled(true) | 260 , m_imageSmoothingEnabled(true) |
261 , m_textAlign(StartTextAlign) | 261 , m_textAlign(StartTextAlign) |
262 , m_textBaseline(AlphabeticTextBaseline) | 262 , m_textBaseline(AlphabeticTextBaseline) |
263 , m_direction(DirectionInherit) | 263 , m_direction(DirectionInherit) |
264 , m_unparsedFont(defaultFont) | 264 , m_unparsedFont(defaultFont) |
265 , m_realizedFont(false) | 265 , m_realizedFont(false) |
266 , m_hasClip(false) | 266 , m_hasClip(false) |
267 { | 267 { |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 } | 691 } |
692 | 692 |
693 String CanvasRenderingContext2D::globalCompositeOperation() const | 693 String CanvasRenderingContext2D::globalCompositeOperation() const |
694 { | 694 { |
695 return compositeOperatorName(state().m_globalComposite, state().m_globalBlen
d); | 695 return compositeOperatorName(state().m_globalComposite, state().m_globalBlen
d); |
696 } | 696 } |
697 | 697 |
698 void CanvasRenderingContext2D::setGlobalCompositeOperation(const String& operati
on) | 698 void CanvasRenderingContext2D::setGlobalCompositeOperation(const String& operati
on) |
699 { | 699 { |
700 CompositeOperator op = CompositeSourceOver; | 700 CompositeOperator op = CompositeSourceOver; |
701 blink::WebBlendMode blendMode = blink::WebBlendModeNormal; | 701 WebBlendMode blendMode = WebBlendModeNormal; |
702 if (!parseCompositeAndBlendOperator(operation, op, blendMode)) | 702 if (!parseCompositeAndBlendOperator(operation, op, blendMode)) |
703 return; | 703 return; |
704 if ((state().m_globalComposite == op) && (state().m_globalBlend == blendMode
)) | 704 if ((state().m_globalComposite == op) && (state().m_globalBlend == blendMode
)) |
705 return; | 705 return; |
706 GraphicsContext* c = drawingContext(); | 706 GraphicsContext* c = drawingContext(); |
707 realizeSaves(c); | 707 realizeSaves(c); |
708 modifiableState().m_globalComposite = op; | 708 modifiableState().m_globalComposite = op; |
709 modifiableState().m_globalBlend = blendMode; | 709 modifiableState().m_globalBlend = blendMode; |
710 if (!c) | 710 if (!c) |
711 return; | 711 return; |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1018 // If gradient size is zero, then paint nothing. | 1018 // If gradient size is zero, then paint nothing. |
1019 Gradient* gradient = c->fillGradient(); | 1019 Gradient* gradient = c->fillGradient(); |
1020 if (gradient && gradient->isZeroSize()) { | 1020 if (gradient && gradient->isZeroSize()) { |
1021 return; | 1021 return; |
1022 } | 1022 } |
1023 | 1023 |
1024 WindRule windRule = c->fillRule(); | 1024 WindRule windRule = c->fillRule(); |
1025 c->setFillRule(parseWinding(windingRuleString)); | 1025 c->setFillRule(parseWinding(windingRuleString)); |
1026 | 1026 |
1027 if (isFullCanvasCompositeMode(state().m_globalComposite)) { | 1027 if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
1028 fullCanvasCompositedFill(path); | 1028 fullCanvasCompositedDraw<Fill>(path); |
1029 didDraw(clipBounds); | 1029 didDraw(clipBounds); |
1030 } else if (state().m_globalComposite == CompositeCopy) { | 1030 } else if (state().m_globalComposite == CompositeCopy) { |
1031 clearCanvas(); | 1031 clearCanvas(); |
1032 c->fillPath(path); | 1032 c->fillPath(path); |
1033 didDraw(clipBounds); | 1033 didDraw(clipBounds); |
1034 } else { | 1034 } else { |
1035 FloatRect dirtyRect; | 1035 FloatRect dirtyRect; |
1036 if (computeDirtyRect(path.boundingRect(), clipBounds, &dirtyRect)) { | 1036 if (computeDirtyRect(path.boundingRect(), clipBounds, &dirtyRect)) { |
1037 c->fillPath(path); | 1037 c->fillPath(path); |
1038 didDraw(dirtyRect); | 1038 didDraw(dirtyRect); |
(...skipping 29 matching lines...) Expand all Loading... |
1068 if (!c->getTransformedClipBounds(&clipBounds)) | 1068 if (!c->getTransformedClipBounds(&clipBounds)) |
1069 return; | 1069 return; |
1070 | 1070 |
1071 // If gradient size is zero, then paint nothing. | 1071 // If gradient size is zero, then paint nothing. |
1072 Gradient* gradient = c->strokeGradient(); | 1072 Gradient* gradient = c->strokeGradient(); |
1073 if (gradient && gradient->isZeroSize()) { | 1073 if (gradient && gradient->isZeroSize()) { |
1074 return; | 1074 return; |
1075 } | 1075 } |
1076 | 1076 |
1077 if (isFullCanvasCompositeMode(state().m_globalComposite)) { | 1077 if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
1078 fullCanvasCompositedStroke(path); | 1078 fullCanvasCompositedDraw<Stroke>(path); |
1079 didDraw(clipBounds); | 1079 didDraw(clipBounds); |
1080 } else if (state().m_globalComposite == CompositeCopy) { | 1080 } else if (state().m_globalComposite == CompositeCopy) { |
1081 clearCanvas(); | 1081 clearCanvas(); |
1082 c->strokePath(path); | 1082 c->strokePath(path); |
1083 didDraw(clipBounds); | 1083 didDraw(clipBounds); |
1084 } else { | 1084 } else { |
1085 FloatRect bounds = path.boundingRect(); | 1085 FloatRect bounds = path.boundingRect(); |
1086 inflateStrokeRect(bounds); | 1086 inflateStrokeRect(bounds); |
1087 FloatRect dirtyRect; | 1087 FloatRect dirtyRect; |
1088 if (computeDirtyRect(bounds, clipBounds, &dirtyRect)) { | 1088 if (computeDirtyRect(bounds, clipBounds, &dirtyRect)) { |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1287 // If x0 = x1 and y0 = y1 and r0 = r1, then the radial gradient must paint n
othing | 1287 // If x0 = x1 and y0 = y1 and r0 = r1, then the radial gradient must paint n
othing |
1288 Gradient* gradient = c->fillGradient(); | 1288 Gradient* gradient = c->fillGradient(); |
1289 if (gradient && gradient->isZeroSize()) | 1289 if (gradient && gradient->isZeroSize()) |
1290 return; | 1290 return; |
1291 | 1291 |
1292 FloatRect rect(x, y, width, height); | 1292 FloatRect rect(x, y, width, height); |
1293 if (rectContainsTransformedRect(rect, clipBounds)) { | 1293 if (rectContainsTransformedRect(rect, clipBounds)) { |
1294 c->fillRect(rect); | 1294 c->fillRect(rect); |
1295 didDraw(clipBounds); | 1295 didDraw(clipBounds); |
1296 } else if (isFullCanvasCompositeMode(state().m_globalComposite)) { | 1296 } else if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
1297 fullCanvasCompositedFill(rect); | 1297 fullCanvasCompositedDraw<Fill>(rect); |
1298 didDraw(clipBounds); | 1298 didDraw(clipBounds); |
1299 } else if (state().m_globalComposite == CompositeCopy) { | 1299 } else if (state().m_globalComposite == CompositeCopy) { |
1300 clearCanvas(); | 1300 clearCanvas(); |
1301 c->fillRect(rect); | 1301 c->fillRect(rect); |
1302 didDraw(clipBounds); | 1302 didDraw(clipBounds); |
1303 } else { | 1303 } else { |
1304 FloatRect dirtyRect; | 1304 FloatRect dirtyRect; |
1305 if (computeDirtyRect(rect, clipBounds, &dirtyRect)) { | 1305 if (computeDirtyRect(rect, clipBounds, &dirtyRect)) { |
1306 c->fillRect(rect); | 1306 c->fillRect(rect); |
1307 didDraw(dirtyRect); | 1307 didDraw(dirtyRect); |
(...skipping 17 matching lines...) Expand all Loading... |
1325 FloatRect clipBounds; | 1325 FloatRect clipBounds; |
1326 if (!c->getTransformedClipBounds(&clipBounds)) | 1326 if (!c->getTransformedClipBounds(&clipBounds)) |
1327 return; | 1327 return; |
1328 | 1328 |
1329 // If gradient size is zero, then paint nothing. | 1329 // If gradient size is zero, then paint nothing. |
1330 Gradient* gradient = c->strokeGradient(); | 1330 Gradient* gradient = c->strokeGradient(); |
1331 if (gradient && gradient->isZeroSize()) | 1331 if (gradient && gradient->isZeroSize()) |
1332 return; | 1332 return; |
1333 | 1333 |
1334 FloatRect rect(x, y, width, height); | 1334 FloatRect rect(x, y, width, height); |
1335 | |
1336 if (isFullCanvasCompositeMode(state().m_globalComposite)) { | 1335 if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
1337 fullCanvasCompositedStroke(rect); | 1336 fullCanvasCompositedDraw<Stroke>(rect); |
1338 didDraw(clipBounds); | 1337 didDraw(clipBounds); |
1339 } else if (state().m_globalComposite == CompositeCopy) { | 1338 } else if (state().m_globalComposite == CompositeCopy) { |
1340 clearCanvas(); | 1339 clearCanvas(); |
1341 c->strokeRect(rect); | 1340 c->strokeRect(rect); |
1342 didDraw(clipBounds); | 1341 didDraw(clipBounds); |
1343 } else { | 1342 } else { |
1344 FloatRect boundingRect = rect; | 1343 FloatRect boundingRect = rect; |
1345 boundingRect.inflate(state().m_lineWidth / 2); | 1344 boundingRect.inflate(state().m_lineWidth / 2); |
1346 FloatRect dirtyRect; | 1345 FloatRect dirtyRect; |
1347 if (computeDirtyRect(boundingRect, clipBounds, &dirtyRect)) { | 1346 if (computeDirtyRect(boundingRect, clipBounds, &dirtyRect)) { |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1452 srcRect->intersect(imageRect); | 1451 srcRect->intersect(imageRect); |
1453 | 1452 |
1454 // To clip the destination rectangle in the same proportion, transform the c
lipped src rect | 1453 // To clip the destination rectangle in the same proportion, transform the c
lipped src rect |
1455 *dstRect = *srcRect; | 1454 *dstRect = *srcRect; |
1456 dstRect->scale(scale.width(), scale.height()); | 1455 dstRect->scale(scale.width(), scale.height()); |
1457 dstRect->move(offset); | 1456 dstRect->move(offset); |
1458 } | 1457 } |
1459 | 1458 |
1460 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, float x
, float y, ExceptionState& exceptionState) | 1459 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, float x
, float y, ExceptionState& exceptionState) |
1461 { | 1460 { |
| 1461 FloatSize sourceRectSize = imageSource->sourceSize(); |
1462 FloatSize destRectSize = imageSource->defaultDestinationSize(); | 1462 FloatSize destRectSize = imageSource->defaultDestinationSize(); |
1463 drawImage(imageSource, x, y, destRectSize.width(), destRectSize.height(), ex
ceptionState); | 1463 drawImageInternal(imageSource, 0, 0, sourceRectSize.width(), sourceRectSize.
height(), x, y, destRectSize.width(), destRectSize.height(), exceptionState); |
1464 } | 1464 } |
1465 | 1465 |
1466 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, | 1466 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, |
1467 float x, float y, float width, float height, ExceptionState& exceptionState) | 1467 float x, float y, float width, float height, ExceptionState& exceptionState) |
1468 { | 1468 { |
1469 FloatSize sourceRectSize = imageSource->sourceSize(); | 1469 FloatSize sourceRectSize = imageSource->sourceSize(); |
1470 drawImage(imageSource, 0, 0, sourceRectSize.width(), sourceRectSize.height()
, x, y, width, height, exceptionState); | 1470 drawImageInternal(imageSource, 0, 0, sourceRectSize.width(), sourceRectSize.
height(), x, y, width, height, exceptionState); |
1471 } | 1471 } |
1472 | 1472 |
1473 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, | 1473 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, |
1474 float sx, float sy, float sw, float sh, | 1474 float sx, float sy, float sw, float sh, |
1475 float dx, float dy, float dw, float dh, ExceptionState& exceptionState) | 1475 float dx, float dy, float dw, float dh, ExceptionState& exceptionState) |
1476 { | 1476 { |
1477 GraphicsContext* c = drawingContext(); // Do not exit yet if !c because we m
ay need to throw exceptions first | 1477 drawImageInternal(imageSource, sx, sy, sw, sh, dx, dy, dw, dh, exceptionStat
e); |
1478 CompositeOperator op = c ? c->compositeOperation() : CompositeSourceOver; | |
1479 blink::WebBlendMode blendMode = c ? c->blendModeOperation() : blink::WebBlen
dModeNormal; | |
1480 drawImageInternal(imageSource, sx, sy, sw, sh, dx, dy, dw, dh, exceptionStat
e, op, blendMode, c); | |
1481 } | 1478 } |
1482 | 1479 |
1483 void CanvasRenderingContext2D::drawImageInternal(CanvasImageSource* imageSource, | 1480 void CanvasRenderingContext2D::drawImageInternal(CanvasImageSource* imageSource, |
1484 float sx, float sy, float sw, float sh, | 1481 float sx, float sy, float sw, float sh, |
1485 float dx, float dy, float dw, float dh, ExceptionState& exceptionState, | 1482 float dx, float dy, float dw, float dh, ExceptionState& exceptionState) |
1486 CompositeOperator op, blink::WebBlendMode blendMode, GraphicsContext* c) | |
1487 { | 1483 { |
1488 RefPtr<Image> image; | 1484 RefPtr<Image> image; |
1489 SourceImageStatus sourceImageStatus = InvalidSourceImageStatus; | 1485 SourceImageStatus sourceImageStatus = InvalidSourceImageStatus; |
1490 if (!imageSource->isVideoElement()) { | 1486 if (!imageSource->isVideoElement()) { |
1491 SourceImageMode mode = canvas() == imageSource ? CopySourceImageIfVolati
le : DontCopySourceImage; // Thunking for == | 1487 SourceImageMode mode = canvas() == imageSource ? CopySourceImageIfVolati
le : DontCopySourceImage; // Thunking for == |
1492 image = imageSource->getSourceImageForCanvas(mode, &sourceImageStatus); | 1488 image = imageSource->getSourceImageForCanvas(mode, &sourceImageStatus); |
1493 if (sourceImageStatus == UndecodableSourceImageStatus) | 1489 if (sourceImageStatus == UndecodableSourceImageStatus) |
1494 exceptionState.throwDOMException(InvalidStateError, "The HTMLImageEl
ement provided is in the 'broken' state."); | 1490 exceptionState.throwDOMException(InvalidStateError, "The HTMLImageEl
ement provided is in the 'broken' state."); |
1495 if (!image || !image->width() || !image->height()) | 1491 if (!image || !image->width() || !image->height()) |
1496 return; | 1492 return; |
1497 } | 1493 } |
1498 | 1494 |
1499 if (!c) | 1495 GraphicsContext* c = drawingContext(); |
1500 c = drawingContext(); | |
1501 if (!c) | 1496 if (!c) |
1502 return; | 1497 return; |
1503 | 1498 |
1504 if (!state().m_invertibleCTM) | 1499 if (!state().m_invertibleCTM) |
1505 return; | 1500 return; |
1506 | 1501 |
1507 if (!std::isfinite(dx) || !std::isfinite(dy) || !std::isfinite(dw) || !std::
isfinite(dh) | 1502 if (!std::isfinite(dx) || !std::isfinite(dy) || !std::isfinite(dw) || !std::
isfinite(dh) |
1508 || !std::isfinite(sx) || !std::isfinite(sy) || !std::isfinite(sw) || !st
d::isfinite(sh) | 1503 || !std::isfinite(sx) || !std::isfinite(sy) || !std::isfinite(sw) || !st
d::isfinite(sh) |
1509 || !dw || !dh || !sw || !sh) | 1504 || !dw || !dh || !sw || !sh) |
1510 return; | 1505 return; |
1511 | 1506 |
1512 FloatRect clipBounds; | 1507 FloatRect clipBounds; |
1513 if (!c->getTransformedClipBounds(&clipBounds)) | 1508 if (!c->getTransformedClipBounds(&clipBounds)) |
1514 return; | 1509 return; |
1515 | 1510 |
1516 FloatRect srcRect = normalizeRect(FloatRect(sx, sy, sw, sh)); | 1511 FloatRect srcRect = normalizeRect(FloatRect(sx, sy, sw, sh)); |
1517 FloatRect dstRect = normalizeRect(FloatRect(dx, dy, dw, dh)); | 1512 FloatRect dstRect = normalizeRect(FloatRect(dx, dy, dw, dh)); |
1518 | 1513 |
1519 clipRectsToImageRect(FloatRect(FloatPoint(), imageSource->sourceSize()), &sr
cRect, &dstRect); | 1514 clipRectsToImageRect(FloatRect(FloatPoint(), imageSource->sourceSize()), &sr
cRect, &dstRect); |
1520 | 1515 |
1521 imageSource->adjustDrawRects(&srcRect, &dstRect); | 1516 imageSource->adjustDrawRects(&srcRect, &dstRect); |
1522 | 1517 |
1523 if (srcRect.isEmpty()) | 1518 if (srcRect.isEmpty()) |
1524 return; | 1519 return; |
1525 | 1520 |
| 1521 CompositeOperator op = state().m_globalComposite; |
| 1522 WebBlendMode blendMode = state().m_globalBlend; |
1526 if (rectContainsTransformedRect(dstRect, clipBounds)) { | 1523 if (rectContainsTransformedRect(dstRect, clipBounds)) { |
1527 if (!imageSource->isVideoElement()) { | 1524 if (!imageSource->isVideoElement()) { |
1528 c->drawImage(image.get(), dstRect, srcRect, op, blendMode); | 1525 c->drawImage(image.get(), dstRect, srcRect, op, blendMode); |
1529 } else { | 1526 } else { |
1530 drawVideo(static_cast<HTMLVideoElement*>(imageSource), srcRect, dstR
ect); | 1527 drawVideo(static_cast<HTMLVideoElement*>(imageSource), srcRect, dstR
ect); |
1531 } | 1528 } |
1532 didDraw(clipBounds); | 1529 didDraw(clipBounds); |
1533 } else if (isFullCanvasCompositeMode(op)) { | 1530 } else if (isFullCanvasCompositeMode(op)) { |
1534 CompositeOperator previousOperator = c->compositeOperation(); | |
1535 WebBlendMode previousBlendMode = c->blendModeOperation(); | |
1536 c->setCompositeOperation(previousOperator, blendMode); | |
1537 // TODO(dshwang): this code is unnecessarily complicated because beginLa
yer() uses current blendMode slightly. | 1531 // TODO(dshwang): this code is unnecessarily complicated because beginLa
yer() uses current blendMode slightly. |
1538 c->beginLayer(1, op); | 1532 c->beginLayer(1, op); |
1539 if (!imageSource->isVideoElement()) { | 1533 if (!imageSource->isVideoElement()) { |
1540 c->drawImage(image.get(), dstRect, srcRect, CompositeSourceOver, Web
BlendModeNormal); | 1534 c->drawImage(image.get(), dstRect, srcRect, CompositeSourceOver, Web
BlendModeNormal); |
1541 } else { | 1535 } else { |
1542 c->setCompositeOperation(CompositeSourceOver, WebBlendModeNormal); | 1536 c->setCompositeOperation(CompositeSourceOver, WebBlendModeNormal); |
1543 drawVideo(static_cast<HTMLVideoElement*>(imageSource), srcRect, dstR
ect); | 1537 drawVideo(static_cast<HTMLVideoElement*>(imageSource), srcRect, dstR
ect); |
1544 } | 1538 } |
| 1539 c->setCompositeOperation(op, blendMode); |
1545 c->endLayer(); | 1540 c->endLayer(); |
1546 c->setCompositeOperation(previousOperator, previousBlendMode); | |
1547 didDraw(clipBounds); | 1541 didDraw(clipBounds); |
1548 } else if (op == CompositeCopy) { | 1542 } else if (op == CompositeCopy) { |
1549 clearCanvas(); | 1543 clearCanvas(); |
1550 if (!imageSource->isVideoElement()) { | 1544 if (!imageSource->isVideoElement()) { |
1551 c->drawImage(image.get(), dstRect, srcRect, op, blendMode); | 1545 c->drawImage(image.get(), dstRect, srcRect, op, blendMode); |
1552 } else { | 1546 } else { |
1553 drawVideo(static_cast<HTMLVideoElement*>(imageSource), srcRect, dstR
ect); | 1547 drawVideo(static_cast<HTMLVideoElement*>(imageSource), srcRect, dstR
ect); |
1554 } | 1548 } |
1555 didDraw(clipBounds); | 1549 didDraw(clipBounds); |
1556 } else { | 1550 } else { |
(...skipping 28 matching lines...) Expand all Loading... |
1585 validateStateStack(); | 1579 validateStateStack(); |
1586 } | 1580 } |
1587 | 1581 |
1588 void CanvasRenderingContext2D::drawImageFromRect(HTMLImageElement* image, | 1582 void CanvasRenderingContext2D::drawImageFromRect(HTMLImageElement* image, |
1589 float sx, float sy, float sw, float sh, | 1583 float sx, float sy, float sw, float sh, |
1590 float dx, float dy, float dw, float dh, | 1584 float dx, float dy, float dw, float dh, |
1591 const String& compositeOperation) | 1585 const String& compositeOperation) |
1592 { | 1586 { |
1593 if (!image) | 1587 if (!image) |
1594 return; | 1588 return; |
1595 CompositeOperator op; | 1589 save(); |
1596 blink::WebBlendMode blendOp = blink::WebBlendModeNormal; | 1590 setGlobalCompositeOperation(compositeOperation); |
1597 if (!parseCompositeAndBlendOperator(compositeOperation, op, blendOp) || blen
dOp != blink::WebBlendModeNormal) | 1591 drawImageInternal(image, sx, sy, sw, sh, dx, dy, dw, dh, IGNORE_EXCEPTION); |
1598 op = CompositeSourceOver; | 1592 restore(); |
1599 | |
1600 drawImageInternal(image, sx, sy, sw, sh, dx, dy, dw, dh, IGNORE_EXCEPTION, o
p, blendOp); | |
1601 } | 1593 } |
1602 | 1594 |
1603 void CanvasRenderingContext2D::setAlpha(float alpha) | 1595 void CanvasRenderingContext2D::setAlpha(float alpha) |
1604 { | 1596 { |
1605 setGlobalAlpha(alpha); | 1597 setGlobalAlpha(alpha); |
1606 } | 1598 } |
1607 | 1599 |
1608 void CanvasRenderingContext2D::setCompositeOperation(const String& operation) | 1600 void CanvasRenderingContext2D::setCompositeOperation(const String& operation) |
1609 { | 1601 { |
1610 setGlobalCompositeOperation(operation); | 1602 setGlobalCompositeOperation(operation); |
(...skipping 22 matching lines...) Expand all Loading... |
1633 static void fillPrimitive(const FloatRect& rect, GraphicsContext* context) | 1625 static void fillPrimitive(const FloatRect& rect, GraphicsContext* context) |
1634 { | 1626 { |
1635 context->fillRect(rect); | 1627 context->fillRect(rect); |
1636 } | 1628 } |
1637 | 1629 |
1638 static void fillPrimitive(const Path& path, GraphicsContext* context) | 1630 static void fillPrimitive(const Path& path, GraphicsContext* context) |
1639 { | 1631 { |
1640 context->fillPath(path); | 1632 context->fillPath(path); |
1641 } | 1633 } |
1642 | 1634 |
1643 template<class T> void CanvasRenderingContext2D::fullCanvasCompositedFill(const
T& area) | |
1644 { | |
1645 ASSERT(isFullCanvasCompositeMode(state().m_globalComposite)); | |
1646 | |
1647 GraphicsContext* c = drawingContext(); | |
1648 ASSERT(c); | |
1649 c->beginLayer(1, state().m_globalComposite); | |
1650 CompositeOperator previousOperator = c->compositeOperation(); | |
1651 c->setCompositeOperation(CompositeSourceOver); | |
1652 fillPrimitive(area, c); | |
1653 c->setCompositeOperation(previousOperator); | |
1654 c->endLayer(); | |
1655 } | |
1656 | |
1657 static void strokePrimitive(const FloatRect& rect, GraphicsContext* context) | 1635 static void strokePrimitive(const FloatRect& rect, GraphicsContext* context) |
1658 { | 1636 { |
1659 context->strokeRect(rect); | 1637 context->strokeRect(rect); |
1660 } | 1638 } |
1661 | 1639 |
1662 static void strokePrimitive(const Path& path, GraphicsContext* context) | 1640 static void strokePrimitive(const Path& path, GraphicsContext* context) |
1663 { | 1641 { |
1664 context->strokePath(path); | 1642 context->strokePath(path); |
1665 } | 1643 } |
1666 | 1644 |
1667 template<class T> void CanvasRenderingContext2D::fullCanvasCompositedStroke(cons
t T& area) | 1645 template<CanvasRenderingContext2D::DrawingType drawingType, class T> void Canvas
RenderingContext2D::fullCanvasCompositedDraw(const T& area) |
1668 { | 1646 { |
1669 ASSERT(isFullCanvasCompositeMode(state().m_globalComposite)); | 1647 ASSERT(isFullCanvasCompositeMode(state().m_globalComposite)); |
1670 | 1648 |
1671 GraphicsContext* c = drawingContext(); | 1649 GraphicsContext* c = drawingContext(); |
1672 ASSERT(c); | 1650 ASSERT(c); |
1673 c->beginLayer(1, state().m_globalComposite); | 1651 c->beginLayer(1, state().m_globalComposite); |
1674 CompositeOperator previousOperator = c->compositeOperation(); | 1652 CompositeOperator previousOperator = c->compositeOperation(); |
1675 c->setCompositeOperation(CompositeSourceOver); | 1653 c->setCompositeOperation(CompositeSourceOver); |
1676 strokePrimitive(area, c); | 1654 if (drawingType == Fill) { |
| 1655 fillPrimitive(area, c); |
| 1656 } else { |
| 1657 strokePrimitive(area, c); |
| 1658 } |
1677 c->setCompositeOperation(previousOperator); | 1659 c->setCompositeOperation(previousOperator); |
1678 c->endLayer(); | 1660 c->endLayer(); |
1679 } | 1661 } |
1680 | 1662 |
1681 PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createLinearGra
dient(float x0, float y0, float x1, float y1) | 1663 PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createLinearGra
dient(float x0, float y0, float x1, float y1) |
1682 { | 1664 { |
1683 RefPtrWillBeRawPtr<CanvasGradient> gradient = CanvasGradient::create(FloatPo
int(x0, y0), FloatPoint(x1, y1)); | 1665 RefPtrWillBeRawPtr<CanvasGradient> gradient = CanvasGradient::create(FloatPo
int(x0, y0), FloatPoint(x1, y1)); |
1684 return gradient.release(); | 1666 return gradient.release(); |
1685 } | 1667 } |
1686 | 1668 |
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2301 return 0; | 2283 return 0; |
2302 } | 2284 } |
2303 | 2285 |
2304 void CanvasRenderingContext2D::setIsHidden(bool hidden) | 2286 void CanvasRenderingContext2D::setIsHidden(bool hidden) |
2305 { | 2287 { |
2306 ImageBuffer* buffer = canvas()->buffer(); | 2288 ImageBuffer* buffer = canvas()->buffer(); |
2307 if (buffer) | 2289 if (buffer) |
2308 buffer->setIsHidden(hidden); | 2290 buffer->setIsHidden(hidden); |
2309 } | 2291 } |
2310 | 2292 |
2311 blink::WebLayer* CanvasRenderingContext2D::platformLayer() const | 2293 WebLayer* CanvasRenderingContext2D::platformLayer() const |
2312 { | 2294 { |
2313 return canvas()->buffer() ? canvas()->buffer()->platformLayer() : 0; | 2295 return canvas()->buffer() ? canvas()->buffer()->platformLayer() : 0; |
2314 } | 2296 } |
2315 | 2297 |
2316 bool CanvasRenderingContext2D::imageSmoothingEnabled() const | 2298 bool CanvasRenderingContext2D::imageSmoothingEnabled() const |
2317 { | 2299 { |
2318 return state().m_imageSmoothingEnabled; | 2300 return state().m_imageSmoothingEnabled; |
2319 } | 2301 } |
2320 | 2302 |
2321 void CanvasRenderingContext2D::setImageSmoothingEnabled(bool enabled) | 2303 void CanvasRenderingContext2D::setImageSmoothingEnabled(bool enabled) |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2387 StrokeData strokeData; | 2369 StrokeData strokeData; |
2388 strokeData.setThickness(focusRingWidth); | 2370 strokeData.setThickness(focusRingWidth); |
2389 | 2371 |
2390 FloatRect dirtyRect; | 2372 FloatRect dirtyRect; |
2391 if (!computeDirtyRect(path.strokeBoundingRect(strokeData), &dirtyRect)) | 2373 if (!computeDirtyRect(path.strokeBoundingRect(strokeData), &dirtyRect)) |
2392 return; | 2374 return; |
2393 | 2375 |
2394 c->save(); | 2376 c->save(); |
2395 c->setAlphaAsFloat(1.0); | 2377 c->setAlphaAsFloat(1.0); |
2396 c->clearShadow(); | 2378 c->clearShadow(); |
2397 c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal); | 2379 c->setCompositeOperation(CompositeSourceOver, WebBlendModeNormal); |
2398 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); | 2380 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); |
2399 c->restore(); | 2381 c->restore(); |
2400 validateStateStack(); | 2382 validateStateStack(); |
2401 didDraw(dirtyRect); | 2383 didDraw(dirtyRect); |
2402 } | 2384 } |
2403 | 2385 |
2404 void CanvasRenderingContext2D::addHitRegion(const HitRegionOptions& options, Exc
eptionState& exceptionState) | 2386 void CanvasRenderingContext2D::addHitRegion(const HitRegionOptions& options, Exc
eptionState& exceptionState) |
2405 { | 2387 { |
2406 if (options.id().isEmpty() && !options.control()) { | 2388 if (options.id().isEmpty() && !options.control()) { |
2407 exceptionState.throwDOMException(NotSupportedError, "Both id and control
are null."); | 2389 exceptionState.throwDOMException(NotSupportedError, "Both id and control
are null."); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2463 | 2445 |
2464 unsigned CanvasRenderingContext2D::hitRegionsCount() const | 2446 unsigned CanvasRenderingContext2D::hitRegionsCount() const |
2465 { | 2447 { |
2466 if (m_hitRegionManager) | 2448 if (m_hitRegionManager) |
2467 return m_hitRegionManager->getHitRegionsCount(); | 2449 return m_hitRegionManager->getHitRegionsCount(); |
2468 | 2450 |
2469 return 0; | 2451 return 0; |
2470 } | 2452 } |
2471 | 2453 |
2472 } // namespace blink | 2454 } // namespace blink |
OLD | NEW |