Index: Source/core/rendering/svg/RenderSVGResource.cpp |
diff --git a/Source/core/rendering/svg/RenderSVGResource.cpp b/Source/core/rendering/svg/RenderSVGResource.cpp |
index 517a57c17dbb15e772d34337c8cef38987c73c77..93601b38074f80b56171b97857f566e7dc4a3c97 100644 |
--- a/Source/core/rendering/svg/RenderSVGResource.cpp |
+++ b/Source/core/rendering/svg/RenderSVGResource.cpp |
@@ -21,7 +21,6 @@ |
*/ |
#include "config.h" |
- |
#include "core/rendering/svg/RenderSVGResource.h" |
#include "core/rendering/svg/RenderSVGResourceClipper.h" |
@@ -32,13 +31,73 @@ |
#include "core/rendering/svg/SVGResources.h" |
#include "core/rendering/svg/SVGResourcesCache.h" |
#include "platform/graphics/GraphicsContext.h" |
+#include "platform/graphics/GraphicsContextStateSaver.h" |
namespace blink { |
-bool RenderSVGResource::applyResource(RenderObject*, RenderStyle*, GraphicsContext*, RenderSVGResourceModeFlags) |
+SVGPaintServer::SVGPaintServer(Color color) |
+ : m_color(color) |
+{ |
+} |
+ |
+SVGPaintServer::SVGPaintServer(PassRefPtr<Gradient> gradient) |
+ : m_gradient(gradient) |
+ , m_color(Color::black) |
+{ |
+} |
+ |
+SVGPaintServer::SVGPaintServer(PassRefPtr<Pattern> pattern) |
+ : m_pattern(pattern) |
+ , m_color(Color::black) |
+{ |
+} |
+ |
+void SVGPaintServer::apply(GraphicsContext& context, RenderSVGResourceMode resourceMode, GraphicsContextStateSaver* stateSaver) |
+{ |
+ ASSERT(resourceMode == ApplyToFillMode || resourceMode == ApplyToStrokeMode); |
+ if (stateSaver && (m_gradient || m_pattern)) |
+ stateSaver->saveIfNeeded(); |
+ |
+ if (resourceMode == ApplyToFillMode) { |
+ if (m_pattern) |
+ context.setFillPattern(m_pattern); |
+ else if (m_gradient) |
+ context.setFillGradient(m_gradient); |
+ else |
+ context.setFillColor(m_color); |
+ } else { |
+ if (m_pattern) |
+ context.setStrokePattern(m_pattern); |
+ else if (m_gradient) |
+ context.setStrokeGradient(m_gradient); |
+ else |
+ context.setStrokeColor(m_color); |
+ } |
+} |
+ |
+SVGPaintServer SVGPaintServer::requestForRenderer(RenderObject& renderer, RenderStyle* style, RenderSVGResourceModeFlags resourceModeFlags) |
+{ |
+ ASSERT(style); |
+ RenderSVGResourceMode resourceMode = static_cast<RenderSVGResourceMode>(resourceModeFlags & (ApplyToFillMode | ApplyToStrokeMode)); |
+ ASSERT(resourceMode == ApplyToFillMode || resourceMode == ApplyToStrokeMode); |
+ |
+ bool hasFallback = false; |
+ RenderSVGResource* paintingResource = RenderSVGResource::requestPaintingResource(resourceMode, &renderer, style, hasFallback); |
+ if (!paintingResource) |
+ return invalid(); |
+ |
+ SVGPaintServer paintServer = paintingResource->preparePaintServer(&renderer, style, resourceModeFlags); |
+ if (paintServer.isValid()) |
+ return paintServer; |
+ if (hasFallback) |
+ return SVGPaintServer(RenderSVGResource::sharedSolidPaintingResource()->color()); |
+ return invalid(); |
+} |
+ |
+SVGPaintServer RenderSVGResource::preparePaintServer(RenderObject*, RenderStyle*, RenderSVGResourceModeFlags) |
{ |
ASSERT_NOT_REACHED(); |
- return false; |
+ return SVGPaintServer::invalid(); |
} |
RenderSVGResource* RenderSVGResource::requestPaintingResource(RenderSVGResourceMode mode, RenderObject* object, const RenderStyle* style, bool& hasFallback) |
@@ -51,21 +110,12 @@ RenderSVGResource* RenderSVGResource::requestPaintingResource(RenderSVGResourceM |
// If we have no style at all, ignore it. |
const SVGRenderStyle& svgStyle = style->svgStyle(); |
- bool isRenderingMask = SVGRenderSupport::isRenderingClipPathAsMaskImage(*object); |
- |
// If we have no fill/stroke, return 0. |
if (mode == ApplyToFillMode) { |
- // When rendering the mask for a RenderSVGResourceClipper, always use the initial fill paint server, and ignore stroke. |
- if (isRenderingMask) { |
- RenderSVGResourceSolidColor* colorResource = RenderSVGResource::sharedSolidPaintingResource(); |
- colorResource->setColor(SVGRenderStyle::initialFillPaintColor()); |
- return colorResource; |
- } |
- |
if (!svgStyle.hasFill()) |
return 0; |
} else { |
- if (!svgStyle.hasStroke() || isRenderingMask) |
+ if (!svgStyle.hasStroke()) |
return 0; |
} |
@@ -130,32 +180,6 @@ RenderSVGResource* RenderSVGResource::requestPaintingResource(RenderSVGResourceM |
return uriResource; |
} |
-void RenderSVGResource::updateGraphicsContext(GraphicsContext* context, const RenderStyle* style, const RenderObject& renderer, unsigned resourceModeFlags) |
-{ |
- ASSERT(context); |
- ASSERT(style); |
- |
- RenderSVGResourceMode resourceMode = static_cast<RenderSVGResourceMode>(resourceModeFlags & (ApplyToFillMode | ApplyToStrokeMode)); |
- ASSERT(resourceMode == ApplyToFillMode || resourceMode == ApplyToStrokeMode); |
- |
- if (SVGRenderSupport::isRenderingClipPathAsMaskImage(renderer)) { |
- // When rendering the mask for a RenderSVGResourceClipper, the stroke code path is never hit. |
- ASSERT(resourceMode == ApplyToFillMode); |
- context->setAlphaAsFloat(1); |
- return; |
- } |
- |
- const SVGRenderStyle& svgStyle = style->svgStyle(); |
- |
- if (resourceMode == ApplyToFillMode) { |
- context->setAlphaAsFloat(svgStyle.fillOpacity()); |
- context->setFillRule(svgStyle.fillRule()); |
- } else { |
- context->setAlphaAsFloat(svgStyle.strokeOpacity()); |
- SVGRenderSupport::applyStrokeStyleToContext(context, style, &renderer); |
- } |
-} |
- |
RenderSVGResourceSolidColor* RenderSVGResource::sharedSolidPaintingResource() |
{ |
static RenderSVGResourceSolidColor* s_sharedSolidPaintingResource = 0; |