liver Hunt  <oliver@apple.com>

        Reviewed by Anders.

        Roll out last patch

        * CMakeLists.txt:
        * ChangeLog:
        * WebCore.xcodeproj/project.pbxproj:
        * graphics/svg/SVGResource.cpp:
        * graphics/svg/SVGResourceClipper.cpp:
        * graphics/svg/SVGResourceClipper.h:
        * graphics/svg/SVGResourceImage.h:
        * graphics/svg/SVGResourceListener.h:
        * graphics/svg/SVGResourceMarker.cpp:
        * graphics/svg/SVGResourceMarker.h:
        * graphics/svg/SVGResourceMasker.cpp:
        * graphics/svg/SVGResourceMasker.h:
        * kcanvas/KCanvasClipper.cpp: Added.
        (WebCore::operator<<):
        (WebCore::KCanvasClipper::KCanvasClipper):
        (WebCore::KCanvasClipper::~KCanvasClipper):
        (WebCore::KCanvasClipper::resetClipData):
        (WebCore::KCanvasClipper::addClipData):
        (WebCore::KCanvasClipper::clipData):
        (WebCore::KCanvasClipper::externalRepresentation):
        (WebCore::getClipperById):
        * kcanvas/KCanvasClipper.h: Added.
        (WebCore::KCClipData::windRule):
        (WebCore::KCClipDataList::KCClipDataList):
        (WebCore::KCClipDataList::addPath):
        (WebCore::KCanvasClipper::isClipper):
        * kcanvas/KCanvasFilters.cpp:
        (WebCore::getFilterById):
        * kcanvas/KCanvasFilters.h:
        * kcanvas/KCanvasImage.h: Added.
        (WebCore::KCanvasImage::KCanvasImage):
        (WebCore::KCanvasImage::~KCanvasImage):
        * kcanvas/KCanvasMarker.cpp: Added.
        (WebCore::KCanvasMarker::KCanvasMarker):
        (WebCore::KCanvasMarker::~KCanvasMarker):
        (WebCore::KCanvasMarker::setMarker):
        (WebCore::KCanvasMarker::setRef):
        (WebCore::KCanvasMarker::refX):
        (WebCore::KCanvasMarker::refY):
        (WebCore::KCanvasMarker::setAngle):
        (WebCore::KCanvasMarker::angle):
        (WebCore::KCanvasMarker::setAutoAngle):
        (WebCore::KCanvasMarker::setUseStrokeWidth):
        (WebCore::KCanvasMarker::useStrokeWidth):
        (WebCore::KCanvasMarker::draw):
        (WebCore::KCanvasMarker::externalRepresentation):
        (WebCore::getMarkerById):
        * kcanvas/KCanvasMarker.h: Added.
        (WebCore::KCanvasMarker::isMarker):
        * kcanvas/KCanvasMasker.cpp: Added.
        (WebCore::KCanvasMasker::KCanvasMasker):
        (WebCore::KCanvasMasker::~KCanvasMasker):
        (WebCore::KCanvasMasker::setMask):
        (WebCore::KCanvasMasker::externalRepresentation):
        (WebCore::getMaskerById):
        * kcanvas/KCanvasMasker.h: Added.
        (WebCore::KCanvasMasker::isMasker):
        (WebCore::KCanvasMasker::mask):
        * kcanvas/KCanvasResource.cpp: Added.
        (WebCore::operator<<):
        (WebCore::KCanvasResource::KCanvasResource):
        (WebCore::KCanvasResource::~KCanvasResource):
        (WebCore::KCanvasResource::addClient):
        (WebCore::KCanvasResource::clients):
        (WebCore::KCanvasResource::invalidate):
        (WebCore::KCanvasResource::idInRegistry):
        (WebCore::KCanvasResource::setIdInRegistry):
        (WebCore::KCanvasResource::externalRepresentation):
        (WebCore::getResourceById):
        (WebCore::getPaintServerById):
        * kcanvas/KCanvasResource.h:
        (WebCore::):
        (WebCore::KCanvasResource::isPaintServer):
        (WebCore::KCanvasResource::isFilter):
        (WebCore::KCanvasResource::isClipper):
        (WebCore::KCanvasResource::isMarker):
        (WebCore::KCanvasResource::isMasker):
        * kcanvas/KCanvasResourceListener.h: Added.
        (KCanvasResourceListener::KCanvasResourceListener):
        (KCanvasResourceListener::~KCanvasResourceListener):
        * kcanvas/KCanvasTreeDebug.cpp:
        (WebCore::writeRenderResources):
        * kcanvas/device/KRenderingDevice.h:
        * kcanvas/device/KRenderingPaintServer.h:
        (WebCore::KRenderingPaintServer::KRenderingPaintServer):
        (WebCore::KRenderingPaintServer::idInRegistry):
        (WebCore::KRenderingPaintServer::setIdInRegistry):
        * kcanvas/device/KRenderingPaintServerGradient.cpp:
        (WebCore::KRenderingPaintServerGradient::listener):
        (WebCore::KRenderingPaintServerGradient::setListener):
        * kcanvas/device/KRenderingPaintServerGradient.h:
        * kcanvas/device/KRenderingPaintServerPattern.cpp:
        (WebCore::KRenderingPaintServerPattern::KRenderingPaintServerPattern):
        (WebCore::KRenderingPaintServerPattern::~KRenderingPaintServerPattern):
        (WebCore::KRenderingPaintServerPattern::tile):
        (WebCore::KRenderingPaintServerPattern::setTile):
        (WebCore::KRenderingPaintServerPattern::listener):
        (WebCore::KRenderingPaintServerPattern::setListener):
        * kcanvas/device/KRenderingPaintServerPattern.h:
        * kcanvas/device/KRenderingPaintServerSolid.h:
        * kcanvas/device/qt/KCanvasClipperQt.cpp:
        (WebCore::KCanvasClipperQt::applyClip):
        * kcanvas/device/qt/KCanvasClipperQt.h:
        (WebCore::KCanvasClipperQt::KCanvasClipperQt):
        * kcanvas/device/qt/KRenderingDeviceQt.cpp:
        (WebCore::KRenderingDeviceQt::contextForImage):
        (WebCore::KRenderingDeviceQt::createResource):
        (WebCore::KRenderingDeviceQt::createPaintServer):
        * kcanvas/device/qt/KRenderingDeviceQt.h:
        * kcanvas/device/qt/KRenderingPaintServerGradientQt.cpp:
        * kcanvas/device/qt/KRenderingPaintServerPatternQt.cpp:
        * kcanvas/device/qt/KRenderingPaintServerQt.cpp:
        * kcanvas/device/qt/KRenderingPaintServerSolidQt.cpp:
        * kcanvas/device/quartz/KCanvasFilterQuartz.mm:
        (WebCore::KCanvasFilterQuartz::getCIFilterStack):
        * kcanvas/device/quartz/KCanvasItemQuartz.mm:
        * kcanvas/device/quartz/KCanvasMaskerQuartz.h:
        (WebCore::KCanvasMaskerQuartz::KCanvasMaskerQuartz):
        * kcanvas/device/quartz/KCanvasMaskerQuartz.mm:
        (WebCore::applyLuminanceToAlphaFilter):
        (WebCore::applyExpandAlphatoGrayscaleFilter):
        (WebCore::transformImageIntoGrayscaleMask):
        (WebCore::KCanvasMaskerQuartz::applyMask):
        * kcanvas/device/quartz/KCanvasResourcesQuartz.h:
        (WebCore::KCanvasClipperQuartz::KCanvasClipperQuartz):
        (WebCore::KCanvasImageQuartz::KCanvasImageQuartz):
        (WebCore::KCanvasImageQuartz::init):
        (WebCore::KCanvasImageQuartz::size):
        * kcanvas/device/quartz/KCanvasResourcesQuartz.mm:
        (WebCore::KCanvasClipperQuartz::applyClip):
        (WebCore::KCanvasImageQuartz::~KCanvasImageQuartz):
        (WebCore::KCanvasImageQuartz::cgLayer):
        (WebCore::KCanvasImageQuartz::setCGLayer):
        * kcanvas/device/quartz/KRenderingDeviceQuartz.h:
        * kcanvas/device/quartz/KRenderingDeviceQuartz.mm:
        (WebCore::KRenderingDeviceQuartz::contextForImage):
        (WebCore::KRenderingDeviceQuartz::createPaintServer):
        (WebCore::KRenderingDeviceQuartz::createResource):
        * kcanvas/device/quartz/KRenderingPaintServerGradientQuartz.mm:
        (WebCore::KRenderingPaintServerGradientQuartz::KRenderingPaintServerGradientQuartz):
        (WebCore::KRenderingPaintServerGradientQuartz::~KRenderingPaintServerGradientQuartz):
        (WebCore::KRenderingPaintServerGradientQuartz::setup):
        (WebCore::KRenderingPaintServerGradientQuartz::teardown):
        * kcanvas/device/quartz/KRenderingPaintServerQuartz.h:
        * kcanvas/device/quartz/KRenderingPaintServerQuartz.mm:
        (WebCore::patternCallback):
        (WebCore::KRenderingPaintServerPatternQuartz::setup):
        * kcanvas/device/quartz/QuartzSupport.mm:
        * ksvg2/misc/KCanvasRenderingStyle.cpp:
        (WebCore::sharedSolidPaintServer):
        * ksvg2/svg/SVGClipPathElement.cpp:
        (WebCore::SVGClipPathElement::SVGClipPathElement):
        (WebCore::SVGClipPathElement::~SVGClipPathElement):
        (WebCore::SVGClipPathElement::canvasResource):
        * ksvg2/svg/SVGClipPathElement.h:
        * ksvg2/svg/SVGFEImageElement.cpp:
        * ksvg2/svg/SVGFilterElement.cpp:
        (WebCore::SVGFilterElement::SVGFilterElement):
        (WebCore::SVGFilterElement::~SVGFilterElement):
        (WebCore::SVGFilterElement::canvasResource):
        * ksvg2/svg/SVGFilterElement.h:
        * ksvg2/svg/SVGGradientElement.cpp:
        (WebCore::SVGGradientElement::SVGGradientElement):
        (WebCore::SVGGradientElement::~SVGGradientElement):
        (WebCore::SVGGradientElement::canvasResource):
        (WebCore::SVGGradientElement::resourceNotification):
        * ksvg2/svg/SVGGradientElement.h:
        * ksvg2/svg/SVGImageElement.cpp:
        * ksvg2/svg/SVGLinearGradientElement.cpp:
        (WebCore::SVGLinearGradientElement::buildGradient):
        * ksvg2/svg/SVGLinearGradientElement.h:
        * ksvg2/svg/SVGMarkerElement.cpp:
        (WebCore::SVGMarkerElement::SVGMarkerElement):
        (WebCore::SVGMarkerElement::~SVGMarkerElement):
        (WebCore::SVGMarkerElement::canvasResource):
        * ksvg2/svg/SVGMarkerElement.h:
        * ksvg2/svg/SVGMaskElement.cpp:
        (WebCore::SVGMaskElement::SVGMaskElement):
        (WebCore::SVGMaskElement::~SVGMaskElement):
        (WebCore::SVGMaskElement::drawMaskerContent):
        (WebCore::SVGMaskElement::canvasResource):
        * ksvg2/svg/SVGMaskElement.h:
        * ksvg2/svg/SVGPatternElement.cpp:
        (WebCore::SVGPatternElement::SVGPatternElement):
        (WebCore::SVGPatternElement::~SVGPatternElement):
        (WebCore::SVGPatternElement::fillAttributesFromReferencePattern):
        (WebCore::SVGPatternElement::drawPatternContentIntoTile):
        (WebCore::SVGPatternElement::canvasResource):
        * ksvg2/svg/SVGPatternElement.h:
        * ksvg2/svg/SVGRadialGradientElement.cpp:
        (WebCore::SVGRadialGradientElement::buildGradient):
        * ksvg2/svg/SVGRadialGradientElement.h:
        * ksvg2/svg/SVGStyledElement.h:
        (WebCore::SVGStyledElement::canvasResource):
        * platform/GraphicsContext.cpp: Added.
        (WebCore::GraphicsContextState::GraphicsContextState):
        (WebCore::GraphicsContextPrivate::GraphicsContextPrivate):
        (WebCore::GraphicsContext::createGraphicsContextPrivate):
        (WebCore::GraphicsContext::destroyGraphicsContextPrivate):
        (WebCore::GraphicsContext::save):
        (WebCore::GraphicsContext::restore):
        (WebCore::GraphicsContext::font):
        (WebCore::GraphicsContext::setFont):
        (WebCore::GraphicsContext::pen):
        (WebCore::GraphicsContext::setPen):
        (WebCore::GraphicsContext::setFillColor):
        (WebCore::GraphicsContext::fillColor):
        (WebCore::GraphicsContext::updatingControlTints):
        (WebCore::GraphicsContext::setUpdatingControlTints):
        (WebCore::GraphicsContext::setPaintingDisabled):
        (WebCore::GraphicsContext::paintingDisabled):
        (WebCore::GraphicsContext::drawImage):
        (WebCore::GraphicsContext::drawText):
        (WebCore::GraphicsContext::drawHighlightForText):
        (WebCore::GraphicsContext::initFocusRing):
        (WebCore::GraphicsContext::clearFocusRing):
        (WebCore::GraphicsContext::focusRingBoundingRect):
        (WebCore::GraphicsContext::addFocusRingRect):
        (WebCore::GraphicsContext::focusRingWidth):
        (WebCore::GraphicsContext::focusRingOffset):
        (WebCore::GraphicsContext::focusRingRects):
        (WebCore::GraphicsContext::drawTiledImage):
        * platform/GraphicsContext.h: Added.
        * platform/GraphicsTypes.cpp: Added.
        (WebCore::):
        (WebCore::parseCompositeOperator):
        (WebCore::compositeOperatorName):
        (WebCore::parseLineCap):
        (WebCore::lineCapName):
        (WebCore::parseLineJoin):
        (WebCore::lineJoinName):
        * platform/GraphicsTypes.h: Added.
        (WebCore::):
        * platform/graphics/GraphicsContext.cpp:
        * platform/graphics/GraphicsContext.h:
        * platform/graphics/GraphicsTypes.cpp:
        * platform/graphics/GraphicsTypes.h:
        * platform/qt/GraphicsContextQt.cpp:
        * rendering/RenderPath.cpp:
        (WebCore::RenderPath::paint):
        (WebCore::DrawMarkersData::DrawMarkersData):
        (WebCore::RenderPath::drawMarkersIfNeeded):
        * rendering/RenderSVGContainer.cpp:
        (WebCore::RenderSVGContainer::paint):
        * rendering/RenderSVGImage.cpp:
        (WebCore::RenderSVGImage::paint):
        * rendering/SVGInlineFlowBox.cpp:
        (WebCore::paintSVGInlineFlow):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@17462 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/kcanvas/device/quartz/KCanvasFilterQuartz.mm b/WebCore/kcanvas/device/quartz/KCanvasFilterQuartz.mm
index a8cc338..fcb4de1 100644
--- a/WebCore/kcanvas/device/quartz/KCanvasFilterQuartz.mm
+++ b/WebCore/kcanvas/device/quartz/KCanvasFilterQuartz.mm
@@ -180,7 +180,6 @@
     DeprecatedValueListIterator<KCanvasFilterEffect*> end = m_effects.end();
 
     setImageForName(inputImage, "SourceGraphic"); // input
-
     for (;it != end; it++) {
         CIFilter *filter = (*it)->getCIFilter(this);
         if (filter)
diff --git a/WebCore/kcanvas/device/quartz/KCanvasItemQuartz.mm b/WebCore/kcanvas/device/quartz/KCanvasItemQuartz.mm
index 27da08d..e8a5d13 100644
--- a/WebCore/kcanvas/device/quartz/KCanvasItemQuartz.mm
+++ b/WebCore/kcanvas/device/quartz/KCanvasItemQuartz.mm
@@ -31,7 +31,9 @@
 #import <wtf/Assertions.h>
 
 #import "KCanvasFilterQuartz.h"
+#import "KCanvasMaskerQuartz.h"
 #import "KCanvasRenderingStyle.h"
+#import "KCanvasResourcesQuartz.h"
 #import "KRenderingDeviceQuartz.h"
 #import "QuartzSupport.h"
 #import "RenderPath.h"
diff --git a/WebCore/kcanvas/device/quartz/KCanvasMaskerQuartz.h b/WebCore/kcanvas/device/quartz/KCanvasMaskerQuartz.h
index e69de29..4f7914b 100644
--- a/WebCore/kcanvas/device/quartz/KCanvasMaskerQuartz.h
+++ b/WebCore/kcanvas/device/quartz/KCanvasMaskerQuartz.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
+ *               2005, 2006 Alexander Kellett <lypanov@kde.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "KCanvasMasker.h"
+#include "KCanvasImage.h"
+
+namespace WebCore {
+
+class KCanvasMaskerQuartz : public KCanvasMasker {
+public:
+    KCanvasMaskerQuartz() { }
+    
+    virtual void applyMask(const FloatRect& boundingBox) const;
+};
+
+}
diff --git a/WebCore/kcanvas/device/quartz/KCanvasMaskerQuartz.mm b/WebCore/kcanvas/device/quartz/KCanvasMaskerQuartz.mm
index e69de29..efecf8c 100644
--- a/WebCore/kcanvas/device/quartz/KCanvasMaskerQuartz.mm
+++ b/WebCore/kcanvas/device/quartz/KCanvasMaskerQuartz.mm
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2005, 2006 Alexander Kellett <lypanov@kde.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+
+#include "config.h"
+#ifdef SVG_SUPPORT
+#import "KCanvasMaskerQuartz.h"
+
+#import "SVGRenderStyle.h"
+
+#import "KCanvasResourcesQuartz.h"
+#import "KRenderingDeviceQuartz.h"
+#import "QuartzSupport.h"
+
+#import <QuartzCore/CoreImage.h>
+
+namespace WebCore {
+
+static CIImage *applyLuminanceToAlphaFilter(CIImage *inputImage)
+{
+    CIFilter *luminanceToAlpha = [CIFilter filterWithName:@"CIColorMatrix"];
+    [luminanceToAlpha setDefaults];
+    CGFloat alpha[4] = {0.2125, 0.7154, 0.0721, 0};
+    CGFloat zero[4] = {0, 0, 0, 0};
+    [luminanceToAlpha setValue:inputImage forKey:@"inputImage"];  
+    [luminanceToAlpha setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputRVector"];
+    [luminanceToAlpha setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputGVector"];
+    [luminanceToAlpha setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputBVector"];
+    [luminanceToAlpha setValue:[CIVector vectorWithValues:alpha count:4] forKey:@"inputAVector"];
+    [luminanceToAlpha setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputBiasVector"];
+    return [luminanceToAlpha valueForKey:@"outputImage"];
+}
+
+static CIImage *applyExpandAlphatoGrayscaleFilter(CIImage *inputImage)
+{
+    CIFilter *alphaToGrayscale = [CIFilter filterWithName:@"CIColorMatrix"];
+    CGFloat zero[4] = {0, 0, 0, 0};
+    [alphaToGrayscale setDefaults];
+    [alphaToGrayscale setValue:inputImage forKey:@"inputImage"];
+    [alphaToGrayscale setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputRVector"];
+    [alphaToGrayscale setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputGVector"];
+    [alphaToGrayscale setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputBVector"];
+    [alphaToGrayscale setValue:[CIVector vectorWithX:0.0 Y:0.0 Z:0.0 W:1.0] forKey:@"inputAVector"];
+    [alphaToGrayscale setValue:[CIVector vectorWithX:1.0 Y:1.0 Z:1.0 W:0.0] forKey:@"inputBiasVector"];
+    return [alphaToGrayscale valueForKey:@"outputImage"];
+}
+
+static CIImage *transformImageIntoGrayscaleMask(CIImage *inputImage)
+{
+    CIFilter *blackBackground = [CIFilter filterWithName:@"CIConstantColorGenerator"];
+    [blackBackground setValue:[CIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0] forKey:@"inputColor"];
+
+    CIFilter *layerOverBlack = [CIFilter filterWithName:@"CISourceOverCompositing"];
+    [layerOverBlack setValue:[blackBackground valueForKey:@"outputImage"] forKey:@"inputBackgroundImage"];  
+    [layerOverBlack setValue:inputImage forKey:@"inputImage"];  
+
+    CIImage *luminanceAlpha = applyLuminanceToAlphaFilter([layerOverBlack valueForKey:@"outputImage"]);
+    CIImage *luminanceAsGrayscale = applyExpandAlphatoGrayscaleFilter(luminanceAlpha);
+    CIImage *alphaAsGrayscale = applyExpandAlphatoGrayscaleFilter(inputImage);
+
+    CIFilter *multipliedGrayscale = [CIFilter filterWithName:@"CIMultiplyCompositing"];
+    [multipliedGrayscale setValue:luminanceAsGrayscale forKey:@"inputBackgroundImage"];  
+    [multipliedGrayscale setValue:alphaAsGrayscale forKey:@"inputImage"];  
+    return [multipliedGrayscale valueForKey:@"outputImage"];
+}
+
+void KCanvasMaskerQuartz::applyMask(const FloatRect& boundingBox) const
+{
+    if (!m_mask)
+        return;
+    // Create grayscale bitmap context
+    int width = m_mask->size().width();
+    int height = m_mask->size().height();
+    void *imageBuffer = fastMalloc(width * height);
+    CGColorSpaceRef grayColorSpace = CGColorSpaceCreateDeviceGray();
+    CGContextRef grayscaleContext = CGBitmapContextCreate(imageBuffer, width, height, 8, width, grayColorSpace, kCGImageAlphaNone);
+    CGColorSpaceRelease(grayColorSpace);
+    CIContext *ciGrayscaleContext = [CIContext contextWithCGContext:grayscaleContext options:nil];
+
+    KCanvasImageQuartz* maskImage = static_cast<KCanvasImageQuartz*>(m_mask);
+    CIImage *grayscaleMask = transformImageIntoGrayscaleMask([CIImage imageWithCGLayer:maskImage->cgLayer()]);
+    [ciGrayscaleContext drawImage:grayscaleMask atPoint:CGPointZero fromRect:CGRectMake(0, 0, width, height)];
+
+    CGImageRef grayscaleImage = CGBitmapContextCreateImage(grayscaleContext);
+    CGContextRef cgContext = static_cast<KRenderingDeviceQuartz*>(renderingDevice())->currentCGContext();
+    CGContextClipToMask(cgContext, CGRectMake(0, 0, width, height), grayscaleImage);
+    
+    CGImageRelease(grayscaleImage);
+    CGContextRelease(grayscaleContext);
+    fastFree(imageBuffer);
+}
+
+}
+
+#endif // SVG_SUPPORT
diff --git a/WebCore/kcanvas/device/quartz/KCanvasResourcesQuartz.h b/WebCore/kcanvas/device/quartz/KCanvasResourcesQuartz.h
index e69de29..a7e9a22 100644
--- a/WebCore/kcanvas/device/quartz/KCanvasResourcesQuartz.h
+++ b/WebCore/kcanvas/device/quartz/KCanvasResourcesQuartz.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef KCanvasResourcesQuartz_h
+#define KCanvasResourcesQuartz_h
+
+#include "KCanvasClipper.h"
+
+#include "KCanvasImage.h"
+#include "RenderSVGContainer.h"
+#include "AffineTransform.h"
+
+typedef struct CGContext *CGContextRef;
+typedef struct CGLayer *CGLayerRef;
+
+namespace WebCore {
+
+class KCanvasClipperQuartz : public KCanvasClipper {
+public:
+    KCanvasClipperQuartz() { }
+    
+    virtual void applyClip(const FloatRect& boundingBox) const;
+};
+
+class KCanvasImageQuartz : public KCanvasImage {
+public:
+    KCanvasImageQuartz() : m_cgLayer(0) { }
+    ~KCanvasImageQuartz();
+    void init(const Image&) { }
+    void init(IntSize size) { m_size = size; }
+    
+    CGLayerRef cgLayer();
+    void setCGLayer(CGLayerRef layer);
+
+    IntSize size() { return m_size; }
+    
+private:
+    IntSize m_size;
+    CGLayerRef m_cgLayer;
+};
+
+}
+
+#endif
diff --git a/WebCore/kcanvas/device/quartz/KCanvasResourcesQuartz.mm b/WebCore/kcanvas/device/quartz/KCanvasResourcesQuartz.mm
index e69de29..4553fc7 100644
--- a/WebCore/kcanvas/device/quartz/KCanvasResourcesQuartz.mm
+++ b/WebCore/kcanvas/device/quartz/KCanvasResourcesQuartz.mm
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
+ *               2005 Alexander Kellett <lypanov@kde.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+
+#include "config.h"
+#ifdef SVG_SUPPORT
+#import "KCanvasResourcesQuartz.h"
+
+#import "GraphicsContext.h"
+#import "KCanvasFilterQuartz.h"
+#import "KCanvasMaskerQuartz.h"
+#import "KRenderingDeviceQuartz.h"
+#import "QuartzSupport.h"
+
+namespace WebCore {
+
+void KCanvasClipperQuartz::applyClip(const FloatRect& boundingBox) const
+{
+    KRenderingDeviceContext* context = renderingDevice()->currentContext();
+    CGContextRef cgContext = static_cast<KRenderingDeviceContextQuartz*>(context)->cgContext();
+    if (m_clipData.count() < 1)
+        return;
+
+    BOOL heterogenousClipRules = NO;
+    WindRule clipRule = m_clipData[0].windRule();
+
+    context->clearPath();
+
+    CGAffineTransform bboxTransform = CGAffineTransformMakeMapBetweenRects(CGRectMake(0,0,1,1), CGRect(boundingBox));
+
+    for (unsigned x = 0; x < m_clipData.count(); x++) {
+        KCClipData data = m_clipData[x];
+        if (data.windRule() != clipRule)
+            heterogenousClipRules = YES;
+        
+        CGPathRef clipPath = data.path.platformPath();
+
+        if (data.bboxUnits) {
+            CGMutablePathRef transformedPath = CGPathCreateMutable();
+            CGPathAddPath(transformedPath, &bboxTransform, clipPath);
+            CGContextAddPath(cgContext, transformedPath);
+            CGPathRelease(transformedPath);
+        } else
+            CGContextAddPath(cgContext, clipPath);
+    }
+
+    if (m_clipData.count()) {
+        // FIXME!
+        // We don't currently allow for heterogenous clip rules.
+        // we would have to detect such, draw to a mask, and then clip
+        // to that mask                
+        if (!CGContextIsPathEmpty(cgContext)) {
+            if (clipRule == RULE_EVENODD)
+                CGContextEOClip(cgContext);
+            else
+                CGContextClip(cgContext);
+        }
+    }
+}
+
+KCanvasImageQuartz::~KCanvasImageQuartz()
+{
+    CGLayerRelease(m_cgLayer);
+}
+
+CGLayerRef KCanvasImageQuartz::cgLayer()
+{
+    return m_cgLayer;
+}
+
+void KCanvasImageQuartz::setCGLayer(CGLayerRef layer)
+{
+    if (m_cgLayer != layer) {
+        CGLayerRelease(m_cgLayer);
+        m_cgLayer = CGLayerRetain(layer);
+    }
+}
+
+}
+#endif // SVG_SUPPORT
diff --git a/WebCore/kcanvas/device/quartz/KRenderingDeviceQuartz.h b/WebCore/kcanvas/device/quartz/KRenderingDeviceQuartz.h
index 33e6754..b53d4ba 100644
--- a/WebCore/kcanvas/device/quartz/KRenderingDeviceQuartz.h
+++ b/WebCore/kcanvas/device/quartz/KRenderingDeviceQuartz.h
@@ -65,11 +65,11 @@
     // context management.
     KRenderingDeviceContextQuartz* quartzContext() const;
     CGContextRef currentCGContext() const;
-    virtual KRenderingDeviceContext* contextForImage(SVGResourceImage*) const;
+    virtual KRenderingDeviceContext* contextForImage(KCanvasImage*) const;
 
     // Resource creation
-    virtual PassRefPtr<SVGResource> createResource(const SVGResourceType&) const;
-    virtual PassRefPtr<KRenderingPaintServer> createPaintServer(const KCPaintServerType&) const;
+    virtual KCanvasResource *createResource(const KCResourceType&) const;
+    virtual KRenderingPaintServer *createPaintServer(const KCPaintServerType&) const;
     virtual KCanvasFilterEffect *createFilterEffect(const KCFilterEffectType&) const;
     
     // filters (mostly debugging)
diff --git a/WebCore/kcanvas/device/quartz/KRenderingDeviceQuartz.mm b/WebCore/kcanvas/device/quartz/KRenderingDeviceQuartz.mm
index 8b128ec..6b4a34e 100644
--- a/WebCore/kcanvas/device/quartz/KRenderingDeviceQuartz.mm
+++ b/WebCore/kcanvas/device/quartz/KRenderingDeviceQuartz.mm
@@ -25,16 +25,14 @@
  */
 
 #include "config.h"
-
 #ifdef SVG_SUPPORT
 #import "KRenderingDeviceQuartz.h"
 
 #import "GraphicsContext.h"
-#import "SVGResourceClipper.h"
-#import "SVGResourceImage.h"
-#import "SVGResourceMarker.h"
+#include "KCanvasMarker.h"
 #import "KCanvasFilterQuartz.h"
-#import "SVGResourceMasker.h"
+#import "KCanvasMaskerQuartz.h"
+#import "KCanvasResourcesQuartz.h"
 #import "KRenderingPaintServerQuartz.h"
 #import "Logging.h"
 #import "QuartzSupport.h"
@@ -119,15 +117,16 @@
     return quartzContext()->cgContext();
 }
 
-KRenderingDeviceContext* KRenderingDeviceQuartz::contextForImage(SVGResourceImage *image) const
+KRenderingDeviceContext* KRenderingDeviceQuartz::contextForImage(KCanvasImage *image) const
 {
-    CGLayerRef cgLayer = image->cgLayer();
+    KCanvasImageQuartz* quartzImage = static_cast<KCanvasImageQuartz*>(image);
+    CGLayerRef cgLayer = quartzImage->cgLayer();
     if (!cgLayer) {
         // FIXME: we might not get back a layer if this is a loaded image
-        // maybe this logic should go into SVGResourceImage?
+        // maybe this logic should go into KCanvasImage?
         cgLayer = CGLayerCreateWithContext(currentCGContext(), CGSize(image->size() + IntSize(1,1)), NULL);  // FIXME + 1 is a hack
         // FIXME: we should composite the original image onto the layer...
-        image->setCGLayer(cgLayer);
+        quartzImage->setCGLayer(cgLayer);
         CGLayerRelease(cgLayer);
     }
     return new KRenderingDeviceContextQuartz(CGLayerGetContext(cgLayer));
@@ -136,7 +135,7 @@
 #pragma mark -
 #pragma mark Resource Creation
 
-PassRefPtr<KRenderingPaintServer> KRenderingDeviceQuartz::createPaintServer(const KCPaintServerType& type) const
+KRenderingPaintServer *KRenderingDeviceQuartz::createPaintServer(const KCPaintServerType& type) const
 {
     KRenderingPaintServer *newServer = NULL;
     switch(type) {
@@ -156,19 +155,19 @@
     return newServer;
 }
 
-PassRefPtr<SVGResource> KRenderingDeviceQuartz::createResource(const SVGResourceType& type) const
+KCanvasResource *KRenderingDeviceQuartz::createResource(const KCResourceType& type) const
 {
     switch (type) {
     case RS_CLIPPER:
-        return new SVGResourceClipper();
+        return new KCanvasClipperQuartz();
     case RS_MARKER:
-        return new SVGResourceMarker();
+        return new KCanvasMarker();
     case RS_IMAGE:
-        return new SVGResourceImage();
+        return new KCanvasImageQuartz();
     case RS_FILTER:
         return new KCanvasFilterQuartz();
     case RS_MASKER:
-        return new SVGResourceMasker();
+        return new KCanvasMaskerQuartz();
     }
     LOG_ERROR("Failed to create resource of type: %i", type);
     return 0;
diff --git a/WebCore/kcanvas/device/quartz/KRenderingPaintServerGradientQuartz.mm b/WebCore/kcanvas/device/quartz/KRenderingPaintServerGradientQuartz.mm
index bc2931f..93a9588 100644
--- a/WebCore/kcanvas/device/quartz/KRenderingPaintServerGradientQuartz.mm
+++ b/WebCore/kcanvas/device/quartz/KRenderingPaintServerGradientQuartz.mm
@@ -27,14 +27,16 @@
 
 
 #include "config.h"
-
 #ifdef SVG_SUPPORT
 #import "KRenderingPaintServerQuartz.h"
-#import "SVGResourceImage.h"
+
+#import "KCanvasImage.h"
+#import "KCanvasResourcesQuartz.h"
 #import "KRenderingDeviceQuartz.h"
 #import "KRenderingPaintServer.h"
 #import "QuartzSupport.h"
-#import "RenderPath.h"
+#import "RenderObject.h"
+
 #import <wtf/Assertions.h>
 
 namespace WebCore {
@@ -135,6 +137,7 @@
     : m_stopsCache(0)
     , m_stopsCount(0)
     , m_shadingCache(0)
+    , m_maskImage(0)
 {
 }
 
@@ -142,6 +145,7 @@
 {
     delete m_stopsCache;
     CGShadingRelease(m_shadingCache);
+    delete m_maskImage;
 }
 
 void KRenderingPaintServerGradientQuartz::updateQuartzGradientCache(const KRenderingPaintServerGradient *server)
@@ -216,6 +220,9 @@
     if (server->listener()) // this seems like bad design to me, should be in a common baseclass. -- ecs 8/6/05
         server->listener()->resourceNotification();
     
+    delete m_maskImage;
+    m_maskImage = 0;
+
     // FIXME: total const HACK!
     // We need a hook to call this when the gradient gets updated, before drawn.
     if (!m_shadingCache)
@@ -239,12 +246,12 @@
         CGContextSaveGState(context);
         applyStrokeStyleToContext(context, renderStyle, renderObject); // FIXME: this seems like the wrong place for this.
         if (server->isPaintingText()) {
-            m_maskImage = new SVGResourceImage();
+            m_maskImage = static_cast<KCanvasImage*>(quartzDevice->createResource(RS_IMAGE));
             int width  = 2048;
             int height = 2048; // FIXME???
             IntSize size = IntSize(width, height);
             m_maskImage->init(size);
-            KRenderingDeviceContext* maskImageContext = quartzDevice->contextForImage(m_maskImage.get());
+            KRenderingDeviceContext* maskImageContext = quartzDevice->contextForImage(m_maskImage);
             quartzDevice->pushContext(maskImageContext);
             CGContextRef maskContext = static_cast<KRenderingDeviceContextQuartz*>(maskImageContext)->cgContext();
             const_cast<RenderObject*>(renderObject)->style()->setColor(Color(255, 255, 255));
@@ -285,6 +292,7 @@
 void KRenderingPaintServerGradientQuartz::teardown(const KRenderingPaintServerGradient *server, KRenderingDeviceContext* renderingContext, const RenderObject* renderObject, KCPaintTargetType type) const
 { 
     CGShadingRef shading = m_shadingCache;
+    KCanvasImage* maskImage = m_maskImage;
     KRenderingDeviceQuartz* quartzDevice = static_cast<KRenderingDeviceQuartz*>(renderingDevice());
     CGContextRef context = quartzDevice->currentCGContext();
     RenderStyle* renderStyle = renderObject->style();
@@ -307,7 +315,8 @@
             CGColorSpaceRef grayColorSpace = CGColorSpaceCreateDeviceGray();
             CGContextRef grayscaleContext = CGBitmapContextCreate(imageBuffer, width, height, 8, width, grayColorSpace, kCGImageAlphaNone);
             CGColorSpaceRelease(grayColorSpace);
-            CGContextDrawLayerAtPoint(grayscaleContext, CGPointMake(0, 0), m_maskImage->cgLayer());
+            KCanvasImageQuartz* qMaskImage = static_cast<KCanvasImageQuartz*>(maskImage);
+            CGContextDrawLayerAtPoint(grayscaleContext, CGPointMake(0, 0), qMaskImage->cgLayer());
             CGImageRef grayscaleImage = CGBitmapContextCreateImage(grayscaleContext);
             CGContextClipToMask(context, CGRectMake(0, 0, width, height), grayscaleImage);
             CGContextRelease(grayscaleContext);
diff --git a/WebCore/kcanvas/device/quartz/KRenderingPaintServerQuartz.h b/WebCore/kcanvas/device/quartz/KRenderingPaintServerQuartz.h
index 1801990..891f402 100644
--- a/WebCore/kcanvas/device/quartz/KRenderingPaintServerQuartz.h
+++ b/WebCore/kcanvas/device/quartz/KRenderingPaintServerQuartz.h
@@ -31,7 +31,7 @@
 
 namespace WebCore {
 
-class SVGResourceImage;
+class KCanvasImage;
 
 class KRenderingPaintServerQuartzHelper {
 public:
@@ -93,7 +93,7 @@
 protected:
     void invalidateCaches();
     CGShadingRef m_shadingCache;
-    mutable RefPtr<SVGResourceImage> m_maskImage;
+    mutable KCanvasImage *m_maskImage;
 };
 
 class KRenderingPaintServerLinearGradientQuartz : public KRenderingPaintServerGradientQuartz,
diff --git a/WebCore/kcanvas/device/quartz/KRenderingPaintServerQuartz.mm b/WebCore/kcanvas/device/quartz/KRenderingPaintServerQuartz.mm
index fb6844a..7a2d243 100644
--- a/WebCore/kcanvas/device/quartz/KRenderingPaintServerQuartz.mm
+++ b/WebCore/kcanvas/device/quartz/KRenderingPaintServerQuartz.mm
@@ -27,12 +27,10 @@
 
 
 #include "config.h"
-
 #ifdef SVG_SUPPORT
-#import "SVGResourceImage.h"
 #import "KRenderingPaintServerQuartz.h"
-#import "RenderPath.h"
 #import "QuartzSupport.h"
+#import "KCanvasResourcesQuartz.h"
 #import "KRenderingDeviceQuartz.h"
 
 #import "KCanvasRenderingStyle.h"
@@ -135,7 +133,7 @@
 
 void patternCallback(void *info, CGContextRef context)
 {
-    CGLayerRef layer = reinterpret_cast<SVGResourceImage*>(info)->cgLayer();
+    CGLayerRef layer = reinterpret_cast<KCanvasImageQuartz*>(info)->cgLayer();
     CGContextDrawLayerAtPoint(context, CGPointZero, layer);
 }
 
@@ -157,7 +155,7 @@
     KRenderingDeviceContextQuartz* quartzContext = static_cast<KRenderingDeviceContextQuartz*>(renderingContext);
     CGContextRef context = quartzContext->cgContext();
 
-    RefPtr<SVGResourceImage> cell = tile();
+    KCanvasImage* cell = tile();
     if (!cell)
         return false;
 
diff --git a/WebCore/kcanvas/device/quartz/QuartzSupport.mm b/WebCore/kcanvas/device/quartz/QuartzSupport.mm
index 55f3673..a9893cc 100644
--- a/WebCore/kcanvas/device/quartz/QuartzSupport.mm
+++ b/WebCore/kcanvas/device/quartz/QuartzSupport.mm
@@ -30,8 +30,8 @@
 #import "QuartzSupport.h"
 
 #import "GraphicsContext.h"
+#import "KCanvasResourcesQuartz.h"
 #import "KCanvasRenderingStyle.h"
-#import "RenderStyle.h"
 #import "wtf/Assertions.h"
 
 #import <QuartzCore/CoreImage.h>