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 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 } | 431 } |
432 canvasStyle = CanvasStyle::createFromRGBA(parsedColor.rgb()); | 432 canvasStyle = CanvasStyle::createFromRGBA(parsedColor.rgb()); |
433 } else if (style.isCanvasGradient()) { | 433 } else if (style.isCanvasGradient()) { |
434 canvasStyle = CanvasStyle::createFromGradient(style.getAsCanvasGradient(
)); | 434 canvasStyle = CanvasStyle::createFromGradient(style.getAsCanvasGradient(
)); |
435 } else if (style.isCanvasPattern()) { | 435 } else if (style.isCanvasPattern()) { |
436 CanvasPattern* canvasPattern = style.getAsCanvasPattern(); | 436 CanvasPattern* canvasPattern = style.getAsCanvasPattern(); |
437 | 437 |
438 if (canvas()->originClean() && !canvasPattern->originClean()) | 438 if (canvas()->originClean() && !canvasPattern->originClean()) |
439 canvas()->setOriginTainted(); | 439 canvas()->setOriginTainted(); |
440 if (canvasPattern->pattern()->isTextureBacked()) | 440 if (canvasPattern->pattern()->isTextureBacked()) |
441 canvas()->disableDeferral(); | 441 canvas()->disableDeferral(DisableDeferralReasonUsingTextureBackedPat
tern); |
442 canvasStyle = CanvasStyle::createFromPattern(canvasPattern); | 442 canvasStyle = CanvasStyle::createFromPattern(canvasPattern); |
443 } | 443 } |
444 | 444 |
445 ASSERT(canvasStyle); | 445 ASSERT(canvasStyle); |
446 modifiableState().setFillStyle(canvasStyle); | 446 modifiableState().setFillStyle(canvasStyle); |
447 modifiableState().setUnparsedFillColor(colorString); | 447 modifiableState().setUnparsedFillColor(colorString); |
448 } | 448 } |
449 | 449 |
450 double CanvasRenderingContext2D::lineWidth() const | 450 double CanvasRenderingContext2D::lineWidth() const |
451 { | 451 { |
(...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1334 c->translate(dstRect.x(), dstRect.y()); | 1334 c->translate(dstRect.x(), dstRect.y()); |
1335 c->scale(dstRect.width() / srcRect.width(), dstRect.height() / srcRect.h
eight()); | 1335 c->scale(dstRect.width() / srcRect.width(), dstRect.height() / srcRect.h
eight()); |
1336 c->translate(-srcRect.x(), -srcRect.y()); | 1336 c->translate(-srcRect.x(), -srcRect.y()); |
1337 HTMLVideoElement* video = static_cast<HTMLVideoElement*>(imageSource); | 1337 HTMLVideoElement* video = static_cast<HTMLVideoElement*>(imageSource); |
1338 video->paintCurrentFrame(c, IntRect(IntPoint(), IntSize(video->videoWidt
h(), video->videoHeight())), &imagePaint); | 1338 video->paintCurrentFrame(c, IntRect(IntPoint(), IntSize(video->videoWidt
h(), video->videoHeight())), &imagePaint); |
1339 } | 1339 } |
1340 | 1340 |
1341 c->restoreToCount(initialSaveCount); | 1341 c->restoreToCount(initialSaveCount); |
1342 } | 1342 } |
1343 | 1343 |
1344 bool shouldDisableDeferral(CanvasImageSource* imageSource) | 1344 bool shouldDisableDeferral(CanvasImageSource* imageSource, DisableDeferralReason
* reason) |
1345 { | 1345 { |
1346 if (imageSource->isVideoElement()) | 1346 ASSERT(reason); |
| 1347 ASSERT(*reason == DisableDeferralReasonUnknown); |
| 1348 |
| 1349 if (imageSource->isVideoElement()) { |
| 1350 *reason = DisableDeferralReasonDrawImageOfVideo; |
1347 return true; | 1351 return true; |
| 1352 } |
1348 if (imageSource->isCanvasElement()) { | 1353 if (imageSource->isCanvasElement()) { |
1349 HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(imageSource)
; | 1354 HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(imageSource)
; |
1350 if (canvas->isAnimated2D()) | 1355 if (canvas->isAnimated2D()) { |
| 1356 *reason = DisableDeferralReasonDrawImageOfAnimated2dCanvas; |
1351 return true; | 1357 return true; |
| 1358 } |
1352 } | 1359 } |
1353 return false; | 1360 return false; |
1354 } | 1361 } |
1355 | 1362 |
1356 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, | 1363 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, |
1357 double sx, double sy, double sw, double sh, | 1364 double sx, double sy, double sw, double sh, |
1358 double dx, double dy, double dw, double dh, ExceptionState& exceptionState) | 1365 double dx, double dy, double dw, double dh, ExceptionState& exceptionState) |
1359 { | 1366 { |
1360 if (!drawingCanvas()) | 1367 if (!drawingCanvas()) |
1361 return; | 1368 return; |
1362 | 1369 |
1363 RefPtr<Image> image; | 1370 RefPtr<Image> image; |
1364 SourceImageStatus sourceImageStatus = InvalidSourceImageStatus; | 1371 SourceImageStatus sourceImageStatus = InvalidSourceImageStatus; |
1365 if (!imageSource->isVideoElement()) { | 1372 if (!imageSource->isVideoElement()) { |
1366 AccelerationHint hint = canvas()->buffer()->isAccelerated() ? PreferAcce
leration : PreferNoAcceleration; | 1373 AccelerationHint hint = canvas()->buffer()->isAccelerated() ? PreferAcce
leration : PreferNoAcceleration; |
1367 image = imageSource->getSourceImageForCanvas(&sourceImageStatus, hint); | 1374 image = imageSource->getSourceImageForCanvas(&sourceImageStatus, hint, S
napshotReasonDrawImage); |
1368 if (sourceImageStatus == UndecodableSourceImageStatus) | 1375 if (sourceImageStatus == UndecodableSourceImageStatus) |
1369 exceptionState.throwDOMException(InvalidStateError, "The HTMLImageEl
ement provided is in the 'broken' state."); | 1376 exceptionState.throwDOMException(InvalidStateError, "The HTMLImageEl
ement provided is in the 'broken' state."); |
1370 if (!image || !image->width() || !image->height()) | 1377 if (!image || !image->width() || !image->height()) |
1371 return; | 1378 return; |
1372 } else { | 1379 } else { |
1373 if (!static_cast<HTMLVideoElement*>(imageSource)->hasAvailableVideoFrame
()) | 1380 if (!static_cast<HTMLVideoElement*>(imageSource)->hasAvailableVideoFrame
()) |
1374 return; | 1381 return; |
1375 } | 1382 } |
1376 | 1383 |
1377 if (!std::isfinite(dx) || !std::isfinite(dy) || !std::isfinite(dw) || !std::
isfinite(dh) | 1384 if (!std::isfinite(dx) || !std::isfinite(dy) || !std::isfinite(dw) || !std::
isfinite(dh) |
1378 || !std::isfinite(sx) || !std::isfinite(sy) || !std::isfinite(sw) || !st
d::isfinite(sh) | 1385 || !std::isfinite(sx) || !std::isfinite(sy) || !std::isfinite(sw) || !st
d::isfinite(sh) |
1379 || !dw || !dh || !sw || !sh) | 1386 || !dw || !dh || !sw || !sh) |
1380 return; | 1387 return; |
1381 | 1388 |
1382 FloatRect srcRect = normalizeRect(FloatRect(sx, sy, sw, sh)); | 1389 FloatRect srcRect = normalizeRect(FloatRect(sx, sy, sw, sh)); |
1383 FloatRect dstRect = normalizeRect(FloatRect(dx, dy, dw, dh)); | 1390 FloatRect dstRect = normalizeRect(FloatRect(dx, dy, dw, dh)); |
1384 | 1391 |
1385 clipRectsToImageRect(FloatRect(FloatPoint(), imageSource->elementSize()), &s
rcRect, &dstRect); | 1392 clipRectsToImageRect(FloatRect(FloatPoint(), imageSource->elementSize()), &s
rcRect, &dstRect); |
1386 | 1393 |
1387 imageSource->adjustDrawRects(&srcRect, &dstRect); | 1394 imageSource->adjustDrawRects(&srcRect, &dstRect); |
1388 | 1395 |
1389 if (srcRect.isEmpty()) | 1396 if (srcRect.isEmpty()) |
1390 return; | 1397 return; |
1391 | 1398 |
1392 if (shouldDisableDeferral(imageSource) || image->isTextureBacked()) | 1399 DisableDeferralReason reason = DisableDeferralReasonUnknown; |
1393 canvas()->disableDeferral(); | 1400 if (shouldDisableDeferral(imageSource, &reason) || image->isTextureBacked()) |
| 1401 canvas()->disableDeferral(reason); |
1394 | 1402 |
1395 validateStateStack(); | 1403 validateStateStack(); |
1396 | 1404 |
1397 draw( | 1405 draw( |
1398 [this, &imageSource, &image, &srcRect, dstRect](SkCanvas* c, const SkPai
nt* paint) // draw lambda | 1406 [this, &imageSource, &image, &srcRect, dstRect](SkCanvas* c, const SkPai
nt* paint) // draw lambda |
1399 { | 1407 { |
1400 drawImageInternal(c, imageSource, image.get(), srcRect, dstRect, pai
nt); | 1408 drawImageInternal(c, imageSource, image.get(), srcRect, dstRect, pai
nt); |
1401 }, | 1409 }, |
1402 [this, &dstRect](const SkIRect& clipBounds) // overdraw test lambda | 1410 [this, &dstRect](const SkIRect& clipBounds) // overdraw test lambda |
1403 { | 1411 { |
(...skipping 13 matching lines...) Expand all Loading... |
1417 | 1425 |
1418 if (isExpensive) { | 1426 if (isExpensive) { |
1419 ImageBuffer* buffer = canvas()->buffer(); | 1427 ImageBuffer* buffer = canvas()->buffer(); |
1420 if (buffer) | 1428 if (buffer) |
1421 buffer->setHasExpensiveOp(); | 1429 buffer->setHasExpensiveOp(); |
1422 } | 1430 } |
1423 | 1431 |
1424 if (imageSource->isCanvasElement() && static_cast<HTMLCanvasElement*>(imageS
ource)->is3D()) { | 1432 if (imageSource->isCanvasElement() && static_cast<HTMLCanvasElement*>(imageS
ource)->is3D()) { |
1425 // WebGL to 2D canvas: must flush graphics context to prevent a race | 1433 // WebGL to 2D canvas: must flush graphics context to prevent a race |
1426 // FIXME: crbug.com/516331 Fix the underlying synchronization issue so t
his flush can be eliminated. | 1434 // FIXME: crbug.com/516331 Fix the underlying synchronization issue so t
his flush can be eliminated. |
1427 canvas()->buffer()->flushGpu(); | 1435 canvas()->buffer()->flushGpu(FlushReasonDrawImageOfWebGL); |
1428 } | 1436 } |
1429 | 1437 |
1430 if (canvas()->originClean() && wouldTaintOrigin(imageSource)) | 1438 if (canvas()->originClean() && wouldTaintOrigin(imageSource)) |
1431 canvas()->setOriginTainted(); | 1439 canvas()->setOriginTainted(); |
1432 } | 1440 } |
1433 | 1441 |
1434 void CanvasRenderingContext2D::clearCanvas() | 1442 void CanvasRenderingContext2D::clearCanvas() |
1435 { | 1443 { |
1436 FloatRect canvasRect(0, 0, canvas()->width(), canvas()->height()); | 1444 FloatRect canvasRect(0, 0, canvas()->width(), canvas()->height()); |
1437 checkOverdraw(canvasRect, 0, CanvasRenderingContext2DState::NoImage, ClipFil
l); | 1445 checkOverdraw(canvasRect, 0, CanvasRenderingContext2DState::NoImage, ClipFil
l); |
(...skipping 27 matching lines...) Expand all Loading... |
1465 } | 1473 } |
1466 | 1474 |
1467 CanvasPattern* CanvasRenderingContext2D::createPattern(const CanvasImageSourceUn
ion& imageSource, const String& repetitionType, ExceptionState& exceptionState) | 1475 CanvasPattern* CanvasRenderingContext2D::createPattern(const CanvasImageSourceUn
ion& imageSource, const String& repetitionType, ExceptionState& exceptionState) |
1468 { | 1476 { |
1469 Pattern::RepeatMode repeatMode = CanvasPattern::parseRepetitionType(repetiti
onType, exceptionState); | 1477 Pattern::RepeatMode repeatMode = CanvasPattern::parseRepetitionType(repetiti
onType, exceptionState); |
1470 if (exceptionState.hadException()) | 1478 if (exceptionState.hadException()) |
1471 return nullptr; | 1479 return nullptr; |
1472 | 1480 |
1473 SourceImageStatus status; | 1481 SourceImageStatus status; |
1474 CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); | 1482 CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); |
1475 RefPtr<Image> imageForRendering = imageSourceInternal->getSourceImageForCanv
as(&status, PreferNoAcceleration); | 1483 RefPtr<Image> imageForRendering = imageSourceInternal->getSourceImageForCanv
as(&status, PreferNoAcceleration, SnapshotReasonCreatePattern); |
1476 | 1484 |
1477 switch (status) { | 1485 switch (status) { |
1478 case NormalSourceImageStatus: | 1486 case NormalSourceImageStatus: |
1479 break; | 1487 break; |
1480 case ZeroSizeCanvasSourceImageStatus: | 1488 case ZeroSizeCanvasSourceImageStatus: |
1481 exceptionState.throwDOMException(InvalidStateError, String::format("The
canvas %s is 0.", imageSourceInternal->elementSize().width() ? "height" : "width
")); | 1489 exceptionState.throwDOMException(InvalidStateError, String::format("The
canvas %s is 0.", imageSourceInternal->elementSize().width() ? "height" : "width
")); |
1482 return nullptr; | 1490 return nullptr; |
1483 case UndecodableSourceImageStatus: | 1491 case UndecodableSourceImageStatus: |
1484 exceptionState.throwDOMException(InvalidStateError, "Source image is in
the 'broken' state."); | 1492 exceptionState.throwDOMException(InvalidStateError, "Source image is in
the 'broken' state."); |
1485 return nullptr; | 1493 return nullptr; |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1953 if (!std::isfinite(x) || !std::isfinite(y)) | 1961 if (!std::isfinite(x) || !std::isfinite(y)) |
1954 return; | 1962 return; |
1955 if (maxWidth && (!std::isfinite(*maxWidth) || *maxWidth <= 0)) | 1963 if (maxWidth && (!std::isfinite(*maxWidth) || *maxWidth <= 0)) |
1956 return; | 1964 return; |
1957 | 1965 |
1958 // Currently, SkPictureImageFilter does not support subpixel text anti-alias
ing, which | 1966 // Currently, SkPictureImageFilter does not support subpixel text anti-alias
ing, which |
1959 // is expected when !m_hasAlpha, so we need to fall out of display list mode
when | 1967 // is expected when !m_hasAlpha, so we need to fall out of display list mode
when |
1960 // drawing text to an opaque canvas | 1968 // drawing text to an opaque canvas |
1961 // crbug.com/583809 | 1969 // crbug.com/583809 |
1962 if (!m_hasAlpha && !isAccelerated()) | 1970 if (!m_hasAlpha && !isAccelerated()) |
1963 canvas()->disableDeferral(); | 1971 canvas()->disableDeferral(DisableDeferralReasonSubPixelTextAntiAliasingS
upport); |
1964 | 1972 |
1965 const Font& font = accessFont(); | 1973 const Font& font = accessFont(); |
1966 const FontMetrics& fontMetrics = font.fontMetrics(); | 1974 const FontMetrics& fontMetrics = font.fontMetrics(); |
1967 | 1975 |
1968 // FIXME: Need to turn off font smoothing. | 1976 // FIXME: Need to turn off font smoothing. |
1969 | 1977 |
1970 const ComputedStyle* computedStyle = 0; | 1978 const ComputedStyle* computedStyle = 0; |
1971 TextDirection direction = toTextDirection(state().direction(), canvas(), &co
mputedStyle); | 1979 TextDirection direction = toTextDirection(state().direction(), canvas(), &co
mputedStyle); |
1972 bool isRTL = direction == RTL; | 1980 bool isRTL = direction == RTL; |
1973 bool override = computedStyle ? isOverride(computedStyle->unicodeBidi()) : f
alse; | 1981 bool override = computedStyle ? isOverride(computedStyle->unicodeBidi()) : f
alse; |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2333 if (imageType == CanvasRenderingContext2DState::NonOpaqueImage) | 2341 if (imageType == CanvasRenderingContext2DState::NonOpaqueImage) |
2334 return; | 2342 return; |
2335 if (alpha < 0xFF) | 2343 if (alpha < 0xFF) |
2336 return; | 2344 return; |
2337 } | 2345 } |
2338 | 2346 |
2339 canvas()->buffer()->willOverwriteCanvas(); | 2347 canvas()->buffer()->willOverwriteCanvas(); |
2340 } | 2348 } |
2341 | 2349 |
2342 } // namespace blink | 2350 } // namespace blink |
OLD | NEW |