FloatRect RenderSVGResourceMasker::resourceBoundingBox(RenderObject* object) { // Save the reference to the calling object for relayouting it on changing resource properties. if (!m_masker.contains(object)) m_masker.set(object, new MaskerData); // Resource was not layouted yet. Give back clipping rect of the mask. SVGMaskElement* maskElement = static_cast<SVGMaskElement*>(node()); FloatRect objectBoundingBox = object->objectBoundingBox(); FloatRect maskBoundaries = maskElement->maskBoundingBox(objectBoundingBox); if (selfNeedsLayout()) return maskBoundaries; if (m_maskBoundaries.isEmpty()) calculateMaskContentRepaintRect(); if (!maskElement) return FloatRect(); FloatRect maskRect = m_maskBoundaries; if (maskElement->maskContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { AffineTransform transform; transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height()); maskRect = transform.mapRect(maskRect); } maskRect.intersect(maskBoundaries); return maskRect; }
FloatRect LayoutSVGResourceMasker::resourceBoundingBox(const LayoutObject* object) { SVGMaskElement* maskElement = toSVGMaskElement(element()); ASSERT(maskElement); FloatRect objectBoundingBox = object->objectBoundingBox(); FloatRect maskBoundaries = SVGLengthContext::resolveRectangle<SVGMaskElement>(maskElement, maskElement->maskUnits()->currentValue()->enumValue(), objectBoundingBox); // Resource was not layouted yet. Give back clipping rect of the mask. if (selfNeedsLayout()) return maskBoundaries; if (m_maskContentBoundaries.isEmpty()) calculateMaskContentPaintInvalidationRect(); FloatRect maskRect = m_maskContentBoundaries; if (maskElement->maskContentUnits()->currentValue()->value() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { AffineTransform transform; transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height()); maskRect = transform.mapRect(maskRect); } maskRect.intersect(maskBoundaries); return maskRect; }
FloatRect RenderSVGResourceMasker::resourceBoundingBox(RenderObject* object) { SVGMaskElement* maskElement = static_cast<SVGMaskElement*>(node()); ASSERT(maskElement); FloatRect objectBoundingBox = object->objectBoundingBox(); FloatRect maskBoundaries = maskElement->maskBoundingBox(objectBoundingBox); // Resource was not layouted yet. Give back clipping rect of the mask. if (selfNeedsLayout()) return maskBoundaries; if (m_maskContentBoundaries.isEmpty()) calculateMaskContentRepaintRect(); FloatRect maskRect = m_maskContentBoundaries; if (maskElement->maskContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { AffineTransform transform; transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height()); maskRect = transform.mapRect(maskRect); } maskRect.intersect(maskBoundaries); return maskRect; }
FloatRect RenderSVGResourceMasker::resourceBoundingBox(const FloatRect& objectBoundingBox) { if (m_maskBoundaries.isEmpty()) calculateMaskContentRepaintRect(); SVGMaskElement* maskElement = static_cast<SVGMaskElement*>(node()); if (!maskElement) return FloatRect(); FloatRect maskRect = m_maskBoundaries; if (maskElement->maskContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { AffineTransform transform; transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height()); maskRect = transform.mapRect(maskRect); } maskRect.intersect(maskElement->maskBoundingBox(objectBoundingBox)); return maskRect; }