| Index: Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| diff --git a/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| index a4454e0442e9e037c9a5eb3da89fb7194ceba4d4..0a9c32aeff5b770a8a8b2401bbd78cca464e3e3f 100644
|
| --- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| +++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| @@ -275,8 +275,7 @@ CanvasRenderingContext2D::State::State()
|
| , m_shadowBlur(0)
|
| , m_shadowColor(Color::transparent)
|
| , m_globalAlpha(1)
|
| - , m_globalComposite(CompositeSourceOver)
|
| - , m_globalBlend(WebBlendModeNormal)
|
| + , m_globalComposite(SkXfermode::kSrcOver_Mode)
|
| , m_invertibleCTM(true)
|
| , m_lineDashOffset(0)
|
| , m_imageSmoothingEnabled(true)
|
| @@ -305,7 +304,6 @@ CanvasRenderingContext2D::State::State(const State& other, ClipListCopyMode mode
|
| , m_shadowColor(other.m_shadowColor)
|
| , m_globalAlpha(other.m_globalAlpha)
|
| , m_globalComposite(other.m_globalComposite)
|
| - , m_globalBlend(other.m_globalBlend)
|
| , m_transform(other.m_transform)
|
| , m_invertibleCTM(other.m_invertibleCTM)
|
| , m_lineDashOffset(other.m_lineDashOffset)
|
| @@ -349,7 +347,6 @@ CanvasRenderingContext2D::State& CanvasRenderingContext2D::State::operator=(cons
|
| m_shadowColor = other.m_shadowColor;
|
| m_globalAlpha = other.m_globalAlpha;
|
| m_globalComposite = other.m_globalComposite;
|
| - m_globalBlend = other.m_globalBlend;
|
| m_transform = other.m_transform;
|
| m_invertibleCTM = other.m_invertibleCTM;
|
| m_imageSmoothingEnabled = other.m_imageSmoothingEnabled;
|
| @@ -757,7 +754,7 @@ void CanvasRenderingContext2D::setGlobalAlpha(float alpha)
|
|
|
| String CanvasRenderingContext2D::globalCompositeOperation() const
|
| {
|
| - return compositeOperatorName(state().m_globalComposite, state().m_globalBlend);
|
| + return compositeOperatorName(compositeOperatorFromSkia(state().m_globalComposite), blendModeFromSkia(state().m_globalComposite));
|
| }
|
|
|
| void CanvasRenderingContext2D::setGlobalCompositeOperation(const String& operation)
|
| @@ -766,15 +763,15 @@ void CanvasRenderingContext2D::setGlobalCompositeOperation(const String& operati
|
| WebBlendMode blendMode = WebBlendModeNormal;
|
| if (!parseCompositeAndBlendOperator(operation, op, blendMode))
|
| return;
|
| - if ((state().m_globalComposite == op) && (state().m_globalBlend == blendMode))
|
| + SkXfermode::Mode xfermode = WebCoreCompositeToSkiaComposite(op, blendMode);
|
| + if (state().m_globalComposite == xfermode)
|
| return;
|
| GraphicsContext* c = drawingContext();
|
| realizeSaves(c);
|
| - modifiableState().m_globalComposite = op;
|
| - modifiableState().m_globalBlend = blendMode;
|
| + modifiableState().m_globalComposite = xfermode;
|
| if (!c)
|
| return;
|
| - c->setCompositeOperation(op, blendMode);
|
| + c->setCompositeOperation(xfermode);
|
| }
|
|
|
| void CanvasRenderingContext2D::setCurrentTransform(PassRefPtrWillBeRawPtr<SVGMatrixTearOff> passMatrixTearOff)
|
| @@ -960,12 +957,12 @@ static bool validateRectForCanvas(float& x, float& y, float& width, float& heigh
|
| return true;
|
| }
|
|
|
| -static bool isFullCanvasCompositeMode(CompositeOperator op)
|
| +static bool isFullCanvasCompositeMode(SkXfermode::Mode op)
|
| {
|
| // See 4.8.11.1.3 Compositing
|
| // CompositeSourceAtop and CompositeDestinationOut are not listed here as the platforms already
|
| // implement the specification's behavior.
|
| - return op == CompositeSourceIn || op == CompositeSourceOut || op == CompositeDestinationIn || op == CompositeDestinationAtop;
|
| + return op == SkXfermode::kSrcIn_Mode || op == SkXfermode::kSrcOut_Mode || op == SkXfermode::kDstIn_Mode || op == SkXfermode::kDstATop_Mode;
|
| }
|
|
|
| static WindRule parseWinding(const String& windingRuleString)
|
| @@ -1008,7 +1005,7 @@ void CanvasRenderingContext2D::fillInternal(const Path& path, const String& wind
|
| if (isFullCanvasCompositeMode(state().m_globalComposite)) {
|
| fullCanvasCompositedDraw(bind(&GraphicsContext::fillPath, c, path));
|
| didDraw(clipBounds);
|
| - } else if (state().m_globalComposite == CompositeCopy) {
|
| + } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) {
|
| clearCanvas();
|
| c->clearShadow();
|
| c->fillPath(path);
|
| @@ -1060,7 +1057,7 @@ void CanvasRenderingContext2D::strokeInternal(const Path& path)
|
| if (isFullCanvasCompositeMode(state().m_globalComposite)) {
|
| fullCanvasCompositedDraw(bind(&GraphicsContext::strokePath, c, path));
|
| didDraw(clipBounds);
|
| - } else if (state().m_globalComposite == CompositeCopy) {
|
| + } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) {
|
| clearCanvas();
|
| c->clearShadow();
|
| c->strokePath(path);
|
| @@ -1242,12 +1239,12 @@ void CanvasRenderingContext2D::clearRect(float x, float y, float width, float he
|
| }
|
| context->setAlphaAsFloat(1);
|
| }
|
| - if (state().m_globalComposite != CompositeSourceOver) {
|
| + if (state().m_globalComposite != SkXfermode::kSrcOver_Mode) {
|
| if (!saved) {
|
| context->save();
|
| saved = true;
|
| }
|
| - context->setCompositeOperation(CompositeSourceOver);
|
| + context->setCompositeOperation(SkXfermode::kSrcOver_Mode);
|
| }
|
| context->clearRect(rect);
|
| if (m_hitRegionManager)
|
| @@ -1298,7 +1295,7 @@ void CanvasRenderingContext2D::fillRect(float x, float y, float width, float hei
|
| } else if (isFullCanvasCompositeMode(state().m_globalComposite)) {
|
| fullCanvasCompositedDraw(bind(&fillRectOnContext, c, rect));
|
| didDraw(clipBounds);
|
| - } else if (state().m_globalComposite == CompositeCopy) {
|
| + } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) {
|
| clearCanvas();
|
| c->clearShadow();
|
| c->fillRect(rect);
|
| @@ -1339,7 +1336,7 @@ void CanvasRenderingContext2D::strokeRect(float x, float y, float width, float h
|
| if (isFullCanvasCompositeMode(state().m_globalComposite)) {
|
| fullCanvasCompositedDraw(bind(&strokeRectOnContext, c, rect));
|
| didDraw(clipBounds);
|
| - } else if (state().m_globalComposite == CompositeCopy) {
|
| + } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) {
|
| clearCanvas();
|
| c->clearShadow();
|
| c->strokeRect(rect);
|
| @@ -1513,14 +1510,13 @@ void CanvasRenderingContext2D::drawImageInternal(CanvasImageSource* imageSource,
|
| if (imageSource->isCanvasElement())
|
| canvas()->buffer()->willAccessPixels();
|
|
|
| - CompositeOperator op = state().m_globalComposite;
|
| if (rectContainsTransformedRect(dstRect, clipBounds)) {
|
| drawImageOnContext(c, imageSource, image.get(), srcRect, dstRect);
|
| didDraw(clipBounds);
|
| - } else if (isFullCanvasCompositeMode(op)) {
|
| + } else if (isFullCanvasCompositeMode(state().m_globalComposite)) {
|
| fullCanvasCompositedDraw(bind(&drawImageOnContext, c, imageSource, image.get(), srcRect, dstRect));
|
| didDraw(clipBounds);
|
| - } else if (op == CompositeCopy) {
|
| + } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) {
|
| clearCanvas();
|
| drawImageOnContext(c, imageSource, image.get(), srcRect, dstRect);
|
| didDraw(clipBounds);
|
| @@ -1567,22 +1563,21 @@ void CanvasRenderingContext2D::fullCanvasCompositedDraw(PassOwnPtr<Closure> draw
|
| GraphicsContext* c = drawingContext();
|
| ASSERT(c);
|
|
|
| - CompositeOperator previousOperator = c->compositeOperation();
|
| if (shouldDrawShadows()) {
|
| // unroll into two independently composited passes if drawing shadows
|
| c->beginLayer(1, state().m_globalComposite);
|
| - c->setCompositeOperation(CompositeSourceOver);
|
| + c->setCompositeOperation(SkXfermode::kSrcOver_Mode);
|
| applyShadow(DrawShadowOnly);
|
| (*draw)();
|
| - c->setCompositeOperation(previousOperator);
|
| + c->setCompositeOperation(state().m_globalComposite);
|
| c->endLayer();
|
| }
|
|
|
| c->beginLayer(1, state().m_globalComposite);
|
| c->clearShadow();
|
| - c->setCompositeOperation(CompositeSourceOver);
|
| + c->setCompositeOperation(SkXfermode::kSrcOver_Mode);
|
| (*draw)();
|
| - c->setCompositeOperation(previousOperator);
|
| + c->setCompositeOperation(state().m_globalComposite);
|
| c->endLayer();
|
| applyShadow(DrawShadowAndForeground); // go back to normal shadows mode
|
| }
|
| @@ -2146,7 +2141,7 @@ void CanvasRenderingContext2D::drawTextInternal(const String& text, float x, flo
|
| if (isFullCanvasCompositeMode(state().m_globalComposite)) {
|
| fullCanvasCompositedDraw(bind(&GraphicsContext::drawBidiText, c, font, textRunPaintInfo, location, Font::UseFallbackIfFontNotReady));
|
| didDraw(clipBounds);
|
| - } else if (state().m_globalComposite == CompositeCopy) {
|
| + } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) {
|
| clearCanvas();
|
| c->clearShadow();
|
| c->drawBidiText(font, textRunPaintInfo, location, Font::UseFallbackIfFontNotReady);
|
| @@ -2298,7 +2293,7 @@ void CanvasRenderingContext2D::drawFocusRing(const Path& path)
|
| c->save();
|
| c->setAlphaAsFloat(1.0);
|
| c->clearShadow();
|
| - c->setCompositeOperation(CompositeSourceOver, WebBlendModeNormal);
|
| + c->setCompositeOperation(SkXfermode::kSrcOver_Mode);
|
| c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor);
|
| c->restore();
|
| validateStateStack();
|
|
|