| Index: Source/WebCore/svg/graphics/filters/SVGFEImage.cpp
|
| ===================================================================
|
| --- Source/WebCore/svg/graphics/filters/SVGFEImage.cpp (revision 105779)
|
| +++ Source/WebCore/svg/graphics/filters/SVGFEImage.cpp (working copy)
|
| @@ -28,8 +28,12 @@
|
| #include "AffineTransform.h"
|
| #include "Filter.h"
|
| #include "GraphicsContext.h"
|
| +#include "RenderObject.h"
|
| #include "RenderTreeAsText.h"
|
| +#include "SVGFilter.h"
|
| +#include "SVGImageBufferTools.h"
|
| #include "SVGPreserveAspectRatio.h"
|
| +#include "SVGURIReference.h"
|
| #include "TextStream.h"
|
|
|
| namespace WebCore {
|
| @@ -37,34 +41,74 @@
|
| FEImage::FEImage(Filter* filter, PassRefPtr<Image> image, const SVGPreserveAspectRatio& preserveAspectRatio)
|
| : FilterEffect(filter)
|
| , m_image(image)
|
| + , m_document(0)
|
| , m_preserveAspectRatio(preserveAspectRatio)
|
| {
|
| }
|
|
|
| -PassRefPtr<FEImage> FEImage::create(Filter* filter, PassRefPtr<Image> image, const SVGPreserveAspectRatio& preserveAspectRatio)
|
| +FEImage::FEImage(Filter* filter, Document* document, const String& href, const SVGPreserveAspectRatio& preserveAspectRatio)
|
| + : FilterEffect(filter)
|
| + , m_document(document)
|
| + , m_href(href)
|
| + , m_preserveAspectRatio(preserveAspectRatio)
|
| {
|
| +}
|
| +
|
| +PassRefPtr<FEImage> FEImage::createWithImage(Filter* filter, PassRefPtr<Image> image, const SVGPreserveAspectRatio& preserveAspectRatio)
|
| +{
|
| return adoptRef(new FEImage(filter, image, preserveAspectRatio));
|
| }
|
|
|
| +PassRefPtr<FEImage> FEImage::createWithIRIReference(Filter* filter, Document* document, const String& href, const SVGPreserveAspectRatio& preserveAspectRatio)
|
| +{
|
| + return adoptRef(new FEImage(filter, document, href, preserveAspectRatio));
|
| +}
|
| +
|
| void FEImage::determineAbsolutePaintRect()
|
| {
|
| - ASSERT(m_image);
|
| - FloatRect srcRect(FloatPoint(), m_image->size());
|
| + FloatRect srcRect;
|
| + if (m_image)
|
| + srcRect.setSize(m_image->size());
|
| + else if (RenderObject* renderer = referencedRenderer())
|
| + srcRect = static_cast<SVGFilter*>(filter())->absoluteTransform().mapRect(renderer->repaintRectInLocalCoordinates());
|
| +
|
| FloatRect paintRect(m_absoluteSubregion);
|
| m_preserveAspectRatio.transformRect(paintRect, srcRect);
|
| paintRect.intersect(maxEffectRect());
|
| setAbsolutePaintRect(enclosingIntRect(paintRect));
|
| }
|
|
|
| +RenderObject* FEImage::referencedRenderer() const
|
| +{
|
| + if (!m_document)
|
| + return 0;
|
| + Element* hrefElement = SVGURIReference::targetElementFromIRIString(m_href, m_document);
|
| + if (!hrefElement || !hrefElement->isSVGElement())
|
| + return 0;
|
| + return hrefElement->renderer();
|
| +}
|
| +
|
| void FEImage::platformApplySoftware()
|
| {
|
| - if (!m_image.get())
|
| + RenderObject* renderer = referencedRenderer();
|
| + if (!m_image && !renderer)
|
| return;
|
|
|
| ImageBuffer* resultImage = createImageBufferResult();
|
| if (!resultImage)
|
| return;
|
|
|
| + if (renderer) {
|
| + const AffineTransform& absoluteTransform = static_cast<SVGFilter*>(filter())->absoluteTransform();
|
| + resultImage->context()->concatCTM(absoluteTransform);
|
| +
|
| + AffineTransform contentTransformation;
|
| + SVGImageBufferTools::renderSubtreeToImageBuffer(resultImage, renderer, contentTransformation);
|
| +
|
| + resultImage->context()->concatCTM(absoluteTransform.inverse());
|
| + return;
|
| + }
|
| +
|
| FloatRect srcRect(FloatPoint(), m_image->size());
|
| FloatRect destRect(m_absoluteSubregion);
|
| m_preserveAspectRatio.transformRect(destRect, srcRect);
|
| @@ -81,8 +125,11 @@
|
|
|
| TextStream& FEImage::externalRepresentation(TextStream& ts, int indent) const
|
| {
|
| - ASSERT(m_image);
|
| - IntSize imageSize = m_image->size();
|
| + IntSize imageSize;
|
| + if (m_image)
|
| + imageSize = m_image->size();
|
| + else if (RenderObject* renderer = referencedRenderer())
|
| + imageSize = enclosingIntRect(renderer->repaintRectInLocalCoordinates()).size();
|
| writeIndent(ts, indent);
|
| ts << "[feImage";
|
| FilterEffect::externalRepresentation(ts);
|
|
|