Chromium Code Reviews| 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(); |
|
Justin Novosad
2014/11/05 20:40:52
Just to be sure, this is not reached even if the a
Jens Widell
2014/11/06 11:44:39
Yes, the generated code for converting a V8 value
|
| + 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); |
| } |