Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(660)

Unified Diff: Source/core/html/canvas/CanvasRenderingContext2D.cpp

Issue 752083003: Use IDL union types for CanvasRenderingContext2D.{fill,stroke}Style (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698