| Index: Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| diff --git a/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| index fe0cdba7cea9198e06615357f1ed1a0d008bbeba..ff631c0a2ff171559eecd23d4da6441cb2781650 100644
|
| --- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| +++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| @@ -1483,25 +1483,42 @@ static inline void clipRectsToImageRect(const FloatRect& imageRect, FloatRect* s
|
| dstRect->move(offset);
|
| }
|
|
|
| -void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, float x, float y, ExceptionState& exceptionState)
|
| +static inline CanvasImageSource* toImageSourceInternal(const CanvasImageSourceUnion& value)
|
| +{
|
| + if (value.isHTMLImageElement())
|
| + return value.getAsHTMLImageElement().get();
|
| + if (value.isHTMLVideoElement())
|
| + return value.getAsHTMLVideoElement().get();
|
| + if (value.isHTMLCanvasElement())
|
| + return value.getAsHTMLCanvasElement().get();
|
| + if (value.isImageBitmap())
|
| + return value.getAsImageBitmap().get();
|
| + ASSERT_NOT_REACHED();
|
| + return nullptr;
|
| +}
|
| +
|
| +void CanvasRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource, float x, float y, ExceptionState& exceptionState)
|
| {
|
| - FloatSize sourceRectSize = imageSource->sourceSize();
|
| - FloatSize destRectSize = imageSource->defaultDestinationSize();
|
| - drawImageInternal(imageSource, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, destRectSize.width(), destRectSize.height(), exceptionState);
|
| + CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource);
|
| + FloatSize sourceRectSize = imageSourceInternal->sourceSize();
|
| + FloatSize destRectSize = imageSourceInternal->defaultDestinationSize();
|
| + drawImageInternal(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, destRectSize.width(), destRectSize.height(), exceptionState);
|
| }
|
|
|
| -void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource,
|
| +void CanvasRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource,
|
| float x, float y, float width, float height, ExceptionState& exceptionState)
|
| {
|
| - FloatSize sourceRectSize = imageSource->sourceSize();
|
| - drawImageInternal(imageSource, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, width, height, exceptionState);
|
| + CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource);
|
| + FloatSize sourceRectSize = imageSourceInternal->sourceSize();
|
| + drawImageInternal(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, width, height, exceptionState);
|
| }
|
|
|
| -void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource,
|
| +void CanvasRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource,
|
| float sx, float sy, float sw, float sh,
|
| float dx, float dy, float dw, float dh, ExceptionState& exceptionState)
|
| {
|
| - drawImageInternal(imageSource, sx, sy, sw, sh, dx, dy, dw, dh, exceptionState);
|
| + CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource);
|
| + drawImageInternal(imageSourceInternal, sx, sy, sw, sh, dx, dy, dw, dh, exceptionState);
|
| }
|
|
|
| static void drawVideo(GraphicsContext* c, CanvasImageSource* imageSource, FloatRect srcRect, FloatRect dstRect)
|
| @@ -1683,7 +1700,7 @@ PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createRadialGra
|
| return gradient.release();
|
| }
|
|
|
| -PassRefPtrWillBeRawPtr<CanvasPattern> CanvasRenderingContext2D::createPattern(CanvasImageSource* imageSource,
|
| +PassRefPtrWillBeRawPtr<CanvasPattern> CanvasRenderingContext2D::createPattern(const CanvasImageSourceUnion& imageSource,
|
| const String& repetitionType, ExceptionState& exceptionState)
|
| {
|
| Pattern::RepeatMode repeatMode = CanvasPattern::parseRepetitionType(repetitionType, exceptionState);
|
| @@ -1691,13 +1708,14 @@ PassRefPtrWillBeRawPtr<CanvasPattern> CanvasRenderingContext2D::createPattern(Ca
|
| return nullptr;
|
|
|
| SourceImageStatus status;
|
| - RefPtr<Image> imageForRendering = imageSource->getSourceImageForCanvas(CopySourceImageIfVolatile, &status);
|
| + CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource);
|
| + RefPtr<Image> imageForRendering = imageSourceInternal->getSourceImageForCanvas(CopySourceImageIfVolatile, &status);
|
|
|
| switch (status) {
|
| case NormalSourceImageStatus:
|
| break;
|
| case ZeroSizeCanvasSourceImageStatus:
|
| - exceptionState.throwDOMException(InvalidStateError, String::format("The canvas %s is 0.", imageSource->sourceSize().width() ? "height" : "width"));
|
| + exceptionState.throwDOMException(InvalidStateError, String::format("The canvas %s is 0.", imageSourceInternal->sourceSize().width() ? "height" : "width"));
|
| return nullptr;
|
| case UndecodableSourceImageStatus:
|
| exceptionState.throwDOMException(InvalidStateError, "Source image is in the 'broken' state.");
|
| @@ -1714,7 +1732,7 @@ PassRefPtrWillBeRawPtr<CanvasPattern> CanvasRenderingContext2D::createPattern(Ca
|
| }
|
| ASSERT(imageForRendering);
|
|
|
| - bool originClean = !wouldTaintOrigin(imageSource);
|
| + bool originClean = !wouldTaintOrigin(imageSourceInternal);
|
|
|
| return CanvasPattern::create(imageForRendering.release(), repeatMode, originClean);
|
| }
|
|
|