#include "core/rendering/svg/RenderSVGResourceGradient.h"
-#include "core/platform/graphics/GraphicsContext.h"
#include "core/rendering/svg/RenderSVGShape.h"
#include "core/rendering/svg/SVGRenderSupport.h"
-#include "wtf/UnusedParam.h"
+#include "platform/graphics/GraphicsContext.h"
-namespace WebCore {
+namespace blink {
RenderSVGResourceGradient::RenderSVGResourceGradient(SVGGradientElement* node)
: RenderSVGResourceContainer(node)
{
m_gradientMap.clear();
m_shouldCollectGradientAttributes = true;
- markAllClientsForInvalidation(markForInvalidation ? RepaintInvalidation : ParentOnlyInvalidation);
+ markAllClientsForInvalidation(markForInvalidation ? PaintInvalidation : ParentOnlyInvalidation);
}
void RenderSVGResourceGradient::removeClientFromCache(RenderObject* client, bool markForInvalidation)
{
ASSERT(client);
m_gradientMap.remove(client);
- markClientForInvalidation(client, markForInvalidation ? RepaintInvalidation : ParentOnlyInvalidation);
+ markClientForInvalidation(client, markForInvalidation ? PaintInvalidation : ParentOnlyInvalidation);
}
bool RenderSVGResourceGradient::applyResource(RenderObject* object, RenderStyle* style, GraphicsContext*& context, unsigned short resourceMode)
ASSERT(context);
ASSERT(resourceMode != ApplyToDefaultMode);
+ clearInvalidationMask();
+
// Be sure to synchronize all SVG properties on the gradientElement _before_ processing any further.
// Otherwhise the call to collectGradientAttributes() in createTileImage(), may cause the SVG DOM property
// synchronization to kick in, which causes removeAllClientsFromCache() to be called, which in turn deletes our
if (gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX && objectBoundingBox.isEmpty())
return false;
- OwnPtr<GradientData>& gradientData = m_gradientMap.add(object, nullptr).iterator->value;
+ OwnPtr<GradientData>& gradientData = m_gradientMap.add(object, nullptr).storedValue->value;
if (!gradientData)
gradientData = adoptPtr(new GradientData);
- bool isPaintingText = resourceMode & ApplyToTextMode;
-
// Create gradient object
if (!gradientData->gradient) {
buildGradient(gradientData.get());
calculateGradientTransform(gradientTransform);
gradientData->userspaceTransform *= gradientTransform;
- if (isPaintingText) {
- // Depending on font scaling factor, we may need to rescale the gradient here since
- // text painting removes the scale factor from the context.
- AffineTransform additionalTextTransform;
- if (shouldTransformOnTextPainting(object, additionalTextTransform))
- gradientData->userspaceTransform *= additionalTextTransform;
- }
- gradientData->gradient->setGradientSpaceTransform(gradientData->userspaceTransform);
}
if (!gradientData->gradient)
return false;
+ const SVGRenderStyle& svgStyle = style->svgStyle();
+
+ AffineTransform computedGradientSpaceTransform = computeResourceSpaceTransform(object, gradientData->userspaceTransform, svgStyle, resourceMode);
+ gradientData->gradient->setGradientSpaceTransform(computedGradientSpaceTransform);
+
// Draw gradient
context->save();
- if (isPaintingText)
+ if (resourceMode & ApplyToTextMode)
context->setTextDrawingMode(resourceMode & ApplyToFillMode ? TextModeFill : TextModeStroke);
- const SVGRenderStyle* svgStyle = style->svgStyle();
- ASSERT(svgStyle);
-
if (resourceMode & ApplyToFillMode) {
- context->setAlpha(svgStyle->fillOpacity());
+ context->setAlphaAsFloat(svgStyle.fillOpacity());
context->setFillGradient(gradientData->gradient);
- context->setFillRule(svgStyle->fillRule());
+ context->setFillRule(svgStyle.fillRule());
} else if (resourceMode & ApplyToStrokeMode) {
- if (svgStyle->vectorEffect() == VE_NON_SCALING_STROKE)
- gradientData->gradient->setGradientSpaceTransform(transformOnNonScalingStroke(object, gradientData->userspaceTransform));
- context->setAlpha(svgStyle->strokeOpacity());
+ context->setAlphaAsFloat(svgStyle.strokeOpacity());
context->setStrokeGradient(gradientData->gradient);
SVGRenderSupport::applyStrokeStyleToContext(context, style, object);
}
return true;
}
-void RenderSVGResourceGradient::postApplyResource(RenderObject* object, GraphicsContext*& context, unsigned short resourceMode, const Path* path, const RenderSVGShape* shape)
+void RenderSVGResourceGradient::postApplyResource(RenderObject*, GraphicsContext*& context)
{
ASSERT(context);
- ASSERT(resourceMode != ApplyToDefaultMode);
- UNUSED_PARAM(object);
-
- if (resourceMode & ApplyToFillMode) {
- if (path)
- context->fillPath(*path);
- else if (shape)
- shape->fillShape(context);
- }
- if (resourceMode & ApplyToStrokeMode) {
- if (path)
- context->strokePath(*path);
- else if (shape)
- shape->strokeShape(context);
- }
-
context->restore();
}