[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