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 1441e49eacae6e42c32518e23a52fb57a05d7ad5..0ba454b790e77acf5ddbaec1beb4a5dd74b518fb 100644 |
| --- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp |
| +++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp |
| @@ -434,70 +434,109 @@ void CanvasRenderingContext2D::restore() |
| validateStateStack(); |
| } |
| -CanvasStyle* CanvasRenderingContext2D::strokeStyle() const |
| +static inline void convertCanvasStyleToUnionType(CanvasStyle* style, StringOrCanvasGradientOrCanvasPattern& returnValue) |
| { |
| - return state().m_strokeStyle.get(); |
| + if (CanvasGradient* gradient = style->canvasGradient()) { |
| + returnValue.setCanvasGradient(gradient); |
| + return; |
| + } |
| + if (CanvasPattern* pattern = style->canvasPattern()) { |
| + returnValue.setCanvasPattern(pattern); |
| + return; |
| + } |
| + returnValue.setString(style->color()); |
| } |
| -void CanvasRenderingContext2D::setStrokeStyle(PassRefPtrWillBeRawPtr<CanvasStyle> prpStyle) |
| +void CanvasRenderingContext2D::strokeStyle(StringOrCanvasGradientOrCanvasPattern& returnValue) const |
| { |
| - RefPtrWillBeRawPtr<CanvasStyle> style = prpStyle; |
| + convertCanvasStyleToUnionType(state().m_strokeStyle.get(), returnValue); |
| +} |
| - if (!style) |
| - return; |
| +void CanvasRenderingContext2D::setStrokeStyle(const StringOrCanvasGradientOrCanvasPattern& style) |
| +{ |
| + ASSERT(!style.isNull()); |
| - if (state().m_strokeStyle && state().m_strokeStyle->isEquivalentColor(*style)) |
| - return; |
| + String colorString; |
| + RefPtrWillBeRawPtr<CanvasStyle> canvasStyle; |
| + if (style.isString()) { |
| + colorString = style.getAsString(); |
| + if (colorString == state().m_unparsedStrokeColor) |
|
fs
2014/11/24 13:20:24
The removal of the legacy APIs seems to have dropp
Justin Novosad
2014/11/24 15:41:02
Thanks for catching that. the removal was unintent
|
| + return; |
| + RGBA32 parsedColor = 0; |
| + if (!parseColorOrCurrentColor(parsedColor, colorString, canvas())) |
| + return; |
| + if (state().m_strokeStyle->isEquivalentRGBA(parsedColor)) { |
| + realizeSaves(nullptr); |
| + modifiableState().m_unparsedStrokeColor = colorString; |
| + return; |
| + } |
| + canvasStyle = CanvasStyle::createFromRGBA(parsedColor); |
| + } else if (style.isCanvasGradient()) { |
| + canvasStyle = CanvasStyle::createFromGradient(style.getAsCanvasGradient()); |
| + } else if (style.isCanvasPattern()) { |
| + RefPtrWillBeRawPtr<CanvasPattern> canvasPattern = style.getAsCanvasPattern(); |
| - if (style->isCurrentColor()) { |
| - if (style->hasOverrideAlpha()) |
| - style = CanvasStyle::createFromRGBA(colorWithOverrideAlpha(currentColor(canvas()), style->overrideAlpha())); |
| - else |
| - style = CanvasStyle::createFromRGBA(currentColor(canvas())); |
| - } else if (canvas()->originClean() && style->canvasPattern() && !style->canvasPattern()->originClean()) { |
| - canvas()->setOriginTainted(); |
| + if (canvas()->originClean() && !canvasPattern->originClean()) |
| + canvas()->setOriginTainted(); |
| + |
| + canvasStyle = CanvasStyle::createFromPattern(canvasPattern); |
| } |
| + ASSERT(canvasStyle); |
| + |
| GraphicsContext* c = drawingContext(); |
| realizeSaves(c); |
| - modifiableState().m_strokeStyle = style.release(); |
| + modifiableState().m_strokeStyle = canvasStyle.release(); |
| if (!c) |
| return; |
| state().m_strokeStyle->applyStrokeColor(c); |
| - modifiableState().m_unparsedStrokeColor = String(); |
| + modifiableState().m_unparsedStrokeColor = colorString; |
| } |
| -CanvasStyle* CanvasRenderingContext2D::fillStyle() const |
| +void CanvasRenderingContext2D::fillStyle(StringOrCanvasGradientOrCanvasPattern& returnValue) const |
| { |
| - return state().m_fillStyle.get(); |
| + convertCanvasStyleToUnionType(state().m_fillStyle.get(), returnValue); |
| } |
| -void CanvasRenderingContext2D::setFillStyle(PassRefPtrWillBeRawPtr<CanvasStyle> prpStyle) |
| +void CanvasRenderingContext2D::setFillStyle(const StringOrCanvasGradientOrCanvasPattern& style) |
| { |
| - RefPtrWillBeRawPtr<CanvasStyle> style = prpStyle; |
| + ASSERT(!style.isNull()); |
| - if (!style) |
| - return; |
| + String colorString; |
| + RefPtrWillBeRawPtr<CanvasStyle> canvasStyle; |
| + if (style.isString()) { |
| + colorString = style.getAsString(); |
| + if (colorString == state().m_unparsedFillColor) |
| + return; |
| + RGBA32 parsedColor = 0; |
| + if (!parseColorOrCurrentColor(parsedColor, colorString, canvas())) |
| + return; |
| + if (state().m_fillStyle->isEquivalentRGBA(parsedColor)) { |
| + realizeSaves(nullptr); |
| + modifiableState().m_unparsedFillColor = colorString; |
| + return; |
| + } |
| + canvasStyle = CanvasStyle::createFromRGBA(parsedColor); |
| + } else if (style.isCanvasGradient()) { |
| + canvasStyle = CanvasStyle::createFromGradient(style.getAsCanvasGradient()); |
| + } else if (style.isCanvasPattern()) { |
| + RefPtrWillBeRawPtr<CanvasPattern> canvasPattern = style.getAsCanvasPattern(); |
| - if (state().m_fillStyle && state().m_fillStyle->isEquivalentColor(*style)) |
| - return; |
| + if (canvas()->originClean() && !canvasPattern->originClean()) |
| + canvas()->setOriginTainted(); |
| - if (style->isCurrentColor()) { |
| - if (style->hasOverrideAlpha()) |
| - style = CanvasStyle::createFromRGBA(colorWithOverrideAlpha(currentColor(canvas()), style->overrideAlpha())); |
| - else |
| - style = CanvasStyle::createFromRGBA(currentColor(canvas())); |
| - } else if (canvas()->originClean() && style->canvasPattern() && !style->canvasPattern()->originClean()) { |
| - canvas()->setOriginTainted(); |
| + canvasStyle = CanvasStyle::createFromPattern(canvasPattern); |
| } |
| + ASSERT(canvasStyle); |
| + |
| GraphicsContext* c = drawingContext(); |
| realizeSaves(c); |
| - modifiableState().m_fillStyle = style.release(); |
| + modifiableState().m_fillStyle = canvasStyle.release(); |
| if (!c) |
| return; |
| state().m_fillStyle->applyFillColor(c); |
| - modifiableState().m_unparsedFillColor = String(); |
| + modifiableState().m_unparsedFillColor = colorString; |
| } |
| float CanvasRenderingContext2D::lineWidth() const |