| 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 |