[webkit-changes] cvs commit: WebCore/ksvg2/svg SVGMaskElementImpl.cpp SVGMaskElementImpl.h svgtags.in

Eric eseidel at opensource.apple.com
Fri Jan 6 01:10:05 PST 2006


eseidel     06/01/06 01:10:05

  Modified:    .        ChangeLog
               WebCore.xcodeproj project.pbxproj
               kcanvas  KCanvasResources.cpp KCanvasResources.h
               kcanvas/device/quartz KCanvasItemQuartz.mm
                        KCanvasResourcesQuartz.mm KRenderingDeviceQuartz.mm
                        KRenderingPaintServerGradientQuartz.mm
                        QuartzSupport.h QuartzSupport.mm
               ksvg2/css SVGCSSStyleSelector.cpp SVGRenderStyle.cpp
                        SVGRenderStyle.h SVGRenderStyleDefs.cpp
                        SVGRenderStyleDefs.h
               ksvg2/ecma Ecma.cpp
               ksvg2/svg svgtags.in
  Added:       kcanvas/device/quartz KCanvasMaskerQuartz.h
                        KCanvasMaskerQuartz.mm
               ksvg2/svg SVGMaskElementImpl.cpp SVGMaskElementImpl.h
  Log:
  Bug #: 5969
  Submitted by: Alexander Kellett  <lypanov at kde.org>
  Reviewed by: eseidel
          Basic support for <mask> tag.
          http://bugzilla.opendarwin.org/show_bug.cgi?id=5969
          Still missing attribute support for: maskUnits, maskContentUnits.
  
          Mask pixel tests do not work in DumpRenderTree due to:
          http://bugzilla.opendarwin.org/show_bug.cgi?id=6327
          Added test cases anyway.
  
          This also tickles a (known) gradient update issue:
          http://bugzilla.opendarwin.org/show_bug.cgi?id=6052
  
          * WebCore.xcodeproj/project.pbxproj: added Mask files
          * kcanvas/KCanvasResources.cpp:
          (KCanvasMasker::KCanvasMasker): added.
          (KCanvasMasker::~KCanvasMasker): added.
          (KCanvasMasker::setMask): added.
          (KCanvasMasker::externalRepresentation): added.
          (getMaskerById): added.
          * kcanvas/KCanvasResources.h:
          (KCanvasResource::isMasker): added.
          (KCanvasMasker::isMasker): added.
          (KCanvasMasker::mask): added.
          * kcanvas/device/quartz/KCanvasItemQuartz.mm:
          (KCanvasItemQuartz::paint): added mask support
          * kcanvas/device/quartz/KCanvasMaskerQuartz.h: Added.
          (KCanvasMaskerQuartz::KCanvasMaskerQuartz): added.
          * kcanvas/device/quartz/KCanvasMaskerQuartz.mm: Added.
          (applyLuminanceToAlphaFilter): added.
          (applyExpandAlphatoGrayscaleFilter): added.
          (transformImageIntoGrayscaleMask): added.
          (KCanvasMaskerQuartz::applyMask): added.
          * kcanvas/device/quartz/KCanvasResourcesQuartz.mm:
          (KCanvasContainerQuartz::paint): added mask support.
          * kcanvas/device/quartz/KRenderingDeviceQuartz.mm:
          (KRenderingDeviceQuartz::createResource): added mask support.
          * kcanvas/device/quartz/KRenderingPaintServerGradientQuartz.mm:
          (KRenderingPaintServerRadialGradientQuartz::draw):
          * kcanvas/device/quartz/QuartzSupport.h:
          * kcanvas/device/quartz/QuartzSupport.mm:
          (debugDumpCGImageToFile): added, debug only.
          (debugDumpCGLayerToFile): added, debug only.
          (debugDumpCIImageToFile): added, debug only.
          * ksvg2/css/SVGCSSStyleSelector.cpp:
          (KDOM::CSSStyleSelector::applySVGProperty): added mask support.
          * ksvg2/css/SVGRenderStyle.cpp:
          (SVGRenderStyle::SVGRenderStyle): added mask support.
          (SVGRenderStyle::operator==): added mask support.
          * ksvg2/css/SVGRenderStyle.h:
          * ksvg2/css/SVGRenderStyleDefs.cpp:
          (StyleMaskData::StyleMaskData): added mask support.
          (StyleMaskData::operator==): added mask support.
          * ksvg2/css/SVGRenderStyleDefs.h:
          (KSVG::StyleMaskData::operator!=): added mask support.
          * ksvg2/ecma/Ecma.cpp:
          (Ecma::inheritedGetDOMNode): added mask support.
          * ksvg2/svg/SVGMaskElementImpl.cpp: Added.
          (KSVG::SVGMaskElementImpl::SVGMaskElementImpl): added.
          (KSVG::SVGMaskElementImpl::~SVGMaskElementImpl): added.
          (KSVG::SVGMaskElementImpl::x): added.
          (KSVG::SVGMaskElementImpl::y): added.
          (KSVG::SVGMaskElementImpl::width): added.
          (KSVG::SVGMaskElementImpl::height): added.
          (KSVG::SVGMaskElementImpl::attributeChanged): added.
          (KSVG::SVGMaskElementImpl::childrenChanged): added.
          (KSVG::SVGMaskElementImpl::parseMappedAttribute): added.
          (KSVG::SVGMaskElementImpl::drawMaskerContent): added.
          (KSVG::SVGMaskElementImpl::createRenderer): added.
          (KSVG::SVGMaskElementImpl::canvasResource): added.
          * ksvg2/svg/SVGMaskElementImpl.h: Added.
          (KSVG::SVGMaskElementImpl::isValid): added.
          (KSVG::SVGMaskElementImpl::rendererIsNeeded): added.
          * ksvg2/svg/svgtags.in: added <mask> support.
  
  Revision  Changes    Path
  1.91      +77 -0     WebCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/WebCore/ChangeLog,v
  retrieving revision 1.90
  retrieving revision 1.91
  diff -u -r1.90 -r1.91
  --- ChangeLog	5 Jan 2006 17:44:46 -0000	1.90
  +++ ChangeLog	6 Jan 2006 09:09:57 -0000	1.91
  @@ -1,3 +1,80 @@
  +2006-01-06  Alexander Kellett  <lypanov at kde.org>
  +
  +        Reviewed by eseidel.
  +
  +        Basic support for <mask> tag.
  +        http://bugzilla.opendarwin.org/show_bug.cgi?id=5969
  +        Still missing attribute support for: maskUnits, maskContentUnits.
  +        
  +        Mask pixel tests do not work in DumpRenderTree due to:
  +        http://bugzilla.opendarwin.org/show_bug.cgi?id=6327
  +        Added test cases anyway.
  +
  +        This also tickles a (known) gradient update issue:
  +        http://bugzilla.opendarwin.org/show_bug.cgi?id=6052
  +
  +        * WebCore.xcodeproj/project.pbxproj: added Mask files
  +        * kcanvas/KCanvasResources.cpp:
  +        (KCanvasMasker::KCanvasMasker): added.
  +        (KCanvasMasker::~KCanvasMasker): added.
  +        (KCanvasMasker::setMask): added.
  +        (KCanvasMasker::externalRepresentation): added.
  +        (getMaskerById): added.
  +        * kcanvas/KCanvasResources.h:
  +        (KCanvasResource::isMasker): added.
  +        (KCanvasMasker::isMasker): added.
  +        (KCanvasMasker::mask): added.
  +        * kcanvas/device/quartz/KCanvasItemQuartz.mm:
  +        (KCanvasItemQuartz::paint): added mask support
  +        * kcanvas/device/quartz/KCanvasMaskerQuartz.h: Added.
  +        (KCanvasMaskerQuartz::KCanvasMaskerQuartz): added.
  +        * kcanvas/device/quartz/KCanvasMaskerQuartz.mm: Added.
  +        (applyLuminanceToAlphaFilter): added.
  +        (applyExpandAlphatoGrayscaleFilter): added.
  +        (transformImageIntoGrayscaleMask): added.
  +        (KCanvasMaskerQuartz::applyMask): added.
  +        * kcanvas/device/quartz/KCanvasResourcesQuartz.mm:
  +        (KCanvasContainerQuartz::paint): added mask support.
  +        * kcanvas/device/quartz/KRenderingDeviceQuartz.mm:
  +        (KRenderingDeviceQuartz::createResource): added mask support.
  +        * kcanvas/device/quartz/KRenderingPaintServerGradientQuartz.mm:
  +        (KRenderingPaintServerRadialGradientQuartz::draw):
  +        * kcanvas/device/quartz/QuartzSupport.h:
  +        * kcanvas/device/quartz/QuartzSupport.mm:
  +        (debugDumpCGImageToFile): added, debug only.
  +        (debugDumpCGLayerToFile): added, debug only.
  +        (debugDumpCIImageToFile): added, debug only.
  +        * ksvg2/css/SVGCSSStyleSelector.cpp:
  +        (KDOM::CSSStyleSelector::applySVGProperty): added mask support.
  +        * ksvg2/css/SVGRenderStyle.cpp:
  +        (SVGRenderStyle::SVGRenderStyle): added mask support.
  +        (SVGRenderStyle::operator==): added mask support.
  +        * ksvg2/css/SVGRenderStyle.h:
  +        * ksvg2/css/SVGRenderStyleDefs.cpp:
  +        (StyleMaskData::StyleMaskData): added mask support.
  +        (StyleMaskData::operator==): added mask support.
  +        * ksvg2/css/SVGRenderStyleDefs.h:
  +        (KSVG::StyleMaskData::operator!=): added mask support.
  +        * ksvg2/ecma/Ecma.cpp:
  +        (Ecma::inheritedGetDOMNode): added mask support.
  +        * ksvg2/svg/SVGMaskElementImpl.cpp: Added.
  +        (KSVG::SVGMaskElementImpl::SVGMaskElementImpl): added.
  +        (KSVG::SVGMaskElementImpl::~SVGMaskElementImpl): added.
  +        (KSVG::SVGMaskElementImpl::x): added.
  +        (KSVG::SVGMaskElementImpl::y): added.
  +        (KSVG::SVGMaskElementImpl::width): added.
  +        (KSVG::SVGMaskElementImpl::height): added.
  +        (KSVG::SVGMaskElementImpl::attributeChanged): added.
  +        (KSVG::SVGMaskElementImpl::childrenChanged): added.
  +        (KSVG::SVGMaskElementImpl::parseMappedAttribute): added.
  +        (KSVG::SVGMaskElementImpl::drawMaskerContent): added.
  +        (KSVG::SVGMaskElementImpl::createRenderer): added.
  +        (KSVG::SVGMaskElementImpl::canvasResource): added.
  +        * ksvg2/svg/SVGMaskElementImpl.h: Added.
  +        (KSVG::SVGMaskElementImpl::isValid): added.
  +        (KSVG::SVGMaskElementImpl::rendererIsNeeded): added.
  +        * ksvg2/svg/svgtags.in: added <mask> support.
  +
   2006-01-04  Maciej Stachowiak  <mjs at apple.com>
   
           Reviewed by Darin.
  
  
  
  1.65      +16 -4     WebCore/WebCore.xcodeproj/project.pbxproj
  
  Index: project.pbxproj
  ===================================================================
  RCS file: /cvs/root/WebCore/WebCore.xcodeproj/project.pbxproj,v
  retrieving revision 1.64
  retrieving revision 1.65
  diff -u -r1.64 -r1.65
  --- project.pbxproj	5 Jan 2006 06:41:21 -0000	1.64
  +++ project.pbxproj	6 Jan 2006 09:09:58 -0000	1.65
  @@ -15,7 +15,6 @@
   		4756536809652C5D00BD9F29 /* KWQRectF.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4756536209652C5D00BD9F29 /* KWQRectF.mm */; };
   		4756536909652C5D00BD9F29 /* KWQSizeF.h in Headers */ = {isa = PBXBuildFile; fileRef = 4756536309652C5D00BD9F29 /* KWQSizeF.h */; };
   		4756536A09652C5D00BD9F29 /* KWQSizeF.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4756536409652C5D00BD9F29 /* KWQSizeF.mm */; };
  -		475658CB096A728100BD9F29 /* KCanvasHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 475658CA096A728100BD9F29 /* KCanvasHelper.h */; };
   		550A0BC9085F6039007353D6 /* dom_qname.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 550A0BC7085F6039007353D6 /* dom_qname.cpp */; };
   		550A0BCA085F6039007353D6 /* dom_qname.h in Headers */ = {isa = PBXBuildFile; fileRef = 550A0BC8085F6039007353D6 /* dom_qname.h */; };
   		550A0BCD085F604D007353D6 /* htmlnames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 550A0BCB085F604D007353D6 /* htmlnames.cpp */; };
  @@ -598,6 +597,10 @@
   		93F19B1608245E59001E9ABC /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8216299029F4FB501000131 /* JavaScriptCore.framework */; };
   		93F19B1708245E59001E9ABC /* libicucore.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 93F1D31A0558CC5C00821BC0 /* libicucore.dylib */; };
   		93F19B1808245E59001E9ABC /* libxslt.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 840633070731A77200DB1FD1 /* libxslt.dylib */; };
  +		A81655D4096BBEAC00601058 /* KCanvasMaskerQuartz.h in Headers */ = {isa = PBXBuildFile; fileRef = A81655D2096BBEAC00601058 /* KCanvasMaskerQuartz.h */; };
  +		A81655D5096BBEAC00601058 /* KCanvasMaskerQuartz.mm in Sources */ = {isa = PBXBuildFile; fileRef = A81655D3096BBEAC00601058 /* KCanvasMaskerQuartz.mm */; };
  +		A81655E4096BC13900601058 /* SVGMaskElementImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A81655E2096BC13900601058 /* SVGMaskElementImpl.cpp */; };
  +		A81655E5096BC13900601058 /* SVGMaskElementImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = A81655E3096BC13900601058 /* SVGMaskElementImpl.h */; };
   		A83C81A3091189B9009BF4A7 /* XSLTProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = A83C819F091189B9009BF4A7 /* XSLTProcessor.h */; };
   		A83C81A4091189B9009BF4A7 /* XSLTProcessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A83C81A0091189B9009BF4A7 /* XSLTProcessor.cpp */; };
   		A88AD1190952480A001DD196 /* css_base.h in Headers */ = {isa = PBXBuildFile; fileRef = BC8F618B040594BA00A80004 /* css_base.h */; };
  @@ -1635,7 +1638,6 @@
   		4756536209652C5D00BD9F29 /* KWQRectF.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = KWQRectF.mm; sourceTree = "<group>"; };
   		4756536309652C5D00BD9F29 /* KWQSizeF.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = KWQSizeF.h; sourceTree = "<group>"; };
   		4756536409652C5D00BD9F29 /* KWQSizeF.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = KWQSizeF.mm; sourceTree = "<group>"; };
  -		475658CA096A728100BD9F29 /* KCanvasHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KCanvasHelper.h; sourceTree = "<group>"; };
   		4758C44308C5F217009BAF05 /* KCanvasPath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KCanvasPath.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
   		51111AC007BD812C00B7162C /* DOMUtility.mm */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMUtility.mm; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
   		5150C2A10702629000AF642C /* WebDashboardRegion.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebDashboardRegion.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
  @@ -1912,6 +1914,10 @@
   		A8122CF208D564B100844FA3 /* SVGViewElement.idl */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = text; path = SVGViewElement.idl; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
   		A8122CF308D564B100844FA3 /* SVGZoomAndPan.idl */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = text; path = SVGZoomAndPan.idl; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
   		A8122CF408D564B100844FA3 /* SVGZoomEvent.idl */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = text; path = SVGZoomEvent.idl; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
  +		A81655D2096BBEAC00601058 /* KCanvasMaskerQuartz.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = KCanvasMaskerQuartz.h; sourceTree = "<group>"; };
  +		A81655D3096BBEAC00601058 /* KCanvasMaskerQuartz.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = KCanvasMaskerQuartz.mm; sourceTree = "<group>"; };
  +		A81655E2096BC13900601058 /* SVGMaskElementImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGMaskElementImpl.cpp; sourceTree = "<group>"; };
  +		A81655E3096BC13900601058 /* SVGMaskElementImpl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGMaskElementImpl.h; sourceTree = "<group>"; };
   		A82336B1094C23BE0085A296 /* DataRef.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = DataRef.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
   		A82FC33B08CBB07C00EFEE23 /* SVGCursorElementImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = SVGCursorElementImpl.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
   		A82FC33C08CBB07C00EFEE23 /* SVGCursorElementImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGCursorElementImpl.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
  @@ -3240,6 +3246,8 @@
   				A8C0F881089701F300BA5114 /* SVGLocatableImpl.h */,
   				A8C0F882089701F300BA5114 /* SVGMarkerElementImpl.cpp */,
   				A8C0F883089701F300BA5114 /* SVGMarkerElementImpl.h */,
  +				A81655E2096BC13900601058 /* SVGMaskElementImpl.cpp */,
  +				A81655E3096BC13900601058 /* SVGMaskElementImpl.h */,
   				A8C0F884089701F300BA5114 /* SVGMatrixImpl.cpp */,
   				A8C0F885089701F300BA5114 /* SVGMatrixImpl.h */,
   				A8C0F886089701F300BA5114 /* SVGNumberImpl.cpp */,
  @@ -3373,7 +3381,6 @@
   				A8C0FB8A089701F800BA5114 /* KCanvasResources.cpp */,
   				A8C0FB8B089701F800BA5114 /* KCanvasResources.h */,
   				A8C0FB8C089701F800BA5114 /* KCanvasTypes.h */,
  -				475658CA096A728100BD9F29 /* KCanvasHelper.h */,
   				A810E39308A4160F00333D98 /* KCanvasTreeDebug.h */,
   				A810E39408A4160F00333D98 /* KCanvasTreeDebug.cpp */,
   			);
  @@ -3420,6 +3427,8 @@
   				A8C0FB75089701F800BA5114 /* KRenderingPaintServerQuartz.mm */,
   				A8C0FB76089701F800BA5114 /* QuartzSupport.h */,
   				A8C0FB77089701F800BA5114 /* QuartzSupport.mm */,
  +				A81655D2096BBEAC00601058 /* KCanvasMaskerQuartz.h */,
  +				A81655D3096BBEAC00601058 /* KCanvasMaskerQuartz.mm */,
   				A8ABC99909445EC00013945F /* KCanvasPathQuartz.h */,
   				A8ABC99A09445EC00013945F /* KCanvasPathQuartz.mm */,
   			);
  @@ -4729,7 +4738,8 @@
   				4756536509652C5D00BD9F29 /* KWQPointF.h in Headers */,
   				4756536709652C5D00BD9F29 /* KWQRectF.h in Headers */,
   				4756536909652C5D00BD9F29 /* KWQSizeF.h in Headers */,
  -				475658CB096A728100BD9F29 /* KCanvasHelper.h in Headers */,
  +				A81655D4096BBEAC00601058 /* KCanvasMaskerQuartz.h in Headers */,
  +				A81655E5096BC13900601058 /* SVGMaskElementImpl.h in Headers */,
   			);
   			runOnlyForDeploymentPostprocessing = 0;
   		};
  @@ -6572,6 +6582,8 @@
   				4756536609652C5D00BD9F29 /* KWQPointF.mm in Sources */,
   				4756536809652C5D00BD9F29 /* KWQRectF.mm in Sources */,
   				4756536A09652C5D00BD9F29 /* KWQSizeF.mm in Sources */,
  +				A81655D5096BBEAC00601058 /* KCanvasMaskerQuartz.mm in Sources */,
  +				A81655E4096BC13900601058 /* SVGMaskElementImpl.cpp in Sources */,
   			);
   			runOnlyForDeploymentPostprocessing = 0;
   		};
  
  
  
  1.14      +33 -0     WebCore/kcanvas/KCanvasResources.cpp
  
  Index: KCanvasResources.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/KCanvasResources.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- KCanvasResources.cpp	4 Jan 2006 08:20:19 -0000	1.13
  +++ KCanvasResources.cpp	6 Jan 2006 09:10:00 -0000	1.14
  @@ -26,6 +26,7 @@
   
   #include "kcanvas/KCanvas.h"
   #include "kcanvas/RenderPath.h"
  +#include "kcanvas/KCanvasImage.h"
   #include "KCanvasMatrix.h"
   #include "KCanvasContainer.h"
   #include "KCanvasResources.h"
  @@ -119,6 +120,30 @@
       return ts;
   }
   
  +// KCanvasMasker
  +KCanvasMasker::KCanvasMasker() : KCanvasResource(), m_mask(0)
  +{
  +}
  +
  +KCanvasMasker::~KCanvasMasker()
  +{
  +    delete m_mask;
  +}
  +
  +void KCanvasMasker::setMask(KCanvasImage *mask)
  +{
  +    if (m_mask != mask) {
  +        delete m_mask;
  +        m_mask = mask;
  +    }
  +}
  +
  +QTextStream& KCanvasMasker::externalRepresentation(QTextStream &ts) const
  +{
  +    ts << "[type=MASKER]";
  +    return ts;
  +}
  +
   // KCanvasMarker
   KCanvasMarker::KCanvasMarker(khtml::RenderObject *marker) : KCanvasResource()
   {
  @@ -264,6 +289,14 @@
       return 0;
   }
   
  +KCanvasMasker *getMaskerById(KDOM::DocumentImpl *document, const KDOM::DOMString &id)
  +{
  +    KCanvasResource *resource = getResourceById(document, id);
  +    if (resource && resource->isMasker())
  +        return static_cast<KCanvasMasker *>(resource);
  +    return 0;
  +}
  +
   KRenderingPaintServer *getPaintServerById(KDOM::DocumentImpl *document, const KDOM::DOMString &id)
   {
       KCanvasResource *resource = getResourceById(document, id);
  
  
  
  1.13      +21 -1     WebCore/kcanvas/KCanvasResources.h
  
  Index: KCanvasResources.h
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/KCanvasResources.h,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- KCanvasResources.h	4 Jan 2006 08:20:20 -0000	1.12
  +++ KCanvasResources.h	6 Jan 2006 09:10:00 -0000	1.13
  @@ -39,7 +39,8 @@
       RS_CLIPPER = 0,
       RS_MARKER = 1,
       RS_IMAGE = 2,
  -    RS_FILTER = 3
  +    RS_FILTER = 3,
  +    RS_MASKER = 4
   } KCResourceType;
   
   class KCanvasMatrix;
  @@ -63,6 +64,7 @@
       virtual bool isFilter() const { return false; }
       virtual bool isClipper() const { return false; }
       virtual bool isMarker() const { return false; }
  +    virtual bool isMasker() const { return false; }
       
       virtual QTextStream& externalRepresentation(QTextStream &) const; 
   private:
  @@ -88,6 +90,23 @@
       KCClipDataList m_clipData;
   };
   
  +class KCanvasImage;
  +
  +class KCanvasMasker : public KCanvasResource
  +{
  +public:
  +    KCanvasMasker();
  +    virtual ~KCanvasMasker();
  +    
  +    virtual bool isMasker() const { return true; }
  +    void setMask(KCanvasImage *mask);
  +    KCanvasImage *mask() const { return m_mask; }
  +
  +    QTextStream& externalRepresentation(QTextStream &) const; 
  +protected:
  +    KCanvasImage *m_mask;
  +};
  +
   class KCanvasMarker : public KCanvasResource
   {
   public:
  @@ -129,6 +148,7 @@
   KCanvasResource *getResourceById(KDOM::DocumentImpl *document, const KDOM::DOMString &id);
   KCanvasMarker *getMarkerById(KDOM::DocumentImpl *document, const KDOM::DOMString &id);
   KCanvasClipper *getClipperById(KDOM::DocumentImpl *document, const KDOM::DOMString &id);
  +KCanvasMasker *getMaskerById(KDOM::DocumentImpl *document, const KDOM::DOMString &id);
   KRenderingPaintServer *getPaintServerById(KDOM::DocumentImpl *document, const KDOM::DOMString &id);
   
   #endif
  
  
  
  1.17      +6 -0      WebCore/kcanvas/device/quartz/KCanvasItemQuartz.mm
  
  Index: KCanvasItemQuartz.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/device/quartz/KCanvasItemQuartz.mm,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- KCanvasItemQuartz.mm	4 Jan 2006 08:20:24 -0000	1.16
  +++ KCanvasItemQuartz.mm	6 Jan 2006 09:10:01 -0000	1.17
  @@ -39,6 +39,7 @@
   #import "KRenderingDeviceQuartz.h"
   #import "KCanvasFilterQuartz.h"
   #import "KCanvasResourcesQuartz.h"
  +#import "KCanvasMaskerQuartz.h"
   #import "QuartzSupport.h"
   
   #import "SVGRenderStyle.h"
  @@ -222,6 +223,11 @@
       if (clipper)
           clipper->applyClip(context, CGRect(relativeBBox(true)));
   
  +    QString maskname = style()->svgStyle()->maskElement().mid(1);
  +    KCanvasMaskerQuartz *masker = static_cast<KCanvasMaskerQuartz *>(getMaskerById(document(), maskname));
  +    if (masker)
  +        masker->applyMask(context, CGRect(relativeBBox(true)));
  +
       CGContextBeginPath(context);
   
       KCanvasCommonArgs args = commonArgs();
  
  
  
  1.15      +8 -2      WebCore/kcanvas/device/quartz/KCanvasResourcesQuartz.mm
  
  Index: KCanvasResourcesQuartz.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/device/quartz/KCanvasResourcesQuartz.mm,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- KCanvasResourcesQuartz.mm	4 Jan 2006 08:20:25 -0000	1.14
  +++ KCanvasResourcesQuartz.mm	6 Jan 2006 09:10:01 -0000	1.15
  @@ -1,5 +1,6 @@
   /*
    * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
  + *               2005 Alexander Kellett <lypanov at kde.org>
    *
    * Redistribution and use in source and binary forms, with or without
    * modification, are permitted provided that the following conditions
  @@ -33,6 +34,7 @@
   
   #import "KCanvasPathQuartz.h"
   #import "KRenderingDeviceQuartz.h"
  +#import "KCanvasMaskerQuartz.h"
   #import "KCanvasFilterQuartz.h"
   #import "QuartzSupport.h"
   
  @@ -115,7 +117,12 @@
       KCanvasClipperQuartz *clipper = static_cast<KCanvasClipperQuartz *>(getClipperById(document(), clipname));
       if (clipper)
           clipper->applyClip(context, CGRect(relativeBBox(true)));
  -    
  +
  +    QString maskname = style()->svgStyle()->maskElement().mid(1);
  +    KCanvasMaskerQuartz *masker = static_cast<KCanvasMaskerQuartz *>(getMaskerById(document(), maskname));
  +    if (masker)
  +        masker->applyMask(context, CGRect(relativeBBox(true)));
  +
       float opacity = style()->opacity();
       if (opacity < 1.0f)
           paintInfo.p->beginTransparencyLayer(opacity);
  @@ -231,7 +238,6 @@
       }
   }
   
  -
   KCanvasImageQuartz::~KCanvasImageQuartz()
   {
   	CGLayerRelease(m_cgLayer);
  
  
  
  1.11      +3 -0      WebCore/kcanvas/device/quartz/KRenderingDeviceQuartz.mm
  
  Index: KRenderingDeviceQuartz.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/device/quartz/KRenderingDeviceQuartz.mm,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- KRenderingDeviceQuartz.mm	30 Dec 2005 09:48:55 -0000	1.10
  +++ KRenderingDeviceQuartz.mm	6 Jan 2006 09:10:01 -0000	1.11
  @@ -27,6 +27,7 @@
   #include "config.h"
   #import "KCanvasPathQuartz.h"
   #import "KRenderingDeviceQuartz.h"
  +#import "KCanvasMaskerQuartz.h"
   #import "KCanvasResourcesQuartz.h"
   #import "KCanvasFilterQuartz.h"
   #import "KRenderingPaintServerQuartz.h"
  @@ -216,6 +217,8 @@
           return new KCanvasImageQuartz();
       case RS_FILTER:
           return new KCanvasFilterQuartz();
  +    case RS_MASKER:
  +        return new KCanvasMaskerQuartz();
       }
       ERROR("Failed to create resource of type: %i", type);
       return 0;
  
  
  
  1.11      +1 -1      WebCore/kcanvas/device/quartz/KRenderingPaintServerGradientQuartz.mm
  
  Index: KRenderingPaintServerGradientQuartz.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/device/quartz/KRenderingPaintServerGradientQuartz.mm,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- KRenderingPaintServerGradientQuartz.mm	30 Dec 2005 09:48:55 -0000	1.10
  +++ KRenderingPaintServerGradientQuartz.mm	6 Jan 2006 09:10:01 -0000	1.11
  @@ -312,4 +312,4 @@
           const_cast<KRenderingPaintServerRadialGradientQuartz *>(this)->updateQuartzGradientCache(this);
       
       drawShadingWithStyle(this, m_shadingCache, args.canvasStyle(), type);
  -}
  \ No newline at end of file
  +}
  
  
  
  1.6       +6 -0      WebCore/kcanvas/device/quartz/QuartzSupport.h
  
  Index: QuartzSupport.h
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/device/quartz/QuartzSupport.h,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- QuartzSupport.h	6 Dec 2005 01:23:22 -0000	1.5
  +++ QuartzSupport.h	6 Jan 2006 09:10:01 -0000	1.6
  @@ -31,6 +31,12 @@
       class SVGRenderStyle;
   }
   
  +#ifndef NDEBUG
  +void debugDumpCGImageToFile(NSString *filename, CGImageRef image, int width, int height);
  +void debugDumpCGImageToFile(NSString *filename, CGImageRef image, int width, int height);
  +void debugDumpCIImageToFile(NSString *filename, CIImage *ciImage, int width, int height);
  +#endif
  +
   CFStringRef CFStringFromCGPath(CGPathRef path);
   CFStringRef CFStringFromCGAffineTransform(CGAffineTransform t);
   CGAffineTransform CGAffineTransformMakeMapBetweenRects(CGRect source, CGRect dest);
  
  
  
  1.7       +40 -0     WebCore/kcanvas/device/quartz/QuartzSupport.mm
  
  Index: QuartzSupport.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/device/quartz/QuartzSupport.mm,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- QuartzSupport.mm	6 Dec 2005 01:23:22 -0000	1.6
  +++ QuartzSupport.mm	6 Jan 2006 09:10:01 -0000	1.7
  @@ -33,8 +33,48 @@
   #import "KRenderingStrokePainter.h"
   #import "kxmlcore/Assertions.h"
   
  +#import <QuartzCore/CoreImage.h>
  +
   #import "SVGRenderStyle.h"
   
  +#ifndef NDEBUG
  +void debugDumpCGImageToFile(NSString *filename, CGImageRef image, int width, int height)
  +{
  +    NSImage *fileImage = [[NSImage alloc] initWithSize:NSMakeSize(width, height)];
  +    [fileImage lockFocus];
  +    CGContextRef fileImageContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
  +    CGContextDrawImage(fileImageContext, CGRectMake(0, 0, width, height), image); 
  +    [fileImage unlockFocus];
  +    NSData *tiff = [fileImage TIFFRepresentation];
  +    [tiff writeToFile:filename atomically:YES];
  +    [fileImage release];
  +}
  +
  +void debugDumpCGLayerToFile(NSString *filename, CGLayerRef layer, int width, int height)
  +{
  +    NSImage *fileImage = [[NSImage alloc] initWithSize:NSMakeSize(width, height)];
  +    [fileImage lockFocus];
  +    CGContextRef fileImageContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
  +    CGContextDrawLayerAtPoint(fileImageContext, CGPointMake(0, 0), layer); 
  +    [fileImage unlockFocus];
  +    NSData *tiff = [fileImage TIFFRepresentation];
  +    [tiff writeToFile:filename atomically:YES];
  +    [fileImage release];
  +}
  +
  +void debugDumpCIImageToFile(NSString *filename, CIImage *ciImage, int width, int height)
  +{
  +    NSImage *fileImage = [[NSImage alloc] initWithSize:NSMakeSize(width, height)];
  +    [fileImage lockFocus];
  +    CGContextRef fileImageContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
  +    CIContext *ciContext = [CIContext contextWithCGContext:fileImageContext options:nil];
  +    [ciContext drawImage:ciImage atPoint:CGPointZero fromRect:CGRectMake(0, 0, width, height)];
  +    [fileImage unlockFocus];
  +    NSData *tiff = [fileImage TIFFRepresentation];
  +    [tiff writeToFile:filename atomically:YES];
  +    [fileImage release];
  +}
  +#endif
   
   CFStringRef CFStringFromCGAffineTransform(CGAffineTransform t)
   {
  
  
  
  1.1                  WebCore/kcanvas/device/quartz/KCanvasMaskerQuartz.h
  
  Index: KCanvasMaskerQuartz.h
  ===================================================================
  /*
   * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
   *               2005, 2006 Alexander Kellett <lypanov at 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. 
   */
  
  
  #import "KCanvasImage.h"
  #import "KCanvasResources.h"
  
  typedef struct CGContext *CGContextRef;
  
  class KCanvasMaskerQuartz : public KCanvasMasker {
  public:
      KCanvasMaskerQuartz() { }
      
      void applyMask(CGContextRef context, CGRect relativeBBox) const;
  };
  
  
  
  1.1                  WebCore/kcanvas/device/quartz/KCanvasMaskerQuartz.mm
  
  Index: KCanvasMaskerQuartz.mm
  ===================================================================
  /*
   * Copyright (C) 2005, 2006 Alexander Kellett <lypanov at 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"
  #import "KCanvasMaskerQuartz.h"
  
  #import "kcanvas/KCanvas.h"
  #import "SVGRenderStyle.h"
  
  #import "KCanvasResourcesQuartz.h"
  #import "KRenderingDeviceQuartz.h"
  #import "QuartzSupport.h"
  
  #import <QuartzCore/CoreImage.h>
  
  static CIImage *applyLuminanceToAlphaFilter(CIImage *inputImage)
  {
      CIFilter *luminanceToAlpha = [CIFilter filterWithName:@"CIColorMatrix"];
      [luminanceToAlpha setDefaults];
      float alpha[4] = {0.2125f, 0.7154f, 0.0721f, 0.f};
      float zero[4] = {0.f, 0.f, 0.f, 0.f};
      [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"];
      float zero[4] = {0.f, 0.f, 0.f, 0.f};
      [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.0f Y:0.0f Z:0.0f W:1.0f] forKey:@"inputAVector"];
      [alphaToGrayscale setValue:[CIVector vectorWithX:1.0f Y:1.0f Z:1.0f W:0.0f] forKey:@"inputBiasVector"];
      return [alphaToGrayscale valueForKey:@"outputImage"];
  }
  
  static CIImage *transformImageIntoGrayscaleMask(CIImage *inputImage)
  {
      CIFilter *blackBackground = [CIFilter filterWithName:@"CIConstantColorGenerator"];
      [blackBackground setValue:[CIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0f] 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(CGContextRef context, CGRect relativeBBox) 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);
      CGContextClipToMask(context, CGRectMake(0, 0, width, height), grayscaleImage);
      
      CGImageRelease(grayscaleImage);
      CGContextRelease(grayscaleContext);
      fastFree(imageBuffer);
  }
  
  
  
  1.14      +16 -0     WebCore/ksvg2/css/SVGCSSStyleSelector.cpp
  
  Index: SVGCSSStyleSelector.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/ksvg2/css/SVGCSSStyleSelector.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- SVGCSSStyleSelector.cpp	19 Dec 2005 19:52:52 -0000	1.13
  +++ SVGCSSStyleSelector.cpp	6 Jan 2006 09:10:02 -0000	1.14
  @@ -581,6 +581,22 @@
               svgstyle->setFilter(s);
               break;
           }
  +        case SVGCSS_PROP_MASK:
  +        {
  +            HANDLE_INHERIT_AND_INITIAL(maskElement, MaskElement)
  +            if (!primitiveValue)
  +                return;
  +
  +            QString s;
  +            int type = primitiveValue->primitiveType();
  +            if (type == KDOM::CSSPrimitiveValue::CSS_URI)
  +                s = primitiveValue->getStringValue().qstring();
  +            else
  +                return;
  +
  +            svgstyle->setMaskElement(s);
  +            break;
  +        }
           case SVGCSS_PROP_CLIP_PATH:
           {
               HANDLE_INHERIT_AND_INITIAL(clipPath, ClipPath)
  
  
  
  1.9       +4 -1      WebCore/ksvg2/css/SVGRenderStyle.cpp
  
  Index: SVGRenderStyle.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/ksvg2/css/SVGRenderStyle.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SVGRenderStyle.cpp	6 Dec 2005 01:53:14 -0000	1.8
  +++ SVGRenderStyle.cpp	6 Jan 2006 09:10:02 -0000	1.9
  @@ -42,6 +42,7 @@
       stroke = s_defaultStyle->stroke;
       stops = s_defaultStyle->stops;
       clip = s_defaultStyle->clip;
  +    mask = s_defaultStyle->mask;
       misc = s_defaultStyle->misc;
       markers = s_defaultStyle->markers;
   
  @@ -56,6 +57,7 @@
       stroke.init();
       stops.init();
       clip.init();
  +    mask.init();
       misc.init();
       markers.init();
   }
  @@ -66,6 +68,7 @@
       stroke = other.stroke;
       stops = other.stops;
       clip = other.clip;
  +    mask = other.mask;
       misc = other.misc;
       markers = other.markers;
   
  @@ -80,7 +83,7 @@
   bool SVGRenderStyle::operator==(const SVGRenderStyle& o) const
   {
       return (fill == o.fill && stroke == o.stroke &&
  -        stops == o.stops && clip == o.clip &&
  +        stops == o.stops && clip == o.clip && mask == o.mask &&
           misc == o.misc && markers == o.markers &&
           svg_inherited_flags == o.svg_inherited_flags &&
           svg_noninherited_flags == o.svg_noninherited_flags);
  
  
  
  1.8       +2 -0      WebCore/ksvg2/css/SVGRenderStyle.h
  
  Index: SVGRenderStyle.h
  ===================================================================
  RCS file: /cvs/root/WebCore/ksvg2/css/SVGRenderStyle.h,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SVGRenderStyle.h	6 Dec 2005 01:53:14 -0000	1.7
  +++ SVGRenderStyle.h	6 Jan 2006 09:10:03 -0000	1.8
  @@ -109,6 +109,7 @@
           RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(QColor, stops, color, StopColor, stopColor, QColor(Qt::black))    
           
           RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(QString, clip, clipPath, ClipPath, clipPath, QString())
  +        RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(QString, mask, maskElement, MaskElement, maskElement, QString())
           RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(QString, markers, startMarker, StartMarker, startMarker, QString())
           RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(QString, markers, midMarker, MidMarker, midMarker, QString())
           RS_DEFINE_ATTRIBUTE_DATAREF_WITH_INITIAL(QString, markers, endMarker, EndMarker, endMarker, QString())
  @@ -179,6 +180,7 @@
   
           // non-inherited attributes
           KDOM::DataRef<StyleClipData> clip;
  +        KDOM::DataRef<StyleMaskData> mask;
   
           // static default style
           static SVGRenderStyle *s_defaultStyle;
  
  
  
  1.9       +15 -0     WebCore/ksvg2/css/SVGRenderStyleDefs.cpp
  
  Index: SVGRenderStyleDefs.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/ksvg2/css/SVGRenderStyleDefs.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SVGRenderStyleDefs.cpp	6 Dec 2005 01:53:14 -0000	1.8
  +++ SVGRenderStyleDefs.cpp	6 Jan 2006 09:10:03 -0000	1.9
  @@ -129,6 +129,21 @@
       return (clipPath == other.clipPath);
   }
   
  +StyleMaskData::StyleMaskData() : KDOM::Shared<StyleMaskData>()
  +{
  +    maskElement = SVGRenderStyle::initialMaskElement();
  +}
  +
  +StyleMaskData::StyleMaskData(const StyleMaskData &other) : KDOM::Shared<StyleMaskData>()
  +{
  +    maskElement = other.maskElement;
  +}
  +
  +bool StyleMaskData::operator==(const StyleMaskData &other) const
  +{
  +    return (maskElement == other.maskElement);
  +}
  +
   StyleMarkerData::StyleMarkerData() : KDOM::Shared<StyleMarkerData>()
   {
       startMarker = SVGRenderStyle::initialStartMarker();
  
  
  
  1.6       +15 -0     WebCore/ksvg2/css/SVGRenderStyleDefs.h
  
  Index: SVGRenderStyleDefs.h
  ===================================================================
  RCS file: /cvs/root/WebCore/ksvg2/css/SVGRenderStyleDefs.h,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- SVGRenderStyleDefs.h	21 Nov 2005 08:29:28 -0000	1.5
  +++ SVGRenderStyleDefs.h	6 Jan 2006 09:10:03 -0000	1.6
  @@ -189,6 +189,21 @@
           StyleClipData &operator=(const StyleClipData &);
       };
   
  +    class StyleMaskData : public KDOM::Shared<StyleMaskData>
  +    {
  +    public:
  +        StyleMaskData();
  +        StyleMaskData(const StyleMaskData &other);
  +
  +        bool operator==(const StyleMaskData &other) const;
  +        bool operator!=(const StyleMaskData &other) const { return !(*this == other); }
  +
  +        QString maskElement;
  +
  +    private:
  +        StyleMaskData &operator=(const StyleMaskData &);
  +    };
  +
       class StyleMarkerData : public KDOM::Shared<StyleMarkerData>
       {
       public:
  
  
  
  1.11      +6 -0      WebCore/ksvg2/ecma/Ecma.cpp
  
  Index: Ecma.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/ksvg2/ecma/Ecma.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- Ecma.cpp	11 Dec 2005 02:06:14 -0000	1.10
  +++ Ecma.cpp	6 Jan 2006 09:10:04 -0000	1.11
  @@ -78,6 +78,7 @@
   #include "SVGAnimateElement.h"
   #include "SVGPolygonElement.h"
   #include "SVGPatternElement.h"
  +#include "SVGMaskElement.h"
   #include "SVGPolylineElement.h"
   #include "SVGClipPathElement.h"
   #include "SVGPathSegClosePath.h"
  @@ -262,6 +263,11 @@
               ret = SVGPatternElement(n).bridge(exec);
               break;
           }
  +        case ID_MASK:
  +        {
  +            ret = SVGMaskElement(n).bridge(exec);
  +            break;
  +        }
           case ID_ANIMATECOLOR:
           {
               ret = SVGAnimateColorElement(n).bridge(exec);
  
  
  
  1.3       +1 -1      WebCore/ksvg2/svg/svgtags.in
  
  Index: svgtags.in
  ===================================================================
  RCS file: /cvs/root/WebCore/ksvg2/svg/svgtags.in,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- svgtags.in	30 Nov 2005 11:49:40 -0000	1.2
  +++ svgtags.in	6 Jan 2006 09:10:04 -0000	1.3
  @@ -54,7 +54,7 @@
   line
   linearGradient
   marker
  -#mask
  +mask
   #metadata
   #missing_glyph
   #mpath
  
  
  
  1.1                  WebCore/ksvg2/svg/SVGMaskElementImpl.cpp
  
  Index: SVGMaskElementImpl.cpp
  ===================================================================
  /*
      Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox at kde.org>
                    2004, 2005 Rob Buis <buis at kde.org>
                    2005 Alexander Kellett <lypanov at kde.org>
  
      This file is part of the KDE project
  
      This library is free software; you can redistribute it and/or
      modify it under the terms of the GNU Library General Public
      License as published by the Free Software Foundation; either
      version 2 of the License, or (at your option) any later version.
  
      This library is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      Library General Public License for more details.
  
      You should have received a copy of the GNU Library General Public License
      along with this library; see the file COPYING.LIB.  If not, write to
      the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      Boston, MA 02111-1307, USA.
  */
  
  #include "config.h"
  #include <kdom/core/AttrImpl.h>
  
  #include <kcanvas/KCanvas.h>
  #include <kcanvas/KCanvasPath.h>
  #include <kcanvas/KCanvasImage.h>
  #include <kcanvas/KCanvasContainer.h>
  #include <kcanvas/device/KRenderingDevice.h>
  #include <kdom/css/CSSStyleSelector.h>
  
  #include "ksvg.h"
  #include "SVGNames.h"
  #include "SVGHelper.h"
  #include "SVGRenderStyle.h"
  #include "SVGMaskElementImpl.h"
  #include "SVGAnimatedLengthImpl.h"
  
  
  namespace KSVG {
  
  SVGMaskElementImpl::SVGMaskElementImpl(const KDOM::QualifiedName& tagName, KDOM::DocumentImpl *doc) : SVGStyledLocatableElementImpl(tagName, doc), SVGURIReferenceImpl(), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), m_masker(0), m_dirty(true)
  {
  }
  
  SVGMaskElementImpl::~SVGMaskElementImpl()
  {
      delete m_masker;
  }
  
  SVGAnimatedLengthImpl *SVGMaskElementImpl::x() const
  {
      return lazy_create<SVGAnimatedLengthImpl>(m_x, this, LM_WIDTH, viewportElement());
  }
  
  SVGAnimatedLengthImpl *SVGMaskElementImpl::y() const
  {
      return lazy_create<SVGAnimatedLengthImpl>(m_y, this, LM_HEIGHT, viewportElement());
  }
  
  SVGAnimatedLengthImpl *SVGMaskElementImpl::width() const
  {
      return lazy_create<SVGAnimatedLengthImpl>(m_width, this, LM_WIDTH, viewportElement());
  }
  
  SVGAnimatedLengthImpl *SVGMaskElementImpl::height() const
  {
      return lazy_create<SVGAnimatedLengthImpl>(m_height, this, LM_HEIGHT, viewportElement());
  }
  
  void SVGMaskElementImpl::attributeChanged(KDOM::AttributeImpl* attr, bool preserveDecls)
  {
      QSize newSize = QSize(lroundf(width()->baseVal()->value()), lroundf(height()->baseVal()->value()));
      if (!m_masker || !m_masker->mask() || (m_masker->mask()->size() != newSize))
          m_dirty = true;
      SVGStyledLocatableElementImpl::attributeChanged(attr, preserveDecls);
  }
  
  void SVGMaskElementImpl::childrenChanged()
  {
      m_dirty = true;
      SVGStyledLocatableElementImpl::childrenChanged();
  }
  
  void SVGMaskElementImpl::parseMappedAttribute(KDOM::MappedAttributeImpl *attr)
  {
      KDOM::DOMString value(attr->value());
      if (attr->name() == SVGNames::xAttr)
          x()->baseVal()->setValueAsString(value.impl());
      else if (attr->name() == SVGNames::yAttr)
          y()->baseVal()->setValueAsString(value.impl());
      else if (attr->name() == SVGNames::widthAttr)
          width()->baseVal()->setValueAsString(value.impl());
      else if (attr->name() == SVGNames::heightAttr)
          height()->baseVal()->setValueAsString(value.impl());
      else {
          if (SVGURIReferenceImpl::parseMappedAttribute(attr))
              return;
          if (SVGTestsImpl::parseMappedAttribute(attr))
              return;
          if (SVGLangSpaceImpl::parseMappedAttribute(attr))
              return;
          if (SVGExternalResourcesRequiredImpl::parseMappedAttribute(attr))
              return;
          SVGStyledElementImpl::parseMappedAttribute(attr);
      }
  }
  
  KCanvasImage *SVGMaskElementImpl::drawMaskerContent()
  {
      KRenderingDevice *device = QPainter::renderingDevice();
      if (!device->currentContext()) // FIXME: hack for now until QPixmap::lockFocus exists
          return 0;
      if (!attached())
          return 0;
      KCanvasImage *maskImage = static_cast<KCanvasImage *>(device->createResource(RS_IMAGE));
  
      QSize size = QSize(lroundf(width()->baseVal()->value()), lroundf(height()->baseVal()->value()));
      maskImage->init(size);
  
      KRenderingDeviceContext *patternContext = device->contextForImage(maskImage);
      device->pushContext(patternContext);
  
      KCanvasContainer *maskContainer = static_cast<KCanvasContainer *>(renderer());
      QPainter p;
      khtml::RenderObject::PaintInfo info(&p, QRect(), PaintActionForeground, 0);
      maskContainer->setDrawsContents(true);
      maskContainer->paint(info, 0, 0);
      maskContainer->setDrawsContents(false);
      
      device->popContext();
      delete patternContext;
  
      return maskImage;
  }
  
  khtml::RenderObject *SVGMaskElementImpl::createRenderer(RenderArena *arena, khtml::RenderStyle *style)
  {
      KCanvasContainer *maskContainer = QPainter::renderingDevice()->createContainer(arena, style, this);
      maskContainer->setDrawsContents(false);
      return maskContainer;
  }
  
  KCanvasMasker *SVGMaskElementImpl::canvasResource()
  {
      if (!m_masker) {
          m_masker = static_cast<KCanvasMasker *>(QPainter::renderingDevice()->createResource(RS_MASKER));
          m_dirty = true;
      }
      if (m_dirty) {
          KCanvasImage *newMaskImage = drawMaskerContent();
          m_masker->setMask(newMaskImage);
          m_dirty = (newMaskImage != 0);
      }
      return m_masker;
  }
  
  }
  
  // vim:ts=4:noet
  
  
  
  1.1                  WebCore/ksvg2/svg/SVGMaskElementImpl.h
  
  Index: SVGMaskElementImpl.h
  ===================================================================
  /*
      Copyright (C) 2005 Alexander Kellett <lypanov at kde.org>
  
      This file is part of the KDE project
  
      This library is free software; you can redistribute it and/or
      modify it under the terms of the GNU Library General Public
      License as published by the Free Software Foundation; either
      version 2 of the License, or (at your option) any later version.
  
      This library is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      Library General Public License for more details.
  
      You should have received a copy of the GNU Library General Public License
      along with this library; see the file COPYING.LIB.  If not, write to
      the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      Boston, MA 02111-1307, USA.
  */
  
  #ifndef KSVG_SVGMaskElementImpl_H
  #define KSVG_SVGMaskElementImpl_H
  
  #include "SVGTestsImpl.h"
  #include "SVGLangSpaceImpl.h"
  #include "SVGURIReferenceImpl.h"
  #include "SVGStyledLocatableElementImpl.h"
  #include "SVGExternalResourcesRequiredImpl.h"
  
  #include "KCanvasResources.h"
  
  class KCanvasImage;
  
  namespace KSVG
  {
      class AttributeImpl;
      class SVGAnimatedLengthImpl;
      class SVGMaskElementImpl : public SVGStyledLocatableElementImpl,
                                    public SVGURIReferenceImpl,
                                    public SVGTestsImpl,
                                    public SVGLangSpaceImpl,
                                    public SVGExternalResourcesRequiredImpl
      {
      public:
          SVGMaskElementImpl(const KDOM::QualifiedName& tagName, KDOM::DocumentImpl *doc);
          virtual ~SVGMaskElementImpl();
          virtual bool isValid() const { return SVGTestsImpl::isValid(); }
  
          // 'SVGMaskElement' functions
          SVGAnimatedLengthImpl *x() const;
          SVGAnimatedLengthImpl *y() const;
  
          SVGAnimatedLengthImpl *width() const;
          SVGAnimatedLengthImpl *height() const;
  
          virtual void childrenChanged();
          virtual void attributeChanged(KDOM::AttributeImpl* attr, bool preserveDecls);
          virtual void parseMappedAttribute(KDOM::MappedAttributeImpl *attr);
  
          virtual bool rendererIsNeeded(khtml::RenderStyle *) { return true; }
          virtual khtml::RenderObject *createRenderer(RenderArena *arena, khtml::RenderStyle *style);
          virtual KCanvasMasker *canvasResource();
  
      protected:
          KCanvasImage *drawMaskerContent();
  
          mutable RefPtr<SVGAnimatedLengthImpl> m_x;
          mutable RefPtr<SVGAnimatedLengthImpl> m_y;
          mutable RefPtr<SVGAnimatedLengthImpl> m_width;
          mutable RefPtr<SVGAnimatedLengthImpl> m_height;
  
      private:
          KCanvasMasker *m_masker;
          bool m_dirty;
      };
  };
  
  #endif
  
  // vim:ts=4:noet
  
  
  



More information about the webkit-changes mailing list