| Index: Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| diff --git a/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| index a1911e5990147f992e81a3511e0192d35fa2bb4a..98b4897eeb82c05a94b3f35f635d057e2afea26b 100644
|
| --- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| +++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| @@ -254,7 +254,7 @@ CanvasRenderingContext2D::State::State()
|
| , m_shadowColor(Color::transparent)
|
| , m_globalAlpha(1)
|
| , m_globalComposite(CompositeSourceOver)
|
| - , m_globalBlend(blink::WebBlendModeNormal)
|
| + , m_globalBlend(WebBlendModeNormal)
|
| , m_invertibleCTM(true)
|
| , m_lineDashOffset(0)
|
| , m_imageSmoothingEnabled(true)
|
| @@ -698,7 +698,7 @@ String CanvasRenderingContext2D::globalCompositeOperation() const
|
| void CanvasRenderingContext2D::setGlobalCompositeOperation(const String& operation)
|
| {
|
| CompositeOperator op = CompositeSourceOver;
|
| - blink::WebBlendMode blendMode = blink::WebBlendModeNormal;
|
| + WebBlendMode blendMode = WebBlendModeNormal;
|
| if (!parseCompositeAndBlendOperator(operation, op, blendMode))
|
| return;
|
| if ((state().m_globalComposite == op) && (state().m_globalBlend == blendMode))
|
| @@ -1025,7 +1025,7 @@ void CanvasRenderingContext2D::fillInternal(const Path& path, const String& wind
|
| c->setFillRule(parseWinding(windingRuleString));
|
|
|
| if (isFullCanvasCompositeMode(state().m_globalComposite)) {
|
| - fullCanvasCompositedFill(path);
|
| + fullCanvasCompositedDraw<Fill>(path);
|
| didDraw(clipBounds);
|
| } else if (state().m_globalComposite == CompositeCopy) {
|
| clearCanvas();
|
| @@ -1075,7 +1075,7 @@ void CanvasRenderingContext2D::strokeInternal(const Path& path)
|
| }
|
|
|
| if (isFullCanvasCompositeMode(state().m_globalComposite)) {
|
| - fullCanvasCompositedStroke(path);
|
| + fullCanvasCompositedDraw<Stroke>(path);
|
| didDraw(clipBounds);
|
| } else if (state().m_globalComposite == CompositeCopy) {
|
| clearCanvas();
|
| @@ -1294,7 +1294,7 @@ void CanvasRenderingContext2D::fillRect(float x, float y, float width, float hei
|
| c->fillRect(rect);
|
| didDraw(clipBounds);
|
| } else if (isFullCanvasCompositeMode(state().m_globalComposite)) {
|
| - fullCanvasCompositedFill(rect);
|
| + fullCanvasCompositedDraw<Fill>(rect);
|
| didDraw(clipBounds);
|
| } else if (state().m_globalComposite == CompositeCopy) {
|
| clearCanvas();
|
| @@ -1332,9 +1332,8 @@ void CanvasRenderingContext2D::strokeRect(float x, float y, float width, float h
|
| return;
|
|
|
| FloatRect rect(x, y, width, height);
|
| -
|
| if (isFullCanvasCompositeMode(state().m_globalComposite)) {
|
| - fullCanvasCompositedStroke(rect);
|
| + fullCanvasCompositedDraw<Stroke>(rect);
|
| didDraw(clipBounds);
|
| } else if (state().m_globalComposite == CompositeCopy) {
|
| clearCanvas();
|
| @@ -1459,31 +1458,28 @@ static inline void clipRectsToImageRect(const FloatRect& imageRect, FloatRect* s
|
|
|
| void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, float x, float y, ExceptionState& exceptionState)
|
| {
|
| + FloatSize sourceRectSize = imageSource->sourceSize();
|
| FloatSize destRectSize = imageSource->defaultDestinationSize();
|
| - drawImage(imageSource, x, y, destRectSize.width(), destRectSize.height(), exceptionState);
|
| + drawImageInternal(imageSource, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, destRectSize.width(), destRectSize.height(), exceptionState);
|
| }
|
|
|
| void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource,
|
| float x, float y, float width, float height, ExceptionState& exceptionState)
|
| {
|
| FloatSize sourceRectSize = imageSource->sourceSize();
|
| - drawImage(imageSource, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, width, height, exceptionState);
|
| + drawImageInternal(imageSource, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, width, height, exceptionState);
|
| }
|
|
|
| void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource,
|
| float sx, float sy, float sw, float sh,
|
| float dx, float dy, float dw, float dh, ExceptionState& exceptionState)
|
| {
|
| - GraphicsContext* c = drawingContext(); // Do not exit yet if !c because we may need to throw exceptions first
|
| - CompositeOperator op = c ? c->compositeOperation() : CompositeSourceOver;
|
| - blink::WebBlendMode blendMode = c ? c->blendModeOperation() : blink::WebBlendModeNormal;
|
| - drawImageInternal(imageSource, sx, sy, sw, sh, dx, dy, dw, dh, exceptionState, op, blendMode, c);
|
| + drawImageInternal(imageSource, sx, sy, sw, sh, dx, dy, dw, dh, exceptionState);
|
| }
|
|
|
| void CanvasRenderingContext2D::drawImageInternal(CanvasImageSource* imageSource,
|
| float sx, float sy, float sw, float sh,
|
| - float dx, float dy, float dw, float dh, ExceptionState& exceptionState,
|
| - CompositeOperator op, blink::WebBlendMode blendMode, GraphicsContext* c)
|
| + float dx, float dy, float dw, float dh, ExceptionState& exceptionState)
|
| {
|
| RefPtr<Image> image;
|
| SourceImageStatus sourceImageStatus = InvalidSourceImageStatus;
|
| @@ -1496,8 +1492,7 @@ void CanvasRenderingContext2D::drawImageInternal(CanvasImageSource* imageSource,
|
| return;
|
| }
|
|
|
| - if (!c)
|
| - c = drawingContext();
|
| + GraphicsContext* c = drawingContext();
|
| if (!c)
|
| return;
|
|
|
| @@ -1523,6 +1518,8 @@ void CanvasRenderingContext2D::drawImageInternal(CanvasImageSource* imageSource,
|
| if (srcRect.isEmpty())
|
| return;
|
|
|
| + CompositeOperator op = state().m_globalComposite;
|
| + WebBlendMode blendMode = state().m_globalBlend;
|
| if (rectContainsTransformedRect(dstRect, clipBounds)) {
|
| if (!imageSource->isVideoElement()) {
|
| c->drawImage(image.get(), dstRect, srcRect, op, blendMode);
|
| @@ -1531,9 +1528,6 @@ void CanvasRenderingContext2D::drawImageInternal(CanvasImageSource* imageSource,
|
| }
|
| didDraw(clipBounds);
|
| } else if (isFullCanvasCompositeMode(op)) {
|
| - CompositeOperator previousOperator = c->compositeOperation();
|
| - WebBlendMode previousBlendMode = c->blendModeOperation();
|
| - c->setCompositeOperation(previousOperator, blendMode);
|
| // TODO(dshwang): this code is unnecessarily complicated because beginLayer() uses current blendMode slightly.
|
| c->beginLayer(1, op);
|
| if (!imageSource->isVideoElement()) {
|
| @@ -1542,8 +1536,8 @@ void CanvasRenderingContext2D::drawImageInternal(CanvasImageSource* imageSource,
|
| c->setCompositeOperation(CompositeSourceOver, WebBlendModeNormal);
|
| drawVideo(static_cast<HTMLVideoElement*>(imageSource), srcRect, dstRect);
|
| }
|
| + c->setCompositeOperation(op, blendMode);
|
| c->endLayer();
|
| - c->setCompositeOperation(previousOperator, previousBlendMode);
|
| didDraw(clipBounds);
|
| } else if (op == CompositeCopy) {
|
| clearCanvas();
|
| @@ -1592,12 +1586,10 @@ void CanvasRenderingContext2D::drawImageFromRect(HTMLImageElement* image,
|
| {
|
| if (!image)
|
| return;
|
| - CompositeOperator op;
|
| - blink::WebBlendMode blendOp = blink::WebBlendModeNormal;
|
| - if (!parseCompositeAndBlendOperator(compositeOperation, op, blendOp) || blendOp != blink::WebBlendModeNormal)
|
| - op = CompositeSourceOver;
|
| -
|
| - drawImageInternal(image, sx, sy, sw, sh, dx, dy, dw, dh, IGNORE_EXCEPTION, op, blendOp);
|
| + save();
|
| + setGlobalCompositeOperation(compositeOperation);
|
| + drawImageInternal(image, sx, sy, sw, sh, dx, dy, dw, dh, IGNORE_EXCEPTION);
|
| + restore();
|
| }
|
|
|
| void CanvasRenderingContext2D::setAlpha(float alpha)
|
| @@ -1640,20 +1632,6 @@ static void fillPrimitive(const Path& path, GraphicsContext* context)
|
| context->fillPath(path);
|
| }
|
|
|
| -template<class T> void CanvasRenderingContext2D::fullCanvasCompositedFill(const T& area)
|
| -{
|
| - ASSERT(isFullCanvasCompositeMode(state().m_globalComposite));
|
| -
|
| - GraphicsContext* c = drawingContext();
|
| - ASSERT(c);
|
| - c->beginLayer(1, state().m_globalComposite);
|
| - CompositeOperator previousOperator = c->compositeOperation();
|
| - c->setCompositeOperation(CompositeSourceOver);
|
| - fillPrimitive(area, c);
|
| - c->setCompositeOperation(previousOperator);
|
| - c->endLayer();
|
| -}
|
| -
|
| static void strokePrimitive(const FloatRect& rect, GraphicsContext* context)
|
| {
|
| context->strokeRect(rect);
|
| @@ -1664,7 +1642,7 @@ static void strokePrimitive(const Path& path, GraphicsContext* context)
|
| context->strokePath(path);
|
| }
|
|
|
| -template<class T> void CanvasRenderingContext2D::fullCanvasCompositedStroke(const T& area)
|
| +template<CanvasRenderingContext2D::DrawingType drawingType, class T> void CanvasRenderingContext2D::fullCanvasCompositedDraw(const T& area)
|
| {
|
| ASSERT(isFullCanvasCompositeMode(state().m_globalComposite));
|
|
|
| @@ -1673,7 +1651,11 @@ template<class T> void CanvasRenderingContext2D::fullCanvasCompositedStroke(cons
|
| c->beginLayer(1, state().m_globalComposite);
|
| CompositeOperator previousOperator = c->compositeOperation();
|
| c->setCompositeOperation(CompositeSourceOver);
|
| - strokePrimitive(area, c);
|
| + if (drawingType == Fill) {
|
| + fillPrimitive(area, c);
|
| + } else {
|
| + strokePrimitive(area, c);
|
| + }
|
| c->setCompositeOperation(previousOperator);
|
| c->endLayer();
|
| }
|
| @@ -2308,7 +2290,7 @@ void CanvasRenderingContext2D::setIsHidden(bool hidden)
|
| buffer->setIsHidden(hidden);
|
| }
|
|
|
| -blink::WebLayer* CanvasRenderingContext2D::platformLayer() const
|
| +WebLayer* CanvasRenderingContext2D::platformLayer() const
|
| {
|
| return canvas()->buffer() ? canvas()->buffer()->platformLayer() : 0;
|
| }
|
| @@ -2394,7 +2376,7 @@ void CanvasRenderingContext2D::drawFocusRing(const Path& path)
|
| c->save();
|
| c->setAlphaAsFloat(1.0);
|
| c->clearShadow();
|
| - c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal);
|
| + c->setCompositeOperation(CompositeSourceOver, WebBlendModeNormal);
|
| c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor);
|
| c->restore();
|
| validateStateStack();
|
|
|