summaryrefslogtreecommitdiffstats
path: root/ksvg/impl
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit47d455dd55be855e4cc691c32f687f723d9247ee (patch)
tree52e236aaa2576bdb3840ebede26619692fed6d7d /ksvg/impl
downloadtdegraphics-47d455dd55be855e4cc691c32f687f723d9247ee.tar.gz
tdegraphics-47d455dd55be855e4cc691c32f687f723d9247ee.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdegraphics@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'ksvg/impl')
-rw-r--r--ksvg/impl/LRUCache.h169
-rw-r--r--ksvg/impl/Makefile.am116
-rw-r--r--ksvg/impl/SVGAElementImpl.cc117
-rw-r--r--ksvg/impl/SVGAElementImpl.h79
-rw-r--r--ksvg/impl/SVGAltGlyphDefElementImpl.cc33
-rw-r--r--ksvg/impl/SVGAltGlyphDefElementImpl.h49
-rw-r--r--ksvg/impl/SVGAltGlyphElementImpl.cc50
-rw-r--r--ksvg/impl/SVGAltGlyphElementImpl.h55
-rw-r--r--ksvg/impl/SVGAngleImpl.cc277
-rw-r--r--ksvg/impl/SVGAngleImpl.h102
-rw-r--r--ksvg/impl/SVGAnimateColorElementImpl.cc98
-rw-r--r--ksvg/impl/SVGAnimateColorElementImpl.h60
-rw-r--r--ksvg/impl/SVGAnimateElementImpl.cc191
-rw-r--r--ksvg/impl/SVGAnimateElementImpl.h59
-rw-r--r--ksvg/impl/SVGAnimateMotionElementImpl.cc102
-rw-r--r--ksvg/impl/SVGAnimateMotionElementImpl.h56
-rw-r--r--ksvg/impl/SVGAnimateTransformElementImpl.cc257
-rw-r--r--ksvg/impl/SVGAnimateTransformElementImpl.h74
-rw-r--r--ksvg/impl/SVGAnimatedAngleImpl.cc83
-rw-r--r--ksvg/impl/SVGAnimatedAngleImpl.h61
-rw-r--r--ksvg/impl/SVGAnimatedBooleanImpl.cc93
-rw-r--r--ksvg/impl/SVGAnimatedBooleanImpl.h64
-rw-r--r--ksvg/impl/SVGAnimatedEnumerationImpl.cc93
-rw-r--r--ksvg/impl/SVGAnimatedEnumerationImpl.h64
-rw-r--r--ksvg/impl/SVGAnimatedIntegerImpl.cc91
-rw-r--r--ksvg/impl/SVGAnimatedIntegerImpl.h64
-rw-r--r--ksvg/impl/SVGAnimatedLengthImpl.cc96
-rw-r--r--ksvg/impl/SVGAnimatedLengthImpl.h65
-rw-r--r--ksvg/impl/SVGAnimatedLengthListImpl.cc95
-rw-r--r--ksvg/impl/SVGAnimatedLengthListImpl.h61
-rw-r--r--ksvg/impl/SVGAnimatedNumberImpl.cc94
-rw-r--r--ksvg/impl/SVGAnimatedNumberImpl.h63
-rw-r--r--ksvg/impl/SVGAnimatedNumberListImpl.cc82
-rw-r--r--ksvg/impl/SVGAnimatedNumberListImpl.h58
-rw-r--r--ksvg/impl/SVGAnimatedPathDataImpl.cc108
-rw-r--r--ksvg/impl/SVGAnimatedPathDataImpl.h67
-rw-r--r--ksvg/impl/SVGAnimatedPointsImpl.cc139
-rw-r--r--ksvg/impl/SVGAnimatedPointsImpl.h67
-rw-r--r--ksvg/impl/SVGAnimatedPreserveAspectRatioImpl.cc83
-rw-r--r--ksvg/impl/SVGAnimatedPreserveAspectRatioImpl.h61
-rw-r--r--ksvg/impl/SVGAnimatedRectImpl.cc81
-rw-r--r--ksvg/impl/SVGAnimatedRectImpl.h61
-rw-r--r--ksvg/impl/SVGAnimatedStringImpl.cc90
-rw-r--r--ksvg/impl/SVGAnimatedStringImpl.h65
-rw-r--r--ksvg/impl/SVGAnimatedTransformListImpl.cc83
-rw-r--r--ksvg/impl/SVGAnimatedTransformListImpl.h61
-rw-r--r--ksvg/impl/SVGAnimationElementImpl.cc465
-rw-r--r--ksvg/impl/SVGAnimationElementImpl.h149
-rw-r--r--ksvg/impl/SVGBBoxTarget.cc55
-rw-r--r--ksvg/impl/SVGBBoxTarget.h45
-rw-r--r--ksvg/impl/SVGCSSRuleImpl.cc33
-rw-r--r--ksvg/impl/SVGCSSRuleImpl.h42
-rw-r--r--ksvg/impl/SVGCircleElementImpl.cc178
-rw-r--r--ksvg/impl/SVGCircleElementImpl.h84
-rw-r--r--ksvg/impl/SVGClipPathElementImpl.cc104
-rw-r--r--ksvg/impl/SVGClipPathElementImpl.h80
-rw-r--r--ksvg/impl/SVGColorImpl.cc540
-rw-r--r--ksvg/impl/SVGColorImpl.h94
-rw-r--r--ksvg/impl/SVGColorProfileElementImpl.cc271
-rw-r--r--ksvg/impl/SVGColorProfileElementImpl.h100
-rw-r--r--ksvg/impl/SVGColorProfileRuleImpl.cc63
-rw-r--r--ksvg/impl/SVGColorProfileRuleImpl.h58
-rw-r--r--ksvg/impl/SVGComponentTransferFunctionElementImpl.cc105
-rw-r--r--ksvg/impl/SVGComponentTransferFunctionElementImpl.h66
-rw-r--r--ksvg/impl/SVGContainerImpl.cc135
-rw-r--r--ksvg/impl/SVGContainerImpl.h58
-rw-r--r--ksvg/impl/SVGCursorElementImpl.cc104
-rw-r--r--ksvg/impl/SVGCursorElementImpl.h69
-rw-r--r--ksvg/impl/SVGDefinitionSrcElementImpl.cc33
-rw-r--r--ksvg/impl/SVGDefinitionSrcElementImpl.h46
-rw-r--r--ksvg/impl/SVGDefsElementImpl.cc34
-rw-r--r--ksvg/impl/SVGDefsElementImpl.h61
-rw-r--r--ksvg/impl/SVGDescElementImpl.cc39
-rw-r--r--ksvg/impl/SVGDescElementImpl.h55
-rw-r--r--ksvg/impl/SVGDocumentImpl.cc705
-rw-r--r--ksvg/impl/SVGDocumentImpl.h245
-rw-r--r--ksvg/impl/SVGEcma.cc844
-rw-r--r--ksvg/impl/SVGEcma.h250
-rw-r--r--ksvg/impl/SVGElementImpl.cc713
-rw-r--r--ksvg/impl/SVGElementImpl.h229
-rw-r--r--ksvg/impl/SVGElementInstanceImpl.cc108
-rw-r--r--ksvg/impl/SVGElementInstanceImpl.h70
-rw-r--r--ksvg/impl/SVGElementInstanceListImpl.cc44
-rw-r--r--ksvg/impl/SVGElementInstanceListImpl.h49
-rw-r--r--ksvg/impl/SVGEllipseElementImpl.cc200
-rw-r--r--ksvg/impl/SVGEllipseElementImpl.h86
-rw-r--r--ksvg/impl/SVGEventImpl.cc992
-rw-r--r--ksvg/impl/SVGEventImpl.h468
-rw-r--r--ksvg/impl/SVGExternalResourcesRequiredImpl.cc88
-rw-r--r--ksvg/impl/SVGExternalResourcesRequiredImpl.h59
-rw-r--r--ksvg/impl/SVGFEBlendElementImpl.cc64
-rw-r--r--ksvg/impl/SVGFEBlendElementImpl.h59
-rw-r--r--ksvg/impl/SVGFEColorMatrixElementImpl.cc65
-rw-r--r--ksvg/impl/SVGFEColorMatrixElementImpl.h60
-rw-r--r--ksvg/impl/SVGFEComponentTransferElementImpl.cc43
-rw-r--r--ksvg/impl/SVGFEComponentTransferElementImpl.h54
-rw-r--r--ksvg/impl/SVGFECompositeElementImpl.cc105
-rw-r--r--ksvg/impl/SVGFECompositeElementImpl.h68
-rw-r--r--ksvg/impl/SVGFEConvolveMatrixElementImpl.cc149
-rw-r--r--ksvg/impl/SVGFEConvolveMatrixElementImpl.h80
-rw-r--r--ksvg/impl/SVGFEDiffuseLightingElementImpl.cc64
-rw-r--r--ksvg/impl/SVGFEDiffuseLightingElementImpl.h59
-rw-r--r--ksvg/impl/SVGFEDisplacementMapElementImpl.cc85
-rw-r--r--ksvg/impl/SVGFEDisplacementMapElementImpl.h64
-rw-r--r--ksvg/impl/SVGFEDistantLightElementImpl.cc53
-rw-r--r--ksvg/impl/SVGFEDistantLightElementImpl.h54
-rw-r--r--ksvg/impl/SVGFEFloodElementImpl.cc43
-rw-r--r--ksvg/impl/SVGFEFloodElementImpl.h56
-rw-r--r--ksvg/impl/SVGFEFuncAElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFEFuncAElementImpl.h46
-rw-r--r--ksvg/impl/SVGFEFuncBElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFEFuncBElementImpl.h45
-rw-r--r--ksvg/impl/SVGFEFuncGElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFEFuncGElementImpl.h46
-rw-r--r--ksvg/impl/SVGFEFuncRElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFEFuncRElementImpl.h46
-rw-r--r--ksvg/impl/SVGFEGaussianBlurElementImpl.cc68
-rw-r--r--ksvg/impl/SVGFEGaussianBlurElementImpl.h60
-rw-r--r--ksvg/impl/SVGFEImageElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFEImageElementImpl.h56
-rw-r--r--ksvg/impl/SVGFEMergeElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFEMergeElementImpl.h48
-rw-r--r--ksvg/impl/SVGFEMergeNodeElementImpl.cc43
-rw-r--r--ksvg/impl/SVGFEMergeNodeElementImpl.h52
-rw-r--r--ksvg/impl/SVGFEMorphologyElementImpl.cc75
-rw-r--r--ksvg/impl/SVGFEMorphologyElementImpl.h62
-rw-r--r--ksvg/impl/SVGFEOffsetElementImpl.cc64
-rw-r--r--ksvg/impl/SVGFEOffsetElementImpl.h59
-rw-r--r--ksvg/impl/SVGFEPointLightElementImpl.cc63
-rw-r--r--ksvg/impl/SVGFEPointLightElementImpl.h56
-rw-r--r--ksvg/impl/SVGFESpecularLightingElementImpl.cc74
-rw-r--r--ksvg/impl/SVGFESpecularLightingElementImpl.h61
-rw-r--r--ksvg/impl/SVGFESpotLightElementImpl.cc113
-rw-r--r--ksvg/impl/SVGFESpotLightElementImpl.h65
-rw-r--r--ksvg/impl/SVGFETileElementImpl.cc43
-rw-r--r--ksvg/impl/SVGFETileElementImpl.h54
-rw-r--r--ksvg/impl/SVGFETurbulenceElementImpl.cc100
-rw-r--r--ksvg/impl/SVGFETurbulenceElementImpl.h65
-rw-r--r--ksvg/impl/SVGFilterElementImpl.cc119
-rw-r--r--ksvg/impl/SVGFilterElementImpl.h76
-rw-r--r--ksvg/impl/SVGFilterPrimitiveStandardAttributesImpl.cc84
-rw-r--r--ksvg/impl/SVGFilterPrimitiveStandardAttributesImpl.h55
-rw-r--r--ksvg/impl/SVGFitToViewBoxImpl.cc141
-rw-r--r--ksvg/impl/SVGFitToViewBoxImpl.h69
-rw-r--r--ksvg/impl/SVGFontElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFontElementImpl.h49
-rw-r--r--ksvg/impl/SVGFontFaceElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFontFaceElementImpl.h46
-rw-r--r--ksvg/impl/SVGFontFaceFormatElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFontFaceFormatElementImpl.h46
-rw-r--r--ksvg/impl/SVGFontFaceNameElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFontFaceNameElementImpl.h46
-rw-r--r--ksvg/impl/SVGFontFaceSrcElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFontFaceSrcElementImpl.h45
-rw-r--r--ksvg/impl/SVGFontFaceUriElementImpl.cc33
-rw-r--r--ksvg/impl/SVGFontFaceUriElementImpl.h46
-rw-r--r--ksvg/impl/SVGForeignObjectElementImpl.cc121
-rw-r--r--ksvg/impl/SVGForeignObjectElementImpl.h78
-rw-r--r--ksvg/impl/SVGGElementImpl.cc36
-rw-r--r--ksvg/impl/SVGGElementImpl.h59
-rw-r--r--ksvg/impl/SVGGlyphElementImpl.cc98
-rw-r--r--ksvg/impl/SVGGlyphElementImpl.h66
-rw-r--r--ksvg/impl/SVGGlyphRefElementImpl.cc134
-rw-r--r--ksvg/impl/SVGGlyphRefElementImpl.h79
-rw-r--r--ksvg/impl/SVGGradientElementImpl.cc264
-rw-r--r--ksvg/impl/SVGGradientElementImpl.h110
-rw-r--r--ksvg/impl/SVGHKernElementImpl.cc33
-rw-r--r--ksvg/impl/SVGHKernElementImpl.h46
-rw-r--r--ksvg/impl/SVGHelperImpl.cc230
-rw-r--r--ksvg/impl/SVGHelperImpl.h88
-rw-r--r--ksvg/impl/SVGICCColorImpl.cc107
-rw-r--r--ksvg/impl/SVGICCColorImpl.h67
-rw-r--r--ksvg/impl/SVGImageElementImpl.cc522
-rw-r--r--ksvg/impl/SVGImageElementImpl.h140
-rw-r--r--ksvg/impl/SVGLangSpaceImpl.cc130
-rw-r--r--ksvg/impl/SVGLangSpaceImpl.h67
-rw-r--r--ksvg/impl/SVGLengthImpl.cc510
-rw-r--r--ksvg/impl/SVGLengthImpl.h136
-rw-r--r--ksvg/impl/SVGLengthListImpl.cc64
-rw-r--r--ksvg/impl/SVGLengthListImpl.h48
-rw-r--r--ksvg/impl/SVGLineElementImpl.cc213
-rw-r--r--ksvg/impl/SVGLineElementImpl.h86
-rw-r--r--ksvg/impl/SVGLinearGradientElementImpl.cc201
-rw-r--r--ksvg/impl/SVGLinearGradientElementImpl.h74
-rw-r--r--ksvg/impl/SVGList.h174
-rw-r--r--ksvg/impl/SVGLocatableImpl.cc208
-rw-r--r--ksvg/impl/SVGLocatableImpl.h94
-rw-r--r--ksvg/impl/SVGMPathElementImpl.cc33
-rw-r--r--ksvg/impl/SVGMPathElementImpl.h50
-rw-r--r--ksvg/impl/SVGMarkerElementImpl.cc424
-rw-r--r--ksvg/impl/SVGMarkerElementImpl.h121
-rw-r--r--ksvg/impl/SVGMaskElementImpl.cc542
-rw-r--r--ksvg/impl/SVGMaskElementImpl.h158
-rw-r--r--ksvg/impl/SVGMatrixImpl.cc460
-rw-r--r--ksvg/impl/SVGMatrixImpl.h130
-rw-r--r--ksvg/impl/SVGMetadataElementImpl.cc33
-rw-r--r--ksvg/impl/SVGMetadataElementImpl.h46
-rw-r--r--ksvg/impl/SVGMissingGlyphElementImpl.cc33
-rw-r--r--ksvg/impl/SVGMissingGlyphElementImpl.h47
-rw-r--r--ksvg/impl/SVGNumberImpl.cc83
-rw-r--r--ksvg/impl/SVGNumberImpl.h61
-rw-r--r--ksvg/impl/SVGNumberListImpl.cc64
-rw-r--r--ksvg/impl/SVGNumberListImpl.h48
-rw-r--r--ksvg/impl/SVGPaintImpl.cc175
-rw-r--r--ksvg/impl/SVGPaintImpl.h85
-rw-r--r--ksvg/impl/SVGPaintServerImpl.cc55
-rw-r--r--ksvg/impl/SVGPaintServerImpl.h52
-rw-r--r--ksvg/impl/SVGPathElementImpl.cc868
-rw-r--r--ksvg/impl/SVGPathElementImpl.h194
-rw-r--r--ksvg/impl/SVGPathSegArcImpl.cc495
-rw-r--r--ksvg/impl/SVGPathSegArcImpl.h150
-rw-r--r--ksvg/impl/SVGPathSegClosePathImpl.cc46
-rw-r--r--ksvg/impl/SVGPathSegClosePathImpl.h61
-rw-r--r--ksvg/impl/SVGPathSegCurvetoCubicImpl.cc325
-rw-r--r--ksvg/impl/SVGPathSegCurvetoCubicImpl.h139
-rw-r--r--ksvg/impl/SVGPathSegCurvetoCubicSmoothImpl.cc298
-rw-r--r--ksvg/impl/SVGPathSegCurvetoCubicSmoothImpl.h139
-rw-r--r--ksvg/impl/SVGPathSegCurvetoQuadraticImpl.cc260
-rw-r--r--ksvg/impl/SVGPathSegCurvetoQuadraticImpl.h123
-rw-r--r--ksvg/impl/SVGPathSegCurvetoQuadraticSmoothImpl.cc235
-rw-r--r--ksvg/impl/SVGPathSegCurvetoQuadraticSmoothImpl.h123
-rw-r--r--ksvg/impl/SVGPathSegImpl.cc107
-rw-r--r--ksvg/impl/SVGPathSegImpl.h75
-rw-r--r--ksvg/impl/SVGPathSegLinetoHorizontalImpl.cc167
-rw-r--r--ksvg/impl/SVGPathSegLinetoHorizontalImpl.h99
-rw-r--r--ksvg/impl/SVGPathSegLinetoImpl.cc196
-rw-r--r--ksvg/impl/SVGPathSegLinetoImpl.h107
-rw-r--r--ksvg/impl/SVGPathSegLinetoVerticalImpl.cc165
-rw-r--r--ksvg/impl/SVGPathSegLinetoVerticalImpl.h99
-rw-r--r--ksvg/impl/SVGPathSegListImpl.cc64
-rw-r--r--ksvg/impl/SVGPathSegListImpl.h48
-rw-r--r--ksvg/impl/SVGPathSegMovetoImpl.cc196
-rw-r--r--ksvg/impl/SVGPathSegMovetoImpl.h107
-rw-r--r--ksvg/impl/SVGPatternElementImpl.cc509
-rw-r--r--ksvg/impl/SVGPatternElementImpl.h136
-rw-r--r--ksvg/impl/SVGPointImpl.cc108
-rw-r--r--ksvg/impl/SVGPointImpl.h66
-rw-r--r--ksvg/impl/SVGPointListImpl.cc64
-rw-r--r--ksvg/impl/SVGPointListImpl.h48
-rw-r--r--ksvg/impl/SVGPolyElementImpl.cc141
-rw-r--r--ksvg/impl/SVGPolyElementImpl.h70
-rw-r--r--ksvg/impl/SVGPolygonElementImpl.cc88
-rw-r--r--ksvg/impl/SVGPolygonElementImpl.h54
-rw-r--r--ksvg/impl/SVGPolylineElementImpl.cc100
-rw-r--r--ksvg/impl/SVGPolylineElementImpl.h54
-rw-r--r--ksvg/impl/SVGPreserveAspectRatioImpl.cc217
-rw-r--r--ksvg/impl/SVGPreserveAspectRatioImpl.h84
-rw-r--r--ksvg/impl/SVGRadialGradientElementImpl.cc216
-rw-r--r--ksvg/impl/SVGRadialGradientElementImpl.h76
-rw-r--r--ksvg/impl/SVGRectElementImpl.cc244
-rw-r--r--ksvg/impl/SVGRectElementImpl.h90
-rw-r--r--ksvg/impl/SVGRectImpl.cc157
-rw-r--r--ksvg/impl/SVGRectImpl.h80
-rw-r--r--ksvg/impl/SVGSVGElementImpl.cc982
-rw-r--r--ksvg/impl/SVGSVGElementImpl.h198
-rw-r--r--ksvg/impl/SVGScriptElementImpl.cc185
-rw-r--r--ksvg/impl/SVGScriptElementImpl.h90
-rw-r--r--ksvg/impl/SVGSetElementImpl.cc48
-rw-r--r--ksvg/impl/SVGSetElementImpl.h54
-rw-r--r--ksvg/impl/SVGShapeImpl.cc162
-rw-r--r--ksvg/impl/SVGShapeImpl.h73
-rw-r--r--ksvg/impl/SVGStopElementImpl.cc125
-rw-r--r--ksvg/impl/SVGStopElementImpl.h70
-rw-r--r--ksvg/impl/SVGStringListImpl.cc93
-rw-r--r--ksvg/impl/SVGStringListImpl.h82
-rw-r--r--ksvg/impl/SVGStylableImpl.cc1309
-rw-r--r--ksvg/impl/SVGStylableImpl.h327
-rw-r--r--ksvg/impl/SVGStyleElementImpl.cc135
-rw-r--r--ksvg/impl/SVGStyleElementImpl.h72
-rw-r--r--ksvg/impl/SVGSwitchElementImpl.cc58
-rw-r--r--ksvg/impl/SVGSwitchElementImpl.h62
-rw-r--r--ksvg/impl/SVGSymbolElementImpl.cc106
-rw-r--r--ksvg/impl/SVGSymbolElementImpl.h76
-rw-r--r--ksvg/impl/SVGTRefElementImpl.cc76
-rw-r--r--ksvg/impl/SVGTRefElementImpl.h52
-rw-r--r--ksvg/impl/SVGTSpanElementImpl.cc64
-rw-r--r--ksvg/impl/SVGTSpanElementImpl.h55
-rw-r--r--ksvg/impl/SVGTestsImpl.cc178
-rw-r--r--ksvg/impl/SVGTestsImpl.h77
-rw-r--r--ksvg/impl/SVGTextContentElementImpl.cc285
-rw-r--r--ksvg/impl/SVGTextContentElementImpl.h115
-rw-r--r--ksvg/impl/SVGTextElementImpl.cc124
-rw-r--r--ksvg/impl/SVGTextElementImpl.h65
-rw-r--r--ksvg/impl/SVGTextPathElementImpl.cc240
-rw-r--r--ksvg/impl/SVGTextPathElementImpl.h84
-rw-r--r--ksvg/impl/SVGTextPositioningElementImpl.cc198
-rw-r--r--ksvg/impl/SVGTextPositioningElementImpl.h83
-rw-r--r--ksvg/impl/SVGTimeScheduler.cc234
-rw-r--r--ksvg/impl/SVGTimeScheduler.h104
-rw-r--r--ksvg/impl/SVGTitleElementImpl.cc39
-rw-r--r--ksvg/impl/SVGTitleElementImpl.h55
-rw-r--r--ksvg/impl/SVGTransformImpl.cc240
-rw-r--r--ksvg/impl/SVGTransformImpl.h99
-rw-r--r--ksvg/impl/SVGTransformListImpl.cc103
-rw-r--r--ksvg/impl/SVGTransformListImpl.h53
-rw-r--r--ksvg/impl/SVGTransformableImpl.cc169
-rw-r--r--ksvg/impl/SVGTransformableImpl.h77
-rw-r--r--ksvg/impl/SVGURIReferenceImpl.cc135
-rw-r--r--ksvg/impl/SVGURIReferenceImpl.h64
-rw-r--r--ksvg/impl/SVGUnitConverter.h100
-rw-r--r--ksvg/impl/SVGUseElementImpl.cc409
-rw-r--r--ksvg/impl/SVGUseElementImpl.h101
-rw-r--r--ksvg/impl/SVGVKernElementImpl.cc33
-rw-r--r--ksvg/impl/SVGVKernElementImpl.h46
-rw-r--r--ksvg/impl/SVGViewElementImpl.cc94
-rw-r--r--ksvg/impl/SVGViewElementImpl.h70
-rw-r--r--ksvg/impl/SVGViewSpecImpl.cc98
-rw-r--r--ksvg/impl/SVGViewSpecImpl.h69
-rw-r--r--ksvg/impl/SVGWindowImpl.cc187
-rw-r--r--ksvg/impl/SVGWindowImpl.h73
-rw-r--r--ksvg/impl/SVGZoomAndPanImpl.cc112
-rw-r--r--ksvg/impl/SVGZoomAndPanImpl.h76
-rw-r--r--ksvg/impl/SVGZoomEventImpl.cc111
-rw-r--r--ksvg/impl/SVGZoomEventImpl.h77
-rw-r--r--ksvg/impl/TODO5
-rw-r--r--ksvg/impl/generateddata.cpp8899
-rw-r--r--ksvg/impl/libs/Makefile.am1
-rw-r--r--ksvg/impl/libs/art_support/Makefile.am4
-rw-r--r--ksvg/impl/libs/art_support/art_misc.c1841
-rw-r--r--ksvg/impl/libs/art_support/art_misc.h79
-rw-r--r--ksvg/impl/libs/art_support/art_render_misc.c774
-rw-r--r--ksvg/impl/libs/art_support/art_render_misc.h90
-rw-r--r--ksvg/impl/libs/art_support/art_rgba_svp.c659
-rw-r--r--ksvg/impl/libs/art_support/art_rgba_svp.h57
-rw-r--r--ksvg/impl/libs/libtext2path/AUTHORS1
-rw-r--r--ksvg/impl/libs/libtext2path/COPYING339
-rw-r--r--ksvg/impl/libs/libtext2path/ChangeLog2
-rw-r--r--ksvg/impl/libs/libtext2path/INSTALL181
-rw-r--r--ksvg/impl/libs/libtext2path/Makefile.am7
-rw-r--r--ksvg/impl/libs/libtext2path/NEWS1
-rw-r--r--ksvg/impl/libs/libtext2path/README4
-rw-r--r--ksvg/impl/libs/libtext2path/VERSION1
-rw-r--r--ksvg/impl/libs/libtext2path/configure.in.in41
-rw-r--r--ksvg/impl/libs/libtext2path/libtext2path.lsm16
-rw-r--r--ksvg/impl/libs/libtext2path/libtext2path.pc.in11
-rw-r--r--ksvg/impl/libs/libtext2path/libtext2path.spec41
-rw-r--r--ksvg/impl/libs/libtext2path/src/Affine.cpp174
-rw-r--r--ksvg/impl/libs/libtext2path/src/Affine.h67
-rw-r--r--ksvg/impl/libs/libtext2path/src/BezierPath.h56
-rw-r--r--ksvg/impl/libs/libtext2path/src/Cache.h156
-rw-r--r--ksvg/impl/libs/libtext2path/src/Converter.cpp505
-rw-r--r--ksvg/impl/libs/libtext2path/src/Converter.h94
-rw-r--r--ksvg/impl/libs/libtext2path/src/Font.cpp252
-rw-r--r--ksvg/impl/libs/libtext2path/src/Font.h91
-rw-r--r--ksvg/impl/libs/libtext2path/src/Glyph.cpp353
-rw-r--r--ksvg/impl/libs/libtext2path/src/Glyph.h198
-rw-r--r--ksvg/impl/libs/libtext2path/src/GlyphTracer.cpp76
-rw-r--r--ksvg/impl/libs/libtext2path/src/GlyphTracer.h65
-rw-r--r--ksvg/impl/libs/libtext2path/src/Makefile.am10
-rw-r--r--ksvg/impl/libs/libtext2path/src/Point.h65
-rw-r--r--ksvg/impl/libs/libtext2path/src/QtUnicode.cpp164
-rw-r--r--ksvg/impl/libs/libtext2path/src/QtUnicode.h149
-rw-r--r--ksvg/impl/libs/libtext2path/src/Rectangle.cpp102
-rw-r--r--ksvg/impl/libs/libtext2path/src/Rectangle.h55
-rw-r--r--ksvg/impl/libs/libtext2path/src/Tools.h85
-rw-r--r--ksvg/impl/libs/libtext2path/src/myboost/assert.hpp24
-rw-r--r--ksvg/impl/libs/libtext2path/src/myboost/checked_delete.hpp61
-rw-r--r--ksvg/impl/libs/libtext2path/src/myboost/lightweight_mutex.hpp74
-rw-r--r--ksvg/impl/libs/libtext2path/src/myboost/shared_count.hpp367
-rw-r--r--ksvg/impl/libs/libtext2path/src/myboost/shared_ptr.hpp395
-rw-r--r--ksvg/impl/libs/libtext2path/src/myboost/throw_exception.hpp30
-rw-r--r--ksvg/impl/libs/xrgbrender/Makefile.am5
-rw-r--r--ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib-drawable.c1137
-rw-r--r--ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib-private.h30
-rw-r--r--ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib.c46
-rw-r--r--ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib.h78
-rw-r--r--ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlibrgb.c3425
-rw-r--r--ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlibrgb.h145
-rw-r--r--ksvg/impl/svgpathparser.cc564
-rw-r--r--ksvg/impl/svgpathparser.h63
370 files changed, 62077 insertions, 0 deletions
diff --git a/ksvg/impl/LRUCache.h b/ksvg/impl/LRUCache.h
new file mode 100644
index 00000000..879f1856
--- /dev/null
+++ b/ksvg/impl/LRUCache.h
@@ -0,0 +1,169 @@
+/*
+ Copyright (C) 2003 KSVG Team
+ 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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef LRUCACHE_H
+#define LRUCACHE_H
+
+#include <qvaluelist.h>
+
+namespace KSVG
+{
+
+// A value-based LRU cache with a maximum total cost constraint, but with the exception that the
+// most recently added item is kept in the cache even if its cost exceeds the maximum total cost.
+template<class keyType, class valueType>
+class MinOneLRUCache
+{
+public:
+ MinOneLRUCache(int maxTotalCost = 0) : m_maxTotalCost(maxTotalCost), m_totalCost(0) {}
+ virtual ~MinOneLRUCache() {}
+
+ void insert(const keyType& key, const valueType& value, int cost);
+ bool find(const keyType& key, valueType& result);
+
+ void setMaxTotalCost(int maxTotalCost);
+ int maxTotalCost() const { return m_maxTotalCost; }
+ int totalCost() const { return m_totalCost; }
+
+ void clear();
+
+protected:
+ class CacheItem
+ {
+ public:
+ CacheItem() : m_cost(0) {}
+ CacheItem(const keyType& key, const valueType& value, int cost) : m_key(key), m_value(value), m_cost(cost) {}
+
+ const keyType& key() const { return m_key; }
+ const valueType& value() const { return m_value; }
+ int cost() const { return m_cost; }
+
+ private:
+ keyType m_key;
+ valueType m_value;
+ int m_cost;
+ };
+
+ typedef QValueList<CacheItem> CacheItemList;
+
+ typename CacheItemList::iterator find(const keyType& key);
+ void enforceCostConstraint();
+
+ CacheItemList m_items;
+ int m_maxTotalCost;
+ int m_totalCost;
+};
+
+template<class keyType, class valueType>
+void MinOneLRUCache<keyType, valueType>::insert(const keyType& key, const valueType& value, int cost)
+{
+ typename CacheItemList::iterator it = find(key);
+
+ if(it != m_items.end())
+ {
+ // Replace the existing item.
+ m_totalCost -= (*it).cost();
+ m_items.erase(it);
+ }
+
+ // We always hold the most recently added item in the cache, even if it exceeds
+ // the maximum total cost.
+ m_items.push_front(CacheItem(key, value, cost));
+ m_totalCost += cost;
+ enforceCostConstraint();
+}
+
+template<class keyType, class valueType>
+bool MinOneLRUCache<keyType, valueType>::find(const keyType& key, valueType& result)
+{
+ bool foundKey = false;
+ typename CacheItemList::iterator it = find(key);
+
+ if(it != m_items.end())
+ {
+ CacheItem item = *it;
+ result = item.value();
+
+ if(it != m_items.begin())
+ {
+ // This is now the most recently used item.
+ m_items.erase(it);
+ m_items.push_front(item);
+ }
+
+ foundKey = true;
+ }
+
+ return foundKey;
+}
+
+template<class keyType, class valueType>
+typename MinOneLRUCache<keyType, valueType>::CacheItemList::iterator MinOneLRUCache<keyType, valueType>::find(const keyType& key)
+{
+ typename CacheItemList::iterator it;
+
+ for(it = m_items.begin(); it != m_items.end(); it++)
+ {
+ if((*it).key() == key)
+ break;
+ }
+
+ return it;
+}
+
+template<class keyType, class valueType>
+void MinOneLRUCache<keyType, valueType>::enforceCostConstraint()
+{
+ if(m_totalCost > m_maxTotalCost && m_items.size() > 1)
+ {
+ typename CacheItemList::iterator it = m_items.begin();
+ m_totalCost = (*it).cost();
+ ++it;
+
+ while(it != m_items.end() && m_totalCost + (*it).cost() <= m_maxTotalCost)
+ {
+ m_totalCost += (*it).cost();
+ ++it;
+ }
+
+ // Remove the remainder
+ while(it != m_items.end())
+ it = m_items.erase(it);
+ }
+}
+
+template<class keyType, class valueType>
+void MinOneLRUCache<keyType, valueType>::setMaxTotalCost(int maxTotalCost)
+{
+ m_maxTotalCost = maxTotalCost;
+ enforceCostConstraint();
+}
+
+template<class keyType, class valueType>
+void MinOneLRUCache<keyType, valueType>::clear()
+{
+ m_items.clear();
+ m_totalCost = 0;
+}
+
+}
+
+#endif
+
diff --git a/ksvg/impl/Makefile.am b/ksvg/impl/Makefile.am
new file mode 100644
index 00000000..24e40d67
--- /dev/null
+++ b/ksvg/impl/Makefile.am
@@ -0,0 +1,116 @@
+SUBDIRS = libs
+noinst_LTLIBRARIES = libksvgdomimpl.la
+
+KDE_OPTIONS = nofinal
+
+# The makefile has the following structure:
+# datatypes
+# animated datatypes
+# lists
+# animated lists
+# base classes
+# document structure
+# styling
+# paths
+# basic shapes
+# text
+# painting
+# color
+# gradients & patterns
+# clipping & masking
+# filters
+# interactivity
+# linking
+# scripting
+# animations
+# font & glyph stuff
+# metadata
+# extensibility
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+libksvgdomimpl_la_SOURCES = \
+SVGLengthImpl.cc SVGNumberImpl.cc SVGPointImpl.cc SVGTransformImpl.cc \
+SVGMatrixImpl.cc SVGRectImpl.cc SVGAngleImpl.cc \
+\
+SVGAnimatedLengthImpl.cc SVGAnimatedNumberImpl.cc SVGAnimatedIntegerImpl.cc \
+SVGAnimatedBooleanImpl.cc SVGAnimatedEnumerationImpl.cc SVGAnimatedPreserveAspectRatioImpl.cc \
+SVGAnimatedRectImpl.cc SVGAnimatedAngleImpl.cc SVGAnimatedPathDataImpl.cc SVGAnimatedStringImpl.cc \
+\
+SVGLengthListImpl.cc SVGNumberListImpl.cc SVGPointListImpl.cc SVGTransformListImpl.cc \
+SVGStringListImpl.cc SVGPathSegListImpl.cc SVGElementInstanceListImpl.cc \
+\
+SVGAnimatedLengthListImpl.cc SVGAnimatedNumberListImpl.cc \
+SVGAnimatedPointsImpl.cc SVGAnimatedTransformListImpl.cc \
+\
+SVGShapeImpl.cc SVGContainerImpl.cc SVGBBoxTarget.cc SVGHelperImpl.cc \
+SVGStylableImpl.cc SVGTransformableImpl.cc SVGTestsImpl.cc SVGLangSpaceImpl.cc \
+SVGExternalResourcesRequiredImpl.cc SVGLocatableImpl.cc SVGFitToViewBoxImpl.cc \
+SVGPreserveAspectRatioImpl.cc SVGZoomAndPanImpl.cc SVGViewSpecImpl.cc \
+\
+SVGElementImpl.cc SVGElementInstanceImpl.cc \
+SVGDocumentImpl.cc SVGSVGElementImpl.cc SVGWindowImpl.cc \
+SVGDefsElementImpl.cc SVGUseElementImpl.cc \
+SVGDescElementImpl.cc SVGTitleElementImpl.cc \
+SVGGElementImpl.cc SVGSwitchElementImpl.cc \
+SVGSymbolElementImpl.cc SVGImageElementImpl.cc \
+SVGURIReferenceImpl.cc \
+\
+SVGStyleElementImpl.cc SVGCSSRuleImpl.cc \
+\
+SVGPathElementImpl.cc SVGPathSegImpl.cc SVGPathSegClosePathImpl.cc SVGPathSegArcImpl.cc \
+SVGPathSegMovetoImpl.cc SVGPathSegCurvetoQuadraticImpl.cc SVGPathSegCurvetoQuadraticSmoothImpl.cc \
+SVGPathSegCurvetoCubicImpl.cc SVGPathSegCurvetoCubicSmoothImpl.cc SVGPathSegLinetoImpl.cc \
+SVGPathSegLinetoHorizontalImpl.cc SVGPathSegLinetoVerticalImpl.cc \
+\
+SVGRectElementImpl.cc SVGCircleElementImpl.cc SVGEllipseElementImpl.cc SVGLineElementImpl.cc \
+SVGPolyElementImpl.cc SVGPolylineElementImpl.cc SVGPolygonElementImpl.cc \
+\
+SVGTextElementImpl.cc SVGTSpanElementImpl.cc SVGTRefElementImpl.cc \
+SVGTextPositioningElementImpl.cc SVGTextContentElementImpl.cc SVGTextPathElementImpl.cc \
+\
+SVGPaintImpl.cc SVGMarkerElementImpl.cc \
+\
+SVGColorImpl.cc SVGICCColorImpl.cc SVGColorProfileElementImpl.cc SVGColorProfileRuleImpl.cc \
+\
+SVGPaintServerImpl.cc SVGGradientElementImpl.cc SVGStopElementImpl.cc \
+SVGLinearGradientElementImpl.cc SVGRadialGradientElementImpl.cc SVGPatternElementImpl.cc \
+\
+SVGClipPathElementImpl.cc SVGMaskElementImpl.cc \
+\
+SVGFilterElementImpl.cc SVGFilterPrimitiveStandardAttributesImpl.cc \
+SVGFEBlendElementImpl.cc SVGFEColorMatrixElementImpl.cc \
+SVGFEComponentTransferElementImpl.cc SVGComponentTransferFunctionElementImpl.cc \
+SVGFEFuncAElementImpl.cc SVGFEFuncBElementImpl.cc SVGFEFuncGElementImpl.cc \
+SVGFEFuncRElementImpl.cc SVGFECompositeElementImpl.cc SVGFEConvolveMatrixElementImpl.cc \
+SVGFEFloodElementImpl.cc SVGFEGaussianBlurElementImpl.cc SVGFEDiffuseLightingElementImpl.cc \
+SVGFEDistantLightElementImpl.cc SVGFEPointLightElementImpl.cc SVGFESpotLightElementImpl.cc \
+SVGFEDisplacementMapElementImpl.cc SVGFEMergeElementImpl.cc SVGFEMergeNodeElementImpl.cc \
+SVGFEImageElementImpl.cc SVGFEMorphologyElementImpl.cc SVGFEOffsetElementImpl.cc \
+SVGFESpecularLightingElementImpl.cc SVGFETileElementImpl.cc SVGFETurbulenceElementImpl.cc \
+\
+SVGCursorElementImpl.cc \
+\
+SVGAElementImpl.cc SVGViewElementImpl.cc \
+\
+SVGScriptElementImpl.cc SVGEventImpl.cc SVGZoomEventImpl.cc \
+SVGEcma.cc generateddata.cpp \
+\
+SVGAnimationElementImpl.cc SVGAnimateElementImpl.cc SVGSetElementImpl.cc \
+SVGAnimateMotionElementImpl.cc SVGAnimateColorElementImpl.cc \
+SVGAnimateTransformElementImpl.cc SVGMPathElementImpl.cc SVGTimeScheduler.cc \
+\
+SVGFontElementImpl.cc SVGAltGlyphElementImpl.cc SVGAltGlyphDefElementImpl.cc \
+SVGGlyphRefElementImpl.cc SVGGlyphElementImpl.cc SVGMissingGlyphElementImpl.cc \
+SVGFontFaceElementImpl.cc SVGFontFaceFormatElementImpl.cc SVGFontFaceNameElementImpl.cc \
+SVGFontFaceSrcElementImpl.cc SVGFontFaceUriElementImpl.cc SVGDefinitionSrcElementImpl.cc \
+SVGHKernElementImpl.cc SVGVKernElementImpl.cc \
+\
+SVGMetadataElementImpl.cc \
+\
+SVGForeignObjectElementImpl.cc \
+\
+svgpathparser.cc
+
+libksvgdomimpl_la_METASOURCES = AUTO
+
+INCLUDES = $(FREETYPE_CFLAGS) -I$(top_srcdir)/ksvg/core -I$(top_srcdir)/ksvg/dom -I$(top_srcdir)/ksvg/ecma -I$(top_srcdir)/ksvg/data -I$(top_srcdir)/ksvg/impl/libs/art_support -I$(top_srcdir)/ksvg/impl/libs/libtext2path/src $(all_includes)
diff --git a/ksvg/impl/SVGAElementImpl.cc b/ksvg/impl/SVGAElementImpl.cc
new file mode 100644
index 00000000..153ff5ff
--- /dev/null
+++ b/ksvg/impl/SVGAElementImpl.cc
@@ -0,0 +1,117 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAElementImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGAnimatedStringImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGAElementImpl::SVGAElementImpl(DOM::ElementImpl *impl) : SVGContainerImpl(impl), SVGURIReferenceImpl(), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_target = new SVGAnimatedStringImpl();
+ m_target->ref();
+}
+
+SVGAElementImpl::~SVGAElementImpl()
+{
+ if(m_target)
+ m_target->deref();
+}
+
+/*
+@namespace KSVG
+@begin SVGAElementImpl::s_hashTable 2
+ target SVGAElementImpl::Target DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case Target:
+ return m_target->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGAElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case Target:
+ {
+ if(m_target)
+ m_target->deref();
+
+ SVGAnimatedStringImpl *temp = new SVGAnimatedStringImpl();
+ temp->ref();
+ temp->setBaseVal(value.toString(exec).string());
+ setTarget(temp);
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+void SVGAElementImpl::setTarget(SVGAnimatedStringImpl *target)
+{
+ m_target = target;
+}
+
+SVGAnimatedStringImpl *SVGAElementImpl::target() const
+{
+ return m_target;
+}
+
+SVGAElementImpl *SVGAElementImpl::getLink(SVGElementImpl *sourceElem)
+{
+ for(DOM::Node node = *sourceElem; !node.isNull(); node = node.parentNode())
+ {
+ SVGElementImpl *elem = sourceElem->ownerDoc()->getElementFromHandle(node.handle());
+ if(elem)
+ {
+ SVGAElementImpl *link = dynamic_cast<SVGAElementImpl *>(elem);
+ if(link)
+ return link;
+ }
+ }
+
+ return false;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAElementImpl.h b/ksvg/impl/SVGAElementImpl.h
new file mode 100644
index 00000000..2da4c3d4
--- /dev/null
+++ b/ksvg/impl/SVGAElementImpl.h
@@ -0,0 +1,79 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAElementImpl_H
+#define SVGAElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGContainerImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGAElementImpl : public SVGContainerImpl,
+ public SVGURIReferenceImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGAElementImpl(DOM::ElementImpl *);
+ virtual ~SVGAElementImpl();
+
+ void setTarget(SVGAnimatedStringImpl *target);
+ SVGAnimatedStringImpl *target() const;
+
+ static SVGAElementImpl *getLink(SVGElementImpl *sourceElem);
+
+private:
+ SVGAnimatedStringImpl *m_target;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ Target
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGAElementImpl, "a")
+
+}
+
+#endif
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAltGlyphDefElementImpl.cc b/ksvg/impl/SVGAltGlyphDefElementImpl.cc
new file mode 100644
index 00000000..2a0b5fe9
--- /dev/null
+++ b/ksvg/impl/SVGAltGlyphDefElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAltGlyphDefElementImpl.h"
+
+using namespace KSVG;
+
+SVGAltGlyphDefElementImpl::SVGAltGlyphDefElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+}
+
+SVGAltGlyphDefElementImpl::~SVGAltGlyphDefElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAltGlyphDefElementImpl.h b/ksvg/impl/SVGAltGlyphDefElementImpl.h
new file mode 100644
index 00000000..cc1c92f4
--- /dev/null
+++ b/ksvg/impl/SVGAltGlyphDefElementImpl.h
@@ -0,0 +1,49 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAltGlyphDefElementImpl_H
+#define SVGAltGlyphDefElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGAltGlyphDefElementImpl : public SVGElementImpl
+{
+public:
+ SVGAltGlyphDefElementImpl(DOM::ElementImpl *);
+ virtual ~SVGAltGlyphDefElementImpl();
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGAltGlyphDefElementImpl, "altGlyphDef")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAltGlyphElementImpl.cc b/ksvg/impl/SVGAltGlyphElementImpl.cc
new file mode 100644
index 00000000..d426bd74
--- /dev/null
+++ b/ksvg/impl/SVGAltGlyphElementImpl.cc
@@ -0,0 +1,50 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGSVGElementImpl.h"
+#include "SVGAltGlyphElementImpl.h"
+
+using namespace KSVG;
+
+SVGAltGlyphElementImpl::SVGAltGlyphElementImpl(DOM::ElementImpl *impl) : SVGTSpanElementImpl(impl), SVGURIReferenceImpl()
+{
+}
+
+SVGAltGlyphElementImpl::~SVGAltGlyphElementImpl()
+{
+}
+
+void SVGAltGlyphElementImpl::setAttributes()
+{
+ SVGTSpanElementImpl::setAttributes();
+}
+
+DOM::DOMString SVGAltGlyphElementImpl::format()
+{
+ return "";
+}
+
+DOM::DOMString SVGAltGlyphElementImpl::glyphRef()
+{
+ return "";
+}
+
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAltGlyphElementImpl.h b/ksvg/impl/SVGAltGlyphElementImpl.h
new file mode 100644
index 00000000..8dcfe479
--- /dev/null
+++ b/ksvg/impl/SVGAltGlyphElementImpl.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAltGlyphElementImpl_H
+#define SVGAltGlyphElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTSpanElementImpl.h"
+#include "SVGURIReferenceImpl.h"
+
+namespace KSVG
+{
+
+class SVGAltGlyphElementImpl : public SVGTSpanElementImpl,
+ public SVGURIReferenceImpl
+{
+public:
+ SVGAltGlyphElementImpl(DOM::ElementImpl *);
+ virtual ~SVGAltGlyphElementImpl();
+ virtual void setAttributes();
+
+ DOM::DOMString glyphRef();
+ DOM::DOMString format();
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGAltGlyphElementImpl, "altGlyph")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAngleImpl.cc b/ksvg/impl/SVGAngleImpl.cc
new file mode 100644
index 00000000..6102329d
--- /dev/null
+++ b/ksvg/impl/SVGAngleImpl.cc
@@ -0,0 +1,277 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAngle.h"
+
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAngleImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_cacheimpl.h"
+
+const double deg2rad = 0.017453292519943295769; // pi/180
+const double deg2grad = 400.0 / 360.0;
+const double rad2grad = deg2grad / deg2rad;
+
+SVGAngleImpl::SVGAngleImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_unitType = SVG_ANGLETYPE_UNKNOWN;
+ m_valueInSpecifiedUnits = 0;
+ m_value = 0;
+}
+
+SVGAngleImpl::~SVGAngleImpl()
+{
+}
+
+unsigned short SVGAngleImpl::unitType() const
+{
+ return m_unitType;
+}
+
+void SVGAngleImpl::setValue(float value)
+{
+ m_value = value;
+}
+
+float SVGAngleImpl::value() const
+{
+ return m_value;
+}
+
+// calc m_value
+void SVGAngleImpl::calculate()
+{
+ if(m_unitType == SVG_ANGLETYPE_GRAD)
+ m_value = m_valueInSpecifiedUnits / deg2grad;
+ else if(m_unitType == SVG_ANGLETYPE_RAD)
+ m_value = m_valueInSpecifiedUnits / deg2rad;
+ else if(m_unitType == SVG_ANGLETYPE_UNSPECIFIED || m_unitType == SVG_ANGLETYPE_DEG)
+ m_value = m_valueInSpecifiedUnits;
+}
+
+void SVGAngleImpl::setValueInSpecifiedUnits(float valueInSpecifiedUnits)
+{
+ m_valueInSpecifiedUnits = valueInSpecifiedUnits;
+ calculate();
+}
+
+float SVGAngleImpl::valueInSpecifiedUnits() const
+{
+ return m_valueInSpecifiedUnits;
+}
+
+void SVGAngleImpl::setValueAsString(const DOM::DOMString &valueAsString)
+{
+ m_valueAsString = valueAsString;
+
+ QString s = valueAsString.string();
+
+ bool bOK;
+ m_valueInSpecifiedUnits = s.toFloat(&bOK);
+ m_unitType = SVG_ANGLETYPE_UNSPECIFIED;
+
+ if(!bOK)
+ {
+ if(s.endsWith("deg"))
+ m_unitType = SVG_ANGLETYPE_DEG;
+ else if(s.endsWith("grad"))
+ m_unitType = SVG_ANGLETYPE_GRAD;
+ else if(s.endsWith("rad"))
+ m_unitType = SVG_ANGLETYPE_RAD;
+ }
+
+ calculate();
+}
+
+DOM::DOMString SVGAngleImpl::valueAsString() const
+{
+ m_valueAsString.string().setNum(m_valueInSpecifiedUnits);
+
+ switch(m_unitType)
+ {
+ case SVG_ANGLETYPE_UNSPECIFIED:
+ case SVG_ANGLETYPE_DEG:
+ m_valueAsString.string() += "deg";
+ break;
+ case SVG_ANGLETYPE_RAD:
+ m_valueAsString.string() += "rad";
+ break;
+ case SVG_ANGLETYPE_GRAD:
+ m_valueAsString.string() += "grad";
+ break;
+ }
+
+ return m_valueAsString;
+}
+
+void SVGAngleImpl::newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits)
+{
+ m_unitType = unitType;
+ m_valueInSpecifiedUnits = valueInSpecifiedUnits;
+ calculate();
+}
+
+void SVGAngleImpl::convertToSpecifiedUnits(unsigned short unitType)
+{
+ if(m_unitType == unitType)
+ return;
+
+ if(m_unitType == SVG_ANGLETYPE_DEG && unitType == SVG_ANGLETYPE_RAD)
+ m_valueInSpecifiedUnits *= deg2rad;
+ else if(m_unitType == SVG_ANGLETYPE_GRAD && unitType == SVG_ANGLETYPE_RAD)
+ m_valueInSpecifiedUnits /= rad2grad;
+ else if(m_unitType == SVG_ANGLETYPE_DEG && unitType == SVG_ANGLETYPE_GRAD)
+ m_valueInSpecifiedUnits *= deg2grad;
+ else if(m_unitType == SVG_ANGLETYPE_RAD && unitType == SVG_ANGLETYPE_GRAD)
+ m_valueInSpecifiedUnits *= rad2grad;
+ else if(m_unitType == SVG_ANGLETYPE_RAD && unitType == SVG_ANGLETYPE_DEG)
+ m_valueInSpecifiedUnits /= deg2rad;
+ else if(m_unitType == SVG_ANGLETYPE_GRAD && unitType == SVG_ANGLETYPE_DEG)
+ m_valueInSpecifiedUnits /= deg2grad;
+
+ m_unitType = unitType;
+}
+
+// Helpers
+double SVGAngleImpl::todeg(double rad)
+{
+ return rad / deg2rad;
+}
+
+double SVGAngleImpl::torad(double deg)
+{
+ return deg * deg2rad;
+}
+
+double SVGAngleImpl::shortestArcBisector(double angle1, double angle2)
+{
+ double bisector = (angle1 + angle2) / 2;
+
+ if(fabs(angle1 - angle2) > 180)
+ bisector += 180;
+
+ return bisector;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAngleImpl::s_hashTable 5
+ value SVGAngleImpl::Value DontDelete
+ valueInSpecifiedUnits SVGAngleImpl::ValueInSpecifiedUnits DontDelete
+ valueAsString SVGAngleImpl::ValueAsString DontDelete
+ unitType SVGAngleImpl::UnitType DontDelete
+@end
+@namespace KSVG
+@begin SVGAngleImplProto::s_hashTable 3
+ convertToSpecifiedUnits SVGAngleImpl::ConvertToSpecifiedUnits DontDelete|Function 1
+ newValueSpecifiedUnits SVGAngleImpl::NewValueSpecifiedUnits DontDelete|Function 2
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGAngle", SVGAngleImplProto, SVGAngleImplProtoFunc)
+
+Value SVGAngleImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case Value:
+ return Number(value());
+ case ValueInSpecifiedUnits:
+ return Number(valueInSpecifiedUnits());
+ case ValueAsString:
+ return String(valueAsString().string());
+ case UnitType:
+ return Number(unitType());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGAngleImpl::putValueProperty(ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case Value:
+ setValue(value.toNumber(exec));
+ break;
+ case ValueInSpecifiedUnits:
+ setValueInSpecifiedUnits(value.toNumber(exec));
+ break;
+ case ValueAsString:
+ setValueAsString(value.toString(exec).string());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+Value SVGAngleImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGAngleImpl)
+
+ switch(id)
+ {
+ case SVGAngleImpl::ConvertToSpecifiedUnits:
+ obj->convertToSpecifiedUnits(static_cast<unsigned short>(args[0].toNumber(exec)));
+ break;
+ case SVGAngleImpl::NewValueSpecifiedUnits:
+ obj->newValueSpecifiedUnits(static_cast<unsigned short>(args[0].toNumber(exec)), args[1].toNumber(exec));
+ break;
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+/*
+@namespace KSVG
+@begin SVGAngleImplConstructor::s_hashTable 7
+ SVG_ANGLETYPE_UNKNOWN KSVG::SVG_ANGLETYPE_UNKNOWN DontDelete|ReadOnly
+ SVG_ANGLETYPE_UNSPECIFIED KSVG::SVG_ANGLETYPE_UNSPECIFIED DontDelete|ReadOnly
+ SVG_ANGLETYPE_RAD KSVG::SVG_ANGLETYPE_RAD DontDelete|ReadOnly
+ SVG_ANGLETYPE_DEG KSVG::SVG_ANGLETYPE_DEG DontDelete|ReadOnly
+ SVG_ANGLETYPE_GRAD KSVG::SVG_ANGLETYPE_GRAD DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAngleImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGAngleImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGAngleImplConstructor>(exec, "[[svgangle.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAngleImpl.h b/ksvg/impl/SVGAngleImpl.h
new file mode 100644
index 00000000..d3c656de
--- /dev/null
+++ b/ksvg/impl/SVGAngleImpl.h
@@ -0,0 +1,102 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAngleImpl_H
+#define SVGAngleImpl_H
+
+#include <dom/dom_misc.h>
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAngleImpl : public DOM::DomShared
+{
+public:
+ SVGAngleImpl();
+ virtual ~SVGAngleImpl();
+
+ unsigned short unitType() const;
+
+ void setValue(float value);
+ float value() const;
+
+ void setValueInSpecifiedUnits(float valueInSpecifiedUnits);
+ float valueInSpecifiedUnits() const;
+
+ void setValueAsString(const DOM::DOMString &valueAsString);
+ DOM::DOMString valueAsString() const;
+
+ void newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits);
+ void convertToSpecifiedUnits(unsigned short unitType);
+
+ // Helpers
+ static double todeg(double rad);
+ static double torad(double deg);
+
+ // Returns the angle that divides the shortest arc between the two angles.
+ static double shortestArcBisector(double angle1, double angle2);
+
+private:
+ unsigned short m_unitType;
+ float m_value;
+ float m_valueInSpecifiedUnits;
+ DOM::DOMString m_valueAsString;
+
+ void calculate();
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ Value, ValueInSpecifiedUnits, ValueAsString, UnitType,
+ // Functions
+ ConvertToSpecifiedUnits, NewValueSpecifiedUnits
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGAngleImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGAngleImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGAngleImplConstructor(KJS::ExecState *exec);
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGAngleImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGAngleImplProtoFunc, SVGAngleImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimateColorElementImpl.cc b/ksvg/impl/SVGAnimateColorElementImpl.cc
new file mode 100644
index 00000000..c4cc0ad4
--- /dev/null
+++ b/ksvg/impl/SVGAnimateColorElementImpl.cc
@@ -0,0 +1,98 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <math.h>
+
+#include <kdebug.h>
+
+#include "SVGColorImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGAnimateColorElementImpl.h"
+
+using namespace KSVG;
+
+SVGAnimateColorElementImpl::SVGAnimateColorElementImpl(DOM::ElementImpl *impl) : SVGAnimationElementImpl(impl)
+{
+ m_fromColor = new SVGColorImpl(this);
+ m_fromColor->ref();
+
+ m_toColor = new SVGColorImpl(this);
+ m_toColor->ref();
+}
+
+SVGAnimateColorElementImpl::~SVGAnimateColorElementImpl()
+{
+ m_fromColor->deref();
+ m_toColor->deref();
+}
+
+/*
+ * Outstanding issues
+ * - 'values' support
+ * - 'by' support
+ */
+
+void SVGAnimateColorElementImpl::setAttributes()
+{
+ SVGAnimationElementImpl::setAttributes();
+
+ SVGStylableImpl::setColor(getFrom(), m_fromColor);
+ SVGStylableImpl::setColor(getTo(), m_toColor);
+
+ ownerDoc()->timeScheduler()->addTimer(this, int(getStartTime() * 1000.0));
+}
+
+void SVGAnimateColorElementImpl::handleTimerEvent()
+{
+ if(!m_connected)
+ {
+ double duration = getSimpleDuration() * 1000.0;
+ double dinterval = SVGTimeScheduler::staticTimerInterval;
+
+ m_step = 0;
+ m_steps = (int) rint(duration / dinterval);
+
+ m_connected = true;
+ ownerDoc()->timeScheduler()->connectIntervalTimer(this);
+ }
+ else
+ {
+ QColor fromColor(m_fromColor->rgbColor().color());
+ QColor toColor(m_toColor->rgbColor().color());
+
+ int red = (int) rint(((toColor.red() - fromColor.red()) / static_cast<double>(m_steps)) * m_step + fromColor.red());
+ int green = (int) rint(((toColor.green() - fromColor.green()) / static_cast<double>(m_steps)) * m_step + fromColor.green());
+ int blue = (int) rint(((toColor.blue() - fromColor.blue()) / static_cast<double>(m_steps)) * m_step + fromColor.blue());
+
+ QString color = "rgb(" + QString::number(red) + "," + QString::number(green) + "," + QString::number(blue) + ")";
+ applyAttribute(getAttributeName(), color);
+ }
+
+ if(m_step < m_steps)
+ m_step++;
+ else
+ {
+ ownerDoc()->timeScheduler()->disconnectIntervalTimer(this);
+ m_connected = false;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimateColorElementImpl.h b/ksvg/impl/SVGAnimateColorElementImpl.h
new file mode 100644
index 00000000..2832802e
--- /dev/null
+++ b/ksvg/impl/SVGAnimateColorElementImpl.h
@@ -0,0 +1,60 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimateColorElementImpl_H
+#define SVGAnimateColorElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGAnimationElementImpl.h"
+
+class QTimer;
+
+namespace KSVG
+{
+
+class SVGColorImpl;
+class SVGAnimateColorElementImpl : public SVGAnimationElementImpl
+{
+public:
+ SVGAnimateColorElementImpl(DOM::ElementImpl *);
+ virtual ~SVGAnimateColorElementImpl();
+
+ virtual void handleTimerEvent();
+ virtual void setAttributes();
+
+private:
+ SVGColorImpl *m_toColor, *m_fromColor;
+
+ int m_steps, m_step;
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGAnimateColorElementImpl, "animateColor")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimateElementImpl.cc b/ksvg/impl/SVGAnimateElementImpl.cc
new file mode 100644
index 00000000..ab9bc52c
--- /dev/null
+++ b/ksvg/impl/SVGAnimateElementImpl.cc
@@ -0,0 +1,191 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGDocumentImpl.h"
+#include "SVGAnimateElementImpl.h"
+
+using namespace KSVG;
+
+SVGAnimateElementImpl::SVGAnimateElementImpl(DOM::ElementImpl *impl) : SVGAnimationElementImpl(impl)
+{
+ m_animVal = 0.0;
+ m_addStep = 0.0;
+}
+
+SVGAnimateElementImpl::~SVGAnimateElementImpl()
+{
+}
+
+void SVGAnimateElementImpl::setAttributes()
+{
+ SVGAnimationElementImpl::setAttributes();
+
+ ownerDoc()->timeScheduler()->addTimer(this, int(getStartTime() * 1000.0));
+}
+
+void SVGAnimateElementImpl::handleTimerEvent()
+{
+ if(!m_connected)
+ {
+ double duration = getSimpleDuration() * 1000.0;
+ double dinterval = SVGTimeScheduler::staticTimerInterval;
+
+ m_step = 0;
+ m_steps = (int) rint(duration / dinterval);
+
+ double to = 0, from = 0;
+ if(getTo().isEmpty())
+ to = targetElement()->getAttribute(getAttributeName()).string().toDouble();
+ else
+ to = getTo().toDouble();
+
+ if(getFrom().isEmpty())
+ from = targetElement()->getAttribute(getAttributeName()).string().toDouble();
+ else
+ from = getFrom().toDouble();
+
+ // 'by' support
+ if(!getBy().isEmpty())
+ {
+ m_animVal = from;
+ m_addStep = getBy().toDouble() / m_steps;
+ }
+ else
+ {
+ m_animVal = from;
+ m_addStep = (to - m_animVal) / m_steps;
+ }
+
+ m_connected = true;
+ ownerDoc()->timeScheduler()->connectIntervalTimer(this);
+ }
+ else
+ {
+ m_animVal += m_addStep;
+ applyAttribute(getAttributeName(), QString::number(m_animVal));
+ }
+
+ if(m_step < m_steps)
+ m_step++;
+ else
+ {
+ ownerDoc()->timeScheduler()->disconnectIntervalTimer(this);
+ m_connected = false;
+ if(m_fill == REMOVE)
+ applyAttribute(getAttributeName(), targetElement()->getAttribute(getAttributeName()).string());
+ }
+
+#if 0
+ m_attributeTimer = addTimer(interval() * 1000, false);
+
+
+ /*
+ m_steps = (getSimpleDuration() * 1000) / SVGAnimationElementImpl::timerTime;
+ m_step = 0;
+
+ if(m_additive == "sum" && m_times == 1 && !needCombine)
+ {
+ float add;
+
+ SVGLengthImpl *temp = new SVGLengthImpl();
+ temp->ref();
+ temp->setValueAsString(targetElement()->getAttribute(m_attributeName).string());
+ add = temp->value();
+ temp->deref();
+
+ m_from += add;
+ m_newFrom += add;
+ m_to += add;
+ m_newTo += add;
+
+ m_additiveAdded = add;
+ }
+
+ m_addStep = (m_to - m_from) / m_steps;
+ m_attributeTimer = addTimer(SVGAnimationElementImpl::timerTime, false);*/
+ }
+ else
+ {
+/* m_from += m_addStep;
+
+ if(m_additive == "replace" && needCombine)
+ needCombine = false;
+
+ applyAttribute(m_attributeName, QString::number(m_from), needCombine);
+
+ m_step++;
+
+ if(m_step == m_steps)
+ {
+ removeTimer(m_attributeTimer);
+
+ if(getRepeatDuration() == "indefinite" || getRepeatCount() == "indefinite")
+ {
+ m_times++;
+ m_firstEvent = true;
+
+ if(m_accumulate != "sum")
+ {
+ m_from = m_newFrom;
+ m_to = m_newTo;
+ }
+ else
+ {
+ m_from += (m_newFrom - m_additiveAdded) / 2;
+ m_to += (m_newTo - m_additiveAdded) / 2;
+ }
+
+ m_addStep = 0;
+ m_attributeTimer = 0;
+
+ addTimer(1);
+ }
+ else if(!getRepeatCount().isEmpty())
+ {
+ if(m_times <= getRepeatCount().toInt())
+ {
+ m_times++;
+ m_firstEvent = true;
+
+ if(m_accumulate != "sum")
+ {
+ m_from = m_newFrom;
+ m_to = m_newTo;
+ }
+ else
+ {
+ m_from += (m_newFrom - m_additiveAdded) / 2;
+ m_to += (m_newTo - m_additiveAdded) / 2;
+ }
+
+ m_addStep = 0;
+ m_attributeTimer = 0;
+
+ addTimer(1);
+ }
+ }
+ }*/
+ }
+#endif // 0
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimateElementImpl.h b/ksvg/impl/SVGAnimateElementImpl.h
new file mode 100644
index 00000000..855ced6e
--- /dev/null
+++ b/ksvg/impl/SVGAnimateElementImpl.h
@@ -0,0 +1,59 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimateElementImpl_H
+#define SVGAnimateElementImpl_H
+
+#include "ksvg_lookup.h"
+#include "SVGAnimationElementImpl.h"
+
+class QTimer;
+
+namespace KSVG
+{
+
+class SVGAnimateElementImpl : public SVGAnimationElementImpl
+{
+public:
+ SVGAnimateElementImpl(DOM::ElementImpl *);
+ virtual ~SVGAnimateElementImpl();
+
+ virtual void handleTimerEvent();
+ virtual void setAttributes();
+
+private:
+ double m_addStep, m_animVal;
+ QTimer *m_timer;
+
+ int m_steps, m_step;
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGAnimateElementImpl, "animate")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimateMotionElementImpl.cc b/ksvg/impl/SVGAnimateMotionElementImpl.cc
new file mode 100644
index 00000000..ce756d55
--- /dev/null
+++ b/ksvg/impl/SVGAnimateMotionElementImpl.cc
@@ -0,0 +1,102 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+// TODO: CLEANUP
+
+#include <dom/dom_doc.h>
+#include "SVGDocumentImpl.h"
+#include "SVGPathElementImpl.h"
+#include "SVGAnimateMotionElementImpl.h"
+
+using namespace KSVG;
+
+SVGAnimateMotionElementImpl::SVGAnimateMotionElementImpl(DOM::ElementImpl *impl) : SVGAnimationElementImpl(impl)
+{
+}
+
+SVGAnimateMotionElementImpl::~SVGAnimateMotionElementImpl()
+{
+}
+
+void SVGAnimateMotionElementImpl::setAttributes()
+{
+ SVGAnimationElementImpl::setAttributes();
+
+/*
+ // TODO: rotate..
+
+ DOM::DOMString _path = getAttribute("path");
+ if(!_path.isNull())
+ {
+ if(m_path)
+ m_path->deref();
+
+ m_path = new SVGPathElementImpl(reinterpret_cast<DOM::ElementImpl *>(static_cast<DOM::Document *>(ownerDoc())->createElement("path").handle()));
+ m_path->setOwnerDoc(ownerDoc());
+ m_path->setAttribute("d", _path);
+ m_path->setAttributes();
+ }
+
+ addTimer(int(getStartTime() * 1000));*/
+}
+
+//void SVGAnimateMotionElementImpl::prerender(KSVGPainter *p)
+//{
+// SVGAnimationElementImpl::prerender(p);
+
+/* if(!m_pathArray)
+ {
+ bool temp;
+ m_pathArray = m_path->preparePath(&temp, p->worldMatrix());
+ }*/
+//}
+
+void SVGAnimateMotionElementImpl::handleTimerEvent(bool /*needCombine*/)
+{
+/* if(m_firstEvent)
+ {
+ m_firstEvent = false;
+
+ m_steps = (int) (getSimpleDuration() * 1000) / interval();
+ m_step = 0;
+
+ m_motionTimer = addTimer(interval() * 1000, false);
+ }
+ else
+ {
+ m_step++;
+
+ if(m_step <= m_pathArray->count() - 1)
+ {
+ QPoint p = m_pathArray->point(m_step - 50);
+ applyAttribute("x", QString::number(p.x()));
+ applyAttribute("y", QString::number(p.y()));
+ kdDebug() << " X " << p.x() << " Y " << p.y() << " (" << m_pathArray->count() << "; " << m_step << ")" <<endl;
+ }
+
+ if(m_step == m_steps)
+ {
+ // TODO: repeat
+ removeTimer(m_motionTimer);
+ }
+ }*/
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimateMotionElementImpl.h b/ksvg/impl/SVGAnimateMotionElementImpl.h
new file mode 100644
index 00000000..fed4c550
--- /dev/null
+++ b/ksvg/impl/SVGAnimateMotionElementImpl.h
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimateMotionElementImpl_H
+#define SVGAnimateMotionElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGAnimationElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathElementImpl;
+class SVGAnimateMotionElementImpl : public SVGAnimationElementImpl
+{
+public:
+ SVGAnimateMotionElementImpl(DOM::ElementImpl *);
+ virtual ~SVGAnimateMotionElementImpl();
+
+ virtual void handleTimerEvent(bool needCombine = false);
+ virtual void setAttributes();
+
+private:
+ int m_steps, m_step;
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGAnimateMotionElementImpl, "animateMotion")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimateTransformElementImpl.cc b/ksvg/impl/SVGAnimateTransformElementImpl.cc
new file mode 100644
index 00000000..d2634bb1
--- /dev/null
+++ b/ksvg/impl/SVGAnimateTransformElementImpl.cc
@@ -0,0 +1,257 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qstringlist.h>
+
+#include "SVGLengthImpl.h"
+#include "SVGHelperImpl.h"
+#include "SVGTransformImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGTransformListImpl.h"
+#include "SVGAnimatedTransformListImpl.h"
+#include "SVGAnimateTransformElementImpl.h"
+
+using namespace KSVG;
+
+SVGAnimateTransformElementImpl::SVGAnimateTransformElementImpl(DOM::ElementImpl *impl) : SVGAnimationElementImpl(impl)
+{
+ m_firstEvent = true;
+ m_setAttributes = false;
+
+ m_rotateX = -1;
+ m_rotateY = -1;
+ m_times = 1;
+ m_from = 0;
+ m_to = 0;
+
+ m_addStep = 0;
+}
+
+SVGAnimateTransformElementImpl::~SVGAnimateTransformElementImpl()
+{
+}
+
+void SVGAnimateTransformElementImpl::setAttributes()
+{
+ if(m_setAttributes)
+ return;
+
+ m_setAttributes = true;
+
+ SVGAnimationElementImpl::setAttributes();
+
+ /*
+ // TODO: much :)
+
+ DOM::DOMString _type = getAttribute("type");
+ if(!_type.isNull())
+ m_type = _type.string().lower();
+
+ DOM::DOMString _from = getAttribute("from");
+ if(!_from.isNull())
+ {
+ if(m_type != "rotate")
+ {
+ SVGLengthImpl *temp = SVGSVGElementImpl::createSVGLength();
+ temp->setValueAsString(_from.string());
+
+ m_from = temp->value();
+
+ temp->deref();
+ }
+ else
+ {
+ SVGTransformListImpl *list = new SVGTransformListImpl();
+ list->ref();
+
+ SVGHelperImpl::parseTransformAttribute(list, m_type + "(" + _from.string() + ")");
+
+ m_from = list->getFirst()->angle();
+
+ QStringList stringList = QStringList::split(' ', list->getFirst()->toString());
+ m_rotateX = stringList[1].toInt();
+ m_rotateY = stringList[2].mid(0, stringList[2].length() - 1).toInt();
+
+ list->deref();
+ }
+
+ m_newFrom = m_from;
+ m_addStep = m_from;
+ }
+
+ DOM::DOMString _to = getAttribute("to");
+ if(!_to.isNull())
+ {
+ if(m_type != "rotate")
+ {
+ SVGLengthImpl *temp = SVGSVGElementImpl::createSVGLength();
+ temp->setValueAsString(_to.string());
+
+ m_to = temp->value();
+
+ temp->deref();
+ }
+ else
+ {
+ SVGTransformListImpl *list = new SVGTransformListImpl();
+ list->ref();
+
+ SVGHelperImpl::parseTransformAttribute(list, m_type + "(" + _to.string() + ")");
+
+ m_to = list->getFirst()->angle();
+
+ list->deref();
+ }
+
+ m_newTo = m_to;
+ }
+
+ // TODO: values + rotate including cx + cy
+ DOM::DOMString _values = getAttribute("values");
+ if(!_values.isNull())
+ {
+ QString test = _values.string();
+
+ if(test.contains(";"))
+ {
+ SVGLengthImpl *temp = SVGSVGElementImpl::createSVGLength();
+
+ QStringList list = QStringList::split(';', test);
+ temp->setValueAsString(list[0]);
+ m_from = temp->value();
+ temp->setValueAsString(list[1]);
+ m_to = temp->value();
+
+ m_newFrom = m_from;
+ m_newTo = m_to;
+ m_addStep = m_from;
+
+ temp->deref();
+ }
+ }
+
+ if(getStartTime() != -1)
+ addTimer(int(getStartTime() * 1000));
+ else
+ addTimer(1);
+ */
+}
+
+void SVGAnimateTransformElementImpl::handleTimerEvent(bool)
+{ /*
+ if(m_firstEvent)
+ {
+ m_firstEvent = false;
+
+ m_steps = (int) (getSimpleDuration() * 1000) / interval();
+ m_step = 0;
+
+ m_addStep = (m_to - m_from) / m_steps;
+
+ m_transformTimer = addTimer(interval() * 1000, false);
+ }
+ else
+ {
+ m_from += m_addStep;
+
+ SVGTransformImpl *transform = SVGSVGElementImpl::createSVGTransform();
+
+ if(m_type == "rotate")
+ {
+ int x = 0, y = 0;
+
+ if(m_rotateX != -1)
+ x = m_rotateX;
+
+ if(m_rotateY != -1)
+ y = m_rotateY;
+
+ transform->setRotate(m_from, x, y);
+ }
+ else if(m_type == "scale")
+ transform->setScale(m_from, m_from);
+ else if(m_type == "skewx")
+ transform->setSkewX(m_from);
+ else if(m_type == "skewy")
+ transform->setSkewY(m_from);
+
+ QString trans = transform->toString();
+ QString last = trans;
+
+ if(targetElement()->hasAttribute("transform"))
+ {
+ trans += " " + targetElement()->getAttribute("transform").string();
+
+ if(!m_lastTransform.isEmpty())
+ {
+ int pos = trans.find(m_lastTransform);
+
+ QString extract;
+ extract += trans.mid(0, pos);
+ extract += trans.mid(pos + m_lastTransform.length() + 1, trans.length());
+
+ trans = extract;
+ }
+ }
+
+ m_lastTransform = last;
+
+ transform->deref();
+
+ applyAttribute("transform", trans);
+
+ m_step++;
+
+ if(m_step == m_steps)
+ {
+ removeTimer(m_transformTimer);
+
+ if(getRepeatDuration() == "indefinite" || getRepeatCount() == "indefinite")
+ {
+ m_firstEvent = true;
+ m_from = m_newFrom;
+ m_to = m_newTo;
+
+ m_addStep = 0;
+ m_transformTimer = 0;
+
+ addTimer(1);
+ }
+ else if(!getRepeatCount().isEmpty())
+ {
+ if(m_times <= getRepeatCount().toInt())
+ {
+ m_times++;
+ m_firstEvent = true;
+ m_from = m_newFrom;
+ m_to = m_newTo;
+
+ m_addStep = 0;
+ m_transformTimer = 0;
+
+ addTimer(1);
+ }
+ }
+ }
+ }
+ */
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimateTransformElementImpl.h b/ksvg/impl/SVGAnimateTransformElementImpl.h
new file mode 100644
index 00000000..7e6e2653
--- /dev/null
+++ b/ksvg/impl/SVGAnimateTransformElementImpl.h
@@ -0,0 +1,74 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimateTransformElementImpl_H
+#define SVGAnimateTransformElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGAnimationElementImpl.h"
+
+class QTimer;
+
+namespace KSVG
+{
+
+class SVGTransformImpl;
+class SVGTransformListImpl;
+class SVGAnimateTransformElementImpl : public SVGAnimationElementImpl
+{
+public:
+ SVGAnimateTransformElementImpl(DOM::ElementImpl *);
+ virtual ~SVGAnimateTransformElementImpl();
+
+ virtual void handleTimerEvent(bool needCombine = false);
+ virtual void setAttributes();
+
+private:
+ QString m_type, m_lastTransform;
+
+ int m_times;
+
+ int m_rotateX, m_rotateY;
+
+ int m_steps, m_step;
+
+ double m_from, m_to, m_newFrom, m_newTo;
+ double m_addStep;
+
+ QTimer *m_transformTimer;
+ SVGTransformListImpl *m_transformList;
+
+ bool m_firstEvent;
+ bool m_setAttributes;
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGAnimateTransformElementImpl, "animateTransform")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedAngleImpl.cc b/ksvg/impl/SVGAnimatedAngleImpl.cc
new file mode 100644
index 00000000..63f0c000
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedAngleImpl.cc
@@ -0,0 +1,83 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAngleImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGAnimatedAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedAngleImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedAngleImpl::SVGAnimatedAngleImpl() : DOM::DomShared()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_baseVal = SVGSVGElementImpl::createSVGAngle();
+ m_animVal = SVGSVGElementImpl::createSVGAngle();
+}
+
+SVGAnimatedAngleImpl::~SVGAnimatedAngleImpl()
+{
+ if(m_baseVal)
+ m_baseVal->deref();
+ if(m_animVal)
+ m_animVal->deref();
+}
+
+SVGAngleImpl *SVGAnimatedAngleImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+SVGAngleImpl *SVGAnimatedAngleImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedAngleImpl::s_hashTable 3
+ baseVal SVGAnimatedAngleImpl::BaseVal DontDelete|ReadOnly
+ animVal SVGAnimatedAngleImpl::AnimVal DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedAngleImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return m_baseVal->cache(exec);
+ case AnimVal:
+ return m_animVal->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedAngleImpl.h b/ksvg/impl/SVGAnimatedAngleImpl.h
new file mode 100644
index 00000000..f6617ce6
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedAngleImpl.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedAngleImpl_H
+#define SVGAnimatedAngleImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAngleImpl;
+class SVGAnimatedAngleImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedAngleImpl();
+ virtual ~SVGAnimatedAngleImpl();
+
+ SVGAngleImpl *baseVal() const;
+ SVGAngleImpl *animVal() const;
+
+private:
+ SVGAngleImpl *m_baseVal;
+ SVGAngleImpl *m_animVal;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedBooleanImpl.cc b/ksvg/impl/SVGAnimatedBooleanImpl.cc
new file mode 100644
index 00000000..d30fa5ef
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedBooleanImpl.cc
@@ -0,0 +1,93 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAnimatedBooleanImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedBooleanImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedBooleanImpl::SVGAnimatedBooleanImpl() : DOM::DomShared()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_baseVal = false;
+ m_animVal = false;
+}
+
+SVGAnimatedBooleanImpl::~SVGAnimatedBooleanImpl()
+{
+}
+
+void SVGAnimatedBooleanImpl::setBaseVal(bool baseVal)
+{
+ m_baseVal = baseVal;
+}
+
+bool SVGAnimatedBooleanImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+bool SVGAnimatedBooleanImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedBooleanImpl::s_hashTable 3
+ baseVal SVGAnimatedBooleanImpl::BaseVal DontDelete
+ animVal SVGAnimatedBooleanImpl::AnimVal DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedBooleanImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return Number(baseVal());
+ case AnimVal:
+ return Number(animVal());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGAnimatedBooleanImpl::putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case BaseVal:
+ setBaseVal(value.toBoolean(exec));
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedBooleanImpl.h b/ksvg/impl/SVGAnimatedBooleanImpl.h
new file mode 100644
index 00000000..9e31792e
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedBooleanImpl.h
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedBooleanImpl_H
+#define SVGAnimatedBooleanImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedBooleanImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedBooleanImpl();
+ virtual ~SVGAnimatedBooleanImpl();
+
+ void setBaseVal(bool baseVal);
+ bool baseVal() const;
+
+ bool animVal() const;
+
+private:
+ bool m_baseVal;
+ bool m_animVal;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedEnumerationImpl.cc b/ksvg/impl/SVGAnimatedEnumerationImpl.cc
new file mode 100644
index 00000000..f619f231
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedEnumerationImpl.cc
@@ -0,0 +1,93 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAnimatedEnumerationImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedEnumerationImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedEnumerationImpl::SVGAnimatedEnumerationImpl() : DOM::DomShared()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_baseVal = 0;
+ m_animVal = 0;
+}
+
+SVGAnimatedEnumerationImpl::~SVGAnimatedEnumerationImpl()
+{
+}
+
+void SVGAnimatedEnumerationImpl::setBaseVal(unsigned short baseVal)
+{
+ m_baseVal = baseVal;
+}
+
+unsigned short SVGAnimatedEnumerationImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+unsigned short SVGAnimatedEnumerationImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedEnumerationImpl::s_hashTable 3
+ baseVal SVGAnimatedEnumerationImpl::BaseVal DontDelete
+ animVal SVGAnimatedEnumerationImpl::AnimVal DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedEnumerationImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return Number(baseVal());
+ case AnimVal:
+ return Number(animVal());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGAnimatedEnumerationImpl::putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case BaseVal:
+ setBaseVal(static_cast<unsigned short>(value.toNumber(exec)));
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedEnumerationImpl.h b/ksvg/impl/SVGAnimatedEnumerationImpl.h
new file mode 100644
index 00000000..ae4638f4
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedEnumerationImpl.h
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedEnumerationImpl_H
+#define SVGAnimatedEnumerationImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedEnumerationImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedEnumerationImpl();
+ virtual ~SVGAnimatedEnumerationImpl();
+
+ void setBaseVal(unsigned short baseVal);
+ unsigned short baseVal() const;
+
+ unsigned short animVal() const;
+
+private:
+ unsigned short m_baseVal;
+ unsigned short m_animVal;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedIntegerImpl.cc b/ksvg/impl/SVGAnimatedIntegerImpl.cc
new file mode 100644
index 00000000..8bf08a87
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedIntegerImpl.cc
@@ -0,0 +1,91 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAnimatedIntegerImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedIntegerImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedIntegerImpl::SVGAnimatedIntegerImpl() : DOM::DomShared()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_baseVal = 0;
+ m_animVal = 0;
+}
+
+SVGAnimatedIntegerImpl::~SVGAnimatedIntegerImpl()
+{
+}
+
+void SVGAnimatedIntegerImpl::setBaseVal(long baseVal)
+{
+ m_baseVal = baseVal;
+}
+
+long SVGAnimatedIntegerImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+long SVGAnimatedIntegerImpl::animVal() const
+{
+ return m_animVal;
+}
+
+/*
+@namespace KSVG
+@begin SVGAnimatedIntegerImpl::s_hashTable 3
+ baseVal SVGAnimatedIntegerImpl::BaseVal DontDelete
+ animVal SVGAnimatedIntegerImpl::AnimVal DontDelete
+@end
+*/
+
+Value SVGAnimatedIntegerImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return Number(baseVal());
+ case AnimVal:
+ return Number(animVal());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+ return KJS::Undefined();
+}
+
+void SVGAnimatedIntegerImpl::putValueProperty(ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case BaseVal:
+ setBaseVal(value.toInteger(exec));
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedIntegerImpl.h b/ksvg/impl/SVGAnimatedIntegerImpl.h
new file mode 100644
index 00000000..8ad7ad88
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedIntegerImpl.h
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedIntegerImpl_H
+#define SVGAnimatedIntegerImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedIntegerImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedIntegerImpl();
+ virtual ~SVGAnimatedIntegerImpl();
+
+ void setBaseVal(long baseVal);
+ long baseVal() const;
+
+ long animVal() const;
+
+private:
+ long m_baseVal;
+ long m_animVal;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedLengthImpl.cc b/ksvg/impl/SVGAnimatedLengthImpl.cc
new file mode 100644
index 00000000..25176965
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedLengthImpl.cc
@@ -0,0 +1,96 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedLengthImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedLengthImpl::SVGAnimatedLengthImpl(LengthMode mode, SVGElementImpl *object) : DOM::DomShared()
+{
+ m_baseVal = new SVGLengthImpl(mode, object);
+ m_baseVal->ref();
+
+ m_animVal = new SVGLengthImpl(mode, object);
+ m_animVal->ref();
+}
+
+SVGAnimatedLengthImpl::SVGAnimatedLengthImpl(const SVGAnimatedLengthImpl &other) : DOM::DomShared()
+{
+ (*this) = other;
+}
+
+SVGAnimatedLengthImpl::~SVGAnimatedLengthImpl()
+{
+ if(m_baseVal)
+ m_baseVal->deref();
+ if(m_animVal)
+ m_animVal->deref();
+}
+
+SVGAnimatedLengthImpl &SVGAnimatedLengthImpl::operator=(const SVGAnimatedLengthImpl &other)
+{
+ *m_baseVal = *(other.m_baseVal);
+ *m_animVal = *(other.m_animVal);
+
+ return *this;
+}
+
+SVGLengthImpl *SVGAnimatedLengthImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+SVGLengthImpl *SVGAnimatedLengthImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedLengthImpl::s_hashTable 3
+ baseVal SVGAnimatedLengthImpl::BaseVal DontDelete|ReadOnly
+ animVal SVGAnimatedLengthImpl::AnimVal DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedLengthImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return m_baseVal->cache(exec);
+ case AnimVal:
+ return m_animVal->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedLengthImpl.h b/ksvg/impl/SVGAnimatedLengthImpl.h
new file mode 100644
index 00000000..80f473db
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedLengthImpl.h
@@ -0,0 +1,65 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedLengthImpl_H
+#define SVGAnimatedLengthImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "SVGLengthImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+class SVGElementImpl;
+class SVGAnimatedLengthImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedLengthImpl(LengthMode mode = LENGTHMODE_UNKNOWN, SVGElementImpl *object = 0);
+ SVGAnimatedLengthImpl(const SVGAnimatedLengthImpl &);
+ virtual ~SVGAnimatedLengthImpl();
+
+ SVGAnimatedLengthImpl &operator=(const SVGAnimatedLengthImpl &);
+
+ SVGLengthImpl *baseVal() const;
+ SVGLengthImpl *animVal() const;
+
+private:
+ SVGLengthImpl *m_baseVal;
+ SVGLengthImpl *m_animVal;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedLengthListImpl.cc b/ksvg/impl/SVGAnimatedLengthListImpl.cc
new file mode 100644
index 00000000..296fa1ea
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedLengthListImpl.cc
@@ -0,0 +1,95 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAnimatedLengthListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedLengthListImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedLengthListImpl::SVGAnimatedLengthListImpl() : DOM::DomShared()
+{
+ m_baseVal = new SVGLengthListImpl();
+ m_baseVal->ref();
+
+ m_animVal = new SVGLengthListImpl();
+ m_animVal->ref();
+}
+
+SVGAnimatedLengthListImpl::SVGAnimatedLengthListImpl(const SVGAnimatedLengthListImpl &other) : DOM::DomShared()
+{
+ (*this) = other;
+}
+
+SVGAnimatedLengthListImpl::~SVGAnimatedLengthListImpl()
+{
+ if(m_baseVal)
+ m_baseVal->deref();
+ if(m_animVal)
+ m_animVal->deref();
+}
+
+SVGAnimatedLengthListImpl &SVGAnimatedLengthListImpl::operator=(const SVGAnimatedLengthListImpl &other)
+{
+ *m_baseVal = *(other.m_baseVal);
+ *m_animVal = *(other.m_animVal);
+
+ return *this;
+}
+
+SVGLengthListImpl *SVGAnimatedLengthListImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+SVGLengthListImpl *SVGAnimatedLengthListImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedLengthListImpl::s_hashTable 3
+ baseVal SVGAnimatedLengthListImpl::BaseVal DontDelete|ReadOnly
+ animVal SVGAnimatedLengthListImpl::AnimVal DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedLengthListImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return m_baseVal->cache(exec);
+ case AnimVal:
+ return m_animVal->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedLengthListImpl.h b/ksvg/impl/SVGAnimatedLengthListImpl.h
new file mode 100644
index 00000000..74f3cb1e
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedLengthListImpl.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedLengthListImpl_H
+#define SVGAnimatedLengthListImpl_H
+
+#include "SVGLengthListImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedLengthListImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedLengthListImpl();
+ SVGAnimatedLengthListImpl(const SVGAnimatedLengthListImpl &);
+ virtual ~SVGAnimatedLengthListImpl();
+
+ SVGAnimatedLengthListImpl &operator=(const SVGAnimatedLengthListImpl &);
+
+ SVGLengthListImpl *baseVal() const;
+ SVGLengthListImpl *animVal() const;
+
+private:
+ SVGLengthListImpl *m_baseVal;
+ SVGLengthListImpl *m_animVal;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+#endif
diff --git a/ksvg/impl/SVGAnimatedNumberImpl.cc b/ksvg/impl/SVGAnimatedNumberImpl.cc
new file mode 100644
index 00000000..2937c233
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedNumberImpl.cc
@@ -0,0 +1,94 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAnimatedNumberImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedNumberImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedNumberImpl::SVGAnimatedNumberImpl() : DOM::DomShared()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_baseVal = 0;
+ m_animVal = 0;
+}
+
+SVGAnimatedNumberImpl::~SVGAnimatedNumberImpl()
+{
+}
+
+void SVGAnimatedNumberImpl::setBaseVal(float baseVal)
+{
+ m_baseVal = baseVal;
+}
+
+float SVGAnimatedNumberImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+float SVGAnimatedNumberImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedNumberImpl::s_hashTable 3
+ baseVal SVGAnimatedNumberImpl::BaseVal DontDelete
+ animVal SVGAnimatedNumberImpl::AnimVal DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedNumberImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return Number(baseVal());
+ case AnimVal:
+ return Number(animVal());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+
+ return Undefined();
+}
+
+void SVGAnimatedNumberImpl::putValueProperty(ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case BaseVal:
+ setBaseVal(value.toNumber(exec));
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedNumberImpl.h b/ksvg/impl/SVGAnimatedNumberImpl.h
new file mode 100644
index 00000000..81c9217b
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedNumberImpl.h
@@ -0,0 +1,63 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedNumberImpl_H
+#define SVGAnimatedNumberImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedNumberImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedNumberImpl();
+ virtual ~SVGAnimatedNumberImpl();
+
+ void setBaseVal(float baseVal);
+ float baseVal() const;
+
+ float animVal() const;
+
+private:
+ float m_baseVal;
+ float m_animVal;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedNumberListImpl.cc b/ksvg/impl/SVGAnimatedNumberListImpl.cc
new file mode 100644
index 00000000..d6ff44e0
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedNumberListImpl.cc
@@ -0,0 +1,82 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAnimatedNumberListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedNumberListImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedNumberListImpl::SVGAnimatedNumberListImpl() : DOM::DomShared()
+{
+ m_baseVal = new SVGNumberListImpl();
+ m_baseVal->ref();
+
+ m_animVal = new SVGNumberListImpl();
+ m_animVal->ref();
+}
+
+SVGAnimatedNumberListImpl::~SVGAnimatedNumberListImpl()
+{
+ if(m_baseVal)
+ m_baseVal->deref();
+ if(m_animVal)
+ m_animVal->deref();
+}
+
+SVGNumberListImpl *SVGAnimatedNumberListImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+SVGNumberListImpl *SVGAnimatedNumberListImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedNumberListImpl::s_hashTable 3
+ baseVal SVGAnimatedNumberListImpl::BaseVal DontDelete|ReadOnly
+ animVal SVGAnimatedNumberListImpl::AnimVal DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedNumberListImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return m_baseVal->cache(exec);
+ case AnimVal:
+ return m_animVal->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedNumberListImpl.h b/ksvg/impl/SVGAnimatedNumberListImpl.h
new file mode 100644
index 00000000..b44b3ffd
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedNumberListImpl.h
@@ -0,0 +1,58 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedNumberListImpl_H
+#define SVGAnimatedNumberListImpl_H
+
+#include "SVGNumberListImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedNumberListImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedNumberListImpl();
+ virtual ~SVGAnimatedNumberListImpl();
+
+ SVGNumberListImpl *baseVal() const;
+ SVGNumberListImpl *animVal() const;
+
+private:
+ SVGNumberListImpl *m_baseVal;
+ SVGNumberListImpl *m_animVal;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+#endif
diff --git a/ksvg/impl/SVGAnimatedPathDataImpl.cc b/ksvg/impl/SVGAnimatedPathDataImpl.cc
new file mode 100644
index 00000000..2b9ebf4c
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedPathDataImpl.cc
@@ -0,0 +1,108 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegListImpl.h"
+#include "SVGAnimatedPathDataImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedPathDataImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedPathDataImpl::SVGAnimatedPathDataImpl() : DOM::DomShared()
+{
+ m_pathSegList = new SVGPathSegListImpl();
+ m_pathSegList->ref();
+
+ m_normalizedPathSegList = new SVGPathSegListImpl();
+ m_normalizedPathSegList->ref();
+
+ m_animatedPathSegList = new SVGPathSegListImpl();
+ m_animatedPathSegList->ref();
+
+ m_animatedNormalizedPathSegList = new SVGPathSegListImpl();
+ m_animatedNormalizedPathSegList->ref();
+}
+
+SVGAnimatedPathDataImpl::~SVGAnimatedPathDataImpl()
+{
+ if(m_pathSegList)
+ m_pathSegList->deref();
+ if(m_normalizedPathSegList)
+ m_normalizedPathSegList->deref();
+ if(m_animatedPathSegList)
+ m_animatedPathSegList->deref();
+ if(m_animatedNormalizedPathSegList)
+ m_animatedNormalizedPathSegList->deref();
+}
+
+SVGPathSegListImpl *SVGAnimatedPathDataImpl::pathSegList() const
+{
+ return m_pathSegList;
+}
+
+SVGPathSegListImpl *SVGAnimatedPathDataImpl::normalizedPathSegList() const
+{
+ return m_normalizedPathSegList;
+}
+
+SVGPathSegListImpl *SVGAnimatedPathDataImpl::animatedPathSegList() const
+{
+ return m_animatedPathSegList;
+}
+
+SVGPathSegListImpl *SVGAnimatedPathDataImpl::animatedNormalizedPathSegList() const
+{
+ return m_animatedNormalizedPathSegList;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedPathDataImpl::s_hashTable 5
+ pathSegList SVGAnimatedPathDataImpl::PathSegList DontDelete|ReadOnly
+ normalizedPathSegList SVGAnimatedPathDataImpl::NormalizedPathSegList DontDelete|ReadOnly
+ animatedPathSegList SVGAnimatedPathDataImpl::AnimatedPathSegList DontDelete|ReadOnly
+ animatedNormalizedPathSegList SVGAnimatedPathDataImpl::AnimatedNormalizedPathSegList DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedPathDataImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case PathSegList:
+ return pathSegList()->cache(exec);
+ case NormalizedPathSegList:
+ return normalizedPathSegList()->cache(exec);
+ case AnimatedPathSegList:
+ return animatedPathSegList()->cache(exec);
+ case AnimatedNormalizedPathSegList:
+ return animatedNormalizedPathSegList()->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+}
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedPathDataImpl.h b/ksvg/impl/SVGAnimatedPathDataImpl.h
new file mode 100644
index 00000000..2af1f893
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedPathDataImpl.h
@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedPathDataImpl_H
+#define SVGAnimatedPathDataImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGPathSegListImpl;
+
+// special case, virtual public HAS to stay
+class SVGAnimatedPathDataImpl : virtual public DOM::DomShared
+{
+public:
+ SVGAnimatedPathDataImpl();
+ virtual ~SVGAnimatedPathDataImpl();
+
+ SVGPathSegListImpl *pathSegList() const;
+ SVGPathSegListImpl *normalizedPathSegList() const;
+ SVGPathSegListImpl *animatedPathSegList() const;
+ SVGPathSegListImpl *animatedNormalizedPathSegList() const;
+
+private:
+ SVGPathSegListImpl *m_pathSegList;
+ SVGPathSegListImpl *m_normalizedPathSegList;
+ SVGPathSegListImpl *m_animatedPathSegList;
+ SVGPathSegListImpl *m_animatedNormalizedPathSegList;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ PathSegList, NormalizedPathSegList, AnimatedPathSegList, AnimatedNormalizedPathSegList
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedPointsImpl.cc b/ksvg/impl/SVGAnimatedPointsImpl.cc
new file mode 100644
index 00000000..093ded77
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedPointsImpl.cc
@@ -0,0 +1,139 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qstringlist.h>
+
+#include "CanvasItem.h"
+#include "SVGPointListImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGAnimatedPointsImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedPointsImpl.lut.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGAnimatedPointsImpl::SVGAnimatedPointsImpl() : DOM::DomShared()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_points = new SVGPointListImpl();
+ m_points->ref();
+
+ m_animatedPoints = new SVGPointListImpl();
+ m_animatedPoints->ref();
+}
+
+SVGAnimatedPointsImpl::~SVGAnimatedPointsImpl()
+{
+ if(m_points)
+ m_points->deref();
+ if(m_animatedPoints)
+ m_animatedPoints->deref();
+}
+
+SVGPointListImpl *SVGAnimatedPointsImpl::points() const
+{
+ return m_points;
+}
+
+SVGPointListImpl *SVGAnimatedPointsImpl::animatedPoints() const
+{
+ return m_animatedPoints;
+}
+
+void SVGAnimatedPointsImpl::parsePoints(QString _points, SVGPointListImpl *points)
+{
+ if(_points.isEmpty())
+ return;
+
+ _points = _points.simplifyWhiteSpace();
+
+ if(_points.contains(",,") || _points.contains(", ,"))
+ return;
+
+ _points.replace(',', ' ');
+ _points.replace('\r', QString::null);
+ _points.replace('\n', QString::null);
+
+ _points = _points.simplifyWhiteSpace();
+
+ QStringList pointList = QStringList::split(' ', _points);
+ for(QStringList::Iterator it = pointList.begin(); it != pointList.end(); it++)
+ {
+ SVGPointImpl *point = SVGSVGElementImpl::createSVGPoint();
+ point->setX((*(it++)).toFloat());
+ point->setY((*it).toFloat());
+
+ points->appendItem(point);
+ }
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedPointsImpl::s_hashTable 3
+ points SVGAnimatedPointsImpl::Points DontDelete|ReadOnly
+ animatedPoints SVGAnimatedPointsImpl::AnimatedPoints DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedPointsImpl::getValueProperty(ExecState *exec, int token) const
+{
+ //KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case Points: // TODO: We need a pointList->toText function, quite trivial
+// if(!attributeMode)
+ return points()->cache(exec);
+ case AnimatedPoints:
+ return animatedPoints()->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGAnimatedPointsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case Points:
+ parsePoints(value.toString(exec).qstring(), m_points);
+ break;
+ case AnimatedPoints:
+ parsePoints(value.toString(exec).qstring(), m_animatedPoints);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedPointsImpl.h b/ksvg/impl/SVGAnimatedPointsImpl.h
new file mode 100644
index 00000000..ef4dafca
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedPointsImpl.h
@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedPointsImpl_H
+#define SVGAnimatedPointsImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+class QString;
+
+namespace KSVG
+{
+
+class SVGPointListImpl;
+class SVGAnimatedPointsImpl : virtual public DOM::DomShared
+{
+public:
+ SVGAnimatedPointsImpl();
+ virtual ~SVGAnimatedPointsImpl();
+
+ SVGPointListImpl *points() const;
+ SVGPointListImpl *animatedPoints() const;
+
+ static void parsePoints(QString _points, SVGPointListImpl *points);
+
+protected:
+ SVGPointListImpl *m_points;
+ SVGPointListImpl *m_animatedPoints;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ Points, AnimatedPoints
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedPreserveAspectRatioImpl.cc b/ksvg/impl/SVGAnimatedPreserveAspectRatioImpl.cc
new file mode 100644
index 00000000..166b987f
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedPreserveAspectRatioImpl.cc
@@ -0,0 +1,83 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPreserveAspectRatioImpl.h"
+#include "SVGAnimatedPreserveAspectRatioImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedPreserveAspectRatioImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedPreserveAspectRatioImpl::SVGAnimatedPreserveAspectRatioImpl() : DOM::DomShared()
+{
+ m_baseVal = new SVGPreserveAspectRatioImpl();
+ m_baseVal->ref();
+
+ m_animVal = new SVGPreserveAspectRatioImpl();
+ m_animVal->ref();
+}
+
+SVGAnimatedPreserveAspectRatioImpl::~SVGAnimatedPreserveAspectRatioImpl()
+{
+ if(m_baseVal)
+ m_baseVal->deref();
+ if(m_animVal)
+ m_animVal->deref();
+}
+
+SVGPreserveAspectRatioImpl *SVGAnimatedPreserveAspectRatioImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+SVGPreserveAspectRatioImpl *SVGAnimatedPreserveAspectRatioImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedPreserveAspectRatioImpl::s_hashTable 3
+ baseVal SVGAnimatedPreserveAspectRatioImpl::BaseVal DontDelete|ReadOnly
+ animVal SVGAnimatedPreserveAspectRatioImpl::AnimVal DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedPreserveAspectRatioImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return m_baseVal->cache(exec);
+ case AnimVal:
+ return m_animVal->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedPreserveAspectRatioImpl.h b/ksvg/impl/SVGAnimatedPreserveAspectRatioImpl.h
new file mode 100644
index 00000000..30fb7c87
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedPreserveAspectRatioImpl.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedPreserveAspectRatioImpl_H
+#define SVGAnimatedPreserveAspectRatioImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGPreserveAspectRatioImpl;
+class SVGAnimatedPreserveAspectRatioImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedPreserveAspectRatioImpl();
+ virtual ~SVGAnimatedPreserveAspectRatioImpl();
+
+ SVGPreserveAspectRatioImpl *baseVal() const;
+ SVGPreserveAspectRatioImpl *animVal() const;
+
+private:
+ SVGPreserveAspectRatioImpl *m_baseVal;
+ SVGPreserveAspectRatioImpl *m_animVal;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedRectImpl.cc b/ksvg/impl/SVGAnimatedRectImpl.cc
new file mode 100644
index 00000000..4ba7a50d
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedRectImpl.cc
@@ -0,0 +1,81 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGRectImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGAnimatedRectImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedRectImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedRectImpl::SVGAnimatedRectImpl() : DOM::DomShared()
+{
+ m_baseVal = SVGSVGElementImpl::createSVGRect();
+ m_animVal = SVGSVGElementImpl::createSVGRect();
+}
+
+SVGAnimatedRectImpl::~SVGAnimatedRectImpl()
+{
+ if(m_baseVal)
+ m_baseVal->deref();
+ if(m_animVal)
+ m_animVal->deref();
+}
+
+SVGRectImpl *SVGAnimatedRectImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+SVGRectImpl *SVGAnimatedRectImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedRectImpl::s_hashTable 3
+ baseVal SVGAnimatedRectImpl::BaseVal DontDelete
+ animVal SVGAnimatedRectImpl::AnimVal DontDelete
+@end
+*/
+
+Value SVGAnimatedRectImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return m_baseVal->cache(exec);
+ case AnimVal:
+ return m_animVal->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedRectImpl.h b/ksvg/impl/SVGAnimatedRectImpl.h
new file mode 100644
index 00000000..0619505d
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedRectImpl.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedRectImpl_H
+#define SVGAnimatedRectImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGRectImpl;
+class SVGAnimatedRectImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedRectImpl();
+ virtual ~SVGAnimatedRectImpl();
+
+ SVGRectImpl *baseVal() const;
+ SVGRectImpl *animVal() const;
+
+private:
+ SVGRectImpl *m_baseVal;
+ SVGRectImpl *m_animVal;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedStringImpl.cc b/ksvg/impl/SVGAnimatedStringImpl.cc
new file mode 100644
index 00000000..1ce4f00b
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedStringImpl.cc
@@ -0,0 +1,90 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAnimatedStringImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedStringImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedStringImpl::SVGAnimatedStringImpl() : DOM::DomShared()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGAnimatedStringImpl::~SVGAnimatedStringImpl()
+{
+}
+
+void SVGAnimatedStringImpl::setBaseVal(const DOM::DOMString &baseVal)
+{
+ m_baseVal = baseVal;
+}
+
+DOM::DOMString SVGAnimatedStringImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+DOM::DOMString SVGAnimatedStringImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedStringImpl::s_hashTable 3
+ baseVal SVGAnimatedStringImpl::BaseVal DontDelete
+ animVal SVGAnimatedStringImpl::AnimVal DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedStringImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return String(baseVal().string());
+ case AnimVal:
+ return String(animVal().string());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGAnimatedStringImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case BaseVal:
+ setBaseVal(value.toString(exec).string());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedStringImpl.h b/ksvg/impl/SVGAnimatedStringImpl.h
new file mode 100644
index 00000000..cc15f7e2
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedStringImpl.h
@@ -0,0 +1,65 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedStringImpl_H
+#define SVGAnimatedStringImpl_H
+
+#include <dom/dom_misc.h>
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedStringImpl();
+ virtual ~SVGAnimatedStringImpl();
+
+ void setBaseVal(const DOM::DOMString &baseVal);
+ DOM::DOMString baseVal() const;
+
+ DOM::DOMString animVal() const;
+
+private:
+ DOM::DOMString m_baseVal;
+ DOM::DOMString m_animVal;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedTransformListImpl.cc b/ksvg/impl/SVGAnimatedTransformListImpl.cc
new file mode 100644
index 00000000..2e3b5536
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedTransformListImpl.cc
@@ -0,0 +1,83 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGTransformListImpl.h"
+#include "SVGAnimatedTransformListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimatedTransformListImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGAnimatedTransformListImpl::SVGAnimatedTransformListImpl() : DOM::DomShared()
+{
+ m_baseVal = new SVGTransformListImpl();
+ m_baseVal->ref();
+
+ m_animVal = new SVGTransformListImpl();
+ m_animVal->ref();
+}
+
+SVGAnimatedTransformListImpl::~SVGAnimatedTransformListImpl()
+{
+ if(m_baseVal)
+ m_baseVal->deref();
+ if(m_animVal)
+ m_animVal->deref();
+}
+
+SVGTransformListImpl *SVGAnimatedTransformListImpl::baseVal() const
+{
+ return m_baseVal;
+}
+
+SVGTransformListImpl *SVGAnimatedTransformListImpl::animVal() const
+{
+ return m_animVal;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGAnimatedTransformListImpl::s_hashTable 3
+ baseVal SVGAnimatedTransformListImpl::BaseVal DontDelete|ReadOnly
+ animVal SVGAnimatedTransformListImpl::AnimVal DontDelete|ReadOnly
+@end
+*/
+
+Value SVGAnimatedTransformListImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case BaseVal:
+ return m_baseVal->cache(exec);
+ case AnimVal:
+ return m_animVal->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimatedTransformListImpl.h b/ksvg/impl/SVGAnimatedTransformListImpl.h
new file mode 100644
index 00000000..dc4be7e1
--- /dev/null
+++ b/ksvg/impl/SVGAnimatedTransformListImpl.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimatedTransformListImpl_H
+#define SVGAnimatedTransformListImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGTransformListImpl;
+class SVGAnimatedTransformListImpl : public DOM::DomShared
+{
+public:
+ SVGAnimatedTransformListImpl();
+ virtual ~SVGAnimatedTransformListImpl();
+
+ SVGTransformListImpl *baseVal() const;
+ SVGTransformListImpl *animVal() const;
+
+private:
+ SVGTransformListImpl *m_baseVal;
+ SVGTransformListImpl *m_animVal;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ BaseVal, AnimVal
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimationElementImpl.cc b/ksvg/impl/SVGAnimationElementImpl.cc
new file mode 100644
index 00000000..454a323e
--- /dev/null
+++ b/ksvg/impl/SVGAnimationElementImpl.cc
@@ -0,0 +1,465 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <math.h>
+
+#include <kdebug.h>
+
+#include <qtimer.h>
+
+#include "CanvasItem.h"
+#include "SVGHelperImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGStringListImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGAnimationElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGAnimationElementImpl.lut.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGAnimationElementImpl::SVGAnimationElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGTestsImpl(), SVGExternalResourcesRequiredImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_connected = false;
+ m_targetElement = 0;
+
+ m_values = new SVGStringListImpl();
+ m_keyTimes= new SVGStringListImpl();
+ m_keySplines = new SVGStringListImpl();
+
+ m_fill = REMOVE;
+ m_additive = REPLACE;
+ m_accumulate = ACCUMULATE_NONE;
+}
+
+SVGAnimationElementImpl::~SVGAnimationElementImpl()
+{
+ if(m_targetElement)
+ m_targetElement->deref();
+}
+
+SVGElementImpl *SVGAnimationElementImpl::targetElement() const
+{
+ if(!m_targetElement)
+ {
+ SVGAnimationElementImpl *modify = const_cast<SVGAnimationElementImpl *>(this);
+ if(!m_href.isEmpty())
+ modify->setTargetElement(ownerDoc()->getElementByIdRecursive(ownerSVGElement(), SVGURIReferenceImpl::getTarget(m_href)));
+ else if(!parentNode().isNull())
+ modify->setTargetElement(ownerDoc()->getElementFromHandle(parentNode().handle()));
+ }
+
+ return m_targetElement;
+}
+
+double SVGAnimationElementImpl::parseClockValue(const QString &data) const
+{
+ QString parse = data.stripWhiteSpace();
+ QString debugOutput = "parseClockValue(" + parse + ") -> ";
+
+ if(parse == "indefinite") // Saves some time...
+ return -1;
+
+ double result;
+
+ int doublePointOne = parse.find(':');
+ int doublePointTwo = parse.find(':', doublePointOne + 1);
+
+ if(doublePointOne != -1 && doublePointTwo != -1) // Spec: "Full clock values"
+ {
+ unsigned int hours = parse.mid(0, 2).toUInt();
+ unsigned int minutes = parse.mid(3, 2).toUInt();
+ unsigned int seconds = parse.mid(6, 2).toUInt();
+ unsigned int milliseconds = 0;
+
+ result = (3600 * hours) + (60 * minutes) + seconds;
+
+ if(parse.find('.') != -1)
+ {
+ QString temp = parse.mid(9, 2);
+ milliseconds = temp.toUInt();
+ result += (milliseconds * (1 / pow(10.0, temp.length())));
+ }
+ }
+ else if(doublePointOne != -1 && doublePointTwo == -1) // Spec: "Partial clock values"
+ {
+ unsigned int minutes = parse.mid(0, 2).toUInt();
+ unsigned int seconds = parse.mid(3, 2).toUInt();
+ unsigned int milliseconds = 0;
+
+ result = (60 * minutes) + seconds;
+
+ if(parse.find('.') != -1)
+ {
+ QString temp = parse.mid(6, 2);
+ milliseconds = temp.toUInt();
+ result += (milliseconds * (1 / pow(10.0, temp.length())));
+ }
+ }
+ else // Spec: "Timecount values"
+ {
+ int dotPosition = parse.find('.');
+
+ if(parse.endsWith("h"))
+ {
+ if(dotPosition == -1)
+ result = parse.mid(0, parse.length() - 1).toUInt() * 3600;
+ else
+ {
+ result = parse.mid(0, dotPosition).toUInt() * 3600;
+ QString temp = parse.mid(dotPosition + 1, parse.length() - dotPosition - 2);
+ result += (3600.0 * temp.toUInt()) * (1 / pow(10.0, temp.length()));
+ }
+ }
+ else if(parse.endsWith("min"))
+ {
+ if(dotPosition == -1)
+ result = parse.mid(0, parse.length() - 3).toUInt() * 60;
+ else
+ {
+ result = parse.mid(0, dotPosition).toUInt() * 60;
+ QString temp = parse.mid(dotPosition + 1, parse.length() - dotPosition - 4);
+ result += (60.0 * temp.toUInt()) * (1 / pow(10.0, temp.length()));
+ }
+ }
+ else if(parse.endsWith("ms"))
+ {
+ if(dotPosition == -1)
+ result = parse.mid(0, parse.length() - 2).toUInt() / 1000.0;
+ else
+ {
+ result = parse.mid(0, dotPosition).toUInt() / 1000.0;
+ QString temp = parse.mid(dotPosition + 1, parse.length() - dotPosition - 3);
+ result += (temp.toUInt() / 1000.0) * (1 / pow(10.0, temp.length()));
+ }
+ }
+ else if(parse.endsWith("s"))
+ {
+ if(dotPosition == -1)
+ result = parse.mid(0, parse.length() - 1).toUInt();
+ else
+ {
+ result = parse.mid(0, dotPosition).toUInt();
+ QString temp = parse.mid(dotPosition + 1, parse.length() - dotPosition - 2);
+ result += temp.toUInt() * (1 / pow(10.0, temp.length()));
+ }
+ }
+ else
+ result = parse.toDouble();
+ }
+
+ kdDebug() << debugOutput << result << endl;
+ return result;
+}
+
+/*
+@namespace KSVG
+@begin SVGAnimationElementImpl::s_hashTable 23
+ targetElement SVGAnimationElementImpl::TargetElement DontDelete|ReadOnly
+ href SVGAnimationElementImpl::Href DontDelete|ReadOnly
+ additive SVGAnimationElementImpl::Additive DontDelete|ReadOnly
+ accumulate SVGAnimationElementImpl::Accumulate DontDelete|ReadOnly
+ attributeName SVGAnimationElementImpl::AttributeName DontDelete|ReadOnly
+ attributeType SVGAnimationElementImpl::AttributeType DontDelete|ReadOnly
+ calcMode SVGAnimationElementImpl::CalcMode DontDelete|ReadOnly
+ values SVGAnimationElementImpl::Values DontDelete|ReadOnly
+ keyTimes SVGAnimationElementImpl::KeyTimes DontDelete|ReadOnly
+ keySplines SVGAnimationElementImpl::KeySplines DontDelete|ReadOnly
+ from SVGAnimationElementImpl::From DontDelete|ReadOnly
+ to SVGAnimationElementImpl::To DontDelete|ReadOnly
+ by SVGAnimationElementImpl::By DontDelete|ReadOnly
+ begin SVGAnimationElementImpl::Begin DontDelete|ReadOnly
+ dur SVGAnimationElementImpl::Dur DontDelete|ReadOnly
+ end SVGAnimationElementImpl::End DontDelete|ReadOnly
+ min SVGAnimationElementImpl::Min DontDelete|ReadOnly
+ max SVGAnimationElementImpl::Max DontDelete|ReadOnly
+ restart SVGAnimationElementImpl::Restart DontDelete|ReadOnly
+ repeatCount SVGAnimationElementImpl::RepeatCount DontDelete|ReadOnly
+ repeatDur SVGAnimationElementImpl::RepeatDur DontDelete|ReadOnly
+ fill SVGAnimationElementImpl::Fill DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGAnimationElementImplProto::s_hashTable 5
+ getStartTime SVGAnimationElementImpl::GetStartTime DontDelete|Function 0
+ getCurrentTime SVGAnimationElementImpl::GetCurrentTime DontDelete|Function 0
+ getSimpleDuration SVGAnimationElementImpl::GetSimpleDuration DontDelete|Function 0
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGAnimationElement",SVGAnimationElementImplProto,SVGAnimationElementImplProtoFunc)
+
+Value SVGAnimationElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case TargetElement:
+ return m_targetElement->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGAnimationElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ QString val = value.toString(exec).qstring();
+ switch(token)
+ {
+ case Href:
+ m_href = val;
+ break;
+ case Additive:
+ m_additive = (val == "sum") ? SUM : REPLACE;
+ break;
+ case Accumulate:
+ m_accumulate = (val == "sum") ? ACCUMULATE_SUM : ACCUMULATE_NONE;
+ break;
+ case AttributeName:
+ m_attributeName = val;
+ break;
+ case AttributeType:
+ if(val == "css")
+ m_attributeType = CSS;
+ else if(val == "xml")
+ m_attributeType = XML;
+ else
+ m_attributeType = AUTO;
+ break;
+ case CalcMode: // FIXME: See spec for default values!!!
+ if(val == "discrete")
+ m_calcMode = DISCRETE;
+ else if(val == "linear")
+ m_calcMode = LINEAR;
+ else if(val == "spline")
+ m_calcMode = SPLINE;
+ else if(val == "paced")
+ m_calcMode = PACED;
+ break;
+ case Values:
+ SVGHelperImpl::parseSemicolonSeperatedList(m_values, val);
+ break;
+ case KeyTimes:
+ SVGHelperImpl::parseSemicolonSeperatedList(m_keyTimes, val);
+ break;
+ case KeySplines:
+ SVGHelperImpl::parseSemicolonSeperatedList(m_keySplines, val);
+ break;
+ case From:
+ m_from = val;
+ break;
+ case To:
+ m_to = val;
+ break;
+ case By:
+ m_by = val;
+ break;
+ case Begin:
+ case End:
+ {
+ // Create list
+ SVGStringListImpl *temp = new SVGStringListImpl();
+ temp->ref();
+
+ // Feed data into list
+ SVGHelperImpl::parseSemicolonSeperatedList(temp, val);
+
+ // Parse data
+ for(unsigned int i = 0; i < temp->numberOfItems(); i++)
+ {
+ QString current = temp->getItem(i)->string();
+
+ if(current.startsWith("accessKey"))
+ {
+ // Register keyDownEventListener for the character
+ QString character = current.mid(current.length() - 2, 1);
+
+ kdDebug() << "ACCESSKEY CHARACTER " << character << endl;
+ }
+ else if(current.startsWith("wallclock"))
+ {
+ int firstBrace = current.find("(");
+ int secondBrace = current.find(")");
+
+ QString wallclockValue = current.mid(firstBrace + 1, secondBrace - firstBrace - 2);
+
+ kdDebug() << "WALLCLOCK VALUE " << wallclockValue << endl;
+ }
+ else if(current.contains("."))
+ {
+ int dotPosition = current.find(".");
+
+ QString element = current.mid(0, dotPosition);
+ QString clockValue;
+
+ if(current.contains("begin"))
+ clockValue = current.mid(dotPosition + 6);
+ else if(current.contains("end"))
+ clockValue = current.mid(dotPosition + 4);
+ else if(current.contains("repeat"))
+ clockValue = current.mid(dotPosition + 7);
+ else // DOM2 Event Reference
+ {
+ int plusMinusPosition = -1;
+
+ if(current.contains("+"))
+ plusMinusPosition = current.find("+");
+ else if(current.contains("-"))
+ plusMinusPosition = current.find("-");
+
+ QString event = current.mid(dotPosition + 1, plusMinusPosition - dotPosition - 1);
+
+ clockValue = current.mid(dotPosition + event.length() + 1);
+ kdDebug() << "EVENT " << event << endl;
+ }
+
+ kdDebug() << "ELEMENT " << element << " CLOCKVALUE " << clockValue << endl;
+ }
+ else
+ {
+ if(token == Begin)
+ m_begin = parseClockValue(current);
+ else
+ m_end = parseClockValue(current);
+ }
+ }
+
+ temp->deref();
+
+ break;
+ }
+ case Dur:
+ m_duration = parseClockValue(val);
+ break;
+// case Min:
+// case Max:
+ case Restart:
+ if(val == "whenNotActive")
+ m_restart = WHENNOTACTIVE;
+ else if(val == "never")
+ m_restart = NEVER;
+ else
+ m_restart = ALWAYS;
+ break;
+ case RepeatCount:
+ m_repeatCount = val;
+ break;
+ case RepeatDur:
+ m_repeatDur = val;
+ break;
+ case Fill:
+ m_fill = (val == "freeze") ? FREEZE : REMOVE;
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+Value SVGAnimationElementImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &)
+{
+ KSVG_CHECK_THIS(SVGAnimationElementImpl)
+
+ switch(id)
+ {
+ case SVGAnimationElementImpl::GetStartTime:
+ return Number(obj->getStartTime());
+ case SVGAnimationElementImpl::GetCurrentTime:
+ return Number(obj->getCurrentTime());
+ case SVGAnimationElementImpl::GetSimpleDuration:
+ return Number(obj->getSimpleDuration());
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+void SVGAnimationElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: Default value is "replace"
+ if(KSVG_TOKEN_NOT_PARSED(Additive))
+ KSVG_SET_ALT_ATTRIBUTE(Additive, "replace")
+
+ // Spec: Default value is "none"
+ if(KSVG_TOKEN_NOT_PARSED(Accumulate))
+ KSVG_SET_ALT_ATTRIBUTE(Accumulate, "none")
+
+ // Spec: Default value is "always"
+ if(KSVG_TOKEN_NOT_PARSED(Restart))
+ KSVG_SET_ALT_ATTRIBUTE(Restart, "always")
+}
+
+void SVGAnimationElementImpl::setTargetElement(SVGElementImpl *target)
+{
+ if(m_targetElement)
+ m_targetElement->deref();
+
+ m_targetElement = target;
+ m_targetElement->ref();
+}
+
+void SVGAnimationElementImpl::applyAttribute(const QString &name, const QString &value)
+{
+ SVGElementImpl *target = targetElement();
+ if(!target)
+ {
+ kdDebug() << k_funcinfo << " name: " << name << " value: " << value << " NO TARGET ELEMENT!" << endl;
+ return;
+ }
+
+ // The only two cases I can imagine, where combining is needed (Niko)
+ bool combine = (name == "style" || name == "transform");
+
+ if(!combine)
+ target->setAttributeInternal(name, value);
+ else
+ {
+ kdDebug() << "TODO COMBINE: " << value << " NAME " << name << endl;
+ }
+}
+
+double SVGAnimationElementImpl::getStartTime() const
+{
+ return m_begin;
+}
+
+double SVGAnimationElementImpl::getCurrentTime() const
+{
+ return 0.0;
+}
+
+double SVGAnimationElementImpl::getSimpleDuration() const
+{
+ return m_duration;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGAnimationElementImpl.h b/ksvg/impl/SVGAnimationElementImpl.h
new file mode 100644
index 00000000..9fd9446e
--- /dev/null
+++ b/ksvg/impl/SVGAnimationElementImpl.h
@@ -0,0 +1,149 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGAnimationElementImpl_H
+#define SVGAnimationElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGTestsImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+enum EFillMode
+{
+ REMOVE,
+ FREEZE
+};
+
+enum EAdditiveMode
+{
+ REPLACE,
+ SUM
+};
+
+enum EAccumulateMode
+{
+ ACCUMULATE_NONE,
+ ACCUMULATE_SUM
+};
+
+enum ECalcMode
+{
+ DISCRETE,
+ LINEAR,
+ PACED,
+ SPLINE
+};
+
+enum ERestart
+{
+ ALWAYS,
+ WHENNOTACTIVE,
+ NEVER
+};
+
+enum EAttributeType
+{
+ CSS,
+ XML,
+ AUTO
+};
+
+class SVGAnimationElementImpl : public SVGElementImpl,
+ public SVGTestsImpl,
+ public SVGExternalResourcesRequiredImpl
+{
+public:
+ SVGAnimationElementImpl(DOM::ElementImpl *);
+ virtual ~SVGAnimationElementImpl();
+
+ SVGElementImpl *targetElement() const;
+ void setTargetElement(SVGElementImpl *target);
+
+ void applyAttribute(const QString &name, const QString &value);
+
+ virtual void handleTimerEvent() { } //= 0;
+ virtual void setAttributes();
+
+ double getStartTime() const;
+ double getCurrentTime() const;
+ double getSimpleDuration() const;
+
+ QString getRepeatCount() const { return m_repeatCount; }
+ QString getRepeatDuration() const { return m_repeatDur; }
+
+ QString getAttributeName() const { return m_attributeName; }
+ QString getFrom() const { return m_from; }
+ QString getTo() const { return m_to; }
+ QString getBy() const { return m_by; }
+
+protected:
+ double parseClockValue(const QString &data) const;
+
+ bool m_connected;
+ EFillMode m_fill : 1;
+ EAdditiveMode m_additive : 1;
+ EAccumulateMode m_accumulate : 1;
+ ECalcMode m_calcMode : 2;
+ ERestart m_restart : 2;
+ EAttributeType m_attributeType : 2;
+ SVGElementImpl *m_targetElement;
+
+ QString m_href;
+ QString m_attributeName;
+ QString m_from, m_to, m_by;
+
+ double m_begin, m_end, m_duration;
+
+ QString m_repeatCount, m_repeatDur;
+
+ SVGStringListImpl *m_values, *m_keyTimes, *m_keySplines;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ TargetElement,
+ Href, Additive, Accumulate, AttributeName, AttributeType,
+ CalcMode, Values, KeyTimes, KeySplines, From, To, By,
+ Begin, Dur, End, Min, Max, Restart, RepeatCount, RepeatDur, Fill,
+ // Functions
+ GetStartTime, GetCurrentTime, GetSimpleDuration
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGAnimationElementImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGAnimationElementImplProtoFunc, SVGAnimationElementImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGBBoxTarget.cc b/ksvg/impl/SVGBBoxTarget.cc
new file mode 100644
index 00000000..fcef164e
--- /dev/null
+++ b/ksvg/impl/SVGBBoxTarget.cc
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <dom/dom_misc.h>
+
+#include "SVGShapeImpl.h"
+#include "SVGBBoxTarget.h"
+
+using namespace KSVG;
+
+SVGBBoxTarget::SVGBBoxTarget()
+{
+ m_target = 0;
+}
+
+SVGBBoxTarget::~SVGBBoxTarget()
+{
+ if(m_target)
+ dynamic_cast<DOM::DomShared *>(m_target)->deref();
+}
+
+SVGShapeImpl *SVGBBoxTarget::getBBoxTarget() const
+{
+ return m_target;
+}
+
+void SVGBBoxTarget::setBBoxTarget(SVGShapeImpl *target)
+{
+ if(m_target)
+ dynamic_cast<DOM::DomShared *>(m_target)->deref();
+
+ m_target = target;
+
+ if(m_target)
+ dynamic_cast<DOM::DomShared *>(m_target)->ref();
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGBBoxTarget.h b/ksvg/impl/SVGBBoxTarget.h
new file mode 100644
index 00000000..03de657d
--- /dev/null
+++ b/ksvg/impl/SVGBBoxTarget.h
@@ -0,0 +1,45 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGBBoxTarget_H
+#define SVGBBoxTarget_H
+
+namespace KSVG
+{
+
+class SVGShapeImpl;
+class SVGBBoxTarget
+{
+public:
+ SVGBBoxTarget();
+ virtual ~SVGBBoxTarget();
+
+ SVGShapeImpl *getBBoxTarget() const;
+ void setBBoxTarget(SVGShapeImpl *target);
+
+protected:
+ SVGShapeImpl *m_target;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGCSSRuleImpl.cc b/ksvg/impl/SVGCSSRuleImpl.cc
new file mode 100644
index 00000000..991487e3
--- /dev/null
+++ b/ksvg/impl/SVGCSSRuleImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGCSSRuleImpl.h"
+
+using namespace KSVG;
+
+SVGCSSRuleImpl::SVGCSSRuleImpl() : DOM::DomShared()//, css::CSSRule()
+{
+}
+
+SVGCSSRuleImpl::~SVGCSSRuleImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGCSSRuleImpl.h b/ksvg/impl/SVGCSSRuleImpl.h
new file mode 100644
index 00000000..03ab4e8b
--- /dev/null
+++ b/ksvg/impl/SVGCSSRuleImpl.h
@@ -0,0 +1,42 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGCSSRuleImpl_H
+#define SVGCSSRuleImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGCSSRuleImpl : public DOM::DomShared //, public css::CSSRule
+{
+public:
+ SVGCSSRuleImpl();
+ virtual ~SVGCSSRuleImpl();
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGCircleElementImpl.cc b/ksvg/impl/SVGCircleElementImpl.cc
new file mode 100644
index 00000000..b6246d1a
--- /dev/null
+++ b/ksvg/impl/SVGCircleElementImpl.cc
@@ -0,0 +1,178 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "CanvasItem.h"
+#include "KSVGCanvas.h"
+
+#include "SVGRectImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGCircleElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+
+using namespace KSVG;
+
+#include "SVGCircleElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGCircleElementImpl::SVGCircleElementImpl(DOM::ElementImpl *impl) : SVGShapeImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_cx = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_cx->ref();
+ m_cx->baseVal()->setValueAsString("-1");
+
+ m_cy = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_cy->ref();
+ m_cy->baseVal()->setValueAsString("-1");
+
+ m_r = new SVGAnimatedLengthImpl(LENGTHMODE_OTHER, this);
+ m_r->ref();
+ m_r->baseVal()->setValueAsString("-1");
+}
+
+SVGCircleElementImpl::~SVGCircleElementImpl()
+{
+ if(m_cx)
+ m_cx->deref();
+ if(m_cy)
+ m_cy->deref();
+ if(m_r)
+ m_r->deref();
+}
+
+SVGAnimatedLengthImpl *SVGCircleElementImpl::cx()
+{
+ return m_cx;
+}
+
+SVGAnimatedLengthImpl *SVGCircleElementImpl::cy()
+{
+ return m_cy;
+}
+
+SVGAnimatedLengthImpl *SVGCircleElementImpl::r()
+{
+ return m_r;
+}
+
+/*
+@namespace KSVG
+@begin SVGCircleElementImpl::s_hashTable 5
+ cx SVGCircleElementImpl::Cx DontDelete|ReadOnly
+ cy SVGCircleElementImpl::Cy DontDelete|ReadOnly
+ r SVGCircleElementImpl::R DontDelete|ReadOnly
+@end
+*/
+
+Value SVGCircleElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case Cx:
+ if(!attributeMode)
+ return m_cx->cache(exec);
+ else
+ return Number(m_cx->baseVal()->value());
+ case Cy:
+ if(!attributeMode)
+ return m_cy->cache(exec);
+ else
+ return Number(m_cy->baseVal()->value());
+ case R:
+ if(!attributeMode)
+ return m_r->cache(exec);
+ else
+ return Number(m_r->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGCircleElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case Cx:
+ cx()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Cy:
+ cy()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case R:
+ r()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ if(r()->baseVal()->value() < 0) // A negative value is an error
+ gotError(i18n("Negative value for attribute r of element <circle> is illegal"));
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+SVGRectImpl *SVGCircleElementImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+ ret->setX(m_cx->baseVal()->value() - m_r->baseVal()->value());
+ ret->setY(m_cy->baseVal()->value() - m_r->baseVal()->value());
+ ret->setWidth(m_r->baseVal()->value() * 2.0);
+ ret->setHeight(m_r->baseVal()->value() * 2.0);
+ return ret;
+}
+
+void SVGCircleElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(Cx))
+ KSVG_SET_ALT_ATTRIBUTE(Cx, "0")
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(Cy))
+ KSVG_SET_ALT_ATTRIBUTE(Cy, "0")
+}
+
+void SVGCircleElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_item)
+ {
+ m_item = c->createCircle(this);
+ c->insert(m_item);
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGCircleElementImpl.h b/ksvg/impl/SVGCircleElementImpl.h
new file mode 100644
index 00000000..29e0df3f
--- /dev/null
+++ b/ksvg/impl/SVGCircleElementImpl.h
@@ -0,0 +1,84 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGCircleElementImpl_H
+#define SVGCircleElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGShapeImpl.h"
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGRectImpl;
+class SVGAnimatedLengthImpl;
+class SVGCircleElementImpl : public SVGShapeImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGCircleElementImpl(DOM::ElementImpl *);
+ virtual ~SVGCircleElementImpl();
+
+ SVGAnimatedLengthImpl *cx();
+ SVGAnimatedLengthImpl *cy();
+ SVGAnimatedLengthImpl *r();
+
+ virtual void createItem(KSVGCanvas *c = 0);
+ virtual void setAttributes();
+
+ virtual SVGRectImpl *getBBox();
+
+private:
+ SVGAnimatedLengthImpl *m_cx;
+ SVGAnimatedLengthImpl *m_cy;
+ SVGAnimatedLengthImpl *m_r;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ Cx, Cy, R
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGCircleElementImpl, "circle")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGClipPathElementImpl.cc b/ksvg/impl/SVGClipPathElementImpl.cc
new file mode 100644
index 00000000..87b4d4ac
--- /dev/null
+++ b/ksvg/impl/SVGClipPathElementImpl.cc
@@ -0,0 +1,104 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGClipPathElement.h"
+#include "SVGClipPathElementImpl.h"
+#include "KSVGCanvas.h"
+#include "SVGDocumentImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+
+using namespace KSVG;
+
+#include "SVGClipPathElementImpl.lut.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGClipPathElementImpl::SVGClipPathElementImpl(DOM::ElementImpl *impl) : SVGContainerImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl(), SVGBBoxTarget()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_clipPathUnits = new SVGAnimatedEnumerationImpl();
+ m_clipPathUnits->ref();
+ m_clipPathUnits->setBaseVal(SVGClipPathElement::SVG_UNIT_TYPE_UNKNOWN);
+}
+
+SVGClipPathElementImpl::~SVGClipPathElementImpl()
+{
+ if(m_clipPathUnits)
+ m_clipPathUnits->deref();
+}
+
+SVGAnimatedEnumerationImpl *SVGClipPathElementImpl::clipPathUnits() const
+{
+ return m_clipPathUnits;
+}
+
+/*
+@namespace KSVG
+@begin SVGClipPathElementImpl::s_hashTable 2
+ clipPathUnits SVGClipPathElementImpl::ClipPathUnits DontDelete|ReadOnly
+@end
+*/
+
+Value SVGClipPathElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case ClipPathUnits:
+ return m_clipPathUnits->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGClipPathElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case ClipPathUnits:
+ if(value.toString(exec).qstring() == "objectBoundingBox")
+ m_clipPathUnits->setBaseVal(SVGClipPathElement::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+ else
+ m_clipPathUnits->setBaseVal(SVGClipPathElement::SVG_UNIT_TYPE_USERSPACEONUSE);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+void SVGClipPathElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if attribute not specified, use userSpaceOnUse
+ if(KSVG_TOKEN_NOT_PARSED(ClipPathUnits))
+ KSVG_SET_ALT_ATTRIBUTE(ClipPathUnits, "userSpaceOnUse")
+
+ if(!m_item)
+ m_item = ownerDoc()->canvas()->createClipPath(this);
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGClipPathElementImpl.h b/ksvg/impl/SVGClipPathElementImpl.h
new file mode 100644
index 00000000..1e1879a9
--- /dev/null
+++ b/ksvg/impl/SVGClipPathElementImpl.h
@@ -0,0 +1,80 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGClipPathElementImpl_H
+#define SVGClipPathElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTestsImpl.h"
+#include "SVGBBoxTarget.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGContainerImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedEnumerationImpl;
+class SVGClipPathElementImpl : public SVGContainerImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl,
+ public SVGBBoxTarget
+{
+public:
+ SVGClipPathElementImpl(DOM::ElementImpl *);
+ virtual ~SVGClipPathElementImpl();
+
+ SVGAnimatedEnumerationImpl *clipPathUnits() const;
+
+ virtual void setAttributes();
+
+ virtual bool directRender() { return false; }
+
+private:
+ SVGAnimatedEnumerationImpl *m_clipPathUnits;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ ClipPathUnits
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGClipPathElementImpl, "clipPath")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGColorImpl.cc b/ksvg/impl/SVGColorImpl.cc
new file mode 100644
index 00000000..a01e1113
--- /dev/null
+++ b/ksvg/impl/SVGColorImpl.cc
@@ -0,0 +1,540 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qstringlist.h>
+
+#include "SVGColor.h"
+
+#include "SVGColorImpl.h"
+#include "SVGNumberImpl.h"
+#include "SVGICCColorImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGNumberListImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGColorProfileElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGColorImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_cacheimpl.h"
+
+SVGColorImpl::SVGColorImpl(SVGElementImpl *object) : m_object(object)
+{
+ m_colorType = SVG_COLORTYPE_UNKNOWN;
+ m_iccColor = 0;
+}
+
+SVGColorImpl::SVGColorImpl(const SVGColorImpl &other) : DOM::DomShared()
+{
+ (*this) = other;
+}
+
+SVGColorImpl::~SVGColorImpl()
+{
+ if(m_iccColor)
+ m_iccColor->deref();
+}
+
+SVGColorImpl &SVGColorImpl::operator=(const SVGColorImpl &other)
+{
+ m_colorType = other.m_colorType;
+ m_rgbColor = other.m_rgbColor;
+
+ if(m_iccColor && other.m_iccColor)
+ *m_iccColor = *(other.m_iccColor);
+
+ return *this;
+}
+
+unsigned short SVGColorImpl::colorType() const
+{
+ return m_colorType;
+}
+
+DOM::RGBColor SVGColorImpl::rgbColor() const
+{
+ return m_rgbColor;
+}
+
+SVGICCColorImpl *SVGColorImpl::iccColor() const
+{
+ return m_iccColor;
+}
+
+void SVGColorImpl::setRGBColor(QColor color)
+{
+ m_colorType = SVG_COLORTYPE_RGBCOLOR;
+ m_rgbColor = DOM::RGBColor(color.rgb());
+}
+
+void SVGColorImpl::setRGBColor(int r, int g, int b)
+{
+ m_colorType = SVG_COLORTYPE_RGBCOLOR;
+ m_rgbColor = DOM::RGBColor(QColor(r, g, b).rgb());
+}
+
+void SVGColorImpl::setRGBColor(const DOM::DOMString &rgbColor)
+{
+ if(rgbColor == "aliceblue")
+ setRGBColor(240, 248, 255);
+ else if(rgbColor == "antiquewhite")
+ setRGBColor(250, 235, 215);
+ else if(rgbColor == "aqua")
+ setRGBColor(0, 255, 255);
+ else if(rgbColor == "aquamarine")
+ setRGBColor(127, 255, 212);
+ else if(rgbColor == "azure")
+ setRGBColor(240, 255, 255);
+ else if(rgbColor == "beige")
+ setRGBColor(245, 245, 220);
+ else if(rgbColor == "bisque")
+ setRGBColor(255, 228, 196);
+ else if(rgbColor == "black")
+ setRGBColor(0, 0, 0);
+ else if(rgbColor == "blanchedalmond")
+ setRGBColor(255, 235, 205);
+ else if(rgbColor == "blue")
+ setRGBColor(0, 0, 255);
+ else if(rgbColor == "blueviolet")
+ setRGBColor(138, 43, 226);
+ else if(rgbColor == "brown")
+ setRGBColor(165, 42, 42);
+ else if(rgbColor == "burlywood")
+ setRGBColor(222, 184, 135);
+ else if(rgbColor == "cadetblue")
+ setRGBColor(95, 158, 160);
+ else if(rgbColor == "chartreuse")
+ setRGBColor(127, 255, 0);
+ else if(rgbColor == "chocolate")
+ setRGBColor(210, 105, 30);
+ else if(rgbColor == "coral")
+ setRGBColor(255, 127, 80);
+ else if(rgbColor == "cornflowerblue")
+ setRGBColor(100, 149, 237);
+ else if(rgbColor == "cornsilk")
+ setRGBColor(255, 248, 220);
+ else if(rgbColor == "crimson")
+ setRGBColor(220, 20, 60);
+ else if(rgbColor == "cyan")
+ setRGBColor(0, 255, 255);
+ else if(rgbColor == "darkblue")
+ setRGBColor(0, 0, 139);
+ else if(rgbColor == "darkcyan")
+ setRGBColor(0, 139, 139);
+ else if(rgbColor == "darkgoldenrod")
+ setRGBColor(184, 134, 11);
+ else if(rgbColor == "darkgray")
+ setRGBColor(169, 169, 169);
+ else if(rgbColor == "darkgrey")
+ setRGBColor(169, 169, 169);
+ else if(rgbColor == "darkgreen")
+ setRGBColor(0, 100, 0);
+ else if(rgbColor == "darkkhaki")
+ setRGBColor(189, 183, 107);
+ else if(rgbColor == "darkmagenta")
+ setRGBColor(139, 0, 139);
+ else if(rgbColor == "darkolivegreen")
+ setRGBColor(85, 107, 47);
+ else if(rgbColor == "darkorange")
+ setRGBColor(255, 140, 0);
+ else if(rgbColor == "darkorchid")
+ setRGBColor(153, 50, 204);
+ else if(rgbColor == "darkred")
+ setRGBColor(139, 0, 0);
+ else if(rgbColor == "darksalmon")
+ setRGBColor(233, 150, 122);
+ else if(rgbColor == "darkseagreen")
+ setRGBColor(143, 188, 143);
+ else if(rgbColor == "darkslateblue")
+ setRGBColor(72, 61, 139);
+ else if(rgbColor == "darkslategray")
+ setRGBColor(47, 79, 79);
+ else if(rgbColor == "darkslategrey")
+ setRGBColor(47, 79, 79);
+ else if(rgbColor == "darkturquoise")
+ setRGBColor(0, 206, 209);
+ else if(rgbColor == "darkviolet")
+ setRGBColor(148, 0, 211);
+ else if(rgbColor == "deeppink")
+ setRGBColor(255, 20, 147);
+ else if(rgbColor == "deepskyblue")
+ setRGBColor(0, 191, 255);
+ else if(rgbColor == "dimgray")
+ setRGBColor(105, 105, 105);
+ else if(rgbColor == "dimgrey")
+ setRGBColor(105, 105, 105);
+ else if(rgbColor == "dodgerblue")
+ setRGBColor(30, 144, 255);
+ else if(rgbColor == "firebrick")
+ setRGBColor(178, 34, 34);
+ else if(rgbColor == "floralwhite")
+ setRGBColor(255, 250, 240);
+ else if(rgbColor == "forestgreen")
+ setRGBColor(34, 139, 34);
+ else if(rgbColor == "fuchsia")
+ setRGBColor(255, 0, 255);
+ else if(rgbColor == "gainsboro")
+ setRGBColor(220, 220, 220);
+ else if(rgbColor == "ghostwhite")
+ setRGBColor(248, 248, 255);
+ else if(rgbColor == "gold")
+ setRGBColor(255, 215, 0);
+ else if(rgbColor == "goldenrod")
+ setRGBColor(218, 165, 32);
+ else if(rgbColor == "gray")
+ setRGBColor(128, 128, 128);
+ else if(rgbColor == "grey")
+ setRGBColor(128, 128, 128);
+ else if(rgbColor == "green")
+ setRGBColor(0, 128, 0);
+ else if(rgbColor == "greenyellow")
+ setRGBColor(173, 255, 47);
+ else if(rgbColor == "honeydew")
+ setRGBColor(240, 255, 240);
+ else if(rgbColor == "hotpink")
+ setRGBColor(255, 105, 180);
+ else if(rgbColor == "indianred")
+ setRGBColor(205, 92, 92);
+ else if(rgbColor == "indigo")
+ setRGBColor(75, 0, 130);
+ else if(rgbColor == "ivory")
+ setRGBColor(255, 255, 240);
+ else if(rgbColor == "khaki")
+ setRGBColor(240, 230, 140);
+ else if(rgbColor == "lavender")
+ setRGBColor(230, 230, 250);
+ else if(rgbColor == "lavenderblush")
+ setRGBColor(255, 240, 245);
+ else if(rgbColor == "lawngreen")
+ setRGBColor(124, 252, 0);
+ else if(rgbColor == "lemonchiffon")
+ setRGBColor(255, 250, 205);
+ else if(rgbColor == "lightblue")
+ setRGBColor(173, 216, 230);
+ else if(rgbColor == "lightcoral")
+ setRGBColor(240, 128, 128);
+ else if(rgbColor == "lightcyan")
+ setRGBColor(224, 255, 255);
+ else if(rgbColor == "lightgoldenrodyellow")
+ setRGBColor(250, 250, 210);
+ else if(rgbColor == "lightgray")
+ setRGBColor(211, 211, 211);
+ else if(rgbColor == "lightgrey")
+ setRGBColor(211, 211, 211);
+ else if(rgbColor == "lightgreen")
+ setRGBColor(144, 238, 144);
+ else if(rgbColor == "lightpink")
+ setRGBColor(255, 182, 193);
+ else if(rgbColor == "lightsalmon")
+ setRGBColor(255, 160, 122);
+ else if(rgbColor == "lightseagreen")
+ setRGBColor(32, 178, 170);
+ else if(rgbColor == "lightskyblue")
+ setRGBColor(135, 206, 250);
+ else if(rgbColor == "lightslategray")
+ setRGBColor(119, 136, 153);
+ else if(rgbColor == "lightslategrey")
+ setRGBColor(119, 136, 153);
+ else if(rgbColor == "lightsteelblue")
+ setRGBColor(176, 196, 222);
+ else if(rgbColor == "lightyellow")
+ setRGBColor(255, 255, 224);
+ else if(rgbColor == "lime")
+ setRGBColor(0, 255, 0);
+ else if(rgbColor == "limegreen")
+ setRGBColor(50, 205, 50);
+ else if(rgbColor == "linen")
+ setRGBColor(250, 240, 230);
+ else if(rgbColor == "magenta")
+ setRGBColor(255, 0, 255);
+ else if(rgbColor == "maroon")
+ setRGBColor(128, 0, 0);
+ else if(rgbColor == "mediumaquamarine")
+ setRGBColor(102, 205, 170);
+ else if(rgbColor == "mediumblue")
+ setRGBColor(0, 0, 205);
+ else if(rgbColor == "mediumorchid")
+ setRGBColor(186, 85, 211);
+ else if(rgbColor == "mediumpurple")
+ setRGBColor(147, 112, 219);
+ else if(rgbColor == "mediumseagreen")
+ setRGBColor(60, 179, 113);
+ else if(rgbColor == "mediumslateblue")
+ setRGBColor(123, 104, 238);
+ else if(rgbColor == "mediumspringgreen")
+ setRGBColor(0, 250, 154);
+ else if(rgbColor == "mediumturquoise")
+ setRGBColor(72, 209, 204);
+ else if(rgbColor == "mediumvioletred")
+ setRGBColor(199, 21, 133);
+ else if(rgbColor == "midnightblue")
+ setRGBColor(25, 25, 112);
+ else if(rgbColor == "mintcream")
+ setRGBColor(245, 255, 250);
+ else if(rgbColor == "mistyrose")
+ setRGBColor(255, 228, 225);
+ else if(rgbColor == "moccasin")
+ setRGBColor(255, 228, 181);
+ else if(rgbColor == "navajowhite")
+ setRGBColor(255, 222, 173);
+ else if(rgbColor == "navy")
+ setRGBColor(0, 0, 128);
+ else if(rgbColor == "oldlace")
+ setRGBColor(253, 245, 230);
+ else if(rgbColor == "olive")
+ setRGBColor(128, 128, 0);
+ else if(rgbColor == "olivedrab")
+ setRGBColor(107, 142, 35);
+ else if(rgbColor == "orange")
+ setRGBColor(255, 165, 0);
+ else if(rgbColor == "orangered")
+ setRGBColor(255, 69, 0);
+ else if(rgbColor == "orchid")
+ setRGBColor(218, 112, 214);
+ else if(rgbColor == "palegoldenrod")
+ setRGBColor(238, 232, 170);
+ else if(rgbColor == "palegreen")
+ setRGBColor(152, 251, 152);
+ else if(rgbColor == "paleturquoise")
+ setRGBColor(175, 238, 238);
+ else if(rgbColor == "palevioletred")
+ setRGBColor(219, 112, 147);
+ else if(rgbColor == "papayawhip")
+ setRGBColor(255, 239, 213);
+ else if(rgbColor == "peachpuff")
+ setRGBColor(255, 218, 185);
+ else if(rgbColor == "peru")
+ setRGBColor(205, 133, 63);
+ else if(rgbColor == "pink")
+ setRGBColor(255, 192, 203);
+ else if(rgbColor == "plum")
+ setRGBColor(221, 160, 221);
+ else if(rgbColor == "powderblue")
+ setRGBColor(176, 224, 230);
+ else if(rgbColor == "purple")
+ setRGBColor(128, 0, 128);
+ else if(rgbColor == "red")
+ setRGBColor(255, 0, 0);
+ else if(rgbColor == "rosybrown")
+ setRGBColor(188, 143, 143);
+ else if(rgbColor == "royalblue")
+ setRGBColor(65, 105, 225);
+ else if(rgbColor == "saddlebrown")
+ setRGBColor(139, 69, 19);
+ else if(rgbColor == "salmon")
+ setRGBColor(250, 128, 114);
+ else if(rgbColor == "sandybrown")
+ setRGBColor(244, 164, 96);
+ else if(rgbColor == "seagreen")
+ setRGBColor(46, 139, 87);
+ else if(rgbColor == "seashell")
+ setRGBColor(255, 245, 238);
+ else if(rgbColor == "sienna")
+ setRGBColor(160, 82, 45);
+ else if(rgbColor == "silver")
+ setRGBColor(192, 192, 192);
+ else if(rgbColor == "skyblue")
+ setRGBColor(135, 206, 235);
+ else if(rgbColor == "slateblue")
+ setRGBColor(106, 90, 205);
+ else if(rgbColor == "slategray")
+ setRGBColor(112, 128, 144);
+ else if(rgbColor == "slategrey")
+ setRGBColor(112, 128, 144);
+ else if(rgbColor == "snow")
+ setRGBColor(255, 250, 250);
+ else if(rgbColor == "springgreen")
+ setRGBColor(0, 255, 127);
+ else if(rgbColor == "steelblue")
+ setRGBColor(70, 130, 180);
+ else if(rgbColor == "tan")
+ setRGBColor(210, 180, 140);
+ else if(rgbColor == "teal")
+ setRGBColor(0, 128, 128);
+ else if(rgbColor == "thistle")
+ setRGBColor(216, 191, 216);
+ else if(rgbColor == "tomato")
+ setRGBColor(255, 99, 71);
+ else if(rgbColor == "turquoise")
+ setRGBColor(64, 224, 208);
+ else if(rgbColor == "violet")
+ setRGBColor(238, 130, 238);
+ else if(rgbColor == "wheat")
+ setRGBColor(245, 222, 179);
+ else if(rgbColor == "white")
+ setRGBColor(255, 255, 255);
+ else if(rgbColor == "whitesmoke")
+ setRGBColor(245, 245, 245);
+ else if(rgbColor == "yellow")
+ setRGBColor(255, 255, 0);
+ else if(rgbColor == "yellowgreen")
+ setRGBColor(154, 205, 50);
+}
+
+void SVGColorImpl::setRGBColorICCColor(const DOM::DOMString &rgbColor, const DOM::DOMString &iccColor)
+{
+ QColor color;
+
+ QString content = iccColor.string().right(iccColor.string().length() - 10);
+ QString iccTarget = content.mid(0, content.find(','));
+
+ QStringList colors = QStringList::split(',', content);
+ QString r = colors[1];
+ QString g = colors[2];
+ QString b = colors[3].left(colors[3].length() - 1);
+
+ iccTarget = SVGURIReferenceImpl::getTarget(iccTarget);
+
+ SVGColorProfileElementImpl *handle = 0;
+ if(m_object)
+ handle = static_cast<SVGColorProfileElementImpl *>(dynamic_cast<SVGElementImpl *>(m_object)->ownerDoc()->rootElement()->getElementById(iccTarget));
+
+ if(iccTarget.isEmpty() || !handle)
+ {
+ color.setNamedColor(rgbColor.string().stripWhiteSpace());
+ setRGBColor(color);
+ }
+ else
+ {
+ color.setRgb(handle->correctPixel(r.toFloat() * 257, g.toFloat() * 257, b.toFloat() * 257));
+ setRGBColor(color);
+
+ m_colorType = SVG_COLORTYPE_RGBCOLOR_ICCCOLOR;
+
+ if(!m_iccColor)
+ {
+ m_iccColor = new SVGICCColorImpl();
+ m_iccColor->ref();
+ }
+
+ m_iccColor->setColorProfile(DOM::DOMString(content));
+
+ SVGNumberImpl *rnumber = SVGSVGElementImpl::createSVGNumber();
+ rnumber->setValue(r.toFloat());
+
+ SVGNumberImpl *gnumber = SVGSVGElementImpl::createSVGNumber();
+ gnumber->setValue(g.toFloat());
+
+ SVGNumberImpl *bnumber = SVGSVGElementImpl::createSVGNumber();
+ bnumber->setValue(b.toFloat());
+
+ m_iccColor->colors()->clear();
+ m_iccColor->colors()->appendItem(bnumber);
+ m_iccColor->colors()->appendItem(gnumber);
+ m_iccColor->colors()->appendItem(rnumber);
+ }
+}
+
+void SVGColorImpl::setColor(unsigned short colorType, const DOM::DOMString &rgbColor, const DOM::DOMString &iccColor)
+{
+ m_colorType = colorType;
+
+ if(m_colorType == SVG_COLORTYPE_UNKNOWN || m_colorType == SVG_COLORTYPE_CURRENTCOLOR)
+ return;
+
+ setRGBColorICCColor(rgbColor, iccColor);
+}
+
+// Ecma stuff
+/*
+@namespace KSVG
+@begin SVGColorImpl::s_hashTable 5
+ colorType SVGColorImpl::ColorType DontDelete|ReadOnly
+ RGBColor SVGColorImpl::RGBColor DontDelete|ReadOnly
+ ICCColor SVGColorImpl::ICCColor DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGColorImplProto::s_hashTable 5
+ setRGBColor SVGColorImpl::SetRGBColor DontDelete|Function 1
+ setRGBColorICCColor SVGColorImpl::SetRGBColorICCColor DontDelete|Function 2
+ setColor SVGColorImpl::SetColor DontDelete|Function 3
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGColor", SVGColorImplProto, SVGColorImplProtoFunc)
+
+Value SVGColorImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case ColorType:
+ return Number(colorType());
+#ifdef __GNUC__
+#warning FIXME bridge stuff
+#endif
+ case RGBColor:
+ return Undefined();
+ case ICCColor:
+ return m_iccColor->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+Value SVGColorImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGColorImpl)
+
+ switch(id)
+ {
+ case SVGColorImpl::SetRGBColor:
+ obj->setRGBColor(args[0].toString(exec).string());
+ break;
+ case SVGColorImpl::SetRGBColorICCColor:
+ obj->setRGBColorICCColor(args[0].toString(exec).string(), args[1].toString(exec).string());
+ break;
+ case SVGColorImpl::SetColor:
+ obj->setColor(static_cast<unsigned short>(args[0].toNumber(exec)), args[1].toString(exec).string(), args[2].toString(exec).string());
+ break;
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+/*
+@namespace KSVG
+@begin SVGColorImplConstructor::s_hashTable 5
+ SVG_COLORTYPE_UNKNOWN KSVG::SVG_COLORTYPE_UNKNOWN DontDelete|ReadOnly
+ SVG_COLORTYPE_RGBCOLOR KSVG::SVG_COLORTYPE_RGBCOLOR DontDelete|ReadOnly
+ SVG_COLORTYPE_RGBCOLOR_ICCCOLOR KSVG::SVG_COLORTYPE_RGBCOLOR_ICCCOLOR DontDelete|ReadOnly
+ SVG_COLORTYPE_CURRENTCOLOR KSVG::SVG_COLORTYPE_CURRENTCOLOR DontDelete|ReadOnly
+@end
+*/
+
+Value SVGColorImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGColorImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGColorImplConstructor>(exec, "[[svgcolor.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGColorImpl.h b/ksvg/impl/SVGColorImpl.h
new file mode 100644
index 00000000..d49c6f82
--- /dev/null
+++ b/ksvg/impl/SVGColorImpl.h
@@ -0,0 +1,94 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGColorImpl_H
+#define SVGColorImpl_H
+
+#include <dom/dom_misc.h>
+#include <dom/css_value.h>
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+class SVGElementImpl;
+class SVGICCColorImpl;
+class SVGColorImpl : public DOM::DomShared
+{
+public:
+ SVGColorImpl(SVGElementImpl *object);
+ SVGColorImpl(const SVGColorImpl &);
+ virtual ~SVGColorImpl();
+
+ SVGColorImpl &operator=(const SVGColorImpl &);
+
+ unsigned short colorType() const;
+
+ DOM::RGBColor rgbColor() const;
+ SVGICCColorImpl *iccColor() const;
+
+ virtual void setRGBColor(const DOM::DOMString &rgbColor);
+ virtual void setRGBColor(int r, int g, int b);
+ virtual void setRGBColor(QColor color);
+ virtual void setRGBColorICCColor(const DOM::DOMString &rgbColor, const DOM::DOMString &iccColor);
+ virtual void setColor(unsigned short colorType, const DOM::DOMString &rgbColor, const DOM::DOMString &iccColor);
+
+private:
+ unsigned short m_colorType;
+ DOM::RGBColor m_rgbColor;
+ SVGICCColorImpl *m_iccColor;
+ SVGElementImpl *m_object;
+
+public:
+ KSVG_BASECLASS_GET
+
+ enum
+ {
+ // Properties
+ ColorType, RGBColor, ICCColor,
+ // Functions
+ SetRGBColor, SetRGBColorICCColor, SetColor
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGColorImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGColorImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGColorImplConstructor(KJS::ExecState *exec);
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGColorImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGColorImplProtoFunc, SVGColorImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGColorProfileElementImpl.cc b/ksvg/impl/SVGColorProfileElementImpl.cc
new file mode 100644
index 00000000..f898188b
--- /dev/null
+++ b/ksvg/impl/SVGColorProfileElementImpl.cc
@@ -0,0 +1,271 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kurl.h>
+#include <kdebug.h>
+#include <kio/netaccess.h>
+
+#include <qimage.h>
+
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+
+#include "SVGRenderingIntent.h"
+
+#include "SVGAnimatedStringImpl.h"
+#include "SVGColorProfileElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGColorProfileElementImpl.lut.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGColorProfileElementImpl::SVGColorProfileElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGURIReferenceImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_loaded = false;
+
+ // Spec: Default value 'auto', if not overwritten later
+ m_renderingIntent = RENDERING_INTENT_AUTO;
+}
+
+SVGColorProfileElementImpl::~SVGColorProfileElementImpl()
+{
+ if(m_loaded)
+ closeColorProfile();
+}
+
+/*
+@namespace KSVG
+@begin SVGColorProfileElementImpl::s_hashTable 5
+ name SVGColorProfileElementImpl::Name DontDelete|ReadOnly
+ href SVGColorProfileElementImpl::Href DontDelete|ReadOnly
+ rendering-intent SVGColorProfileElementImpl::RenderingIntent DontDelete|ReadOnly
+@end
+*/
+
+Value SVGColorProfileElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case Name:
+ return String(m_name);
+ case Href:
+ return href()->cache(exec);
+ case RenderingIntent:
+ return Number(m_renderingIntent);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGColorProfileElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case Name:
+ m_name = value.toString(exec).string();
+ ownerDoc()->rootElement()->addToIdMap(m_name.string(), this);
+ break;
+ case Href:
+ href()->setBaseVal(value.toString(exec).string());
+ break;
+ case RenderingIntent:
+ {
+ QString compare = value.toString(exec).qstring().lower();
+
+ if(compare == "perceptual")
+ m_renderingIntent = RENDERING_INTENT_PERCEPTUAL;
+ else if(compare == "relative-colorimetric")
+ m_renderingIntent = RENDERING_INTENT_RELATIVE_COLORIMETRIC;
+ else if(compare == "saturation")
+ m_renderingIntent = RENDERING_INTENT_SATURATION;
+ else if(compare == "absolute-colorimetric")
+ m_renderingIntent = RENDERING_INTENT_ABSOLUTE_COLORIMETRIC;
+ else
+ m_renderingIntent = RENDERING_INTENT_AUTO;
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+void SVGColorProfileElementImpl::setLocal(const DOM::DOMString &local)
+{
+ m_local = local;
+}
+
+DOM::DOMString SVGColorProfileElementImpl::local() const
+{
+ return m_local;
+}
+
+void SVGColorProfileElementImpl::setName(const DOM::DOMString &name)
+{
+ m_name = name;
+}
+
+DOM::DOMString SVGColorProfileElementImpl::name() const
+{
+ return m_name;
+}
+
+void SVGColorProfileElementImpl::setRenderingIntent(unsigned short renderingIntent)
+{
+ m_renderingIntent = renderingIntent;
+}
+
+unsigned short SVGColorProfileElementImpl::renderingIntent() const
+{
+ return m_renderingIntent;
+}
+
+bool SVGColorProfileElementImpl::canLoad()
+{
+ QString open;
+ bool temp;
+ return canLoad(false, temp, open, true);
+}
+
+bool SVGColorProfileElementImpl::canLoad(bool remote, bool &tempFile, QString &open, bool verbose)
+{
+ KURL file;
+
+ if(!KURL::isRelativeURL(href()->baseVal().string()))
+ file = KURL(href()->baseVal().string());
+ else
+ file = KURL(ownerDoc()->baseUrl(), href()->baseVal().string());
+
+ if(file.path().isEmpty())
+ {
+ if(verbose)
+ kdDebug() << "Couldn't load color profile " << file.path() << "!" << endl;
+
+ return false;
+ }
+
+ if(file.isLocalFile())
+ {
+ open = file.path();
+
+ if(!QFile::exists(open))
+ {
+ if(verbose)
+ kdDebug() << "Couldn't load color profile " << file.path() << "! It does not exist." << endl;
+
+ return false;
+ }
+ }
+ else
+ {
+ if(remote)
+ {
+ if(KIO::NetAccess::download(file, open, 0))
+ tempFile = true;
+ }
+ }
+
+ return true;
+}
+
+bool SVGColorProfileElementImpl::loadColorProfile()
+{
+ QString open;
+ bool tempFile = false;
+
+ if(!canLoad(true, tempFile, open, false))
+ return false;
+
+ m_hInput = cmsOpenProfileFromFile(open.latin1(), "r");
+ m_hOutput = cmsCreate_sRGBProfile();
+
+ unsigned int dwIn = BYTES_SH(2) | CHANNELS_SH(_cmsChannelsOf(m_inputColorSpace));
+ unsigned int dwOut = BYTES_SH(2) | CHANNELS_SH(_cmsChannelsOf(m_outputColorSpace));
+
+ if(m_renderingIntent != RENDERING_INTENT_AUTO)
+ m_hTrans = cmsCreateTransform(m_hInput, dwIn, m_hOutput, dwOut, m_renderingIntent - 2, cmsFLAGS_NOTPRECALC);
+ else
+ m_hTrans = cmsCreateTransform(m_hInput, dwIn, m_hOutput, dwOut, cmsTakeRenderingIntent(m_hInput), cmsFLAGS_NOTPRECALC);
+
+ m_inputColorSpace = cmsGetColorSpace(m_hInput);
+ m_outputColorSpace = cmsGetColorSpace(m_hOutput);
+ m_loaded = true;
+
+ if(tempFile)
+ KIO::NetAccess::removeTempFile(open);
+
+ return true;
+}
+
+void SVGColorProfileElementImpl::closeColorProfile()
+{
+ cmsDeleteTransform(m_hTrans);
+ cmsCloseProfile(m_hInput);
+}
+
+QRgb SVGColorProfileElementImpl::correctPixel(float r, float g, float b)
+{
+ if(!m_loaded)
+ {
+ if(!loadColorProfile())
+ return qRgb(0, 0, 0);
+ }
+
+ unsigned short input[MAXCHANNELS], output[MAXCHANNELS];
+
+ input[0] = ((unsigned int) r) * 257;
+ input[1] = ((unsigned int) g) * 257;
+ input[2] = ((unsigned int) b) * 257;
+
+ cmsDoTransform(m_hTrans, input, output, 1);
+
+ if(m_outputColorSpace == icSigRgbData)
+ return qRgb(output[0] / 257, output[1] / 257, output[2] / 257);
+
+ return qRgb(0, 0, 0);
+}
+
+QImage *SVGColorProfileElementImpl::correctImage(QImage *input)
+{
+ if(!canLoad())
+ return input;
+
+ for(int y = 0; y < input->height(); y++)
+ {
+ for(int x = 0; x < input->width(); x++)
+ {
+ QRgb pixel = input->pixel(x, y);
+ input->setPixel(x, y, correctPixel(qRed(pixel), qGreen(pixel), qBlue(pixel)));
+ }
+ }
+
+ return input;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGColorProfileElementImpl.h b/ksvg/impl/SVGColorProfileElementImpl.h
new file mode 100644
index 00000000..2f735f03
--- /dev/null
+++ b/ksvg/impl/SVGColorProfileElementImpl.h
@@ -0,0 +1,100 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGColorProfileElementImpl_H
+#define SVGColorProfileElementImpl_H
+
+#include <dom/dom_string.h>
+
+// Provided by configure checks....
+#include <config.h>
+#undef QT_VERSION // Needed for 1.08 *grml*
+#include LCMS_HEADER
+
+#include "SVGElementImpl.h"
+#include "SVGURIReferenceImpl.h"
+
+#include "ksvg_lookup.h"
+
+class QImage;
+
+namespace KSVG
+{
+
+class SVGColorProfileElementImpl : public SVGElementImpl,
+ public SVGURIReferenceImpl
+{
+public:
+ SVGColorProfileElementImpl(DOM::ElementImpl *);
+ virtual ~SVGColorProfileElementImpl();
+
+ void setLocal(const DOM::DOMString &local);
+ DOM::DOMString local() const;
+
+ void setName(const DOM::DOMString &name);
+ DOM::DOMString name() const;
+
+ void setRenderingIntent(unsigned short renderingIntent);
+ unsigned short renderingIntent() const;
+
+ QImage *correctImage(QImage *input);
+ QRgb correctPixel(float r, float g, float b);
+
+private:
+ bool loadColorProfile();
+ void closeColorProfile();
+
+ bool canLoad();
+ bool canLoad(bool remote, bool &tempFile, QString &open, bool verbose);
+
+ DOM::DOMString m_local;
+ DOM::DOMString m_name;
+ unsigned short m_renderingIntent;
+
+ bool m_loaded;
+
+ cmsHPROFILE m_hInput, m_hOutput;
+ cmsHTRANSFORM m_hTrans;
+ int m_intent;
+
+ icColorSpaceSignature m_inputColorSpace, m_outputColorSpace;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ Name, Href, RenderingIntent
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGColorProfileElementImpl, "color-profile")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGColorProfileRuleImpl.cc b/ksvg/impl/SVGColorProfileRuleImpl.cc
new file mode 100644
index 00000000..3cfca560
--- /dev/null
+++ b/ksvg/impl/SVGColorProfileRuleImpl.cc
@@ -0,0 +1,63 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGColorProfileRuleImpl.h"
+
+using namespace KSVG;
+
+SVGColorProfileRuleImpl::SVGColorProfileRuleImpl() : SVGCSSRuleImpl()
+{
+}
+
+SVGColorProfileRuleImpl::~SVGColorProfileRuleImpl()
+{
+}
+
+void SVGColorProfileRuleImpl::setSrc(const DOM::DOMString &src)
+{
+ m_src = src;
+}
+
+DOM::DOMString SVGColorProfileRuleImpl::src() const
+{
+ return m_src;
+}
+
+void SVGColorProfileRuleImpl::setName(const DOM::DOMString &name)
+{
+ m_name = name;
+}
+
+DOM::DOMString SVGColorProfileRuleImpl::name() const
+{
+ return m_name;
+}
+
+void SVGColorProfileRuleImpl::setRenderingIntent(unsigned short renderingIntent)
+{
+ m_renderingIntent = renderingIntent;
+}
+
+unsigned short SVGColorProfileRuleImpl::renderingIntent() const
+{
+ return m_renderingIntent;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGColorProfileRuleImpl.h b/ksvg/impl/SVGColorProfileRuleImpl.h
new file mode 100644
index 00000000..976a76a8
--- /dev/null
+++ b/ksvg/impl/SVGColorProfileRuleImpl.h
@@ -0,0 +1,58 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGColorProfileRuleImpl_H
+#define SVGColorProfileRuleImpl_H
+
+#include <dom/dom_string.h>
+
+#include "SVGCSSRuleImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGColorProfileRuleImpl : public SVGCSSRuleImpl
+{
+public:
+ SVGColorProfileRuleImpl();
+ virtual ~SVGColorProfileRuleImpl();
+
+ void setSrc(const DOM::DOMString &src);
+ DOM::DOMString src() const;
+
+ void setName(const DOM::DOMString &name);
+ DOM::DOMString name() const;
+
+ void setRenderingIntent(unsigned short renderingIntent);
+ unsigned short renderingIntent() const;
+
+private:
+ DOM::DOMString m_src;
+ DOM::DOMString m_name;
+ unsigned short m_renderingIntent;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGComponentTransferFunctionElementImpl.cc b/ksvg/impl/SVGComponentTransferFunctionElementImpl.cc
new file mode 100644
index 00000000..0db14aae
--- /dev/null
+++ b/ksvg/impl/SVGComponentTransferFunctionElementImpl.cc
@@ -0,0 +1,105 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGAnimatedNumberListImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGComponentTransferFunctionElementImpl.h"
+
+using namespace KSVG;
+
+SVGComponentTransferFunctionElementImpl::SVGComponentTransferFunctionElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+ m_type = new SVGAnimatedEnumerationImpl();
+ m_type->ref();
+
+ m_tableValues = new SVGAnimatedNumberListImpl();
+ m_tableValues->ref();
+
+ m_slope = new SVGAnimatedNumberImpl();
+ m_slope->ref();
+
+ m_intercept = new SVGAnimatedNumberImpl();
+ m_intercept->ref();
+
+ m_amplitude = new SVGAnimatedNumberImpl();
+ m_amplitude->ref();
+
+ m_exponent = new SVGAnimatedNumberImpl();
+ m_exponent->ref();
+
+ m_offset = new SVGAnimatedNumberImpl();
+ m_offset->ref();
+}
+
+SVGComponentTransferFunctionElementImpl::~SVGComponentTransferFunctionElementImpl()
+{
+ if(m_type)
+ m_type->deref();
+ if(m_tableValues)
+ m_tableValues->deref();
+ if(m_slope)
+ m_slope->deref();
+ if(m_intercept)
+ m_intercept->deref();
+ if(m_amplitude)
+ m_amplitude->deref();
+ if(m_exponent)
+ m_exponent->deref();
+ if(m_offset)
+ m_offset->deref();
+}
+
+SVGAnimatedEnumerationImpl *SVGComponentTransferFunctionElementImpl::type() const
+{
+ return m_type;
+}
+
+SVGAnimatedNumberListImpl *SVGComponentTransferFunctionElementImpl::tableValues() const
+{
+ return m_tableValues;
+}
+
+SVGAnimatedNumberImpl *SVGComponentTransferFunctionElementImpl::slope() const
+{
+ return m_slope;
+}
+
+SVGAnimatedNumberImpl *SVGComponentTransferFunctionElementImpl::intercept() const
+{
+ return m_intercept;
+}
+
+SVGAnimatedNumberImpl *SVGComponentTransferFunctionElementImpl::amplitude() const
+{
+ return m_amplitude;
+}
+
+SVGAnimatedNumberImpl *SVGComponentTransferFunctionElementImpl::exponent() const
+{
+ return m_exponent;
+}
+
+SVGAnimatedNumberImpl *SVGComponentTransferFunctionElementImpl::offset() const
+{
+ return m_offset;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGComponentTransferFunctionElementImpl.h b/ksvg/impl/SVGComponentTransferFunctionElementImpl.h
new file mode 100644
index 00000000..e277d462
--- /dev/null
+++ b/ksvg/impl/SVGComponentTransferFunctionElementImpl.h
@@ -0,0 +1,66 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGComponentTransferFunctionElementImpl_H
+#define SVGComponentTransferFunctionElementImpl_H
+
+#include "SVGElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedNumberImpl;
+class SVGAnimatedNumberListImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGComponentTransferFunctionElementImpl : public SVGElementImpl
+{
+public:
+ SVGComponentTransferFunctionElementImpl(DOM::ElementImpl *);
+ virtual ~SVGComponentTransferFunctionElementImpl();
+
+ SVGAnimatedEnumerationImpl *type() const;
+ SVGAnimatedNumberListImpl *tableValues() const;
+ SVGAnimatedNumberImpl *slope() const;
+ SVGAnimatedNumberImpl *intercept() const;
+ SVGAnimatedNumberImpl *amplitude() const;
+ SVGAnimatedNumberImpl *exponent() const;
+ SVGAnimatedNumberImpl *offset() const;
+
+private:
+ SVGAnimatedEnumerationImpl *m_type;
+ SVGAnimatedNumberListImpl *m_tableValues;
+ SVGAnimatedNumberImpl *m_slope;
+ SVGAnimatedNumberImpl *m_intercept;
+ SVGAnimatedNumberImpl *m_amplitude;
+ SVGAnimatedNumberImpl *m_exponent;
+ SVGAnimatedNumberImpl *m_offset;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGContainerImpl.cc b/ksvg/impl/SVGContainerImpl.cc
new file mode 100644
index 00000000..88fb87a8
--- /dev/null
+++ b/ksvg/impl/SVGContainerImpl.cc
@@ -0,0 +1,135 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGRectImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGContainerImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "kdebug.h"
+
+using namespace KSVG;
+
+SVGContainerImpl::SVGContainerImpl(DOM::ElementImpl *impl) : SVGShapeImpl(impl)
+{
+}
+
+SVGContainerImpl::~SVGContainerImpl()
+{
+}
+
+SVGRectImpl *SVGContainerImpl::getBBox()
+{
+ // just get the union of the children bboxes
+ QRect rect;
+ DOM::Node node = firstChild();
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *elem = ownerDoc()->getElementFromHandle(node.handle());
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(elem);
+ SVGTestsImpl *tests = dynamic_cast<SVGTestsImpl *>(elem);
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(elem);
+
+ bool ok = tests ? tests->ok() : true;
+
+ if(shape && style && ok && style->getVisible() && style->getDisplay())
+ {
+ SVGRectImpl *current = shape->getBBox();
+ rect = rect.unite(current->qrect());
+ current->deref();
+ }
+ }
+
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+ *ret = rect;
+ return ret;
+}
+
+void SVGContainerImpl::createItem(KSVGCanvas *c)
+{
+ DOM::Node node = firstChild();
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *elem = ownerDoc()->getElementFromHandle(node.handle());
+ if(elem)
+ elem->createItem(c);
+ }
+}
+
+void SVGContainerImpl::removeItem(KSVGCanvas *c)
+{
+ SVGShapeImpl::removeItem(c);
+
+ for(DOM::Node node = firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *elem = ownerDoc()->getElementFromHandle(node.handle());
+ if(elem)
+ elem->removeItem(c);
+ }
+}
+
+void SVGContainerImpl::update(CanvasItemUpdate reason, int param1, int param2)
+{
+ SVGShapeImpl::update(reason, param1, param2);
+
+ for(DOM::Node node = firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(ownerDoc()->getElementFromHandle(node.handle()));
+ if(shape)
+ shape->update(reason, param1, param2);
+ }
+}
+
+void SVGContainerImpl::invalidate(KSVGCanvas *c, bool recalc)
+{
+ SVGShapeImpl::invalidate(c, recalc);
+
+ for(DOM::Node node = firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(ownerDoc()->getElementFromHandle(node.handle()));
+ if(shape)
+ shape->invalidate(c, recalc);
+ }
+}
+
+void SVGContainerImpl::setReferenced(bool referenced)
+{
+ SVGShapeImpl::setReferenced(referenced);
+
+ for(DOM::Node node = firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(ownerDoc()->getElementFromHandle(node.handle()));
+ if(shape)
+ shape->setReferenced(referenced);
+ }
+}
+
+void SVGContainerImpl::draw()
+{
+ SVGShapeImpl::draw();
+
+ for(DOM::Node node = firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(ownerDoc()->getElementFromHandle(node.handle()));
+ if(shape)
+ shape->draw();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGContainerImpl.h b/ksvg/impl/SVGContainerImpl.h
new file mode 100644
index 00000000..353a6154
--- /dev/null
+++ b/ksvg/impl/SVGContainerImpl.h
@@ -0,0 +1,58 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGContainerImpl_H
+#define SVGContainerImpl_H
+
+#include "SVGShapeImpl.h"
+
+namespace KSVG
+{
+enum CanvasItemUpdate;
+class KSVGCanvas;
+
+class SVGContainerImpl : public SVGShapeImpl
+{
+public:
+ SVGContainerImpl(DOM::ElementImpl *);
+ virtual ~SVGContainerImpl();
+
+ virtual bool isContainer() const { return true; }
+
+ virtual void createItem(KSVGCanvas *c = 0);
+ virtual void removeItem(KSVGCanvas *c);
+
+ virtual void update(CanvasItemUpdate reason, int param1, int param2);
+ virtual void invalidate(KSVGCanvas *c, bool recalc);
+ virtual void setReferenced(bool referenced);
+ virtual void draw();
+
+ virtual SVGRectImpl *getBBox();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGCursorElementImpl.cc b/ksvg/impl/SVGCursorElementImpl.cc
new file mode 100644
index 00000000..331f8826
--- /dev/null
+++ b/ksvg/impl/SVGCursorElementImpl.cc
@@ -0,0 +1,104 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGCursorElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+
+using namespace KSVG;
+
+#include "SVGCursorElementImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGCursorElementImpl::SVGCursorElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGURIReferenceImpl(), SVGTestsImpl(), SVGExternalResourcesRequiredImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x = new SVGAnimatedLengthImpl();
+ m_x->ref();
+
+ m_y = new SVGAnimatedLengthImpl();
+ m_y->ref();
+}
+
+SVGCursorElementImpl::~SVGCursorElementImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+}
+
+SVGAnimatedLengthImpl *SVGCursorElementImpl::x() const
+{
+ return m_x;
+}
+
+SVGAnimatedLengthImpl *SVGCursorElementImpl::y() const
+{
+ return m_y;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGCursorElementImpl::s_hashTable 3
+ x SVGCursorElementImpl::X DontDelete|ReadOnly
+ y SVGCursorElementImpl::Y DontDelete|ReadOnly
+@end
+*/
+
+Value SVGCursorElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return m_x->cache(exec);
+ case Y:
+ return m_y->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGCursorElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case X:
+ x()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Y:
+ y()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGCursorElementImpl.h b/ksvg/impl/SVGCursorElementImpl.h
new file mode 100644
index 00000000..a063acd0
--- /dev/null
+++ b/ksvg/impl/SVGCursorElementImpl.h
@@ -0,0 +1,69 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGCursorElementImpl_H
+#define SVGCursorElementImpl_H
+
+#include "SVGTestsImpl.h"
+#include "SVGElementImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedLengthImpl;
+class SVGCursorElementImpl : public SVGElementImpl,
+ public SVGURIReferenceImpl,
+ public SVGTestsImpl,
+ public SVGExternalResourcesRequiredImpl
+{
+public:
+ SVGCursorElementImpl(DOM::ElementImpl *);
+ virtual ~SVGCursorElementImpl();
+
+ SVGAnimatedLengthImpl *x() const;
+ SVGAnimatedLengthImpl *y() const;
+
+private:
+ SVGAnimatedLengthImpl *m_x;
+ SVGAnimatedLengthImpl *m_y;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGDefinitionSrcElementImpl.cc b/ksvg/impl/SVGDefinitionSrcElementImpl.cc
new file mode 100644
index 00000000..cf5d764c
--- /dev/null
+++ b/ksvg/impl/SVGDefinitionSrcElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGDefinitionSrcElementImpl.h"
+
+using namespace KSVG;
+
+SVGDefinitionSrcElementImpl::SVGDefinitionSrcElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+}
+
+SVGDefinitionSrcElementImpl::~SVGDefinitionSrcElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGDefinitionSrcElementImpl.h b/ksvg/impl/SVGDefinitionSrcElementImpl.h
new file mode 100644
index 00000000..65fb359c
--- /dev/null
+++ b/ksvg/impl/SVGDefinitionSrcElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGDefinitionSrcElementImpl_H
+#define SVGDefinitionSrcElementImpl_H
+
+#include "SVGElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGDefinitionSrcElementImpl : public SVGElementImpl
+{
+public:
+ SVGDefinitionSrcElementImpl(DOM::ElementImpl *);
+ virtual ~SVGDefinitionSrcElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGDefsElementImpl.cc b/ksvg/impl/SVGDefsElementImpl.cc
new file mode 100644
index 00000000..e5d7d398
--- /dev/null
+++ b/ksvg/impl/SVGDefsElementImpl.cc
@@ -0,0 +1,34 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGDefsElementImpl.h"
+
+using namespace KSVG;
+
+SVGDefsElementImpl::SVGDefsElementImpl(DOM::ElementImpl *impl) : SVGContainerImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+ m_display = false; // implicit display=none
+}
+
+SVGDefsElementImpl::~SVGDefsElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGDefsElementImpl.h b/ksvg/impl/SVGDefsElementImpl.h
new file mode 100644
index 00000000..e32f0dc9
--- /dev/null
+++ b/ksvg/impl/SVGDefsElementImpl.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGDefsElementImpl_H
+#define SVGDefsElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGContainerImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGDefsElementImpl : public SVGContainerImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGDefsElementImpl(DOM::ElementImpl *);
+ virtual ~SVGDefsElementImpl();
+
+ virtual bool directRender() { return false; }
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGDefsElementImpl, "defs")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGDescElementImpl.cc b/ksvg/impl/SVGDescElementImpl.cc
new file mode 100644
index 00000000..cb0958dd
--- /dev/null
+++ b/ksvg/impl/SVGDescElementImpl.cc
@@ -0,0 +1,39 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGDocumentImpl.h"
+#include "SVGDescElementImpl.h"
+
+using namespace KSVG;
+
+SVGDescElementImpl::SVGDescElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGLangSpaceImpl(), SVGStylableImpl(this)
+{
+}
+
+SVGDescElementImpl::~SVGDescElementImpl()
+{
+}
+
+void SVGDescElementImpl::createItem(KSVGCanvas *)
+{
+ emit ownerDoc()->gotDescription(collectText());
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGDescElementImpl.h b/ksvg/impl/SVGDescElementImpl.h
new file mode 100644
index 00000000..c8136eb6
--- /dev/null
+++ b/ksvg/impl/SVGDescElementImpl.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGDescElementImpl_H
+#define SVGDescElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+
+namespace KSVG
+{
+
+class SVGDescElementImpl : public SVGElementImpl,
+ public SVGLangSpaceImpl,
+ public SVGStylableImpl
+{
+public:
+ SVGDescElementImpl(DOM::ElementImpl *impl);
+ virtual ~SVGDescElementImpl();
+
+ virtual void createItem(KSVGCanvas *c = 0);
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGDescElementImpl, "desc")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGDocumentImpl.cc b/ksvg/impl/SVGDocumentImpl.cc
new file mode 100644
index 00000000..4bbe2664
--- /dev/null
+++ b/ksvg/impl/SVGDocumentImpl.cc
@@ -0,0 +1,705 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#define USE_VALGRIND 0
+
+#if USE_VALGRIND
+#include <valgrind/calltree.h>
+#endif
+
+#include "SVGEvent.h"
+#include "SVGMatrixImpl.h"
+#include "SVGWindowImpl.h"
+#include "SVGElementImpl.h"
+#include "SVGDocumentImpl.moc"
+#include "SVGSVGElementImpl.h"
+#include "SVGImageElementImpl.h"
+#include "SVGScriptElementImpl.h"
+#include "SVGTitleElementImpl.h"
+#include "SVGAnimationElementImpl.h"
+
+#include "KSVGReader.h"
+#include "KSVGLoader.h"
+#include "KSVGCanvas.h"
+#include "CanvasItem.h"
+
+#include <qpaintdevicemetrics.h>
+
+using namespace KSVG;
+
+#include "SVGDocumentImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+// A sequence of prime numbers that sets the m_elemDict's hash table size as the
+// number of elements in the dictionary passes each level. This keeps the lookup
+// performance high as the number of elements grows. See the QDict documentation.
+unsigned int SVGDocumentImpl::elemDictHashSizes [] =
+{
+ 101,
+ 211,
+ 401,
+ 809,
+ 1601,
+ 3203,
+ 6421,
+ 12809,
+ 25601,
+ 51203,
+ 102407,
+ 204803,
+ 409609,
+ 819229
+};
+
+const int SVGDocumentImpl::numElemDictHashSizes = sizeof(elemDictHashSizes) / sizeof(elemDictHashSizes[0]);
+
+SVGDocumentImpl::SVGDocumentImpl(bool anim, bool fit, SVGImageElementImpl *parentImage) : QObject(), DOM::DomShared(), DOM::Document(), SVGDOMNodeBridge(static_cast<DOM::Node>(*this))
+{
+ m_animations = anim;
+
+ m_reader = 0;
+ m_loader = 0;
+ m_canvas = 0;
+ m_rootElement = 0;
+ m_lastTarget = 0;
+ m_window = 0;
+
+ m_elemDictHashSizeIndex = 0;
+ m_elemDict.resize(elemDictHashSizes[m_elemDictHashSizeIndex]);
+
+ m_timeScheduler = new SVGTimeScheduler(this);
+ m_ecmaEngine = new KSVGEcma(this);
+ m_ecmaEngine->setup();
+
+ m_finishedParsing = false;
+ m_finishedLoading = false;
+ m_resortZIndicesOnFinishedLoading = false;
+ m_fit = fit;
+
+ m_parentImage = parentImage;
+ if(m_parentImage)
+ m_parentImage->ref();
+}
+
+SVGDocumentImpl::~SVGDocumentImpl()
+{
+ if(rootElement() && rootElement()->hasEventListener(SVGEvent::UNLOAD_EVENT, true))
+ rootElement()->dispatchEvent(SVGEvent::UNLOAD_EVENT, false, false);
+
+ QPtrList<SVGShapeImpl> killList;
+
+ DOM::Node node = firstChild();
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(getElementFromHandle(node.handle()));
+ if(shape)
+ killList.append(shape);
+ }
+
+ SVGShapeImpl *rend = 0;
+ for(rend = killList.first(); rend; rend = killList.next())
+ delete rend;
+
+ delete m_timeScheduler;
+ delete m_ecmaEngine;
+ delete m_reader;
+ delete m_loader;
+
+ if(m_window)
+ m_window->deref();
+
+ if(m_parentImage)
+ m_parentImage->deref();
+}
+
+SVGWindowImpl *SVGDocumentImpl::window()
+{
+ if(!m_window)
+ {
+ m_window = new SVGWindowImpl(const_cast<SVGDocumentImpl *>(this));
+ m_window->ref();
+ }
+
+ return m_window;
+}
+
+float SVGDocumentImpl::screenPixelsPerMillimeterX() const
+{
+ if(canvas() && canvas()->drawWindow())
+ {
+ QPaintDeviceMetrics metrics(canvas()->drawWindow());
+ return float(metrics.width()) / float(metrics.widthMM());
+ }
+ else
+ return 90.0;
+}
+
+float SVGDocumentImpl::screenPixelsPerMillimeterY() const
+{
+ if(canvas() && canvas()->drawWindow())
+ {
+ QPaintDeviceMetrics metrics(canvas()->drawWindow());
+ return float(metrics.height()) / float(metrics.heightMM());
+ }
+ else
+ return 90.0;
+}
+
+DOM::DOMString SVGDocumentImpl::title() const
+{
+ DOM::Node n;
+ for(n = rootElement()->firstChild(); !n.isNull(); n = n.nextSibling())
+ {
+ SVGElementImpl *elem = getElementFromHandle(n.handle());
+ if(dynamic_cast<SVGTitleElementImpl *>(elem))
+ return elem->collectText();
+ }
+ return "";
+}
+
+DOM::DOMString SVGDocumentImpl::referrer() const
+{
+ return m_referrer;
+}
+
+DOM::DOMString SVGDocumentImpl::domain() const
+{
+ return m_baseURL.host();
+}
+
+DOM::DOMString SVGDocumentImpl::URL() const
+{
+ return m_baseURL.prettyURL();
+}
+
+void SVGDocumentImpl::setReferrer(const DOM::DOMString &referrer)
+{
+ // TODO : better may be to request for referrer instead of storing it
+ m_referrer = referrer;
+}
+
+void SVGDocumentImpl::setRootElement(SVGSVGElementImpl *elem)
+{
+ m_rootElement = elem;
+}
+
+SVGSVGElementImpl *SVGDocumentImpl::rootElement() const
+{
+ return m_rootElement;
+}
+
+SVGElementImpl *SVGDocumentImpl::createElement(const DOM::DOMString &name, DOM::Element impl, SVGDocumentImpl *doc)
+{
+ DOM::ElementImpl *handle = reinterpret_cast<DOM::ElementImpl *>(impl.handle());
+ SVGElementImpl *element = SVGElementImpl::Factory::self()->create(std::string(name.string().latin1()), handle);
+
+ if(!element)
+ element = new SVGElementImpl(handle);
+
+ element->setOwnerDoc(doc);
+ element->ref();
+ return element;
+}
+
+bool SVGDocumentImpl::open(const ::KURL &url)
+{
+ if(!url.prettyURL().isEmpty())
+ {
+ m_baseURL = url;
+
+ if(!m_loader)
+ m_loader = new KSVGLoader();
+
+ connect(m_loader, SIGNAL(gotResult(QIODevice *)), this, SLOT(slotSVGContent(QIODevice *)));
+ m_loader->getSVGContent(url);
+ }
+ else
+ return false;
+
+ return true;
+}
+
+void SVGDocumentImpl::slotSVGContent(QIODevice *dev)
+{
+ QXmlInputSource *inputSource = new QXmlInputSource(dev);
+
+ if(m_reader)
+ delete m_reader;
+
+ KSVGReader::ParsingArgs args;
+ args.fit = m_fit;
+ args.getURLMode = false;
+
+ QString url = m_baseURL.prettyURL();
+ int pos = url.find('#'); // url can become like this.svg#svgView(viewBox(63,226,74,74)), get part after '#'
+ if(pos > -1)
+ args.SVGFragmentId = url.mid(pos + 1);
+
+ m_reader = new KSVGReader(this, m_canvas, args);
+ connect(m_reader, SIGNAL(finished(bool, const QString &)), this, SLOT(slotFinishedParsing(bool, const QString &)));
+ m_t.start();
+
+#if USE_VALGRIND
+ CALLTREE_ZERO_STATS();
+#endif
+
+ m_reader->parse(inputSource);
+ delete dev;
+}
+
+void SVGDocumentImpl::parseSVG(QXmlInputSource *inputSource, bool getURLMode)
+{
+ if(m_reader)
+ delete m_reader;
+
+ KSVGReader::ParsingArgs args;
+ args.fit = m_fit;
+ args.getURLMode = getURLMode;
+ m_reader = new KSVGReader(this, 0, args);
+ connect(m_reader, SIGNAL(finished(bool, const QString &)), this, SLOT(slotFinishedParsing(bool, const QString &)));
+
+#if USE_VALGRIND
+ CALLTREE_ZERO_STATS();
+#endif
+
+ m_reader->parse(inputSource);
+}
+
+void SVGDocumentImpl::finishParsing(bool error, const QString &errorDesc)
+{
+ if(m_reader)
+ m_reader->finishParsing(error, errorDesc);
+}
+
+void SVGDocumentImpl::slotFinishedParsing(bool error, const QString &errorDesc)
+{
+ kdDebug(26000) << k_funcinfo << "total time : " << m_t.elapsed() << endl;
+
+#if USE_VALGRIND
+ CALLTREE_DUMP_STATS();
+#endif
+
+ if(m_animations)
+ m_timeScheduler->startAnimations();
+
+ if(m_canvas && !error && rootElement())
+ executeScripts();
+
+ m_finishedParsing = true;
+
+ emit finishedParsing(error, errorDesc);
+ if(!error)
+ emit finishedRendering();
+
+ checkFinishedLoading();
+}
+
+void SVGDocumentImpl::newImageJob(SVGImageElementImpl *image)
+{
+ kdDebug(26002) << "SVGDocumentImpl::newImageJob, " << image << endl;
+ m_loader->newImageJob(image, m_baseURL);
+}
+
+void SVGDocumentImpl::notifyImageLoading(SVGImageElementImpl *image)
+{
+ m_imagesLoading.append(image);
+}
+
+void SVGDocumentImpl::notifyImageLoaded(SVGImageElementImpl *image)
+{
+ m_imagesLoading.remove(image);
+
+ if(m_imagesLoading.isEmpty())
+ checkFinishedLoading();
+}
+
+void SVGDocumentImpl::checkFinishedLoading()
+{
+ if(m_finishedParsing && m_imagesLoading.isEmpty())
+ {
+ m_finishedLoading = true;
+
+ if(m_resortZIndicesOnFinishedLoading)
+ {
+ // Only resort if we're the 'outermost' document, i.e. we're not an svg image
+ // inside another document. We could resort as each image finishes loading, but it
+ // slows down the parsing phase.
+ if(m_parentImage == 0 && m_canvas && m_rootElement)
+ {
+ m_canvas->setElementItemZIndexRecursive(m_rootElement, 0);
+ m_canvas->update();
+ }
+ }
+
+ emit finishedLoading();
+ }
+}
+
+void SVGDocumentImpl::addForwardReferencingUseElement(SVGUseElementImpl *use)
+{
+ if(!m_forwardReferencingUseElements.contains(use))
+ m_forwardReferencingUseElements.append(use);
+}
+
+void SVGDocumentImpl::slotPaint()
+{
+ rerender();
+}
+
+void SVGDocumentImpl::rerender()
+{
+ m_canvas->update();
+ emit finishedRendering();
+}
+
+void SVGDocumentImpl::attach(KSVG::KSVGCanvas *c)
+{
+ m_canvas = c;
+}
+
+void SVGDocumentImpl::detach()
+{
+ m_canvas = 0;
+}
+
+KSVG::KSVGCanvas *SVGDocumentImpl::canvas() const
+{
+ return m_canvas;
+}
+
+void SVGDocumentImpl::syncCachedMatrices()
+{
+ if(rootElement())
+ {
+ SVGMatrixImpl *parentMatrix = SVGSVGElementImpl::createSVGMatrix();
+ rootElement()->checkCachedScreenCTM(parentMatrix);
+ parentMatrix->deref();
+ }
+}
+
+void SVGDocumentImpl::executeScriptsRecursive(DOM::Node start)
+{
+ DOM::Node node = start.firstChild();
+
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *element = getElementFromHandle(node.handle());
+
+ SVGContainerImpl *container = dynamic_cast<SVGContainerImpl *>(element);
+ if(container)
+ executeScriptsRecursive(node);
+
+ SVGScriptElementImpl *script = dynamic_cast<SVGScriptElementImpl *>(element);
+
+ if(script)
+ script->executeScript(DOM::Node());
+ }
+}
+
+bool SVGDocumentImpl::executeScriptsRecursiveCheck(DOM::Node start)
+{
+ bool test = true;
+
+ DOM::Node node = start.firstChild();
+
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *element = getElementFromHandle(node.handle());
+
+ SVGContainerImpl *container = dynamic_cast<SVGContainerImpl *>(element);
+ if(container)
+ {
+ if(!executeScriptsRecursiveCheck(node))
+ return false;
+ }
+
+ SVGScriptElementImpl *script = dynamic_cast<SVGScriptElementImpl *>(element);
+
+ if(script)
+ {
+ if(!script->canExecuteScript())
+ {
+ test = false;
+ break;
+ }
+ }
+ }
+
+ return test;
+}
+
+void SVGDocumentImpl::executeScripts()
+{
+ bool test = executeScriptsRecursiveCheck(*rootElement());
+
+ if(!test)
+ QTimer::singleShot(50, this, SLOT(executeScripts()));
+ else
+ {
+ executeScriptsRecursive(*rootElement());
+
+ // mop: only rerender if an loadevent has been found
+ if(dispatchRecursiveEvent(SVGEvent::LOAD_EVENT, lastChild()))
+ m_canvas->update();
+ }
+}
+
+// Dispatches a non-cancelable, non-bubbles event to every child
+bool SVGDocumentImpl::dispatchRecursiveEvent(SVGEvent::EventId id, DOM::Node start)
+{
+ bool eventExecuted = false;
+
+ // Iterate the tree, backwards, and dispatch the event to every child
+ DOM::Node node = start;
+ for(; !node.isNull(); node = node.previousSibling())
+ {
+ SVGElementImpl *element = getElementFromHandle(node.handle());
+
+ if(element && element->hasChildNodes())
+ {
+ // Dispatch to all children
+ eventExecuted = dispatchRecursiveEvent(id, element->lastChild()) ? true : eventExecuted;
+
+ // Dispatch, locally
+ if(element->hasEventListener(id, true))
+ {
+ element->dispatchEvent(id, false, false);
+ eventExecuted = true;
+ }
+ }
+ else if(element && element->hasEventListener(id, true))
+ {
+ element->dispatchEvent(id, false, false);
+ eventExecuted = true;
+ }
+ }
+
+ return eventExecuted;
+}
+
+SVGEventListener *SVGDocumentImpl::createEventListener(DOM::DOMString type)
+{
+ return m_ecmaEngine->createEventListener(type);
+}
+
+SVGElementImpl *SVGDocumentImpl::recursiveSearch(DOM::Node start, const DOM::DOMString &id)
+{
+ DOM::Node node = start.firstChild();
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *test = getElementFromHandle(node.handle());
+
+ // Look in containers
+ SVGContainerImpl *container = dynamic_cast<SVGContainerImpl *>(test);
+ if(container)
+ {
+ SVGElementImpl *found = recursiveSearch(node, id);
+ if(found)
+ return found;
+ }
+
+ // Look in SVGSVGElementImpl's
+ SVGSVGElementImpl *svgtest = dynamic_cast<SVGSVGElementImpl *>(test);
+ if(svgtest)
+ {
+ SVGElementImpl *element = svgtest->getElementById(id);
+ if(element)
+ return element;
+ }
+ }
+
+ return 0;
+}
+
+/*
+@namespace KSVG
+@begin SVGDocumentImpl::s_hashTable 9
+ title SVGDocumentImpl::Title DontDelete|ReadOnly
+ referrer SVGDocumentImpl::Referrer DontDelete|ReadOnly
+ domain SVGDocumentImpl::Domain DontDelete|ReadOnly
+ URL SVGDocumentImpl::Url DontDelete|ReadOnly
+ doctype SVGDocumentImpl::DocType DontDelete|ReadOnly
+ implementation SVGDocumentImpl::Implementation DontDelete|ReadOnly
+ rootElement SVGDocumentImpl::RootElement DontDelete|ReadOnly
+ documentElement SVGDocumentImpl::DocumentElement DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGDocumentImplProto::s_hashTable 7
+ createTextNode SVGDocumentImpl::CreateTextNode DontDelete|Function 1
+ createElement SVGDocumentImpl::CreateElement DontDelete|Function 1
+ createElementNS SVGDocumentImpl::CreateElementNS DontDelete|Function 2
+ getElementById SVGDocumentImpl::GetElementById DontDelete|Function 1
+ getElementsByTagName SVGDocumentImpl::GetElementsByTagName DontDelete|Function 1
+ getElementsByTagNameNS SVGDocumentImpl::GetElementsByTagNameNS DontDelete|Function 2
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGDocument", SVGDocumentImplProto, SVGDocumentImplProtoFunc)
+
+Value SVGDocumentImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case Title:
+ return String(title().string());
+ case Referrer:
+ return String(referrer().string());
+ case Domain:
+ return String(domain().string());
+ case Url:
+ return String(URL().string());
+ case DocType:
+ return getDOMNode(exec, doctype());
+ case Implementation:
+ return (new SVGDOMDOMImplementationBridge(implementation()))->cache(exec);
+ case RootElement:
+ case DocumentElement:
+ return m_rootElement->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+Value SVGDocumentImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGDocumentImpl)
+
+ switch(id)
+ {
+ case SVGDocumentImpl::CreateTextNode:
+ return getDOMNode(exec, obj->createTextNode(args[0].toString(exec).string()));
+ case SVGDocumentImpl::CreateElement:
+ case SVGDocumentImpl::CreateElementNS:
+ {
+ SVGElementImpl *newElement = 0;
+
+ if(id == SVGDocumentImpl::CreateElement)
+ newElement = obj->createElement(args[0].toString(exec).qstring(), static_cast<DOM::Document *>(obj)->createElement(args[0].toString(exec).string()), obj);
+ else if(id == SVGDocumentImpl::CreateElementNS)
+ newElement = obj->createElement(args[1].toString(exec).qstring(), static_cast<DOM::Document *>(obj)->createElementNS(args[0].toString(exec).string(), args[1].toString(exec).string()), obj);
+
+ newElement->setOwnerSVGElement(obj->rootElement()); // FIXME: Correct in all situations?
+ newElement->setViewportElement(obj->rootElement());
+ newElement->setAttributes();
+
+ return getDOMNode(exec, *newElement);
+ }
+ case SVGDocumentImpl::GetElementById:
+ {
+ Value ret;
+
+ SVGElementImpl *element = obj->rootElement()->getElementById(args[0].toString(exec).string());
+
+ if(element)
+ ret = getDOMNode(exec, *element);
+ else
+ {
+ element = obj->recursiveSearch(*obj, args[0].toString(exec).string());
+ if(!element)
+ return Null();
+
+ ret = getDOMNode(exec, *element);
+ }
+
+ return ret;
+ }
+ case SVGDocumentImpl::GetElementsByTagName:
+ return (new SVGDOMNodeListBridge(obj->getElementsByTagName(args[0].toString(exec).string())))->cache(exec);
+ case SVGDocumentImpl::GetElementsByTagNameNS:
+ return (new SVGDOMNodeListBridge(obj->getElementsByTagNameNS(args[0].toString(exec).string(), args[1].toString(exec).string())))->cache(exec);
+ default:
+ break;
+ }
+
+ return KJS::Undefined();
+}
+
+SVGElementImpl *SVGDocumentImpl::getElementFromHandle(DOM::NodeImpl *handle) const
+{
+ return m_elemDict[handle];
+}
+
+void SVGDocumentImpl::addToElemDict(DOM::NodeImpl *handle, SVGElementImpl *obj)
+{
+ m_elemDict.insert(handle, obj);
+
+ if(m_elemDict.count()>m_elemDict.size() && m_elemDictHashSizeIndex<numElemDictHashSizes-1)
+ {
+ // Increase the hash table size to maintain good lookup speed.
+ m_elemDictHashSizeIndex++;
+ m_elemDict.resize(elemDictHashSizes[m_elemDictHashSizeIndex]);
+ }
+}
+
+void SVGDocumentImpl::removeFromElemDict(DOM::NodeImpl *handle)
+{
+ m_elemDict.remove(handle);
+}
+
+SVGDocumentImpl *SVGDocumentImpl::getDocumentFromHandle(DOM::NodeImpl *handle) const
+{
+ return m_documentDict[handle];
+}
+
+void SVGDocumentImpl::addToDocumentDict(DOM::NodeImpl *handle, SVGDocumentImpl *obj)
+{
+ m_documentDict.insert(handle, obj);
+}
+
+SVGElementImpl *SVGDocumentImpl::getElementByIdRecursive(SVGSVGElementImpl *start, const DOM::DOMString &elementId, bool dontSearch)
+{
+ SVGElementImpl *element = 0;
+
+ // #1 Look in passed SVGSVGElementImpl
+ if(start)
+ {
+ element = start->getElementById(elementId);
+
+ if(element)
+ return element;
+ }
+
+ // #2 Search in all child SVGSVGElementImpl's
+ element = recursiveSearch(*this, elementId);
+
+ if(element)
+ return element;
+
+ // #3 Search in other documents
+ if(!dontSearch)
+ {
+ QPtrDictIterator<SVGDocumentImpl> it(m_documentDict);
+ for(; it.current(); ++it)
+ {
+ SVGElementImpl *temp = it.current()->getElementByIdRecursive(0, elementId, true);
+ if(temp)
+ return temp;
+ }
+ }
+
+ return element;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGDocumentImpl.h b/ksvg/impl/SVGDocumentImpl.h
new file mode 100644
index 00000000..c4156910
--- /dev/null
+++ b/ksvg/impl/SVGDocumentImpl.h
@@ -0,0 +1,245 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGDocumentImpl_H
+#define SVGDocumentImpl_H
+
+#include <kurl.h>
+
+#include <qxml.h>
+#include <qobject.h>
+#include <qptrdict.h>
+#include <qptrlist.h>
+#include <qdatetime.h>
+#include <qstringlist.h>
+
+#include <kjs/object.h>
+
+#include <dom/dom_doc.h>
+#include <dom/dom_misc.h>
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+#include "SVGEvent.h"
+#include "SVGTimeScheduler.h"
+
+class KSVGEcma;
+class KSVGRequest;
+
+namespace KJS
+{
+ class Value;
+ class UString;
+ class ExecState;
+ class Identifier;
+}
+
+namespace KSVG
+{
+
+class SVGTimer;
+class KSVGLoader;
+class KSVGReader;
+class KSVGCanvas;
+class SVGImageElementImpl;
+class SVGSVGElementImpl;
+class SVGWindowImpl;
+class SVGScriptElementImpl;
+class SVGDescElementImpl;
+class SVGTitleElementImpl;
+class SVGUseElementImpl;
+class SVGDocumentImpl : public QObject,
+ public DOM::DomShared,
+ public DOM::Document,
+ public SVGDOMNodeBridge
+{
+Q_OBJECT
+public:
+ SVGDocumentImpl(bool anim = true, bool bFit = false, SVGImageElementImpl *parentImage = 0);
+ virtual ~SVGDocumentImpl();
+
+ float screenPixelsPerMillimeterX() const;
+ float screenPixelsPerMillimeterY() const;
+
+ DOM::DOMString title() const;
+ DOM::DOMString referrer() const;
+ DOM::DOMString domain() const;
+ DOM::DOMString URL() const;
+
+ void setReferrer(const DOM::DOMString &referrer);
+
+ void setRootElement(SVGSVGElementImpl *);
+ SVGSVGElementImpl *rootElement() const;
+
+ SVGImageElementImpl *parentImage() const { return m_parentImage; }
+
+ SVGWindowImpl *window();
+
+ static SVGElementImpl *createElement(const DOM::DOMString &name, DOM::Element impl, SVGDocumentImpl *doc = 0);
+
+ bool open(const KURL &url);
+ void rerender();
+
+ void attach(KSVG::KSVGCanvas *p);
+ void detach();
+
+ bool ready() { return m_finishedParsing; }
+
+ KURL baseUrl() { return m_baseURL; }
+ KSVGCanvas *canvas() const;
+
+ // Ecma stuff
+ KSVGEcma *ecmaEngine() { return m_ecmaEngine; }
+
+ void parseSVG(QXmlInputSource *inputSource, bool getURLMode = false);
+
+ virtual bool implementsCall() const { return true; }
+
+ void executeScriptsRecursive(DOM::Node start);
+ bool executeScriptsRecursiveCheck(DOM::Node start);
+
+ bool dispatchRecursiveEvent(SVGEvent::EventId id, DOM::Node start);
+
+ SVGElementImpl *getElementByIdRecursive(SVGSVGElementImpl *start, const DOM::DOMString &elementId, bool dontSearch = false);
+
+ // Event stuff
+ SVGEventListener *createEventListener(DOM::DOMString type);
+
+ void setLastTarget(SVGElementImpl *elem) { m_lastTarget = elem; }
+ SVGElementImpl *lastTarget() { return m_lastTarget; }
+
+ // Animation stuff
+ SVGTimeScheduler *timeScheduler() const { return m_timeScheduler; }
+
+ // Internal
+ SVGElementImpl *getElementFromHandle(DOM::NodeImpl *handle) const;
+ void addToElemDict(DOM::NodeImpl *handle, SVGElementImpl *obj);
+ void removeFromElemDict(DOM::NodeImpl *handle);
+
+ SVGDocumentImpl *getDocumentFromHandle(DOM::NodeImpl *handle) const;
+ void addToDocumentDict(DOM::NodeImpl *handle, SVGDocumentImpl *obj);
+
+ SVGElementImpl *recursiveSearch(DOM::Node start, const DOM::DOMString &id);
+
+ void finishParsing(bool error, const QString &errorDesc);
+
+ void newImageJob(SVGImageElementImpl *);
+
+ void notifyImageLoading(SVGImageElementImpl *image);
+ void notifyImageLoaded(SVGImageElementImpl *image);
+ void resortZIndicesOnFinishedLoading() { m_resortZIndicesOnFinishedLoading = true; }
+
+ void addForwardReferencingUseElement(SVGUseElementImpl *use);
+ QValueList<SVGUseElementImpl *> forwardReferencingUseElements() const { return m_forwardReferencingUseElements; }
+
+ // Traverse the element hierarchy and update any cached matrices that are
+ // no longer valid.
+ void syncCachedMatrices();
+
+public slots:
+ void slotPaint();
+ void executeScripts();
+
+private slots:
+ void slotSVGContent(QIODevice *);
+ void slotFinishedParsing(bool error, const QString &errorDesc);
+
+// KDE invents public signals :)
+#undef signals
+#define signals public
+signals:
+ void gotDescription(const QString &);
+ void gotTitle(const QString &);
+ void gotURL(const QString &);
+
+ void finishedParsing(bool error, const QString &errorDesc);
+ void finishedRendering();
+ void finishedLoading();
+
+private:
+ void checkFinishedLoading();
+
+ bool m_finishedParsing;
+ bool m_finishedLoading;
+ bool m_animations;
+
+ SVGSVGElementImpl *m_rootElement;
+
+ SVGTimeScheduler *m_timeScheduler;
+
+ // Set if this document is being displayed by an 'image' element reference
+ // rather than as the main document, 0 otherwise.
+ SVGImageElementImpl *m_parentImage;
+
+ KSVGReader *m_reader;
+ KSVGLoader *m_loader;
+ KSVGCanvas *m_canvas;
+
+ KSVGEcma *m_ecmaEngine;
+
+ QPtrDict<SVGElementImpl> m_elemDict;
+ QPtrDict<SVGDocumentImpl> m_documentDict;
+
+ static uint elemDictHashSizes[];
+ static const int numElemDictHashSizes;
+ int m_elemDictHashSizeIndex;
+
+ SVGWindowImpl *m_window;
+ SVGElementImpl *m_lastTarget;
+
+ KURL m_baseURL;
+
+ DOM::DOMString m_referrer;
+
+ bool m_fit;
+
+ QTime m_t;
+
+ QValueList<SVGImageElementImpl *> m_imagesLoading;
+ bool m_resortZIndicesOnFinishedLoading;
+
+ QValueList<SVGUseElementImpl *> m_forwardReferencingUseElements;
+
+public:
+ KSVG_BASECLASS_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ Title, Referrer, Domain, Url,
+ DocType, Implementation, RootElement, DocumentElement,
+ // Functions
+ CreateTextNode, CreateElement, CreateElementNS,
+ GetElementById, GetElementsByTagName, GetElementsByTagNameNS
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGDocumentImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGDocumentImplProtoFunc, SVGDocumentImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGEcma.cc b/ksvg/impl/SVGEcma.cc
new file mode 100644
index 00000000..08870d0c
--- /dev/null
+++ b/ksvg/impl/SVGEcma.cc
@@ -0,0 +1,844 @@
+/*
+ Copyright (C) 2002-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <typeinfo>
+
+#include <kdebug.h>
+
+#include <dom/dom_exception.h>
+
+#include "CanvasItem.h"
+#include "KSVGCanvas.h"
+
+#include "SVGEcma.h"
+#include "SVGShapeImpl.h"
+#include "SVGHelperImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGEcma.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_ecmaeventlistener.h"
+#include "ksvg_window.h"
+#include "ksvg_ecma.h"
+
+// SVGDOMNodeBridge
+
+/*
+@namespace KSVG
+@begin SVGDOMNodeBridge::s_hashTable 17
+ nodeName SVGDOMNodeBridge::NodeName DontDelete|ReadOnly
+ nodeValue SVGDOMNodeBridge::NodeValue DontDelete
+ nodeType SVGDOMNodeBridge::NodeType DontDelete|ReadOnly
+ parentNode SVGDOMNodeBridge::ParentNode DontDelete|ReadOnly
+ childNodes SVGDOMNodeBridge::ChildNodes DontDelete|ReadOnly
+ firstChild SVGDOMNodeBridge::FirstChild DontDelete|ReadOnly
+ lastChild SVGDOMNodeBridge::LastChild DontDelete|ReadOnly
+ previousSibling SVGDOMNodeBridge::PreviousSibling DontDelete|ReadOnly
+ nextSibling SVGDOMNodeBridge::NextSibling DontDelete|ReadOnly
+ attributes SVGDOMNodeBridge::Attributes DontDelete|ReadOnly
+ namespaceURI SVGDOMNodeBridge::NamespaceURI DontDelete|ReadOnly
+ prefix SVGDOMNodeBridge::Prefix DontDelete
+ localName SVGDOMNodeBridge::LocalName DontDelete|ReadOnly
+ ownerDocument SVGDOMNodeBridge::OwnerDocument DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGDOMNodeBridgeProto::s_hashTable 29
+ insertBefore SVGDOMNodeBridge::InsertBefore DontDelete|Function 2
+ replaceChild SVGDOMNodeBridge::ReplaceChild DontDelete|Function 2
+ removeChild SVGDOMNodeBridge::RemoveChild DontDelete|Function 1
+ appendChild SVGDOMNodeBridge::AppendChild DontDelete|Function 1
+ hasAttributes SVGDOMNodeBridge::HasAttributes DontDelete|Function 0
+ hasChildNodes SVGDOMNodeBridge::HasChildNodes DontDelete|Function 0
+ cloneNode SVGDOMNodeBridge::CloneNode DontDelete|Function 1
+ normalize SVGDOMNodeBridge::Normalize DontDelete|Function 0
+ isSupported SVGDOMNodeBridge::IsSupported DontDelete|Function 2
+ addEventListener SVGDOMNodeBridge::AddEventListener DontDelete|Function 3
+ removeEventListener SVGDOMNodeBridge::RemoveEventListener DontDelete|Function 3
+ contains SVGDOMNodeBridge::Contains DontDelete|Function 1
+ getNodeName SVGDOMNodeBridge::GetNodeName DontDelete|Function 0
+ getNodeValue SVGDOMNodeBridge::GetNodeValue DontDelete|Function 0
+ getNodeType SVGDOMNodeBridge::GetNodeType DontDelete|Function 0
+ getParentNode SVGDOMNodeBridge::GetParentNode DontDelete|Function 0
+ getChildNodes SVGDOMNodeBridge::GetChildNodes DontDelete|Function 0
+ getFirstChild SVGDOMNodeBridge::GetFirstChild DontDelete|Function 0
+ getLastChild SVGDOMNodeBridge::GetLastChild DontDelete|Function 0
+ getPreviousSibling SVGDOMNodeBridge::GetPreviousSibling DontDelete|Function 0
+ getNextSibling SVGDOMNodeBridge::GetNextSibling DontDelete|Function 0
+ getAttributes SVGDOMNodeBridge::GetAttributes DontDelete|Function 0
+ getNamespaceURI SVGDOMNodeBridge::GetNamespaceURI DontDelete|Function 0
+ getPrefix SVGDOMNodeBridge::GetPrefix DontDelete|Function 0
+ getLocalName SVGDOMNodeBridge::GetLocalName DontDelete|Function 0
+ getOwnerDocument SVGDOMNodeBridge::GetOwnerDocument DontDelete|Function 0
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("DOMNode", SVGDOMNodeBridgeProto, SVGDOMNodeBridgeProtoFunc)
+
+Value SVGDOMNodeBridge::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case NodeName:
+ return getString(m_impl.nodeName());
+ case NodeValue:
+ return getString(m_impl.nodeValue());
+ case NodeType:
+ return Number(m_impl.nodeType());
+ case ParentNode:
+ return getDOMNode(exec, m_impl.parentNode());
+ case ChildNodes:
+ return (new SVGDOMNodeListBridge(m_impl.childNodes()))->cache(exec);
+ case FirstChild:
+ return getDOMNode(exec, m_impl.firstChild());
+ case LastChild:
+ return getDOMNode(exec, m_impl.lastChild());
+ case PreviousSibling:
+ return getDOMNode(exec, m_impl.previousSibling());
+ case NextSibling:
+ return getDOMNode(exec, m_impl.nextSibling());
+// case Attributes: // TODO
+ case NamespaceURI:
+ return getString(m_impl.namespaceURI());
+ case Prefix:
+ return getString(m_impl.prefix());
+ case LocalName:
+ return getString(m_impl.localName());
+ case OwnerDocument:
+ return getDOMNode(exec, m_impl.ownerDocument());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGDOMNodeBridge::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case NodeValue:
+ m_impl.setNodeValue(value.toString(exec).string());
+ break;
+ case Prefix:
+ m_impl.setPrefix(value.toString(exec).string());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// Special variantion to update the <text> element,
+// triggered by one of the child nodes
+void updateTextItem(ExecState *exec, const DOM::Node node)
+{
+ DOM::Node parent;
+ while(!(parent = node.parentNode()).isNull())
+ {
+ DOM::DOMString name = parent.nodeName();
+ if(name == "text" || name == "tspan" || name == "tref")
+ {
+ SVGHelperImpl::updateItem(exec, parent);
+ break;
+ }
+ }
+}
+
+// Remove item from canvas
+void removeItem(ExecState *exec, DOM::Node &node)
+{
+ // Get document
+ SVGDocumentImpl *doc = KSVG::Window::retrieveActive(exec)->doc();
+
+ // Update canvas
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(doc->getElementFromHandle(node.handle()));
+ if(shape && shape->item())
+ doc->canvas()->removeItem(shape->item());
+}
+
+// parseXML + getURL() need all these 5 functions to work properly
+void correctHandles(SVGElementImpl *main, DOM::Node &node)
+{
+ DOM::Element old(node.handle());
+ DOM::Element *replace = static_cast<DOM::Element *>(main->ownerDoc()->getElementFromHandle(node.handle()));
+
+ if(replace && node.nodeType() == DOM::Node::ELEMENT_NODE)
+ *replace = old;
+
+ if(node.hasChildNodes())
+ {
+ for(DOM::Node iterate = node.firstChild(); !iterate.isNull(); iterate = iterate.nextSibling())
+ correctHandles(main, iterate);
+ }
+}
+
+void integrateTree(SVGElementImpl *main, DOM::Node &node, DOM::Node &newNode, SVGElementImpl *obj, SVGDocumentImpl *doc)
+{
+ if(!obj)
+ return;
+
+ // Add to global element dicts
+ doc->addToElemDict(newNode.handle(), obj);
+ doc->addToElemDict(node.handle(), obj);
+
+ if(node.hasChildNodes())
+ {
+ DOM::Node iterate2 = newNode.firstChild();
+ for(DOM::Node iterate = node.firstChild(); !iterate.isNull(); iterate = iterate.nextSibling())
+ {
+ integrateTree(main, iterate, iterate2, obj->ownerDoc()->getElementFromHandle(iterate2.handle()), doc);
+ iterate2 = iterate2.nextSibling();
+ }
+ }
+}
+
+void correctDocument(SVGElementImpl *main, DOM::Node &node, SVGElementImpl *obj, SVGDocumentImpl *doc)
+{
+ if(!obj)
+ return;
+
+ // Correct document
+ obj->setOwnerDoc(main->ownerDoc());
+
+ // Correct rootElement
+ if(!obj->ownerSVGElement())
+ obj->setOwnerSVGElement(main->ownerSVGElement());
+
+ // Correct viewportElement
+ if(!obj->viewportElement())
+ obj->setViewportElement(main->viewportElement());
+
+ // Properly (re-)register events in the current active document
+ obj->setupEventListeners(main->ownerDoc(), doc);
+
+ if(node.hasChildNodes())
+ {
+ for(DOM::Node iterate = node.firstChild(); !iterate.isNull(); iterate = iterate.nextSibling())
+ correctDocument(main, iterate, doc->getElementFromHandle(iterate.handle()), doc);
+ }
+}
+
+void registerAdditional(ExecState *exec, SVGDocumentImpl *doc, DOM::Node node)
+{
+ // Register ID in rootElement!
+ SVGElementImpl *resultElement = doc->getElementFromHandle(node.handle());
+ if(resultElement && resultElement->hasAttribute("id"))
+ doc->rootElement()->addToIdMap(resultElement->getAttribute("id").string(), resultElement);
+
+ if(node.hasChildNodes())
+ {
+ for(DOM::Node iterate = node.firstChild(); !iterate.isNull(); iterate = iterate.nextSibling())
+ registerAdditional(exec, doc, iterate);
+ }
+}
+
+Value appendHelper(ExecState *exec, DOM::Node node, DOM::Node newNode)
+{
+ // This is quite tricky code by me (Niko)
+ // Don't even try to modify it.
+ if(!(node.ownerDocument() == newNode.ownerDocument()))
+ {
+ // Get document
+ SVGDocumentImpl *doc = KSVG::Window::retrieveActive(exec)->doc();
+
+ // Detect ownerDoc() of newNode
+ SVGDocumentImpl *newDoc = doc->getDocumentFromHandle(newNode.ownerDocument().handle());
+
+ // Get some SVGElementImpl's
+ SVGElementImpl *nodeElement = doc->getElementFromHandle(node.handle());
+ SVGElementImpl *newNodeElement = newDoc->getElementFromHandle(newNode.handle());
+
+ // Import node into document
+ DOM::Node result = doc->importNode(newNode, true);
+
+ // Associate the imported node 'result' with the
+ // 'newNodeElement' which belongs to 'newDoc'
+ integrateTree(nodeElement, result, newNode, newNodeElement, doc);
+
+ // Correct handles in SVG* elements
+ correctHandles(nodeElement, result);
+
+ // Correct ownerDoc() etc..
+ correctDocument(nodeElement, newNode, newNodeElement, newDoc);
+
+ // Register ID in global map
+ registerAdditional(exec, doc, result);
+
+ // Recalc style
+ newNodeElement->setAttributes();
+
+ // Append + create + update element
+ Value retVal = getDOMNode(exec, node.appendChild(result));
+
+ doc->syncCachedMatrices();
+ newNodeElement->createItem(doc->canvas());
+ SVGHelperImpl::updateItem(exec, *newNodeElement);
+
+ return retVal;
+ }
+ else
+ {
+ Value retVal = getDOMNode(exec, node.appendChild(newNode));
+
+ // Get document
+ SVGDocumentImpl *doc = KSVG::Window::retrieveActive(exec)->doc();
+ doc->syncCachedMatrices();
+
+ // Get some SVGElementImpl's
+ SVGElementImpl *nodeElement = doc->getElementFromHandle(newNode.handle());
+ // TODO : extra check needed to see if the new elements parent is already appended
+ // in the doc. Not really nice, should be some other way? (Rob)
+ if(nodeElement && !nodeElement->parentNode().parentNode().isNull())
+ {
+ nodeElement->setAttributes(true);
+ nodeElement->createItem();
+ SVGHelperImpl::updateItem(exec, newNode);
+ }
+
+ return retVal;
+ }
+}
+
+Value SVGDOMNodeBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGDOMNodeBridge)
+ DOM::Node node = obj->impl();
+
+ switch(id)
+ {
+ case SVGDOMNodeBridge::InsertBefore:
+ {
+ DOM::Node newChild = toNode(args[0]);
+ DOM::Node beforeChild = toNode(args[1]);
+ Value retVal = getDOMNode(exec, node.insertBefore(newChild, beforeChild));
+
+ // Get document
+ SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
+
+ // Get some SVGElementImpl's
+ SVGShapeImpl *newShape = dynamic_cast<SVGShapeImpl *>(doc->getElementFromHandle(newChild.handle()));
+ SVGElementImpl *newElement = doc->getElementFromHandle(newChild.handle());
+ SVGShapeImpl *beforeElement = dynamic_cast<SVGShapeImpl *>(doc->getElementFromHandle(beforeChild.handle()));
+ if(newShape && beforeElement && beforeElement->item())
+ {
+ int z = beforeElement->item()->zIndex();
+ newElement->createItem();
+ doc->canvas()->insert(newShape->item(), z);
+ }
+ SVGHelperImpl::updateItem(exec, newChild);
+
+ return retVal;
+ }
+ case SVGDOMNodeBridge::ReplaceChild:
+ {
+ DOM::Node newChild = toNode(args[0]);
+ Value retVal = getDOMNode(exec, node.replaceChild(newChild, toNode(args[1])));
+ SVGHelperImpl::updateItem(exec, newChild);
+ return retVal;
+ }
+ case SVGDOMNodeBridge::RemoveChild:
+ {
+ DOM::Node remove = toNode(args[0]);
+ if(remove.isNull())
+ return Undefined();
+
+ // New removeChild logic:
+ // - remove from DOM tree
+ // - delete element (also deletes it's child element's)
+ removeItem(exec, remove);
+ Value retVal = getDOMNode(exec, node.removeChild(remove));
+ return retVal;
+ }
+ case SVGDOMNodeBridge::AppendChild:
+ return appendHelper(exec, node, toNode(args[0]));
+ case SVGDOMNodeBridge::HasAttributes:
+ {
+ SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
+ SVGElementImpl *element = doc->getElementFromHandle(node.handle());
+
+ if(!element)
+ return Undefined();
+
+ return Boolean(element->hasAttributes());
+ }
+ case SVGDOMNodeBridge::HasChildNodes:
+ return Boolean(node.hasChildNodes());
+ case SVGDOMNodeBridge::CloneNode:
+ {
+ SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
+ SVGElementImpl *element = doc->getElementFromHandle(node.handle());
+ SVGElementImpl *newElement = element->cloneNode(args[0].toBoolean(exec));
+
+ return getDOMNode(exec, *newElement);
+ }
+ case SVGDOMNodeBridge::Normalize:
+ {
+ node.normalize();
+ return Undefined();
+ }
+ case SVGDOMNodeBridge::IsSupported:
+ return Boolean(node.isSupported(args[0].toString(exec).string(), args[1].toString(exec).string()));
+ case SVGDOMNodeBridge::AddEventListener:
+ {
+ SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
+ SVGElementImpl *element = doc->getElementFromHandle(node.handle());
+
+ if(element)
+ {
+ SVGEvent::EventId eventId = SVGEvent::typeToId(args[0].toString(exec).string());
+ if(eventId != SVGEvent::UNKNOWN_EVENT)
+ element->setEventListener(eventId, new KSVGEcmaEventListener(Object::dynamicCast(args[1]), QString::null, doc->ecmaEngine()));
+ }
+ return Undefined();
+ }
+ case SVGDOMNodeBridge::RemoveEventListener:
+ {
+ SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
+ SVGElementImpl *element = doc->getElementFromHandle(node.handle());
+
+ if(element)
+ {
+ SVGEvent::EventId eventId = SVGEvent::typeToId(args[0].toString(exec).string());
+ if(eventId != SVGEvent::UNKNOWN_EVENT)
+ element->removeEventListener((int) eventId);
+ }
+ return Undefined();
+ }
+// case SVGDOMNodeBridge::Contains: // TODO
+ case SVGDOMNodeBridge::GetNodeName:
+ return getString(node.nodeName());
+ case SVGDOMNodeBridge::GetNodeValue:
+ return getString(node.nodeValue());
+ case SVGDOMNodeBridge::GetNodeType:
+ return Number(node.nodeType());
+ case SVGDOMNodeBridge::GetParentNode:
+ return getDOMNode(exec, node.parentNode());
+ case SVGDOMNodeBridge::GetChildNodes:
+ return (new SVGDOMNodeListBridge(node.childNodes()))->cache(exec);
+ case SVGDOMNodeBridge::GetFirstChild:
+ return getDOMNode(exec, node.firstChild());
+ case SVGDOMNodeBridge::GetLastChild:
+ return getDOMNode(exec, node.lastChild());
+ case SVGDOMNodeBridge::GetPreviousSibling:
+ return getDOMNode(exec, node.previousSibling());
+ case SVGDOMNodeBridge::GetNextSibling:
+ return getDOMNode(exec, node.nextSibling());
+// case SVGDOMNodeBridge::GetAttributes: // TODO
+ case SVGDOMNodeBridge::GetNamespaceURI:
+ return getString(node.namespaceURI());
+ case SVGDOMNodeBridge::GetPrefix:
+ return getString(node.prefix());
+ case SVGDOMNodeBridge::GetLocalName:
+ return getString(node.localName());
+ case SVGDOMNodeBridge::GetOwnerDocument:
+ return getDOMNode(exec, node.ownerDocument());
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// SVGDOMElementBridge
+
+/*
+@namespace KSVG
+@begin SVGDOMElementBridge::s_hashTable 2
+ tagName SVGDOMElementBridge::TagName DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGDOMElementBridgeProto::s_hashTable 17
+ getAttribute SVGDOMElementBridge::GetAttribute DontDelete|Function 1
+ setAttribute SVGDOMElementBridge::SetAttribute DontDelete|Function 2
+ removeAttribute SVGDOMElementBridge::RemoveAttribute DontDelete|Function 1
+ getAttributeNode SVGDOMElementBridge::GetAttributeNode DontDelete|Function 1
+ setAttributeNode SVGDOMElementBridge::SetAttributeNode DontDelete|Function 2
+ removeAttributeNode SVGDOMElementBridge::RemoveAttributeNode DontDelete|Function 1
+ getElementsByTagName SVGDOMElementBridge::GetElementsByTagName DontDelete|Function 1
+ hasAttribute SVGDOMElementBridge::HasAttribute DontDelete|Function 1
+ getAttributeNS SVGDOMElementBridge::GetAttributeNS DontDelete|Function 2
+ setAttributeNS SVGDOMElementBridge::SetAttributeNS DontDelete|Function 3
+ removeAttributeNS SVGDOMElementBridge::RemoveAttributeNS DontDelete|Function 2
+ getAttributeNodeNS SVGDOMElementBridge::GetAttributeNodeNS DontDelete|Function 2
+ setAttributeNodeNS SVGDOMElementBridge::SetAttributeNodeNS DontDelete|Function 1
+ getElementByTagNameNS SVGDOMElementBridge::GetElementsByTagNameNS DontDelete|Function 2
+ hasAttributeNS SVGDOMElementBridge::HasAttributeNS DontDelete|Function 2
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("DOMElement", SVGDOMElementBridgeProto, SVGDOMElementBridgeProtoFunc)
+
+Value SVGDOMElementBridge::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case TagName:
+ return getString(m_impl.tagName());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+Value SVGDOMElementBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGDOMElementBridge)
+ DOM::Element elem = obj->impl();
+
+ switch(id)
+ {
+ case SVGDOMElementBridge::GetAttribute:
+ {
+ SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
+ SVGElementImpl *element = doc->getElementFromHandle(elem.handle());
+ if(element)
+ return String(element->getAttribute(args[0].toString(exec).string()));
+ else
+ return Undefined();
+ }
+ case SVGDOMElementBridge::SetAttribute:
+ {
+ SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
+ SVGElementImpl *element = doc->getElementFromHandle(elem.handle());
+ if(element)
+ {
+ element->setAttribute(args[0].toString(exec).string(), args[1].toString(exec).string());
+ element->setAttributeInternal(args[0].toString(exec).string(), args[1].toString(exec).string());
+
+ SVGHelperImpl::updateItem(exec, elem);
+ }
+
+ return Undefined();
+ }
+ case SVGDOMElementBridge::RemoveAttribute:
+ {
+ elem.removeAttribute(args[0].toString(exec).string());
+ return Undefined();
+ }
+ case SVGDOMElementBridge::GetAttributeNode:
+ return getDOMNode(exec, elem.getAttributeNode(args[0].toString(exec).string()));
+ case SVGDOMElementBridge::SetAttributeNode: // TODO: Correct?
+ return getDOMNode(exec, elem.setAttributeNode(toNode(args[0])));
+ case SVGDOMElementBridge::RemoveAttributeNode: // TODO: Correct?
+ return getDOMNode(exec, elem.removeAttributeNode(toNode(args[0])));
+ case SVGDOMElementBridge::GetElementsByTagName:
+ return (new SVGDOMNodeListBridge(elem.getElementsByTagName(args[0].toString(exec).string())))->cache(exec);
+ case SVGDOMElementBridge::GetAttributeNS:
+ {
+ // This just skips NS! (Rob)
+ SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
+ SVGElementImpl *element = doc->getElementFromHandle(elem.handle());
+ if(element)
+ return String(element->getAttribute(args[1].toString(exec).string()));
+ else
+ return Undefined();
+ }
+ case SVGDOMElementBridge::SetAttributeNS:
+ {
+ // For now, we strip the NS part (Rob)
+ DOM::DOMString attr = args[1].toString(exec).string();
+ int pos = attr.string().find(':');
+ if(pos > -1)
+ attr = attr.string().mid(pos + 1);
+
+ SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
+ SVGElementImpl *element = doc->getElementFromHandle(elem.handle());
+ if(element)
+ {
+ element->setAttribute(attr.string(), args[2].toString(exec).string());
+ element->setAttributeInternal(attr.string(), args[2].toString(exec).string());
+
+ SVGHelperImpl::updateItem(exec, *element);
+ }
+
+ return Undefined();
+ }
+ case SVGDOMElementBridge::RemoveAttributeNS:
+ {
+ elem.removeAttributeNS(args[0].toString(exec).string(), args[1].toString(exec).string());
+ return Undefined();
+ }
+ case SVGDOMElementBridge::GetAttributeNodeNS:
+ return getDOMNode(exec, elem.getAttributeNodeNS(args[0].toString(exec).string(), args[1].toString(exec).string()));
+ case SVGDOMElementBridge::SetAttributeNodeNS: // TODO: Correct?
+ return getDOMNode(exec, elem.setAttributeNodeNS(toNode(args[0])));
+ case SVGDOMElementBridge::GetElementsByTagNameNS:
+ return (new SVGDOMNodeListBridge(elem.getElementsByTagNameNS(args[0].toString(exec).string(), args[1].toString(exec).string())))->cache(exec);
+ case SVGDOMElementBridge::HasAttribute:
+ return Boolean(elem.hasAttribute(args[0].toString(exec).string()));
+ case SVGDOMElementBridge::HasAttributeNS:
+ return Boolean(elem.hasAttributeNS(args[0].toString(exec).string(), args[1].toString(exec).string()));
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+
+// SVGDOMNodeListBridge
+
+/*
+@namespace KSVG
+@begin SVGDOMNodeListBridge::s_hashTable 2
+ length SVGDOMNodeListBridge::Length DontDelete
+@end
+@namespace KSVG
+@begin SVGDOMNodeListBridgeProto::s_hashTable 3
+ getLength SVGDOMNodeListBridge::GetLength DontDelete|Function 0
+ item SVGDOMNodeListBridge::Item DontDelete|Function 1
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("DOMNodeList", SVGDOMNodeListBridgeProto, SVGDOMNodeListBridgeProtoFunc)
+
+Value SVGDOMNodeListBridge::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case Length:
+ return Number(m_impl.length());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+Value SVGDOMNodeListBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGDOMNodeListBridge)
+ DOM::NodeList nodeList = obj->impl();
+
+ switch(id)
+ {
+ case SVGDOMNodeListBridge::GetLength:
+ return Number(nodeList.length());
+ case SVGDOMNodeListBridge::Item:
+ return getDOMNode(exec, nodeList.item((unsigned long)args[0].toNumber(exec)));
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// SVGDOMCharacterDataBridge
+
+/*
+@namespace KSVG
+@begin SVGDOMCharacterDataBridge::s_hashTable 3
+ data SVGDOMCharacterDataBridge::Data DontDelete
+ length SVGDOMCharacterDataBridge::Length DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGDOMCharacterDataBridgeProto::s_hashTable 11
+ getData SVGDOMCharacterDataBridge::GetData DontDelete|Function 0
+ setData SVGDOMCharacterDataBridge::SetData DontDelete|Function 1
+ getLength SVGDOMCharacterDataBridge::GetLength DontDelete|Function 0
+ substringData SVGDOMCharacterDataBridge::SubstringData DontDelete|Function 2
+ appendData SVGDOMCharacterDataBridge::AppendData DontDelete|Function 1
+ insertData SVGDOMCharacterDataBridge::InsertData DontDelete|Function 2
+ deleteData SVGDOMCharacterDataBridge::DeleteData DontDelete|Function 2
+ replaceData SVGDOMCharacterDataBridge::ReplaceData DontDelete|Function 2
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("DOMCharacterData", SVGDOMCharacterDataBridgeProto, SVGDOMCharacterDataBridgeProtoFunc)
+
+Value SVGDOMCharacterDataBridge::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case Data:
+ return String(m_impl.data());
+ case Length:
+ return Number(m_impl.length());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGDOMCharacterDataBridge::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case Data:
+ m_impl.setData(value.toString(exec).string());
+ updateTextItem(exec, m_impl);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+Value SVGDOMCharacterDataBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGDOMCharacterDataBridge)
+ DOM::CharacterData node = obj->impl();
+
+ switch(id)
+ {
+ case SVGDOMCharacterDataBridge::GetData:
+ return String(node.data());
+ case SVGDOMCharacterDataBridge::SetData:
+ node.setData(args[0].toString(exec).string());
+ updateTextItem(exec, node);
+ return Undefined();
+ case SVGDOMCharacterDataBridge::GetLength:
+ return Number(node.length());
+ case SVGDOMCharacterDataBridge::SubstringData:
+ {
+ DOM::DOMString ret = node.substringData(args[0].toInteger(exec), args[1].toInteger(exec));
+ updateTextItem(exec, node);
+ return String(ret);
+ }
+ case SVGDOMCharacterDataBridge::AppendData:
+ node.appendData(args[0].toString(exec).string());
+ updateTextItem(exec, node);
+ return Undefined();
+ case SVGDOMCharacterDataBridge::InsertData:
+ node.insertData(args[0].toInteger(exec), args[1].toString(exec).string());
+ updateTextItem(exec, node);
+ return Undefined();
+ case SVGDOMCharacterDataBridge::DeleteData:
+ node.deleteData(args[0].toInteger(exec), args[1].toInteger(exec));
+ updateTextItem(exec, node);
+ return Undefined();
+ case SVGDOMCharacterDataBridge::ReplaceData:
+ node.replaceData(args[0].toInteger(exec), args[1].toInteger(exec), args[2].toString(exec).string());
+ updateTextItem(exec, node);
+ return Undefined();
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// SVGDOMTextBridge
+
+/*
+@namespace KSVG
+@begin SVGDOMTextBridge::s_hashTable 2
+ dummy SVGDOMTextBridge::Dummy DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGDOMTextBridgeProto::s_hashTable 2
+ splitText SVGDOMTextBridge::SplitText DontDelete|Function 1
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("DOMText", SVGDOMTextBridgeProto, SVGDOMTextBridgeProtoFunc)
+
+Value SVGDOMTextBridge::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+Value SVGDOMTextBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGDOMTextBridge)
+ DOM::Text node = obj->impl();
+
+ switch(id)
+ {
+ case SVGDOMTextBridge::SplitText:
+ return getDOMNode(exec, node.splitText(args[0].toInteger(exec)));
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// SVGDOMDOMImplementationBridge
+
+/*
+@namespace KSVG
+@begin SVGDOMDOMImplementationBridge::s_hashTable 2
+ dummy SVGDOMDOMImplementationBridge::Dummy DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGDOMDOMImplementationBridgeProto::s_hashTable 2
+ hasFeature SVGDOMDOMImplementationBridge::HasFeature DontDelete|Function 2
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("DOMDOMImplementation", SVGDOMDOMImplementationBridgeProto, SVGDOMDOMImplementationBridgeProtoFunc)
+
+Value SVGDOMDOMImplementationBridge::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+Value SVGDOMDOMImplementationBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGDOMDOMImplementationBridge)
+ DOM::DOMImplementation node = obj->impl();
+
+ switch(id)
+ {
+ case SVGDOMDOMImplementationBridge::HasFeature:
+ return Boolean(node.hasFeature(args[0].toString(exec).string(), args[1].toString(exec).string()));
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// SVGDOMDocumentFragmentBridge
+
+/*
+@namespace KSVG
+@begin SVGDOMDocumentFragmentBridge::s_hashTable 2
+ dummy SVGDOMDocumentFragmentBridge::Dummy DontDelete|ReadOnly
+@end
+*/
+
+Value SVGDOMDocumentFragmentBridge::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGEcma.h b/ksvg/impl/SVGEcma.h
new file mode 100644
index 00000000..adf1ec85
--- /dev/null
+++ b/ksvg/impl/SVGEcma.h
@@ -0,0 +1,250 @@
+/*
+ Copyright (C) 2002-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGEcma_H
+#define SVGEcma_H
+
+#include <dom/dom_doc.h>
+#include <dom/dom_node.h>
+#include <dom/dom_text.h>
+#include <dom/dom_element.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+// Access DOM::Node via js
+class SVGDOMNodeBridge
+{
+public:
+ SVGDOMNodeBridge(DOM::Node impl) : m_impl(impl) { KSVG_EMPTY_FLAGS }
+ virtual ~SVGDOMNodeBridge() { }
+
+ DOM::Node impl() const { return m_impl; }
+
+ KSVG_BASECLASS_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ NodeName, NodeValue, NodeType, ParentNode,
+ ChildNodes, FirstChild, LastChild, PreviousSibling,
+ NextSibling, Attributes, NamespaceURI, Prefix,
+ LocalName, OwnerDocument,
+ // Functions
+ InsertBefore, ReplaceChild, RemoveChild, AppendChild,
+ HasAttributes, HasChildNodes, CloneNode, Normalize,
+ IsSupported, AddEventListener, RemoveEventListener, Contains,
+ GetNodeName, GetNodeValue, GetNodeType, GetParentNode,
+ GetChildNodes, GetFirstChild, GetLastChild, GetPreviousSibling,
+ GetNextSibling, GetAttributes, GetNamespaceURI, GetPrefix,
+ GetLocalName, GetOwnerDocument
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+
+private:
+ DOM::Node m_impl;
+};
+
+// Access DOM::Element via js
+class SVGDOMElementBridge : public SVGDOMNodeBridge
+{
+public:
+ SVGDOMElementBridge(DOM::Element impl) : SVGDOMNodeBridge(static_cast<DOM::Node>(impl)), m_impl(impl) { }
+ ~SVGDOMElementBridge() { }
+
+ DOM::Element impl() const { return m_impl; }
+
+ KSVG_GET
+ KSVG_FORWARDPUT
+
+ enum
+ {
+ // Properties
+ TagName,
+ // Functions
+ GetAttribute, SetAttribute, RemoveAttribute, GetAttributeNode,
+ SetAttributeNode, RemoveAttributeNode, GetElementsByTagName,
+ GetAttributeNS, SetAttributeNS, RemoveAttributeNS, GetAttributeNodeNS,
+ SetAttributeNodeNS, GetElementsByTagNameNS, HasAttribute, HasAttributeNS
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+
+private:
+ DOM::Element m_impl;
+};
+
+// Access DOM::NodeList via js
+class SVGDOMNodeListBridge
+{
+public:
+ SVGDOMNodeListBridge(DOM::NodeList impl) : m_impl(impl) { }
+ ~SVGDOMNodeListBridge() { }
+
+ DOM::NodeList impl() const { return m_impl; }
+
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ Length,
+ // Functions
+ GetLength, Item
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+
+private:
+ DOM::NodeList m_impl;
+};
+
+// Access DOM::CharacterData via js
+class SVGDOMCharacterDataBridge : public SVGDOMNodeBridge
+{
+public:
+ SVGDOMCharacterDataBridge(DOM::CharacterData impl) : SVGDOMNodeBridge(static_cast<DOM::Node>(impl)), m_impl(impl) { KSVG_EMPTY_FLAGS }
+ ~SVGDOMCharacterDataBridge() { }
+
+ DOM::CharacterData impl() const { return m_impl; }
+
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ Data, Length,
+ // Functions
+ GetData, SetData, GetLength,
+ SubstringData, AppendData, InsertData, DeleteData, ReplaceData
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+
+private:
+ DOM::CharacterData m_impl;
+};
+
+// Access DOM::Text via js
+class SVGDOMTextBridge : public SVGDOMCharacterDataBridge
+{
+public:
+ SVGDOMTextBridge(DOM::Text impl) : SVGDOMCharacterDataBridge(static_cast<DOM::CharacterData>(impl)), m_impl(impl) { }
+ ~SVGDOMTextBridge() { }
+
+ DOM::Text impl() const { return m_impl; }
+
+ KSVG_GET
+ KSVG_FORWARDPUT
+
+ enum
+ {
+ // Properties
+ Dummy,
+ // Functions
+ SplitText
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+
+private:
+ DOM::Text m_impl;
+};
+
+// Access DOM::DOMImplementation via js
+class SVGDOMDOMImplementationBridge
+{
+public:
+ SVGDOMDOMImplementationBridge(DOM::DOMImplementation impl) : m_impl(impl) { }
+ ~SVGDOMDOMImplementationBridge() { }
+
+ DOM::DOMImplementation impl() const { return m_impl; }
+
+ KSVG_GET
+ KSVG_FORWARDPUT
+
+ enum
+ {
+ // Properties
+ Dummy,
+ // Functions
+ HasFeature
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+
+private:
+ DOM::DOMImplementation m_impl;
+};
+
+// Access DOM::DocumentFragment via js
+class SVGDOMDocumentFragmentBridge : public SVGDOMNodeBridge
+{
+public:
+ SVGDOMDocumentFragmentBridge(DOM::DocumentFragment impl) : SVGDOMNodeBridge(static_cast<DOM::Node>(impl)), m_impl(impl) { }
+ ~SVGDOMDocumentFragmentBridge() { }
+
+ DOM::DocumentFragment impl() const { return m_impl; }
+
+ KSVG_GET
+ KSVG_FORWARDPUT
+
+ enum
+ {
+ // Properties
+ Dummy
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+
+private:
+ DOM::DocumentFragment m_impl;
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGDOMNodeBridgeProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGDOMNodeBridgeProtoFunc, SVGDOMNodeBridge)
+
+KSVG_DEFINE_PROTOTYPE(SVGDOMElementBridgeProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGDOMElementBridgeProtoFunc, SVGDOMElementBridge)
+
+KSVG_DEFINE_PROTOTYPE(SVGDOMNodeListBridgeProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGDOMNodeListBridgeProtoFunc, SVGDOMNodeListBridge)
+
+KSVG_DEFINE_PROTOTYPE(SVGDOMCharacterDataBridgeProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGDOMCharacterDataBridgeProtoFunc, SVGDOMCharacterDataBridge)
+
+KSVG_DEFINE_PROTOTYPE(SVGDOMTextBridgeProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGDOMTextBridgeProtoFunc, SVGDOMTextBridge)
+
+KSVG_DEFINE_PROTOTYPE(SVGDOMDOMImplementationBridgeProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGDOMDOMImplementationBridgeProtoFunc, SVGDOMDOMImplementationBridge)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGElementImpl.cc b/ksvg/impl/SVGElementImpl.cc
new file mode 100644
index 00000000..2f3d70c6
--- /dev/null
+++ b/ksvg/impl/SVGElementImpl.cc
@@ -0,0 +1,713 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qxml.h>
+
+#include <kdebug.h>
+
+#include "SVGEvent.h"
+#include "SVGEventImpl.h"
+#include "SVGHelperImpl.h"
+#include "SVGElementImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_ecma.h"
+
+SVGElementImpl::Factory *SVGElementImpl::Factory::m_instance = 0;
+
+SVGElementImpl::SVGElementImpl(DOM::ElementImpl *impl) : DOM::DomShared(), DOM::Element(impl), SVGDOMElementBridge(static_cast<DOM::Element>(*this))
+{
+ KSVG_EMPTY_FLAGS
+
+ m_ownerSVGElement = 0;
+ m_viewportElement = 0;
+ m_ownerDoc = 0;
+
+ m_mouseOver = false;
+ m_focus = false;
+
+ m_eventListeners.setAutoDelete(true);
+ m_attributes.setAutoDelete(true);
+}
+
+SVGElementImpl::~SVGElementImpl()
+{
+ if(m_ownerSVGElement)
+ m_ownerSVGElement->deref();
+}
+
+void SVGElementImpl::setEventListener(int id, SVGEventListener *listener)
+{
+ if(listener)
+ listener->ref();
+
+ removeEventListener(id);
+
+ if(listener)
+ {
+ SVGRegisteredEventListener *rl = new SVGRegisteredEventListener(static_cast<SVGEvent::EventId>(id), listener, false);
+ m_eventListeners.append(rl);
+
+ listener->deref();
+ }
+}
+
+int SVGElementImpl::getEventListeners(bool local)
+{
+ int events = 0;
+
+ QPtrListIterator<SVGRegisteredEventListener> it(m_eventListeners);
+ for(; it.current(); ++it)
+ events |= (1 << it.current()->id);
+
+ if(local)
+ return events;
+
+ for(DOM::Node node = parentNode(); !node.isNull(); node = node.parentNode())
+ {
+ SVGElementImpl *element = ownerDoc()->getElementFromHandle(node.handle());
+
+ if(element)
+ {
+ QPtrListIterator<SVGRegisteredEventListener> it(element->m_eventListeners);
+ for(; it.current(); ++it)
+ events |= (1 << it.current()->id);
+ }
+ }
+
+ return events;
+}
+
+void SVGElementImpl::setupEventListeners(SVGDocumentImpl *doc, SVGDocumentImpl *newDoc)
+{
+ if(!doc || !newDoc)
+ return;
+
+ // Changes the document where the eventlisteners are registered
+ // Needed for parseXML'ed elements with events, their listeners
+ // are created in the temporary document fragment and need to be
+ // registered in the main document (Niko)
+ QPtrListIterator<SVGRegisteredEventListener> it(m_eventListeners);
+ for(; it.current(); ++it)
+ {
+ SVGRegisteredEventListener *current = it.current();
+
+ QString valueOfCurrent = newDoc->ecmaEngine()->valueOfEventListener(current->listener);
+ setEventListener(current->id, doc->createEventListener(valueOfCurrent));
+ }
+}
+
+bool SVGElementImpl::hasEventListener(int id, bool local)
+{
+ // First check if we have the listener, locally
+ QPtrListIterator<SVGRegisteredEventListener> it(m_eventListeners);
+ for(; it.current(); ++it)
+ {
+ if(it.current()->id == id)
+ return true;
+ }
+
+ // We have no local listeners, if we are just interessted
+ // in those listeners, then return now...
+ if(local)
+ return false;
+
+ // Check every parent element
+ for(DOM::Node node = parentNode(); !node.isNull(); node = node.parentNode())
+ {
+ SVGElementImpl *element = ownerDoc()->getElementFromHandle(node.handle());
+
+ if(element)
+ {
+ QPtrListIterator<SVGRegisteredEventListener> it(element->m_eventListeners);
+ for(; it.current(); ++it)
+ {
+ if(it.current()->id == id)
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+void SVGElementImpl::removeEventListener(int id)
+{
+ QPtrListIterator<SVGRegisteredEventListener> it(m_eventListeners);
+ for(; it.current(); ++it)
+ {
+ if(it.current()->id == id)
+ {
+ m_eventListeners.removeRef(it.current());
+ break;
+ }
+ }
+}
+
+void SVGElementImpl::handleLocalEvents(SVGEventImpl *evt, bool useCapture)
+{
+ QPtrListIterator<SVGRegisteredEventListener> it(m_eventListeners);
+ for(; it.current(); ++it)
+ {
+ if(it.current()->id == evt->id() && it.current()->useCapture == useCapture)
+ {
+ it.current()->listener->handleEvent(evt);
+ break;
+ }
+ }
+}
+
+void SVGElementImpl::defaultEventHandler(SVGEventImpl *)
+{
+}
+
+/*
+@namespace KSVG
+@begin SVGElementImpl::s_hashTable 23
+ id SVGElementImpl::ElementId DontDelete
+ ownerSVGElement SVGElementImpl::OwnerSvgElement DontDelete|ReadOnly
+ viewportElement SVGElementImpl::ViewportElement DontDelete|ReadOnly
+ xmlbase SVGElementImpl::XmlBase DontDelete
+ base SVGElementImpl::XmlBase DontDelete
+ onmouseup SVGElementImpl::OnMouseUp DontDelete
+ onmousedown SVGElementImpl::OnMouseDown DontDelete
+ onmousemove SVGElementImpl::OnMouseMove DontDelete
+ onmouseover SVGElementImpl::OnMouseOver DontDelete
+ onmouseout SVGElementImpl::OnMouseOut DontDelete
+ onclick SVGElementImpl::OnClick DontDelete
+ onmouseclick SVGElementImpl::OnClick DontDelete
+ onactivate SVGElementImpl::OnActivate DontDelete
+ onkeydown SVGElementImpl::OnKeyDown DontDelete
+ onkeyup SVGElementImpl::OnKeyUp DontDelete
+ onkeypress SVGElementImpl::OnKeyPress DontDelete
+ onload SVGElementImpl::OnLoad DontDelete
+ onfocusin SVGElementImpl::OnFocusIn DontDelete
+ onfocusout SVGElementImpl::OnFocusOut DontDelete
+ onerror SVGElementImpl::OnError DontDelete
+ onabort SVGElementImpl::OnAbort DontDelete
+@end
+@namespace KSVG
+@begin SVGElementImplProto::s_hashTable 5
+ getStyle SVGElementImpl::GetStyle DontDelete|Function 0
+ setProperty SVGElementImpl::SetProperty DontDelete|Function 2
+ getPropertyValue SVGElementImpl::GetPropertyValue DontDelete|Function 1
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGElement", SVGElementImplProto, SVGElementImplProtoFunc)
+
+Value SVGElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case ElementId:
+ return String(id().string());
+ case XmlBase:
+ return String(xmlbase().string());
+ case OwnerSvgElement:
+ return getDOMNode(exec, *ownerSVGElement());
+ case ViewportElement:
+ return getDOMNode(exec, *viewportElement());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case ElementId:
+ setId(value.toString(exec).string());
+ break;
+ case XmlBase:
+ setXmlbase(value.toString(exec).string());
+ break;
+ case OnMouseUp:
+ setEventListener(SVGEvent::MOUSEUP_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnMouseDown:
+ setEventListener(SVGEvent::MOUSEDOWN_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnMouseMove:
+ setEventListener(SVGEvent::MOUSEMOVE_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnMouseOver:
+ setEventListener(SVGEvent::MOUSEOVER_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnMouseOut:
+ setEventListener(SVGEvent::MOUSEOUT_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnClick:
+ setEventListener(SVGEvent::CLICK_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnActivate:
+ setEventListener(SVGEvent::DOMACTIVATE_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnKeyDown:
+ setEventListener(SVGEvent::KEYDOWN_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnKeyUp:
+ setEventListener(SVGEvent::KEYUP_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnKeyPress:
+ setEventListener(SVGEvent::KEYPRESS_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnLoad:
+ setEventListener(SVGEvent::LOAD_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnFocusIn:
+ setEventListener(SVGEvent::DOMFOCUSIN_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnFocusOut:
+ setEventListener(SVGEvent::DOMFOCUSOUT_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnError:
+ setEventListener(SVGEvent::ERROR_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ case OnAbort:
+ setEventListener(SVGEvent::ABORT_EVENT, m_ownerDoc->createEventListener(value.toString(exec).string()));
+ break;
+ default:
+ kdWarning() << k_funcinfo << "unhandled token " << token << endl;
+ }
+}
+
+Value SVGElementImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGElementImpl)
+
+ switch(id)
+ {
+ case SVGElementImpl::GetStyle:
+ return obj->cache(exec);
+ case SVGElementImpl::SetProperty:
+ {
+ DOM::DOMString attribute = args[0].toString(exec).qstring().lower();
+ DOM::DOMString value = args[1].toString(exec).qstring();
+ obj->setAttribute(attribute, value);
+ break;
+ }
+ case SVGElementImpl::GetPropertyValue:
+ return String(obj->getAttribute(args[0].toString(exec).qstring()));
+ default:
+ break;
+ }
+
+ return Undefined();
+}
+
+QDict<DOM::DOMString> &SVGElementImpl::attributes()
+{
+ return m_attributes;
+}
+
+// khtml overrides
+void SVGElementImpl::setAttribute(const DOM::DOMString &name, const DOM::DOMString &value)
+{
+ m_attributes.replace(name.string(), new DOM::DOMString(value));
+}
+
+// Changes internal value. This will have no effect on getAttribute().
+void SVGElementImpl::setAttributeInternal(const DOM::DOMString &name, const DOM::DOMString &value)
+{
+ ExecState *exec = ownerDoc()->ecmaEngine()->globalExec();
+
+ static_cast<KSVGScriptInterpreter *>(exec->interpreter())->setAttributeSetMode(true);
+ bridge(exec)->put(exec, Identifier(UString(name)), String(value), KJS::Internal);
+ static_cast<KSVGScriptInterpreter *>(exec->interpreter())->setAttributeSetMode(false);
+}
+
+// This gets the actual attribute as set in the svg source
+DOM::DOMString SVGElementImpl::getAttribute(const DOM::DOMString &name) const
+{
+ DOM::DOMString *result = m_attributes[name.string()];
+ if(result)
+ return *result;
+ else
+ return DOM::DOMString();
+}
+
+// This gets the internal, real-time value. This means it can return a default value
+// for an attribute even if its not explicitly set in the svg source.
+DOM::DOMString SVGElementImpl::getAttributeInternal(const DOM::DOMString &name)
+{
+ ExecState *exec = ownerDoc()->ecmaEngine()->globalExec();
+
+ DOM::DOMString retVal;
+
+ static_cast<KSVGScriptInterpreter *>(exec->interpreter())->setAttributeGetMode(true);
+ retVal = bridge(exec)->get(exec, Identifier(UString(name))).toString(exec).string();
+ static_cast<KSVGScriptInterpreter *>(exec->interpreter())->setAttributeGetMode(false);
+
+ return retVal;
+}
+
+bool SVGElementImpl::hasAttribute(const DOM::DOMString &name)
+{
+ return m_attributes.find(name.string()) != 0;
+}
+
+bool SVGElementImpl::hasAttributes()
+{
+ return m_attributes.count() > 0;
+}
+
+void SVGElementImpl::setApplyAttribute(const QString &name, const QString &value)
+{
+ if(hasAttribute(name))
+ {
+ QString cur = getAttribute(name).string();
+ cur = cur.simplifyWhiteSpace();
+
+ if(!cur.endsWith(";"))
+ cur += "; ";
+
+ cur += value;
+
+ setAttribute(name, cur);
+ }
+ else
+ setAttribute(name, value);
+}
+
+void SVGElementImpl::setId(DOM::DOMString id)
+{
+ setAttribute("id", id);
+
+ if(ownerDoc() && ownerDoc()->rootElement() && !id.isEmpty())
+ ownerDoc()->rootElement()->addToIdMap(id.string(), this);
+ else if(m_ownerSVGElement && !id.isEmpty())
+ m_ownerSVGElement->addToIdMap(id.string(), this);
+}
+
+DOM::DOMString SVGElementImpl::id() const
+{
+ return getAttribute("id");
+}
+
+void SVGElementImpl::setXmlbase(DOM::DOMString xmlbase)
+{
+ setAttribute("xml:base", xmlbase);
+}
+
+DOM::DOMString SVGElementImpl::xmlbase() const
+{
+ return getAttribute("xml:base");
+}
+
+void SVGElementImpl::setOwnerSVGElement(SVGSVGElementImpl *owner)
+{
+ if(m_ownerSVGElement)
+ m_ownerSVGElement->deref();
+
+ m_ownerSVGElement = owner;
+
+ if(m_ownerSVGElement)
+ m_ownerSVGElement->ref();
+}
+
+void SVGElementImpl::setViewportElement(SVGElementImpl *viewport)
+{
+ if(m_viewportElement)
+ m_viewportElement->deref();
+
+ m_viewportElement = viewport;
+
+ if(m_viewportElement)
+ m_viewportElement->ref();
+}
+
+SVGSVGElementImpl *SVGElementImpl::ownerSVGElement() const
+{
+ return m_ownerSVGElement;
+}
+
+SVGElementImpl *SVGElementImpl::viewportElement() const
+{
+ return m_viewportElement;
+}
+
+void SVGElementImpl::setAttributes(const QXmlAttributes &attrs)
+{
+ for(int i = 0; i < attrs.length(); i++)
+ {
+ setAttribute(attrs.localName(i), attrs.value(i));
+ setAttributeInternal(attrs.localName(i), attrs.value(i));
+ }
+
+ setAttributes();
+}
+
+void SVGElementImpl::setAttributes()
+{
+ // Finalize style
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(this);
+
+ if(style)
+ style->processStyle();
+}
+
+void SVGElementImpl::setAttributes(bool deep)
+{
+ // Finalize style
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(this);
+
+ if(style)
+ style->processStyle();
+
+ if(deep)
+ {
+ if(hasChildNodes())
+ {
+ DOM::Node n;
+ for(n = firstChild(); !n.isNull(); n = n.nextSibling())
+ {
+ SVGElementImpl *elem = ownerDoc()->getElementFromHandle(n.handle());
+ if(elem)
+ elem->setAttributes(true);
+ }
+ }
+ }
+}
+
+bool SVGElementImpl::prepareMouseEvent(const QPoint &p, const QPoint &a, SVGMouseEventImpl *mev)
+{
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(this);
+ if(shape)
+ return shape->prepareMouseEvent(p, a, mev);
+
+ return false;
+}
+
+bool SVGElementImpl::dispatchEvent(int id, bool canBubbleArg, bool cancelableArg)
+{
+ SVGEventImpl *evt = new SVGEventImpl(static_cast<SVGEvent::EventId>(id), canBubbleArg, cancelableArg);
+
+ evt->ref();
+ bool ret = dispatchEvent(evt, true);
+ evt->deref();
+
+ return ret;
+}
+
+bool SVGElementImpl::dispatchEvent(SVGEventImpl *evt, bool tempEvent)
+{
+ evt->setTarget(this);
+
+ // Find out, where to send to -> collect parent nodes
+ QPtrList<SVGElementImpl> nodeChain;
+
+ for(DOM::Element e = *this; !e.isNull(); e = e.parentNode())
+ nodeChain.prepend(ownerDoc()->getElementFromHandle(e.handle()));
+
+ // Trigger any capturing event handlers on our way down
+ evt->setEventPhase(DOM::Event::CAPTURING_PHASE);
+
+ QPtrListIterator<SVGElementImpl> it(nodeChain);
+ for(; it.current() && it.current() != this && !evt->propagationStopped(); ++it)
+ {
+ evt->setCurrentTarget(it.current());
+
+ if(it.current())
+ it.current()->handleLocalEvents(evt, true);
+ }
+
+ // Dispatch to the actual target node
+ it.toLast();
+ if(!evt->propagationStopped())
+ {
+ evt->setEventPhase(DOM::Event::AT_TARGET);
+ evt->setCurrentTarget(it.current());
+
+ if(it.current())
+ it.current()->handleLocalEvents(evt, false);
+ }
+
+ --it;
+
+ // Bubble up again
+ if(evt->bubbles())
+ {
+ evt->setEventPhase(DOM::Event::BUBBLING_PHASE);
+ for(; it.current() && !evt->propagationStopped(); --it)
+ {
+ evt->setCurrentTarget(it.current());
+
+ if(it.current())
+ it.current()->handleLocalEvents(evt, false);
+ }
+ }
+
+ evt->setCurrentTarget(0);
+ evt->setEventPhase(0); // I guess this is correct, the spec does not seem to say
+ // anything about the default event handler phase.
+
+ if(evt->bubbles())
+ {
+ // now we call all default event handlers (this is not part of DOM - it is internal to ksvg)
+ it.toLast();
+ for(; it.current() && !evt->propagationStopped() && !evt->defaultPrevented() && !evt->defaultHandled(); --it)
+ it.current()->defaultEventHandler(evt);
+ }
+
+ // If tempEvent is true, this means that the DOM implementation will not be storing a reference to the event, i.e.
+ // there is no way to retrieve it from javascript if a script does not already have a reference to it in a variable.
+ // So there is no need for the interpreter to keep the event in its cache
+ if(tempEvent)
+ ownerDoc()->ecmaEngine()->finishedWithEvent(evt);
+
+ return !evt->defaultPrevented(); // ### what if defaultPrevented was called before dispatchEvent?
+}
+
+bool SVGElementImpl::dispatchKeyEvent(QKeyEvent *ke)
+{
+ DOM::AbstractView temp;
+
+ SVGEvent::EventId evtId = SVGEvent::UNKNOWN_EVENT;
+
+ if(ke->type() == QEvent::KeyRelease && !ke->isAutoRepeat())
+ evtId = SVGEvent::KEYUP_EVENT;
+ else if(ke->isAutoRepeat())
+ evtId = SVGEvent::KEYPRESS_EVENT;
+ else if(ke->type() == QEvent::KeyPress)
+ evtId = SVGEvent::KEYDOWN_EVENT;
+
+ if(evtId == SVGEvent::KEYUP_EVENT && hasEventListener(SVGEvent::DOMACTIVATE_EVENT, false))
+ dispatchEvent(SVGEvent::DOMACTIVATE_EVENT, true, true);
+
+ if(!hasEventListener(evtId, false))
+ return false;
+
+ SVGEventImpl *evt = new SVGKeyEventImpl(ke, temp, evtId);
+
+ evt->ref();
+ bool ret = dispatchEvent(evt, true);
+ evt->deref();
+
+ // Rerender now! Once! (Niko)
+ ownerDoc()->rerender();
+
+ return ret;
+}
+
+bool SVGElementImpl::dispatchMouseEvent(int id, bool canBubbleArg, bool cancelableArg, long detailArg, long screenXArg, long screenYArg, long clientXArg, long clientYArg, bool ctrlKeyArg, bool altKeyArg, bool shiftKeyArg, bool metaKeyArg, unsigned short buttonArg, SVGElementImpl *relatedTargetArg)
+{
+ DOM::AbstractView temp;
+
+ SVGEventImpl *evt = new SVGMouseEventImpl(static_cast<SVGEvent::EventId>(id),
+ canBubbleArg, cancelableArg, temp, detailArg,
+ screenXArg, screenYArg,
+ clientXArg, clientYArg,
+ ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg,
+ buttonArg, relatedTargetArg);
+
+ evt->ref();
+ bool ret = dispatchEvent(evt, true);
+ evt->deref();
+
+ return ret;
+}
+
+void SVGElementImpl::setOwnerDoc(SVGDocumentImpl *doc)
+{
+ if(m_ownerDoc)
+ m_ownerDoc->removeFromElemDict(handle());
+
+ m_ownerDoc = doc;
+
+ if(m_ownerDoc)
+ m_ownerDoc->addToElemDict(handle(), this);
+}
+
+SVGDocumentImpl *SVGElementImpl::ownerDoc() const
+{
+ return m_ownerDoc;
+}
+
+SVGElementImpl *SVGElementImpl::cloneNode(bool deep)
+{
+ DOM::Element impl = static_cast<DOM::Document *>(ownerDoc())->createElementNS("", tagName());
+ SVGElementImpl *newElement = SVGDocumentImpl::createElement(tagName(), impl.cloneNode(false), ownerDoc());
+ newElement->setOwnerSVGElement(ownerSVGElement());
+ newElement->setViewportElement(viewportElement());
+
+ SVGHelperImpl::copyAttributes(this, newElement);
+
+ // Recalc style
+ //newElement->setAttributes();
+
+ if(deep)
+ cloneChildNodes(newElement);
+
+ return newElement;
+}
+
+void SVGElementImpl::cloneChildNodes(SVGElementImpl *clone)
+{
+ DOM::Node n;
+ for(n = firstChild(); !n.isNull(); n = n.nextSibling())
+ {
+ SVGElementImpl *elem = ownerDoc()->getElementFromHandle(n.handle());
+ if(elem)
+ clone->appendChild(*elem->cloneNode(true));
+ else if(n.nodeType() == DOM::Node::TEXT_NODE)
+ clone->appendChild(n.cloneNode(true));
+ }
+}
+
+void SVGElementImpl::gotError(const QString &errorDesc)
+{
+ if(ownerDoc())
+ {
+ ownerDoc()->finishParsing(true, errorDesc);
+ if(hasEventListener(SVGEvent::ERROR_EVENT, true))
+ dispatchEvent(SVGEvent::ERROR_EVENT, false, false);
+ }
+}
+
+QString SVGElementImpl::collectText()
+{
+ QString text;
+
+ if(hasChildNodes())
+ {
+ DOM::Node node = firstChild();
+
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ if(node.nodeType() == DOM::Node::TEXT_NODE)
+ {
+ DOM::Text textNode = node;
+ text += textNode.data().string();
+ }
+ }
+ }
+
+ return text;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGElementImpl.h b/ksvg/impl/SVGElementImpl.h
new file mode 100644
index 00000000..c69a83e8
--- /dev/null
+++ b/ksvg/impl/SVGElementImpl.h
@@ -0,0 +1,229 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGElementImpl_H
+#define SVGElementImpl_H
+
+#include <map>
+#include <string>
+
+#include <qdict.h>
+#include <qptrlist.h>
+
+#include <dom/dom_string.h>
+
+#include "SVGEcma.h"
+
+#include "ksvg_lookup.h"
+
+class QKeyEvent;
+class QXmlAttributes;
+
+namespace KJS
+{
+ class Value;
+ class UString;
+ class ExecState;
+}
+
+namespace KSVG
+{
+
+class KSVGCanvas;
+class SVGEventImpl;
+class SVGDocumentImpl;
+class SVGEventListener;
+class SVGSVGElementImpl;
+class SVGMouseEventImpl;
+class SVGRegisteredEventListener;
+class SVGElementImpl : virtual public DOM::DomShared,
+ public DOM::Element,
+ public SVGDOMElementBridge
+{
+public:
+ SVGElementImpl(DOM::ElementImpl *impl);
+ virtual ~SVGElementImpl();
+
+ // Attribute setting
+ // "Override" khtml's functions with ours
+ void setAttribute(const DOM::DOMString &name, const DOM::DOMString &value);
+ void setAttributeInternal(const DOM::DOMString &name, const DOM::DOMString &value);
+ DOM::DOMString getAttribute(const DOM::DOMString &name) const;
+ DOM::DOMString getAttributeInternal(const DOM::DOMString &name);
+ bool hasAttribute(const DOM::DOMString &name);
+ bool hasAttributes();
+
+ QDict<DOM::DOMString> &attributes();
+ void setApplyAttribute(const QString &name, const QString &value);
+
+ void setId(DOM::DOMString);
+ DOM::DOMString id() const;
+
+ void setXmlbase(DOM::DOMString);
+ DOM::DOMString xmlbase() const;
+
+ void setOwnerSVGElement(SVGSVGElementImpl *owner);
+ void setViewportElement(SVGElementImpl *viewport);
+
+ SVGSVGElementImpl *ownerSVGElement() const;
+ SVGElementImpl *viewportElement() const;
+
+ void setAttributes(const QXmlAttributes &);
+ virtual void setAttributes();
+ void setAttributes(bool deep);
+
+ QString collectText();
+
+ void setOwnerDoc(SVGDocumentImpl *doc);
+ SVGDocumentImpl *ownerDoc() const;
+
+ virtual SVGElementImpl *cloneNode(bool deep);
+ void cloneChildNodes(SVGElementImpl *clone);
+
+ // Event stuff
+ bool dispatchEvent(int id, bool canBubbleArg, bool cancelableArg);
+ bool dispatchEvent(SVGEventImpl *evt, bool tempEvent);
+ bool dispatchMouseEvent(int id, bool canBubbleArg, bool cancelableArg, long detailArg, long screenXArg, long screenYArg, long clientXArg, long clientYArg, bool ctrlKeyArg, bool altKeyArg, bool shiftKeyArg, bool metaKeyArg, unsigned short buttonArg, SVGElementImpl *relatedTargetArg);
+ bool dispatchKeyEvent(QKeyEvent *ke);
+
+ void setEventListener(int id, SVGEventListener *listener);
+ bool hasEventListener(int id, bool local);
+ int getEventListeners(bool local);
+ void removeEventListener(int id);
+ void setupEventListeners(SVGDocumentImpl *doc, SVGDocumentImpl *newDoc);
+
+ // Use with care! Internal only.
+ const QPtrList<SVGRegisteredEventListener> &eventListeners() { return m_eventListeners; }
+
+ void handleLocalEvents(SVGEventImpl *evt, bool useCapture);
+ virtual void defaultEventHandler(SVGEventImpl *evt);
+
+ bool mouseOver() { return m_mouseOver; }
+ void setMouseOver(bool v) { m_mouseOver = v; }
+
+ bool focus() { return m_focus; }
+ void setFocus(bool v) { m_focus = v; }
+
+ virtual bool prepareMouseEvent(const QPoint &, const QPoint &, SVGMouseEventImpl *);
+
+ virtual void createItem(KSVGCanvas *c = 0) { Q_UNUSED(c); }
+ virtual void removeItem(KSVGCanvas *c) { Q_UNUSED(c); }
+
+ // Element creation
+ typedef SVGElementImpl *(*FactoryFn)(DOM::ElementImpl *impl);
+ class Factory
+ {
+ public:
+ static Factory *self()
+ {
+ if(!m_instance)
+ m_instance = new Factory();
+
+ return m_instance;
+ }
+
+ void announce(SVGElementImpl::FactoryFn factoryFn, const std::string &tag)
+ {
+ if(m_elementMap.find(tag) == m_elementMap.end())
+ m_elementMap[tag] = factoryFn;
+ }
+
+ SVGElementImpl *create(const std::string &tag, DOM::ElementImpl *impl) const
+ {
+ ElementMap::const_iterator it = m_elementMap.find(tag);
+ if(it != m_elementMap.end())
+ return it->second(impl);
+ return 0;
+ }
+
+ private:
+ Factory() { }
+ Factory(const Factory &rhs);
+ Factory &operator=(const Factory &rhs);
+
+ static Factory *m_instance;
+
+ typedef std::map<std::string, SVGElementImpl::FactoryFn> ElementMap;
+ mutable ElementMap m_elementMap;
+ };
+
+ template <class T>
+ class Registrar
+ {
+ public:
+ Registrar(const std::string &tag)
+ {
+ SVGElementImpl::Factory::self()->announce(&factoryFn, tag);
+ }
+
+ static SVGElementImpl *factoryFn(DOM::ElementImpl *impl)
+ {
+ return new T(impl);
+ }
+ };
+
+#define KSVG_REGISTER_ELEMENT(Class, Tag) \
+ static SVGElementImpl::Registrar<Class> Class##Registrar(Tag);
+
+protected:
+ void gotError(const QString &errorDesc);
+
+private:
+ SVGSVGElementImpl *m_ownerSVGElement;
+ SVGElementImpl *m_viewportElement;
+ SVGDocumentImpl *m_ownerDoc;
+
+ bool m_mouseOver : 1;
+ bool m_focus : 1;
+
+ QPtrList<SVGRegisteredEventListener> m_eventListeners;
+ QDict<DOM::DOMString> m_attributes;
+
+public:
+ KSVG_BASECLASS_GET
+ KSVG_PUT
+
+ virtual KJS::ObjectImp *bridge(KJS::ExecState *exec) const; // NEEDS TO BE VIRTUAL HERE
+
+ enum
+ {
+ // Properties
+ ElementId, OwnerSvgElement, ViewportElement, XmlBase,
+ OnMouseUp, OnMouseDown, OnMouseMove, OnMouseOver, OnMouseOut,
+ OnClick, OnActivate, OnKeyDown, OnKeyUp, OnKeyPress, OnLoad,
+ OnFocusIn, OnFocusOut, OnError, OnAbort,
+ // Functions
+ GetStyle,
+ // these do not really belong here, but the css doesnt work yet...
+ SetProperty, GetPropertyValue
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGElementImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGElementImplProtoFunc, SVGElementImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGElementInstanceImpl.cc b/ksvg/impl/SVGElementInstanceImpl.cc
new file mode 100644
index 00000000..97cd28a2
--- /dev/null
+++ b/ksvg/impl/SVGElementInstanceImpl.cc
@@ -0,0 +1,108 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGElementImpl.h"
+#include "SVGUseElementImpl.h"
+#include "SVGElementInstanceImpl.h"
+#include "SVGElementInstanceListImpl.h"
+
+using namespace KSVG;
+
+SVGElementInstanceImpl::SVGElementInstanceImpl()//FIXME : events::EventTarget()
+{
+ m_correspondingElement = 0;
+ m_correspondingUseElement = 0;
+ m_parentNode = 0;
+ m_childNodes = 0;
+ m_firstChild = 0;
+ m_lastChild = 0;
+ m_previousSibling = 0;
+ m_nextSibling = 0;
+}
+
+SVGElementInstanceImpl::~SVGElementInstanceImpl()
+{
+ if(m_correspondingElement)
+ m_correspondingElement->deref();
+ if(m_correspondingUseElement)
+ m_correspondingUseElement->deref();
+ if(m_parentNode)
+ m_parentNode->deref();
+ if(m_childNodes)
+ m_childNodes->deref();
+ if(m_firstChild)
+ m_firstChild->deref();
+ if(m_lastChild)
+ m_lastChild->deref();
+ if(m_previousSibling)
+ m_previousSibling->deref();
+ if(m_nextSibling)
+ m_nextSibling->deref();
+}
+
+void SVGElementInstanceImpl::setCorrespondingElement(SVGElementImpl *corresponding)
+{
+ m_correspondingElement = corresponding;
+
+ if(m_correspondingElement)
+ m_correspondingElement->ref();
+}
+
+SVGElementImpl *SVGElementInstanceImpl::correspondingElement() const
+{
+ return m_correspondingElement;
+}
+
+SVGUseElementImpl *SVGElementInstanceImpl::correspondingUseElement() const
+{
+ return m_correspondingUseElement;
+}
+
+SVGElementInstanceImpl *SVGElementInstanceImpl::parentNode() const
+{
+ return m_parentNode;
+}
+
+SVGElementInstanceListImpl *SVGElementInstanceImpl::childNodes() const
+{
+ return m_childNodes;
+}
+
+SVGElementInstanceImpl *SVGElementInstanceImpl::firstChild() const
+{
+ return m_firstChild;
+}
+
+SVGElementInstanceImpl *SVGElementInstanceImpl::lastChild() const
+{
+ return m_lastChild;
+}
+
+SVGElementInstanceImpl *SVGElementInstanceImpl::previousSibling() const
+{
+ return m_previousSibling;
+}
+
+SVGElementInstanceImpl *SVGElementInstanceImpl::nextSibling() const
+{
+ return m_nextSibling;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGElementInstanceImpl.h b/ksvg/impl/SVGElementInstanceImpl.h
new file mode 100644
index 00000000..d9f3afae
--- /dev/null
+++ b/ksvg/impl/SVGElementInstanceImpl.h
@@ -0,0 +1,70 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGElementInstanceImpl_H
+#define SVGElementInstanceImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGElementImpl;
+class SVGUseElementImpl;
+class SVGElementInstanceImpl;
+class SVGElementInstanceListImpl;
+class SVGElementInstanceImpl : public DOM::DomShared
+{
+public:
+ SVGElementInstanceImpl();
+ virtual ~SVGElementInstanceImpl();
+
+ SVGElementImpl *correspondingElement() const;
+ SVGUseElementImpl *correspondingUseElement() const;
+ SVGElementInstanceImpl *parentNode() const;
+ SVGElementInstanceListImpl *childNodes() const;
+ SVGElementInstanceImpl *firstChild() const;
+ SVGElementInstanceImpl *lastChild() const;
+ SVGElementInstanceImpl *previousSibling() const;
+ SVGElementInstanceImpl *nextSibling() const;
+
+ void setCorrespondingElement(SVGElementImpl *);
+
+private:
+ SVGElementImpl *m_correspondingElement;
+ SVGUseElementImpl *m_correspondingUseElement;
+ SVGElementInstanceImpl *m_parentNode;
+ SVGElementInstanceListImpl *m_childNodes;
+ SVGElementInstanceImpl *m_firstChild;
+ SVGElementInstanceImpl *m_lastChild;
+ SVGElementInstanceImpl *m_previousSibling;
+ SVGElementInstanceImpl *m_nextSibling;
+
+public:
+ //KSVG_FORWARDGET
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGElementInstanceListImpl.cc b/ksvg/impl/SVGElementInstanceListImpl.cc
new file mode 100644
index 00000000..187255ab
--- /dev/null
+++ b/ksvg/impl/SVGElementInstanceListImpl.cc
@@ -0,0 +1,44 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGElementInstanceImpl.h"
+#include "SVGElementInstanceListImpl.h"
+
+using namespace KSVG;
+
+SVGElementInstanceListImpl::SVGElementInstanceListImpl()
+{
+}
+
+SVGElementInstanceListImpl::~SVGElementInstanceListImpl()
+{
+}
+
+unsigned long SVGElementInstanceListImpl::length() const
+{
+ return m_length;
+}
+
+SVGElementInstanceImpl *SVGElementInstanceListImpl::item(unsigned long /*index*/)
+{
+ return 0;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGElementInstanceListImpl.h b/ksvg/impl/SVGElementInstanceListImpl.h
new file mode 100644
index 00000000..c9ac0dd2
--- /dev/null
+++ b/ksvg/impl/SVGElementInstanceListImpl.h
@@ -0,0 +1,49 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGElementInstanceListImpl_H
+#define SVGElementInstanceListImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGElementInstanceImpl;
+class SVGElementInstanceListImpl : public DOM::DomShared
+{
+public:
+ SVGElementInstanceListImpl();
+ virtual ~SVGElementInstanceListImpl();
+
+ unsigned long length() const;
+ SVGElementInstanceImpl *item(unsigned long index);
+
+private:
+ unsigned long m_length;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGEllipseElementImpl.cc b/ksvg/impl/SVGEllipseElementImpl.cc
new file mode 100644
index 00000000..9908941a
--- /dev/null
+++ b/ksvg/impl/SVGEllipseElementImpl.cc
@@ -0,0 +1,200 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "CanvasItem.h"
+#include "KSVGCanvas.h"
+
+#include "SVGRectImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGEllipseElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+
+using namespace KSVG;
+
+#include "SVGEllipseElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGEllipseElementImpl::SVGEllipseElementImpl(DOM::ElementImpl *impl) : SVGShapeImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_cx = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_cx->ref();
+ m_cx->baseVal()->setValueAsString("-1");
+
+ m_cy = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_cy->ref();
+ m_cy->baseVal()->setValueAsString("-1");
+
+ m_rx = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_rx->ref();
+ m_rx->baseVal()->setValueAsString("-1");
+
+ m_ry = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_ry->ref();
+ m_ry->baseVal()->setValueAsString("-1");
+}
+
+SVGEllipseElementImpl::~SVGEllipseElementImpl()
+{
+ if(m_cx)
+ m_cx->deref();
+ if(m_cy)
+ m_cy->deref();
+ if(m_rx)
+ m_rx->deref();
+ if(m_ry)
+ m_ry->deref();
+}
+
+SVGAnimatedLengthImpl *SVGEllipseElementImpl::cx()
+{
+ return m_cx;
+}
+
+SVGAnimatedLengthImpl *SVGEllipseElementImpl::cy()
+{
+ return m_cy;
+}
+
+SVGAnimatedLengthImpl *SVGEllipseElementImpl::rx()
+{
+ return m_rx;
+}
+
+SVGAnimatedLengthImpl *SVGEllipseElementImpl::ry()
+{
+ return m_ry;
+}
+
+/*
+@namespace KSVG
+@begin SVGEllipseElementImpl::s_hashTable 5
+ cx SVGEllipseElementImpl::Cx DontDelete|ReadOnly
+ cy SVGEllipseElementImpl::Cy DontDelete|ReadOnly
+ rx SVGEllipseElementImpl::Rx DontDelete|ReadOnly
+ ry SVGEllipseElementImpl::Ry DontDelete|ReadOnly
+@end
+*/
+
+Value SVGEllipseElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case Cx:
+ if(!attributeMode)
+ return m_cx->cache(exec);
+ else
+ return Number(m_cx->baseVal()->value());
+ case Cy:
+ if(!attributeMode)
+ return m_cy->cache(exec);
+ else
+ return Number(m_cy->baseVal()->value());
+ case Rx:
+ if(!attributeMode)
+ return m_rx->cache(exec);
+ else
+ return Number(m_rx->baseVal()->value());
+ case Ry:
+ if(!attributeMode)
+ return m_ry->cache(exec);
+ else
+ return Number(m_ry->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGEllipseElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case Cx:
+ cx()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Cy:
+ cy()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Rx:
+ rx()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ if(rx()->baseVal()->value() < 0) // A negative value is an error
+ gotError("Negative value for attribute rx of element <ellipse> is illegal");
+ break;
+ case Ry:
+ ry()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ if(ry()->baseVal()->value() < 0) // A negative value is an error
+ gotError(i18n("Negative value for attribute ry of element <ellipse> is illegal"));
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+SVGRectImpl *SVGEllipseElementImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+ ret->setX(m_cx->baseVal()->value() - m_rx->baseVal()->value());
+ ret->setY(m_cy->baseVal()->value() - m_ry->baseVal()->value());
+ ret->setWidth(m_rx->baseVal()->value() * 2.0);
+ ret->setHeight(m_ry->baseVal()->value() * 2.0);
+ return ret;
+}
+
+void SVGEllipseElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(Cx))
+ KSVG_SET_ALT_ATTRIBUTE(Cx, "0")
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(Cy))
+ KSVG_SET_ALT_ATTRIBUTE(Cy, "0")
+}
+
+void SVGEllipseElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_item)
+ {
+ m_item = c->createEllipse(this);
+ c->insert(m_item);
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGEllipseElementImpl.h b/ksvg/impl/SVGEllipseElementImpl.h
new file mode 100644
index 00000000..131098ba
--- /dev/null
+++ b/ksvg/impl/SVGEllipseElementImpl.h
@@ -0,0 +1,86 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGEllipseElementImpl_H
+#define SVGEllipseElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGShapeImpl.h"
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGRectImpl;
+class SVGAnimatedLengthImpl;
+class SVGEllipseElementImpl : public SVGShapeImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGEllipseElementImpl(DOM::ElementImpl *);
+ virtual ~SVGEllipseElementImpl();
+
+ SVGAnimatedLengthImpl *cx();
+ SVGAnimatedLengthImpl *cy();
+ SVGAnimatedLengthImpl *rx();
+ SVGAnimatedLengthImpl *ry();
+
+ virtual void createItem(KSVGCanvas *c = 0);
+ virtual void setAttributes();
+
+ virtual SVGRectImpl *getBBox();
+
+private:
+ SVGAnimatedLengthImpl *m_cx;
+ SVGAnimatedLengthImpl *m_cy;
+ SVGAnimatedLengthImpl *m_rx;
+ SVGAnimatedLengthImpl *m_ry;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ Cx, Cy, Rx, Ry
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGEllipseElementImpl, "ellipse")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGEventImpl.cc b/ksvg/impl/SVGEventImpl.cc
new file mode 100644
index 00000000..418e0044
--- /dev/null
+++ b/ksvg/impl/SVGEventImpl.cc
@@ -0,0 +1,992 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ This file is part of the KDE project
+
+ Additional copyright:
+ (C) 2001 Peter Kelly <pmk@post.com>
+ (C) 2001 Tobias Anton <anton@stud.fbi.fh-darmstadt.de>
+
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGDocumentImpl.h"
+#include "SVGEventImpl.h"
+
+#include <kdebug.h>
+
+using namespace KSVG;
+
+#include "ksvg_scriptinterpreter.h"
+#include "SVGEventImpl.lut.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGEventImpl::SVGEventImpl()
+{
+ m_canBubble = false;
+ m_cancelable = false;
+
+ m_propagationStopped = false;
+ m_defaultPrevented = false;
+ m_id = SVGEvent::UNKNOWN_EVENT;
+ m_eventPhase = 0;
+ m_createTime = QDateTime::currentDateTime();
+ m_defaultHandled = false;
+
+ m_target = 0;
+ m_currentTarget = 0;
+}
+
+SVGEventImpl::SVGEventImpl(SVGEvent::EventId _id, bool canBubbleArg, bool cancelableArg)
+{
+ DOM::DOMString t = SVGEvent::idToType(_id);
+ m_type = t.implementation();
+
+ m_canBubble = canBubbleArg;
+ m_cancelable = cancelableArg;
+
+ m_propagationStopped = false;
+ m_defaultPrevented = false;
+ m_id = _id;
+ m_eventPhase = 0;
+ m_createTime = QDateTime::currentDateTime();
+ m_defaultHandled = false;
+
+ m_target = 0;
+ m_currentTarget = 0;
+}
+
+SVGEventImpl::~SVGEventImpl()
+{
+}
+
+DOM::DOMString SVGEventImpl::type() const
+{
+ return m_type;
+}
+
+SVGElementImpl *SVGEventImpl::target() const
+{
+ return m_target;
+}
+
+void SVGEventImpl::setTarget(SVGElementImpl *_target)
+{
+ m_target = _target;
+}
+
+SVGElementImpl *SVGEventImpl::currentTarget() const
+{
+ return m_currentTarget;
+}
+
+void SVGEventImpl::setCurrentTarget(SVGElementImpl *_currentTarget)
+{
+ m_currentTarget = _currentTarget;
+}
+
+unsigned short SVGEventImpl::eventPhase() const
+{
+ return m_eventPhase;
+}
+
+void SVGEventImpl::setEventPhase(unsigned short _eventPhase)
+{
+ m_eventPhase = _eventPhase;
+}
+
+bool SVGEventImpl::bubbles() const
+{
+ return m_canBubble;
+}
+
+bool SVGEventImpl::cancelable() const
+{
+ return m_cancelable;
+}
+
+DOM::DOMTimeStamp SVGEventImpl::timeStamp()
+{
+ QDateTime epoch(QDate(1970, 1, 1), QTime(0, 0));
+
+ // ### kjs does not yet support long long (?) so the value wraps around
+ return epoch.secsTo(m_createTime) * 1000 + m_createTime.time().msec();
+}
+
+void SVGEventImpl::stopPropagation()
+{
+ m_propagationStopped = true;
+}
+
+void SVGEventImpl::preventDefault()
+{
+ if(m_cancelable)
+ m_defaultPrevented = true;
+}
+
+void SVGEventImpl::initEvent(const DOM::DOMString &eventTypeArg, bool canBubbleArg, bool cancelableArg)
+{
+ // ### ensure this is not called after we have been dispatched (also for subclasses)
+ m_type = eventTypeArg.implementation();
+ m_id = SVGEvent::typeToId(eventTypeArg);
+
+ m_canBubble = canBubbleArg;
+ m_cancelable = cancelableArg;
+}
+
+void SVGEventImpl::setDefaultHandled()
+{
+ m_defaultHandled = true;
+}
+
+/*
+@namespace KSVG
+@begin SVGEventImpl::s_hashTable 11
+ type SVGEventImpl::Type DontDelete|ReadOnly
+ target SVGEventImpl::Target DontDelete|ReadOnly
+ currentTarget SVGEventImpl::CurrentTarget DontDelete|ReadOnly
+ eventPhase SVGEventImpl::EventPhase DontDelete|ReadOnly
+ bubbles SVGEventImpl::Bubbles DontDelete|ReadOnly
+ cancelable SVGEventImpl::Cancelable DontDelete|ReadOnly
+ timeStamp SVGEventImpl::TimeStamp DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGEventImplProto::s_hashTable 13
+ getType SVGEventImpl::GetType DontDelete|Function 0
+ getTarget SVGEventImpl::GetTarget DontDelete|Function 0
+ getCurrentTarget SVGEventImpl::GetCurrentTarget DontDelete|Function 0
+ getCurrentNode SVGEventImpl::GetCurrentNode DontDelete|Function 0
+ getEventphase SVGEventImpl::GetEventPhase DontDelete|Function 0
+ getBubbles SVGEventImpl::GetBubbles DontDelete|Function 0
+ getCancelable SVGEventImpl::GetCancelable DontDelete|Function 0
+ getTimeStamp SVGEventImpl::GetTimeStamp DontDelete|Function 0
+ stopPropagation SVGEventImpl::StopPropagation DontDelete|Function 0
+ preventDefault SVGEventImpl::PreventDefault DontDelete|Function 0
+ initEvent SVGEventImpl::InitEvent DontDelete|Function 3
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGEvent", SVGEventImplProto, SVGEventImplProtoFunc)
+
+Value SVGEventImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case Type:
+ return String(type());
+ case Target:
+ return getDOMNode(exec, *target());
+ case CurrentTarget:
+ return getDOMNode(exec, *currentTarget());
+ case EventPhase:
+ return Number(eventPhase());
+ case Bubbles:
+ return Boolean(bubbles());
+ case Cancelable:
+ return Boolean(cancelable());
+// case TimeStamp: // TODO
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return KJS::Undefined();
+ }
+}
+
+Value SVGEventImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGEventImpl)
+
+ switch(id)
+ {
+ case SVGEventImpl::GetType:
+ return String(obj->type());
+ case SVGEventImpl::GetTarget:
+ return getDOMNode(exec, *obj->target());
+ case SVGEventImpl::GetCurrentTarget:
+ case SVGEventImpl::GetCurrentNode:
+ return getDOMNode(exec, *obj->currentTarget());
+ case SVGEventImpl::GetEventPhase:
+ return Number(obj->eventPhase());
+ case SVGEventImpl::GetBubbles:
+ return Boolean(obj->bubbles());
+ case SVGEventImpl::GetCancelable:
+ return Boolean(obj->cancelable());
+// case SVGEventImpl::GetTimeStamp: // TODO
+ case SVGEventImpl::StopPropagation:
+ {
+ obj->stopPropagation();
+ return Undefined();
+ }
+ case SVGEventImpl::PreventDefault:
+ {
+ obj->preventDefault();
+ return Undefined();
+ }
+ case SVGEventImpl::InitEvent:
+ {
+ obj->initEvent(args[0].toString(exec).string(), args[1].toBoolean(exec), args[2].toBoolean(exec));
+ return Undefined();
+ }
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+
+
+
+
+SVGUIEventImpl::SVGUIEventImpl() : SVGEventImpl()
+{
+ m_detail = 0;
+}
+
+SVGUIEventImpl::SVGUIEventImpl(SVGEvent::EventId _id, bool canBubbleArg, bool cancelableArg, DOM::AbstractView &viewArg, long detailArg)
+: SVGEventImpl(_id, canBubbleArg, cancelableArg)
+{
+ m_view = viewArg;
+ m_detail = detailArg;
+}
+
+SVGUIEventImpl::~SVGUIEventImpl()
+{
+}
+
+DOM::AbstractView SVGUIEventImpl::view() const
+{
+ return m_view;
+}
+
+long SVGUIEventImpl::detail() const
+{
+ return m_detail;
+}
+
+void SVGUIEventImpl::initUIEvent(const DOM::DOMString &typeArg,
+ bool canBubbleArg,
+ bool cancelableArg,
+ const DOM::AbstractView &viewArg,
+ long detailArg)
+{
+ SVGEventImpl::initEvent(typeArg, canBubbleArg, cancelableArg);
+
+ m_view = viewArg;
+ m_detail = detailArg;
+}
+
+/*
+@namespace KSVG
+@begin SVGUIEventImpl::s_hashTable 3
+ view SVGUIEventImpl::View DontDelete|ReadOnly
+ detail SVGUIEventImpl::Detail DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGUIEventImplProto::s_hashTable 5
+ getView SVGUIEventImpl::GetView DontDelete|Function 0
+ getDetail SVGUIEventImpl::GetDetail DontDelete|Function 0
+ initUIEvent SVGUIEventImpl::InitUIEvent DontDelete|Function 5
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGUIEvent", SVGUIEventImplProto, SVGUIEventImplProtoFunc)
+
+Value SVGUIEventImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+// case View: // TODO
+ case Detail:
+ return Number(detail());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return KJS::Undefined();
+ }
+}
+
+Value SVGUIEventImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &)
+{
+ KSVG_CHECK_THIS(SVGUIEventImpl)
+
+ switch(id)
+ {
+// case SVGUIEventImpl::GetView: // TODO
+ case SVGUIEventImpl::GetDetail:
+ return Number(obj->detail());
+// case SVGUIEventImpl::InitUIEvent: // TODO
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+SVGKeyEventImpl::SVGKeyEventImpl() : SVGUIEventImpl()
+{
+ qKeyEvent = 0;
+}
+
+SVGKeyEventImpl::SVGKeyEventImpl(QKeyEvent *key, DOM::AbstractView &view, SVGEvent::EventId _id) : SVGUIEventImpl(_id, true, true, view, 0)
+{
+ qKeyEvent = new QKeyEvent(key->type(), key->key(), key->ascii(), key->state(), key->text(), key->isAutoRepeat(), key->count());
+
+ // Events are supposed to be accepted by default in Qt!
+ // This line made QLineEdit's keyevents be ignored, so they were sent to the khtmlview
+ // (and e.g. space would make it scroll down)
+ //qKeyEvent->ignore();
+
+ m_detail = key->count();
+
+ m_numPad = false;
+ m_keyVal = 0;
+ m_virtKeyVal = DOM_VK_UNDEFINED;
+ m_inputGenerated = true;
+
+ switch(key->key())
+ {
+ case Qt::Key_Enter:
+ m_numPad = true;
+ /* fall through */
+ case Qt::Key_Return:
+ m_virtKeyVal = DOM_VK_ENTER;
+ break;
+ case Qt::Key_NumLock:
+ m_numPad = true;
+ m_virtKeyVal = DOM_VK_NUM_LOCK;
+ break;
+ case Qt::Key_Alt:
+ m_virtKeyVal = DOM_VK_RIGHT_ALT;
+ // ### DOM_VK_LEFT_ALT;
+ break;
+ case Qt::Key_Control:
+ m_virtKeyVal = DOM_VK_LEFT_CONTROL;
+ // ### DOM_VK_RIGHT_CONTROL
+ break;
+ case Qt::Key_Shift:
+ m_virtKeyVal = DOM_VK_LEFT_SHIFT;
+ // ### DOM_VK_RIGHT_SHIFT
+ break;
+ case Qt::Key_Meta:
+ m_virtKeyVal = DOM_VK_LEFT_META;
+ // ### DOM_VK_RIGHT_META
+ break;
+ case Qt::Key_CapsLock:
+ m_virtKeyVal = DOM_VK_CAPS_LOCK;
+ break;
+ case Qt::Key_Delete:
+ m_virtKeyVal = DOM_VK_DELETE;
+ break;
+ case Qt::Key_End:
+ m_virtKeyVal = DOM_VK_END;
+ break;
+ case Qt::Key_Escape:
+ m_virtKeyVal = DOM_VK_ESCAPE;
+ break;
+ case Qt::Key_Home:
+ m_virtKeyVal = DOM_VK_HOME;
+ break;
+ case Qt::Key_Insert:
+ m_virtKeyVal = DOM_VK_INSERT;
+ break;
+ case Qt::Key_Pause:
+ m_virtKeyVal = DOM_VK_PAUSE;
+ break;
+ case Qt::Key_Print:
+ m_virtKeyVal = DOM_VK_PRINTSCREEN;
+ break;
+ case Qt::Key_ScrollLock:
+ m_virtKeyVal = DOM_VK_SCROLL_LOCK;
+ break;
+ case Qt::Key_Left:
+ m_virtKeyVal = DOM_VK_LEFT;
+ break;
+ case Qt::Key_Right:
+ m_virtKeyVal = DOM_VK_RIGHT;
+ break;
+ case Qt::Key_Up:
+ m_virtKeyVal = DOM_VK_UP;
+ break;
+ case Qt::Key_Down:
+ m_virtKeyVal = DOM_VK_DOWN;
+ break;
+ case Qt::Key_Next:
+ m_virtKeyVal = DOM_VK_PAGE_DOWN;
+ break;
+ case Qt::Key_Prior:
+ m_virtKeyVal = DOM_VK_PAGE_UP;
+ break;
+ case Qt::Key_F1:
+ m_virtKeyVal = DOM_VK_F1;
+ break;
+ case Qt::Key_F2:
+ m_virtKeyVal = DOM_VK_F2;
+ break;
+ case Qt::Key_F3:
+ m_virtKeyVal = DOM_VK_F3;
+ break;
+ case Qt::Key_F4:
+ m_virtKeyVal = DOM_VK_F4;
+ break;
+ case Qt::Key_F5:
+ m_virtKeyVal = DOM_VK_F5;
+ break;
+ case Qt::Key_F6:
+ m_virtKeyVal = DOM_VK_F6;
+ break;
+ case Qt::Key_F7:
+ m_virtKeyVal = DOM_VK_F7;
+ break;
+ case Qt::Key_F8:
+ m_virtKeyVal = DOM_VK_F8;
+ break;
+ case Qt::Key_F9:
+ m_virtKeyVal = DOM_VK_F9;
+ break;
+ case Qt::Key_F10:
+ m_virtKeyVal = DOM_VK_F10;
+ break;
+ case Qt::Key_F11:
+ m_virtKeyVal = DOM_VK_F11;
+ break;
+ case Qt::Key_F12:
+ m_virtKeyVal = DOM_VK_F12;
+ break;
+ case Qt::Key_F13:
+ m_virtKeyVal = DOM_VK_F13;
+ break;
+ case Qt::Key_F14:
+ m_virtKeyVal = DOM_VK_F14;
+ break;
+ case Qt::Key_F15:
+ m_virtKeyVal = DOM_VK_F15;
+ break;
+ case Qt::Key_F16:
+ m_virtKeyVal = DOM_VK_F16;
+ break;
+ case Qt::Key_F17:
+ m_virtKeyVal = DOM_VK_F17;
+ break;
+ case Qt::Key_F18:
+ m_virtKeyVal = DOM_VK_F18;
+ break;
+ case Qt::Key_F19:
+ m_virtKeyVal = DOM_VK_F19;
+ break;
+ case Qt::Key_F20:
+ m_virtKeyVal = DOM_VK_F20;
+ break;
+ case Qt::Key_F21:
+ m_virtKeyVal = DOM_VK_F21;
+ break;
+ case Qt::Key_F22:
+ m_virtKeyVal = DOM_VK_F22;
+ break;
+ case Qt::Key_F23:
+ m_virtKeyVal = DOM_VK_F23;
+ break;
+ case Qt::Key_F24:
+ m_virtKeyVal = DOM_VK_F24;
+ break;
+ default:
+ m_virtKeyVal = DOM_VK_UNDEFINED;
+ break;
+ }
+
+ // m_keyVal should contain the unicode value
+ // of the pressed key if available.
+ if (!key->text().isNull())
+ m_keyVal = key->text().unicode()[0];
+
+ // m_numPad = ???
+
+ // key->state returns enum ButtonState, which is ShiftButton, ControlButton and AltButton or'ed together.
+ m_modifier = key->state();
+
+ // key->text() returns the unicode sequence as a QString
+ m_outputString = DOM::DOMString(key->text());
+}
+
+SVGKeyEventImpl::SVGKeyEventImpl(SVGEvent::EventId _id,
+ bool canBubbleArg,
+ bool cancelableArg,
+ DOM::AbstractView &viewArg,
+ unsigned short detailArg,
+ DOM::DOMString &outputStringArg,
+ unsigned long keyValArg,
+ unsigned long virtKeyValArg,
+ bool inputGeneratedArg,
+ bool numPadArg)
+: SVGUIEventImpl(_id, canBubbleArg, cancelableArg, viewArg, detailArg)
+{
+ qKeyEvent = 0;
+ m_keyVal = keyValArg;
+ m_virtKeyVal = virtKeyValArg;
+ m_inputGenerated = inputGeneratedArg;
+ m_outputString = outputStringArg;
+ m_numPad = numPadArg;
+ m_modifier = 0;
+}
+
+SVGKeyEventImpl::~SVGKeyEventImpl()
+{
+ delete qKeyEvent;
+}
+
+bool SVGKeyEventImpl::checkModifier(unsigned long modifierArg)
+{
+ return ((m_modifier && modifierArg) == modifierArg);
+}
+
+void SVGKeyEventImpl::initKeyEvent(DOM::DOMString &typeArg,
+ bool canBubbleArg,
+ bool cancelableArg,
+ const DOM::AbstractView &viewArg,
+ long detailArg,
+ DOM::DOMString &outputStringArg,
+ unsigned long keyValArg,
+ unsigned long virtKeyValArg,
+ bool inputGeneratedArg,
+ bool numPadArg)
+{
+ SVGUIEventImpl::initUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg);
+
+ m_outputString = outputStringArg;
+ m_keyVal = keyValArg;
+ m_virtKeyVal = virtKeyValArg;
+ m_inputGenerated = inputGeneratedArg;
+ m_numPad = numPadArg;
+}
+
+void SVGKeyEventImpl::initModifier(unsigned long modifierArg, bool valueArg)
+{
+ if(valueArg)
+ m_modifier |= modifierArg;
+ else
+ m_modifier &= (modifierArg ^ 0xFFFFFFFF);
+}
+
+bool SVGKeyEventImpl::inputGenerated() const
+{
+ return m_inputGenerated;
+}
+
+unsigned long SVGKeyEventImpl::keyVal() const
+{
+ return m_keyVal;
+}
+
+DOM::DOMString SVGKeyEventImpl::outputString() const
+{
+ return m_outputString;
+}
+
+/*
+@namespace KSVG
+@begin SVGKeyEventImpl::s_hashTable 7
+ keyVal SVGKeyEventImpl::KeyVal DontDelete|ReadOnly
+ keyCode SVGKeyEventImpl::KeyVal DontDelete|ReadOnly
+ charCode SVGKeyEventImpl::KeyVal DontDelete|ReadOnly
+ outputString SVGKeyEventImpl::OutputString DontDelete|ReadOnly
+ virtKeyVal SVGKeyEventImpl::VirtKeyVal DontDelete|ReadOnly
+# todo visibleOutputGenerated numPad
+@end
+@namespace KSVG
+@begin SVGKeyEventImplProto::s_hashTable 7
+ checkModifier SVGKeyEventImpl::CheckModifier DontDelete|Function 1
+ getKeyCode SVGKeyEventImpl::GetKeyVal DontDelete|Function 0
+ getCharCode SVGKeyEventImpl::GetKeyVal DontDelete|Function 0
+ getKeyVal SVGKeyEventImpl::GetKeyVal DontDelete|Function 0
+ getCharCode SVGKeyEventImpl::GetCharCode DontDelete|Function 0
+# todo initModifier
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGKeyEvent", SVGKeyEventImplProto, SVGKeyEventImplProtoFunc)
+
+Value SVGKeyEventImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case KeyVal:
+ return Number(keyVal());
+ case VirtKeyVal:
+ return Number(virtKeyVal());
+ case OutputString:
+ return String(outputString());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+Value SVGKeyEventImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGKeyEventImpl)
+
+ switch(id)
+ {
+ case SVGKeyEventImpl::CheckModifier:
+ return Boolean((static_cast<KSVGBridge<SVGKeyEventImpl> *>(static_cast<ObjectImp *>(thisObj.imp()))->impl())->checkModifier(args[0].toUInt32(exec)));
+ case SVGKeyEventImpl::GetKeyVal:
+ case SVGKeyEventImpl::GetCharCode:
+ return Number((static_cast<KSVGBridge<SVGKeyEventImpl> *>(static_cast<ObjectImp *>(thisObj.imp()))->impl())->keyVal());
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+
+
+// -----------------------------------------------------------------------------
+
+SVGMouseEventImpl::SVGMouseEventImpl() : SVGUIEventImpl()
+{
+ m_screenX = 0;
+ m_screenY = 0;
+ m_clientX = 0;
+ m_clientY = 0;
+ m_ctrlKey = false;
+ m_altKey = false;
+ m_shiftKey = false;
+ m_metaKey = false;
+ m_button = 0;
+}
+
+SVGMouseEventImpl::SVGMouseEventImpl(SVGEvent::EventId _id,
+ bool canBubbleArg,
+ bool cancelableArg,
+ DOM::AbstractView &viewArg,
+ long detailArg,
+ long screenXArg,
+ long screenYArg,
+ long clientXArg,
+ long clientYArg,
+ bool ctrlKeyArg,
+ bool altKeyArg,
+ bool shiftKeyArg,
+ bool metaKeyArg,
+ unsigned short buttonArg,
+ SVGElementImpl *relatedTargetArg)
+: SVGUIEventImpl(_id, canBubbleArg, cancelableArg, viewArg, detailArg)
+{
+ m_screenX = screenXArg;
+ m_screenY = screenYArg;
+ m_clientX = clientXArg;
+ m_clientY = clientYArg;
+ m_ctrlKey = ctrlKeyArg;
+ m_altKey = altKeyArg;
+ m_shiftKey = shiftKeyArg;
+ m_metaKey = metaKeyArg;
+ m_button = buttonArg;
+ m_relatedTarget = relatedTargetArg;
+}
+
+SVGMouseEventImpl::~SVGMouseEventImpl()
+{
+}
+
+long SVGMouseEventImpl::screenX() const
+{
+ return m_screenX;
+}
+
+long SVGMouseEventImpl::screenY() const
+{
+ return m_screenY;
+}
+
+long SVGMouseEventImpl::clientX() const
+{
+ return m_clientX;
+}
+
+long SVGMouseEventImpl::clientY() const
+{
+ return m_clientY;
+}
+
+bool SVGMouseEventImpl::ctrlKey() const
+{
+ return m_ctrlKey;
+}
+
+bool SVGMouseEventImpl::shiftKey() const
+{
+ return m_shiftKey;
+}
+
+bool SVGMouseEventImpl::altKey() const
+{
+ return m_altKey;
+}
+
+bool SVGMouseEventImpl::metaKey() const
+{
+ return m_metaKey;
+}
+
+unsigned short SVGMouseEventImpl::button() const
+{
+ return m_button;
+}
+
+SVGElementImpl *SVGMouseEventImpl::relatedTarget() const
+{
+ return m_relatedTarget;
+}
+
+DOM::DOMString SVGMouseEventImpl::url() const
+{
+ return m_url;
+}
+
+void SVGMouseEventImpl::setURL(DOM::DOMString url)
+{
+ m_url = url;
+}
+
+void SVGMouseEventImpl::initMouseEvent(const DOM::DOMString &typeArg,
+ bool canBubbleArg,
+ bool cancelableArg,
+ const DOM::AbstractView &viewArg,
+ long detailArg,
+ long screenXArg,
+ long screenYArg,
+ long clientXArg,
+ long clientYArg,
+ bool ctrlKeyArg,
+ bool altKeyArg,
+ bool shiftKeyArg,
+ bool metaKeyArg,
+ unsigned short buttonArg,
+ SVGElementImpl *relatedTargetArg)
+{
+ SVGUIEventImpl::initUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg);
+
+ m_screenX = screenXArg;
+ m_screenY = screenYArg;
+ m_clientX = clientXArg;
+ m_clientY = clientYArg;
+ m_ctrlKey = ctrlKeyArg;
+ m_altKey = altKeyArg;
+ m_shiftKey = shiftKeyArg;
+ m_metaKey = metaKeyArg;
+ m_button = buttonArg;
+ m_relatedTarget = relatedTargetArg;
+}
+
+/*
+@namespace KSVG
+@begin SVGMouseEventImpl::s_hashTable 11
+ screenX SVGMouseEventImpl::ScreenX DontDelete|ReadOnly
+ screenY SVGMouseEventImpl::ScreenY DontDelete|ReadOnly
+ clientX SVGMouseEventImpl::ClientX DontDelete|ReadOnly
+ clientY SVGMouseEventImpl::ClientY DontDelete|ReadOnly
+ ctrlKey SVGMouseEventImpl::CtrlKey DontDelete|ReadOnly
+ shiftKey SVGMouseEventImpl::ShiftKey DontDelete|ReadOnly
+ altKey SVGMouseEventImpl::AltKey DontDelete|ReadOnly
+ metaKey SVGMouseEventImpl::MetaKey DontDelete|ReadOnly
+ button SVGMouseEventImpl::Button DontDelete|ReadOnly
+ relatedTarget SVGMouseEventImpl::RelatedTarget DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGMouseEventImplProto::s_hashTable 13
+ getScreenX SVGMouseEventImpl::GetScreenX DontDelete|Function 0
+ getScreenY SVGMouseEventImpl::GetScreenY DontDelete|Function 0
+ getClientX SVGMouseEventImpl::GetClientX DontDelete|Function 0
+ getClientY SVGMouseEventImpl::GetClientY DontDelete|Function 0
+ getCtrlKey SVGMouseEventImpl::GetCtrlKey DontDelete|Function 0
+ getShiftKey SVGMouseEventImpl::GetShiftKey DontDelete|Function 0
+ getAltKey SVGMouseEventImpl::GetAltKey DontDelete|Function 0
+ getMetaKey SVGMouseEventImpl::GetMetaKey DontDelete|Function 0
+ getButton SVGMouseEventImpl::GetButton DontDelete|Function 0
+ getRelatedTarget SVGMouseEventImpl::GetRelatedTarget DontDelete|Function 0
+ initMouseEvent SVGMouseEventImpl::InitMouseEvent DontDelete|Function 15
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGMouseEvent", SVGMouseEventImplProto, SVGMouseEventImplProtoFunc)
+
+Value SVGMouseEventImpl::getValueProperty(ExecState *exec, int token) const
+{
+ kdDebug(26004) << k_funcinfo << endl;
+ switch(token)
+ {
+ case ScreenX:
+ return Number(screenX());
+ case ScreenY:
+ return Number(screenY());
+ case ClientX:
+ return Number(clientX());
+ case ClientY:
+ return Number(clientY());
+ case CtrlKey:
+ return Number(ctrlKey());
+ case ShiftKey:
+ return Number(shiftKey());
+ case AltKey:
+ return Number(altKey());
+ case MetaKey:
+ return Number(metaKey());
+ case Button:
+ return Number(button());
+ case RelatedTarget:
+ return getDOMNode(exec, *relatedTarget());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return KJS::Undefined();
+ }
+}
+
+Value SVGMouseEventImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &)
+{
+ kdDebug(26004) << k_funcinfo << endl;
+ KSVG_CHECK_THIS(SVGMouseEventImpl)
+
+ switch(id)
+ {
+ case SVGMouseEventImpl::GetScreenX:
+ return Number(obj->screenX());
+ case SVGMouseEventImpl::GetScreenY:
+ return Number(obj->screenY());
+ case SVGMouseEventImpl::GetClientX:
+ return Number(obj->clientX());
+ case SVGMouseEventImpl::GetClientY:
+ return Number(obj->clientY());
+ case SVGMouseEventImpl::GetCtrlKey:
+ return Number(obj->ctrlKey());
+ case SVGMouseEventImpl::GetShiftKey:
+ return Number(obj->shiftKey());
+ case SVGMouseEventImpl::GetAltKey:
+ return Number(obj->altKey());
+ case SVGMouseEventImpl::GetMetaKey:
+ return Number(obj->metaKey());
+ case SVGMouseEventImpl::GetButton:
+ return Number(obj->button());
+ case SVGMouseEventImpl::GetRelatedTarget:
+ return getDOMNode(exec, *obj->relatedTarget());
+// case SVGMouseEventImpl::InitMouseEvent: // TODO
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+
+
+
+SVGMutationEventImpl::SVGMutationEventImpl() : SVGEventImpl()
+{
+ m_attrChange = 0;
+}
+
+SVGMutationEventImpl::SVGMutationEventImpl(SVGEvent::EventId _id,
+ bool canBubbleArg,
+ bool cancelableArg,
+ SVGElementImpl *relatedNodeArg,
+ const DOM::DOMString &prevValueArg,
+ const DOM::DOMString &newValueArg,
+ const DOM::DOMString &attrNameArg,
+ unsigned short attrChangeArg)
+: SVGEventImpl(_id, canBubbleArg, cancelableArg)
+{
+ m_relatedNode = relatedNodeArg;
+ m_prevValue = prevValueArg.implementation();
+ m_newValue = newValueArg.implementation();
+ m_attrName = attrNameArg.implementation();
+ m_attrChange = attrChangeArg;
+}
+
+SVGMutationEventImpl::~SVGMutationEventImpl()
+{
+}
+
+SVGElementImpl *SVGMutationEventImpl::relatedNode() const
+{
+ return m_relatedNode;
+}
+
+DOM::DOMString SVGMutationEventImpl::prevValue() const
+{
+ return m_prevValue;
+}
+
+DOM::DOMString SVGMutationEventImpl::newValue() const
+{
+ return m_newValue;
+}
+
+DOM::DOMString SVGMutationEventImpl::attrName() const
+{
+ return m_attrName;
+}
+
+unsigned short SVGMutationEventImpl::attrChange() const
+{
+ return m_attrChange;
+}
+
+void SVGMutationEventImpl::initMutationEvent(const DOM::DOMString &typeArg,
+ bool canBubbleArg,
+ bool cancelableArg,
+ SVGElementImpl *relatedNodeArg,
+ const DOM::DOMString &prevValueArg,
+ const DOM::DOMString &newValueArg,
+ const DOM::DOMString &attrNameArg,
+ unsigned short attrChangeArg)
+{
+ SVGEventImpl::initEvent(typeArg, canBubbleArg, cancelableArg);
+
+ m_relatedNode = relatedNodeArg;
+ m_prevValue = prevValueArg.implementation();
+ m_newValue = newValueArg.implementation();
+ m_attrName = attrNameArg.implementation();
+ m_attrChange = attrChangeArg;
+}
+
+
+
+
+
+SVGRegisteredEventListener::SVGRegisteredEventListener(SVGEvent::EventId _id, SVGEventListener *_listener, bool _useCapture)
+{
+ id = _id;
+ listener = _listener;
+ useCapture = _useCapture;
+
+ listener->ref();
+}
+
+SVGRegisteredEventListener::~SVGRegisteredEventListener()
+{
+ listener->deref();
+}
+
+bool SVGRegisteredEventListener::operator==(const SVGRegisteredEventListener &other)
+{
+ return (id == other.id &&
+ listener == other.listener &&
+ useCapture == other.useCapture);
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGEventImpl.h b/ksvg/impl/SVGEventImpl.h
new file mode 100644
index 00000000..a123b09e
--- /dev/null
+++ b/ksvg/impl/SVGEventImpl.h
@@ -0,0 +1,468 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ This file is part of the KDE project
+
+ Additional copyright:
+ (C) 2001 Peter Kelly <pmk@post.com>
+ (C) 2001 Tobias Anton <anton@stud.fbi.fh-darmstadt.de>
+
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGEventImpl_H
+#define SVGEventImpl_H
+
+#include <qevent.h>
+#include <qdatetime.h>
+
+#include <dom/dom_misc.h>
+#include <dom/dom_node.h>
+#include <dom/dom2_views.h>
+#include <dom/dom_string.h>
+
+#include "SVGEvent.h"
+#include "SVGElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+// @ecma-checked 07/07/02@
+class SVGEventImpl : public DOM::DomShared
+{
+public:
+ SVGEventImpl();
+ SVGEventImpl(SVGEvent::EventId _id, bool canBubbleArg, bool cancelableArg);
+ virtual ~SVGEventImpl();
+
+ SVGEvent::EventId id() { return m_id; }
+
+ DOM::DOMString type() const;
+
+ SVGElementImpl *target() const;
+ void setTarget(SVGElementImpl *_target);
+
+ SVGElementImpl *currentTarget() const;
+ void setCurrentTarget(SVGElementImpl *_currentTarget);
+
+ unsigned short eventPhase() const;
+ void setEventPhase(unsigned short _eventPhase);
+
+ bool bubbles() const;
+ bool cancelable() const;
+
+ DOM::DOMTimeStamp timeStamp();
+
+ void stopPropagation();
+ void preventDefault();
+ void initEvent(const DOM::DOMString &eventTypeArg, bool canBubbleArg, bool cancelableArg);
+
+ virtual bool isUIEvent() { return false; }
+ virtual bool isMouseEvent() { return false; }
+ virtual bool isMutationEvent() { return false; }
+ virtual bool isKeyEvent() { return false; }
+
+ virtual DOM::DOMString eventModuleName() { return ""; }
+
+ virtual bool propagationStopped() { return m_propagationStopped; }
+ virtual bool defaultPrevented() { return m_defaultPrevented; }
+
+ void setDefaultHandled();
+ bool defaultHandled() const { return m_defaultHandled; }
+
+protected:
+ DOM::DOMString m_type;
+ bool m_canBubble;
+ bool m_cancelable;
+
+ bool m_propagationStopped;
+ bool m_defaultPrevented;
+ bool m_defaultHandled;
+
+ SVGEvent::EventId m_id;
+ SVGElementImpl *m_currentTarget;
+ SVGElementImpl *m_target;
+
+ unsigned short m_eventPhase;
+ QDateTime m_createTime;
+
+public:
+ KSVG_BASECLASS_GET
+
+ enum
+ {
+ // Properties
+ Type, Target, CurrentTarget, EventPhase,
+ Bubbles, Cancelable, TimeStamp,
+ // Functions
+ GetType, GetTarget, GetCurrentTarget, GetEventPhase,
+ GetBubbles, GetCancelable, GetTimeStamp,
+ StopPropagation, PreventDefault, InitEvent,
+ GetCurrentNode // Out-Of-Spec
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+class SVGEventListener : public DOM::DomShared
+{
+public:
+ SVGEventListener() { }
+ virtual ~SVGEventListener() { }
+
+ virtual void handleEvent(SVGEventImpl *) { }
+ virtual DOM::DOMString eventListenerType() { return ""; }
+};
+
+// @ecma-checked 07/07/02@
+class SVGUIEventImpl : public SVGEventImpl
+{
+public:
+ SVGUIEventImpl();
+ SVGUIEventImpl(SVGEvent::EventId _id,
+ bool canBubbleArg,
+ bool cancelableArg,
+ DOM::AbstractView &viewArg,
+ long detailArg);
+
+ virtual ~SVGUIEventImpl();
+
+ DOM::AbstractView view() const;
+ long detail() const;
+
+ void initUIEvent(const DOM::DOMString &typeArg,
+ bool canBubbleArg,
+ bool cancelableArg,
+ const DOM::AbstractView &viewArg,
+ long detailArg);
+
+ virtual bool isUIEvent() { return true; }
+ virtual DOM::DOMString eventModuleName() { return "UIEvents"; }
+
+protected:
+ DOM::AbstractView m_view;
+ long m_detail;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ View, Detail,
+ // Functions
+ GetView, GetDetail, InitUIEvent
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+// @ecma-checked 07/07/02@
+// Introduced in DOM Level 2: - internal
+class SVGMouseEventImpl : public SVGUIEventImpl
+{
+public:
+ SVGMouseEventImpl();
+ SVGMouseEventImpl(SVGEvent::EventId _id,
+ bool canBubbleArg,
+ bool cancelableArg,
+ DOM::AbstractView &viewArg,
+ long detailArg,
+ long screenXArg,
+ long screenYArg,
+ long clientXArg,
+ long clientYArg,
+ bool ctrlKeyArg,
+ bool altKeyArg,
+ bool shiftKeyArg,
+ bool metaKeyArg,
+ unsigned short buttonArg,
+ SVGElementImpl *relatedTargetArg);
+
+ virtual ~SVGMouseEventImpl();
+
+ long screenX() const;
+ long screenY() const;
+ long clientX() const;
+ long clientY() const;
+ bool ctrlKey() const;
+ bool shiftKey() const;
+ bool altKey() const;
+ bool metaKey() const;
+
+ unsigned short button() const;
+
+ SVGElementImpl *relatedTarget() const;
+
+ void initMouseEvent(const DOM::DOMString &typeArg,
+ bool canBubbleArg,
+ bool cancelableArg,
+ const DOM::AbstractView &viewArg,
+ long detailArg,
+ long screenXArg,
+ long screenYArg,
+ long clientXArg,
+ long clientYArg,
+ bool ctrlKeyArg,
+ bool altKeyArg,
+ bool shiftKeyArg,
+ bool metaKeyArg,
+ unsigned short buttonArg,
+ SVGElementImpl *relatedTargetArg);
+
+ virtual bool isMouseEvent() { return true; }
+ virtual DOM::DOMString eventModuleName() { return "MouseEvents"; }
+
+ // KSVG extensions
+ DOM::DOMString url() const;
+ void setURL(DOM::DOMString url);
+
+protected:
+ long m_screenX;
+ long m_screenY;
+ long m_clientX;
+ long m_clientY;
+ bool m_ctrlKey;
+ bool m_altKey;
+ bool m_shiftKey;
+ bool m_metaKey;
+ unsigned short m_button;
+ SVGElementImpl *m_relatedTarget;
+
+ // KSVG extension
+ DOM::DOMString m_url;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ ScreenX, ScreenY, ClientX, ClientY, CtrlKey,
+ ShiftKey, AltKey, MetaKey, Button, RelatedTarget,
+ // Functions
+ GetScreenX, GetScreenY, GetClientX, GetClientY, GetCtrlKey,
+ GetShiftKey, GetAltKey, GetMetaKey, GetButton, GetRelatedTarget,
+ InitMouseEvent
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+class SVGKeyEventImpl : public SVGUIEventImpl
+{
+public:
+ SVGKeyEventImpl();
+ SVGKeyEventImpl(SVGEvent::EventId _id,
+ bool canBubbleArg,
+ bool cancelableArg,
+ DOM::AbstractView &viewArg,
+ unsigned short detailArg,
+ DOM::DOMString &outputStringArg,
+ unsigned long keyValArg,
+ unsigned long virtKeyValArg,
+ bool inputGeneratedArg,
+ bool numPadArg);
+
+ SVGKeyEventImpl(QKeyEvent *key, DOM::AbstractView &view, SVGEvent::EventId _id);
+
+ virtual bool isKeyEvent() { return true; }
+
+ virtual ~SVGKeyEventImpl();
+
+ enum KeyCodes
+ {
+ DOM_VK_UNDEFINED = 0x0,
+ DOM_VK_RIGHT_ALT = 0x01,
+ DOM_VK_LEFT_ALT = 0x02,
+ DOM_VK_LEFT_CONTROL = 0x03,
+ DOM_VK_RIGHT_CONTROL = 0x04,
+ DOM_VK_LEFT_SHIFT = 0x05,
+ DOM_VK_RIGHT_SHIFT = 0x06,
+ DOM_VK_LEFT_META = 0x07,
+ DOM_VK_RIGHT_META = 0x08,
+ DOM_VK_CAPS_LOCK = 0x09,
+ DOM_VK_DELETE = 0x0A,
+ DOM_VK_END = 0x0B,
+ DOM_VK_ENTER = 0x0C,
+ DOM_VK_ESCAPE = 0x0D,
+ DOM_VK_HOME = 0x0E,
+ DOM_VK_INSERT = 0x0F,
+ DOM_VK_NUM_LOCK = 0x10,
+ DOM_VK_PAUSE = 0x11,
+ DOM_VK_PRINTSCREEN = 0x12,
+ DOM_VK_SCROLL_LOCK = 0x13,
+ DOM_VK_LEFT = 0x14,
+ DOM_VK_RIGHT = 0x15,
+ DOM_VK_UP = 0x16,
+ DOM_VK_DOWN = 0x17,
+ DOM_VK_PAGE_DOWN = 0x18,
+ DOM_VK_PAGE_UP = 0x19,
+ DOM_VK_F1 = 0x1A,
+ DOM_VK_F2 = 0x1B,
+ DOM_VK_F3 = 0x1C,
+ DOM_VK_F4 = 0x1D,
+ DOM_VK_F5 = 0x1E,
+ DOM_VK_F6 = 0x1F,
+ DOM_VK_F7 = 0x20,
+ DOM_VK_F8 = 0x21,
+ DOM_VK_F9 = 0x22,
+ DOM_VK_F10 = 0x23,
+ DOM_VK_F11 = 0x24,
+ DOM_VK_F12 = 0x25,
+ DOM_VK_F13 = 0x26,
+ DOM_VK_F14 = 0x27,
+ DOM_VK_F15 = 0x28,
+ DOM_VK_F16 = 0x29,
+ DOM_VK_F17 = 0x2A,
+ DOM_VK_F18 = 0x2B,
+ DOM_VK_F19 = 0x2C,
+ DOM_VK_F20 = 0x2D,
+ DOM_VK_F21 = 0x2E,
+ DOM_VK_F22 = 0x2F,
+ DOM_VK_F23 = 0x30,
+ DOM_VK_F24 = 0x31
+ };
+
+
+ bool checkModifier(unsigned long modiferArg);
+
+ void initKeyEvent(DOM::DOMString &typeArg,
+ bool canBubbleArg,
+ bool cancelableArg,
+ const DOM::AbstractView &viewArg,
+ long detailArg,
+ DOM::DOMString &outputStringArg,
+ unsigned long keyValArg,
+ unsigned long virtKeyValArg,
+ bool inputGeneratedArg,
+ bool numPadArg);
+
+ void initModifier(unsigned long modifierArg, bool valueArg);
+
+ bool inputGenerated() const;
+
+ unsigned long keyVal() const;
+
+ bool numPad() const { return m_numPad; }
+ DOM::DOMString outputString() const;
+
+ unsigned long virtKeyVal() const { return m_virtKeyVal; }
+
+ QKeyEvent *qKeyEvent;
+
+private:
+ unsigned long m_keyVal;
+ unsigned long m_virtKeyVal;
+ bool m_inputGenerated;
+ DOM::DOMString m_outputString;
+ bool m_numPad;
+
+ // bitfield containing state of modifiers. not part of the dom.
+ unsigned long m_modifier;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ KeyVal, VirtKeyVal, OutputString,
+ // Functions
+ CheckModifier, GetKeyVal, GetCharCode
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+class SVGMutationEventImpl : public SVGEventImpl
+{
+public:
+ SVGMutationEventImpl();
+ SVGMutationEventImpl(SVGEvent::EventId _id,
+ bool canBubbleArg,
+ bool cancelableArg,
+ SVGElementImpl *relatedNodeArg,
+ const DOM::DOMString &prevValueArg,
+ const DOM::DOMString &newValueArg,
+ const DOM::DOMString &attrNameArg,
+ unsigned short attrChangeArg);
+ ~SVGMutationEventImpl();
+
+ SVGElementImpl *relatedNode() const;
+ DOM::DOMString prevValue() const;
+ DOM::DOMString newValue() const;
+ DOM::DOMString attrName() const;
+ unsigned short attrChange() const;
+
+ void initMutationEvent(const DOM::DOMString &typeArg,
+ bool canBubbleArg,
+ bool cancelableArg,
+ SVGElementImpl *relatedNodeArg,
+ const DOM::DOMString &prevValueArg,
+ const DOM::DOMString &newValueArg,
+ const DOM::DOMString &attrNameArg,
+ unsigned short attrChangeArg);
+
+ virtual bool isMutationEvent() { return true; }
+ virtual DOM::DOMString eventModuleName() { return "MutationEvents"; }
+
+protected:
+ SVGElementImpl *m_relatedNode;
+ DOM::DOMString m_prevValue;
+ DOM::DOMString m_newValue;
+ DOM::DOMString m_attrName;
+ unsigned short m_attrChange;
+
+public:
+ KSVG_FORWARDGET
+};
+
+class SVGRegisteredEventListener
+{
+public:
+ SVGRegisteredEventListener(SVGEvent::EventId _id, SVGEventListener *_listener, bool _useCapture);
+ ~SVGRegisteredEventListener();
+
+ bool operator==(const SVGRegisteredEventListener &other);
+
+ SVGEvent::EventId id;
+ SVGEventListener *listener;
+ bool useCapture;
+
+private:
+ SVGRegisteredEventListener(const SVGRegisteredEventListener &);
+ SVGRegisteredEventListener &operator=(const SVGRegisteredEventListener &);
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGEventImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGEventImplProtoFunc, SVGEventImpl)
+
+KSVG_DEFINE_PROTOTYPE(SVGUIEventImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGUIEventImplProtoFunc, SVGUIEventImpl)
+
+KSVG_DEFINE_PROTOTYPE(SVGMouseEventImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGMouseEventImplProtoFunc, SVGMouseEventImpl)
+
+KSVG_DEFINE_PROTOTYPE(SVGKeyEventImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGKeyEventImplProtoFunc, SVGKeyEventImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGExternalResourcesRequiredImpl.cc b/ksvg/impl/SVGExternalResourcesRequiredImpl.cc
new file mode 100644
index 00000000..90fd9141
--- /dev/null
+++ b/ksvg/impl/SVGExternalResourcesRequiredImpl.cc
@@ -0,0 +1,88 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGAnimatedBooleanImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+using namespace KSVG;
+
+#include "SVGExternalResourcesRequiredImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGExternalResourcesRequiredImpl::SVGExternalResourcesRequiredImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_externalResourcesRequired = new SVGAnimatedBooleanImpl();
+ m_externalResourcesRequired->ref();
+}
+
+SVGExternalResourcesRequiredImpl::~SVGExternalResourcesRequiredImpl()
+{
+ if(m_externalResourcesRequired)
+ m_externalResourcesRequired->deref();
+}
+
+SVGAnimatedBooleanImpl *SVGExternalResourcesRequiredImpl::externalResourcesRequired() const
+{
+ return m_externalResourcesRequired;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGExternalResourcesRequiredImpl::s_hashTable 2
+ externalResourcesRequired SVGExternalResourcesRequiredImpl::ExternalResourcesRequired DontDelete|ReadOnly
+@end
+*/
+
+Value SVGExternalResourcesRequiredImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case ExternalResourcesRequired:
+ return m_externalResourcesRequired->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGExternalResourcesRequiredImpl::putValueProperty(ExecState *exec, int token, const KJS::Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+ switch(token)
+ {
+ case ExternalResourcesRequired:
+ m_externalResourcesRequired->setBaseVal(value.toBoolean(exec));
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGExternalResourcesRequiredImpl.h b/ksvg/impl/SVGExternalResourcesRequiredImpl.h
new file mode 100644
index 00000000..9c5b93eb
--- /dev/null
+++ b/ksvg/impl/SVGExternalResourcesRequiredImpl.h
@@ -0,0 +1,59 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGExternalResourcesRequiredImpl_H
+#define SVGExternalResourcesRequiredImpl_H
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedBooleanImpl;
+class SVGExternalResourcesRequiredImpl
+{
+public:
+ SVGExternalResourcesRequiredImpl();
+ ~SVGExternalResourcesRequiredImpl();
+
+ SVGAnimatedBooleanImpl *externalResourcesRequired() const;
+
+private:
+ SVGAnimatedBooleanImpl *m_externalResourcesRequired;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ ExternalResourcesRequired
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEBlendElementImpl.cc b/ksvg/impl/SVGFEBlendElementImpl.cc
new file mode 100644
index 00000000..8b29cad5
--- /dev/null
+++ b/ksvg/impl/SVGFEBlendElementImpl.cc
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFEBlendElementImpl.h"
+#include "SVGAnimatedStringImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+
+using namespace KSVG;
+
+SVGFEBlendElementImpl::SVGFEBlendElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+
+ m_in2 = new SVGAnimatedStringImpl();
+ m_in2->ref();
+
+ m_mode = new SVGAnimatedEnumerationImpl();
+ m_mode->ref();
+}
+
+SVGFEBlendElementImpl::~SVGFEBlendElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+ if(m_in2)
+ m_in2->deref();
+ if(m_mode)
+ m_mode->deref();
+}
+
+SVGAnimatedStringImpl *SVGFEBlendElementImpl::in1() const
+{
+ return m_in1;
+}
+
+SVGAnimatedStringImpl *SVGFEBlendElementImpl::in2() const
+{
+ return m_in2;
+}
+
+SVGAnimatedEnumerationImpl *SVGFEBlendElementImpl::mode() const
+{
+ return m_mode;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEBlendElementImpl.h b/ksvg/impl/SVGFEBlendElementImpl.h
new file mode 100644
index 00000000..36aab059
--- /dev/null
+++ b/ksvg/impl/SVGFEBlendElementImpl.h
@@ -0,0 +1,59 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEBlendElementImpl_H
+#define SVGFEBlendElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGFEBlendElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEBlendElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEBlendElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+ SVGAnimatedStringImpl *in2() const;
+ SVGAnimatedEnumerationImpl *mode() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+ SVGAnimatedStringImpl *m_in2;
+ SVGAnimatedEnumerationImpl *m_mode;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEColorMatrixElementImpl.cc b/ksvg/impl/SVGFEColorMatrixElementImpl.cc
new file mode 100644
index 00000000..14c68a56
--- /dev/null
+++ b/ksvg/impl/SVGFEColorMatrixElementImpl.cc
@@ -0,0 +1,65 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedStringImpl.h"
+#include "SVGAnimatedNumberListImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGFEColorMatrixElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEColorMatrixElementImpl::SVGFEColorMatrixElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+
+ m_type = new SVGAnimatedEnumerationImpl();
+ m_type->ref();
+
+ m_values = new SVGAnimatedNumberListImpl();
+ m_values->ref();
+}
+
+SVGFEColorMatrixElementImpl::~SVGFEColorMatrixElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+ if(m_type)
+ m_type->deref();
+ if(m_values)
+ m_values->deref();
+}
+
+SVGAnimatedStringImpl *SVGFEColorMatrixElementImpl::in1() const
+{
+ return m_in1;
+}
+
+SVGAnimatedEnumerationImpl *SVGFEColorMatrixElementImpl::type() const
+{
+ return m_type;
+}
+
+SVGAnimatedNumberListImpl *SVGFEColorMatrixElementImpl::values() const
+{
+ return m_values;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEColorMatrixElementImpl.h b/ksvg/impl/SVGFEColorMatrixElementImpl.h
new file mode 100644
index 00000000..b637690b
--- /dev/null
+++ b/ksvg/impl/SVGFEColorMatrixElementImpl.h
@@ -0,0 +1,60 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEColorMatrixElementImpl_H
+#define SVGFEColorMatrixElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGAnimatedNumberListImpl;
+class SVGFEColorMatrixElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEColorMatrixElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEColorMatrixElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+ SVGAnimatedEnumerationImpl *type() const;
+ SVGAnimatedNumberListImpl *values() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+ SVGAnimatedEnumerationImpl *m_type;
+ SVGAnimatedNumberListImpl *m_values;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEComponentTransferElementImpl.cc b/ksvg/impl/SVGFEComponentTransferElementImpl.cc
new file mode 100644
index 00000000..71ee4629
--- /dev/null
+++ b/ksvg/impl/SVGFEComponentTransferElementImpl.cc
@@ -0,0 +1,43 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedStringImpl.h"
+#include "SVGFEComponentTransferElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEComponentTransferElementImpl::SVGFEComponentTransferElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+}
+
+SVGFEComponentTransferElementImpl::~SVGFEComponentTransferElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+}
+
+SVGAnimatedStringImpl *SVGFEComponentTransferElementImpl::in1() const
+{
+ return m_in1;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEComponentTransferElementImpl.h b/ksvg/impl/SVGFEComponentTransferElementImpl.h
new file mode 100644
index 00000000..21c0fd88
--- /dev/null
+++ b/ksvg/impl/SVGFEComponentTransferElementImpl.h
@@ -0,0 +1,54 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEComponentTransferElementImpl_H
+#define SVGFEComponentTransferElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGFEComponentTransferElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEComponentTransferElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEComponentTransferElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFECompositeElementImpl.cc b/ksvg/impl/SVGFECompositeElementImpl.cc
new file mode 100644
index 00000000..e8b91b95
--- /dev/null
+++ b/ksvg/impl/SVGFECompositeElementImpl.cc
@@ -0,0 +1,105 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGAnimatedStringImpl.h"
+#include "SVGFECompositeElementImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+
+using namespace KSVG;
+
+SVGFECompositeElementImpl::SVGFECompositeElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+
+ m_in2 = new SVGAnimatedStringImpl();
+ m_in2->ref();
+
+ m_operator = new SVGAnimatedEnumerationImpl();
+ m_operator->ref();
+
+ m_k1 = new SVGAnimatedNumberImpl();
+ m_k1->ref();
+
+ m_k2 = new SVGAnimatedNumberImpl();
+ m_k2->ref();
+
+ m_k3 = new SVGAnimatedNumberImpl();
+ m_k3->ref();
+
+ m_k4 = new SVGAnimatedNumberImpl();
+ m_k4->ref();
+}
+
+SVGFECompositeElementImpl::~SVGFECompositeElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+ if(m_in2)
+ m_in2->deref();
+ if(m_operator)
+ m_operator->deref();
+ if(m_k1)
+ m_k1->deref();
+ if(m_k2)
+ m_k2->deref();
+ if(m_k3)
+ m_k3->deref();
+ if(m_k4)
+ m_k4->deref();
+}
+
+SVGAnimatedStringImpl *SVGFECompositeElementImpl::in1() const
+{
+ return m_in1;
+}
+
+SVGAnimatedStringImpl *SVGFECompositeElementImpl::in2() const
+{
+ return m_in2;
+}
+
+SVGAnimatedEnumerationImpl *SVGFECompositeElementImpl::Operator() const
+{
+ return m_operator;
+}
+
+SVGAnimatedNumberImpl *SVGFECompositeElementImpl::k1() const
+{
+ return m_k1;
+}
+
+SVGAnimatedNumberImpl *SVGFECompositeElementImpl::k2() const
+{
+ return m_k2;
+}
+
+SVGAnimatedNumberImpl *SVGFECompositeElementImpl::k3() const
+{
+ return m_k3;
+}
+
+SVGAnimatedNumberImpl *SVGFECompositeElementImpl::k4() const
+{
+ return m_k4;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFECompositeElementImpl.h b/ksvg/impl/SVGFECompositeElementImpl.h
new file mode 100644
index 00000000..10796ec1
--- /dev/null
+++ b/ksvg/impl/SVGFECompositeElementImpl.h
@@ -0,0 +1,68 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFECompositeElementImpl_H
+#define SVGFECompositeElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGAnimatedNumberImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGFECompositeElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFECompositeElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFECompositeElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+ SVGAnimatedStringImpl *in2() const;
+ SVGAnimatedEnumerationImpl *Operator() const;
+ SVGAnimatedNumberImpl *k1() const;
+ SVGAnimatedNumberImpl *k2() const;
+ SVGAnimatedNumberImpl *k3() const;
+ SVGAnimatedNumberImpl *k4() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+ SVGAnimatedStringImpl *m_in2;
+ SVGAnimatedEnumerationImpl *m_operator;
+ SVGAnimatedNumberImpl *m_k1;
+ SVGAnimatedNumberImpl *m_k2;
+ SVGAnimatedNumberImpl *m_k3;
+ SVGAnimatedNumberImpl *m_k4;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEConvolveMatrixElementImpl.cc b/ksvg/impl/SVGFEConvolveMatrixElementImpl.cc
new file mode 100644
index 00000000..88eb00ee
--- /dev/null
+++ b/ksvg/impl/SVGFEConvolveMatrixElementImpl.cc
@@ -0,0 +1,149 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGAnimatedIntegerImpl.h"
+#include "SVGAnimatedBooleanImpl.h"
+#include "SVGAnimatedIntegerImpl.h"
+#include "SVGAnimatedNumberListImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGFEConvolveMatrixElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEConvolveMatrixElementImpl::SVGFEConvolveMatrixElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_orderX = new SVGAnimatedIntegerImpl();
+ m_orderX->ref();
+
+ m_orderY = new SVGAnimatedIntegerImpl();
+ m_orderY->ref();
+
+ m_kernelMatrix = new SVGAnimatedNumberListImpl();
+ m_kernelMatrix->ref();
+
+ m_divisor = new SVGAnimatedNumberImpl();
+ m_divisor->ref();
+
+ m_bias = new SVGAnimatedNumberImpl();
+ m_bias->ref();
+
+ m_targetX = new SVGAnimatedIntegerImpl();
+ m_targetX->ref();
+
+ m_targetY = new SVGAnimatedIntegerImpl();
+ m_targetY->ref();
+
+ m_edgeMode = new SVGAnimatedEnumerationImpl();
+ m_edgeMode->ref();
+
+ m_kernelUnitLengthX = new SVGAnimatedLengthImpl();
+ m_kernelUnitLengthX->ref();
+
+ m_kernelUnitLengthY = new SVGAnimatedLengthImpl();
+ m_kernelUnitLengthY->ref();
+
+ m_preserveAlpha = new SVGAnimatedBooleanImpl();
+ m_preserveAlpha->ref();
+}
+
+SVGFEConvolveMatrixElementImpl::~SVGFEConvolveMatrixElementImpl()
+{
+ if(m_orderX)
+ m_orderX->deref();
+ if(m_orderY)
+ m_orderY->deref();
+ if(m_kernelMatrix)
+ m_kernelMatrix->deref();
+ if(m_divisor)
+ m_divisor->deref();
+ if(m_bias)
+ m_bias->deref();
+ if(m_targetX)
+ m_targetX->deref();
+ if(m_targetY)
+ m_targetY->deref();
+ if(m_edgeMode)
+ m_edgeMode->deref();
+ if(m_kernelUnitLengthX)
+ m_kernelUnitLengthX->deref();
+ if(m_kernelUnitLengthY)
+ m_kernelUnitLengthY->deref();
+ if(m_preserveAlpha)
+ m_preserveAlpha->deref();
+}
+
+SVGAnimatedIntegerImpl *SVGFEConvolveMatrixElementImpl::orderX() const
+{
+ return m_orderX;
+}
+
+SVGAnimatedIntegerImpl *SVGFEConvolveMatrixElementImpl::orderY() const
+{
+ return m_orderY;
+}
+
+SVGAnimatedNumberListImpl *SVGFEConvolveMatrixElementImpl::kernelMatrix() const
+{
+ return m_kernelMatrix;
+}
+
+SVGAnimatedNumberImpl *SVGFEConvolveMatrixElementImpl::divisor() const
+{
+ return m_divisor;
+}
+
+SVGAnimatedNumberImpl *SVGFEConvolveMatrixElementImpl::bias() const
+{
+ return m_bias;
+}
+
+SVGAnimatedIntegerImpl *SVGFEConvolveMatrixElementImpl::targetX() const
+{
+ return m_targetX;
+}
+
+SVGAnimatedIntegerImpl *SVGFEConvolveMatrixElementImpl::targetY() const
+{
+ return m_targetY;
+}
+
+SVGAnimatedEnumerationImpl *SVGFEConvolveMatrixElementImpl::edgeMode() const
+{
+ return m_edgeMode;
+}
+
+SVGAnimatedLengthImpl *SVGFEConvolveMatrixElementImpl::kernelUnitLengthX() const
+{
+ return m_kernelUnitLengthX;
+}
+
+SVGAnimatedLengthImpl *SVGFEConvolveMatrixElementImpl::kernelUnitLengthY() const
+{
+ return m_kernelUnitLengthY;
+}
+
+SVGAnimatedBooleanImpl *SVGFEConvolveMatrixElementImpl::preserveAlpha() const
+{
+ return m_preserveAlpha;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEConvolveMatrixElementImpl.h b/ksvg/impl/SVGFEConvolveMatrixElementImpl.h
new file mode 100644
index 00000000..e26518d5
--- /dev/null
+++ b/ksvg/impl/SVGFEConvolveMatrixElementImpl.h
@@ -0,0 +1,80 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEConvolveMatrixElementImpl_H
+#define SVGFEConvolveMatrixElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedNumberImpl;
+class SVGAnimatedLengthImpl;
+class SVGAnimatedIntegerImpl;
+class SVGAnimatedIntegerImpl;
+class SVGAnimatedBooleanImpl;
+class SVGAnimatedNumberListImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGFEConvolveMatrixElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEConvolveMatrixElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEConvolveMatrixElementImpl();
+
+ SVGAnimatedIntegerImpl *orderX() const;
+ SVGAnimatedIntegerImpl *orderY() const;
+ SVGAnimatedNumberListImpl *kernelMatrix() const;
+ SVGAnimatedNumberImpl *divisor() const;
+ SVGAnimatedNumberImpl *bias() const;
+ SVGAnimatedIntegerImpl *targetX() const;
+ SVGAnimatedIntegerImpl *targetY() const;
+ SVGAnimatedEnumerationImpl *edgeMode() const;
+ SVGAnimatedLengthImpl *kernelUnitLengthX() const;
+ SVGAnimatedLengthImpl *kernelUnitLengthY() const;
+ SVGAnimatedBooleanImpl *preserveAlpha() const;
+
+private:
+ SVGAnimatedIntegerImpl *m_orderX;
+ SVGAnimatedIntegerImpl *m_orderY;
+ SVGAnimatedNumberListImpl *m_kernelMatrix;
+ SVGAnimatedNumberImpl *m_divisor;
+ SVGAnimatedNumberImpl *m_bias;
+ SVGAnimatedIntegerImpl *m_targetX;
+ SVGAnimatedIntegerImpl *m_targetY;
+ SVGAnimatedEnumerationImpl *m_edgeMode;
+ SVGAnimatedLengthImpl *m_kernelUnitLengthX;
+ SVGAnimatedLengthImpl *m_kernelUnitLengthY;
+ SVGAnimatedBooleanImpl *m_preserveAlpha;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEDiffuseLightingElementImpl.cc b/ksvg/impl/SVGFEDiffuseLightingElementImpl.cc
new file mode 100644
index 00000000..0b5c2565
--- /dev/null
+++ b/ksvg/impl/SVGFEDiffuseLightingElementImpl.cc
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedStringImpl.h"
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGFEDiffuseLightingElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEDiffuseLightingElementImpl::SVGFEDiffuseLightingElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+
+ m_surfaceScale = new SVGAnimatedNumberImpl();
+ m_surfaceScale->ref();
+
+ m_diffuseConstant = new SVGAnimatedNumberImpl();
+ m_diffuseConstant->ref();
+}
+
+SVGFEDiffuseLightingElementImpl::~SVGFEDiffuseLightingElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+ if(m_surfaceScale)
+ m_surfaceScale->deref();
+ if(m_diffuseConstant)
+ m_diffuseConstant->deref();
+}
+
+SVGAnimatedStringImpl *SVGFEDiffuseLightingElementImpl::in1() const
+{
+ return m_in1;
+}
+
+SVGAnimatedNumberImpl *SVGFEDiffuseLightingElementImpl::surfaceScale() const
+{
+ return m_surfaceScale;
+}
+
+SVGAnimatedNumberImpl *SVGFEDiffuseLightingElementImpl::diffuseConstant() const
+{
+ return m_diffuseConstant;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEDiffuseLightingElementImpl.h b/ksvg/impl/SVGFEDiffuseLightingElementImpl.h
new file mode 100644
index 00000000..0be4f7f1
--- /dev/null
+++ b/ksvg/impl/SVGFEDiffuseLightingElementImpl.h
@@ -0,0 +1,59 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEDiffuseLightingElementImpl_H
+#define SVGFEDiffuseLightingElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGAnimatedNumberImpl;
+class SVGFEDiffuseLightingElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEDiffuseLightingElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEDiffuseLightingElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+ SVGAnimatedNumberImpl *surfaceScale() const;
+ SVGAnimatedNumberImpl *diffuseConstant() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+ SVGAnimatedNumberImpl *m_surfaceScale;
+ SVGAnimatedNumberImpl *m_diffuseConstant;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEDisplacementMapElementImpl.cc b/ksvg/impl/SVGFEDisplacementMapElementImpl.cc
new file mode 100644
index 00000000..92665ec7
--- /dev/null
+++ b/ksvg/impl/SVGFEDisplacementMapElementImpl.cc
@@ -0,0 +1,85 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedStringImpl.h"
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGFEDisplacementMapElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEDisplacementMapElementImpl::SVGFEDisplacementMapElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+
+ m_in2 = new SVGAnimatedStringImpl();
+ m_in2->ref();
+
+ m_scale = new SVGAnimatedNumberImpl();
+ m_scale->ref();
+
+ m_xChannelSelector = new SVGAnimatedEnumerationImpl();
+ m_xChannelSelector->ref();
+
+ m_yChannelSelector = new SVGAnimatedEnumerationImpl();
+ m_yChannelSelector->ref();
+}
+
+SVGFEDisplacementMapElementImpl::~SVGFEDisplacementMapElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+ if(m_in2)
+ m_in2->deref();
+ if(m_scale)
+ m_scale->deref();
+ if(m_xChannelSelector)
+ m_xChannelSelector->deref();
+ if(m_yChannelSelector)
+ m_yChannelSelector->deref();
+}
+
+SVGAnimatedStringImpl *SVGFEDisplacementMapElementImpl::in1() const
+{
+ return m_in1;
+}
+
+SVGAnimatedStringImpl *SVGFEDisplacementMapElementImpl::in2() const
+{
+ return m_in2;
+}
+
+SVGAnimatedNumberImpl *SVGFEDisplacementMapElementImpl::scale() const
+{
+ return m_scale;
+}
+
+SVGAnimatedEnumerationImpl *SVGFEDisplacementMapElementImpl::xChannelSelector() const
+{
+ return m_xChannelSelector;
+}
+
+SVGAnimatedEnumerationImpl *SVGFEDisplacementMapElementImpl::yChannelSelector() const
+{
+ return m_yChannelSelector;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEDisplacementMapElementImpl.h b/ksvg/impl/SVGFEDisplacementMapElementImpl.h
new file mode 100644
index 00000000..3774b6cc
--- /dev/null
+++ b/ksvg/impl/SVGFEDisplacementMapElementImpl.h
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEDisplacementMapElementImpl_H
+#define SVGFEDisplacementMapElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGAnimatedNumberImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGFEDisplacementMapElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEDisplacementMapElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEDisplacementMapElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+ SVGAnimatedStringImpl *in2() const;
+ SVGAnimatedNumberImpl *scale() const;
+ SVGAnimatedEnumerationImpl *xChannelSelector() const;
+ SVGAnimatedEnumerationImpl *yChannelSelector() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+ SVGAnimatedStringImpl *m_in2;
+ SVGAnimatedNumberImpl *m_scale;
+ SVGAnimatedEnumerationImpl *m_xChannelSelector;
+ SVGAnimatedEnumerationImpl *m_yChannelSelector;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEDistantLightElementImpl.cc b/ksvg/impl/SVGFEDistantLightElementImpl.cc
new file mode 100644
index 00000000..b40885e0
--- /dev/null
+++ b/ksvg/impl/SVGFEDistantLightElementImpl.cc
@@ -0,0 +1,53 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGFEDistantLightElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEDistantLightElementImpl::SVGFEDistantLightElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+ m_azimuth = new SVGAnimatedNumberImpl();
+ m_azimuth->ref();
+
+ m_elevation = new SVGAnimatedNumberImpl();
+ m_elevation->ref();
+}
+
+SVGFEDistantLightElementImpl::~SVGFEDistantLightElementImpl()
+{
+ if(m_azimuth)
+ m_azimuth->deref();
+ if(m_elevation)
+ m_elevation->deref();
+}
+
+SVGAnimatedNumberImpl *SVGFEDistantLightElementImpl::azimuth() const
+{
+ return m_azimuth;
+}
+
+SVGAnimatedNumberImpl *SVGFEDistantLightElementImpl::elevation() const
+{
+ return m_elevation;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEDistantLightElementImpl.h b/ksvg/impl/SVGFEDistantLightElementImpl.h
new file mode 100644
index 00000000..4d995a44
--- /dev/null
+++ b/ksvg/impl/SVGFEDistantLightElementImpl.h
@@ -0,0 +1,54 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEDistantLightElementImpl_H
+#define SVGFEDistantLightElementImpl_H
+
+#include "SVGElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedNumberImpl;
+class SVGFEDistantLightElementImpl : public SVGElementImpl
+{
+public:
+ SVGFEDistantLightElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEDistantLightElementImpl();
+
+ SVGAnimatedNumberImpl *azimuth() const;
+ SVGAnimatedNumberImpl *elevation() const;
+
+private:
+ SVGAnimatedNumberImpl *m_azimuth;
+ SVGAnimatedNumberImpl *m_elevation;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEFloodElementImpl.cc b/ksvg/impl/SVGFEFloodElementImpl.cc
new file mode 100644
index 00000000..7cbecafd
--- /dev/null
+++ b/ksvg/impl/SVGFEFloodElementImpl.cc
@@ -0,0 +1,43 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFEFloodElementImpl.h"
+#include "SVGAnimatedStringImpl.h"
+
+using namespace KSVG;
+
+SVGFEFloodElementImpl::SVGFEFloodElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGStylableImpl(this), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+}
+
+SVGFEFloodElementImpl::~SVGFEFloodElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+}
+
+SVGAnimatedStringImpl *SVGFEFloodElementImpl::in1() const
+{
+ return m_in1;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEFloodElementImpl.h b/ksvg/impl/SVGFEFloodElementImpl.h
new file mode 100644
index 00000000..858959a9
--- /dev/null
+++ b/ksvg/impl/SVGFEFloodElementImpl.h
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEFloodElementImpl_H
+#define SVGFEFloodElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGFEFloodElementImpl : public SVGElementImpl,
+ public SVGStylableImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEFloodElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEFloodElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEFuncAElementImpl.cc b/ksvg/impl/SVGFEFuncAElementImpl.cc
new file mode 100644
index 00000000..c7a535fa
--- /dev/null
+++ b/ksvg/impl/SVGFEFuncAElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFEFuncAElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEFuncAElementImpl::SVGFEFuncAElementImpl(DOM::ElementImpl *impl) : SVGComponentTransferFunctionElementImpl(impl)
+{
+}
+
+SVGFEFuncAElementImpl::~SVGFEFuncAElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEFuncAElementImpl.h b/ksvg/impl/SVGFEFuncAElementImpl.h
new file mode 100644
index 00000000..7999c7e2
--- /dev/null
+++ b/ksvg/impl/SVGFEFuncAElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEFuncAElementImpl_H
+#define SVGFEFuncAElementImpl_H
+
+#include "SVGComponentTransferFunctionElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGFEFuncAElementImpl : public SVGComponentTransferFunctionElementImpl
+{
+public:
+ SVGFEFuncAElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEFuncAElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEFuncBElementImpl.cc b/ksvg/impl/SVGFEFuncBElementImpl.cc
new file mode 100644
index 00000000..4b0bbf71
--- /dev/null
+++ b/ksvg/impl/SVGFEFuncBElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFEFuncBElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEFuncBElementImpl::SVGFEFuncBElementImpl(DOM::ElementImpl *impl) : SVGComponentTransferFunctionElementImpl(impl)
+{
+}
+
+SVGFEFuncBElementImpl::~SVGFEFuncBElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEFuncBElementImpl.h b/ksvg/impl/SVGFEFuncBElementImpl.h
new file mode 100644
index 00000000..7236debb
--- /dev/null
+++ b/ksvg/impl/SVGFEFuncBElementImpl.h
@@ -0,0 +1,45 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEFuncBElementImpl_H
+#define SVGFEFuncBElementImpl_H
+
+#include "SVGComponentTransferFunctionElementImpl.h"
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGFEFuncBElementImpl : public SVGComponentTransferFunctionElementImpl
+{
+public:
+ SVGFEFuncBElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEFuncBElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEFuncGElementImpl.cc b/ksvg/impl/SVGFEFuncGElementImpl.cc
new file mode 100644
index 00000000..8a60fbee
--- /dev/null
+++ b/ksvg/impl/SVGFEFuncGElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFEFuncGElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEFuncGElementImpl::SVGFEFuncGElementImpl(DOM::ElementImpl *impl) : SVGComponentTransferFunctionElementImpl(impl)
+{
+}
+
+SVGFEFuncGElementImpl::~SVGFEFuncGElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEFuncGElementImpl.h b/ksvg/impl/SVGFEFuncGElementImpl.h
new file mode 100644
index 00000000..44baec8d
--- /dev/null
+++ b/ksvg/impl/SVGFEFuncGElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEFuncGElementImpl_H
+#define SVGFEFuncGElementImpl_H
+
+#include "SVGComponentTransferFunctionElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGFEFuncGElementImpl : public SVGComponentTransferFunctionElementImpl
+{
+public:
+ SVGFEFuncGElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEFuncGElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEFuncRElementImpl.cc b/ksvg/impl/SVGFEFuncRElementImpl.cc
new file mode 100644
index 00000000..fe1b2d44
--- /dev/null
+++ b/ksvg/impl/SVGFEFuncRElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFEFuncRElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEFuncRElementImpl::SVGFEFuncRElementImpl(DOM::ElementImpl *impl) : SVGComponentTransferFunctionElementImpl(impl)
+{
+}
+
+SVGFEFuncRElementImpl::~SVGFEFuncRElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEFuncRElementImpl.h b/ksvg/impl/SVGFEFuncRElementImpl.h
new file mode 100644
index 00000000..17aa7812
--- /dev/null
+++ b/ksvg/impl/SVGFEFuncRElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEFuncRElementImpl_H
+#define SVGFEFuncRElementImpl_H
+
+#include "SVGComponentTransferFunctionElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGFEFuncRElementImpl : public SVGComponentTransferFunctionElementImpl
+{
+public:
+ SVGFEFuncRElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEFuncRElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEGaussianBlurElementImpl.cc b/ksvg/impl/SVGFEGaussianBlurElementImpl.cc
new file mode 100644
index 00000000..bcc2e0bf
--- /dev/null
+++ b/ksvg/impl/SVGFEGaussianBlurElementImpl.cc
@@ -0,0 +1,68 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedStringImpl.h"
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGFEGaussianBlurElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEGaussianBlurElementImpl::SVGFEGaussianBlurElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+
+ m_stdDeviationX = new SVGAnimatedNumberImpl();
+ m_stdDeviationX->ref();
+
+ m_stdDeviationY = new SVGAnimatedNumberImpl();
+ m_stdDeviationY->ref();
+}
+
+SVGFEGaussianBlurElementImpl::~SVGFEGaussianBlurElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+ if(m_stdDeviationX)
+ m_stdDeviationX->deref();
+ if(m_stdDeviationY)
+ m_stdDeviationY->deref();
+}
+
+SVGAnimatedStringImpl *SVGFEGaussianBlurElementImpl::in1() const
+{
+ return m_in1;
+}
+
+SVGAnimatedNumberImpl *SVGFEGaussianBlurElementImpl::stdDeviationX() const
+{
+ return m_stdDeviationX;
+}
+
+SVGAnimatedNumberImpl *SVGFEGaussianBlurElementImpl::stdDeviationY() const
+{
+ return m_stdDeviationY;
+}
+
+void SVGFEGaussianBlurElementImpl::setStdDeviation(float /*stdDeviationX*/, float /*stdDeviationY*/)
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEGaussianBlurElementImpl.h b/ksvg/impl/SVGFEGaussianBlurElementImpl.h
new file mode 100644
index 00000000..97707edb
--- /dev/null
+++ b/ksvg/impl/SVGFEGaussianBlurElementImpl.h
@@ -0,0 +1,60 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEGaussianBlurElementImpl_H
+#define SVGFEGaussianBlurElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGAnimatedNumberImpl;
+class SVGFEGaussianBlurElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEGaussianBlurElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEGaussianBlurElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+ SVGAnimatedNumberImpl *stdDeviationX() const;
+ SVGAnimatedNumberImpl *stdDeviationY() const;
+ void setStdDeviation(float stdDeviationX, float stdDeviationY);
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+ SVGAnimatedNumberImpl *m_stdDeviationX;
+ SVGAnimatedNumberImpl *m_stdDeviationY;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEImageElementImpl.cc b/ksvg/impl/SVGFEImageElementImpl.cc
new file mode 100644
index 00000000..f41e482d
--- /dev/null
+++ b/ksvg/impl/SVGFEImageElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFEImageElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEImageElementImpl::SVGFEImageElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGURIReferenceImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGFilterPrimitiveStandardAttributesImpl()
+{
+}
+
+SVGFEImageElementImpl::~SVGFEImageElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEImageElementImpl.h b/ksvg/impl/SVGFEImageElementImpl.h
new file mode 100644
index 00000000..3d03e77d
--- /dev/null
+++ b/ksvg/impl/SVGFEImageElementImpl.h
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEImageElementImpl_H
+#define SVGFEImageElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGFEImageElementImpl : public SVGElementImpl,
+ public SVGURIReferenceImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEImageElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEImageElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEMergeElementImpl.cc b/ksvg/impl/SVGFEMergeElementImpl.cc
new file mode 100644
index 00000000..6eca907a
--- /dev/null
+++ b/ksvg/impl/SVGFEMergeElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFEMergeElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEMergeElementImpl::SVGFEMergeElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+}
+
+SVGFEMergeElementImpl::~SVGFEMergeElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEMergeElementImpl.h b/ksvg/impl/SVGFEMergeElementImpl.h
new file mode 100644
index 00000000..f4b6aaaf
--- /dev/null
+++ b/ksvg/impl/SVGFEMergeElementImpl.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEMergeElementImpl_H
+#define SVGFEMergeElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGFEMergeElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEMergeElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEMergeElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEMergeNodeElementImpl.cc b/ksvg/impl/SVGFEMergeNodeElementImpl.cc
new file mode 100644
index 00000000..1191df3b
--- /dev/null
+++ b/ksvg/impl/SVGFEMergeNodeElementImpl.cc
@@ -0,0 +1,43 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedStringImpl.h"
+#include "SVGFEMergeNodeElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEMergeNodeElementImpl::SVGFEMergeNodeElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+}
+
+SVGFEMergeNodeElementImpl::~SVGFEMergeNodeElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+}
+
+SVGAnimatedStringImpl *SVGFEMergeNodeElementImpl::in1() const
+{
+ return m_in1;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEMergeNodeElementImpl.h b/ksvg/impl/SVGFEMergeNodeElementImpl.h
new file mode 100644
index 00000000..5b380757
--- /dev/null
+++ b/ksvg/impl/SVGFEMergeNodeElementImpl.h
@@ -0,0 +1,52 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEMergeNodeElementImpl_H
+#define SVGFEMergeNodeElementImpl_H
+
+#include "SVGElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGFEMergeNodeElementImpl : public SVGElementImpl
+{
+public:
+ SVGFEMergeNodeElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEMergeNodeElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEMorphologyElementImpl.cc b/ksvg/impl/SVGFEMorphologyElementImpl.cc
new file mode 100644
index 00000000..e7f1a100
--- /dev/null
+++ b/ksvg/impl/SVGFEMorphologyElementImpl.cc
@@ -0,0 +1,75 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedStringImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGFEMorphologyElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEMorphologyElementImpl::SVGFEMorphologyElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+
+ m_operator = new SVGAnimatedEnumerationImpl();
+ m_operator->ref();
+
+ m_radiusX = new SVGAnimatedLengthImpl();
+ m_radiusX->ref();
+
+ m_radiusY = new SVGAnimatedLengthImpl();
+ m_radiusY->ref();
+}
+
+SVGFEMorphologyElementImpl::~SVGFEMorphologyElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+ if(m_operator)
+ m_operator->deref();
+ if(m_radiusX)
+ m_radiusX->deref();
+ if(m_radiusY)
+ m_radiusY->deref();
+}
+
+SVGAnimatedStringImpl *SVGFEMorphologyElementImpl::in1() const
+{
+ return m_in1;
+}
+
+SVGAnimatedEnumerationImpl *SVGFEMorphologyElementImpl::Operator() const
+{
+ return m_operator;
+}
+
+SVGAnimatedLengthImpl *SVGFEMorphologyElementImpl::radiusX() const
+{
+ return m_radiusX;
+}
+
+SVGAnimatedLengthImpl *SVGFEMorphologyElementImpl::radiusY() const
+{
+ return m_radiusY;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEMorphologyElementImpl.h b/ksvg/impl/SVGFEMorphologyElementImpl.h
new file mode 100644
index 00000000..7941e772
--- /dev/null
+++ b/ksvg/impl/SVGFEMorphologyElementImpl.h
@@ -0,0 +1,62 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEMorphologyElementImpl_H
+#define SVGFEMorphologyElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGAnimatedLengthImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGFEMorphologyElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEMorphologyElementImpl(DOM::ElementImpl *impl);
+ virtual ~SVGFEMorphologyElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+ SVGAnimatedEnumerationImpl *Operator() const;
+ SVGAnimatedLengthImpl *radiusX() const;
+ SVGAnimatedLengthImpl *radiusY() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+ SVGAnimatedEnumerationImpl *m_operator;
+ SVGAnimatedLengthImpl *m_radiusX;
+ SVGAnimatedLengthImpl *m_radiusY;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEOffsetElementImpl.cc b/ksvg/impl/SVGFEOffsetElementImpl.cc
new file mode 100644
index 00000000..8c8bfbeb
--- /dev/null
+++ b/ksvg/impl/SVGFEOffsetElementImpl.cc
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedStringImpl.h"
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGFEOffsetElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEOffsetElementImpl::SVGFEOffsetElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+
+ m_dx = new SVGAnimatedNumberImpl();
+ m_dx->ref();
+
+ m_dy = new SVGAnimatedNumberImpl();
+ m_dy->ref();
+}
+
+SVGFEOffsetElementImpl::~SVGFEOffsetElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+ if(m_dx)
+ m_dx->deref();
+ if(m_dy)
+ m_dy->deref();
+}
+
+SVGAnimatedStringImpl *SVGFEOffsetElementImpl::in1() const
+{
+ return m_in1;
+}
+
+SVGAnimatedNumberImpl *SVGFEOffsetElementImpl::dx() const
+{
+ return m_dx;
+}
+
+SVGAnimatedNumberImpl *SVGFEOffsetElementImpl::dy() const
+{
+ return m_dy;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEOffsetElementImpl.h b/ksvg/impl/SVGFEOffsetElementImpl.h
new file mode 100644
index 00000000..e8c3448a
--- /dev/null
+++ b/ksvg/impl/SVGFEOffsetElementImpl.h
@@ -0,0 +1,59 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEOffsetElementImpl_H
+#define SVGFEOffsetElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGAnimatedNumberImpl;
+class SVGFEOffsetElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFEOffsetElementImpl(DOM::ElementImpl *impl);
+ virtual ~SVGFEOffsetElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+ SVGAnimatedNumberImpl *dx() const;
+ SVGAnimatedNumberImpl *dy() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+ SVGAnimatedNumberImpl *m_dx;
+ SVGAnimatedNumberImpl *m_dy;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEPointLightElementImpl.cc b/ksvg/impl/SVGFEPointLightElementImpl.cc
new file mode 100644
index 00000000..ad95d20a
--- /dev/null
+++ b/ksvg/impl/SVGFEPointLightElementImpl.cc
@@ -0,0 +1,63 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGFEPointLightElementImpl.h"
+
+using namespace KSVG;
+
+SVGFEPointLightElementImpl::SVGFEPointLightElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+ m_x = new SVGAnimatedNumberImpl();
+ m_x->ref();
+
+ m_y = new SVGAnimatedNumberImpl();
+ m_y->ref();
+
+ m_z = new SVGAnimatedNumberImpl();
+ m_z->ref();
+}
+
+SVGFEPointLightElementImpl::~SVGFEPointLightElementImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_z)
+ m_z->deref();
+}
+
+SVGAnimatedNumberImpl *SVGFEPointLightElementImpl::x() const
+{
+ return m_x;
+}
+
+SVGAnimatedNumberImpl *SVGFEPointLightElementImpl::y() const
+{
+ return m_y;
+}
+
+SVGAnimatedNumberImpl *SVGFEPointLightElementImpl::z() const
+{
+ return m_z;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFEPointLightElementImpl.h b/ksvg/impl/SVGFEPointLightElementImpl.h
new file mode 100644
index 00000000..6d66c98b
--- /dev/null
+++ b/ksvg/impl/SVGFEPointLightElementImpl.h
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEPointLightElementImpl_H
+#define SVGFEPointLightElementImpl_H
+
+#include "SVGElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedNumberImpl;
+class SVGFEPointLightElementImpl : public SVGElementImpl
+{
+public:
+ SVGFEPointLightElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFEPointLightElementImpl();
+
+ SVGAnimatedNumberImpl *x() const;
+ SVGAnimatedNumberImpl *y() const;
+ SVGAnimatedNumberImpl *z() const;
+
+private:
+ SVGAnimatedNumberImpl *m_x;
+ SVGAnimatedNumberImpl *m_y;
+ SVGAnimatedNumberImpl *m_z;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFESpecularLightingElementImpl.cc b/ksvg/impl/SVGFESpecularLightingElementImpl.cc
new file mode 100644
index 00000000..9974e146
--- /dev/null
+++ b/ksvg/impl/SVGFESpecularLightingElementImpl.cc
@@ -0,0 +1,74 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedStringImpl.h"
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGFESpecularLightingElementImpl.h"
+
+using namespace KSVG;
+
+SVGFESpecularLightingElementImpl::SVGFESpecularLightingElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+
+ m_surfaceScale = new SVGAnimatedNumberImpl();
+ m_surfaceScale->ref();
+
+ m_specularConstant = new SVGAnimatedNumberImpl();
+ m_specularConstant->ref();
+
+ m_specularExponent = new SVGAnimatedNumberImpl();
+ m_specularExponent->ref();
+}
+
+SVGFESpecularLightingElementImpl::~SVGFESpecularLightingElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+ if(m_surfaceScale)
+ m_surfaceScale->deref();
+ if(m_specularConstant)
+ m_specularConstant->deref();
+ if(m_specularExponent)
+ m_specularExponent->deref();
+}
+
+SVGAnimatedStringImpl *SVGFESpecularLightingElementImpl::in1() const
+{
+ return m_in1;
+}
+
+SVGAnimatedNumberImpl *SVGFESpecularLightingElementImpl::surfaceScale() const
+{
+ return m_surfaceScale;
+}
+
+SVGAnimatedNumberImpl *SVGFESpecularLightingElementImpl::specularConstant() const
+{
+ return m_specularConstant;
+}
+
+SVGAnimatedNumberImpl *SVGFESpecularLightingElementImpl::specularExponent() const
+{
+ return m_specularExponent;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFESpecularLightingElementImpl.h b/ksvg/impl/SVGFESpecularLightingElementImpl.h
new file mode 100644
index 00000000..527e7f5b
--- /dev/null
+++ b/ksvg/impl/SVGFESpecularLightingElementImpl.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFESpecularLightingElementImpl_H
+#define SVGFESpecularLightingElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGAnimatedNumberImpl;
+class SVGFESpecularLightingElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFESpecularLightingElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFESpecularLightingElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+ SVGAnimatedNumberImpl *surfaceScale() const;
+ SVGAnimatedNumberImpl *specularConstant() const;
+ SVGAnimatedNumberImpl *specularExponent() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+ SVGAnimatedNumberImpl *m_surfaceScale;
+ SVGAnimatedNumberImpl *m_specularConstant;
+ SVGAnimatedNumberImpl *m_specularExponent;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFESpotLightElementImpl.cc b/ksvg/impl/SVGFESpotLightElementImpl.cc
new file mode 100644
index 00000000..96950eda
--- /dev/null
+++ b/ksvg/impl/SVGFESpotLightElementImpl.cc
@@ -0,0 +1,113 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGFESpotLightElementImpl.h"
+
+using namespace KSVG;
+
+SVGFESpotLightElementImpl::SVGFESpotLightElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+ m_x = new SVGAnimatedNumberImpl();
+ m_x->ref();
+
+ m_y = new SVGAnimatedNumberImpl();
+ m_y->ref();
+
+ m_z = new SVGAnimatedNumberImpl();
+ m_z->ref();
+
+ m_pointsAtX = new SVGAnimatedNumberImpl();
+ m_pointsAtX->ref();
+
+ m_pointsAtY = new SVGAnimatedNumberImpl();
+ m_pointsAtY->ref();
+
+ m_pointsAtZ = new SVGAnimatedNumberImpl();
+ m_pointsAtZ->ref();
+
+ m_specularExponent = new SVGAnimatedNumberImpl();
+ m_specularExponent->ref();
+
+ m_limitingConeAngle = new SVGAnimatedNumberImpl();
+ m_limitingConeAngle->ref();
+}
+
+SVGFESpotLightElementImpl::~SVGFESpotLightElementImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_z)
+ m_z->deref();
+ if(m_pointsAtX)
+ m_pointsAtX->deref();
+ if(m_pointsAtY)
+ m_pointsAtY->deref();
+ if(m_pointsAtZ)
+ m_pointsAtZ->deref();
+ if(m_specularExponent)
+ m_specularExponent->deref();
+ if(m_limitingConeAngle)
+ m_limitingConeAngle->deref();
+}
+
+SVGAnimatedNumberImpl *SVGFESpotLightElementImpl::x() const
+{
+ return m_x;
+}
+
+SVGAnimatedNumberImpl *SVGFESpotLightElementImpl::y() const
+{
+ return m_y;
+}
+
+SVGAnimatedNumberImpl *SVGFESpotLightElementImpl::z() const
+{
+ return m_z;
+}
+
+SVGAnimatedNumberImpl *SVGFESpotLightElementImpl::pointsAtX() const
+{
+ return m_pointsAtX;
+}
+
+SVGAnimatedNumberImpl *SVGFESpotLightElementImpl::pointsAtY() const
+{
+ return m_pointsAtY;
+}
+
+SVGAnimatedNumberImpl *SVGFESpotLightElementImpl::pointsAtZ() const
+{
+ return m_pointsAtZ;
+}
+
+SVGAnimatedNumberImpl *SVGFESpotLightElementImpl::specularExponent() const
+{
+ return m_specularExponent;
+}
+
+SVGAnimatedNumberImpl *SVGFESpotLightElementImpl::limitingConeAngle() const
+{
+ return m_limitingConeAngle;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFESpotLightElementImpl.h b/ksvg/impl/SVGFESpotLightElementImpl.h
new file mode 100644
index 00000000..3c808698
--- /dev/null
+++ b/ksvg/impl/SVGFESpotLightElementImpl.h
@@ -0,0 +1,65 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFESpotLightElementImpl_H
+#define SVGFESpotLightElementImpl_H
+
+#include "SVGElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedNumberImpl;
+class SVGFESpotLightElementImpl : public SVGElementImpl
+{
+public:
+ SVGFESpotLightElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFESpotLightElementImpl();
+
+ SVGAnimatedNumberImpl *x() const;
+ SVGAnimatedNumberImpl *y() const;
+ SVGAnimatedNumberImpl *z() const;
+ SVGAnimatedNumberImpl *pointsAtX() const;
+ SVGAnimatedNumberImpl *pointsAtY() const;
+ SVGAnimatedNumberImpl *pointsAtZ() const;
+ SVGAnimatedNumberImpl *specularExponent() const;
+ SVGAnimatedNumberImpl *limitingConeAngle() const;
+
+private:
+ SVGAnimatedNumberImpl *m_x;
+ SVGAnimatedNumberImpl *m_y;
+ SVGAnimatedNumberImpl *m_z;
+ SVGAnimatedNumberImpl *m_pointsAtX;
+ SVGAnimatedNumberImpl *m_pointsAtY;
+ SVGAnimatedNumberImpl *m_pointsAtZ;
+ SVGAnimatedNumberImpl *m_specularExponent;
+ SVGAnimatedNumberImpl *m_limitingConeAngle;
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFETileElementImpl.cc b/ksvg/impl/SVGFETileElementImpl.cc
new file mode 100644
index 00000000..2a794302
--- /dev/null
+++ b/ksvg/impl/SVGFETileElementImpl.cc
@@ -0,0 +1,43 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFETileElementImpl.h"
+#include "SVGAnimatedStringImpl.h"
+
+using namespace KSVG;
+
+SVGFETileElementImpl::SVGFETileElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_in1 = new SVGAnimatedStringImpl();
+ m_in1->ref();
+}
+
+SVGFETileElementImpl::~SVGFETileElementImpl()
+{
+ if(m_in1)
+ m_in1->deref();
+}
+
+SVGAnimatedStringImpl *SVGFETileElementImpl::in1() const
+{
+ return m_in1;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFETileElementImpl.h b/ksvg/impl/SVGFETileElementImpl.h
new file mode 100644
index 00000000..29cd4167
--- /dev/null
+++ b/ksvg/impl/SVGFETileElementImpl.h
@@ -0,0 +1,54 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFETileElementImpl_H
+#define SVGFETileElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGFETileElementImpl : public SVGElementImpl,
+ public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFETileElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFETileElementImpl();
+
+ SVGAnimatedStringImpl *in1() const;
+
+private:
+ SVGAnimatedStringImpl *m_in1;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFETurbulenceElementImpl.cc b/ksvg/impl/SVGFETurbulenceElementImpl.cc
new file mode 100644
index 00000000..79c68de3
--- /dev/null
+++ b/ksvg/impl/SVGFETurbulenceElementImpl.cc
@@ -0,0 +1,100 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGAnimatedIntegerImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGFETurbulenceElementImpl.h"
+
+using namespace KSVG;
+
+SVGFETurbulenceElementImpl::SVGFETurbulenceElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_baseFrequencyX = new SVGAnimatedNumberImpl();
+ m_baseFrequencyX->ref();
+
+ m_baseFrequencyY = new SVGAnimatedNumberImpl();
+ m_baseFrequencyY->ref();
+
+ m_numOctaves = new SVGAnimatedIntegerImpl();
+ m_numOctaves->ref();
+
+ m_seed = new SVGAnimatedNumberImpl();
+ m_seed->ref();
+
+ m_stitchTiles = new SVGAnimatedEnumerationImpl();
+ m_stitchTiles->ref();
+
+ m_type = new SVGAnimatedEnumerationImpl();
+ m_type->ref();
+}
+
+SVGFETurbulenceElementImpl::~SVGFETurbulenceElementImpl()
+{
+ if(m_baseFrequencyX)
+ m_baseFrequencyX->deref();
+
+ if(m_baseFrequencyY)
+ m_baseFrequencyY->deref();
+
+ if(m_numOctaves)
+ m_numOctaves->deref();
+
+ if(m_seed)
+ m_seed->deref();
+
+ if(m_stitchTiles)
+ m_stitchTiles->deref();
+
+ if(m_type)
+ m_type->deref();
+}
+
+SVGAnimatedNumberImpl *SVGFETurbulenceElementImpl::baseFrequencyX() const
+{
+ return m_baseFrequencyX;
+}
+
+SVGAnimatedNumberImpl *SVGFETurbulenceElementImpl::baseFrequencyY() const
+{
+ return m_baseFrequencyY;
+}
+
+SVGAnimatedIntegerImpl *SVGFETurbulenceElementImpl::numOctaves() const
+{
+ return m_numOctaves;
+}
+
+SVGAnimatedNumberImpl *SVGFETurbulenceElementImpl::seed() const
+{
+ return m_seed;
+}
+
+SVGAnimatedEnumerationImpl *SVGFETurbulenceElementImpl::stitchTiles() const
+{
+ return m_stitchTiles;
+}
+
+SVGAnimatedEnumerationImpl *SVGFETurbulenceElementImpl::type() const
+{
+ return m_type;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFETurbulenceElementImpl.h b/ksvg/impl/SVGFETurbulenceElementImpl.h
new file mode 100644
index 00000000..1275f8ca
--- /dev/null
+++ b/ksvg/impl/SVGFETurbulenceElementImpl.h
@@ -0,0 +1,65 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFETurbulenceElementImpl_H
+#define SVGFETurbulenceElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedNumberImpl;
+class SVGAnimatedIntegerImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGFETurbulenceElementImpl : public SVGElementImpl, public SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFETurbulenceElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFETurbulenceElementImpl();
+
+ SVGAnimatedNumberImpl *baseFrequencyX() const;
+ SVGAnimatedNumberImpl *baseFrequencyY() const;
+ SVGAnimatedIntegerImpl *numOctaves() const;
+ SVGAnimatedNumberImpl *seed() const;
+ SVGAnimatedEnumerationImpl *stitchTiles() const;
+ SVGAnimatedEnumerationImpl *type() const;
+
+private:
+ SVGAnimatedNumberImpl *m_baseFrequencyX;
+ SVGAnimatedNumberImpl *m_baseFrequencyY;
+ SVGAnimatedIntegerImpl *m_numOctaves;
+ SVGAnimatedNumberImpl *m_seed;
+ SVGAnimatedEnumerationImpl *m_stitchTiles;
+ SVGAnimatedEnumerationImpl *m_type;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFilterElementImpl.cc b/ksvg/impl/SVGFilterElementImpl.cc
new file mode 100644
index 00000000..eb83ad4b
--- /dev/null
+++ b/ksvg/impl/SVGFilterElementImpl.cc
@@ -0,0 +1,119 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFilterElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGAnimatedIntegerImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+
+using namespace KSVG;
+
+SVGFilterElementImpl::SVGFilterElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGURIReferenceImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this)
+{
+ m_filterUnits = new SVGAnimatedEnumerationImpl();
+ m_filterUnits->ref();
+
+ m_primitiveUnits = new SVGAnimatedEnumerationImpl();
+ m_primitiveUnits->ref();
+
+ m_x = new SVGAnimatedLengthImpl();
+ m_x->ref();
+
+ m_y = new SVGAnimatedLengthImpl();
+ m_y->ref();
+
+ m_width = new SVGAnimatedLengthImpl();
+ m_width->ref();
+
+ m_height = new SVGAnimatedLengthImpl();
+ m_height->ref();
+
+ m_filterResX = new SVGAnimatedIntegerImpl();
+ m_filterResX->ref();
+
+ m_filterResY = new SVGAnimatedIntegerImpl();
+ m_filterResY->ref();
+}
+
+SVGFilterElementImpl::~SVGFilterElementImpl()
+{
+ if(m_filterUnits)
+ m_filterUnits->deref();
+ if(m_primitiveUnits)
+ m_primitiveUnits->deref();
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_width)
+ m_width->deref();
+ if(m_height)
+ m_height->deref();
+ if(m_filterResX)
+ m_filterResX->deref();
+ if(m_filterResY)
+ m_filterResY->deref();
+}
+
+SVGAnimatedEnumerationImpl *SVGFilterElementImpl::filterUnits() const
+{
+ return m_filterUnits;
+}
+
+SVGAnimatedEnumerationImpl *SVGFilterElementImpl::primitiveUnits() const
+{
+ return m_primitiveUnits;
+}
+
+SVGAnimatedLengthImpl *SVGFilterElementImpl::x() const
+{
+ return m_x;
+}
+
+SVGAnimatedLengthImpl *SVGFilterElementImpl::y() const
+{
+ return m_y;
+}
+
+SVGAnimatedLengthImpl *SVGFilterElementImpl::width() const
+{
+ return m_width;
+}
+
+SVGAnimatedLengthImpl *SVGFilterElementImpl::height() const
+{
+ return m_height;
+}
+
+SVGAnimatedIntegerImpl *SVGFilterElementImpl::filterResX() const
+{
+ return m_filterResX;
+}
+
+SVGAnimatedIntegerImpl *SVGFilterElementImpl::filterResY() const
+{
+ return m_filterResY;
+}
+
+void SVGFilterElementImpl::setFilterRes(unsigned long /*filterResX*/, unsigned long /*filterResY*/)
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFilterElementImpl.h b/ksvg/impl/SVGFilterElementImpl.h
new file mode 100644
index 00000000..ad12a9e9
--- /dev/null
+++ b/ksvg/impl/SVGFilterElementImpl.h
@@ -0,0 +1,76 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFilterElementImpl_H
+#define SVGFilterElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedLengthImpl;
+class SVGAnimatedIntegerImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGFilterElementImpl : public SVGElementImpl,
+ public SVGURIReferenceImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl
+{
+public:
+ SVGFilterElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFilterElementImpl();
+
+ SVGAnimatedEnumerationImpl *filterUnits() const;
+ SVGAnimatedEnumerationImpl *primitiveUnits() const;
+ SVGAnimatedLengthImpl *x() const;
+ SVGAnimatedLengthImpl *y() const;
+ SVGAnimatedLengthImpl *width() const;
+ SVGAnimatedLengthImpl *height() const;
+ SVGAnimatedIntegerImpl *filterResX() const;
+ SVGAnimatedIntegerImpl *filterResY() const;
+ void setFilterRes(unsigned long filterResX, unsigned long filterResY);
+
+private:
+ SVGAnimatedEnumerationImpl *m_filterUnits;
+ SVGAnimatedEnumerationImpl *m_primitiveUnits;
+ SVGAnimatedLengthImpl *m_x;
+ SVGAnimatedLengthImpl *m_y;
+ SVGAnimatedLengthImpl *m_width;
+ SVGAnimatedLengthImpl *m_height;
+ SVGAnimatedIntegerImpl *m_filterResX;
+ SVGAnimatedIntegerImpl *m_filterResY;
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFilterPrimitiveStandardAttributesImpl.cc b/ksvg/impl/SVGFilterPrimitiveStandardAttributesImpl.cc
new file mode 100644
index 00000000..3f403009
--- /dev/null
+++ b/ksvg/impl/SVGFilterPrimitiveStandardAttributesImpl.cc
@@ -0,0 +1,84 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGAnimatedStringImpl.h"
+#include "SVGFilterPrimitiveStandardAttributesImpl.h"
+
+using namespace KSVG;
+
+SVGFilterPrimitiveStandardAttributesImpl::SVGFilterPrimitiveStandardAttributesImpl()
+{
+ m_x = new SVGAnimatedLengthImpl();
+ m_x->ref();
+
+ m_y = new SVGAnimatedLengthImpl();
+ m_y->ref();
+
+ m_width = new SVGAnimatedLengthImpl();
+ m_width->ref();
+
+ m_height = new SVGAnimatedLengthImpl();
+ m_height->ref();
+
+ m_result = new SVGAnimatedStringImpl();
+ m_result->ref();
+}
+
+SVGFilterPrimitiveStandardAttributesImpl::~SVGFilterPrimitiveStandardAttributesImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_width)
+ m_width->deref();
+ if(m_height)
+ m_height->deref();
+ if(m_result)
+ m_result->deref();
+}
+
+SVGAnimatedLengthImpl *SVGFilterPrimitiveStandardAttributesImpl::x() const
+{
+ return m_x;
+}
+
+SVGAnimatedLengthImpl *SVGFilterPrimitiveStandardAttributesImpl::y() const
+{
+ return m_y;
+}
+
+SVGAnimatedLengthImpl *SVGFilterPrimitiveStandardAttributesImpl::width() const
+{
+ return m_width;
+}
+
+SVGAnimatedLengthImpl *SVGFilterPrimitiveStandardAttributesImpl::height() const
+{
+ return m_height;
+}
+
+SVGAnimatedStringImpl *SVGFilterPrimitiveStandardAttributesImpl::result() const
+{
+ return m_result;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFilterPrimitiveStandardAttributesImpl.h b/ksvg/impl/SVGFilterPrimitiveStandardAttributesImpl.h
new file mode 100644
index 00000000..45bcd4d0
--- /dev/null
+++ b/ksvg/impl/SVGFilterPrimitiveStandardAttributesImpl.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPrimitiveStandardAttributesImpl_H
+#define SVGPrimitiveStandardAttributesImpl_H
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedLengthImpl;
+class SVGAnimatedStringImpl;
+class SVGFilterPrimitiveStandardAttributesImpl
+{
+public:
+ SVGFilterPrimitiveStandardAttributesImpl();
+ virtual ~SVGFilterPrimitiveStandardAttributesImpl();
+
+ SVGAnimatedLengthImpl *x() const;
+ SVGAnimatedLengthImpl *y() const;
+ SVGAnimatedLengthImpl *width() const;
+ SVGAnimatedLengthImpl *height() const;
+ SVGAnimatedStringImpl *result() const;
+
+private:
+ SVGAnimatedLengthImpl *m_x;
+ SVGAnimatedLengthImpl *m_y;
+ SVGAnimatedLengthImpl *m_width;
+ SVGAnimatedLengthImpl *m_height;
+ SVGAnimatedStringImpl *m_result;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFitToViewBoxImpl.cc b/ksvg/impl/SVGFitToViewBoxImpl.cc
new file mode 100644
index 00000000..fee367b9
--- /dev/null
+++ b/ksvg/impl/SVGFitToViewBoxImpl.cc
@@ -0,0 +1,141 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include "SVGPreserveAspectRatio.h"
+
+#include "SVGRectImpl.h"
+#include "SVGFitToViewBoxImpl.h"
+#include "SVGAnimatedRectImpl.h"
+#include "SVGPreserveAspectRatioImpl.h"
+#include "SVGAnimatedPreserveAspectRatioImpl.h"
+#include "SVGSVGElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGFitToViewBoxImpl.lut.h"
+
+SVGFitToViewBoxImpl::SVGFitToViewBoxImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_viewBox = new SVGAnimatedRectImpl();
+ m_viewBox->ref();
+
+ m_preserveAspectRatio = new SVGAnimatedPreserveAspectRatioImpl();
+ m_preserveAspectRatio->ref();
+}
+
+SVGFitToViewBoxImpl::~SVGFitToViewBoxImpl()
+{
+ if(m_viewBox)
+ m_viewBox->deref();
+ if(m_preserveAspectRatio)
+ m_preserveAspectRatio->deref();
+}
+
+SVGAnimatedRectImpl *SVGFitToViewBoxImpl::viewBox() const
+{
+ return m_viewBox;
+}
+
+SVGAnimatedPreserveAspectRatioImpl *SVGFitToViewBoxImpl::preserveAspectRatio() const
+{
+ return m_preserveAspectRatio;
+}
+
+void SVGFitToViewBoxImpl::parseViewBox(const QString &s)
+{
+ // Set default if preserveAspectRatio wasnt parsed earlier (Rob)
+ if(m_preserveAspectRatio->baseVal()->align() == SVG_PRESERVEASPECTRATIO_UNKNOWN)
+ m_preserveAspectRatio->baseVal()->setAlign(SVG_PRESERVEASPECTRATIO_XMIDYMID);
+ if(m_preserveAspectRatio->baseVal()->meetOrSlice() == SVG_MEETORSLICE_UNKNOWN)
+ m_preserveAspectRatio->baseVal()->setMeetOrSlice(SVG_MEETORSLICE_MEET);
+
+ // allow for viewbox def with ',' or whitespace
+ QString viewbox(s);
+ QStringList points = QStringList::split(' ', viewbox.replace(',', ' ').simplifyWhiteSpace());
+
+ viewBox()->baseVal()->setX(points[0].toFloat());
+ viewBox()->baseVal()->setY(points[1].toFloat());
+ viewBox()->baseVal()->setWidth(points[2].toFloat());
+ viewBox()->baseVal()->setHeight(points[3].toFloat());
+}
+
+SVGMatrixImpl *SVGFitToViewBoxImpl::viewBoxToViewTransform(float viewWidth, float viewHeight) const
+{
+ if(viewBox()->baseVal()->width() == 0 || viewBox()->baseVal()->height() == 0)
+ return SVGSVGElementImpl::createSVGMatrix();
+ else
+ return preserveAspectRatio()->baseVal()->getCTM(viewBox()->baseVal()->x(),
+ viewBox()->baseVal()->y(), viewBox()->baseVal()->width(), viewBox()->baseVal()->height(),
+ 0, 0, viewWidth, viewHeight);
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGFitToViewBoxImpl::s_hashTable 3
+ viewBox SVGFitToViewBoxImpl::ViewBox DontDelete
+ preserveAspectRatio SVGFitToViewBoxImpl::PreserveAspectRatio DontDelete
+@end
+*/
+
+Value SVGFitToViewBoxImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case ViewBox:
+ return m_viewBox->cache(exec);
+ case PreserveAspectRatio:
+ return m_preserveAspectRatio->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGFitToViewBoxImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case ViewBox:
+ parseViewBox(value.toString(exec).qstring());
+ break;
+ case PreserveAspectRatio:
+ if(preserveAspectRatio())
+ preserveAspectRatio()->baseVal()->parsePreserveAspectRatio(value.toString(exec).qstring());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFitToViewBoxImpl.h b/ksvg/impl/SVGFitToViewBoxImpl.h
new file mode 100644
index 00000000..b511d63e
--- /dev/null
+++ b/ksvg/impl/SVGFitToViewBoxImpl.h
@@ -0,0 +1,69 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFitToViewBoxImpl_H
+#define SVGFitToViewBoxImpl_H
+
+#include "ksvg_lookup.h"
+
+class QString;
+
+namespace KSVG
+{
+
+class SVGAnimatedRectImpl;
+class SVGAnimatedPreserveAspectRatioImpl;
+class SVGMatrixImpl;
+class SVGFitToViewBoxImpl
+{
+public:
+ SVGFitToViewBoxImpl();
+ ~SVGFitToViewBoxImpl();
+
+ SVGAnimatedRectImpl *viewBox() const;
+ SVGAnimatedPreserveAspectRatioImpl *preserveAspectRatio() const;
+
+ void parseViewBox(const QString &);
+
+ SVGMatrixImpl *viewBoxToViewTransform(float viewWidth, float viewHeight) const;
+
+protected:
+ SVGAnimatedRectImpl *m_viewBox;
+ SVGAnimatedPreserveAspectRatioImpl *m_preserveAspectRatio;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ ViewBox, PreserveAspectRatio
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontElementImpl.cc b/ksvg/impl/SVGFontElementImpl.cc
new file mode 100644
index 00000000..30d4f63f
--- /dev/null
+++ b/ksvg/impl/SVGFontElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFontElementImpl.h"
+
+using namespace KSVG;
+
+SVGFontElementImpl::SVGFontElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this)
+{
+}
+
+SVGFontElementImpl::~SVGFontElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontElementImpl.h b/ksvg/impl/SVGFontElementImpl.h
new file mode 100644
index 00000000..3a753797
--- /dev/null
+++ b/ksvg/impl/SVGFontElementImpl.h
@@ -0,0 +1,49 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFontElementImpl_H
+#define SVGFontElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGFontElementImpl : public SVGElementImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl
+{
+public:
+ SVGFontElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFontElementImpl();
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontFaceElementImpl.cc b/ksvg/impl/SVGFontFaceElementImpl.cc
new file mode 100644
index 00000000..d53e70ad
--- /dev/null
+++ b/ksvg/impl/SVGFontFaceElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFontFaceElementImpl.h"
+
+using namespace KSVG;
+
+SVGFontFaceElementImpl::SVGFontFaceElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+}
+
+SVGFontFaceElementImpl::~SVGFontFaceElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontFaceElementImpl.h b/ksvg/impl/SVGFontFaceElementImpl.h
new file mode 100644
index 00000000..0479ccea
--- /dev/null
+++ b/ksvg/impl/SVGFontFaceElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFontFaceElementImpl_H
+#define SVGFontFaceElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGFontFaceElementImpl : public SVGElementImpl
+{
+public:
+ SVGFontFaceElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFontFaceElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontFaceFormatElementImpl.cc b/ksvg/impl/SVGFontFaceFormatElementImpl.cc
new file mode 100644
index 00000000..48651a68
--- /dev/null
+++ b/ksvg/impl/SVGFontFaceFormatElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFontFaceFormatElementImpl.h"
+
+using namespace KSVG;
+
+SVGFontFaceFormatElementImpl::SVGFontFaceFormatElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+}
+
+SVGFontFaceFormatElementImpl::~SVGFontFaceFormatElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontFaceFormatElementImpl.h b/ksvg/impl/SVGFontFaceFormatElementImpl.h
new file mode 100644
index 00000000..380e29b1
--- /dev/null
+++ b/ksvg/impl/SVGFontFaceFormatElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFontFaceFormatElementImpl_H
+#define SVGFontFaceFormatElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGFontFaceFormatElementImpl : public SVGElementImpl
+{
+public:
+ SVGFontFaceFormatElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFontFaceFormatElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontFaceNameElementImpl.cc b/ksvg/impl/SVGFontFaceNameElementImpl.cc
new file mode 100644
index 00000000..276f3ae3
--- /dev/null
+++ b/ksvg/impl/SVGFontFaceNameElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFontFaceNameElementImpl.h"
+
+using namespace KSVG;
+
+SVGFontFaceNameElementImpl::SVGFontFaceNameElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+}
+
+SVGFontFaceNameElementImpl::~SVGFontFaceNameElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontFaceNameElementImpl.h b/ksvg/impl/SVGFontFaceNameElementImpl.h
new file mode 100644
index 00000000..797ee17e
--- /dev/null
+++ b/ksvg/impl/SVGFontFaceNameElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFontFaceNameElementImpl_H
+#define SVGFontFaceNameElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGFontFaceNameElementImpl : public SVGElementImpl
+{
+public:
+ SVGFontFaceNameElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFontFaceNameElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontFaceSrcElementImpl.cc b/ksvg/impl/SVGFontFaceSrcElementImpl.cc
new file mode 100644
index 00000000..bdc40611
--- /dev/null
+++ b/ksvg/impl/SVGFontFaceSrcElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFontFaceSrcElementImpl.h"
+
+using namespace KSVG;
+
+SVGFontFaceSrcElementImpl::SVGFontFaceSrcElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+}
+
+SVGFontFaceSrcElementImpl::~SVGFontFaceSrcElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontFaceSrcElementImpl.h b/ksvg/impl/SVGFontFaceSrcElementImpl.h
new file mode 100644
index 00000000..f858e829
--- /dev/null
+++ b/ksvg/impl/SVGFontFaceSrcElementImpl.h
@@ -0,0 +1,45 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFontFaceSrcElementImpl_H
+#define SVGFontFaceSrcElementImpl_H
+
+#include "ksvg_lookup.h"
+#include "SVGElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGFontFaceSrcElementImpl : public SVGElementImpl
+{
+public:
+ SVGFontFaceSrcElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFontFaceSrcElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontFaceUriElementImpl.cc b/ksvg/impl/SVGFontFaceUriElementImpl.cc
new file mode 100644
index 00000000..cef5a30f
--- /dev/null
+++ b/ksvg/impl/SVGFontFaceUriElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGFontFaceUriElementImpl.h"
+
+using namespace KSVG;
+
+SVGFontFaceUriElementImpl::SVGFontFaceUriElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+}
+
+SVGFontFaceUriElementImpl::~SVGFontFaceUriElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGFontFaceUriElementImpl.h b/ksvg/impl/SVGFontFaceUriElementImpl.h
new file mode 100644
index 00000000..2b670a82
--- /dev/null
+++ b/ksvg/impl/SVGFontFaceUriElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFontFaceUriElementImpl_H
+#define SVGFontFaceUriElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGFontFaceUriElementImpl : public SVGElementImpl
+{
+public:
+ SVGFontFaceUriElementImpl(DOM::ElementImpl *);
+ virtual ~SVGFontFaceUriElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGForeignObjectElementImpl.cc b/ksvg/impl/SVGForeignObjectElementImpl.cc
new file mode 100644
index 00000000..ff605cf0
--- /dev/null
+++ b/ksvg/impl/SVGForeignObjectElementImpl.cc
@@ -0,0 +1,121 @@
+/*
+ Copyright (C) 2001-20032 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGRectImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGForeignObjectElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGForeignObjectElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGForeignObjectElementImpl::SVGForeignObjectElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+ m_x = new SVGAnimatedLengthImpl();
+ m_x->ref();
+
+ m_y = new SVGAnimatedLengthImpl();
+ m_y->ref();
+
+ m_width = new SVGAnimatedLengthImpl();
+ m_width->ref();
+
+ m_height = new SVGAnimatedLengthImpl();
+ m_height->ref();
+}
+
+SVGForeignObjectElementImpl::~SVGForeignObjectElementImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_width)
+ m_width->deref();
+ if(m_height)
+ m_height->deref();
+}
+
+SVGRectImpl *SVGForeignObjectElementImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+ ret->setX(m_x->baseVal()->value());
+ ret->setY(m_y->baseVal()->value());
+ ret->setWidth(m_width->baseVal()->value());
+ ret->setHeight(m_height->baseVal()->value());
+ return ret;
+}
+
+SVGAnimatedLengthImpl *SVGForeignObjectElementImpl::x() const
+{
+ return m_x;
+}
+
+SVGAnimatedLengthImpl *SVGForeignObjectElementImpl::y() const
+{
+ return m_y;
+}
+
+SVGAnimatedLengthImpl *SVGForeignObjectElementImpl::width() const
+{
+ return m_width;
+}
+
+SVGAnimatedLengthImpl *SVGForeignObjectElementImpl::height() const
+{
+ return m_height;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGForeignObjectElementImpl::s_hashTable 5
+ x SVGForeignObjectElementImpl::X DontDelete|ReadOnly
+ y SVGForeignObjectElementImpl::Y DontDelete|ReadOnly
+ width SVGForeignObjectElementImpl::Width DontDelete|ReadOnly
+ height SVGForeignObjectElementImpl::Height DontDelete|ReadOnly
+@end
+*/
+
+Value SVGForeignObjectElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return m_x->cache(exec);
+ case Y:
+ return m_y->cache(exec);
+ case Width:
+ return m_width->cache(exec);
+ case Height:
+ return m_height->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGForeignObjectElementImpl.h b/ksvg/impl/SVGForeignObjectElementImpl.h
new file mode 100644
index 00000000..3fea4877
--- /dev/null
+++ b/ksvg/impl/SVGForeignObjectElementImpl.h
@@ -0,0 +1,78 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGForeignObjectElementImpl_H
+#define SVGForeignObjectElementImpl_H
+
+#include "SVGTestsImpl.h"
+#include "SVGElementImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedLengthImpl;
+class SVGForeignObjectElementImpl : public SVGElementImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGForeignObjectElementImpl(DOM::ElementImpl *);
+ virtual ~SVGForeignObjectElementImpl();
+
+ virtual SVGRectImpl *getBBox();
+
+ SVGAnimatedLengthImpl *x() const;
+ SVGAnimatedLengthImpl *y() const;
+ SVGAnimatedLengthImpl *width() const;
+ SVGAnimatedLengthImpl *height() const;
+
+private:
+ SVGAnimatedLengthImpl *m_x;
+ SVGAnimatedLengthImpl *m_y;
+ SVGAnimatedLengthImpl *m_width;
+ SVGAnimatedLengthImpl *m_height;
+
+public:
+ KSVG_GET
+ KSVG_FORWARDPUT
+
+ enum
+ {
+ // Properties
+ X, Y, Width, Height
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGGElementImpl.cc b/ksvg/impl/SVGGElementImpl.cc
new file mode 100644
index 00000000..9f355540
--- /dev/null
+++ b/ksvg/impl/SVGGElementImpl.cc
@@ -0,0 +1,36 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGGElementImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGAElementImpl.h"
+#include "SVGAnimatedStringImpl.h"
+
+using namespace KSVG;
+
+SVGGElementImpl::SVGGElementImpl(DOM::ElementImpl *impl) : SVGContainerImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+}
+
+SVGGElementImpl::~SVGGElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGGElementImpl.h b/ksvg/impl/SVGGElementImpl.h
new file mode 100644
index 00000000..ca4a9b4e
--- /dev/null
+++ b/ksvg/impl/SVGGElementImpl.h
@@ -0,0 +1,59 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGGElementImpl_H
+#define SVGGElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGContainerImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGGElementImpl : public SVGContainerImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGGElementImpl(DOM::ElementImpl *);
+ virtual ~SVGGElementImpl();
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGGElementImpl, "g")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGGlyphElementImpl.cc b/ksvg/impl/SVGGlyphElementImpl.cc
new file mode 100644
index 00000000..dd201466
--- /dev/null
+++ b/ksvg/impl/SVGGlyphElementImpl.cc
@@ -0,0 +1,98 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGGlyphElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGGlyphElementImpl.lut.h"
+
+SVGGlyphElementImpl::SVGGlyphElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGStylableImpl(this)
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGGlyphElementImpl::~SVGGlyphElementImpl()
+{
+}
+
+QString SVGGlyphElementImpl::d() const
+{
+ return m_d;
+}
+
+/*
+@namespace KSVG
+@begin SVGGlyphElementImpl::s_hashTable 11
+ unicode SVGGlyphElementImpl::Unicode DontDelete|ReadOnly
+ glyph-name SVGGlyphElementImpl::GlyphName DontDelete|ReadOnly
+ d SVGGlyphElementImpl::D DontDelete|ReadOnly
+ orientation SVGGlyphElementImpl::Orientation DontDelete|ReadOnly
+ arabic-form SVGGlyphElementImpl::ArabicForm DontDelete|ReadOnly
+ lang SVGGlyphElementImpl::Lang DontDelete|ReadOnly
+ horiz-adv-x SVGGlyphElementImpl::HorizAdvX DontDelete|ReadOnly
+ vert-origin-x SVGGlyphElementImpl::VertOriginX DontDelete|ReadOnly
+ vert-origin-y SVGGlyphElementImpl::VertOriginY DontDelete|ReadOnly
+ vert-adv-y SVGGlyphElementImpl::VertAdvY DontDelete|ReadOnly
+@end
+*/
+
+Value SVGGlyphElementImpl::getValueProperty(ExecState *, int token) const
+{
+ //KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGGlyphElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case D:
+ m_d = value.toString(exec).qstring();
+ break;
+ case Unicode:
+ case GlyphName:
+ case Orientation:
+ case ArabicForm:
+ case Lang:
+ case HorizAdvX:
+ case VertOriginX:
+ case VertOriginY:
+ case VertAdvY:
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGGlyphElementImpl.h b/ksvg/impl/SVGGlyphElementImpl.h
new file mode 100644
index 00000000..35781b2c
--- /dev/null
+++ b/ksvg/impl/SVGGlyphElementImpl.h
@@ -0,0 +1,66 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGGlyphElementImpl_H
+#define SVGGlyphElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+
+namespace KSVG
+{
+
+class SVGGlyphElementImpl : public SVGElementImpl,
+ public SVGStylableImpl
+{
+public:
+ SVGGlyphElementImpl(DOM::ElementImpl *);
+ virtual ~SVGGlyphElementImpl();
+
+ QString d() const;
+
+private:
+ QString m_d;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ Unicode, GlyphName, D, Orientation, ArabicForm,
+ Lang, HorizAdvX, VertOriginX, VertOriginY, VertAdvY
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGGlyphElementImpl, "glyph")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGGlyphRefElementImpl.cc b/ksvg/impl/SVGGlyphRefElementImpl.cc
new file mode 100644
index 00000000..438fa0b0
--- /dev/null
+++ b/ksvg/impl/SVGGlyphRefElementImpl.cc
@@ -0,0 +1,134 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGSVGElementImpl.h"
+#include "SVGGlyphRefElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGGlyphRefElementImpl.lut.h"
+#include "ksvg_lookup.h"
+
+SVGGlyphRefElementImpl::SVGGlyphRefElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGURIReferenceImpl(), SVGStylableImpl(this)
+{
+}
+
+SVGGlyphRefElementImpl::~SVGGlyphRefElementImpl()
+{
+}
+
+void SVGGlyphRefElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+}
+
+DOM::DOMString SVGGlyphRefElementImpl::format()
+{
+ return "";
+}
+
+DOM::DOMString SVGGlyphRefElementImpl::glyphRef()
+{
+ return "";
+}
+
+float SVGGlyphRefElementImpl::x() const
+{
+ return m_x;
+}
+
+float SVGGlyphRefElementImpl::y() const
+{
+ return m_y;
+}
+
+float SVGGlyphRefElementImpl::dx() const
+{
+ return m_dx;
+}
+
+float SVGGlyphRefElementImpl::dy() const
+{
+ return m_dy;
+}
+
+/*
+@namespace KSVG
+@begin SVGGlyphRefElementImpl::s_hashTable 7
+ glyphRef SVGGlyphRefElementImpl::GlyphRef DontDelete|ReadOnly
+ format SVGGlyphRefElementImpl::Format DontDelete|ReadOnly
+ x SVGGlyphRefElementImpl::X DontDelete|ReadOnly
+ y SVGGlyphRefElementImpl::Y DontDelete|ReadOnly
+ dx SVGGlyphRefElementImpl::Dx DontDelete|ReadOnly
+ dy SVGGlyphRefElementImpl::Dy DontDelete|ReadOnly
+@end
+*/
+
+Value SVGGlyphRefElementImpl::getValueProperty(ExecState *, int token) const
+{
+ //KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case GlyphRef: return String(m_glyphRef);
+ case Format: return String(m_format);
+ case X: return Number(m_x);
+ case Y: return Number(m_y);
+ case Dx: return Number(m_dx);
+ case Dy: return Number(m_dy);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGGlyphRefElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case GlyphRef:
+ m_glyphRef = value.toString(exec).string();
+ break;
+ case Format:
+ m_format = value.toString(exec).string();
+ break;
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ case Dx:
+ m_dx = value.toNumber(exec);
+ break;
+ case Dy:
+ m_dy = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGGlyphRefElementImpl.h b/ksvg/impl/SVGGlyphRefElementImpl.h
new file mode 100644
index 00000000..6a292a64
--- /dev/null
+++ b/ksvg/impl/SVGGlyphRefElementImpl.h
@@ -0,0 +1,79 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGGlyphRefElementImpl_H
+#define SVGGlyphRefElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGStylableImpl.h"
+
+namespace KSVG
+{
+
+class SVGGlyphRefElementImpl : public SVGElementImpl,
+ public SVGURIReferenceImpl,
+ public SVGStylableImpl
+{
+public:
+ SVGGlyphRefElementImpl(DOM::ElementImpl *);
+ virtual ~SVGGlyphRefElementImpl();
+ virtual void setAttributes();
+
+ DOM::DOMString glyphRef();
+ DOM::DOMString format();
+
+ float x() const;
+ float y() const;
+ float dx() const;
+ float dy() const;
+
+private:
+ DOM::DOMString m_glyphRef;
+ DOM::DOMString m_format;
+ float m_x;
+ float m_y;
+ float m_dx;
+ float m_dy;
+
+public:
+ KSVG_BRIDGE
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ GlyphRef, Format, X, Y, Dx, Dy
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGGlyphRefElementImpl, "glyphRef")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGGradientElementImpl.cc b/ksvg/impl/SVGGradientElementImpl.cc
new file mode 100644
index 00000000..180b230a
--- /dev/null
+++ b/ksvg/impl/SVGGradientElementImpl.cc
@@ -0,0 +1,264 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGGradientElement.h"
+#include "SVGGradientElementImpl.h"
+#include "SVGStopElementImpl.h"
+#include "SVGAnimatedStringImpl.h"
+#include "SVGSVGElementImpl.h"
+
+#include "KSVGCanvas.h"
+#include "CanvasItems.h"
+#include "SVGHelperImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGAnimatedTransformListImpl.h"
+#include "SVGTransformListImpl.h"
+#include "SVGUnitConverter.h"
+
+using namespace KSVG;
+
+#include "SVGGradientElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+#include "ksvg_cacheimpl.h"
+
+SVGGradientElementImpl::SVGGradientElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGURIReferenceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGPaintServerImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_gradientUnits = new SVGAnimatedEnumerationImpl();
+ m_gradientUnits->ref();
+
+ m_gradientTransform = new SVGAnimatedTransformListImpl();
+ m_gradientTransform->ref();
+
+ m_spreadMethod = new SVGAnimatedEnumerationImpl();
+ m_spreadMethod->ref();
+
+ m_converter = new SVGUnitConverter();
+}
+
+SVGGradientElementImpl::~SVGGradientElementImpl()
+{
+ if(m_gradientUnits)
+ m_gradientUnits->deref();
+ if(m_gradientTransform)
+ m_gradientTransform->deref();
+ if(m_spreadMethod)
+ m_spreadMethod->deref();
+ delete m_converter;
+}
+
+SVGAnimatedEnumerationImpl *SVGGradientElementImpl::gradientUnits() const
+{
+ return m_gradientUnits;
+}
+
+SVGAnimatedTransformListImpl *SVGGradientElementImpl::gradientTransform() const
+{
+ return m_gradientTransform;
+}
+
+SVGAnimatedEnumerationImpl *SVGGradientElementImpl::spreadMethod() const
+{
+ return m_spreadMethod;
+}
+
+/*
+@namespace KSVG
+@begin SVGGradientElementImpl::s_hashTable 5
+ gradientUnits SVGGradientElementImpl::GradientUnits DontDelete|ReadOnly
+ gradientTransform SVGGradientElementImpl::GradientTransform DontDelete|ReadOnly
+ spreadMethod SVGGradientElementImpl::SpreadMethod DontDelete|ReadOnly
+@end
+*/
+
+Value SVGGradientElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case GradientUnits:
+ return m_gradientUnits->cache(exec);
+ case GradientTransform:
+ return m_gradientTransform->cache(exec);
+ case SpreadMethod:
+ return m_spreadMethod->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGGradientElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case GradientUnits:
+ if(value.toString(exec).qstring() == "userSpaceOnUse")
+ m_gradientUnits->setBaseVal(SVGGradientElement::SVG_UNIT_TYPE_USERSPACEONUSE);
+ else
+ m_gradientUnits->setBaseVal(SVGGradientElement::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+ break;
+ case GradientTransform:
+ m_gradientTransform->baseVal()->clear();
+ SVGHelperImpl::parseTransformAttribute(m_gradientTransform->baseVal(), value.toString(exec).qstring());
+ break;
+ case SpreadMethod:
+ {
+ QString spreadMethod = value.toString(exec).qstring();
+
+ if(spreadMethod == "repeat")
+ m_spreadMethod->setBaseVal(SVG_SPREADMETHOD_REPEAT);
+ else if(spreadMethod == "reflect")
+ m_spreadMethod->setBaseVal(SVG_SPREADMETHOD_REFLECT);
+ else
+ m_spreadMethod->setBaseVal(SVG_SPREADMETHOD_PAD);
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+void SVGGradientElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+ setAttributesFromHref();
+
+ // Spec: if attribute not specified, use "pad"
+ if(KSVG_TOKEN_NOT_PARSED(SpreadMethod))
+ KSVG_SET_ALT_ATTRIBUTE(SpreadMethod, "pad")
+
+ // Spec: if attribute not specified, use objectBoundingBox
+ if(KSVG_TOKEN_NOT_PARSED(GradientUnits))
+ KSVG_SET_ALT_ATTRIBUTE(GradientUnits, "objectBoundingBox")
+}
+
+void SVGGradientElementImpl::setAttributesFromHref()
+{
+ QString _href = SVGURIReferenceImpl::getTarget(href()->baseVal().string());
+
+ if(!_href.isEmpty())
+ {
+ SVGGradientElementImpl *refGradient = dynamic_cast<SVGGradientElementImpl *>(ownerSVGElement()->getElementById(_href));
+
+ if(refGradient)
+ {
+ QMap<QString, DOM::DOMString> refAttributes = refGradient->gradientAttributes();
+ QMap<QString, DOM::DOMString>::iterator it;
+
+ for(it = refAttributes.begin(); it != refAttributes.end(); ++it)
+ {
+ QString name = it.key();
+ DOM::DOMString value = it.data();
+
+ if(!hasAttribute(name))
+ {
+ setAttribute(name, value);
+ setAttributeInternal(name, value);
+ }
+ }
+ }
+ }
+}
+
+SVGGradientElementImpl *SVGGradientElementImpl::stopsSource()
+{
+ // Spec:
+ // If this element has no defined gradient stops, and the referenced element does
+ // (possibly due to its own href attribute), then this element inherits the gradient stop from the referenced element.
+ // Inheritance can be indirect to an arbitrary level; thus, if the referenced element inherits attribute or gradient stops
+ // due to its own href attribute, then the current element can inherit those attributes or gradient stops. (mop)
+ bool haveStops = false;
+
+ for(DOM::Node node = firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ SVGStopElementImpl *stop = dynamic_cast<SVGStopElementImpl *>(ownerDoc()->getElementFromHandle(node.handle()));
+
+ if(stop)
+ {
+ haveStops = true;
+ break;
+ }
+ }
+
+ SVGGradientElementImpl *source = this;
+
+ if(!haveStops)
+ {
+ QString _href = SVGURIReferenceImpl::getTarget(href()->baseVal().string());
+
+ if(!_href.isEmpty())
+ {
+ SVGGradientElementImpl *refGradient = dynamic_cast<SVGGradientElementImpl *>(ownerSVGElement()->getElementById(_href));
+
+ if(refGradient)
+ source = refGradient->stopsSource();
+ }
+ }
+
+ return source;
+}
+
+void SVGGradientElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_paintServer)
+ m_paintServer = c->createPaintServer(this);
+}
+
+void SVGGradientElementImpl::removeItem(KSVGCanvas *)
+{
+ delete m_paintServer;
+ m_paintServer = 0;
+}
+
+/*
+@namespace KSVG
+@begin SVGGradientElementImplConstructor::s_hashTable 5
+ SVG_SPREADMETHOD_UNKNOWN KSVG::SVG_SPREADMETHOD_UNKNOWN DontDelete|ReadOnly
+ SVG_SPREADMETHOD_PAD KSVG::SVG_SPREADMETHOD_PAD DontDelete|ReadOnly
+ SVG_SPREADMETHOD_REFLECT KSVG::SVG_SPREADMETHOD_REFLECT DontDelete|ReadOnly
+ SVG_SPREADMETHOD_REPEAT KSVG::SVG_SPREADMETHOD_REPEAT DontDelete|ReadOnly
+@end
+*/
+
+using namespace KJS;
+
+Value SVGGradientElementImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGGradientElementImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGGradientElementImplConstructor>(exec, "[[svggradientelement.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGGradientElementImpl.h b/ksvg/impl/SVGGradientElementImpl.h
new file mode 100644
index 00000000..e9be92d8
--- /dev/null
+++ b/ksvg/impl/SVGGradientElementImpl.h
@@ -0,0 +1,110 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGGradientElementImpl_H
+#define SVGGradientElementImpl_H
+
+#include <qmap.h>
+
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+#include "SVGPaintServerImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGUnitConverter;
+class SVGAnimatedEnumerationImpl;
+class SVGAnimatedTransformListImpl;
+class SVGGradientElementImpl : public SVGElementImpl,
+ public SVGURIReferenceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGPaintServerImpl
+{
+public:
+ SVGGradientElementImpl(DOM::ElementImpl *);
+ virtual ~SVGGradientElementImpl();
+
+ SVGAnimatedEnumerationImpl *gradientUnits() const;
+ SVGAnimatedTransformListImpl *gradientTransform() const;
+ SVGAnimatedEnumerationImpl *spreadMethod() const;
+
+ virtual void setAttributes();
+
+ virtual void createItem(KSVGCanvas *c = 0);
+ virtual void removeItem(KSVGCanvas *c);
+
+ SVGUnitConverter *converter() const { return m_converter; }
+
+ // Returns the gradient element that holds the stops for this gradient,
+ // taking into account indirection through href.
+ SVGGradientElementImpl *stopsSource();
+
+ // Returns the linear/radial gradient attributes set on this element,
+ // taking into account indirection through href.
+ virtual QMap<QString, DOM::DOMString> gradientAttributes() = 0;
+
+protected:
+ void setAttributesFromHref();
+
+private:
+ SVGAnimatedEnumerationImpl *m_gradientUnits;
+ SVGAnimatedTransformListImpl *m_gradientTransform;
+ SVGAnimatedEnumerationImpl *m_spreadMethod;
+
+ SVGUnitConverter *m_converter;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_NO_TAG_BRIDGE
+
+ enum
+ {
+ // Properties
+ GradientUnits, GradientTransform, SpreadMethod
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGGradientElementImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGGradientElementImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGGradientElementImplConstructor(KJS::ExecState *exec);
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGHKernElementImpl.cc b/ksvg/impl/SVGHKernElementImpl.cc
new file mode 100644
index 00000000..df310d6e
--- /dev/null
+++ b/ksvg/impl/SVGHKernElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGHKernElementImpl.h"
+
+using namespace KSVG;
+
+SVGHKernElementImpl::SVGHKernElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+}
+
+SVGHKernElementImpl::~SVGHKernElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGHKernElementImpl.h b/ksvg/impl/SVGHKernElementImpl.h
new file mode 100644
index 00000000..6858b5be
--- /dev/null
+++ b/ksvg/impl/SVGHKernElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGHKernElementImpl_H
+#define SVGHKernElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGHKernElementImpl : public SVGElementImpl
+{
+public:
+ SVGHKernElementImpl(DOM::ElementImpl *);
+ virtual ~SVGHKernElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGHelperImpl.cc b/ksvg/impl/SVGHelperImpl.cc
new file mode 100644
index 00000000..ed7e8be4
--- /dev/null
+++ b/ksvg/impl/SVGHelperImpl.cc
@@ -0,0 +1,230 @@
+/*
+ Copyright (C) 2002-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qregexp.h>
+
+#include "SVGRectImpl.h"
+#include "SVGMatrixImpl.h"
+#include "SVGHelperImpl.h"
+#include "SVGElementImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGTransformImpl.h"
+#include "SVGStringListImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGTransformListImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGAnimatedLengthListImpl.h"
+
+#include "KSVGCanvas.h"
+#include "CanvasItem.h"
+
+using namespace KSVG;
+
+#include "ksvg_ecma.h"
+#include "ksvg_window.h"
+
+SVGHelperImpl::SVGHelperImpl()
+{
+}
+
+SVGHelperImpl::~SVGHelperImpl()
+{
+}
+
+void SVGHelperImpl::updateItem(KJS::ExecState *exec, const DOM::Node node)
+{
+ // Get document
+ SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
+
+ // Update canvas, recursively if needed
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(doc->getElementFromHandle(node.handle()));
+
+ if(shape && shape->item())
+ {
+ shape->item()->update(UPDATE_TRANSFORM);
+ shape->item()->draw();
+ shape->blit(doc->canvas());
+ }
+
+ if(const_cast<DOM::Node &>(node).hasChildNodes())
+ {
+ DOM::Node iterate = node.firstChild();
+ for(; !iterate.isNull(); iterate = iterate.nextSibling())
+ updateItem(exec, iterate);
+ }
+}
+
+void SVGHelperImpl::copyAttributes(SVGElementImpl *src, SVGElementImpl *dst)
+{
+ QDictIterator<DOM::DOMString> it(src->attributes());
+ for(; it.current(); ++it)
+ {
+ DOM::DOMString name = it.currentKey();
+ DOM::DOMString value = it.current()->string();
+
+ if(name != "id" && !dst->hasAttribute(name))
+ {
+ dst->setAttribute(name, value);
+ dst->setAttributeInternal(name, value);
+ }
+ }
+}
+
+void SVGHelperImpl::parseList(SVGStringListImpl *list, char seperator, const QString &data)
+{
+ // TODO : more error checking/reporting
+ list->clear();
+
+ QStringList substrings = QStringList::split(seperator, data);
+ QStringList::ConstIterator it = substrings.begin();
+ QStringList::ConstIterator end = substrings.end();
+ for(; it != end; ++it)
+ {
+ SharedString *string = new SharedString(*it);
+ string->ref();
+
+ list->appendItem(string);
+ }
+}
+
+void SVGHelperImpl::parseLengthList(SVGAnimatedLengthListImpl *list, const QString &lengths, LengthMode mode, SVGElementImpl *object)
+{
+ // get either comma or space delimited lists
+ // TODO : more error checking/reporting
+ QStringList sublengths = QStringList::split(QRegExp("[, ]"), lengths);
+ QStringList::ConstIterator it = sublengths.begin();
+ QStringList::ConstIterator end = sublengths.end();
+
+ SVGLengthImpl *lengthImpl = 0;
+ for(; it != end; ++it)
+ {
+ lengthImpl = new SVGLengthImpl(mode, object);
+ lengthImpl->ref();
+
+ lengthImpl->setValueAsString(*it);
+ list->baseVal()->appendItem(lengthImpl);
+ }
+}
+
+void SVGHelperImpl::parseCommaSeperatedList(SVGStringListImpl *list, const QString &data)
+{
+ parseList(list, ',', data);
+}
+
+void SVGHelperImpl::parseSemicolonSeperatedList(SVGStringListImpl *list, const QString &data)
+{
+ parseList(list, ';', data);
+}
+
+void SVGHelperImpl::parseTransformAttribute(SVGTransformListImpl *list, const QString &transform)
+{
+ // Split string for handling 1 transform statement at a time
+ QStringList subtransforms = QStringList::split(')', transform);
+ QStringList::ConstIterator it = subtransforms.begin();
+ QStringList::ConstIterator end = subtransforms.end();
+ for(; it != end; ++it)
+ {
+ QStringList subtransform = QStringList::split('(', (*it));
+
+ subtransform[0] = subtransform[0].stripWhiteSpace().lower();
+ subtransform[1] = subtransform[1].simplifyWhiteSpace();
+ QRegExp reg("([-]?\\d*\\.?\\d+(?:e[-]?\\d+)?)");
+
+ int pos = 0;
+ QStringList params;
+
+ while(pos >= 0)
+ {
+ pos = reg.search(subtransform[1], pos);
+ if(pos != -1)
+ {
+ params += reg.cap(1);
+ pos += reg.matchedLength();
+ }
+ }
+
+ if(subtransform[0].startsWith(";") || subtransform[0].startsWith(","))
+ subtransform[0] = subtransform[0].right(subtransform[0].length() - 1);
+
+ SVGTransformImpl *t = SVGSVGElementImpl::createSVGTransform();
+
+ if(subtransform[0] == "rotate")
+ {
+ if(params.count() == 3)
+ t->setRotate(params[0].toDouble(),
+ params[1].toDouble(),
+ params[2].toDouble());
+ else
+ t->setRotate(params[0].toDouble(), 0, 0);
+ }
+ else if(subtransform[0] == "translate")
+ {
+ if(params.count() == 2)
+ t->setTranslate(params[0].toDouble(), params[1].toDouble());
+ else // Spec : if only one param given, assume 2nd param to be 0
+ t->setTranslate(params[0].toDouble(), 0);
+ }
+ else if(subtransform[0] == "scale")
+ {
+ if(params.count() == 2)
+ t->setScale(params[0].toDouble(), params[1].toDouble());
+ else // Spec : if only one param given, assume uniform scaling
+ t->setScale(params[0].toDouble(), params[0].toDouble());
+ }
+ else if(subtransform[0] == "skewx")
+ t->setSkewX(params[0].toDouble());
+ else if(subtransform[0] == "skewy")
+ t->setSkewY(params[0].toDouble());
+ else if(subtransform[0] == "matrix")
+ {
+ if(params.count() >= 6)
+ {
+ SVGMatrixImpl *ret = new SVGMatrixImpl(params[0].toDouble(),
+ params[1].toDouble(),
+ params[2].toDouble(),
+ params[3].toDouble(),
+ params[4].toDouble(),
+ params[5].toDouble());
+ t->setMatrix(ret);
+ }
+ }
+
+ list->appendItem(t);
+ }
+}
+
+/// convert from user space to "real" pixels on rendering area
+QRect SVGHelperImpl::fromUserspace(SVGElementImpl *obj, const QRect &r)
+{
+ QRect sr;
+
+ SVGLocatableImpl *locate = dynamic_cast<SVGLocatableImpl *>(obj);
+
+ if(locate)
+ sr = locate->screenCTM()->qmatrix().mapRect(r);
+
+ return sr;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGHelperImpl.h b/ksvg/impl/SVGHelperImpl.h
new file mode 100644
index 00000000..e8bbdb39
--- /dev/null
+++ b/ksvg/impl/SVGHelperImpl.h
@@ -0,0 +1,88 @@
+/*
+ Copyright (C) 2002-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGHelperImpl_H
+#define SVGHelperImpl_H
+
+#include <dom/dom_element.h>
+
+#include "SVGElementImpl.h"
+#include "SVGLengthImpl.h"
+#include "SVGDocumentImpl.h"
+#include "ksvg_ecma.h"
+
+#include "ksvg_lookup.h"
+
+class QRect;
+class QString;
+
+namespace KSVG
+{
+class SVGStringListImpl;
+class SVGTransformListImpl;
+class SVGAnimatedLengthListImpl;
+
+class SVGHelperImpl
+{
+public:
+ SVGHelperImpl();
+ ~SVGHelperImpl();
+
+ // Dynamic attribute updating
+ template<class T>
+ static void applyContainer(T *obj, int token, const QString &value)
+ {
+ SVGElementImpl *element = dynamic_cast<SVGElementImpl *>(obj);
+ if(!element || !element->hasChildNodes())
+ return;
+
+ // Very fast propagation of attributes, when the token is known! (Niko)
+ for(DOM::Node node = element->firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ T *cast = dynamic_cast<T *>(element->ownerDoc()->getElementFromHandle(node.handle()));
+ if(cast)
+ cast->putValueProperty(element->ownerDoc()->ecmaEngine()->globalExec(), token, KJS::String(value), KJS::Internal);
+ }
+ }
+
+ // Update item on canvas
+ static void updateItem(KJS::ExecState *exec, const DOM::Node node);
+ static void copyAttributes(SVGElementImpl *src, SVGElementImpl *dst);
+
+ // SVGAnimatedLengthList
+ static void parseLengthList(SVGAnimatedLengthListImpl *list, const QString &lengths, LengthMode mode = LENGTHMODE_UNKNOWN, SVGElementImpl *object = 0);
+
+ // SVGStringList
+ static void parseList(SVGStringListImpl *list, char seperator, const QString &data);
+ static void parseCommaSeperatedList(SVGStringListImpl *list, const QString &data);
+ static void parseSemicolonSeperatedList(SVGStringListImpl *list, const QString &data);
+
+ // SVGTransformList
+ static void parseTransformAttribute(SVGTransformListImpl *list, const QString &transform);
+
+ // Tools
+ static QRect fromUserspace(SVGElementImpl *, const QRect &);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGICCColorImpl.cc b/ksvg/impl/SVGICCColorImpl.cc
new file mode 100644
index 00000000..3e708ee9
--- /dev/null
+++ b/ksvg/impl/SVGICCColorImpl.cc
@@ -0,0 +1,107 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGICCColorImpl.h"
+#include "SVGNumberListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGICCColorImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGICCColorImpl::SVGICCColorImpl() : DOM::DomShared()
+{
+ m_colors = new SVGNumberListImpl();
+ m_colors->ref();
+}
+
+SVGICCColorImpl::SVGICCColorImpl(const SVGICCColorImpl &other) : DOM::DomShared()
+{
+ (*this) = other;
+}
+
+SVGICCColorImpl::~SVGICCColorImpl()
+{
+ if(m_colors)
+ m_colors->deref();
+}
+
+SVGICCColorImpl &SVGICCColorImpl::operator=(const SVGICCColorImpl &other)
+{
+ m_colorProfile = other.m_colorProfile;
+ *m_colors = *(other.m_colors);
+
+ return *this;
+}
+
+DOM::DOMString SVGICCColorImpl::colorProfile() const
+{
+ return m_colorProfile;
+}
+
+void SVGICCColorImpl::setColorProfile(const DOM::DOMString &colorProfile)
+{
+ m_colorProfile = colorProfile;
+}
+
+SVGNumberListImpl *SVGICCColorImpl::colors() const
+{
+ return m_colors;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGICCColorImpl::s_hashTable 3
+ colorProfile SVGICCColorImpl::ColorProfile DontDelete
+ colors SVGICCColorImpl::Colors DontDelete|ReadOnly
+@end
+*/
+
+Value SVGICCColorImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case ColorProfile:
+ return String(m_colorProfile.string());
+ case Colors:
+ return m_colors->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGICCColorImpl::putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case ColorProfile:
+ m_colorProfile = value.toString(exec).string();
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGICCColorImpl.h b/ksvg/impl/SVGICCColorImpl.h
new file mode 100644
index 00000000..1427e59c
--- /dev/null
+++ b/ksvg/impl/SVGICCColorImpl.h
@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGICCColorImpl_H
+#define SVGICCColorImpl_H
+
+#include <dom/dom_misc.h>
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGNumberListImpl;
+class SVGICCColorImpl : public DOM::DomShared
+{
+public:
+ SVGICCColorImpl();
+ SVGICCColorImpl(const SVGICCColorImpl &);
+ virtual ~SVGICCColorImpl();
+
+ SVGICCColorImpl &operator=(const SVGICCColorImpl &);
+
+ void setColorProfile(const DOM::DOMString &colorProfile);
+ DOM::DOMString colorProfile() const;
+ SVGNumberListImpl *colors() const;
+
+private:
+ DOM::DOMString m_colorProfile;
+ SVGNumberListImpl *m_colors;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ ColorProfile, Colors
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGImageElementImpl.cc b/ksvg/impl/SVGImageElementImpl.cc
new file mode 100644
index 00000000..608dbda5
--- /dev/null
+++ b/ksvg/impl/SVGImageElementImpl.cc
@@ -0,0 +1,522 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qimage.h>
+#include <qtimer.h>
+
+#include <kdebug.h>
+
+#include "CanvasItem.h"
+#include "KSVGCanvas.h"
+#include "KSVGHelper.h"
+
+#include "SVGRectImpl.h"
+#include "SVGEventImpl.h"
+#include "SVGMatrixImpl.h"
+#include "SVGHelperImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGTransformImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGTransformListImpl.h"
+#include "SVGAnimatedStringImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGImageElementImpl.moc"
+#include "SVGColorProfileElementImpl.h"
+#include "SVGPreserveAspectRatioImpl.h"
+#include "SVGAnimatedTransformListImpl.h"
+#include "SVGAnimatedPreserveAspectRatioImpl.h"
+#include "SVGPatternElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGImageElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGImageElementImpl::SVGImageElementImpl(DOM::ElementImpl *impl) : QObject(), SVGShapeImpl(impl), SVGURIReferenceImpl(), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_x->ref();
+ m_x->baseVal()->setValueAsString("-1");
+
+ m_y = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_y->ref();
+ m_y->baseVal()->setValueAsString("-1");
+
+ m_width = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_width->ref();
+ m_width->baseVal()->setValueAsString("-1");
+
+ m_height = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_height->ref();
+ m_height->baseVal()->setValueAsString("-1");
+
+ m_preserveAspectRatio = 0;
+
+ m_doc = 0;
+ m_image = 0;
+ m_svgRoot = 0;
+ m_colorProfile = 0;
+ m_colorProfileApplied = false;
+}
+
+SVGImageElementImpl::~SVGImageElementImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_width)
+ m_width->deref();
+ if(m_height)
+ m_height->deref();
+ if(m_preserveAspectRatio)
+ m_preserveAspectRatio->deref();
+ if(m_doc)
+ m_doc->deref();
+
+ delete m_image;
+}
+
+SVGAnimatedLengthImpl *SVGImageElementImpl::x()
+{
+ return m_x;
+}
+
+SVGAnimatedLengthImpl *SVGImageElementImpl::y()
+{
+ return m_y;
+}
+
+SVGAnimatedLengthImpl *SVGImageElementImpl::width()
+{
+ return m_width;
+}
+
+SVGAnimatedLengthImpl *SVGImageElementImpl::height()
+{
+ return m_height;
+}
+
+SVGAnimatedPreserveAspectRatioImpl *SVGImageElementImpl::preserveAspectRatio() const
+{
+ return m_preserveAspectRatio;
+}
+
+/*
+@namespace KSVG
+@namespace KSVG
+@begin SVGImageElementImpl::s_hashTable 7
+ x SVGImageElementImpl::X DontDelete|ReadOnly
+ y SVGImageElementImpl::Y DontDelete|ReadOnly
+ width SVGImageElementImpl::Width DontDelete|ReadOnly
+ height SVGImageElementImpl::Height DontDelete|ReadOnly
+ preserveAspectRatio SVGImageElementImpl::PreserveAspectRatio DontDelete|ReadOnly
+ href SVGImageElementImpl::Href DontDelete|ReadOnly
+@end
+*/
+
+Value SVGImageElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case X:
+ if(!attributeMode)
+ return m_x->cache(exec);
+ else
+ return Number(m_x->baseVal()->value());
+ case Y:
+ if(!attributeMode)
+ return m_y->cache(exec);
+ else
+ return Number(m_y->baseVal()->value());
+ case Width:
+ if(!attributeMode)
+ return m_width->cache(exec);
+ else
+ return Number(m_width->baseVal()->value());
+ case Height:
+ if(!attributeMode)
+ return m_height->cache(exec);
+ else
+ return Number(m_height->baseVal()->value());
+ case PreserveAspectRatio:
+ if(m_preserveAspectRatio)
+ return m_preserveAspectRatio->cache(exec);
+ else
+ return Undefined();
+ case Href:
+ SVGURIReferenceImpl::getValueProperty(exec, token);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGImageElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case X:
+ x()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Y:
+ y()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Width:
+ width()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Height:
+ height()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case PreserveAspectRatio:
+ if(!preserveAspectRatio())
+ {
+ m_preserveAspectRatio = new SVGAnimatedPreserveAspectRatioImpl();
+ m_preserveAspectRatio->ref();
+ }
+
+ preserveAspectRatio()->baseVal()->parsePreserveAspectRatio(value.toString(exec).qstring());
+ break;
+ case Href:
+ SVGURIReferenceImpl::putValueProperty(exec, SVGURIReferenceImpl::Href, value, attr);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+SVGRectImpl *SVGImageElementImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+ ret->setX(m_x->baseVal()->value());
+ ret->setY(m_y->baseVal()->value());
+ ret->setWidth(m_width->baseVal()->value());
+ ret->setHeight(m_height->baseVal()->value());
+ return ret;
+}
+
+void SVGImageElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ if(KSVG_TOKEN_NOT_PARSED(X))
+ KSVG_SET_ALT_ATTRIBUTE(X, "0")
+
+ if(KSVG_TOKEN_NOT_PARSED(Y))
+ KSVG_SET_ALT_ATTRIBUTE(Y, "0")
+
+ if(KSVG_TOKEN_NOT_PARSED(PreserveAspectRatio))
+ {
+ setAttribute("preserveAspectRatio", "xMidYMid meet");
+ KSVG_SET_ALT_ATTRIBUTE(PreserveAspectRatio, "xMidYMid meet")
+ }
+}
+
+void SVGImageElementImpl::slotParsingFinished(bool error, const QString &errorDesc)
+{
+ if(error)
+ kdDebug(26003) << "Finished with error : " << errorDesc << endl;
+ else
+ kdDebug(26003) << "Finished without errors!" << endl;
+
+ m_svgRoot = m_doc->rootElement();
+}
+
+void SVGImageElementImpl::slotLoadingFinished()
+{
+ ownerDoc()->notifyImageLoaded(this);
+}
+
+void SVGImageElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!m_item)
+ {
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ m_item = c->createImage(this);
+ c->insert(m_item);
+
+ if(href()->baseVal().string().endsWith(".svg") || href()->baseVal().string().endsWith(".svgz"))
+ {
+ if(!m_svgRoot)
+ {
+ m_doc = new SVGDocumentImpl(true, false, this);
+ m_doc->ref();
+ m_doc->attach(c);
+
+ connect(m_doc, SIGNAL(finishedParsing(bool, const QString &)), this, SLOT(slotParsingFinished(bool, const QString &)));
+ connect(m_doc, SIGNAL(finishedLoading()), this, SLOT(slotLoadingFinished()));
+
+ KURL file;
+
+ if(!KURL::isRelativeURL(href()->baseVal().string()))
+ file = KURL(href()->baseVal().string());
+ else
+ file = KURL(ownerDoc()->baseUrl(), href()->baseVal().string());
+
+ m_doc->open(file);
+
+ // The svg image will add items to the canvas in parallel with the main
+ // document, so the z-order will not be correct. Get it to fix this when everything's
+ // finished loading.
+ ownerDoc()->resortZIndicesOnFinishedLoading();
+ ownerDoc()->notifyImageLoading(this);
+ }
+ else
+ m_svgRoot->createItem(c);
+ }
+ else
+ {
+ if(!m_image)
+ {
+ ownerDoc()->newImageJob(this);
+ ownerDoc()->notifyImageLoading(this);
+ }
+ }
+ }
+}
+
+void SVGImageElementImpl::removeItem(KSVGCanvas *c)
+{
+ if(m_item && c)
+ {
+ if(m_svgRoot)
+ m_svgRoot->removeItem(c);
+
+ c->removeItem(m_item);
+ m_item = 0;
+ }
+}
+
+void SVGImageElementImpl::setupSVGElement(SVGSVGElementImpl *svg)
+{
+ // Set up the root svg for an svg image.
+ svg->setAttributeInternal("x", QString("%1").arg(x()->baseVal()->value()));
+ svg->setAttributeInternal("y", QString("%1").arg(y()->baseVal()->value()));
+ svg->setAttributeInternal("width", QString("%1").arg(width()->baseVal()->value()));
+ svg->setAttributeInternal("height", QString("%1").arg(height()->baseVal()->value()));
+
+ QString par = getAttribute("preserveAspectRatio").string().stripWhiteSpace();
+
+ if(par.startsWith("defer"))
+ {
+ if(svg->getAttribute("preserveAspectRatio").isEmpty())
+ {
+ par.remove("defer");
+ svg->setAttribute("preserveAspectRatio", par);
+ svg->setAttributeInternal("preserveAspectRatio", par);
+ }
+ }
+ else
+ {
+ svg->setAttribute("preserveAspectRatio", par);
+ svg->setAttributeInternal("preserveAspectRatio", par);
+ }
+
+ svg->setAttributes();
+ svg->setRootParentScreenCTM(getScreenCTM());
+}
+
+void SVGImageElementImpl::onScreenCTMUpdated()
+{
+ if(m_svgRoot)
+ {
+ SVGMatrixImpl *ctm = getScreenCTM();
+
+ m_svgRoot->setRootParentScreenCTM(ctm);
+ m_svgRoot->invalidateCachedMatrices();
+ m_svgRoot->ownerDoc()->syncCachedMatrices();
+ }
+}
+
+bool SVGImageElementImpl::prepareMouseEvent(const QPoint &p, const QPoint &, SVGMouseEventImpl *mev)
+{
+ // TODO : pointer-events should be stored here, not in SVGStylableImpl.
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(this);
+ if(!style || style->getPointerEvents() == PE_NONE)
+ return false;
+ bool test = true;
+ switch(style->getPointerEvents())
+ {
+ case PE_VISIBLE:
+ case PE_VISIBLE_PAINTED:
+ case PE_VISIBLE_FILL:
+ case PE_VISIBLE_STROKE: test = style->getVisible(); break;
+ case PE_PAINTED:
+ case PE_FILL:
+ case PE_STROKE:
+ case PE_ALL: break;
+ default: test = false;
+ };
+
+ if(test && m_item)
+ {
+ if(m_item->bbox().contains(p))
+ {
+ mev->setTarget(dynamic_cast<SVGElementImpl *>(this));
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void SVGImageElementImpl::setImage(QImage *image)
+{
+ m_image = image;
+
+ if(m_image)
+ {
+ *m_image = m_image->convertDepth(32);
+
+ if(m_colorProfile != 0 && !m_colorProfileApplied)
+ {
+ m_colorProfileApplied = true;
+ applyColorProfile();
+ }
+
+ SVGPatternElementImpl::flushCachedTiles();
+
+ if(m_item)
+ {
+ ownerDoc()->canvas()->invalidate(m_item, false);
+ ownerDoc()->rerender();
+ }
+ }
+
+ ownerDoc()->notifyImageLoaded(this);
+}
+
+QImage SVGImageElementImpl::scaledImage()
+{
+ SVGMatrixImpl *matrix = imageMatrix();
+ double sx, sy;
+
+ matrix->removeScale(&sx, &sy);
+ matrix->deref();
+
+ QImage img;
+
+ if(sx != 1 || sy != 1)
+ {
+ int scaledWidth = static_cast<int>(m_image->width() * sx + 0.5);
+ int scaledHeight = static_cast<int>(m_image->height() * sy + 0.5);
+
+ img = m_image->smoothScale(scaledWidth, scaledHeight);
+ }
+ else
+ img = *m_image;
+
+ return img;
+}
+
+SVGMatrixImpl *SVGImageElementImpl::imageMatrix()
+{
+ SVGMatrixImpl *ctm = getScreenCTM();
+
+ ctm->translate(x()->baseVal()->value(), y()->baseVal()->value());
+
+ SVGMatrixImpl *viewboxMatrix = preserveAspectRatio()->baseVal()->getCTM(0, 0, image()->width(), image()->height(), 0, 0, width()->baseVal()->value(), height()->baseVal()->value());
+
+ ctm->multiply(viewboxMatrix);
+ viewboxMatrix->deref();
+
+ return ctm;
+}
+
+SVGMatrixImpl *SVGImageElementImpl::scaledImageMatrix()
+{
+ SVGMatrixImpl *matrix = imageMatrix();
+ double sx, sy;
+
+ matrix->removeScale(&sx, &sy);
+
+ if(sx != 1 || sy != 1)
+ {
+ int imageWidth = static_cast<int>(m_image->width() * sx + 0.5);
+ int imageHeight = static_cast<int>(m_image->height() * sy + 0.5);
+
+ double trueWidth = m_image->width() * sx;
+ double trueHeight = m_image->height() * sy;
+
+ matrix->scaleNonUniform(trueWidth / imageWidth, trueHeight / imageHeight);
+ }
+
+ return matrix;
+}
+
+KSVGPolygon SVGImageElementImpl::clippingShape()
+{
+ KSVGRectangle viewport(0, 0, width()->baseVal()->value(), height()->baseVal()->value());
+ SVGMatrixImpl *matrix = preserveAspectRatio()->baseVal()->getCTM(0, 0, image()->width(), image()->height(), 0, 0, width()->baseVal()->value(), height()->baseVal()->value());
+ KSVGPolygon p = matrix->inverseMap(viewport);
+ matrix->deref();
+
+ matrix = imageMatrix();
+ p = matrix->map(p);
+ matrix->deref();
+
+ return p;
+}
+
+QString SVGImageElementImpl::fileName() const
+{
+ return href()->baseVal().string();
+}
+
+void SVGImageElementImpl::applyColorProfile()
+{
+ m_image = m_colorProfile->correctImage(m_image);
+}
+
+void SVGImageElementImpl::applyColorProfile(SVGColorProfileElementImpl *profile, SVGImageElementImpl *image)
+{
+ // Only apply once, if it's the same (Niko)
+ if(image->m_colorProfile == profile)
+ return;
+
+ image->m_colorProfile = profile;
+
+ if(image->m_image)
+ {
+ // Image is already painted, we apply the color profile and repaint it
+ image->applyColorProfile();
+
+ if(image->item())
+ {
+ image->ownerDoc()->canvas()->invalidate(image->item(), false);
+ image->ownerDoc()->rerender();
+ }
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGImageElementImpl.h b/ksvg/impl/SVGImageElementImpl.h
new file mode 100644
index 00000000..35ae161f
--- /dev/null
+++ b/ksvg/impl/SVGImageElementImpl.h
@@ -0,0 +1,140 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGImageElementImpl_H
+#define SVGImageElementImpl_H
+
+#include <qobject.h>
+
+#include "ksvg_lookup.h"
+
+#include "SVGTestsImpl.h"
+#include "SVGShapeImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class KSVGPolygon;
+class SVGDocumentImpl;
+class SVGSVGElementImpl;
+class SVGAnimatedLengthImpl;
+class SVGColorProfileElementImpl;
+class SVGAnimatedPreserveAspectRatioImpl;
+class SVGImageElementImpl : public QObject,
+ public SVGShapeImpl,
+ public SVGURIReferenceImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+Q_OBJECT
+public:
+ SVGImageElementImpl(DOM::ElementImpl *);
+ virtual ~SVGImageElementImpl();
+
+ SVGAnimatedLengthImpl *x();
+ SVGAnimatedLengthImpl *y();
+ SVGAnimatedLengthImpl *width();
+ SVGAnimatedLengthImpl *height();
+ SVGAnimatedPreserveAspectRatioImpl *preserveAspectRatio() const;
+
+ virtual void createItem(KSVGCanvas *c);
+ virtual void removeItem(KSVGCanvas *c);
+
+ virtual void setAttributes();
+
+ virtual bool prepareMouseEvent(const QPoint &p, const QPoint &a, SVGMouseEventImpl *mev);
+
+ void setImage(QImage *image);
+ QImage *image() { return m_image; }
+
+ QImage scaledImage();
+ SVGMatrixImpl *imageMatrix();
+ SVGMatrixImpl *scaledImageMatrix();
+
+ SVGSVGElementImpl *svgImageRootElement() const { return m_svgRoot; }
+
+ void applyColorProfile();
+ static void applyColorProfile(SVGColorProfileElementImpl *profile, SVGImageElementImpl *image);
+
+ QString fileName() const;
+
+ virtual SVGRectImpl *getBBox();
+
+ // Screen-space clipping shape
+ KSVGPolygon clippingShape();
+
+ void onScreenCTMUpdated();
+
+ void setupSVGElement(SVGSVGElementImpl *svg);
+
+private slots:
+ void slotParsingFinished(bool error, const QString &errorDesc);
+ void slotLoadingFinished();
+
+private:
+ SVGAnimatedLengthImpl *m_x;
+ SVGAnimatedLengthImpl *m_y;
+ SVGAnimatedLengthImpl *m_width;
+ SVGAnimatedLengthImpl *m_height;
+
+ QImage *m_image;
+
+ bool m_colorProfileApplied;
+ SVGAnimatedPreserveAspectRatioImpl *m_preserveAspectRatio;
+ SVGColorProfileElementImpl *m_colorProfile;
+ SVGSVGElementImpl *m_svgRoot;
+ SVGDocumentImpl *m_doc;
+
+public:
+ KSVG_GET
+ KSVG_BRIDGE
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, Width, Height, PreserveAspectRatio, Href
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+struct ImageStreamMap
+{
+ QByteArray *data;
+ SVGImageElementImpl *imageElement;
+};
+
+KSVG_REGISTER_ELEMENT(SVGImageElementImpl, "image")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLangSpaceImpl.cc b/ksvg/impl/SVGLangSpaceImpl.cc
new file mode 100644
index 00000000..0eaada47
--- /dev/null
+++ b/ksvg/impl/SVGLangSpaceImpl.cc
@@ -0,0 +1,130 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGLangSpaceImpl.h"
+
+using namespace KSVG;
+
+#include "SVGLangSpaceImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGLangSpaceImpl::SVGLangSpaceImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ // Spec: default for xml:space is "default"
+ setXmlspace("default");
+}
+
+SVGLangSpaceImpl::~SVGLangSpaceImpl()
+{
+}
+
+void SVGLangSpaceImpl::setXmllang(const DOM::DOMString &xmllang)
+{
+ m_xmllang = xmllang;
+}
+
+DOM::DOMString SVGLangSpaceImpl::xmllang() const
+{
+ return m_xmllang;
+}
+
+void SVGLangSpaceImpl::setXmlspace(const DOM::DOMString &xmlspace)
+{
+ m_xmlspace = xmlspace;
+}
+
+DOM::DOMString SVGLangSpaceImpl::xmlspace() const
+{
+ return m_xmlspace;
+}
+
+QString SVGLangSpaceImpl::handleText(const QString &data) const
+{
+ QString result = data;
+
+ if(xmlspace() == "preserve")
+ {
+ // Spec: What to do here?
+ // It will convert all newline and tab characters into space characters
+ result.replace("\n\r", QString(" "));
+ result.replace("\r\n", QString(" "));
+ result.replace('\t', ' ');
+ }
+ else if(xmlspace() == "default")
+ {
+ // Spec: What to do here?
+ // First, it will remove all newline characters (replace)
+ // Then it will convert all tab characters into space characters (simplifyWhiteSpace)
+ // Then, it will strip off all leading and trailing space characters (stripWhiteSpace)
+ // Then, all contiguous space characters will be consolidated. (simplifyWhiteSpace)
+ result.replace('\n', QString::null);
+ result.replace('\r', QString::null);
+ result = result.stripWhiteSpace().simplifyWhiteSpace();
+ }
+
+ return result;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGLangSpaceImpl::s_hashTable 5
+ xmllang SVGLangSpaceImpl::XmlLang DontDelete
+ xmlspace SVGLangSpaceImpl::XmlSpace DontDelete
+ lang SVGLangSpaceImpl::XmlLang DontDelete
+ space SVGLangSpaceImpl::XmlSpace DontDelete
+@end
+*/
+
+Value SVGLangSpaceImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case XmlLang:
+ return String(m_xmllang.string());
+ case XmlSpace:
+ return String(m_xmlspace.string());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGLangSpaceImpl::putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int /*attr*/)
+{
+ switch(token)
+ {
+ case XmlLang:
+ m_xmllang = value.toString(exec).string();
+ break;
+ case XmlSpace:
+ m_xmlspace = value.toString(exec).string();
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLangSpaceImpl.h b/ksvg/impl/SVGLangSpaceImpl.h
new file mode 100644
index 00000000..4a8c199a
--- /dev/null
+++ b/ksvg/impl/SVGLangSpaceImpl.h
@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGLangSpaceImpl_H
+#define SVGLangSpaceImpl_H
+
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGLangSpaceImpl
+{
+public:
+ SVGLangSpaceImpl();
+ virtual ~SVGLangSpaceImpl();
+
+ void setXmllang(const DOM::DOMString &xmllang);
+ DOM::DOMString xmllang() const;
+
+ void setXmlspace(const DOM::DOMString &xmlspace);
+ DOM::DOMString xmlspace() const;
+
+ QString handleText(const QString &data) const;
+
+private:
+ DOM::DOMString m_xmllang;
+ DOM::DOMString m_xmlspace;
+
+public:
+ KSVG_BASECLASS_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ XmlLang, XmlSpace
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLengthImpl.cc b/ksvg/impl/SVGLengthImpl.cc
new file mode 100644
index 00000000..46529022
--- /dev/null
+++ b/ksvg/impl/SVGLengthImpl.cc
@@ -0,0 +1,510 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qfont.h>
+#include <qregexp.h>
+#include <qwidget.h>
+#include <qpaintdevicemetrics.h>
+
+#include "SVGLength.h"
+
+#include "SVGRectImpl.h"
+#include "SVGLengthImpl.h"
+#include "SVGMatrixImpl.h"
+#include "SVGHelperImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGStringListImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGAnimatedRectImpl.h"
+#include "svgpathparser.h"
+
+#include "KSVGCanvas.h"
+
+using namespace KSVG;
+
+#include "SVGLengthImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_cacheimpl.h"
+
+// keep track of textual description of the unit type
+QString UnitText[] =
+{
+ "", "", "%", "em", "ex", "px", "cm", "mm", "in", "pt", "pc"
+};
+
+SVGLengthImpl::SVGLengthImpl(LengthMode mode, SVGElementImpl *context) : DOM::DomShared(), m_mode(mode), m_context(context)
+{
+ KSVG_EMPTY_FLAGS
+
+ m_unitType = SVG_LENGTHTYPE_UNKNOWN;
+ m_value = 0;
+ m_valueInSpecifiedUnits = 0;
+ m_bboxContext = 0;
+}
+
+SVGLengthImpl::SVGLengthImpl(const SVGLengthImpl &other) : DOM::DomShared()
+{
+ (*this) = other;
+}
+
+SVGLengthImpl::~SVGLengthImpl()
+{
+}
+
+double SVGLengthImpl::dpi()
+{
+ if(m_context && m_context->ownerDoc())
+ {
+ if(m_mode == LENGTHMODE_WIDTH)
+ return 25.4 * m_context->ownerDoc()->screenPixelsPerMillimeterX();
+ else if(m_mode == LENGTHMODE_HEIGHT)
+ return 25.4 * m_context->ownerDoc()->screenPixelsPerMillimeterY();
+ else if(m_mode == LENGTHMODE_OTHER)
+ return 25.4 * m_context->ownerDoc()->screenPixelsPerMillimeterX();
+ }
+ return 90.0;
+}
+
+SVGLengthImpl &SVGLengthImpl::operator=(const SVGLengthImpl &other)
+{
+ m_unitType = other.m_unitType;
+ m_value = other.m_value;
+ m_valueInSpecifiedUnits = other.m_valueInSpecifiedUnits;
+ m_bboxContext = other.m_bboxContext;
+ m_mode = other.m_mode;
+ m_context = other.m_context;
+
+ return *this;
+}
+
+unsigned short SVGLengthImpl::unitType() const
+{
+ return m_unitType;
+}
+
+void SVGLengthImpl::setValue(float value)
+{
+ m_value = value;
+ getValFromPx();
+}
+
+float SVGLengthImpl::value()
+{
+ if(m_unitType == SVG_LENGTHTYPE_PERCENTAGE)
+ {
+ float value = m_valueInSpecifiedUnits / 100.0;
+ SVGRectImpl *bbox = 0;
+ if(m_bboxContext && (bbox = m_bboxContext->getBBox()))
+ {
+ float result = 0;
+ if(m_mode == LENGTHMODE_WIDTH)
+ result = value * bbox->width();
+ else if(m_mode == LENGTHMODE_HEIGHT)
+ result = value * bbox->height();
+ else if(m_mode == LENGTHMODE_OTHER)
+ result = value * sqrt(pow(bbox->width(), 2) + pow(bbox->height(), 2)) / sqrt(2.0);
+
+ bbox->deref();
+ return result;
+ }
+ else
+ return percentageOfViewport();
+ }
+ else
+ return m_value;
+}
+
+void SVGLengthImpl::setValueInSpecifiedUnits(float valueInSpecifiedUnits)
+{
+ m_valueInSpecifiedUnits = valueInSpecifiedUnits;
+ convertNumToPx();
+}
+
+float SVGLengthImpl::valueInSpecifiedUnits() const
+{
+ return m_valueInSpecifiedUnits;
+}
+
+void SVGLengthImpl::setValueAsString(const DOM::DOMString &valueAsString)
+{
+ convertStringToPx(valueAsString.string());
+}
+
+DOM::DOMString SVGLengthImpl::valueAsString() const
+{
+ DOM::DOMString valueAsString = QString::number(m_valueInSpecifiedUnits);
+ valueAsString += UnitText[m_unitType];
+ return valueAsString;
+}
+
+void SVGLengthImpl::newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits)
+{
+ m_valueInSpecifiedUnits = valueInSpecifiedUnits;
+ m_unitType = unitType;
+ convertNumToPx();
+}
+
+void SVGLengthImpl::convertToSpecifiedUnits(unsigned short unitType)
+{
+ m_unitType = unitType;
+ getValFromPx();
+}
+
+SVGLengthImpl::operator float()
+{
+ return valueInSpecifiedUnits();
+}
+
+bool SVGLengthImpl::getValFromPx()
+{
+ if(m_unitType == SVG_LENGTHTYPE_UNKNOWN)
+ return false;
+
+ switch(m_unitType)
+ {
+ // case SVG_LENGTHTYPE_PERCENTAGE: TODO
+ // case SVG_LENGTHTYPE_EMS: TODO
+ // case SVG_LENGTHTYPE_EXS: TODO
+ //break;
+ case SVG_LENGTHTYPE_PX:
+ m_valueInSpecifiedUnits = m_value;
+ break;
+ case SVG_LENGTHTYPE_CM:
+ m_valueInSpecifiedUnits = m_value / dpi() * 2.54;
+ break;
+ case SVG_LENGTHTYPE_MM:
+ m_valueInSpecifiedUnits = m_value / dpi() * 25.4;
+ break;
+ case SVG_LENGTHTYPE_IN:
+ m_valueInSpecifiedUnits = m_value / dpi();
+ break;
+ case SVG_LENGTHTYPE_PT:
+ m_valueInSpecifiedUnits = m_value / dpi() * 72.0;
+ break;
+ case SVG_LENGTHTYPE_PC:
+ m_valueInSpecifiedUnits = m_value / dpi() * 6.0;
+ break;
+ };
+ return true;
+}
+
+void SVGLengthImpl::convertStringToPx(QString s)
+{
+ if(s.isEmpty())
+ return;
+
+ double convNum = 0;
+ const char *start = s.latin1();
+ const char *end = getNumber(start, convNum);
+ m_valueInSpecifiedUnits = convNum;
+
+ if(uint(end - start) < s.length())
+ {
+ if(s.endsWith(UnitText[SVG_LENGTHTYPE_PX]))
+ m_unitType = SVG_LENGTHTYPE_PX;
+ else if(s.endsWith(UnitText[SVG_LENGTHTYPE_CM]))
+ m_unitType = SVG_LENGTHTYPE_CM;
+ else if(s.endsWith(UnitText[SVG_LENGTHTYPE_PC]))
+ m_unitType = SVG_LENGTHTYPE_PC;
+ else if(s.endsWith(UnitText[SVG_LENGTHTYPE_MM]))
+ m_unitType = SVG_LENGTHTYPE_MM;
+ else if(s.endsWith(UnitText[SVG_LENGTHTYPE_IN]))
+ m_unitType = SVG_LENGTHTYPE_IN;
+ else if(s.endsWith(UnitText[SVG_LENGTHTYPE_PT]))
+ m_unitType = SVG_LENGTHTYPE_PT;
+ else if(s.endsWith(UnitText[SVG_LENGTHTYPE_PERCENTAGE]))
+ m_unitType = SVG_LENGTHTYPE_PERCENTAGE;
+ else if(s.endsWith(UnitText[SVG_LENGTHTYPE_EMS]))
+ m_unitType = SVG_LENGTHTYPE_EMS;
+ else if(s.endsWith(UnitText[SVG_LENGTHTYPE_EXS]))
+ m_unitType = SVG_LENGTHTYPE_EXS;
+ else if(s.isEmpty())
+ m_unitType = SVG_LENGTHTYPE_NUMBER;
+ else
+ m_unitType = SVG_LENGTHTYPE_UNKNOWN;
+ }
+ else
+ m_unitType = SVG_LENGTHTYPE_PX;
+ convertNumToPx();
+}
+
+void SVGLengthImpl::convertNumToPx()
+{
+ switch(m_unitType)
+ {
+ case SVG_LENGTHTYPE_PX:
+ m_value = m_valueInSpecifiedUnits;
+ break;
+ case SVG_LENGTHTYPE_CM:
+ m_value = (m_valueInSpecifiedUnits / 2.54) * dpi();
+ break;
+ case SVG_LENGTHTYPE_MM:
+ m_value = (m_valueInSpecifiedUnits / 25.4) * dpi();
+ break;
+ case SVG_LENGTHTYPE_IN:
+ m_value = m_valueInSpecifiedUnits * dpi();
+ break;
+ case SVG_LENGTHTYPE_PT:
+ m_value = (m_valueInSpecifiedUnits / 72.0) * dpi();
+ break;
+ case SVG_LENGTHTYPE_PC:
+ m_value = (m_valueInSpecifiedUnits / 6.0) * dpi();
+ break;
+ case SVG_LENGTHTYPE_EMS: // Be careful here, always recheck coords-units-BE-01.svg after touching (Niko)
+ case SVG_LENGTHTYPE_EXS:
+ if(m_context)
+ {
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(m_context);
+ if(!style)
+ break;
+
+ bool sizeLocal = (style->getFontSize() != -1);
+ bool familyLocal = (style->getFontFamily() && style->getFontFamily()->getFirst());
+
+ SVGStylableImpl *parentStyle = 0;
+ if((!sizeLocal || !familyLocal) && m_context)
+ parentStyle = dynamic_cast<SVGStylableImpl *>(m_context->ownerDoc()->getElementFromHandle(m_context->parentNode().handle()));
+
+ // Look up font-size in a SAFE way, because at this place
+ // processStyle() has NOT yet been called, so we need
+ // a different solution (Niko)
+ QString useFont = "Arial";
+ double useSize = 12;
+
+ if(sizeLocal)
+ useSize = style->getFontSize();
+ else if(parentStyle && parentStyle->getFontSize() != -1)
+ useSize = parentStyle->getFontSize();
+
+ if(familyLocal)
+ useFont = style->getFontFamily()->getFirst()->string();
+ else if(parentStyle && parentStyle->getFontFamily() && parentStyle->getFontFamily()->getFirst())
+ useFont = parentStyle->getFontFamily()->getFirst()->string();
+
+ if(m_unitType == SVG_LENGTHTYPE_EMS)
+ m_value = m_valueInSpecifiedUnits * useSize;
+ else
+ {
+ // Easiest way, use qfont (Niko)
+ QFont font(useFont);
+ font.setPixelSize(static_cast<int>(useSize));
+
+ QFontMetrics fm(font);
+ m_value = m_valueInSpecifiedUnits * fm.boundingRect('x').height();
+ }
+ }
+ break;
+ };
+}
+
+void SVGLengthImpl::convertPercentageToFloat(const QString &perc, float &result)
+{
+ // TODO : more error checking ?
+ if(perc.endsWith("%"))
+ result = perc.left(perc.length() - 1).toFloat() / 100.0;
+ else
+ result = perc.toFloat();
+}
+
+QString SVGLengthImpl::convertValToPercentage(const QString &val, float benchmark)
+{
+ if(val.endsWith("%"))
+ return val;
+
+ QString result;
+ float temp = val.toFloat();
+
+ temp = (temp / benchmark) * 100.0;
+ result.setNum(temp);
+ result.append("%");
+
+ return result;
+}
+
+SVGElementImpl *SVGLengthImpl::context() const
+{
+ return m_context;
+}
+
+void SVGLengthImpl::setContext(SVGElementImpl *context)
+{
+ m_context = context;
+}
+
+void SVGLengthImpl::setBBoxContext(SVGShapeImpl *bbox)
+{
+ m_bboxContext = bbox;
+ convertNumToPx();
+}
+
+float SVGLengthImpl::percentageOfViewport()
+{
+ float width = 0, height = 0;
+ float value = m_valueInSpecifiedUnits / 100.0;
+ if(m_context->viewportElement())
+ {
+ SVGSVGElementImpl *svg = dynamic_cast<SVGSVGElementImpl *>(m_context->viewportElement());
+ if(svg)
+ {
+ // Calculate against viewBox, otherwise svg width/height
+ width = svg->viewBox()->baseVal()->width();
+ if(width == 0)
+ width = svg->width()->baseVal()->value();
+ height = svg->viewBox()->baseVal()->height();
+ if(height == 0)
+ height = svg->height()->baseVal()->value();
+ }
+
+ if(m_mode == LENGTHMODE_WIDTH)
+ return value * width;
+ else if(m_mode == LENGTHMODE_HEIGHT)
+ return value * height;
+ else if(m_mode == LENGTHMODE_OTHER)
+ return value * sqrt(pow(width, 2) + pow(height, 2)) / sqrt(2.0);
+ }
+ else if(m_context == m_context->ownerDoc()->rootElement())
+ {
+ if(!m_context->ownerDoc()->canvas()) // Happens when parsing <svg width="100%"> with printnodetest
+ return 0.0;
+
+ QPaintDeviceMetrics metrics(m_context->ownerDoc()->canvas()->drawWindow());
+
+ if(m_mode == LENGTHMODE_WIDTH)
+ return value * metrics.width();
+ else if(m_mode == LENGTHMODE_HEIGHT)
+ return value * metrics.height();
+ else if(m_mode == LENGTHMODE_OTHER)
+ return value * sqrt(pow(metrics.width(), 2) + pow(metrics.height(), 2)) / sqrt(2.0);
+ }
+
+ return 0;
+}
+
+// Ecma stuff
+//
+/*
+@namespace KSVG
+@begin SVGLengthImpl::s_hashTable 5
+ unitType SVGLengthImpl::UnitType DontDelete|ReadOnly
+ value SVGLengthImpl::Value DontDelete
+ valueAsString SVGLengthImpl::ValueAsString DontDelete
+ valueInSpecifiedUnits SVGLengthImpl::ValueInSpecifiedUnits DontDelete
+@end
+@namespace KSVG
+@begin SVGLengthImplProto::s_hashTable 3
+ newValueSpecifiedUnits SVGLengthImpl::NewValueSpecifiedUnits DontDelete|Function 2
+ convertToSpecifiedUnits SVGLengthImpl::ConvertToSpecifiedUnits DontDelete|Function 1
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGLength", SVGLengthImplProto, SVGLengthImplProtoFunc)
+
+Value SVGLengthImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case UnitType:
+ return Number(unitType());
+ case Value:
+ return Number(m_value);
+ case ValueAsString:
+ return String(valueAsString().string());
+ case ValueInSpecifiedUnits:
+ return Number(valueInSpecifiedUnits());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return KJS::Undefined();
+ }
+}
+
+void SVGLengthImpl::putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case Value:
+ setValue(value.toNumber(exec));
+ SVGHelperImpl::updateItem(exec, *m_context);
+ break;
+ case ValueAsString:
+ setValueAsString(value.toString(exec).string());
+ SVGHelperImpl::updateItem(exec, *m_context);
+ break;
+ case ValueInSpecifiedUnits:
+ setValueInSpecifiedUnits(value.toNumber(exec));
+ SVGHelperImpl::updateItem(exec, *m_context);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+Value SVGLengthImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGLengthImpl)
+
+ switch(id)
+ {
+ case SVGLengthImpl::NewValueSpecifiedUnits:
+ obj->newValueSpecifiedUnits(static_cast<unsigned short>(args[0].toNumber(exec)), args[1].toNumber(exec));
+ SVGHelperImpl::updateItem(exec, *obj->context());
+ return Undefined();
+ case SVGLengthImpl::ConvertToSpecifiedUnits:
+ obj->convertToSpecifiedUnits(static_cast<unsigned short>(args[0].toNumber(exec)));
+ SVGHelperImpl::updateItem(exec, *obj->context());
+ return Undefined();
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+/*
+@namespace KSVG
+@begin SVGLengthImplConstructor::s_hashTable 11
+ SVG_LENGTHTYPE_UNKNOWN KSVG::SVG_LENGTHTYPE_UNKNOWN DontDelete|ReadOnly
+ SVG_LENGTHTYPE_NUMBER KSVG::SVG_LENGTHTYPE_NUMBER DontDelete|ReadOnly
+ SVG_LENGTHTYPE_PERCENTAGE KSVG::SVG_LENGTHTYPE_PERCENTAGE DontDelete|ReadOnly
+ SVG_LENGTHTYPE_EMS KSVG::SVG_LENGTHTYPE_EMS DontDelete|ReadOnly
+ SVG_LENGTHTYPE_EXS KSVG::SVG_LENGTHTYPE_EXS DontDelete|ReadOnly
+ SVG_LENGTHTYPE_PX KSVG::SVG_LENGTHTYPE_PX DontDelete|ReadOnly
+ SVG_LENGTHTYPE_CM KSVG::SVG_LENGTHTYPE_CM DontDelete|ReadOnly
+ SVG_LENGTHTYPE_MM KSVG::SVG_LENGTHTYPE_MM DontDelete|ReadOnly
+ SVG_LENGTHTYPE_PT KSVG::SVG_LENGTHTYPE_PT DontDelete|ReadOnly
+ SVG_LENGTHTYPE_PC KSVG::SVG_LENGTHTYPE_PC DontDelete|ReadOnly
+@end
+*/
+
+Value SVGLengthImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGLengthImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGLengthImplConstructor>(exec, "[[svglength.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLengthImpl.h b/ksvg/impl/SVGLengthImpl.h
new file mode 100644
index 00000000..5879a091
--- /dev/null
+++ b/ksvg/impl/SVGLengthImpl.h
@@ -0,0 +1,136 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGLengthImpl_H
+#define SVGLengthImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+enum LengthMode
+{
+ LENGTHMODE_UNKNOWN = 0,
+ LENGTHMODE_WIDTH = 1,
+ LENGTHMODE_HEIGHT = 2,
+ LENGTHMODE_OTHER = 3
+};
+
+class SVGShapeImpl;
+class SVGLocatableImpl;
+class SVGElementImpl;
+class SVGLengthImpl : public DOM::DomShared
+{
+public:
+ SVGLengthImpl(LengthMode mode = LENGTHMODE_UNKNOWN, SVGElementImpl *context = 0);
+ SVGLengthImpl(const SVGLengthImpl &);
+ virtual ~SVGLengthImpl();
+
+ SVGLengthImpl &operator=(const SVGLengthImpl &);
+
+ unsigned short unitType() const;
+
+ void setValue(float value);
+ float value();
+
+ void setValueInSpecifiedUnits(float valueInSpecifiedUnits);
+ float valueInSpecifiedUnits() const;
+
+ void setValueAsString(const DOM::DOMString &);
+ DOM::DOMString valueAsString() const;
+
+ void newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits);
+ void convertToSpecifiedUnits(unsigned short unitType);
+
+ operator float();
+
+ static void convertPercentageToFloat(const QString &perc, float &result);
+
+ // This method converts the value val to percentage notation ("xxx%").
+ // If the value string ends with the percentage sign it is returned,
+ // else the value is calculated against benchmark, ie. "0.2" -> "20%"
+ // for benchmark 1.0. This method should be useful in contexts that
+ // know the values should be in percentages up front, like bbox
+ // calculations.
+ static QString convertValToPercentage(const QString &val, float benchmark = 1.0);
+
+ SVGElementImpl *context() const;
+ void setContext(SVGElementImpl *context);
+ void setBBoxContext(SVGShapeImpl *bbox);
+
+private:
+ float m_value;
+ float m_valueInSpecifiedUnits;
+
+ float percentageOfViewport();
+
+ void convertStringToPx(QString s);
+ void convertNumToPx();
+ bool getValFromPx();
+
+ unsigned short m_unitType : 4;
+
+ // KSVG extension
+ LengthMode m_mode : 2;
+ SVGElementImpl *m_context;
+ SVGShapeImpl *m_bboxContext;
+
+ double dpi();
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ UnitType, Value, ValueAsString, ValueInSpecifiedUnits,
+ // Functions
+ NewValueSpecifiedUnits, ConvertToSpecifiedUnits
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+
+};
+
+class SVGLengthImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGLengthImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGLengthImplConstructor(KJS::ExecState *exec);
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGLengthImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGLengthImplProtoFunc, SVGLengthImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLengthListImpl.cc b/ksvg/impl/SVGLengthListImpl.cc
new file mode 100644
index 00000000..31215ddd
--- /dev/null
+++ b/ksvg/impl/SVGLengthListImpl.cc
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGLengthListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGLengthListImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGLengthListImpl::s_hashTable 2
+ numberOfItems SVGListDefs::NumberOfItems DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGLengthListImplProto::s_hashTable 11
+ getItem SVGListDefs::GetItem DontDelete|Function 1
+ removeItem SVGListDefs::RemoveItem DontDelete|Function 1
+ appendItem SVGListDefs::AppendItem DontDelete|Function 1
+ initialize SVGListDefs::Initialize DontDelete|Function 1
+ insertItemBefore SVGListDefs::InsertItemBefore DontDelete|Function 2
+ replaceItem SVGListDefs::ReplaceItem DontDelete|Function 2
+ clear SVGListDefs::Clear DontDelete|Function 0
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGLengthList", SVGLengthListImplProto, SVGLengthListImplProtoFunc)
+
+Value SVGLengthListImpl::getValueProperty(ExecState *exec, int token) const
+{
+ return SVGList<SVGLengthImpl>::getValueProperty(exec, token);
+}
+
+Value SVGLengthListImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGLengthListImpl)
+
+ return obj->call(exec, static_cast<SVGList<SVGLengthImpl> *>(obj), args, id);
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLengthListImpl.h b/ksvg/impl/SVGLengthListImpl.h
new file mode 100644
index 00000000..7ef8c80d
--- /dev/null
+++ b/ksvg/impl/SVGLengthListImpl.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGLengthListImpl_H
+#define SVGLengthListImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGList.h"
+
+#include "SVGLengthImpl.h"
+
+namespace KSVG
+{
+
+class SVGLengthListImpl : public SVGList<SVGLengthImpl>
+{
+public:
+ KSVG_GET
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGLengthListImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGLengthListImplProtoFunc, SVGLengthListImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLineElementImpl.cc b/ksvg/impl/SVGLineElementImpl.cc
new file mode 100644
index 00000000..7e13f46c
--- /dev/null
+++ b/ksvg/impl/SVGLineElementImpl.cc
@@ -0,0 +1,213 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <math.h>
+#include <kglobal.h>
+
+#include <kdebug.h>
+
+#include "CanvasItem.h"
+#include "KSVGCanvas.h"
+
+#include "SVGRectImpl.h"
+#include "SVGAngleImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGLineElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+
+using namespace KSVG;
+
+#include "SVGLineElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGLineElementImpl::SVGLineElementImpl(DOM::ElementImpl *impl) : SVGShapeImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x1 = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_x1->ref();
+ m_x1->baseVal()->setValueAsString("-1");
+
+ m_y1 = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_y1->ref();
+ m_y1->baseVal()->setValueAsString("-1");
+
+ m_x2 = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_x2->ref();
+ m_x2->baseVal()->setValueAsString("-1");
+
+ m_y2 = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_y2->ref();
+ m_y2->baseVal()->setValueAsString("-1");
+}
+
+SVGLineElementImpl::~SVGLineElementImpl()
+{
+ if(m_x1)
+ m_x1->deref();
+ if(m_x2)
+ m_x2->deref();
+ if(m_y1)
+ m_y1->deref();
+ if(m_y2)
+ m_y2->deref();
+}
+
+SVGAnimatedLengthImpl *SVGLineElementImpl::x1()
+{
+ return m_x1;
+}
+
+SVGAnimatedLengthImpl *SVGLineElementImpl::y1()
+{
+ return m_y1;
+}
+
+SVGAnimatedLengthImpl *SVGLineElementImpl::x2()
+{
+ return m_x2;
+}
+
+SVGAnimatedLengthImpl *SVGLineElementImpl::y2()
+{
+ return m_y2;
+}
+
+/*
+@namespace KSVG
+@begin SVGLineElementImpl::s_hashTable 5
+ x1 SVGLineElementImpl::X1 DontDelete|ReadOnly
+ y1 SVGLineElementImpl::Y1 DontDelete|ReadOnly
+ x2 SVGLineElementImpl::X2 DontDelete|ReadOnly
+ y2 SVGLineElementImpl::Y2 DontDelete|ReadOnly
+@end
+*/
+
+Value SVGLineElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case X1:
+ if(!attributeMode)
+ return m_x1->cache(exec);
+ else
+ return Number(m_x1->baseVal()->value());
+ case Y1:
+ if(!attributeMode)
+ return m_y1->cache(exec);
+ else
+ return Number(m_y1->baseVal()->value());
+ case X2:
+ if(!attributeMode)
+ return m_x2->cache(exec);
+ else
+ return Number(m_x2->baseVal()->value());
+ case Y2:
+ if(!attributeMode)
+ return m_y2->cache(exec);
+ else
+ return Number(m_y2->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGLineElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case X1:
+ x1()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Y1:
+ y1()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case X2:
+ x2()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Y2:
+ y2()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+SVGRectImpl *SVGLineElementImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+
+ float minx = kMin(m_x1->baseVal()->value(), m_x2->baseVal()->value());
+ float miny = kMin(m_y1->baseVal()->value(), m_y2->baseVal()->value());
+ float maxx = kMax(m_x1->baseVal()->value(), m_x2->baseVal()->value());
+ float maxy = kMax(m_y1->baseVal()->value(), m_y2->baseVal()->value());
+ ret->setX(minx);
+ ret->setY(miny);
+ ret->setWidth(maxx - minx);
+ ret->setHeight(maxy - miny);
+
+ return ret;
+}
+
+void SVGLineElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(X1))
+ KSVG_SET_ALT_ATTRIBUTE(X1, "0")
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(Y1))
+ KSVG_SET_ALT_ATTRIBUTE(Y1, "0")
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(X2))
+ KSVG_SET_ALT_ATTRIBUTE(X2, "0")
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(Y2))
+ KSVG_SET_ALT_ATTRIBUTE(Y2, "0")
+}
+
+void SVGLineElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_item)
+ {
+ m_item = c->createLine(this);
+ c->insert(m_item);
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLineElementImpl.h b/ksvg/impl/SVGLineElementImpl.h
new file mode 100644
index 00000000..725881a3
--- /dev/null
+++ b/ksvg/impl/SVGLineElementImpl.h
@@ -0,0 +1,86 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGLineElementImpl_H
+#define SVGLineElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGShapeImpl.h"
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGRectImpl;
+class SVGAnimatedLengthImpl;
+class SVGLineElementImpl : public SVGShapeImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGLineElementImpl(DOM::ElementImpl *);
+ virtual ~SVGLineElementImpl();
+
+ SVGAnimatedLengthImpl *x1();
+ SVGAnimatedLengthImpl *y1();
+ SVGAnimatedLengthImpl *x2();
+ SVGAnimatedLengthImpl *y2();
+
+ virtual void createItem(KSVGCanvas *c = 0);
+ virtual void setAttributes();
+
+ virtual SVGRectImpl *getBBox();
+
+private:
+ SVGAnimatedLengthImpl *m_x1;
+ SVGAnimatedLengthImpl *m_y1;
+ SVGAnimatedLengthImpl *m_x2;
+ SVGAnimatedLengthImpl *m_y2;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ X1, Y1, X2, Y2
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGLineElementImpl, "line")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLinearGradientElementImpl.cc b/ksvg/impl/SVGLinearGradientElementImpl.cc
new file mode 100644
index 00000000..54c97f01
--- /dev/null
+++ b/ksvg/impl/SVGLinearGradientElementImpl.cc
@@ -0,0 +1,201 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGGradientElement.h"
+#include "SVGLinearGradientElementImpl.h"
+
+#include "SVGDocumentImpl.h"
+#include "KSVGCanvas.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGLengthImpl.h"
+#include "SVGUnitConverter.h"
+
+using namespace KSVG;
+
+#include "SVGLinearGradientElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGLinearGradientElementImpl::SVGLinearGradientElementImpl(DOM::ElementImpl *impl) : SVGGradientElementImpl(impl)
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x1 = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_x1->ref();
+
+ m_y1 = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_y1->ref();
+
+ m_x2 = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_x2->ref();
+
+ m_y2 = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_y2->ref();
+
+ converter()->add(m_x1);
+ converter()->add(m_y1);
+ converter()->add(m_x2);
+ converter()->add(m_y2);
+}
+
+SVGLinearGradientElementImpl::~SVGLinearGradientElementImpl()
+{
+ if(m_x1)
+ m_x1->deref();
+ if(m_y1)
+ m_y1->deref();
+ if(m_x2)
+ m_x2->deref();
+ if(m_y2)
+ m_y2->deref();
+}
+
+SVGAnimatedLengthImpl *SVGLinearGradientElementImpl::x1() const
+{
+ return m_x1;
+}
+
+SVGAnimatedLengthImpl *SVGLinearGradientElementImpl::y1() const
+{
+ return m_y1;
+}
+
+SVGAnimatedLengthImpl *SVGLinearGradientElementImpl::x2() const
+{
+ return m_x2;
+}
+
+SVGAnimatedLengthImpl *SVGLinearGradientElementImpl::y2() const
+{
+ return m_y2;
+}
+
+/*
+@namespace KSVG
+@begin SVGLinearGradientElementImpl::s_hashTable 5
+ x1 SVGLinearGradientElementImpl::X1 DontDelete|ReadOnly
+ y1 SVGLinearGradientElementImpl::Y1 DontDelete|ReadOnly
+ x2 SVGLinearGradientElementImpl::X2 DontDelete|ReadOnly
+ y2 SVGLinearGradientElementImpl::Y2 DontDelete|ReadOnly
+@end
+*/
+
+Value SVGLinearGradientElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case X1:
+ if(!attributeMode)
+ return m_x1->cache(exec);
+ else
+ return Number(m_x1->baseVal()->value());
+ case Y1:
+ if(!attributeMode)
+ return m_y1->cache(exec);
+ else
+ return Number(m_y1->baseVal()->value());
+ case X2:
+ if(!attributeMode)
+ return m_x2->cache(exec);
+ else
+ return Number(m_x2->baseVal()->value());
+ case Y2:
+ if(!attributeMode)
+ return m_y2->cache(exec);
+ else
+ return Number(m_y2->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGLinearGradientElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case X1:
+ converter()->modify(x1(), value.toString(exec).qstring());
+ break;
+ case Y1:
+ converter()->modify(y1(), value.toString(exec).qstring());
+ break;
+ case X2:
+ converter()->modify(x2(), value.toString(exec).qstring());
+ break;
+ case Y2:
+ converter()->modify(y2(), value.toString(exec).qstring());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+void SVGLinearGradientElementImpl::setAttributes()
+{
+ SVGGradientElementImpl::setAttributes();
+
+ // Spec: no attribute, effect is af value 0% is specified
+ if(KSVG_TOKEN_NOT_PARSED(X1))
+ KSVG_SET_ALT_ATTRIBUTE(X1, "0")
+
+ // Spec: no attribute, effect is af value 0% is specified
+ if(KSVG_TOKEN_NOT_PARSED(Y1))
+ KSVG_SET_ALT_ATTRIBUTE(Y1, "0")
+
+ // Spec: no attribute, effect is af value 100% is specified
+ if(KSVG_TOKEN_NOT_PARSED(X2))
+ KSVG_SET_ALT_ATTRIBUTE(X2, "100%")
+
+ // Spec: no attribute, effect is af value 0% is specified
+ if(KSVG_TOKEN_NOT_PARSED(Y2))
+ KSVG_SET_ALT_ATTRIBUTE(Y2, "0")
+}
+
+QMap<QString, DOM::DOMString> SVGLinearGradientElementImpl::gradientAttributes()
+{
+ setAttributes();
+
+ QMap<QString, DOM::DOMString> gradAttributes;
+ QDictIterator<DOM::DOMString> it(attributes());
+
+ for(; it.current(); ++it)
+ {
+ DOM::DOMString name = it.currentKey();
+ DOM::DOMString value = it.current()->string();
+
+ if(name == "gradientUnits" || name == "gradientTransform" || name == "spreadMethod" || name == "x1" || name == "x2" || name == "y1" || name == "y2")
+ {
+ gradAttributes.insert(name.string(), value.copy());
+ }
+ }
+
+ return gradAttributes;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLinearGradientElementImpl.h b/ksvg/impl/SVGLinearGradientElementImpl.h
new file mode 100644
index 00000000..a230a0fe
--- /dev/null
+++ b/ksvg/impl/SVGLinearGradientElementImpl.h
@@ -0,0 +1,74 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGLinearGradientElementImpl_H
+#define SVGLinearGradientElementImpl_H
+
+#include "SVGGradientElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedLengthImpl;
+class SVGLinearGradientElementImpl : public SVGGradientElementImpl
+{
+public:
+ SVGLinearGradientElementImpl(DOM::ElementImpl *);
+ virtual ~SVGLinearGradientElementImpl();
+
+ SVGAnimatedLengthImpl *x1() const;
+ SVGAnimatedLengthImpl *y1() const;
+ SVGAnimatedLengthImpl *x2() const;
+ SVGAnimatedLengthImpl *y2() const;
+
+ virtual void setAttributes();
+
+ virtual QMap<QString, DOM::DOMString> gradientAttributes();
+
+private:
+ SVGAnimatedLengthImpl *m_x1;
+ SVGAnimatedLengthImpl *m_y1;
+ SVGAnimatedLengthImpl *m_x2;
+ SVGAnimatedLengthImpl *m_y2;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ X1, X2, Y1, Y2, Href
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGLinearGradientElementImpl, "linearGradient")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGList.h b/ksvg/impl/SVGList.h
new file mode 100644
index 00000000..45eb81ba
--- /dev/null
+++ b/ksvg/impl/SVGList.h
@@ -0,0 +1,174 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGList_H
+#define SVGList_H
+
+#include "ksvg_bridge.h"
+#include "ksvg_lookup.h"
+#include "ksvg_scriptinterpreter.h"
+#include <qptrlist.h>
+#include <dom/dom_misc.h>
+
+namespace KSVG
+{
+
+class SVGListDefs
+{
+public:
+ enum
+ {
+ // Properties
+ NumberOfItems,
+ // Functions
+ GetItem, RemoveItem, AppendItem, Initialize,
+ InsertItemBefore, ReplaceItem, Clear
+ };
+};
+
+template<class T>
+class SVGList : public DOM::DomShared
+{
+public:
+ SVGList() { m_impl.setAutoDelete(false); }
+ SVGList(const SVGList &other) { *this = other; }
+ ~SVGList() { clear(); }
+
+ SVGList<T> &operator=(const SVGList<T> &other)
+ {
+ // Clear own list
+ clear();
+
+ // Clone other's elements and append them
+ SVGList<T> &get = const_cast<SVGList<T> &>(other);
+ for(unsigned int i = 0; i < other.numberOfItems(); i++)
+ {
+ T *obj = new T(*get.getItem(i));
+ obj->ref();
+
+ appendItem(obj);
+ }
+
+ return *this;
+ }
+
+ unsigned int numberOfItems() const { return m_impl.count(); }
+
+ void clear()
+ {
+ for(unsigned int i = 0; i < numberOfItems(); i++)
+ getItem(i)->deref();
+
+ m_impl.clear();
+ }
+
+ T *initialize(T *newItem)
+ {
+ clear();
+ return appendItem(newItem);
+ }
+
+ T *getFirst() const { return m_impl.getFirst(); }
+
+ T *getLast() const { return m_impl.getLast(); }
+
+ T *getItem(unsigned int index) { return m_impl.at(index); }
+ const T *getItem(unsigned int index) const { return const_cast<SVGList<T> *>(this)->m_impl.at(index); }
+
+ T *insertItemBefore(T *newItem, unsigned int index)
+ {
+ if (index < m_vector.size()) {
+ m_vector.insert(index, newItem);
+ } else {
+ m_vector.append(newItem);
+ }
+ return newItem;
+ }
+
+ T *replaceItem(T *newItem, unsigned int index)
+ {
+ m_impl.take(index);
+ m_impl.insert(index, newItem);
+ return newItem;
+ }
+
+ T *removeItem(unsigned int index)
+ {
+ return m_impl.take(index);
+ }
+
+ void removeItem(const T *item)
+ {
+ m_impl.remove(item);
+ }
+
+ T *appendItem(T *newItem)
+ {
+ m_impl.append(newItem);
+ return newItem;
+ }
+
+ // Ecma stuff
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const
+ {
+ switch(token)
+ {
+ case SVGListDefs::NumberOfItems:
+ return KJS::Number(numberOfItems());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return KJS::Undefined();
+ }
+ }
+
+ KJS::Value call(KJS::ExecState *exec, SVGList<T> *obj, const KJS::List &args, int id)
+ {
+ switch(id)
+ {
+ case SVGListDefs::GetItem:
+ return obj->getItem(static_cast<unsigned int>(args[0].toNumber(exec)))->cache(exec);
+ case SVGListDefs::RemoveItem:
+ return obj->removeItem(static_cast<unsigned int>(args[0].toNumber(exec)))->cache(exec);
+ case SVGListDefs::AppendItem:
+ return obj->appendItem(static_cast<KSVGBridge<T> *>(args[0].imp())->impl())->cache(exec);
+ case SVGListDefs::InsertItemBefore:
+ return obj->insertItemBefore(static_cast<KSVGBridge<T> *>(args[0].imp())->impl(), static_cast<unsigned int>(args[1].toNumber(exec)))->cache(exec);
+ case SVGListDefs::Initialize:
+ return obj->initialize(static_cast<KSVGBridge<T> *>(args[0].imp())->impl())->cache(exec);
+ case SVGListDefs::Clear:
+ {
+ obj->clear();
+ return KJS::Undefined();
+ }
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return KJS::Undefined();
+ }
+
+private:
+ QPtrList<T> m_impl;
+};
+
+}
+
+#endif
diff --git a/ksvg/impl/SVGLocatableImpl.cc b/ksvg/impl/SVGLocatableImpl.cc
new file mode 100644
index 00000000..0ae143fa
--- /dev/null
+++ b/ksvg/impl/SVGLocatableImpl.cc
@@ -0,0 +1,208 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGRectImpl.h"
+#include "SVGShapeImpl.h"
+#include "SVGContainerImpl.h"
+#include "SVGMatrixImpl.h"
+#include "SVGElementImpl.h"
+#include "SVGLocatableImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGDocumentImpl.h"
+
+using namespace KSVG;
+
+#include "SVGLocatableImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGLocatableImpl::SVGLocatableImpl()
+{
+ m_nearestViewportElement = 0;
+ m_farthestViewportElement = 0;
+ m_cachedScreenCTM = SVGSVGElementImpl::createSVGMatrix();
+ m_cachedScreenCTMIsValid = false;
+}
+
+SVGLocatableImpl::~SVGLocatableImpl()
+{
+ if(m_nearestViewportElement)
+ m_nearestViewportElement->deref();
+ if(m_farthestViewportElement)
+ m_farthestViewportElement->deref();
+ if(m_cachedScreenCTM)
+ m_cachedScreenCTM->deref();
+}
+
+SVGRectImpl *SVGLocatableImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+ return ret;
+}
+
+SVGMatrixImpl *SVGLocatableImpl::getCTM()
+{
+ SVGMatrixImpl *ret = SVGSVGElementImpl::createSVGMatrix();
+ return ret;
+}
+
+SVGMatrixImpl *SVGLocatableImpl::getScreenCTM()
+{
+ SVGMatrixImpl *ret = SVGSVGElementImpl::createSVGMatrix();
+ ret->copy(m_cachedScreenCTM);
+
+ return ret;
+}
+
+SVGMatrixImpl *SVGLocatableImpl::getTransformToElement(SVGElementImpl *)
+{
+ SVGMatrixImpl *ret = SVGSVGElementImpl::createSVGMatrix();
+ return ret;
+}
+
+void SVGLocatableImpl::updateCachedScreenCTM(const SVGMatrixImpl *parentScreenCTM)
+{
+ m_cachedScreenCTM->copy(parentScreenCTM);
+
+ const SVGMatrixImpl *local = localMatrix();
+
+ if(local)
+ m_cachedScreenCTM->multiply(local);
+ m_cachedScreenCTMIsValid = true;
+
+ // Notify the element
+ onScreenCTMUpdated();
+
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(this);
+
+ if(shape)
+ {
+ // TODO: Update due to matrix animations
+ //if(shape->item())
+ // shape->item()->update(updateReason);
+
+ SVGElementImpl *element = dynamic_cast<SVGElementImpl *>(this);
+
+ DOM::Node node = element->firstChild();
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *child = element->ownerDoc()->getElementFromHandle(node.handle());
+ SVGLocatableImpl *locatable = dynamic_cast<SVGLocatableImpl *>(child);
+
+ if(child && locatable)
+ locatable->updateCachedScreenCTM(m_cachedScreenCTM);
+ }
+ }
+}
+
+void SVGLocatableImpl::checkCachedScreenCTM(const SVGMatrixImpl *parentScreenCTM)
+{
+ if(m_cachedScreenCTMIsValid)
+ {
+ SVGElementImpl *element = dynamic_cast<SVGElementImpl *>(this);
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(this);
+
+ if(shape)
+ {
+ DOM::Node node = element->firstChild();
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *child = element->ownerDoc()->getElementFromHandle(node.handle());
+ SVGLocatableImpl *locatable = dynamic_cast<SVGLocatableImpl *>(child);
+
+ if(child && locatable)
+ locatable->checkCachedScreenCTM(m_cachedScreenCTM);
+ }
+ }
+ }
+ else
+ updateCachedScreenCTM(parentScreenCTM);
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGLocatableImpl::s_hashTable 3
+ nearestViewportElement SVGLocatableImpl::NearestViewportElement DontDelete
+ farthestViewportElement SVGLocatableImpl::FarthestViewportElement DontDelete
+@end
+@namespace KSVG
+@begin SVGLocatableImplProto::s_hashTable 5
+ getBBox SVGLocatableImpl::GetBBox DontDelete|Function 0
+ getCTM SVGLocatableImpl::GetCTM DontDelete|Function 0
+ getScreenCTM SVGLocatableImpl::GetScreenCTM DontDelete|Function 0
+ getTransformToElement SVGLocatableImpl::GetTransformToElement DontDelete|Function 1
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGLocatable", SVGLocatableImplProto, SVGLocatableImplProtoFunc)
+
+Value SVGLocatableImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case NearestViewportElement:
+ return nearestViewportElement() ? nearestViewportElement()->cache(exec) : Undefined();
+ case FarthestViewportElement:
+ return farthestViewportElement() ? farthestViewportElement()->cache(exec) : Undefined();
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+Value SVGLocatableImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGLocatableImpl)
+
+ switch(id)
+ {
+ case SVGLocatableImpl::GetBBox:
+ {
+ SVGContainerImpl *container = dynamic_cast<SVGContainerImpl *>(obj);
+ if(container)
+ return container->getBBox()->cache(exec);
+ else
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(obj);
+ if(shape)
+ return shape->getBBox()->cache(exec);
+ else
+ return obj->getBBox()->cache(exec);
+ }
+ }
+ case SVGLocatableImpl::GetCTM:
+ return obj->getCTM()->cache(exec);
+ case SVGLocatableImpl::GetScreenCTM:
+ return obj->getScreenCTM()->cache(exec);
+ case SVGLocatableImpl::GetTransformToElement:
+ return obj->getTransformToElement(static_cast<KSVGBridge<SVGElementImpl> *>(args[0].imp())->impl())->cache(exec);
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGLocatableImpl.h b/ksvg/impl/SVGLocatableImpl.h
new file mode 100644
index 00000000..81ce3326
--- /dev/null
+++ b/ksvg/impl/SVGLocatableImpl.h
@@ -0,0 +1,94 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGLocatableImpl_H
+#define SVGLocatableImpl_H
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGRectImpl;
+class SVGMatrixImpl;
+class SVGElementImpl;
+class SVGLocatableImpl
+{
+public:
+ SVGLocatableImpl();
+ virtual ~SVGLocatableImpl();
+
+ SVGElementImpl *nearestViewportElement() const { return m_nearestViewportElement; }
+ SVGElementImpl *farthestViewportElement() const{ return m_farthestViewportElement; }
+
+ virtual SVGRectImpl *getBBox();
+ virtual SVGMatrixImpl *getCTM();
+ virtual SVGMatrixImpl *getScreenCTM();
+
+ // Faster access for when a new copy isn't required.
+ const SVGMatrixImpl *screenCTM() const { return m_cachedScreenCTM; }
+
+ SVGMatrixImpl *getTransformToElement(SVGElementImpl *element);
+
+ // The local transformations concatenated together. 0 if
+ // there are no local transformations.
+ virtual const SVGMatrixImpl *localMatrix() { return 0; }
+
+ bool cachedScreenCTMIsValid() const { return m_cachedScreenCTMIsValid; }
+ void invalidateCachedMatrices() { m_cachedScreenCTMIsValid = false; }
+
+ // If the cached matrix is invalid, update it and update any child elements
+ // recursively. Otherwise, check child elements recursively.
+ virtual void checkCachedScreenCTM(const SVGMatrixImpl *parentScreenCTM);
+ // Update the cached matrix, and update child element cached matrices,
+ // recursively.
+ virtual void updateCachedScreenCTM(const SVGMatrixImpl *parentScreenCTM);
+
+ // Called immediately after the screen ctm has been updated.
+ virtual void onScreenCTMUpdated() {}
+
+protected:
+ SVGElementImpl *m_nearestViewportElement;
+ SVGElementImpl *m_farthestViewportElement;
+ SVGMatrixImpl *m_cachedScreenCTM;
+ bool m_cachedScreenCTMIsValid;
+
+public:
+ KSVG_BASECLASS_GET
+
+ enum
+ {
+ // Properties
+ NearestViewportElement, FarthestViewportElement,
+ // Functions
+ GetBBox, GetCTM, GetScreenCTM, GetTransformToElement
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGLocatableImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGLocatableImplProtoFunc, SVGLocatableImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMPathElementImpl.cc b/ksvg/impl/SVGMPathElementImpl.cc
new file mode 100644
index 00000000..84d48274
--- /dev/null
+++ b/ksvg/impl/SVGMPathElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGMPathElementImpl.h"
+
+using namespace KSVG;
+
+SVGMPathElementImpl::SVGMPathElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGURIReferenceImpl(), SVGExternalResourcesRequiredImpl()
+{
+}
+
+SVGMPathElementImpl::~SVGMPathElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMPathElementImpl.h b/ksvg/impl/SVGMPathElementImpl.h
new file mode 100644
index 00000000..8d0bd96b
--- /dev/null
+++ b/ksvg/impl/SVGMPathElementImpl.h
@@ -0,0 +1,50 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGMPathElementImpl_H
+#define SVGMPathElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGMPathElementImpl : public SVGElementImpl,
+ public SVGURIReferenceImpl,
+ public SVGExternalResourcesRequiredImpl
+{
+public:
+ SVGMPathElementImpl(DOM::ElementImpl *);
+ virtual ~SVGMPathElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMarkerElementImpl.cc b/ksvg/impl/SVGMarkerElementImpl.cc
new file mode 100644
index 00000000..0fc1d263
--- /dev/null
+++ b/ksvg/impl/SVGMarkerElementImpl.cc
@@ -0,0 +1,424 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGMarkerElement.h"
+
+#include "SVGRectImpl.h"
+#include "SVGAngleImpl.h"
+#include "SVGMatrixImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGTransformImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGAnimatedRectImpl.h"
+#include "SVGMarkerElementImpl.h"
+#include "SVGAnimatedAngleImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGPreserveAspectRatioImpl.h"
+#include "SVGAnimatedPreserveAspectRatioImpl.h"
+
+#include "KSVGCanvas.h"
+
+using namespace KSVG;
+
+#include "SVGMarkerElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+#include "ksvg_cacheimpl.h"
+
+SVGMarkerElementImpl::SVGMarkerElementImpl(DOM::ElementImpl *impl) : SVGContainerImpl(impl), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGFitToViewBoxImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_refX = new SVGAnimatedLengthImpl();
+ m_refX->ref();
+
+ m_refY = new SVGAnimatedLengthImpl();
+ m_refY->ref();
+
+ m_markerUnits = new SVGAnimatedEnumerationImpl();
+ m_markerUnits->ref();
+
+ m_markerWidth = new SVGAnimatedLengthImpl();
+ m_markerWidth->ref();
+
+ m_markerHeight = new SVGAnimatedLengthImpl();
+ m_markerHeight->ref();
+
+ m_orientType = new SVGAnimatedEnumerationImpl();
+ m_orientType->ref();
+
+ m_orientAngle = new SVGAnimatedAngleImpl();
+ m_orientAngle->ref();
+}
+
+SVGMarkerElementImpl::~SVGMarkerElementImpl()
+{
+ if(m_refX)
+ m_refX->deref();
+ if(m_refY)
+ m_refY->deref();
+ if(m_markerUnits)
+ m_markerUnits->deref();
+ if(m_markerWidth)
+ m_markerWidth->deref();
+ if(m_markerHeight)
+ m_markerHeight->deref();
+ if(m_orientType)
+ m_orientType->deref();
+ if(m_orientAngle)
+ m_orientAngle->deref();
+}
+
+SVGAnimatedLengthImpl *SVGMarkerElementImpl::refX() const
+{
+ return m_refX;
+}
+
+SVGAnimatedLengthImpl *SVGMarkerElementImpl::refY() const
+{
+ return m_refY;
+}
+
+SVGAnimatedEnumerationImpl *SVGMarkerElementImpl::markerUnits() const
+{
+ return m_markerUnits;
+}
+
+SVGAnimatedLengthImpl *SVGMarkerElementImpl::markerWidth() const
+{
+ return m_markerWidth;
+}
+
+SVGAnimatedLengthImpl *SVGMarkerElementImpl::markerHeight() const
+{
+ return m_markerHeight;
+}
+
+SVGAnimatedEnumerationImpl *SVGMarkerElementImpl::orientType() const
+{
+ return m_orientType;
+}
+
+SVGAnimatedAngleImpl *SVGMarkerElementImpl::orientAngle() const
+{
+ return m_orientAngle;
+}
+
+void SVGMarkerElementImpl::setOrientToAuto()
+{
+ orientType()->setBaseVal(SVG_MARKER_ORIENT_AUTO);
+}
+
+void SVGMarkerElementImpl::setOrientToAngle(SVGAngleImpl *angle)
+{
+ m_orientAngle->baseVal()->setValue(angle->value());
+}
+
+void SVGMarkerElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(RefX))
+ KSVG_SET_ALT_ATTRIBUTE(RefX, "0")
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(RefY))
+ KSVG_SET_ALT_ATTRIBUTE(RefY, "0")
+
+ // Spec: if not specified, effect is as if a value of "3" were specified
+ if(KSVG_TOKEN_NOT_PARSED(MarkerWidth))
+ KSVG_SET_ALT_ATTRIBUTE(MarkerWidth, "3")
+
+ // Spec: if not specified, effect is as if a value of "3" were specified
+ if(KSVG_TOKEN_NOT_PARSED(MarkerHeight))
+ KSVG_SET_ALT_ATTRIBUTE(MarkerHeight, "3")
+
+ // Spec: if attribute not specified, use strokeWidth
+ if(KSVG_TOKEN_NOT_PARSED(MarkerUnits))
+ KSVG_SET_ALT_ATTRIBUTE(MarkerUnits, "strokeWidth")
+
+ // Spec: if attribute not specified, use angle
+ if(KSVG_TOKEN_NOT_PARSED(Orient))
+ KSVG_SET_ALT_ATTRIBUTE(Orient, "angle")
+}
+
+void SVGMarkerElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_item)
+ {
+ m_item = c->createCanvasMarker(this);
+ c->insert(m_item);
+ }
+}
+
+void SVGMarkerElementImpl::draw(SVGShapeImpl *referencingElement, double x, double y, double lwidth, double angle)
+{
+ SVGMatrixImpl *mtx = dynamic_cast<SVGLocatableImpl *>(referencingElement)->getScreenCTM();
+
+ // move to dest
+ mtx->translate(x, y);
+
+ // scale by linewidth if marker units == strokewidth
+ if(markerUnits()->baseVal() == SVG_MARKERUNITS_STROKEWIDTH)
+ mtx->scale(lwidth);
+
+ // select appropriate rotation
+ if(orientType()->baseVal() == SVG_MARKER_ORIENT_AUTO)
+ mtx->rotate(angle);
+ else
+ mtx->rotate(orientAngle()->baseVal()->value());
+
+ SVGRectImpl *viewBoxRect = viewBox()->baseVal();
+ SVGMatrixImpl *pres = preserveAspectRatio()->baseVal()->getCTM(viewBoxRect->x(), viewBoxRect->y(),
+ viewBoxRect->width(), viewBoxRect->height(),
+ 0, 0, markerWidth()->baseVal()->value(),
+ markerHeight()->baseVal()->value());
+
+ // viewbox stuff
+ mtx->multiply(pres);
+
+ // Get the vertex position in viewbox coordinates. The vertex is at (0, 0) in viewport coordinates.
+ double vertexX, vertexY;
+ pres->qmatrix().invert().map(0, 0, &vertexX, &vertexY);
+
+ // Translate so that the vertex is at (refX, refY) in viewbox coordinates.
+ mtx->translate(vertexX - refX()->baseVal()->value(), vertexY - refY()->baseVal()->value());
+
+ if(getOverflow())
+ m_clipShape.clear();
+ else
+ {
+ KSVGRectangle viewport;
+
+ if(hasAttribute("viewBox"))
+ {
+ // Get the viewport ((0, 0) - (markerWidth, markerHeight)) in viewbox coordinates.
+ double w, h;
+ pres->qmatrix().invert().map(markerWidth()->baseVal()->value(), markerHeight()->baseVal()->value(), &w, &h);
+
+ viewport = KSVGRectangle(vertexX, vertexY, w - vertexX, h - vertexY);
+ }
+ else
+ viewport = KSVGRectangle(0, 0, markerWidth()->baseVal()->value(), markerHeight()->baseVal()->value());
+
+ // Transform to screen coordinates.
+ m_clipShape = mtx->map(viewport);
+ }
+
+ pres->deref();
+
+ DOM::Node node = firstChild();
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *element = ownerDoc()->getElementFromHandle(node.handle());
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(element);
+ SVGTestsImpl *tests = dynamic_cast<SVGTestsImpl *>(element);
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(element);
+
+ bool ok = tests ? tests->ok() : true;
+ if(element && shape && style && ok && style->getVisible() && style->getDisplay())
+ {
+ SVGLocatableImpl *locatable = dynamic_cast<SVGLocatableImpl *>(element);
+ if(locatable)
+ locatable->updateCachedScreenCTM(mtx);
+
+ shape->update(UPDATE_TRANSFORM);
+ shape->setReferenced(true);
+ shape->draw();
+ shape->setReferenced(false);
+ }
+ }
+
+ mtx->deref();
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGMarkerElementImpl::s_hashTable 11
+ refX SVGMarkerElementImpl::RefX DontDelete|ReadOnly
+ refY SVGMarkerElementImpl::RefY DontDelete|ReadOnly
+ markerUnits SVGMarkerElementImpl::MarkerUnits DontDelete|ReadOnly
+ markerWidth SVGMarkerElementImpl::MarkerWidth DontDelete|ReadOnly
+ markerHeight SVGMarkerElementImpl::MarkerHeight DontDelete|ReadOnly
+ orientType SVGMarkerElementImpl::OrientType DontDelete|ReadOnly
+ orientAngle SVGMarkerElementImpl::OrientAngle DontDelete|ReadOnly
+ orient SVGMarkerElementImpl::Orient DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGMarkerElementImplProto::s_hashTable 3
+ setOrientToAuto SVGMarkerElementImpl::SetOrientToAuto DontDelete|Function 0
+ setOrientToAngle SVGMarkerElementImpl::SetOrientToAngle DontDelete|Function 0
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGMarkerElement", SVGMarkerElementImplProto, SVGMarkerElementImplProtoFunc)
+
+Value SVGMarkerElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case RefX:
+ if(!attributeMode)
+ return m_refX->cache(exec);
+ else
+ return Number(m_refX->baseVal()->value());
+ case RefY:
+ if(!attributeMode)
+ return m_refY->cache(exec);
+ else
+ return Number(m_refY->baseVal()->value());
+ case MarkerUnits:
+ if(!attributeMode)
+ return m_markerUnits->cache(exec);
+ else
+ return Number(m_markerUnits->baseVal());
+ case MarkerWidth:
+ if(!attributeMode)
+ return m_markerWidth->cache(exec);
+ else
+ return Number(m_markerWidth->baseVal()->value());
+ case MarkerHeight:
+ if(!attributeMode)
+ return m_markerHeight->cache(exec);
+ else
+ return Number(m_markerHeight->baseVal()->value());
+ case OrientType:
+ if(!attributeMode)
+ return m_orientType->cache(exec);
+ else
+ return Number(m_orientType->baseVal());
+ case OrientAngle:
+ if(!attributeMode)
+ return m_orientAngle->cache(exec);
+ else
+ return Number(m_orientAngle->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGMarkerElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case RefX:
+ refX()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case RefY:
+ refY()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case MarkerWidth:
+ markerWidth()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case MarkerHeight:
+ markerHeight()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case MarkerUnits:
+ if(value.toString(exec).qstring() == "userSpaceOnUse")
+ markerUnits()->setBaseVal(SVG_MARKERUNITS_USERSPACEONUSE);
+ else
+ markerUnits()->setBaseVal(SVG_MARKERUNITS_STROKEWIDTH);
+ break;
+ case Orient:
+ {
+ QString param = value.toString(exec).qstring();
+
+ if(param == "auto")
+ orientType()->setBaseVal(SVG_MARKER_ORIENT_AUTO);
+ else
+ {
+ orientType()->setBaseVal(SVG_MARKER_ORIENT_ANGLE);
+ m_orientAngle->baseVal()->setValueAsString(param);
+ }
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+Value SVGMarkerElementImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGMarkerElementImpl)
+
+ switch(id)
+ {
+ case SVGMarkerElementImpl::SetOrientToAuto:
+ obj->setOrientToAuto();
+ return Undefined();
+#ifdef __GNUC__
+#warning FIXME cache stuff
+#endif
+ case SVGMarkerElementImpl::SetOrientToAngle:
+ obj->setOrientToAngle(static_cast<KSVGBridge<SVGAngleImpl> *>(args[0].imp())->impl());
+ return Undefined();
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// CONSTANTS
+
+/*
+@namespace KSVG
+@begin SVGMarkerElementImplConstructor::s_hashTable 7
+ SVG_MARKERUNITS_UNKNOWN KSVG::SVG_MARKERUNITS_UNKNOWN DontDelete|ReadOnly
+ SVG_MARKERUNITS_USERSPACEONUSE KSVG::SVG_MARKERUNITS_USERSPACEONUSE DontDelete|ReadOnly
+ SVG_MARKERUNITS_STROKEWIDTH KSVG::SVG_MARKERUNITS_STROKEWIDTH DontDelete|ReadOnly
+ SVG_MARKER_ORIENT_UNKNOWN KSVG::SVG_MARKER_ORIENT_UNKNOWN DontDelete|ReadOnly
+ SVG_MARKER_ORIENT_AUTO KSVG::SVG_MARKER_ORIENT_AUTO DontDelete|ReadOnly
+ SVG_MARKER_ORIENT_ANGLE KSVG::SVG_MARKER_ORIENT_ANGLE DontDelete|ReadOnly
+@end
+*/
+
+using namespace KJS;
+
+Value SVGMarkerElementImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGMarkerElementImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGMarkerElementImplConstructor>(exec, "[[svgmarkerelement.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMarkerElementImpl.h b/ksvg/impl/SVGMarkerElementImpl.h
new file mode 100644
index 00000000..7e6539e3
--- /dev/null
+++ b/ksvg/impl/SVGMarkerElementImpl.h
@@ -0,0 +1,121 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGMarkerElementImpl_H
+#define SVGMarkerElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGContainerImpl.h"
+#include "SVGFitToViewBoxImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+#include "KSVGHelper.h"
+
+namespace KSVG
+{
+
+class SVGAngleImpl;
+class SVGAnimatedAngleImpl;
+class SVGAnimatedLengthImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGMarkerElementImpl : public SVGContainerImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGFitToViewBoxImpl
+{
+public:
+ SVGMarkerElementImpl(DOM::ElementImpl *);
+ virtual ~SVGMarkerElementImpl();
+
+ SVGAnimatedLengthImpl *refX() const;
+ SVGAnimatedLengthImpl *refY() const;
+ SVGAnimatedEnumerationImpl *markerUnits() const;
+ SVGAnimatedLengthImpl *markerWidth() const;
+ SVGAnimatedLengthImpl *markerHeight() const;
+ SVGAnimatedEnumerationImpl *orientType() const;
+ SVGAnimatedAngleImpl *orientAngle() const;
+
+ void setOrientToAuto();
+ void setOrientToAngle(SVGAngleImpl *angle);
+
+ virtual void setAttributes();
+ virtual void createItem(KSVGCanvas *c = 0);
+
+ void draw(SVGShapeImpl *referencingElement, double x, double y, double lwidth, double angle);
+
+ KSVGPolygon clipShape() const { return m_clipShape; }
+
+ virtual bool directRender() { return false; }
+ virtual bool isContainer() const { return false; }
+
+private:
+ SVGAnimatedLengthImpl *m_refX;
+ SVGAnimatedLengthImpl *m_refY;
+ SVGAnimatedEnumerationImpl *m_markerUnits;
+ SVGAnimatedLengthImpl *m_markerWidth;
+ SVGAnimatedLengthImpl *m_markerHeight;
+ SVGAnimatedEnumerationImpl *m_orientType;
+ SVGAnimatedAngleImpl *m_orientAngle;
+
+ KSVGPolygon m_clipShape;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ RefX, RefY, MarkerUnits, MarkerWidth, MarkerHeight, OrientType, OrientAngle,
+ Orient, ViewBox, PreserveAspectRatio,
+ // Functions
+ SetOrientToAuto, SetOrientToAngle
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGMarkerElementImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGMarkerElementImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGMarkerElementImplConstructor(KJS::ExecState *exec);
+
+KSVG_REGISTER_ELEMENT(SVGMarkerElementImpl, "marker")
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGMarkerElementImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGMarkerElementImplProtoFunc, SVGMarkerElementImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMaskElementImpl.cc b/ksvg/impl/SVGMaskElementImpl.cc
new file mode 100644
index 00000000..5cd2151e
--- /dev/null
+++ b/ksvg/impl/SVGMaskElementImpl.cc
@@ -0,0 +1,542 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <cfloat>
+
+#include <kdebug.h>
+#include <qimage.h>
+
+#include "SVGMaskElement.h"
+
+#include "SVGRectImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGMaskElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGUnitConverter.h"
+#include "SVGShapeImpl.h"
+#include "SVGMatrixImpl.h"
+#include "KSVGCanvas.h"
+#include "CanvasItems.h"
+#include "CanvasFactory.h"
+#include "KSVGHelper.h"
+
+#include <X11/Xos.h>
+
+using namespace KSVG;
+
+#include "SVGMaskElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_ecma.h"
+
+SVGMaskElementImpl::SVGMaskElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGBBoxTarget()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_x->ref();
+
+ m_y = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_y->ref();
+
+ m_width = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_width->ref();
+
+ m_height = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_height->ref();
+
+ m_maskUnits = new SVGAnimatedEnumerationImpl();
+ m_maskUnits->ref();
+
+ m_maskContentUnits = new SVGAnimatedEnumerationImpl();
+ m_maskContentUnits->ref();
+
+ m_converter = new SVGUnitConverter();
+ m_converter->add(m_x);
+ m_converter->add(m_y);
+ m_converter->add(m_width);
+ m_converter->add(m_height);
+
+ m_canvas = 0;
+
+ m_maskCache.setMaxTotalCost(1024 * 1024);
+}
+
+SVGMaskElementImpl::~SVGMaskElementImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_width)
+ m_width->deref();
+ if(m_height)
+ m_height->deref();
+ if(m_maskUnits)
+ m_maskContentUnits->deref();
+ if(m_maskUnits)
+ m_maskContentUnits->deref();
+ delete m_converter;
+ if(m_canvas)
+ delete m_canvas;
+}
+
+SVGAnimatedEnumerationImpl *SVGMaskElementImpl::maskUnits() const
+{
+ return m_maskUnits;
+}
+
+SVGAnimatedEnumerationImpl *SVGMaskElementImpl::maskContentUnits() const
+{
+ return m_maskContentUnits;
+}
+
+SVGAnimatedLengthImpl *SVGMaskElementImpl::x() const
+{
+ return m_x;
+}
+
+SVGAnimatedLengthImpl *SVGMaskElementImpl::y() const
+{
+ return m_y;
+}
+
+SVGAnimatedLengthImpl *SVGMaskElementImpl::width() const
+{
+ return m_width;
+}
+
+SVGAnimatedLengthImpl *SVGMaskElementImpl::height() const
+{
+ return m_height;
+}
+
+/*
+@namespace KSVG
+@begin SVGMaskElementImpl::s_hashTable 7
+ maskUnits SVGMaskElementImpl::MaskUnits DontDelete|ReadOnly
+ maskContentUnits SVGMaskElementImpl::MaskContentUnits DontDelete|ReadOnly
+ x SVGMaskElementImpl::X DontDelete|ReadOnly
+ y SVGMaskElementImpl::Y DontDelete|ReadOnly
+ width SVGMaskElementImpl::Width DontDelete|ReadOnly
+ height SVGMaskElementImpl::Height DontDelete|ReadOnly
+@end
+*/
+Value SVGMaskElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case MaskUnits:
+ if(!attributeMode)
+ return m_maskUnits->cache(exec);
+ else
+ return Number(m_maskUnits->baseVal());
+ case MaskContentUnits:
+ if(!attributeMode)
+ return m_maskContentUnits->cache(exec);
+ else
+ return Number(m_maskContentUnits->baseVal());
+ case X:
+ if(!attributeMode)
+ return m_x->cache(exec);
+ else
+ return Number(m_x->baseVal()->value());
+ case Y:
+ if(!attributeMode)
+ return m_y->cache(exec);
+ else
+ return Number(m_y->baseVal()->value());
+ case Width:
+ if(!attributeMode)
+ return m_width->cache(exec);
+ else
+ return Number(m_width->baseVal()->value());
+
+ case Height:
+ if(!attributeMode)
+ return m_height->cache(exec);
+ else
+ return Number(m_height->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGMaskElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case MaskUnits:
+ if(value.toString(exec).qstring() == "objectBoundingBox")
+ m_maskUnits->setBaseVal(SVGMaskElement::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+ else
+ m_maskUnits->setBaseVal(SVGMaskElement::SVG_UNIT_TYPE_USERSPACEONUSE);
+ break;
+ case MaskContentUnits:
+ if(value.toString(exec).qstring() == "objectBoundingBox")
+ m_maskContentUnits->setBaseVal(SVGMaskElement::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+ else
+ m_maskContentUnits->setBaseVal(SVGMaskElement::SVG_UNIT_TYPE_USERSPACEONUSE);
+ break;
+ case X:
+ converter()->modify(x(), value.toString(exec).qstring());
+ break;
+ case Y:
+ converter()->modify(y(), value.toString(exec).qstring());
+ break;
+ case Width:
+ converter()->modify(width(), value.toString(exec).qstring());
+ break;
+ case Height:
+ converter()->modify(height(), value.toString(exec).qstring());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+SVGRectImpl *SVGMaskElementImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+ ret->setX(m_x->baseVal()->value());
+ ret->setY(m_y->baseVal()->value());
+ ret->setWidth(m_width->baseVal()->value());
+ ret->setHeight(m_height->baseVal()->value());
+ return ret;
+}
+
+void SVGMaskElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if attribute not specified, use objectBoundingBox
+ if(KSVG_TOKEN_NOT_PARSED(MaskUnits))
+ KSVG_SET_ALT_ATTRIBUTE(MaskUnits, "objectBoundingBox")
+
+ // Spec: if attribute not specified, use userSpaceOnUse
+ if(KSVG_TOKEN_NOT_PARSED(MaskContentUnits))
+ KSVG_SET_ALT_ATTRIBUTE(MaskContentUnits, "userSpaceOnUse")
+
+ // Spec: if attribute not specified, use "-10%"
+ if(KSVG_TOKEN_NOT_PARSED(X))
+ KSVG_SET_ALT_ATTRIBUTE(X, "-10%");
+
+ // Spec: if attribute not specified, use "-10%"
+ if(KSVG_TOKEN_NOT_PARSED(Y))
+ KSVG_SET_ALT_ATTRIBUTE(Y, "-10%");
+
+ // Spec: if attribute not specified, use "120%"
+ if(KSVG_TOKEN_NOT_PARSED(Width))
+ KSVG_SET_ALT_ATTRIBUTE(Width, "120%");
+
+ // Spec: if attribute not specified, use "120%"
+ if(KSVG_TOKEN_NOT_PARSED(Height))
+ KSVG_SET_ALT_ATTRIBUTE(Height, "120%");
+}
+
+SVGMaskElementImpl::Mask SVGMaskElementImpl::createMask(SVGShapeImpl *referencingElement, int imageWidth, int imageHeight)
+{
+ converter()->finalize(referencingElement, ownerSVGElement(), maskUnits()->baseVal());
+
+ Q_UINT32 *imageBits = new Q_UINT32[imageWidth * imageHeight];
+
+ if(m_canvas == 0)
+ m_canvas = CanvasFactory::self()->loadCanvas(imageWidth, imageHeight);
+
+ m_canvas->setup(reinterpret_cast<unsigned char *>(imageBits), imageWidth, imageHeight);
+ m_canvas->setBackgroundColor(qRgba(0, 0, 0, 0));
+
+ SVGMatrixImpl *baseMatrix = SVGSVGElementImpl::createSVGMatrix();
+
+ // Set the scale to map the mask onto the image
+ double xScale = static_cast<double>(imageWidth) / width()->baseVal()->value();
+ double yScale = static_cast<double>(imageHeight) / height()->baseVal()->value();
+
+ baseMatrix->scaleNonUniform(xScale, yScale);
+
+ SVGRectImpl *bbox = referencingElement->getBBox();
+
+ if(maskUnits()->baseVal() == SVGMaskElement::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
+ baseMatrix->translate(-(bbox->x() + x()->baseVal()->value()), -(bbox->y() + y()->baseVal()->value()));
+ else
+ baseMatrix->translate(-x()->baseVal()->value(), -y()->baseVal()->value());
+
+ if(maskContentUnits()->baseVal() == SVGMaskElement::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
+ {
+ baseMatrix->translate(bbox->x(), bbox->y());
+ baseMatrix->scaleNonUniform(bbox->width(), bbox->height());
+ }
+
+ for(DOM::Node node = firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *element = ownerDoc()->getElementFromHandle(node.handle());
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(element);
+ SVGTestsImpl *tests = dynamic_cast<SVGTestsImpl *>(element);
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(element);
+
+ bool ok = tests ? tests->ok() : true;
+ if(element && shape && style && ok && style->getVisible() && style->getDisplay())
+ {
+ SVGLocatableImpl *locatable = dynamic_cast<SVGLocatableImpl *>(element);
+ if(locatable)
+ locatable->updateCachedScreenCTM(baseMatrix);
+
+ element->createItem(m_canvas);
+ if(shape->item())
+ {
+ shape->item()->setReferenced(true);
+ m_canvas->invalidate(shape->item(), true);
+ }
+ }
+ }
+
+ m_canvas->update(float(1));
+
+ for(DOM::Node node = firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *element = ownerDoc()->getElementFromHandle(node.handle());
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(element);
+ SVGTestsImpl *tests = dynamic_cast<SVGTestsImpl *>(element);
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(element);
+
+ bool ok = tests ? tests->ok() : true;
+ if(element && shape && style && ok && style->getVisible() && style->getDisplay())
+ {
+ if(shape)
+ shape->removeItem(m_canvas);
+ }
+ }
+
+
+ {
+ // Note: r and b reversed
+ //QImage maskImage(reinterpret_cast<unsigned char *>(imageBits), imageWidth, imageHeight, 32, 0, 0, QImage::IgnoreEndian);
+ //maskImage.setAlphaBuffer(true);
+ //maskImage.save("mask.png", "PNG");
+ }
+
+ QByteArray maskData(imageWidth * imageHeight);
+ const double epsilon = DBL_EPSILON;
+
+ // Convert the rgba image into an 8-bit mask, according to the specs.
+ for(int i = 0; i < imageWidth * imageHeight; i++)
+ {
+ Q_UINT32 rgba = imageBits[i];
+
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+ double r = (rgba & 0xff) / 255.0;
+ double g = ((rgba >> 8) & 0xff) / 255.0;
+ double b = ((rgba >> 16) & 0xff) / 255.0;
+ double a = ((rgba >> 24) & 0xff) / 255.0;
+#else
+ double a = (rgba & 0xff) / 255.0;
+ double b = ((rgba >> 8) & 0xff) / 255.0;
+ double g = ((rgba >> 16) & 0xff) / 255.0;
+ double r = ((rgba >> 24) & 0xff) / 255.0;
+#endif
+
+ // Remove pre-multiplication by alpha.
+ if(a > epsilon)
+ {
+ r /= a;
+ g /= a;
+ b /= a;
+ }
+
+ // Convert to linear RGB
+ r = KSVGHelper::linearRGBFromsRGB(int(r * 255 + 0.5)) / 255.0;
+ g = KSVGHelper::linearRGBFromsRGB(int(g * 255 + 0.5)) / 255.0;
+ b = KSVGHelper::linearRGBFromsRGB(int(b * 255 + 0.5)) / 255.0;
+
+ // Convert 'luminance to alpha'
+ double luminanceAlpha = 0.2125 * r + 0.7154 * g + 0.0721 * b;
+
+ // Multiply by alpha.
+ double maskValue = luminanceAlpha * a;
+
+ maskData[i] = static_cast<unsigned char>(maskValue * 255 + 0.5);
+ }
+
+ delete [] imageBits;
+
+ baseMatrix->deref();
+ bbox->deref();
+
+ // The screenToMask matrix is calculated each time the mask is used so we don't
+ // need to set it here.
+ QWMatrix tempMatrix;
+
+ return Mask(maskData, tempMatrix, imageWidth, imageHeight);
+}
+
+SVGMaskElementImpl::Mask SVGMaskElementImpl::createMask(SVGShapeImpl *referencingElement)
+{
+ converter()->finalize(referencingElement, ownerSVGElement(), maskUnits()->baseVal());
+
+ SVGMatrixImpl *refCTM = 0;
+ SVGLocatableImpl *locatableRef = dynamic_cast<SVGLocatableImpl *>(referencingElement);
+ if(locatableRef)
+ refCTM = locatableRef->getScreenCTM();
+ else
+ refCTM = SVGSVGElementImpl::createSVGMatrix();
+
+ double xScale, yScale;
+
+ refCTM->removeScale(&xScale, &yScale);
+ refCTM->deref();
+
+ int imageWidth = static_cast<int>(width()->baseVal()->value() * xScale + 0.5);
+ int imageHeight = static_cast<int>(height()->baseVal()->value() * yScale + 0.5);
+
+ Mask mask;
+
+ if(imageWidth > 0 && imageHeight > 0)
+ {
+ CacheKey key(referencingElement, imageWidth, imageHeight);
+
+ if(!m_maskCache.find(key, mask))
+ {
+ mask = createMask(referencingElement, imageWidth, imageHeight);
+ m_maskCache.insert(key, mask, imageWidth * imageHeight);
+ }
+
+ // Generate a mask-coordinates to screen-coordinates matrix
+ SVGMatrixImpl *matrix = 0;
+ if(locatableRef)
+ matrix = locatableRef->getScreenCTM();
+ else
+ matrix = SVGSVGElementImpl::createSVGMatrix();
+
+ if(maskUnits()->baseVal() == SVGMaskElement::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
+ {
+ SVGRectImpl *bbox = referencingElement->getBBox();
+ matrix->translate(bbox->x() + x()->baseVal()->value(), bbox->y() + y()->baseVal()->value());
+ bbox->deref();
+ }
+ else
+ matrix->translate(x()->baseVal()->value(), y()->baseVal()->value());
+
+ matrix->scaleNonUniform(1 / xScale, 1 / yScale);
+
+ QWMatrix screenToMask = matrix->qmatrix().invert();
+ matrix->deref();
+
+ mask.setScreenToMask(screenToMask);
+ }
+
+ return mask;
+}
+
+QByteArray SVGMaskElementImpl::maskRectangle(SVGShapeImpl *shape, const QRect& screenRectangle)
+{
+ QByteArray cumulativeMask;
+
+ do
+ {
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(shape);
+
+ if(style && style->hasMask())
+ {
+ SVGElementImpl *element = shape->ownerDoc()->rootElement()->getElementById(style->getMask());
+
+ if(element)
+ {
+ SVGMaskElementImpl *maskElement = dynamic_cast<SVGMaskElementImpl *>(element);
+
+ if(maskElement)
+ {
+ SVGMaskElementImpl::Mask mask = maskElement->createMask(shape);
+
+ if(!mask.isEmpty())
+ {
+ QByteArray maskData = mask.rectangle(screenRectangle);
+
+ if(cumulativeMask.size() == 0)
+ cumulativeMask = maskData;
+ else
+ {
+ int size = cumulativeMask.size();
+
+ // Multiply into the cumulative mask (using fast divide by 255)
+ for(int i = 0; i < size; i++)
+ {
+ int tmp = maskData[i] * cumulativeMask[i] + 0x80;
+ cumulativeMask[i] = (tmp + (tmp >> 8)) >> 8;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ DOM::Node parentNode = shape->parentNode();
+
+ if(!parentNode.isNull())
+ {
+ SVGElementImpl *parent = shape->ownerDoc()->getElementFromHandle(parentNode.handle());
+
+ if(parent)
+ shape = dynamic_cast<SVGShapeImpl *>(parent);
+ else
+ shape = 0;
+ }
+ else
+ shape = 0;
+
+ } while(shape);
+
+ return cumulativeMask;
+}
+
+SVGMaskElementImpl::Mask::Mask(const QByteArray& mask, const QWMatrix& screenToMask, int width, int height)
+ : m_width(width), m_height(height), m_mask(mask), m_screenToMask(screenToMask)
+{
+}
+
+QByteArray SVGMaskElementImpl::Mask::rectangle(int screenX, int screenY, int width, int height)
+{
+ QByteArray rect(width * height);
+
+ for(int x = 0; x < width; x++)
+ {
+ for(int y = 0; y < height; y++)
+ {
+ rect[x + y * width] = value(screenX + x, screenY + y);
+ }
+ }
+
+ return rect;
+}
+
+QByteArray SVGMaskElementImpl::Mask::rectangle(const QRect& rect)
+{
+ return rectangle(rect.x(), rect.y(), rect.width(), rect.height());
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMaskElementImpl.h b/ksvg/impl/SVGMaskElementImpl.h
new file mode 100644
index 00000000..cdd1c125
--- /dev/null
+++ b/ksvg/impl/SVGMaskElementImpl.h
@@ -0,0 +1,158 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGMaskElementImpl_H
+#define SVGMaskElementImpl_H
+
+#include <qwmatrix.h>
+
+#include "SVGTestsImpl.h"
+#include "SVGBBoxTarget.h"
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+#include "LRUCache.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+
+class SVGUnitConverter;
+class KSVGCanvas;
+class SVGShapeImpl;
+class SVGRectImpl;
+class SVGAnimatedLengthImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGMaskElementImpl : public SVGElementImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGBBoxTarget
+{
+public:
+
+ class Mask
+ {
+ public:
+ Mask() : m_width(0), m_height(0) {}
+ Mask(const QByteArray& mask, const QWMatrix& screenToMask, int width, int height);
+ ~Mask() {}
+
+ bool isEmpty() const { return m_width == 0; }
+ unsigned char value(int screenX, int screenY) const;
+ QByteArray rectangle(int screenX, int screenY, int width, int height);
+ QByteArray rectangle(const QRect& rect);
+ void setScreenToMask(const QWMatrix& matrix) { m_screenToMask = matrix; }
+
+ private:
+ int m_width;
+ int m_height;
+ QByteArray m_mask;
+ QWMatrix m_screenToMask;
+ };
+
+ SVGMaskElementImpl(DOM::ElementImpl *);
+ virtual ~SVGMaskElementImpl();
+
+ SVGAnimatedEnumerationImpl *maskUnits() const;
+ SVGAnimatedEnumerationImpl *maskContentUnits() const;
+ SVGAnimatedLengthImpl *x() const;
+ SVGAnimatedLengthImpl *y() const;
+ SVGAnimatedLengthImpl *width() const;
+ SVGAnimatedLengthImpl *height() const;
+
+ virtual SVGRectImpl *getBBox();
+ virtual void setAttributes();
+
+ SVGUnitConverter *converter() const { return m_converter; }
+
+ Mask createMask(SVGShapeImpl *referencingElement);
+
+ // Compute the mask on a given shape, taking into account all masks defined
+ // on the shape's ancestors. This is a workaround for us not having a buffer
+ // for container elements, so we can't mask containers directly.
+ static QByteArray maskRectangle(SVGShapeImpl *shape, const QRect& screenRectangle);
+
+private:
+ class CacheKey
+ {
+ public:
+ CacheKey() : m_element(0), m_width(0), m_height(0) {}
+ CacheKey(SVGElementImpl *element, int width, int height) : m_element(element), m_width(width), m_height(height) {}
+ bool operator==(const CacheKey& other) const { return m_element == other.m_element && m_width == other.m_width && m_height == other.m_height; }
+
+ private:
+ SVGElementImpl *m_element;
+ int m_width;
+ int m_height;
+ };
+
+ Mask createMask(SVGShapeImpl *referencingElement, int imageWidth, int imageHeight);
+
+ SVGAnimatedEnumerationImpl *m_maskUnits;
+ SVGAnimatedEnumerationImpl *m_maskContentUnits;
+ SVGAnimatedLengthImpl *m_x;
+ SVGAnimatedLengthImpl *m_y;
+ SVGAnimatedLengthImpl *m_width;
+ SVGAnimatedLengthImpl *m_height;
+
+ SVGUnitConverter *m_converter;
+ KSVGCanvas *m_canvas;
+
+ MinOneLRUCache<CacheKey, Mask> m_maskCache;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ MaskUnits, MaskContentUnits, X, Y, Width, Height
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGMaskElementImpl, "mask")
+
+inline unsigned char SVGMaskElementImpl::Mask::value(int screenX, int screenY) const
+{
+ int x, y;
+
+ m_screenToMask.map(screenX, screenY, &x, &y);
+
+ if(x >= 0 && x < m_width && y >= 0 && y < m_height)
+ return m_mask[x + y * m_width];
+ else
+ return 0;
+}
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMatrixImpl.cc b/ksvg/impl/SVGMatrixImpl.cc
new file mode 100644
index 00000000..81f14f66
--- /dev/null
+++ b/ksvg/impl/SVGMatrixImpl.cc
@@ -0,0 +1,460 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <math.h>
+
+#include <kdebug.h>
+
+#include "SVGAngleImpl.h"
+#include "SVGMatrixImpl.h"
+#include "KSVGHelper.h"
+
+using namespace KSVG;
+
+#include "SVGMatrixImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGMatrixImpl::SVGMatrixImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGMatrixImpl::SVGMatrixImpl(QWMatrix mat)
+{
+ m_mat = mat;
+}
+
+SVGMatrixImpl::SVGMatrixImpl(double a, double b, double c, double d, double e, double f)
+{
+ m_mat.setMatrix(a, b, c, d, e, f);
+}
+
+SVGMatrixImpl::~SVGMatrixImpl()
+{
+}
+
+void SVGMatrixImpl::setA(const double &a)
+{
+ m_mat.setMatrix(a, m_mat.m12(), m_mat.m21(), m_mat.m22(), m_mat.dx(), m_mat.dy());
+}
+
+double SVGMatrixImpl::a() const
+{
+ return m_mat.m11();
+}
+
+void SVGMatrixImpl::setB(const double &b)
+{
+ m_mat.setMatrix(m_mat.m11(), b, m_mat.m21(), m_mat.m22(), m_mat.dx(), m_mat.dy());
+}
+
+double SVGMatrixImpl::b() const
+{
+ return m_mat.m12();
+}
+
+void SVGMatrixImpl::setC(const double &c)
+{
+ m_mat.setMatrix(m_mat.m11(), m_mat.m12(), c, m_mat.m22(), m_mat.dx(), m_mat.dy());
+}
+
+double SVGMatrixImpl::c() const
+{
+ return m_mat.m21();
+}
+
+void SVGMatrixImpl::setD(const double &d)
+{
+ m_mat.setMatrix(m_mat.m11(), m_mat.m12(), m_mat.m21(), d, m_mat.dx(), m_mat.dy());
+}
+
+double SVGMatrixImpl::d() const
+{
+ return m_mat.m22();
+}
+
+void SVGMatrixImpl::setE(const double &e)
+{
+ m_mat.setMatrix(m_mat.m11(), m_mat.m12(), m_mat.m21(), m_mat.m22(), e, m_mat.dy());
+}
+
+double SVGMatrixImpl::e() const
+{
+ return m_mat.dx();
+}
+
+void SVGMatrixImpl::setF(const double &f)
+{
+ m_mat.setMatrix(m_mat.m11(), m_mat.m12(), m_mat.m21(), m_mat.m22(), m_mat.dx(), f);
+}
+
+double SVGMatrixImpl::f() const
+{
+ return m_mat.dy();
+}
+
+void SVGMatrixImpl::copy(const SVGMatrixImpl *other)
+{
+ m_mat.setMatrix(other->m_mat.m11(), other->m_mat.m12(), other->m_mat.m21(), other->m_mat.m22(), other->m_mat.dx(), other->m_mat.dy());
+}
+
+SVGMatrixImpl *SVGMatrixImpl::postMultiply(const SVGMatrixImpl *secondMatrix)
+{
+ QWMatrix temp(secondMatrix->a(), secondMatrix->b(), secondMatrix->c(), secondMatrix->d(), secondMatrix->e(), secondMatrix->f());
+ m_mat *= temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::inverse()
+{
+ m_mat = m_mat.invert();
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::postTranslate(const double &x, const double &y)
+{
+ // Could optimise these.
+ QWMatrix temp;
+ temp.translate(x, y);
+ m_mat *= temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::postScale(const double &scaleFactor)
+{
+ QWMatrix temp;
+ temp.scale(scaleFactor, scaleFactor);
+ m_mat *= temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::postScaleNonUniform(const double &scaleFactorX, const double &scaleFactorY)
+{
+ QWMatrix temp;
+ temp.scale(scaleFactorX, scaleFactorY);
+ m_mat *= temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::postRotate(const double &angle)
+{
+ QWMatrix temp;
+ temp.rotate(angle);
+ m_mat *= temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::postRotateFromVector(const double &x, const double &y)
+{
+ QWMatrix temp;
+ temp.rotate(SVGAngleImpl::todeg(atan2(y, x)));
+ m_mat *= temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::postFlipX()
+{
+ QWMatrix temp(-1.0F, 0.0F, 0.0F, 1.0F, 0.0F, 0.0F);
+ m_mat *= temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::postFlipY()
+{
+ QWMatrix temp(1.0F, 0.0F, 0.0F, -1.0F, 0.0F, 0.0F);
+ m_mat *= temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::postSkewX(const double &angle)
+{
+ QWMatrix temp;
+ temp.shear(tan(SVGAngleImpl::torad(angle)), 0.0F);
+ m_mat *= temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::postSkewY(const double &angle)
+{
+ QWMatrix temp;
+ temp.shear(0.0F, tan(SVGAngleImpl::torad(angle)));
+ m_mat *= temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::multiply(const SVGMatrixImpl *secondMatrix)
+{
+ QWMatrix temp(secondMatrix->a(), secondMatrix->b(), secondMatrix->c(), secondMatrix->d(), secondMatrix->e(), secondMatrix->f());
+ temp *= m_mat;
+ m_mat = temp;
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::translate(const double &x, const double &y)
+{
+ m_mat.translate(x, y);
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::scale(const double &scaleFactor)
+{
+ m_mat.scale(scaleFactor, scaleFactor);
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::scaleNonUniform(const double &scaleFactorX, const double &scaleFactorY)
+{
+ m_mat.scale(scaleFactorX, scaleFactorY);
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::rotate(const double &angle)
+{
+ m_mat.rotate(angle);
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::rotateFromVector(const double &x, const double &y)
+{
+ m_mat.rotate(SVGAngleImpl::todeg(atan2(y, x)));
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::flipX()
+{
+ m_mat.scale(-1.0f, 1.0f);
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::flipY()
+{
+ m_mat.scale(1.0f, -1.0f);
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::skewX(const double &angle)
+{
+ m_mat.shear(tan(SVGAngleImpl::torad(angle)), 0.0F);
+ return this;
+}
+
+SVGMatrixImpl *SVGMatrixImpl::skewY(const double &angle)
+{
+ m_mat.shear(0.0F, tan(SVGAngleImpl::torad(angle)));
+ return this;
+}
+
+void SVGMatrixImpl::setMatrix(QWMatrix mat)
+{
+ m_mat = mat;
+}
+
+QWMatrix &SVGMatrixImpl::qmatrix()
+{
+ return m_mat;
+}
+
+const QWMatrix &SVGMatrixImpl::qmatrix() const
+{
+ return m_mat;
+}
+
+void SVGMatrixImpl::reset()
+{
+ m_mat.reset();
+}
+
+void SVGMatrixImpl::removeScale(double *xScale, double *yScale)
+{
+ double sx = sqrt(a()*a() + b()*b());
+ double sy = sqrt(c()*c() + d()*d());
+
+ // Remove the scaling from the matrix.
+
+ setA(a()/sx);
+ setB(b()/sx);
+ setC(c()/sy);
+ setD(d()/sy);
+
+ *xScale = sx;
+ *yScale = sy;
+}
+
+KSVGPolygon SVGMatrixImpl::map(const KSVGPolygon& polygon) const
+{
+ KSVGPolygon mapped;
+
+ for(unsigned int i = 0; i < polygon.numPoints(); i++)
+ {
+ double x, y;
+
+ m_mat.map(polygon.point(i).x(), polygon.point(i).y(), &x, &y);
+ mapped.addPoint(x, y);
+ }
+
+ return mapped;
+}
+
+KSVGPolygon SVGMatrixImpl::inverseMap(const KSVGPolygon& polygon) const
+{
+ QWMatrix inverse = m_mat.invert();
+ KSVGPolygon mapped;
+
+ for(unsigned int i = 0; i < polygon.numPoints(); i++)
+ {
+ double x, y;
+
+ inverse.map(polygon.point(i).x(), polygon.point(i).y(), &x, &y);
+ mapped.addPoint(x, y);
+ }
+
+ return mapped;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGMatrixImpl::s_hashTable 7
+ a SVGMatrixImpl::A DontDelete
+ b SVGMatrixImpl::B DontDelete
+ c SVGMatrixImpl::C DontDelete
+ d SVGMatrixImpl::D DontDelete
+ e SVGMatrixImpl::E DontDelete
+ f SVGMatrixImpl::F DontDelete
+@end
+@namespace KSVG
+@begin SVGMatrixImplProto::s_hashTable 13
+ inverse SVGMatrixImpl::Inverse DontDelete|Function 0
+ multiply SVGMatrixImpl::Multiply DontDelete|Function 1
+ translate SVGMatrixImpl::Translate DontDelete|Function 2
+ scale SVGMatrixImpl::Scale DontDelete|Function 1
+ rotate SVGMatrixImpl::Rotate DontDelete|Function 1
+ rotateFromVector SVGMatrixImpl::RotateFromVector DontDelete|Function 2
+ scaleNonUniform SVGMatrixImpl::ScaleNonUniform DontDelete|Function 2
+ flipX SVGMatrixImpl::FlipX DontDelete|Function 0
+ flipY SVGMatrixImpl::FlipY DontDelete|Function 0
+ skewX SVGMatrixImpl::SkewX DontDelete|Function 1
+ skewY SVGMatrixImpl::SkewY DontDelete|Function 1
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGMatrix", SVGMatrixImplProto, SVGMatrixImplProtoFunc)
+
+Value SVGMatrixImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case A:
+ return Number(a());
+ case B:
+ return Number(b());
+ case C:
+ return Number(c());
+ case D:
+ return Number(d());
+ case E:
+ return Number(e());
+ case F:
+ return Number(f());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return KJS::Undefined();
+ }
+}
+
+
+void SVGMatrixImpl::putValueProperty(ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case A:
+ setA(value.toNumber(exec));
+ break;
+ case B:
+ setB(value.toNumber(exec));
+ break;
+ case C:
+ setC(value.toNumber(exec));
+ break;
+ case D:
+ setD(value.toNumber(exec));
+ break;
+ case E:
+ setE(value.toNumber(exec));
+ break;
+ case F:
+ setF(value.toNumber(exec));
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ break;
+ }
+}
+
+Value SVGMatrixImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGMatrixImpl)
+
+ switch(id)
+ {
+ case SVGMatrixImpl::Inverse:
+ return obj->inverse()->cache(exec);
+ break;
+ case SVGMatrixImpl::Multiply:
+ return obj->multiply(static_cast<KSVGBridge<SVGMatrixImpl> *>(args[0].imp())->impl())->cache(exec);
+ break;
+ case SVGMatrixImpl::Translate:
+ return obj->translate(args[0].toNumber(exec), args[1].toNumber(exec))->cache(exec);
+ break;
+ case SVGMatrixImpl::Scale:
+ return obj->scale(args[0].toNumber(exec))->cache(exec);
+ break;
+ case SVGMatrixImpl::Rotate:
+ return obj->rotate(args[0].toNumber(exec))->cache(exec);
+ break;
+ case SVGMatrixImpl::RotateFromVector:
+ return obj->rotateFromVector(args[0].toNumber(exec), args[1].toNumber(exec))->cache(exec);
+ break;
+ case SVGMatrixImpl::ScaleNonUniform:
+ return obj->scaleNonUniform(args[0].toNumber(exec), args[1].toNumber(exec))->cache(exec);
+ break;
+ case SVGMatrixImpl::FlipX:
+ return obj->flipX()->cache(exec);
+ break;
+ case SVGMatrixImpl::FlipY:
+ return obj->flipY()->cache(exec);
+ break;
+ case SVGMatrixImpl::SkewX:
+ return obj->skewX(args[0].toNumber(exec))->cache(exec);
+ break;
+ case SVGMatrixImpl::SkewY:
+ return obj->skewY(args[0].toNumber(exec))->cache(exec);;
+ break;
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMatrixImpl.h b/ksvg/impl/SVGMatrixImpl.h
new file mode 100644
index 00000000..a5d8edf3
--- /dev/null
+++ b/ksvg/impl/SVGMatrixImpl.h
@@ -0,0 +1,130 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGMatrixImpl_H
+#define SVGMatrixImpl_H
+
+#include <qwmatrix.h>
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+class KSVGPolygon;
+
+class SVGMatrixImpl : public DOM::DomShared
+{
+public:
+ SVGMatrixImpl();
+ SVGMatrixImpl(QWMatrix mat);
+ SVGMatrixImpl(double, double, double, double, double, double);
+ ~SVGMatrixImpl();
+
+ void setA(const double &);
+ double a() const;
+
+ void setB(const double &);
+ double b() const;
+
+ void setC(const double &);
+ double c() const;
+
+ void setD(const double &);
+ double d() const;
+
+ void setE(const double &);
+ double e() const;
+
+ void setF(const double &);
+ double f() const;
+
+ void copy(const SVGMatrixImpl *other);
+
+ SVGMatrixImpl *inverse();
+
+ // Pre-multiplied operations, as per the specs.
+ SVGMatrixImpl *multiply(const SVGMatrixImpl *secondMatrix);
+ SVGMatrixImpl *translate(const double &x, const double &y);
+ SVGMatrixImpl *scale(const double &scaleFactor);
+ SVGMatrixImpl *scaleNonUniform(const double &scaleFactorX, const double &scaleFactorY);
+ SVGMatrixImpl *rotate(const double &angle);
+ SVGMatrixImpl *rotateFromVector(const double &x, const double &y);
+ SVGMatrixImpl *flipX();
+ SVGMatrixImpl *flipY();
+ SVGMatrixImpl *skewX(const double &angle);
+ SVGMatrixImpl *skewY(const double &angle);
+
+ // Post-multiplied operations
+ SVGMatrixImpl *postMultiply(const SVGMatrixImpl *secondMatrix);
+ SVGMatrixImpl *postTranslate(const double &x, const double &y);
+ SVGMatrixImpl *postScale(const double &scaleFactor);
+ SVGMatrixImpl *postScaleNonUniform(const double &scaleFactorX, const double &scaleFactorY);
+ SVGMatrixImpl *postRotate(const double &angle);
+ SVGMatrixImpl *postRotateFromVector(const double &x, const double &y);
+ SVGMatrixImpl *postFlipX();
+ SVGMatrixImpl *postFlipY();
+ SVGMatrixImpl *postSkewX(const double &angle);
+ SVGMatrixImpl *postSkewY(const double &angle);
+
+ void reset();
+
+ // KSVG helper method
+ QWMatrix &qmatrix();
+ const QWMatrix &qmatrix() const;
+
+ // Determine the scaling component of the matrix and factor it out. After
+ // this operation, the matrix has x and y scale of one.
+ void removeScale(double *xScale, double *yScale);
+
+ KSVGPolygon map(const KSVGPolygon& polygon) const;
+ KSVGPolygon inverseMap(const KSVGPolygon& polygon) const;
+
+private:
+ void setMatrix(QWMatrix mat);
+ QWMatrix m_mat;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ A, B, C, D, E, F,
+ // Functions
+ Inverse, Multiply, Translate, Scale, Rotate,
+ RotateFromVector, ScaleNonUniform,
+ FlipX, FlipY, SkewX, SkewY
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGMatrixImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGMatrixImplProtoFunc, SVGMatrixImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMetadataElementImpl.cc b/ksvg/impl/SVGMetadataElementImpl.cc
new file mode 100644
index 00000000..d55d4302
--- /dev/null
+++ b/ksvg/impl/SVGMetadataElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGMetadataElementImpl.h"
+
+using namespace KSVG;
+
+SVGMetadataElementImpl::SVGMetadataElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+}
+
+SVGMetadataElementImpl::~SVGMetadataElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMetadataElementImpl.h b/ksvg/impl/SVGMetadataElementImpl.h
new file mode 100644
index 00000000..363a9c11
--- /dev/null
+++ b/ksvg/impl/SVGMetadataElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGMetadataElementImpl_H
+#define SVGMetadataElementImpl_H
+
+#include "SVGElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGMetadataElementImpl : public SVGElementImpl
+{
+public:
+ SVGMetadataElementImpl(DOM::ElementImpl *);
+ virtual ~SVGMetadataElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMissingGlyphElementImpl.cc b/ksvg/impl/SVGMissingGlyphElementImpl.cc
new file mode 100644
index 00000000..986750c3
--- /dev/null
+++ b/ksvg/impl/SVGMissingGlyphElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGMissingGlyphElementImpl.h"
+
+using namespace KSVG;
+
+SVGMissingGlyphElementImpl::SVGMissingGlyphElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGStylableImpl(this)
+{
+}
+
+SVGMissingGlyphElementImpl::~SVGMissingGlyphElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGMissingGlyphElementImpl.h b/ksvg/impl/SVGMissingGlyphElementImpl.h
new file mode 100644
index 00000000..275aba86
--- /dev/null
+++ b/ksvg/impl/SVGMissingGlyphElementImpl.h
@@ -0,0 +1,47 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGMissingGlyphElementImpl_H
+#define SVGMissingGlyphElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+
+namespace KSVG
+{
+
+class SVGMissingGlyphElementImpl : public SVGElementImpl,
+ public SVGStylableImpl
+{
+public:
+ SVGMissingGlyphElementImpl(DOM::ElementImpl *);
+ virtual ~SVGMissingGlyphElementImpl();
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGNumberImpl.cc b/ksvg/impl/SVGNumberImpl.cc
new file mode 100644
index 00000000..b926e9c2
--- /dev/null
+++ b/ksvg/impl/SVGNumberImpl.cc
@@ -0,0 +1,83 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGNumberImpl.h"
+
+using namespace KSVG;
+
+#include "SVGNumberImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGNumberImpl::SVGNumberImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_value = 0;
+}
+
+SVGNumberImpl::~SVGNumberImpl()
+{
+}
+
+void SVGNumberImpl::setValue(float value)
+{
+ m_value = value;
+}
+
+float SVGNumberImpl::value()
+{
+ return m_value;
+}
+
+/*
+@namespace KSVG
+@begin SVGNumberImpl::s_hashTable 2
+ value SVGNumberImpl::Value DontDelete
+@end
+*/
+
+Value SVGNumberImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case Value:
+ return Number(m_value);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+
+ return Undefined();
+}
+
+void SVGNumberImpl::putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case Value:
+ m_value = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGNumberImpl.h b/ksvg/impl/SVGNumberImpl.h
new file mode 100644
index 00000000..d94b3d63
--- /dev/null
+++ b/ksvg/impl/SVGNumberImpl.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGNumberImpl_H
+#define SVGNumberImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGNumberImpl : public DOM::DomShared
+{
+public:
+ SVGNumberImpl();
+ virtual ~SVGNumberImpl();
+
+ void setValue(float value);
+ float value();
+
+private:
+ float m_value;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ Value
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGNumberListImpl.cc b/ksvg/impl/SVGNumberListImpl.cc
new file mode 100644
index 00000000..8048640c
--- /dev/null
+++ b/ksvg/impl/SVGNumberListImpl.cc
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGNumberListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGNumberListImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGNumberListImpl::s_hashTable 2
+ numberOfItems SVGListDefs::NumberOfItems DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGNumberListImplProto::s_hashTable 11
+ getItem SVGListDefs::GetItem DontDelete|Function 1
+ removeItem SVGListDefs::RemoveItem DontDelete|Function 1
+ appendItem SVGListDefs::AppendItem DontDelete|Function 1
+ initialize SVGListDefs::Initialize DontDelete|Function 1
+ insertItemBefore SVGListDefs::InsertItemBefore DontDelete|Function 2
+ replaceItem SVGListDefs::ReplaceItem DontDelete|Function 2
+ clear SVGListDefs::Clear DontDelete|Function 0
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGNumberList", SVGNumberListImplProto, SVGNumberListImplProtoFunc)
+
+Value SVGNumberListImpl::getValueProperty(ExecState *exec, int token) const
+{
+ return SVGList<SVGNumberImpl>::getValueProperty(exec, token);
+}
+
+Value SVGNumberListImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGNumberListImpl)
+
+ return obj->call(exec, static_cast<SVGList<SVGNumberImpl> *>(obj), args, id);
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGNumberListImpl.h b/ksvg/impl/SVGNumberListImpl.h
new file mode 100644
index 00000000..87dadb6f
--- /dev/null
+++ b/ksvg/impl/SVGNumberListImpl.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGNumberListImpl_H
+#define SVGNumberListImpl_H
+
+#include "SVGList.h"
+
+#include "SVGNumberImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGNumberListImpl : public SVGList<SVGNumberImpl>
+{
+public:
+ KSVG_GET
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGNumberListImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGNumberListImplProtoFunc, SVGNumberListImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPaintImpl.cc b/ksvg/impl/SVGPaintImpl.cc
new file mode 100644
index 00000000..c1818892
--- /dev/null
+++ b/ksvg/impl/SVGPaintImpl.cc
@@ -0,0 +1,175 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPaint.h"
+#include "SVGColor.h"
+
+#include "SVGPaintImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPaintImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_cacheimpl.h"
+
+SVGPaintImpl::SVGPaintImpl(SVGElementImpl *object) : SVGColorImpl(object)
+{
+ m_paintType = SVG_PAINTTYPE_UNKNOWN;
+}
+
+SVGPaintImpl::SVGPaintImpl(const SVGPaintImpl &other) : SVGColorImpl(other)
+{
+ (*this) = other;
+}
+
+SVGPaintImpl::~SVGPaintImpl()
+{
+}
+
+SVGPaintImpl &SVGPaintImpl::operator=(const SVGPaintImpl &other)
+{
+ m_uri = other.m_uri;
+ m_paintType = other.m_paintType;
+
+ *(static_cast<SVGColorImpl *>(this)) = other;
+
+ return *this;
+}
+
+unsigned short SVGPaintImpl::paintType() const
+{
+ return m_paintType;
+}
+
+DOM::DOMString SVGPaintImpl::uri() const
+{
+ return m_uri;
+}
+
+void SVGPaintImpl::setUri(const DOM::DOMString &uri)
+{
+ m_uri = uri;
+ m_paintType = SVG_PAINTTYPE_URI;
+}
+
+void SVGPaintImpl::setPaint(unsigned short paintType, const DOM::DOMString &/*uri*/, const DOM::DOMString &/*rgbColor*/, const DOM::DOMString &/*iccColor*/)
+{
+ m_paintType = paintType;
+}
+
+void SVGPaintImpl::setRGBColor(QColor color)
+{
+ m_paintType = SVG_PAINTTYPE_RGBCOLOR;
+ SVGColorImpl::setRGBColor(color);
+}
+
+void SVGPaintImpl::setRGBColor(int r, int g, int b)
+{
+ m_paintType = SVG_PAINTTYPE_RGBCOLOR;
+ SVGColorImpl::setRGBColor(r, g, b);
+}
+
+void SVGPaintImpl::setRGBColor(const DOM::DOMString &rgbColor)
+{
+ m_paintType = SVG_PAINTTYPE_RGBCOLOR;
+ SVGColorImpl::setRGBColor(rgbColor);
+}
+
+void SVGPaintImpl::setRGBColorICCColor(const DOM::DOMString &rgbColor, const DOM::DOMString &iccColor)
+{
+ m_paintType = SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR;
+ SVGColorImpl::setRGBColorICCColor(rgbColor, iccColor);
+}
+
+void SVGPaintImpl::setColor(unsigned short colorType, const DOM::DOMString &rgbColor, const DOM::DOMString &iccColor)
+{
+ SVGColorImpl::setColor(colorType, rgbColor, iccColor);
+
+ switch(colorType)
+ {
+ case SVG_COLORTYPE_CURRENTCOLOR:
+ m_paintType = SVG_PAINTTYPE_CURRENTCOLOR;
+ break;
+ case SVG_COLORTYPE_RGBCOLOR:
+ m_paintType = SVG_PAINTTYPE_CURRENTCOLOR;
+ break;
+ case SVG_COLORTYPE_RGBCOLOR_ICCCOLOR:
+ m_paintType = SVG_PAINTTYPE_CURRENTCOLOR;
+ break;
+ case SVG_COLORTYPE_UNKNOWN:
+ m_paintType = SVG_PAINTTYPE_UNKNOWN;
+ break;
+ }
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPaintImpl::s_hashTable 3
+ paintType SVGPaintImpl::PaintType DontDelete
+ uri SVGPaintImpl::URI DontDelete
+@end
+*/
+
+Value SVGPaintImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case PaintType:
+ return Number(paintType());
+ case URI:
+ return String(uri().string());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+/*
+@namespace KSVG
+@begin SVGPaintImplConstructor::s_hashTable 11
+SVG_PAINTTYPE_UNKNOWN KSVG::SVG_PAINTTYPE_UNKNOWN DontDelete|ReadOnly
+SVG_PAINTTYPE_CURRENTCOLOR KSVG::SVG_PAINTTYPE_CURRENTCOLOR DontDelete|ReadOnly
+SVG_PAINTTYPE_RGBCOLOR KSVG::SVG_PAINTTYPE_RGBCOLOR DontDelete|ReadOnly
+SVG_PAINTTYPE_RGBCOLOR KSVG::SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR DontDelete|ReadOnly
+SVG_PAINTTYPE_NONE KSVG::SVG_PAINTTYPE_NONE DontDelete|ReadOnly
+SVG_PAINTTYPE_URI_NONE KSVG::SVG_PAINTTYPE_URI_NONE DontDelete|ReadOnly
+SVG_PAINTTYPE_URI_RGBCOLOR KSVG::SVG_PAINTTYPE_URI_RGBCOLOR DontDelete|ReadOnly
+SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR KSVG::SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR DontDelete|ReadOnly
+SVG_PAINTTYPE_URI_CURRENTCOLOR KSVG::SVG_PAINTTYPE_URI_CURRENTCOLOR DontDelete|ReadOnly
+SVG_PAINTTYPE_URI KSVG::SVG_PAINTTYPE_URI DontDelete|ReadOnly
+@end
+*/
+
+Value SVGPaintImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGPaintImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGPaintImplConstructor>(exec, "[[svgpaint.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPaintImpl.h b/ksvg/impl/SVGPaintImpl.h
new file mode 100644
index 00000000..f2aa0691
--- /dev/null
+++ b/ksvg/impl/SVGPaintImpl.h
@@ -0,0 +1,85 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPaintImpl_H
+#define SVGPaintImpl_H
+
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+#include "SVGColorImpl.h"
+
+namespace KSVG
+{
+
+class SVGPaintImpl : public SVGColorImpl
+{
+public:
+ SVGPaintImpl(SVGElementImpl *object);
+ SVGPaintImpl(const SVGPaintImpl &);
+ virtual ~SVGPaintImpl();
+
+ SVGPaintImpl &operator=(const SVGPaintImpl &);
+
+ unsigned short paintType() const;
+ DOM::DOMString uri() const;
+ void setUri(const DOM::DOMString &uri);
+ void setPaint(unsigned short paintType, const DOM::DOMString &uri = "", const DOM::DOMString &rgbColor = "", const DOM::DOMString &iccColor = "");
+
+ virtual void setRGBColor(const DOM::DOMString &rgbColor);
+ virtual void setRGBColor(int r, int g, int b);
+ virtual void setRGBColor(QColor color);
+ virtual void setRGBColorICCColor(const DOM::DOMString &rgbColor, const DOM::DOMString &iccColor);
+ virtual void setColor(unsigned short colorType, const DOM::DOMString &rgbColor, const DOM::DOMString &iccColor);
+
+private:
+ unsigned short m_paintType;
+ DOM::DOMString m_uri;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ PaintType, URI
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+class SVGPaintImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGPaintImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGPaintImplConstructor(KJS::ExecState *exec);
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPaintServerImpl.cc b/ksvg/impl/SVGPaintServerImpl.cc
new file mode 100644
index 00000000..b3275231
--- /dev/null
+++ b/ksvg/impl/SVGPaintServerImpl.cc
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPaintServerImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+
+using namespace KSVG;
+
+SVGPaintServerImpl::SVGPaintServerImpl()
+{
+ m_paintServer = 0;
+}
+
+SVGPaintServerImpl::~SVGPaintServerImpl()
+{
+}
+
+CanvasPaintServer *SVGPaintServerImpl::paintServer(SVGDocumentImpl *doc, const QString& id)
+{
+ CanvasPaintServer *pserver = 0;
+ SVGElementImpl *element = doc->rootElement()->getElementById(id);
+
+ if(element)
+ {
+ SVGPaintServerImpl *paintServerElement = dynamic_cast<SVGPaintServerImpl *>(element);
+
+ if(paintServerElement)
+ pserver = paintServerElement->paintServer();
+ }
+
+ return pserver;
+}
+
+// vim:ts=4:noet
+
diff --git a/ksvg/impl/SVGPaintServerImpl.h b/ksvg/impl/SVGPaintServerImpl.h
new file mode 100644
index 00000000..df276758
--- /dev/null
+++ b/ksvg/impl/SVGPaintServerImpl.h
@@ -0,0 +1,52 @@
+/*
+ Copyright (C) 2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPaintServerImpl_H
+#define SVGPaintServerImpl_H
+
+namespace KSVG
+{
+
+class SVGDocumentImpl;
+
+class CanvasPaintServer;
+
+class SVGPaintServerImpl
+{
+public:
+ SVGPaintServerImpl();
+ virtual ~SVGPaintServerImpl();
+
+ CanvasPaintServer *paintServer() { return m_paintServer; }
+
+ static CanvasPaintServer *paintServer(SVGDocumentImpl *doc, const QString& id);
+
+protected:
+ CanvasPaintServer *m_paintServer;
+
+private:
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
+
diff --git a/ksvg/impl/SVGPathElementImpl.cc b/ksvg/impl/SVGPathElementImpl.cc
new file mode 100644
index 00000000..f34600b8
--- /dev/null
+++ b/ksvg/impl/SVGPathElementImpl.cc
@@ -0,0 +1,868 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <math.h>
+#include <cfloat>
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "SVGRectImpl.h"
+#include "SVGPaintImpl.h"
+#include "SVGPointImpl.h"
+#include "SVGAngleImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGPathSegArcImpl.h"
+#include "SVGPathSegListImpl.h"
+#include "SVGPathElementImpl.h"
+#include "SVGPathSegLinetoImpl.h"
+#include "SVGPathSegMovetoImpl.h"
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGPathSegClosePathImpl.h"
+#include "SVGPathSegCurvetoCubicImpl.h"
+#include "SVGPathSegLinetoVerticalImpl.h"
+#include "SVGPathSegLinetoHorizontalImpl.h"
+#include "SVGPathSegCurvetoQuadraticImpl.h"
+#include "SVGPathSegCurvetoCubicSmoothImpl.h"
+#include "SVGPathSegCurvetoQuadraticSmoothImpl.h"
+
+#include "SVGPaint.h"
+
+#include "CanvasItem.h"
+#include "KSVGCanvas.h"
+#include "BezierPath.h"
+#include "Point.h"
+
+using namespace KSVG;
+
+#include "SVGPathElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGPathElementImpl::SVGPathElementImpl(DOM::ElementImpl *impl) : SVGShapeImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl(), SVGAnimatedPathDataImpl(), SVGPathParser()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_pathLength = new SVGAnimatedNumberImpl();
+ m_pathLength->ref();
+
+ m_pathLength->setBaseVal(0);
+}
+
+SVGPathElementImpl::~SVGPathElementImpl()
+{
+ pathSegList()->clear();
+
+ if(m_pathLength)
+ m_pathLength->deref();
+}
+
+SVGAnimatedNumberImpl *SVGPathElementImpl::pathLength() const
+{
+ return m_pathLength;
+}
+
+double SVGPathElementImpl::getTotalLength()
+{
+ T2P::BezierPath *path = ownerDoc()->canvas()->toBezierPath(m_item);
+ if(path)
+ return path->length();
+
+ return 0;
+}
+
+SVGPointImpl *SVGPathElementImpl::getPointAtLength(double distance)
+{
+ SVGPointImpl *ret = SVGSVGElementImpl::createSVGPoint();
+ double totalDistance = getTotalLength();
+ T2P::BezierPath *path = ownerDoc()->canvas()->toBezierPath(m_item);
+ if(path)
+ {
+ T2P::Point p;
+ path->pointTangentNormalAt(distance / totalDistance, &p);
+ ret->setX(p.x());
+ ret->setY(p.y());
+ }
+
+ return ret;
+}
+
+unsigned long SVGPathElementImpl::getPathSegAtLength(double)
+{
+ return 0;
+}
+
+SVGPathSegClosePathImpl *SVGPathElementImpl::createSVGPathSegClosePath()
+{
+ SVGPathSegClosePathImpl *temp = new SVGPathSegClosePathImpl();
+ temp->ref();
+
+ return temp;
+}
+
+SVGPathSegMovetoAbsImpl *SVGPathElementImpl::createSVGPathSegMovetoAbs(double x, double y)
+{
+ SVGPathSegMovetoAbsImpl *temp = new SVGPathSegMovetoAbsImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ return temp;
+}
+
+SVGPathSegMovetoRelImpl *SVGPathElementImpl::createSVGPathSegMovetoRel(double x, double y)
+{
+ SVGPathSegMovetoRelImpl *temp = new SVGPathSegMovetoRelImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ return temp;
+}
+
+SVGPathSegLinetoAbsImpl *SVGPathElementImpl::createSVGPathSegLinetoAbs(double x, double y)
+{
+ SVGPathSegLinetoAbsImpl *temp = new SVGPathSegLinetoAbsImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ return temp;
+}
+
+SVGPathSegLinetoRelImpl *SVGPathElementImpl::createSVGPathSegLinetoRel(double x, double y)
+{
+ SVGPathSegLinetoRelImpl *temp = new SVGPathSegLinetoRelImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ return temp;
+}
+
+SVGPathSegCurvetoCubicAbsImpl *SVGPathElementImpl::createSVGPathSegCurvetoCubicAbs(double x, double y, double x1, double y1, double x2, double y2)
+{
+ SVGPathSegCurvetoCubicAbsImpl *temp = new SVGPathSegCurvetoCubicAbsImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ temp->setX1(x1);
+ temp->setY1(y1);
+ temp->setX2(x2);
+ temp->setY2(y2);
+ return temp;
+}
+
+SVGPathSegCurvetoCubicRelImpl *SVGPathElementImpl::createSVGPathSegCurvetoCubicRel(double x, double y, double x1, double y1, double x2, double y2)
+{
+ SVGPathSegCurvetoCubicRelImpl *temp = new SVGPathSegCurvetoCubicRelImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ temp->setX1(x1);
+ temp->setY1(y1);
+ temp->setX2(x2);
+ temp->setY2(y2);
+ return temp;
+}
+
+SVGPathSegCurvetoQuadraticAbsImpl *SVGPathElementImpl::createSVGPathSegCurvetoQuadraticAbs(double x, double y, double x1, double y1)
+{
+ SVGPathSegCurvetoQuadraticAbsImpl *temp = new SVGPathSegCurvetoQuadraticAbsImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ temp->setX1(x1);
+ temp->setY1(y1);
+ return temp;
+}
+
+SVGPathSegCurvetoQuadraticRelImpl *SVGPathElementImpl::createSVGPathSegCurvetoQuadraticRel(double x, double y, double x1, double y1)
+{
+ SVGPathSegCurvetoQuadraticRelImpl *temp = new SVGPathSegCurvetoQuadraticRelImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ temp->setX1(x1);
+ temp->setY1(y1);
+ return temp;
+}
+
+SVGPathSegArcAbsImpl *SVGPathElementImpl::createSVGPathSegArcAbs(double x, double y, double r1, double r2, double angle, bool largeArcFlag, bool sweepFlag)
+{
+ SVGPathSegArcAbsImpl *temp = new SVGPathSegArcAbsImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ temp->setR1(r1);
+ temp->setR2(r2);
+ temp->setAngle(angle);
+ temp->setLargeArcFlag(largeArcFlag);
+ temp->setSweepFlag(sweepFlag);
+ return temp;
+}
+
+SVGPathSegArcRelImpl *SVGPathElementImpl::createSVGPathSegArcRel(double x, double y, double r1, double r2, double angle, bool largeArcFlag, bool sweepFlag)
+{
+ SVGPathSegArcRelImpl *temp = new SVGPathSegArcRelImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ temp->setR1(r1);
+ temp->setR2(r2);
+ temp->setAngle(angle);
+ temp->setLargeArcFlag(largeArcFlag);
+ temp->setSweepFlag(sweepFlag);
+ return temp;
+}
+
+SVGPathSegLinetoHorizontalAbsImpl *SVGPathElementImpl::createSVGPathSegLinetoHorizontalAbs(double x)
+{
+ SVGPathSegLinetoHorizontalAbsImpl *temp = new SVGPathSegLinetoHorizontalAbsImpl();
+ temp->ref();
+
+ temp->setX(x);
+ return temp;
+}
+
+SVGPathSegLinetoHorizontalRelImpl *SVGPathElementImpl::createSVGPathSegLinetoHorizontalRel(double x)
+{
+ SVGPathSegLinetoHorizontalRelImpl *temp = new SVGPathSegLinetoHorizontalRelImpl();
+ temp->ref();
+
+ temp->setX(x);
+ return temp;
+}
+
+SVGPathSegLinetoVerticalAbsImpl *SVGPathElementImpl::createSVGPathSegLinetoVerticalAbs(double y)
+{
+ SVGPathSegLinetoVerticalAbsImpl *temp = new SVGPathSegLinetoVerticalAbsImpl();
+ temp->ref();
+
+ temp->setY(y);
+ return temp;
+}
+
+SVGPathSegLinetoVerticalRelImpl *SVGPathElementImpl::createSVGPathSegLinetoVerticalRel(double y)
+{
+ SVGPathSegLinetoVerticalRelImpl *temp = new SVGPathSegLinetoVerticalRelImpl();
+ temp->ref();
+
+ temp->setY(y);
+ return temp;
+}
+
+SVGPathSegCurvetoCubicSmoothAbsImpl *SVGPathElementImpl::createSVGPathSegCurvetoCubicSmoothAbs(double x, double y, double x2, double y2)
+{
+ SVGPathSegCurvetoCubicSmoothAbsImpl *temp = new SVGPathSegCurvetoCubicSmoothAbsImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ temp->setX2(x2);
+ temp->setY2(y2);
+ return temp;
+}
+
+SVGPathSegCurvetoCubicSmoothRelImpl *SVGPathElementImpl::createSVGPathSegCurvetoCubicSmoothRel(double x, double y, double x2, double y2)
+{
+ SVGPathSegCurvetoCubicSmoothRelImpl *temp = new SVGPathSegCurvetoCubicSmoothRelImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ temp->setX2(x2);
+ temp->setY2(y2);
+ return temp;
+}
+
+SVGPathSegCurvetoQuadraticSmoothAbsImpl *SVGPathElementImpl::createSVGPathSegCurvetoQuadraticSmoothAbs(double x, double y)
+{
+ SVGPathSegCurvetoQuadraticSmoothAbsImpl *temp = new SVGPathSegCurvetoQuadraticSmoothAbsImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ return temp;
+}
+
+SVGPathSegCurvetoQuadraticSmoothRelImpl *SVGPathElementImpl::createSVGPathSegCurvetoQuadraticSmoothRel(double x, double y)
+{
+ SVGPathSegCurvetoQuadraticSmoothRelImpl *temp = new SVGPathSegCurvetoQuadraticSmoothRelImpl();
+ temp->ref();
+
+ temp->setX(x);
+ temp->setY(y);
+ return temp;
+}
+
+void SVGPathElementImpl::svgMoveTo(double x1, double y1, bool, bool abs)
+{
+ if(abs)
+ pathSegList()->appendItem(createSVGPathSegMovetoAbs(x1, y1));
+ else
+ pathSegList()->appendItem(createSVGPathSegMovetoRel(x1, y1));
+}
+
+void SVGPathElementImpl::svgLineTo(double x1, double y1, bool abs)
+{
+ if(abs)
+ pathSegList()->appendItem(createSVGPathSegLinetoAbs(x1, y1));
+ else
+ pathSegList()->appendItem(createSVGPathSegLinetoRel(x1, y1));
+}
+
+void SVGPathElementImpl::svgLineToHorizontal(double x, bool abs)
+{
+ if(abs)
+ pathSegList()->appendItem(createSVGPathSegLinetoHorizontalAbs(x));
+ else
+ pathSegList()->appendItem(createSVGPathSegLinetoHorizontalRel(x));
+}
+
+void SVGPathElementImpl::svgLineToVertical(double y, bool abs)
+{
+ if(abs)
+ pathSegList()->appendItem(createSVGPathSegLinetoVerticalAbs(y));
+ else
+ pathSegList()->appendItem(createSVGPathSegLinetoVerticalRel(y));
+}
+
+void SVGPathElementImpl::svgCurveToCubic(double x1, double y1, double x2, double y2, double x, double y, bool abs)
+{
+ if(abs)
+ pathSegList()->appendItem(createSVGPathSegCurvetoCubicAbs(x, y, x1, y1, x2, y2));
+ else
+ pathSegList()->appendItem(createSVGPathSegCurvetoCubicRel(x, y, x1, y1, x2, y2));
+}
+
+void SVGPathElementImpl::svgCurveToCubicSmooth(double x, double y, double x2, double y2, bool abs)
+{
+ if(abs)
+ pathSegList()->appendItem(createSVGPathSegCurvetoCubicSmoothAbs(x2, y2, x, y));
+ else
+ pathSegList()->appendItem(createSVGPathSegCurvetoCubicSmoothRel(x2, y2, x, y));
+}
+
+void SVGPathElementImpl::svgCurveToQuadratic(double x, double y, double x1, double y1, bool abs)
+{
+ if(abs)
+ pathSegList()->appendItem(createSVGPathSegCurvetoQuadraticAbs(x1, y1, x, y));
+ else
+ pathSegList()->appendItem(createSVGPathSegCurvetoQuadraticRel(x1, y1, x, y));
+}
+
+void SVGPathElementImpl::svgCurveToQuadraticSmooth(double x, double y, bool abs)
+{
+ if(abs)
+ pathSegList()->appendItem(createSVGPathSegCurvetoQuadraticSmoothAbs(x, y));
+ else
+ pathSegList()->appendItem(createSVGPathSegCurvetoQuadraticSmoothRel(x, y));
+}
+
+void SVGPathElementImpl::svgArcTo(double x, double y, double r1, double r2, double angle, bool largeArcFlag, bool sweepFlag, bool abs)
+{
+ if(abs)
+ pathSegList()->appendItem(createSVGPathSegArcAbs(x, y, r1, r2, angle, largeArcFlag, sweepFlag));
+ else
+ pathSegList()->appendItem(createSVGPathSegArcRel(x, y, r1, r2, angle, largeArcFlag, sweepFlag));
+}
+
+void SVGPathElementImpl::svgClosePath()
+{
+ pathSegList()->appendItem(createSVGPathSegClosePath());
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathElementImpl::s_hashTable 3
+ d SVGPathElementImpl::D DontDelete|ReadOnly
+ pathLength SVGPathElementImpl::PathLength DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGPathElementImplProto::s_hashTable 23
+ getTotalLength SVGPathElementImpl::GetTotalLength DontDelete|Function 0
+ getPointAtLength SVGPathElementImpl::GetPointAtLength DontDelete|Function 1
+ getPathSegAtLength SVGPathElementImpl::GetPathSegAtLength DontDelete|Function 1
+ createSVGPathSegClosePath SVGPathElementImpl::CreateSVGPathSegClosePath DontDelete|Function 0
+ createSVGPathSegMovetoAbs SVGPathElementImpl::CreateSVGPathSegMovetoAbs DontDelete|Function 2
+ createSVGPathSegMovetoRel SVGPathElementImpl::CreateSVGPathSegMovetoRel DontDelete|Function 2
+ createSVGPathSegLinetoAbs SVGPathElementImpl::CreateSVGPathSegLinetoAbs DontDelete|Function 2
+ createSVGPathSegLinetoRel SVGPathElementImpl::CreateSVGPathSegLinetoRel DontDelete|Function 2
+ createSVGPathSegArcAbs SVGPathElementImpl::CreateSVGPathSegArcAbs DontDelete|Function 7
+ createSVGPathSegArcRel SVGPathElementImpl::CreateSVGPathSegArcRel DontDelete|Function 7
+ createSVGPathSegCurvetoCubicAbs SVGPathElementImpl::CreateSVGPathSegCurvetoCubicAbs DontDelete|Function 6
+ createSVGPathSegCurvetoCubicRel SVGPathElementImpl::CreateSVGPathSegCurvetoCubicRel DontDelete|Function 6
+ createSVGPathSegCurvetoQuadraticAbs SVGPathElementImpl::CreateSVGPathSegCurvetoQuadraticAbs DontDelete|Function 4
+ createSVGPathSegCurvetoQuadraticRel SVGPathElementImpl::CreateSVGPathSegCurvetoQuadraticRel DontDelete|Function 4
+ createSVGPathSegLinetoHorizontalAbs SVGPathElementImpl::CreateSVGPathSegLinetoHorizontalAbs DontDelete|Function 1
+ createSVGPathSegLinetoHorizontalRel SVGPathElementImpl::CreateSVGPathSegLinetoHorizontalRel DontDelete|Function 1
+ createSVGPathSegLinetoVerticalAbs SVGPathElementImpl::CreateSVGPathSegLinetoVerticalAbs DontDelete|Function 1
+ createSVGPathSegLinetoVerticalRel SVGPathElementImpl::CreateSVGPathSegLinetoVerticalRel DontDelete|Function 1
+ createSVGPathSegCurvetoCubicAbs SVGPathElementImpl::CreateSVGPathSegCurvetoCubicAbs DontDelete|Function 4
+ createSVGPathSegCurvetoCubicRel SVGPathElementImpl::CreateSVGPathSegCurvetoCubicRel DontDelete|Function 4
+ createSVGPathSegCurvetoQuadraticAbs SVGPathElementImpl::CreateSVGPathSegCurvetoQuadraticAbs DontDelete|Function 2
+ createSVGPathSegCurvetoQuadraticRel SVGPathElementImpl::CreateSVGPathSegCurvetoQuadraticRel DontDelete|Function 2
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGPathElementImpl", SVGPathElementImplProto, SVGPathElementImplProtoFunc)
+
+Value SVGPathElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ //KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case PathLength:
+ return m_pathLength->cache(exec);
+ case D:
+// if(!attributeMode)
+ {
+ QString d;
+ unsigned int nrSegs = pathSegList()->numberOfItems();
+ SVGPathSegImpl *curseg = 0;
+ for(unsigned int i = 0; i < nrSegs; i++)
+ {
+ curseg = pathSegList()->getItem(i);
+ if(curseg)
+ d += curseg->toString() + " ";
+ }
+ return String(d);
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case D:
+ {
+ pathSegList()->clear();
+ QString d = value.toString(exec).qstring();
+ parseSVG(d, false);
+ if(hasMarkers())
+ m_markerData = MarkerData(pathSegList());
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+Value SVGPathElementImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGPathElementImpl)
+
+ switch(id)
+ {
+ case SVGPathElementImpl::GetTotalLength:
+ return Number(obj->getTotalLength());
+ case SVGPathElementImpl::GetPointAtLength:
+ return obj->getPointAtLength(args[0].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::GetPathSegAtLength:
+ return Number(obj->getPathSegAtLength(args[0].toNumber(exec)));
+ case SVGPathElementImpl::CreateSVGPathSegClosePath:
+ return obj->createSVGPathSegClosePath()->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegMovetoAbs:
+ return obj->createSVGPathSegMovetoAbs(args[0].toNumber(exec), args[1].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegMovetoRel:
+ return obj->createSVGPathSegMovetoRel(args[0].toNumber(exec), args[1].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegLinetoAbs:
+ return obj->createSVGPathSegLinetoAbs(args[0].toNumber(exec), args[1].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegLinetoRel:
+ return obj->createSVGPathSegLinetoRel(args[0].toNumber(exec), args[1].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegCurvetoCubicAbs:
+ return obj->createSVGPathSegCurvetoCubicAbs(args[0].toNumber(exec), args[1].toNumber(exec), args[2].toNumber(exec), args[3].toNumber(exec), args[4].toNumber(exec), args[5].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegCurvetoCubicRel:
+ return obj->createSVGPathSegCurvetoCubicRel(args[0].toNumber(exec), args[1].toNumber(exec), args[2].toNumber(exec), args[3].toNumber(exec), args[4].toNumber(exec), args[5].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegCurvetoQuadraticAbs:
+ return obj->createSVGPathSegCurvetoQuadraticAbs(args[0].toNumber(exec), args[1].toNumber(exec), args[2].toNumber(exec), args[3].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegCurvetoQuadraticRel:
+ return obj->createSVGPathSegCurvetoQuadraticRel(args[0].toNumber(exec), args[1].toNumber(exec), args[2].toNumber(exec), args[3].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegArcAbs:
+ return obj->createSVGPathSegArcAbs(args[0].toNumber(exec), args[1].toNumber(exec), args[2].toNumber(exec), args[3].toNumber(exec), args[4].toNumber(exec), args[5].toBoolean(exec), args[6].toBoolean(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegArcRel:
+ return obj->createSVGPathSegArcRel(args[0].toNumber(exec), args[1].toNumber(exec), args[2].toNumber(exec), args[3].toNumber(exec), args[4].toNumber(exec), args[5].toBoolean(exec), args[6].toBoolean(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegLinetoHorizontalAbs:
+ return obj->createSVGPathSegLinetoHorizontalAbs(args[0].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegLinetoHorizontalRel:
+ return obj->createSVGPathSegLinetoHorizontalRel(args[0].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegLinetoVerticalAbs:
+ return obj->createSVGPathSegLinetoVerticalAbs(args[0].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegLinetoVerticalRel:
+ return obj->createSVGPathSegLinetoVerticalRel(args[0].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegCurvetoCubicSmoothAbs:
+ return obj->createSVGPathSegCurvetoCubicSmoothAbs(args[0].toNumber(exec), args[1].toNumber(exec), args[2].toNumber(exec), args[3].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegCurvetoCubicSmoothRel:
+ return obj->createSVGPathSegCurvetoCubicSmoothRel(args[0].toNumber(exec), args[1].toNumber(exec), args[2].toNumber(exec), args[3].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegCurvetoQuadraticSmoothAbs:
+ return obj->createSVGPathSegCurvetoQuadraticSmoothAbs(args[0].toNumber(exec), args[1].toNumber(exec))->cache(exec);
+ case SVGPathElementImpl::CreateSVGPathSegCurvetoQuadraticSmoothRel:
+ return obj->createSVGPathSegCurvetoQuadraticSmoothRel(args[0].toNumber(exec), args[1].toNumber(exec))->cache(exec);
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+SVGRectImpl *SVGPathElementImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+
+ if(m_item)
+ {
+ T2P::BezierPath *path = ownerDoc()->canvas()->toBezierPath(m_item);
+ if(path)
+ {
+ T2P::Point topLeft;
+ T2P::Point bottomRight;
+
+ path->boundingBox(&topLeft, &bottomRight);
+
+ ret->setX(topLeft.x());
+ ret->setY(topLeft.y());
+ ret->setWidth(bottomRight.x() - topLeft.x());
+ ret->setHeight(bottomRight.y() - topLeft.y());
+ }
+ }
+ return ret;
+}
+
+void SVGPathElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_item)
+ {
+ // TODO : this is a quick fix for this problem:
+ // d attribute encountered before marker attributes.
+ // Try to process the attributes in the right order, ie.
+ // d attr processing should be last.
+ if(hasMarkers() && m_markerData.numMarkers() == 0)
+ m_markerData = MarkerData(pathSegList());
+ m_item = c->createPath(this);
+ c->insert(m_item);
+ }
+}
+
+SVGPathElementImpl::MarkerData::MarkerData(SVGPathSegListImpl *path)
+{
+ unsigned int numSegments = path->numberOfItems();
+ double curx = 0;
+ double cury = 0;
+ int currentSubpathStartIndex = -1;
+ double previousQuadraticX1 = 0;
+ double previousQuadraticY1 = 0;
+ double previousCubicX2 = 0;
+ double previousCubicY2 = 0;
+
+ QValueVector<SegmentData> pathSegmentData(numSegments);
+
+ for(unsigned int i = 0; i < numSegments; i++)
+ {
+ SVGPathSegImpl *segment = path->getItem(i);
+ struct SegmentData data;
+
+ data.type = segment->pathSegType();
+
+ if(segment->pathSegType() == PATHSEG_MOVETO_ABS || segment->pathSegType() == PATHSEG_MOVETO_REL)
+ {
+ if(currentSubpathStartIndex >= 0)
+ {
+ // Finish the previous subpath.
+ for(unsigned int j = currentSubpathStartIndex; j < i; j++)
+ {
+ pathSegmentData[j].subpathStartIndex = currentSubpathStartIndex;
+ pathSegmentData[j].subpathEndIndex = i - 1;
+ pathSegmentData[j].subpathIsClosed = false;
+ }
+ }
+
+ currentSubpathStartIndex = i;
+ }
+ else if(segment->pathSegType() == PATHSEG_CLOSEPATH)
+ {
+ if(currentSubpathStartIndex >= 0)
+ {
+ SVGPathSegClosePathImpl *s = static_cast<SVGPathSegClosePathImpl *>(segment);
+
+ s->setX(pathSegmentData[currentSubpathStartIndex].startx + pathSegmentData[currentSubpathStartIndex].dx);
+ s->setY(pathSegmentData[currentSubpathStartIndex].starty + pathSegmentData[currentSubpathStartIndex].dy);
+
+ for(unsigned int j = currentSubpathStartIndex; j < i; j++)
+ {
+ pathSegmentData[j].subpathStartIndex = currentSubpathStartIndex;
+ pathSegmentData[j].subpathEndIndex = i;
+ pathSegmentData[j].subpathIsClosed = true;
+ }
+
+ data.subpathStartIndex = currentSubpathStartIndex;
+ data.subpathEndIndex = i;
+ data.subpathIsClosed = true;
+ }
+
+ currentSubpathStartIndex = i + 1;
+ }
+
+ switch(segment->pathSegType())
+ {
+ case PATHSEG_CURVETO_CUBIC_ABS:
+ {
+ SVGPathSegCurvetoCubicAbsImpl *s = static_cast<SVGPathSegCurvetoCubicAbsImpl *>(segment);
+ previousCubicX2 = s->x2();
+ previousCubicY2 = s->y2();
+ break;
+ }
+ case PATHSEG_CURVETO_CUBIC_REL:
+ {
+ SVGPathSegCurvetoCubicRelImpl *s = static_cast<SVGPathSegCurvetoCubicRelImpl *>(segment);
+ previousCubicX2 = curx + s->x2();
+ previousCubicY2 = cury + s->y2();
+ break;
+ }
+ case PATHSEG_CURVETO_CUBIC_SMOOTH_ABS:
+ {
+ SVGPathSegCurvetoCubicSmoothAbsImpl *s = static_cast<SVGPathSegCurvetoCubicSmoothAbsImpl *>(segment);
+ s->setPreviousX2(previousCubicX2);
+ s->setPreviousY2(previousCubicY2);
+ previousCubicX2 = s->x2();
+ previousCubicY2 = s->y2();
+ break;
+ }
+ case PATHSEG_CURVETO_CUBIC_SMOOTH_REL:
+ {
+ SVGPathSegCurvetoCubicSmoothRelImpl *s = static_cast<SVGPathSegCurvetoCubicSmoothRelImpl *>(segment);
+ s->setPreviousAbsX2(previousCubicX2);
+ s->setPreviousAbsY2(previousCubicY2);
+ previousCubicX2 = curx + s->x2();
+ previousCubicY2 = cury + s->y2();
+ break;
+ }
+ case PATHSEG_CURVETO_QUADRATIC_ABS:
+ {
+ SVGPathSegCurvetoQuadraticAbsImpl *s = static_cast<SVGPathSegCurvetoQuadraticAbsImpl *>(segment);
+ previousQuadraticX1 = s->x1();
+ previousQuadraticY1 = s->y1();
+ break;
+ }
+ case PATHSEG_CURVETO_QUADRATIC_REL:
+ {
+ SVGPathSegCurvetoQuadraticRelImpl *s = static_cast<SVGPathSegCurvetoQuadraticRelImpl *>(segment);
+ previousQuadraticX1 = curx + s->x1();
+ previousQuadraticY1 = cury + s->y1();
+ break;
+ }
+ case PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS:
+ {
+ SVGPathSegCurvetoQuadraticSmoothAbsImpl *s = static_cast<SVGPathSegCurvetoQuadraticSmoothAbsImpl *>(segment);
+ s->setPreviousX1(previousQuadraticX1);
+ s->setPreviousY1(previousQuadraticY1);
+ previousQuadraticX1 = s->x1(curx);
+ previousQuadraticY1 = s->y1(cury);
+ break;
+ }
+ case PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL:
+ {
+ SVGPathSegCurvetoQuadraticSmoothRelImpl *s = static_cast<SVGPathSegCurvetoQuadraticSmoothRelImpl *>(segment);
+ s->setPreviousAbsX1(previousQuadraticX1);
+ s->setPreviousAbsY1(previousQuadraticY1);
+ previousQuadraticX1 = s->absX1(curx);
+ previousQuadraticY1 = s->absY1(cury);
+ break;
+ }
+ default:
+ previousCubicX2 = curx;
+ previousCubicY2 = cury;
+ previousQuadraticX1 = curx;
+ previousQuadraticY1 = cury;
+ break;
+ }
+
+ data.startx = curx;
+ data.starty = cury;
+
+ segment->getDeltasAndSlopes(curx, cury, &data.dx, &data.dy, &data.startSlope, &data.endSlope);
+
+ pathSegmentData[i] = data;
+
+ curx += data.dx;
+ cury += data.dy;
+ }
+
+ if(currentSubpathStartIndex >= 0)
+ {
+ // Finish the previous subpath.
+ for(unsigned int j = currentSubpathStartIndex; j < numSegments; j++)
+ {
+ pathSegmentData[j].subpathStartIndex = currentSubpathStartIndex;
+ pathSegmentData[j].subpathEndIndex = numSegments - 1;
+ pathSegmentData[j].subpathIsClosed = false;
+ }
+ }
+
+ m_markers.resize(numSegments);
+
+ for(unsigned int i = 0; i < numSegments; i++)
+ {
+ struct Marker marker;
+
+ marker.x = pathSegmentData[i].startx + pathSegmentData[i].dx;
+ marker.y = pathSegmentData[i].starty + pathSegmentData[i].dy;
+
+ double inSlope;
+ double outSlope;
+ bool haveInSlope = false;
+ bool haveOutSlope = false;
+
+ if(pathSegmentData[i].subpathStartIndex == i && pathSegmentData[i].subpathIsClosed)
+ {
+ // Spec: For closed subpaths, the marker for the initial vertex uses the end direction
+ // of the corresponding closepath for its incoming slope and the first segment's
+ // start slope for its outgoing slope.
+ haveInSlope = getEndSlope(pathSegmentData, pathSegmentData[i].subpathEndIndex, &inSlope);
+ haveOutSlope = getStartSlope(pathSegmentData, i + 1, &outSlope);
+ }
+ else if(pathSegmentData[i].type == PATHSEG_CLOSEPATH)
+ {
+ haveInSlope = getEndSlope(pathSegmentData, i, &inSlope);
+
+ // Spec: If the segment following a closepath is other than a moveto, the marker
+ // for the closepath uses the following segment's start direction as its
+ // outgoing direction.
+ if(i + 1 < numSegments && (pathSegmentData[i + 1].type != PATHSEG_MOVETO_ABS && pathSegmentData[i + 1].type != PATHSEG_MOVETO_REL))
+ haveOutSlope = getStartSlope(pathSegmentData, i + 1, &outSlope);
+ else
+ haveOutSlope = getStartSlope(pathSegmentData, pathSegmentData[i].subpathStartIndex, &outSlope);
+ }
+ else
+ {
+ haveOutSlope = getStartSlope(pathSegmentData, i + 1, &outSlope);
+ haveInSlope = getEndSlope(pathSegmentData, i, &inSlope);
+ }
+
+ if(!haveInSlope && !haveOutSlope)
+ {
+ outSlope = 0;
+ inSlope = 0;
+ }
+ else if(haveInSlope && !haveOutSlope)
+ outSlope = inSlope;
+ else if(!haveInSlope && haveOutSlope)
+ inSlope = outSlope;
+
+ double bisector = SVGAngleImpl::shortestArcBisector(inSlope, outSlope);
+ marker.angle = bisector;
+
+ m_markers[i] = marker;
+ }
+}
+
+bool SVGPathElementImpl::MarkerData::getStartSlope(QValueVector<SegmentData> segments, unsigned int i, double *pStartSlope)
+{
+ if(i > segments.count() - 1 || segments[i].type == PATHSEG_MOVETO_ABS || segments[i].type == PATHSEG_MOVETO_REL)
+ return false;
+ else
+ {
+ const double epsilon = DBL_EPSILON;
+
+ if(fabs(segments[i].dx) > epsilon || fabs(segments[i].dy) > epsilon)
+ {
+ *pStartSlope = segments[i].startSlope;
+ return true;
+ }
+ else
+ {
+ int subpathStartIndex = segments[i].subpathStartIndex;
+
+ for(int j = i - 1; j >= subpathStartIndex; j--)
+ {
+ if(segments[j].type == PATHSEG_MOVETO_ABS || segments[j].type == PATHSEG_MOVETO_REL)
+ return false;
+
+ if(fabs(segments[j].dx) > epsilon || fabs(segments[j].dy) > epsilon)
+ {
+ *pStartSlope = segments[j].endSlope;
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+}
+
+bool SVGPathElementImpl::MarkerData::getEndSlope(QValueVector<SegmentData> segments, unsigned int i, double *pEndSlope)
+{
+ if(i > segments.count() - 1 || segments[i].type == PATHSEG_MOVETO_ABS || segments[i].type == PATHSEG_MOVETO_REL)
+ return false;
+ else
+ {
+ const double epsilon = DBL_EPSILON;
+
+ if(fabs(segments[i].dx) > epsilon || fabs(segments[i].dy) > epsilon)
+ {
+ *pEndSlope = segments[i].endSlope;
+ return true;
+ }
+ else
+ {
+ int subpathEndIndex = segments[i].subpathEndIndex;
+
+ for(int j = i + 1; j <= subpathEndIndex; j++)
+ {
+ if(segments[j].type == PATHSEG_MOVETO_ABS || segments[j].type == PATHSEG_MOVETO_REL)
+ return false;
+
+ if(fabs(segments[j].dx) > epsilon || fabs(segments[j].dy) > epsilon)
+ {
+ *pEndSlope = segments[j].startSlope;
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathElementImpl.h b/ksvg/impl/SVGPathElementImpl.h
new file mode 100644
index 00000000..a9af56fc
--- /dev/null
+++ b/ksvg/impl/SVGPathElementImpl.h
@@ -0,0 +1,194 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathElementImpl_H
+#define SVGPathElementImpl_H
+
+#include <qvaluevector.h>
+
+#include "svgpathparser.h"
+
+#include "ksvg_lookup.h"
+
+#include "SVGShapeImpl.h"
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGAnimatedPathDataImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGPointImpl;
+class SVGPathSegImpl;
+class SVGPathSegArcAbsImpl;
+class SVGPathSegArcRelImpl;
+class SVGAnimatedNumberImpl;
+class SVGPathSegClosePathImpl;
+class SVGPathSegLinetoAbsImpl;
+class SVGPathSegLinetoRelImpl;
+class SVGPathSegMovetoAbsImpl;
+class SVGPathSegMovetoRelImpl;
+class SVGPathSegCurvetoCubicAbsImpl;
+class SVGPathSegCurvetoCubicRelImpl;
+class SVGPathSegLinetoVerticalAbsImpl;
+class SVGPathSegLinetoVerticalRelImpl;
+class SVGPathSegLinetoHorizontalAbsImpl;
+class SVGPathSegLinetoHorizontalRelImpl;
+class SVGPathSegCurvetoQuadraticAbsImpl;
+class SVGPathSegCurvetoQuadraticRelImpl;
+class SVGPathSegCurvetoCubicSmoothAbsImpl;
+class SVGPathSegCurvetoCubicSmoothRelImpl;
+class SVGPathSegCurvetoQuadraticSmoothAbsImpl;
+class SVGPathSegCurvetoQuadraticSmoothRelImpl;
+class SVGPathElementImpl : public SVGShapeImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl,
+ public SVGAnimatedPathDataImpl,
+ public ::SVGPathParser
+{
+public:
+ SVGPathElementImpl(DOM::ElementImpl *impl);
+ virtual ~SVGPathElementImpl();
+
+ SVGAnimatedNumberImpl *pathLength() const;
+ double getTotalLength();
+ SVGPointImpl *getPointAtLength(double distance);
+ unsigned long getPathSegAtLength(double distance);
+
+ SVGPathSegClosePathImpl *createSVGPathSegClosePath();
+ SVGPathSegMovetoAbsImpl *createSVGPathSegMovetoAbs(double x, double y);
+ SVGPathSegMovetoRelImpl *createSVGPathSegMovetoRel(double x, double y);
+ SVGPathSegLinetoAbsImpl *createSVGPathSegLinetoAbs(double x, double y);
+ SVGPathSegLinetoRelImpl *createSVGPathSegLinetoRel(double x, double y);
+ SVGPathSegCurvetoCubicAbsImpl *createSVGPathSegCurvetoCubicAbs(double x, double y, double x1, double y1, double x2, double y2);
+ SVGPathSegCurvetoCubicRelImpl *createSVGPathSegCurvetoCubicRel(double x, double y, double x1, double y1, double x2, double y2);
+ SVGPathSegCurvetoQuadraticAbsImpl *createSVGPathSegCurvetoQuadraticAbs(double x, double y, double x1, double y1);
+ SVGPathSegCurvetoQuadraticRelImpl *createSVGPathSegCurvetoQuadraticRel(double x, double y, double x1, double y1);
+ SVGPathSegArcAbsImpl *createSVGPathSegArcAbs(double x, double y, double r1, double r2, double angle, bool largeArcFlag, bool sweepFlag);
+ SVGPathSegArcRelImpl *createSVGPathSegArcRel(double x, double y, double r1, double r2, double angle, bool largeArcFlag, bool sweepFlag);
+ SVGPathSegLinetoHorizontalAbsImpl *createSVGPathSegLinetoHorizontalAbs(double x);
+ SVGPathSegLinetoHorizontalRelImpl *createSVGPathSegLinetoHorizontalRel(double x);
+ SVGPathSegLinetoVerticalAbsImpl *createSVGPathSegLinetoVerticalAbs(double y);
+ SVGPathSegLinetoVerticalRelImpl *createSVGPathSegLinetoVerticalRel(double y);
+ SVGPathSegCurvetoCubicSmoothAbsImpl *createSVGPathSegCurvetoCubicSmoothAbs(double x, double y, double x2, double y2);
+ SVGPathSegCurvetoCubicSmoothRelImpl *createSVGPathSegCurvetoCubicSmoothRel(double x, double y, double x2, double y2);
+ SVGPathSegCurvetoQuadraticSmoothAbsImpl *createSVGPathSegCurvetoQuadraticSmoothAbs(double x, double y);
+ SVGPathSegCurvetoQuadraticSmoothRelImpl *createSVGPathSegCurvetoQuadraticSmoothRel(double x, double y);
+
+ virtual void createItem(KSVGCanvas *c = 0);
+
+ virtual SVGRectImpl *getBBox();
+
+ class MarkerData
+ {
+ public:
+ struct Marker
+ {
+ double x;
+ double y;
+ double angle;
+ };
+
+ MarkerData() {}
+ MarkerData(SVGPathSegListImpl *path);
+
+ const Marker& marker(unsigned int i) const { return m_markers[i]; }
+ unsigned int numMarkers() const { return m_markers.count(); }
+
+ private:
+ struct SegmentData
+ {
+ double startx;
+ double starty;
+ double dx;
+ double dy;
+ double startSlope;
+ double endSlope;
+ unsigned int subpathStartIndex;
+ unsigned int subpathEndIndex;
+ bool subpathIsClosed;
+ int type;
+ };
+
+ static bool getStartSlope(QValueVector<SegmentData> segments, unsigned int i, double *pStartSlope);
+ static bool getEndSlope(QValueVector<SegmentData> segments, unsigned int i, double *pEndSlope);
+
+ QValueVector<Marker> m_markers;
+ };
+
+ MarkerData markerData() const { return m_markerData; }
+
+private:
+ SVGAnimatedNumberImpl *m_pathLength;
+ MarkerData m_markerData;
+
+ virtual void svgMoveTo(double x1, double y1, bool closed, bool abs = true);
+ virtual void svgLineTo(double x1, double y1, bool abs = true);
+ virtual void svgLineToHorizontal(double x, bool abs = true);
+ virtual void svgLineToVertical(double y, bool abs = true);
+ virtual void svgCurveToCubic(double x1, double y1, double x2, double y2, double x, double y, bool abs = true);
+ virtual void svgCurveToCubicSmooth(double x, double y, double x2, double y2, bool abs = true);
+ virtual void svgCurveToQuadratic(double x, double y, double x1, double y1, bool abs = true);
+ virtual void svgCurveToQuadraticSmooth(double x, double y, bool abs = true);
+ virtual void svgArcTo(double x, double y, double r1, double r2, double angle, bool largeArcFlag, bool sweepFlag, bool abs = true);
+ virtual void svgClosePath();
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ D, PathLength,
+ // Functions
+ GetTotalLength, GetPointAtLength, GetPathSegAtLength,
+ CreateSVGPathSegClosePath, CreateSVGPathSegMovetoAbs, CreateSVGPathSegMovetoRel,
+ CreateSVGPathSegLinetoAbs, CreateSVGPathSegLinetoRel, CreateSVGPathSegCurvetoCubicAbs,
+ CreateSVGPathSegCurvetoCubicRel, CreateSVGPathSegCurvetoQuadraticAbs,
+ CreateSVGPathSegCurvetoQuadraticRel, CreateSVGPathSegArcAbs,
+ CreateSVGPathSegArcRel, CreateSVGPathSegLinetoHorizontalAbs,
+ CreateSVGPathSegLinetoHorizontalRel, CreateSVGPathSegLinetoVerticalAbs,
+ CreateSVGPathSegLinetoVerticalRel, CreateSVGPathSegCurvetoCubicSmoothAbs,
+ CreateSVGPathSegCurvetoCubicSmoothRel, CreateSVGPathSegCurvetoQuadraticSmoothAbs,
+ CreateSVGPathSegCurvetoQuadraticSmoothRel
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGPathElementImpl, "path")
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGPathElementImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGPathElementImplProtoFunc, SVGPathElementImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegArcImpl.cc b/ksvg/impl/SVGPathSegArcImpl.cc
new file mode 100644
index 00000000..9fb4190f
--- /dev/null
+++ b/ksvg/impl/SVGPathSegArcImpl.cc
@@ -0,0 +1,495 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <math.h>
+
+#include <kdebug.h>
+
+#include "SVGPathSegArcImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegArcImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+static void getArcSlopes(bool relative, double curx, double cury, double angle, double x, double y, double r1, double r2, bool largeArcFlag, bool sweepFlag, double *pStartSlope, double *pEndSlope)
+{
+ double sin_th, cos_th;
+ double a00, a01, a10, a11;
+ double x0, y0, x1, y1, xc, yc;
+ double d, sfactor, sfactor_sq;
+ double th0, th1, th_arc;
+ int i, n_segs;
+
+ sin_th = sin(angle * (M_PI / 180.0));
+ cos_th = cos(angle * (M_PI / 180.0));
+
+ double dx;
+
+ if(!relative)
+ dx = (curx - x) / 2.0;
+ else
+ dx = -x / 2.0;
+
+ double dy;
+
+ if(!relative)
+ dy = (cury - y) / 2.0;
+ else
+ dy = -y / 2.0;
+
+ double _x1 = cos_th * dx + sin_th * dy;
+ double _y1 = -sin_th * dx + cos_th * dy;
+ double Pr1 = r1 * r1;
+ double Pr2 = r2 * r2;
+ double Px = _x1 * _x1;
+ double Py = _y1 * _y1;
+
+ // Spec : check if radii are large enough
+ double check = Px / Pr1 + Py / Pr2;
+ if(check > 1)
+ {
+ r1 = r1 * sqrt(check);
+ r2 = r2 * sqrt(check);
+ }
+
+ a00 = cos_th / r1;
+ a01 = sin_th / r1;
+ a10 = -sin_th / r2;
+ a11 = cos_th / r2;
+
+ x0 = a00 * curx + a01 * cury;
+ y0 = a10 * curx + a11 * cury;
+
+ if(!relative)
+ x1 = a00 * x + a01 * y;
+ else
+ x1 = a00 * (curx + x) + a01 * (cury + y);
+
+ if(!relative)
+ y1 = a10 * x + a11 * y;
+ else
+ y1 = a10 * (curx + x) + a11 * (cury + y);
+
+ /* (x0, y0) is current point in transformed coordinate space.
+ (x1, y1) is new point in transformed coordinate space.
+
+ The arc fits a unit-radius circle in this space.
+ */
+
+ d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0);
+
+ sfactor_sq = 1.0 / d - 0.25;
+
+ if(sfactor_sq < 0)
+ sfactor_sq = 0;
+
+ sfactor = sqrt(sfactor_sq);
+
+ if(sweepFlag == largeArcFlag)
+ sfactor = -sfactor;
+
+ xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0);
+ yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0);
+
+ /* (xc, yc) is center of the circle. */
+ th0 = atan2(y0 - yc, x0 - xc);
+ th1 = atan2(y1 - yc, x1 - xc);
+
+ th_arc = th1 - th0;
+ if(th_arc < 0 && sweepFlag)
+ th_arc += 2 * M_PI;
+ else if(th_arc > 0 && !sweepFlag)
+ th_arc -= 2 * M_PI;
+
+ n_segs = (int) (int) ceil(fabs(th_arc / (M_PI * 0.5 + 0.001)));
+
+ for(int step = 0; step < 2; step++)
+ {
+ i = step == 0 ? 0 : n_segs - 1;
+
+ double sin_th, cos_th;
+ double a00, a01, a10, a11;
+ double x1, y1, x2, y2, x3, y3;
+ double t;
+ double th_half;
+
+ double _th0 = th0 + i * th_arc / n_segs;
+ double _th1 = th0 + (i + 1) * th_arc / n_segs;
+
+ sin_th = sin(angle * (M_PI / 180.0));
+ cos_th = cos(angle * (M_PI / 180.0));
+
+ /* inverse transform compared with rsvg_path_arc */
+ a00 = cos_th * r1;
+ a01 = -sin_th * r2;
+ a10 = sin_th * r1;
+ a11 = cos_th * r2;
+
+ th_half = 0.5 * (_th1 - _th0);
+ t = (8.0 / 3.0) * sin(th_half * 0.5) * sin(th_half * 0.5) / sin(th_half);
+ x1 = xc + cos(_th0) - t * sin(_th0);
+ y1 = yc + sin(_th0) + t * cos(_th0);
+ x3 = xc + cos(_th1);
+ y3 = yc + sin(_th1);
+ x2 = x3 + t * sin(_th1);
+ y2 = y3 - t * cos(_th1);
+
+ double bezX1 = a00 * x1 + a01 * y1;
+ double bezY1 = a10 * x1 + a11 * y1;
+ double bezX2 = a00 * x2 + a01 * y2;
+ double bezY2 = a10 * x2 + a11 * y2;
+ double bezX = a00 * x3 + a01 * y3;
+ double bezY = a10 * x3 + a11 * y3;
+
+ if(step == 0)
+ *pStartSlope = SVGAngleImpl::todeg(atan2(bezY1 - cury, bezX1 - curx));
+ else
+ *pEndSlope = SVGAngleImpl::todeg(atan2(bezY - bezY2, bezX - bezX2));
+ }
+}
+
+SVGPathSegArcAbsImpl::SVGPathSegArcAbsImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegArcAbsImpl::~SVGPathSegArcAbsImpl()
+{
+}
+
+void SVGPathSegArcAbsImpl::setX(double x)
+{
+ m_x = x;
+}
+
+double SVGPathSegArcAbsImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegArcAbsImpl::setY(double y)
+{
+ m_y = y;
+}
+
+double SVGPathSegArcAbsImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegArcAbsImpl::setR1(double r1)
+{
+ m_r1 = r1;
+}
+
+double SVGPathSegArcAbsImpl::r1() const
+{
+ return m_r1;
+}
+
+void SVGPathSegArcAbsImpl::setR2(double r2)
+{
+ m_r2 = r2;
+}
+
+double SVGPathSegArcAbsImpl::r2() const
+{
+ return m_r2;
+}
+
+void SVGPathSegArcAbsImpl::setAngle(double angle)
+{
+ m_angle = angle;
+}
+
+double SVGPathSegArcAbsImpl::angle() const
+{
+ return m_angle;
+}
+
+void SVGPathSegArcAbsImpl::setLargeArcFlag(bool largeArcFlag)
+{
+ m_largeArcFlag = largeArcFlag;
+}
+
+bool SVGPathSegArcAbsImpl::largeArcFlag() const
+{
+ return m_largeArcFlag;
+}
+
+void SVGPathSegArcAbsImpl::setSweepFlag(bool sweepFlag)
+{
+ m_sweepFlag = sweepFlag;
+}
+
+bool SVGPathSegArcAbsImpl::sweepFlag() const
+{
+ return m_sweepFlag;
+}
+
+void SVGPathSegArcAbsImpl::getDeltasAndSlopes(double curx, double cury, double *pDx, double *pDy, double *pStartSlope, double *pEndSlope) const
+{
+ double dx = x() - curx;
+ double dy = y() - cury;
+ double startSlope;
+ double endSlope;
+ getArcSlopes(false, curx, cury, angle(), x(), y(), r1(), r2(), largeArcFlag(), sweepFlag(), &startSlope, &endSlope);
+ *pDx = dx;
+ *pDy = dy;
+ *pStartSlope = startSlope;
+ *pEndSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegArcAbsImpl::s_hashTable 11
+ x SVGPathSegArcAbsImpl::X DontDelete
+ y SVGPathSegArcAbsImpl::Y DontDelete
+ r1 SVGPathSegArcAbsImpl::R1 DontDelete
+ r2 SVGPathSegArcAbsImpl::R2 DontDelete
+ angle SVGPathSegArcAbsImpl::Angle DontDelete
+ largeArcFlag SVGPathSegArcAbsImpl::LargeArcFlag DontDelete
+ sweepFlag SVGPathSegArcAbsImpl::SweepFlag DontDelete
+@end
+*/
+
+Value SVGPathSegArcAbsImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ case R1:
+ return Number(r1());
+ case R2:
+ return Number(r2());
+ case Angle:
+ return Number(angle());
+ case LargeArcFlag:
+ return Boolean(largeArcFlag());
+ case SweepFlag:
+ return Boolean(sweepFlag());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegArcAbsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ case R1:
+ m_r1 = value.toNumber(exec);
+ break;
+ case R2:
+ m_r2 = value.toNumber(exec);
+ break;
+ case Angle:
+ m_angle = value.toNumber(exec);
+ break;
+ case LargeArcFlag:
+ m_largeArcFlag = value.toBoolean(exec);
+ break;
+ case SweepFlag:
+ m_sweepFlag = value.toBoolean(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+
+
+SVGPathSegArcRelImpl::SVGPathSegArcRelImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegArcRelImpl::~SVGPathSegArcRelImpl()
+{
+}
+
+void SVGPathSegArcRelImpl::setX(double x)
+{
+ m_x = x;
+}
+
+double SVGPathSegArcRelImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegArcRelImpl::setY(double y)
+{
+ m_y = y;
+}
+
+double SVGPathSegArcRelImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegArcRelImpl::setR1(double r1)
+{
+ m_r1 = r1;
+}
+
+double SVGPathSegArcRelImpl::r1() const
+{
+ return m_r1;
+}
+
+void SVGPathSegArcRelImpl::setR2(double r2)
+{
+ m_r2 = r2;
+}
+
+double SVGPathSegArcRelImpl::r2() const
+{
+ return m_r2;
+}
+
+void SVGPathSegArcRelImpl::setAngle(double angle)
+{
+ m_angle = angle;
+}
+
+double SVGPathSegArcRelImpl::angle() const
+{
+ return m_angle;
+}
+
+void SVGPathSegArcRelImpl::setLargeArcFlag(bool largeArcFlag)
+{
+ m_largeArcFlag = largeArcFlag;
+}
+
+bool SVGPathSegArcRelImpl::largeArcFlag() const
+{
+ return m_largeArcFlag;
+}
+
+void SVGPathSegArcRelImpl::setSweepFlag(bool sweepFlag)
+{
+ m_sweepFlag = sweepFlag;
+}
+
+bool SVGPathSegArcRelImpl::sweepFlag() const
+{
+ return m_sweepFlag;
+}
+
+void SVGPathSegArcRelImpl::getDeltasAndSlopes(double curx, double cury, double *pDx, double *pDy, double *pStartSlope, double *pEndSlope) const
+{
+ double dx = x();
+ double dy = y();
+ double startSlope;
+ double endSlope;
+ getArcSlopes(true, curx, cury, angle(), x(), y(), r1(), r2(), largeArcFlag(), sweepFlag(), &startSlope, &endSlope);
+ *pDx = dx;
+ *pDy = dy;
+ *pStartSlope = startSlope;
+ *pEndSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegArcRelImpl::s_hashTable 11
+ x SVGPathSegArcRelImpl::X DontDelete
+ y SVGPathSegArcRelImpl::Y DontDelete
+ r1 SVGPathSegArcRelImpl::R1 DontDelete
+ r2 SVGPathSegArcRelImpl::R2 DontDelete
+ angle SVGPathSegArcRelImpl::Angle DontDelete
+ largeArcFlag SVGPathSegArcRelImpl::LargeArcFlag DontDelete
+ sweepFlag SVGPathSegArcRelImpl::SweepFlag DontDelete
+@end
+*/
+
+Value SVGPathSegArcRelImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ case R1:
+ return Number(r1());
+ case R2:
+ return Number(r2());
+ case Angle:
+ return Number(angle());
+ case LargeArcFlag:
+ return Boolean(largeArcFlag());
+ case SweepFlag:
+ return Boolean(sweepFlag());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegArcRelImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ case R1:
+ m_r1 = value.toNumber(exec);
+ break;
+ case R2:
+ m_r2 = value.toNumber(exec);
+ break;
+ case Angle:
+ m_angle = value.toNumber(exec);
+ break;
+ case LargeArcFlag:
+ m_largeArcFlag = value.toBoolean(exec);
+ break;
+ case SweepFlag:
+ m_sweepFlag = value.toBoolean(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegArcImpl.h b/ksvg/impl/SVGPathSegArcImpl.h
new file mode 100644
index 00000000..f0e375d6
--- /dev/null
+++ b/ksvg/impl/SVGPathSegArcImpl.h
@@ -0,0 +1,150 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegArcImpl_H
+#define SVGPathSegArcImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSegImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathSegArcAbsImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegArcAbsImpl();
+ virtual ~SVGPathSegArcAbsImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_ARC_ABS; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "A"; }
+ virtual QString toString() const { return QString("A %1 %2 %3 %4 %5 %6 %7").arg(m_r1).arg(m_r2).arg(m_angle).arg(m_largeArcFlag).arg(m_sweepFlag).arg(m_x).arg(m_y); }
+
+ void setX(double x);
+ double x() const;
+
+ void setY(double y);
+ double y() const;
+
+ void setR1(double r1);
+ double r1() const;
+
+ void setR2(double r2);
+ double r2() const;
+
+ void setAngle(double angle);
+ double angle() const;
+
+ void setLargeArcFlag(bool largeArcFlag);
+ bool largeArcFlag() const;
+
+ void setSweepFlag(bool sweepFlag);
+ bool sweepFlag() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+ double m_r1;
+ double m_r2;
+ double m_angle;
+
+ bool m_largeArcFlag : 1;
+ bool m_sweepFlag : 1;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, R1, R2, Angle, LargeArcFlag, SweepFlag
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+
+class SVGPathSegArcRelImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegArcRelImpl();
+ virtual ~SVGPathSegArcRelImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_ARC_REL; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "a"; }
+ virtual QString toString() const { return QString("a %1 %2 %3 %4 %5 %6 %7").arg(m_r1).arg(m_r2).arg(m_angle).arg(m_largeArcFlag).arg(m_sweepFlag).arg(m_x).arg(m_y); }
+
+ void setX(double x);
+ double x() const;
+
+ void setY(double y);
+ double y() const;
+
+ void setR1(double r1);
+ double r1() const;
+
+ void setR2(double r2);
+ double r2() const;
+
+ void setAngle(double angle);
+ double angle() const;
+
+ void setLargeArcFlag(bool largeArcFlag);
+ bool largeArcFlag() const;
+
+ void setSweepFlag(bool sweepFlag);
+ bool sweepFlag() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+ double m_r1;
+ double m_r2;
+ double m_angle;
+
+ bool m_largeArcFlag : 1;
+ bool m_sweepFlag : 1;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, R1, R2, Angle, LargeArcFlag, SweepFlag
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegClosePathImpl.cc b/ksvg/impl/SVGPathSegClosePathImpl.cc
new file mode 100644
index 00000000..c18e6027
--- /dev/null
+++ b/ksvg/impl/SVGPathSegClosePathImpl.cc
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGPathSegClosePathImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+SVGPathSegClosePathImpl::SVGPathSegClosePathImpl() : SVGPathSegImpl()
+{
+}
+
+SVGPathSegClosePathImpl::~SVGPathSegClosePathImpl()
+{
+}
+
+void SVGPathSegClosePathImpl::getDeltasAndSlopes(double curx, double cury, double *pdx, double *pdy, double *pstartSlope, double *pendSlope) const
+{
+ double dx = x() - curx;
+ double dy = y() - cury;
+ double startSlope = SVGAngleImpl::todeg(atan2(dy, dx));
+ double endSlope = startSlope;
+ *pdx = dx;
+ *pdy = dy;
+ *pstartSlope = startSlope;
+ *pendSlope = endSlope;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegClosePathImpl.h b/ksvg/impl/SVGPathSegClosePathImpl.h
new file mode 100644
index 00000000..c4cf63ce
--- /dev/null
+++ b/ksvg/impl/SVGPathSegClosePathImpl.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegClosePathImpl_H
+#define SVGPathSegClosePathImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSegImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathSegClosePathImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegClosePathImpl();
+ virtual ~SVGPathSegClosePathImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_CLOSEPATH; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "Z"; }
+ virtual QString toString() const { return "Z"; }
+
+ void setX(double x) { m_x = x; }
+ void setY(double y) { m_y = y; }
+
+ double x() const { return m_x; }
+ double y() const { return m_y; }
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+
+public:
+ KSVG_FORWARDGET
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegCurvetoCubicImpl.cc b/ksvg/impl/SVGPathSegCurvetoCubicImpl.cc
new file mode 100644
index 00000000..468b1fb3
--- /dev/null
+++ b/ksvg/impl/SVGPathSegCurvetoCubicImpl.cc
@@ -0,0 +1,325 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegCurvetoCubicImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegCurvetoCubicImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGPathSegCurvetoCubicAbsImpl::SVGPathSegCurvetoCubicAbsImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegCurvetoCubicAbsImpl::~SVGPathSegCurvetoCubicAbsImpl()
+{
+}
+
+void SVGPathSegCurvetoCubicAbsImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegCurvetoCubicAbsImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegCurvetoCubicAbsImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegCurvetoCubicAbsImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegCurvetoCubicAbsImpl::setX1(const double &x1)
+{
+ m_x1 = x1;
+}
+
+double SVGPathSegCurvetoCubicAbsImpl::x1() const
+{
+ return m_x1;
+}
+
+void SVGPathSegCurvetoCubicAbsImpl::setY1(const double &y1)
+{
+ m_y1 = y1;
+}
+
+double SVGPathSegCurvetoCubicAbsImpl::y1() const
+{
+ return m_y1;
+}
+
+void SVGPathSegCurvetoCubicAbsImpl::setX2(const double &x2)
+{
+ m_x2 = x2;
+}
+
+double SVGPathSegCurvetoCubicAbsImpl::x2() const
+{
+ return m_x2;
+}
+
+void SVGPathSegCurvetoCubicAbsImpl::setY2(const double &y2)
+{
+ m_y2 = y2;
+}
+
+double SVGPathSegCurvetoCubicAbsImpl::y2() const
+{
+ return m_y2;
+}
+
+void SVGPathSegCurvetoCubicAbsImpl::getDeltasAndSlopes(double curx, double cury, double *pDx, double *pDy, double *pStartSlope, double *pEndSlope) const
+{
+ double dx = x() - curx;
+ double dy = y() - cury;
+ double startSlope = SVGAngleImpl::todeg(atan2(y1() - cury, x1() - curx));
+ double endSlope = SVGAngleImpl::todeg(atan2(y() - y2(), x() - x2()));
+ *pDx = dx;
+ *pDy = dy;
+ *pStartSlope = startSlope;
+ *pEndSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegCurvetoCubicAbsImpl::s_hashTable 7
+ x SVGPathSegCurvetoCubicAbsImpl::X DontDelete
+ y SVGPathSegCurvetoCubicAbsImpl::Y DontDelete
+ x1 SVGPathSegCurvetoCubicAbsImpl::X1 DontDelete
+ y1 SVGPathSegCurvetoCubicAbsImpl::Y1 DontDelete
+ x2 SVGPathSegCurvetoCubicAbsImpl::X2 DontDelete
+ y2 SVGPathSegCurvetoCubicAbsImpl::Y2 DontDelete
+@end
+*/
+
+Value SVGPathSegCurvetoCubicAbsImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ case X1:
+ return Number(x1());
+ case Y1:
+ return Number(y1());
+ case X2:
+ return Number(x2());
+ case Y2:
+ return Number(y2());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegCurvetoCubicAbsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ case X1:
+ m_x1 = value.toNumber(exec);
+ break;
+ case Y1:
+ m_y1 = value.toNumber(exec);
+ break;
+ case X2:
+ m_x2 = value.toNumber(exec);
+ break;
+ case Y2:
+ m_y2 = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+
+
+
+SVGPathSegCurvetoCubicRelImpl::SVGPathSegCurvetoCubicRelImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegCurvetoCubicRelImpl::~SVGPathSegCurvetoCubicRelImpl()
+{
+}
+
+void SVGPathSegCurvetoCubicRelImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegCurvetoCubicRelImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegCurvetoCubicRelImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegCurvetoCubicRelImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegCurvetoCubicRelImpl::setX1(const double &x1)
+{
+ m_x1 = x1;
+}
+
+double SVGPathSegCurvetoCubicRelImpl::x1() const
+{
+ return m_x1;
+}
+
+void SVGPathSegCurvetoCubicRelImpl::setY1(const double &y1)
+{
+ m_y1 = y1;
+}
+
+double SVGPathSegCurvetoCubicRelImpl::y1() const
+{
+ return m_y1;
+}
+
+void SVGPathSegCurvetoCubicRelImpl::setX2(const double &x2)
+{
+ m_x2 = x2;
+}
+
+double SVGPathSegCurvetoCubicRelImpl::x2() const
+{
+ return m_x2;
+}
+
+void SVGPathSegCurvetoCubicRelImpl::setY2(const double &y2)
+{
+ m_y2 = y2;
+}
+
+double SVGPathSegCurvetoCubicRelImpl::y2() const
+{
+ return m_y2;
+}
+
+void SVGPathSegCurvetoCubicRelImpl::getDeltasAndSlopes(double curx, double cury, double *pDx, double *pDy, double *pStartSlope, double *pEndSlope) const
+{
+ Q_UNUSED(curx);
+ Q_UNUSED(cury);
+ double dx = x();
+ double dy = y();
+ double startSlope = SVGAngleImpl::todeg(atan2(y1(), x1()));
+ double endSlope = SVGAngleImpl::todeg(atan2(y() - y2(), x() - x2()));
+ *pDx = dx;
+ *pDy = dy;
+ *pStartSlope = startSlope;
+ *pEndSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegCurvetoCubicRelImpl::s_hashTable 7
+ x SVGPathSegCurvetoCubicRelImpl::X DontDelete
+ y SVGPathSegCurvetoCubicRelImpl::Y DontDelete
+ x1 SVGPathSegCurvetoCubicRelImpl::X1 DontDelete
+ y1 SVGPathSegCurvetoCubicRelImpl::Y1 DontDelete
+ x2 SVGPathSegCurvetoCubicRelImpl::X2 DontDelete
+ y2 SVGPathSegCurvetoCubicRelImpl::Y2 DontDelete
+@end
+*/
+
+Value SVGPathSegCurvetoCubicRelImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ case X1:
+ return Number(x1());
+ case Y1:
+ return Number(y1());
+ case X2:
+ return Number(x2());
+ case Y2:
+ return Number(y2());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegCurvetoCubicRelImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ case X1:
+ m_x1 = value.toNumber(exec);
+ break;
+ case Y1:
+ m_y1 = value.toNumber(exec);
+ break;
+ case X2:
+ m_x2 = value.toNumber(exec);
+ break;
+ case Y2:
+ m_y2 = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegCurvetoCubicImpl.h b/ksvg/impl/SVGPathSegCurvetoCubicImpl.h
new file mode 100644
index 00000000..8f408f91
--- /dev/null
+++ b/ksvg/impl/SVGPathSegCurvetoCubicImpl.h
@@ -0,0 +1,139 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegCurvetoCubicImpl_H
+#define SVGPathSegCurvetoCubicImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSegImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathSegCurvetoCubicAbsImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegCurvetoCubicAbsImpl();
+ virtual ~SVGPathSegCurvetoCubicAbsImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_CURVETO_CUBIC_ABS; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "C"; }
+ virtual QString toString() const { return QString("C %1 %2 %3 %4 %5 %6").arg(m_x1).arg(m_y1).arg(m_x2).arg(m_y2).arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ void setX1(const double &);
+ double x1() const;
+
+ void setY1(const double &);
+ double y1() const;
+
+ void setX2(const double &);
+ double x2() const;
+
+ void setY2(const double &);
+ double y2() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+ double m_x1;
+ double m_y1;
+ double m_x2;
+ double m_y2;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, X1, Y1, X2, Y2
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGPathSegCurvetoCubicRelImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegCurvetoCubicRelImpl();
+ virtual ~SVGPathSegCurvetoCubicRelImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_CURVETO_CUBIC_REL; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "c"; }
+ virtual QString toString() const { return QString("c %1 %2 %3 %4 %5 %6").arg(m_x1).arg(m_y1).arg(m_x2).arg(m_y2).arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ void setX1(const double &);
+ double x1() const;
+
+ void setY1(const double &);
+ double y1() const;
+
+ void setX2(const double &);
+ double x2() const;
+
+ void setY2(const double &);
+ double y2() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+ double m_x1;
+ double m_y1;
+ double m_x2;
+ double m_y2;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, X1, Y1, X2, Y2
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegCurvetoCubicSmoothImpl.cc b/ksvg/impl/SVGPathSegCurvetoCubicSmoothImpl.cc
new file mode 100644
index 00000000..1d5c124a
--- /dev/null
+++ b/ksvg/impl/SVGPathSegCurvetoCubicSmoothImpl.cc
@@ -0,0 +1,298 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegCurvetoCubicSmoothImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegCurvetoCubicSmoothImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGPathSegCurvetoCubicSmoothAbsImpl::SVGPathSegCurvetoCubicSmoothAbsImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegCurvetoCubicSmoothAbsImpl::~SVGPathSegCurvetoCubicSmoothAbsImpl()
+{
+}
+
+void SVGPathSegCurvetoCubicSmoothAbsImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegCurvetoCubicSmoothAbsImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegCurvetoCubicSmoothAbsImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegCurvetoCubicSmoothAbsImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegCurvetoCubicSmoothAbsImpl::setX2(const double &x2)
+{
+ m_x2 = x2;
+}
+
+double SVGPathSegCurvetoCubicSmoothAbsImpl::x2() const
+{
+ return m_x2;
+}
+
+void SVGPathSegCurvetoCubicSmoothAbsImpl::setY2(const double &y2)
+{
+ m_y2 = y2;
+}
+
+double SVGPathSegCurvetoCubicSmoothAbsImpl::y2() const
+{
+ return m_y2;
+}
+
+void SVGPathSegCurvetoCubicSmoothAbsImpl::setPreviousX2(double x2)
+{
+ m_previousX2 = x2;
+}
+
+void SVGPathSegCurvetoCubicSmoothAbsImpl::setPreviousY2(double y2)
+{
+ m_previousY2 = y2;
+}
+
+double SVGPathSegCurvetoCubicSmoothAbsImpl::x1(double curx) const
+{
+ return curx - (m_previousX2 - curx);
+}
+
+double SVGPathSegCurvetoCubicSmoothAbsImpl::y1(double cury) const
+{
+ return cury - (m_previousY2 - cury);
+}
+
+void SVGPathSegCurvetoCubicSmoothAbsImpl::getDeltasAndSlopes(double curx, double cury, double *pDx, double *pDy, double *pStartSlope, double *pEndSlope) const
+{
+ double dx = x() - curx;
+ double dy = y() - cury;
+ double startSlope = SVGAngleImpl::todeg(atan2(y1(cury) - cury, x1(curx) - curx));
+ double endSlope = SVGAngleImpl::todeg(atan2(y() - y2(), x() - x2()));
+ *pDx = dx;
+ *pDy = dy;
+ *pStartSlope = startSlope;
+ *pEndSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegCurvetoCubicSmoothAbsImpl::s_hashTable 5
+ x SVGPathSegCurvetoCubicSmoothAbsImpl::X DontDelete
+ y SVGPathSegCurvetoCubicSmoothAbsImpl::Y DontDelete
+ x2 SVGPathSegCurvetoCubicSmoothAbsImpl::X2 DontDelete
+ y2 SVGPathSegCurvetoCubicSmoothAbsImpl::Y2 DontDelete
+@end
+*/
+
+Value SVGPathSegCurvetoCubicSmoothAbsImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ case X2:
+ return Number(x2());
+ case Y2:
+ return Number(y2());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegCurvetoCubicSmoothAbsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ case X2:
+ m_x2 = value.toNumber(exec);
+ break;
+ case Y2:
+ m_y2 = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+
+
+SVGPathSegCurvetoCubicSmoothRelImpl::SVGPathSegCurvetoCubicSmoothRelImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegCurvetoCubicSmoothRelImpl::~SVGPathSegCurvetoCubicSmoothRelImpl()
+{
+}
+
+void SVGPathSegCurvetoCubicSmoothRelImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegCurvetoCubicSmoothRelImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegCurvetoCubicSmoothRelImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegCurvetoCubicSmoothRelImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegCurvetoCubicSmoothRelImpl::setX2(const double &x2)
+{
+ m_x2 = x2;
+}
+
+double SVGPathSegCurvetoCubicSmoothRelImpl::x2() const
+{
+ return m_x2;
+}
+
+void SVGPathSegCurvetoCubicSmoothRelImpl::setY2(const double &y2)
+{
+ m_y2 = y2;
+}
+
+double SVGPathSegCurvetoCubicSmoothRelImpl::y2() const
+{
+ return m_y2;
+}
+
+void SVGPathSegCurvetoCubicSmoothRelImpl::setPreviousAbsX2(double x2)
+{
+ m_previousAbsX2 = x2;
+}
+
+void SVGPathSegCurvetoCubicSmoothRelImpl::setPreviousAbsY2(double y2)
+{
+ m_previousAbsY2 = y2;
+}
+
+double SVGPathSegCurvetoCubicSmoothRelImpl::absX1(double curx) const
+{
+ return curx - (m_previousAbsX2 - curx);
+}
+
+double SVGPathSegCurvetoCubicSmoothRelImpl::absY1(double cury) const
+{
+ return cury - (m_previousAbsY2 - cury);
+}
+
+void SVGPathSegCurvetoCubicSmoothRelImpl::getDeltasAndSlopes(double curx, double cury, double *pDx, double *pDy, double *pStartSlope, double *pEndSlope) const
+{
+ double dx = x();
+ double dy = y();
+ double startSlope = SVGAngleImpl::todeg(atan2(absY1(cury) - cury, absX1(curx) - curx));
+ double endSlope = SVGAngleImpl::todeg(atan2(y() - y2(), x() - x2()));
+ *pDx = dx;
+ *pDy = dy;
+ *pStartSlope = startSlope;
+ *pEndSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegCurvetoCubicSmoothRelImpl::s_hashTable 5
+ x SVGPathSegCurvetoCubicSmoothRelImpl::X DontDelete
+ y SVGPathSegCurvetoCubicSmoothRelImpl::Y DontDelete
+ x2 SVGPathSegCurvetoCubicSmoothRelImpl::X2 DontDelete
+ y2 SVGPathSegCurvetoCubicSmoothRelImpl::Y2 DontDelete
+@end
+*/
+
+Value SVGPathSegCurvetoCubicSmoothRelImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ case X2:
+ return Number(x2());
+ case Y2:
+ return Number(y2());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegCurvetoCubicSmoothRelImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ case X2:
+ m_x2 = value.toNumber(exec);
+ break;
+ case Y2:
+ m_y2 = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegCurvetoCubicSmoothImpl.h b/ksvg/impl/SVGPathSegCurvetoCubicSmoothImpl.h
new file mode 100644
index 00000000..0def6514
--- /dev/null
+++ b/ksvg/impl/SVGPathSegCurvetoCubicSmoothImpl.h
@@ -0,0 +1,139 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegCurvetoCubicSmoothImpl_H
+#define SVGPathSegCurvetoCubicSmoothImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSegImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathSegCurvetoCubicSmoothAbsImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegCurvetoCubicSmoothAbsImpl();
+ virtual ~SVGPathSegCurvetoCubicSmoothAbsImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_CURVETO_CUBIC_SMOOTH_ABS; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "S"; }
+ virtual QString toString() const { return QString("S %1 %2 %3 %4").arg(m_x2).arg(m_y2).arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ void setX2(const double &);
+ double x2() const;
+
+ void setY2(const double &);
+ double y2() const;
+
+ void setPreviousX2(double x2);
+ void setPreviousY2(double y2);
+
+ double x1(double curx) const;
+ double y1(double cury) const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+ double m_x2;
+ double m_y2;
+ double m_previousX2;
+ double m_previousY2;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, X2, Y2
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGPathSegCurvetoCubicSmoothRelImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegCurvetoCubicSmoothRelImpl();
+ virtual ~SVGPathSegCurvetoCubicSmoothRelImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_CURVETO_CUBIC_SMOOTH_REL; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "s"; }
+ virtual QString toString() const { return QString("s %1 %2 %3 %4").arg(m_x2).arg(m_y2).arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ void setX2(const double &);
+ double x2() const;
+
+ void setY2(const double &);
+ double y2() const;
+
+ void setPreviousAbsX2(double x2);
+ void setPreviousAbsY2(double y2);
+
+ double absX1(double curx) const;
+ double absY1(double cury) const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+ double m_x2;
+ double m_y2;
+ double m_previousAbsX2;
+ double m_previousAbsY2;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, X2, Y2
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegCurvetoQuadraticImpl.cc b/ksvg/impl/SVGPathSegCurvetoQuadraticImpl.cc
new file mode 100644
index 00000000..e6199a21
--- /dev/null
+++ b/ksvg/impl/SVGPathSegCurvetoQuadraticImpl.cc
@@ -0,0 +1,260 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegCurvetoQuadraticImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegCurvetoQuadraticImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGPathSegCurvetoQuadraticAbsImpl::SVGPathSegCurvetoQuadraticAbsImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegCurvetoQuadraticAbsImpl::~SVGPathSegCurvetoQuadraticAbsImpl()
+{
+}
+
+void SVGPathSegCurvetoQuadraticAbsImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegCurvetoQuadraticAbsImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegCurvetoQuadraticAbsImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegCurvetoQuadraticAbsImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegCurvetoQuadraticAbsImpl::setX1(const double &x1)
+{
+ m_x1 = x1;
+}
+
+double SVGPathSegCurvetoQuadraticAbsImpl::x1() const
+{
+ return m_x1;
+}
+
+void SVGPathSegCurvetoQuadraticAbsImpl::setY1(const double &y1)
+{
+ m_y1 = y1;
+}
+
+double SVGPathSegCurvetoQuadraticAbsImpl::y1() const
+{
+ return m_y1;
+}
+
+void SVGPathSegCurvetoQuadraticAbsImpl::getDeltasAndSlopes(double curx, double cury, double *pDx, double *pDy, double *pStartSlope, double *pEndSlope) const
+{
+ double dx = x() - curx;
+ double dy = y() - cury;
+ double startSlope = SVGAngleImpl::todeg(atan2(y1() - cury, x1() - curx));
+ double endSlope = SVGAngleImpl::todeg(atan2(y() - y1(), x() - x1()));
+ *pDx = dx;
+ *pDy = dy;
+ *pStartSlope = startSlope;
+ *pEndSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegCurvetoQuadraticAbsImpl::s_hashTable 5
+ x SVGPathSegCurvetoQuadraticAbsImpl::X DontDelete
+ y SVGPathSegCurvetoQuadraticAbsImpl::Y DontDelete
+ x1 SVGPathSegCurvetoQuadraticAbsImpl::X1 DontDelete
+ y1 SVGPathSegCurvetoQuadraticAbsImpl::Y1 DontDelete
+@end
+*/
+
+Value SVGPathSegCurvetoQuadraticAbsImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ case X1:
+ return Number(x1());
+ case Y1:
+ return Number(y1());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegCurvetoQuadraticAbsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ case X1:
+ m_x1 = value.toNumber(exec);
+ break;
+ case Y1:
+ m_y1 = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+
+
+SVGPathSegCurvetoQuadraticRelImpl::SVGPathSegCurvetoQuadraticRelImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegCurvetoQuadraticRelImpl::~SVGPathSegCurvetoQuadraticRelImpl()
+{
+}
+
+void SVGPathSegCurvetoQuadraticRelImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegCurvetoQuadraticRelImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegCurvetoQuadraticRelImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegCurvetoQuadraticRelImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegCurvetoQuadraticRelImpl::setX1(const double &x1)
+{
+ m_x1 = x1;
+}
+
+double SVGPathSegCurvetoQuadraticRelImpl::x1() const
+{
+ return m_x1;
+}
+
+void SVGPathSegCurvetoQuadraticRelImpl::setY1(const double &y1)
+{
+ m_y1 = y1;
+}
+
+double SVGPathSegCurvetoQuadraticRelImpl::y1() const
+{
+ return m_y1;
+}
+
+void SVGPathSegCurvetoQuadraticRelImpl::getDeltasAndSlopes(double curx, double cury, double *pDx, double *pDy, double *pStartSlope, double *pEndSlope) const
+{
+ Q_UNUSED(curx);
+ Q_UNUSED(cury);
+ double dx = x();
+ double dy = y();
+ double startSlope = SVGAngleImpl::todeg(atan2(y1(), x1()));
+ double endSlope = SVGAngleImpl::todeg(atan2(y() - y1(), x() - x1()));
+ *pDx = dx;
+ *pDy = dy;
+ *pStartSlope = startSlope;
+ *pEndSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegCurvetoQuadraticRelImpl::s_hashTable 5
+ x SVGPathSegCurvetoQuadraticRelImpl::X DontDelete
+ y SVGPathSegCurvetoQuadraticRelImpl::Y DontDelete
+ x1 SVGPathSegCurvetoQuadraticRelImpl::X1 DontDelete
+ y1 SVGPathSegCurvetoQuadraticRelImpl::Y1 DontDelete
+@end
+*/
+
+Value SVGPathSegCurvetoQuadraticRelImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ case X1:
+ return Number(x1());
+ case Y1:
+ return Number(y1());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegCurvetoQuadraticRelImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ case X1:
+ m_x1 = value.toNumber(exec);
+ break;
+ case Y1:
+ m_y1 = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegCurvetoQuadraticImpl.h b/ksvg/impl/SVGPathSegCurvetoQuadraticImpl.h
new file mode 100644
index 00000000..6fe9ef15
--- /dev/null
+++ b/ksvg/impl/SVGPathSegCurvetoQuadraticImpl.h
@@ -0,0 +1,123 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegCurvetoQuadraticImpl_H
+#define SVGPathSegCurvetoQuadraticImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSegImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathSegCurvetoQuadraticAbsImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegCurvetoQuadraticAbsImpl();
+ virtual ~SVGPathSegCurvetoQuadraticAbsImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_CURVETO_QUADRATIC_ABS; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "Q"; }
+ virtual QString toString() const { return QString("Q %1 %2 %3 %4").arg(m_x1).arg(m_y1).arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ void setX1(const double &);
+ double x1() const;
+
+ void setY1(const double &);
+ double y1() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+ double m_x1;
+ double m_y1;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, X1, Y1
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGPathSegCurvetoQuadraticRelImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegCurvetoQuadraticRelImpl();
+ virtual ~SVGPathSegCurvetoQuadraticRelImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_CURVETO_QUADRATIC_REL; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "q"; }
+ virtual QString toString() const { return QString("q %1 %2 %3 %4").arg(m_x1).arg(m_y1).arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ void setX1(const double &);
+ double x1() const;
+
+ void setY1(const double &);
+ double y1() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+ double m_x1;
+ double m_y1;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, X1, Y1
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegCurvetoQuadraticSmoothImpl.cc b/ksvg/impl/SVGPathSegCurvetoQuadraticSmoothImpl.cc
new file mode 100644
index 00000000..f8c141da
--- /dev/null
+++ b/ksvg/impl/SVGPathSegCurvetoQuadraticSmoothImpl.cc
@@ -0,0 +1,235 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegCurvetoQuadraticSmoothImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegCurvetoQuadraticSmoothImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGPathSegCurvetoQuadraticSmoothAbsImpl::SVGPathSegCurvetoQuadraticSmoothAbsImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegCurvetoQuadraticSmoothAbsImpl::~SVGPathSegCurvetoQuadraticSmoothAbsImpl()
+{
+}
+
+void SVGPathSegCurvetoQuadraticSmoothAbsImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegCurvetoQuadraticSmoothAbsImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegCurvetoQuadraticSmoothAbsImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegCurvetoQuadraticSmoothAbsImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegCurvetoQuadraticSmoothAbsImpl::setPreviousX1(double x1)
+{
+ m_previousX1 = x1;
+}
+
+void SVGPathSegCurvetoQuadraticSmoothAbsImpl::setPreviousY1(double y1)
+{
+ m_previousY1 = y1;
+}
+
+double SVGPathSegCurvetoQuadraticSmoothAbsImpl::x1(double curx) const
+{
+ return curx - (m_previousX1 - curx);
+}
+
+double SVGPathSegCurvetoQuadraticSmoothAbsImpl::y1(double cury) const
+{
+ return cury - (m_previousY1 - cury);
+}
+
+void SVGPathSegCurvetoQuadraticSmoothAbsImpl::getDeltasAndSlopes(double curx, double cury, double *pDx, double *pDy, double *pStartSlope, double *pEndSlope) const
+{
+ double dx = x() - curx;
+ double dy = y() - cury;
+ double startSlope = SVGAngleImpl::todeg(atan2(y1(cury) - cury, x1(curx) - curx));
+ double endSlope = SVGAngleImpl::todeg(atan2(y() - y1(cury), x() - x1(curx)));
+ *pDx = dx;
+ *pDy = dy;
+ *pStartSlope = startSlope;
+ *pEndSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegCurvetoQuadraticSmoothAbsImpl::s_hashTable 3
+ x SVGPathSegCurvetoQuadraticSmoothAbsImpl::X DontDelete
+ y SVGPathSegCurvetoQuadraticSmoothAbsImpl::Y DontDelete
+@end
+*/
+
+Value SVGPathSegCurvetoQuadraticSmoothAbsImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegCurvetoQuadraticSmoothAbsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+
+
+
+SVGPathSegCurvetoQuadraticSmoothRelImpl::SVGPathSegCurvetoQuadraticSmoothRelImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegCurvetoQuadraticSmoothRelImpl::~SVGPathSegCurvetoQuadraticSmoothRelImpl()
+{
+}
+
+void SVGPathSegCurvetoQuadraticSmoothRelImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegCurvetoQuadraticSmoothRelImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegCurvetoQuadraticSmoothRelImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegCurvetoQuadraticSmoothRelImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegCurvetoQuadraticSmoothRelImpl::setPreviousAbsX1(double x1)
+{
+ m_previousAbsX1 = x1;
+}
+
+void SVGPathSegCurvetoQuadraticSmoothRelImpl::setPreviousAbsY1(double y1)
+{
+ m_previousAbsY1 = y1;
+}
+
+double SVGPathSegCurvetoQuadraticSmoothRelImpl::absX1(double curx) const
+{
+ return curx - (m_previousAbsX1 - curx);
+}
+
+double SVGPathSegCurvetoQuadraticSmoothRelImpl::absY1(double cury) const
+{
+ return cury - (m_previousAbsY1 - cury);
+}
+
+void SVGPathSegCurvetoQuadraticSmoothRelImpl::getDeltasAndSlopes(double curx, double cury, double *pDx, double *pDy, double *pStartSlope, double *pEndSlope) const
+{
+ double dx = x();
+ double dy = y();
+ double startSlope = SVGAngleImpl::todeg(atan2(absY1(cury) - cury, absX1(curx) - curx));
+ double endSlope = SVGAngleImpl::todeg(atan2(cury + y() - absY1(cury), curx + x() - absX1(curx)));
+ *pDx = dx;
+ *pDy = dy;
+ *pStartSlope = startSlope;
+ *pEndSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegCurvetoQuadraticSmoothRelImpl::s_hashTable 3
+ x SVGPathSegCurvetoQuadraticSmoothRelImpl::X DontDelete
+ y SVGPathSegCurvetoQuadraticSmoothRelImpl::Y DontDelete
+@end
+*/
+
+Value SVGPathSegCurvetoQuadraticSmoothRelImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegCurvetoQuadraticSmoothRelImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegCurvetoQuadraticSmoothImpl.h b/ksvg/impl/SVGPathSegCurvetoQuadraticSmoothImpl.h
new file mode 100644
index 00000000..dffa3355
--- /dev/null
+++ b/ksvg/impl/SVGPathSegCurvetoQuadraticSmoothImpl.h
@@ -0,0 +1,123 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegCurvetoQuadraticSmoothImpl_H
+#define SVGPathSegCurvetoQuadraticSmoothImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSegImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathSegCurvetoQuadraticSmoothAbsImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegCurvetoQuadraticSmoothAbsImpl();
+ virtual ~SVGPathSegCurvetoQuadraticSmoothAbsImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "T"; }
+ virtual QString toString() const { return QString("T %1 %2").arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ void setPreviousX1(double x1);
+ void setPreviousY1(double y1);
+
+ double x1(double curx) const;
+ double y1(double cury) const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+ double m_previousX1;
+ double m_previousY1;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGPathSegCurvetoQuadraticSmoothRelImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegCurvetoQuadraticSmoothRelImpl();
+ virtual ~SVGPathSegCurvetoQuadraticSmoothRelImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "t"; }
+ virtual QString toString() const { return QString("t %1 %2").arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ void setPreviousAbsX1(double x1);
+ void setPreviousAbsY1(double y1);
+
+ double absX1(double curx) const;
+ double absY1(double cury) const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+ double m_previousAbsX1;
+ double m_previousAbsY1;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegImpl.cc b/ksvg/impl/SVGPathSegImpl.cc
new file mode 100644
index 00000000..c1f2934d
--- /dev/null
+++ b/ksvg/impl/SVGPathSegImpl.cc
@@ -0,0 +1,107 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_cacheimpl.h"
+
+SVGPathSegImpl::SVGPathSegImpl()
+{
+}
+
+SVGPathSegImpl::~SVGPathSegImpl()
+{
+}
+
+void SVGPathSegImpl::getDeltasAndSlopes(double, double, double *dx, double *dy, double *startSlope, double *endSlope) const
+{
+ *dx = 0;
+ *dy = 0;
+ *startSlope = 0;
+ *endSlope = 0;
+}
+
+// Exma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegImpl::s_hashTable 3
+ pathSegType SVGPathSegImpl::PathSegType DontDelete|ReadOnly
+ pathSegTypeAsLetter SVGPathSegImpl::PathSegTypeAsLetter DontDelete|ReadOnly
+@end
+*/
+
+Value SVGPathSegImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case PathSegType:
+ return Number(pathSegType());
+ case PathSegTypeAsLetter:
+ return String(pathSegTypeAsLetter().string());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+/*
+@namespace KSVG
+@begin SVGPathSegImplConstructor::s_hashTable 23
+ PATHSEG_UNKNOWN KSVG::PATHSEG_UNKNOWN DontDelete|ReadOnly
+ PATHSEG_CLOSEPATH KSVG::PATHSEG_CLOSEPATH DontDelete|ReadOnly
+ PATHSEG_MOVETO_ABS KSVG::PATHSEG_MOVETO_ABS DontDelete|ReadOnly
+ PATHSEG_MOVETO_REL KSVG::PATHSEG_MOVETO_REL DontDelete|ReadOnly
+ PATHSEG_LINETO_ABS KSVG::PATHSEG_LINETO_ABS DontDelete|ReadOnly
+ PATHSEG_LINETO_REL KSVG::PATHSEG_LINETO_REL DontDelete|ReadOnly
+ PATHSEG_CURVETO_CUBIC_ABS KSVG::PATHSEG_CURVETO_CUBIC_ABS DontDelete|ReadOnly
+ PATHSEG_CURVETO_CUBIC_REL KSVG::PATHSEG_CURVETO_CUBIC_REL DontDelete|ReadOnly
+ PATHSEG_CURVETO_QUADRATIC_ABS KSVG::PATHSEG_CURVETO_QUADRATIC_ABS DontDelete|ReadOnly
+ PATHSEG_CURVETO_QUADRATIC_REL KSVG::PATHSEG_CURVETO_QUADRATIC_REL DontDelete|ReadOnly
+ PATHSEG_ARC_ABS KSVG::PATHSEG_ARC_ABS DontDelete|ReadOnly
+ PATHSEG_ARC_REL KSVG::PATHSEG_ARC_REL DontDelete|ReadOnly
+ PATHSEG_LINETO_HORIZONTAL_ABS KSVG::PATHSEG_LINETO_HORIZONTAL_ABS DontDelete|ReadOnly
+ PATHSEG_LINETO_HORIZONTAL_REL KSVG::PATHSEG_LINETO_HORIZONTAL_REL DontDelete|ReadOnly
+ PATHSEG_LINETO_VERTICAL_ABS KSVG::PATHSEG_LINETO_VERTICAL_ABS DontDelete|ReadOnly
+ PATHSEG_LINETO_VERTICAL_REL KSVG::PATHSEG_LINETO_VERTICAL_REL DontDelete|ReadOnly
+ PATHSEG_CURVETO_CUBIC_SMOOTH_ABS KSVG::PATHSEG_CURVETO_CUBIC_SMOOTH_ABS DontDelete|ReadOnly
+ PATHSEG_CURVETO_CUBIC_SMOOTH_REL KSVG::PATHSEG_CURVETO_CUBIC_SMOOTH_REL DontDelete|ReadOnly
+ PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS KSVG::PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS DontDelete|ReadOnly
+ PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL KSVG::PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL DontDelete|ReadOnly
+@end
+*/
+
+Value SVGPathSegImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGPathSegImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGPathSegImplConstructor>(exec, "[[svgpathseg.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegImpl.h b/ksvg/impl/SVGPathSegImpl.h
new file mode 100644
index 00000000..64d8b5b0
--- /dev/null
+++ b/ksvg/impl/SVGPathSegImpl.h
@@ -0,0 +1,75 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegImpl_H
+#define SVGPathSegImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSeg.h"
+
+namespace KSVG
+{
+
+class SVGPathElementImpl;
+class SVGPathSegImpl : public DOM::DomShared
+{
+public:
+ SVGPathSegImpl();
+ virtual ~SVGPathSegImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_UNKNOWN; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return ""; }
+ virtual QString toString() const { return ""; }
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+public:
+ KSVG_BASECLASS_GET
+
+ enum
+ {
+ // Properties
+ PathSegType, PathSegTypeAsLetter
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+
+};
+
+class SVGPathSegImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGPathSegImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGPathSegImplConstructor(KJS::ExecState *exec);
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegLinetoHorizontalImpl.cc b/ksvg/impl/SVGPathSegLinetoHorizontalImpl.cc
new file mode 100644
index 00000000..e36e49de
--- /dev/null
+++ b/ksvg/impl/SVGPathSegLinetoHorizontalImpl.cc
@@ -0,0 +1,167 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegLinetoHorizontalImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegLinetoHorizontalImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGPathSegLinetoHorizontalAbsImpl::SVGPathSegLinetoHorizontalAbsImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegLinetoHorizontalAbsImpl::~SVGPathSegLinetoHorizontalAbsImpl()
+{
+}
+
+void SVGPathSegLinetoHorizontalAbsImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegLinetoHorizontalAbsImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegLinetoHorizontalAbsImpl::getDeltasAndSlopes(double curx, double cury, double *pdx, double *pdy, double *pstartSlope, double *pendSlope) const
+{
+ Q_UNUSED(cury);
+ double dx = x() - curx;
+ double dy = 0;
+ double startSlope = SVGAngleImpl::todeg(atan2(dy, dx));
+ double endSlope = startSlope;
+ *pdx = dx;
+ *pdy = dy;
+ *pstartSlope = startSlope;
+ *pendSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegLinetoHorizontalAbsImpl::s_hashTable 2
+ x SVGPathSegLinetoHorizontalAbsImpl::X DontDelete
+@end
+*/
+
+Value SVGPathSegLinetoHorizontalAbsImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegLinetoHorizontalAbsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+
+
+
+
+SVGPathSegLinetoHorizontalRelImpl::SVGPathSegLinetoHorizontalRelImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegLinetoHorizontalRelImpl::~SVGPathSegLinetoHorizontalRelImpl()
+{
+}
+
+void SVGPathSegLinetoHorizontalRelImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegLinetoHorizontalRelImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegLinetoHorizontalRelImpl::getDeltasAndSlopes(double curx, double cury, double *pdx, double *pdy, double *pstartSlope, double *pendSlope) const
+{
+ Q_UNUSED(curx);
+ Q_UNUSED(cury);
+ double dx = x();
+ double dy = 0;
+ double startSlope = SVGAngleImpl::todeg(atan2(dy, dx));
+ double endSlope = startSlope;
+ *pdx = dx;
+ *pdy = dy;
+ *pstartSlope = startSlope;
+ *pendSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegLinetoHorizontalRelImpl::s_hashTable 2
+ x SVGPathSegLinetoHorizontalRelImpl::X DontDelete
+@end
+*/
+
+Value SVGPathSegLinetoHorizontalRelImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegLinetoHorizontalRelImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegLinetoHorizontalImpl.h b/ksvg/impl/SVGPathSegLinetoHorizontalImpl.h
new file mode 100644
index 00000000..020d29d7
--- /dev/null
+++ b/ksvg/impl/SVGPathSegLinetoHorizontalImpl.h
@@ -0,0 +1,99 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegLinetoHorizontalImpl_H
+#define SVGPathSegLinetoHorizontalImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSegImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathSegLinetoHorizontalAbsImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegLinetoHorizontalAbsImpl();
+ virtual ~SVGPathSegLinetoHorizontalAbsImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_LINETO_HORIZONTAL_ABS; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "H"; }
+ virtual QString toString() const { return QString("H %1").arg(m_x); }
+
+ void setX(const double &);
+ double x() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGPathSegLinetoHorizontalRelImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegLinetoHorizontalRelImpl();
+ virtual ~SVGPathSegLinetoHorizontalRelImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_LINETO_HORIZONTAL_REL; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "h"; }
+ virtual QString toString() const { return QString("h %1").arg(m_x); }
+
+ void setX(const double &);
+ double x() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegLinetoImpl.cc b/ksvg/impl/SVGPathSegLinetoImpl.cc
new file mode 100644
index 00000000..04203352
--- /dev/null
+++ b/ksvg/impl/SVGPathSegLinetoImpl.cc
@@ -0,0 +1,196 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegLinetoImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegLinetoImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGPathSegLinetoAbsImpl::SVGPathSegLinetoAbsImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegLinetoAbsImpl::~SVGPathSegLinetoAbsImpl()
+{
+}
+
+void SVGPathSegLinetoAbsImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegLinetoAbsImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegLinetoAbsImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegLinetoAbsImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegLinetoAbsImpl::getDeltasAndSlopes(double curx, double cury, double *pdx, double *pdy, double *pstartSlope, double *pendSlope) const
+{
+ double dx = x() - curx;
+ double dy = y() - cury;
+ double startSlope = SVGAngleImpl::todeg(atan2(dy, dx));
+ double endSlope = startSlope;
+ *pdx = dx;
+ *pdy = dy;
+ *pstartSlope = startSlope;
+ *pendSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegLinetoAbsImpl::s_hashTable 3
+ x SVGPathSegLinetoAbsImpl::X DontDelete
+ y SVGPathSegLinetoAbsImpl::Y DontDelete
+@end
+*/
+
+Value SVGPathSegLinetoAbsImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegLinetoAbsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+
+
+SVGPathSegLinetoRelImpl::SVGPathSegLinetoRelImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegLinetoRelImpl::~SVGPathSegLinetoRelImpl()
+{
+}
+
+void SVGPathSegLinetoRelImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegLinetoRelImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegLinetoRelImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegLinetoRelImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegLinetoRelImpl::getDeltasAndSlopes(double curx, double cury, double *pdx, double *pdy, double *pstartSlope, double *pendSlope) const
+{
+ Q_UNUSED(curx);
+ Q_UNUSED(cury);
+ double dx = x();
+ double dy = y();
+ double startSlope = SVGAngleImpl::todeg(atan2(dy, dx));
+ double endSlope = startSlope;
+ *pdx = dx;
+ *pdy = dy;
+ *pstartSlope = startSlope;
+ *pendSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegLinetoRelImpl::s_hashTable 3
+ x SVGPathSegLinetoRelImpl::X DontDelete
+ y SVGPathSegLinetoRelImpl::Y DontDelete
+@end
+*/
+
+Value SVGPathSegLinetoRelImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegLinetoRelImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegLinetoImpl.h b/ksvg/impl/SVGPathSegLinetoImpl.h
new file mode 100644
index 00000000..3e315022
--- /dev/null
+++ b/ksvg/impl/SVGPathSegLinetoImpl.h
@@ -0,0 +1,107 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegLinetoImpl_H
+#define SVGPathSegLinetoImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSegImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathSegLinetoAbsImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegLinetoAbsImpl();
+ virtual ~SVGPathSegLinetoAbsImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_LINETO_ABS; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "L"; }
+ virtual QString toString() const { return QString("L %1 %2").arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGPathSegLinetoRelImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegLinetoRelImpl();
+ virtual ~SVGPathSegLinetoRelImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_LINETO_REL; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "l"; }
+ virtual QString toString() const { return QString("l %1 %2").arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegLinetoVerticalImpl.cc b/ksvg/impl/SVGPathSegLinetoVerticalImpl.cc
new file mode 100644
index 00000000..0eca1280
--- /dev/null
+++ b/ksvg/impl/SVGPathSegLinetoVerticalImpl.cc
@@ -0,0 +1,165 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegLinetoVerticalImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegLinetoVerticalImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGPathSegLinetoVerticalAbsImpl::SVGPathSegLinetoVerticalAbsImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegLinetoVerticalAbsImpl::~SVGPathSegLinetoVerticalAbsImpl()
+{
+}
+
+void SVGPathSegLinetoVerticalAbsImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegLinetoVerticalAbsImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegLinetoVerticalAbsImpl::getDeltasAndSlopes(double curx, double cury, double *pdx, double *pdy, double *pstartSlope, double *pendSlope) const
+{
+ Q_UNUSED(curx);
+ double dx = 0;
+ double dy = y() - cury;
+ double startSlope = SVGAngleImpl::todeg(atan2(dy, dx));
+ double endSlope = startSlope;
+ *pdx = dx;
+ *pdy = dy;
+ *pstartSlope = startSlope;
+ *pendSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegLinetoVerticalAbsImpl::s_hashTable 2
+ y SVGPathSegLinetoVerticalAbsImpl::Y DontDelete
+@end
+*/
+
+Value SVGPathSegLinetoVerticalAbsImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case Y:
+ return Number(y());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegLinetoVerticalAbsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+
+
+SVGPathSegLinetoVerticalRelImpl::SVGPathSegLinetoVerticalRelImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegLinetoVerticalRelImpl::~SVGPathSegLinetoVerticalRelImpl()
+{
+}
+
+void SVGPathSegLinetoVerticalRelImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegLinetoVerticalRelImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegLinetoVerticalRelImpl::getDeltasAndSlopes(double curx, double cury, double *pdx, double *pdy, double *pstartSlope, double *pendSlope) const
+{
+ Q_UNUSED(curx);
+ Q_UNUSED(cury);
+ double dx = 0;
+ double dy = y();
+ double startSlope = SVGAngleImpl::todeg(atan2(dy, dx));
+ double endSlope = startSlope;
+ *pdx = dx;
+ *pdy = dy;
+ *pstartSlope = startSlope;
+ *pendSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegLinetoVerticalRelImpl::s_hashTable 2
+ y SVGPathSegLinetoVerticalRelImpl::Y DontDelete
+@end
+*/
+
+Value SVGPathSegLinetoVerticalRelImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case Y:
+ return Number(y());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegLinetoVerticalRelImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegLinetoVerticalImpl.h b/ksvg/impl/SVGPathSegLinetoVerticalImpl.h
new file mode 100644
index 00000000..c50906d9
--- /dev/null
+++ b/ksvg/impl/SVGPathSegLinetoVerticalImpl.h
@@ -0,0 +1,99 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegLinetoVerticalImpl_H
+#define SVGPathSegLinetoVerticalImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSegImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathSegLinetoVerticalAbsImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegLinetoVerticalAbsImpl();
+ virtual~SVGPathSegLinetoVerticalAbsImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_LINETO_VERTICAL_ABS; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "V"; }
+ virtual QString toString() const { return QString("V %1").arg(m_y); }
+
+ void setY(const double &);
+ double y() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_y;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ Y
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGPathSegLinetoVerticalRelImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegLinetoVerticalRelImpl();
+ virtual ~SVGPathSegLinetoVerticalRelImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_LINETO_VERTICAL_REL; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "v"; }
+ virtual QString toString() const { return QString("v %1").arg(m_y); }
+
+ void setY(const double &);
+ double y() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_y;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ Y
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegListImpl.cc b/ksvg/impl/SVGPathSegListImpl.cc
new file mode 100644
index 00000000..ee316938
--- /dev/null
+++ b/ksvg/impl/SVGPathSegListImpl.cc
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegListImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegListImpl::s_hashTable 2
+ numberOfItems SVGListDefs::NumberOfItems DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGPathSegListImplProto::s_hashTable 11
+ getItem SVGListDefs::GetItem DontDelete|Function 1
+ removeItem SVGListDefs::RemoveItem DontDelete|Function 1
+ appendItem SVGListDefs::AppendItem DontDelete|Function 1
+ initialize SVGListDefs::Initialize DontDelete|Function 1
+ insertItemBefore SVGListDefs::InsertItemBefore DontDelete|Function 2
+ replaceItem SVGListDefs::ReplaceItem DontDelete|Function 2
+ clear SVGListDefs::Clear DontDelete|Function 0
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGPathSegList", SVGPathSegListImplProto, SVGPathSegListImplProtoFunc)
+
+Value SVGPathSegListImpl::getValueProperty(ExecState *exec, int token) const
+{
+ return SVGList<SVGPathSegImpl>::getValueProperty(exec, token);
+}
+
+Value SVGPathSegListImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGPathSegListImpl)
+
+ return obj->call(exec, static_cast<SVGList<SVGPathSegImpl> *>(obj), args, id);
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegListImpl.h b/ksvg/impl/SVGPathSegListImpl.h
new file mode 100644
index 00000000..ef9c8c6e
--- /dev/null
+++ b/ksvg/impl/SVGPathSegListImpl.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegListImpl_H
+#define SVGPathSegListImpl_H
+
+#include "SVGList.h"
+
+#include "SVGPathSegImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGPathSegListImpl : public SVGList<SVGPathSegImpl>
+{
+public:
+ KSVG_GET
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGPathSegListImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGPathSegListImplProtoFunc, SVGPathSegListImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegMovetoImpl.cc b/ksvg/impl/SVGPathSegMovetoImpl.cc
new file mode 100644
index 00000000..2eb64b41
--- /dev/null
+++ b/ksvg/impl/SVGPathSegMovetoImpl.cc
@@ -0,0 +1,196 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPathSegMovetoImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPathSegMovetoImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGPathSegMovetoAbsImpl::SVGPathSegMovetoAbsImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegMovetoAbsImpl::~SVGPathSegMovetoAbsImpl()
+{
+}
+
+void SVGPathSegMovetoAbsImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegMovetoAbsImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegMovetoAbsImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegMovetoAbsImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegMovetoAbsImpl::getDeltasAndSlopes(double curx, double cury, double *pdx, double *pdy, double *pstartSlope, double *pendSlope) const
+{
+ double dx = x() - curx;
+ double dy = y() - cury;
+ double startSlope = 0;
+ double endSlope = 0;
+ *pdx = dx;
+ *pdy = dy;
+ *pstartSlope = startSlope;
+ *pendSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegMovetoAbsImpl::s_hashTable 3
+ x SVGPathSegMovetoAbsImpl::X DontDelete
+ y SVGPathSegMovetoAbsImpl::Y DontDelete
+@end
+*/
+
+Value SVGPathSegMovetoAbsImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegMovetoAbsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+
+
+SVGPathSegMovetoRelImpl::SVGPathSegMovetoRelImpl() : SVGPathSegImpl()
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGPathSegMovetoRelImpl::~SVGPathSegMovetoRelImpl()
+{
+}
+
+void SVGPathSegMovetoRelImpl::setX(const double &x)
+{
+ m_x = x;
+}
+
+double SVGPathSegMovetoRelImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPathSegMovetoRelImpl::setY(const double &y)
+{
+ m_y = y;
+}
+
+double SVGPathSegMovetoRelImpl::y() const
+{
+ return m_y;
+}
+
+void SVGPathSegMovetoRelImpl::getDeltasAndSlopes(double curx, double cury, double *pdx, double *pdy, double *pstartSlope, double *pendSlope) const
+{
+ Q_UNUSED(curx);
+ Q_UNUSED(cury);
+ double dx = x();
+ double dy = y();
+ double startSlope = 0;
+ double endSlope = 0;
+ *pdx = dx;
+ *pdy = dy;
+ *pstartSlope = startSlope;
+ *pendSlope = endSlope;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPathSegMovetoRelImpl::s_hashTable 3
+ x SVGPathSegMovetoRelImpl::X DontDelete
+ y SVGPathSegMovetoRelImpl::Y DontDelete
+@end
+*/
+
+Value SVGPathSegMovetoRelImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPathSegMovetoRelImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPathSegMovetoImpl.h b/ksvg/impl/SVGPathSegMovetoImpl.h
new file mode 100644
index 00000000..dfbad355
--- /dev/null
+++ b/ksvg/impl/SVGPathSegMovetoImpl.h
@@ -0,0 +1,107 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPathSegMovetoImpl_H
+#define SVGPathSegMovetoImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPathSegImpl.h"
+
+namespace KSVG
+{
+
+class SVGPathSegMovetoAbsImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegMovetoAbsImpl();
+ virtual ~SVGPathSegMovetoAbsImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_MOVETO_ABS; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "M"; }
+ virtual QString toString() const { return QString("M %1 %2").arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGPathSegMovetoRelImpl : public SVGPathSegImpl
+{
+public:
+ SVGPathSegMovetoRelImpl();
+ virtual ~SVGPathSegMovetoRelImpl();
+
+ virtual unsigned short pathSegType() const { return PATHSEG_MOVETO_REL; }
+ virtual DOM::DOMString pathSegTypeAsLetter() const { return "m"; }
+ virtual QString toString() const { return QString("m %1 %2").arg(m_x).arg(m_y); }
+
+ void setX(const double &);
+ double x() const;
+
+ void setY(const double &);
+ double y() const;
+
+ virtual void getDeltasAndSlopes(double curx, double cury, double *dx, double *dy, double *startSlope, double *endSlope) const;
+
+private:
+ double m_x;
+ double m_y;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPatternElementImpl.cc b/ksvg/impl/SVGPatternElementImpl.cc
new file mode 100644
index 00000000..0b591487
--- /dev/null
+++ b/ksvg/impl/SVGPatternElementImpl.cc
@@ -0,0 +1,509 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "SVGPatternElement.h"
+#include "SVGPatternElementImpl.h"
+
+#include "CanvasFactory.h"
+#include "KSVGCanvas.h"
+#include "CanvasItems.h"
+#include "SVGHelperImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGTransformListImpl.h"
+#include "SVGAnimatedTransformListImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGAnimatedStringImpl.h"
+#include "SVGUnitConverter.h"
+#include "SVGShapeImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGMatrixImpl.h"
+#include "SVGRectImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPatternElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+QValueList<SVGPatternElementImpl *> SVGPatternElementImpl::m_patternElements;
+
+SVGPatternElementImpl::SVGPatternElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGURIReferenceImpl(), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGFitToViewBoxImpl(), SVGPaintServerImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_patternUnits = new SVGAnimatedEnumerationImpl();
+ m_patternUnits->ref();
+
+ m_patternContentUnits = new SVGAnimatedEnumerationImpl();
+ m_patternContentUnits->ref();
+
+ m_patternTransform = new SVGAnimatedTransformListImpl();
+ m_patternTransform->ref();
+
+ m_x = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_x->ref();
+
+ m_y = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_y->ref();
+
+ m_width = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_width->ref();
+
+ m_height = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_height->ref();
+
+ m_converter = new SVGUnitConverter();
+ m_converter->add(m_x);
+ m_converter->add(m_y);
+ m_converter->add(m_width);
+ m_converter->add(m_height);
+
+ m_patternElements.append(this);
+
+ m_canvas = 0;
+ m_location = this;
+
+ m_tileCache.setMaxTotalCost(1024 * 1024);
+}
+
+SVGPatternElementImpl::~SVGPatternElementImpl()
+{
+ if(m_patternUnits)
+ m_patternUnits->deref();
+ if(m_patternContentUnits)
+ m_patternContentUnits->deref();
+ if(m_patternTransform)
+ m_patternTransform->deref();
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_width)
+ m_width->deref();
+ if(m_height)
+ m_height->deref();
+ delete m_converter;
+ m_patternElements.remove(this);
+}
+
+SVGAnimatedEnumerationImpl *SVGPatternElementImpl::patternUnits() const
+{
+ return m_patternUnits;
+}
+
+SVGAnimatedEnumerationImpl *SVGPatternElementImpl::patternContentUnits() const
+{
+ return m_patternContentUnits;
+}
+
+SVGAnimatedTransformListImpl *SVGPatternElementImpl::patternTransform() const
+{
+ return m_patternTransform;
+}
+
+SVGAnimatedLengthImpl *SVGPatternElementImpl::x() const
+{
+ return m_x;
+}
+
+SVGAnimatedLengthImpl *SVGPatternElementImpl::y() const
+{
+ return m_y;
+}
+
+SVGAnimatedLengthImpl *SVGPatternElementImpl::width() const
+{
+ return m_width;
+}
+
+SVGAnimatedLengthImpl *SVGPatternElementImpl::height() const
+{
+ return m_height;
+}
+
+void SVGPatternElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_paintServer)
+ m_paintServer = c->createPaintServer(this);
+}
+
+void SVGPatternElementImpl::removeItem(KSVGCanvas *)
+{
+ delete m_paintServer;
+ m_paintServer = 0;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPatternElementImpl::s_hashTable 11
+ x SVGPatternElementImpl::X DontDelete|ReadOnly
+ y SVGPatternElementImpl::Y DontDelete|ReadOnly
+ width SVGPatternElementImpl::Width DontDelete|ReadOnly
+ height SVGPatternElementImpl::Height DontDelete|ReadOnly
+ patternUnits SVGPatternElementImpl::PatternUnits DontDelete|ReadOnly
+ patternContentUnits SVGPatternElementImpl::PatternContentUnits DontDelete|ReadOnly
+ patternTransform SVGPatternElementImpl::PatternTransform DontDelete|ReadOnly
+@end
+*/
+
+Value SVGPatternElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case X:
+ if(!attributeMode)
+ return m_x->cache(exec);
+ else
+ return Number(m_x->baseVal()->value());
+ case Y:
+ if(!attributeMode)
+ return m_y->cache(exec);
+ else
+ return Number(m_y->baseVal()->value());
+ case Width:
+ if(!attributeMode)
+ return m_width->cache(exec);
+ else
+ return Number(m_width->baseVal()->value());
+ case Height:
+ if(!attributeMode)
+ return m_height->cache(exec);
+ else
+ return Number(m_height->baseVal()->value());
+ case PatternUnits:
+ if(!attributeMode)
+ return m_patternUnits->cache(exec);
+ else
+ return Number(m_patternUnits->baseVal());
+ case PatternContentUnits:
+ if(!attributeMode)
+ return m_patternContentUnits->cache(exec);
+ else
+ return Number(m_patternContentUnits->baseVal());
+ case PatternTransform:
+ //if(!attributeMode)
+ return m_patternTransform->cache(exec);
+ //else
+ // return Number(m_patternTransform->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPatternElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case X:
+ converter()->modify(x(), value.toString(exec).qstring());
+ break;
+ case Y:
+ converter()->modify(y(), value.toString(exec).qstring());
+ break;
+ case Width:
+ converter()->modify(width(), value.toString(exec).qstring());
+ if(width()->baseVal()->value() < 0) // A negative value is an error
+ gotError(i18n("Negative value for attribute width of element <pattern> is illegal"));
+ break;
+ case Height:
+ converter()->modify(height(), value.toString(exec).qstring());
+ if(height()->baseVal()->value() < 0) // A negative value is an error
+ gotError(i18n("Negative value for attribute height of element <pattern> is illegal"));
+ break;
+ case PatternUnits:
+ if(value.toString(exec).qstring() == "userSpaceOnUse")
+ m_patternUnits->setBaseVal(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
+ else
+ m_patternUnits->setBaseVal(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+ break;
+ case PatternContentUnits:
+ if(value.toString(exec).qstring() == "userSpaceOnUse")
+ m_patternContentUnits->setBaseVal(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
+ else
+ m_patternContentUnits->setBaseVal(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+ break;
+ case PatternTransform:
+ m_patternTransform->baseVal()->clear();
+ SVGHelperImpl::parseTransformAttribute(m_patternTransform->baseVal(), value.toString(exec).qstring());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+void SVGPatternElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if attribute not specified, use a value of 0
+ if(KSVG_TOKEN_NOT_PARSED(X))
+ KSVG_SET_ALT_ATTRIBUTE(X, "0")
+
+ // Spec: if attribute not specified, use a value of 0
+ if(KSVG_TOKEN_NOT_PARSED(Y))
+ KSVG_SET_ALT_ATTRIBUTE(Y, "0")
+
+ // Spec: if attribute not specified, use objectBoundingBox
+ if(KSVG_TOKEN_NOT_PARSED(PatternUnits))
+ KSVG_SET_ALT_ATTRIBUTE(PatternUnits, "objectBoundingBox")
+
+ // Spec: If attribute not specified, use userSpaceOnUse
+ if(KSVG_TOKEN_NOT_PARSED(PatternContentUnits))
+ KSVG_SET_ALT_ATTRIBUTE(PatternContentUnits, "userSpaceOnUse")
+
+ // Spec: default value
+ if(KSVG_TOKEN_NOT_PARSED(PreserveAspectRatio))
+ KSVG_SET_ALT_ATTRIBUTE(PreserveAspectRatio, "xMidYMid meet")
+}
+
+void SVGPatternElementImpl::flushCachedTiles()
+{
+ QValueList<SVGPatternElementImpl *>::iterator it;
+
+ for(it = m_patternElements.begin(); it != m_patternElements.end(); it++)
+ {
+ SVGPatternElementImpl *pattern = *it;
+
+ if(pattern->paintServer())
+ pattern->paintServer()->resetFinalized();
+ }
+}
+
+QImage SVGPatternElementImpl::createTile(SVGShapeImpl *referencingElement, int imageWidth, int imageHeight)
+{
+ converter()->finalize(referencingElement, ownerSVGElement(), patternUnits()->baseVal());
+
+ QImage image(imageWidth, imageHeight, 32);
+ image.setAlphaBuffer(true);
+
+ if(m_canvas == 0)
+ {
+ m_canvas = CanvasFactory::self()->loadCanvas(image.width(), image.height());
+ m_canvas->setBackgroundColor(qRgba(0, 0, 0, 0));
+ }
+
+ m_canvas->setup(image.bits(), image.width(), image.height());
+
+ SVGMatrixImpl *baseMatrix = SVGSVGElementImpl::createSVGMatrix();
+
+ // Set the scale to map the tile onto the integral sized image
+ double xScale = static_cast<double>(imageWidth) / width()->baseVal()->value();
+ double yScale = static_cast<double>(imageHeight) / height()->baseVal()->value();
+
+ baseMatrix->scaleNonUniform(xScale, yScale);
+
+ if(hasAttribute("viewBox"))
+ {
+ SVGMatrixImpl *viewboxMatrix = viewBoxToViewTransform(width()->baseVal()->value(), height()->baseVal()->value());
+
+ baseMatrix->multiply(viewboxMatrix);
+ viewboxMatrix->deref();
+ }
+ else
+ {
+ if(patternContentUnits()->baseVal() == SVGPatternElement::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
+ {
+ // Get local coordinate bounding box
+ SVGRectImpl *rect = referencingElement->getBBox();
+
+ baseMatrix->translate(rect->qrect().x(), rect->qrect().y());
+ baseMatrix->scaleNonUniform(rect->qrect().width(), rect->qrect().height());
+ rect->deref();
+ }
+ }
+
+ for(DOM::Node node = m_location->firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *element = ownerDoc()->getElementFromHandle(node.handle());
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(element);
+ SVGTestsImpl *tests = dynamic_cast<SVGTestsImpl *>(element);
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(element);
+
+ bool ok = tests ? tests->ok() : true;
+ if(element && shape && style && ok && style->getVisible() && style->getDisplay())
+ {
+ SVGLocatableImpl *locatable = dynamic_cast<SVGLocatableImpl *>(element);
+ if(locatable)
+ locatable->updateCachedScreenCTM(baseMatrix);
+
+ element->createItem(m_canvas);
+ if(shape->item())
+ {
+ shape->item()->setReferenced(true);
+ m_canvas->invalidate(shape->item(), true);
+ }
+ }
+ }
+
+ baseMatrix->deref();
+
+ m_canvas->update(float(1));
+
+ if(getOverflow())
+ {
+ QPtrList<CanvasItem> items = m_canvas->allItems();
+ QRect allItemsBBox;
+
+ QPtrListIterator<CanvasItem> it(items);
+ CanvasItem *item;
+
+ while((item = *it) != 0)
+ {
+ QRect bbox = item->bbox();
+ allItemsBBox |= bbox;
+ ++it;
+ }
+
+ if(allItemsBBox.left() < 0 || allItemsBBox.right() >= imageWidth || allItemsBBox.top() < 0 || allItemsBBox.bottom() >= imageHeight)
+ {
+ // Get the range in whole-tile units that covers the bounding box, where (0, 0) is the
+ // usual tile position.
+ int tileLeft = (allItemsBBox.left() - (imageWidth - 1)) / imageWidth;
+ int tileRight = allItemsBBox.right() / imageWidth;
+ int tileTop = (allItemsBBox.top() - (imageHeight - 1)) / imageHeight;
+ int tileBottom = allItemsBBox.bottom() / imageHeight;
+
+ for(int tileX = tileLeft; tileX <= tileRight; tileX++)
+ {
+ for(int tileY = tileTop; tileY <= tileBottom; tileY++)
+ {
+ if(tileX != 0 || tileY !=0)
+ {
+ QPoint panPoint(-(tileX * imageWidth), -(tileY * imageHeight));
+ m_canvas->update(panPoint, false);
+ }
+ }
+ }
+ }
+ }
+
+ for(DOM::Node node = m_location->firstChild(); !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *element = ownerDoc()->getElementFromHandle(node.handle());
+
+ if(element)
+ element->removeItem(m_canvas);
+ }
+
+ return image;
+}
+
+void SVGPatternElementImpl::reference(const QString &href)
+{
+ // Copy attributes
+ SVGElementImpl *src = ownerSVGElement()->getElementById(href);
+
+ if(src)
+ {
+ SVGHelperImpl::copyAttributes(src, this);
+
+ // Spec: Change location to referenced element so we
+ // can take the children elements to render from there
+ if(m_location == this)
+ m_location = src;
+ }
+}
+
+void SVGPatternElementImpl::finalizePaintServer()
+{
+ // Clear out any cached tiles since we may be being refinalised after an image
+ // inside a pattern has finished loading.
+ m_tileCache.clear();
+
+ QString _href = SVGURIReferenceImpl::getTarget(href()->baseVal().string());
+ if(!_href.isEmpty())
+ reference(_href);
+}
+
+SVGPatternElementImpl::Tile SVGPatternElementImpl::createTile(SVGShapeImpl *referencingElement)
+{
+ converter()->finalize(referencingElement, ownerSVGElement(), patternUnits()->baseVal());
+
+ SVGTransformableImpl *transformable = dynamic_cast<SVGTransformableImpl *>(referencingElement);
+ SVGMatrixImpl *matrix = 0;
+ if(transformable)
+ matrix = transformable->getScreenCTM();
+ else
+ matrix = SVGSVGElementImpl::createSVGMatrix();
+
+ matrix->translate(x()->baseVal()->value(), y()->baseVal()->value());
+
+ SVGMatrixImpl *patTransform = patternTransform()->baseVal()->concatenate();
+ if(patTransform)
+ {
+ matrix->multiply(patTransform);
+ patTransform->deref();
+ }
+
+ double xScale, yScale;
+ matrix->removeScale(&xScale, &yScale);
+
+ double tileWidth = width()->baseVal()->value() * xScale;
+ double tileHeight = height()->baseVal()->value() * yScale;
+
+ int imageWidth = static_cast<int>(tileWidth + 0.5);
+ int imageHeight = static_cast<int>(tileHeight + 0.5);
+
+ Tile tile;
+
+ if(imageWidth > 0 && imageHeight > 0)
+ {
+ QSize size(imageWidth, imageHeight);
+ QImage image;
+
+ if(!m_tileCache.find(size, image))
+ {
+ image = createTile(referencingElement, imageWidth, imageHeight);
+ m_tileCache.insert(size, image, image.width() * image.height() * 4);
+ }
+
+ // Map integral tile dimensions onto its true size
+ double adjustXScale = tileWidth / imageWidth;
+ double adjustYScale = tileHeight / imageHeight;
+
+ matrix->scaleNonUniform(adjustXScale, adjustYScale);
+ QWMatrix screenToTile = matrix->qmatrix().invert();
+
+ tile = Tile(image, screenToTile);
+ }
+
+ matrix->deref();
+
+ return tile;
+}
+
diff --git a/ksvg/impl/SVGPatternElementImpl.h b/ksvg/impl/SVGPatternElementImpl.h
new file mode 100644
index 00000000..612fcfae
--- /dev/null
+++ b/ksvg/impl/SVGPatternElementImpl.h
@@ -0,0 +1,136 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPatternElementImpl_H
+#define SVGPatternElementImpl_H
+
+#include <qimage.h>
+#include <qwmatrix.h>
+
+#include "SVGTestsImpl.h"
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGFitToViewBoxImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+#include "SVGPaintServerImpl.h"
+#include "LRUCache.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGUnitConverter;
+class SVGAnimatedLengthImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGAnimatedTransformListImpl;
+class SVGShapeImpl;
+class SVGPatternElementImpl : public SVGElementImpl,
+ public SVGURIReferenceImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGFitToViewBoxImpl,
+ public SVGPaintServerImpl
+{
+public:
+ SVGPatternElementImpl(DOM::ElementImpl *);
+ virtual ~SVGPatternElementImpl();
+
+ SVGAnimatedEnumerationImpl *patternUnits() const;
+ SVGAnimatedEnumerationImpl *patternContentUnits() const;
+ SVGAnimatedTransformListImpl *patternTransform() const;
+ SVGAnimatedLengthImpl *x() const;
+ SVGAnimatedLengthImpl *y() const;
+ SVGAnimatedLengthImpl *width() const;
+ SVGAnimatedLengthImpl *height() const;
+
+ virtual void setAttributes();
+
+ virtual void createItem(KSVGCanvas *c = 0);
+ virtual void removeItem(KSVGCanvas *c);
+
+ SVGUnitConverter *converter() const { return m_converter; }
+
+ void reference(const QString &href);
+ void finalizePaintServer();
+
+ class Tile
+ {
+ public:
+ Tile() {}
+ Tile(const QImage& image, const QWMatrix& screenToTile) : m_image(image), m_screenToTile(screenToTile) {}
+
+ QImage image() const { return m_image; }
+ const QWMatrix& screenToTile() const { return m_screenToTile; }
+
+ private:
+ QImage m_image;
+ QWMatrix m_screenToTile;
+ };
+
+ Tile createTile(SVGShapeImpl *referencingElement);
+
+ static void flushCachedTiles();
+
+private:
+ QImage createTile(SVGShapeImpl *referencingElement, int imageWidth, int imageHeight);
+
+ SVGAnimatedEnumerationImpl *m_patternUnits;
+ SVGAnimatedEnumerationImpl *m_patternContentUnits;
+ SVGAnimatedTransformListImpl *m_patternTransform;
+ SVGAnimatedLengthImpl *m_x;
+ SVGAnimatedLengthImpl *m_y;
+ SVGAnimatedLengthImpl *m_width;
+ SVGAnimatedLengthImpl *m_height;
+
+ SVGUnitConverter *m_converter;
+
+ KSVGCanvas *m_canvas;
+ SVGElementImpl *m_location; // the referenced element
+ MinOneLRUCache<QSize, QImage> m_tileCache;
+
+ static QValueList<SVGPatternElementImpl *> m_patternElements;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ X, Y, Width, Height, PatternUnits, PatternContentUnits, PatternTransform
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGPatternElementImpl, "pattern")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPointImpl.cc b/ksvg/impl/SVGPointImpl.cc
new file mode 100644
index 00000000..c3697f58
--- /dev/null
+++ b/ksvg/impl/SVGPointImpl.cc
@@ -0,0 +1,108 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPointImpl.h"
+#include "SVGSVGElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPointImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGPointImpl::SVGPointImpl() : DOM::DomShared()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x = 0;
+ m_y = 0;
+}
+
+SVGPointImpl::~SVGPointImpl()
+{
+}
+
+void SVGPointImpl::setX(float x)
+{
+ m_x = x;
+}
+
+float SVGPointImpl::x() const
+{
+ return m_x;
+}
+
+void SVGPointImpl::setY(float y)
+{
+ m_y = y;
+}
+
+float SVGPointImpl::y() const
+{
+ return m_y;
+}
+
+SVGPointImpl *SVGPointImpl::matrixTransform(const SVGMatrixImpl &)
+{
+ SVGPointImpl *ret = SVGSVGElementImpl::createSVGPoint();
+ return ret;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPointImpl::s_hashTable 3
+ x SVGPointImpl::X DontDelete
+ y SVGPointImpl::Y DontDelete
+@end
+*/
+
+Value SVGPointImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(x());
+ case Y:
+ return Number(y());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGPointImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPointImpl.h b/ksvg/impl/SVGPointImpl.h
new file mode 100644
index 00000000..55132cf3
--- /dev/null
+++ b/ksvg/impl/SVGPointImpl.h
@@ -0,0 +1,66 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPointImpl_H
+#define SVGPointImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGMatrixImpl;
+class SVGPointImpl : public DOM::DomShared
+{
+public:
+ SVGPointImpl();
+ virtual ~SVGPointImpl();
+
+ void setX(float x);
+ float x() const;
+
+ void setY(float y);
+ float y() const;
+
+ SVGPointImpl *matrixTransform(const SVGMatrixImpl &matrix);
+
+private:
+ float m_x;
+ float m_y;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
diff --git a/ksvg/impl/SVGPointListImpl.cc b/ksvg/impl/SVGPointListImpl.cc
new file mode 100644
index 00000000..34574b60
--- /dev/null
+++ b/ksvg/impl/SVGPointListImpl.cc
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPointListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPointListImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPointListImpl::s_hashTable 2
+ numberOfItems SVGListDefs::NumberOfItems DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGPointListImplProto::s_hashTable 11
+ getItem SVGListDefs::GetItem DontDelete|Function 1
+ removeItem SVGListDefs::RemoveItem DontDelete|Function 1
+ appendItem SVGListDefs::AppendItem DontDelete|Function 1
+ initialize SVGListDefs::Initialize DontDelete|Function 1
+ insertItemBefore SVGListDefs::InsertItemBefore DontDelete|Function 2
+ replaceItem SVGListDefs::ReplaceItem DontDelete|Function 2
+ clear SVGListDefs::Clear DontDelete|Function 0
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGPointList", SVGPointListImplProto, SVGPointListImplProtoFunc)
+
+Value SVGPointListImpl::getValueProperty(ExecState *exec, int token) const
+{
+ return SVGList<SVGPointImpl>::getValueProperty(exec, token);
+}
+
+Value SVGPointListImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGPointListImpl)
+
+ return obj->call(exec, static_cast<SVGList<SVGPointImpl> *>(obj), args, id);
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPointListImpl.h b/ksvg/impl/SVGPointListImpl.h
new file mode 100644
index 00000000..61d93731
--- /dev/null
+++ b/ksvg/impl/SVGPointListImpl.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPointListImpl_H
+#define SVGPointListImpl_H
+
+#include "SVGList.h"
+
+#include "SVGPointImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGPointListImpl : public SVGList<SVGPointImpl>
+{
+public:
+ KSVG_GET
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGPointListImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGPointListImplProtoFunc, SVGPointListImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPolyElementImpl.cc b/ksvg/impl/SVGPolyElementImpl.cc
new file mode 100644
index 00000000..69ef57cd
--- /dev/null
+++ b/ksvg/impl/SVGPolyElementImpl.cc
@@ -0,0 +1,141 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <math.h>
+#include <cfloat>
+
+#include <kdebug.h>
+
+#include "SVGRectImpl.h"
+#include "SVGPointListImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGPolyElementImpl.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+SVGPolyElementImpl::SVGPolyElementImpl(DOM::ElementImpl *impl) : SVGShapeImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl(), SVGAnimatedPointsImpl()
+{
+}
+
+SVGPolyElementImpl::~SVGPolyElementImpl()
+{
+}
+
+SVGRectImpl *SVGPolyElementImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+
+ unsigned int nrPoints = points()->numberOfItems();
+ float minx, miny, maxx, maxy, tempx, tempy;
+ minx = points()->getItem(0)->x();
+ miny = points()->getItem(0)->y();
+ maxx = points()->getItem(0)->x();
+ maxy = points()->getItem(0)->y();
+
+ for(unsigned int i = 1; i < nrPoints; ++i)
+ {
+ tempx = points()->getItem(i)->x();
+ tempy = points()->getItem(i)->y();
+
+ if(tempx < minx)
+ minx = tempx;
+ if(tempx > maxx)
+ maxx = tempx;
+ if(tempy < miny)
+ miny = tempy;
+ if(tempy > maxy)
+ maxy = tempy;
+ }
+
+ ret->setX(minx);
+ ret->setY(miny);
+ ret->setWidth(maxx - minx);
+ ret->setHeight(maxy - miny);
+ return ret;
+}
+
+bool SVGPolyElementImpl::findOutSlope(unsigned int point, double *outSlope) const
+{
+ unsigned int nextPoint;
+
+ if(point == points()->numberOfItems() - 1)
+ {
+ if(m_isOpenPath)
+ return false;
+ else
+ nextPoint = 0;
+ }
+ else
+ nextPoint = point + 1;
+
+ if(point == nextPoint)
+ return false;
+
+ double x = points()->getItem(point)->x();
+ double y = points()->getItem(point)->y();
+ double nextX = points()->getItem(nextPoint)->x();
+ double nextY = points()->getItem(nextPoint)->y();
+ const double epsilon = DBL_EPSILON;
+
+ if(fabs(x - nextX) < epsilon && fabs(y - nextY) < epsilon)
+ return findOutSlope(nextPoint, outSlope);
+ else
+ {
+ double slope = SVGAngleImpl::todeg(atan2(nextY - y, nextX - x));
+ *outSlope = slope;
+ return true;
+ }
+}
+
+bool SVGPolyElementImpl::findInSlope(unsigned int point, double *inSlope) const
+{
+ unsigned int prevPoint;
+
+ if(point == 0)
+ {
+ if(m_isOpenPath)
+ return false;
+ else
+ prevPoint = points()->numberOfItems() - 1;
+ }
+ else
+ prevPoint = point - 1;
+
+ if(point == prevPoint)
+ return false;
+
+ double x = points()->getItem(point)->x();
+ double y = points()->getItem(point)->y();
+ double prevX = points()->getItem(prevPoint)->x();
+ double prevY = points()->getItem(prevPoint)->y();
+ const double epsilon = DBL_EPSILON;
+
+ if(fabs(x - prevX) < epsilon && fabs(y - prevY) < epsilon)
+ return findInSlope(prevPoint, inSlope);
+ else
+ {
+ double slope = SVGAngleImpl::todeg(atan2(y - prevY, x - prevX));
+ *inSlope = slope;
+ return true;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPolyElementImpl.h b/ksvg/impl/SVGPolyElementImpl.h
new file mode 100644
index 00000000..ded41d0c
--- /dev/null
+++ b/ksvg/impl/SVGPolyElementImpl.h
@@ -0,0 +1,70 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPolyElementImpl_H
+#define SVGPolyElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGShapeImpl.h"
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGAnimatedPointsImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGPointListImpl;
+class SVGPolyElementImpl : public SVGShapeImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl,
+ public SVGAnimatedPointsImpl
+{
+public:
+ SVGPolyElementImpl(DOM::ElementImpl *);
+ virtual ~SVGPolyElementImpl();
+
+ virtual SVGRectImpl *getBBox();
+
+ virtual void drawMarkers() = 0;
+
+protected:
+ bool findOutSlope(unsigned int point, double *outSlope) const;
+ bool findInSlope(unsigned int point, double *inSlope) const;
+
+ bool m_isOpenPath;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+ KSVG_NO_TAG_BRIDGE
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPolygonElementImpl.cc b/ksvg/impl/SVGPolygonElementImpl.cc
new file mode 100644
index 00000000..bf38ff37
--- /dev/null
+++ b/ksvg/impl/SVGPolygonElementImpl.cc
@@ -0,0 +1,88 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGPointListImpl.h"
+#include "SVGPolygonElementImpl.h"
+#include "SVGDocumentImpl.h"
+#include "KSVGCanvas.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+SVGPolygonElementImpl::SVGPolygonElementImpl(DOM::ElementImpl *impl) : SVGPolyElementImpl(impl)
+{
+ m_isOpenPath = false;
+}
+
+void SVGPolygonElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_item)
+ {
+ m_item = c->createPolygon(this);
+ c->insert(m_item);
+ }
+}
+
+void SVGPolygonElementImpl::drawMarkers()
+{
+ SVGPointListImpl *pts = points();
+ unsigned int nrPoints = pts->numberOfItems();
+
+ if(nrPoints > 0 && hasMarkers())
+ {
+ for(unsigned int i = 0; i < nrPoints; ++i)
+ {
+ double inSlope;
+ double outSlope;
+ bool haveInSlope = findInSlope(i, &inSlope);
+ bool haveOutSlope = findOutSlope(i, &outSlope);
+
+ if(!haveInSlope && haveOutSlope)
+ inSlope = outSlope;
+ else if(haveInSlope && !haveOutSlope)
+ outSlope = inSlope;
+ else if(!haveInSlope && !haveOutSlope)
+ {
+ inSlope = 0;
+ outSlope = 0;
+ }
+
+ double bisector = SVGAngleImpl::shortestArcBisector(inSlope, outSlope);
+
+ if(i == 0)
+ {
+ if(hasStartMarker())
+ doStartMarker(this, this, pts->getItem(i)->x(), pts->getItem(i)->y(), bisector);
+ if(hasEndMarker())
+ doEndMarker(this, this, pts->getItem(i)->x(), pts->getItem(i)->y(), bisector);
+ }
+ else
+ {
+ if(hasMidMarker())
+ doMidMarker(this, this, pts->getItem(i)->x(), pts->getItem(i)->y(), bisector);
+ }
+ }
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPolygonElementImpl.h b/ksvg/impl/SVGPolygonElementImpl.h
new file mode 100644
index 00000000..1c7e8c3b
--- /dev/null
+++ b/ksvg/impl/SVGPolygonElementImpl.h
@@ -0,0 +1,54 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPolygonElementImpl_H
+#define SVGPolygonElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPolyElementImpl.h"
+#include "CanvasItems.h"
+
+namespace KSVG
+{
+
+class SVGPolygonElementImpl : public SVGPolyElementImpl, public MarkerHelper
+{
+public:
+ SVGPolygonElementImpl(DOM::ElementImpl *);
+ virtual ~SVGPolygonElementImpl() { }
+
+ virtual void createItem(KSVGCanvas *c = 0);
+
+ virtual void drawMarkers();
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGPolygonElementImpl, "polygon")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPolylineElementImpl.cc b/ksvg/impl/SVGPolylineElementImpl.cc
new file mode 100644
index 00000000..9c95a928
--- /dev/null
+++ b/ksvg/impl/SVGPolylineElementImpl.cc
@@ -0,0 +1,100 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGPointListImpl.h"
+#include "SVGPolylineElementImpl.h"
+#include "SVGDocumentImpl.h"
+#include "KSVGCanvas.h"
+#include "SVGAngleImpl.h"
+
+using namespace KSVG;
+
+SVGPolylineElementImpl::SVGPolylineElementImpl(DOM::ElementImpl *impl) : SVGPolyElementImpl(impl)
+{
+ m_isOpenPath = true;
+}
+
+void SVGPolylineElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_item)
+ {
+ m_item = c->createPolyline(this);
+ c->insert(m_item);
+ }
+}
+
+void SVGPolylineElementImpl::drawMarkers()
+{
+ SVGPointListImpl *pts = points();
+ unsigned int nrPoints = pts->numberOfItems();
+
+ if(nrPoints > 0 && hasMarkers())
+ {
+ if(hasStartMarker())
+ {
+ double outSlope;
+
+ if(!findOutSlope(0, &outSlope))
+ outSlope = 0;
+
+ doStartMarker(this, this, pts->getItem(0)->x(), pts->getItem(0)->y(), outSlope);
+ }
+
+ if(hasMidMarker())
+ {
+ for(unsigned int i = 1; i < nrPoints - 1; ++i)
+ {
+ double inSlope;
+ double outSlope;
+ bool haveInSlope = findInSlope(i, &inSlope);
+ bool haveOutSlope = findOutSlope(i, &outSlope);
+
+ if(!haveInSlope && haveOutSlope)
+ inSlope = outSlope;
+ else if(haveInSlope && !haveOutSlope)
+ outSlope = inSlope;
+ else if(!haveInSlope && !haveOutSlope)
+ {
+ inSlope = 0;
+ outSlope = 0;
+ }
+
+ double bisector = SVGAngleImpl::shortestArcBisector(inSlope, outSlope);
+
+ doMidMarker(this, this, pts->getItem(i)->x(), pts->getItem(i)->y(), bisector);
+ }
+ }
+
+ if(hasEndMarker())
+ {
+ double inSlope;
+
+ if(!findInSlope(nrPoints - 1, &inSlope))
+ inSlope = 0;
+
+ doEndMarker(this, this, pts->getItem(nrPoints - 1)->x(), pts->getItem(nrPoints - 1)->y(), inSlope);
+ }
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPolylineElementImpl.h b/ksvg/impl/SVGPolylineElementImpl.h
new file mode 100644
index 00000000..c6ea5885
--- /dev/null
+++ b/ksvg/impl/SVGPolylineElementImpl.h
@@ -0,0 +1,54 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPolylineElementImpl_H
+#define SVGPolylineElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGPolyElementImpl.h"
+#include "CanvasItems.h"
+
+namespace KSVG
+{
+
+class SVGPolylineElementImpl : public SVGPolyElementImpl, public MarkerHelper
+{
+public:
+ SVGPolylineElementImpl(DOM::ElementImpl *);
+ virtual ~SVGPolylineElementImpl() { }
+
+ virtual void createItem(KSVGCanvas *c = 0);
+
+ virtual void drawMarkers();
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGPolylineElementImpl, "polyline")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPreserveAspectRatioImpl.cc b/ksvg/impl/SVGPreserveAspectRatioImpl.cc
new file mode 100644
index 00000000..c8660e61
--- /dev/null
+++ b/ksvg/impl/SVGPreserveAspectRatioImpl.cc
@@ -0,0 +1,217 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include "SVGPreserveAspectRatio.h"
+
+#include "SVGMatrixImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGPreserveAspectRatioImpl.h"
+
+using namespace KSVG;
+
+#include "SVGPreserveAspectRatioImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_cacheimpl.h"
+
+SVGPreserveAspectRatioImpl::SVGPreserveAspectRatioImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_meetOrSlice = SVG_MEETORSLICE_UNKNOWN;
+ m_align = SVG_PRESERVEASPECTRATIO_UNKNOWN;
+}
+
+SVGPreserveAspectRatioImpl::~SVGPreserveAspectRatioImpl()
+{
+}
+
+void SVGPreserveAspectRatioImpl::setAlign(unsigned short align)
+{
+ m_align = align;
+}
+
+unsigned short SVGPreserveAspectRatioImpl::align() const
+{
+ return m_align;
+}
+
+void SVGPreserveAspectRatioImpl::setMeetOrSlice(unsigned short meetOrSlice)
+{
+ m_meetOrSlice = meetOrSlice;
+}
+
+unsigned short SVGPreserveAspectRatioImpl::meetOrSlice() const
+{
+ return m_meetOrSlice;
+}
+
+void SVGPreserveAspectRatioImpl::parsePreserveAspectRatio(const QString &str)
+{
+ // Spec: set the defaults
+ setAlign(SVG_PRESERVEASPECTRATIO_NONE);
+ setMeetOrSlice(SVG_MEETORSLICE_MEET);
+
+ QStringList params = QStringList::split(' ', str.simplifyWhiteSpace());
+
+ if(params[0].compare("none") == 0)
+ m_align = SVG_PRESERVEASPECTRATIO_NONE;
+ else if(params[0].compare("xMinYMin") == 0)
+ m_align = SVG_PRESERVEASPECTRATIO_XMINYMIN;
+ else if(params[0].compare("xMidYMin") == 0)
+ m_align = SVG_PRESERVEASPECTRATIO_XMIDYMIN;
+ else if(params[0].compare("xMaxYMin") == 0)
+ m_align = SVG_PRESERVEASPECTRATIO_XMAXYMIN;
+ else if(params[0].compare("xMinYMid") == 0)
+ m_align = SVG_PRESERVEASPECTRATIO_XMINYMID;
+ else if(params[0].compare("xMidYMid") == 0)
+ m_align = SVG_PRESERVEASPECTRATIO_XMIDYMID;
+ else if(params[0].compare("xMaxYMid") == 0)
+ m_align = SVG_PRESERVEASPECTRATIO_XMAXYMID;
+ else if(params[0].compare("xMinYMax") == 0)
+ m_align = SVG_PRESERVEASPECTRATIO_XMINYMAX;
+ else if(params[0].compare("xMidYMax") == 0)
+ m_align = SVG_PRESERVEASPECTRATIO_XMIDYMAX;
+ else if(params[0].compare("xMaxYMax") == 0)
+ m_align = SVG_PRESERVEASPECTRATIO_XMAXYMAX;
+
+ if(params[1].compare("slice") == 0)
+ m_meetOrSlice = SVG_MEETORSLICE_SLICE;
+ else
+ m_meetOrSlice = SVG_MEETORSLICE_MEET;
+}
+
+SVGMatrixImpl *SVGPreserveAspectRatioImpl::getCTM(float logicX, float logicY, float logicWidth, float logicHeight,
+ float /*physX*/, float /*physY*/, float physWidth, float physHeight)
+{
+ SVGMatrixImpl *temp = SVGSVGElementImpl::createSVGMatrix();
+
+ if(align() == SVG_PRESERVEASPECTRATIO_UNKNOWN)
+ return temp;
+
+ float vpar = logicWidth / logicHeight;
+ float svgar = physWidth / physHeight;
+
+ if(align() == SVG_PRESERVEASPECTRATIO_NONE)
+ {
+ temp->scaleNonUniform(physWidth / logicWidth, physHeight / logicHeight);
+ temp->translate(-logicX, -logicY);
+ }
+ else if(vpar < svgar && (meetOrSlice() == SVG_MEETORSLICE_MEET) || vpar >= svgar && (meetOrSlice() == SVG_MEETORSLICE_SLICE))
+ {
+ temp->scale(physHeight / logicHeight);
+
+ if(align() == SVG_PRESERVEASPECTRATIO_XMINYMIN || align() == SVG_PRESERVEASPECTRATIO_XMINYMID || align() == SVG_PRESERVEASPECTRATIO_XMINYMAX)
+ temp->translate(-logicX, -logicY);
+ else if(align() == SVG_PRESERVEASPECTRATIO_XMIDYMIN || align() == SVG_PRESERVEASPECTRATIO_XMIDYMID || align() == SVG_PRESERVEASPECTRATIO_XMIDYMAX)
+ temp->translate(-logicX - (logicWidth - physWidth * logicHeight / physHeight) / 2, -logicY);
+ else
+ temp->translate(-logicX - (logicWidth - physWidth * logicHeight / physHeight), -logicY);
+ }
+ else
+ {
+ temp->scale(physWidth / logicWidth);
+
+ if(align() == SVG_PRESERVEASPECTRATIO_XMINYMIN || align() == SVG_PRESERVEASPECTRATIO_XMIDYMIN || align() == SVG_PRESERVEASPECTRATIO_XMAXYMIN)
+ temp->translate(-logicX, -logicY);
+ else if(align() == SVG_PRESERVEASPECTRATIO_XMINYMID || align() == SVG_PRESERVEASPECTRATIO_XMIDYMID || align() == SVG_PRESERVEASPECTRATIO_XMAXYMID)
+ temp->translate(-logicX, -logicY - (logicHeight - physHeight * logicWidth / physWidth) / 2);
+ else
+ temp->translate(-logicX, -logicY - (logicHeight - physHeight * logicWidth / physWidth));
+ }
+
+ return temp;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGPreserveAspectRatioImpl::s_hashTable 3
+ align SVGPreserveAspectRatioImpl::Align DontDelete
+ meetOrSlice SVGPreserveAspectRatioImpl::MeetOrSlice DontDelete
+@end
+*/
+
+Value SVGPreserveAspectRatioImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case Align:
+ return Number(align());
+ case MeetOrSlice:
+ return Number(meetOrSlice());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return KJS::Undefined();
+ }
+}
+
+void SVGPreserveAspectRatioImpl::putValueProperty(ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case Align:
+ m_align = static_cast<unsigned short>(value.toNumber(exec));
+ break;
+ case MeetOrSlice:
+ m_meetOrSlice = static_cast<unsigned short>(value.toNumber(exec));
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+/*
+@namespace KSVG
+@begin SVGPreserveAspectRatioImplConstructor::s_hashTable 17
+ SVG_PRESERVEASPECTRATIO_UNKNOWN KSVG::SVG_PRESERVEASPECTRATIO_UNKNOWN DontDelete|ReadOnly
+ SVG_PRESERVEASPECTRATIO_NONE KSVG::SVG_PRESERVEASPECTRATIO_NONE DontDelete|ReadOnly
+ SVG_PRESERVEASPECTRATIO_XMINYMIN KSVG::SVG_PRESERVEASPECTRATIO_XMINYMIN DontDelete|ReadOnly
+ SVG_PRESERVEASPECTRATIO_XMIDYMIN KSVG::SVG_PRESERVEASPECTRATIO_XMIDYMIN DontDelete|ReadOnly
+ SVG_PRESERVEASPECTRATIO_XMAXYMIN KSVG::SVG_PRESERVEASPECTRATIO_XMAXYMIN DontDelete|ReadOnly
+ SVG_PRESERVEASPECTRATIO_XMINYMID KSVG::SVG_PRESERVEASPECTRATIO_XMINYMID DontDelete|ReadOnly
+ SVG_PRESERVEASPECTRATIO_XMIDYMID KSVG::SVG_PRESERVEASPECTRATIO_XMIDYMID DontDelete|ReadOnly
+ SVG_PRESERVEASPECTRATIO_XMAXYMID KSVG::SVG_PRESERVEASPECTRATIO_XMAXYMID DontDelete|ReadOnly
+ SVG_PRESERVEASPECTRATIO_XMINYMAX KSVG::SVG_PRESERVEASPECTRATIO_XMINYMAX DontDelete|ReadOnly
+ SVG_PRESERVEASPECTRATIO_XMIDYMAX KSVG::SVG_PRESERVEASPECTRATIO_XMIDYMAX DontDelete|ReadOnly
+ SVG_PRESERVEASPECTRATIO_XMAXYMAX KSVG::SVG_PRESERVEASPECTRATIO_XMAXYMAX DontDelete|ReadOnly
+ SVG_MEETORSLICE_UNKNOWN KSVG::SVG_MEETORSLICE_UNKNOWN DontDelete|ReadOnly
+ SVG_MEETORSLICE_MEET KSVG::SVG_MEETORSLICE_MEET DontDelete|ReadOnly
+ SVG_MEETORSLICE_SLICE KSVG::SVG_MEETORSLICE_SLICE DontDelete|ReadOnly
+@end
+*/
+
+Value SVGPreserveAspectRatioImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token > SVG_PRESERVEASPECTRATIO_XMAXYMAX ? token - SVG_MEETORSLICE_UNKNOWN : token);
+}
+
+Value KSVG::getSVGPreserveAspectRatioImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGPreserveAspectRatioImplConstructor>(exec, "[[svgpreserveaspectratio.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGPreserveAspectRatioImpl.h b/ksvg/impl/SVGPreserveAspectRatioImpl.h
new file mode 100644
index 00000000..4a14a6b0
--- /dev/null
+++ b/ksvg/impl/SVGPreserveAspectRatioImpl.h
@@ -0,0 +1,84 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGPreserveAspectRatioImpl_H
+#define SVGPreserveAspectRatioImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+class QString;
+
+namespace KSVG
+{
+
+class SVGMatrixImpl;
+class SVGPreserveAspectRatioImpl : public DOM::DomShared
+{
+public:
+ SVGPreserveAspectRatioImpl();
+ virtual ~SVGPreserveAspectRatioImpl();
+
+ void setAlign(unsigned short);
+ unsigned short align() const;
+
+ void setMeetOrSlice(unsigned short);
+ unsigned short meetOrSlice() const;
+
+ void parsePreserveAspectRatio(const QString &);
+ SVGMatrixImpl *getCTM(float logicX, float logicY, float logicWidth, float logicHeight,
+ float physX, float physY, float physWidth, float physHeight);
+
+protected:
+ unsigned short m_align;
+ unsigned short m_meetOrSlice;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ Align, MeetOrSlice
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGPreserveAspectRatioImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGPreserveAspectRatioImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGPreserveAspectRatioImplConstructor(KJS::ExecState *exec);
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGRadialGradientElementImpl.cc b/ksvg/impl/SVGRadialGradientElementImpl.cc
new file mode 100644
index 00000000..8d00cf15
--- /dev/null
+++ b/ksvg/impl/SVGRadialGradientElementImpl.cc
@@ -0,0 +1,216 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGGradientElement.h"
+#include "SVGRadialGradientElementImpl.h"
+
+#include "SVGDocumentImpl.h"
+#include "KSVGCanvas.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGUnitConverter.h"
+
+using namespace KSVG;
+
+#include "SVGRadialGradientElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGRadialGradientElementImpl::SVGRadialGradientElementImpl(DOM::ElementImpl *impl) : SVGGradientElementImpl(impl)
+{
+ KSVG_EMPTY_FLAGS
+
+ m_cx = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_cx->ref();
+
+ m_cy = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_cy->ref();
+
+ m_r = new SVGAnimatedLengthImpl(LENGTHMODE_OTHER, this);
+ m_r->ref();
+
+ m_fx = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_fx->ref();
+
+ m_fy = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_fy->ref();
+
+ converter()->add(m_cx);
+ converter()->add(m_cy);
+ converter()->add(m_r);
+ converter()->add(m_fx);
+ converter()->add(m_fy);
+}
+
+SVGRadialGradientElementImpl::~SVGRadialGradientElementImpl()
+{
+ if(m_cx)
+ m_cx->deref();
+ if(m_cy)
+ m_cy->deref();
+ if(m_r)
+ m_r->deref();
+ if(m_fx)
+ m_fx->deref();
+ if(m_fy)
+ m_fy->deref();
+}
+
+SVGAnimatedLengthImpl *SVGRadialGradientElementImpl::cx() const
+{
+ return m_cx;
+}
+
+SVGAnimatedLengthImpl *SVGRadialGradientElementImpl::cy() const
+{
+ return m_cy;
+}
+
+SVGAnimatedLengthImpl *SVGRadialGradientElementImpl::r() const
+{
+ return m_r;
+}
+
+SVGAnimatedLengthImpl *SVGRadialGradientElementImpl::fx() const
+{
+ return m_fx;
+}
+
+SVGAnimatedLengthImpl *SVGRadialGradientElementImpl::fy() const
+{
+ return m_fy;
+}
+
+/*
+@namespace KSVG
+@begin SVGRadialGradientElementImpl::s_hashTable 7
+ cx SVGRadialGradientElementImpl::Cx DontDelete|ReadOnly
+ cy SVGRadialGradientElementImpl::Cy DontDelete|ReadOnly
+ r SVGRadialGradientElementImpl::R DontDelete|ReadOnly
+ fx SVGRadialGradientElementImpl::Fx DontDelete|ReadOnly
+ fy SVGRadialGradientElementImpl::Fy DontDelete|ReadOnly
+@end
+*/
+
+Value SVGRadialGradientElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case Cx:
+ if(!attributeMode)
+ return m_cx->cache(exec);
+ else
+ return Number(m_cx->baseVal()->value());
+ case Cy:
+ if(!attributeMode)
+ return m_cy->cache(exec);
+ else
+ return Number(m_cy->baseVal()->value());
+ case R:
+ if(!attributeMode)
+ return m_r->cache(exec);
+ else
+ return Number(m_r->baseVal()->value());
+ case Fx:
+ if(!attributeMode)
+ return m_fx->cache(exec);
+ else
+ return Number(m_fx->baseVal()->value());
+ case Fy:
+ if(!attributeMode)
+ return m_fy->cache(exec);
+ else
+ return Number(m_fy->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGRadialGradientElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case Cx:
+ converter()->modify(cx(), value.toString(exec).qstring());
+ break;
+ case Cy:
+ converter()->modify(cy(), value.toString(exec).qstring());
+ break;
+ case R:
+ converter()->modify(r(), value.toString(exec).qstring());
+ break;
+ case Fx:
+ converter()->modify(fx(), value.toString(exec).qstring());
+ break;
+ case Fy:
+ converter()->modify(fy(), value.toString(exec).qstring());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+void SVGRadialGradientElementImpl::setAttributes()
+{
+ SVGGradientElementImpl::setAttributes();
+
+ // Spec: no attribute, effect is af value 50% is specified
+ if(KSVG_TOKEN_NOT_PARSED(Cx))
+ KSVG_SET_ALT_ATTRIBUTE(Cx, "50%")
+
+ // Spec: no attribute, effect is af value 50% is specified
+ if(KSVG_TOKEN_NOT_PARSED(Cy))
+ KSVG_SET_ALT_ATTRIBUTE(Cy, "50%")
+
+ // Spec: no attribute, effect is af value 50% is specified
+ if(KSVG_TOKEN_NOT_PARSED(R))
+ KSVG_SET_ALT_ATTRIBUTE(R, "50%")
+}
+
+QMap<QString, DOM::DOMString> SVGRadialGradientElementImpl::gradientAttributes()
+{
+ setAttributes();
+
+ QMap<QString, DOM::DOMString> gradAttributes;
+ QDictIterator<DOM::DOMString> it(attributes());
+
+ for(; it.current(); ++it)
+ {
+ DOM::DOMString name = it.currentKey();
+ DOM::DOMString value = it.current()->string();
+
+ if(name == "gradientUnits" || name == "gradientTransform" || name == "spreadMethod" || name == "cx" || name == "cy" || name == "r" || name == "fx" || name == "fy")
+ {
+ gradAttributes.insert(name.string(), value.copy());
+ }
+ }
+
+ return gradAttributes;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGRadialGradientElementImpl.h b/ksvg/impl/SVGRadialGradientElementImpl.h
new file mode 100644
index 00000000..2f6c58c1
--- /dev/null
+++ b/ksvg/impl/SVGRadialGradientElementImpl.h
@@ -0,0 +1,76 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGRadialGradientElementImpl_H
+#define SVGRadialGradientElementImpl_H
+
+#include "SVGGradientElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedLengthImpl;
+class SVGRadialGradientElementImpl : public SVGGradientElementImpl
+{
+public:
+ SVGRadialGradientElementImpl(DOM::ElementImpl *);
+ virtual ~SVGRadialGradientElementImpl();
+
+ SVGAnimatedLengthImpl *cx() const;
+ SVGAnimatedLengthImpl *cy() const;
+ SVGAnimatedLengthImpl *r() const;
+ SVGAnimatedLengthImpl *fx() const;
+ SVGAnimatedLengthImpl *fy() const;
+
+ virtual void setAttributes();
+
+ virtual QMap<QString, DOM::DOMString> gradientAttributes();
+
+private:
+ SVGAnimatedLengthImpl *m_cx;
+ SVGAnimatedLengthImpl *m_cy;
+ SVGAnimatedLengthImpl *m_r;
+ SVGAnimatedLengthImpl *m_fx;
+ SVGAnimatedLengthImpl *m_fy;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ Cx, Cy, R, Fx, Fy, Href
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGRadialGradientElementImpl, "radialGradient")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGRectElementImpl.cc b/ksvg/impl/SVGRectElementImpl.cc
new file mode 100644
index 00000000..3dad7cbf
--- /dev/null
+++ b/ksvg/impl/SVGRectElementImpl.cc
@@ -0,0 +1,244 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "SVGRectImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGRectElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+
+#include "KSVGCanvas.h"
+#include "CanvasItem.h"
+
+using namespace KSVG;
+
+#include "SVGRectElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGRectElementImpl::SVGRectElementImpl(DOM::ElementImpl *impl) : SVGShapeImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_x->ref();
+ m_x->baseVal()->setValueAsString("-1");
+
+ m_y = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_y->ref();
+ m_y->baseVal()->setValueAsString("-1");
+
+ m_width = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_width->ref();
+ m_width->baseVal()->setValueAsString("-1");
+
+ m_height = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_height->ref();
+ m_height->baseVal()->setValueAsString("-1");
+
+ m_rx = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_rx->ref();
+ m_rx->baseVal()->setValueAsString("-1");
+
+ m_ry = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_ry->ref();
+ m_ry->baseVal()->setValueAsString("-1");
+}
+
+SVGRectElementImpl::~SVGRectElementImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_width)
+ m_width->deref();
+ if(m_height)
+ m_height->deref();
+ if(m_rx)
+ m_rx->deref();
+ if(m_ry)
+ m_ry->deref();
+}
+
+SVGAnimatedLengthImpl *SVGRectElementImpl::x()
+{
+ return m_x;
+}
+
+SVGAnimatedLengthImpl *SVGRectElementImpl::y()
+{
+ return m_y;
+}
+
+SVGAnimatedLengthImpl *SVGRectElementImpl::width()
+{
+ return m_width;
+}
+
+SVGAnimatedLengthImpl *SVGRectElementImpl::height()
+{
+ return m_height;
+}
+
+SVGAnimatedLengthImpl *SVGRectElementImpl::rx()
+{
+ return m_rx;
+}
+
+SVGAnimatedLengthImpl *SVGRectElementImpl::ry()
+{
+ return m_ry;
+}
+
+/*
+@namespace KSVG
+@begin SVGRectElementImpl::s_hashTable 7
+ x SVGRectElementImpl::X DontDelete|ReadOnly
+ y SVGRectElementImpl::Y DontDelete|ReadOnly
+ width SVGRectElementImpl::Width DontDelete|ReadOnly
+ height SVGRectElementImpl::Height DontDelete|ReadOnly
+ rx SVGRectElementImpl::Rx DontDelete|ReadOnly
+ ry SVGRectElementImpl::Ry DontDelete|ReadOnly
+@end
+*/
+
+Value SVGRectElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case X:
+ if(!attributeMode)
+ return m_x->cache(exec);
+ else
+ return Number(m_x->baseVal()->value());
+ case Y:
+ if(!attributeMode)
+ return m_y->cache(exec);
+ else
+ return Number(m_y->baseVal()->value());
+ case Width:
+ if(!attributeMode)
+ return m_width->cache(exec);
+ else
+ return Number(m_width->baseVal()->value());
+ case Height:
+ if(!attributeMode)
+ return m_height->cache(exec);
+ else
+ return Number(m_height->baseVal()->value());
+ case Rx:
+ if(!attributeMode)
+ return m_rx->cache(exec);
+ else
+ return Number(m_rx->baseVal()->value());
+ case Ry:
+ if(!attributeMode)
+ return m_ry->cache(exec);
+ else
+ return Number(m_ry->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGRectElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case X:
+ x()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Y:
+ y()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Width:
+ width()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ if(width()->baseVal()->value() < 0) // A negative value is an error
+ gotError(i18n("Negative value for attribute width of element <rect> is illegal"));
+ break;
+ case Height:
+ height()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ if(height()->baseVal()->value() < 0) // A negative value is an error
+ gotError(i18n("Negative value for attribute height of element <rect> is illegal"));
+ break;
+ case Rx:
+ rx()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ if(rx()->baseVal()->value() < 0) // A negative value is an error
+ gotError(i18n("Negative value for attribute rx of element <rect> is illegal"));
+ break;
+ case Ry:
+ ry()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ if(ry()->baseVal()->value() < 0) // A negative value is an error
+ gotError(i18n("Negative value for attribute ry of element <rect> is illegal"));
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+SVGRectImpl *SVGRectElementImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+ ret->setX(m_x->baseVal()->value());
+ ret->setY(m_y->baseVal()->value());
+ ret->setWidth(m_width->baseVal()->value());
+ ret->setHeight(m_height->baseVal()->value());
+ return ret;
+}
+
+void SVGRectElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(X))
+ KSVG_SET_ALT_ATTRIBUTE(X, "0")
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(Y))
+ KSVG_SET_ALT_ATTRIBUTE(Y, "0")
+}
+
+void SVGRectElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_item)
+ {
+ m_item = c->createRectangle(this);
+ c->insert(m_item);
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGRectElementImpl.h b/ksvg/impl/SVGRectElementImpl.h
new file mode 100644
index 00000000..690084d7
--- /dev/null
+++ b/ksvg/impl/SVGRectElementImpl.h
@@ -0,0 +1,90 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGRectElementImpl_H
+#define SVGRectElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGShapeImpl.h"
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGRectImpl;
+class SVGAnimatedLengthImpl;
+class SVGRectElementImpl : public SVGShapeImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGRectElementImpl(DOM::ElementImpl *);
+ virtual ~SVGRectElementImpl();
+
+ SVGAnimatedLengthImpl *x();
+ SVGAnimatedLengthImpl *y();
+ SVGAnimatedLengthImpl *width();
+ SVGAnimatedLengthImpl *height();
+ SVGAnimatedLengthImpl *rx();
+ SVGAnimatedLengthImpl *ry();
+
+ virtual void createItem(KSVGCanvas *c = 0);
+ virtual void setAttributes();
+
+ virtual SVGRectImpl *getBBox();
+
+private:
+ SVGAnimatedLengthImpl *m_x;
+ SVGAnimatedLengthImpl *m_y;
+ SVGAnimatedLengthImpl *m_width;
+ SVGAnimatedLengthImpl *m_height;
+ SVGAnimatedLengthImpl *m_rx;
+ SVGAnimatedLengthImpl *m_ry;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ X, Y, Width, Height, Rx, Ry
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGRectElementImpl, "rect")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGRectImpl.cc b/ksvg/impl/SVGRectImpl.cc
new file mode 100644
index 00000000..1f6c0d51
--- /dev/null
+++ b/ksvg/impl/SVGRectImpl.cc
@@ -0,0 +1,157 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qrect.h>
+
+#include "SVGRectImpl.h"
+
+using namespace KSVG;
+
+#include "SVGRectImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGRectImpl::SVGRectImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x = 0;
+ m_y = 0;
+ m_width = 0;
+ m_height = 0;
+}
+
+SVGRectImpl::SVGRectImpl(const QRect &other)
+{
+ (*this) = other;
+}
+
+SVGRectImpl::~SVGRectImpl()
+{
+}
+
+void SVGRectImpl::setX(float x)
+{
+ m_x = x;
+}
+
+float SVGRectImpl::x() const
+{
+ return m_x;
+}
+
+void SVGRectImpl::setY(float y)
+{
+ m_y = y;
+}
+
+float SVGRectImpl::y() const
+{
+ return m_y;
+}
+
+void SVGRectImpl::setWidth(float width)
+{
+ m_width = width;
+}
+
+float SVGRectImpl::width() const
+{
+ return m_width;
+}
+
+void SVGRectImpl::setHeight(float height)
+{
+ m_height = height;
+}
+
+float SVGRectImpl::height() const
+{
+ return m_height;
+}
+
+QRect SVGRectImpl::qrect() const
+{
+ // ceil() so the integer rectangle contains the whole real one.
+ return QRect(int(m_x), int(m_y), int(ceil(m_width)), int(ceil(m_height)));
+}
+
+SVGRectImpl &SVGRectImpl::operator=(const QRect &other)
+{
+ m_x = other.x();
+ m_y = other.y();
+ m_width = other.width();
+ m_height = other.height();
+
+ return *this;
+}
+
+/*
+@namespace KSVG
+@begin SVGRectImpl::s_hashTable 5
+ x SVGRectImpl::X DontDelete
+ y SVGRectImpl::Y DontDelete
+ width SVGRectImpl::Width DontDelete
+ height SVGRectImpl::Height DontDelete
+@end
+*/
+
+Value SVGRectImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case X:
+ return Number(m_x);
+ case Y:
+ return Number(m_y);
+ case Width:
+ return Number(m_width);
+ case Height:
+ return Number(m_height);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGRectImpl::putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case X:
+ m_x = value.toNumber(exec);
+ break;
+ case Y:
+ m_y = value.toNumber(exec);
+ break;
+ case Width:
+ m_width = value.toNumber(exec);
+ break;
+ case Height:
+ m_height = value.toNumber(exec);
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGRectImpl.h b/ksvg/impl/SVGRectImpl.h
new file mode 100644
index 00000000..e0b0e889
--- /dev/null
+++ b/ksvg/impl/SVGRectImpl.h
@@ -0,0 +1,80 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGRectImpl_H
+#define SVGRectImpl_H
+
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+class QRect;
+
+namespace KSVG
+{
+
+class SVGRectImpl : public DOM::DomShared
+{
+public:
+ SVGRectImpl();
+ SVGRectImpl(const QRect &);
+ virtual ~SVGRectImpl();
+
+ void setX(float x);
+ float x() const;
+
+ void setY(float y);
+ float y() const;
+
+ void setWidth(float width);
+ float width() const;
+
+ void setHeight(float height);
+ float height() const;
+
+ QRect qrect() const;
+
+ SVGRectImpl &operator=(const QRect &);
+
+private:
+ float m_x;
+ float m_y;
+ float m_width;
+ float m_height;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, Width, Height
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGSVGElementImpl.cc b/ksvg/impl/SVGSVGElementImpl.cc
new file mode 100644
index 00000000..b54cf521
--- /dev/null
+++ b/ksvg/impl/SVGSVGElementImpl.cc
@@ -0,0 +1,982 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qtimer.h>
+#include <qstringlist.h>
+#include <qdatetime.h>
+
+#define USE_VALGRIND 0
+
+#if USE_VALGRIND
+#include <valgrind/calltree.h>
+#endif
+
+#include "SVGLength.h"
+
+#include "SVGRectImpl.h"
+#include "SVGAngleImpl.h"
+#include "SVGShapeImpl.h"
+#include "SVGPointImpl.h"
+#include "SVGNumberImpl.h"
+#include "SVGMatrixImpl.h"
+
+#include "SVGEventImpl.h"
+#include "SVGAElementImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGViewSpecImpl.h"
+#include "SVGTransformImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGAnimatedRectImpl.h"
+#include "SVGTransformListImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGAnimatedStringImpl.h"
+#include "SVGPreserveAspectRatioImpl.h"
+#include "SVGAnimatedTransformListImpl.h"
+#include "SVGAnimatedPreserveAspectRatioImpl.h"
+
+#include "CanvasItem.h"
+#include "KSVGCanvas.h"
+
+using namespace KSVG;
+
+#include "SVGSVGElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGSVGElementImpl::SVGSVGElementImpl(DOM::ElementImpl *impl) : SVGContainerImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGLocatableImpl(), SVGFitToViewBoxImpl(), SVGZoomAndPanImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_x->ref();
+
+ m_y = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_y->ref();
+
+ m_width = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_width->ref();
+
+ m_height = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_height->ref();
+
+ m_viewport = SVGSVGElementImpl::createSVGRect();
+
+ m_currentTranslate = SVGSVGElementImpl::createSVGPoint();
+
+ m_currentView = new SVGViewSpecImpl();
+ m_currentView->ref();
+
+ m_currentScale = 1.0;
+
+ m_useCurrentView = false;
+
+ m_clip[0] = 0;
+ m_clip[1] = 0;
+ m_clip[2] = 0;
+ m_clip[3] = 0;
+
+ m_rootParentScreenCTM = 0;
+
+ m_localMatrix = SVGSVGElementImpl::createSVGMatrix();
+}
+
+SVGSVGElementImpl::~SVGSVGElementImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_width)
+ m_width->deref();
+ if(m_height)
+ m_height->deref();
+ if(m_viewport)
+ m_viewport->deref();
+ if(m_currentTranslate)
+ m_currentTranslate->deref();
+ if(m_currentView)
+ m_currentView->deref();
+ if(m_rootParentScreenCTM)
+ m_rootParentScreenCTM->deref();
+ if(m_localMatrix)
+ m_localMatrix->deref();
+}
+
+bool SVGSVGElementImpl::isRootElement() const
+{
+ return ownerDoc()->rootElement() == this;
+}
+
+void SVGSVGElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(X))
+ KSVG_SET_ALT_ATTRIBUTE(X, "0")
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(Y))
+ KSVG_SET_ALT_ATTRIBUTE(Y, "0")
+
+ // Spec: If the attribute is not specified, the effect is as if a value of "100%" were specified.
+ if(KSVG_TOKEN_NOT_PARSED(Width))
+ KSVG_SET_ALT_ATTRIBUTE(Width, "100%")
+
+ // Spec: If the attribute is not specified, the effect is as if a value of "100%" were specified.
+ if(KSVG_TOKEN_NOT_PARSED(Height))
+ KSVG_SET_ALT_ATTRIBUTE(Height, "100%")
+
+ // Spec: The contentScriptType should default to "text/ecmascript".
+ if(KSVG_TOKEN_NOT_PARSED(ContentScriptType))
+ KSVG_SET_ALT_ATTRIBUTE(ContentScriptType, "text/ecmascript")
+
+ // Spec: The contentStyleType should default to "text/css".
+ if(KSVG_TOKEN_NOT_PARSED(ContentStyleType))
+ KSVG_SET_ALT_ATTRIBUTE(ContentStyleType, "text/css")
+
+ if(m_useCurrentView)
+ {
+ parseViewBox(m_currentView->viewBoxString().string());
+ preserveAspectRatio()->baseVal()->parsePreserveAspectRatio(m_currentView->preserveAspectRatioString().string());
+ }
+
+ m_viewport->setX(x()->baseVal()->value());
+ m_viewport->setY(y()->baseVal()->value());
+ m_viewport->setWidth(width()->baseVal()->value());
+ m_viewport->setHeight(height()->baseVal()->value());
+
+ if(isRootElement() && ownerDoc()->parentImage() == 0)
+ {
+ if(ownerDoc()->canvas())
+ ownerDoc()->canvas()->setViewportDimension(int(ceil(width()->baseVal()->value() * currentScale())), int(ceil(height()->baseVal()->value() * currentScale())));
+
+ // Special case for outermost svg element:
+ // We need to register our id manually, because
+ // m_ownerSVGElement is 0 in SVGElementImpl::setAttributes (Niko)
+ if(!id().isNull())
+ addToIdMap(id().string(), this);
+ }
+}
+
+SVGAnimatedLengthImpl *SVGSVGElementImpl::x()
+{
+ return m_x;
+}
+
+SVGAnimatedLengthImpl *SVGSVGElementImpl::y()
+{
+ return m_y;
+}
+
+SVGAnimatedLengthImpl *SVGSVGElementImpl::width()
+{
+ return m_width;
+}
+
+SVGAnimatedLengthImpl *SVGSVGElementImpl::height()
+{
+ return m_height;
+}
+
+void SVGSVGElementImpl::setContentScriptType(const DOM::DOMString &contentScriptType)
+{
+ setAttribute("contentScriptType", contentScriptType);
+}
+
+DOM::DOMString SVGSVGElementImpl::contentScriptType() const
+{
+ return getAttribute("contentScriptType");
+}
+
+void SVGSVGElementImpl::setContentStyleType(const DOM::DOMString &contentStyleType)
+{
+ setAttribute("contentStyleType", contentStyleType);
+}
+
+DOM::DOMString SVGSVGElementImpl::contentStyleType() const
+{
+ return getAttribute("contentStyleType");
+}
+
+SVGRectImpl *SVGSVGElementImpl::viewport()
+{
+ return m_viewport;
+}
+
+SVGRectImpl *SVGSVGElementImpl::getBBox()
+{
+ SVGRectImpl *ret = new SVGRectImpl(getCTM()->qmatrix().invert().map(m_viewport->qrect()));
+ ret->ref();
+ return ret;
+}
+
+float SVGSVGElementImpl::pixelUnitToMillimeterX() const
+{
+ return ownerDoc()->screenPixelsPerMillimeterX();
+}
+
+float SVGSVGElementImpl::pixelUnitToMillimeterY() const
+{
+ return ownerDoc()->screenPixelsPerMillimeterY();
+}
+
+float SVGSVGElementImpl::screenPixelToMillimeterX() const
+{
+ return pixelUnitToMillimeterX();
+}
+
+float SVGSVGElementImpl::screenPixelToMillimeterY() const
+{
+ return pixelUnitToMillimeterY();
+}
+
+void SVGSVGElementImpl::setUseCurrentView(bool useCurrentView)
+{
+ m_useCurrentView = useCurrentView;
+}
+
+bool SVGSVGElementImpl::useCurrentView() const
+{
+ return m_useCurrentView;
+}
+
+SVGViewSpecImpl *SVGSVGElementImpl::currentView() const
+{
+ return m_currentView;
+}
+
+void SVGSVGElementImpl::setCurrentScale(float currentScale)
+{
+ if( m_currentScale != currentScale )
+ {
+ m_currentScale = currentScale;
+ invalidateCachedMatrices();
+
+ if(hasEventListener(SVGEvent::ZOOM_EVENT, true))
+ dispatchEvent(SVGEvent::ZOOM_EVENT, false, false);
+ }
+}
+
+float SVGSVGElementImpl::currentScale() const
+{
+ return m_currentScale;
+}
+
+void SVGSVGElementImpl::setCurrentTranslate(const QPoint &p)
+{
+ if(m_currentTranslate->x() != p.x() || m_currentTranslate->y() != p.y())
+ {
+ m_currentTranslate->setX(p.x());
+ m_currentTranslate->setY(p.y());
+ invalidateCachedMatrices();
+ if(hasEventListener(SVGEvent::SCROLL_EVENT, true))
+ dispatchEvent(SVGEvent::SCROLL_EVENT, false, false);
+ }
+}
+
+SVGPointImpl *SVGSVGElementImpl::currentTranslate()
+{
+ return m_currentTranslate;
+}
+
+unsigned long SVGSVGElementImpl::suspendRedraw(unsigned long)
+{
+ return 0;
+}
+
+void SVGSVGElementImpl::unsuspendRedraw(unsigned long)
+{
+}
+
+void SVGSVGElementImpl::unsuspendRedrawAll()
+{
+}
+
+void SVGSVGElementImpl::forceRedraw()
+{
+#if USE_VALGRIND
+ CALLTREE_ZERO_STATS();
+#endif
+
+ QTime timer;
+ timer.start();
+
+ if(ownerDoc() && ownerDoc()->canvas())
+ ownerDoc()->canvas()->update();
+
+ kdDebug(26000) << "forceRedraw in " << timer.elapsed()/1000.0 << " seconds" << endl;
+
+#if USE_VALGRIND
+ CALLTREE_DUMP_STATS();
+#endif
+}
+
+void SVGSVGElementImpl::pauseAnimations()
+{
+ if(!ownerDoc()->timeScheduler()->animationsPaused())
+ ownerDoc()->timeScheduler()->toggleAnimations();
+}
+
+void SVGSVGElementImpl::unpauseAnimations()
+{
+ if(ownerDoc()->timeScheduler()->animationsPaused())
+ ownerDoc()->timeScheduler()->toggleAnimations();
+}
+
+bool SVGSVGElementImpl::animationsPaused()
+{
+ return ownerDoc()->timeScheduler()->animationsPaused();
+}
+
+float SVGSVGElementImpl::getCurrentTime() const
+{
+ return ownerDoc()->timeScheduler()->elapsed();
+}
+
+void SVGSVGElementImpl::setCurrentTime(float)
+{
+}
+
+DOM::NodeList SVGSVGElementImpl::getIntersectionList(SVGRectImpl *, SVGElementImpl *)
+{
+ // TODO : implement me
+ return DOM::NodeList();
+}
+
+DOM::NodeList SVGSVGElementImpl::getEnclosureList(SVGRectImpl *rect, SVGElementImpl */*referenceElement*/)
+{
+ DOM::NodeList list;
+
+ DOM::Node node = firstChild();
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *element = ownerDoc()->getElementFromHandle(node.handle());
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(element);
+ if(shape)
+ {
+ if(shape->isContainer())
+ // TODO : pass it on to container::getEnclosureList() which should return a NodeList
+ kdDebug() << "!shape" << endl;
+ else
+ {
+ // TODO : add the shape to list if the test succeeds
+ SVGRectImpl *current = shape->getBBox();
+ if(rect->qrect().contains(current->qrect(), true))
+ kdDebug() << "shape : " << element->nodeName().string() << " is fully enclosed" << endl;
+
+ current->deref();
+ }
+ }
+ }
+
+ return list;
+}
+
+bool SVGSVGElementImpl::checkIntersection(SVGElementImpl *element, SVGRectImpl *rect)
+{
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(element);
+ if(!shape)
+ return false;
+
+ SVGRectImpl *current = shape->getBBox();
+ bool result = rect->qrect().intersects(current->qrect());
+ current->deref();
+ return result;
+}
+
+bool SVGSVGElementImpl::checkEnclosure(SVGElementImpl *element, SVGRectImpl *rect)
+{
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(element);
+ if(!shape)
+ return false;
+
+ SVGRectImpl *current = shape->getBBox();
+ bool result = rect->qrect().contains(current->qrect());
+ current->deref();
+ return result;
+}
+
+void SVGSVGElementImpl::deSelectAll()
+{
+}
+
+SVGNumberImpl *SVGSVGElementImpl::createSVGNumber()
+{
+ // Spec: Creates an SVGNumber object outside of any document
+ // trees. The object is initialized to a value of zero.
+ SVGNumberImpl *ret = new SVGNumberImpl();
+ ret->ref();
+ return ret;
+}
+
+SVGLengthImpl *SVGSVGElementImpl::createSVGLength()
+{
+ // Spec: Creates an SVGLength object outside of any document
+ // trees. The object is initialized to the value of 0 user units.
+ SVGLengthImpl *ret = new SVGLengthImpl();
+ ret->ref();
+ return ret;
+}
+
+SVGAngleImpl *SVGSVGElementImpl::createSVGAngle()
+{
+ // Spec: Creates an SVGAngle object outside of any document
+ // trees. The object is initialized to the value 0 degrees (unitless).
+ SVGAngleImpl *ret = new SVGAngleImpl();
+ ret->ref();
+ return ret;
+}
+
+SVGPointImpl *SVGSVGElementImpl::createSVGPoint()
+{
+ // Spec: Creates an SVGPoint object outside of any document
+ // trees. The object is initialized to the point (0,0) in the user coordinate system.
+ SVGPointImpl *ret = new SVGPointImpl();
+ ret->ref();
+ return ret;
+}
+
+SVGMatrixImpl *SVGSVGElementImpl::createSVGMatrix()
+{
+ // Spec: Creates an SVGMatrix object outside of any document
+ // trees. The object is initialized to the identity matrix.
+ SVGMatrixImpl *ret = new SVGMatrixImpl(QWMatrix(1.0F, 0.0F, 0.0F, 1.0F, 0.0F, 0.0F));
+ ret->ref();
+ return ret;
+}
+
+SVGRectImpl *SVGSVGElementImpl::createSVGRect()
+{
+ // Spec: Creates an SVGRect object outside of any document
+ // trees. The object is initialized such that all values are set to 0 user units.
+ SVGRectImpl *ret = new SVGRectImpl();
+ ret->ref();
+ return ret;
+}
+
+SVGTransformImpl *SVGSVGElementImpl::createSVGTransform()
+{
+ // Spec: Creates an SVGTransform object outside of any document
+ // trees. The object is initialized to an identity matrix transform (SVG_TRANSFORM_MATRIX).
+ SVGTransformImpl *transform = createSVGTransformFromMatrix(createSVGMatrix());
+
+ // createSVGMatrix already ref's the matrix, the SVGTransformImpl->setMatrix
+ // call also does this, prevent non deleting of the object by deref'ing (Niko)
+ transform->matrix()->deref();
+
+ return transform;
+}
+
+SVGTransformImpl *SVGSVGElementImpl::createSVGTransformFromMatrix(SVGMatrixImpl *mat)
+{
+ // Spec: Creates an SVGTransform object outside of any document
+ // trees. The object is initialized to the given matrix transform (i.e., SVG_TRANSFORM_MATRIX).
+ SVGTransformImpl *ret = new SVGTransformImpl();
+ ret->setMatrix(mat);
+ ret->ref();
+ return ret;
+}
+
+SVGElementImpl *SVGSVGElementImpl::getElementById(const DOM::DOMString &elementId)
+{
+ return m_map[elementId.string()];
+}
+
+void SVGSVGElementImpl::addToIdMap(const QString &id, SVGElementImpl *obj)
+{
+ m_map.insert(id, obj);
+}
+
+SVGMatrixImpl *SVGSVGElementImpl::getCTM()
+{
+ return viewBoxToViewTransform(width()->baseVal()->value(), height()->baseVal()->value());
+}
+
+const SVGMatrixImpl *SVGSVGElementImpl::localMatrix()
+{
+ // TODO: only update the matrix when needed and just return m_localMatrix
+
+ m_localMatrix->reset();
+
+ if(ownerSVGElement() == 0)
+ {
+ if(m_rootParentScreenCTM != 0)
+ m_localMatrix->copy(m_rootParentScreenCTM);
+
+ // We're the outermost svg element.
+ // Put the zoom scale and translate into the matrix.
+ m_localMatrix->translate(currentTranslate()->x(), currentTranslate()->y());
+ m_localMatrix->scale(currentScale());
+ }
+
+ // Apply viewport translation.
+ m_localMatrix->translate(x()->baseVal()->value(), y()->baseVal()->value());
+
+ // And viewbox.
+ SVGMatrixImpl *viewboxMatrix = viewBoxToViewTransform(width()->baseVal()->value(), height()->baseVal()->value());
+
+ m_localMatrix->multiply(viewboxMatrix);
+ viewboxMatrix->deref();
+
+ return m_localMatrix;
+}
+
+void SVGSVGElementImpl::setClip(const QString &clip)
+{
+ // TODO : this routine should probably be shared between all classes that establish new viewports (Rob)
+ if(!clip.startsWith("rect(") || !clip.endsWith(")"))
+ return;
+
+ QString work = clip.mid(5, clip.length() - 6);
+ QStringList substrings = QStringList::split(',', clip);
+ QStringList::ConstIterator it = substrings.begin();
+
+ if(m_clip[0])
+ m_clip[0]->deref();
+ m_clip[0] = SVGSVGElementImpl::createSVGLength();
+
+ if(*it != "auto")
+ m_clip[0]->setValueAsString(*it);
+ ++it;
+
+ if(m_clip[1])
+ m_clip[1]->deref();
+ m_clip[1] = SVGSVGElementImpl::createSVGLength();
+
+ if(*it != "auto")
+ m_clip[1]->setValueAsString(*it);
+ ++it;
+
+ if(m_clip[2])
+ m_clip[2]->deref();
+ m_clip[2] = SVGSVGElementImpl::createSVGLength();
+
+ if(*it != "auto")
+ m_clip[2]->setValueAsString(*it);
+ ++it;
+
+ if(m_clip[3])
+ m_clip[3]->deref();
+ m_clip[3] = SVGSVGElementImpl::createSVGLength();
+
+ if(*it != "auto")
+ m_clip[3]->setValueAsString(*it);
+}
+
+QRect SVGSVGElementImpl::clip()
+{
+ // Get viewport in user coordinates.
+ QRect v(0, 0, m_viewport->qrect().width(), m_viewport->qrect().height());
+
+ SVGMatrixImpl *ctm = getCTM();
+ QRect r = ctm->qmatrix().invert().mapRect(v);
+ ctm->deref();
+
+ if(m_clip[0])
+ r.setTop(static_cast<int>(r.top() + m_clip[0]->value()));
+ if(m_clip[1])
+ r.setRight(static_cast<int>(r.right() - m_clip[1]->value()));
+ if(m_clip[2])
+ r.setBottom(static_cast<int>(r.bottom() - m_clip[2]->value()));
+ if(m_clip[3])
+ r.setLeft(static_cast<int>(r.left() + m_clip[3]->value()));
+
+ return r;
+}
+
+void SVGSVGElementImpl::setRootParentScreenCTM(SVGMatrixImpl *screenCTM)
+{
+ if(m_rootParentScreenCTM != 0)
+ m_rootParentScreenCTM->deref();
+
+ m_rootParentScreenCTM = screenCTM;
+ screenCTM->ref();
+}
+
+bool SVGSVGElementImpl::prepareMouseEvent(const QPoint &p, const QPoint &a, SVGMouseEventImpl *mev)
+{
+ // mop: central bool var which turns to true once the current "mouseover" element has been found
+ bool ret = false, dorerender = false;
+ SVGElementImpl *elem = 0;
+
+ SVGMatrixImpl *ctm = getCTM();
+ QPoint userA = ctm->qmatrix().invert().map(a);
+ ctm->deref();
+
+ // Just check the lastTarget once (mop)
+ if(ownerDoc()->lastTarget())
+ {
+ elem = ownerDoc()->lastTarget();
+ ret = elem->prepareMouseEvent(p, userA, mev);
+
+ // mop: only proceed if element is not the current element anymore. rest is done in the lower part
+ if(!ret)
+ {
+ if(elem->hasEventListener(SVGEvent::MOUSEOUT_EVENT, false))
+ {
+ dorerender = true;
+ elem->setMouseOver(false);
+ elem->dispatchMouseEvent(SVGEvent::MOUSEOUT_EVENT, true, true, 0, mev->screenX(), mev->screenY(), mev->clientX(), mev->clientY(), mev->ctrlKey(), mev->altKey(), mev->shiftKey(), mev->metaKey(), mev->button(), elem);
+ }
+
+ if(elem->hasEventListener(SVGEvent::DOMFOCUSOUT_EVENT, false) && elem->focus())
+ {
+ dorerender = true;
+ elem->setFocus(false);
+ elem->dispatchEvent(SVGEvent::DOMFOCUSOUT_EVENT, true, true);
+ }
+
+ // mop: unset last target once we left it
+ ownerDoc()->setLastTarget(0);
+ }
+ }
+
+ // mop: DAMN...logic doesn't work :(
+ // we cant use the results of the above check because something like this
+ // _________
+ // | ____ |
+ // ||____| |
+ // |_________|
+ //
+ // wouldn't work because even if the mousepointer would be in the inner rect it would still be inside the bbox
+ // of the outer (assuming that the outer is the lastTarget). :(
+ ret = false;
+
+ // mop: just check for a node until the element where the mouse is over is found
+ // mop: "ret" can be set from the above stuff too...
+ // find the element here and do the event stuff in the lower part..much cleaner
+ CanvasItemList hits = ownerDoc()->canvas()->collisions(p, true);
+ for(CanvasItemList::Iterator it = hits.begin(); it != hits.end(); ++it)
+ {
+ elem = (*it)->element();
+ if(elem)
+ {
+ // Check if mouse is over a certain shape...
+ // mop: once an element has been found check eventlisteners and leave immediately
+ ret = elem->prepareMouseEvent(p, userA, mev);
+ if(ret) break;
+ }
+ }
+
+ // mop: has an element been found?
+ if(ret)
+ {
+ int events = mev->target()->getEventListeners(false);
+
+ // Dispatch mousemove, mousedown, mouseup and mouseclick events
+ bool cancel = (mev->id() != SVGEvent::MOUSEMOVE_EVENT);
+
+ if(events & 1 << mev->id())
+ {
+ mev->target()->dispatchMouseEvent(mev->id(), true, cancel, 0, mev->screenX(), mev->screenY(), mev->clientX(), mev->clientY(), mev->ctrlKey(), mev->altKey(), mev->shiftKey(), mev->metaKey(), mev->button(), elem);
+ dorerender = true; // mop: if it has the event then rerender
+ }
+
+ // If a mouse "moves" over a shape, it's also "over" the shape
+ if(mev->id() == SVGEvent::MOUSEMOVE_EVENT)
+ {
+ mev->target()->setMouseOver(true);
+ if(events & 1 << SVGEvent::MOUSEOVER_EVENT)
+ {
+ mev->target()->dispatchMouseEvent(SVGEvent::MOUSEOVER_EVENT, true, cancel, 0, mev->screenX(), mev->screenY(), mev->clientX(), mev->clientY(), mev->ctrlKey(), mev->altKey(), mev->shiftKey(), mev->metaKey(), mev->button(), elem);
+ dorerender = true;
+ }
+
+ }
+
+ // Also send an domactivate + focusin event on mouseup
+ bool dolinktest = true;
+ if(mev->id() == SVGEvent::MOUSEUP_EVENT)
+ {
+ mev->target()->setFocus(true);
+
+ if(events & 1 << SVGEvent::CLICK_EVENT)
+ {
+ dolinktest = mev->target()->dispatchEvent(SVGEvent::CLICK_EVENT, true, true);
+ dorerender = true;
+ }
+
+ if(events & 1 << SVGEvent::DOMACTIVATE_EVENT)
+ {
+ mev->target()->dispatchEvent(SVGEvent::DOMACTIVATE_EVENT, true, true);
+ dorerender = true;
+ }
+
+ if(events & 1 << SVGEvent::DOMFOCUSIN_EVENT)
+ {
+ mev->target()->dispatchEvent(SVGEvent::DOMFOCUSIN_EVENT, true, true);
+ dorerender = true;
+ }
+ }
+
+ // Hyperlink support
+ SVGAElementImpl* link=0;
+ if(dolinktest && !mev->defaultPrevented())
+ {
+ link = SVGAElementImpl::getLink(elem);
+ if(link)
+ {
+ mev->setURL(link->href()->baseVal());
+ emit ownerDoc()->gotURL(link->target()->baseVal().string());
+ }
+ }
+
+ // The mouse is over a shape, so we have a target..we need to register that for a mouseout
+ ownerDoc()->setLastTarget(mev->target());
+ }
+
+ // mop: all events may trigger changed style, add elements etc. this is definately needed :(
+ if(dorerender)
+ ownerDoc()->rerender();
+
+ return dorerender; // mop: some kind of event has been found and executed
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGSVGElementImpl::s_hashTable 23
+ x SVGSVGElementImpl::X DontDelete|ReadOnly
+ y SVGSVGElementImpl::Y DontDelete|ReadOnly
+ width SVGSVGElementImpl::Width DontDelete|ReadOnly
+ height SVGSVGElementImpl::Height DontDelete|ReadOnly
+ viewport SVGSVGElementImpl::Viewport DontDelete|ReadOnly
+ contentScriptType SVGSVGElementImpl::ContentScriptType DontDelete
+ contentStyleType SVGSVGElementImpl::ContentStyleType DontDelete
+ pixelUnitToMillimeterX SVGSVGElementImpl::PixelUnitToMillimeterX DontDelete|ReadOnly
+ pixelUnitToMillimeterY SVGSVGElementImpl::PixelUnitToMillimeterY DontDelete|ReadOnly
+ screenPixelToMillimeterX SVGSVGElementImpl::ScreenPixelToMillimeterX DontDelete|ReadOnly
+ screenPixelToMillimeterY SVGSVGElementImpl::ScreenPixelToMillimeterY DontDelete|ReadOnly
+ useCurrentView SVGSVGElementImpl::UseCurrentView DontDelete
+ currentScale SVGSVGElementImpl::CurrentScale DontDelete
+ currentTranslate SVGSVGElementImpl::CurrentTranslate DontDelete|ReadOnly
+ onunload SVGSVGElementImpl::OnUnload DontDelete
+ onerror SVGSVGElementImpl::OnError DontDelete
+ onresize SVGSVGElementImpl::OnResize DontDelete
+ onzoom SVGSVGElementImpl::OnZoom DontDelete
+ onscroll SVGSVGElementImpl::OnScroll DontDelete
+@end
+@namespace KSVG
+@begin SVGSVGElementImplProto::s_hashTable 29
+ createSVGNumber SVGSVGElementImpl::CreateSVGNumber DontDelete|Function 0
+ createSVGLength SVGSVGElementImpl::CreateSVGLength DontDelete|Function 0
+ createSVGAngle SVGSVGElementImpl::CreateSVGAngle DontDelete|Function 0
+ createSVGPoint SVGSVGElementImpl::CreateSVGPoint DontDelete|Function 0
+ createSVGMatrix SVGSVGElementImpl::CreateSVGMatrix DontDelete|Function 0
+ createSVGRect SVGSVGElementImpl::CreateSVGRect DontDelete|Function 0
+ createSVGTransform SVGSVGElementImpl::CreateSVGTransform DontDelete|Function 0
+ createSVGTransformFromMatrix SVGSVGElementImpl::CreateSVGTransformFromMatrix DontDelete|Function 1
+ suspendRedraw SVGSVGElementImpl::SuspendRedraw DontDelete|Function 1
+ unsuspendRedraw SVGSVGElementImpl::UnsuspendRedraw DontDelete|Function 1
+ unsuspendRedrawAll SVGSVGElementImpl::UnsuspendRedrawAll DontDelete|Function 0
+ forceRedraw SVGSVGElementImpl::ForceRedraw DontDelete|Function 0
+ pauseAnimations SVGSVGElementImpl::PauseAnimations DontDelete|Function 0
+ unpauseAnimations SVGSVGElementImpl::UnpauseAnimations DontDelete|Function 0
+ animationsPaused SVGSVGElementImpl::AnimationsPaused DontDelete|Function 0
+ getCurrentTime SVGSVGElementImpl::GetCurrentTime DontDelete|Function 0
+ setCurrentTime SVGSVGElementImpl::SetCurrentTime DontDelete|Function 1
+ getIntersectionList SVGSVGElementImpl::GetIntersectionList DontDelete|Function 2
+ getEnclosureList SVGSVGElementImpl::GetEnclosureList DontDelete|Function 2
+ checkIntersection SVGSVGElementImpl::CheckIntersection DontDelete|Function 2
+ checkEnclosure SVGSVGElementImpl::CheckEnclosure DontDelete|Function 2
+ deselectAll SVGSVGElementImpl::DeselectAll DontDelete|Function 0
+ getElementById SVGSVGElementImpl::GetElementById DontDelete|Function 1
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGSVGElement", SVGSVGElementImplProto, SVGSVGElementImplProtoFunc)
+
+Value SVGSVGElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case X:
+ if(!attributeMode)
+ return m_x->cache(exec);
+ else
+ return Number(m_x->baseVal()->value());
+ case Y:
+ if(!attributeMode)
+ return m_y->cache(exec);
+ else
+ return Number(m_y->baseVal()->value());
+ case Width:
+ if(!attributeMode)
+ return m_width->cache(exec);
+ else
+ return Number(m_width->baseVal()->value());
+ case Height:
+ if(!attributeMode)
+ return m_height->cache(exec);
+ else
+ return Number(m_height->baseVal()->value());
+ case Viewport:
+ return m_viewport->cache(exec);
+ case ContentScriptType:
+ return String(contentScriptType().string());
+ case ContentStyleType:
+ return String(contentStyleType().string());
+ case PixelUnitToMillimeterX:
+ return Number(pixelUnitToMillimeterX());
+ case PixelUnitToMillimeterY:
+ return Number(pixelUnitToMillimeterY());
+ case ScreenPixelToMillimeterX:
+ return Number(screenPixelToMillimeterX());
+ case ScreenPixelToMillimeterY:
+ return Number(screenPixelToMillimeterY());
+ case UseCurrentView:
+ return Boolean(useCurrentView());
+ case CurrentScale:
+ return Number(currentScale());
+ case CurrentTranslate:
+ return m_currentTranslate->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGSVGElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int)
+{
+ switch(token)
+ {
+ case ContentScriptType:
+ setContentScriptType(value.toString(exec).string());
+ break;
+ case ContentStyleType:
+ setContentStyleType(value.toString(exec).string());
+ break;
+ case CurrentScale:
+ m_currentScale = value.toNumber(exec);
+ break;
+ case X:
+ x()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Y:
+ y()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Width:
+ width()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Height:
+ height()->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case OnUnload:
+ // Spec: only applicable to outermost 'svg' elements
+ if(isRootElement())
+ setEventListener(SVGEvent::UNLOAD_EVENT, ownerDoc()->createEventListener(value.toString(exec).qstring()));
+ break;
+ case OnError:
+ setEventListener(SVGEvent::ERROR_EVENT, ownerDoc()->createEventListener(value.toString(exec).qstring()));
+ break;
+ case OnResize:
+ // Spec: only applicable to outermost 'svg' elements
+ if(isRootElement())
+ setEventListener(SVGEvent::RESIZE_EVENT, ownerDoc()->createEventListener(value.toString(exec).qstring()));
+ break;
+ case OnZoom:
+ // Spec: only applicable to outermost 'svg' elements
+ if(isRootElement())
+ setEventListener(SVGEvent::ZOOM_EVENT, ownerDoc()->createEventListener(value.toString(exec).qstring()));
+ break;
+ case OnScroll:
+ // Spec: only applicable to outermost 'svg' elements
+ if(isRootElement())
+ setEventListener(SVGEvent::SCROLL_EVENT, ownerDoc()->createEventListener(value.toString(exec).qstring()));
+ break;
+ default:
+ kdWarning() << k_funcinfo << "unhandled token " << token << endl;
+ }
+}
+
+Value SVGSVGElementImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGSVGElementImpl)
+
+ switch(id)
+ {
+ case SVGSVGElementImpl::CreateSVGNumber:
+ return obj->createSVGNumber()->cache(exec);
+ case SVGSVGElementImpl::CreateSVGLength:
+ return obj->createSVGLength()->cache(exec);
+ case SVGSVGElementImpl::CreateSVGAngle:
+ return obj->createSVGAngle()->cache(exec);
+ case SVGSVGElementImpl::CreateSVGPoint:
+ return obj->createSVGPoint()->cache(exec);
+ case SVGSVGElementImpl::CreateSVGMatrix:
+ return obj->createSVGMatrix()->cache(exec);
+ case SVGSVGElementImpl::CreateSVGRect:
+ return obj->createSVGRect()->cache(exec);
+ case SVGSVGElementImpl::CreateSVGTransform:
+ return obj->createSVGTransform()->cache(exec);
+ case SVGSVGElementImpl::CreateSVGTransformFromMatrix:
+ return obj->createSVGTransformFromMatrix(static_cast<KSVGBridge<SVGMatrixImpl> *>(args[0].imp())->impl())->cache(exec);
+ case SVGSVGElementImpl::GetElementById:
+ {
+ // Keep in sync with SVGDocumentImpl's version.
+ Value ret;
+
+ SVGElementImpl *element = obj->getElementById(args[0].toString(exec).string());
+
+ if(element)
+ ret = getDOMNode(exec, *element);
+ else
+ {
+ element = obj->ownerDoc()->recursiveSearch(*(obj->ownerDoc()), args[0].toString(exec).string());
+ if(!element)
+ return Null();
+
+ ret = getDOMNode(exec, *element);
+ }
+
+ return ret;
+ }
+ case SVGSVGElementImpl::GetCurrentTime:
+ return Number(obj->getCurrentTime());
+ case SVGSVGElementImpl::SetCurrentTime:
+ obj->setCurrentTime(args[0].toNumber(exec));
+ return Undefined();
+ case SVGSVGElementImpl::DeselectAll:
+ obj->deSelectAll();
+ return Undefined();
+ case SVGSVGElementImpl::PauseAnimations:
+ obj->pauseAnimations();
+ return Undefined();
+ case SVGSVGElementImpl::UnpauseAnimations:
+ obj->unpauseAnimations();
+ return Undefined();
+ case SVGSVGElementImpl::AnimationsPaused:
+ return Boolean(obj->animationsPaused());
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGSVGElementImpl.h b/ksvg/impl/SVGSVGElementImpl.h
new file mode 100644
index 00000000..2405458e
--- /dev/null
+++ b/ksvg/impl/SVGSVGElementImpl.h
@@ -0,0 +1,198 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGSVGElementImpl_H
+#define SVGSVGElementImpl_H
+
+#include <dom/dom_string.h>
+
+#include <qmap.h>
+
+#include "SVGTestsImpl.h"
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLocatableImpl.h"
+#include "SVGContainerImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGZoomAndPanImpl.h"
+#include "SVGFitToViewBoxImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGPointImpl;
+class SVGAngleImpl;
+class SVGNumberImpl;
+class SVGLengthImpl;
+class SVGMatrixImpl;
+class SVGViewSpecImpl;
+class SVGTransformImpl;
+class SVGAnimatedLengthImpl;
+class SVGAnimationElementImpl;
+class SVGSVGElementImpl : public SVGContainerImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGLocatableImpl,
+ public SVGFitToViewBoxImpl,
+ public SVGZoomAndPanImpl
+{
+public:
+ SVGSVGElementImpl(DOM::ElementImpl *);
+ virtual ~SVGSVGElementImpl();
+
+ bool isRootElement() const;
+
+ SVGAnimatedLengthImpl *x();
+ SVGAnimatedLengthImpl *y();
+ SVGAnimatedLengthImpl *width();
+ SVGAnimatedLengthImpl *height();
+
+ void setContentScriptType(const DOM::DOMString &);
+ DOM::DOMString contentScriptType() const;
+
+ void setContentStyleType(const DOM::DOMString &);
+ DOM::DOMString contentStyleType() const;
+
+ SVGRectImpl *viewport();
+ SVGRectImpl *getBBox();
+
+ float pixelUnitToMillimeterX() const;
+ float pixelUnitToMillimeterY() const;
+ float screenPixelToMillimeterX() const;
+ float screenPixelToMillimeterY() const;
+
+ void setUseCurrentView(bool);
+ bool useCurrentView() const;
+ SVGViewSpecImpl *currentView() const;
+
+ void setCurrentScale(float);
+ float currentScale() const;
+
+ SVGPointImpl *currentTranslate();
+ void setCurrentTranslate(const QPoint &p);
+
+ unsigned long suspendRedraw(unsigned long max_wait_milliseconds);
+ void unsuspendRedraw(unsigned long suspend_handle_id);
+ void unsuspendRedrawAll();
+ void forceRedraw();
+
+ void pauseAnimations();
+ void unpauseAnimations();
+
+ bool animationsPaused();
+
+ float getCurrentTime() const;
+ void setCurrentTime(float seconds);
+ DOM::NodeList getIntersectionList(SVGRectImpl *rect, SVGElementImpl *referenceElement);
+ DOM::NodeList getEnclosureList(SVGRectImpl *rect, SVGElementImpl *referenceElement);
+ bool checkIntersection(SVGElementImpl *element, SVGRectImpl *rect);
+ bool checkEnclosure(SVGElementImpl *element, SVGRectImpl *rect);
+ void deSelectAll();
+
+ // Static creators for svg primitives
+ static SVGNumberImpl *createSVGNumber();
+ static SVGLengthImpl *createSVGLength();
+ static SVGAngleImpl *createSVGAngle();
+ static SVGPointImpl *createSVGPoint();
+ static SVGMatrixImpl *createSVGMatrix();
+ static SVGRectImpl *createSVGRect();
+ static SVGTransformImpl *createSVGTransform();
+ static SVGTransformImpl *createSVGTransformFromMatrix(SVGMatrixImpl *matrix);
+
+ SVGElementImpl *getElementById(const DOM::DOMString &elementId);
+ void addToIdMap(const QString &id, SVGElementImpl *obj);
+
+ virtual SVGMatrixImpl *getCTM();
+ virtual const SVGMatrixImpl *localMatrix();
+
+ void setAttributes();
+
+ bool prepareMouseEvent(const QPoint &p, const QPoint &a, SVGMouseEventImpl *event);
+
+ virtual bool isContainer() const { return true; }
+
+ virtual void setClip(const QString &clip);
+ virtual QRect clip();
+
+ void setRootParentScreenCTM(SVGMatrixImpl *screenCTM);
+
+private:
+ SVGAnimatedLengthImpl *m_x;
+ SVGAnimatedLengthImpl *m_y;
+ SVGAnimatedLengthImpl *m_width;
+ SVGAnimatedLengthImpl *m_height;
+
+ SVGRectImpl *m_viewport;
+
+ bool m_useCurrentView;
+
+ SVGViewSpecImpl *m_currentView;
+
+ float m_currentScale;
+
+ SVGPointImpl *m_currentTranslate;
+
+ SVGLengthImpl *m_clip[4];
+
+ QMap<QString, SVGElementImpl *> m_map;
+
+ // Transformation provided by the 'parent' of the outermost svg element
+ SVGMatrixImpl *m_rootParentScreenCTM;
+
+ SVGMatrixImpl *m_localMatrix;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ X, Y, Width, Height, ContentScriptType, ContentStyleType, Viewport,
+ PixelUnitToMillimeterX, PixelUnitToMillimeterY, ScreenPixelToMillimeterX, ScreenPixelToMillimeterY,
+ UseCurrentView, CurrentScale, CurrentTranslate, OnUnload, OnError, OnResize, OnZoom, OnScroll,
+ // Functions
+ CreateSVGNumber, CreateSVGLength, CreateSVGAngle, CreateSVGPoint, CreateSVGMatrix, CreateSVGRect, CreateSVGTransform,
+ CreateSVGTransformFromMatrix, SuspendRedraw, UnsuspendRedraw, UnsuspendRedrawAll, ForceRedraw,
+ PauseAnimations, UnpauseAnimations, AnimationsPaused, GetCurrentTime, SetCurrentTime,
+ GetIntersectionList, GetEnclosureList, CheckIntersection, CheckEnclosure,
+ DeselectAll, GetElementById
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGSVGElementImpl, "svg")
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGSVGElementImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGSVGElementImplProtoFunc, SVGSVGElementImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGScriptElementImpl.cc b/ksvg/impl/SVGScriptElementImpl.cc
new file mode 100644
index 00000000..9a211425
--- /dev/null
+++ b/ksvg/impl/SVGScriptElementImpl.cc
@@ -0,0 +1,185 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <kio/job.h>
+#include <kfilterdev.h>
+#include <qbuffer.h>
+
+#include "SVGDocumentImpl.h"
+#include "SVGAnimatedStringImpl.h"
+#include "SVGScriptElementImpl.moc"
+
+using namespace KSVG;
+
+#include "SVGScriptElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGScriptElementImpl::SVGScriptElementImpl(DOM::ElementImpl *impl) : QObject(), SVGElementImpl(impl), SVGURIReferenceImpl(), SVGExternalResourcesRequiredImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_job = 0;
+ m_added = false;
+}
+
+SVGScriptElementImpl::~SVGScriptElementImpl()
+{
+}
+
+void SVGScriptElementImpl::setType(const DOM::DOMString &type)
+{
+ setAttribute("type", type);
+}
+
+DOM::DOMString SVGScriptElementImpl::type() const
+{
+ return getAttribute("type");
+}
+
+void SVGScriptElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: provide a default type
+ if(KSVG_TOKEN_NOT_PARSED(Type))
+ KSVG_SET_ALT_ATTRIBUTE(Type, "text/ecmascript")
+
+ // Remote downloading
+ QString href = m_href->baseVal().string();
+
+ if(!href.isEmpty())
+ {
+ KURL url(ownerDoc()->baseUrl(), href);
+
+ if(m_job == 0)
+ m_job = KIO::get(url, false, false);
+
+ connect(m_job, SIGNAL(data(KIO::Job *, const QByteArray &)), this, SLOT(slotData(KIO::Job *, const QByteArray &)));
+ connect(m_job, SIGNAL(result(KIO::Job *)), this, SLOT(slotResult(KIO::Job *)));
+ }
+}
+
+void SVGScriptElementImpl::slotData(KIO::Job *, const QByteArray &data)
+{
+ QDataStream dataStream(m_data, IO_WriteOnly | IO_Append);
+ dataStream.writeRawBytes(data.data(), data.size());
+}
+
+void SVGScriptElementImpl::slotResult(KIO::Job *)
+{
+ m_job = 0;
+
+ // Append a NULL terminator so we don't die
+ m_data.resize(m_data.size() + 1);
+ m_data[m_data.size() - 1] = '\0';
+
+ QBuffer buf(m_data);
+ QIODevice *dev = KFilterDev::device(&buf, "application/x-gzip", false);
+ QByteArray contents;
+ if(dev->open(IO_ReadOnly))
+ contents = dev->readAll();
+ delete dev;
+ m_text = QString::fromUtf8(contents.data());
+
+ m_data.resize(0);
+}
+
+bool SVGScriptElementImpl::canExecuteScript()
+{
+ if(!m_added)
+ {
+ m_added = true;
+ m_text += collectText();
+ }
+
+ if(m_text.isEmpty() && !getAttribute("href").isNull() && !getAttribute("href").string().isEmpty())
+ return false;
+
+ return true;
+}
+
+bool SVGScriptElementImpl::executeScript(DOM::Node node)
+{
+ return SVGScriptElementImpl::executeScript(node, ownerDoc(), m_text);
+}
+
+bool SVGScriptElementImpl::executeScript(DOM::Node node, SVGDocumentImpl *document, const QString &text)
+{
+#ifdef KJS_VERBOSE
+ kdDebug(6070) << "SVGScriptElementImpl::executeScript n=" << node.nodeName().string().latin1() << "(" << (node.isNull() ? 0 : node.nodeType()) << ") " << text << endl;
+#endif
+ KSVGEcma *ecmaEngine = document->ecmaEngine();
+
+ if(!ecmaEngine->initialized())
+ ecmaEngine->setup();
+
+ KJS::Value thisNode = node.isNull() ? ecmaEngine->globalObject() : getDOMNode(ecmaEngine->globalExec(), node);
+
+ KJS::UString code(text);
+ KJS::Completion comp = ecmaEngine->evaluate(code, thisNode);
+
+ // TODO: If that's needed find a better solution which
+ // doesn't cause endless loops if the func, specified in
+ // onerror="..." isn't yet available
+ // onerror support
+// if(comp.complType() == Throw)
+// document->rootElement()->dispatchEvent(SVGEventImpl::ERROR_EVENT, false, false);
+
+ return (comp.complType() == KJS::Normal) || (comp.complType() == KJS::ReturnValue);
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGScriptElementImpl::s_hashTable 2
+ type SVGScriptElementImpl::Type DontDelete
+@end
+*/
+
+Value SVGScriptElementImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case Type:
+ return String(type());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGScriptElementImpl::putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case Type:
+ setType(value.toString(exec).string());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGScriptElementImpl.h b/ksvg/impl/SVGScriptElementImpl.h
new file mode 100644
index 00000000..95affee2
--- /dev/null
+++ b/ksvg/impl/SVGScriptElementImpl.h
@@ -0,0 +1,90 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGScriptElementImpl_H
+#define SVGScriptElementImpl_H
+
+#include <dom/dom_string.h>
+
+#include <kio/jobclasses.h>
+
+#include <qobject.h>
+
+#include "SVGElementImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGScriptElementImpl : public QObject,
+ public SVGElementImpl,
+ public SVGURIReferenceImpl,
+ public SVGExternalResourcesRequiredImpl
+{
+Q_OBJECT
+public:
+ SVGScriptElementImpl(DOM::ElementImpl *);
+ virtual ~SVGScriptElementImpl();
+
+ void setType(const DOM::DOMString &type);
+ DOM::DOMString type() const;
+
+ virtual void setAttributes();
+
+ bool canExecuteScript();
+ bool executeScript(DOM::Node node);
+
+ static bool executeScript(DOM::Node node, SVGDocumentImpl *document, const QString &text);
+
+private slots:
+ void slotData(KIO::Job *, const QByteArray &);
+ void slotResult(KIO::Job *);
+
+private:
+ KIO::TransferJob *m_job;
+ QByteArray m_data;
+ QString m_text;
+ bool m_added;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ Type
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGScriptElementImpl, "script")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGSetElementImpl.cc b/ksvg/impl/SVGSetElementImpl.cc
new file mode 100644
index 00000000..66460db9
--- /dev/null
+++ b/ksvg/impl/SVGSetElementImpl.cc
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGDocumentImpl.h"
+#include "SVGSetElementImpl.h"
+
+using namespace KSVG;
+
+SVGSetElementImpl::SVGSetElementImpl(DOM::ElementImpl *impl) : SVGAnimationElementImpl(impl)
+{
+}
+
+SVGSetElementImpl::~SVGSetElementImpl()
+{
+}
+
+void SVGSetElementImpl::setAttributes()
+{
+ SVGAnimationElementImpl::setAttributes();
+
+ // Always create singleShot timers when used by <set> (Niko)
+ // Those are automatically deleted by the scheduler after timeout.
+ ownerDoc()->timeScheduler()->addTimer(this, int(getStartTime() * 1000.0));
+}
+
+void SVGSetElementImpl::handleTimerEvent()
+{
+ applyAttribute(getAttributeName(), getTo());
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGSetElementImpl.h b/ksvg/impl/SVGSetElementImpl.h
new file mode 100644
index 00000000..ab9f5ec5
--- /dev/null
+++ b/ksvg/impl/SVGSetElementImpl.h
@@ -0,0 +1,54 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGSetElementImpl_H
+#define SVGSetElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGAnimationElementImpl.h"
+
+class QTimer;
+
+namespace KSVG
+{
+
+class SVGSetElementImpl : public SVGAnimationElementImpl
+{
+public:
+ SVGSetElementImpl(DOM::ElementImpl *);
+ virtual ~SVGSetElementImpl();
+
+ virtual void handleTimerEvent();
+ virtual void setAttributes();
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGSetElementImpl, "set")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGShapeImpl.cc b/ksvg/impl/SVGShapeImpl.cc
new file mode 100644
index 00000000..68e89aaa
--- /dev/null
+++ b/ksvg/impl/SVGShapeImpl.cc
@@ -0,0 +1,162 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGPaint.h"
+
+#include "SVGRectImpl.h"
+#include "SVGEventImpl.h"
+#include "SVGShapeImpl.h"
+#include "SVGPaintImpl.h"
+#include "SVGMatrixImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGClipPathElementImpl.h"
+#include "SVGAnimatedLengthListImpl.h"
+
+#include "CanvasItem.h"
+#include "KSVGCanvas.h"
+
+using namespace KSVG;
+
+SVGShapeImpl::SVGShapeImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+ m_item = 0;
+}
+
+SVGShapeImpl::~SVGShapeImpl()
+{
+ if(hasChildNodes())
+ {
+ DOM::Node node = firstChild();
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGShapeImpl *rend = dynamic_cast<SVGShapeImpl *>(ownerDoc()->getElementFromHandle(node.handle()));
+ if(rend)
+ rend->deref();
+ }
+ }
+}
+
+bool SVGShapeImpl::directRender()
+{
+ SVGShapeImpl *parent = dynamic_cast<SVGShapeImpl *>(ownerDoc()->getElementFromHandle(parentNode().handle()));
+ if(parent)
+ return parent->directRender();
+ else
+ return true;
+}
+
+SVGRectImpl *SVGShapeImpl::getBBox()
+{
+ SVGRectImpl *rect = SVGSVGElementImpl::createSVGRect();
+ return rect;
+}
+
+SVGRectImpl *SVGShapeImpl::getBBoxInternal()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+ if(m_item)
+ {
+ QRect r = m_item->bbox();
+ ret->setX(r.x());
+ ret->setY(r.y());
+ ret->setWidth(r.width());
+ ret->setHeight(r.height());
+ }
+ return ret;
+}
+
+bool SVGShapeImpl::prepareMouseEvent(const QPoint &p, const QPoint &, SVGMouseEventImpl *mev)
+{
+ // TODO : pointer-events should be stored here, not in SVGStylableImpl.
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(this);
+ if(!style || style->getPointerEvents() == PE_NONE)
+ return false;
+ bool testFill = false;
+ bool testStroke = false;
+ switch(style->getPointerEvents())
+ {
+ case PE_VISIBLE: testFill = testStroke = style->getVisible(); break;
+ case PE_VISIBLE_PAINTED: testStroke = style->getVisible() && style->isStroked();
+ case PE_VISIBLE_FILL: testFill = style->getVisible() && style->isFilled(); break;
+ case PE_VISIBLE_STROKE: testStroke = style->getVisible() && style->isStroked(); break;
+ case PE_PAINTED: testStroke = style->isStroked();
+ case PE_FILL: testFill = style->isFilled(); break;
+ case PE_STROKE: testStroke = style->isStroked(); break;
+ case PE_ALL:
+ default: testFill = testStroke = true;
+ };
+
+ if(testFill || testStroke)
+ {
+ if((testFill && m_item->fillContains(p)) || (testStroke && m_item->strokeContains(p)))
+ {
+ mev->setTarget(this);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void SVGShapeImpl::update(CanvasItemUpdate reason, int param1, int param2)
+{
+ if(m_item)
+ m_item->update(reason, param1, param2);
+}
+
+void SVGShapeImpl::invalidate(KSVGCanvas *c, bool recalc)
+{
+ if(m_item && c)
+ c->invalidate(m_item, recalc);
+}
+
+void SVGShapeImpl::setReferenced(bool referenced)
+{
+ if(m_item)
+ m_item->setReferenced(referenced);
+}
+
+void SVGShapeImpl::draw()
+{
+ if(m_item)
+ m_item->draw();
+}
+
+void SVGShapeImpl::blit(KSVGCanvas *c)
+{
+ SVGRectImpl *rect = getBBoxInternal();
+ c->blit(rect->qrect(), true);
+ rect->deref();
+}
+
+void SVGShapeImpl::removeItem(KSVGCanvas *c)
+{
+ if(m_item && c)
+ {
+ c->removeItem(m_item);
+ m_item = 0;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGShapeImpl.h b/ksvg/impl/SVGShapeImpl.h
new file mode 100644
index 00000000..ae183251
--- /dev/null
+++ b/ksvg/impl/SVGShapeImpl.h
@@ -0,0 +1,73 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGShapeImpl_H
+#define SVGShapeImpl_H
+
+#include "SVGElementImpl.h"
+#include "CanvasItem.h"
+
+class QPoint;
+
+namespace KSVG
+{
+
+class KSVGCanvas;
+
+class SVGRectImpl;
+class SVGMouseEventImpl;
+
+class SVGShapeImpl : public SVGElementImpl
+{
+public:
+ SVGShapeImpl(DOM::ElementImpl *);
+ virtual ~SVGShapeImpl();
+
+ virtual SVGRectImpl *getBBox();
+ virtual SVGRectImpl *getBBoxInternal();
+
+ virtual bool prepareMouseEvent(const QPoint &p, const QPoint &a, SVGMouseEventImpl *mev);
+
+ virtual bool directRender();
+ virtual bool isContainer() const { return false; }
+
+ virtual void update(CanvasItemUpdate reason, int param1 = 0, int param2 = 0);
+ virtual void invalidate(KSVGCanvas *c, bool recalc);
+ virtual void setReferenced(bool referenced);
+ virtual void draw();
+ virtual void blit(KSVGCanvas *);
+
+ virtual void removeItem(KSVGCanvas *c);
+
+ CanvasItem *item() { return m_item; }
+
+protected:
+ CanvasItem *m_item;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGStopElementImpl.cc b/ksvg/impl/SVGStopElementImpl.cc
new file mode 100644
index 00000000..09761232
--- /dev/null
+++ b/ksvg/impl/SVGStopElementImpl.cc
@@ -0,0 +1,125 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include "SVGLengthImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGStopElementImpl.h"
+#include "SVGAnimatedNumberImpl.h"
+#include "SVGColorImpl.h"
+
+using namespace KSVG;
+
+#include "SVGStopElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGStopElementImpl::SVGStopElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGStylableImpl(this)
+{
+ KSVG_EMPTY_FLAGS
+
+ m_offset = new SVGAnimatedNumberImpl();
+ m_offset->ref();
+
+ m_stopOpacity = 1;
+}
+
+SVGStopElementImpl::~SVGStopElementImpl()
+{
+ if(m_offset)
+ m_offset->deref();
+}
+
+SVGAnimatedNumberImpl *SVGStopElementImpl::offset() const
+{
+ return m_offset;
+}
+
+float SVGStopElementImpl::stopOpacity() const
+{
+ return m_stopOpacity;
+}
+
+
+/*
+@namespace KSVG
+@begin SVGStopElementImpl::s_hashTable 3
+ offset SVGStopElementImpl::Offset DontDelete|ReadOnly
+ stop-opacity SVGStopElementImpl::StopOpacity DontDelete|ReadOnly
+@end
+*/
+
+Value SVGStopElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case Offset:
+ if(!attributeMode)
+ return m_offset->cache(exec);
+ else
+ return Number(m_offset->baseVal());
+ case StopOpacity:
+ if(!attributeMode)
+ return Undefined();
+ else
+ return Number(m_stopOpacity);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGStopElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case Offset:
+ float temp;
+ SVGLengthImpl::convertPercentageToFloat(value.toString(exec).qstring(), temp);
+ offset()->setBaseVal(temp);
+ break;
+ case StopOpacity:
+ {
+ SVGLengthImpl::convertPercentageToFloat(value.toString(exec).qstring(), m_stopOpacity);
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+void SVGStopElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if not set, specifiy 0
+ if(KSVG_TOKEN_NOT_PARSED(Offset))
+ KSVG_SET_ALT_ATTRIBUTE(Offset, "0")
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGStopElementImpl.h b/ksvg/impl/SVGStopElementImpl.h
new file mode 100644
index 00000000..369b7867
--- /dev/null
+++ b/ksvg/impl/SVGStopElementImpl.h
@@ -0,0 +1,70 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGStopElementImpl_H
+#define SVGStopElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedNumberImpl;
+class SVGStopElementImpl : public SVGElementImpl,
+ public SVGStylableImpl
+{
+public:
+ SVGStopElementImpl(DOM::ElementImpl *);
+ virtual ~SVGStopElementImpl();
+
+ SVGAnimatedNumberImpl *offset() const;
+ float stopOpacity() const;
+
+ virtual void setAttributes();
+
+private:
+ SVGAnimatedNumberImpl *m_offset;
+ float m_stopOpacity;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ Offset, StopOpacity
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGStopElementImpl, "stop")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGStringListImpl.cc b/ksvg/impl/SVGStringListImpl.cc
new file mode 100644
index 00000000..b70adfdd
--- /dev/null
+++ b/ksvg/impl/SVGStringListImpl.cc
@@ -0,0 +1,93 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGStringListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGStringListImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SharedString::s_hashTable 2
+ dummy SharedString::Dummy DontDelete|ReadOnly
+@end
+*/
+
+/*
+@namespace KSVG
+@begin SVGStringListImpl::s_hashTable 2
+ numberOfItems SVGListDefs::NumberOfItems DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGStringListImplProto::s_hashTable 11
+ getItem SVGListDefs::GetItem DontDelete|Function 1
+ removeItem SVGListDefs::RemoveItem DontDelete|Function 1
+ appendItem SVGListDefs::AppendItem DontDelete|Function 1
+ initialize SVGListDefs::Initialize DontDelete|Function 1
+ insertItemBefore SVGListDefs::InsertItemBefore DontDelete|Function 2
+ replaceItem SVGListDefs::ReplaceItem DontDelete|Function 2
+ clear SVGListDefs::Clear DontDelete|Function 0
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGStringList", SVGStringListImplProto, SVGStringListImplProtoFunc)
+
+Value SVGStringListImpl::getValueProperty(ExecState *exec, int token) const
+{
+ return SVGList<SharedString>::getValueProperty(exec, token);
+}
+
+Value SVGStringListImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGStringListImpl)
+
+ return obj->call(exec, static_cast<SVGList<SharedString> *>(obj), args, id);
+}
+
+QString SVGStringListImpl::join(const QString &seperator) const
+{
+ SVGStringListImpl *self = const_cast<SVGStringListImpl *>(this);
+
+ QString result;
+
+ if(!self->getItem(0))
+ return result;
+ else
+ result += self->getItem(0)->string();
+
+ for(unsigned int i = 1; i <= numberOfItems(); i++)
+ {
+ DOM::DOMString *string = self->getItem(i);
+
+ if(string)
+ result += seperator + string->string();
+ }
+
+ return result;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGStringListImpl.h b/ksvg/impl/SVGStringListImpl.h
new file mode 100644
index 00000000..7f69a3c9
--- /dev/null
+++ b/ksvg/impl/SVGStringListImpl.h
@@ -0,0 +1,82 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGStringListImpl_H
+#define SVGStringListImpl_H
+
+#include <dom/dom_string.h>
+
+#include "SVGList.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SharedString : public DOM::DomShared,
+ public DOM::DOMString
+{
+public:
+ SharedString() : DOM::DomShared(), DOM::DOMString() { }
+ SharedString(const QString &string) : DOM::DomShared(), DOM::DOMString(string) { }
+ SharedString(const SharedString &string) : DOM::DomShared(), DOM::DOMString(string) { }
+ SharedString(DOM::DOMString *string) : DOM::DomShared(), DOM::DOMString(string->implementation()) { }
+ virtual ~SharedString() { }
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ Dummy
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const
+ {
+ switch(token)
+ {
+ case Dummy:
+ return KJS::Undefined();
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return KJS::Undefined();
+ }
+ }
+};
+
+class SVGStringListImpl : public SVGList<SharedString>
+{
+public:
+ KSVG_GET
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+
+ QString join(const QString &seperator) const;
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGStringListImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGStringListImplProtoFunc, SVGStringListImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGStylableImpl.cc b/ksvg/impl/SVGStylableImpl.cc
new file mode 100644
index 00000000..096ebf93
--- /dev/null
+++ b/ksvg/impl/SVGStylableImpl.cc
@@ -0,0 +1,1309 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qrect.h>
+
+#include "CanvasItem.h"
+#include "KSVGCanvas.h"
+
+#include "SVGPaint.h"
+#include "SVGColorImpl.h"
+#include "SVGPaintImpl.h"
+#include "SVGHelperImpl.h"
+#include "SVGLengthImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGStringListImpl.h"
+#include "SVGImageElementImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGColorProfileElementImpl.h"
+#include "SVGAnimatedLengthListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGStylableImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGStylableImpl::SVGStylableImpl(SVGElementImpl *object) : m_object(object)
+{
+ KSVG_EMPTY_FLAGS
+
+ // View propidx.html, if you want to verify those default values (Niko)
+ m_flags = SVG_STYLE_FLAG_NONE;
+
+ // Initialize all pointers to 0
+ // Important!
+ m_color = 0;
+ m_fillColor = 0;
+ m_stopColor = 0;
+ m_dashArray = 0;
+ m_dashOffset = 0;
+ m_strokeWidth = 0;
+ m_strokeColor = 0;
+ m_fontFamily = 0;
+
+ m_fillOpacity = 1;
+ m_strokeOpacity = 1;
+ m_opacity = 1;
+
+ // Special case, getFontSize() could be accessed
+ // _before_ processStyle() is called -> no default
+ // value for font-size yet -> crash
+ // SVGLengthImpl access it when parsing em/ex values (Niko)
+ m_fontSize = -1;
+}
+
+SVGStylableImpl::~SVGStylableImpl()
+{
+ if(m_strokeWidth)
+ m_strokeWidth->deref();
+ if(m_fontFamily)
+ m_fontFamily->deref();
+ if(m_strokeColor)
+ m_strokeColor->deref();
+ if(m_fillColor)
+ m_fillColor->deref();
+ if(m_color)
+ m_color->deref();
+ if(m_stopColor)
+ m_stopColor->deref();
+ if(m_dashOffset)
+ m_dashOffset->deref();
+ if(m_dashArray)
+ m_dashArray->deref();
+}
+
+void SVGStylableImpl::processStyle()
+{
+ SVGStylableImpl *parentStyle = 0;
+ if(m_object && m_object->ownerDoc())
+ parentStyle = dynamic_cast<SVGStylableImpl *>(m_object->ownerDoc()->getElementFromHandle((*m_object).parentNode().handle()));
+
+ // Spec: default "none"
+ if(~m_flags & SVG_STYLE_FLAG_STROKE)
+ {
+ m_strokeColor = new SVGPaintImpl(m_object);
+ m_strokeColor->ref();
+
+ SVGPaintImpl *strokeColor = 0L;
+ if(parentStyle)
+ strokeColor = parentStyle->getStrokeColor();
+
+ if(strokeColor)
+ *m_strokeColor = *strokeColor;
+ else
+ m_strokeColor->setPaint(SVG_PAINTTYPE_NONE);
+ }
+
+ // Spec: default "black"
+ if(~m_flags & SVG_STYLE_FLAG_FILL)
+ {
+ m_fillColor = new SVGPaintImpl(m_object);
+ m_fillColor->ref();
+
+ SVGPaintImpl *fillColor = 0;
+ if(parentStyle)
+ fillColor = parentStyle->getFillColor();
+
+ if(fillColor)
+ *m_fillColor = *fillColor;
+ else
+ m_fillColor->setRGBColor(DOM::DOMString("black"));
+ }
+
+ // Spec: no real default
+ if(~m_flags & SVG_STYLE_FLAG_COLOR)
+ {
+ m_color = new SVGColorImpl(m_object);
+ m_color->ref();
+ SVGColorImpl *color = 0;
+ if(parentStyle)
+ color = parentStyle->getColor();
+
+ if(color)
+ *m_color = *color;
+ }
+
+ // Spec: default sRGB
+ if(~m_flags & SVG_STYLE_FLAG_COLOR_INTERPOLATION)
+ {
+ if(parentStyle)
+ m_colorInterpolation = parentStyle->getColorInterpolation();
+ else
+ m_colorInterpolation = CI_SRGB;
+ }
+
+ // Spec: default "1"
+ if(~m_flags & SVG_STYLE_FLAG_STROKE_WIDTH)
+ {
+ m_strokeWidth = new SVGAnimatedLengthImpl(LENGTHMODE_OTHER, m_object);
+ m_strokeWidth->ref();
+
+ SVGAnimatedLengthImpl *strokeWidth = 0;
+ if(parentStyle)
+ strokeWidth = parentStyle->getStrokeWidth();
+
+ if(strokeWidth)
+ *m_strokeWidth = *strokeWidth;
+ else
+ m_strokeWidth->baseVal()->setValue(1.0);
+ }
+
+ // Spec: default "4"
+ if(~m_flags & SVG_STYLE_FLAG_STROKE_MITER_LIMIT)
+ {
+ if(parentStyle)
+ m_strokeMiterlimit = parentStyle->getStrokeMiterlimit();
+ else
+ m_strokeMiterlimit = 4;
+ }
+
+ // Spec: default "butt"
+ if(~m_flags & SVG_STYLE_FLAG_STROKE_LINE_CAP)
+ {
+ if(parentStyle)
+ m_capStyle = parentStyle->getCapStyle();
+ else
+ m_capStyle = PATH_STROKE_CAP_BUTT;
+ }
+
+ // Spec: default "miter"
+ if(~m_flags & SVG_STYLE_FLAG_STROKE_LINE_JOIN)
+ {
+ if(parentStyle)
+ m_joinStyle = parentStyle->getJoinStyle();
+ else
+ m_joinStyle = PATH_STROKE_JOIN_MITER;
+ }
+
+ // Spec: default "auto"
+ if(~m_flags & SVG_STYLE_FLAG_CURSOR)
+ {
+ if(parentStyle)
+ m_cursor = parentStyle->getCursor();
+ else
+ m_cursor = CURSOR_AUTO;
+ }
+
+ // Spec: default "visiblePainted"
+ if(~m_flags & SVG_STYLE_FLAG_POINTER_EVENTS)
+ {
+ if(parentStyle)
+ m_pointerEvents = parentStyle->getPointerEvents();
+ else
+ m_pointerEvents = PE_VISIBLE_PAINTED;
+ }
+
+ // Spec: default "0"
+ if(~m_flags & SVG_STYLE_FLAG_STROKE_DASH_OFFSET)
+ {
+ m_dashOffset = new SVGAnimatedLengthImpl(LENGTHMODE_OTHER, m_object);
+ m_dashOffset->ref();
+
+ SVGAnimatedLengthImpl *dashOffset = 0;
+ if(parentStyle)
+ dashOffset = parentStyle->getDashOffset();
+
+ if(dashOffset)
+ *m_dashOffset = *dashOffset;
+ else
+ m_dashOffset->baseVal()->setValue(0);
+ }
+
+ // Spec: default "none" -> 0 == empty dash array
+ if(~m_flags & SVG_STYLE_FLAG_STROKE_DASH_ARRAY)
+ {
+ SVGAnimatedLengthListImpl *dashArray = 0;
+ if(parentStyle)
+ dashArray = parentStyle->getDashArray();
+
+ if(dashArray)
+ {
+ if (!m_dashArray)
+ {
+ m_dashArray = new SVGAnimatedLengthListImpl();
+ m_dashArray->ref();
+ }
+ *m_dashArray = *dashArray;
+ }
+ else
+ m_dashArray = 0;
+ }
+
+ // Spec: default "1" -> 1 == Not opaque
+ if(~m_flags & SVG_STYLE_FLAG_FILL_OPACITY)
+ {
+ if(parentStyle)
+ m_fillOpacity = parentStyle->getFillOpacity();
+ else
+ m_fillOpacity = 1;
+ }
+
+ if(~m_flags & SVG_STYLE_FLAG_STROKE_OPACITY)
+ {
+ if(parentStyle)
+ m_strokeOpacity = parentStyle->getStrokeOpacity();
+ else
+ m_strokeOpacity = 1;
+ }
+
+ // Fake group opacity by multiplying by our parent's group opacity
+ if(~m_flags & SVG_STYLE_FLAG_OPACITY)
+ {
+ if(parentStyle)
+ m_opacity = parentStyle->getOpacity();
+ else
+ m_opacity = 1;
+ }
+ else
+ if(parentStyle)
+ m_opacity *= parentStyle->getOpacity();
+
+ if(~m_flags & SVG_STYLE_FLAG_CLIP_PATH)
+ m_clipPath = "";
+
+ if(~m_flags & SVG_STYLE_FLAG_MASK)
+ m_mask = "";
+
+ // Spec: default "nonzero"
+ if(~m_flags & SVG_STYLE_FLAG_FILL_RULE)
+ {
+ if(parentStyle)
+ m_fillRule = parentStyle->getFillRule();
+ else
+ m_fillRule = RULE_NONZERO;
+ }
+
+ if(~m_flags & SVG_STYLE_FLAG_CLIP_RULE)
+ {
+ if(parentStyle)
+ m_clipRule = parentStyle->getClipRule();
+ else
+ m_clipRule = RULE_NONZERO;
+ }
+
+ // Spec: default "hidden"
+ if(~m_flags & SVG_STYLE_FLAG_OVERFLOW)
+ {
+ if(parentStyle)
+ m_overflow = parentStyle->getOverflow();
+ else
+ m_overflow = false;
+ }
+
+ // We are not really, spec compatible here, we just
+ // define a bool, to indicate wheter an element should
+ // be rendered or not.
+ if(~m_flags & SVG_STYLE_FLAG_DISPLAY)
+ m_display = true;
+
+ if(~m_flags & SVG_STYLE_FLAG_VISIBILITY)
+ {
+ if(parentStyle)
+ m_visible = parentStyle->getVisible();
+ else
+ m_visible = true;
+ }
+
+ // Spec: default "medium"
+ if(~m_flags & SVG_STYLE_FLAG_FONT_SIZE)
+ {
+ if(parentStyle)
+ m_fontSize = parentStyle->getFontSize();
+ else
+ m_fontSize = fontSizeForText("medium");
+ }
+
+ // Spec: default "depends on user agent" -> "Arial" for SVG
+ if(~m_flags & SVG_STYLE_FLAG_FONT_FAMILY)
+ {
+ if(!m_fontFamily)
+ {
+ m_fontFamily = new SVGStringListImpl();
+ m_fontFamily->ref();
+ }
+
+ SVGStringListImpl *fontFamily = 0;
+ if(parentStyle)
+ fontFamily = parentStyle->getFontFamily();
+
+ if(fontFamily)
+ *m_fontFamily = *fontFamily;
+ else
+ {
+ SharedString *string = new SharedString("Arial");
+ string->ref();
+
+ m_fontFamily->appendItem(string);
+ }
+ }
+
+ // Spec: default "normal"
+ if(~m_flags & SVG_STYLE_FLAG_FONT_STYLE)
+ {
+ if(parentStyle)
+ m_fontStyle = parentStyle->getFontStyle();
+ else
+ m_fontStyle = FSNORMAL;
+ }
+
+ // Spec: default "normal"
+ if(~m_flags & SVG_STYLE_FLAG_FONT_WEIGHT)
+ {
+ if(parentStyle)
+ m_fontWeight = parentStyle->getFontWeight();
+ else
+ m_fontWeight = "normal";
+ }
+
+ // Spec: default "start"
+ if(~m_flags & SVG_STYLE_FLAG_TEXT_ANCHOR)
+ {
+ if(parentStyle)
+ m_textAnchor = parentStyle->getTextAnchor();
+ else
+ m_textAnchor = TASTART;
+ }
+
+ // Spec: default "LTR"
+ if(~m_flags & SVG_STYLE_FLAG_TEXT_DIRECTION)
+ {
+ if(parentStyle)
+ m_textDirection = parentStyle->getTextDirection();
+ else
+ m_textDirection = LTR;
+ }
+
+ // Spec: default "none"
+ if(~m_flags & SVG_STYLE_FLAG_TEXT_DECORATION)
+ {
+ if(parentStyle)
+ m_textDecoration = parentStyle->getTextDecoration();
+ else
+ m_textDecoration = TDNONE;
+ }
+
+ // Spec: default "baseline"
+ if(~m_flags & SVG_STYLE_FLAG_BASELINE_SHIFT)
+ {
+ if(parentStyle)
+ m_baselineShift = parentStyle->getBaselineShift();
+ else
+ m_baselineShift = "baseline";
+ }
+
+ // Spec: default "lr-tb", FIXME
+ if(~m_flags & SVG_STYLE_FLAG_TEXT_WRITING_MODE)
+ {
+ if(parentStyle)
+ m_textWritingMode = parentStyle->getTextWritingMode();
+ else
+ m_textWritingMode = LR;
+ }
+
+ // Spec: default "normal"
+ if(~m_flags & SVG_STYLE_FLAG_TEXT_UNICODE_BIDI)
+ {
+ if(parentStyle)
+ m_textUnicodeBidi = parentStyle->getTextUnicodeBidi();
+ else
+ m_textUnicodeBidi = UBNORMAL;
+ }
+
+ // Spec: default "auto"
+ if(~m_flags & SVG_STYLE_FLAG_GLYPH_ORIENTATION_VERTICAL)
+ {
+ if(parentStyle)
+ m_glyphOrientationVertical = parentStyle->getGlyphOrientationVertical();
+ else
+ m_glyphOrientationVertical = "auto";
+ }
+
+ // Spec: default "auto"
+ if(~m_flags & SVG_STYLE_FLAG_GLYPH_ORIENTATION_HORIZONTAL)
+ {
+ if(parentStyle)
+ m_glyphOrientationHorizontal = parentStyle->getGlyphOrientationHorizontal();
+ else
+ m_glyphOrientationHorizontal = "auto";
+ }
+
+ // Spec: default "normal"
+ if(~m_flags & SVG_STYLE_FLAG_LETTER_SPACING)
+ {
+ if(parentStyle)
+ m_letterSpacing = parentStyle->getLetterSpacing();
+ else
+ m_letterSpacing = "normal";
+ }
+
+ // Spec: default "normal"
+ if(~m_flags & SVG_STYLE_FLAG_WORD_SPACING)
+ {
+ if(parentStyle)
+ m_wordSpacing = parentStyle->getWordSpacing();
+ else
+ m_wordSpacing = "normal";
+ }
+
+ // Spec: default "black"
+ if(~m_flags & SVG_STYLE_FLAG_STOP)
+ {
+ m_stopColor = new SVGColorImpl(m_object);
+ m_stopColor->ref();
+
+ m_stopColor->setRGBColor(DOM::DOMString("black"));
+ }
+
+ // Spec: default "none"
+ if(~m_flags & SVG_STYLE_FLAG_MARKER_START)
+ {
+ if(parentStyle)
+ m_startMarker = parentStyle->getStartMarker();
+ else
+ m_startMarker = QString::null;
+ }
+
+ // Spec: default "none"
+ if(~m_flags & SVG_STYLE_FLAG_MARKER_MID)
+ {
+ if(parentStyle)
+ m_midMarker = parentStyle->getMidMarker();
+ else
+ m_midMarker = QString::null;
+ }
+
+ // Spec: default "none"
+ if(~m_flags & SVG_STYLE_FLAG_MARKER_END)
+ {
+ if(parentStyle)
+ m_endMarker = parentStyle->getEndMarker();
+ else
+ m_endMarker = QString::null;
+ }
+}
+
+bool SVGStylableImpl::isStroked() const
+{
+ if(!m_strokeColor)
+ return false;
+
+ return m_strokeColor->paintType() != SVG_PAINTTYPE_UNKNOWN &&
+ m_strokeColor->paintType() != SVG_PAINTTYPE_NONE &&
+ m_strokeColor->paintType() != SVG_PAINTTYPE_URI_NONE;
+}
+
+bool SVGStylableImpl::isFilled() const
+{
+ if(!m_fillColor)
+ return false;
+
+ return m_fillColor->paintType() != SVG_PAINTTYPE_UNKNOWN &&
+ m_fillColor->paintType() != SVG_PAINTTYPE_NONE &&
+ m_fillColor->paintType() != SVG_PAINTTYPE_URI_NONE;
+}
+
+QString SVGStylableImpl::extractUrlId(const QString &url)
+{
+ QString id;
+
+ if(url.startsWith("url(#"))
+ {
+ int idstart = url.find("#") + 1;
+ id = url.mid(idstart, url.length() - idstart - 1);
+ }
+ else
+ id = url;
+
+ return id;
+}
+
+void SVGStylableImpl::setMarkers(const QString &marker)
+{
+ setStartMarker(marker);
+ setMidMarker(marker);
+ setEndMarker(marker);
+}
+
+void SVGStylableImpl::setStartMarker(const QString &startMarker)
+{
+ if(startMarker.startsWith("url(#"))
+ {
+ int idstart = startMarker.find("#") + 1;
+ m_startMarker = startMarker.mid(idstart, startMarker.length() - idstart - 1);
+ }
+ else if(startMarker == "none")
+ m_startMarker = QString::null;
+}
+
+void SVGStylableImpl::setMidMarker(const QString &midMarker)
+{
+ if(midMarker.startsWith("url(#"))
+ {
+ int idstart = midMarker.find("#") + 1;
+ m_midMarker = midMarker.mid(idstart, midMarker.length() - idstart - 1);
+ }
+ else if(midMarker == "none")
+ m_midMarker = QString::null;
+}
+
+void SVGStylableImpl::setEndMarker(const QString &endMarker)
+{
+ if(endMarker.startsWith("url(#"))
+ {
+ int idstart = endMarker.find("#") + 1;
+ m_endMarker = endMarker.mid(idstart, endMarker.length() - idstart - 1);
+ }
+ else if(endMarker == "none")
+ m_endMarker = QString::null;
+}
+
+bool SVGStylableImpl::hasMarkers() const
+{
+ return !m_startMarker.isEmpty() || !m_midMarker.isEmpty() || !m_endMarker.isEmpty();
+}
+
+void SVGStylableImpl::setPaint(const QString &param, SVGPaintImpl *svgPaint)
+{
+ if(param.stripWhiteSpace() == "none")
+ svgPaint->setPaint(SVG_PAINTTYPE_NONE, DOM::DOMString(""), DOM::DOMString(""));
+ else if(SVGURIReferenceImpl::isUrl(param))
+ svgPaint->setUri(SVGURIReferenceImpl::getTarget(param));
+ else
+ setColor(param, svgPaint);
+}
+
+void SVGStylableImpl::setColor(const QString &param, SVGColorImpl *svgColor)
+{
+ if(param.stripWhiteSpace().startsWith("#"))
+ {
+ if(param.contains("icc-color"))
+ {
+ QString first = param.left(7);
+ QString last = param.right(param.length() - 8);
+
+ svgColor->setRGBColorICCColor(first, last);
+ }
+ else
+ {
+ QColor color;
+ color.setNamedColor(param.stripWhiteSpace());
+ svgColor->setRGBColor(color);
+ }
+ }
+ else if(param.stripWhiteSpace().startsWith("rgb("))
+ {
+ QString parse = param.stripWhiteSpace();
+ QStringList colors = QStringList::split(',', parse);
+ QString r = colors[0].right((colors[0].length() - 4));
+ QString g = colors[1];
+ QString b = colors[2].left((colors[2].length() - 1));
+
+ if(r.contains("%"))
+ {
+ r = r.left(r.length() - 1);
+ r = QString::number(int((double(255 * r.toDouble()) / 100.0)));
+ }
+
+ if(g.contains("%"))
+ {
+ g = g.left(g.length() - 1);
+ g = QString::number(int((double(255 * g.toDouble()) / 100.0)));
+ }
+
+ if(b.contains("%"))
+ {
+ b = b.left(b.length() - 1);
+ b = QString::number(int((double(255 * b.toDouble()) / 100.0)));
+ }
+
+ svgColor->setRGBColor(int(r.toFloat()), int(g.toFloat()), int(b.toFloat()));
+ }
+ else
+ {
+ if(param.stripWhiteSpace().lower() == "currentcolor")
+ svgColor->setColor(SVG_COLORTYPE_CURRENTCOLOR, DOM::DOMString(""), DOM::DOMString(""));
+ else
+ svgColor->setRGBColor(DOM::DOMString(param.stripWhiteSpace().lower()));
+ }
+}
+
+QRect SVGStylableImpl::clip()
+{
+ return QRect();
+}
+
+void SVGStylableImpl::setClip(const QString &)
+{
+}
+
+float SVGStylableImpl::fontSizeForText(const QString &value)
+{
+ float ret = -1;
+
+ // Spec: "On a computer screen a scaling factor of 1.2 is suggested between adjacent indexes"
+ const float factor = 1.2;
+
+ // Spec: "If the 'medium' font is 12pt, the 'large' font could be 14.4pt."
+ const float mediumFont = 12.0;
+
+ if(value == "xx-small")
+ ret = mediumFont - (3.0 * factor);
+ else if(value == "x-small")
+ ret = mediumFont - (2.0 * factor);
+ else if(value == "small")
+ ret = mediumFont - factor;
+ else if(value == "medium")
+ ret = mediumFont;
+ else if(value == "large")
+ ret = mediumFont + factor;
+ else if(value == "x-large")
+ ret = mediumFont + (2.0 * factor);
+ else if(value == "xx-large")
+ ret = mediumFont + (3.0 * factor);
+
+ return ret;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGStylableImpl::s_hashTable 47
+ className SVGStylableImpl::ClassName DontDelete|ReadOnly
+ style SVGStylableImpl::Style DontDelete|ReadOnly
+ stroke-width SVGStylableImpl::StrokeWidth DontDelete|ReadOnly
+ stroke-miterlimit SVGStylableImpl::StrokeMiterlimit DontDelete|ReadOnly
+ stroke-linecap SVGStylableImpl::StrokeLineCap DontDelete|ReadOnly
+ stroke-linejoin SVGStylableImpl::StrokeLineJoin DontDelete|ReadOnly
+ stroke SVGStylableImpl::Stroke DontDelete|ReadOnly
+ fill SVGStylableImpl::Fill DontDelete|ReadOnly
+ color SVGStylableImpl::Color DontDelete|ReadOnly
+ stop-color SVGStylableImpl::StopColor DontDelete|ReadOnly
+ font-size SVGStylableImpl::FontSize DontDelete|ReadOnly
+ font-family SVGStylableImpl::FontFamily DontDelete|ReadOnly
+ font-weight SVGStylableImpl::FontWeight DontDelete|ReadOnly
+ font-style SVGStylableImpl::FontStyle DontDelete|ReadOnly
+ text-decoration SVGStylableImpl::TextDecoration DontDelete|ReadOnly
+ text-anchor SVGStylableImpl::TextAnchor DontDelete|ReadOnly
+ direction SVGStylableImpl::Direction DontDelete|ReadOnly
+ writing-mode SVGStylableImpl::WritingMode DontDelete|ReadOnly
+ unicode-bidi SVGStylableImpl::UnicodeBidi DontDelete|ReadOnly
+ opacity SVGStylableImpl::Opacity DontDelete|ReadOnly
+ fill-opacity SVGStylableImpl::FillOpacity DontDelete|ReadOnly
+ stroke-opacity SVGStylableImpl::StrokeOpacity DontDelete|ReadOnly
+ clip-path SVGStylableImpl::ClipPath DontDelete|ReadOnly
+ marker-start SVGStylableImpl::MarkerStart DontDelete|ReadOnly
+ marker-mid SVGStylableImpl::MarkerMid DontDelete|ReadOnly
+ marker-end SVGStylableImpl::MarkerEnd DontDelete|ReadOnly
+ marker SVGStylableImpl::Marker DontDelete|ReadOnly
+ cursor SVGStylableImpl::Cursor DontDelete|ReadOnly
+ display SVGStylableImpl::Display DontDelete|ReadOnly
+ overflow SVGStylableImpl::Overflow DontDelete|ReadOnly
+ clip SVGStylableImpl::Clip DontDelete|ReadOnly
+ visibility SVGStylableImpl::Visibility DontDelete|ReadOnly
+ fill-rule SVGStylableImpl::FillRule DontDelete|ReadOnly
+ clip-rule SVGStylableImpl::ClipRule DontDelete|ReadOnly
+ stroke-dashoffset SVGStylableImpl::StrokeDashOffset DontDelete|ReadOnly
+ stroke-dasharray SVGStylableImpl::StrokeDashArray DontDelete|ReadOnly
+ color-profile SVGStylableImpl::ColorProfile DontDelete|ReadOnly
+ baseline-shift SVGStylableImpl::BaselineShift DontDelete|ReadOnly
+ letter-spacing SVGStylableImpl::LetterSpacing DontDelete|ReadOnly
+ word-spacing SVGStylableImpl::WordSpacing DontDelete|ReadOnly
+ pointer-events SVGStylableImpl::PointerEvents DontDelete|ReadOnly
+ glyph-orientation-vertical SVGStylableImpl::GlyphOrientationVertical DontDelete|ReadOnly
+ glyph-orientation-horizontal SVGStylableImpl::GlyphOrientationHorizontal DontDelete|ReadOnly
+ color-interpolation SVGStylableImpl::ColorInterpolation DontDelete|ReadOnly
+ mask SVGStylableImpl::Mask DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGStylableImplProto::s_hashTable 2
+ getStyle SVGStylableImpl::GetStyle DontDelete|Function 0
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGStylable", SVGStylableImplProto, SVGStylableImplProtoFunc)
+
+Value SVGStylableImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ //case ClassName:
+ // return String(className().string());
+ case Style:
+ return String(m_object ? m_object->DOM::Element::getAttribute("style") : "");
+ case Visibility:
+ return String(m_visible ? "visible" : "hidden");
+ case Display:
+ return String(m_display ? "inline" : "none");
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGStylableImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ QString param = value.toString(exec).qstring();
+
+ if (param.isEmpty())
+ return;
+
+ bool redraw = false;
+ bool inherit = (param == "inherit");
+ int update = -1;
+
+ switch(token)
+ {
+ case Style:
+ {
+ if(!m_object)
+ return;
+
+ QStringList substyles = QStringList::split(';', param);
+ for(QStringList::Iterator it = substyles.begin(); it != substyles.end(); ++it)
+ {
+ QStringList substyle = QStringList::split(':', (*it));
+ m_object->setAttributeInternal(substyle[0].stripWhiteSpace(), substyle[1].stripWhiteSpace());
+ }
+ break;
+ }
+ case StrokeWidth:
+ if(m_flags & SVG_STYLE_FLAG_STROKE_WIDTH)
+ {
+ redraw = true;
+ update = UPDATE_LINEWIDTH;
+ }
+ if(inherit)
+ m_flags &= ~SVG_STYLE_FLAG_STROKE_WIDTH;
+ else
+ {
+ m_flags |= SVG_STYLE_FLAG_STROKE_WIDTH;
+
+ if(!m_strokeWidth)
+ {
+ m_strokeWidth = new SVGAnimatedLengthImpl(LENGTHMODE_OTHER, m_object);
+ m_strokeWidth->ref();
+ }
+
+ m_strokeWidth->baseVal()->setValueAsString(param);
+ }
+ break;
+ case StrokeMiterlimit:
+ m_flags |= SVG_STYLE_FLAG_STROKE_MITER_LIMIT;
+ if(!inherit)
+ m_strokeMiterlimit = param.toUInt();
+ break;
+ case StrokeLineCap:
+ m_flags |= SVG_STYLE_FLAG_STROKE_LINE_CAP;
+ if(param == "butt")
+ m_capStyle = PATH_STROKE_CAP_BUTT;
+ else if(param == "round")
+ m_capStyle = PATH_STROKE_CAP_ROUND;
+ else if(param == "square")
+ m_capStyle = PATH_STROKE_CAP_SQUARE;
+ break;
+ case StrokeLineJoin:
+ m_flags |= SVG_STYLE_FLAG_STROKE_LINE_JOIN;
+ if(param == "miter")
+ m_joinStyle = PATH_STROKE_JOIN_MITER;
+ else if(param == "round")
+ m_joinStyle = PATH_STROKE_JOIN_ROUND;
+ else if(param == "bevel")
+ m_joinStyle = PATH_STROKE_JOIN_BEVEL;
+ break;
+ case Stroke:
+ if(m_flags & SVG_STYLE_FLAG_STROKE)
+ redraw = true;
+ if(inherit)
+ m_flags &= ~SVG_STYLE_FLAG_STROKE;
+ else
+ {
+ m_flags |= SVG_STYLE_FLAG_STROKE;
+
+ if(!m_strokeColor)
+ {
+ m_strokeColor = new SVGPaintImpl(m_object);
+ m_strokeColor->ref();
+ }
+
+ setPaint(param, m_strokeColor);
+ }
+ break;
+ case Fill:
+ if(m_flags & SVG_STYLE_FLAG_FILL)
+ {
+ redraw = true;
+ update = UPDATE_STYLE;
+ }
+ if(inherit)
+ m_flags &= ~SVG_STYLE_FLAG_FILL;
+ else
+ {
+ m_flags |= SVG_STYLE_FLAG_FILL;
+
+ if(!m_fillColor)
+ {
+ m_fillColor = new SVGPaintImpl(m_object);
+ m_fillColor->ref();
+ }
+
+ setPaint(param, m_fillColor);
+ }
+ break;
+ case Color:
+ if(m_flags & SVG_STYLE_FLAG_COLOR)
+ redraw = true;
+ if(inherit)
+ m_flags &= ~SVG_STYLE_FLAG_COLOR;
+ else
+ {
+ m_flags |= SVG_STYLE_FLAG_COLOR;
+
+ if(!m_color)
+ {
+ m_color = new SVGColorImpl(m_object);
+ m_color->ref();
+ }
+ setColor(param, m_color);
+ }
+ break;
+ case StopColor:
+ m_flags |= SVG_STYLE_FLAG_STOP;
+
+ if(!m_stopColor)
+ {
+ m_stopColor = new SVGColorImpl(m_object);
+ m_stopColor->ref();
+ }
+
+ if(!inherit)
+ setColor(param, m_stopColor);
+ break;
+ case ColorInterpolation:
+ if(inherit)
+ m_flags &= ~SVG_STYLE_FLAG_COLOR_INTERPOLATION;
+ else
+ {
+ m_flags |= SVG_STYLE_FLAG_COLOR_INTERPOLATION;
+ if(param == "auto" || param == "sRGB")
+ m_colorInterpolation = CI_SRGB;
+ else
+ if(param == "linearRGB")
+ m_colorInterpolation = CI_LINEARRGB;
+ }
+ break;
+ case FontSize:
+ {
+ m_flags |= SVG_STYLE_FLAG_FONT_SIZE;
+ if(!inherit)
+ {
+ double temp = fontSizeForText(param);
+ if(temp != -1) // Is "absolute-size"
+ {
+ m_fontSize = temp;
+ break;
+ }
+
+ SVGLengthImpl *length = SVGSVGElementImpl::createSVGLength();
+ length->setContext(m_object);
+ length->setValueAsString(DOM::DOMString(param));
+ m_fontSize = length->value();
+ length->deref();
+ }
+ break;
+ }
+ case FontFamily:
+ m_flags |= SVG_STYLE_FLAG_FONT_FAMILY;
+
+ // Hacks
+ // #1 Replace "'" characters by ""
+ param = param.replace('\'', QString::null);
+ // #2 Replace "MS-Gothic" by "MS Gothic"
+ param = param.replace("MS-Gothic", "MS Gothic");
+ // #3 Replace "Helvetica" by "Arial"
+ param = param.replace("Helvetica", "Arial");
+ param = param.replace("helvetica", "Arial");
+
+ if(!m_fontFamily)
+ {
+ m_fontFamily = new SVGStringListImpl();
+ m_fontFamily->ref();
+ }
+
+ if(!inherit)
+ SVGHelperImpl::parseCommaSeperatedList(m_fontFamily, param);
+ break;
+ case FontWeight:
+ m_flags |= SVG_STYLE_FLAG_FONT_WEIGHT;
+ if(!inherit)
+ m_fontWeight = param;
+ break;
+ case FontStyle:
+ m_flags |= SVG_STYLE_FLAG_FONT_STYLE;
+ if(param == "normal")
+ m_fontStyle = FSNORMAL;
+ else if(param == "italic")
+ m_fontStyle = ITALIC;
+ else if(param == "oblique")
+ m_fontStyle = OBLIQUE;
+ break;
+ case TextDecoration:
+ m_flags |= SVG_STYLE_FLAG_TEXT_DECORATION;
+ if(param == "none")
+ m_textDecoration = TDNONE;
+ {
+ // CSS2 allows multiple decorations
+ m_textDecoration = TDNONE;
+ QStringList decorations = QStringList::split(' ', param);
+ for(QStringList::Iterator it = decorations.begin(); it != decorations.end(); ++it)
+ {
+ if(*it == "underline")
+ m_textDecoration |= UNDERLINE;
+ else if(*it == "overline")
+ m_textDecoration |= OVERLINE;
+ else if(*it == "line-through")
+ m_textDecoration |= LINE_THROUGH;
+ }
+ }
+ break;
+ case TextAnchor:
+ m_flags |= SVG_STYLE_FLAG_TEXT_ANCHOR;
+ if(param == "start")
+ m_textAnchor = TASTART;
+ else if(param == "middle")
+ m_textAnchor = TAMIDDLE;
+ else if(param == "end")
+ m_textAnchor = TAEND;
+ break;
+ case Direction:
+ m_flags |= SVG_STYLE_FLAG_TEXT_DIRECTION;
+ // Spec: direction is only processed when unicode-bidi
+ // is set to bidi-override or embedded
+ if(m_textUnicodeBidi == OVERRIDE ||
+ m_textUnicodeBidi == EMBED ||
+ m_textUnicodeBidi == UBNORMAL)
+ {
+ if(param == "rtl")
+ m_textDirection = RTL;
+ else if(param == "ltr")
+ m_textDirection = LTR;
+ }
+ break;
+ case WritingMode:
+ m_flags |= SVG_STYLE_FLAG_TEXT_WRITING_MODE;
+ if(param == "lr-tb" || param == "lr")
+ m_textWritingMode = LR;
+ else if(param == "rl-tb" || param == "rl")
+ m_textWritingMode = RL;
+ else if(param == "tb-lr" || param == "tb")
+ m_textWritingMode = TB;
+ break;
+ case UnicodeBidi:
+ m_flags |= SVG_STYLE_FLAG_TEXT_UNICODE_BIDI;
+ if(param == "normal")
+ m_textUnicodeBidi = UBNORMAL;
+ else if(param == "embed")
+ m_textUnicodeBidi = EMBED;
+ else if(param == "bidi-override")
+ m_textUnicodeBidi = OVERRIDE;
+ break;
+ case GlyphOrientationVertical:
+ m_flags |= SVG_STYLE_FLAG_GLYPH_ORIENTATION_VERTICAL;
+ m_glyphOrientationVertical = param;
+ break;
+ case GlyphOrientationHorizontal:
+ m_flags |= SVG_STYLE_FLAG_GLYPH_ORIENTATION_HORIZONTAL;
+ m_glyphOrientationHorizontal = param;
+ break;
+ case Opacity:
+ m_flags |= SVG_STYLE_FLAG_OPACITY;
+
+ if(!inherit)
+ {
+ SVGLengthImpl::convertPercentageToFloat(value.toString(exec).qstring(), m_opacity);
+ }
+ break;
+ case FillOpacity:
+ m_flags |= SVG_STYLE_FLAG_FILL_OPACITY;
+
+ if(!inherit)
+ {
+ SVGLengthImpl::convertPercentageToFloat(value.toString(exec).qstring(), m_fillOpacity);
+ }
+ break;
+ case StrokeOpacity:
+ m_flags |= SVG_STYLE_FLAG_STROKE_OPACITY;
+
+ if(!inherit)
+ {
+ SVGLengthImpl::convertPercentageToFloat(value.toString(exec).qstring(), m_strokeOpacity);
+ }
+ break;
+ case ClipPath:
+ m_flags |= SVG_STYLE_FLAG_CLIP_PATH;
+ if(!inherit)
+ m_clipPath = extractUrlId(param);
+ break;
+ case Mask:
+ m_flags |= SVG_STYLE_FLAG_MASK;
+ if(!inherit)
+ m_mask = extractUrlId(param);
+ break;
+ case MarkerStart:
+ m_flags |= SVG_STYLE_FLAG_MARKER_START;
+ if(!inherit)
+ setStartMarker(param);
+ break;
+ case MarkerMid:
+ m_flags |= SVG_STYLE_FLAG_MARKER_MID;
+ if(!inherit)
+ setMidMarker(param);
+ break;
+ case MarkerEnd:
+ m_flags |= SVG_STYLE_FLAG_MARKER_END;
+ if(!inherit)
+ setEndMarker(param);
+ break;
+ case Marker:
+ m_flags |= (SVG_STYLE_FLAG_MARKER_START | SVG_STYLE_FLAG_MARKER_MID | SVG_STYLE_FLAG_MARKER_END);
+ if(!inherit)
+ setMarkers(param);
+ break;
+ case PointerEvents:
+ m_flags |= SVG_STYLE_FLAG_POINTER_EVENTS;
+ if(param == "none")
+ m_pointerEvents = PE_NONE;
+ else if(param == "stroke")
+ m_pointerEvents = PE_STROKE;
+ else if(param == "fill")
+ m_pointerEvents = PE_FILL;
+ else if(param == "painted")
+ m_pointerEvents = PE_PAINTED;
+ else if(param == "visibleStroke")
+ m_pointerEvents = PE_VISIBLE_STROKE;
+ else if(param == "visibleFill")
+ m_pointerEvents = PE_VISIBLE_FILL;
+ else if(param == "visiblePainted")
+ m_pointerEvents = PE_VISIBLE_PAINTED;
+ else if(param == "visible")
+ m_pointerEvents = PE_VISIBLE;
+ else if(param == "all")
+ m_pointerEvents = PE_ALL;
+ break;
+ case Cursor:
+ m_flags |= SVG_STYLE_FLAG_CURSOR;
+ if(param == "auto")
+ m_cursor = CURSOR_AUTO;
+ else if(param == "crosshair")
+ m_cursor = CURSOR_CROSSHAIR;
+ else if(param == "default")
+ m_cursor = CURSOR_DEFAULT;
+ else if(param == "pointer")
+ m_cursor = CURSOR_POINTER;
+ else if(param == "move")
+ m_cursor = CURSOR_MOVE;
+ else if(param == "e-resize")
+ m_cursor = CURSOR_E_RESIZE;
+ else if(param == "ne-resize")
+ m_cursor = CURSOR_NE_RESIZE;
+ else if(param == "nw-resize")
+ m_cursor = CURSOR_NW_RESIZE;
+ else if(param == "n-resize")
+ m_cursor = CURSOR_N_RESIZE;
+ else if(param == "se-resize")
+ m_cursor = CURSOR_SE_RESIZE;
+ else if(param == "sw-resize")
+ m_cursor = CURSOR_SW_RESIZE;
+ else if(param == "s-resize")
+ m_cursor = CURSOR_S_RESIZE;
+ else if(param == "w-resize")
+ m_cursor = CURSOR_W_RESIZE;
+ else if(param == "text")
+ m_cursor = CURSOR_TEXT;
+ else if(param == "wait")
+ m_cursor = CURSOR_WAIT;
+ else if(param == "help")
+ m_cursor = CURSOR_HELP;
+ break;
+ case Display:
+ m_flags |= SVG_STYLE_FLAG_DISPLAY;
+
+ if(param == "none")
+ m_display = false;
+ else if(!inherit)
+ m_display = true;
+ break;
+ case Overflow:
+ m_flags |= SVG_STYLE_FLAG_OVERFLOW;
+ if(param == "hidden" || param == "scroll")
+ m_overflow = false;
+ else if(!inherit)
+ m_overflow = true;
+ break;
+ case Clip:
+ m_flags |= SVG_STYLE_FLAG_CLIP_PATH;
+ if(!inherit)
+ setClip(param);
+ break;
+ case Visibility:
+ if(m_flags & SVG_STYLE_FLAG_VISIBILITY)
+ redraw = true;
+ if(inherit)
+ m_flags &= ~SVG_STYLE_FLAG_COLOR;
+ else
+ {
+ m_flags |= SVG_STYLE_FLAG_VISIBILITY;
+
+ if(param == "visible")
+ m_visible = true;
+ else if(!inherit)
+ m_visible = false;
+
+ // Just a quick fix for the script-* files (Niko)
+ // Any better solution??
+ update = UPDATE_TRANSFORM;
+ redraw = true;
+ }
+ SVGHelperImpl::applyContainer<SVGStylableImpl>(this, Visibility, param);
+ break;
+ case FillRule:
+ m_flags |= SVG_STYLE_FLAG_FILL_RULE;
+ if(!inherit)
+ m_fillRule = (param == "evenodd" ? RULE_EVENODD : RULE_NONZERO);
+ break;
+ case ClipRule:
+ m_flags |= SVG_STYLE_FLAG_CLIP_RULE;
+ if(!inherit)
+ m_clipRule = (param == "evenodd" ? RULE_EVENODD : RULE_NONZERO);
+ break;
+ case StrokeDashOffset:
+ m_flags |= SVG_STYLE_FLAG_STROKE_DASH_OFFSET;
+
+ if(!m_dashOffset)
+ {
+ m_dashOffset = new SVGAnimatedLengthImpl(LENGTHMODE_OTHER, m_object);
+ m_dashOffset->ref();
+ }
+
+ if(!inherit)
+ m_dashOffset->baseVal()->setValueAsString(param);
+ break;
+ case StrokeDashArray:
+ {
+ m_flags |= SVG_STYLE_FLAG_STROKE_DASH_ARRAY;
+
+ if(!m_dashArray)
+ {
+ m_dashArray = new SVGAnimatedLengthListImpl();
+ m_dashArray->ref();
+ }
+ else
+ m_dashArray->baseVal()->clear();
+
+ if(param != "none" && !inherit)
+ SVGHelperImpl::parseLengthList(m_dashArray, param);
+ break;
+ }
+ case ColorProfile:
+ {
+ m_flags |= SVG_STYLE_FLAG_COLOR_PROFILE;
+ if(!inherit)
+ {
+ if(!m_object)
+ return;
+
+ SVGColorProfileElementImpl *handle = static_cast<SVGColorProfileElementImpl *>(m_object->ownerSVGElement()->getElementById(SVGURIReferenceImpl::getTarget(param)));
+ if(handle)
+ SVGImageElementImpl::applyColorProfile(handle, static_cast<SVGImageElementImpl *>(this));
+ }
+ break;
+ }
+ case BaselineShift:
+ {
+ m_flags |= SVG_STYLE_FLAG_BASELINE_SHIFT;
+ if(!inherit)
+ m_baselineShift = param;
+ break;
+ }
+ case LetterSpacing:
+ m_flags |= SVG_STYLE_FLAG_LETTER_SPACING;
+ case WordSpacing:
+ {
+ if(!inherit)
+ {
+ if(token == WordSpacing)
+ {
+ m_flags |= SVG_STYLE_FLAG_WORD_SPACING;
+ m_wordSpacing = param;
+ }
+ else
+ m_letterSpacing = param;
+ }
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+
+ if(redraw)
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(m_object);
+ if(inherit)
+ processStyle();
+
+ if(shape && shape->item())
+ {
+ if(update > -1)
+ shape->item()->update(static_cast<CanvasItemUpdate>(update));
+ else if(m_object)
+ m_object->ownerDoc()->canvas()->invalidate(shape->item(), false);
+ }
+ }
+}
+
+Value SVGStylableImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &)
+{
+ KSVG_CHECK_THIS(SVGStylableImpl)
+
+ switch(id)
+ {
+ case SVGStylableImpl::GetStyle:
+ return Undefined();
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGStylableImpl.h b/ksvg/impl/SVGStylableImpl.h
new file mode 100644
index 00000000..0a399a4c
--- /dev/null
+++ b/ksvg/impl/SVGStylableImpl.h
@@ -0,0 +1,327 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGStylableImpl_H
+#define SVGStylableImpl_H
+
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+class QRect;
+
+// from libart, but now no dependency
+typedef enum
+{
+ PATH_STROKE_JOIN_MITER,
+ PATH_STROKE_JOIN_ROUND,
+ PATH_STROKE_JOIN_BEVEL
+} PathStrokeJoinType;
+
+typedef enum
+{
+ PATH_STROKE_CAP_BUTT,
+ PATH_STROKE_CAP_ROUND,
+ PATH_STROKE_CAP_SQUARE
+} PathStrokeCapType;
+
+#define SVG_STYLE_FLAG_NONE 0x0000000000000ULL
+#define SVG_STYLE_FLAG_BASELINE_SHIFT 0x0000000000001ULL
+#define SVG_STYLE_FLAG_CLIP_PATH 0x0000000000002ULL
+#define SVG_STYLE_FLAG_CLIP_RULE 0x0000000000004ULL
+#define SVG_STYLE_FLAG_COLOR 0x0000000000008ULL
+#define SVG_STYLE_FLAG_COLOR_INTERPOLATION 0x0000000000010ULL
+#define SVG_STYLE_FLAG_COLOR_INTERPOLATION_FILTERS 0x0000000000020ULL
+#define SVG_STYLE_FLAG_COLOR_PROFILE 0x0000000000040ULL
+#define SVG_STYLE_FLAG_COLOR_RENDERING 0x0000000000080ULL
+#define SVG_STYLE_FLAG_CURSOR 0x0000000000100ULL
+#define SVG_STYLE_FLAG_DIRECTION 0x0000000000200ULL
+#define SVG_STYLE_FLAG_DISPLAY 0x0000000000400ULL
+#define SVG_STYLE_FLAG_FILL 0x0000000000800ULL
+#define SVG_STYLE_FLAG_FILL_OPACITY 0x0000000001000ULL
+#define SVG_STYLE_FLAG_FILL_RULE 0x0000000002000ULL
+#define SVG_STYLE_FLAG_FONT_FAMILY 0x0000000004000ULL
+#define SVG_STYLE_FLAG_FONT_SIZE 0x0000000008000ULL
+#define SVG_STYLE_FLAG_FONT_SIZE_ADJUST 0x0000000010000ULL
+#define SVG_STYLE_FLAG_FONT_STRETCH 0x0000000020000ULL
+#define SVG_STYLE_FLAG_FONT_STYLE 0x0000000040000ULL
+#define SVG_STYLE_FLAG_FONT_VARIANT 0x0000000080000ULL
+#define SVG_STYLE_FLAG_FONT_WEIGHT 0x0000000100000ULL
+#define SVG_STYLE_FLAG_GLYPH_ORIENTATION_HORIZONTAL 0x0000000200000ULL
+#define SVG_STYLE_FLAG_GLYPH_ORIENTATION_VERTICAL 0x0000000400000ULL
+#define SVG_STYLE_FLAG_IMAGE_RENDERING 0x0000000800000ULL
+#define SVG_STYLE_FLAG_KERNING 0x0000001000000ULL
+#define SVG_STYLE_FLAG_LETTER_SPACING 0x0000002000000ULL
+#define SVG_STYLE_FLAG_MARKER 0x0000004000000ULL
+#define SVG_STYLE_FLAG_MARKER_END 0x0000008000000ULL
+#define SVG_STYLE_FLAG_MARKER_MID 0x0000010000000ULL
+#define SVG_STYLE_FLAG_MARKER_START 0x0000020000000ULL
+#define SVG_STYLE_FLAG_OPACITY 0x0000040000000ULL
+#define SVG_STYLE_FLAG_POINTER_EVENTS 0x0000080000000ULL
+#define SVG_STYLE_FLAG_SHAPE_RENDERING 0x0000100000000ULL
+#define SVG_STYLE_FLAG_STOP 0x0000200000000ULL
+#define SVG_STYLE_FLAG_STROKE_DASH_ARRAY 0x0000400000000ULL
+#define SVG_STYLE_FLAG_STROKE_DASH_OFFSET 0x0000800000000ULL
+#define SVG_STYLE_FLAG_STROKE_LINE_CAP 0x0001000000000ULL
+#define SVG_STYLE_FLAG_STROKE_LINE_JOIN 0x0002000000000ULL
+#define SVG_STYLE_FLAG_STROKE_MITER_LIMIT 0x0004000000000ULL
+#define SVG_STYLE_FLAG_STROKE_OPACITY 0x0008000000000ULL
+#define SVG_STYLE_FLAG_STROKE 0x0010000000000ULL
+#define SVG_STYLE_FLAG_STROKE_WIDTH 0x0020000000000ULL
+#define SVG_STYLE_FLAG_TEXT_ANCHOR 0x0040000000000ULL
+#define SVG_STYLE_FLAG_TEXT_DECORATION 0x0080000000000ULL
+#define SVG_STYLE_FLAG_TEXT_DIRECTION 0x0100000000000ULL
+#define SVG_STYLE_FLAG_TEXT_RENDERING 0x0200000000000ULL
+#define SVG_STYLE_FLAG_TEXT_UNICODE_BIDI 0x0400000000000ULL
+#define SVG_STYLE_FLAG_TEXT_WRITING_MODE 0x0800000000000ULL
+#define SVG_STYLE_FLAG_VISIBILITY 0x1000000000000ULL
+#define SVG_STYLE_FLAG_WORD_SPACING 0x2000000000000ULL
+#define SVG_STYLE_FLAG_OVERFLOW 0x4000000000000ULL
+#define SVG_STYLE_FLAG_MASK 0x0008000000000000ULL
+
+//?#define SVG_STYLE_FLAG_MASK_INHERIT 0x0010000000000000ULL
+
+// Helper macros
+#define STYLE_GET(Return, Name, Member) \
+protected:\
+ Return Member;\
+public:\
+Return get ##Name () const { return Member; }
+
+#define STYLE_GET_OPTIM(Return, Name, Member, Optim) \
+protected:\
+ Return Member : Optim;\
+public:\
+Return get ##Name () const { return Member; }
+
+#define STYLE_HAS(Name, Member) \
+bool has##Name () { return ! Member .isEmpty(); }
+
+namespace KSVG
+{
+
+enum ECursor
+{
+ CURSOR_AUTO,
+ CURSOR_CROSSHAIR,
+ CURSOR_DEFAULT,
+ CURSOR_POINTER,
+ CURSOR_MOVE,
+ CURSOR_E_RESIZE,
+ CURSOR_NE_RESIZE,
+ CURSOR_N_RESIZE,
+ CURSOR_NW_RESIZE,
+ CURSOR_SE_RESIZE,
+ CURSOR_SW_RESIZE,
+ CURSOR_S_RESIZE,
+ CURSOR_W_RESIZE,
+ CURSOR_TEXT,
+ CURSOR_WAIT,
+ CURSOR_HELP
+};
+
+enum ETextDirection
+{
+ LTR, RTL
+};
+
+enum ETextDecoration
+{
+ TDNONE = 0, UNDERLINE = 1, OVERLINE = 2, LINE_THROUGH = 4
+};
+
+enum ETextAnchor
+{
+ TASTART, TAMIDDLE, TAEND
+};
+
+enum EUnicodeBidi
+{
+ UBNORMAL, EMBED, OVERRIDE, INHERIT
+};
+
+enum EFontStyle
+{
+ FSNORMAL, ITALIC, OBLIQUE
+};
+
+enum ETextWritingMode
+{
+ LR, RL, TB
+};
+
+enum EWindRule
+{
+ RULE_NONZERO,
+ RULE_EVENODD
+};
+
+enum EPointerEvents
+{
+ PE_NONE,
+ PE_STROKE,
+ PE_FILL,
+ PE_PAINTED,
+ PE_VISIBLE,
+ PE_VISIBLE_STROKE,
+ PE_VISIBLE_FILL,
+ PE_VISIBLE_PAINTED,
+ PE_ALL,
+ PE_INHERIT
+};
+
+enum EColorInterpolation
+{
+ CI_SRGB,
+ CI_LINEARRGB
+};
+
+class SVGColorImpl;
+class SVGPaintImpl;
+class SVGLengthImpl;
+class SVGAnimatedLengthImpl;
+class SVGAnimatedLengthListImpl;
+class SVGMatrixImpl;
+class SVGStringListImpl;
+class SVGElementImpl;
+class SVGStylableImpl
+{
+public:
+ SVGStylableImpl(SVGElementImpl *object);
+ virtual ~SVGStylableImpl();
+
+ static void setColor(const QString &, SVGColorImpl *);
+
+ STYLE_GET(SVGAnimatedLengthImpl *, DashOffset, m_dashOffset)
+ STYLE_GET(SVGAnimatedLengthListImpl *, DashArray, m_dashArray)
+ STYLE_GET(SVGPaintImpl *, StrokeColor, m_strokeColor)
+ STYLE_GET(SVGPaintImpl *, FillColor, m_fillColor)
+ STYLE_GET(SVGColorImpl *, StopColor, m_stopColor)
+ STYLE_GET(SVGColorImpl *, Color, m_color)
+ STYLE_GET(SVGAnimatedLengthImpl *, StrokeWidth, m_strokeWidth)
+ STYLE_GET(SVGStringListImpl *, FontFamily, m_fontFamily);
+ STYLE_GET(float, FontSize, m_fontSize)
+ STYLE_GET(QString, LetterSpacing, m_letterSpacing)
+ STYLE_GET(QString, WordSpacing, m_wordSpacing)
+ STYLE_GET(QString, FontWeight, m_fontWeight)
+ STYLE_GET(QString, ClipPath, m_clipPath)
+ STYLE_GET(QString, Mask, m_mask)
+ STYLE_GET(QString, StartMarker, m_startMarker)
+ STYLE_GET(QString, MidMarker, m_midMarker)
+ STYLE_GET(QString, EndMarker, m_endMarker)
+ STYLE_GET(QString, BaselineShift, m_baselineShift)
+ STYLE_GET(QString, GlyphOrientationVertical, m_glyphOrientationVertical)
+ STYLE_GET(QString, GlyphOrientationHorizontal, m_glyphOrientationHorizontal)
+ STYLE_GET(float, Opacity, m_opacity)
+ STYLE_GET(float, FillOpacity, m_fillOpacity)
+ STYLE_GET(float, StrokeOpacity, m_strokeOpacity)
+ STYLE_GET(unsigned int, StrokeMiterlimit, m_strokeMiterlimit)
+
+ STYLE_GET_OPTIM(EPointerEvents, PointerEvents, m_pointerEvents, 4)
+ STYLE_GET_OPTIM(ECursor, Cursor, m_cursor, 4)
+ STYLE_GET_OPTIM(EWindRule, FillRule, m_fillRule, 1)
+ STYLE_GET_OPTIM(EWindRule, ClipRule, m_clipRule, 1)
+ STYLE_GET_OPTIM(PathStrokeCapType, CapStyle, m_capStyle, 2)
+ STYLE_GET_OPTIM(PathStrokeJoinType, JoinStyle, m_joinStyle, 2)
+ STYLE_GET_OPTIM(ETextDirection, TextDirection, m_textDirection, 1)
+ STYLE_GET_OPTIM(unsigned int, TextDecoration, m_textDecoration, 3)
+ STYLE_GET_OPTIM(ETextAnchor, TextAnchor, m_textAnchor, 2)
+ STYLE_GET_OPTIM(EUnicodeBidi, TextUnicodeBidi, m_textUnicodeBidi, 2)
+ STYLE_GET_OPTIM(ETextWritingMode, TextWritingMode, m_textWritingMode, 2)
+ STYLE_GET_OPTIM(EFontStyle, FontStyle, m_fontStyle, 2)
+ STYLE_GET_OPTIM(bool, Overflow, m_overflow, 1)
+ STYLE_GET_OPTIM(bool, Visible, m_visible, 1)
+ STYLE_GET_OPTIM(bool, Display, m_display, 1)
+ STYLE_GET_OPTIM(EColorInterpolation, ColorInterpolation, m_colorInterpolation, 1)
+
+ STYLE_HAS(ClipPath, m_clipPath)
+ STYLE_HAS(Mask, m_mask)
+ STYLE_HAS(StartMarker, m_startMarker)
+ STYLE_HAS(MidMarker, m_midMarker)
+ STYLE_HAS(EndMarker, m_endMarker)
+
+ // Special "set" cases
+ void setStartMarker(const QString &);
+ void setMidMarker(const QString &);
+ void setEndMarker(const QString &);
+ void setMarkers(const QString &);
+
+ // Special "has" cases
+ bool hasMarkers() const;
+
+ // Special "is" cases
+ bool isStroked() const;
+ bool isFilled() const;
+
+ // Function which sets default values
+ void processStyle();
+
+ // Special virtual functions
+ virtual void setClip(const QString &clip);
+ virtual QRect clip();
+
+protected:
+ float fontSizeForText(const QString &);
+
+ SVGElementImpl *m_object;
+
+private:
+ void setPaint(const QString &, SVGPaintImpl *);
+ QString extractUrlId(const QString& string);
+
+ unsigned long long m_flags;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ ClassName, Style,
+ StrokeWidth, StrokeMiterlimit, StrokeLineCap, StrokeLineJoin,
+ Stroke, Fill, Color, StopColor, FontSize, FontFamily, FontWeight,
+ FontStyle, TextDecoration, TextAnchor, Direction, WritingMode,
+ UnicodeBidi, Opacity, FillOpacity, StrokeOpacity, ClipPath,
+ MarkerStart, MarkerMid, MarkerEnd, Marker, Cursor, Display,
+ Overflow, Clip, Visibility, FillRule, ClipRule,
+ StrokeDashOffset, StrokeDashArray, ColorProfile, BaselineShift,
+ LetterSpacing, WordSpacing, PointerEvents,
+ GlyphOrientationVertical, GlyphOrientationHorizontal,
+ ColorInterpolation, Mask,
+ // Functions
+ GetStyle
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGStylableImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGStylableImplProtoFunc, SVGStylableImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGStyleElementImpl.cc b/ksvg/impl/SVGStyleElementImpl.cc
new file mode 100644
index 00000000..d826441b
--- /dev/null
+++ b/ksvg/impl/SVGStyleElementImpl.cc
@@ -0,0 +1,135 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGStyleElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGStyleElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGStyleElementImpl::SVGStyleElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+ KSVG_EMPTY_FLAGS
+}
+
+SVGStyleElementImpl::~SVGStyleElementImpl()
+{
+}
+
+void SVGStyleElementImpl::setXmlspace(const DOM::DOMString &xmlspace)
+{
+ setAttribute("xml:space", xmlspace);
+}
+
+DOM::DOMString SVGStyleElementImpl::xmlspace() const
+{
+ return getAttribute("xml:space");
+}
+
+void SVGStyleElementImpl::setType(const DOM::DOMString &type)
+{
+ setAttribute("type", type);
+}
+
+DOM::DOMString SVGStyleElementImpl::type() const
+{
+ return getAttribute("type");
+}
+
+void SVGStyleElementImpl::setMedia(const DOM::DOMString &media)
+{
+ setAttribute("media", media);
+}
+
+DOM::DOMString SVGStyleElementImpl::media() const
+{
+ return getAttribute("media");
+}
+
+void SVGStyleElementImpl::setTitle(const DOM::DOMString &title)
+{
+ setAttribute("title", title);
+}
+
+DOM::DOMString SVGStyleElementImpl::title() const
+{
+ return getAttribute("title");
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGStyleElementImpl::s_hashTable 5
+ xmlspace SVGStyleElementImpl::Xmlspace DontDelete
+ type SVGStyleElementImpl::Type DontDelete
+ media SVGStyleElementImpl::Media DontDelete
+ title SVGStyleElementImpl::Title DontDelete
+@end
+*/
+
+Value SVGStyleElementImpl::getValueProperty(ExecState *, int token) const
+{
+ //KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case Xmlspace:
+ return String(xmlspace());
+ case Type:
+ return String(type());
+ case Media:
+ return String(media());
+ case Title:
+ return String(title());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGStyleElementImpl::putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case Xmlspace:
+ setXmlspace(value.toString(exec).string());
+ break;
+ case Type:
+ setType(value.toString(exec).string());
+ break;
+ case Media:
+ setMedia(value.toString(exec).string());
+ break;
+ case Title:
+ setTitle(value.toString(exec).string());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ break;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGStyleElementImpl.h b/ksvg/impl/SVGStyleElementImpl.h
new file mode 100644
index 00000000..fcf7b152
--- /dev/null
+++ b/ksvg/impl/SVGStyleElementImpl.h
@@ -0,0 +1,72 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGStyleElementImpl_H
+#define SVGStyleElementImpl_H
+
+#include <dom/dom_string.h>
+
+#include "SVGElementImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGStyleElementImpl : public SVGElementImpl
+{
+public:
+ SVGStyleElementImpl(DOM::ElementImpl *);
+ virtual ~SVGStyleElementImpl();
+
+ void setXmlspace(const DOM::DOMString &xmlspace);
+ DOM::DOMString xmlspace() const;
+
+ void setType(const DOM::DOMString &type);
+ DOM::DOMString type() const;
+
+ void setMedia(const DOM::DOMString &media);
+ DOM::DOMString media() const;
+
+ void setTitle(const DOM::DOMString &title);
+ DOM::DOMString title() const;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ Xmlspace, Type, Media, Title
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGStyleElementImpl, "style")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGSwitchElementImpl.cc b/ksvg/impl/SVGSwitchElementImpl.cc
new file mode 100644
index 00000000..613a1982
--- /dev/null
+++ b/ksvg/impl/SVGSwitchElementImpl.cc
@@ -0,0 +1,58 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGDocumentImpl.h"
+#include "SVGSwitchElementImpl.h"
+#include "KSVGCanvas.h"
+
+using namespace KSVG;
+
+SVGSwitchElementImpl::SVGSwitchElementImpl(DOM::ElementImpl *impl) : SVGContainerImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+}
+
+SVGSwitchElementImpl::~SVGSwitchElementImpl()
+{
+}
+
+void SVGSwitchElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ DOM::Node node = firstChild();
+ for(; !node.isNull(); node = node.nextSibling())
+ {
+ SVGElementImpl *element = ownerDoc()->getElementFromHandle(node.handle());
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(element);
+ SVGTestsImpl *tests = dynamic_cast<SVGTestsImpl *>(element);
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(element);
+
+ bool ok = tests ? tests->ok() : true;
+
+ if(element && shape && ok && style->getVisible() && style->getDisplay() && (shape->directRender() || !directRender()))
+ {
+ element->createItem(c);
+ break;
+ }
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGSwitchElementImpl.h b/ksvg/impl/SVGSwitchElementImpl.h
new file mode 100644
index 00000000..2b29d2a4
--- /dev/null
+++ b/ksvg/impl/SVGSwitchElementImpl.h
@@ -0,0 +1,62 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGSwitchElementImpl_H
+#define SVGSwitchElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGContainerImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGSwitchElementImpl : public SVGContainerImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGSwitchElementImpl(DOM::ElementImpl *);
+ virtual ~SVGSwitchElementImpl();
+
+ virtual void createItem(KSVGCanvas *c = 0);
+ virtual bool isContainer() const { return true; }
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGSwitchElementImpl, "switch")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGSymbolElementImpl.cc b/ksvg/impl/SVGSymbolElementImpl.cc
new file mode 100644
index 00000000..da0b5b90
--- /dev/null
+++ b/ksvg/impl/SVGSymbolElementImpl.cc
@@ -0,0 +1,106 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGRectImpl.h"
+#include "SVGMatrixImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGAnimatedRectImpl.h"
+#include "SVGSymbolElementImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGPreserveAspectRatioImpl.h"
+#include "SVGAnimatedPreserveAspectRatioImpl.h"
+#include "KSVGCanvas.h"
+
+using namespace KSVG;
+
+#include "SVGSymbolElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+
+SVGSymbolElementImpl::SVGSymbolElementImpl(DOM::ElementImpl *impl) : SVGShapeImpl(impl), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGFitToViewBoxImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_width = new SVGAnimatedLengthImpl(LENGTHMODE_WIDTH, this);
+ m_width->ref();
+
+ m_height = new SVGAnimatedLengthImpl(LENGTHMODE_HEIGHT, this);
+ m_height->ref();
+}
+
+SVGSymbolElementImpl::~SVGSymbolElementImpl()
+{
+ if(m_width)
+ m_width->deref();
+ if(m_height)
+ m_height->deref();
+}
+/*
+@namespace KSVG
+@begin SVGSymbolElementImpl::s_hashTable 3
+ width SVGSymbolElementImpl::Width DontDelete|ReadOnly
+ height SVGSymbolElementImpl::Height DontDelete|ReadOnly
+@end
+*/
+
+Value SVGSymbolElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case Width:
+ if(!attributeMode)
+ return m_width->cache(exec);
+ else
+ return Number(m_width->baseVal()->value());
+ case Height:
+ if(!attributeMode)
+ return m_height->cache(exec);
+ else
+ return Number(m_height->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGSymbolElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case Width:
+ m_width->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ case Height:
+ m_height->baseVal()->setValueAsString(value.toString(exec).qstring());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGSymbolElementImpl.h b/ksvg/impl/SVGSymbolElementImpl.h
new file mode 100644
index 00000000..19278ea0
--- /dev/null
+++ b/ksvg/impl/SVGSymbolElementImpl.h
@@ -0,0 +1,76 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGSymbolElementImpl_H
+#define SVGSymbolElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGShapeImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGFitToViewBoxImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGFitToViewBoxImpl;
+class SVGAnimatedLengthImpl;
+class SVGSymbolElementImpl : public SVGShapeImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGFitToViewBoxImpl
+{
+public:
+ SVGSymbolElementImpl(DOM::ElementImpl *);
+ virtual ~SVGSymbolElementImpl();
+
+ virtual bool isContainer() const { return true; }
+ virtual bool directRender() { return false; }
+
+private:
+ SVGAnimatedLengthImpl *m_width;
+ SVGAnimatedLengthImpl *m_height;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ Width, Height
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGSymbolElementImpl, "symbol")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTRefElementImpl.cc b/ksvg/impl/SVGTRefElementImpl.cc
new file mode 100644
index 00000000..c1c7e540
--- /dev/null
+++ b/ksvg/impl/SVGTRefElementImpl.cc
@@ -0,0 +1,76 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGTRefElementImpl.h"
+#include "SVGTextElementImpl.h"
+#include "SVGAnimatedStringImpl.h"
+
+#include "KSVGLoader.h"
+
+using namespace KSVG;
+
+SVGTRefElementImpl::SVGTRefElementImpl(DOM::ElementImpl *impl) : SVGTSpanElementImpl(impl), SVGURIReferenceImpl()
+{
+}
+
+SVGTRefElementImpl::~SVGTRefElementImpl()
+{
+}
+
+void SVGTRefElementImpl::setAttributes()
+{
+ SVGTSpanElementImpl::setAttributes();
+
+ DOM::DOMString _href = href()->baseVal();
+
+ if(!_href.isNull())
+ href()->setBaseVal(DOM::DOMString(SVGURIReferenceImpl::getTarget(_href.string())));
+
+ // get the text of the referenced element
+ QString text;
+
+ QString url = _href.string().stripWhiteSpace(), filename, id;
+ if(!SVGURIReferenceImpl::parseURIReference(url, filename, id))
+ return;
+
+ if(!filename.isEmpty()) // a reference into another svg
+ text = KSVGLoader::getCharacterData(KURL(ownerDoc()->baseUrl().path(), filename), id);
+ else
+ {
+ // a reference to an element in this svg
+ SVGElementImpl *target = ownerSVGElement()->getElementById(id);
+ SVGTextElementImpl *textTarget = dynamic_cast<SVGTextElementImpl *>(target);
+
+ if(textTarget)
+ text = textTarget->text();
+ }
+
+ text = handleText(text);
+
+ if(!text.isEmpty())
+ {
+ DOM::Text impl = static_cast<DOM::Document *>(ownerDoc())->createTextNode(text);
+ appendChild(impl);
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTRefElementImpl.h b/ksvg/impl/SVGTRefElementImpl.h
new file mode 100644
index 00000000..60d82231
--- /dev/null
+++ b/ksvg/impl/SVGTRefElementImpl.h
@@ -0,0 +1,52 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTRefElementImpl_H
+#define SVGTRefElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTSpanElementImpl.h"
+#include "SVGURIReferenceImpl.h"
+
+namespace KSVG
+{
+
+class SVGTRefElementImpl : public SVGTSpanElementImpl,
+ public SVGURIReferenceImpl
+{
+public:
+ SVGTRefElementImpl(DOM::ElementImpl *);
+ virtual ~SVGTRefElementImpl();
+ virtual void setAttributes();
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGTRefElementImpl, "tref")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTSpanElementImpl.cc b/ksvg/impl/SVGTSpanElementImpl.cc
new file mode 100644
index 00000000..7265c66e
--- /dev/null
+++ b/ksvg/impl/SVGTSpanElementImpl.cc
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <Glyph.h>
+
+#include "SVGDocumentImpl.h"
+#include "SVGTextElementImpl.h"
+#include "SVGTSpanElementImpl.h"
+#include "SVGAnimatedLengthListImpl.h"
+
+#include "KSVGCanvas.h"
+#include "KSVGTextChunk.h"
+
+using namespace KSVG;
+using namespace KJS;
+
+SVGTSpanElementImpl::SVGTSpanElementImpl(DOM::ElementImpl *impl) : SVGTextPositioningElementImpl(impl)
+{
+}
+
+SVGTSpanElementImpl::~SVGTSpanElementImpl()
+{
+}
+
+long SVGTSpanElementImpl::getNumberOfChars()
+{
+ return text().length();
+}
+
+QString SVGTSpanElementImpl::text()
+{
+ // Otherwhise some js scripts which require a child, don't work (Niko)
+ if(!hasChildNodes())
+ {
+ DOM::Text impl = static_cast<DOM::Document *>(ownerDoc())->createTextNode(DOM::DOMString(""));
+ appendChild(impl);
+ }
+
+ return textDirectionAwareText();
+}
+
+void SVGTSpanElementImpl::setAttributes()
+{
+ SVGTextPositioningElementImpl::setAttributes();
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTSpanElementImpl.h b/ksvg/impl/SVGTSpanElementImpl.h
new file mode 100644
index 00000000..26e4903d
--- /dev/null
+++ b/ksvg/impl/SVGTSpanElementImpl.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTSpanElementImpl_H
+#define SVGTSpanElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTextPositioningElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGTSpanElementImpl : public SVGTextPositioningElementImpl
+{
+public:
+ SVGTSpanElementImpl(DOM::ElementImpl *);
+ virtual ~SVGTSpanElementImpl();
+
+ QString text();
+
+ virtual long getNumberOfChars();
+
+ virtual void setAttributes();
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGTSpanElementImpl, "tspan")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTestsImpl.cc b/ksvg/impl/SVGTestsImpl.cc
new file mode 100644
index 00000000..8bbccf80
--- /dev/null
+++ b/ksvg/impl/SVGTestsImpl.cc
@@ -0,0 +1,178 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <klocale.h>
+#include <kglobal.h>
+
+#include "SVGTestsImpl.h"
+#include "SVGStringListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGTestsImpl.lut.h"
+
+SVGTestsImpl::SVGTestsImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_requiredFeatures = new SVGStringListImpl();
+ m_requiredFeatures->ref();
+
+ m_requiredExtensions = new SVGStringListImpl();
+ m_requiredExtensions->ref();
+
+ m_systemLanguage = new SVGStringListImpl();
+ m_systemLanguage->ref();
+}
+
+SVGTestsImpl::~SVGTestsImpl()
+{
+ if(m_requiredFeatures)
+ m_requiredFeatures->deref();
+ if(m_requiredExtensions)
+ m_requiredExtensions->deref();
+ if(m_systemLanguage)
+ m_systemLanguage->deref();
+}
+
+void SVGTestsImpl::parseRequiredFeatures(const QString &/*value*/)
+{
+ // FIXME
+}
+
+void SVGTestsImpl::parseRequiredExtensions(const QString &value)
+{
+ m_requiredExtensions->appendItem(new SharedString(value));
+}
+
+void SVGTestsImpl::parseSystemLanguage(const QString &value)
+{
+ m_systemLanguage->appendItem(new SharedString(value));
+}
+
+SVGStringListImpl *SVGTestsImpl::requiredFeatures() const
+{
+ return m_requiredFeatures;
+}
+
+SVGStringListImpl *SVGTestsImpl::requiredExtensions() const
+{
+ return m_requiredExtensions;
+}
+
+SVGStringListImpl *SVGTestsImpl::systemLanguage() const
+{
+ return m_systemLanguage;
+}
+
+bool SVGTestsImpl::ok()
+{
+ for(unsigned int i = 0;i < m_requiredExtensions->numberOfItems();i++)
+ {
+ // FIXME
+ return false;
+ }
+ for(unsigned int i = 0;i < m_systemLanguage->numberOfItems();i++)
+ {
+ QString value = m_systemLanguage->getItem(i)->string();
+ if(value.isEmpty() || value != (KGlobal::locale()->language()).left(2))
+ return false;
+ }
+ return true;
+}
+
+bool SVGTestsImpl::hasExtension(const DOM::DOMString &/*extension*/)
+{
+ return false;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGTestsImpl::s_hashTable 5
+ requiredFeatures SVGTestsImpl::RequiredFeatures DontDelete|ReadOnly
+ requiredExtensions SVGTestsImpl::RequiredExtensions DontDelete|ReadOnly
+ systemLanguage SVGTestsImpl::SystemLanguage DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGTestsImplProto::s_hashTable 2
+ hasExtension SVGTestsImpl::HasExtension DontDelete|Function 1
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGTests", SVGTestsImplProto, SVGTestsImplProtoFunc)
+
+Value SVGTestsImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case RequiredFeatures:
+ return m_requiredFeatures->cache(exec);
+ case RequiredExtensions:
+ return m_requiredExtensions->cache(exec);
+ case SystemLanguage:
+ return m_systemLanguage->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGTestsImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case RequiredFeatures:
+ parseRequiredFeatures(value.toString(exec).qstring());
+ break;
+ case RequiredExtensions:
+ parseRequiredExtensions(value.toString(exec).qstring());
+ break;
+ case SystemLanguage:
+ parseSystemLanguage(value.toString(exec).qstring());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+Value SVGTestsImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGTestsImpl)
+
+ switch(id)
+ {
+ case SVGTestsImpl::HasExtension:
+ return Boolean(obj->hasExtension(args[0].toString(exec).string()));
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTestsImpl.h b/ksvg/impl/SVGTestsImpl.h
new file mode 100644
index 00000000..c5b05a5f
--- /dev/null
+++ b/ksvg/impl/SVGTestsImpl.h
@@ -0,0 +1,77 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTestsImpl_H
+#define SVGTestsImpl_H
+
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGStringListImpl;
+class SVGTestsImpl
+{
+public:
+ SVGTestsImpl();
+ ~SVGTestsImpl();
+
+ void parseRequiredFeatures(const QString &value);
+ void parseRequiredExtensions(const QString &value);
+ void parseSystemLanguage(const QString &value);
+
+ SVGStringListImpl *requiredFeatures() const;
+ SVGStringListImpl *requiredExtensions() const;
+ SVGStringListImpl *systemLanguage() const;
+
+ bool ok();
+ bool hasExtension(const DOM::DOMString &extension);
+
+private:
+ SVGStringListImpl *m_requiredFeatures;
+ SVGStringListImpl *m_requiredExtensions;
+ SVGStringListImpl *m_systemLanguage;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ RequiredFeatures, RequiredExtensions, SystemLanguage,
+ // Functions
+ HasExtension
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGTestsImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGTestsImplProtoFunc, SVGTestsImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTextContentElementImpl.cc b/ksvg/impl/SVGTextContentElementImpl.cc
new file mode 100644
index 00000000..f51d8807
--- /dev/null
+++ b/ksvg/impl/SVGTextContentElementImpl.cc
@@ -0,0 +1,285 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "Glyph.h"
+
+#include "SVGStringListImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGTextContentElementImpl.h"
+#include "SVGTextElementImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+#include "SVGDocumentImpl.h"
+
+using namespace KSVG;
+
+#include "SVGTextContentElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_cacheimpl.h"
+
+SVGTextContentElementImpl::SVGTextContentElementImpl(DOM::ElementImpl *impl) : SVGShapeImpl(impl), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this)
+{
+ KSVG_EMPTY_FLAGS
+
+ m_lengthAdjust = new SVGAnimatedEnumerationImpl();
+ m_lengthAdjust->ref();
+
+ // Spec: default value 'spacing'
+ m_lengthAdjust->setBaseVal(LENGTHADJUST_SPACING);
+
+ m_textLength = new SVGAnimatedLengthImpl();
+ m_textLength->baseVal()->setValueAsString("-1");
+ m_textLength->ref();
+}
+
+SVGTextContentElementImpl::~SVGTextContentElementImpl()
+{
+ if(m_lengthAdjust)
+ m_lengthAdjust->deref();
+ if(m_textLength)
+ m_textLength->deref();
+}
+
+QString SVGTextContentElementImpl::textDirectionAwareText()
+{
+ QString text;
+
+ if(hasChildNodes())
+ {
+ bool ltr = getTextDirection() == LTR;
+ DOM::Node node = ltr ? firstChild() : lastChild();
+
+ for(; !node.isNull(); node = ltr ? node.nextSibling() : node.previousSibling())
+ {
+ if(node.nodeType() == TEXT_NODE)
+ {
+ DOM::Text textNode = node;
+ QString temp = textNode.data().string();
+
+ if(!ltr)
+ {
+ QString convert = temp;
+
+ for(int i = temp.length(); i > 0; i--)
+ convert[temp.length() - i] = temp[i - 1];
+
+ text += convert;
+ }
+ else
+ text += temp;
+ }
+ else
+ return text;
+ }
+ }
+
+ return text;
+}
+
+T2P::GlyphLayoutParams *SVGTextContentElementImpl::layoutParams() const
+{
+ SVGStylableImpl *style = const_cast<SVGTextContentElementImpl *>(this);
+
+ T2P::GlyphLayoutParams *params = new T2P::GlyphLayoutParams();
+ params->setTb(style->getTextWritingMode() == TB);
+ params->setUseBidi(style->getTextUnicodeBidi() == UBNORMAL);
+ if(!dynamic_cast<SVGTextElementImpl *>(m_object)) // not allowed for <text>
+ params->setBaselineShift(style->getBaselineShift().latin1());
+
+ bool worked = true;
+ int deg = style->getGlyphOrientationVertical().toInt(&worked);
+ if(!worked)
+ params->setGlyphOrientationVertical(-90);
+ else
+ params->setGlyphOrientationVertical(deg);
+
+ worked = true;
+ deg = style->getGlyphOrientationHorizontal().toInt(&worked);
+ if(!worked)
+ params->setGlyphOrientationHorizontal(-90);
+ else
+ params->setGlyphOrientationHorizontal(deg);
+
+ SVGLengthImpl *length = new SVGLengthImpl(LENGTHMODE_OTHER, const_cast<SVGTextContentElementImpl *>(this));
+ length->ref();
+
+ if(style->getLetterSpacing() != "normal" && style->getLetterSpacing() != "inherit")
+ length->setValueAsString(DOM::DOMString(style->getLetterSpacing()));
+ params->setLetterSpacing(length->value());
+
+ if(style->getWordSpacing() != "normal" && style->getWordSpacing() != "inherit")
+ length->setValueAsString(DOM::DOMString(style->getWordSpacing()));
+ params->setWordSpacing(length->value());
+
+ length->deref();
+
+ return params;
+}
+
+SVGAnimatedLengthImpl *SVGTextContentElementImpl::textLength() const
+{
+ return m_textLength;
+}
+
+SVGAnimatedEnumerationImpl *SVGTextContentElementImpl::lengthAdjust() const
+{
+ return m_lengthAdjust;
+}
+
+long SVGTextContentElementImpl::getNumberOfChars()
+{
+ return 0;
+}
+
+float SVGTextContentElementImpl::getComputedTextLength()
+{
+ return 0.0;
+}
+
+/*
+float SVGTextContentElementImpl::getSubStringLength(const unsigned long &charnum,const unsigned long &nchars)
+{
+}
+
+SVGPoint SVGTextContentElementImpl::getStartPositionOfChar(const unsigned long &charnum)
+{
+}
+
+SVGPoint SVGTextContentElementImpl::getEndPositionOfChar(const unsigned long &charnum)
+{
+}
+
+SVGRect SVGTextContentElementImpl::getExtentOfChar(const unsigned long &charnum)
+{
+}
+
+float SVGTextContentElementImpl::getRotationOfChar(const unsigned long &charnum)
+{
+}
+
+long SVGTextContentElementImpl::getCharNumAtPosition(const SVGPoint &point)
+{
+}
+
+void SVGTextContentElementImpl::selectSubString(const unsigned long &charnum,const unsigned long &nchars)
+{
+}
+*/
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGTextContentElementImpl::s_hashTable 3
+ textLength SVGTextContentElementImpl::TextLength DontDelete|ReadOnly
+ lengthAdjust SVGTextContentElementImpl::LengthAdjust DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGTextContentElementImplProto::s_hashTable 11
+ getNumberOfChars SVGTextContentElementImpl::GetNumberOfChars DontDelete|Function 0
+ getComputedTextLength SVGTextContentElementImpl::GetComputedTextLength DontDelete|Function 0
+ getSubStringLength SVGTextContentElementImpl::GetSubStringLength DontDelete|Function 2
+ getStartPositionOfChar SVGTextContentElementImpl::GetStartPositionOfChar DontDelete|Function 1
+ getEndPositionOfChar SVGTextContentElementImpl::GetEndPositionOfChar DontDelete|Function 1
+ getExtentOfChar SVGTextContentElementImpl::GetExtentOfChar DontDelete|Function 1
+ getRotationOfChar SVGTextContentElementImpl::GetRotationOfChar DontDelete|Function 1
+ getCharNumAtPosition SVGTextContentElementImpl::GetCharNumAtPosition DontDelete|Function 1
+ selectSubString SVGTextContentElementImpl::SelectSubString DontDelete|Function 2
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGTextContentElement", SVGTextContentElementImplProto, SVGTextContentElementImplProtoFunc)
+
+Value SVGTextContentElementImpl::getValueProperty(ExecState *, int token) const
+{
+ //KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGTextContentElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case TextLength:
+ m_textLength->baseVal()->setValueAsString(value.toString(exec).string());
+ if(m_textLength->baseVal()->value() < 0) // A negative value is an error
+ gotError(i18n("Negative value for attribute textLength of element <text> is illegal"));
+ break;
+ case LengthAdjust:
+ {
+ QString temp = value.toString(exec).qstring();
+ if(temp == "spacingAndGlyphs")
+ m_lengthAdjust->setBaseVal(LENGTHADJUST_SPACINGANDGLYPHS);
+ else if(temp == "spacing")
+ m_lengthAdjust->setBaseVal(LENGTHADJUST_SPACING);
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+Value SVGTextContentElementImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &)
+{
+ KSVG_CHECK_THIS(SVGTextContentElementImpl)
+
+ switch(id)
+ {
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+/*
+@namespace KSVG
+@begin SVGTextContentElementImplConstructor::s_hashTable 5
+ LENGTHADJUST_UNKNOWN KSVG::LENGTHADJUST_UNKNOWN DontDelete|ReadOnly
+ LENGTHADJUST_SPACING KSVG::LENGTHADJUST_SPACING DontDelete|ReadOnly
+ LENGTHADJUST_SPACINGANDGLYPHS KSVG::LENGTHADJUST_SPACINGANDGLYPHS DontDelete|ReadOnly
+@end
+*/
+
+Value SVGTextContentElementImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGTextContentElementImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGTextContentElementImplConstructor>(exec, "[[svgtextcontentelement.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTextContentElementImpl.h b/ksvg/impl/SVGTextContentElementImpl.h
new file mode 100644
index 00000000..26bbc041
--- /dev/null
+++ b/ksvg/impl/SVGTextContentElementImpl.h
@@ -0,0 +1,115 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTextContentElementImpl_H
+#define SVGTextContentElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGShapeImpl.h"
+#include "SVGTestsImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGTextContentElement.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace T2P
+{
+ class GlyphLayoutParams;
+}
+
+namespace KSVG
+{
+
+class SVGAnimatedLengthImpl;
+class SVGAnimatedEnumerationImpl;
+class SVGTextContentElementImpl : public SVGShapeImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl
+{
+public:
+ SVGTextContentElementImpl(DOM::ElementImpl *impl);
+ virtual ~SVGTextContentElementImpl();
+
+ QString textDirectionAwareText();
+
+ virtual T2P::GlyphLayoutParams *layoutParams() const;
+
+ SVGAnimatedLengthImpl *textLength() const;
+ SVGAnimatedEnumerationImpl *lengthAdjust() const;
+
+ virtual long getNumberOfChars();
+ float getComputedTextLength();
+
+// float getSubStringLength(const unsigned long &charnum, const unsigned long &nchars);
+// SVGPoint getStartPositionOfChar(const unsigned long &charnum);
+// SVGPoint getEndPositionOfChar(const unsigned long &charnum);
+// SVGRect getExtentOfChar(const unsigned long &charnum);
+// float getRotationOfChar(const unsigned long &charnum);
+// long getCharNumAtPosition(const SVGPoint &point);
+// void selectSubString(const unsigned long &charnum, const unsigned long &nchars);
+
+private:
+ SVGAnimatedEnumerationImpl *m_lengthAdjust;
+ SVGAnimatedLengthImpl *m_textLength;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ TextLength, LengthAdjust,
+ // Functions
+ GetTextLength, GetLengthAdjust,
+ GetNumberOfChars, GetComputedTextLength,
+ GetSubStringLength, GetStartPositionOfChar,
+ GetEndPositionOfChar, GetExtentOfChar,
+ GetRotationOfChar, GetCharNumAtPosition,
+ SelectSubString
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGTextContentElementImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGTextContentElementImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGTextContentElementImplConstructor(KJS::ExecState *exec);
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGTextContentElementImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGTextContentElementImplProtoFunc, SVGTextContentElementImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTextElementImpl.cc b/ksvg/impl/SVGTextElementImpl.cc
new file mode 100644
index 00000000..634c227d
--- /dev/null
+++ b/ksvg/impl/SVGTextElementImpl.cc
@@ -0,0 +1,124 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <Glyph.h>
+
+#include "SVGRectImpl.h"
+#include "SVGEventImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGTextElementImpl.h"
+
+#include "CanvasItem.h"
+#include "KSVGCanvas.h"
+
+using namespace KSVG;
+
+SVGTextElementImpl::SVGTextElementImpl(DOM::ElementImpl *impl) : SVGTextPositioningElementImpl(impl), SVGTransformableImpl()
+{
+ m_bboxX = 0;
+ m_bboxY = 0;
+
+ m_bboxWidth = 0;
+ m_bboxHeight = 0;
+}
+
+SVGTextElementImpl::~SVGTextElementImpl()
+{
+}
+
+long SVGTextElementImpl::getNumberOfChars()
+{
+ return text().length();
+}
+
+QString SVGTextElementImpl::text()
+{
+ // Otherwhise some js scripts which require a child, don't work (Niko)
+ if(!hasChildNodes())
+ {
+ DOM::Text impl = static_cast<DOM::Document *>(ownerDoc())->createTextNode(DOM::DOMString(""));
+ appendChild(impl);
+ }
+
+ return textDirectionAwareText();
+}
+
+SVGRectImpl *SVGTextElementImpl::getBBox()
+{
+ SVGRectImpl *ret = SVGSVGElementImpl::createSVGRect();
+ ret->setX(m_bboxX);
+ ret->setY(m_bboxY);
+ ret->setWidth(m_bboxWidth);
+ ret->setHeight(m_bboxHeight);
+ return ret;
+}
+
+void SVGTextElementImpl::createItem(KSVGCanvas *c )
+{
+ if(!c)
+ c = ownerDoc()->canvas();
+
+ if(!m_item)
+ {
+ m_item = c->createText(this);
+ // Set up bbox before insert(), as that may render the item
+ QRect rect = m_item->bbox();
+ m_bboxX = rect.x();
+ m_bboxY = rect.y();
+ m_bboxWidth = rect.width();
+ m_bboxHeight = rect.height();
+ c->insert(m_item);
+ }
+}
+
+bool SVGTextElementImpl::prepareMouseEvent(const QPoint &p, const QPoint &, SVGMouseEventImpl *mev)
+{
+ // TODO : pointer-events should be stored here, not in SVGStylableImpl.
+ SVGStylableImpl *style = dynamic_cast<SVGStylableImpl *>(this);
+ if(!style || style->getPointerEvents() == PE_NONE)
+ return false;
+ bool test = false;
+ switch(style->getPointerEvents())
+ {
+ case PE_VISIBLE: test = style->getVisible(); break;
+ case PE_VISIBLE_PAINTED: test = style->getVisible() && (style->isStroked() || style->isFilled()) ; break;
+ case PE_VISIBLE_FILL: test = style->getVisible() && style->isFilled(); break;
+ case PE_VISIBLE_STROKE: test = style->getVisible() && style->isStroked(); break;
+ case PE_PAINTED: test = style->isStroked() || style->isFilled(); break;
+ case PE_FILL: test = style->isFilled(); break;
+ case PE_STROKE: test = style->isStroked(); break;
+ case PE_ALL:
+ default: test = true;
+ };
+
+ if(test)
+ {
+ if(m_item->bbox().contains(p))
+ {
+ mev->setTarget(dynamic_cast<SVGElementImpl *>(this));
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTextElementImpl.h b/ksvg/impl/SVGTextElementImpl.h
new file mode 100644
index 00000000..e0c2ca8d
--- /dev/null
+++ b/ksvg/impl/SVGTextElementImpl.h
@@ -0,0 +1,65 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTextElementImpl_H
+#define SVGTextElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTransformableImpl.h"
+#include "SVGTextPositioningElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGRectImpl;
+class SVGTextElementImpl : public SVGTextPositioningElementImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGTextElementImpl(DOM::ElementImpl *);
+ virtual ~SVGTextElementImpl();
+
+ QString text();
+
+ virtual long getNumberOfChars();
+
+ virtual void createItem(KSVGCanvas *c = 0);
+
+ virtual SVGRectImpl *getBBox();
+
+ virtual bool prepareMouseEvent(const QPoint &p, const QPoint &a, SVGMouseEventImpl *mev);
+
+private:
+ int m_bboxX, m_bboxY, m_bboxWidth, m_bboxHeight;
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGTextElementImpl, "text")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTextPathElementImpl.cc b/ksvg/impl/SVGTextPathElementImpl.cc
new file mode 100644
index 00000000..ec218046
--- /dev/null
+++ b/ksvg/impl/SVGTextPathElementImpl.cc
@@ -0,0 +1,240 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "Glyph.h"
+
+#include "SVGDocumentImpl.h"
+#include "SVGTextPathElement.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGTextPathElementImpl.h"
+#include "SVGAnimatedEnumerationImpl.h"
+
+using namespace KSVG;
+
+#include "SVGTextPathElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_ecma.h"
+#include "ksvg_cacheimpl.h"
+
+SVGTextPathElementImpl::SVGTextPathElementImpl(DOM::ElementImpl *impl) : SVGTextContentElementImpl(impl), SVGURIReferenceImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_startOffset = new SVGAnimatedLengthImpl();
+ m_startOffset->ref();
+
+ m_method = new SVGAnimatedEnumerationImpl();
+ m_method->ref();
+
+ m_spacing = new SVGAnimatedEnumerationImpl();
+ m_spacing->ref();
+}
+
+SVGTextPathElementImpl::~SVGTextPathElementImpl()
+{
+ if(m_startOffset)
+ m_startOffset->deref();
+ if(m_method)
+ m_method->deref();
+ if(m_spacing)
+ m_spacing->deref();
+}
+
+SVGAnimatedLengthImpl *SVGTextPathElementImpl::startOffset() const
+{
+ return m_startOffset;
+}
+
+SVGAnimatedEnumerationImpl *SVGTextPathElementImpl::method() const
+{
+ return m_method;
+}
+
+SVGAnimatedEnumerationImpl *SVGTextPathElementImpl::spacing() const
+{
+ return m_spacing;
+}
+
+QString SVGTextPathElementImpl::text()
+{
+ // Otherwhise some js scripts which require a child, don't work (Niko)
+ if(!hasChildNodes())
+ {
+ DOM::Text impl = static_cast<DOM::Document *>(ownerDoc())->createTextNode(DOM::DOMString(""));
+ appendChild(impl);
+ }
+
+ return textDirectionAwareText();
+}
+
+void SVGTextPathElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ // Spec: if not specified, effect is as if a value of "0" were specified
+ if(KSVG_TOKEN_NOT_PARSED(StartOffset))
+ KSVG_SET_ALT_ATTRIBUTE(StartOffset, "0")
+
+ // Spec: if not specified, effect is as if a value of "align" were specified
+ if(KSVG_TOKEN_NOT_PARSED(Method))
+ KSVG_SET_ALT_ATTRIBUTE(Method, "align")
+
+ // Spec: if not specified, effect is as if a value of "exact" were specified
+ if(KSVG_TOKEN_NOT_PARSED(Spacing))
+ KSVG_SET_ALT_ATTRIBUTE(Spacing, "exact")
+}
+
+T2P::GlyphLayoutParams *SVGTextPathElementImpl::layoutParams() const
+{
+ T2P::GlyphLayoutParams *params = SVGTextContentElementImpl::layoutParams();
+ params->setTextPathStartOffset(startOffset()->baseVal()->value());
+ return params;
+}
+
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGTextPathElementImpl::s_hashTable 5
+ startOffset SVGTextPathElementImpl::StartOffset DontDelete|ReadOnly
+ method SVGTextPathElementImpl::Method DontDelete|ReadOnly
+ spacing SVGTextPathElementImpl::Spacing DontDelete|ReadOnly
+@end
+*/
+
+Value SVGTextPathElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case StartOffset:
+ if(!attributeMode)
+ return m_startOffset->cache(exec);
+ else
+ return Number(m_startOffset->baseVal()->value());
+ case Method:
+ if(!attributeMode)
+ return m_method->cache(exec);
+ else
+ return Number(m_method->baseVal());
+ case Spacing:
+ if(!attributeMode)
+ return m_spacing->cache(exec);
+ else
+ return Number(m_spacing->baseVal());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGTextPathElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case StartOffset:
+ {
+ QString param = value.toString(exec).qstring();
+
+ if(param.endsWith("%"))
+ {
+ QString value = param.left(param.length() - 1);
+ bool ok = false;
+ double dValue = value.toDouble(&ok);
+ if(ok)
+ startOffset()->baseVal()->setValue(dValue / 100.0);
+ else
+ kdDebug() << "Couldn't parse startOffset: " << value << endl;
+ }
+ else
+ startOffset()->baseVal()->setValueAsString(value.toString(exec).qstring());
+
+ if(startOffset()->baseVal()->value() < 0) // A negative value is an error
+ gotError(i18n("Negative value for attribute startOffset of element <textPath> is illegal"));
+ break;
+ }
+ case Method:
+ {
+ QString param = value.toString(exec).qstring();
+
+ if(param == "align")
+ method()->setBaseVal(TEXTPATH_METHODTYPE_ALIGN);
+ else if(param == "stretch")
+ method()->setBaseVal(TEXTPATH_METHODTYPE_STRETCH);
+ else
+ method()->setBaseVal(TEXTPATH_METHODTYPE_UNKNOWN);
+
+ break;
+ }
+ case Spacing:
+ {
+ QString param = value.toString(exec).qstring();
+
+ if(param == "auto")
+ spacing()->setBaseVal(TEXTPATH_SPACINGTYPE_AUTO);
+ else if(param == "exact")
+ spacing()->setBaseVal(TEXTPATH_SPACINGTYPE_EXACT);
+ else
+ spacing()->setBaseVal(TEXTPATH_SPACINGTYPE_UNKNOWN);
+
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// CONSTANTS
+
+/*
+@namespace KSVG
+@begin SVGTextPathElementImplConstructor::s_hashTable 7
+ TEXTPATH_METHODTYPE_UNKNOWN KSVG::TEXTPATH_METHODTYPE_UNKNOWN DontDelete|ReadOnly
+ TEXTPATH_METHODTYPE_ALIGN KSVG::TEXTPATH_METHODTYPE_ALIGN DontDelete|ReadOnly
+ TEXTPATH_METHODTYPE_STRETCH KSVG::TEXTPATH_METHODTYPE_STRETCH DontDelete|ReadOnly
+ TEXTPATH_SPACINGTYPE_UNKNOWN KSVG::TEXTPATH_SPACINGTYPE_UNKNOWN DontDelete|ReadOnly
+ TEXTPATH_SPACINGTYPE_AUTO KSVG::TEXTPATH_SPACINGTYPE_AUTO DontDelete|ReadOnly
+ TEXTPATH_SPACINGTYPE_EXACT KSVG::TEXTPATH_SPACINGTYPE_EXACT DontDelete|ReadOnly
+@end
+*/
+
+using namespace KJS;
+
+Value SVGTextPathElementImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGTextPathElementImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGTextPathElementImplConstructor>(exec, "[[svgtextpathelement.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTextPathElementImpl.h b/ksvg/impl/SVGTextPathElementImpl.h
new file mode 100644
index 00000000..8231f0cd
--- /dev/null
+++ b/ksvg/impl/SVGTextPathElementImpl.h
@@ -0,0 +1,84 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTextPathElementImpl_H
+#define SVGTextPathElementImpl_H
+
+#include "SVGURIReferenceImpl.h"
+#include "SVGTextContentElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGTextPathElementImpl : public SVGTextContentElementImpl,
+ public SVGURIReferenceImpl
+{
+public:
+ SVGTextPathElementImpl(DOM::ElementImpl *);
+ virtual ~SVGTextPathElementImpl();
+
+ QString text();
+
+ SVGAnimatedLengthImpl *startOffset() const;
+ SVGAnimatedEnumerationImpl *method() const;
+ SVGAnimatedEnumerationImpl *spacing() const;
+
+ virtual void setAttributes();
+ virtual T2P::GlyphLayoutParams *layoutParams() const;
+
+private:
+ SVGAnimatedLengthImpl *m_startOffset;
+ SVGAnimatedEnumerationImpl *m_method;
+ SVGAnimatedEnumerationImpl *m_spacing;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ StartOffset, Method, Spacing
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGTextPathElementImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGTextPathElementImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGTextPathElementImplConstructor(KJS::ExecState *exec);
+
+KSVG_REGISTER_ELEMENT(SVGTextPathElementImpl, "textPath")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTextPositioningElementImpl.cc b/ksvg/impl/SVGTextPositioningElementImpl.cc
new file mode 100644
index 00000000..924fd091
--- /dev/null
+++ b/ksvg/impl/SVGTextPositioningElementImpl.cc
@@ -0,0 +1,198 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGHelperImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGAnimatedLengthListImpl.h"
+#include "SVGAnimatedNumberListImpl.h"
+#include "SVGTextPositioningElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGTextPositioningElementImpl.lut.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGTextPositioningElementImpl::SVGTextPositioningElementImpl(DOM::ElementImpl *impl) : SVGTextContentElementImpl(impl)
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x = new SVGAnimatedLengthListImpl();
+ m_x->ref();
+
+ m_y = new SVGAnimatedLengthListImpl();
+ m_y->ref();
+
+ m_dx = new SVGAnimatedLengthListImpl();
+ m_dx->ref();
+
+ m_dy = new SVGAnimatedLengthListImpl();
+ m_dy->ref();
+
+ m_rotate = new SVGAnimatedNumberListImpl();
+ m_rotate->ref();
+}
+
+SVGTextPositioningElementImpl::~SVGTextPositioningElementImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_dx)
+ m_dx->deref();
+ if(m_dy)
+ m_dy->deref();
+ if(m_rotate)
+ m_rotate->deref();
+}
+
+SVGAnimatedLengthListImpl *SVGTextPositioningElementImpl::x()
+{
+ return m_x;
+}
+
+SVGAnimatedLengthListImpl *SVGTextPositioningElementImpl::y()
+{
+ return m_y;
+}
+
+SVGAnimatedLengthListImpl *SVGTextPositioningElementImpl::dx()
+{
+ return m_dx;
+}
+
+SVGAnimatedLengthListImpl *SVGTextPositioningElementImpl::dy()
+{
+ return m_dy;
+}
+
+SVGAnimatedNumberListImpl *SVGTextPositioningElementImpl::rotate()
+{
+ return m_rotate;
+}
+
+/*
+@namespace KSVG
+@begin SVGTextPositioningElementImpl::s_hashTable 7
+ x SVGTextPositioningElementImpl::X DontDelete|ReadOnly
+ y SVGTextPositioningElementImpl::Y DontDelete|ReadOnly
+ dx SVGTextPositioningElementImpl::Dx DontDelete|ReadOnly
+ dy SVGTextPositioningElementImpl::Dy DontDelete|ReadOnly
+ rotate SVGTextPositioningElementImpl::Rotate DontDelete|ReadOnly
+@end
+*/
+
+Value SVGTextPositioningElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case X:
+ if(!attributeMode)
+ return m_x->cache(exec);
+ else
+ return Number(m_x->baseVal()->getItem(0)->value());
+ case Y:
+ if(!attributeMode)
+ return m_y->cache(exec);
+ else
+ return Number(m_y->baseVal()->getItem(0)->value());
+ case Dx:
+ if(!attributeMode)
+ return m_dx->cache(exec);
+ else
+ return Number(m_dx->baseVal()->getItem(0)->value());
+ case Dy:
+ if(!attributeMode)
+ return m_dy->cache(exec);
+ else
+ return Number(m_dy->baseVal()->getItem(0)->value());
+ case Rotate:
+ if(!attributeMode)
+ return m_rotate->cache(exec);
+ else
+ return Number(m_rotate->baseVal()->getItem(0)->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGTextPositioningElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case X:
+ x()->baseVal()->clear();
+ SVGHelperImpl::parseLengthList(x(), value.toString(exec).qstring(), LENGTHMODE_WIDTH, this);
+ break;
+ case Y:
+ y()->baseVal()->clear();
+ SVGHelperImpl::parseLengthList(y(), value.toString(exec).qstring(), LENGTHMODE_HEIGHT, this);
+ break;
+ case Dx:
+ dx()->baseVal()->clear();
+ SVGHelperImpl::parseLengthList(dx(), value.toString(exec).qstring(), LENGTHMODE_WIDTH, this);
+ break;
+ case Dy:
+ dy()->baseVal()->clear();
+ SVGHelperImpl::parseLengthList(dy(), value.toString(exec).qstring(), LENGTHMODE_HEIGHT, this);
+ break;
+ case Rotate:
+ {
+ rotate()->baseVal()->clear();
+
+ SVGNumberImpl *number = SVGSVGElementImpl::createSVGNumber();
+ number->setValue(value.toNumber(exec));
+ rotate()->baseVal()->appendItem(number);
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+void SVGTextPositioningElementImpl::setAttributes()
+{
+ SVGElementImpl::setAttributes();
+
+ if(tagName() != "text")
+ return;
+
+ // Spec: If the attribute is not specified, the effect is as if a value of "0" were specified.
+ if(KSVG_TOKEN_NOT_PARSED(X))
+ KSVG_SET_ALT_ATTRIBUTE(X, "0")
+
+ // Spec: If the attribute is not specified, the effect is as if a value of "0" were specified.
+ if(KSVG_TOKEN_NOT_PARSED(Y))
+ KSVG_SET_ALT_ATTRIBUTE(Y, "0")
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTextPositioningElementImpl.h b/ksvg/impl/SVGTextPositioningElementImpl.h
new file mode 100644
index 00000000..c80b48ff
--- /dev/null
+++ b/ksvg/impl/SVGTextPositioningElementImpl.h
@@ -0,0 +1,83 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTextPositioningElementImpl_H
+#define SVGTextPositioningElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTextContentElementImpl.h"
+
+namespace KJS
+{
+ class Value;
+ class Object;
+ class UString;
+ class ExecState;
+}
+
+namespace KSVG
+{
+
+class SVGShapeImpl;
+class GlyphLayoutParams;
+class SVGAnimatedLengthListImpl;
+class SVGAnimatedNumberListImpl;
+
+class SVGTextPositioningElementImpl : public SVGTextContentElementImpl
+{
+public:
+ SVGTextPositioningElementImpl(DOM::ElementImpl *impl);
+ virtual ~SVGTextPositioningElementImpl();
+
+ SVGAnimatedLengthListImpl *x();
+ SVGAnimatedLengthListImpl *y();
+ SVGAnimatedLengthListImpl *dx();
+ SVGAnimatedLengthListImpl *dy();
+ SVGAnimatedNumberListImpl *rotate();
+
+ virtual void setAttributes();
+
+private:
+ SVGAnimatedLengthListImpl *m_x;
+ SVGAnimatedLengthListImpl *m_y;
+ SVGAnimatedLengthListImpl *m_dx;
+ SVGAnimatedLengthListImpl *m_dy;
+ SVGAnimatedNumberListImpl *m_rotate;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ X, Y, Dx, Dy, Rotate
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTimeScheduler.cc b/ksvg/impl/SVGTimeScheduler.cc
new file mode 100644
index 00000000..efff77ac
--- /dev/null
+++ b/ksvg/impl/SVGTimeScheduler.cc
@@ -0,0 +1,234 @@
+/*
+ Copyright (C) 2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "KSVGCanvas.h"
+#include "CanvasItem.h"
+#include "SVGShapeImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGTimeScheduler.moc"
+
+using namespace KSVG;
+
+SVGTimer::SVGTimer(QObject *scheduler, unsigned int ms, bool singleShot)
+{
+ m_ms = ms;
+ m_singleShot = singleShot;
+ m_timer = new QTimer(scheduler);
+}
+
+SVGTimer::~SVGTimer()
+{
+ delete m_timer;
+}
+
+bool SVGTimer::operator==(const QTimer *timer)
+{
+ return (m_timer == timer);
+}
+
+const QTimer *SVGTimer::qtimer() const
+{
+ return m_timer;
+}
+
+void SVGTimer::start(QObject *receiver, const char *member)
+{
+ QObject::connect(m_timer, SIGNAL(timeout()), receiver, member);
+ m_timer->start(m_ms, m_singleShot);
+}
+
+void SVGTimer::stop()
+{
+ m_timer->stop();
+}
+
+bool SVGTimer::isActive() const
+{
+ return m_timer->isActive();
+}
+
+unsigned int SVGTimer::ms() const
+{
+ return m_ms;
+}
+
+bool SVGTimer::singleShot() const
+{
+ return m_singleShot;
+}
+
+void SVGTimer::notifyAll()
+{
+ if(m_notifyList.isEmpty())
+ return;
+
+ QValueList<SVGElementImpl *> elements;
+ for(unsigned int i = m_notifyList.count();i > 0; i--)
+ {
+ SVGElementImpl *element = m_notifyList[i - 1];
+ if(!element)
+ continue;
+
+ SVGAnimationElementImpl *animation = dynamic_cast<SVGAnimationElementImpl *>(element);
+ if(animation)
+ {
+ animation->handleTimerEvent();
+
+ SVGElementImpl *target = animation->targetElement();
+ if(!elements.contains(target))
+ elements.append(target);
+ }
+ }
+
+ // Optimized update logic (to avoid 4 updates, on the same element)
+ QValueList<SVGElementImpl *>::iterator it2;
+ for(it2 = elements.begin(); it2 != elements.end(); ++it2)
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(*it2);
+ if(shape && shape->item())
+ shape->item()->update(UPDATE_TRANSFORM);
+ }
+}
+
+void SVGTimer::addNotify(SVGElementImpl *element)
+{
+ m_notifyList.append(element);
+}
+
+void SVGTimer::removeNotify(SVGElementImpl *element)
+{
+ m_notifyList.remove(element);
+
+ if(m_notifyList.isEmpty())
+ stop();
+}
+
+const unsigned int SVGTimeScheduler::staticTimerInterval = 15; // milliseconds
+
+SVGTimeScheduler::SVGTimeScheduler(SVGDocumentImpl *doc) : QObject(), m_doc(doc)
+{
+ // Create static interval timers but don't start it yet!
+ m_intervalTimer = new SVGTimer(this, staticTimerInterval, false);
+ m_creationTime.start();
+}
+
+SVGTimeScheduler::~SVGTimeScheduler()
+{
+ // Usually singleShot timers cleanup themselves, after usage
+ SVGTimerList::iterator it;
+ for(it = m_timerList.begin(); it != m_timerList.end(); ++it)
+ {
+ SVGTimer *svgTimer = *it;
+ delete svgTimer;
+ }
+ delete m_intervalTimer;
+}
+
+void SVGTimeScheduler::addTimer(SVGElementImpl *element, unsigned int ms)
+{
+ SVGTimer *svgTimer = new SVGTimer(this, ms, true);
+ svgTimer->addNotify(element);
+ m_timerList.append(svgTimer);
+}
+
+void SVGTimeScheduler::connectIntervalTimer(SVGElementImpl *element)
+{
+ m_intervalTimer->addNotify(element);
+}
+
+void SVGTimeScheduler::disconnectIntervalTimer(SVGElementImpl *element)
+{
+ m_intervalTimer->removeNotify(element);
+}
+
+void SVGTimeScheduler::startAnimations()
+{
+ SVGTimerList::iterator it;
+ for(it = m_timerList.begin(); it != m_timerList.end(); ++it)
+ {
+ SVGTimer *svgTimer = *it;
+ if(svgTimer && !svgTimer->isActive())
+ svgTimer->start(this, SLOT(slotTimerNotify()));
+ }
+}
+
+void SVGTimeScheduler::toggleAnimations()
+{
+ if(m_intervalTimer->isActive())
+ m_intervalTimer->stop();
+ else
+ m_intervalTimer->start(this, SLOT(slotTimerNotify()));
+}
+
+bool SVGTimeScheduler::animationsPaused() const
+{
+ return !m_intervalTimer->isActive();
+}
+
+void SVGTimeScheduler::slotTimerNotify()
+{
+ QTimer *senderTimer = const_cast<QTimer *>(static_cast<const QTimer *>(sender()));
+
+ SVGTimer *svgTimer = 0;
+ SVGTimerList::iterator it;
+ for(it = m_timerList.begin(); it != m_timerList.end(); ++it)
+ {
+ SVGTimer *cur = *it;
+ if(*cur == senderTimer)
+ {
+ svgTimer = cur;
+ break;
+ }
+ }
+
+ if(!svgTimer)
+ {
+ svgTimer = (*m_intervalTimer == senderTimer) ? m_intervalTimer : 0;
+
+ if(!svgTimer)
+ return;
+ }
+
+ svgTimer->notifyAll();
+
+ // Animations need direct updates
+ if(m_doc->canvas())
+ m_doc->canvas()->update();
+ emit m_doc->finishedRendering();
+
+ if(svgTimer->singleShot())
+ {
+ m_timerList.remove(svgTimer);
+ delete svgTimer;
+ }
+
+ // The singleShot timers of ie. <animate> with begin="3s" are notified
+ // by the previous call, and now all connections to the interval timer
+ // are created and now we just need to fire that timer (Niko)
+ if(svgTimer != m_intervalTimer && !m_intervalTimer->isActive())
+ m_intervalTimer->start(this, SLOT(slotTimerNotify()));
+}
+
+float SVGTimeScheduler::elapsed() const
+{
+ return float(m_creationTime.elapsed()) / 1000.0;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTimeScheduler.h b/ksvg/impl/SVGTimeScheduler.h
new file mode 100644
index 00000000..ae4c6d37
--- /dev/null
+++ b/ksvg/impl/SVGTimeScheduler.h
@@ -0,0 +1,104 @@
+/*
+ Copyright (C) 2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTimeScheduler_H
+#define SVGTimeScheduler_H
+
+#include <qtimer.h>
+#include <qdatetime.h>
+#include <qobject.h>
+#include <qvaluelist.h>
+
+#include "SVGElementImpl.h"
+#include "SVGAnimationElementImpl.h"
+
+namespace KSVG
+{
+
+typedef QValueList<SVGElementImpl *> SVGNotifyList;
+class SVGTimer
+{
+public:
+ SVGTimer(QObject *scheduler, unsigned int ms, bool singleShot);
+ ~SVGTimer();
+
+ bool operator==(const QTimer *timer);
+ const QTimer *qtimer() const;
+
+ void start(QObject *receiver, const char *member);
+ void stop();
+
+ bool isActive() const;
+
+ unsigned int ms() const;
+ bool singleShot() const;
+
+ void notifyAll();
+ void addNotify(SVGElementImpl *element);
+ void removeNotify(SVGElementImpl *element);
+
+private:
+ unsigned int m_ms;
+ bool m_invoked, m_singleShot;
+
+ QTimer *m_timer;
+ SVGNotifyList m_notifyList;
+};
+
+typedef QValueList<SVGTimer *> SVGTimerList;
+class SVGDocumentImpl;
+class SVGTimeScheduler : public QObject
+{
+Q_OBJECT
+public:
+ SVGTimeScheduler(SVGDocumentImpl *doc);
+ ~SVGTimeScheduler();
+
+ // Adds singleShot Timers
+ void addTimer(SVGElementImpl *element, unsigned int ms);
+
+ // (Dis-)Connects to interval timer with ms = 'staticTimerInterval'
+ void connectIntervalTimer(SVGElementImpl *element);
+ void disconnectIntervalTimer(SVGElementImpl *element);
+
+ void startAnimations();
+ void toggleAnimations();
+ bool animationsPaused() const;
+
+ // time elapsed in seconds after creation of this object
+ float elapsed() const;
+
+ static const unsigned int staticTimerInterval;
+
+private slots:
+ void slotTimerNotify();
+
+private:
+ SVGDocumentImpl *m_doc;
+ SVGTimerList m_timerList;
+ SVGTimer *m_intervalTimer;
+ QTime m_creationTime;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTitleElementImpl.cc b/ksvg/impl/SVGTitleElementImpl.cc
new file mode 100644
index 00000000..5bfe2936
--- /dev/null
+++ b/ksvg/impl/SVGTitleElementImpl.cc
@@ -0,0 +1,39 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGDocumentImpl.h"
+#include "SVGTitleElementImpl.h"
+
+using namespace KSVG;
+
+SVGTitleElementImpl::SVGTitleElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGLangSpaceImpl(), SVGStylableImpl(this)
+{
+}
+
+SVGTitleElementImpl::~SVGTitleElementImpl()
+{
+}
+
+void SVGTitleElementImpl::createItem(KSVGCanvas *)
+{
+ emit ownerDoc()->gotTitle(collectText());
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTitleElementImpl.h b/ksvg/impl/SVGTitleElementImpl.h
new file mode 100644
index 00000000..7c948842
--- /dev/null
+++ b/ksvg/impl/SVGTitleElementImpl.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTitleElementImpl_H
+#define SVGTitleElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+
+namespace KSVG
+{
+
+class SVGTitleElementImpl : public SVGElementImpl,
+ public SVGLangSpaceImpl,
+ public SVGStylableImpl
+{
+public:
+ SVGTitleElementImpl(DOM::ElementImpl *);
+ virtual ~SVGTitleElementImpl();
+
+ virtual void createItem(KSVGCanvas *c = 0);
+
+public:
+ KSVG_BRIDGE
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+KSVG_REGISTER_ELEMENT(SVGTitleElementImpl, "title")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTransformImpl.cc b/ksvg/impl/SVGTransformImpl.cc
new file mode 100644
index 00000000..53ea9bf3
--- /dev/null
+++ b/ksvg/impl/SVGTransformImpl.cc
@@ -0,0 +1,240 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGTransform.h"
+
+#include "SVGMatrixImpl.h"
+#include "SVGTransformImpl.h"
+#include "SVGSVGElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGTransformImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_cacheimpl.h"
+
+SVGTransformImpl::SVGTransformImpl()
+{
+ m_matrix = SVGSVGElementImpl::createSVGMatrix();
+
+ m_type = SVG_TRANSFORM_UNKNOWN;
+ m_angle = 0;
+}
+
+SVGTransformImpl::~SVGTransformImpl()
+{
+ if(m_matrix)
+ m_matrix->deref();
+}
+
+unsigned short SVGTransformImpl::type() const
+{
+ return m_type;
+}
+
+SVGMatrixImpl *SVGTransformImpl::matrix() const
+{
+ return m_matrix;
+}
+
+double SVGTransformImpl::angle() const
+{
+ return m_angle;
+}
+
+void SVGTransformImpl::setMatrix(SVGMatrixImpl *matrix)
+{
+ if(!matrix)
+ return;
+
+ m_type = SVG_TRANSFORM_MATRIX;
+ m_angle = 0;
+
+ m_matrix->deref();
+ m_matrix = matrix;
+ m_matrix->ref();
+}
+
+void SVGTransformImpl::setTranslate(double tx, double ty)
+{
+ m_type = SVG_TRANSFORM_TRANSLATE;
+ m_angle = 0;
+ m_matrix->reset();
+ m_matrix->translate(tx, ty);
+}
+
+void SVGTransformImpl::setScale(double sx, double sy)
+{
+ m_type = SVG_TRANSFORM_SCALE;
+ m_angle = 0;
+ m_matrix->reset();
+ m_matrix->scaleNonUniform(sx, sy);
+}
+
+void SVGTransformImpl::setRotate(double angle, double cx, double cy)
+{
+ m_type = SVG_TRANSFORM_ROTATE;
+ // mop: evil...fix that...needed to make toString() work correctly
+ m_cx = cx;
+ m_cy = cy;
+ m_angle = angle;
+ m_matrix->reset();
+ m_matrix->translate(cx, cy);
+ m_matrix->rotate(angle);
+ m_matrix->translate(-cx, -cy);
+}
+
+void SVGTransformImpl::setSkewX(double angle)
+{
+ m_type = SVG_TRANSFORM_SKEWX;
+ m_angle = angle;
+ m_matrix->reset();
+ m_matrix->skewX(angle);
+}
+
+void SVGTransformImpl::setSkewY(double angle)
+{
+ m_type = SVG_TRANSFORM_SKEWY;
+ m_angle = angle;
+ m_matrix->reset();
+ m_matrix->skewY(angle);
+}
+
+QString SVGTransformImpl::toString() const
+{
+ switch (m_type)
+ {
+ case SVG_TRANSFORM_UNKNOWN:
+ return QString();
+ case SVG_TRANSFORM_MATRIX:
+ return QString("matrix(" + QString::number(m_matrix->a()) + " " + QString::number(m_matrix->b()) + " " + QString::number(m_matrix->c()) + " " + QString::number(m_matrix->d()) + " " + QString::number(m_matrix->e()) + " " + QString::number(m_matrix->f()) + ")");
+ case SVG_TRANSFORM_TRANSLATE:
+ return QString("translate(" + QString::number(m_matrix->e()) + " " + QString::number(m_matrix->f()) + ")");
+ case SVG_TRANSFORM_SCALE:
+ return QString("scale(" + QString::number(m_matrix->a()) + " " + QString::number(m_matrix->d()) + ")");
+ case SVG_TRANSFORM_ROTATE:
+ return QString("rotate(" + QString::number(m_angle) + " " + QString::number(m_cx) + " " + QString::number(m_cy) + ")");
+ case SVG_TRANSFORM_SKEWX:
+ return QString("skewX(" + QString::number(m_angle) + ")");
+ case SVG_TRANSFORM_SKEWY:
+ return QString("skewY(" + QString::number(m_angle) + ")");
+ default:
+ kdWarning() << "Unknown transform type " << m_type << endl;
+ return QString();
+ }
+}
+
+// ECMA binding
+
+/*
+@namespace KSVG
+@begin SVGTransformImpl::s_hashTable 5
+ type SVGTransformImpl::Type DontDelete|ReadOnly
+ matrix SVGTransformImpl::Matrix DontDelete|ReadOnly
+ angle SVGTransformImpl::Angle DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGTransformImplProto::s_hashTable 7
+ setMatrix SVGTransformImpl::SetMatrix DontDelete|Function 1
+ setTranslate SVGTransformImpl::SetTranslate DontDelete|Function 2
+ setScale SVGTransformImpl::SetScale DontDelete|Function 2
+ setRotate SVGTransformImpl::SetRotate DontDelete|Function 3
+ setSkewX SVGTransformImpl::SetSkewX DontDelete|Function 1
+ setSkewY SVGTransformImpl::SetSkewY DontDelete|Function 1
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGTransform", SVGTransformImplProto, SVGTransformImplProtoFunc)
+
+Value SVGTransformImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case Type:
+ return Number(m_type);
+ case Matrix:
+ return m_matrix->cache(exec);
+ case Angle:
+ return Number(m_angle);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+Value SVGTransformImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGTransformImpl)
+
+ switch(id)
+ {
+ case SVGTransformImpl::SetMatrix:
+ obj->setMatrix(static_cast<KSVGBridge<SVGMatrixImpl> *>(args[0].imp())->impl());
+ break;
+ case SVGTransformImpl::SetTranslate:
+ obj->setTranslate(args[0].toNumber(exec), args[1].toNumber(exec));
+ break;
+ case SVGTransformImpl::SetScale:
+ obj->setScale(args[0].toNumber(exec), args[1].toNumber(exec));
+ break;
+ case SVGTransformImpl::SetRotate:
+ obj->setRotate(args[0].toNumber(exec), args[1].toNumber(exec), args[2].toNumber(exec));
+ break;
+ case SVGTransformImpl::SetSkewX:
+ obj->setSkewX(args[0].toNumber(exec));
+ break;
+ case SVGTransformImpl::SetSkewY:
+ obj->setSkewY(args[0].toNumber(exec));
+ break;
+ default:
+ kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
+ break;
+ }
+
+ return Undefined();
+}
+
+/*
+@namespace KSVG
+@begin SVGTransformImplConstructor::s_hashTable 11
+ SVG_TRANSFORM_UNKNOWN KSVG::SVG_TRANSFORM_UNKNOWN DontDelete|ReadOnly
+ SVG_TRANSFORM_MATRIX KSVG::SVG_TRANSFORM_MATRIX DontDelete|ReadOnly
+ SVG_TRANSFORM_TRANSLATE KSVG::SVG_TRANSFORM_TRANSLATE DontDelete|ReadOnly
+ SVG_TRANSFORM_SCALE KSVG::SVG_TRANSFORM_SCALE DontDelete|ReadOnly
+ SVG_TRANSFORM_ROTATE KSVG::SVG_TRANSFORM_ROTATE DontDelete|ReadOnly
+ SVG_TRANSFORM_SKEWX KSVG::SVG_TRANSFORM_SKEWX DontDelete|ReadOnly
+ SVG_TRANSFORM_SKEWY KSVG::SVG_TRANSFORM_SKEWY DontDelete|ReadOnly
+@end
+*/
+
+Value SVGTransformImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGTransformImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGTransformImplConstructor>(exec, "[[svgtransform.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTransformImpl.h b/ksvg/impl/SVGTransformImpl.h
new file mode 100644
index 00000000..69d71b8f
--- /dev/null
+++ b/ksvg/impl/SVGTransformImpl.h
@@ -0,0 +1,99 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTransformImpl_H
+#define SVGTransformImpl_H
+
+#include <dom/dom_misc.h>
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+class QString;
+
+namespace KSVG
+{
+
+class SVGMatrixImpl;
+class SVGTransformImpl : public DOM::DomShared
+{
+public:
+ SVGTransformImpl();
+ virtual ~SVGTransformImpl();
+
+ unsigned short type() const;
+
+ SVGMatrixImpl *matrix() const;
+
+ double angle() const;
+
+ void setMatrix(SVGMatrixImpl *);
+ void setTranslate(double, double);
+ void setScale(double, double);
+ void setRotate(double, double, double);
+ void setSkewX(double);
+ void setSkewY(double);
+
+ QString toString() const;
+
+private:
+ // mop: we have to store the optional rotate stuff :( anyone with a better solution please fix that ;)
+ double m_cx;
+ double m_cy;
+
+ unsigned short m_type;
+ SVGMatrixImpl *m_matrix;
+ double m_angle;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ Type, Matrix, Angle,
+ // Functions
+ SetMatrix, SetTranslate, SetScale,
+ SetRotate, SetSkewX, SetSkewY
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+class SVGTransformImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGTransformImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGTransformImplConstructor(KJS::ExecState *exec);
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGTransformImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGTransformImplProtoFunc, SVGTransformImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTransformListImpl.cc b/ksvg/impl/SVGTransformListImpl.cc
new file mode 100644
index 00000000..5ecc16b6
--- /dev/null
+++ b/ksvg/impl/SVGTransformListImpl.cc
@@ -0,0 +1,103 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGMatrixImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGTransformListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGTransformListImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGTransformListImpl::s_hashTable 2
+ numberOfItems SVGListDefs::NumberOfItems DontDelete|ReadOnly
+@end
+@namespace KSVG
+@begin SVGTransformListImplProto::s_hashTable 11
+ getItem SVGListDefs::GetItem DontDelete|Function 1
+ removeItem SVGListDefs::RemoveItem DontDelete|Function 1
+ appendItem SVGListDefs::AppendItem DontDelete|Function 1
+ initialize SVGListDefs::Initialize DontDelete|Function 1
+ insertItemBefore SVGListDefs::InsertItemBefore DontDelete|Function 2
+ replaceItem SVGListDefs::ReplaceItem DontDelete|Function 2
+ clear SVGListDefs::Clear DontDelete|Function 0
+@end
+*/
+
+KSVG_IMPLEMENT_PROTOTYPE("SVGTransformList", SVGTransformListImplProto, SVGTransformListImplProtoFunc)
+
+Value SVGTransformListImpl::getValueProperty(ExecState *exec, int token) const
+{
+ return SVGList<SVGTransformImpl>::getValueProperty(exec, token);
+}
+
+Value SVGTransformListImplProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
+{
+ KSVG_CHECK_THIS(SVGTransformListImpl)
+
+ return obj->call(exec, static_cast<SVGList<SVGTransformImpl> *>(obj), args, id);
+}
+
+SVGTransformImpl *SVGTransformListImpl::consolidate()
+{
+ SVGTransformImpl *trans = 0;
+
+ if(numberOfItems()>0)
+ {
+ trans = SVGSVGElementImpl::createSVGTransform();
+ SVGMatrixImpl *matrix = SVGSVGElementImpl::createSVGMatrix();
+
+ for(unsigned int i = 0; i < numberOfItems(); i++)
+ matrix->multiply(getItem(i)->matrix());
+
+ // Pedantic - sets type to MATRIX as per spec.
+ trans->setMatrix(matrix);
+ matrix->deref();
+ initialize(trans);
+ trans->ref();
+ }
+
+ return trans;
+}
+
+SVGMatrixImpl *SVGTransformListImpl::concatenate() const
+{
+ SVGMatrixImpl *matrix = 0;
+
+ if(numberOfItems()>0)
+ {
+ matrix = SVGSVGElementImpl::createSVGMatrix();
+
+ for(unsigned int i = 0; i < numberOfItems(); i++)
+ matrix->multiply(getItem(i)->matrix());
+ }
+
+ return matrix;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTransformListImpl.h b/ksvg/impl/SVGTransformListImpl.h
new file mode 100644
index 00000000..d59c6046
--- /dev/null
+++ b/ksvg/impl/SVGTransformListImpl.h
@@ -0,0 +1,53 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTransformListImpl_H
+#define SVGTransformListImpl_H
+
+#include "SVGList.h"
+
+#include "SVGTransformImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGTransformListImpl : public SVGList<SVGTransformImpl>
+{
+public:
+ KSVG_GET
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+
+ SVGTransformImpl *consolidate();
+
+ // Concatenate the transforms. Returns 0 if list is empty
+ SVGMatrixImpl *concatenate() const;
+};
+
+}
+
+KSVG_DEFINE_PROTOTYPE(SVGTransformListImplProto)
+KSVG_IMPLEMENT_PROTOFUNC(SVGTransformListImplProtoFunc, SVGTransformListImpl)
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTransformableImpl.cc b/ksvg/impl/SVGTransformableImpl.cc
new file mode 100644
index 00000000..59dd904b
--- /dev/null
+++ b/ksvg/impl/SVGTransformableImpl.cc
@@ -0,0 +1,169 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGMatrixImpl.h"
+#include "SVGHelperImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGTransformListImpl.h"
+#include "SVGAnimatedTransformListImpl.h"
+#include "SVGElementImpl.h"
+#include "SVGDocumentImpl.h"
+
+using namespace KSVG;
+
+#include "SVGTransformableImpl.lut.h"
+#include "ksvg_bridge.h"
+
+SVGTransformableImpl::SVGTransformableImpl() : SVGLocatableImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_transform = new SVGAnimatedTransformListImpl();
+ m_transform->ref();
+
+ m_localMatrix = 0;
+}
+
+SVGTransformableImpl::SVGTransformableImpl(const SVGTransformableImpl &other) : SVGLocatableImpl()
+{
+ (*this) = other;
+}
+
+SVGTransformableImpl::~SVGTransformableImpl()
+{
+ if(m_transform)
+ m_transform->deref();
+ if(m_localMatrix)
+ m_localMatrix->deref();
+}
+
+SVGTransformableImpl &SVGTransformableImpl::operator=(const SVGTransformableImpl &other)
+{
+ SVGTransformListImpl *otherTransform = other.m_transform->baseVal();
+
+ // Concat computed values
+ for(unsigned int i = 0;i < otherTransform->numberOfItems(); i++)
+ {
+ SVGTransformImpl *trafo = otherTransform->getItem(i);
+ m_transform->baseVal()->insertItemBefore(SVGSVGElementImpl::createSVGTransformFromMatrix(trafo->matrix()), i);
+ }
+
+ return *this;
+}
+
+SVGAnimatedTransformListImpl *SVGTransformableImpl::transform() const
+{
+ return m_transform;
+}
+
+SVGMatrixImpl *SVGTransformableImpl::getCTM()
+{
+ SVGMatrixImpl *ctm = SVGSVGElementImpl::createSVGMatrix();
+
+ SVGElementImpl *element = dynamic_cast<SVGElementImpl *>(this);
+ Q_ASSERT(element);
+
+ DOM::Node parentNde = element->parentNode();
+
+ if(!parentNde.isNull() && parentNde.nodeType() != DOM::Node::DOCUMENT_NODE)
+ {
+ SVGElementImpl *parent = element->ownerDoc()->getElementFromHandle(parentNde.handle());
+ SVGLocatableImpl *locatableParent = dynamic_cast<SVGLocatableImpl *>(parent);
+
+ if(locatableParent)
+ {
+ SVGMatrixImpl *parentCTM = locatableParent->getCTM();
+ ctm->multiply(parentCTM);
+ parentCTM->deref();
+ }
+ }
+
+ if(m_localMatrix)
+ {
+ ctm->multiply(m_localMatrix);
+ }
+
+ return ctm;
+}
+
+void SVGTransformableImpl::updateLocalMatrix()
+{
+ if(m_transform->baseVal()->numberOfItems()>0)
+ {
+ if(m_localMatrix)
+ m_localMatrix->deref();
+
+ m_localMatrix = m_transform->baseVal()->concatenate();
+ }
+ else
+ {
+ if(m_localMatrix)
+ {
+ m_localMatrix->deref();
+ m_localMatrix = 0;
+ }
+ }
+
+ invalidateCachedMatrices();
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGTransformableImpl::s_hashTable 2
+ transform SVGTransformableImpl::Transform DontDelete
+@end
+*/
+
+Value SVGTransformableImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case Transform:
+ return m_transform->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGTransformableImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case Transform:
+ SVGHelperImpl::parseTransformAttribute(m_transform->baseVal(), value.toString(exec).qstring());
+ updateLocalMatrix();
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGTransformableImpl.h b/ksvg/impl/SVGTransformableImpl.h
new file mode 100644
index 00000000..edff5831
--- /dev/null
+++ b/ksvg/impl/SVGTransformableImpl.h
@@ -0,0 +1,77 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGTransformableImpl_H
+#define SVGTransformableImpl_H
+
+#include <qstring.h>
+
+#include "SVGLocatableImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGMatrixImpl;
+class SVGAnimatedTransformListImpl;
+
+class SVGTransformableImpl : public SVGLocatableImpl
+{
+public:
+ SVGTransformableImpl();
+ SVGTransformableImpl(const SVGTransformableImpl &);
+ virtual ~SVGTransformableImpl();
+
+ SVGTransformableImpl &operator=(const SVGTransformableImpl &);
+
+ SVGAnimatedTransformListImpl *transform() const;
+
+ virtual SVGMatrixImpl *getCTM();
+
+ // The local transformations concatenated together. 0 if
+ // there are no local transformations.
+ virtual const SVGMatrixImpl *localMatrix() { return m_localMatrix; }
+
+private:
+ SVGAnimatedTransformListImpl *m_transform;
+ SVGMatrixImpl *m_localMatrix;
+
+ void updateLocalMatrix();
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ Transform
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGURIReferenceImpl.cc b/ksvg/impl/SVGURIReferenceImpl.cc
new file mode 100644
index 00000000..a68b7442
--- /dev/null
+++ b/ksvg/impl/SVGURIReferenceImpl.cc
@@ -0,0 +1,135 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGURIReferenceImpl.h"
+#include "SVGAnimatedStringImpl.h"
+
+using namespace KSVG;
+
+#include "SVGURIReferenceImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+
+SVGURIReferenceImpl::SVGURIReferenceImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_href = new SVGAnimatedStringImpl();
+ m_href->ref();
+}
+
+SVGURIReferenceImpl::~SVGURIReferenceImpl()
+{
+ if(m_href)
+ m_href->deref();
+}
+
+SVGAnimatedStringImpl *SVGURIReferenceImpl::href() const
+{
+ return m_href;
+}
+
+bool SVGURIReferenceImpl::parseURIReference(const QString &urireference, QString &uri, QString &elementreference)
+{
+ int seperator = urireference.find("#");
+
+ if(seperator == -1)
+ return false;
+
+ uri = urireference.left(seperator);
+ elementreference = urireference.mid(seperator + 1);
+
+ return true;
+}
+
+bool SVGURIReferenceImpl::isUrl(const QString &url)
+{
+ QString temp = url.stripWhiteSpace();
+ return temp.startsWith("url(#") && temp.endsWith(")");
+}
+
+QString SVGURIReferenceImpl::getTarget(const QString &url)
+{
+ if(url.startsWith("url(")) // URI References, ie. fill:url(#target)
+ {
+ unsigned int start = url.find("#") + 1;
+ unsigned int end = url.findRev(")");
+
+ return url.mid(start, end - start);
+ }
+ else if(url.find("#") > -1) // format is #target
+ {
+ unsigned int start = url.find("#") + 1;
+
+ return url.mid(start, url.length() - start);
+ }
+ else // Normal Reference, ie. style="color-profile:changeColor"
+ return url;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGURIReferenceImpl::s_hashTable 2
+ href SVGURIReferenceImpl::Href DontDelete|ReadOnly
+@end
+*/
+
+Value SVGURIReferenceImpl::getValueProperty(ExecState *exec, int token) const
+{
+ switch(token)
+ {
+ case Href:
+ return m_href->cache(exec);
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGURIReferenceImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case Href:
+ {
+ if(m_href)
+ m_href->deref();
+
+ SVGAnimatedStringImpl *temp = new SVGAnimatedStringImpl();
+ temp->ref();
+ temp->setBaseVal(value.toString(exec).string());
+ m_href = temp;
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGURIReferenceImpl.h b/ksvg/impl/SVGURIReferenceImpl.h
new file mode 100644
index 00000000..d6ee42c5
--- /dev/null
+++ b/ksvg/impl/SVGURIReferenceImpl.h
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGURIReferenceImpl_H
+#define SVGURIReferenceImpl_H
+
+#include "ksvg_lookup.h"
+
+class QString;
+
+namespace KSVG
+{
+
+class SVGAnimatedStringImpl;
+class SVGURIReferenceImpl
+{
+public:
+ SVGURIReferenceImpl();
+ ~SVGURIReferenceImpl();
+
+ SVGAnimatedStringImpl *href() const;
+ static QString getTarget(const QString &url);
+ static bool isUrl(const QString &url);
+ static bool parseURIReference(const QString &urireference, QString &uri, QString &elementreference);
+
+protected:
+ SVGAnimatedStringImpl *m_href;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ Href
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGUnitConverter.h b/ksvg/impl/SVGUnitConverter.h
new file mode 100644
index 00000000..90c95796
--- /dev/null
+++ b/ksvg/impl/SVGUnitConverter.h
@@ -0,0 +1,100 @@
+/*
+ Copyright (C) 2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGUnitConverter_H
+#define SVGUnitConverter_H
+
+#include <qptrdict.h>
+
+#include <dom/dom_string.h>
+
+#include "SVGUnitTypes.h"
+#include "SVGShapeImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+
+namespace KSVG
+{
+
+class SVGUnitConverter
+{
+public:
+ SVGUnitConverter() { m_dict.setAutoDelete(true); }
+ ~SVGUnitConverter() { }
+
+ void add(SVGAnimatedLengthImpl *obj)
+ {
+ UnitData *data = new UnitData();
+ data->valueAsString = QString::null;
+
+ m_dict.insert(obj, data);
+ }
+
+ void modify(SVGAnimatedLengthImpl *obj, const QString &value)
+ {
+ UnitData *data = m_dict.find(obj);
+
+ if(data)
+ data->valueAsString = value;
+ }
+
+ void finalize(SVGShapeImpl *bboxContext, SVGShapeImpl *userContext, unsigned short unitType)
+ {
+ bool user = (unitType == SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
+ bool bbox = (unitType == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+
+ if(!user && !bbox) // Invalid unit type
+ return;
+
+ QPtrDictIterator<UnitData> it(m_dict);
+ for(; it.current(); ++it)
+ {
+ UnitData *data = it.current();
+
+ if(!data)
+ continue;
+
+ SVGAnimatedLengthImpl *obj = static_cast<SVGAnimatedLengthImpl *>(it.currentKey());
+
+ if(bbox)
+ obj->baseVal()->setBBoxContext(bboxContext);
+ else
+ obj->baseVal()->setBBoxContext(userContext);
+
+ if(user) // Just assign value, no conversion needed!
+ obj->baseVal()->setValueAsString(data->valueAsString);
+ else // Convert to objectBoundingBox
+ obj->baseVal()->setValueAsString(SVGLengthImpl::convertValToPercentage(data->valueAsString));
+ }
+ }
+
+private:
+ typedef struct
+ {
+ QString valueAsString; // Original value
+ } UnitData;
+
+ QPtrDict<UnitData> m_dict;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGUseElementImpl.cc b/ksvg/impl/SVGUseElementImpl.cc
new file mode 100644
index 00000000..3bd38a42
--- /dev/null
+++ b/ksvg/impl/SVGUseElementImpl.cc
@@ -0,0 +1,409 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qstring.h>
+
+#include "KSVGLoader.h"
+#include "KSVGCanvas.h"
+
+#include "SVGRectImpl.h"
+#include "SVGEventImpl.h"
+#include "SVGHelperImpl.h"
+#include "SVGMatrixImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGTransformImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGUseElementImpl.h"
+#include "SVGSymbolElementImpl.h"
+#include "SVGTransformListImpl.h"
+#include "SVGAnimatedStringImpl.h"
+#include "SVGAnimatedLengthImpl.h"
+#include "SVGElementInstanceImpl.h"
+#include "SVGAnimatedTransformListImpl.h"
+
+using namespace KSVG;
+
+#include "SVGUseElementImpl.lut.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGUseElementImpl::SVGUseElementImpl(DOM::ElementImpl *impl) : SVGShapeImpl(impl), SVGURIReferenceImpl(), SVGTestsImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl(), SVGStylableImpl(this), SVGTransformableImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_x = new SVGAnimatedLengthImpl();
+ m_x->ref();
+
+ m_y = new SVGAnimatedLengthImpl();
+ m_y->ref();
+
+ m_width = new SVGAnimatedLengthImpl();
+ m_width->ref();
+
+ m_height = new SVGAnimatedLengthImpl();
+ m_height->ref();
+
+ m_instanceRoot = 0;
+}
+
+SVGUseElementImpl::~SVGUseElementImpl()
+{
+ if(m_x)
+ m_x->deref();
+ if(m_y)
+ m_y->deref();
+ if(m_width)
+ m_width->deref();
+ if(m_height)
+ m_height->deref();
+ if(m_instanceRoot)
+ m_instanceRoot->deref();
+}
+
+SVGAnimatedLengthImpl *SVGUseElementImpl::x() const
+{
+ return m_x;
+}
+
+SVGAnimatedLengthImpl *SVGUseElementImpl::y() const
+{
+ return m_y;
+}
+
+SVGAnimatedLengthImpl *SVGUseElementImpl::width() const
+{
+ return m_width;
+}
+
+SVGAnimatedLengthImpl *SVGUseElementImpl::height() const
+{
+ return m_height;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGUseElementImpl::s_hashTable 11
+ x SVGUseElementImpl::X DontDelete|ReadOnly
+ y SVGUseElementImpl::Y DontDelete|ReadOnly
+ width SVGUseElementImpl::Width DontDelete|ReadOnly
+ height SVGUseElementImpl::Height DontDelete|ReadOnly
+ href SVGUseElementImpl::Href DontDelete|ReadOnly
+ instanceRoot SVGUseElementImpl::InstanceRoot DontDelete|ReadOnly
+ animatedInstanceRoot SVGUseElementImpl::AnimatedInstanceRoot DontDelete|ReadOnly
+@end
+*/
+
+Value SVGUseElementImpl::getValueProperty(ExecState *exec, int token) const
+{
+ KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case X:
+ if(!attributeMode)
+ return m_x->cache(exec);
+ else
+ return Number(m_x->baseVal()->value());
+ case Y:
+ if(!attributeMode)
+ return m_y->cache(exec);
+ else
+ return Number(m_y->baseVal()->value());
+ case Width:
+ if(!attributeMode)
+ return m_width->cache(exec);
+ else
+ return Number(m_width->baseVal()->value());
+ case Height:
+ if(!attributeMode)
+ return m_height->cache(exec);
+ else
+ return Number(m_height->baseVal()->value());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGUseElementImpl::putValueProperty(ExecState *exec, int token, const Value &value, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case X:
+ x()->baseVal()->setValue(value.toNumber(exec));
+ break;
+ case Y:
+ y()->baseVal()->setValue(value.toNumber(exec));
+ break;
+ case Width:
+ width()->baseVal()->setValue(value.toNumber(exec));
+ break;
+ case Height:
+ height()->baseVal()->setValue(value.toNumber(exec));
+ break;
+ case Href:
+ {
+ QString url = value.toString(exec).qstring();
+ href()->setBaseVal(SVGURIReferenceImpl::getTarget(url));
+ break;
+ }
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+SVGRectImpl *SVGUseElementImpl::getBBox()
+{
+ if(m_instanceRoot)
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(m_instanceRoot->correspondingElement());
+ if(KSVG_TOKEN_NOT_PARSED(Width) && KSVG_TOKEN_NOT_PARSED(Height) && shape)
+ return shape->getBBox();
+ }
+
+ SVGRectImpl *ret = new SVGRectImpl();
+ ret->ref();
+ ret->setX(m_x->baseVal()->value());
+ ret->setY(m_y->baseVal()->value());
+ ret->setWidth(m_width->baseVal()->value());
+ ret->setHeight(m_height->baseVal()->value());
+ return ret;
+}
+
+SVGElementInstanceImpl *SVGUseElementImpl::instanceRoot() const
+{
+ return m_instanceRoot;
+}
+
+SVGElementInstanceImpl *SVGUseElementImpl::animatedInstanceRoot() const
+{
+ return m_animatedInstanceRoot;
+}
+
+void SVGUseElementImpl::createItem(KSVGCanvas *c)
+{
+ if(!m_instanceRoot)
+ {
+ // ownerSVGElement()->getElementById() is wrong here.
+ // It could reference elements from other documents when using getURL (Niko)
+ QString filename, id;
+ DOM::DOMString url = getAttribute("href");
+ if(!SVGURIReferenceImpl::parseURIReference(url.string(), filename, id))
+ return;
+
+ SVGElementImpl *orig;
+ if(!filename.isEmpty())
+ {
+ KURL fragmentUrl(ownerDoc()->baseUrl(), url.string());
+
+ id = fragmentUrl.ref();
+ fragmentUrl.setRef(QString::null);
+
+ orig = KSVGLoader::getSVGFragment(fragmentUrl, ownerDoc(), id);
+ }
+ else
+ {
+ orig = ownerDoc()->getElementByIdRecursive(ownerSVGElement(), href()->baseVal());
+
+ if(orig == 0)
+ {
+ // The document will try to create this item again once the parsing has finished.
+ ownerDoc()->addForwardReferencingUseElement(this);
+ }
+ }
+
+ if(orig == 0)
+ return;
+
+ setReferencedElement(orig);
+
+ // Create a parent, a <g>
+ SVGElementImpl *parent = 0;
+ DOM::Element impl = static_cast<DOM::Document *>(ownerDoc())->createElement("g");
+ parent = SVGDocumentImpl::createElement("g", impl, ownerDoc());
+ SVGElementImpl *clone = orig->cloneNode(true);
+
+ // Apply the use-correction
+ QString trans;
+ trans += " translate(";
+ trans += QString::number(x()->baseVal()->value());
+ trans += " ";
+ trans += QString::number(y()->baseVal()->value());
+ trans += ")";
+
+ // Apply the transform attribute and render the element
+ parent->setAttributeInternal("transform", trans);
+ parent->setAttribute("transform", trans);
+
+ // Apply width/height if symbol
+ if(dynamic_cast<SVGSymbolElementImpl *>(clone))
+ {
+ DOM::Element impl = static_cast<DOM::Document *>(ownerDoc())->createElement("svg");
+ SVGElementImpl *symbolSvg = SVGDocumentImpl::createElement("svg", impl, ownerDoc());
+
+ SVGHelperImpl::copyAttributes(orig, symbolSvg);
+
+ symbolSvg->setAttribute("width", getAttribute("width"));
+ symbolSvg->setAttributeInternal("width", getAttribute("width"));
+ symbolSvg->setAttribute("height", getAttribute("height"));
+ symbolSvg->setAttributeInternal("height", getAttribute("height"));
+ DOM::Node node = clone->firstChild();
+ for(; !node.isNull(); node = clone->firstChild())
+ symbolSvg->appendChild(node);
+
+ clone = symbolSvg;
+ }
+ else if(dynamic_cast<SVGSVGElementImpl *>(clone))
+ {
+ if(!getAttribute("width").isEmpty())
+ {
+ clone->setAttribute("width", getAttribute("width"));
+ clone->setAttributeInternal("width", getAttribute("width"));
+ }
+
+ if(!getAttribute("height").isEmpty())
+ {
+ clone->setAttribute("height", getAttribute("height"));
+ clone->setAttributeInternal("height", getAttribute("height"));
+ }
+ }
+
+ appendChild(*parent);
+ parent->appendChild(*clone);
+
+ setupSubtree(parent, ownerSVGElement(), viewportElement());
+
+ m_instanceRoot->setCorrespondingElement(clone);
+
+ dynamic_cast<SVGLocatableImpl *>(parent)->updateCachedScreenCTM(screenCTM());
+
+ // Redirect local ecma event handlers to the correspondingElement
+ QPtrListIterator<SVGRegisteredEventListener> it(eventListeners());
+ SVGRegisteredEventListener *eventListener;
+ while((eventListener = it.current()) != 0)
+ {
+ ++it;
+ clone->setEventListener(eventListener->id, eventListener->listener);
+ }
+ }
+
+ if(m_instanceRoot)
+ {
+ SVGElementImpl *element = m_instanceRoot->correspondingElement();
+ element->createItem(c);
+ }
+}
+
+void SVGUseElementImpl::removeItem(KSVGCanvas *c)
+{
+ if(m_instanceRoot)
+ {
+ SVGElementImpl *element = m_instanceRoot->correspondingElement();
+ element->removeItem(c);
+ }
+}
+
+void SVGUseElementImpl::setupSubtree(SVGElementImpl *element, SVGSVGElementImpl *ownerSVG, SVGElementImpl *viewport)
+{
+ element->setOwnerSVGElement(ownerSVG);
+ element->setViewportElement(viewport);
+ element->setAttributes();
+
+ SVGSVGElementImpl *thisSVG = dynamic_cast<SVGSVGElementImpl *>(element);
+
+ if(thisSVG != 0)
+ {
+ ownerSVG = thisSVG;
+ viewport = element;
+ }
+
+ DOM::Node child = element->firstChild();
+ for(; !child.isNull(); child = child.nextSibling())
+ {
+ SVGElementImpl *childElement = ownerDoc()->getElementFromHandle(child.handle());
+ if(childElement != 0)
+ setupSubtree(childElement, ownerSVG, viewport);
+ }
+}
+
+void SVGUseElementImpl::setReferencedElement(SVGElementImpl *referenced)
+{
+ if(!referenced)
+ return;
+
+ if(!m_instanceRoot)
+ {
+ m_instanceRoot = new SVGElementInstanceImpl();
+ m_instanceRoot->ref();
+ }
+
+ m_instanceRoot->setCorrespondingElement(referenced);
+}
+
+void SVGUseElementImpl::update(CanvasItemUpdate reason, int param1, int param2)
+{
+ if(m_instanceRoot)
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(m_instanceRoot->correspondingElement());
+ if(shape)
+ shape->update(reason, param1, param2);
+ }
+}
+
+void SVGUseElementImpl::invalidate(KSVGCanvas *c, bool recalc)
+{
+ if(m_instanceRoot)
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(m_instanceRoot->correspondingElement());
+ if(shape)
+ shape->invalidate(c, recalc);
+ }
+}
+
+void SVGUseElementImpl::setReferenced(bool referenced)
+{
+ if(m_instanceRoot)
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(m_instanceRoot->correspondingElement());
+ if(shape)
+ shape->setReferenced(referenced);
+ }
+}
+
+void SVGUseElementImpl::draw()
+{
+ if(m_instanceRoot)
+ {
+ SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(m_instanceRoot->correspondingElement());
+ if(shape)
+ shape->draw();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGUseElementImpl.h b/ksvg/impl/SVGUseElementImpl.h
new file mode 100644
index 00000000..02eb8d88
--- /dev/null
+++ b/ksvg/impl/SVGUseElementImpl.h
@@ -0,0 +1,101 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGUseElementImpl_H
+#define SVGUseElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGTestsImpl.h"
+#include "SVGShapeImpl.h"
+#include "SVGStylableImpl.h"
+#include "SVGLangSpaceImpl.h"
+#include "SVGURIReferenceImpl.h"
+#include "SVGTransformableImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+namespace KSVG
+{
+
+class SVGAnimatedLengthImpl;
+class SVGElementInstanceImpl;
+class SVGUseElementImpl : public SVGShapeImpl,
+ public SVGURIReferenceImpl,
+ public SVGTestsImpl,
+ public SVGLangSpaceImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGStylableImpl,
+ public SVGTransformableImpl
+{
+public:
+ SVGUseElementImpl(DOM::ElementImpl *);
+ virtual ~SVGUseElementImpl();
+
+ SVGAnimatedLengthImpl *x() const;
+ SVGAnimatedLengthImpl *y() const;
+ SVGAnimatedLengthImpl *width() const;
+ SVGAnimatedLengthImpl *height() const;
+
+ SVGElementInstanceImpl *instanceRoot() const;
+ SVGElementInstanceImpl *animatedInstanceRoot() const;
+
+ virtual void createItem(KSVGCanvas *c);
+ virtual void removeItem(KSVGCanvas *c);
+ virtual void update(CanvasItemUpdate reason, int param1, int param2);
+ virtual void invalidate(KSVGCanvas *c, bool recalc);
+ virtual void setReferenced(bool referenced);
+ virtual void draw();
+
+ virtual SVGRectImpl *getBBox();
+
+ void setReferencedElement(SVGElementImpl *);
+
+private:
+ SVGAnimatedLengthImpl *m_x;
+ SVGAnimatedLengthImpl *m_y;
+ SVGAnimatedLengthImpl *m_width;
+ SVGAnimatedLengthImpl *m_height;
+ SVGElementInstanceImpl *m_instanceRoot;
+ SVGElementInstanceImpl *m_animatedInstanceRoot;
+
+ void setupSubtree(SVGElementImpl *element, SVGSVGElementImpl *ownerSVG, SVGElementImpl *viewport);
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ X, Y, Width, Height, Href, InstanceRoot, AnimatedInstanceRoot
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGUseElementImpl, "use")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGVKernElementImpl.cc b/ksvg/impl/SVGVKernElementImpl.cc
new file mode 100644
index 00000000..b89d6e6f
--- /dev/null
+++ b/ksvg/impl/SVGVKernElementImpl.cc
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGVKernElementImpl.h"
+
+using namespace KSVG;
+
+SVGVKernElementImpl::SVGVKernElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl)
+{
+}
+
+SVGVKernElementImpl::~SVGVKernElementImpl()
+{
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGVKernElementImpl.h b/ksvg/impl/SVGVKernElementImpl.h
new file mode 100644
index 00000000..c8302c35
--- /dev/null
+++ b/ksvg/impl/SVGVKernElementImpl.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGVKernElementImpl_H
+#define SVGVKernElementImpl_H
+
+#include "ksvg_lookup.h"
+
+#include "SVGElementImpl.h"
+
+namespace KSVG
+{
+
+class SVGVKernElementImpl : public SVGElementImpl
+{
+public:
+ SVGVKernElementImpl(DOM::ElementImpl *impl);
+ virtual ~SVGVKernElementImpl();
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGViewElementImpl.cc b/ksvg/impl/SVGViewElementImpl.cc
new file mode 100644
index 00000000..a051fba0
--- /dev/null
+++ b/ksvg/impl/SVGViewElementImpl.cc
@@ -0,0 +1,94 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGStringListImpl.h"
+#include "SVGViewElementImpl.h"
+
+using namespace KSVG;
+
+#include "SVGViewElementImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_ecma.h"
+
+SVGViewElementImpl::SVGViewElementImpl(DOM::ElementImpl *impl) : SVGElementImpl(impl), SVGExternalResourcesRequiredImpl(), SVGFitToViewBoxImpl(), SVGZoomAndPanImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_viewTarget = new SVGStringListImpl();
+ m_viewTarget->ref();
+}
+
+SVGViewElementImpl::~SVGViewElementImpl()
+{
+ if(m_viewTarget)
+ m_viewTarget->deref();
+}
+
+SVGStringListImpl *SVGViewElementImpl::viewTarget() const
+{
+ return m_viewTarget;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGViewElementImpl::s_hashTable 2
+ viewTarget SVGViewElementImpl::ViewTarget DontDelete|ReadOnly
+@end
+*/
+
+Value SVGViewElementImpl::getValueProperty(ExecState *, int token) const
+{
+ //KSVG_CHECK_ATTRIBUTE
+
+ switch(token)
+ {
+ case ViewTarget:
+ // TODO
+ return Undefined();
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+void SVGViewElementImpl::putValueProperty(ExecState *, int token, const Value &, int attr)
+{
+ // This class has just ReadOnly properties, only with the Internal flag set
+ // it's allowed to modify those.
+ if(!(attr & KJS::Internal))
+ return;
+
+ switch(token)
+ {
+ case ViewTarget:
+ // TODO
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGViewElementImpl.h b/ksvg/impl/SVGViewElementImpl.h
new file mode 100644
index 00000000..8b8d7e0b
--- /dev/null
+++ b/ksvg/impl/SVGViewElementImpl.h
@@ -0,0 +1,70 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGViewElementImpl_H
+#define SVGViewElementImpl_H
+
+#include "SVGElementImpl.h"
+#include "SVGZoomAndPanImpl.h"
+#include "SVGFitToViewBoxImpl.h"
+#include "SVGExternalResourcesRequiredImpl.h"
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGStringListImpl;
+class SVGViewElementImpl : public SVGElementImpl,
+ public SVGExternalResourcesRequiredImpl,
+ public SVGFitToViewBoxImpl,
+ public SVGZoomAndPanImpl
+{
+public:
+ SVGViewElementImpl(DOM::ElementImpl *);
+ virtual ~SVGViewElementImpl();
+
+ SVGStringListImpl *viewTarget() const;
+
+private:
+ SVGStringListImpl *m_viewTarget;
+
+public:
+ KSVG_GET
+ KSVG_PUT
+ KSVG_BRIDGE
+
+ enum
+ {
+ // Properties
+ ViewTarget
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+KSVG_REGISTER_ELEMENT(SVGViewElementImpl, "view")
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGViewSpecImpl.cc b/ksvg/impl/SVGViewSpecImpl.cc
new file mode 100644
index 00000000..07412cc5
--- /dev/null
+++ b/ksvg/impl/SVGViewSpecImpl.cc
@@ -0,0 +1,98 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include <qstringlist.h>
+
+#include "SVGElementImpl.h"
+#include "SVGViewSpecImpl.h"
+#include "SVGTransformListImpl.h"
+
+using namespace KSVG;
+
+SVGViewSpecImpl::SVGViewSpecImpl() : SVGZoomAndPanImpl(), SVGFitToViewBoxImpl()
+{
+ m_transform = new SVGTransformListImpl();
+ m_transform->ref();
+
+ m_viewTarget = new SVGElementImpl(0);
+ m_viewTarget->ref();
+}
+
+SVGViewSpecImpl::~SVGViewSpecImpl()
+{
+ if(m_transform)
+ m_transform->deref();
+ if(m_viewTarget)
+ m_viewTarget->deref();
+}
+
+SVGTransformListImpl *SVGViewSpecImpl::transform() const
+{
+ return m_transform;
+}
+
+SVGElementImpl *SVGViewSpecImpl::viewTarget() const
+{
+ return m_viewTarget;
+}
+
+DOM::DOMString SVGViewSpecImpl::viewBoxString() const
+{
+ return m_viewBoxString;
+}
+
+DOM::DOMString SVGViewSpecImpl::preserveAspectRatioString() const
+{
+ return m_preserveAspectRatioString;
+}
+
+DOM::DOMString SVGViewSpecImpl::transformString() const
+{
+ return m_transformString;
+}
+
+DOM::DOMString SVGViewSpecImpl::viewTargetString() const
+{
+ return m_viewTargetString;
+}
+
+bool SVGViewSpecImpl::parseViewSpec(const QString &s)
+{
+ if(!s.startsWith("svgView("))
+ return false;
+
+ // remove 'svgView(' and ')'
+ QStringList subAttrs = QStringList::split(';', s.mid(8));
+
+ for(QStringList::ConstIterator it = subAttrs.begin() ; it != subAttrs.end(); ++it)
+ {
+ if((*it).startsWith("viewBox("))
+ m_viewBoxString = (*it).mid(8);
+ else if((*it).startsWith("zoomAndPan("))
+ parseZoomAndPan(DOM::DOMString((*it).mid(11)));
+ else if((*it).startsWith("preserveAspectRatio("))
+ m_preserveAspectRatioString = (*it).mid(20);
+ }
+ return true;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGViewSpecImpl.h b/ksvg/impl/SVGViewSpecImpl.h
new file mode 100644
index 00000000..f9e01e48
--- /dev/null
+++ b/ksvg/impl/SVGViewSpecImpl.h
@@ -0,0 +1,69 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGViewSpecImpl_H
+#define SVGViewSpecImpl_H
+
+#include <dom/dom_string.h>
+#include <dom/dom_misc.h>
+
+#include "ksvg_lookup.h"
+
+#include "SVGZoomAndPanImpl.h"
+#include "SVGFitToViewBoxImpl.h"
+
+namespace KSVG
+{
+
+class SVGElementImpl;
+class SVGTransformListImpl;
+class SVGViewSpecImpl : public DOM::DomShared, public SVGZoomAndPanImpl, public SVGFitToViewBoxImpl
+{
+public:
+ SVGViewSpecImpl();
+ virtual ~SVGViewSpecImpl();
+
+ SVGTransformListImpl *transform() const;
+ SVGElementImpl *viewTarget() const;
+ DOM::DOMString viewBoxString() const;
+ DOM::DOMString preserveAspectRatioString() const;
+ DOM::DOMString transformString() const;
+ DOM::DOMString viewTargetString() const;
+
+ bool parseViewSpec(const QString &);
+
+private:
+ SVGTransformListImpl *m_transform;
+ SVGElementImpl *m_viewTarget;
+ DOM::DOMString m_viewBoxString;
+ DOM::DOMString m_preserveAspectRatioString;
+ DOM::DOMString m_transformString;
+ DOM::DOMString m_viewTargetString;
+
+public:
+ KSVG_FORWARDGET
+ KSVG_FORWARDPUT
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGWindowImpl.cc b/ksvg/impl/SVGWindowImpl.cc
new file mode 100644
index 00000000..b19847a4
--- /dev/null
+++ b/ksvg/impl/SVGWindowImpl.cc
@@ -0,0 +1,187 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "SVGWindowImpl.h"
+#include "SVGDocumentImpl.h"
+#include "SVGSVGElementImpl.h"
+#include "SVGEvent.h"
+#include "KSVGCanvas.h"
+#include <ksvg_ecma.h>
+#include <ksvg_scriptinterpreter.h>
+
+#include <qstylesheet.h>
+
+#include <kurl.h>
+#include <kmessagebox.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+
+using namespace KSVG;
+
+
+SVGWindowImpl::SVGWindowImpl()
+{
+ m_document = 0;
+}
+
+SVGWindowImpl::SVGWindowImpl(SVGDocumentImpl *doc)
+{
+ m_document = doc;
+ if(m_document)
+ m_document->ref();
+}
+
+SVGWindowImpl::~SVGWindowImpl()
+{
+ if(m_document)
+ m_document->deref();
+}
+
+/*StyleSheet SVGWindowImpl::defaultStyleSheet() const
+{
+ return m_defaultStyleSheet;
+}*/
+
+SVGDocumentImpl *SVGWindowImpl::document() const
+{
+ return m_document;
+}
+
+DOM::Event SVGWindowImpl::evt() const
+{
+ return KSVG::SVGEvent(m_document->ecmaEngine()->interpreter()->currentEvent());
+}
+
+long SVGWindowImpl::innerHeight() const
+{
+ return m_document ? int(m_document->canvas()->height()) : -1;
+}
+
+long SVGWindowImpl::innerWidth() const
+{
+ return m_document ? int(m_document->canvas()->width()) : -1;
+}
+
+void SVGWindowImpl::setSrc(const DOM::DOMString &/*src*/)
+{
+ // TODO : make KURL, load and parse doc
+}
+
+DOM::DOMString SVGWindowImpl::src() const
+{
+ if(!m_document)
+ return DOM::DOMString();
+ return m_document->baseUrl().prettyURL();
+}
+
+void SVGWindowImpl::clearInterval(long /*interval*/)
+{
+}
+
+void SVGWindowImpl::clearTimeout(long /*timeout*/)
+{
+}
+
+void SVGWindowImpl::getURL(const DOM::DOMString &/*uri*/, const DOM::EventListener &/*callback*/)
+{
+}
+
+/*DocumentFragment SVGWindowImpl::parseXML(const DOM::DOMString &source, const Document &document)
+{
+}*/
+
+void SVGWindowImpl::postURL(const DOM::DOMString &/*uri*/, const DOM::DOMString &/*data*/, const DOM::EventListener &/*callback*/, const DOM::DOMString &/*mimeType*/, const DOM::DOMString &/*contentEncoding*/)
+{
+}
+
+DOM::DOMString SVGWindowImpl::printNode(const DOM::Node &node, unsigned short level)
+{
+ QString ret;
+ if(node.isNull()) return ret;
+ SVGElementImpl *elem = m_document->getElementFromHandle(node.handle());
+ if(node.nodeType() == DOM::Node::DOCUMENT_NODE)
+ {
+ ret += "<\?xml version=\"1.0\" encoding=\"UTF-8\"\?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n" + printNode(node.firstChild()).string() + "\n";
+ }
+ else if(node.nodeType() == DOM::Node::TEXT_NODE)
+ {
+ printIndentation(ret, level);
+ ret += node.nodeValue().string();
+ }
+ else if(elem)
+ {
+ printIndentation(ret, level);
+ ret += "<" + elem->tagName().string();
+ // handle attrs
+ QDictIterator<DOM::DOMString> it(elem->attributes());
+ for(;it.current(); ++it)
+ ret += " " + it.currentKey() + "=\"" + it.current()->string() + '\"';
+ if(elem->firstChild().isNull()) // no children
+ ret += " />\n";
+ else // handle children
+ {
+ ret += ">\n";
+ for(DOM::Node child = node.firstChild();!child.isNull();child = child.nextSibling())
+ ret += printNode(child, level + 1).string();
+ printIndentation(ret, level);
+ ret += "</" + elem->tagName().string() + ">\n";
+ }
+ }
+ return ret;
+}
+
+void SVGWindowImpl::printIndentation(QString &ret, unsigned short level, unsigned short indent)
+{
+ for(int i = 0;i < indent * level;i++)
+ ret += " ";
+}
+
+long SVGWindowImpl::setInterval(const DOM::DOMString &/*code*/, const long &/*delay*/)
+{
+ return 0;
+}
+
+long SVGWindowImpl::setTimeout(const DOM::DOMString &/*code*/, const long &/*delay*/)
+{
+ return 0;
+}
+
+void SVGWindowImpl::alert(const DOM::DOMString &message, const QString &title)
+{
+ KMessageBox::error(0L, QStyleSheet::convertFromPlainText(message.string()), title);
+}
+
+bool SVGWindowImpl::confirm(const DOM::DOMString &message, const QString &title)
+{
+ return KMessageBox::warningContinueCancel(0L, QStyleSheet::convertFromPlainText(message.string()), title, KStdGuiItem::ok()) == KMessageBox::Continue;
+}
+
+DOM::DOMString SVGWindowImpl::prompt(const DOM::DOMString &message, const DOM::DOMString &_default, const QString &)
+{
+ bool ok;
+ QString str;
+ str = KInputDialog::getText(i18n("Prompt"), QStyleSheet::convertFromPlainText(message.string()), _default.string(), &ok);
+ if(ok)
+ return str;
+ else
+ return "";
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGWindowImpl.h b/ksvg/impl/SVGWindowImpl.h
new file mode 100644
index 00000000..0861809e
--- /dev/null
+++ b/ksvg/impl/SVGWindowImpl.h
@@ -0,0 +1,73 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGWindowImpl_H
+#define SVGWindowImpl_H
+
+#include <dom/dom_string.h>
+#include <dom/dom_node.h>
+#include <dom/dom_misc.h>
+#include <dom/dom2_events.h>
+
+namespace KSVG
+{
+class SVGDocumentImpl;
+
+class SVGWindowImpl : public DOM::DomShared
+{
+public:
+ SVGWindowImpl();
+ SVGWindowImpl(SVGDocumentImpl *doc);
+ virtual ~SVGWindowImpl();
+
+ //StyleSheet defaultStyleSheet() const;
+ SVGDocumentImpl *document() const;
+ DOM::Event evt() const;
+ long innerHeight() const;
+ long innerWidth() const;
+
+ void setSrc(const DOM::DOMString &src);
+ DOM::DOMString src() const;
+
+ void clearInterval(long interval);
+ void clearTimeout(long timeout);
+ void getURL(const DOM::DOMString &uri, const DOM::EventListener &callback);
+ //DocumentFragment parseXML(const DOM::DOMString &source, const Document &document);
+ void postURL(const DOM::DOMString &uri, const DOM::DOMString &data, const DOM::EventListener &callback, const DOM::DOMString &mimeType, const DOM::DOMString &contentEncoding);
+ DOM::DOMString printNode(const DOM::Node &node, unsigned short level = 0);
+ long setInterval(const DOM::DOMString &code, const long &delay);
+ long setTimeout(const DOM::DOMString &code, const long &delay);
+ static void alert(const DOM::DOMString &message, const QString &title = "SVG Window");
+ static bool confirm(const DOM::DOMString &message, const QString &title = "SVG Window");
+ static DOM::DOMString prompt(const DOM::DOMString &message, const DOM::DOMString &_default, const QString &title = "SVG Window");
+
+private:
+ void printIndentation(QString &ret, unsigned short level, unsigned short indent = 2);
+
+private:
+ //StyleSheet m_defaultStyleSheet;
+ SVGDocumentImpl *m_document;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGZoomAndPanImpl.cc b/ksvg/impl/SVGZoomAndPanImpl.cc
new file mode 100644
index 00000000..f3bf96ce
--- /dev/null
+++ b/ksvg/impl/SVGZoomAndPanImpl.cc
@@ -0,0 +1,112 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+
+#include "SVGZoomAndPan.h"
+#include "SVGZoomAndPanImpl.h"
+
+using namespace KSVG;
+
+#include "SVGZoomAndPanImpl.lut.h"
+#include "ksvg_scriptinterpreter.h"
+#include "ksvg_bridge.h"
+#include "ksvg_cacheimpl.h"
+
+SVGZoomAndPanImpl::SVGZoomAndPanImpl()
+{
+ KSVG_EMPTY_FLAGS
+
+ m_zoomAndPan = SVG_ZOOMANDPAN_MAGNIFY;
+}
+
+SVGZoomAndPanImpl::~SVGZoomAndPanImpl()
+{
+}
+
+void SVGZoomAndPanImpl::setZoomAndPan(unsigned short zoomAndPan)
+{
+ m_zoomAndPan = zoomAndPan;
+}
+
+unsigned short SVGZoomAndPanImpl::zoomAndPan() const
+{
+ return m_zoomAndPan;
+}
+
+void SVGZoomAndPanImpl::parseZoomAndPan(const DOM::DOMString &attr)
+{
+ if(attr == "disable")
+ m_zoomAndPan = SVG_ZOOMANDPAN_DISABLE;
+}
+
+// Ecma stuff
+
+/*
+@namespace KSVG
+@begin SVGZoomAndPanImpl::s_hashTable 2
+ zoomAndPan SVGZoomAndPanImpl::ZoomAndPan DontDelete
+@end
+*/
+
+Value SVGZoomAndPanImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case ZoomAndPan:
+ return Number(zoomAndPan());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return KJS::Undefined();
+ }
+}
+
+void SVGZoomAndPanImpl::putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int)
+{
+ switch(token)
+ {
+ case ZoomAndPan:
+ parseZoomAndPan(value.toString(exec).string());
+ break;
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ }
+}
+
+/*
+@namespace KSVG
+@begin SVGZoomAndPanImplConstructor::s_hashTable 5
+ SVG_ZOOMANDPAN_UNKNOWN KSVG::SVG_ZOOMANDPAN_UNKNOWN DontDelete|ReadOnly
+ SVG_ZOOMANDPAN_DISABLE KSVG::SVG_ZOOMANDPAN_DISABLE DontDelete|ReadOnly
+ SVG_ZOOMANDPAN_MAGNIFY KSVG::SVG_ZOOMANDPAN_MAGNIFY DontDelete|ReadOnly
+@end
+*/
+
+Value SVGZoomAndPanImplConstructor::getValueProperty(ExecState *, int token) const
+{
+ return Number(token);
+}
+
+Value KSVG::getSVGZoomAndPanImplConstructor(ExecState *exec)
+{
+ return cacheGlobalBridge<SVGZoomAndPanImplConstructor>(exec, "[[svgzoomandpan.constructor]]");
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGZoomAndPanImpl.h b/ksvg/impl/SVGZoomAndPanImpl.h
new file mode 100644
index 00000000..ed7fef98
--- /dev/null
+++ b/ksvg/impl/SVGZoomAndPanImpl.h
@@ -0,0 +1,76 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGZoomAndPanImpl_H
+#define SVGZoomAndPanImpl_H
+
+#include <dom/dom_misc.h>
+#include <dom/dom_string.h>
+
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGZoomAndPanImpl
+{
+public:
+ SVGZoomAndPanImpl();
+ virtual ~SVGZoomAndPanImpl();
+
+ void setZoomAndPan(unsigned short zoomAndPan);
+ unsigned short zoomAndPan() const;
+
+ void parseZoomAndPan(const DOM::DOMString &attr);
+
+private:
+ unsigned short m_zoomAndPan;
+
+public:
+ KSVG_BASECLASS_GET
+ KSVG_PUT
+
+ enum
+ {
+ // Properties
+ ZoomAndPan
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+ void putValueProperty(KJS::ExecState *exec, int token, const KJS::Value &value, int attr);
+};
+
+class SVGZoomAndPanImplConstructor : public KJS::ObjectImp
+{
+public:
+ SVGZoomAndPanImplConstructor(KJS::ExecState *) { }
+ KJS::Value getValueProperty(KJS::ExecState *, int token) const;
+
+ // no put - all read-only
+ KSVG_GET
+};
+
+KJS::Value getSVGZoomAndPanImplConstructor(KJS::ExecState *exec);
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGZoomEventImpl.cc b/ksvg/impl/SVGZoomEventImpl.cc
new file mode 100644
index 00000000..448309f0
--- /dev/null
+++ b/ksvg/impl/SVGZoomEventImpl.cc
@@ -0,0 +1,111 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include "SVGRectImpl.h"
+#include "SVGPointImpl.h"
+#include "SVGZoomEventImpl.h"
+
+using namespace KSVG;
+
+#include "SVGZoomEventImpl.lut.h"
+#include "SVGSVGElementImpl.h"
+
+using namespace KJS;
+
+SVGZoomEventImpl::SVGZoomEventImpl(SVGEvent::EventId _id,
+ bool canBubbleArg,
+ bool cancelableArg,
+ DOM::AbstractView &viewArg,
+ long detailArg,
+ float previousScale, SVGPointImpl *previousTranslate,
+ float newScale, SVGPointImpl *newTranslate)
+: SVGUIEventImpl(_id, canBubbleArg, cancelableArg, viewArg, detailArg), m_previousScale( previousScale ), m_newScale( newScale )
+{
+ m_zoomRectScreen = SVGSVGElementImpl::createSVGRect();
+ m_previousTranslate = previousTranslate;
+ if(m_previousTranslate)
+ m_previousTranslate->ref();
+ m_newTranslate = newTranslate;
+ if(m_newTranslate)
+ m_newTranslate->ref();
+}
+
+SVGZoomEventImpl::~SVGZoomEventImpl()
+{
+ if(m_zoomRectScreen)
+ m_zoomRectScreen->deref();
+ if(m_previousTranslate)
+ m_previousTranslate->deref();
+ if(m_newTranslate)
+ m_newTranslate->deref();
+}
+
+SVGRectImpl *SVGZoomEventImpl::zoomRectScreen() const
+{
+ return m_zoomRectScreen;
+}
+
+float SVGZoomEventImpl::previousScale() const
+{
+ return m_previousScale;
+}
+
+SVGPointImpl *SVGZoomEventImpl::previousTranslate() const
+{
+ return m_previousTranslate;
+}
+
+float SVGZoomEventImpl::newScale() const
+{
+ return m_newScale;
+}
+
+SVGPointImpl *SVGZoomEventImpl::newTranslate() const
+{
+ return m_newTranslate;
+}
+
+/*
+@namespace KSVG
+@begin SVGZoomEventImpl::s_hashTable 7
+ zoomRectScreen SVGZoomEventImpl::ZoomRectScreen DontDelete|ReadOnly
+ previousScale SVGZoomEventImpl::PreviousScale DontDelete|ReadOnly
+ previousTranslate SVGZoomEventImpl::PreviousTranslate DontDelete|ReadOnly
+ newScale SVGZoomEventImpl::NewScale DontDelete|ReadOnly
+ newTranslate SVGZoomEventImpl::NewTranslate DontDelete|ReadOnly
+@end
+*/
+
+Value SVGZoomEventImpl::getValueProperty(ExecState *, int token) const
+{
+ switch(token)
+ {
+ case PreviousScale:
+ return Number(previousScale());
+ case NewScale:
+ return Number(newScale());
+ default:
+ kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
+ return Undefined();
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/SVGZoomEventImpl.h b/ksvg/impl/SVGZoomEventImpl.h
new file mode 100644
index 00000000..41706a37
--- /dev/null
+++ b/ksvg/impl/SVGZoomEventImpl.h
@@ -0,0 +1,77 @@
+/*
+ Copyright (C) 2001-2003 KSVG Team
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGZoomEventImpl_H
+#define SVGZoomEventImpl_H
+
+#include "SVGEventImpl.h"
+#include "ksvg_lookup.h"
+
+namespace KSVG
+{
+
+class SVGRectImpl;
+class SVGPointImpl;
+class SVGZoomEventImpl : public SVGUIEventImpl
+{
+public:
+ SVGZoomEventImpl(SVGEvent::EventId _id,
+ bool canBubbleArg,
+ bool cancelableArg,
+ DOM::AbstractView &viewArg,
+ long detailArg,
+ float previousScale, SVGPointImpl *previousTranslate,
+ float newScale, SVGPointImpl *newTranslate);
+ virtual ~SVGZoomEventImpl();
+
+ SVGRectImpl *zoomRectScreen() const;
+
+ float previousScale() const;
+ SVGPointImpl *previousTranslate() const;
+
+ float newScale() const;
+ SVGPointImpl *newTranslate() const;
+
+private:
+ SVGRectImpl *m_zoomRectScreen;
+
+ float m_previousScale;
+ SVGPointImpl *m_previousTranslate;
+
+ float m_newScale;
+ SVGPointImpl *m_newTranslate;
+
+public:
+ KSVG_GET
+
+ enum
+ {
+ // Properties
+ ZoomRectScreen, PreviousScale, PreviousTranslate, NewScale, NewTranslate
+ };
+
+ KJS::Value getValueProperty(KJS::ExecState *exec, int token) const;
+};
+
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/TODO b/ksvg/impl/TODO
new file mode 100644
index 00000000..8cfd4c4a
--- /dev/null
+++ b/ksvg/impl/TODO
@@ -0,0 +1,5 @@
+* cleanup SVGSVGElementImpl
+* cleanup SVGShapeImpl
+* fix SVGStringListImpl
+* attriubuteMode get() for SVGGlyphElementImpl
+* default attributes, ... for SVGGlyphElementImpl
diff --git a/ksvg/impl/generateddata.cpp b/ksvg/impl/generateddata.cpp
new file mode 100644
index 00000000..5a4b3d7b
--- /dev/null
+++ b/ksvg/impl/generateddata.cpp
@@ -0,0 +1,8899 @@
+#include <ksvg_lookup.h>
+#include <ksvg_ecma.h>
+#include <SVGZoomEventImpl.h>
+#include <SVGVKernElementImpl.h>
+#include <SVGList.h>
+#include <SVGTRefElementImpl.h>
+#include <SVGSVGElementImpl.h>
+#include <SVGFETurbulenceElementImpl.h>
+#include <SVGElementInstanceImpl.h>
+#include <SVGAnimateElementImpl.h>
+#include <SVGFEGaussianBlurElementImpl.h>
+#include <SVGZoomAndPanImpl.h>
+#include <SVGFEFuncRElementImpl.h>
+#include <SVGPathSegListImpl.h>
+#include <SVGFEFuncAElementImpl.h>
+#include <SVGFESpecularLightingElementImpl.h>
+#include <SVGComponentTransferFunctionElementImpl.h>
+#include <SVGICCColorImpl.h>
+#include <SVGFEPointLightElementImpl.h>
+#include <SVGMissingGlyphElementImpl.h>
+#include <SVGFontFaceFormatElementImpl.h>
+#include <SVGFontFaceUriElementImpl.h>
+#include <SVGFEMorphologyElementImpl.h>
+#include <SVGPaintServerImpl.h>
+#include <SVGStringListImpl.h>
+#include <SVGPolyElementImpl.h>
+#include <SVGLinearGradientElementImpl.h>
+#include <svgpathparser.h>
+#include <SVGTextPathElementImpl.h>
+#include <SVGNumberImpl.h>
+#include <SVGPathSegImpl.h>
+#include <SVGElementInstanceListImpl.h>
+#include <SVGAnimatedIntegerImpl.h>
+#include <SVGLocatableImpl.h>
+#include <SVGAngleImpl.h>
+#include <SVGAnimatedPreserveAspectRatioImpl.h>
+#include <SVGColorImpl.h>
+#include <SVGEllipseElementImpl.h>
+#include <SVGGlyphRefElementImpl.h>
+#include <SVGScriptElementImpl.h>
+#include <SVGDocumentImpl.h>
+#include <SVGAElementImpl.h>
+#include <SVGAltGlyphDefElementImpl.h>
+#include <SVGPathSegCurvetoQuadraticSmoothImpl.h>
+#include <SVGFontElementImpl.h>
+#include <SVGGElementImpl.h>
+#include <SVGPathSegLinetoImpl.h>
+#include <SVGForeignObjectElementImpl.h>
+#include <SVGAnimatedStringImpl.h>
+#include <SVGAnimatedTransformListImpl.h>
+#include <SVGPatternElementImpl.h>
+#include <SVGAltGlyphElementImpl.h>
+#include <SVGElementImpl.h>
+#include <SVGStylableImpl.h>
+#include <SVGCSSRuleImpl.h>
+#include <SVGFESpotLightElementImpl.h>
+#include <SVGPreserveAspectRatioImpl.h>
+#include <SVGColorProfileRuleImpl.h>
+#include <SVGContainerImpl.h>
+#include <SVGAnimateTransformElementImpl.h>
+#include <SVGMatrixImpl.h>
+#include <SVGEcma.h>
+#include <SVGAnimatedLengthListImpl.h>
+#include <SVGAnimatedAngleImpl.h>
+#include <SVGURIReferenceImpl.h>
+#include <SVGPolylineElementImpl.h>
+#include <SVGDefinitionSrcElementImpl.h>
+#include <SVGPathSegLinetoHorizontalImpl.h>
+#include <SVGCursorElementImpl.h>
+#include <SVGFitToViewBoxImpl.h>
+#include <SVGEventImpl.h>
+#include <SVGMetadataElementImpl.h>
+#include <SVGLengthImpl.h>
+#include <SVGTransformableImpl.h>
+#include <SVGLengthListImpl.h>
+#include <SVGTitleElementImpl.h>
+#include <SVGTSpanElementImpl.h>
+#include <SVGDescElementImpl.h>
+#include <SVGTextContentElementImpl.h>
+#include <SVGFEFuncBElementImpl.h>
+#include <SVGMPathElementImpl.h>
+#include <SVGDefsElementImpl.h>
+#include <SVGAnimateMotionElementImpl.h>
+#include <SVGStyleElementImpl.h>
+#include <SVGSwitchElementImpl.h>
+#include <SVGTransformListImpl.h>
+#include <SVGPointListImpl.h>
+#include <SVGFECompositeElementImpl.h>
+#include <SVGHKernElementImpl.h>
+#include <SVGFontFaceElementImpl.h>
+#include <SVGPathSegMovetoImpl.h>
+#include <SVGPathSegLinetoVerticalImpl.h>
+#include <SVGAnimatedLengthImpl.h>
+#include <SVGFEBlendElementImpl.h>
+#include <SVGLangSpaceImpl.h>
+#include <SVGRadialGradientElementImpl.h>
+#include <SVGAnimatedRectImpl.h>
+#include <SVGFilterPrimitiveStandardAttributesImpl.h>
+#include <SVGPathElementImpl.h>
+#include <SVGStopElementImpl.h>
+#include <SVGAnimateColorElementImpl.h>
+#include <SVGPathSegArcImpl.h>
+#include <SVGAnimatedPointsImpl.h>
+#include <SVGUseElementImpl.h>
+#include <SVGViewSpecImpl.h>
+#include <SVGFEMergeNodeElementImpl.h>
+#include <SVGHelperImpl.h>
+#include <SVGFEDiffuseLightingElementImpl.h>
+#include <SVGSymbolElementImpl.h>
+#include <SVGFEFloodElementImpl.h>
+#include <SVGAnimatedNumberListImpl.h>
+#include <SVGExternalResourcesRequiredImpl.h>
+#include <SVGFETileElementImpl.h>
+#include <SVGTextPositioningElementImpl.h>
+#include <SVGGlyphElementImpl.h>
+#include <SVGAnimatedBooleanImpl.h>
+#include <SVGSetElementImpl.h>
+#include <SVGFontFaceSrcElementImpl.h>
+#include <SVGTextElementImpl.h>
+#include <SVGFEMergeElementImpl.h>
+#include <SVGMarkerElementImpl.h>
+#include <SVGViewElementImpl.h>
+#include <SVGFEFuncGElementImpl.h>
+#include <SVGColorProfileElementImpl.h>
+#include <SVGGradientElementImpl.h>
+#include <SVGFEConvolveMatrixElementImpl.h>
+#include <SVGFontFaceNameElementImpl.h>
+#include <SVGLineElementImpl.h>
+#include <SVGUnitConverter.h>
+#include <SVGFEColorMatrixElementImpl.h>
+#include <SVGCircleElementImpl.h>
+#include <SVGTestsImpl.h>
+#include <SVGRectElementImpl.h>
+#include <SVGRectImpl.h>
+#include <SVGPolygonElementImpl.h>
+#include <SVGTimeScheduler.h>
+#include <SVGNumberListImpl.h>
+#include <SVGPathSegCurvetoCubicSmoothImpl.h>
+#include <SVGPointImpl.h>
+#include <SVGFEDistantLightElementImpl.h>
+#include <SVGPathSegCurvetoCubicImpl.h>
+#include <SVGFEComponentTransferElementImpl.h>
+#include <SVGWindowImpl.h>
+#include <SVGMaskElementImpl.h>
+#include <SVGShapeImpl.h>
+#include <SVGAnimatedEnumerationImpl.h>
+#include <SVGAnimatedPathDataImpl.h>
+#include <SVGFEOffsetElementImpl.h>
+#include <SVGPaintImpl.h>
+#include <SVGFilterElementImpl.h>
+#include <SVGImageElementImpl.h>
+#include <SVGAnimatedNumberImpl.h>
+#include <SVGAnimationElementImpl.h>
+#include <SVGFEDisplacementMapElementImpl.h>
+#include <SVGPathSegClosePathImpl.h>
+#include <SVGTransformImpl.h>
+#include <SVGFEImageElementImpl.h>
+#include <SVGPathSegCurvetoQuadraticImpl.h>
+#include <SVGClipPathElementImpl.h>
+
+using namespace KSVG;
+using namespace KJS;
+
+#include "ksvg_cacheimpl.h"
+
+// For all classes with generated data: the ClassInfo
+const DOM::DOMString SVGAElementImpl::s_tagName = "a";
+const ClassInfo SVGAElementImpl::s_classInfo = {"KSVG::SVGAElementImpl",0,&SVGAElementImpl::s_hashTable,0};
+const DOM::DOMString SVGAltGlyphDefElementImpl::s_tagName = "altGlyphDef";
+const ClassInfo SVGAltGlyphDefElementImpl::s_classInfo = {"KSVG::SVGAltGlyphDefElementImpl",0,0,0};
+const DOM::DOMString SVGAltGlyphElementImpl::s_tagName = "altGlyph";
+const ClassInfo SVGAltGlyphElementImpl::s_classInfo = {"KSVG::SVGAltGlyphElementImpl",0,0,0};
+const ClassInfo SVGAngleImpl::s_classInfo = {"KSVG::SVGAngleImpl",0,&SVGAngleImpl::s_hashTable,0};
+const ClassInfo SVGAngleImplConstructor::s_classInfo = {"KSVG::SVGAngleImplConstructor",0,&SVGAngleImplConstructor::s_hashTable,0};
+const DOM::DOMString SVGAnimateColorElementImpl::s_tagName = "animateColor";
+const ClassInfo SVGAnimateColorElementImpl::s_classInfo = {"KSVG::SVGAnimateColorElementImpl",0,0,0};
+const DOM::DOMString SVGAnimateElementImpl::s_tagName = "animate";
+const ClassInfo SVGAnimateElementImpl::s_classInfo = {"KSVG::SVGAnimateElementImpl",0,0,0};
+const DOM::DOMString SVGAnimateMotionElementImpl::s_tagName = "animateMotion";
+const ClassInfo SVGAnimateMotionElementImpl::s_classInfo = {"KSVG::SVGAnimateMotionElementImpl",0,0,0};
+const DOM::DOMString SVGAnimateTransformElementImpl::s_tagName = "animateTransform";
+const ClassInfo SVGAnimateTransformElementImpl::s_classInfo = {"KSVG::SVGAnimateTransformElementImpl",0,0,0};
+const ClassInfo SVGAnimatedAngleImpl::s_classInfo = {"KSVG::SVGAnimatedAngleImpl",0,&SVGAnimatedAngleImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedBooleanImpl::s_classInfo = {"KSVG::SVGAnimatedBooleanImpl",0,&SVGAnimatedBooleanImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedEnumerationImpl::s_classInfo = {"KSVG::SVGAnimatedEnumerationImpl",0,&SVGAnimatedEnumerationImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedIntegerImpl::s_classInfo = {"KSVG::SVGAnimatedIntegerImpl",0,&SVGAnimatedIntegerImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedLengthImpl::s_classInfo = {"KSVG::SVGAnimatedLengthImpl",0,&SVGAnimatedLengthImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedLengthListImpl::s_classInfo = {"KSVG::SVGAnimatedLengthListImpl",0,&SVGAnimatedLengthListImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedNumberImpl::s_classInfo = {"KSVG::SVGAnimatedNumberImpl",0,&SVGAnimatedNumberImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedNumberListImpl::s_classInfo = {"KSVG::SVGAnimatedNumberListImpl",0,&SVGAnimatedNumberListImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedPathDataImpl::s_classInfo = {"KSVG::SVGAnimatedPathDataImpl",0,&SVGAnimatedPathDataImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedPointsImpl::s_classInfo = {"KSVG::SVGAnimatedPointsImpl",0,&SVGAnimatedPointsImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedPreserveAspectRatioImpl::s_classInfo = {"KSVG::SVGAnimatedPreserveAspectRatioImpl",0,&SVGAnimatedPreserveAspectRatioImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedRectImpl::s_classInfo = {"KSVG::SVGAnimatedRectImpl",0,&SVGAnimatedRectImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedStringImpl::s_classInfo = {"KSVG::SVGAnimatedStringImpl",0,&SVGAnimatedStringImpl::s_hashTable,0};
+const ClassInfo SVGAnimatedTransformListImpl::s_classInfo = {"KSVG::SVGAnimatedTransformListImpl",0,&SVGAnimatedTransformListImpl::s_hashTable,0};
+const ClassInfo SVGAnimationElementImpl::s_classInfo = {"KSVG::SVGAnimationElementImpl",0,&SVGAnimationElementImpl::s_hashTable,0};
+const DOM::DOMString SVGCircleElementImpl::s_tagName = "circle";
+const ClassInfo SVGCircleElementImpl::s_classInfo = {"KSVG::SVGCircleElementImpl",0,&SVGCircleElementImpl::s_hashTable,0};
+const DOM::DOMString SVGClipPathElementImpl::s_tagName = "clipPath";
+const ClassInfo SVGClipPathElementImpl::s_classInfo = {"KSVG::SVGClipPathElementImpl",0,&SVGClipPathElementImpl::s_hashTable,0};
+const ClassInfo SVGColorImpl::s_classInfo = {"KSVG::SVGColorImpl",0,&SVGColorImpl::s_hashTable,0};
+const ClassInfo SVGColorImplConstructor::s_classInfo = {"KSVG::SVGColorImplConstructor",0,&SVGColorImplConstructor::s_hashTable,0};
+const DOM::DOMString SVGColorProfileElementImpl::s_tagName = "color-profile";
+const ClassInfo SVGColorProfileElementImpl::s_classInfo = {"KSVG::SVGColorProfileElementImpl",0,&SVGColorProfileElementImpl::s_hashTable,0};
+const ClassInfo SVGComponentTransferFunctionElementImpl::s_classInfo = {"KSVG::SVGComponentTransferFunctionElementImpl",0,0,0};
+const ClassInfo SVGContainerImpl::s_classInfo = {"KSVG::SVGContainerImpl",0,0,0};
+const ClassInfo SVGCursorElementImpl::s_classInfo = {"KSVG::SVGCursorElementImpl",0,&SVGCursorElementImpl::s_hashTable,0};
+const ClassInfo SVGDOMCharacterDataBridge::s_classInfo = {"KSVG::SVGDOMCharacterDataBridge",0,&SVGDOMCharacterDataBridge::s_hashTable,0};
+const ClassInfo SVGDOMDOMImplementationBridge::s_classInfo = {"KSVG::SVGDOMDOMImplementationBridge",0,&SVGDOMDOMImplementationBridge::s_hashTable,0};
+const ClassInfo SVGDOMDocumentFragmentBridge::s_classInfo = {"KSVG::SVGDOMDocumentFragmentBridge",0,&SVGDOMDocumentFragmentBridge::s_hashTable,0};
+const ClassInfo SVGDOMElementBridge::s_classInfo = {"KSVG::SVGDOMElementBridge",0,&SVGDOMElementBridge::s_hashTable,0};
+const ClassInfo SVGDOMNodeBridge::s_classInfo = {"KSVG::SVGDOMNodeBridge",0,&SVGDOMNodeBridge::s_hashTable,0};
+const ClassInfo SVGDOMNodeListBridge::s_classInfo = {"KSVG::SVGDOMNodeListBridge",0,&SVGDOMNodeListBridge::s_hashTable,0};
+const ClassInfo SVGDOMTextBridge::s_classInfo = {"KSVG::SVGDOMTextBridge",0,&SVGDOMTextBridge::s_hashTable,0};
+const ClassInfo SVGDefinitionSrcElementImpl::s_classInfo = {"KSVG::SVGDefinitionSrcElementImpl",0,0,0};
+const DOM::DOMString SVGDefsElementImpl::s_tagName = "defs";
+const ClassInfo SVGDefsElementImpl::s_classInfo = {"KSVG::SVGDefsElementImpl",0,0,0};
+const DOM::DOMString SVGDescElementImpl::s_tagName = "desc";
+const ClassInfo SVGDescElementImpl::s_classInfo = {"KSVG::SVGDescElementImpl",0,0,0};
+const ClassInfo SVGDocumentImpl::s_classInfo = {"KSVG::SVGDocumentImpl",0,&SVGDocumentImpl::s_hashTable,0};
+const ClassInfo SVGElementImpl::s_classInfo = {"KSVG::SVGElementImpl",0,&SVGElementImpl::s_hashTable,0};
+const DOM::DOMString SVGEllipseElementImpl::s_tagName = "ellipse";
+const ClassInfo SVGEllipseElementImpl::s_classInfo = {"KSVG::SVGEllipseElementImpl",0,&SVGEllipseElementImpl::s_hashTable,0};
+const ClassInfo SVGEventImpl::s_classInfo = {"KSVG::SVGEventImpl",0,&SVGEventImpl::s_hashTable,0};
+const ClassInfo SVGExternalResourcesRequiredImpl::s_classInfo = {"KSVG::SVGExternalResourcesRequiredImpl",0,&SVGExternalResourcesRequiredImpl::s_hashTable,0};
+const ClassInfo SVGFEBlendElementImpl::s_classInfo = {"KSVG::SVGFEBlendElementImpl",0,0,0};
+const ClassInfo SVGFEColorMatrixElementImpl::s_classInfo = {"KSVG::SVGFEColorMatrixElementImpl",0,0,0};
+const ClassInfo SVGFEComponentTransferElementImpl::s_classInfo = {"KSVG::SVGFEComponentTransferElementImpl",0,0,0};
+const ClassInfo SVGFECompositeElementImpl::s_classInfo = {"KSVG::SVGFECompositeElementImpl",0,0,0};
+const ClassInfo SVGFEConvolveMatrixElementImpl::s_classInfo = {"KSVG::SVGFEConvolveMatrixElementImpl",0,0,0};
+const ClassInfo SVGFEDiffuseLightingElementImpl::s_classInfo = {"KSVG::SVGFEDiffuseLightingElementImpl",0,0,0};
+const ClassInfo SVGFEDisplacementMapElementImpl::s_classInfo = {"KSVG::SVGFEDisplacementMapElementImpl",0,0,0};
+const ClassInfo SVGFEDistantLightElementImpl::s_classInfo = {"KSVG::SVGFEDistantLightElementImpl",0,0,0};
+const ClassInfo SVGFEFloodElementImpl::s_classInfo = {"KSVG::SVGFEFloodElementImpl",0,0,0};
+const ClassInfo SVGFEFuncAElementImpl::s_classInfo = {"KSVG::SVGFEFuncAElementImpl",0,0,0};
+const ClassInfo SVGFEFuncBElementImpl::s_classInfo = {"KSVG::SVGFEFuncBElementImpl",0,0,0};
+const ClassInfo SVGFEFuncGElementImpl::s_classInfo = {"KSVG::SVGFEFuncGElementImpl",0,0,0};
+const ClassInfo SVGFEFuncRElementImpl::s_classInfo = {"KSVG::SVGFEFuncRElementImpl",0,0,0};
+const ClassInfo SVGFEGaussianBlurElementImpl::s_classInfo = {"KSVG::SVGFEGaussianBlurElementImpl",0,0,0};
+const ClassInfo SVGFEImageElementImpl::s_classInfo = {"KSVG::SVGFEImageElementImpl",0,0,0};
+const ClassInfo SVGFEMergeElementImpl::s_classInfo = {"KSVG::SVGFEMergeElementImpl",0,0,0};
+const ClassInfo SVGFEMergeNodeElementImpl::s_classInfo = {"KSVG::SVGFEMergeNodeElementImpl",0,0,0};
+const ClassInfo SVGFEMorphologyElementImpl::s_classInfo = {"KSVG::SVGFEMorphologyElementImpl",0,0,0};
+const ClassInfo SVGFEOffsetElementImpl::s_classInfo = {"KSVG::SVGFEOffsetElementImpl",0,0,0};
+const ClassInfo SVGFEPointLightElementImpl::s_classInfo = {"KSVG::SVGFEPointLightElementImpl",0,0,0};
+const ClassInfo SVGFESpecularLightingElementImpl::s_classInfo = {"KSVG::SVGFESpecularLightingElementImpl",0,0,0};
+const ClassInfo SVGFESpotLightElementImpl::s_classInfo = {"KSVG::SVGFESpotLightElementImpl",0,0,0};
+const ClassInfo SVGFETileElementImpl::s_classInfo = {"KSVG::SVGFETileElementImpl",0,0,0};
+const ClassInfo SVGFETurbulenceElementImpl::s_classInfo = {"KSVG::SVGFETurbulenceElementImpl",0,0,0};
+const ClassInfo SVGFilterElementImpl::s_classInfo = {"KSVG::SVGFilterElementImpl",0,0,0};
+const ClassInfo SVGFitToViewBoxImpl::s_classInfo = {"KSVG::SVGFitToViewBoxImpl",0,&SVGFitToViewBoxImpl::s_hashTable,0};
+const ClassInfo SVGFontElementImpl::s_classInfo = {"KSVG::SVGFontElementImpl",0,0,0};
+const ClassInfo SVGFontFaceElementImpl::s_classInfo = {"KSVG::SVGFontFaceElementImpl",0,0,0};
+const ClassInfo SVGFontFaceFormatElementImpl::s_classInfo = {"KSVG::SVGFontFaceFormatElementImpl",0,0,0};
+const ClassInfo SVGFontFaceNameElementImpl::s_classInfo = {"KSVG::SVGFontFaceNameElementImpl",0,0,0};
+const ClassInfo SVGFontFaceSrcElementImpl::s_classInfo = {"KSVG::SVGFontFaceSrcElementImpl",0,0,0};
+const ClassInfo SVGFontFaceUriElementImpl::s_classInfo = {"KSVG::SVGFontFaceUriElementImpl",0,0,0};
+const ClassInfo SVGForeignObjectElementImpl::s_classInfo = {"KSVG::SVGForeignObjectElementImpl",0,&SVGForeignObjectElementImpl::s_hashTable,0};
+const DOM::DOMString SVGGElementImpl::s_tagName = "g";
+const ClassInfo SVGGElementImpl::s_classInfo = {"KSVG::SVGGElementImpl",0,0,0};
+const DOM::DOMString SVGGlyphElementImpl::s_tagName = "glyph";
+const ClassInfo SVGGlyphElementImpl::s_classInfo = {"KSVG::SVGGlyphElementImpl",0,&SVGGlyphElementImpl::s_hashTable,0};
+const DOM::DOMString SVGGlyphRefElementImpl::s_tagName = "glyphRef";
+const ClassInfo SVGGlyphRefElementImpl::s_classInfo = {"KSVG::SVGGlyphRefElementImpl",0,&SVGGlyphRefElementImpl::s_hashTable,0};
+const ClassInfo SVGGradientElementImpl::s_classInfo = {"KSVG::SVGGradientElementImpl",0,&SVGGradientElementImpl::s_hashTable,0};
+const ClassInfo SVGGradientElementImplConstructor::s_classInfo = {"KSVG::SVGGradientElementImplConstructor",0,&SVGGradientElementImplConstructor::s_hashTable,0};
+const ClassInfo SVGHKernElementImpl::s_classInfo = {"KSVG::SVGHKernElementImpl",0,0,0};
+const ClassInfo SVGICCColorImpl::s_classInfo = {"KSVG::SVGICCColorImpl",0,&SVGICCColorImpl::s_hashTable,0};
+const DOM::DOMString SVGImageElementImpl::s_tagName = "image";
+const ClassInfo SVGImageElementImpl::s_classInfo = {"KSVG::SVGImageElementImpl",0,&SVGImageElementImpl::s_hashTable,0};
+const ClassInfo SVGKeyEventImpl::s_classInfo = {"KSVG::SVGKeyEventImpl",0,&SVGKeyEventImpl::s_hashTable,0};
+const ClassInfo SVGLangSpaceImpl::s_classInfo = {"KSVG::SVGLangSpaceImpl",0,&SVGLangSpaceImpl::s_hashTable,0};
+const ClassInfo SVGLengthImpl::s_classInfo = {"KSVG::SVGLengthImpl",0,&SVGLengthImpl::s_hashTable,0};
+const ClassInfo SVGLengthImplConstructor::s_classInfo = {"KSVG::SVGLengthImplConstructor",0,&SVGLengthImplConstructor::s_hashTable,0};
+const ClassInfo SVGLengthListImpl::s_classInfo = {"KSVG::SVGLengthListImpl",0,&SVGLengthListImpl::s_hashTable,0};
+const DOM::DOMString SVGLineElementImpl::s_tagName = "line";
+const ClassInfo SVGLineElementImpl::s_classInfo = {"KSVG::SVGLineElementImpl",0,&SVGLineElementImpl::s_hashTable,0};
+const DOM::DOMString SVGLinearGradientElementImpl::s_tagName = "linearGradient";
+const ClassInfo SVGLinearGradientElementImpl::s_classInfo = {"KSVG::SVGLinearGradientElementImpl",0,&SVGLinearGradientElementImpl::s_hashTable,0};
+const ClassInfo SVGLocatableImpl::s_classInfo = {"KSVG::SVGLocatableImpl",0,&SVGLocatableImpl::s_hashTable,0};
+const ClassInfo SVGMPathElementImpl::s_classInfo = {"KSVG::SVGMPathElementImpl",0,0,0};
+const DOM::DOMString SVGMarkerElementImpl::s_tagName = "marker";
+const ClassInfo SVGMarkerElementImpl::s_classInfo = {"KSVG::SVGMarkerElementImpl",0,&SVGMarkerElementImpl::s_hashTable,0};
+const ClassInfo SVGMarkerElementImplConstructor::s_classInfo = {"KSVG::SVGMarkerElementImplConstructor",0,&SVGMarkerElementImplConstructor::s_hashTable,0};
+const DOM::DOMString SVGMaskElementImpl::s_tagName = "mask";
+const ClassInfo SVGMaskElementImpl::s_classInfo = {"KSVG::SVGMaskElementImpl",0,&SVGMaskElementImpl::s_hashTable,0};
+const ClassInfo SVGMatrixImpl::s_classInfo = {"KSVG::SVGMatrixImpl",0,&SVGMatrixImpl::s_hashTable,0};
+const ClassInfo SVGMetadataElementImpl::s_classInfo = {"KSVG::SVGMetadataElementImpl",0,0,0};
+const ClassInfo SVGMissingGlyphElementImpl::s_classInfo = {"KSVG::SVGMissingGlyphElementImpl",0,0,0};
+const ClassInfo SVGMouseEventImpl::s_classInfo = {"KSVG::SVGMouseEventImpl",0,&SVGMouseEventImpl::s_hashTable,0};
+const ClassInfo SVGMutationEventImpl::s_classInfo = {"KSVG::SVGMutationEventImpl",0,0,0};
+const ClassInfo SVGNumberImpl::s_classInfo = {"KSVG::SVGNumberImpl",0,&SVGNumberImpl::s_hashTable,0};
+const ClassInfo SVGNumberListImpl::s_classInfo = {"KSVG::SVGNumberListImpl",0,&SVGNumberListImpl::s_hashTable,0};
+const ClassInfo SVGPaintImpl::s_classInfo = {"KSVG::SVGPaintImpl",0,&SVGPaintImpl::s_hashTable,0};
+const ClassInfo SVGPaintImplConstructor::s_classInfo = {"KSVG::SVGPaintImplConstructor",0,&SVGPaintImplConstructor::s_hashTable,0};
+const DOM::DOMString SVGPathElementImpl::s_tagName = "path";
+const ClassInfo SVGPathElementImpl::s_classInfo = {"KSVG::SVGPathElementImpl",0,&SVGPathElementImpl::s_hashTable,0};
+const ClassInfo SVGPathSegArcAbsImpl::s_classInfo = {"KSVG::SVGPathSegArcAbsImpl",0,&SVGPathSegArcAbsImpl::s_hashTable,0};
+const ClassInfo SVGPathSegArcRelImpl::s_classInfo = {"KSVG::SVGPathSegArcRelImpl",0,&SVGPathSegArcRelImpl::s_hashTable,0};
+const ClassInfo SVGPathSegClosePathImpl::s_classInfo = {"KSVG::SVGPathSegClosePathImpl",0,0,0};
+const ClassInfo SVGPathSegCurvetoCubicAbsImpl::s_classInfo = {"KSVG::SVGPathSegCurvetoCubicAbsImpl",0,&SVGPathSegCurvetoCubicAbsImpl::s_hashTable,0};
+const ClassInfo SVGPathSegCurvetoCubicRelImpl::s_classInfo = {"KSVG::SVGPathSegCurvetoCubicRelImpl",0,&SVGPathSegCurvetoCubicRelImpl::s_hashTable,0};
+const ClassInfo SVGPathSegCurvetoCubicSmoothAbsImpl::s_classInfo = {"KSVG::SVGPathSegCurvetoCubicSmoothAbsImpl",0,&SVGPathSegCurvetoCubicSmoothAbsImpl::s_hashTable,0};
+const ClassInfo SVGPathSegCurvetoCubicSmoothRelImpl::s_classInfo = {"KSVG::SVGPathSegCurvetoCubicSmoothRelImpl",0,&SVGPathSegCurvetoCubicSmoothRelImpl::s_hashTable,0};
+const ClassInfo SVGPathSegCurvetoQuadraticAbsImpl::s_classInfo = {"KSVG::SVGPathSegCurvetoQuadraticAbsImpl",0,&SVGPathSegCurvetoQuadraticAbsImpl::s_hashTable,0};
+const ClassInfo SVGPathSegCurvetoQuadraticRelImpl::s_classInfo = {"KSVG::SVGPathSegCurvetoQuadraticRelImpl",0,&SVGPathSegCurvetoQuadraticRelImpl::s_hashTable,0};
+const ClassInfo SVGPathSegCurvetoQuadraticSmoothAbsImpl::s_classInfo = {"KSVG::SVGPathSegCurvetoQuadraticSmoothAbsImpl",0,&SVGPathSegCurvetoQuadraticSmoothAbsImpl::s_hashTable,0};
+const ClassInfo SVGPathSegCurvetoQuadraticSmoothRelImpl::s_classInfo = {"KSVG::SVGPathSegCurvetoQuadraticSmoothRelImpl",0,&SVGPathSegCurvetoQuadraticSmoothRelImpl::s_hashTable,0};
+const ClassInfo SVGPathSegImpl::s_classInfo = {"KSVG::SVGPathSegImpl",0,&SVGPathSegImpl::s_hashTable,0};
+const ClassInfo SVGPathSegImplConstructor::s_classInfo = {"KSVG::SVGPathSegImplConstructor",0,&SVGPathSegImplConstructor::s_hashTable,0};
+const ClassInfo SVGPathSegLinetoAbsImpl::s_classInfo = {"KSVG::SVGPathSegLinetoAbsImpl",0,&SVGPathSegLinetoAbsImpl::s_hashTable,0};
+const ClassInfo SVGPathSegLinetoHorizontalAbsImpl::s_classInfo = {"KSVG::SVGPathSegLinetoHorizontalAbsImpl",0,&SVGPathSegLinetoHorizontalAbsImpl::s_hashTable,0};
+const ClassInfo SVGPathSegLinetoHorizontalRelImpl::s_classInfo = {"KSVG::SVGPathSegLinetoHorizontalRelImpl",0,&SVGPathSegLinetoHorizontalRelImpl::s_hashTable,0};
+const ClassInfo SVGPathSegLinetoRelImpl::s_classInfo = {"KSVG::SVGPathSegLinetoRelImpl",0,&SVGPathSegLinetoRelImpl::s_hashTable,0};
+const ClassInfo SVGPathSegLinetoVerticalAbsImpl::s_classInfo = {"KSVG::SVGPathSegLinetoVerticalAbsImpl",0,&SVGPathSegLinetoVerticalAbsImpl::s_hashTable,0};
+const ClassInfo SVGPathSegLinetoVerticalRelImpl::s_classInfo = {"KSVG::SVGPathSegLinetoVerticalRelImpl",0,&SVGPathSegLinetoVerticalRelImpl::s_hashTable,0};
+const ClassInfo SVGPathSegListImpl::s_classInfo = {"KSVG::SVGPathSegListImpl",0,&SVGPathSegListImpl::s_hashTable,0};
+const ClassInfo SVGPathSegMovetoAbsImpl::s_classInfo = {"KSVG::SVGPathSegMovetoAbsImpl",0,&SVGPathSegMovetoAbsImpl::s_hashTable,0};
+const ClassInfo SVGPathSegMovetoRelImpl::s_classInfo = {"KSVG::SVGPathSegMovetoRelImpl",0,&SVGPathSegMovetoRelImpl::s_hashTable,0};
+const DOM::DOMString SVGPatternElementImpl::s_tagName = "pattern";
+const ClassInfo SVGPatternElementImpl::s_classInfo = {"KSVG::SVGPatternElementImpl",0,&SVGPatternElementImpl::s_hashTable,0};
+const ClassInfo SVGPointImpl::s_classInfo = {"KSVG::SVGPointImpl",0,&SVGPointImpl::s_hashTable,0};
+const ClassInfo SVGPointListImpl::s_classInfo = {"KSVG::SVGPointListImpl",0,&SVGPointListImpl::s_hashTable,0};
+const ClassInfo SVGPolyElementImpl::s_classInfo = {"KSVG::SVGPolyElementImpl",0,0,0};
+const DOM::DOMString SVGPolygonElementImpl::s_tagName = "polygon";
+const ClassInfo SVGPolygonElementImpl::s_classInfo = {"KSVG::SVGPolygonElementImpl",0,0,0};
+const DOM::DOMString SVGPolylineElementImpl::s_tagName = "polyline";
+const ClassInfo SVGPolylineElementImpl::s_classInfo = {"KSVG::SVGPolylineElementImpl",0,0,0};
+const ClassInfo SVGPreserveAspectRatioImpl::s_classInfo = {"KSVG::SVGPreserveAspectRatioImpl",0,&SVGPreserveAspectRatioImpl::s_hashTable,0};
+const ClassInfo SVGPreserveAspectRatioImplConstructor::s_classInfo = {"KSVG::SVGPreserveAspectRatioImplConstructor",0,&SVGPreserveAspectRatioImplConstructor::s_hashTable,0};
+const DOM::DOMString SVGRadialGradientElementImpl::s_tagName = "radialGradient";
+const ClassInfo SVGRadialGradientElementImpl::s_classInfo = {"KSVG::SVGRadialGradientElementImpl",0,&SVGRadialGradientElementImpl::s_hashTable,0};
+const DOM::DOMString SVGRectElementImpl::s_tagName = "rect";
+const ClassInfo SVGRectElementImpl::s_classInfo = {"KSVG::SVGRectElementImpl",0,&SVGRectElementImpl::s_hashTable,0};
+const ClassInfo SVGRectImpl::s_classInfo = {"KSVG::SVGRectImpl",0,&SVGRectImpl::s_hashTable,0};
+const DOM::DOMString SVGSVGElementImpl::s_tagName = "svg";
+const ClassInfo SVGSVGElementImpl::s_classInfo = {"KSVG::SVGSVGElementImpl",0,&SVGSVGElementImpl::s_hashTable,0};
+const DOM::DOMString SVGScriptElementImpl::s_tagName = "script";
+const ClassInfo SVGScriptElementImpl::s_classInfo = {"KSVG::SVGScriptElementImpl",0,&SVGScriptElementImpl::s_hashTable,0};
+const DOM::DOMString SVGSetElementImpl::s_tagName = "set";
+const ClassInfo SVGSetElementImpl::s_classInfo = {"KSVG::SVGSetElementImpl",0,0,0};
+const ClassInfo SVGShapeImpl::s_classInfo = {"KSVG::SVGShapeImpl",0,0,0};
+const DOM::DOMString SVGStopElementImpl::s_tagName = "stop";
+const ClassInfo SVGStopElementImpl::s_classInfo = {"KSVG::SVGStopElementImpl",0,&SVGStopElementImpl::s_hashTable,0};
+const ClassInfo SVGStringListImpl::s_classInfo = {"KSVG::SVGStringListImpl",0,&SVGStringListImpl::s_hashTable,0};
+const ClassInfo SVGStylableImpl::s_classInfo = {"KSVG::SVGStylableImpl",0,&SVGStylableImpl::s_hashTable,0};
+const DOM::DOMString SVGStyleElementImpl::s_tagName = "style";
+const ClassInfo SVGStyleElementImpl::s_classInfo = {"KSVG::SVGStyleElementImpl",0,&SVGStyleElementImpl::s_hashTable,0};
+const DOM::DOMString SVGSwitchElementImpl::s_tagName = "switch";
+const ClassInfo SVGSwitchElementImpl::s_classInfo = {"KSVG::SVGSwitchElementImpl",0,0,0};
+const DOM::DOMString SVGSymbolElementImpl::s_tagName = "symbol";
+const ClassInfo SVGSymbolElementImpl::s_classInfo = {"KSVG::SVGSymbolElementImpl",0,&SVGSymbolElementImpl::s_hashTable,0};
+const DOM::DOMString SVGTRefElementImpl::s_tagName = "tref";
+const ClassInfo SVGTRefElementImpl::s_classInfo = {"KSVG::SVGTRefElementImpl",0,0,0};
+const DOM::DOMString SVGTSpanElementImpl::s_tagName = "tspan";
+const ClassInfo SVGTSpanElementImpl::s_classInfo = {"KSVG::SVGTSpanElementImpl",0,0,0};
+const ClassInfo SVGTestsImpl::s_classInfo = {"KSVG::SVGTestsImpl",0,&SVGTestsImpl::s_hashTable,0};
+const ClassInfo SVGTextContentElementImpl::s_classInfo = {"KSVG::SVGTextContentElementImpl",0,&SVGTextContentElementImpl::s_hashTable,0};
+const ClassInfo SVGTextContentElementImplConstructor::s_classInfo = {"KSVG::SVGTextContentElementImplConstructor",0,&SVGTextContentElementImplConstructor::s_hashTable,0};
+const DOM::DOMString SVGTextElementImpl::s_tagName = "text";
+const ClassInfo SVGTextElementImpl::s_classInfo = {"KSVG::SVGTextElementImpl",0,0,0};
+const DOM::DOMString SVGTextPathElementImpl::s_tagName = "textPath";
+const ClassInfo SVGTextPathElementImpl::s_classInfo = {"KSVG::SVGTextPathElementImpl",0,&SVGTextPathElementImpl::s_hashTable,0};
+const ClassInfo SVGTextPathElementImplConstructor::s_classInfo = {"KSVG::SVGTextPathElementImplConstructor",0,&SVGTextPathElementImplConstructor::s_hashTable,0};
+const ClassInfo SVGTextPositioningElementImpl::s_classInfo = {"KSVG::SVGTextPositioningElementImpl",0,&SVGTextPositioningElementImpl::s_hashTable,0};
+const DOM::DOMString SVGTitleElementImpl::s_tagName = "title";
+const ClassInfo SVGTitleElementImpl::s_classInfo = {"KSVG::SVGTitleElementImpl",0,0,0};
+const ClassInfo SVGTransformImpl::s_classInfo = {"KSVG::SVGTransformImpl",0,&SVGTransformImpl::s_hashTable,0};
+const ClassInfo SVGTransformImplConstructor::s_classInfo = {"KSVG::SVGTransformImplConstructor",0,&SVGTransformImplConstructor::s_hashTable,0};
+const ClassInfo SVGTransformListImpl::s_classInfo = {"KSVG::SVGTransformListImpl",0,&SVGTransformListImpl::s_hashTable,0};
+const ClassInfo SVGTransformableImpl::s_classInfo = {"KSVG::SVGTransformableImpl",0,&SVGTransformableImpl::s_hashTable,0};
+const ClassInfo SVGUIEventImpl::s_classInfo = {"KSVG::SVGUIEventImpl",0,&SVGUIEventImpl::s_hashTable,0};
+const ClassInfo SVGURIReferenceImpl::s_classInfo = {"KSVG::SVGURIReferenceImpl",0,&SVGURIReferenceImpl::s_hashTable,0};
+const DOM::DOMString SVGUseElementImpl::s_tagName = "use";
+const ClassInfo SVGUseElementImpl::s_classInfo = {"KSVG::SVGUseElementImpl",0,&SVGUseElementImpl::s_hashTable,0};
+const ClassInfo SVGVKernElementImpl::s_classInfo = {"KSVG::SVGVKernElementImpl",0,0,0};
+const DOM::DOMString SVGViewElementImpl::s_tagName = "view";
+const ClassInfo SVGViewElementImpl::s_classInfo = {"KSVG::SVGViewElementImpl",0,&SVGViewElementImpl::s_hashTable,0};
+const ClassInfo SVGViewSpecImpl::s_classInfo = {"KSVG::SVGViewSpecImpl",0,0,0};
+const ClassInfo SVGZoomAndPanImpl::s_classInfo = {"KSVG::SVGZoomAndPanImpl",0,&SVGZoomAndPanImpl::s_hashTable,0};
+const ClassInfo SVGZoomAndPanImplConstructor::s_classInfo = {"KSVG::SVGZoomAndPanImplConstructor",0,&SVGZoomAndPanImplConstructor::s_hashTable,0};
+const ClassInfo SVGZoomEventImpl::s_classInfo = {"KSVG::SVGZoomEventImpl",0,&SVGZoomEventImpl::s_hashTable,0};
+const ClassInfo SharedString::s_classInfo = {"KSVG::SharedString",0,&SharedString::s_hashTable,0};
+
+bool SVGAElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGContainerImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGAElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) return SVGContainerImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGAElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGAElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGAElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) {
+ SVGContainerImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGAElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGAElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGAElementImpl>(p1,const_cast<SVGAElementImpl *>(this));
+}
+
+Value SVGAElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAElementImpl,KSVGRWBridge<SVGAElementImpl> >(p1,const_cast<SVGAElementImpl *>(this)));
+}
+
+bool SVGAltGlyphDefElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGAltGlyphDefElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGAltGlyphDefElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGAltGlyphDefElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGAltGlyphDefElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGAltGlyphDefElementImpl>(p1,const_cast<SVGAltGlyphDefElementImpl *>(this));
+}
+
+Value SVGAltGlyphDefElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAltGlyphDefElementImpl,KSVGRWBridge<SVGAltGlyphDefElementImpl> >(p1,const_cast<SVGAltGlyphDefElementImpl *>(this)));
+}
+
+bool SVGAltGlyphElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGTSpanElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGAltGlyphElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGTSpanElementImpl::hasProperty(p1,p2)) return SVGTSpanElementImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGAltGlyphElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGTSpanElementImpl::hasProperty(p1,p2)) {
+ SVGTSpanElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGAltGlyphElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGAltGlyphElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGAltGlyphElementImpl>(p1,const_cast<SVGAltGlyphElementImpl *>(this));
+}
+
+Value SVGAltGlyphElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAltGlyphElementImpl,KSVGRWBridge<SVGAltGlyphElementImpl> >(p1,const_cast<SVGAltGlyphElementImpl *>(this)));
+}
+
+bool SVGAngleImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAngleImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGAngleImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGAngleImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGAngleImplProtoFunc,SVGAngleImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGAngleImpl *SVGAngleImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGAngleImpl> *test = dynamic_cast<const KSVGBridge<SVGAngleImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGAngleImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGAngleImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGAngleImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGAngleImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGAngleImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGAngleImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGAngleImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAngleImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAngleImpl,KSVGRWBridge<SVGAngleImpl> >(p1,const_cast<SVGAngleImpl *>(this)));
+}
+
+bool SVGAngleImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAngleImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAngleImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAngleImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAngleImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGAngleImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAngleImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAngleImplConstructor,KSVGBridge<SVGAngleImplConstructor> >(p1,const_cast<SVGAngleImplConstructor *>(this)));
+}
+
+bool SVGAnimateColorElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGAnimateColorElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) return SVGAnimationElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGAnimateColorElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) {
+ SVGAnimationElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGAnimateColorElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGAnimateColorElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGAnimateColorElementImpl>(p1,const_cast<SVGAnimateColorElementImpl *>(this));
+}
+
+Value SVGAnimateColorElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimateColorElementImpl,KSVGRWBridge<SVGAnimateColorElementImpl> >(p1,const_cast<SVGAnimateColorElementImpl *>(this)));
+}
+
+bool SVGAnimateElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGAnimateElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) return SVGAnimationElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGAnimateElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) {
+ SVGAnimationElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGAnimateElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGAnimateElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGAnimateElementImpl>(p1,const_cast<SVGAnimateElementImpl *>(this));
+}
+
+Value SVGAnimateElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimateElementImpl,KSVGRWBridge<SVGAnimateElementImpl> >(p1,const_cast<SVGAnimateElementImpl *>(this)));
+}
+
+bool SVGAnimateMotionElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGAnimateMotionElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) return SVGAnimationElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGAnimateMotionElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) {
+ SVGAnimationElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGAnimateMotionElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGAnimateMotionElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGAnimateMotionElementImpl>(p1,const_cast<SVGAnimateMotionElementImpl *>(this));
+}
+
+Value SVGAnimateMotionElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimateMotionElementImpl,KSVGRWBridge<SVGAnimateMotionElementImpl> >(p1,const_cast<SVGAnimateMotionElementImpl *>(this)));
+}
+
+bool SVGAnimateTransformElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGAnimateTransformElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) return SVGAnimationElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGAnimateTransformElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) {
+ SVGAnimationElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGAnimateTransformElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGAnimateTransformElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGAnimateTransformElementImpl>(p1,const_cast<SVGAnimateTransformElementImpl *>(this));
+}
+
+Value SVGAnimateTransformElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimateTransformElementImpl,KSVGRWBridge<SVGAnimateTransformElementImpl> >(p1,const_cast<SVGAnimateTransformElementImpl *>(this)));
+}
+
+bool SVGAnimatedAngleImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedAngleImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedAngleImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedAngleImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedAngleImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGAnimatedAngleImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedAngleImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedAngleImpl,KSVGBridge<SVGAnimatedAngleImpl> >(p1,const_cast<SVGAnimatedAngleImpl *>(this)));
+}
+
+bool SVGAnimatedBooleanImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedBooleanImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedBooleanImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedBooleanImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedBooleanImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGAnimatedBooleanImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGAnimatedBooleanImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGAnimatedBooleanImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGAnimatedBooleanImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedBooleanImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedBooleanImpl,KSVGRWBridge<SVGAnimatedBooleanImpl> >(p1,const_cast<SVGAnimatedBooleanImpl *>(this)));
+}
+
+bool SVGAnimatedEnumerationImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedEnumerationImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedEnumerationImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedEnumerationImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedEnumerationImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGAnimatedEnumerationImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGAnimatedEnumerationImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGAnimatedEnumerationImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGAnimatedEnumerationImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedEnumerationImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedEnumerationImpl,KSVGRWBridge<SVGAnimatedEnumerationImpl> >(p1,const_cast<SVGAnimatedEnumerationImpl *>(this)));
+}
+
+bool SVGAnimatedIntegerImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedIntegerImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedIntegerImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedIntegerImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedIntegerImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGAnimatedIntegerImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGAnimatedIntegerImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGAnimatedIntegerImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGAnimatedIntegerImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedIntegerImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedIntegerImpl,KSVGRWBridge<SVGAnimatedIntegerImpl> >(p1,const_cast<SVGAnimatedIntegerImpl *>(this)));
+}
+
+bool SVGAnimatedLengthImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedLengthImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedLengthImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedLengthImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedLengthImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGAnimatedLengthImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedLengthImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedLengthImpl,KSVGBridge<SVGAnimatedLengthImpl> >(p1,const_cast<SVGAnimatedLengthImpl *>(this)));
+}
+
+bool SVGAnimatedLengthListImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedLengthListImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedLengthListImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedLengthListImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedLengthListImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGAnimatedLengthListImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedLengthListImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedLengthListImpl,KSVGBridge<SVGAnimatedLengthListImpl> >(p1,const_cast<SVGAnimatedLengthListImpl *>(this)));
+}
+
+bool SVGAnimatedNumberImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedNumberImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedNumberImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedNumberImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedNumberImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGAnimatedNumberImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGAnimatedNumberImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGAnimatedNumberImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGAnimatedNumberImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedNumberImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedNumberImpl,KSVGRWBridge<SVGAnimatedNumberImpl> >(p1,const_cast<SVGAnimatedNumberImpl *>(this)));
+}
+
+bool SVGAnimatedNumberListImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedNumberListImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedNumberListImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedNumberListImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedNumberListImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGAnimatedNumberListImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedNumberListImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedNumberListImpl,KSVGBridge<SVGAnimatedNumberListImpl> >(p1,const_cast<SVGAnimatedNumberListImpl *>(this)));
+}
+
+bool SVGAnimatedPathDataImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedPathDataImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedPathDataImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedPathDataImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedPathDataImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGAnimatedPathDataImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedPathDataImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedPathDataImpl,KSVGBridge<SVGAnimatedPathDataImpl> >(p1,const_cast<SVGAnimatedPathDataImpl *>(this)));
+}
+
+bool SVGAnimatedPointsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedPointsImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedPointsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedPointsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedPointsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGAnimatedPointsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGAnimatedPointsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGAnimatedPointsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGAnimatedPointsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedPointsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedPointsImpl,KSVGRWBridge<SVGAnimatedPointsImpl> >(p1,const_cast<SVGAnimatedPointsImpl *>(this)));
+}
+
+bool SVGAnimatedPreserveAspectRatioImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedPreserveAspectRatioImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedPreserveAspectRatioImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedPreserveAspectRatioImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedPreserveAspectRatioImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGAnimatedPreserveAspectRatioImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedPreserveAspectRatioImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedPreserveAspectRatioImpl,KSVGBridge<SVGAnimatedPreserveAspectRatioImpl> >(p1,const_cast<SVGAnimatedPreserveAspectRatioImpl *>(this)));
+}
+
+bool SVGAnimatedRectImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedRectImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedRectImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedRectImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedRectImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGAnimatedRectImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedRectImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedRectImpl,KSVGBridge<SVGAnimatedRectImpl> >(p1,const_cast<SVGAnimatedRectImpl *>(this)));
+}
+
+bool SVGAnimatedStringImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedStringImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedStringImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedStringImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedStringImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGAnimatedStringImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGAnimatedStringImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGAnimatedStringImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGAnimatedStringImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedStringImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedStringImpl,KSVGRWBridge<SVGAnimatedStringImpl> >(p1,const_cast<SVGAnimatedStringImpl *>(this)));
+}
+
+bool SVGAnimatedTransformListImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimatedTransformListImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGAnimatedTransformListImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGAnimatedTransformListImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGAnimatedTransformListImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGAnimatedTransformListImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimatedTransformListImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimatedTransformListImpl,KSVGBridge<SVGAnimatedTransformListImpl> >(p1,const_cast<SVGAnimatedTransformListImpl *>(this)));
+}
+
+bool SVGAnimationElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGAnimationElementImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGAnimationElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGAnimationElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGAnimationElementImplProtoFunc,SVGAnimationElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGAnimationElementImpl *SVGAnimationElementImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGAnimationElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimationElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateColorElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateColorElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateMotionElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateMotionElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateTransformElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateTransformElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSetElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSetElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGAnimationElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGAnimationElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGAnimationElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGAnimationElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGAnimationElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGAnimationElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGAnimationElementImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGAnimationElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGAnimationElementImpl,KSVGRWBridge<SVGAnimationElementImpl> >(p1,const_cast<SVGAnimationElementImpl *>(this)));
+}
+
+bool SVGCircleElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGCircleElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGCircleElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGCircleElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGCircleElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGCircleElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGCircleElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGCircleElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGCircleElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGCircleElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGCircleElementImpl>(p1,const_cast<SVGCircleElementImpl *>(this));
+}
+
+Value SVGCircleElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGCircleElementImpl,KSVGRWBridge<SVGCircleElementImpl> >(p1,const_cast<SVGCircleElementImpl *>(this)));
+}
+
+bool SVGClipPathElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGClipPathElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGContainerImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGClipPathElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGClipPathElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGClipPathElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) return SVGContainerImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGClipPathElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGClipPathElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGClipPathElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) {
+ SVGContainerImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGClipPathElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGClipPathElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGClipPathElementImpl>(p1,const_cast<SVGClipPathElementImpl *>(this));
+}
+
+Value SVGClipPathElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGClipPathElementImpl,KSVGRWBridge<SVGClipPathElementImpl> >(p1,const_cast<SVGClipPathElementImpl *>(this)));
+}
+
+bool SVGColorImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGColorImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGColorImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGColorImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGColorImplProtoFunc,SVGColorImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGColorImpl *SVGColorImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGColorImpl> *test = dynamic_cast<const KSVGBridge<SVGColorImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPaintImpl> *test = dynamic_cast<const KSVGBridge<SVGPaintImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGColorImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGColorImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGColorImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGColorImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGColorImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGColorImpl,KSVGBridge<SVGColorImpl> >(p1,const_cast<SVGColorImpl *>(this)));
+}
+
+bool SVGColorImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGColorImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGColorImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGColorImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGColorImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGColorImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGColorImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGColorImplConstructor,KSVGBridge<SVGColorImplConstructor> >(p1,const_cast<SVGColorImplConstructor *>(this)));
+}
+
+bool SVGColorProfileElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGColorProfileElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGColorProfileElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGColorProfileElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGColorProfileElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGColorProfileElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGColorProfileElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGColorProfileElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGColorProfileElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGColorProfileElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGColorProfileElementImpl>(p1,const_cast<SVGColorProfileElementImpl *>(this));
+}
+
+Value SVGColorProfileElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGColorProfileElementImpl,KSVGRWBridge<SVGColorProfileElementImpl> >(p1,const_cast<SVGColorProfileElementImpl *>(this)));
+}
+
+bool SVGComponentTransferFunctionElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGComponentTransferFunctionElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGComponentTransferFunctionElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGComponentTransferFunctionElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGComponentTransferFunctionElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGComponentTransferFunctionElementImpl,KSVGRWBridge<SVGComponentTransferFunctionElementImpl> >(p1,const_cast<SVGComponentTransferFunctionElementImpl *>(this)));
+}
+
+bool SVGContainerImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGContainerImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGContainerImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGContainerImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGContainerImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGContainerImpl,KSVGRWBridge<SVGContainerImpl> >(p1,const_cast<SVGContainerImpl *>(this)));
+}
+
+bool SVGCursorElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGCursorElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGCursorElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGCursorElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGCursorElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGCursorElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGCursorElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGCursorElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGCursorElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGCursorElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGCursorElementImpl,KSVGRWBridge<SVGCursorElementImpl> >(p1,const_cast<SVGCursorElementImpl *>(this)));
+}
+
+bool SVGDOMCharacterDataBridge::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGDOMCharacterDataBridge::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGDOMCharacterDataBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDOMCharacterDataBridge::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGDOMCharacterDataBridgeProtoFunc,SVGDOMCharacterDataBridge>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGDOMCharacterDataBridge *SVGDOMCharacterDataBridgeProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGDOMCharacterDataBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMCharacterDataBridge> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDOMTextBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMTextBridge> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGDOMCharacterDataBridge::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGDOMCharacterDataBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) return SVGDOMNodeBridge::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGDOMCharacterDataBridge::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGDOMCharacterDataBridge>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGDOMCharacterDataBridge::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) {
+ SVGDOMNodeBridge::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGDOMCharacterDataBridge::prototype(ExecState *p1) const
+{
+ if(p1) return SVGDOMCharacterDataBridgeProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGDOMCharacterDataBridge::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDOMCharacterDataBridge,KSVGRWBridge<SVGDOMCharacterDataBridge> >(p1,const_cast<SVGDOMCharacterDataBridge *>(this)));
+}
+
+bool SVGDOMDOMImplementationBridge::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGDOMDOMImplementationBridge::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGDOMDOMImplementationBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDOMDOMImplementationBridge::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGDOMDOMImplementationBridgeProtoFunc,SVGDOMDOMImplementationBridge>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGDOMDOMImplementationBridge *SVGDOMDOMImplementationBridgeProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGDOMDOMImplementationBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMDOMImplementationBridge> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGDOMDOMImplementationBridge::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGDOMDOMImplementationBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGDOMDOMImplementationBridge::put(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGDOMDOMImplementationBridge::prototype(ExecState *p1) const
+{
+ if(p1) return SVGDOMDOMImplementationBridgeProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGDOMDOMImplementationBridge::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDOMDOMImplementationBridge,KSVGRWBridge<SVGDOMDOMImplementationBridge> >(p1,const_cast<SVGDOMDOMImplementationBridge *>(this)));
+}
+
+bool SVGDOMDocumentFragmentBridge::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGDOMDocumentFragmentBridge::s_hashTable,p2);
+ if(e) return true;
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDOMDocumentFragmentBridge::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGDOMDocumentFragmentBridge>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGDOMDocumentFragmentBridge::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) return SVGDOMNodeBridge::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGDOMDocumentFragmentBridge::put(PUT_METHOD_ARGS)
+{
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) {
+ SVGDOMNodeBridge::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGDOMDocumentFragmentBridge::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGDOMDocumentFragmentBridge::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDOMDocumentFragmentBridge,KSVGRWBridge<SVGDOMDocumentFragmentBridge> >(p1,const_cast<SVGDOMDocumentFragmentBridge *>(this)));
+}
+
+bool SVGDOMElementBridge::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGDOMElementBridge::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGDOMElementBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDOMElementBridge::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGDOMElementBridgeProtoFunc,SVGDOMElementBridge>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGDOMElementBridge *SVGDOMElementBridgeProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGDOMElementBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMElementBridge> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAltGlyphDefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAltGlyphDefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAltGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAltGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateColorElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateColorElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateMotionElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateMotionElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateTransformElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateTransformElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimationElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimationElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGCircleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGCircleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGClipPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGClipPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGColorProfileElementImpl> *test = dynamic_cast<const KSVGBridge<SVGColorProfileElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGComponentTransferFunctionElementImpl> *test = dynamic_cast<const KSVGBridge<SVGComponentTransferFunctionElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGContainerImpl> *test = dynamic_cast<const KSVGBridge<SVGContainerImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGCursorElementImpl> *test = dynamic_cast<const KSVGBridge<SVGCursorElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDefinitionSrcElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDefinitionSrcElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDefsElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDefsElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDescElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDescElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGEllipseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGEllipseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEBlendElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEBlendElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEColorMatrixElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEColorMatrixElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEComponentTransferElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEComponentTransferElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFECompositeElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFECompositeElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEConvolveMatrixElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEConvolveMatrixElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEDiffuseLightingElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEDiffuseLightingElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEDisplacementMapElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEDisplacementMapElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEDistantLightElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEDistantLightElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFloodElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFloodElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncAElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncAElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncBElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncBElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncRElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncRElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEGaussianBlurElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEGaussianBlurElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEImageElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEImageElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEMergeElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEMergeElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEMergeNodeElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEMergeNodeElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEMorphologyElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEMorphologyElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEOffsetElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEOffsetElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEPointLightElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEPointLightElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFESpecularLightingElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFESpecularLightingElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFESpotLightElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFESpotLightElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFETileElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFETileElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFETurbulenceElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFETurbulenceElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFilterElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFilterElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceFormatElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceFormatElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceNameElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceNameElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceSrcElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceSrcElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceUriElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceUriElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGForeignObjectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGForeignObjectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGlyphRefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGlyphRefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGHKernElementImpl> *test = dynamic_cast<const KSVGBridge<SVGHKernElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGImageElementImpl> *test = dynamic_cast<const KSVGBridge<SVGImageElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGLineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGLineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGLinearGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGLinearGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMarkerElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMarkerElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMaskElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMaskElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMetadataElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMetadataElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMissingGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMissingGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPatternElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPatternElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolyElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolyElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolygonElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolygonElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolylineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolylineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGRadialGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGRadialGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGRectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGRectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSVGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSVGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGScriptElementImpl> *test = dynamic_cast<const KSVGBridge<SVGScriptElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSetElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSetElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGShapeImpl> *test = dynamic_cast<const KSVGBridge<SVGShapeImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGStopElementImpl> *test = dynamic_cast<const KSVGBridge<SVGStopElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGStyleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGStyleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSwitchElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSwitchElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSymbolElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSymbolElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTRefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTRefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTSpanElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTSpanElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextContentElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextContentElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPositioningElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPositioningElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTitleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTitleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGUseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGUseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGVKernElementImpl> *test = dynamic_cast<const KSVGBridge<SVGVKernElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGViewElementImpl> *test = dynamic_cast<const KSVGBridge<SVGViewElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGDOMElementBridge::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGDOMElementBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) return SVGDOMNodeBridge::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGDOMElementBridge::put(PUT_METHOD_ARGS)
+{
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) {
+ SVGDOMNodeBridge::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGDOMElementBridge::prototype(ExecState *p1) const
+{
+ if(p1) return SVGDOMElementBridgeProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGDOMElementBridge::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDOMElementBridge,KSVGRWBridge<SVGDOMElementBridge> >(p1,const_cast<SVGDOMElementBridge *>(this)));
+}
+
+bool SVGDOMNodeBridge::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGDOMNodeBridge::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGDOMNodeBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDOMNodeBridge::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGDOMNodeBridgeProtoFunc,SVGDOMNodeBridge>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGDOMNodeBridge *SVGDOMNodeBridgeProtoFunc::cast(const ObjectImp *p1) const
+{
+ return KSVG::toNodeBridge(p1);
+}
+
+SVGDOMNodeBridge *KSVG::toNodeBridge(const ObjectImp *p1)
+{
+ { const KSVGBridge<SVGDOMNodeBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMNodeBridge> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAltGlyphDefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAltGlyphDefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAltGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAltGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateColorElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateColorElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateMotionElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateMotionElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateTransformElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateTransformElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimationElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimationElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGCircleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGCircleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGClipPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGClipPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGColorProfileElementImpl> *test = dynamic_cast<const KSVGBridge<SVGColorProfileElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGComponentTransferFunctionElementImpl> *test = dynamic_cast<const KSVGBridge<SVGComponentTransferFunctionElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGContainerImpl> *test = dynamic_cast<const KSVGBridge<SVGContainerImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGCursorElementImpl> *test = dynamic_cast<const KSVGBridge<SVGCursorElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDOMCharacterDataBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMCharacterDataBridge> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDOMDocumentFragmentBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMDocumentFragmentBridge> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDOMElementBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMElementBridge> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDOMTextBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMTextBridge> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDefinitionSrcElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDefinitionSrcElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDefsElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDefsElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDescElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDescElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDocumentImpl> *test = dynamic_cast<const KSVGBridge<SVGDocumentImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGEllipseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGEllipseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEBlendElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEBlendElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEColorMatrixElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEColorMatrixElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEComponentTransferElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEComponentTransferElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFECompositeElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFECompositeElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEConvolveMatrixElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEConvolveMatrixElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEDiffuseLightingElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEDiffuseLightingElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEDisplacementMapElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEDisplacementMapElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEDistantLightElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEDistantLightElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFloodElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFloodElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncAElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncAElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncBElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncBElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncRElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncRElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEGaussianBlurElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEGaussianBlurElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEImageElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEImageElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEMergeElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEMergeElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEMergeNodeElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEMergeNodeElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEMorphologyElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEMorphologyElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEOffsetElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEOffsetElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEPointLightElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEPointLightElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFESpecularLightingElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFESpecularLightingElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFESpotLightElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFESpotLightElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFETileElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFETileElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFETurbulenceElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFETurbulenceElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFilterElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFilterElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceFormatElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceFormatElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceNameElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceNameElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceSrcElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceSrcElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceUriElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceUriElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGForeignObjectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGForeignObjectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGlyphRefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGlyphRefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGHKernElementImpl> *test = dynamic_cast<const KSVGBridge<SVGHKernElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGImageElementImpl> *test = dynamic_cast<const KSVGBridge<SVGImageElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGLineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGLineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGLinearGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGLinearGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMarkerElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMarkerElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMaskElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMaskElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMetadataElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMetadataElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMissingGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMissingGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPatternElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPatternElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolyElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolyElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolygonElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolygonElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolylineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolylineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGRadialGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGRadialGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGRectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGRectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSVGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSVGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGScriptElementImpl> *test = dynamic_cast<const KSVGBridge<SVGScriptElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSetElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSetElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGShapeImpl> *test = dynamic_cast<const KSVGBridge<SVGShapeImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGStopElementImpl> *test = dynamic_cast<const KSVGBridge<SVGStopElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGStyleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGStyleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSwitchElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSwitchElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSymbolElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSymbolElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTRefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTRefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTSpanElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTSpanElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextContentElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextContentElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPositioningElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPositioningElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTitleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTitleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGUseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGUseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGVKernElementImpl> *test = dynamic_cast<const KSVGBridge<SVGVKernElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGViewElementImpl> *test = dynamic_cast<const KSVGBridge<SVGViewElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGDOMNodeBridge::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGDOMNodeBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGDOMNodeBridge::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGDOMNodeBridge>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGDOMNodeBridge::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGDOMNodeBridge::prototype(ExecState *p1) const
+{
+ if(p1) return SVGDOMNodeBridgeProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGDOMNodeBridge::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDOMNodeBridge,KSVGRWBridge<SVGDOMNodeBridge> >(p1,const_cast<SVGDOMNodeBridge *>(this)));
+}
+
+bool SVGDOMNodeListBridge::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGDOMNodeListBridge::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGDOMNodeListBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDOMNodeListBridge::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGDOMNodeListBridgeProtoFunc,SVGDOMNodeListBridge>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGDOMNodeListBridge *SVGDOMNodeListBridgeProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGDOMNodeListBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMNodeListBridge> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGDOMNodeListBridge::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGDOMNodeListBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGDOMNodeListBridge::prototype(ExecState *p1) const
+{
+ if(p1) return SVGDOMNodeListBridgeProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGDOMNodeListBridge::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDOMNodeListBridge,KSVGBridge<SVGDOMNodeListBridge> >(p1,const_cast<SVGDOMNodeListBridge *>(this)));
+}
+
+bool SVGDOMTextBridge::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGDOMTextBridge::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGDOMTextBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGDOMCharacterDataBridge::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDOMTextBridge::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGDOMTextBridgeProtoFunc,SVGDOMTextBridge>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGDOMTextBridge *SVGDOMTextBridgeProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGDOMTextBridge> *test = dynamic_cast<const KSVGBridge<SVGDOMTextBridge> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGDOMTextBridge::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGDOMTextBridgeProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGDOMCharacterDataBridge::hasProperty(p1,p2)) return SVGDOMCharacterDataBridge::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGDOMTextBridge::put(PUT_METHOD_ARGS)
+{
+ if(SVGDOMCharacterDataBridge::hasProperty(p1,p2)) {
+ SVGDOMCharacterDataBridge::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGDOMTextBridge::prototype(ExecState *p1) const
+{
+ if(p1) return SVGDOMTextBridgeProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGDOMTextBridge::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDOMTextBridge,KSVGRWBridge<SVGDOMTextBridge> >(p1,const_cast<SVGDOMTextBridge *>(this)));
+}
+
+bool SVGDefinitionSrcElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDefinitionSrcElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGDefinitionSrcElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGDefinitionSrcElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGDefinitionSrcElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDefinitionSrcElementImpl,KSVGRWBridge<SVGDefinitionSrcElementImpl> >(p1,const_cast<SVGDefinitionSrcElementImpl *>(this)));
+}
+
+bool SVGDefsElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDefsElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) return SVGContainerImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGDefsElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) {
+ SVGContainerImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGDefsElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGDefsElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGDefsElementImpl>(p1,const_cast<SVGDefsElementImpl *>(this));
+}
+
+Value SVGDefsElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDefsElementImpl,KSVGRWBridge<SVGDefsElementImpl> >(p1,const_cast<SVGDefsElementImpl *>(this)));
+}
+
+bool SVGDescElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDescElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGDescElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGDescElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGDescElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGDescElementImpl>(p1,const_cast<SVGDescElementImpl *>(this));
+}
+
+Value SVGDescElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDescElementImpl,KSVGRWBridge<SVGDescElementImpl> >(p1,const_cast<SVGDescElementImpl *>(this)));
+}
+
+bool SVGDocumentImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGDocumentImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGDocumentImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGDocumentImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGDocumentImplProtoFunc,SVGDocumentImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGDocumentImpl *SVGDocumentImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGDocumentImpl> *test = dynamic_cast<const KSVGBridge<SVGDocumentImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGDocumentImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGDocumentImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) return SVGDOMNodeBridge::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGDocumentImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGDocumentImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGDocumentImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGDOMNodeBridge::hasProperty(p1,p2)) {
+ SVGDOMNodeBridge::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGDocumentImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGDocumentImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGDocumentImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGDocumentImpl,KSVGRWBridge<SVGDocumentImpl> >(p1,const_cast<SVGDocumentImpl *>(this)));
+}
+
+bool SVGElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGElementImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGDOMElementBridge::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGElementImplProtoFunc,SVGElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGElementImpl *SVGElementImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAltGlyphDefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAltGlyphDefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAltGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAltGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateColorElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateColorElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateMotionElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateMotionElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateTransformElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateTransformElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimationElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimationElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGCircleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGCircleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGClipPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGClipPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGColorProfileElementImpl> *test = dynamic_cast<const KSVGBridge<SVGColorProfileElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGComponentTransferFunctionElementImpl> *test = dynamic_cast<const KSVGBridge<SVGComponentTransferFunctionElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGContainerImpl> *test = dynamic_cast<const KSVGBridge<SVGContainerImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGCursorElementImpl> *test = dynamic_cast<const KSVGBridge<SVGCursorElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDefinitionSrcElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDefinitionSrcElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDefsElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDefsElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDescElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDescElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGEllipseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGEllipseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEBlendElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEBlendElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEColorMatrixElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEColorMatrixElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEComponentTransferElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEComponentTransferElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFECompositeElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFECompositeElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEConvolveMatrixElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEConvolveMatrixElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEDiffuseLightingElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEDiffuseLightingElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEDisplacementMapElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEDisplacementMapElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEDistantLightElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEDistantLightElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFloodElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFloodElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncAElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncAElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncBElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncBElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFuncRElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFuncRElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEGaussianBlurElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEGaussianBlurElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEImageElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEImageElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEMergeElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEMergeElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEMergeNodeElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEMergeNodeElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEMorphologyElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEMorphologyElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEOffsetElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEOffsetElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEPointLightElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEPointLightElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFESpecularLightingElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFESpecularLightingElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFESpotLightElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFESpotLightElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFETileElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFETileElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFETurbulenceElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFETurbulenceElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFilterElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFilterElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceFormatElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceFormatElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceNameElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceNameElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceSrcElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceSrcElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontFaceUriElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontFaceUriElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGForeignObjectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGForeignObjectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGlyphRefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGlyphRefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGHKernElementImpl> *test = dynamic_cast<const KSVGBridge<SVGHKernElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGImageElementImpl> *test = dynamic_cast<const KSVGBridge<SVGImageElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGLineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGLineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGLinearGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGLinearGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMarkerElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMarkerElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMaskElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMaskElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMetadataElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMetadataElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMissingGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMissingGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPatternElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPatternElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolyElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolyElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolygonElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolygonElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolylineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolylineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGRadialGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGRadialGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGRectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGRectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSVGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSVGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGScriptElementImpl> *test = dynamic_cast<const KSVGBridge<SVGScriptElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSetElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSetElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGShapeImpl> *test = dynamic_cast<const KSVGBridge<SVGShapeImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGStopElementImpl> *test = dynamic_cast<const KSVGBridge<SVGStopElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGStyleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGStyleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSwitchElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSwitchElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSymbolElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSymbolElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTRefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTRefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTSpanElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTSpanElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextContentElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextContentElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPositioningElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPositioningElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTitleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTitleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGUseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGUseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGVKernElementImpl> *test = dynamic_cast<const KSVGBridge<SVGVKernElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGViewElementImpl> *test = dynamic_cast<const KSVGBridge<SVGViewElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGDOMElementBridge::hasProperty(p1,p2)) return SVGDOMElementBridge::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGDOMElementBridge::hasProperty(p1,p2)) {
+ SVGDOMElementBridge::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGElementImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGElementImpl>(p1,const_cast<SVGElementImpl *>(this));
+}
+
+Value SVGElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGElementImpl,KSVGRWBridge<SVGElementImpl> >(p1,const_cast<SVGElementImpl *>(this)));
+}
+
+bool SVGEllipseElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGEllipseElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGEllipseElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGEllipseElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGEllipseElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGEllipseElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGEllipseElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGEllipseElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGEllipseElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGEllipseElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGEllipseElementImpl>(p1,const_cast<SVGEllipseElementImpl *>(this));
+}
+
+Value SVGEllipseElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGEllipseElementImpl,KSVGRWBridge<SVGEllipseElementImpl> >(p1,const_cast<SVGEllipseElementImpl *>(this)));
+}
+
+bool SVGEventImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGEventImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGEventImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGEventImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGEventImplProtoFunc,SVGEventImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGEventImpl *SVGEventImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGEventImpl> *test = dynamic_cast<const KSVGBridge<SVGEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGKeyEventImpl> *test = dynamic_cast<const KSVGBridge<SVGKeyEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMouseEventImpl> *test = dynamic_cast<const KSVGBridge<SVGMouseEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMutationEventImpl> *test = dynamic_cast<const KSVGBridge<SVGMutationEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGUIEventImpl> *test = dynamic_cast<const KSVGBridge<SVGUIEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGZoomEventImpl> *test = dynamic_cast<const KSVGBridge<SVGZoomEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGEventImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGEventImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGEventImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGEventImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGEventImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGEventImpl,KSVGBridge<SVGEventImpl> >(p1,const_cast<SVGEventImpl *>(this)));
+}
+
+bool SVGExternalResourcesRequiredImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGExternalResourcesRequiredImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGExternalResourcesRequiredImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGExternalResourcesRequiredImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGExternalResourcesRequiredImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGExternalResourcesRequiredImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGExternalResourcesRequiredImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGExternalResourcesRequiredImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGExternalResourcesRequiredImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGExternalResourcesRequiredImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGExternalResourcesRequiredImpl,KSVGRWBridge<SVGExternalResourcesRequiredImpl> >(p1,const_cast<SVGExternalResourcesRequiredImpl *>(this)));
+}
+
+bool SVGFEBlendElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEBlendElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEBlendElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEBlendElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEBlendElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEBlendElementImpl,KSVGRWBridge<SVGFEBlendElementImpl> >(p1,const_cast<SVGFEBlendElementImpl *>(this)));
+}
+
+bool SVGFEColorMatrixElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEColorMatrixElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEColorMatrixElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEColorMatrixElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEColorMatrixElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEColorMatrixElementImpl,KSVGRWBridge<SVGFEColorMatrixElementImpl> >(p1,const_cast<SVGFEColorMatrixElementImpl *>(this)));
+}
+
+bool SVGFEComponentTransferElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEComponentTransferElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEComponentTransferElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEComponentTransferElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEComponentTransferElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEComponentTransferElementImpl,KSVGRWBridge<SVGFEComponentTransferElementImpl> >(p1,const_cast<SVGFEComponentTransferElementImpl *>(this)));
+}
+
+bool SVGFECompositeElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFECompositeElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFECompositeElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFECompositeElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFECompositeElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFECompositeElementImpl,KSVGRWBridge<SVGFECompositeElementImpl> >(p1,const_cast<SVGFECompositeElementImpl *>(this)));
+}
+
+bool SVGFEConvolveMatrixElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEConvolveMatrixElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEConvolveMatrixElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEConvolveMatrixElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEConvolveMatrixElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEConvolveMatrixElementImpl,KSVGRWBridge<SVGFEConvolveMatrixElementImpl> >(p1,const_cast<SVGFEConvolveMatrixElementImpl *>(this)));
+}
+
+bool SVGFEDiffuseLightingElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEDiffuseLightingElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEDiffuseLightingElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEDiffuseLightingElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEDiffuseLightingElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEDiffuseLightingElementImpl,KSVGRWBridge<SVGFEDiffuseLightingElementImpl> >(p1,const_cast<SVGFEDiffuseLightingElementImpl *>(this)));
+}
+
+bool SVGFEDisplacementMapElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEDisplacementMapElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEDisplacementMapElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEDisplacementMapElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEDisplacementMapElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEDisplacementMapElementImpl,KSVGRWBridge<SVGFEDisplacementMapElementImpl> >(p1,const_cast<SVGFEDisplacementMapElementImpl *>(this)));
+}
+
+bool SVGFEDistantLightElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEDistantLightElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEDistantLightElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEDistantLightElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEDistantLightElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEDistantLightElementImpl,KSVGRWBridge<SVGFEDistantLightElementImpl> >(p1,const_cast<SVGFEDistantLightElementImpl *>(this)));
+}
+
+bool SVGFEFloodElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEFloodElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEFloodElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEFloodElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEFloodElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEFloodElementImpl,KSVGRWBridge<SVGFEFloodElementImpl> >(p1,const_cast<SVGFEFloodElementImpl *>(this)));
+}
+
+bool SVGFEFuncAElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEFuncAElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) return SVGComponentTransferFunctionElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEFuncAElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) {
+ SVGComponentTransferFunctionElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEFuncAElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEFuncAElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEFuncAElementImpl,KSVGRWBridge<SVGFEFuncAElementImpl> >(p1,const_cast<SVGFEFuncAElementImpl *>(this)));
+}
+
+bool SVGFEFuncBElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEFuncBElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) return SVGComponentTransferFunctionElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEFuncBElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) {
+ SVGComponentTransferFunctionElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEFuncBElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEFuncBElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEFuncBElementImpl,KSVGRWBridge<SVGFEFuncBElementImpl> >(p1,const_cast<SVGFEFuncBElementImpl *>(this)));
+}
+
+bool SVGFEFuncGElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEFuncGElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) return SVGComponentTransferFunctionElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEFuncGElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) {
+ SVGComponentTransferFunctionElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEFuncGElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEFuncGElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEFuncGElementImpl,KSVGRWBridge<SVGFEFuncGElementImpl> >(p1,const_cast<SVGFEFuncGElementImpl *>(this)));
+}
+
+bool SVGFEFuncRElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEFuncRElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) return SVGComponentTransferFunctionElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEFuncRElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGComponentTransferFunctionElementImpl::hasProperty(p1,p2)) {
+ SVGComponentTransferFunctionElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEFuncRElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEFuncRElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEFuncRElementImpl,KSVGRWBridge<SVGFEFuncRElementImpl> >(p1,const_cast<SVGFEFuncRElementImpl *>(this)));
+}
+
+bool SVGFEGaussianBlurElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEGaussianBlurElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEGaussianBlurElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEGaussianBlurElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEGaussianBlurElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEGaussianBlurElementImpl,KSVGRWBridge<SVGFEGaussianBlurElementImpl> >(p1,const_cast<SVGFEGaussianBlurElementImpl *>(this)));
+}
+
+bool SVGFEImageElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEImageElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEImageElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEImageElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEImageElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEImageElementImpl,KSVGRWBridge<SVGFEImageElementImpl> >(p1,const_cast<SVGFEImageElementImpl *>(this)));
+}
+
+bool SVGFEMergeElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEMergeElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEMergeElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEMergeElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEMergeElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEMergeElementImpl,KSVGRWBridge<SVGFEMergeElementImpl> >(p1,const_cast<SVGFEMergeElementImpl *>(this)));
+}
+
+bool SVGFEMergeNodeElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEMergeNodeElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEMergeNodeElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEMergeNodeElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEMergeNodeElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEMergeNodeElementImpl,KSVGRWBridge<SVGFEMergeNodeElementImpl> >(p1,const_cast<SVGFEMergeNodeElementImpl *>(this)));
+}
+
+bool SVGFEMorphologyElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEMorphologyElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEMorphologyElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEMorphologyElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEMorphologyElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEMorphologyElementImpl,KSVGRWBridge<SVGFEMorphologyElementImpl> >(p1,const_cast<SVGFEMorphologyElementImpl *>(this)));
+}
+
+bool SVGFEOffsetElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEOffsetElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEOffsetElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEOffsetElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEOffsetElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEOffsetElementImpl,KSVGRWBridge<SVGFEOffsetElementImpl> >(p1,const_cast<SVGFEOffsetElementImpl *>(this)));
+}
+
+bool SVGFEPointLightElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFEPointLightElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFEPointLightElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFEPointLightElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFEPointLightElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFEPointLightElementImpl,KSVGRWBridge<SVGFEPointLightElementImpl> >(p1,const_cast<SVGFEPointLightElementImpl *>(this)));
+}
+
+bool SVGFESpecularLightingElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFESpecularLightingElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFESpecularLightingElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFESpecularLightingElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFESpecularLightingElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFESpecularLightingElementImpl,KSVGRWBridge<SVGFESpecularLightingElementImpl> >(p1,const_cast<SVGFESpecularLightingElementImpl *>(this)));
+}
+
+bool SVGFESpotLightElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFESpotLightElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFESpotLightElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFESpotLightElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFESpotLightElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFESpotLightElementImpl,KSVGRWBridge<SVGFESpotLightElementImpl> >(p1,const_cast<SVGFESpotLightElementImpl *>(this)));
+}
+
+bool SVGFETileElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFETileElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFETileElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFETileElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFETileElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFETileElementImpl,KSVGRWBridge<SVGFETileElementImpl> >(p1,const_cast<SVGFETileElementImpl *>(this)));
+}
+
+bool SVGFETurbulenceElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFETurbulenceElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFETurbulenceElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFETurbulenceElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFETurbulenceElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFETurbulenceElementImpl,KSVGRWBridge<SVGFETurbulenceElementImpl> >(p1,const_cast<SVGFETurbulenceElementImpl *>(this)));
+}
+
+bool SVGFilterElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFilterElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFilterElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFilterElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFilterElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFilterElementImpl,KSVGRWBridge<SVGFilterElementImpl> >(p1,const_cast<SVGFilterElementImpl *>(this)));
+}
+
+bool SVGFitToViewBoxImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGFitToViewBoxImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGFitToViewBoxImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGFitToViewBoxImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGFitToViewBoxImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGFitToViewBoxImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGFitToViewBoxImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGFitToViewBoxImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGFitToViewBoxImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFitToViewBoxImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFitToViewBoxImpl,KSVGRWBridge<SVGFitToViewBoxImpl> >(p1,const_cast<SVGFitToViewBoxImpl *>(this)));
+}
+
+bool SVGFontElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFontElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFontElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFontElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFontElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFontElementImpl,KSVGRWBridge<SVGFontElementImpl> >(p1,const_cast<SVGFontElementImpl *>(this)));
+}
+
+bool SVGFontFaceElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFontFaceElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFontFaceElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFontFaceElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFontFaceElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFontFaceElementImpl,KSVGRWBridge<SVGFontFaceElementImpl> >(p1,const_cast<SVGFontFaceElementImpl *>(this)));
+}
+
+bool SVGFontFaceFormatElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFontFaceFormatElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFontFaceFormatElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFontFaceFormatElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFontFaceFormatElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFontFaceFormatElementImpl,KSVGRWBridge<SVGFontFaceFormatElementImpl> >(p1,const_cast<SVGFontFaceFormatElementImpl *>(this)));
+}
+
+bool SVGFontFaceNameElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFontFaceNameElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFontFaceNameElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFontFaceNameElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFontFaceNameElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFontFaceNameElementImpl,KSVGRWBridge<SVGFontFaceNameElementImpl> >(p1,const_cast<SVGFontFaceNameElementImpl *>(this)));
+}
+
+bool SVGFontFaceSrcElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFontFaceSrcElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFontFaceSrcElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFontFaceSrcElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFontFaceSrcElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFontFaceSrcElementImpl,KSVGRWBridge<SVGFontFaceSrcElementImpl> >(p1,const_cast<SVGFontFaceSrcElementImpl *>(this)));
+}
+
+bool SVGFontFaceUriElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGFontFaceUriElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGFontFaceUriElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGFontFaceUriElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGFontFaceUriElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGFontFaceUriElementImpl,KSVGRWBridge<SVGFontFaceUriElementImpl> >(p1,const_cast<SVGFontFaceUriElementImpl *>(this)));
+}
+
+bool SVGForeignObjectElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGForeignObjectElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGForeignObjectElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGForeignObjectElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGForeignObjectElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGForeignObjectElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGForeignObjectElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGForeignObjectElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGForeignObjectElementImpl,KSVGRWBridge<SVGForeignObjectElementImpl> >(p1,const_cast<SVGForeignObjectElementImpl *>(this)));
+}
+
+bool SVGGElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGGElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) return SVGContainerImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGGElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) {
+ SVGContainerImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGGElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGGElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGGElementImpl>(p1,const_cast<SVGGElementImpl *>(this));
+}
+
+Value SVGGElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGGElementImpl,KSVGRWBridge<SVGGElementImpl> >(p1,const_cast<SVGGElementImpl *>(this)));
+}
+
+bool SVGGlyphElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGGlyphElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGGlyphElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGGlyphElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGGlyphElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGGlyphElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGGlyphElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGGlyphElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGGlyphElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGGlyphElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGGlyphElementImpl>(p1,const_cast<SVGGlyphElementImpl *>(this));
+}
+
+Value SVGGlyphElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGGlyphElementImpl,KSVGRWBridge<SVGGlyphElementImpl> >(p1,const_cast<SVGGlyphElementImpl *>(this)));
+}
+
+bool SVGGlyphRefElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGGlyphRefElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGGlyphRefElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGGlyphRefElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGGlyphRefElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGGlyphRefElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGGlyphRefElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGGlyphRefElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGGlyphRefElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGGlyphRefElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGGlyphRefElementImpl>(p1,const_cast<SVGGlyphRefElementImpl *>(this));
+}
+
+Value SVGGlyphRefElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGGlyphRefElementImpl,KSVGRWBridge<SVGGlyphRefElementImpl> >(p1,const_cast<SVGGlyphRefElementImpl *>(this)));
+}
+
+bool SVGGradientElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGGradientElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGGradientElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGGradientElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGGradientElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGGradientElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGGradientElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGGradientElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGGradientElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGGradientElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGGradientElementImpl,KSVGRWBridge<SVGGradientElementImpl> >(p1,const_cast<SVGGradientElementImpl *>(this)));
+}
+
+bool SVGGradientElementImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGGradientElementImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGGradientElementImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGGradientElementImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGGradientElementImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGGradientElementImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGGradientElementImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGGradientElementImplConstructor,KSVGBridge<SVGGradientElementImplConstructor> >(p1,const_cast<SVGGradientElementImplConstructor *>(this)));
+}
+
+bool SVGHKernElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGHKernElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGHKernElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGHKernElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGHKernElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGHKernElementImpl,KSVGRWBridge<SVGHKernElementImpl> >(p1,const_cast<SVGHKernElementImpl *>(this)));
+}
+
+bool SVGICCColorImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGICCColorImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGICCColorImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGICCColorImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGICCColorImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGICCColorImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGICCColorImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGICCColorImpl,KSVGBridge<SVGICCColorImpl> >(p1,const_cast<SVGICCColorImpl *>(this)));
+}
+
+bool SVGImageElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGImageElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGImageElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGImageElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGImageElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGImageElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGImageElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGImageElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGImageElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGImageElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGImageElementImpl>(p1,const_cast<SVGImageElementImpl *>(this));
+}
+
+Value SVGImageElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGImageElementImpl,KSVGRWBridge<SVGImageElementImpl> >(p1,const_cast<SVGImageElementImpl *>(this)));
+}
+
+bool SVGKeyEventImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGKeyEventImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGKeyEventImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGUIEventImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGKeyEventImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGKeyEventImplProtoFunc,SVGKeyEventImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGKeyEventImpl *SVGKeyEventImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGKeyEventImpl> *test = dynamic_cast<const KSVGBridge<SVGKeyEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGKeyEventImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGKeyEventImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGUIEventImpl::hasProperty(p1,p2)) return SVGUIEventImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+Object SVGKeyEventImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGKeyEventImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGKeyEventImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGKeyEventImpl,KSVGBridge<SVGKeyEventImpl> >(p1,const_cast<SVGKeyEventImpl *>(this)));
+}
+
+bool SVGLangSpaceImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGLangSpaceImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGLangSpaceImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGLangSpaceImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGLangSpaceImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGLangSpaceImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGLangSpaceImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGLangSpaceImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGLangSpaceImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGLangSpaceImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGLangSpaceImpl,KSVGRWBridge<SVGLangSpaceImpl> >(p1,const_cast<SVGLangSpaceImpl *>(this)));
+}
+
+bool SVGLengthImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGLengthImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGLengthImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGLengthImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGLengthImplProtoFunc,SVGLengthImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGLengthImpl *SVGLengthImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGLengthImpl> *test = dynamic_cast<const KSVGBridge<SVGLengthImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGLengthImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGLengthImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGLengthImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGLengthImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGLengthImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGLengthImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGLengthImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGLengthImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGLengthImpl,KSVGRWBridge<SVGLengthImpl> >(p1,const_cast<SVGLengthImpl *>(this)));
+}
+
+bool SVGLengthImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGLengthImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGLengthImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGLengthImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGLengthImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGLengthImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGLengthImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGLengthImplConstructor,KSVGBridge<SVGLengthImplConstructor> >(p1,const_cast<SVGLengthImplConstructor *>(this)));
+}
+
+bool SVGLengthListImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGLengthListImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGLengthListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGLengthListImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGLengthListImplProtoFunc,SVGLengthListImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGLengthListImpl *SVGLengthListImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGLengthListImpl> *test = dynamic_cast<const KSVGBridge<SVGLengthListImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGLengthListImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGLengthListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGLengthListImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGLengthListImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGLengthListImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGLengthListImpl,KSVGBridge<SVGLengthListImpl> >(p1,const_cast<SVGLengthListImpl *>(this)));
+}
+
+bool SVGLineElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGLineElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGLineElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGLineElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGLineElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGLineElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGLineElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGLineElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGLineElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGLineElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGLineElementImpl>(p1,const_cast<SVGLineElementImpl *>(this));
+}
+
+Value SVGLineElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGLineElementImpl,KSVGRWBridge<SVGLineElementImpl> >(p1,const_cast<SVGLineElementImpl *>(this)));
+}
+
+bool SVGLinearGradientElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGLinearGradientElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGGradientElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGLinearGradientElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGLinearGradientElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGLinearGradientElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGGradientElementImpl::hasProperty(p1,p2)) return SVGGradientElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGLinearGradientElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGLinearGradientElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGLinearGradientElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGGradientElementImpl::hasProperty(p1,p2)) {
+ SVGGradientElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGLinearGradientElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGLinearGradientElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGLinearGradientElementImpl>(p1,const_cast<SVGLinearGradientElementImpl *>(this));
+}
+
+Value SVGLinearGradientElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGLinearGradientElementImpl,KSVGRWBridge<SVGLinearGradientElementImpl> >(p1,const_cast<SVGLinearGradientElementImpl *>(this)));
+}
+
+bool SVGLocatableImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGLocatableImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGLocatableImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGLocatableImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGLocatableImplProtoFunc,SVGLocatableImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGLocatableImpl *SVGLocatableImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGLocatableImpl> *test = dynamic_cast<const KSVGBridge<SVGLocatableImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGCircleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGCircleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGClipPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGClipPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDefsElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDefsElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGEllipseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGEllipseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGForeignObjectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGForeignObjectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGImageElementImpl> *test = dynamic_cast<const KSVGBridge<SVGImageElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGLineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGLineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolyElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolyElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolygonElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolygonElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolylineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolylineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGRectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGRectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSVGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSVGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSwitchElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSwitchElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTransformableImpl> *test = dynamic_cast<const KSVGBridge<SVGTransformableImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGUseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGUseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGLocatableImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGLocatableImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGLocatableImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGLocatableImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGLocatableImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGLocatableImpl,KSVGBridge<SVGLocatableImpl> >(p1,const_cast<SVGLocatableImpl *>(this)));
+}
+
+bool SVGMPathElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGMPathElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGMPathElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGMPathElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGMPathElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGMPathElementImpl,KSVGRWBridge<SVGMPathElementImpl> >(p1,const_cast<SVGMPathElementImpl *>(this)));
+}
+
+bool SVGMarkerElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGMarkerElementImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGMarkerElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGContainerImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGMarkerElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGMarkerElementImplProtoFunc,SVGMarkerElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGMarkerElementImpl *SVGMarkerElementImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGMarkerElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMarkerElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGMarkerElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGMarkerElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGContainerImpl::hasProperty(p1,p2)) return SVGContainerImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return SVGFitToViewBoxImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGMarkerElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGMarkerElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGMarkerElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) {
+ SVGContainerImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) {
+ SVGFitToViewBoxImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGMarkerElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGMarkerElementImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGMarkerElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGMarkerElementImpl>(p1,const_cast<SVGMarkerElementImpl *>(this));
+}
+
+Value SVGMarkerElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGMarkerElementImpl,KSVGRWBridge<SVGMarkerElementImpl> >(p1,const_cast<SVGMarkerElementImpl *>(this)));
+}
+
+bool SVGMarkerElementImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGMarkerElementImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGMarkerElementImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGMarkerElementImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGMarkerElementImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGMarkerElementImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGMarkerElementImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGMarkerElementImplConstructor,KSVGBridge<SVGMarkerElementImplConstructor> >(p1,const_cast<SVGMarkerElementImplConstructor *>(this)));
+}
+
+bool SVGMaskElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGMaskElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGMaskElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGMaskElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGMaskElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGMaskElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGMaskElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGMaskElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGMaskElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGMaskElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGMaskElementImpl>(p1,const_cast<SVGMaskElementImpl *>(this));
+}
+
+Value SVGMaskElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGMaskElementImpl,KSVGRWBridge<SVGMaskElementImpl> >(p1,const_cast<SVGMaskElementImpl *>(this)));
+}
+
+bool SVGMatrixImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGMatrixImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGMatrixImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGMatrixImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGMatrixImplProtoFunc,SVGMatrixImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGMatrixImpl *SVGMatrixImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGMatrixImpl> *test = dynamic_cast<const KSVGBridge<SVGMatrixImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGMatrixImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGMatrixImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGMatrixImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGMatrixImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGMatrixImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGMatrixImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGMatrixImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGMatrixImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGMatrixImpl,KSVGRWBridge<SVGMatrixImpl> >(p1,const_cast<SVGMatrixImpl *>(this)));
+}
+
+bool SVGMetadataElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGMetadataElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGMetadataElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGMetadataElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGMetadataElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGMetadataElementImpl,KSVGRWBridge<SVGMetadataElementImpl> >(p1,const_cast<SVGMetadataElementImpl *>(this)));
+}
+
+bool SVGMissingGlyphElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGMissingGlyphElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGMissingGlyphElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGMissingGlyphElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGMissingGlyphElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGMissingGlyphElementImpl,KSVGRWBridge<SVGMissingGlyphElementImpl> >(p1,const_cast<SVGMissingGlyphElementImpl *>(this)));
+}
+
+bool SVGMouseEventImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGMouseEventImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGMouseEventImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGUIEventImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGMouseEventImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGMouseEventImplProtoFunc,SVGMouseEventImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGMouseEventImpl *SVGMouseEventImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGMouseEventImpl> *test = dynamic_cast<const KSVGBridge<SVGMouseEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGMouseEventImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGMouseEventImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGUIEventImpl::hasProperty(p1,p2)) return SVGUIEventImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+Object SVGMouseEventImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGMouseEventImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGMouseEventImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGMouseEventImpl,KSVGBridge<SVGMouseEventImpl> >(p1,const_cast<SVGMouseEventImpl *>(this)));
+}
+
+bool SVGMutationEventImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGEventImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGMutationEventImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGEventImpl::hasProperty(p1,p2)) return SVGEventImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+Object SVGMutationEventImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGMutationEventImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGMutationEventImpl,KSVGBridge<SVGMutationEventImpl> >(p1,const_cast<SVGMutationEventImpl *>(this)));
+}
+
+bool SVGNumberImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGNumberImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGNumberImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGNumberImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGNumberImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGNumberImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGNumberImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGNumberImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGNumberImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGNumberImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGNumberImpl,KSVGRWBridge<SVGNumberImpl> >(p1,const_cast<SVGNumberImpl *>(this)));
+}
+
+bool SVGNumberListImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGNumberListImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGNumberListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGNumberListImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGNumberListImplProtoFunc,SVGNumberListImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGNumberListImpl *SVGNumberListImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGNumberListImpl> *test = dynamic_cast<const KSVGBridge<SVGNumberListImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGNumberListImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGNumberListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGNumberListImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGNumberListImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGNumberListImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGNumberListImpl,KSVGBridge<SVGNumberListImpl> >(p1,const_cast<SVGNumberListImpl *>(this)));
+}
+
+bool SVGPaintImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPaintImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGColorImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPaintImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPaintImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPaintImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGColorImpl::hasProperty(p1,p2)) return SVGColorImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+Object SVGPaintImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPaintImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPaintImpl,KSVGBridge<SVGPaintImpl> >(p1,const_cast<SVGPaintImpl *>(this)));
+}
+
+bool SVGPaintImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPaintImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGPaintImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPaintImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPaintImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGPaintImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPaintImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPaintImplConstructor,KSVGBridge<SVGPaintImplConstructor> >(p1,const_cast<SVGPaintImplConstructor *>(this)));
+}
+
+bool SVGPathElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathElementImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGPathElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGAnimatedPathDataImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGPathElementImplProtoFunc,SVGPathElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGPathElementImpl *SVGPathElementImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGPathElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGPathElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGAnimatedPathDataImpl::hasProperty(p1,p2)) return SVGAnimatedPathDataImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGPathElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGPathElementImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGPathElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGPathElementImpl>(p1,const_cast<SVGPathElementImpl *>(this));
+}
+
+Value SVGPathElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathElementImpl,KSVGRWBridge<SVGPathElementImpl> >(p1,const_cast<SVGPathElementImpl *>(this)));
+}
+
+bool SVGPathSegArcAbsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegArcAbsImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegArcAbsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegArcAbsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegArcAbsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegArcAbsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegArcAbsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegArcAbsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegArcAbsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegArcAbsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegArcAbsImpl,KSVGRWBridge<SVGPathSegArcAbsImpl> >(p1,const_cast<SVGPathSegArcAbsImpl *>(this)));
+}
+
+bool SVGPathSegArcRelImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegArcRelImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegArcRelImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegArcRelImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegArcRelImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegArcRelImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegArcRelImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegArcRelImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegArcRelImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegArcRelImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegArcRelImpl,KSVGRWBridge<SVGPathSegArcRelImpl> >(p1,const_cast<SVGPathSegArcRelImpl *>(this)));
+}
+
+bool SVGPathSegClosePathImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegClosePathImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+Object SVGPathSegClosePathImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegClosePathImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegClosePathImpl,KSVGBridge<SVGPathSegClosePathImpl> >(p1,const_cast<SVGPathSegClosePathImpl *>(this)));
+}
+
+bool SVGPathSegCurvetoCubicAbsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegCurvetoCubicAbsImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegCurvetoCubicAbsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegCurvetoCubicAbsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegCurvetoCubicAbsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegCurvetoCubicAbsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegCurvetoCubicAbsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegCurvetoCubicAbsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegCurvetoCubicAbsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegCurvetoCubicAbsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegCurvetoCubicAbsImpl,KSVGRWBridge<SVGPathSegCurvetoCubicAbsImpl> >(p1,const_cast<SVGPathSegCurvetoCubicAbsImpl *>(this)));
+}
+
+bool SVGPathSegCurvetoCubicRelImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegCurvetoCubicRelImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegCurvetoCubicRelImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegCurvetoCubicRelImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegCurvetoCubicRelImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegCurvetoCubicRelImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegCurvetoCubicRelImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegCurvetoCubicRelImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegCurvetoCubicRelImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegCurvetoCubicRelImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegCurvetoCubicRelImpl,KSVGRWBridge<SVGPathSegCurvetoCubicRelImpl> >(p1,const_cast<SVGPathSegCurvetoCubicRelImpl *>(this)));
+}
+
+bool SVGPathSegCurvetoCubicSmoothAbsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegCurvetoCubicSmoothAbsImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegCurvetoCubicSmoothAbsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegCurvetoCubicSmoothAbsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegCurvetoCubicSmoothAbsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegCurvetoCubicSmoothAbsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegCurvetoCubicSmoothAbsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegCurvetoCubicSmoothAbsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegCurvetoCubicSmoothAbsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegCurvetoCubicSmoothAbsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegCurvetoCubicSmoothAbsImpl,KSVGRWBridge<SVGPathSegCurvetoCubicSmoothAbsImpl> >(p1,const_cast<SVGPathSegCurvetoCubicSmoothAbsImpl *>(this)));
+}
+
+bool SVGPathSegCurvetoCubicSmoothRelImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegCurvetoCubicSmoothRelImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegCurvetoCubicSmoothRelImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegCurvetoCubicSmoothRelImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegCurvetoCubicSmoothRelImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegCurvetoCubicSmoothRelImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegCurvetoCubicSmoothRelImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegCurvetoCubicSmoothRelImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegCurvetoCubicSmoothRelImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegCurvetoCubicSmoothRelImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegCurvetoCubicSmoothRelImpl,KSVGRWBridge<SVGPathSegCurvetoCubicSmoothRelImpl> >(p1,const_cast<SVGPathSegCurvetoCubicSmoothRelImpl *>(this)));
+}
+
+bool SVGPathSegCurvetoQuadraticAbsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegCurvetoQuadraticAbsImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegCurvetoQuadraticAbsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegCurvetoQuadraticAbsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegCurvetoQuadraticAbsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegCurvetoQuadraticAbsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegCurvetoQuadraticAbsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegCurvetoQuadraticAbsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegCurvetoQuadraticAbsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegCurvetoQuadraticAbsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegCurvetoQuadraticAbsImpl,KSVGRWBridge<SVGPathSegCurvetoQuadraticAbsImpl> >(p1,const_cast<SVGPathSegCurvetoQuadraticAbsImpl *>(this)));
+}
+
+bool SVGPathSegCurvetoQuadraticRelImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegCurvetoQuadraticRelImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegCurvetoQuadraticRelImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegCurvetoQuadraticRelImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegCurvetoQuadraticRelImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegCurvetoQuadraticRelImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegCurvetoQuadraticRelImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegCurvetoQuadraticRelImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegCurvetoQuadraticRelImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegCurvetoQuadraticRelImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegCurvetoQuadraticRelImpl,KSVGRWBridge<SVGPathSegCurvetoQuadraticRelImpl> >(p1,const_cast<SVGPathSegCurvetoQuadraticRelImpl *>(this)));
+}
+
+bool SVGPathSegCurvetoQuadraticSmoothAbsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegCurvetoQuadraticSmoothAbsImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegCurvetoQuadraticSmoothAbsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegCurvetoQuadraticSmoothAbsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegCurvetoQuadraticSmoothAbsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegCurvetoQuadraticSmoothAbsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegCurvetoQuadraticSmoothAbsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegCurvetoQuadraticSmoothAbsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegCurvetoQuadraticSmoothAbsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegCurvetoQuadraticSmoothAbsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegCurvetoQuadraticSmoothAbsImpl,KSVGRWBridge<SVGPathSegCurvetoQuadraticSmoothAbsImpl> >(p1,const_cast<SVGPathSegCurvetoQuadraticSmoothAbsImpl *>(this)));
+}
+
+bool SVGPathSegCurvetoQuadraticSmoothRelImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegCurvetoQuadraticSmoothRelImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegCurvetoQuadraticSmoothRelImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegCurvetoQuadraticSmoothRelImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegCurvetoQuadraticSmoothRelImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegCurvetoQuadraticSmoothRelImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegCurvetoQuadraticSmoothRelImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegCurvetoQuadraticSmoothRelImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegCurvetoQuadraticSmoothRelImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegCurvetoQuadraticSmoothRelImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegCurvetoQuadraticSmoothRelImpl,KSVGRWBridge<SVGPathSegCurvetoQuadraticSmoothRelImpl> >(p1,const_cast<SVGPathSegCurvetoQuadraticSmoothRelImpl *>(this)));
+}
+
+bool SVGPathSegImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGPathSegImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGPathSegImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegImpl,KSVGBridge<SVGPathSegImpl> >(p1,const_cast<SVGPathSegImpl *>(this)));
+}
+
+bool SVGPathSegImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGPathSegImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGPathSegImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegImplConstructor,KSVGBridge<SVGPathSegImplConstructor> >(p1,const_cast<SVGPathSegImplConstructor *>(this)));
+}
+
+bool SVGPathSegLinetoAbsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegLinetoAbsImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegLinetoAbsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegLinetoAbsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegLinetoAbsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegLinetoAbsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegLinetoAbsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegLinetoAbsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegLinetoAbsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegLinetoAbsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegLinetoAbsImpl,KSVGRWBridge<SVGPathSegLinetoAbsImpl> >(p1,const_cast<SVGPathSegLinetoAbsImpl *>(this)));
+}
+
+bool SVGPathSegLinetoHorizontalAbsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegLinetoHorizontalAbsImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegLinetoHorizontalAbsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegLinetoHorizontalAbsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegLinetoHorizontalAbsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegLinetoHorizontalAbsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegLinetoHorizontalAbsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegLinetoHorizontalAbsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegLinetoHorizontalAbsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegLinetoHorizontalAbsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegLinetoHorizontalAbsImpl,KSVGRWBridge<SVGPathSegLinetoHorizontalAbsImpl> >(p1,const_cast<SVGPathSegLinetoHorizontalAbsImpl *>(this)));
+}
+
+bool SVGPathSegLinetoHorizontalRelImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegLinetoHorizontalRelImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegLinetoHorizontalRelImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegLinetoHorizontalRelImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegLinetoHorizontalRelImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegLinetoHorizontalRelImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegLinetoHorizontalRelImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegLinetoHorizontalRelImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegLinetoHorizontalRelImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegLinetoHorizontalRelImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegLinetoHorizontalRelImpl,KSVGRWBridge<SVGPathSegLinetoHorizontalRelImpl> >(p1,const_cast<SVGPathSegLinetoHorizontalRelImpl *>(this)));
+}
+
+bool SVGPathSegLinetoRelImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegLinetoRelImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegLinetoRelImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegLinetoRelImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegLinetoRelImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegLinetoRelImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegLinetoRelImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegLinetoRelImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegLinetoRelImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegLinetoRelImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegLinetoRelImpl,KSVGRWBridge<SVGPathSegLinetoRelImpl> >(p1,const_cast<SVGPathSegLinetoRelImpl *>(this)));
+}
+
+bool SVGPathSegLinetoVerticalAbsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegLinetoVerticalAbsImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegLinetoVerticalAbsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegLinetoVerticalAbsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegLinetoVerticalAbsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegLinetoVerticalAbsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegLinetoVerticalAbsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegLinetoVerticalAbsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegLinetoVerticalAbsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegLinetoVerticalAbsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegLinetoVerticalAbsImpl,KSVGRWBridge<SVGPathSegLinetoVerticalAbsImpl> >(p1,const_cast<SVGPathSegLinetoVerticalAbsImpl *>(this)));
+}
+
+bool SVGPathSegLinetoVerticalRelImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegLinetoVerticalRelImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegLinetoVerticalRelImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegLinetoVerticalRelImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegLinetoVerticalRelImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegLinetoVerticalRelImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegLinetoVerticalRelImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegLinetoVerticalRelImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegLinetoVerticalRelImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegLinetoVerticalRelImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegLinetoVerticalRelImpl,KSVGRWBridge<SVGPathSegLinetoVerticalRelImpl> >(p1,const_cast<SVGPathSegLinetoVerticalRelImpl *>(this)));
+}
+
+bool SVGPathSegListImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegListImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGPathSegListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegListImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGPathSegListImplProtoFunc,SVGPathSegListImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGPathSegListImpl *SVGPathSegListImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGPathSegListImpl> *test = dynamic_cast<const KSVGBridge<SVGPathSegListImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGPathSegListImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGPathSegListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGPathSegListImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGPathSegListImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegListImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegListImpl,KSVGBridge<SVGPathSegListImpl> >(p1,const_cast<SVGPathSegListImpl *>(this)));
+}
+
+bool SVGPathSegMovetoAbsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegMovetoAbsImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegMovetoAbsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegMovetoAbsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegMovetoAbsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegMovetoAbsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegMovetoAbsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegMovetoAbsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegMovetoAbsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegMovetoAbsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegMovetoAbsImpl,KSVGRWBridge<SVGPathSegMovetoAbsImpl> >(p1,const_cast<SVGPathSegMovetoAbsImpl *>(this)));
+}
+
+bool SVGPathSegMovetoRelImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPathSegMovetoRelImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPathSegMovetoRelImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPathSegMovetoRelImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPathSegMovetoRelImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGPathSegImpl::hasProperty(p1,p2)) return SVGPathSegImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPathSegMovetoRelImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPathSegMovetoRelImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPathSegMovetoRelImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPathSegMovetoRelImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPathSegMovetoRelImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPathSegMovetoRelImpl,KSVGRWBridge<SVGPathSegMovetoRelImpl> >(p1,const_cast<SVGPathSegMovetoRelImpl *>(this)));
+}
+
+bool SVGPatternElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPatternElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPatternElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPatternElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPatternElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return SVGFitToViewBoxImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPatternElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPatternElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPatternElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) {
+ SVGFitToViewBoxImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGPatternElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGPatternElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGPatternElementImpl>(p1,const_cast<SVGPatternElementImpl *>(this));
+}
+
+Value SVGPatternElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPatternElementImpl,KSVGRWBridge<SVGPatternElementImpl> >(p1,const_cast<SVGPatternElementImpl *>(this)));
+}
+
+bool SVGPointImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPointImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGPointImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPointImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPointImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGPointImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPointImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPointImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPointImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPointImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPointImpl,KSVGRWBridge<SVGPointImpl> >(p1,const_cast<SVGPointImpl *>(this)));
+}
+
+bool SVGPointListImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPointListImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGPointListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPointListImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGPointListImplProtoFunc,SVGPointListImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGPointListImpl *SVGPointListImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGPointListImpl> *test = dynamic_cast<const KSVGBridge<SVGPointListImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGPointListImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGPointListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGPointListImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGPointListImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPointListImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPointListImpl,KSVGBridge<SVGPointListImpl> >(p1,const_cast<SVGPointListImpl *>(this)));
+}
+
+bool SVGPolyElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGAnimatedPointsImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPolyElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGAnimatedPointsImpl::hasProperty(p1,p2)) return SVGAnimatedPointsImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPolyElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGAnimatedPointsImpl::hasProperty(p1,p2)) {
+ SVGAnimatedPointsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGPolyElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPolyElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPolyElementImpl,KSVGRWBridge<SVGPolyElementImpl> >(p1,const_cast<SVGPolyElementImpl *>(this)));
+}
+
+bool SVGPolygonElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGPolyElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPolygonElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGPolyElementImpl::hasProperty(p1,p2)) return SVGPolyElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPolygonElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGPolyElementImpl::hasProperty(p1,p2)) {
+ SVGPolyElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGPolygonElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGPolygonElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGPolygonElementImpl>(p1,const_cast<SVGPolygonElementImpl *>(this));
+}
+
+Value SVGPolygonElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPolygonElementImpl,KSVGRWBridge<SVGPolygonElementImpl> >(p1,const_cast<SVGPolygonElementImpl *>(this)));
+}
+
+bool SVGPolylineElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGPolyElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGPolylineElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGPolyElementImpl::hasProperty(p1,p2)) return SVGPolyElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGPolylineElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGPolyElementImpl::hasProperty(p1,p2)) {
+ SVGPolyElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGPolylineElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGPolylineElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGPolylineElementImpl>(p1,const_cast<SVGPolylineElementImpl *>(this));
+}
+
+Value SVGPolylineElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPolylineElementImpl,KSVGRWBridge<SVGPolylineElementImpl> >(p1,const_cast<SVGPolylineElementImpl *>(this)));
+}
+
+bool SVGPreserveAspectRatioImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPreserveAspectRatioImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGPreserveAspectRatioImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPreserveAspectRatioImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPreserveAspectRatioImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGPreserveAspectRatioImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGPreserveAspectRatioImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGPreserveAspectRatioImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGPreserveAspectRatioImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPreserveAspectRatioImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPreserveAspectRatioImpl,KSVGRWBridge<SVGPreserveAspectRatioImpl> >(p1,const_cast<SVGPreserveAspectRatioImpl *>(this)));
+}
+
+bool SVGPreserveAspectRatioImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGPreserveAspectRatioImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGPreserveAspectRatioImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGPreserveAspectRatioImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGPreserveAspectRatioImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGPreserveAspectRatioImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGPreserveAspectRatioImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGPreserveAspectRatioImplConstructor,KSVGBridge<SVGPreserveAspectRatioImplConstructor> >(p1,const_cast<SVGPreserveAspectRatioImplConstructor *>(this)));
+}
+
+bool SVGRadialGradientElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGRadialGradientElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGGradientElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGRadialGradientElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGRadialGradientElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGRadialGradientElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGGradientElementImpl::hasProperty(p1,p2)) return SVGGradientElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGRadialGradientElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGRadialGradientElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGRadialGradientElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGGradientElementImpl::hasProperty(p1,p2)) {
+ SVGGradientElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGRadialGradientElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGRadialGradientElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGRadialGradientElementImpl>(p1,const_cast<SVGRadialGradientElementImpl *>(this));
+}
+
+Value SVGRadialGradientElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGRadialGradientElementImpl,KSVGRWBridge<SVGRadialGradientElementImpl> >(p1,const_cast<SVGRadialGradientElementImpl *>(this)));
+}
+
+bool SVGRectElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGRectElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGRectElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGRectElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGRectElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGRectElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGRectElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGRectElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGRectElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGRectElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGRectElementImpl>(p1,const_cast<SVGRectElementImpl *>(this));
+}
+
+Value SVGRectElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGRectElementImpl,KSVGRWBridge<SVGRectElementImpl> >(p1,const_cast<SVGRectElementImpl *>(this)));
+}
+
+bool SVGRectImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGRectImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGRectImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGRectImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGRectImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGRectImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGRectImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGRectImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGRectImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGRectImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGRectImpl,KSVGRWBridge<SVGRectImpl> >(p1,const_cast<SVGRectImpl *>(this)));
+}
+
+bool SVGSVGElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGSVGElementImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGSVGElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGContainerImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGLocatableImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGZoomAndPanImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGSVGElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGSVGElementImplProtoFunc,SVGSVGElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGSVGElementImpl *SVGSVGElementImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGSVGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSVGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGSVGElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGSVGElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGContainerImpl::hasProperty(p1,p2)) return SVGContainerImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return SVGFitToViewBoxImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGLocatableImpl::hasProperty(p1,p2)) return SVGLocatableImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGZoomAndPanImpl::hasProperty(p1,p2)) return SVGZoomAndPanImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGSVGElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGSVGElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGSVGElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) {
+ SVGContainerImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) {
+ SVGFitToViewBoxImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGZoomAndPanImpl::hasProperty(p1,p2)) {
+ SVGZoomAndPanImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGSVGElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGSVGElementImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGSVGElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGSVGElementImpl>(p1,const_cast<SVGSVGElementImpl *>(this));
+}
+
+Value SVGSVGElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGSVGElementImpl,KSVGRWBridge<SVGSVGElementImpl> >(p1,const_cast<SVGSVGElementImpl *>(this)));
+}
+
+bool SVGScriptElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGScriptElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGScriptElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGScriptElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGScriptElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGScriptElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGScriptElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGScriptElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGScriptElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGScriptElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGScriptElementImpl>(p1,const_cast<SVGScriptElementImpl *>(this));
+}
+
+Value SVGScriptElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGScriptElementImpl,KSVGRWBridge<SVGScriptElementImpl> >(p1,const_cast<SVGScriptElementImpl *>(this)));
+}
+
+bool SVGSetElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGSetElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) return SVGAnimationElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGSetElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGAnimationElementImpl::hasProperty(p1,p2)) {
+ SVGAnimationElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGSetElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGSetElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGSetElementImpl>(p1,const_cast<SVGSetElementImpl *>(this));
+}
+
+Value SVGSetElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGSetElementImpl,KSVGRWBridge<SVGSetElementImpl> >(p1,const_cast<SVGSetElementImpl *>(this)));
+}
+
+bool SVGShapeImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGShapeImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGShapeImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGShapeImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGShapeImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGShapeImpl,KSVGRWBridge<SVGShapeImpl> >(p1,const_cast<SVGShapeImpl *>(this)));
+}
+
+bool SVGStopElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGStopElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGStopElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGStopElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGStopElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGStopElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGStopElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGStopElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGStopElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGStopElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGStopElementImpl>(p1,const_cast<SVGStopElementImpl *>(this));
+}
+
+Value SVGStopElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGStopElementImpl,KSVGRWBridge<SVGStopElementImpl> >(p1,const_cast<SVGStopElementImpl *>(this)));
+}
+
+bool SVGStringListImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGStringListImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGStringListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGStringListImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGStringListImplProtoFunc,SVGStringListImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGStringListImpl *SVGStringListImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGStringListImpl> *test = dynamic_cast<const KSVGBridge<SVGStringListImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGStringListImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGStringListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGStringListImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGStringListImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGStringListImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGStringListImpl,KSVGBridge<SVGStringListImpl> >(p1,const_cast<SVGStringListImpl *>(this)));
+}
+
+bool SVGStylableImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGStylableImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGStylableImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGStylableImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGStylableImplProtoFunc,SVGStylableImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGStylableImpl *SVGStylableImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGStylableImpl> *test = dynamic_cast<const KSVGBridge<SVGStylableImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAltGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAltGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGCircleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGCircleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGClipPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGClipPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDefsElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDefsElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDescElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDescElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGEllipseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGEllipseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEFloodElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEFloodElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFEImageElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFEImageElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFilterElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFilterElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGFontElementImpl> *test = dynamic_cast<const KSVGBridge<SVGFontElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGForeignObjectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGForeignObjectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGlyphRefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGlyphRefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGImageElementImpl> *test = dynamic_cast<const KSVGBridge<SVGImageElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGLineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGLineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGLinearGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGLinearGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMarkerElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMarkerElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMaskElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMaskElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMissingGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMissingGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPatternElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPatternElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolyElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolyElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolygonElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolygonElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolylineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolylineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGRadialGradientElementImpl> *test = dynamic_cast<const KSVGBridge<SVGRadialGradientElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGRectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGRectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSVGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSVGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGStopElementImpl> *test = dynamic_cast<const KSVGBridge<SVGStopElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSwitchElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSwitchElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSymbolElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSymbolElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTRefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTRefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTSpanElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTSpanElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextContentElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextContentElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPositioningElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPositioningElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTitleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTitleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGUseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGUseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGStylableImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGStylableImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGStylableImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGStylableImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGStylableImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGStylableImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGStylableImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGStylableImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGStylableImpl,KSVGRWBridge<SVGStylableImpl> >(p1,const_cast<SVGStylableImpl *>(this)));
+}
+
+bool SVGStyleElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGStyleElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGStyleElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGStyleElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGStyleElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGStyleElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGStyleElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGStyleElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGStyleElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGStyleElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGStyleElementImpl>(p1,const_cast<SVGStyleElementImpl *>(this));
+}
+
+Value SVGStyleElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGStyleElementImpl,KSVGRWBridge<SVGStyleElementImpl> >(p1,const_cast<SVGStyleElementImpl *>(this)));
+}
+
+bool SVGSwitchElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGSwitchElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) return SVGContainerImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGSwitchElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGContainerImpl::hasProperty(p1,p2)) {
+ SVGContainerImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGSwitchElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGSwitchElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGSwitchElementImpl>(p1,const_cast<SVGSwitchElementImpl *>(this));
+}
+
+Value SVGSwitchElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGSwitchElementImpl,KSVGRWBridge<SVGSwitchElementImpl> >(p1,const_cast<SVGSwitchElementImpl *>(this)));
+}
+
+bool SVGSymbolElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGSymbolElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGSymbolElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGSymbolElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGSymbolElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return SVGFitToViewBoxImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGSymbolElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGSymbolElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGSymbolElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) {
+ SVGFitToViewBoxImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGSymbolElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGSymbolElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGSymbolElementImpl>(p1,const_cast<SVGSymbolElementImpl *>(this));
+}
+
+Value SVGSymbolElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGSymbolElementImpl,KSVGRWBridge<SVGSymbolElementImpl> >(p1,const_cast<SVGSymbolElementImpl *>(this)));
+}
+
+bool SVGTRefElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGTSpanElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTRefElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGTSpanElementImpl::hasProperty(p1,p2)) return SVGTSpanElementImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGTRefElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGTSpanElementImpl::hasProperty(p1,p2)) {
+ SVGTSpanElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGTRefElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGTRefElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGTRefElementImpl>(p1,const_cast<SVGTRefElementImpl *>(this));
+}
+
+Value SVGTRefElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTRefElementImpl,KSVGRWBridge<SVGTRefElementImpl> >(p1,const_cast<SVGTRefElementImpl *>(this)));
+}
+
+bool SVGTSpanElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGTextPositioningElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTSpanElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGTextPositioningElementImpl::hasProperty(p1,p2)) return SVGTextPositioningElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGTSpanElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGTextPositioningElementImpl::hasProperty(p1,p2)) {
+ SVGTextPositioningElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGTSpanElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGTSpanElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGTSpanElementImpl>(p1,const_cast<SVGTSpanElementImpl *>(this));
+}
+
+Value SVGTSpanElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTSpanElementImpl,KSVGRWBridge<SVGTSpanElementImpl> >(p1,const_cast<SVGTSpanElementImpl *>(this)));
+}
+
+bool SVGTestsImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGTestsImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGTestsImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTestsImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGTestsImplProtoFunc,SVGTestsImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGTestsImpl *SVGTestsImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGTestsImpl> *test = dynamic_cast<const KSVGBridge<SVGTestsImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAltGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAltGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateColorElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateColorElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateMotionElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateMotionElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimateTransformElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimateTransformElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAnimationElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAnimationElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGCircleElementImpl> *test = dynamic_cast<const KSVGBridge<SVGCircleElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGClipPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGClipPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGCursorElementImpl> *test = dynamic_cast<const KSVGBridge<SVGCursorElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGDefsElementImpl> *test = dynamic_cast<const KSVGBridge<SVGDefsElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGEllipseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGEllipseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGForeignObjectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGForeignObjectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGImageElementImpl> *test = dynamic_cast<const KSVGBridge<SVGImageElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGLineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGLineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMaskElementImpl> *test = dynamic_cast<const KSVGBridge<SVGMaskElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPatternElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPatternElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolyElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolyElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolygonElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolygonElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGPolylineElementImpl> *test = dynamic_cast<const KSVGBridge<SVGPolylineElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGRectElementImpl> *test = dynamic_cast<const KSVGBridge<SVGRectElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSVGElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSVGElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSetElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSetElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGSwitchElementImpl> *test = dynamic_cast<const KSVGBridge<SVGSwitchElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTRefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTRefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTSpanElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTSpanElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextContentElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextContentElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPositioningElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPositioningElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGUseElementImpl> *test = dynamic_cast<const KSVGBridge<SVGUseElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGTestsImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGTestsImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGTestsImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGTestsImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGTestsImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGTestsImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGTestsImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGTestsImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTestsImpl,KSVGRWBridge<SVGTestsImpl> >(p1,const_cast<SVGTestsImpl *>(this)));
+}
+
+bool SVGTextContentElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGTextContentElementImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGTextContentElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTextContentElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGTextContentElementImplProtoFunc,SVGTextContentElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGTextContentElementImpl *SVGTextContentElementImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGTextContentElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextContentElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGAltGlyphElementImpl> *test = dynamic_cast<const KSVGBridge<SVGAltGlyphElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTRefElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTRefElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTSpanElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTSpanElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPathElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPathElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGTextPositioningElementImpl> *test = dynamic_cast<const KSVGBridge<SVGTextPositioningElementImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGTextContentElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGTextContentElementImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGTextContentElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGTextContentElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGTextContentElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGTextContentElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGTextContentElementImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGTextContentElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTextContentElementImpl,KSVGRWBridge<SVGTextContentElementImpl> >(p1,const_cast<SVGTextContentElementImpl *>(this)));
+}
+
+bool SVGTextContentElementImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGTextContentElementImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGTextContentElementImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGTextContentElementImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGTextContentElementImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGTextContentElementImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGTextContentElementImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTextContentElementImplConstructor,KSVGBridge<SVGTextContentElementImplConstructor> >(p1,const_cast<SVGTextContentElementImplConstructor *>(this)));
+}
+
+bool SVGTextElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGTextPositioningElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTextElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGTextPositioningElementImpl::hasProperty(p1,p2)) return SVGTextPositioningElementImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGTextElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGTextPositioningElementImpl::hasProperty(p1,p2)) {
+ SVGTextPositioningElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGTextElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGTextElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGTextElementImpl>(p1,const_cast<SVGTextElementImpl *>(this));
+}
+
+Value SVGTextElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTextElementImpl,KSVGRWBridge<SVGTextElementImpl> >(p1,const_cast<SVGTextElementImpl *>(this)));
+}
+
+bool SVGTextPathElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGTextPathElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGTextContentElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTextPathElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGTextPathElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGTextPathElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGTextContentElementImpl::hasProperty(p1,p2)) return SVGTextContentElementImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGTextPathElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGTextPathElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGTextPathElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGTextContentElementImpl::hasProperty(p1,p2)) {
+ SVGTextContentElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGTextPathElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGTextPathElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGTextPathElementImpl>(p1,const_cast<SVGTextPathElementImpl *>(this));
+}
+
+Value SVGTextPathElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTextPathElementImpl,KSVGRWBridge<SVGTextPathElementImpl> >(p1,const_cast<SVGTextPathElementImpl *>(this)));
+}
+
+bool SVGTextPathElementImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGTextPathElementImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGTextPathElementImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGTextPathElementImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGTextPathElementImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGTextPathElementImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGTextPathElementImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTextPathElementImplConstructor,KSVGBridge<SVGTextPathElementImplConstructor> >(p1,const_cast<SVGTextPathElementImplConstructor *>(this)));
+}
+
+bool SVGTextPositioningElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGTextPositioningElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGTextContentElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTextPositioningElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGTextPositioningElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGTextPositioningElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGTextContentElementImpl::hasProperty(p1,p2)) return SVGTextContentElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGTextPositioningElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGTextPositioningElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGTextPositioningElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGTextContentElementImpl::hasProperty(p1,p2)) {
+ SVGTextContentElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGTextPositioningElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGTextPositioningElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTextPositioningElementImpl,KSVGRWBridge<SVGTextPositioningElementImpl> >(p1,const_cast<SVGTextPositioningElementImpl *>(this)));
+}
+
+bool SVGTitleElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTitleElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGTitleElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGTitleElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGTitleElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGTitleElementImpl>(p1,const_cast<SVGTitleElementImpl *>(this));
+}
+
+Value SVGTitleElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTitleElementImpl,KSVGRWBridge<SVGTitleElementImpl> >(p1,const_cast<SVGTitleElementImpl *>(this)));
+}
+
+bool SVGTransformImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGTransformImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGTransformImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTransformImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGTransformImplProtoFunc,SVGTransformImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGTransformImpl *SVGTransformImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGTransformImpl> *test = dynamic_cast<const KSVGBridge<SVGTransformImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGTransformImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGTransformImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGTransformImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGTransformImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGTransformImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTransformImpl,KSVGBridge<SVGTransformImpl> >(p1,const_cast<SVGTransformImpl *>(this)));
+}
+
+bool SVGTransformImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGTransformImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGTransformImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGTransformImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGTransformImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGTransformImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGTransformImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTransformImplConstructor,KSVGBridge<SVGTransformImplConstructor> >(p1,const_cast<SVGTransformImplConstructor *>(this)));
+}
+
+bool SVGTransformListImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGTransformListImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGTransformListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTransformListImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGTransformListImplProtoFunc,SVGTransformListImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGTransformListImpl *SVGTransformListImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGTransformListImpl> *test = dynamic_cast<const KSVGBridge<SVGTransformListImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGTransformListImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGTransformListImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGTransformListImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGTransformListImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGTransformListImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTransformListImpl,KSVGBridge<SVGTransformListImpl> >(p1,const_cast<SVGTransformListImpl *>(this)));
+}
+
+bool SVGTransformableImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGTransformableImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGLocatableImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGTransformableImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGTransformableImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGTransformableImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGLocatableImpl::hasProperty(p1,p2)) return SVGLocatableImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGTransformableImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGTransformableImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGTransformableImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGTransformableImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGTransformableImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGTransformableImpl,KSVGRWBridge<SVGTransformableImpl> >(p1,const_cast<SVGTransformableImpl *>(this)));
+}
+
+bool SVGUIEventImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGUIEventImpl::s_hashTable,p2);
+ if(e) return true;
+ Object proto = SVGUIEventImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return true;
+ if(SVGEventImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGUIEventImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGet<SVGUIEventImplProtoFunc,SVGUIEventImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+SVGUIEventImpl *SVGUIEventImplProtoFunc::cast(const ObjectImp *p1) const
+{
+ { const KSVGBridge<SVGUIEventImpl> *test = dynamic_cast<const KSVGBridge<SVGUIEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGKeyEventImpl> *test = dynamic_cast<const KSVGBridge<SVGKeyEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGMouseEventImpl> *test = dynamic_cast<const KSVGBridge<SVGMouseEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ { const KSVGBridge<SVGZoomEventImpl> *test = dynamic_cast<const KSVGBridge<SVGZoomEventImpl> * >(p1);
+ if(test) return test->impl(); }
+ return 0;
+}
+
+Value SVGUIEventImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Object proto = SVGUIEventImplProto::self(p1);
+ if(proto.hasProperty(p1,p2)) return proto.get(p1,p2);
+ if(SVGEventImpl::hasProperty(p1,p2)) return SVGEventImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+Object SVGUIEventImpl::prototype(ExecState *p1) const
+{
+ if(p1) return SVGUIEventImplProto::self(p1);
+ return Object::dynamicCast(Null());
+}
+
+Value SVGUIEventImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGUIEventImpl,KSVGBridge<SVGUIEventImpl> >(p1,const_cast<SVGUIEventImpl *>(this)));
+}
+
+bool SVGURIReferenceImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGURIReferenceImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGURIReferenceImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGURIReferenceImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGURIReferenceImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGURIReferenceImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGURIReferenceImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGURIReferenceImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGURIReferenceImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGURIReferenceImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGURIReferenceImpl,KSVGRWBridge<SVGURIReferenceImpl> >(p1,const_cast<SVGURIReferenceImpl *>(this)));
+}
+
+bool SVGUseElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGUseElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return true;
+ if(SVGShapeImpl::hasProperty(p1,p2)) return true;
+ if(SVGStylableImpl::hasProperty(p1,p2)) return true;
+ if(SVGTestsImpl::hasProperty(p1,p2)) return true;
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return true;
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGUseElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGUseElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGUseElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) return SVGLangSpaceImpl::get(p1,p2,p3);
+ if(SVGShapeImpl::hasProperty(p1,p2)) return SVGShapeImpl::get(p1,p2,p3);
+ if(SVGStylableImpl::hasProperty(p1,p2)) return SVGStylableImpl::get(p1,p2,p3);
+ if(SVGTestsImpl::hasProperty(p1,p2)) return SVGTestsImpl::get(p1,p2,p3);
+ if(SVGTransformableImpl::hasProperty(p1,p2)) return SVGTransformableImpl::get(p1,p2,p3);
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) return SVGURIReferenceImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGUseElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGUseElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGUseElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGLangSpaceImpl::hasProperty(p1,p2)) {
+ SVGLangSpaceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGShapeImpl::hasProperty(p1,p2)) {
+ SVGShapeImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGStylableImpl::hasProperty(p1,p2)) {
+ SVGStylableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTestsImpl::hasProperty(p1,p2)) {
+ SVGTestsImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGTransformableImpl::hasProperty(p1,p2)) {
+ SVGTransformableImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGURIReferenceImpl::hasProperty(p1,p2)) {
+ SVGURIReferenceImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGUseElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGUseElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGUseElementImpl>(p1,const_cast<SVGUseElementImpl *>(this));
+}
+
+Value SVGUseElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGUseElementImpl,KSVGRWBridge<SVGUseElementImpl> >(p1,const_cast<SVGUseElementImpl *>(this)));
+}
+
+bool SVGVKernElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGVKernElementImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGVKernElementImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGVKernElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGVKernElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGVKernElementImpl,KSVGRWBridge<SVGVKernElementImpl> >(p1,const_cast<SVGVKernElementImpl *>(this)));
+}
+
+bool SVGViewElementImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGViewElementImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGElementImpl::hasProperty(p1,p2)) return true;
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return true;
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return true;
+ if(SVGZoomAndPanImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGViewElementImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGViewElementImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGViewElementImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) return SVGElementImpl::get(p1,p2,p3);
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) return SVGExternalResourcesRequiredImpl::get(p1,p2,p3);
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return SVGFitToViewBoxImpl::get(p1,p2,p3);
+ if(SVGZoomAndPanImpl::hasProperty(p1,p2)) return SVGZoomAndPanImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGViewElementImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGViewElementImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGViewElementImpl::putInParents(PUT_METHOD_ARGS)
+{
+ if(SVGElementImpl::hasProperty(p1,p2)) {
+ SVGElementImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGExternalResourcesRequiredImpl::hasProperty(p1,p2)) {
+ SVGExternalResourcesRequiredImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) {
+ SVGFitToViewBoxImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGZoomAndPanImpl::hasProperty(p1,p2)) {
+ SVGZoomAndPanImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGViewElementImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+ObjectImp *SVGViewElementImpl::bridge(ExecState *p1) const
+{
+ return new KSVGRWBridge<SVGViewElementImpl>(p1,const_cast<SVGViewElementImpl *>(this));
+}
+
+Value SVGViewElementImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGViewElementImpl,KSVGRWBridge<SVGViewElementImpl> >(p1,const_cast<SVGViewElementImpl *>(this)));
+}
+
+bool SVGViewSpecImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return true;
+ if(SVGZoomAndPanImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGViewSpecImpl::get(GET_METHOD_ARGS) const
+{
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) return SVGFitToViewBoxImpl::get(p1,p2,p3);
+ if(SVGZoomAndPanImpl::hasProperty(p1,p2)) return SVGZoomAndPanImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+bool SVGViewSpecImpl::put(PUT_METHOD_ARGS)
+{
+ if(SVGFitToViewBoxImpl::hasProperty(p1,p2)) {
+ SVGFitToViewBoxImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ if(SVGZoomAndPanImpl::hasProperty(p1,p2)) {
+ SVGZoomAndPanImpl::put(p1,p2,p3,p4);
+ return true;
+ }
+ return false;
+}
+
+Object SVGViewSpecImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGViewSpecImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGViewSpecImpl,KSVGRWBridge<SVGViewSpecImpl> >(p1,const_cast<SVGViewSpecImpl *>(this)));
+}
+
+bool SVGZoomAndPanImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGZoomAndPanImpl::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGZoomAndPanImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGZoomAndPanImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGZoomAndPanImpl::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+bool SVGZoomAndPanImpl::put(PUT_METHOD_ARGS)
+{
+ return lookupPut<SVGZoomAndPanImpl>(p1,p2,p3,p4,&s_hashTable,this);
+}
+
+bool SVGZoomAndPanImpl::putInParents(PUT_METHOD_ARGS)
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3); Q_UNUSED(p4);
+ return false;
+}
+
+Object SVGZoomAndPanImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGZoomAndPanImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGZoomAndPanImpl,KSVGRWBridge<SVGZoomAndPanImpl> >(p1,const_cast<SVGZoomAndPanImpl *>(this)));
+}
+
+bool SVGZoomAndPanImplConstructor::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGZoomAndPanImplConstructor::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SVGZoomAndPanImplConstructor::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGZoomAndPanImplConstructor>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGZoomAndPanImplConstructor::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SVGZoomAndPanImplConstructor::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGZoomAndPanImplConstructor::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGZoomAndPanImplConstructor,KSVGBridge<SVGZoomAndPanImplConstructor> >(p1,const_cast<SVGZoomAndPanImplConstructor *>(this)));
+}
+
+bool SVGZoomEventImpl::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SVGZoomEventImpl::s_hashTable,p2);
+ if(e) return true;
+ if(SVGUIEventImpl::hasProperty(p1,p2)) return true;
+ return false;
+}
+
+Value SVGZoomEventImpl::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SVGZoomEventImpl>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SVGZoomEventImpl::getInParents(GET_METHOD_ARGS) const
+{
+ if(SVGUIEventImpl::hasProperty(p1,p2)) return SVGUIEventImpl::get(p1,p2,p3);
+ return Undefined();
+}
+
+Object SVGZoomEventImpl::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SVGZoomEventImpl::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SVGZoomEventImpl,KSVGBridge<SVGZoomEventImpl> >(p1,const_cast<SVGZoomEventImpl *>(this)));
+}
+
+bool SharedString::hasProperty(ExecState *p1,const Identifier &p2) const
+{
+ const HashEntry *e = Lookup::findEntry(&SharedString::s_hashTable,p2);
+ if(e) return true;
+ Q_UNUSED(p1);
+ return false;
+}
+
+Value SharedString::get(GET_METHOD_ARGS) const
+{
+ return lookupGetValue<SharedString>(p1,p2,&s_hashTable,this,p3);
+}
+
+Value SharedString::getInParents(GET_METHOD_ARGS) const
+{
+ Q_UNUSED(p1); Q_UNUSED(p2); Q_UNUSED(p3);
+ return Undefined();
+}
+
+Object SharedString::prototype(ExecState *p1) const
+{
+ if(p1) return p1->interpreter()->builtinObjectPrototype();
+ return Object::dynamicCast(Null());
+}
+
+Value SharedString::cache(ExecState *p1) const
+{
+ return KJS::Value(cacheDOMObject<SharedString,KSVGBridge<SharedString> >(p1,const_cast<SharedString *>(this)));
+}
+
diff --git a/ksvg/impl/libs/Makefile.am b/ksvg/impl/libs/Makefile.am
new file mode 100644
index 00000000..76f41e24
--- /dev/null
+++ b/ksvg/impl/libs/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = xrgbrender art_support libtext2path
diff --git a/ksvg/impl/libs/art_support/Makefile.am b/ksvg/impl/libs/art_support/Makefile.am
new file mode 100644
index 00000000..4bf00dd7
--- /dev/null
+++ b/ksvg/impl/libs/art_support/Makefile.am
@@ -0,0 +1,4 @@
+noinst_LTLIBRARIES = libksvgart.la
+libksvgart_la_SOURCES = art_render_misc.c art_rgba_svp.c art_misc.c
+
+INCLUDES = $(LIBART_CFLAGS) $(all_includes)
diff --git a/ksvg/impl/libs/art_support/art_misc.c b/ksvg/impl/libs/art_support/art_misc.c
new file mode 100644
index 00000000..69b45306
--- /dev/null
+++ b/ksvg/impl/libs/art_support/art_misc.c
@@ -0,0 +1,1841 @@
+#include <libart_lgpl/art_vpath.h>
+#include <libart_lgpl/art_bpath.h>
+#include <libart_lgpl/art_misc.h>
+#include <libart_lgpl/art_affine.h>
+#include <libart_lgpl/art_svp_render_aa.h>
+
+#include "art_misc.h"
+
+extern double ceil(double x);
+extern double floor(double x);
+
+/**
+ * art_vpath_render_bez: Render a bezier segment into the vpath.
+ * @p_vpath: Where the pointer to the #ArtVpath structure is stored.
+ * @pn_points: Pointer to the number of points in *@p_vpath.
+ * @pn_points_max: Pointer to the number of points allocated.
+ * @x0: X coordinate of starting bezier point.
+ * @y0: Y coordinate of starting bezier point.
+ * @x1: X coordinate of first bezier control point.
+ * @y1: Y coordinate of first bezier control point.
+ * @x2: X coordinate of second bezier control point.
+ * @y2: Y coordinate of second bezier control point.
+ * @x3: X coordinate of ending bezier point.
+ * @y3: Y coordinate of ending bezier point.
+ * @flatness: Flatness control.
+ *
+ * Renders a bezier segment into the vector path, reallocating and
+ * updating *@p_vpath and *@pn_vpath_max as necessary. *@pn_vpath is
+ * incremented by the number of vector points added.
+ *
+ * This step includes (@x0, @y0) but not (@x3, @y3).
+ *
+ * The @flatness argument guides the amount of subdivision. The Adobe
+ * PostScript reference manual defines flatness as the maximum
+ * deviation between the any point on the vpath approximation and the
+ * corresponding point on the "true" curve, and we follow this
+ * definition here. A value of 0.25 should ensure high quality for aa
+ * rendering.
+ **/
+ void
+ksvg_art_vpath_render_bez (ArtVpath **p_vpath, int *pn, int *pn_max,
+ double x0, double y0,
+ double x1, double y1,
+ double x2, double y2,
+ double x3, double y3,
+ double flatness)
+{
+ double x3_0, y3_0;
+ double z3_0_dot;
+ double z1_dot, z2_dot;
+ double z1_perp, z2_perp;
+ double max_perp_sq;
+
+ double x_m, y_m;
+ double xa1, ya1;
+ double xa2, ya2;
+ double xb1, yb1;
+ double xb2, yb2;
+
+ /* It's possible to optimize this routine a fair amount.
+
+ First, once the _dot conditions are met, they will also be met in
+ all further subdivisions. So we might recurse to a different
+ routine that only checks the _perp conditions.
+
+ Second, the distance _should_ decrease according to fairly
+ predictable rules (a factor of 4 with each subdivision). So it might
+ be possible to note that the distance is within a factor of 4 of
+ acceptable, and subdivide once. But proving this might be hard.
+
+ Third, at the last subdivision, x_m and y_m can be computed more
+ expeditiously (as in the routine above).
+
+ Finally, if we were able to subdivide by, say 2 or 3, this would
+ allow considerably finer-grain control, i.e. fewer points for the
+ same flatness tolerance. This would speed things up downstream.
+
+ In any case, this routine is unlikely to be the bottleneck. It's
+ just that I have this undying quest for more speed...
+
+*/
+
+ x3_0 = x3 - x0;
+ y3_0 = y3 - y0;
+
+ /* z3_0_dot is dist z0-z3 squared */
+ z3_0_dot = x3_0 * x3_0 + y3_0 * y3_0;
+
+ /* todo: this test is far from satisfactory. */
+ if (z3_0_dot < 0.001)
+ goto nosubdivide;
+
+ /* we can avoid subdivision if:
+
+ z1 has distance no more than flatness from the z0-z3 line
+
+ z1 is no more z0'ward than flatness past z0-z3
+
+ z1 is more z0'ward than z3'ward on the line traversing z0-z3
+
+ and correspondingly for z2 */
+
+ /* perp is distance from line, multiplied by dist z0-z3 */
+ max_perp_sq = flatness * flatness * z3_0_dot;
+ z1_perp = (y1 - y0) * x3_0 - (x1 - x0) * y3_0;
+ if (z1_perp * z1_perp > max_perp_sq)
+ goto subdivide;
+
+ z2_perp = (y3 - y2) * x3_0 - (x3 - x2) * y3_0;
+ if (z2_perp * z2_perp > max_perp_sq)
+ goto subdivide;
+
+ z1_dot = (x1 - x0) * x3_0 + (y1 - y0) * y3_0;
+ if (z1_dot < 0 && z1_dot * z1_dot > max_perp_sq)
+ goto subdivide;
+
+ z2_dot = (x3 - x2) * x3_0 + (y3 - y2) * y3_0;
+ if (z2_dot < 0 && z2_dot * z2_dot > max_perp_sq)
+ goto subdivide;
+
+ if (z1_dot + z1_dot > z3_0_dot)
+ goto subdivide;
+
+ if (z2_dot + z2_dot > z3_0_dot)
+ goto subdivide;
+
+nosubdivide:
+ /* don't subdivide */
+ art_vpath_add_point (p_vpath, pn, pn_max,
+ ART_LINETO, x3, y3);
+ return;
+
+subdivide:
+
+ xa1 = (x0 + x1) * 0.5;
+ ya1 = (y0 + y1) * 0.5;
+ xa2 = (x0 + 2 * x1 + x2) * 0.25;
+ ya2 = (y0 + 2 * y1 + y2) * 0.25;
+ xb1 = (x1 + 2 * x2 + x3) * 0.25;
+ yb1 = (y1 + 2 * y2 + y3) * 0.25;
+ xb2 = (x2 + x3) * 0.5;
+ yb2 = (y2 + y3) * 0.5;
+ x_m = (xa2 + xb1) * 0.5;
+ y_m = (ya2 + yb1) * 0.5;
+#ifdef VERBOSE
+ printf ("%g,%g %g,%g %g,%g %g,%g\n", xa1, ya1, xa2, ya2,
+ xb1, yb1, xb2, yb2);
+#endif
+ ksvg_art_vpath_render_bez (p_vpath, pn, pn_max,
+ x0, y0, xa1, ya1, xa2, ya2, x_m, y_m, flatness);
+ ksvg_art_vpath_render_bez (p_vpath, pn, pn_max,
+ x_m, y_m, xb1, yb1, xb2, yb2, x3, y3, flatness);
+}
+
+#define RENDER_LEVEL 4
+#define RENDER_SIZE (1 << (RENDER_LEVEL))
+
+/**
+ * ksvg_art_bez_path_to_vec: Create vpath from bezier path.
+ * @bez: Bezier path.
+ * @flatness: Flatness control.
+ *
+ * Creates a vector path closely approximating the bezier path defined by
+ * @bez. The @flatness argument controls the amount of subdivision. In
+ * general, the resulting vpath deviates by at most @flatness pixels
+ * from the "ideal" path described by @bez.
+ *
+ * Return value: Newly allocated vpath.
+ **/
+ ArtVpath *
+ksvg_art_bez_path_to_vec(const ArtBpath *bez, double flatness)
+{
+ ArtVpath *vec;
+ int vec_n, vec_n_max;
+ int bez_index;
+ double x, y;
+
+ vec_n = 0;
+ vec_n_max = RENDER_SIZE;
+ vec = art_new (ArtVpath, vec_n_max);
+
+ /* Initialization is unnecessary because of the precondition that the
+ bezier path does not begin with LINETO or CURVETO, but is here
+ to make the code warning-free. */
+ x = 0;
+ y = 0;
+
+ bez_index = 0;
+ do
+ {
+#ifdef VERBOSE
+ printf ("%s %g %g\n",
+ bez[bez_index].code == ART_CURVETO ? "curveto" :
+ bez[bez_index].code == ART_LINETO ? "lineto" :
+ bez[bez_index].code == ART_MOVETO ? "moveto" :
+ bez[bez_index].code == ART_MOVETO_OPEN ? "moveto-open" :
+ "end", bez[bez_index].x3, bez[bez_index].y3);
+#endif
+ /* make sure space for at least one more code */
+ if (vec_n >= vec_n_max)
+ art_expand (vec, ArtVpath, vec_n_max);
+ switch (bez[bez_index].code)
+ {
+ case ART_MOVETO_OPEN:
+ case ART_MOVETO:
+ case ART_LINETO:
+ x = bez[bez_index].x3;
+ y = bez[bez_index].y3;
+ vec[vec_n].code = bez[bez_index].code;
+ vec[vec_n].x = x;
+ vec[vec_n].y = y;
+ vec_n++;
+ break;
+ case ART_END:
+ vec[vec_n].code = ART_END;
+ vec[vec_n].x = 0;
+ vec[vec_n].y = 0;
+ vec_n++;
+ break;
+ case ART_END2:
+ vec[vec_n].code = (ArtPathcode)ART_END2;
+ vec[vec_n].x = bez[bez_index].x3;
+ vec[vec_n].y = bez[bez_index].y3;
+ vec_n++;
+ break;
+ case ART_CURVETO:
+#ifdef VERBOSE
+ printf ("%g,%g %g,%g %g,%g %g,%g\n", x, y,
+ bez[bez_index].x1, bez[bez_index].y1,
+ bez[bez_index].x2, bez[bez_index].y2,
+ bez[bez_index].x3, bez[bez_index].y3);
+#endif
+ ksvg_art_vpath_render_bez (&vec, &vec_n, &vec_n_max,
+ x, y,
+ bez[bez_index].x1, bez[bez_index].y1,
+ bez[bez_index].x2, bez[bez_index].y2,
+ bez[bez_index].x3, bez[bez_index].y3,
+ flatness);
+ x = bez[bez_index].x3;
+ y = bez[bez_index].y3;
+ break;
+ }
+ }
+ while (bez[bez_index++].code != ART_END);
+ return vec;
+}
+
+/* Private functions for the rgb affine image compositors - primarily,
+* the determination of runs, eliminating the need for source image
+* bbox calculation in the inner loop. */
+
+/* Determine a "run", such that the inverse affine of all pixels from
+* (x0, y) inclusive to (x1, y) exclusive fit within the bounds
+* of the source image.
+*
+* Initial values of x0, x1, and result values stored in first two
+* pointer arguments.
+* */
+
+#define EPSILON 1e-6
+
+ void ksvg_art_rgb_affine_run (int *p_x0, int *p_x1, int y,
+ int src_width, int src_height,
+ const double affine[6])
+{
+ int x0, x1;
+ double z;
+ double x_intercept;
+ int xi;
+
+ x0 = *p_x0;
+ x1 = *p_x1;
+
+ /* do left and right edges */
+ if (affine[0] > EPSILON)
+ {
+ z = affine[2] * (y + 0.5) + affine[4];
+ x_intercept = -z / affine[0];
+ xi = ceil (x_intercept + EPSILON - 0.5);
+ if (xi > x0)
+ x0 = xi;
+ x_intercept = (-z + src_width) / affine[0];
+ xi = ceil (x_intercept - EPSILON - 0.5);
+ if (xi < x1)
+ x1 = xi;
+ }
+ else if (affine[0] < -EPSILON)
+ {
+ z = affine[2] * (y + 0.5) + affine[4];
+ x_intercept = (-z + src_width) / affine[0];
+ xi = ceil (x_intercept + EPSILON - 0.5);
+ if (xi > x0)
+ x0 = xi;
+ x_intercept = -z / affine[0];
+ xi = ceil (x_intercept - EPSILON - 0.5);
+ if (xi < x1)
+ x1 = xi;
+ }
+ else
+ {
+ z = affine[2] * (y + 0.5) + affine[4];
+ if (z < 0 || z >= src_width)
+ {
+ *p_x1 = *p_x0;
+ return;
+ }
+ }
+ /* do top and bottom edges */
+ if (affine[1] > EPSILON)
+ {
+ z = affine[3] * (y + 0.5) + affine[5];
+ x_intercept = -z / affine[1];
+ xi = ceil (x_intercept + EPSILON - 0.5);
+ if (xi > x0)
+ x0 = xi;
+ x_intercept = (-z + src_height) / affine[1];
+ xi = ceil (x_intercept - EPSILON - 0.5);
+ if (xi < x1)
+ x1 = xi;
+ }
+ else if (affine[1] < -EPSILON)
+ {
+ z = affine[3] * (y + 0.5) + affine[5];
+ x_intercept = (-z + src_height) / affine[1];
+ xi = ceil (x_intercept + EPSILON - 0.5);
+ if (xi > x0)
+ x0 = xi;
+ x_intercept = -z / affine[1];
+ xi = ceil (x_intercept - EPSILON - 0.5);
+ if (xi < x1)
+ x1 = xi;
+ }
+ else
+ {
+ z = affine[3] * (y + 0.5) + affine[5];
+ if (z < 0 || z >= src_height)
+ {
+ *p_x1 = *p_x0;
+ return;
+ }
+ }
+
+ *p_x0 = x0;
+ *p_x1 = x1;
+}
+
+/**
+ * ksvg_art_rgb_affine: Affine transform source RGB image and composite.
+ * @dst: Destination image RGB buffer.
+ * @x0: Left coordinate of destination rectangle.
+ * @y0: Top coordinate of destination rectangle.
+ * @x1: Right coordinate of destination rectangle.
+ * @y1: Bottom coordinate of destination rectangle.
+ * @dst_rowstride: Rowstride of @dst buffer.
+ * @src: Source image RGB buffer.
+ * @src_width: Width of source image.
+ * @src_height: Height of source image.
+ * @src_rowstride: Rowstride of @src buffer.
+ * @affine: Affine transform.
+ * @level: Filter level.
+ * @alphagamma: #ArtAlphaGamma for gamma-correcting the compositing.
+ * @alpha: Alpha, range 0..256.
+ *
+ * Affine transform the source image stored in @src, compositing over
+ * the area of destination image @dst specified by the rectangle
+ * (@x0, @y0) - (@x1, @y1). As usual in libart, the left and top edges
+ * of this rectangle are included, and the right and bottom edges are
+ * excluded.
+ *
+ * The @alphagamma parameter specifies that the alpha compositing be done
+ * in a gamma-corrected color space. Since the source image is opaque RGB,
+ * this argument only affects the edges. In the current implementation,
+ * it is ignored.
+ *
+ * The @level parameter specifies the speed/quality tradeoff of the
+ * image interpolation. Currently, only ART_FILTER_NEAREST is
+ * implemented.
+ *
+ * KSVG additions : we have changed this function to support an alpha level as well.
+* also we made sure compositing an rgba image over an rgb buffer works.
+**/
+ void ksvg_art_rgb_affine (art_u8 *dst, int x0, int y0, int x1, int y1, int dst_rowstride,
+ const art_u8 *src,
+ int src_width, int src_height, int src_rowstride,
+ const double affine[6],
+ ArtFilterLevel level,
+ ArtAlphaGamma *alphagamma,
+ int alpha)
+{
+ /* Note: this is a slow implementation, and is missing all filter
+ levels other than NEAREST. It is here for clarity of presentation
+ and to establish the interface. */
+ int x, y;
+ double inv[6];
+ art_u8 *dst_p, *dst_linestart;
+ const art_u8 *src_p;
+ ArtPoint pt, src_pt;
+ int src_x, src_y;
+ int run_x0, run_x1;
+
+ dst_linestart = dst;
+ art_affine_invert (inv, affine);
+
+ if(alpha == 255)
+ for (y = y0; y < y1; y++)
+ {
+ pt.y = y + 0.5;
+ run_x0 = x0;
+ run_x1 = x1;
+ ksvg_art_rgb_affine_run (&run_x0, &run_x1, y, src_width, src_height,
+ inv);
+ dst_p = dst_linestart + (run_x0 - x0) * 3;
+ for (x = run_x0; x < run_x1; x++)
+ {
+ pt.x = x + 0.5;
+ art_affine_point (&src_pt, &pt, inv);
+ src_x = floor (src_pt.x);
+ src_y = floor (src_pt.y);
+ src_p = src + (src_y * src_rowstride) + src_x * 4;
+ dst_p[0] = dst_p[0] + (((src_p[2] - dst_p[0]) * src_p[3] + 0x80) >> 8);
+ dst_p[1] = dst_p[1] + (((src_p[1] - dst_p[1]) * src_p[3] + 0x80) >> 8);
+ dst_p[2] = dst_p[2] + (((src_p[0] - dst_p[2]) * src_p[3] + 0x80) >> 8);
+ dst_p += 3;
+ }
+ dst_linestart += dst_rowstride;
+ }
+ else
+ for (y = y0; y < y1; y++)
+ {
+ pt.y = y + 0.5;
+ run_x0 = x0;
+ run_x1 = x1;
+ ksvg_art_rgb_affine_run (&run_x0, &run_x1, y, src_width, src_height,
+ inv);
+ dst_p = dst_linestart + (run_x0 - x0) * 3;
+ for (x = run_x0; x < run_x1; x++)
+ {
+ pt.x = x + 0.5;
+ art_affine_point (&src_pt, &pt, inv);
+ src_x = floor (src_pt.x);
+ src_y = floor (src_pt.y);
+ src_p = src + (src_y * src_rowstride) + src_x * 4;
+ dst_p[0] = dst_p[0] + (((src_p[2] - dst_p[0]) * alpha + 0x80) >> 8);
+ dst_p[1] = dst_p[1] + (((src_p[1] - dst_p[1]) * alpha + 0x80) >> 8);
+ dst_p[2] = dst_p[2] + (((src_p[0] - dst_p[2]) * alpha + 0x80) >> 8);
+ dst_p += 3;
+ }
+ dst_linestart += dst_rowstride;
+ }
+}
+
+
+typedef struct _ksvgArtRgbAffineClipAlphaData ksvgArtRgbAffineClipAlphaData;
+
+struct _ksvgArtRgbAffineClipAlphaData
+{
+ int alphatab[256];
+ art_u8 alpha;
+ art_u8 *dst;
+ int dst_rowstride;
+ int x0, x1;
+ double inv[6];
+ const art_u8 *src;
+ int src_width;
+ int src_height;
+ int src_rowstride;
+ const art_u8 *mask;
+ int y0;
+};
+
+static
+void ksvg_art_rgb_affine_clip_run(art_u8 *dst_p, int x0, int x1, int y, const double inv[6],
+ int alpha, const art_u8 *src, int src_rowstride, int src_width, int src_height)
+{
+ const art_u8 *src_p;
+ ArtPoint pt, src_pt;
+ int src_x, src_y;
+ int x;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ pt.y = y;
+
+ for(x = x0; x < x1; x++)
+ {
+ pt.x = x;
+
+ art_affine_point(&src_pt, &pt, inv);
+
+ src_x = (int)(src_pt.x);
+ src_y = (int)(src_pt.y);
+
+ if(src_x >= 0 && src_x < src_width && src_y >= 0 && src_y < src_height)
+ {
+ int s;
+ int d;
+ int tmp;
+ int srcAlpha;
+
+ src_p = src + (src_y * src_rowstride) + src_x * 4;
+
+ srcAlpha = alpha * src_p[3] + 0x80;
+ srcAlpha = (srcAlpha + (srcAlpha >> 8)) >> 8;
+
+ d = *dst_p;
+ s = src_p[2];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+
+ d = *dst_p;
+ s = src_p[1];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+
+ d = *dst_p;
+ s = src_p[0];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+ }
+ else
+ dst_p += 3;
+ }
+}
+
+static void
+ksvg_art_rgb_affine_clip_callback (void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ksvgArtRgbAffineClipAlphaData *data = (ksvgArtRgbAffineClipAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ int *alphatab;
+ int alpha;
+
+ linebuf = data->dst;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ alphatab = data->alphatab;
+
+ if(n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if(run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_affine_clip_run(linebuf, x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ for(k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if(run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_affine_clip_run(linebuf + (run_x0 - x0) * 3, run_x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ running_sum += steps[k].delta;
+ if(x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_affine_clip_run(linebuf + (run_x1 - x0) * 3, run_x1, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_affine_clip_run(linebuf, x0, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ data->dst += data->dst_rowstride;
+}
+
+static
+void ksvg_art_rgb_affine_clip_mask_run(art_u8 *dst_p, const art_u8 *mask, int x0, int x1, int y, const double inv[6],
+ int alpha, const art_u8 *src, int src_rowstride, int src_width, int src_height)
+{
+ const art_u8 *src_p;
+ ArtPoint pt, src_pt;
+ int src_x, src_y;
+ int x;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ pt.y = y;
+
+ for(x = x0; x < x1; x++)
+ {
+ pt.x = x;
+
+ art_affine_point(&src_pt, &pt, inv);
+
+ src_x = (int)(src_pt.x);
+ src_y = (int)(src_pt.y);
+
+ if(src_x >= 0 && src_x < src_width && src_y >= 0 && src_y < src_height)
+ {
+ int s;
+ int d;
+ int tmp;
+ int srcAlpha;
+
+ src_p = src + (src_y * src_rowstride) + src_x * 4;
+
+ srcAlpha = alpha * src_p[3] + 0x80;
+ srcAlpha = (srcAlpha + (srcAlpha >> 8)) >> 8;
+
+ srcAlpha = (srcAlpha * *mask++) + 0x80;
+ srcAlpha = (srcAlpha + (srcAlpha >> 8)) >> 8;
+
+ d = *dst_p;
+ s = src_p[2];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+
+ d = *dst_p;
+ s = src_p[1];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+
+ d = *dst_p;
+ s = src_p[0];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+ }
+ else
+ {
+ dst_p += 3;
+ mask++;
+ }
+ }
+}
+
+static void
+ksvg_art_rgb_affine_clip_mask_callback (void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ksvgArtRgbAffineClipAlphaData *data = (ksvgArtRgbAffineClipAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ int *alphatab;
+ int alpha;
+ const art_u8 *maskbuf;
+
+ linebuf = data->dst;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ alphatab = data->alphatab;
+ maskbuf = data->mask + (y - data->y0) * (x1 - x0);
+
+ if(n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if(run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_affine_clip_mask_run(linebuf, maskbuf, x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ for(k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if(run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_affine_clip_mask_run(linebuf + (run_x0 - x0) * 3, maskbuf + (run_x0 - x0), run_x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ running_sum += steps[k].delta;
+ if(x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_affine_clip_mask_run(linebuf + (run_x1 - x0) * 3, maskbuf + (run_x1 - x0), run_x1, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_affine_clip_mask_run(linebuf, maskbuf, x0, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ data->dst += data->dst_rowstride;
+}
+
+static
+void ksvg_art_rgba_affine_clip_run(art_u8 *dst_p, int x0, int x1, int y, const double inv[6],
+ int alpha, const art_u8 *src, int src_rowstride, int src_width, int src_height)
+{
+ const art_u8 *src_p;
+ ArtPoint pt, src_pt;
+ int src_x, src_y;
+ int x;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ pt.y = y;
+
+ for(x = x0; x < x1; x++)
+ {
+ pt.x = x;
+
+ art_affine_point(&src_pt, &pt, inv);
+
+ src_x = (int)(src_pt.x);
+ src_y = (int)(src_pt.y);
+
+ if(src_x >= 0 && src_x < src_width && src_y >= 0 && src_y < src_height)
+ {
+ int s;
+ int d;
+ int tmp;
+ int srcAlpha;
+
+ src_p = src + (src_y * src_rowstride) + src_x * 4;
+
+ srcAlpha = alpha * src_p[3] + 0x80;
+ srcAlpha = (srcAlpha + (srcAlpha >> 8)) >> 8;
+
+ d = *dst_p;
+ s = src_p[2];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+
+ d = *dst_p;
+ s = src_p[1];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+
+ d = *dst_p;
+ s = src_p[0];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+
+ d = *dst_p;
+
+ tmp = srcAlpha * (255 - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+ }
+ else
+ dst_p += 4;
+ }
+}
+
+static void
+ksvg_art_rgba_affine_clip_callback (void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ksvgArtRgbAffineClipAlphaData *data = (ksvgArtRgbAffineClipAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ int *alphatab;
+ int alpha;
+
+ linebuf = data->dst;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ alphatab = data->alphatab;
+
+ if(n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if(run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_affine_clip_run(linebuf, x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ for(k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if(run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_affine_clip_run(linebuf + (run_x0 - x0) * 4, run_x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ running_sum += steps[k].delta;
+ if(x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_affine_clip_run(linebuf + (run_x1 - x0) * 4, run_x1, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_affine_clip_run(linebuf, x0, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ data->dst += data->dst_rowstride;
+}
+
+static
+void ksvg_art_rgba_affine_clip_mask_run(art_u8 *dst_p, const art_u8 *mask, int x0, int x1, int y, const double inv[6],
+ int alpha, const art_u8 *src, int src_rowstride, int src_width, int src_height)
+{
+ const art_u8 *src_p;
+ ArtPoint pt, src_pt;
+ int src_x, src_y;
+ int x;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ pt.y = y;
+
+ for(x = x0; x < x1; x++)
+ {
+ pt.x = x;
+
+ art_affine_point(&src_pt, &pt, inv);
+
+ src_x = (int)(src_pt.x);
+ src_y = (int)(src_pt.y);
+
+ if(src_x >= 0 && src_x < src_width && src_y >= 0 && src_y < src_height)
+ {
+ int s;
+ int d;
+ int tmp;
+ int srcAlpha;
+
+ src_p = src + (src_y * src_rowstride) + src_x * 4;
+
+ srcAlpha = alpha * src_p[3] + 0x80;
+ srcAlpha = (srcAlpha + (srcAlpha >> 8)) >> 8;
+
+ srcAlpha = (srcAlpha * *mask++) + 0x80;
+ srcAlpha = (srcAlpha + (srcAlpha >> 8)) >> 8;
+
+ d = *dst_p;
+ s = src_p[2];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+
+ d = *dst_p;
+ s = src_p[1];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+
+ d = *dst_p;
+ s = src_p[0];
+
+ tmp = srcAlpha * (s - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+
+ d = *dst_p;
+
+ tmp = srcAlpha * (255 - d) + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ *dst_p++ = d + tmp;
+ }
+ else
+ {
+ dst_p += 4;
+ mask++;
+ }
+ }
+}
+
+static void
+ksvg_art_rgba_affine_clip_mask_callback (void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ksvgArtRgbAffineClipAlphaData *data = (ksvgArtRgbAffineClipAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ int *alphatab;
+ int alpha;
+ const art_u8 *maskbuf;
+
+ linebuf = data->dst;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ alphatab = data->alphatab;
+ maskbuf = data->mask + (y - data->y0) * (x1 - x0);
+
+ if(n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if(run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_affine_clip_mask_run(linebuf, maskbuf, x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ for(k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if(run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_affine_clip_mask_run(linebuf + (run_x0 - x0) * 4, maskbuf + (run_x0 - x0), run_x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ running_sum += steps[k].delta;
+ if(x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_affine_clip_mask_run(linebuf + (run_x1 - x0) * 4, maskbuf + (run_x1 - x0), run_x1, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_affine_clip_mask_run(linebuf, maskbuf, x0, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ data->dst += data->dst_rowstride;
+}
+
+/**
+ * ksvg_art_rgb_affine_clip: Affine transform source RGB image and composite, with clipping path.
+ * @svp: Clipping path.
+ * @dst: Destination image RGB buffer.
+ * @x0: Left coordinate of destination rectangle.
+ * @y0: Top coordinate of destination rectangle.
+ * @x1: Right coordinate of destination rectangle.
+ * @y1: Bottom coordinate of destination rectangle.
+ * @dst_rowstride: Rowstride of @dst buffer.
+ * @src: Source image RGB buffer.
+ * @src_width: Width of source image.
+ * @src_height: Height of source image.
+ * @src_rowstride: Rowstride of @src buffer.
+ * @affine: Affine transform.
+ * @level: Filter level.
+ * @alphagamma: #ArtAlphaGamma for gamma-correcting the compositing.
+ * @alpha: Alpha, range 0..256.
+ *
+ * Affine transform the source image stored in @src, compositing over
+ * the area of destination image @dst specified by the rectangle
+ * (@x0, @y0) - (@x1, @y1). As usual in libart, the left and top edges
+ * of this rectangle are included, and the right and bottom edges are
+ * excluded.
+ *
+ * The @alphagamma parameter specifies that the alpha compositing be done
+ * in a gamma-corrected color space. Since the source image is opaque RGB,
+ * this argument only affects the edges. In the current implementation,
+ * it is ignored.
+ *
+ * The @level parameter specifies the speed/quality tradeoff of the
+ * image interpolation. Currently, only ART_FILTER_NEAREST is
+ * implemented.
+ *
+ * KSVG additions : we have changed this function to support an alpha level as well.
+* also we made sure compositing an rgba image over an rgb buffer works.
+**/
+void ksvg_art_rgb_affine_clip(const ArtSVP *svp, art_u8 *dst, int x0, int y0, int x1, int y1, int dst_rowstride, int dst_channels,
+ const art_u8 *src,
+ int src_width, int src_height, int src_rowstride,
+ const double affine[6],
+ int alpha, const art_u8 *mask)
+{
+ ksvgArtRgbAffineClipAlphaData data;
+ int i;
+ int a, da;
+
+ data.alpha = alpha;
+
+ a = 0x8000;
+ da = (alpha * 66051 + 0x80) >> 8; /* 66051 equals 2 ^ 32 / (255 * 255) */
+
+ for(i = 0; i < 256; i++)
+ {
+ data.alphatab[i] = a >> 16;
+ a += da;
+ }
+
+ data.dst = dst;
+ data.dst_rowstride = dst_rowstride;
+ data.x0 = x0;
+ data.x1 = x1;
+ data.y0 = y0;
+ data.mask = mask;
+
+ art_affine_invert(data.inv, affine);
+
+ data.src = src;
+ data.src_width = src_width;
+ data.src_height = src_height;
+ data.src_rowstride = src_rowstride;
+
+ if(dst_channels == 3)
+ {
+ if(mask)
+ art_svp_render_aa(svp, x0, y0, x1, y1, ksvg_art_rgb_affine_clip_mask_callback, &data);
+ else
+ art_svp_render_aa(svp, x0, y0, x1, y1, ksvg_art_rgb_affine_clip_callback, &data);
+ }
+ else
+ {
+ if(mask)
+ art_svp_render_aa(svp, x0, y0, x1, y1, ksvg_art_rgba_affine_clip_mask_callback, &data);
+ else
+ art_svp_render_aa(svp, x0, y0, x1, y1, ksvg_art_rgba_affine_clip_callback, &data);
+ }
+}
+
+
+static
+void ksvg_art_rgb_texture_run(art_u8 *dst_p, int x0, int x1, int y, const double inv[6],
+ int alpha, const art_u8 *src, int src_rowstride, int src_width, int src_height)
+{
+ const art_u8 *src_p;
+ ArtPoint pt, src_pt;
+ int src_x, src_y;
+ int x;
+ int srcAlpha;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ /* TODO: optimise and filter? */
+ pt.y = y + 0.5;
+
+ for(x = x0; x < x1; x++)
+ {
+ int s;
+ int d;
+ int tmp;
+ int tmp2;
+
+ pt.x = x + 0.5;
+
+ art_affine_point(&src_pt, &pt, inv);
+
+ src_x = (int)floor(src_pt.x);
+ src_y = (int)floor(src_pt.y);
+
+ if(src_x < 0)
+ {
+ /* Can't assume % behaviour with negative values */
+ src_x += ((src_x / -src_width) + 1) * src_width;
+ }
+
+ if(src_y < 0)
+ {
+ src_y += ((src_y / -src_height) + 1) * src_height;
+ }
+
+ src_x %= src_width;
+ src_y %= src_height;
+
+ src_p = src + (src_y * src_rowstride) + src_x * 4;
+
+ /* Pattern source is in RGBA format, premultiplied.
+ * alpha represents fill/stroke/group opacity.
+ *
+ * Multiply source alpha by 'alpha' then composite over.
+ * For each channel, d = d + alpha * (s - srcAlpha * d).
+ */
+
+ srcAlpha = src_p[3];
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = alpha * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = alpha * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = alpha * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+ }
+}
+
+static void
+ksvg_art_rgb_texture_callback (void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ksvgArtRgbAffineClipAlphaData *data = (ksvgArtRgbAffineClipAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ int *alphatab;
+ int alpha;
+
+ linebuf = data->dst;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ alphatab = data->alphatab;
+
+ if(n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if(run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_texture_run(linebuf, x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ for(k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if(run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_texture_run(linebuf + (run_x0 - x0) * 3, run_x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ running_sum += steps[k].delta;
+ if(x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_texture_run(linebuf + (run_x1 - x0) * 3, run_x1, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_texture_run(linebuf, x0, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ data->dst += data->dst_rowstride;
+}
+
+static
+void ksvg_art_rgb_texture_mask_run(art_u8 *dst_p, const art_u8 *mask, int x0, int x1, int y, const double inv[6],
+ int alpha, const art_u8 *src, int src_rowstride, int src_width, int src_height)
+{
+ const art_u8 *src_p;
+ ArtPoint pt, src_pt;
+ int src_x, src_y;
+ int x;
+ int srcAlpha;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ /* TODO: optimise and filter? */
+ pt.y = y + 0.5;
+
+ for(x = x0; x < x1; x++)
+ {
+ int s;
+ int d;
+ int am;
+ int tmp;
+ int tmp2;
+
+ pt.x = x + 0.5;
+
+ art_affine_point(&src_pt, &pt, inv);
+
+ src_x = (int)floor(src_pt.x);
+ src_y = (int)floor(src_pt.y);
+
+ if(src_x < 0)
+ {
+ /* Can't assume % behaviour with negative values */
+ src_x += ((src_x / -src_width) + 1) * src_width;
+ }
+
+ if(src_y < 0)
+ {
+ src_y += ((src_y / -src_height) + 1) * src_height;
+ }
+
+ src_x %= src_width;
+ src_y %= src_height;
+
+ src_p = src + (src_y * src_rowstride) + src_x * 4;
+
+ /* Pattern source is in RGBA format, premultiplied.
+ * alpha represents fill/stroke/group opacity.
+ *
+ * Multiply source alpha by 'alpha' and mask value then composite over.
+ * For each channel, d = d + alpha * mask * (s - srcAlpha * d).
+ */
+
+ am = (alpha * *mask++) + 0x80;
+ am = (am + (am >> 8)) >> 8;
+
+ srcAlpha = src_p[3];
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = am * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = am * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = am * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+ }
+}
+
+static void
+ksvg_art_rgb_texture_mask_callback (void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ksvgArtRgbAffineClipAlphaData *data = (ksvgArtRgbAffineClipAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ int *alphatab;
+ int alpha;
+ const art_u8 *maskbuf;
+
+ linebuf = data->dst;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ alphatab = data->alphatab;
+
+ maskbuf = data->mask + (y - data->y0) * (x1 - x0);
+
+ if(n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if(run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_texture_mask_run(linebuf, maskbuf, x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ for(k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if(run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_texture_mask_run(linebuf + (run_x0 - x0) * 3, maskbuf + (run_x0 - x0), run_x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ running_sum += steps[k].delta;
+ if(x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_texture_mask_run(linebuf + (run_x1 - x0) * 3, maskbuf + (run_x1 - x0), run_x1, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgb_texture_mask_run(linebuf, maskbuf, x0, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ data->dst += data->dst_rowstride;
+}
+
+static
+void ksvg_art_rgba_texture_run(art_u8 *dst_p, int x0, int x1, int y, const double inv[6],
+ int alpha, const art_u8 *src, int src_rowstride, int src_width, int src_height)
+{
+ const art_u8 *src_p;
+ ArtPoint pt, src_pt;
+ int src_x, src_y;
+ int x;
+ int srcAlpha;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ /* TODO: optimise and filter? */
+ pt.y = y + 0.5;
+
+ for(x = x0; x < x1; x++)
+ {
+ int s;
+ int d;
+ int tmp;
+ int tmp2;
+
+ pt.x = x + 0.5;
+
+ art_affine_point(&src_pt, &pt, inv);
+
+ src_x = (int)floor(src_pt.x);
+ src_y = (int)floor(src_pt.y);
+
+ if(src_x < 0)
+ {
+ /* Can't assume % behaviour with negative values */
+ src_x += ((src_x / -src_width) + 1) * src_width;
+ }
+
+ if(src_y < 0)
+ {
+ src_y += ((src_y / -src_height) + 1) * src_height;
+ }
+
+ src_x %= src_width;
+ src_y %= src_height;
+
+ src_p = src + (src_y * src_rowstride) + src_x * 4;
+
+ /* Pattern source is in RGBA format, premultiplied.
+ * alpha represents fill/stroke/group opacity.
+ *
+ * Multiply source alpha by 'alpha' then composite over.
+ * For each colour channel, d = d + alpha * (s - srcAlpha * d).
+ */
+
+ srcAlpha = src_p[3];
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = alpha * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = alpha * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = alpha * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+
+ /* dstAlpha = dstAlpha + srcAlpha * alpha * (1 - dstAlpha) */
+ d = *dst_p;
+
+ tmp = srcAlpha * alpha + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = tmp * (255 - d) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+ src_p++;
+ }
+}
+
+static void
+ksvg_art_rgba_texture_callback (void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ksvgArtRgbAffineClipAlphaData *data = (ksvgArtRgbAffineClipAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ int *alphatab;
+ int alpha;
+
+ linebuf = data->dst;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ alphatab = data->alphatab;
+
+ if(n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if(run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_texture_run(linebuf, x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ for(k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if(run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_texture_run(linebuf + (run_x0 - x0) * 4, run_x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ running_sum += steps[k].delta;
+ if(x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_texture_run(linebuf + (run_x1 - x0) * 4, run_x1, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_texture_run(linebuf, x0, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ data->dst += data->dst_rowstride;
+}
+
+static
+void ksvg_art_rgba_texture_mask_run(art_u8 *dst_p, const art_u8 *mask, int x0, int x1, int y, const double inv[6],
+ int alpha, const art_u8 *src, int src_rowstride, int src_width, int src_height)
+{
+ const art_u8 *src_p;
+ ArtPoint pt, src_pt;
+ int src_x, src_y;
+ int x;
+ int srcAlpha;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ /* TODO: optimise and filter? */
+ pt.y = y + 0.5;
+
+ for(x = x0; x < x1; x++)
+ {
+ int s;
+ int d;
+ int am;
+ int tmp;
+ int tmp2;
+
+ pt.x = x + 0.5;
+
+ art_affine_point(&src_pt, &pt, inv);
+
+ src_x = (int)floor(src_pt.x);
+ src_y = (int)floor(src_pt.y);
+
+ if(src_x < 0)
+ {
+ /* Can't assume % behaviour with negative values */
+ src_x += ((src_x / -src_width) + 1) * src_width;
+ }
+
+ if(src_y < 0)
+ {
+ src_y += ((src_y / -src_height) + 1) * src_height;
+ }
+
+ src_x %= src_width;
+ src_y %= src_height;
+
+ src_p = src + (src_y * src_rowstride) + src_x * 4;
+
+ /* Pattern source is in RGBA format, premultiplied.
+ * alpha represents fill/stroke/group opacity.
+ *
+ * Multiply source alpha by 'alpha' and mask value then composite over.
+ * For each channel, d = d + alpha * mask * (s - srcAlpha * d).
+ */
+
+ am = (alpha * *mask++) + 0x80;
+ am = (am + (am >> 8)) >> 8;
+
+ srcAlpha = src_p[3];
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = am * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = am * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+
+ d = *dst_p;
+ s = *src_p++;
+
+ tmp = srcAlpha * d + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = am * (s - tmp) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+
+ /* dstAlpha = dstAlpha + srcAlpha * alpha * mask * (1 - dstAlpha) */
+ d = *dst_p;
+
+ tmp = srcAlpha * am + 0x80;
+ tmp = (tmp + (tmp >> 8)) >> 8;
+
+ tmp2 = tmp * (255 - d) + 0x80;
+ tmp2 = (tmp2 + (tmp2 >> 8)) >> 8;
+
+ *dst_p++ = d + tmp2;
+ src_p++;
+ }
+}
+
+static void
+ksvg_art_rgba_texture_mask_callback (void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ksvgArtRgbAffineClipAlphaData *data = (ksvgArtRgbAffineClipAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ int *alphatab;
+ int alpha;
+ const art_u8 *maskbuf;
+
+ linebuf = data->dst;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ alphatab = data->alphatab;
+
+ maskbuf = data->mask + (y - data->y0) * (x1 - x0);
+
+ if(n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if(run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_texture_mask_run(linebuf, maskbuf, x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ for(k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if(run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_texture_mask_run(linebuf + (run_x0 - x0) * 4, maskbuf + (run_x0 - x0), run_x0, run_x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ running_sum += steps[k].delta;
+ if(x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_texture_mask_run(linebuf + (run_x1 - x0) * 4, maskbuf + (run_x1 - x0), run_x1, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ ksvg_art_rgba_texture_mask_run(linebuf, maskbuf, x0, x1, y, data->inv, alphatab[alpha], data->src, data->src_rowstride, data->src_width, data->src_height);
+ }
+
+ data->dst += data->dst_rowstride;
+}
+
+/**
+ * ksvg_art_rgb_texture: Affine transform source RGB image and composite, with clipping path.
+ * @svp: Clipping path.
+ * @dst: Destination image RGB buffer.
+ * @x0: Left coordinate of destination rectangle.
+ * @y0: Top coordinate of destination rectangle.
+ * @x1: Right coordinate of destination rectangle.
+ * @y1: Bottom coordinate of destination rectangle.
+ * @dst_rowstride: Rowstride of @dst buffer.
+ * @src: Source image RGB buffer.
+ * @src_width: Width of source image.
+ * @src_height: Height of source image.
+ * @src_rowstride: Rowstride of @src buffer.
+ * @affine: Affine transform.
+ * @level: Filter level.
+ * @alphagamma: #ArtAlphaGamma for gamma-correcting the compositing.
+ * @alpha: Alpha, range 0..256.
+ *
+ * Affine transform the source image stored in @src, compositing over
+ * the area of destination image @dst specified by the rectangle
+ * (@x0, @y0) - (@x1, @y1). As usual in libart, the left and top edges
+ * of this rectangle are included, and the right and bottom edges are
+ * excluded.
+ *
+ * The @alphagamma parameter specifies that the alpha compositing be done
+ * in a gamma-corrected color space. Since the source image is opaque RGB,
+ * this argument only affects the edges. In the current implementation,
+ * it is ignored.
+ *
+ * The @level parameter specifies the speed/quality tradeoff of the
+ * image interpolation. Currently, only ART_FILTER_NEAREST is
+ * implemented.
+ *
+ * KSVG additions : we have changed this function to support an alpha level as well.
+* also we made sure compositing an rgba image over an rgb buffer works.
+**/
+void ksvg_art_rgb_texture(const ArtSVP *svp, art_u8 *dst, int x0, int y0, int x1, int y1, int dst_rowstride,
+ int dst_channels,
+ const art_u8 *src,
+ int src_width, int src_height, int src_rowstride,
+ const double affine[6],
+ ArtFilterLevel level,
+ ArtAlphaGamma *alphaGamma,
+ int alpha,
+ const art_u8 *mask)
+{
+ ksvgArtRgbAffineClipAlphaData data;
+ int i;
+ int a, da;
+
+ data.alpha = alpha;
+
+ a = 0x8000;
+ da = (alpha * 66051 + 0x80) >> 8; /* 66051 equals 2 ^ 32 / (255 * 255) */
+
+ for(i = 0; i < 256; i++)
+ {
+ data.alphatab[i] = a >> 16;
+ a += da;
+ }
+
+ data.dst = dst;
+ data.dst_rowstride = dst_rowstride;
+ data.x0 = x0;
+ data.x1 = x1;
+
+ data.inv[0] = affine[0];
+ data.inv[1] = affine[1];
+ data.inv[2] = affine[2];
+ data.inv[3] = affine[3];
+ data.inv[4] = affine[4];
+ data.inv[5] = affine[5];
+
+ data.src = src;
+ data.src_width = src_width;
+ data.src_height = src_height;
+ data.src_rowstride = src_rowstride;
+
+ data.mask = mask;
+ data.y0 = y0;
+
+ if(mask)
+ {
+ if(dst_channels == 3)
+ art_svp_render_aa(svp, x0, y0, x1, y1, ksvg_art_rgb_texture_mask_callback, &data);
+ else
+ art_svp_render_aa(svp, x0, y0, x1, y1, ksvg_art_rgba_texture_mask_callback, &data);
+ }
+ else
+ {
+ if(dst_channels == 3)
+ art_svp_render_aa(svp, x0, y0, x1, y1, ksvg_art_rgb_texture_callback, &data);
+ else
+ art_svp_render_aa(svp, x0, y0, x1, y1, ksvg_art_rgba_texture_callback, &data);
+ }
+}
+
+/**
+ * ksvg_art_svp_move: moves an svp relatively to the current position.
+ * @svp: SVP to move.
+ * @dx: relative amount to move horizontally.
+ * @dy: relative amount to move vertically.
+ *
+ * Note : this function always moves the svp, not taking into account render buffer
+ * boundaries.
+ **/
+void ksvg_art_svp_move(ArtSVP *svp, int dx, int dy)
+{
+ int i, j;
+ ArtSVPSeg *seg;
+
+ if(dx == 0 && dy == 0) return;
+ for(i = 0;i < svp->n_segs;i++)
+ {
+ seg = &svp->segs[i];
+ for(j = 0;j < seg->n_points;j++)
+ {
+ seg->points[j].x += dx;
+ seg->points[j].y += dy;
+ }
+ seg->bbox.x0 += dx;
+ seg->bbox.y0 += dy;
+ seg->bbox.x1 += dx;
+ seg->bbox.y1 += dy;
+ }
+}
+
diff --git a/ksvg/impl/libs/art_support/art_misc.h b/ksvg/impl/libs/art_support/art_misc.h
new file mode 100644
index 00000000..52f09a63
--- /dev/null
+++ b/ksvg/impl/libs/art_support/art_misc.h
@@ -0,0 +1,79 @@
+/* Libart_LGPL - library of basic graphic primitives
+ * Copyright (C) 1998 Raph Levien
+ *
+ * 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; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __KSVG_ART_H__
+#define __KSVG_ART_H__
+
+#include <libart_lgpl/art_misc.h>
+#include <libart_lgpl/art_bpath.h>
+#include <libart_lgpl/art_vpath.h>
+#include <libart_lgpl/art_alphagamma.h>
+#include <libart_lgpl/art_filterlevel.h>
+#include <libart_lgpl/art_svp.h>
+
+#define ART_END2 10
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ void ksvg_art_vpath_render_bez (ArtVpath **p_vpath, int *pn, int *pn_max,
+ double x0, double y0,
+ double x1, double y1,
+ double x2, double y2,
+ double x3, double y3,
+ double flatness);
+
+ ArtVpath *ksvg_art_bez_path_to_vec(const ArtBpath *bez, double flatness);
+
+ void ksvg_art_rgb_affine_run (int *p_x0, int *p_x1, int y,
+ int src_width, int src_height,
+ const double affine[6]);
+
+ void ksvg_art_rgb_affine (art_u8 *dst, int x0, int y0, int x1, int y1, int dst_rowstride,
+ const art_u8 *src,
+ int src_width, int src_height, int src_rowstride,
+ const double affine[6],
+ ArtFilterLevel level,
+ ArtAlphaGamma *alphagamma,
+ int alpha);
+
+ void ksvg_art_rgb_affine_clip(const ArtSVP *svp, art_u8 *dst, int x0, int y0, int x1, int y1, int dst_rowstride, int dst_channels,
+ const art_u8 *src,
+ int src_width, int src_height, int src_rowstride,
+ const double affine[6],
+ int alpha, const art_u8 *mask);
+
+ void ksvg_art_rgb_texture(const ArtSVP *svp, art_u8 *dst, int x0, int y0, int x1, int y1, int dst_rowstride,
+ int dst_channels,
+ const art_u8 *src,
+ int src_width, int src_height, int src_rowstride,
+ const double affine[6],
+ ArtFilterLevel level,
+ ArtAlphaGamma *alphaGamma,
+ int alpha,
+ const art_u8 *mask);
+
+ void ksvg_art_svp_move(ArtSVP *svp, int dx, int dy);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ksvg/impl/libs/art_support/art_render_misc.c b/ksvg/impl/libs/art_support/art_render_misc.c
new file mode 100644
index 00000000..1603da1e
--- /dev/null
+++ b/ksvg/impl/libs/art_support/art_render_misc.c
@@ -0,0 +1,774 @@
+/* This file is part of the KDE project.
+ * art_render_misc.c: Here I store some routines I feel should be in libart :)
+ *
+ * Copyright (C) 2001-2003 KSVG Team
+ *
+ * This code is adapted from :
+ *
+ * art_render_gradient.c: Gradient image source for modular rendering.
+ *
+ * Libart_LGPL - library of basic graphic primitives
+ * Copyright (C) 2000 Raph Levien
+ *
+ * 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; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * Authors: Raph Levien <raph@acm.org>
+ * Alexander Larsson <alla@lysator.liu.se>
+ */
+
+#include "config.h"
+#include "art_render_misc.h"
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+/* These are in KSVGHelper.cpp */
+int linearRGBFromsRGB(int sRGB8bit);
+int sRGBFromLinearRGB(int linearRGB8bit);
+
+typedef struct _ArtImageSourceGradRad ArtImageSourceGradRad;
+
+struct _ArtImageSourceGradRad {
+ ArtImageSource super;
+ const ArtKSVGGradientRadial *gradient;
+ double a;
+};
+
+#define EPSILON 1e-6
+
+/**
+ * art_ksvg_render_gradient_setpix: Set a gradient pixel.
+ * @render: The render object.
+ * @dst: Pointer to destination (where to store pixel).
+ * @n_stops: Number of stops in @stops.
+ * @stops: The stops for the gradient.
+ * @offset: The offset.
+ *
+ * @n_stops must be > 0.
+ *
+ * Sets a gradient pixel, storing it at @dst.
+ **/
+static void
+art_ksvg_render_gradient_setpix (ArtRender *render,
+ art_u8 *dst,
+ int n_stops, ArtGradientStop *stops,
+ double offset, ArtKSVGGradientInterpolation interpolation)
+{
+ int ix;
+ int j;
+ double off0, off1;
+ int n_ch = render->n_chan + 1;
+
+ for (ix = 0; ix < n_stops; ix++)
+ if (stops[ix].offset > offset)
+ break;
+ /* stops[ix - 1].offset < offset < stops[ix].offset */
+ if (ix > 0 && ix < n_stops)
+ {
+ off0 = stops[ix - 1].offset;
+ off1 = stops[ix].offset;
+ if (fabs (off1 - off0) > EPSILON)
+ {
+ double interp;
+
+ interp = (offset - off0) / (off1 - off0);
+ if(interpolation == ART_KSVG_LINEARRGB_INTERPOLATION)
+ {
+ for (j = 0; j < n_ch; j++)
+ {
+ int z0, z1;
+ int z;
+ int z0_8bit, z0_linearRGB_8bit;
+ int z1_8bit, z1_linearRGB_8bit;
+ int z_8bit, z_sRGB_8bit;
+
+ /* Note: Using explicit variables for intermediate steps since */
+ /* the ART_PIX macros reference the argument more than once. */
+ z0 = stops[ix - 1].color[j];
+ z0_8bit = ART_PIX_8_FROM_MAX(z0);
+ z0_linearRGB_8bit = linearRGBFromsRGB(z0_8bit);
+ z0 = ART_PIX_MAX_FROM_8(z0_linearRGB_8bit);
+
+ z1 = stops[ix].color[j];
+ z1_8bit = ART_PIX_8_FROM_MAX(z1);
+ z1_linearRGB_8bit = linearRGBFromsRGB(z1_8bit);
+ z1 = ART_PIX_MAX_FROM_8(z1_linearRGB_8bit);
+
+ z = floor (z0 + (z1 - z0) * interp + 0.5);
+ z_8bit = ART_PIX_8_FROM_MAX(z);
+ z_sRGB_8bit = sRGBFromLinearRGB(z_8bit);
+
+ if (render->buf_depth == 8)
+ dst[j] = z_sRGB_8bit;
+ else /* (render->buf_depth == 16) */
+ ((art_u16 *)dst)[j] = ART_PIX_MAX_FROM_8(z_sRGB_8bit);
+ }
+ }
+ else
+ {
+ /* sRGB interpolation */
+ for (j = 0; j < n_ch; j++)
+ {
+ int z0, z1;
+ int z;
+ z0 = stops[ix - 1].color[j];
+ z1 = stops[ix].color[j];
+ z = floor (z0 + (z1 - z0) * interp + 0.5);
+ if (render->buf_depth == 8)
+ dst[j] = ART_PIX_8_FROM_MAX (z);
+ else /* (render->buf_depth == 16) */
+ ((art_u16 *)dst)[j] = z;
+ }
+ }
+ return;
+ }
+ }
+ else if (ix == n_stops)
+ ix--;
+
+ for (j = 0; j < n_ch; j++)
+ {
+ int z;
+ z = stops[ix].color[j];
+ if (render->buf_depth == 8)
+ dst[j] = ART_PIX_8_FROM_MAX (z);
+ else /* (render->buf_depth == 16) */
+ ((art_u16 *)dst)[j] = z;
+ }
+}
+
+static void
+art_ksvg_render_gradient_radial_done (ArtRenderCallback *self, ArtRender *render)
+{
+ art_free (self);
+}
+
+static void
+art_ksvg_render_gradient_radial_render (ArtRenderCallback *self, ArtRender *render,
+ art_u8 *dest, int y)
+{
+ ArtImageSourceGradRad *z = (ArtImageSourceGradRad *)self;
+ const ArtKSVGGradientRadial *gradient = z->gradient;
+ int pixstride = (render->n_chan + 1) * (render->depth >> 3);
+ int x;
+ int x0 = render->x0;
+ int width = render->x1 - x0;
+ int n_stops = gradient->n_stops;
+ ArtGradientStop *stops = gradient->stops;
+ art_u8 *bufp = render->image_buf;
+ double fx = gradient->fx;
+ double fy = gradient->fy;
+ double dx, dy;
+ double *affine = gradient->affine;
+ double aff0 = affine[0];
+ double aff1 = affine[1];
+ const double a = z->a;
+ const double arecip = 1.0 / a;
+ double b, db;
+ double c, dc, ddc;
+ double b_a, db_a;
+ double rad, drad, ddrad;
+ ArtGradientSpread spread = gradient->spread;
+
+ dx = x0 * aff0 + y * affine[2] + affine[4] - fx;
+ dy = x0 * aff1 + y * affine[3] + affine[5] - fy;
+ b = dx * fx + dy * fy;
+ db = aff0 * fx + aff1 * fy;
+ c = dx * dx + dy * dy;
+ dc = 2 * aff0 * dx + aff0 * aff0 + 2 * aff1 * dy + aff1 * aff1;
+ ddc = 2 * aff0 * aff0 + 2 * aff1 * aff1;
+
+ b_a = b * arecip;
+ db_a = db * arecip;
+
+ rad = b_a * b_a + c * arecip;
+ drad = 2 * b_a * db_a + db_a * db_a + dc * arecip;
+ ddrad = 2 * db_a * db_a + ddc * arecip;
+
+ for (x = 0; x < width; x++)
+ {
+ double z;
+
+ if (rad > 0)
+ z = b_a + sqrt (rad);
+ else
+ z = b_a;
+
+ if (spread == ART_GRADIENT_REPEAT)
+ z = z - floor (z);
+ else if (spread == ART_GRADIENT_REFLECT)
+ {
+ double tmp;
+
+ tmp = z - 2 * floor (0.5 * z);
+ z = tmp > 1 ? 2 - tmp : tmp;
+ }
+
+ art_ksvg_render_gradient_setpix (render, bufp, n_stops, stops, z, gradient->interpolation);
+ bufp += pixstride;
+ b_a += db_a;
+ rad += drad;
+ drad += ddrad;
+ }
+}
+
+static void
+art_ksvg_render_gradient_radial_negotiate (ArtImageSource *self, ArtRender *render,
+ ArtImageSourceFlags *p_flags,
+ int *p_buf_depth, ArtAlphaType *p_alpha)
+{
+ self->super.render = art_ksvg_render_gradient_radial_render;
+ *p_flags = 0;
+ *p_buf_depth = render->depth;
+ *p_alpha = ART_ALPHA_SEPARATE;
+}
+
+/**
+ * art_ksvg_render_gradient_radial: Add a radial gradient image source.
+ * @render: The render object.
+ * @gradient: The radial gradient.
+ *
+ * Adds the radial gradient @gradient as the image source for rendering
+ * in the render object @render.
+ **/
+void
+art_ksvg_render_gradient_radial (ArtRender *render,
+ const ArtKSVGGradientRadial *gradient,
+ ArtFilterLevel level)
+{
+ ArtImageSourceGradRad *image_source = art_new (ArtImageSourceGradRad, 1);
+ double fx = gradient->fx;
+ double fy = gradient->fy;
+
+ image_source->super.super.render = NULL;
+ image_source->super.super.done = art_ksvg_render_gradient_radial_done;
+ image_source->super.negotiate = art_ksvg_render_gradient_radial_negotiate;
+
+ image_source->gradient = gradient;
+ /* todo: sanitycheck fx, fy? */
+ image_source->a = 1 - fx * fx - fy * fy;
+
+ art_render_add_image_source (render, &image_source->super);
+}
+
+
+/* Hack to find out how to define alloca on different platforms.
+ * Modified version of glib/galloca.h.
+ */
+
+#ifdef __GNUC__
+/* GCC does the right thing */
+ #undef alloca
+ #define alloca(size) __builtin_alloca (size)
+#elif defined (HAVE_ALLOCA_H)
+/* a native and working alloca.h is there */
+ #include <alloca.h>
+#else /* !__GNUC__ && !HAVE_ALLOCA_H */
+ #ifdef _MSC_VER
+ #include <malloc.h>
+ #define alloca _alloca
+ #else /* !_MSC_VER */
+ #ifdef _AIX
+ #pragma alloca
+ #else /* !_AIX */
+ #ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+ #endif /* !alloca */
+ #endif /* !_AIX */
+ #endif /* !_MSC_VER */
+#endif /* !__GNUC__ && !HAVE_ALLOCA_H */
+
+#undef DEBUG_SPEW
+
+typedef struct _ArtImageSourceGradLin ArtImageSourceGradLin;
+
+/* The stops will be copied right after this structure */
+struct _ArtImageSourceGradLin
+{
+ ArtImageSource super;
+ ArtKSVGGradientLinear gradient;
+ ArtGradientStop stops[1];
+};
+
+#ifndef MAX
+ #define MAX(a, b) (((a) > (b)) ? (a) : (b))
+#endif /* MAX */
+
+#ifndef MIN
+ #define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#endif /* MIN */
+
+static void
+art_ksvg_rgba_gradient_run (art_u8 *buf,
+ art_u8 *color1,
+ art_u8 *color2,
+ int len)
+{
+ int i;
+ int r, g, b, a;
+ int dr, dg, db, da;
+
+#ifdef DEBUG_SPEW
+ printf ("gradient run from %3d %3d %3d %3d to %3d %3d %3d %3d in %d pixels\n",
+ color1[0], color1[1], color1[2], color1[3],
+ color2[0], color2[1], color2[2], color2[3],
+ len);
+#endif
+
+ r = (color1[0] << 16) + 0x8000;
+ g = (color1[1] << 16) + 0x8000;
+ b = (color1[2] << 16) + 0x8000;
+ a = (color1[3] << 16) + 0x8000;
+ dr = ((color2[0] - color1[0]) << 16) / len;
+ dg = ((color2[1] - color1[1]) << 16) / len;
+ db = ((color2[2] - color1[2]) << 16) / len;
+ da = ((color2[3] - color1[3]) << 16) / len;
+
+ for(i = 0; i < len; i++)
+ {
+ *buf++ = (r>>16);
+ *buf++ = (g>>16);
+ *buf++ = (b>>16);
+ *buf++ = (a>>16);
+
+ r += dr;
+ g += dg;
+ b += db;
+ a += da;
+ }
+}
+
+static void
+ksvg_calc_color_at (ArtGradientStop *stops,
+ int n_stops,
+ ArtGradientSpread spread,
+ double offset,
+ double offset_fraction,
+ int favor_start,
+ int ix,
+ art_u8 *color)
+{
+ double off0, off1;
+ int j;
+
+ if(spread == ART_GRADIENT_PAD)
+ {
+ if(offset < EPSILON)
+ {
+ color[0] = ART_PIX_8_FROM_MAX (stops[0].color[0]);
+ color[1] = ART_PIX_8_FROM_MAX (stops[0].color[1]);
+ color[2] = ART_PIX_8_FROM_MAX (stops[0].color[2]);
+ color[3] = ART_PIX_8_FROM_MAX (stops[0].color[3]);
+ return;
+ }
+ if(offset >= 1.0 - EPSILON)
+ {
+ color[0] = ART_PIX_8_FROM_MAX (stops[n_stops-1].color[0]);
+ color[1] = ART_PIX_8_FROM_MAX (stops[n_stops-1].color[1]);
+ color[2] = ART_PIX_8_FROM_MAX (stops[n_stops-1].color[2]);
+ color[3] = ART_PIX_8_FROM_MAX (stops[n_stops-1].color[3]);
+ return;
+ }
+ }
+
+ if(ix > 0 && ix < n_stops)
+ {
+ off0 = stops[ix - 1].offset;
+ off1 = stops[ix].offset;
+ if(fabs (off1 - off0) > EPSILON)
+ {
+ double interp;
+ double o;
+ o = offset_fraction;
+
+ if((fabs (o) < EPSILON) && (!favor_start))
+ o = 1.0;
+ else if((fabs (o-1.0) < EPSILON) && (favor_start))
+ o = 0.0;
+
+ /*
+ if (offset_fraction == 0.0 && !favor_start)
+ offset_fraction = 1.0;
+ */
+
+ interp = (o - off0) / (off1 - off0);
+ for(j = 0; j < 4; j++)
+ {
+ int z0, z1;
+ int z;
+ z0 = stops[ix - 1].color[j];
+ z1 = stops[ix].color[j];
+ z = floor (z0 + (z1 - z0) * interp + 0.5);
+ color[j] = ART_PIX_8_FROM_MAX (z);
+ }
+ return;
+ }
+ /* If offsets are too close to safely do the division, just
+ pick the ix color. */
+ color[0] = ART_PIX_8_FROM_MAX (stops[ix].color[0]);
+ color[1] = ART_PIX_8_FROM_MAX (stops[ix].color[1]);
+ color[2] = ART_PIX_8_FROM_MAX (stops[ix].color[2]);
+ color[3] = ART_PIX_8_FROM_MAX (stops[ix].color[3]);
+ return;
+ }
+
+ /*printf ("WARNING! bad ix %d in calc_color_at() [internal error]\n", ix);
+ assert (0);*/
+}
+
+static void
+art_ksvg_render_gradient_linear_render_8 (ArtRenderCallback *self,
+ ArtRender *render,
+ art_u8 *dest, int y)
+{
+ ArtImageSourceGradLin *z = (ArtImageSourceGradLin *)self;
+ const ArtKSVGGradientLinear *gradient = &(z->gradient);
+ int i;
+ int width = render->x1 - render->x0;
+ int len;
+ double offset, d_offset;
+ double offset_fraction;
+ int next_stop;
+ int ix;
+ art_u8 color1[4], color2[4];
+ int n_stops = gradient->n_stops;
+ int extra_stops;
+ ArtGradientStop *stops = gradient->stops;
+ ArtGradientStop *tmp_stops;
+ art_u8 *bufp = render->image_buf;
+ ArtGradientSpread spread = gradient->spread;
+
+#ifdef DEBUG_SPEW
+ printf ("x1: %d, x2: %d, y: %d\n", render->x0, render->x1, y);
+ printf ("spread: %d, stops:", gradient->spread);
+ for(i=0;i<n_stops;i++)
+ {
+ printf ("%f, ", gradient->stops[i].offset);
+ }
+ printf ("\n");
+ printf ("a: %f, b: %f, c: %f\n", gradient->a, gradient->b, gradient->c);
+#endif
+
+ offset = render->x0 * gradient->affine[0] + y * gradient->affine[2] + gradient->affine[4];
+ d_offset = gradient->affine[0];
+
+ /* We need to force the gradient to extend the whole 0..1 segment,
+ because the rest of the code doesn't handle partial gradients
+ correctly */
+ if((gradient->stops[0].offset > EPSILON /* == 0.0 */) ||
+ (gradient->stops[n_stops-1].offset < (1.0 - EPSILON)))
+ {
+ extra_stops = 0;
+ tmp_stops = stops = alloca (sizeof (ArtGradientStop) * (n_stops + 2));
+ if(gradient->stops[0].offset > EPSILON /* 0.0 */)
+ {
+ memcpy (tmp_stops, gradient->stops, sizeof (ArtGradientStop));
+ tmp_stops[0].offset = 0.0;
+ tmp_stops += 1;
+ extra_stops++;
+ }
+ memcpy (tmp_stops, gradient->stops, sizeof (ArtGradientStop) * n_stops);
+ if(gradient->stops[n_stops-1].offset < (1.0 - EPSILON))
+ {
+ tmp_stops += n_stops;
+ memcpy (tmp_stops, &gradient->stops[n_stops-1], sizeof (ArtGradientStop));
+ tmp_stops[0].offset = 1.0;
+ extra_stops++;
+ }
+ n_stops += extra_stops;
+
+
+#ifdef DEBUG_SPEW
+ printf ("start/stop modified stops:");
+ for(i=0;i<n_stops;i++)
+ {
+ printf ("%f, ", stops[i].offset);
+ }
+ printf ("\n");
+#endif
+
+ }
+
+ if(spread == ART_GRADIENT_REFLECT)
+ {
+ tmp_stops = stops;
+ stops = alloca (sizeof (ArtGradientStop) * n_stops * 2);
+ memcpy (stops, tmp_stops, sizeof (ArtGradientStop) * n_stops);
+
+ for(i = 0; i< n_stops; i++)
+ {
+ stops[n_stops * 2 - 1 - i].offset = (1.0 - stops[i].offset / 2.0);
+ memcpy (stops[n_stops * 2 - 1 - i].color, stops[i].color, sizeof (stops[i].color));
+ stops[i].offset = stops[i].offset / 2.0;
+ }
+
+ spread = ART_GRADIENT_REPEAT;
+ offset = offset / 2.0;
+ d_offset = d_offset / 2.0;
+
+ n_stops = 2 * n_stops;
+
+#ifdef DEBUG_SPEW
+ printf ("reflect modified stops:");
+ for(i=0;i<n_stops;i++)
+ {
+ printf ("%f, ", stops[i].offset);
+ }
+ printf ("\n");
+#endif
+ }
+
+ offset_fraction = offset - floor (offset);
+#ifdef DEBUG_SPEW
+ printf ("inital offset: %f, fraction: %f d_offset: %f\n", offset, offset_fraction, d_offset);
+#endif
+ /* ix is selected so that offset_fraction is
+ stops[ix-1] <= offset_fraction <= stops[ix]
+ If offset_fraction is equal to one of the edges, ix
+ is selected so the the section of the line extending
+ in the same direction as d_offset is between ix-1 and ix.
+ */
+ for(ix = 0; ix < n_stops; ix++)
+ if(stops[ix].offset > offset_fraction ||
+ (d_offset < 0.0 && fabs (stops[ix].offset - offset_fraction) < EPSILON))
+ break;
+ if(ix == 0)
+ ix = n_stops - 1;
+ else if(ix == n_stops)
+ ix = n_stops - 1;
+
+#ifdef DEBUG_SPEW
+ printf ("Initial ix: %d\n", ix);
+#endif
+#if 0
+ assert (ix > 0);
+ assert (ix < n_stops);
+ assert ((stops[ix-1].offset <= offset_fraction + EPSILON) ||
+ ((stops[ix].offset > (1.0 - EPSILON)) && (offset_fraction < EPSILON /* == 0.0*/)));
+ /*assert (offset_fraction <= stops[ix].offset);*/
+ /* FIXME: These asserts may be broken, it is for now
+ safer to not use them. Should be fixed!
+ See bug #121850
+ assert ((offset_fraction != stops[ix-1].offset) ||
+ (d_offset >= 0.0));
+ assert ((offset_fraction != stops[ix].offset) ||
+ (d_offset <= 0.0));
+ */
+#endif
+ while(width > 0)
+ {
+#ifdef DEBUG_SPEW
+ printf ("ix: %d\n", ix);
+ printf ("start offset: %f\n", offset);
+#endif
+ ksvg_calc_color_at (stops, n_stops,
+ spread,
+ offset,
+ offset_fraction,
+ (d_offset > -EPSILON),
+ ix,
+ color1);
+
+ if(d_offset > 0)
+ next_stop = ix;
+ else
+ next_stop = ix-1;
+
+#ifdef DEBUG_SPEW
+ printf ("next_stop: %d\n", next_stop);
+#endif
+ if(fabs (d_offset) > EPSILON)
+ {
+ double o;
+ o = offset_fraction;
+
+ if((fabs (o) <= EPSILON) && (ix == n_stops - 1))
+ o = 1.0;
+ else if((fabs (o-1.0) <= EPSILON) && (ix == 1))
+ o = 0.0;
+
+#ifdef DEBUG_SPEW
+ printf ("o: %f\n", o);
+#endif
+ len = (int)floor (fabs ((stops[next_stop].offset - o) / d_offset)) + 1;
+ len = MAX (len, 0);
+ len = MIN (len, width);
+ }
+ else
+ {
+ len = width;
+ }
+#ifdef DEBUG_SPEW
+ printf ("len: %d\n", len);
+#endif
+ if(len > 0)
+ {
+ offset = offset + (len-1) * d_offset;
+ offset_fraction = offset - floor (offset);
+#ifdef DEBUG_SPEW
+ printf ("end offset: %f, fraction: %f\n", offset, offset_fraction);
+#endif
+ ksvg_calc_color_at (stops, n_stops,
+ spread,
+ offset,
+ offset_fraction,
+ (d_offset < EPSILON),
+ ix,
+ color2);
+
+ art_ksvg_rgba_gradient_run (bufp,
+ color1,
+ color2,
+ len);
+ offset += d_offset;
+ offset_fraction = offset - floor (offset);
+ }
+
+ if(d_offset > 0)
+ {
+ do
+ {
+ ix++;
+ if(ix == n_stops)
+ ix = 1;
+ /* Note: offset_fraction can actually be one here on x86 machines that
+ does calculations with extended precision, but later rounds to 64bit.
+ This happens if the 80bit offset_fraction is larger than the
+ largest 64bit double that is less than one.
+ */
+ }
+ while(!((stops[ix-1].offset <= offset_fraction &&
+ offset_fraction < stops[ix].offset) ||
+ (ix == 1 && offset_fraction > (1.0 - EPSILON))));
+ }
+ else
+ {
+ do
+ {
+ ix--;
+ if(ix == 0)
+ ix = n_stops - 1;
+ }
+ while(!((stops[ix-1].offset < offset_fraction &&
+ offset_fraction <= stops[ix].offset) ||
+ (ix == n_stops - 1 && offset_fraction < EPSILON /* == 0.0*/)));
+ }
+
+ bufp += 4*len;
+ width -= len;
+ }
+}
+
+static void
+art_ksvg_render_gradient_linear_done (ArtRenderCallback *self, ArtRender *render)
+{
+ art_free (self);
+}
+
+static void
+art_ksvg_render_gradient_linear_render (ArtRenderCallback *self, ArtRender *render,
+ art_u8 *dest, int y)
+{
+ ArtImageSourceGradLin *z = (ArtImageSourceGradLin *)self;
+ const ArtKSVGGradientLinear *gradient = &(z->gradient);
+ int pixstride = (render->n_chan + 1) * (render->depth >> 3);
+ int x;
+ int width = render->x1 - render->x0;
+ double offset, d_offset;
+ double actual_offset;
+ int n_stops = gradient->n_stops;
+ ArtGradientStop *stops = gradient->stops;
+ art_u8 *bufp = render->image_buf;
+ ArtGradientSpread spread = gradient->spread;
+
+ offset = render->x0 * gradient->affine[0] + y * gradient->affine[2] + gradient->affine[4];
+ d_offset = gradient->affine[0];
+
+ for(x = 0; x < width; x++)
+ {
+ if(spread == ART_GRADIENT_PAD)
+ actual_offset = offset;
+ else if(spread == ART_GRADIENT_REPEAT)
+ actual_offset = offset - floor (offset);
+ else /* (spread == ART_GRADIENT_REFLECT) */
+ {
+ double tmp;
+
+ tmp = offset - 2 * floor (0.5 * offset);
+ actual_offset = tmp > 1 ? 2 - tmp : tmp;
+ }
+ art_ksvg_render_gradient_setpix (render, bufp, n_stops, stops, actual_offset, gradient->interpolation);
+ offset += d_offset;
+ bufp += pixstride;
+ }
+}
+
+static void
+art_ksvg_render_gradient_linear_negotiate (ArtImageSource *self, ArtRender *render,
+ ArtImageSourceFlags *p_flags,
+ int *p_buf_depth, ArtAlphaType *p_alpha)
+{
+ ArtImageSourceGradLin *z = (ArtImageSourceGradLin *)self;
+
+ if(render->depth == 8 &&
+ render->n_chan == 3 &&
+ z->gradient.interpolation == ART_KSVG_SRGB_INTERPOLATION)
+ {
+ /* The optimised renderer doesn't support linearRGB interpolation at the moment */
+ /* so we only use it for sRGB, which is more common anyway. */
+ self->super.render = art_ksvg_render_gradient_linear_render_8;
+ *p_flags = 0;
+ *p_buf_depth = 8;
+ *p_alpha = ART_ALPHA_SEPARATE;
+ return;
+ }
+
+ self->super.render = art_ksvg_render_gradient_linear_render;
+ *p_flags = 0;
+ *p_buf_depth = render->depth;
+ *p_alpha = ART_ALPHA_SEPARATE;
+}
+
+/**
+ * art_render_gradient_linear: Add a linear gradient image source.
+ * @render: The render object.
+ * @gradient: The linear gradient.
+ *
+ * Adds the linear gradient @gradient as the image source for rendering
+ * in the render object @render.
+ **/
+void
+art_ksvg_render_gradient_linear (ArtRender *render,
+ const ArtKSVGGradientLinear *gradient,
+ ArtFilterLevel level)
+{
+ ArtImageSourceGradLin *image_source = art_alloc (sizeof (ArtImageSourceGradLin) +
+ sizeof (ArtGradientStop) * (gradient->n_stops - 1));
+
+ image_source->super.super.render = NULL;
+ image_source->super.super.done = art_ksvg_render_gradient_linear_done;
+ image_source->super.negotiate = art_ksvg_render_gradient_linear_negotiate;
+
+ /* copy the gradient into the structure */
+ image_source->gradient = *gradient;
+ image_source->gradient.stops = image_source->stops;
+ memcpy (image_source->gradient.stops, gradient->stops, sizeof (ArtGradientStop) * gradient->n_stops);
+
+ art_render_add_image_source (render, &image_source->super);
+}
+
diff --git a/ksvg/impl/libs/art_support/art_render_misc.h b/ksvg/impl/libs/art_support/art_render_misc.h
new file mode 100644
index 00000000..d1f3690b
--- /dev/null
+++ b/ksvg/impl/libs/art_support/art_render_misc.h
@@ -0,0 +1,90 @@
+/* This file is part of the KDE project.
+ * art_render_misc.c: Here I store some routines I feel should be in libart :)
+ *
+ * Copyright (C) 2001-2002 KSVG Team
+ *
+ * This code is adapted from :
+ *
+ * art_render_gradient.h: Gradient image source for modular rendering.
+ *
+ * Libart_LGPL - library of basic graphic primitives
+ * Copyright (C) 2000 Raph Levien
+ *
+ * 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; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * Authors: Raph Levien <raph@acm.org>
+ * Alexander Larsson <alla@lysator.liu.se>
+ */
+
+#ifndef __ART_RENDER_MISC_H__
+#define __ART_RENDER_MISC_H__
+
+#ifdef LIBART_COMPILATION
+#include "art_filterlevel.h"
+#include "art_render.h"
+#include "art_render_gradient.h"
+#else
+#include <libart_lgpl/art_filterlevel.h>
+#include <libart_lgpl/art_render.h>
+#include <libart_lgpl/art_render_gradient.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+typedef enum
+{
+ ART_KSVG_SRGB_INTERPOLATION,
+ ART_KSVG_LINEARRGB_INTERPOLATION
+} ArtKSVGGradientInterpolation;
+
+typedef struct _ArtKSVGGradientRadial ArtKSVGGradientRadial;
+
+struct _ArtKSVGGradientRadial {
+ double affine[6]; /* transforms user coordinates to unit circle */
+ double fx, fy; /* focal point in unit circle coords */
+ int n_stops;
+ ArtGradientSpread spread;
+ ArtGradientStop *stops;
+ ArtKSVGGradientInterpolation interpolation;
+};
+
+void
+art_ksvg_render_gradient_radial (ArtRender *render,
+ const ArtKSVGGradientRadial *gradient,
+ ArtFilterLevel level);
+
+typedef struct _ArtKSVGGradientLinear ArtKSVGGradientLinear;
+
+struct _ArtKSVGGradientLinear {
+ double affine[6]; /* transforms screen gradient vector to unit vector (1, 0) */
+ ArtGradientSpread spread;
+ int n_stops;
+ ArtGradientStop *stops;
+ ArtKSVGGradientInterpolation interpolation;
+};
+
+void
+art_ksvg_render_gradient_linear (ArtRender *render,
+ const ArtKSVGGradientLinear *gradient,
+ ArtFilterLevel level);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __ART_RENDER_MISC_H__ */
diff --git a/ksvg/impl/libs/art_support/art_rgba_svp.c b/ksvg/impl/libs/art_support/art_rgba_svp.c
new file mode 100644
index 00000000..47c7d924
--- /dev/null
+++ b/ksvg/impl/libs/art_support/art_rgba_svp.c
@@ -0,0 +1,659 @@
+/* Libart_LGPL - library of basic graphic primitives
+ * Copyright (C) 1998 Raph Levien
+ *
+ * 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; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/* Render a sorted vector path into an RGB buffer. */
+
+#include <X11/Xos.h>
+
+#include "art_rgba_svp.h"
+
+#include <libart_lgpl/art_svp.h>
+#include <libart_lgpl/art_svp_render_aa.h>
+#include <libart_lgpl/art_rgba.h>
+#include <libart_lgpl/art_rgb.h>
+
+/* RGBA renderers */
+
+typedef struct _ArtKSVGRgbaSVPAlphaData ArtKSVGRgbaSVPAlphaData;
+
+struct _ArtKSVGRgbaSVPAlphaData {
+ int alphatab[256];
+ art_u8 r, g, b, alpha;
+ art_u32 rgba;
+ art_u8 *buf;
+ art_u8 *mask;
+ int rowstride;
+ int x0, x1;
+ int y0;
+};
+
+/**
+ * art_rgba_fill_run: fill an RGBA buffer a solid RGB color.
+ * @buf: Buffer to fill.
+ * @r: Red, range 0..255.
+ * @g: Green, range 0..255.
+ * @b: Blue, range 0..255.
+ * @n: Number of RGB triples to fill.
+ *
+ * Fills a buffer with @n copies of the (@r, @g, @b) triple, solid
+ * alpha. Thus, locations @buf (inclusive) through @buf + 4 * @n
+ * (exclusive) are written.
+ **/
+static void
+art_ksvg_rgba_fill_run (art_u8 *buf, art_u8 r, art_u8 g, art_u8 b, int n)
+{
+ int i;
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+ art_u32 src_rgba;
+#else
+ art_u32 src_abgr;
+#endif
+
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+ src_rgba = (r << 24) | (g << 16) | (b << 8) | 255;
+#else
+ src_abgr = (255 << 24) | (b << 16) | (g << 8) | r;
+#endif
+ for(i = 0; i < n; i++)
+ {
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+ ((art_u32 *)buf)[i] = src_rgba;
+#else
+ ((art_u32 *)buf)[i] = src_abgr;
+#endif
+ }
+}
+
+/**
+ * art_rgba_run_alpha: Render semitransparent color over RGBA buffer.
+ * @buf: Buffer for rendering.
+ * @r: Red, range 0..255.
+ * @g: Green, range 0..255.
+ * @b: Blue, range 0..255.
+ * @alpha: Alpha, range 0..255.
+ * @n: Number of RGB triples to render.
+ *
+ * Renders a sequential run of solid (@r, @g, @b) color over @buf with
+ * opacity @alpha. Note that the range of @alpha is 0..255, in contrast
+ * to art_rgb_run_alpha, which has a range of 0..256.
+ **/
+static void
+art_ksvg_rgba_run_alpha (art_u8 *buf, art_u8 r, art_u8 g, art_u8 b, int alpha, int n)
+{
+ int i;
+ int v;
+ int tmp;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ for(i = 0; i < n; i++)
+ {
+ v = *buf;
+ tmp = (r - v) * alpha + 0x80;
+ *buf++ = v + ((tmp + (tmp >> 8)) >> 8);
+
+ v = *buf;
+ tmp = (g - v) * alpha + 0x80;
+ *buf++ = v + ((tmp + (tmp >> 8)) >> 8);
+
+ v = *buf;
+ tmp = (b - v) * alpha + 0x80;
+ *buf++ = v + ((tmp + (tmp >> 8)) >> 8);
+
+ v = *buf;
+ tmp = (255 - alpha) * v + 0x80;
+ *buf++ = alpha + ((tmp + (tmp >> 8)) >> 8);
+ }
+}
+
+static void
+art_ksvg_rgba_mask_run_alpha (art_u8 *buf, art_u8 *mask, art_u8 r, art_u8 g, art_u8 b, int alpha, int n)
+{
+ int i;
+ int v;
+ int am;
+ int tmp;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ for(i = 0; i < n; i++)
+ {
+ am = (alpha * *mask++) + 0x80;
+ am = (am + (am >> 8)) >> 8;
+
+ v = *buf;
+ tmp = (r - v) * am + 0x80;
+ *buf++ = v + ((tmp + (tmp >> 8)) >> 8);
+
+ v = *buf;
+ tmp = (g - v) * am + 0x80;
+ *buf++ = v + ((tmp + (tmp >> 8)) >> 8);
+
+ v = *buf;
+ tmp = (b - v) * am + 0x80;
+ *buf++ = v + ((tmp + (tmp >> 8)) >> 8);
+
+ v = *buf;
+ tmp = (255 - am) * v + 0x80;
+ *buf++ = am + ((tmp + (tmp >> 8)) >> 8);
+ }
+}
+
+static void
+art_ksvg_rgba_svp_alpha_callback(void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ArtKSVGRgbaSVPAlphaData *data = (ArtKSVGRgbaSVPAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ art_u8 r, g, b;
+ int *alphatab;
+ int alpha;
+
+ linebuf = data->buf;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ r = data->r;
+ g = data->g;
+ b = data->b;
+ alphatab = data->alphatab;
+
+ if (n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if (run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if (alpha)
+ art_ksvg_rgba_run_alpha (linebuf,
+ r, g, b, alphatab[alpha],
+ run_x1 - x0);
+ }
+
+ for (k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if (run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if (alpha)
+ art_ksvg_rgba_run_alpha (linebuf + (run_x0 - x0) * 4,
+ r, g, b, alphatab[alpha],
+ run_x1 - run_x0);
+ }
+ }
+ running_sum += steps[k].delta;
+ if (x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if (alpha)
+ art_ksvg_rgba_run_alpha (linebuf + (run_x1 - x0) * 4,
+ r, g, b, alphatab[alpha],
+ x1 - run_x1);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if (alpha)
+ art_ksvg_rgba_run_alpha (linebuf,
+ r, g, b, alphatab[alpha],
+ x1 - x0);
+ }
+
+ data->buf += data->rowstride;
+}
+
+static void
+art_ksvg_rgba_svp_alpha_opaque_callback(void *callback_data, int y,
+ int start,
+ ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ArtKSVGRgbaSVPAlphaData *data = (ArtKSVGRgbaSVPAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ art_u8 r, g, b;
+ art_u32 rgba;
+ int *alphatab;
+ int alpha;
+
+ linebuf = data->buf;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ r = data->r;
+ g = data->g;
+ b = data->b;
+ rgba = data->rgba;
+ alphatab = data->alphatab;
+
+ if (n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if (run_x1 > x0)
+ {
+ alpha = running_sum >> 16;
+ if (alpha)
+ {
+ if (alpha >= 255)
+ art_ksvg_rgba_fill_run (linebuf,
+ r, g, b,
+ run_x1 - x0);
+ else
+ art_ksvg_rgba_run_alpha (linebuf,
+ r, g, b, alphatab[alpha],
+ run_x1 - x0);
+ }
+ }
+
+ for (k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if (run_x1 > run_x0)
+ {
+ alpha = running_sum >> 16;
+ if (alpha)
+ {
+ if (alpha >= 255)
+ art_ksvg_rgba_fill_run (linebuf + (run_x0 - x0) * 4,
+ r, g, b,
+ run_x1 - run_x0);
+ else
+ art_ksvg_rgba_run_alpha (linebuf + (run_x0 - x0) * 4,
+ r, g, b, alphatab[alpha],
+ run_x1 - run_x0);
+ }
+ }
+ }
+ running_sum += steps[k].delta;
+ if (x1 > run_x1)
+ {
+ alpha = running_sum >> 16;
+ if (alpha)
+ {
+ if (alpha >= 255)
+ art_ksvg_rgba_fill_run (linebuf + (run_x1 - x0) * 4,
+ r, g, b,
+ x1 - run_x1);
+ else
+ art_ksvg_rgba_run_alpha (linebuf + (run_x1 - x0) * 4,
+ r, g, b, alphatab[alpha],
+ x1 - run_x1);
+ }
+ }
+ }
+ else
+ {
+ alpha = running_sum >> 16;
+ if (alpha)
+ {
+ if (alpha >= 255)
+ art_ksvg_rgba_fill_run (linebuf,
+ r, g, b,
+ x1 - x0);
+ else
+ art_ksvg_rgba_run_alpha (linebuf,
+ r, g, b, alphatab[alpha],
+ x1 - x0);
+ }
+ }
+ data->buf += data->rowstride;
+}
+
+static void
+art_ksvg_rgba_svp_alpha_mask_callback(void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ArtKSVGRgbaSVPAlphaData *data = (ArtKSVGRgbaSVPAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ art_u8 r, g, b;
+ int *alphatab;
+ int alpha;
+ art_u8 *maskbuf;
+
+ linebuf = data->buf;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ r = data->r;
+ g = data->g;
+ b = data->b;
+ alphatab = data->alphatab;
+
+ maskbuf = data->mask + (y - data->y0) * (data->x1 - data->x0);
+
+ if(n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if(run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ art_ksvg_rgba_mask_run_alpha (linebuf, maskbuf,
+ r, g, b, alphatab[alpha],
+ run_x1 - x0);
+ }
+
+ for(k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if(run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ art_ksvg_rgba_mask_run_alpha (linebuf + (run_x0 - x0) * 4, maskbuf + (run_x0 - x0),
+ r, g, b, alphatab[alpha],
+ run_x1 - run_x0);
+ }
+ }
+ running_sum += steps[k].delta;
+ if(x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ art_ksvg_rgba_mask_run_alpha (linebuf + (run_x1 - x0) * 4, maskbuf + (run_x1 - x0) ,
+ r, g, b, alphatab[alpha],
+ x1 - run_x1);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ art_ksvg_rgba_mask_run_alpha (linebuf, maskbuf,
+ r, g, b, alphatab[alpha],
+ x1 - x0);
+ }
+
+ data->buf += data->rowstride;
+}
+
+/**
+ * art_rgb_svp_alpha: Alpha-composite sorted vector path over RGB buffer.
+ * @svp: The source sorted vector path.
+ * @x0: Left coordinate of destination rectangle.
+ * @y0: Top coordinate of destination rectangle.
+ * @x1: Right coordinate of destination rectangle.
+ * @y1: Bottom coordinate of destination rectangle.
+ * @rgba: Color in 0xRRGGBBAA format.
+ * @buf: Destination RGB buffer.
+ * @rowstride: Rowstride of @buf buffer.
+ * @alphagamma: #ArtAlphaGamma for gamma-correcting the compositing.
+ *
+ * Renders the shape specified with @svp over the @buf RGB buffer.
+ * @x1 - @x0 specifies the width, and @y1 - @y0 specifies the height,
+ * of the rectangle rendered. The new pixels are stored starting at
+ * the first byte of @buf. Thus, the @x0 and @y0 parameters specify
+ * an offset within @svp, and may be tweaked as a way of doing
+ * integer-pixel translations without fiddling with @svp itself.
+ *
+ * The @rgba argument specifies the color for the rendering. Pixels of
+ * entirely 0 winding number are left untouched. Pixels of entirely
+ * 1 winding number have the color @rgba composited over them (ie,
+ * are replaced by the red, green, blue components of @rgba if the alpha
+ * component is 0xff). Pixels of intermediate coverage are interpolated
+ * according to the rule in @alphagamma, or default to linear if
+ * @alphagamma is NULL.
+ **/
+void
+art_ksvg_rgba_svp_alpha(const ArtSVP *svp,
+ int x0, int y0, int x1, int y1,
+ art_u32 rgba,
+ art_u8 *buf, int rowstride,
+ ArtAlphaGamma *alphagamma,
+ art_u8 *mask)
+{
+ ArtKSVGRgbaSVPAlphaData data;
+ int r, g, b;
+ int i;
+ int a, da;
+ int alpha;
+
+ r = (rgba >> 24) & 0xff;
+ g = (rgba >> 16) & 0xff;
+ b = (rgba >> 8) & 0xff;
+ alpha = rgba & 0xff;
+
+ data.r = r;
+ data.g = g;
+ data.b = b;
+ data.alpha = alpha;
+ data.rgba = rgba;
+ data.mask = mask;
+
+ a = 0x8000;
+ da = (alpha * 66051 + 0x80) >> 8; /* 66051 equals 2 ^ 32 / (255 * 255) */
+
+ for (i = 0; i < 256; i++)
+ {
+ data.alphatab[i] = a >> 16;
+ a += da;
+ }
+
+ data.buf = buf;
+ data.rowstride = rowstride;
+ data.x0 = x0;
+ data.x1 = x1;
+ data.y0 = y0;
+
+ if(mask)
+ art_svp_render_aa (svp, x0, y0, x1, y1, art_ksvg_rgba_svp_alpha_mask_callback, &data);
+ else
+ {
+ if (alpha == 255)
+ art_svp_render_aa (svp, x0, y0, x1, y1, art_ksvg_rgba_svp_alpha_opaque_callback, &data);
+ else
+ art_svp_render_aa (svp, x0, y0, x1, y1, art_ksvg_rgba_svp_alpha_callback, &data);
+ }
+}
+
+/* RGB renderers */
+
+static void
+art_ksvg_rgb_mask_run_alpha(art_u8 *buf, art_u8 *mask, art_u8 r, art_u8 g, art_u8 b, int alpha, int n)
+{
+ int i;
+ int v;
+ int am;
+ int tmp;
+
+ if(alpha > 255)
+ alpha = 255;
+
+ for(i = 0; i < n; i++)
+ {
+ am = (alpha * *mask++) + 0x80;
+ am = (am + (am >> 8)) >> 8;
+
+ v = *buf;
+ tmp = (r - v) * am + 0x80;
+ *buf++ = v + ((tmp + (tmp >> 8)) >> 8);
+
+ v = *buf;
+ tmp = (g - v) * am + 0x80;
+ *buf++ = v + ((tmp + (tmp >> 8)) >> 8);
+
+ v = *buf;
+ tmp = (b - v) * am + 0x80;
+ *buf++ = v + ((tmp + (tmp >> 8)) >> 8);
+ }
+}
+
+static void
+art_ksvg_rgb_svp_alpha_mask_callback(void *callback_data, int y,
+ int start, ArtSVPRenderAAStep *steps, int n_steps)
+{
+ ArtKSVGRgbaSVPAlphaData *data = (ArtKSVGRgbaSVPAlphaData *)callback_data;
+ art_u8 *linebuf;
+ int run_x0, run_x1;
+ art_u32 running_sum = start;
+ int x0, x1;
+ int k;
+ art_u8 r, g, b;
+ int *alphatab;
+ int alpha;
+ art_u8 *maskbuf;
+
+ linebuf = data->buf;
+ x0 = data->x0;
+ x1 = data->x1;
+
+ r = data->r;
+ g = data->g;
+ b = data->b;
+ alphatab = data->alphatab;
+
+ maskbuf = data->mask + (y - data->y0) * (data->x1 - data->x0);
+
+ if(n_steps > 0)
+ {
+ run_x1 = steps[0].x;
+ if(run_x1 > x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ art_ksvg_rgb_mask_run_alpha (linebuf, maskbuf,
+ r, g, b, alphatab[alpha],
+ run_x1 - x0);
+ }
+
+ for(k = 0; k < n_steps - 1; k++)
+ {
+ running_sum += steps[k].delta;
+ run_x0 = run_x1;
+ run_x1 = steps[k + 1].x;
+ if(run_x1 > run_x0)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ art_ksvg_rgb_mask_run_alpha (linebuf + (run_x0 - x0) * 3, maskbuf + (run_x0 - x0),
+ r, g, b, alphatab[alpha],
+ run_x1 - run_x0);
+ }
+ }
+ running_sum += steps[k].delta;
+ if(x1 > run_x1)
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ art_ksvg_rgb_mask_run_alpha (linebuf + (run_x1 - x0) * 3, maskbuf + (run_x1 - x0) ,
+ r, g, b, alphatab[alpha],
+ x1 - run_x1);
+ }
+ }
+ else
+ {
+ alpha = (running_sum >> 16) & 0xff;
+ if(alpha)
+ art_ksvg_rgb_mask_run_alpha (linebuf, maskbuf,
+ r, g, b, alphatab[alpha],
+ x1 - x0);
+ }
+
+ data->buf += data->rowstride;
+}
+
+/**
+ * art_rgb_svp_alpha: Alpha-composite sorted vector path over RGB buffer.
+ * @svp: The source sorted vector path.
+ * @x0: Left coordinate of destination rectangle.
+ * @y0: Top coordinate of destination rectangle.
+ * @x1: Right coordinate of destination rectangle.
+ * @y1: Bottom coordinate of destination rectangle.
+ * @rgba: Color in 0xRRGGBBAA format.
+ * @buf: Destination RGB buffer.
+ * @rowstride: Rowstride of @buf buffer.
+ * @alphagamma: #ArtAlphaGamma for gamma-correcting the compositing.
+ *
+ * Renders the shape specified with @svp over the @buf RGB buffer.
+ * @x1 - @x0 specifies the width, and @y1 - @y0 specifies the height,
+ * of the rectangle rendered. The new pixels are stored starting at
+ * the first byte of @buf. Thus, the @x0 and @y0 parameters specify
+ * an offset within @svp, and may be tweaked as a way of doing
+ * integer-pixel translations without fiddling with @svp itself.
+ *
+ * The @rgba argument specifies the color for the rendering. Pixels of
+ * entirely 0 winding number are left untouched. Pixels of entirely
+ * 1 winding number have the color @rgba composited over them (ie,
+ * are replaced by the red, green, blue components of @rgba if the alpha
+ * component is 0xff). Pixels of intermediate coverage are interpolated
+ * according to the rule in @alphagamma, or default to linear if
+ * @alphagamma is NULL.
+ **/
+void
+art_ksvg_rgb_svp_alpha_mask(const ArtSVP *svp,
+ int x0, int y0, int x1, int y1,
+ art_u32 rgba,
+ art_u8 *buf, int rowstride,
+ ArtAlphaGamma *alphagamma,
+ art_u8 *mask)
+{
+ ArtKSVGRgbaSVPAlphaData data;
+ int r, g, b, alpha;
+ int i;
+ int a, da;
+
+ r = rgba >> 24;
+ g = (rgba >> 16) & 0xff;
+ b = (rgba >> 8) & 0xff;
+ alpha = rgba & 0xff;
+
+ data.r = r;
+ data.g = g;
+ data.b = b;
+ data.alpha = alpha;
+ data.mask = mask;
+
+ a = 0x8000;
+ da = (alpha * 66051 + 0x80) >> 8; /* 66051 equals 2 ^ 32 / (255 * 255) */
+
+ for(i = 0; i < 256; i++)
+ {
+ data.alphatab[i] = a >> 16;
+ a += da;
+ }
+
+ data.buf = buf;
+ data.rowstride = rowstride;
+ data.x0 = x0;
+ data.x1 = x1;
+ data.y0 = y0;
+
+ art_svp_render_aa(svp, x0, y0, x1, y1, art_ksvg_rgb_svp_alpha_mask_callback, &data);
+}
+
diff --git a/ksvg/impl/libs/art_support/art_rgba_svp.h b/ksvg/impl/libs/art_support/art_rgba_svp.h
new file mode 100644
index 00000000..b59096d4
--- /dev/null
+++ b/ksvg/impl/libs/art_support/art_rgba_svp.h
@@ -0,0 +1,57 @@
+/* Libart_LGPL - library of basic graphic primitives
+ * Copyright (C) 1998 Raph Levien
+ *
+ * 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; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __ART_RGBA_SVP_H__
+#define __ART_RGBA_SVP_H__
+
+/* Render a sorted vector path into an RGB buffer. */
+
+#ifdef LIBART_COMPILATION
+#include "art_alphagamma.h"
+#include "art_svp.h"
+#else
+#include <libart_lgpl/art_alphagamma.h>
+#include <libart_lgpl/art_svp.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+void
+art_ksvg_rgba_svp_alpha(const ArtSVP *svp,
+ int x0, int y0, int x1, int y1,
+ art_u32 rgba,
+ art_u8 *buf, int rowstride,
+ ArtAlphaGamma *alphagamma,
+ art_u8 *mask);
+
+void
+art_ksvg_rgb_svp_alpha_mask(const ArtSVP *svp,
+ int x0, int y0, int x1, int y1,
+ art_u32 rgba,
+ art_u8 *buf, int rowstride,
+ ArtAlphaGamma *alphagamma,
+ art_u8 *mask);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __ART_RGB_SVP_H__ */
diff --git a/ksvg/impl/libs/libtext2path/AUTHORS b/ksvg/impl/libs/libtext2path/AUTHORS
new file mode 100644
index 00000000..efa499dd
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/AUTHORS
@@ -0,0 +1 @@
+Nikolas Zimmermann <wildfox@kde.org>
diff --git a/ksvg/impl/libs/libtext2path/COPYING b/ksvg/impl/libs/libtext2path/COPYING
new file mode 100644
index 00000000..0b84a43f
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/ksvg/impl/libs/libtext2path/ChangeLog b/ksvg/impl/libs/libtext2path/ChangeLog
new file mode 100644
index 00000000..fad2a19b
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/ChangeLog
@@ -0,0 +1,2 @@
+Fri Jul 25 08:30:43 CEST 2003 - Nikolas Zimmermann <wildfox@kde.org>
+ o Initial Creation
diff --git a/ksvg/impl/libs/libtext2path/INSTALL b/ksvg/impl/libs/libtext2path/INSTALL
new file mode 100644
index 00000000..28fadaa7
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/INSTALL
@@ -0,0 +1,181 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/ksvg/impl/libs/libtext2path/Makefile.am b/ksvg/impl/libs/libtext2path/Makefile.am
new file mode 100644
index 00000000..c7f2f390
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/Makefile.am
@@ -0,0 +1,7 @@
+SUBDIRS = src
+DIST_SUBDIRS = src
+
+#pkgconfigdir = $(libdir)/pkgconfig
+#kgconfig_DATA = libtext2path-0.1.pc
+
+#EXTRA_DIST = autogen.sh
diff --git a/ksvg/impl/libs/libtext2path/NEWS b/ksvg/impl/libs/libtext2path/NEWS
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/NEWS
@@ -0,0 +1 @@
+
diff --git a/ksvg/impl/libs/libtext2path/README b/ksvg/impl/libs/libtext2path/README
new file mode 100644
index 00000000..b9493b88
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/README
@@ -0,0 +1,4 @@
+libtext2path v0.1
+Nikolas Zimmermann <wildfox@kde.org>
+----------------------------------------------------------------------
+TODO: Write documentation! :)
diff --git a/ksvg/impl/libs/libtext2path/VERSION b/ksvg/impl/libs/libtext2path/VERSION
new file mode 100644
index 00000000..6c2cb464
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/VERSION
@@ -0,0 +1 @@
+libtext2path-0.1
diff --git a/ksvg/impl/libs/libtext2path/configure.in.in b/ksvg/impl/libs/libtext2path/configure.in.in
new file mode 100644
index 00000000..2198ab52
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/configure.in.in
@@ -0,0 +1,41 @@
+#AC_INIT(src/Converter.h)
+#AM_CONFIG_HEADER(config.h)
+
+dnl -----------------------------------------------
+dnl Package name and version number (user defined)
+dnl -----------------------------------------------
+GENERIC_LIBRARY_NAME=libtext2path-0.1
+
+# release versioning
+GENERIC_MAJOR_VERSION=0
+GENERIC_MINOR_VERSION=1
+GENERIC_MICRO_VERSION=0
+
+# API version (often = GENERIC_MAJOR_VERSION.GENERIC_MINOR_VERSION)
+GENERIC_API_VERSION=0.1
+AC_SUBST(GENERIC_API_VERSION)
+
+#shared library versioning
+GENERIC_LIBRARY_VERSION=0:1:0
+
+dnl --------------------------------
+dnl Package name and version number
+dnl --------------------------------
+AC_SUBST(GENERIC_LIBRARY_VERSION)
+
+AC_SUBST(GENERIC_LIBRARY_NAME)
+
+GENERIC_VERSION=$GENERIC_MAJOR_VERSION.$GENERIC_MINOR_VERSION.$GENERIC_MICRO_VERSION
+GENERIC_RELEASE=$GENERIC_MAJOR_VERSION.$GENERIC_MINOR_VERSION
+AC_SUBST(GENERIC_RELEASE)
+AC_SUBST(GENERIC_VERSION)
+
+
+dnl -----------------------------------------------
+dnl Checks for programs.
+dnl -----------------------------------------------
+
+dnl Check for fontconfig
+# PKG_CHECK_MODULES(DEPS, fontconfig >= 2.2.0)
+#AC_SUBST(DEPS_CFLAGS)
+#AC_SUBST(DEPS_LIBS)
diff --git a/ksvg/impl/libs/libtext2path/libtext2path.lsm b/ksvg/impl/libs/libtext2path/libtext2path.lsm
new file mode 100644
index 00000000..7407a0ff
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/libtext2path.lsm
@@ -0,0 +1,16 @@
+Begin4
+Title: libtext2path -- Some description
+Version: 0.1
+Entered-date: YYYY-MM-DD
+Description:
+Keywords: KDE3 Qt
+Author: Nikolas Zimmermann <wildfox@kde.org>
+Maintained-by: Nikolas Zimmermann <wildfox@kde.org>
+Home-page:
+Alternate-site:
+Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
+ xxxxxx libtext2path-0.1.tar.gz
+ xxx libtext2path-0.1.lsm
+Platform: Linux. Needs KDE 2.x
+Copying-policy: GPL
+End
diff --git a/ksvg/impl/libs/libtext2path/libtext2path.pc.in b/ksvg/impl/libs/libtext2path/libtext2path.pc.in
new file mode 100644
index 00000000..1d4b4210
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/libtext2path.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libtext2path
+Description: Converts FreeType glyphs to bezier paths
+Version: @VERSION@
+Libs: -L${libdir} -ltext2path
+Cflags: -I${includedir}/@GENERIC_LIBRARY_NAME@ -I${libdir}/@GENERIC_LIBRARY_NAME@/include
+
diff --git a/ksvg/impl/libs/libtext2path/libtext2path.spec b/ksvg/impl/libs/libtext2path/libtext2path.spec
new file mode 100644
index 00000000..e0c217bd
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/libtext2path.spec
@@ -0,0 +1,41 @@
+%define distversion %( perl -e 'Creating /home/nikoz/Projects/libtext2path/libtext2path.spec...=\<\>;/(\d+)\.(\d)\.?(\d)?/; print "".(||0)' /etc/*-release)
+Name: libtext2path
+Summary: libtext2path -- Some description
+Version: 0.1
+Release: %{_vendor}_%{distversion}
+Copyright: GPL
+Group: X11/KDE/Utilities
+Source: ftp://ftp.kde.org/pub/kde/unstable/apps/utils/%{name}-%{version}.tar.gz
+Packager: Nikolas Zimmermann <wildfox@kde.org>
+BuildRoot: /tmp/%{name}-%{version}
+Prefix: /usr/kde/cvs
+
+%description
+A long description
+
+%prep
+rm -rf $RPM_BUILD_ROOT
+%setup -n %{name}-%{version}
+CFLAGS="" CXXFLAGS="" ./configure --disable-debug --enable-final --prefix=%{prefix}
+
+%build
+# Setup for parallel builds
+numprocs=1
+if [ "" = "0" ]; then
+ numprocs=1
+fi
+
+make -j
+
+%install
+make install-strip DESTDIR=$RPM_BUILD_ROOT
+
+cd
+find . -type d | sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' > /%{name}-master.list
+find . -type f -o -type l | sed 's|^\.||' >> $RPM_BUILD_DIR/%{name}-master.list
+
+%clean
+rm -rf $RPM_BUILD_DIR/%{name}-%{version}
+rm -rf $RPM_BUILD_DIR/-master.list
+
+%files -f $RPM_BUILD_DIR/%{name}-master.list
diff --git a/ksvg/impl/libs/libtext2path/src/Affine.cpp b/ksvg/impl/libs/libtext2path/src/Affine.cpp
new file mode 100644
index 00000000..d06b53bc
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Affine.cpp
@@ -0,0 +1,174 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <math.h>
+
+#include "Point.h"
+#include "Affine.h"
+
+using namespace T2P;
+
+Affine::Affine()
+{
+ m_affine[0] = 1.0;
+ m_affine[1] = 0.0;
+ m_affine[2] = 0.0;
+ m_affine[3] = 1.0;
+ m_affine[4] = 0.0;
+ m_affine[5] = 0.0;
+}
+
+Affine::Affine(double affine[6])
+{
+ for(int i = 0; i < 6; i++)
+ m_affine[i] = affine[i];
+}
+
+Affine::Affine(const Affine &other)
+{
+ (*this) = other;
+}
+
+Affine::Affine(double m11, double m12, double m21, double m22, double dx, double dy)
+{
+ m_affine[0] = m11; m_affine[1] = m12; m_affine[2] = m21;
+ m_affine[3] = m22; m_affine[4] = dx; m_affine[5] = dy;
+}
+
+Affine::~Affine()
+{
+}
+
+Affine &Affine::operator*=(Affine &other)
+{
+ double d0 = m11() * other.m11() + m12() * other.m21();
+ double d1 = m11() * other.m12() + m12() * other.m22();
+ double d2 = m21() * other.m11() + m22() * other.m21();
+ double d3 = m21() * other.m12() + m22() * other.m22();
+ double d4 = dx() * other.m11() + dy() * other.m21() + other.dx();
+ double d5 = dx() * other.m12() + dy() * other.m22() + other.dy();
+
+ m_affine[0] = d0; m_affine[1] = d1; m_affine[2] = d2;
+ m_affine[3] = d3; m_affine[4] = d4; m_affine[5] = d5;
+
+ return *this;
+}
+
+Affine &Affine::operator=(const Affine &other)
+{
+ for(int i = 0; i < 6; i++)
+ m_affine[i] = other.m_affine[i];
+
+ return *this;
+}
+
+double &Affine::m11()
+{
+ return m_affine[0];
+}
+
+double &Affine::m12()
+{
+ return m_affine[1];
+}
+
+double &Affine::m21()
+{
+ return m_affine[2];
+}
+
+double &Affine::m22()
+{
+ return m_affine[3];
+}
+
+double &Affine::dx()
+{
+ return m_affine[4];
+}
+
+double &Affine::dy()
+{
+ return m_affine[5];
+}
+
+void Affine::scale(double s)
+{
+ scale(s, s);
+}
+
+void Affine::scale(double sx, double sy)
+{
+ m_affine[0] = sx;
+ m_affine[3] = sy;
+}
+
+void Affine::translate(const Point &point)
+{
+ m_affine[4] += point.x();
+ m_affine[5] += point.y();
+}
+
+void Affine::translate(double tx, double ty)
+{
+ m_affine[4] += tx * m_affine[0] + ty * m_affine[2];
+ m_affine[5] += tx * m_affine[1] + ty * m_affine[3];
+}
+
+void Affine::rotate(double angle)
+{
+ double sina = sin(angle);
+ double cosa = cos(angle);
+
+ double tm11 = cosa * m_affine[0] + sina * m_affine[2];
+ double tm12 = cosa * m_affine[1] + sina * m_affine[3];
+ double tm21 = -sina * m_affine[0] + cosa * m_affine[2];
+ double tm22 = -sina * m_affine[1] + cosa * m_affine[3];
+
+ m_affine[0] = tm11; m_affine[1] = tm12;
+ m_affine[2] = tm21; m_affine[3] = tm22;
+}
+
+void Affine::rotateAround(double angle, const Point &point)
+{
+ translate(point);
+ rotate(angle);
+ translate(point.invert());
+}
+
+void Affine::rotateAround(double angle, double cx, double cy)
+{
+ translate(-cx, -cy);
+ rotate(angle);
+ translate(cx, cy);
+}
+
+Point Affine::mapPoint(const Point &p) const
+{
+ return Point(p.x() * m_affine[0] + p.y() * m_affine[2] + m_affine[4],
+ p.x() * m_affine[1] + p.y() * m_affine[3] + m_affine[5]);
+}
+
+double *Affine::data()
+{
+ return m_affine;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Affine.h b/ksvg/impl/libs/libtext2path/src/Affine.h
new file mode 100644
index 00000000..c0f11e9b
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Affine.h
@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_AFFINE_H
+#define T2P_AFFINE_H
+
+namespace T2P
+{
+ class Point;
+ class Affine
+ {
+ public:
+ Affine();
+ Affine(double affine[6]);
+ Affine(const Affine &other);
+ Affine(double m11, double m12, double m21, double m22, double dx, double dy);
+ ~Affine();
+
+ Affine &operator*=(Affine &other);
+ Affine &operator=(const Affine &other);
+
+ double &m11();
+ double &m12();
+ double &m21();
+ double &m22();
+ double &dx();
+ double &dy();
+
+ void scale(double s);
+ void scale(double sx, double sy);
+ void translate(const Point &point); // Assumes point is already transformed
+ void translate(double tx, double ty);
+
+ void rotate(double angle);
+ void rotateAround(double angle, const Point &point); // Assumes point is already transformed
+ void rotateAround(double angle, double cx, double cy);
+
+ Point mapPoint(const Point &p) const;
+
+ // Internal
+ double *data();
+
+ private:
+ double m_affine[6];
+ };
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/BezierPath.h b/ksvg/impl/libs/libtext2path/src/BezierPath.h
new file mode 100644
index 00000000..1c357abd
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/BezierPath.h
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_BEZIERPATH_H
+#define T2P_BEZIERPATH_H
+
+#include <list>
+
+namespace T2P
+{
+ class Point;
+ class BezierPath
+ {
+ public:
+ BezierPath() { }
+ virtual ~BezierPath() { }
+
+ /**
+ * Calculates the arclength from p0 to the point parametrized by 0 <= t <= 1.
+ */
+ virtual double length(double t = 1.0) = 0;
+
+ /**
+ * Calculates the point, the tangent vector and the normal vector for
+ * 0 <= t <= 1. The tangent vector and the normal vector are
+ * normalized (length=1).
+ */
+ virtual void pointTangentNormalAt(double t, Point *p = 0, Point *tn = 0, Point *n = 0) = 0;
+
+ /**
+ * Calculates the axis-aligned bounding box.
+ */
+ virtual void boundingBox(Point *topLeft, Point *bottomRight) = 0;
+ };
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Cache.h b/ksvg/impl/libs/libtext2path/src/Cache.h
new file mode 100644
index 00000000..a85fdf92
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Cache.h
@@ -0,0 +1,156 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_CACHE_H
+#define T2P_CACHE_H
+
+#include <map>
+#include <string>
+#include <vector>
+#include <iostream>
+
+#include "myboost/shared_ptr.hpp"
+
+namespace T2P
+{
+ class CacheElement
+ {
+ public:
+ CacheElement(std::string key) : m_key(key), m_usage(0) { }
+ ~CacheElement() { }
+
+ std::string key() const { return m_key; }
+ int usage() const { return m_usage; }
+
+ void incUsage() { m_usage++; }
+
+ private:
+ std::string m_key;
+ int m_usage;
+ };
+
+ template<typename T>
+ class Cache
+ {
+ public:
+ typedef myboost::shared_ptr<T> SharedT;
+
+ Cache(int maxSize = 10) : m_size(0), m_maxSize(maxSize) { }
+ ~Cache() { clear(); }
+
+ // Number of elements in cache
+ int size() const { return m_size; }
+
+ // Maximum number of elements in cache
+ int maxSize() const { return m_maxSize; }
+
+ // Add new entry
+ void insert(const std::string &key, SharedT &value)
+ {
+ // TODO: Add real LRU logic, now i will just delete the less
+ // used item when inserting a new item would exceed maxSize
+ if(m_size == m_maxSize)
+ {
+ // Find less used item
+ typename std::map<SharedT, CacheElement *>::const_iterator it = m_cacheMap.begin();
+ int usage = (*it).second->usage(); std::string keyUsage = (*it).second->key();
+ for(it++; it != m_cacheMap.end(); ++it)
+ {
+ int curUsage = (*it).second->usage();
+ if(curUsage < usage)
+ {
+ usage = curUsage;
+ keyUsage = (*it).second->key();
+ }
+ }
+
+// std::cout << "[CACHE] Removing less used element with key: " << keyUsage << " (Used " << usage << " times!)" << std::endl;
+ remove(keyUsage);
+ }
+
+ m_size++;
+ m_entries.push_back(value);
+ m_cacheMap[value] = new CacheElement(key);
+ }
+
+ // Remove single entry
+ void remove(const std::string &key)
+ {
+ for(typename std::vector<SharedT>::iterator it = m_entries.begin(); it != m_entries.end(); ++it)
+ {
+ SharedT cur = *it;
+ if(m_cacheMap[cur]->key() == key)
+ {
+ m_size--;
+
+ typename std::map<SharedT, CacheElement *>::iterator cacheElement = m_cacheMap.find(cur);
+ m_cacheMap.erase(cacheElement);
+ delete cacheElement->second;
+ m_entries.erase(it); // Only valid to write because we don't go on here!
+ break; // Otherwhise the iterators _may_ be invalid!
+ }
+ }
+ }
+
+ // Remove all entries
+ void clear()
+ {
+ m_size = 0;
+ m_entries.clear();
+ m_cacheMap.clear();
+ }
+
+ // Lookup entry
+ SharedT find(const std::string &key)
+ {
+ for(typename std::vector<SharedT>::const_iterator it = m_entries.begin(); it != m_entries.end(); ++it)
+ {
+ SharedT cur = *it;
+ if(m_cacheMap[cur]->key() == key)
+ {
+ m_cacheMap[cur]->incUsage();
+ return cur;
+ }
+ }
+
+ return SharedT();
+ }
+
+ void dump()
+ {
+ std::cout << "[CACHE] " << size() << " of " << maxSize() << " Objects in the cache." << std::endl;
+
+ for(typename std::vector<SharedT>::iterator it = m_entries.begin(); it != m_entries.end(); ++it)
+ {
+ SharedT cur = *it;
+ std::cout << "[CACHE] - " << m_cacheMap[cur]->key() << " -> " << cur << " (Usage: " << m_cacheMap[cur]->usage() << ")" << std::endl;
+ }
+ }
+
+ private:
+ std::vector<SharedT> m_entries;
+ std::map<SharedT, CacheElement *> m_cacheMap;
+ int m_size, m_maxSize;
+ };
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Converter.cpp b/ksvg/impl/libs/libtext2path/src/Converter.cpp
new file mode 100644
index 00000000..7810b417
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Converter.cpp
@@ -0,0 +1,505 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <math.h>
+
+#include "myboost/shared_ptr.hpp"
+#include <fontconfig/fontconfig.h>
+#include <fribidi/fribidi.h>
+#include <fribidi/fribidi_types.h>
+
+#include "Font.h"
+#include "Glyph.h"
+#include "Tools.h"
+#include "Rectangle.h"
+#include "Converter.h"
+#include "QtUnicode.h"
+#include "GlyphTracer.h"
+
+// Macros
+#define FT_TRUNC(x) ((x) >> 6)
+#define FT_TOFLOAT(x) ((x) * (1.0 / 64.0))
+#define FT_FROMFLOAT(x) ((int) floor ((x) * 64.0 + 0.5))
+
+const double deg2rad = 0.017453292519943295769; // pi/180
+
+using namespace T2P;
+
+// Font engine. The core component.
+Converter::Converter(GlyphTracer *tracer) : m_glyphTracer(tracer)
+{
+ m_init = false;
+ m_kerning = true;
+ m_library = 0;
+}
+
+Converter::~Converter()
+{
+ if(m_glyphTracer)
+ delete m_glyphTracer;
+
+ m_fontCache.clear();
+ m_glyphCache.clear();
+
+ // Close FreeType2 library
+ if(m_library)
+ FT_Done_FreeType(m_library);
+}
+
+void Converter::init()
+{
+ // Initialize FreeType2
+ m_init = (FT_Init_FreeType(&m_library) == 0);
+}
+
+bool Converter::ready()
+{
+ return m_init;
+}
+
+void Converter::setKerning(bool mode)
+{
+ m_kerning = mode;
+}
+
+// Lookup font in cache or create new font
+SharedFont Converter::requestFont(const FontVisualParams *params)
+{
+ std::string cacheKey = cacheFontKey(params);
+ SharedFont cached = m_fontCache.find(cacheKey);
+
+ // If not available in cache, create new one and cache it :)
+ if(cached)
+ {
+ delete params;
+ return cached;
+ }
+ else
+ {
+ // Create a new Font
+ SharedFont newFont(new Font(this));
+
+ // Load the font
+ if(!newFont->load(params))
+ {
+ delete params;
+ return SharedFont();
+ }
+
+ // Append to cache
+ m_fontCache.insert(cacheKey, newFont);
+ return newFont;
+ }
+}
+
+GlyphAffinePair *Converter::requestGlyph(GlyphRenderParams *params, Rectangle &bbox, Affine &affine, bool onlyLatin)
+{
+ // 1. Select glyph to have glyphIndex information,
+ // needed to generate the cache lookup key
+ selectGlyph(params);
+
+ SharedGlyph cached = m_glyphCache.find(cacheGlyphKey(params));
+
+ // If not available in cache, render new one and cache it :)
+ // If we're mixing ie. japanese and latin characters (TTB layout),
+ // then we also have to re-calculate the glyph again with the appropriate rotation matrix (Niko)
+ if(!cached || !onlyLatin)
+ cached = calcGlyph(params, affine, onlyLatin);
+
+ // Correct bezier path by setting up the correct scaling matrix
+ // and multiplying with the current glyph affine
+ double fontSize = params->font()->fontParams()->size();
+
+ T2P::Affine correctAffine;
+ correctAffine.scale(0.001 * fontSize, -0.001 * fontSize);
+ correctAffine *= affine;
+
+ // Get bbox information
+ Point p1(FT_TRUNC(cached->ftBbox()->xMin), FT_TRUNC(cached->ftBbox()->yMin));
+ Point p2(FT_TRUNC(cached->ftBbox()->xMax), FT_TRUNC(cached->ftBbox()->yMax));
+
+ bbox.setA(affine.mapPoint(p1));
+ bbox.setB(affine.mapPoint(p2));
+
+ return new GlyphAffinePair(cached.get(), correctAffine);
+}
+
+void Converter::selectGlyph(GlyphRenderParams *params)
+{
+ // 1. Select glyph + test if it exists
+ // |
+ // |-> if it doesn't exist, replace by a '?' and check if exists
+ // |-> if it does exist, use it!
+ params->setGlyphIndex(FT_Get_Char_Index(params->font()->fontFace(), (FT_ULong) params->character()));
+
+ if(params->glyphIndex() == 0)
+ params->setGlyphIndex(FT_Get_Char_Index(params->font()->fontFace(), '?'));
+
+ // 2. Load glyph into font's glyphSlot, according to the GlyphLayoutParams
+ int flags = FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP;
+
+ // 3. Don't pass FT_LOAD_VERTICAL_LAYOUT on TTB layouts when rendering
+ // a latin glyph because it needs to be rotated...
+ if(params->layout()->tb())
+ {
+ Script script;
+ SCRIPT_FOR_CHAR(script, params->character())
+ if(script != Latin || params->layout()->glyphOrientationVertical() == 0)
+ flags |= FT_LOAD_VERTICAL_LAYOUT;
+ }
+
+ FT_Error error = FT_Load_Glyph(params->font()->fontFace(), params->glyphIndex(), flags);
+ if(error)
+ params->setGlyphIndex(0);
+}
+
+SharedGlyph Converter::calcGlyph(const GlyphRenderParams *params, Affine &affine, bool onlyLatin)
+{
+ // 2. Apply kerning if needed
+ if(m_kerning && params->lastGlyph() != 0 && params->glyphIndex() != 0)
+ {
+ FT_Vector kerningVector;
+ double kx, ky;
+
+ FT_Get_Kerning(params->font()->fontFace(), params->lastGlyph(), params->glyphIndex(), ft_kerning_default, &kerningVector);
+
+ kx = FT_TRUNC(kerningVector.x);
+ ky = FT_TRUNC(kerningVector.y);
+
+ affine.dx() += kx + affine.m21() * ky;
+
+ // Only apply y kerning in TB mode
+ if(params->layout()->tb())
+ affine.dy() += kx + affine.m22() * ky;
+ }
+
+ // 3. Prepare path tracing
+ FT_OutlineGlyph ftGlyph;
+ FT_Get_Glyph(params->font()->fontFace()->glyph, reinterpret_cast<FT_Glyph *>(&ftGlyph));
+
+ // 3a. Prepare tracing matrix
+ Affine traceAffine;
+ traceAffine.scale(1000.0 / params->font()->fontFace()->units_per_EM);
+
+ // 3b. Enable character rotation, if needed
+ if(params->layout()->tb())
+ {
+ Script script;
+ SCRIPT_FOR_CHAR(script, params->character())
+ if(!onlyLatin && script == Latin)
+ {
+ FT_Matrix matrix;
+
+ double angle = deg2rad * params->layout()->glyphOrientationVertical();
+ matrix.xx = (FT_Fixed)( cos(angle) * 0x10000L);
+ matrix.xy = (FT_Fixed)(-sin(angle) * 0x10000L);
+ matrix.yx = (FT_Fixed)( sin(angle) * 0x10000L);
+ matrix.yy = (FT_Fixed)( cos(angle) * 0x10000L);
+
+ FT_Glyph_Transform(reinterpret_cast<FT_Glyph>(ftGlyph), &matrix, 0);
+ }
+ }
+
+ // 4. Begin path tracing
+ // - Setup glyphOutlineing glyph
+ // - Start tracing
+ // - Close path
+ FT_Outline *ftOut = &ftGlyph->outline;
+
+ SharedGlyph glyphOutline(new Glyph());
+ glyphOutline->setBezierPath(m_glyphTracer->allocBezierPath(ftOut->n_points * 2 + ftOut->n_contours + 1));
+ glyphOutline->setAffine(traceAffine);
+
+ FT_Outline_Decompose(ftOut, m_glyphTracer->outlineFuncs(), glyphOutline.get());
+
+ m_glyphTracer->closePath(glyphOutline.get());
+
+ // 5. Determine bounding box (aka "cbox")
+ FT_Glyph_Get_CBox(reinterpret_cast<FT_Glyph>(ftGlyph), ft_glyph_bbox_unscaled, glyphOutline->ftBbox());
+
+ // 6. Cache glyph!
+ m_glyphCache.insert(cacheGlyphKey(params), glyphOutline);
+
+ FT_Done_Glyph(reinterpret_cast<FT_Glyph>(ftGlyph));
+
+ return glyphOutline;
+}
+
+GlyphSet *Converter::calcString(Font *font, const unsigned short *text, unsigned int length, Affine &affine, const GlyphLayoutParams *params, BezierPath *bpath)
+{
+ unsigned short *bidi = 0;
+
+ // 0. Apply BiDi Rules
+ if(params->useBidi())
+ {
+ FriBidiCharType baseDir = FRIBIDI_TYPE_N;
+ FriBidiChar *unicodeIn = new FriBidiChar[length + 1];
+ FriBidiChar *unicodeOut = new FriBidiChar[length + 1];
+ bidi = new unsigned short[length + 1];
+
+ for(unsigned int i = 0; i < length; i++)
+ unicodeIn[i] = text[i];
+
+ fribidi_log2vis(unicodeIn, length, &baseDir, unicodeOut, 0, 0, 0);
+
+ for(unsigned int i = 0; i < length; i++)
+ bidi[i] = unicodeOut[i];
+
+ bidi[length] = 0;
+ delete []unicodeIn;
+ delete []unicodeOut;
+ }
+ else
+ bidi = const_cast<unsigned short *>(text);
+
+ // Detect character rotation if needed,
+ // probably working in 0.1% of the cases :/
+ Script script;
+ bool onlyLatin = true;
+ for(unsigned int i = 0; i < length; i++)
+ {
+ SCRIPT_FOR_CHAR(script, bidi[i])
+ if(script != Latin)
+ {
+ onlyLatin = false;
+ break;
+ }
+ }
+
+ // 1. Set initial font size
+ double fontSize = font->fontParams()->size();
+ FT_Set_Char_Size(font->fontFace(), FT_FROMFLOAT(fontSize), FT_FROMFLOAT(fontSize), 0, 0);
+
+ // 2. Compute positioning metrics
+ // - See http://www.freetype.org/freetype2/docs/tutorial/stepX.html (X = 1 or 2)
+ int pixelHeight = (int) (FT_TOFLOAT(font->fontFace()->size->metrics.ascender - font->fontFace()->size->metrics.descender) * affine.m22());
+ int pixelBaseline = (int) (FT_TOFLOAT(font->fontFace()->size->metrics.ascender) * affine.m22());
+ int pixelUnderlinePosition = (int) (((font->fontFace()->ascender - font->fontFace()->underline_position - font->fontFace()->underline_thickness / 2) * fontSize / font->fontFace()->units_per_EM) * affine.m22());
+ int pixelUnderlineThickness = T2PMAX(1, (int) ((font->fontFace()->underline_thickness * fontSize / font->fontFace()->units_per_EM) * affine.m22()));
+
+ // 3. Prepare needed variables for the rendering loop
+ // - rendering params (layout, font...)
+ // - bounding box (per glyph, overall)
+ // - glyph matrix (overall)
+ // - resulting glyph sets
+ GlyphRenderParams *renderParams = new GlyphRenderParams();
+ renderParams->setFont(font);
+ renderParams->setLayout(params);
+ renderParams->setLastGlyph(0);
+ renderParams->setGlyphIndex(0);
+
+ Affine glyphAffine(affine);
+ Rectangle bbox, currentBbox;
+ GlyphSet *result = new GlyphSet();
+
+ // Align to path start, if bpath != 0
+ Point pathPoint, pathTangent, pathNormal;
+ double pathLength = 0, pathAdvance = 0;
+ double startOffset = params->textPathStartOffset();
+
+ if(bpath)
+ {
+ pathLength = bpath->length();
+ bpath->pointTangentNormalAt(startOffset, &pathPoint, &pathTangent);
+
+ glyphAffine.dx() = pathPoint.x();
+ glyphAffine.dy() = pathPoint.y();
+ glyphAffine.rotate(atan2(pathTangent.y(), pathTangent.x()));
+
+ std::cout << "[T2P] Starting textPath at: " << pathPoint.x() << ", " << pathPoint.y() << std::endl;
+ }
+
+ // <tspan> elements can have different baseline-shift's
+ // baseline-shift support (Niko)
+ double baseline = 0;
+ if(!params->baselineShift().empty())
+ {
+ if(params->baselineShift() == "sub")
+ baseline += fontSize / 5 + 1;
+ else if(params->baselineShift() == "super")
+ baseline -= fontSize / 3 + 1;
+ else
+ {
+ std::string temp = params->baselineShift();
+ if(temp.find("%") > 0)
+ baseline -= (atof(temp.c_str()) / 100.0) * fontSize;
+ else
+ baseline -= atoi(temp.c_str());
+ }
+
+ if(!params->tb())
+ glyphAffine.translate(0, baseline);
+ else
+ glyphAffine.translate(-baseline, 0);
+ }
+
+ // 4. Enter main rendering loop
+ for(unsigned int i = 0; i < length; i++)
+ {
+ // 4a. Modify character to render
+ renderParams->setCharacter(bidi[i]);
+
+ // 4c. Get glyph outline
+ GlyphAffinePair *glyphOutline = requestGlyph(renderParams, currentBbox, glyphAffine, onlyLatin);
+ m_glyphTracer->correctGlyph(glyphOutline);
+
+ // 4d. Save advance values
+ result->m_glyphXAdvance.push_back((font->fontFace()->glyph->advance.x * fontSize / font->fontFace()->units_per_EM) * affine.m11());
+ result->m_glyphYAdvance.push_back((font->fontFace()->glyph->advance.y * fontSize / font->fontFace()->units_per_EM) * affine.m22());
+
+ // 4e. Misc
+ // - union current + overall bounding box
+ // - add glyph to list of glyphs
+ // - apply letter & word spacing
+ if(renderParams->glyphIndex() != 0)
+ {
+ // Remember last glyph for kerning
+ renderParams->setLastGlyph(renderParams->glyphIndex());
+
+ // Union current + overall bounding box
+ bbox.bboxUnion(bbox, currentBbox);
+
+ // Move glyph locations for the next glyph to be
+ // rendered apply letter & word spacing
+ bool addGlyph = true;
+ if(!params->tb())
+ {
+ if(bpath)
+ {
+ double advance = startOffset + (pathAdvance / pathLength);
+ if(advance < 0.0 || advance > 1.0) // dont render off-path glyphs
+ addGlyph = false;
+
+ pathAdvance += (result->m_glyphXAdvance.back() + params->letterSpacing() * affine.m11()) + ((bidi[(i + 1)] == ' ') ? params->wordSpacing() * affine.m11() : 0);
+
+ std::cout << "[T2P] Adjusting textPath advance: " << pathAdvance << " Path Length: " << pathLength << " StartOffset: " << startOffset << " Position in Path (relative 0-1): " << pathAdvance/pathLength << " Adjusted by offset: " << startOffset + (pathAdvance / pathLength) << std::endl;
+
+ bpath->pointTangentNormalAt(startOffset + (pathAdvance / pathLength), &pathPoint, &pathTangent, &pathNormal);
+
+ glyphAffine.m11() = affine.m11();
+ glyphAffine.m12() = affine.m12();
+ glyphAffine.m21() = affine.m21();
+ glyphAffine.m22() = affine.m22();
+ glyphAffine.dx() = pathPoint.x();
+ glyphAffine.dy() = pathPoint.y();
+
+ glyphAffine.rotateAround(atan2(pathTangent.y(), pathTangent.x()), Point(result->m_glyphXAdvance.back() / 2, result->m_glyphYAdvance.back() / 2));
+
+ std::cout << "[T2P] Aligning textPath to: " << pathPoint.x() << ", " << pathPoint.y() << std::endl;
+ if(!params->tb())
+ glyphAffine.translate(0, baseline);
+ else
+ glyphAffine.translate(-baseline, 0);
+ }
+ else
+ glyphAffine.dx() += (result->m_glyphXAdvance.back() + params->letterSpacing() * affine.m11()) + ((bidi[(i + 1)] == ' ') ? params->wordSpacing() * affine.m11() : 0);
+ }
+ else
+ {
+ double advy = result->m_glyphYAdvance.back();
+
+ Script script;
+ SCRIPT_FOR_CHAR(script, bidi[i])
+ if(!onlyLatin && script == Latin && params->glyphOrientationVertical() != 0)
+ advy = result->m_glyphXAdvance.back();
+
+ glyphAffine.dy() += (advy + params->letterSpacing() * affine.m22()) + ((bidi[(i + 1)] == ' ') ? params->wordSpacing() * affine.m22() : 0);
+ }
+
+ // Copy bezier path/affine pair
+ if(addGlyph)
+ {
+ result->m_set.push_back(glyphOutline);
+ result->m_glyphCount++;
+ }
+ else
+ delete glyphOutline;
+ }
+ }
+
+ // 5. Fill out resulting data structures
+ result->m_underlinePosition = pixelUnderlinePosition;
+ result->m_overlinePosition = pixelHeight - pixelUnderlinePosition;
+ result->m_strikeThroughPosition = (result->m_underlinePosition + result->m_overlinePosition) / 2;
+ result->m_pixelBaseline = pixelBaseline;
+ result->m_underlineThickness = pixelUnderlineThickness;
+
+ result->m_xpen = glyphAffine.dx() - affine.dx();
+ result->m_ypen = glyphAffine.dy() - affine.dy();
+
+ result->m_bboxX = T2PMAX(1, int(bbox.a().x()));
+ result->m_bboxY = T2PMAX(1, int(bbox.a().y() - int(pixelHeight / 2)));
+ result->m_height = T2PMAX(1, int(bbox.b().y() - bbox.a().y()));
+
+ // Correct bounding box information also on
+ // vertical layouts! (Niko)
+ if(!params->tb())
+ {
+ if(bpath)
+ result->m_width = int(pathAdvance);
+ else
+ result->m_width = T2PMAX(1, int(bbox.b().x() - bbox.a().x()));
+ }
+ else
+ result->m_width = T2PMAX(1, pixelHeight);
+
+ // 6. Cleanup memory
+ if(text != bidi)
+ delete []bidi;
+
+ delete renderParams;
+
+ // 7. Eventually, dump cache statistics
+ // m_glyphCache.dump();
+ // m_fontCache.dump();
+
+ return result;
+}
+
+std::string Converter::cacheFontKey(const FontVisualParams *params) const
+{
+ // TODO: Tune the key
+ std::string key;
+
+ key += Tools::joinList('|', const_cast<FontVisualParams *>(params)->fontList());
+ key += Tools::a2str(params->weight());
+ key += Tools::a2str(params->slant());
+ key += Tools::a2str(params->size());
+
+ // std::cout << "Font cache key: " << key << std::endl;
+ return key;
+}
+
+std::string Converter::cacheGlyphKey(const GlyphRenderParams *params) const
+{
+ // TODO: Tune the key
+ std::string key;
+
+ key += params->font()->fontFile();
+ key += Tools::a2str(params->character());
+ key += Tools::a2str(params->glyphIndex());
+ key += Tools::a2str(params->font()->fontParams()->size());
+ key += Tools::a2str(params->font()->fontParams()->weight());
+ key += Tools::a2str(params->font()->fontParams()->slant());
+
+ // std::cout << "Glyph cache key: " << key << std::endl;
+ return key;
+}
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Converter.h b/ksvg/impl/libs/libtext2path/src/Converter.h
new file mode 100644
index 00000000..d6e19521
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Converter.h
@@ -0,0 +1,94 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_CONVERTER_H
+#define T2P_CONVERTER_H
+
+#include "Cache.h"
+
+// FreeType 2 includes
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_OUTLINE_H
+#include FT_GLYPH_H
+
+namespace T2P
+{
+ class BezierPath;
+
+ class Font;
+ class Glyph;
+ class Affine;
+ class GlyphSet;
+ class Rectangle;
+ class GlyphTracer;
+ class GlyphAffinePair;
+ class FontVisualParams;
+ class GlyphLayoutParams;
+ class GlyphRenderParams;
+
+ typedef myboost::shared_ptr<Font> SharedFont;
+ typedef myboost::shared_ptr<Glyph> SharedGlyph;
+
+ class Converter
+ {
+ public:
+ Converter(GlyphTracer *tracer);
+ ~Converter();
+
+ // Is initialized?
+ void init();
+ bool ready();
+
+ // Kerning control
+ void setKerning(bool mode);
+
+ SharedFont requestFont(const FontVisualParams *params);
+ GlyphAffinePair *requestGlyph(GlyphRenderParams *params, Rectangle &bbox, Affine &affine, bool onlyLatin);
+
+ GlyphSet *calcString(Font *font, const unsigned short *text, unsigned int length, Affine &affine, const GlyphLayoutParams *params, BezierPath *bpath = 0);
+ SharedGlyph calcGlyph(const GlyphRenderParams *params, Affine &affine, bool onlyLatin);
+
+ void selectGlyph(GlyphRenderParams *params);
+
+ protected:
+ friend class Font;
+
+ // Internal
+ FT_Library library() { return m_library; }
+
+ private:
+ std::string cacheFontKey(const FontVisualParams *params) const;
+ std::string cacheGlyphKey(const GlyphRenderParams *params) const;
+
+ FT_Library m_library;
+
+ GlyphTracer *m_glyphTracer;
+
+ Cache<Glyph> m_glyphCache;
+ Cache<Font> m_fontCache;
+
+ bool m_init, m_kerning;
+ };
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Font.cpp b/ksvg/impl/libs/libtext2path/src/Font.cpp
new file mode 100644
index 00000000..1d6f7005
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Font.cpp
@@ -0,0 +1,252 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <math.h>
+#include <iostream>
+#include <fontconfig/fontconfig.h>
+
+#include "Font.h"
+#include "Tools.h"
+#include "Converter.h"
+
+// Macros
+#define FT_TRUNC(x) ((x) >> 6)
+#define FT_TOFLOAT(x) ((x) * (1.0 / 64.0))
+#define FT_FROMFLOAT(x) ((int) floor ((x) * 64.0 + 0.5))
+
+using namespace T2P;
+
+FontVisualParams::FontVisualParams()
+{
+ m_size = 0.0;
+ m_slant = 0;
+ m_weight = 0;
+}
+
+FontVisualParams::FontVisualParams(const FontVisualParams &other)
+{
+ (*this) = other;
+}
+
+FontVisualParams::~FontVisualParams()
+{
+}
+
+FontVisualParams &FontVisualParams::operator=(const FontVisualParams &other)
+{
+ m_size = other.m_size;
+ m_slant = other.m_slant;
+ m_weight = other.m_weight;
+ m_fontList = other.m_fontList;
+
+ return *this;
+}
+
+void FontVisualParams::setWeight(int weight)
+{
+ m_weight = weight;
+}
+
+int FontVisualParams::weight() const
+{
+ return m_weight;
+}
+
+void FontVisualParams::setSlant(int slant)
+{
+ m_slant = slant;
+}
+
+int FontVisualParams::slant() const
+{
+ return m_slant;
+}
+
+void FontVisualParams::setSize(double size)
+{
+ m_size = size;
+}
+
+double FontVisualParams::size() const
+{
+ return m_size;
+}
+
+std::list<std::string> &FontVisualParams::fontList()
+{
+ return m_fontList;
+}
+
+// #####
+
+Font::Font(Converter *context) : m_context(context)
+{
+ m_ready = false;
+
+ m_fontFace = 0;
+ m_fontParams = 0;
+}
+
+Font::~Font()
+{
+ // Release font face
+ if(m_ready && m_fontFace)
+ {
+ // FIXME: Debug that!
+ //std::cout << "CALLING DONE FACE " << m_fontFace << std::endl;
+ FT_Done_Face(m_fontFace);
+ }
+
+ delete m_fontParams;
+}
+
+std::string Font::buildRequest(const FontVisualParams *fontParams, int &id)
+{
+ // Use FontConfig to locate & select fonts and use
+ // FreeType2 to open them
+ FcPattern *pattern;
+ std::string fileName;
+
+ pattern = FcPatternBuild(0,
+ FC_WEIGHT, FcTypeInteger, fontParams->weight(),
+ FC_SLANT, FcTypeInteger, fontParams->slant(),
+ FC_SIZE, FcTypeDouble, fontParams->size(),
+ NULL);
+
+ // Add multiple font names
+ std::list<std::string> &fontList = const_cast<FontVisualParams *>(fontParams)->fontList();
+
+ for(std::list<std::string>::const_iterator it = fontList.begin(); it != fontList.end(); ++it)
+ {
+ std::string string = *it;
+
+ if(!string.empty())
+ FcPatternAddString(pattern, FC_FAMILY, reinterpret_cast<const FcChar8 *>(string.c_str()));
+ }
+
+ // Always load vertical layout
+ FcPatternAddBool(pattern, FC_VERTICAL_LAYOUT, true);
+
+ // Disable hinting
+ FcPatternAddBool(pattern, FC_HINTING, false);
+
+ // Perform the default font pattern modification operations.
+ FcDefaultSubstitute(pattern);
+ FcConfigSubstitute(FcConfigGetCurrent(), pattern, FcMatchPattern);
+
+ // Match the pattern!
+ FcResult result;
+ FcPattern *match = FcFontMatch(0, pattern, &result);
+
+ // Destroy pattern
+ FcPatternDestroy(pattern);
+
+ // Get index & filename
+ FcChar8 *temp;
+
+ if(match)
+ {
+ FcPattern *pattern = FcPatternDuplicate(match);
+
+ // Get index & filename
+ if(FcPatternGetString(pattern, FC_FILE, 0, &temp) != FcResultMatch ||
+ FcPatternGetInteger(pattern, FC_INDEX, 0, &id) != FcResultMatch)
+ {
+ std::cout << "Font::buildRequest(), could not load font file for requested font \"" << Tools::joinList('|', fontList) << "\"" << std::endl;
+ return fileName;
+ }
+
+ fileName = reinterpret_cast<const char *>(temp);
+
+ // Kill pattern
+ FcPatternDestroy(pattern);
+ }
+
+ // Kill pattern
+ FcPatternDestroy(match);
+
+ return fileName;
+}
+
+bool Font::load(const FontVisualParams *fontParams)
+{
+ // Build FontConfig request pattern
+ int id = -1;
+ std::string filename = Font::buildRequest(fontParams, id);
+
+ // Load font directly using FreeType2
+ std::cout << "Font::load(), loading " << filename << " for requested font \"" << Tools::joinList('|', const_cast<FontVisualParams *>(fontParams)->fontList()) << "\"" << std::endl;
+
+ FT_Error error = FT_New_Face(m_context->library(), filename.c_str(), id, &m_fontFace);
+ if(error)
+ {
+ std::cout << "Font::load(), could not load font. Aborting!" << std::endl;
+ return false;
+ }
+ if(!FT_IS_SCALABLE(m_fontFace))
+ {
+ std::cout << "Font::load(), font does not contain outlines. Aborting!" << std::endl;
+ FT_Done_Face(m_fontFace);
+ m_fontFace = 0;
+ return false;
+ }
+
+ // Choose unicode charmap
+ for(int charmap = 0; charmap < m_fontFace->num_charmaps; charmap++)
+ {
+ if(m_fontFace->charmaps[charmap]->encoding == ft_encoding_unicode)
+ {
+ FT_Error error = FT_Set_Charmap(m_fontFace, m_fontFace->charmaps[charmap]);
+
+ if(error)
+ {
+ std::cout << "Font::load(), unable to select unicode charmap. Aborting!" << std::endl;
+
+ FT_Done_Face(m_fontFace);
+ m_fontFace = 0;
+
+ return false;
+ }
+ }
+ }
+
+ m_fontParams = fontParams;
+ m_fontFile = filename;
+ m_ready = true;
+
+ return true;
+}
+
+FT_Face &Font::fontFace()
+{
+ return m_fontFace;
+}
+
+std::string Font::fontFile() const
+{
+ return m_fontFile;
+}
+
+const FontVisualParams *Font::fontParams() const
+{
+ return m_fontParams;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Font.h b/ksvg/impl/libs/libtext2path/src/Font.h
new file mode 100644
index 00000000..72844285
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Font.h
@@ -0,0 +1,91 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_FONT_H
+#define T2P_FONT_H
+
+#include <list>
+#include <string>
+
+// FreeType 2 includes
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+namespace T2P
+{
+ class Converter;
+
+ class FontVisualParams
+ {
+ public:
+ FontVisualParams();
+ FontVisualParams(const FontVisualParams &other);
+ ~FontVisualParams();
+
+ FontVisualParams &operator=(const FontVisualParams &other);
+
+ void setWeight(int weight);
+ int weight() const;
+
+ void setSlant(int slant);
+ int slant() const;
+
+ void setSize(double size);
+ double size() const;
+
+ std::list<std::string> &fontList();
+
+ private:
+ int m_weight, m_slant;
+ double m_size;
+
+ std::list<std::string> m_fontList;
+ };
+
+ class Font
+ {
+ public:
+ Font(Converter *context);
+ ~Font();
+
+ // Build font loading request for FontConfig
+ static std::string buildRequest(const FontVisualParams *fontParams, int &id);
+
+ // Load it! :)
+ bool load(const FontVisualParams *fontParams);
+
+ FT_Face &fontFace();
+ std::string fontFile() const;
+ const FontVisualParams *fontParams() const;
+
+ private:
+ FT_Face m_fontFace;
+ std::string m_fontFile;
+
+ Converter *m_context;
+ const FontVisualParams *m_fontParams;
+
+ bool m_ready;
+ };
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Glyph.cpp b/ksvg/impl/libs/libtext2path/src/Glyph.cpp
new file mode 100644
index 00000000..5d172018
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Glyph.cpp
@@ -0,0 +1,353 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <iostream>
+#include "Glyph.h"
+
+using namespace T2P;
+
+Glyph::Glyph()
+{
+ m_bezierPath = 0;
+}
+
+Glyph::~Glyph()
+{
+ delete m_bezierPath;
+ m_bezierPath = 0;
+}
+
+Affine &Glyph::affine()
+{
+ return m_affine;
+}
+
+void Glyph::setAffine(const Affine &affine)
+{
+ m_affine = affine;
+}
+
+const BezierPath *Glyph::bezierPath() const
+{
+ return const_cast<const BezierPath *>(m_bezierPath);
+}
+
+BezierPath *Glyph::modifiableBezierPath()
+{
+ return m_bezierPath;
+}
+
+void Glyph::setBezierPath(const BezierPath *bpath)
+{
+ m_bezierPath = const_cast<BezierPath *>(bpath);
+}
+
+FT_BBox *Glyph::ftBbox()
+{
+ return m_ftBbox;
+}
+
+// #####
+
+GlyphAffinePair::GlyphAffinePair(const Glyph *glyph, const Affine &affine)
+{
+ m_glyph = glyph;
+ m_affine = affine;
+ m_transformatedPath = 0;
+}
+
+GlyphAffinePair::~GlyphAffinePair()
+{
+ // The glyphs are shared and thus not deleted (Niko)
+ delete m_transformatedPath;
+}
+
+void GlyphAffinePair::setTransformatedPath(const BezierPath *path)
+{
+ m_transformatedPath = path;
+}
+
+const BezierPath *GlyphAffinePair::transformatedPath() const
+{
+ return m_transformatedPath;
+}
+
+const Glyph *GlyphAffinePair::glyph() const
+{
+ return m_glyph;
+}
+
+Affine &GlyphAffinePair::affine()
+{
+ return m_affine;
+}
+
+// #####
+
+GlyphSet::GlyphSet()
+{
+ m_glyphCount = 0;
+
+ m_bboxX = 0;
+ m_bboxY = 0;
+ m_width = 0;
+ m_height = 0;
+
+ m_xpen = 0;
+ m_ypen = 0;
+
+ m_underlinePosition = 0;
+ m_underlineThickness = 0;
+ m_overlinePosition = 0;
+ m_strikeThroughPosition = 0;
+ m_pixelBaseline = 0;
+}
+
+GlyphSet::~GlyphSet()
+{
+ m_set.clear();
+}
+
+std::vector<GlyphAffinePair *> &GlyphSet::set()
+{
+ return m_set;
+}
+
+std::list<float> GlyphSet::glyphXAdvance()
+{
+ return m_glyphXAdvance;
+}
+
+std::list<float> GlyphSet::glyphYAdvance()
+{
+ return m_glyphYAdvance;
+}
+
+unsigned int GlyphSet::glyphCount() const
+{
+ return m_glyphCount;
+}
+
+int GlyphSet::width() const
+{
+ return m_width;
+}
+
+int GlyphSet::height() const
+{
+ return m_height;
+}
+
+int GlyphSet::bboxX() const
+{
+ return m_bboxX;
+}
+
+int GlyphSet::bboxY() const
+{
+ return m_bboxY;
+}
+
+double GlyphSet::xpen() const
+{
+ return m_xpen;
+}
+
+double GlyphSet::ypen() const
+{
+ return m_ypen;
+}
+
+int GlyphSet::underlinePosition() const
+{
+ return m_underlinePosition;
+}
+
+int GlyphSet::underlineThickness() const
+{
+ return m_underlineThickness;
+}
+
+int GlyphSet::overlinePosition() const
+{
+ return m_overlinePosition;
+}
+
+int GlyphSet::strikeThroughPosition() const
+{
+ return m_strikeThroughPosition;
+}
+
+int GlyphSet::pixelBaseline() const
+{
+ return m_pixelBaseline;
+}
+
+// #####
+
+GlyphLayoutParams::GlyphLayoutParams()
+{
+}
+
+GlyphLayoutParams::~GlyphLayoutParams()
+{
+}
+
+bool GlyphLayoutParams::tb() const
+{
+ return m_tb;
+}
+
+void GlyphLayoutParams::setTb(bool tb)
+{
+ m_tb = tb;
+}
+
+bool GlyphLayoutParams::useBidi() const
+{
+ return m_useBidi;
+}
+
+void GlyphLayoutParams::setUseBidi(bool bidi)
+{
+ m_useBidi = bidi;
+}
+
+double GlyphLayoutParams::wordSpacing() const
+{
+ return m_wordSpacing;
+}
+
+void GlyphLayoutParams::setWordSpacing(double wordSpacing)
+{
+ m_wordSpacing = wordSpacing;
+}
+
+double GlyphLayoutParams::letterSpacing() const
+{
+ return m_letterSpacing;
+}
+
+void GlyphLayoutParams::setLetterSpacing(double letterSpacing)
+{
+ m_letterSpacing = letterSpacing;
+}
+
+std::string GlyphLayoutParams::baselineShift() const
+{
+ return m_baseline;
+}
+
+void GlyphLayoutParams::setBaselineShift(const std::string &baseline)
+{
+ m_baseline = baseline;
+}
+
+int GlyphLayoutParams::glyphOrientationVertical() const
+{
+ return m_glyphOrientationVertical;
+}
+
+void GlyphLayoutParams::setGlyphOrientationVertical(int orient)
+{
+ m_glyphOrientationVertical = orient;
+}
+
+int GlyphLayoutParams::glyphOrientationHorizontal() const
+{
+ return m_glyphOrientationHorizontal;
+}
+
+void GlyphLayoutParams::setGlyphOrientationHorizontal(int orient)
+{
+ m_glyphOrientationHorizontal = orient;
+}
+
+double GlyphLayoutParams::textPathStartOffset() const
+{
+ return m_textPathStartOffset;
+}
+
+void GlyphLayoutParams::setTextPathStartOffset(double offset)
+{
+ m_textPathStartOffset = offset;
+}
+
+// #####
+
+GlyphRenderParams::GlyphRenderParams()
+{
+}
+
+GlyphRenderParams::~GlyphRenderParams()
+{
+}
+
+Font *GlyphRenderParams::font() const
+{
+ return m_font;
+}
+
+void GlyphRenderParams::setFont(Font *font)
+{
+ m_font = font;
+}
+
+const GlyphLayoutParams *GlyphRenderParams::layout() const
+{
+ return m_layout;
+}
+
+void GlyphRenderParams::setLayout(const GlyphLayoutParams *layout)
+{
+ m_layout = layout;
+}
+
+unsigned int GlyphRenderParams::glyphIndex() const
+{
+ return m_glyphIndex;
+}
+
+void GlyphRenderParams::setGlyphIndex(unsigned int glyphIndex)
+{
+ m_glyphIndex = glyphIndex;
+}
+
+unsigned int GlyphRenderParams::lastGlyph() const
+{
+ return m_lastGlyph;
+}
+
+void GlyphRenderParams::setLastGlyph(unsigned int lastGlyph)
+{
+ m_lastGlyph = lastGlyph;
+}
+
+unsigned short GlyphRenderParams::character() const
+{
+ return m_character;
+}
+
+void GlyphRenderParams::setCharacter(unsigned short character)
+{
+ m_character = character;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Glyph.h b/ksvg/impl/libs/libtext2path/src/Glyph.h
new file mode 100644
index 00000000..b3bd3fb5
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Glyph.h
@@ -0,0 +1,198 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_GLYPH_H
+#define T2P_GLYPH_H
+
+#include <list>
+#include <vector>
+#include <string>
+
+#include "Affine.h"
+#include "BezierPath.h"
+
+// FreeType 2 includes
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+namespace T2P
+{
+ class Font;
+
+ // Represent one single glyph in cache
+ class Glyph
+ {
+ public:
+ Glyph();
+ ~Glyph();
+
+ Affine &affine(); // Initial tracing affine
+ void setAffine(const Affine &affine);
+
+ const BezierPath *bezierPath() const; // Non-modifyable bezierPath belonging to this glyph
+ BezierPath *modifiableBezierPath(); // ONLY USED BY GLYPHTRACER, DO NOT USE SOMEWHERE ELSE!
+ void setBezierPath(const BezierPath *bpath);
+
+ FT_BBox *ftBbox();
+
+ private:
+ Affine m_affine;
+ FT_BBox m_ftBbox[4];
+ BezierPath *m_bezierPath;
+ };
+
+ // Is created for every character which needs to
+ // be rendered and has to be deleted by the "client"
+ class GlyphAffinePair
+ {
+ public:
+ GlyphAffinePair(const Glyph *glyph, const Affine &affine);
+ ~GlyphAffinePair();
+
+ void setTransformatedPath(const BezierPath *path);
+ const BezierPath *transformatedPath() const;
+
+ const Glyph *glyph() const;
+ Affine &affine();
+
+ private:
+ const Glyph *m_glyph;
+ const BezierPath *m_transformatedPath;
+ Affine m_affine;
+ };
+
+ class GlyphSet
+ {
+ public:
+ GlyphSet();
+ ~GlyphSet();
+
+ std::vector<GlyphAffinePair *> &set();
+ std::list<float> glyphXAdvance();
+ std::list<float> glyphYAdvance();
+
+ unsigned int glyphCount() const;
+
+ int width() const;
+ int height() const;
+
+ int bboxX() const;
+ int bboxY() const;
+
+ double xpen() const;
+ double ypen() const;
+
+ int underlinePosition() const;
+ int underlineThickness() const;
+ int overlinePosition() const;
+ int strikeThroughPosition() const;
+ int pixelBaseline() const;
+
+ private:
+ friend class Converter;
+ unsigned int m_glyphCount; // Number of glyphs in the set
+
+ int m_bboxX, m_bboxY; // Bounding box locations (x,y) + (x + width, y + width)
+ int m_width, m_height;
+
+ double m_xpen, m_ypen; // relative pen locations
+
+ int m_underlinePosition, m_underlineThickness, m_overlinePosition, m_strikeThroughPosition, m_pixelBaseline;
+
+ std::vector<GlyphAffinePair *> m_set; // Bezier paths in the set
+
+ std::list<float> m_glyphXAdvance; // List of advance values needed ie. for text paths
+ std::list<float> m_glyphYAdvance;
+ };
+
+ class GlyphLayoutParams
+ {
+ public:
+ GlyphLayoutParams();
+ ~GlyphLayoutParams();
+
+ bool tb() const;
+ void setTb(bool tb);
+
+ bool useBidi() const;
+ void setUseBidi(bool bidi);
+
+ double wordSpacing() const;
+ void setWordSpacing(double wordSpacing);
+
+ double letterSpacing() const;
+ void setLetterSpacing(double letterSpacing);
+
+ std::string baselineShift() const;
+ void setBaselineShift(const std::string &baseline);
+
+ int glyphOrientationVertical() const;
+ void setGlyphOrientationVertical(int orient);
+
+ int glyphOrientationHorizontal() const;
+ void setGlyphOrientationHorizontal(int orient);
+
+ // textOnPath specific stuff
+ double textPathStartOffset() const;
+ void setTextPathStartOffset(double offset);
+
+ private:
+ bool m_tb; // Top-To-Bottom or Bottom-To-Top ?
+ bool m_useBidi; // Use Bidi ?
+ double m_wordSpacing, m_letterSpacing; // word/character spacing
+ double m_textPathStartOffset; // range: 0.0 - 1.0; start offset in the path
+ int m_glyphOrientationVertical, m_glyphOrientationHorizontal; // Degrees...
+ std::string m_baseline; // baseline description, using same system as svg
+ };
+
+ class GlyphRenderParams
+ {
+ public:
+ GlyphRenderParams();
+ ~GlyphRenderParams();
+
+ Font *font() const;
+ void setFont(Font *font);
+
+ const GlyphLayoutParams *layout() const;
+ void setLayout(const GlyphLayoutParams *layout);
+
+ unsigned int glyphIndex() const;
+ void setGlyphIndex(unsigned int glyphIndex);
+
+ unsigned int lastGlyph() const;
+ void setLastGlyph(unsigned int lastGlyph);
+
+ unsigned short character() const;
+ void setCharacter(unsigned short character);
+
+ private:
+ Font *m_font;
+ const GlyphLayoutParams *m_layout; // Glyph layouting params
+
+ unsigned int m_glyphIndex; // 'character' index in font
+ unsigned int m_lastGlyph; // Kerning
+ unsigned short m_character; // Unicode glyph to process
+ };
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/GlyphTracer.cpp b/ksvg/impl/libs/libtext2path/src/GlyphTracer.cpp
new file mode 100644
index 00000000..42457553
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/GlyphTracer.cpp
@@ -0,0 +1,76 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "GlyphTracer.h"
+
+using namespace T2P;
+
+GlyphTracer::GlyphTracer()
+{
+ m_moveTo = 0;
+ m_lineTo = 0;
+ m_conicBezier = 0;
+ m_cubicBezier = 0;
+ m_outlineMethods = 0;
+}
+
+GlyphTracer::~GlyphTracer()
+{
+ delete m_outlineMethods;
+}
+
+void GlyphTracer::setMoveto(FT_Outline_MoveToFunc funcPtr)
+{
+ m_moveTo = funcPtr;
+}
+
+void GlyphTracer::setLineto(FT_Outline_LineToFunc funcPtr)
+{
+ m_lineTo = funcPtr;
+}
+
+void GlyphTracer::setConicBezier(FT_Outline_ConicToFunc funcPtr)
+{
+ m_conicBezier = funcPtr;
+}
+
+void GlyphTracer::setCubicBezier(FT_Outline_CubicToFunc funcPtr)
+{
+ m_cubicBezier = funcPtr;
+}
+
+FT_Outline_Funcs *GlyphTracer::outlineFuncs()
+{
+ if(m_outlineMethods)
+ return m_outlineMethods;
+
+ FT_Outline_Funcs *ret = new FT_Outline_Funcs();
+ ret->move_to = m_moveTo;
+ ret->line_to = m_lineTo;
+ ret->conic_to = m_conicBezier;
+ ret->cubic_to = m_cubicBezier;
+ ret->shift = 0;
+ ret->delta = 0;
+
+ m_outlineMethods = ret;
+ return m_outlineMethods;
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/GlyphTracer.h b/ksvg/impl/libs/libtext2path/src/GlyphTracer.h
new file mode 100644
index 00000000..7607ecad
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/GlyphTracer.h
@@ -0,0 +1,65 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_GLYPHTRACER_H
+#define T2P_GLYPHTRACER_H
+
+// FreeType 2 includes
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+namespace T2P
+{
+ class Glyph;
+ class BezierPath;
+ class GlyphAffinePair;
+
+ class GlyphTracer
+ {
+ public:
+ GlyphTracer();
+ virtual ~GlyphTracer();
+
+ // Needs to be implemented
+ virtual void correctGlyph(GlyphAffinePair *glyphAffine) = 0;
+ virtual BezierPath *allocBezierPath(int size) = 0;
+ virtual void closePath(Glyph *glyph) = 0;
+
+ // FreeType glyph tracing functions
+ void setMoveto(FT_Outline_MoveToFunc funcPtr);
+ void setLineto(FT_Outline_LineToFunc funcPtr);
+ void setConicBezier(FT_Outline_ConicToFunc funcPtr);
+ void setCubicBezier(FT_Outline_CubicToFunc funcPtr);
+
+ FT_Outline_Funcs *outlineFuncs();
+
+ private:
+ FT_Outline_Funcs *m_outlineMethods;
+
+ FT_Outline_MoveToFunc m_moveTo;
+ FT_Outline_LineToFunc m_lineTo;
+ FT_Outline_ConicToFunc m_conicBezier;
+ FT_Outline_CubicToFunc m_cubicBezier;
+ };
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Makefile.am b/ksvg/impl/libs/libtext2path/src/Makefile.am
new file mode 100644
index 00000000..175e1a91
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Makefile.am
@@ -0,0 +1,10 @@
+lib_LTLIBRARIES = libtext2path.la
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+INCLUDES = $(FRIBIDI_CFLAGS) $(FREETYPE_CFLAGS) $(FONTCONFIG_CFLAGS) $(all_includes)
+
+libtext2path_includedir=$(includedir)/libtext2path-0.1
+libtext2path_include_HEADERS = BezierPath.h Glyph.h GlyphTracer.h
+
+libtext2path_la_SOURCES = Affine.cpp Rectangle.cpp Font.cpp Glyph.cpp GlyphTracer.cpp Converter.cpp QtUnicode.cpp
+libtext2path_la_LDFLAGS = $(FRIBIDI_LIBS) $(FONTCONFIG_LIBS)
diff --git a/ksvg/impl/libs/libtext2path/src/Point.h b/ksvg/impl/libs/libtext2path/src/Point.h
new file mode 100644
index 00000000..d95742a2
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Point.h
@@ -0,0 +1,65 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_POINT_H
+#define T2P_POINT_H
+
+namespace T2P
+{
+ class Point
+ {
+ public:
+ Point() { m_x = 0.0; m_y = 0.0; }
+ Point(double x, double y) { m_x = x; m_y = y; }
+ Point &operator=(const Point &other) { m_x = other.x(); m_y = other.y(); return *this; }
+
+ friend inline Point operator+(const Point &, const Point &);
+ friend inline Point operator-(const Point &, const Point &);
+ friend inline Point operator*(const double &, const Point &);
+ friend inline Point operator*(const Point &, const double &);
+
+ double x() const { return m_x; }
+ double y() const { return m_y; }
+
+ void setX(double x) { m_x = x; }
+ void setY(double y) { m_y = y; }
+
+ const Point invert() const
+ {
+ Point temp;
+ temp.setX(-x());
+ temp.setY(-y());
+ return temp;
+ }
+
+ private:
+ double m_x;
+ double m_y;
+ };
+
+ inline Point operator+(const Point &p1, const Point &p2) { return Point(p1.m_x + p2.m_x, p1.m_y + p2.m_y); }
+ inline Point operator-(const Point &p1, const Point &p2) { return Point(p1.m_x - p2.m_x, p1.m_y - p2.m_y); }
+ inline Point operator*(const double &c, const Point &p) { return Point(p.m_x * c, p.m_y * c); }
+ inline Point operator*(const Point &p, const double &c) { return Point(p.m_x * c, p.m_y * c); }
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/QtUnicode.cpp b/ksvg/impl/libs/libtext2path/src/QtUnicode.cpp
new file mode 100644
index 00000000..694ed5c7
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/QtUnicode.cpp
@@ -0,0 +1,164 @@
+/****************************************************************************
+**
+**
+** ???
+**
+** Copyright (C) 2002-2003 Trolltech AS. All rights reserved.
+**
+** This file is part of the kernel module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "QtUnicode.h"
+
+using namespace T2P;
+// START OF GENERATED DATA
+
+// copied form qfont.h, as we can't include it in tools. Do not modify without
+// changing the script enum in qfont.h aswell.
+const unsigned char QtUnicode::otherScripts [120] = {
+#define SCRIPTS_02 0
+ 0xaf, Latin, 0xff, SpacingModifiers, // row 0x02, index 0
+#define SCRIPTS_03 4
+ 0x6f, CombiningMarks, 0xff, Greek, // row 0x03, index 4
+#define SCRIPTS_05 8
+ 0x2f, Cyrillic, 0x8f, Armenian, 0xff, Hebrew, // row 0x05, index 8
+#define SCRIPTS_07 14
+ 0x4f, Syriac, 0x7f, Unicode, 0xbf, Thaana,
+ 0xff, Unicode, // row 0x07, index 14
+#define SCRIPTS_10 22
+ 0x9f, Myanmar, 0xff, Georgian, // row 0x10, index 20
+#define SCRIPTS_13 26
+ 0x7f, Ethiopic, 0x9f, Unicode, 0xff, Cherokee, // row 0x13, index 24
+#define SCRIPTS_16 32
+ 0x7f, CanadianAboriginal, 0x9f, Ogham,
+ 0xff, Runic, // row 0x16 index 30
+#define SCRIPTS_17 38
+ 0x1f, Tagalog, 0x3f, Hanunoo, 0x5f, Buhid,
+ 0x7f, Tagbanwa, 0xff, Khmer, // row 0x17, index 36
+#define SCRIPTS_18 48
+ 0xaf, Mongolian, 0xff, Unicode, // row 0x18, index 46
+#define SCRIPTS_20 52
+ 0x0b, Unicode, 0x0d, UnknownScript, 0x6f, Unicode, 0x9f, NumberForms,
+ 0xab, CurrencySymbols, 0xac, Latin,
+ 0xcf, CurrencySymbols, 0xff, CombiningMarks, // row 0x20, index 50
+#define SCRIPTS_21 68
+ 0x4f, LetterlikeSymbols, 0x8f, NumberForms,
+ 0xff, MathematicalOperators, // row 0x21, index 62
+#define SCRIPTS_24 74
+ 0x5f, TechnicalSymbols, 0xff, EnclosedAndSquare, // row 0x24, index 68
+#define SCRIPTS_2e 78
+ 0x7f, Unicode, 0xff, Han, // row 0x2e, index 72
+#define SCRIPTS_30 82
+ 0x3f, Han, 0x9f, Hiragana, 0xff, Katakana, // row 0x30, index 76
+#define SCRIPTS_31 88
+ 0x2f, Bopomofo, 0x8f, Hangul, 0x9f, Han,
+ 0xff, Unicode, // row 0x31, index 82
+#define SCRIPTS_fb 96
+ 0x06, Latin, 0x1c, Unicode, 0x4f, Hebrew,
+ 0xff, Arabic, // row 0xfb, index 90
+#define SCRIPTS_fe 104
+ 0x1f, Unicode, 0x2f, CombiningMarks, 0x6f, Unicode,
+ 0xff, Arabic, // row 0xfe, index 98
+#define SCRIPTS_ff 112
+ 0x5e, Katakana, 0x60, Unicode, // row 0xff, index 106
+ 0x9f, KatakanaHalfWidth, 0xff, Unicode
+};
+
+// (uc-0x0900)>>7
+const unsigned char QtUnicode::indicScripts [] =
+{
+ Devanagari, Bengali,
+ Gurmukhi, Gujarati,
+ Oriya, Tamil,
+ Telugu, Kannada,
+ Malayalam, Sinhala,
+ Thai, Lao
+};
+
+
+// 0x80 + x: x is the offset into the otherScripts table
+const unsigned char QtUnicode::scriptTable[256] =
+{
+ Latin, Latin, 0x80+SCRIPTS_02, 0x80+SCRIPTS_03,
+ Cyrillic, 0x80+SCRIPTS_05, Arabic, 0x80+SCRIPTS_07,
+ Unicode, SCRIPTS_INDIC, SCRIPTS_INDIC, SCRIPTS_INDIC,
+ SCRIPTS_INDIC, SCRIPTS_INDIC, SCRIPTS_INDIC, Tibetan,
+
+ 0x80+SCRIPTS_10, Hangul, Ethiopic, 0x80+SCRIPTS_13,
+ CanadianAboriginal, CanadianAboriginal, 0x80+SCRIPTS_16, 0x80+SCRIPTS_17,
+ 0x80+SCRIPTS_18, Unicode, Unicode, Unicode,
+ Unicode, Unicode, Latin, Greek,
+
+ 0x80+SCRIPTS_20, 0x80+SCRIPTS_21, MathematicalOperators, TechnicalSymbols,
+ 0x80+SCRIPTS_24, GeometricSymbols, MiscellaneousSymbols, MiscellaneousSymbols,
+ Braille, Unicode, Unicode, Unicode,
+ Unicode, Unicode, 0x80+SCRIPTS_2e, Han,
+
+ 0x80+SCRIPTS_30, 0x80+SCRIPTS_31, EnclosedAndSquare, EnclosedAndSquare,
+ Han, Han, Han, Han,
+ Han, Han, Han, Han,
+ Han, Han, Han, Han,
+
+ Han, Han, Han, Han, Han, Han, Han, Han,
+ Han, Han, Han, Han, Han, Han, Han, Han,
+
+ Han, Han, Han, Han, Han, Han, Han, Han,
+ Han, Han, Han, Han, Han, Han, Han, Han,
+
+ Han, Han, Han, Han, Han, Han, Han, Han,
+ Han, Han, Han, Han, Han, Han, Han, Han,
+
+ Han, Han, Han, Han, Han, Han, Han, Han,
+ Han, Han, Han, Han, Han, Han, Han, Han,
+
+
+ Han, Han, Han, Han, Han, Han, Han, Han,
+ Han, Han, Han, Han, Han, Han, Han, Han,
+
+ Han, Han, Han, Han, Han, Han, Han, Han,
+ Han, Han, Han, Han, Han, Han, Han, Han,
+
+ Yi, Yi, Yi, Yi, Yi, Unicode, Unicode, Unicode,
+ Unicode, Unicode, Unicode, Unicode, Hangul, Hangul, Hangul, Hangul,
+
+ Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul,
+ Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul,
+
+ Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul,
+ Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul,
+
+ Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul, Hangul,
+ Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode,
+
+ Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode,
+ Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode,
+
+ Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode, Unicode,
+ Unicode, Han, Han, 0x80+SCRIPTS_fb, Arabic, Arabic, 0x80+SCRIPTS_fe, 0x80+SCRIPTS_ff
+};
+
diff --git a/ksvg/impl/libs/libtext2path/src/QtUnicode.h b/ksvg/impl/libs/libtext2path/src/QtUnicode.h
new file mode 100644
index 00000000..41008500
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/QtUnicode.h
@@ -0,0 +1,149 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_QT_UNICODE_H
+#define T2P_QT_UNICODE_H
+
+namespace T2P
+{
+ enum Script
+ {
+ // European Alphabetic Scripts
+ Latin,
+ Greek,
+ Cyrillic,
+ Armenian,
+ Georgian,
+ Runic,
+ Ogham,
+ SpacingModifiers,
+ CombiningMarks,
+
+ // Middle Eastern Scripts
+ Hebrew,
+ Arabic,
+ Syriac,
+ Thaana,
+
+ // South and Southeast Asian Scripts
+ Devanagari,
+ Bengali,
+ Gurmukhi,
+ Gujarati,
+ Oriya,
+ Tamil,
+ Telugu,
+ Kannada,
+ Malayalam,
+ Sinhala,
+ Thai,
+ Lao,
+ Tibetan,
+ Myanmar,
+ Khmer,
+
+ // East Asian Scripts
+ Han,
+ Hiragana,
+ Katakana,
+ Hangul,
+ Bopomofo,
+ Yi,
+
+ // Additional Scripts
+ Ethiopic,
+ Cherokee,
+ CanadianAboriginal,
+ Mongolian,
+
+ // Symbols
+ CurrencySymbols,
+ LetterlikeSymbols,
+ NumberForms,
+ MathematicalOperators,
+ TechnicalSymbols,
+ GeometricSymbols,
+ MiscellaneousSymbols,
+ EnclosedAndSquare,
+ Braille,
+
+ Unicode,
+
+ // some scripts added in Unicode 3.2
+ Tagalog,
+ Hanunoo,
+ Buhid,
+ Tagbanwa,
+
+ KatakanaHalfWidth,
+
+ // End
+ NScripts,
+ UnknownScript = NScripts
+ };
+
+ class QtUnicode
+ {
+ public:
+ QtUnicode() { }
+ ~QtUnicode() { }
+
+ static int scriptForChar(unsigned short uc)
+ {
+ unsigned char script = QtUnicode::scriptTable[(uc >> 8)];
+ if(script >= QtUnicode::SCRIPTS_INDIC)
+ {
+ if(script == QtUnicode::SCRIPTS_INDIC)
+ script = QtUnicode::indicScripts[(uc - 0x0900) >> 7];
+ else
+ {
+ // 0x80 + SCRIPTS_xx
+ unsigned char index = script - 0x80;
+ unsigned char cell = uc & 0xff;
+ while(QtUnicode::otherScripts[index++] < cell)
+ index++;
+ script = QtUnicode::otherScripts[index];
+ }
+ }
+
+ return script;
+ }
+
+ private:
+ enum
+ {
+ SCRIPTS_INDIC = 0x7e
+ };
+
+ static const unsigned char otherScripts[];
+ static const unsigned char indicScripts[];
+ static const unsigned char scriptTable[];
+ };
+}
+
+#define SCRIPT_FOR_CHAR(script, c) \
+if(c < 0x100) \
+ script = T2P::Latin; \
+else \
+ script = (T2P::Script) QtUnicode::scriptForChar(c);
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Rectangle.cpp b/ksvg/impl/libs/libtext2path/src/Rectangle.cpp
new file mode 100644
index 00000000..ef59d6be
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Rectangle.cpp
@@ -0,0 +1,102 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "Tools.h"
+#include "Rectangle.h"
+
+using namespace T2P;
+
+Rectangle::Rectangle()
+{
+}
+
+Rectangle::Rectangle(const Rectangle &other)
+{
+ (*this) = other;
+}
+
+Rectangle::Rectangle(const Point &a, const Point &b) : m_a(a), m_b(b)
+{
+}
+
+Rectangle::Rectangle(double x, double y, double width, double height)
+{
+ m_a = Point(x, y);
+ m_b = Point(x + width, y + height);
+}
+
+Rectangle::~Rectangle()
+{
+}
+
+Rectangle &Rectangle::operator=(const Rectangle &other)
+{
+ m_a = other.m_a;
+ m_b = other.m_b;
+
+ return *this;
+}
+
+Point Rectangle::a() const
+{
+ return m_a;
+}
+
+void Rectangle::setA(const Point &a)
+{
+ m_a = a;
+}
+
+Point Rectangle::b() const
+{
+ return m_b;
+}
+
+void Rectangle::setB(const Point &b)
+{
+ m_b = b;
+}
+
+void Rectangle::bboxUnion(const Rectangle &src1, const Rectangle &src2)
+{
+ double src1x0 = src1.a().x(), src1x1 = src1.b().x();
+ double src1y0 = src1.a().y(), src1y1 = src1.b().y();
+
+ double src2x0 = src2.a().x(), src2x1 = src2.b().x();
+ double src2y0 = src2.a().y(), src2y1 = src2.b().y();
+
+ if(src1x1 <= src1x0 || src1y1 <= src1y0) // Is src1 empty?
+ { // Copy src2 to dst
+ setA(Point(src2x0, src2y0));
+ setB(Point(src2x1, src2y1));
+ }
+ else if(src2x1 <= src2x0 || src2y1 <= src2y0) // Is src2 empty?
+ { // Copy src1 to dest
+ setA(Point(src1x0, src1y0));
+ setB(Point(src1x1, src1y1));
+ }
+ else
+ {
+ setA(Point(T2PMIN(src1x0, src2x0), T2PMIN(src1y0, src2y0)));
+ setB(Point(T2PMAX(src1x1, src2x1), T2PMAX(src1y1, src2y1)));
+ }
+}
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Rectangle.h b/ksvg/impl/libs/libtext2path/src/Rectangle.h
new file mode 100644
index 00000000..1a5eeeb1
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Rectangle.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_RECTANGLE_H
+#define T2P_RECTANGLE_H
+
+#include "Point.h"
+
+namespace T2P
+{
+ class Rectangle
+ {
+ public:
+ Rectangle();
+ Rectangle(const Rectangle &other);
+ Rectangle(const Point &a, const Point &b);
+ Rectangle(double x, double y, double width, double height);
+ ~Rectangle();
+
+ Rectangle &operator=(const Rectangle &other);
+
+ Point a() const;
+ void setA(const Point &a);
+
+ Point b() const;
+ void setB(const Point &b);
+
+ // Finds the smallest rectangle that includes src1 and src2.
+ void bboxUnion(const Rectangle &src1, const Rectangle &src2);
+
+ private:
+ Point m_a, m_b;
+ };
+}
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/Tools.h b/ksvg/impl/libs/libtext2path/src/Tools.h
new file mode 100644
index 00000000..c7753365
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/Tools.h
@@ -0,0 +1,85 @@
+/*
+ Copyright (C) 2003 Nikolas Zimmermann <wildfox@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
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef T2P_TOOLS_H
+#define T2P_TOOLS_H
+
+#include <list>
+#include <string>
+#include <config.h>
+#ifdef HAVE_SSTREAM
+# include <sstream>
+#else
+# include <strstream>
+# define ostringstream ostrstream
+#endif
+
+#define T2PMAX(a, b) ((b) < (a) ? (a) : (b))
+#define T2PMIN(a, b) ((a) < (b) ? (a) : (b))
+
+namespace T2P
+{
+ class Tools
+ {
+ public:
+ static std::string joinList(char seperator, std::list<std::string> &list)
+ {
+ std::string result;
+
+ if(list.empty())
+ return result;
+
+ bool first = true;
+ for(std::list<std::string>::const_iterator it = list.begin(); it != list.end(); ++it)
+ {
+ std::string string = *it;
+
+ if(!string.empty())
+ {
+ if(!first)
+ result += seperator + string;
+ else
+ {
+ result += string;
+ first = false;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ template<typename T>
+ static std::string a2str(T arg)
+ {
+ std::ostringstream buffer;
+ buffer << arg;
+ return buffer.str();
+ }
+ };
+}
+
+#ifdef ostringstream
+# undef ostringstream
+#endif
+
+#endif
+
+// vim:ts=4:noet
diff --git a/ksvg/impl/libs/libtext2path/src/myboost/assert.hpp b/ksvg/impl/libs/libtext2path/src/myboost/assert.hpp
new file mode 100644
index 00000000..3f3c61c2
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/myboost/assert.hpp
@@ -0,0 +1,24 @@
+//
+// boost/assert.hpp - BOOST_ASSERT(expr)
+//
+// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+// Note: There are no include guards. This is intentional.
+//
+// See http://www.boost.org/libs/utility/assert.html for documentation.
+//
+
+#ifndef ASSERT_HPP
+#define ASSERT_HPP
+
+#undef BOOST_ASSERT
+
+# include <assert.h>
+# define BOOST_ASSERT(expr) assert(expr)
+
+#endif
diff --git a/ksvg/impl/libs/libtext2path/src/myboost/checked_delete.hpp b/ksvg/impl/libs/libtext2path/src/myboost/checked_delete.hpp
new file mode 100644
index 00000000..73afd5f5
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/myboost/checked_delete.hpp
@@ -0,0 +1,61 @@
+#ifndef BOOST_CHECKED_DELETE_HPP_INCLUDED
+#define BOOST_CHECKED_DELETE_HPP_INCLUDED
+
+//
+// boost/checked_delete.hpp
+//
+// Copyright (c) 1999, 2000, 2001, 2002 boost.org
+// Copyright (c) 2002, 2003 Peter Dimov
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+// See http://www.boost.org/libs/utility/checked_delete.html for documentation.
+//
+
+namespace myboost
+{
+
+// verify that types are complete for increased safety
+
+template<class T> inline void checked_delete(T * x)
+{
+ // Intel 7 accepts sizeof(incomplete) as 0 in system headers
+ typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
+ delete x;
+}
+
+template<class T> inline void checked_array_delete(T * x)
+{
+ typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
+ delete [] x;
+}
+
+template<class T> struct checked_deleter
+{
+ typedef void result_type;
+ typedef T * argument_type;
+
+ void operator()(T * x) const
+ {
+ // boost:: disables ADL
+ myboost::checked_delete(x);
+ }
+};
+
+template<class T> struct checked_array_deleter
+{
+ typedef void result_type;
+ typedef T * argument_type;
+
+ void operator()(T * x) const
+ {
+ myboost::checked_array_delete(x);
+ }
+};
+
+} // namespace myboost
+
+#endif // #ifndef BOOST_CHECKED_DELETE_HPP_INCLUDED
diff --git a/ksvg/impl/libs/libtext2path/src/myboost/lightweight_mutex.hpp b/ksvg/impl/libs/libtext2path/src/myboost/lightweight_mutex.hpp
new file mode 100644
index 00000000..10db127c
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/myboost/lightweight_mutex.hpp
@@ -0,0 +1,74 @@
+#ifndef BOOST_DETAIL_LWM_PTHREADS_HPP_INCLUDED
+#define BOOST_DETAIL_LWM_PTHREADS_HPP_INCLUDED
+
+//
+// boost/detail/lwm_pthreads.hpp
+//
+// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+
+#include <pthread.h>
+
+namespace myboost
+{
+
+namespace detail
+{
+
+class lightweight_mutex
+{
+private:
+
+ pthread_mutex_t m_;
+
+ lightweight_mutex(lightweight_mutex const &);
+ lightweight_mutex & operator=(lightweight_mutex const &);
+
+public:
+
+ lightweight_mutex()
+ {
+ pthread_mutex_init(&m_, 0);
+ }
+
+ ~lightweight_mutex()
+ {
+ pthread_mutex_destroy(&m_);
+ }
+
+ class scoped_lock;
+ friend class scoped_lock;
+
+ class scoped_lock
+ {
+ private:
+
+ pthread_mutex_t & m_;
+
+ scoped_lock(scoped_lock const &);
+ scoped_lock & operator=(scoped_lock const &);
+
+ public:
+
+ scoped_lock(lightweight_mutex & m): m_(m.m_)
+ {
+ pthread_mutex_lock(&m_);
+ }
+
+ ~scoped_lock()
+ {
+ pthread_mutex_unlock(&m_);
+ }
+ };
+};
+
+} // namespace detail
+
+} // namespace myboost
+
+#endif // #ifndef BOOST_DETAIL_LWM_PTHREADS_HPP_INCLUDED
diff --git a/ksvg/impl/libs/libtext2path/src/myboost/shared_count.hpp b/ksvg/impl/libs/libtext2path/src/myboost/shared_count.hpp
new file mode 100644
index 00000000..e8ec19a8
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/myboost/shared_count.hpp
@@ -0,0 +1,367 @@
+#ifndef BOOST_DETAIL_SHARED_COUNT_HPP_INCLUDED
+#define BOOST_DETAIL_SHARED_COUNT_HPP_INCLUDED
+
+//
+// detail/shared_count.hpp
+//
+// Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+
+#include "myboost/checked_delete.hpp"
+#include "myboost/throw_exception.hpp"
+#include "myboost/lightweight_mutex.hpp"
+
+#include <memory> // std::auto_ptr, std::allocator
+#include <functional> // std::less
+#include <exception> // std::exception
+#include <new> // std::bad_alloc
+#include <typeinfo> // std::type_info in get_deleter
+#include <cstddef> // std::size_t
+
+namespace myboost
+{
+
+class bad_weak_ptr: public std::exception
+{
+public:
+
+ virtual char const * what() const throw()
+ {
+ return "myboost::bad_weak_ptr";
+ }
+};
+
+namespace detail
+{
+
+class sp_counted_base
+{
+private:
+
+ typedef detail::lightweight_mutex mutex_type;
+
+public:
+
+ sp_counted_base(): use_count_(1), weak_count_(1)
+ {
+ }
+
+ virtual ~sp_counted_base() // nothrow
+ {
+ }
+
+ // dispose() is called when use_count_ drops to zero, to release
+ // the resources managed by *this.
+
+ virtual void dispose() = 0; // nothrow
+
+ // destruct() is called when weak_count_ drops to zero.
+
+ virtual void destruct() // nothrow
+ {
+ delete this;
+ }
+
+ virtual void * get_deleter(std::type_info const & ti) = 0;
+
+ void add_ref_copy()
+ {
+ mutex_type::scoped_lock lock(mtx_);
+ ++use_count_;
+ }
+
+ void add_ref_lock()
+ {
+ mutex_type::scoped_lock lock(mtx_);
+ if(use_count_ == 0) myboost::throw_exception(myboost::bad_weak_ptr());
+ ++use_count_;
+ }
+
+ void release() // nothrow
+ {
+ {
+ mutex_type::scoped_lock lock(mtx_);
+ long new_use_count = --use_count_;
+
+ if(new_use_count != 0) return;
+ }
+
+ dispose();
+ weak_release();
+ }
+
+ void weak_add_ref() // nothrow
+ {
+ mutex_type::scoped_lock lock(mtx_);
+ ++weak_count_;
+ }
+
+ void weak_release() // nothrow
+ {
+ long new_weak_count;
+
+ {
+ mutex_type::scoped_lock lock(mtx_);
+ new_weak_count = --weak_count_;
+ }
+
+ if(new_weak_count == 0)
+ {
+ destruct();
+ }
+ }
+
+ long use_count() const // nothrow
+ {
+ mutex_type::scoped_lock lock(mtx_);
+ return use_count_;
+ }
+
+private:
+
+ sp_counted_base(sp_counted_base const &);
+ sp_counted_base & operator= (sp_counted_base const &);
+
+ long use_count_; // #shared
+ long weak_count_; // #weak + (#shared != 0)
+
+ mutable mutex_type mtx_;
+};
+
+template<class P, class D> class sp_counted_base_impl: public sp_counted_base
+{
+private:
+
+ P ptr; // copy constructor must not throw
+ D del; // copy constructor must not throw
+
+ sp_counted_base_impl(sp_counted_base_impl const &);
+ sp_counted_base_impl & operator= (sp_counted_base_impl const &);
+
+ typedef sp_counted_base_impl<P, D> this_type;
+
+public:
+
+ // pre: initial_use_count <= initial_weak_count, d(p) must not throw
+
+ sp_counted_base_impl(P p, D d): ptr(p), del(d)
+ {
+ }
+
+ virtual void dispose() // nothrow
+ {
+ del(ptr);
+ }
+
+ virtual void * get_deleter(std::type_info const & ti)
+ {
+ return ti == typeid(D)? &del: 0;
+ }
+
+ void * operator new(std::size_t)
+ {
+ return std::allocator<this_type>().allocate(1, static_cast<this_type *>(0));
+ }
+
+ void operator delete(void * p)
+ {
+ std::allocator<this_type>().deallocate(static_cast<this_type *>(p), 1);
+ }
+};
+
+class weak_count;
+
+class shared_count
+{
+private:
+
+ sp_counted_base * pi_;
+
+ friend class weak_count;
+
+public:
+
+ shared_count(): pi_(0) // nothrow
+ {
+ }
+
+ template<class P, class D> shared_count(P p, D d): pi_(0)
+ {
+
+ try
+ {
+ pi_ = new sp_counted_base_impl<P, D>(p, d);
+ }
+ catch(...)
+ {
+ d(p); // delete p
+ throw;
+ }
+
+
+ pi_ = new sp_counted_base_impl<P, D>(p, d);
+
+ if(pi_ == 0)
+ {
+ d(p); // delete p
+ myboost::throw_exception(std::bad_alloc());
+ }
+ }
+
+ // auto_ptr<Y> is special cased to provide the strong guarantee
+
+ template<class Y>
+ explicit shared_count(std::auto_ptr<Y> & r): pi_(new sp_counted_base_impl< Y *, checked_deleter<Y> >(r.get(), checked_deleter<Y>()))
+ {
+ r.release();
+ }
+
+ ~shared_count() // nothrow
+ {
+ if(pi_ != 0) pi_->release();
+ }
+
+ shared_count(shared_count const & r): pi_(r.pi_) // nothrow
+ {
+ if(pi_ != 0) pi_->add_ref_copy();
+ }
+
+ explicit shared_count(weak_count const & r); // throws bad_weak_ptr when r.use_count() == 0
+
+ shared_count & operator= (shared_count const & r) // nothrow
+ {
+ sp_counted_base * tmp = r.pi_;
+ if(tmp != 0) tmp->add_ref_copy();
+ if(pi_ != 0) pi_->release();
+ pi_ = tmp;
+
+ return *this;
+ }
+
+ void swap(shared_count & r) // nothrow
+ {
+ sp_counted_base * tmp = r.pi_;
+ r.pi_ = pi_;
+ pi_ = tmp;
+ }
+
+ long use_count() const // nothrow
+ {
+ return pi_ != 0? pi_->use_count(): 0;
+ }
+
+ bool unique() const // nothrow
+ {
+ return use_count() == 1;
+ }
+
+ friend inline bool operator==(shared_count const & a, shared_count const & b)
+ {
+ return a.pi_ == b.pi_;
+ }
+
+ friend inline bool operator<(shared_count const & a, shared_count const & b)
+ {
+ return std::less<sp_counted_base *>()(a.pi_, b.pi_);
+ }
+
+ void * get_deleter(std::type_info const & ti) const
+ {
+ return pi_? pi_->get_deleter(ti): 0;
+ }
+};
+
+class weak_count
+{
+private:
+
+ sp_counted_base * pi_;
+
+ friend class shared_count;
+
+public:
+
+ weak_count(): pi_(0) // nothrow
+ {
+ }
+
+ weak_count(shared_count const & r): pi_(r.pi_) // nothrow
+ {
+ if(pi_ != 0) pi_->weak_add_ref();
+ }
+
+ weak_count(weak_count const & r): pi_(r.pi_) // nothrow
+ {
+ if(pi_ != 0) pi_->weak_add_ref();
+ }
+
+ ~weak_count() // nothrow
+ {
+ if(pi_ != 0) pi_->weak_release();
+ }
+
+ weak_count & operator= (shared_count const & r) // nothrow
+ {
+ sp_counted_base * tmp = r.pi_;
+ if(tmp != 0) tmp->weak_add_ref();
+ if(pi_ != 0) pi_->weak_release();
+ pi_ = tmp;
+
+ return *this;
+ }
+
+ weak_count & operator= (weak_count const & r) // nothrow
+ {
+ sp_counted_base * tmp = r.pi_;
+ if(tmp != 0) tmp->weak_add_ref();
+ if(pi_ != 0) pi_->weak_release();
+ pi_ = tmp;
+
+ return *this;
+ }
+
+ void swap(weak_count & r) // nothrow
+ {
+ sp_counted_base * tmp = r.pi_;
+ r.pi_ = pi_;
+ pi_ = tmp;
+ }
+
+ long use_count() const // nothrow
+ {
+ return pi_ != 0? pi_->use_count(): 0;
+ }
+
+ friend inline bool operator==(weak_count const & a, weak_count const & b)
+ {
+ return a.pi_ == b.pi_;
+ }
+
+ friend inline bool operator<(weak_count const & a, weak_count const & b)
+ {
+ return std::less<sp_counted_base *>()(a.pi_, b.pi_);
+ }
+};
+
+inline shared_count::shared_count(weak_count const & r): pi_(r.pi_)
+{
+ if(pi_ != 0)
+ {
+ pi_->add_ref_lock();
+ }
+ else
+ {
+ myboost::throw_exception(myboost::bad_weak_ptr());
+ }
+}
+
+} // namespace detail
+
+} // namespace myboost
+
+#endif // #ifndef BOOST_DETAIL_SHARED_COUNT_HPP_INCLUDED
diff --git a/ksvg/impl/libs/libtext2path/src/myboost/shared_ptr.hpp b/ksvg/impl/libs/libtext2path/src/myboost/shared_ptr.hpp
new file mode 100644
index 00000000..3f2fe30d
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/myboost/shared_ptr.hpp
@@ -0,0 +1,395 @@
+#ifndef BOOST_SHARED_PTR_HPP_INCLUDED
+#define BOOST_SHARED_PTR_HPP_INCLUDED
+
+// shared_ptr.hpp
+//
+// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+// Copyright (c) 2001, 2002, 2003 Peter Dimov
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+// See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.
+//
+
+#include "myboost/assert.hpp"
+#include "myboost/checked_delete.hpp"
+#include "myboost/throw_exception.hpp"
+#include "myboost/shared_count.hpp"
+
+#include <memory> // for std::auto_ptr
+#include <algorithm> // for std::swap
+#include <functional> // for std::less
+#include <typeinfo> // for std::bad_cast
+#include <iosfwd> // for std::basic_ostream
+
+namespace myboost
+{
+
+template<class T> class weak_ptr;
+template<class T> class enable_shared_from_this;
+
+namespace detail
+{
+
+struct static_cast_tag {};
+struct const_cast_tag {};
+struct dynamic_cast_tag {};
+struct polymorphic_cast_tag {};
+
+template<class T> struct shared_ptr_traits
+{
+ typedef T & reference;
+};
+
+template<> struct shared_ptr_traits<void>
+{
+ typedef void reference;
+};
+
+template<> struct shared_ptr_traits<void const>
+{
+ typedef void reference;
+};
+
+template<> struct shared_ptr_traits<void volatile>
+{
+ typedef void reference;
+};
+
+template<> struct shared_ptr_traits<void const volatile>
+{
+ typedef void reference;
+};
+
+// enable_shared_from_this support
+
+template<class T, class Y> void sp_enable_shared_from_this(myboost::enable_shared_from_this<T> * pe, Y * px, shared_count const & pn)
+{
+ if(pe != 0) pe->_internal_weak_this._internal_assign(px, pn);
+}
+
+inline void sp_enable_shared_from_this(void const *, void const *, shared_count const &)
+{
+}
+
+} // namespace detail
+
+
+//
+// shared_ptr
+//
+// An enhanced relative of scoped_ptr with reference counted copy semantics.
+// The object pointed to is deleted when the last shared_ptr pointing to it
+// is destroyed or reset.
+//
+
+template<class T> class shared_ptr
+{
+private:
+
+ // Borland 5.5.1 specific workaround
+ typedef shared_ptr<T> this_type;
+
+public:
+
+ typedef T element_type;
+ typedef T value_type;
+ typedef T * pointer;
+ typedef typename detail::shared_ptr_traits<T>::reference reference;
+
+ shared_ptr(): px(0), pn() // never throws in 1.30+
+ {
+ }
+
+ template<class Y>
+ explicit shared_ptr(Y * p): px(p), pn(p, checked_deleter<Y>()) // Y must be complete
+ {
+ detail::sp_enable_shared_from_this(p, p, pn);
+ }
+
+ //
+ // Requirements: D's copy constructor must not throw
+ //
+ // shared_ptr will release p by calling d(p)
+ //
+
+ template<class Y, class D> shared_ptr(Y * p, D d): px(p), pn(p, d)
+ {
+ detail::sp_enable_shared_from_this(p, p, pn);
+ }
+
+// generated copy constructor, assignment, destructor are fine...
+// except that Borland C++ has a bug, and g++ with -Wsynth warns
+ shared_ptr & operator=(shared_ptr const & r) // never throws
+ {
+ px = r.px;
+ pn = r.pn; // shared_count::op= doesn't throw
+ return *this;
+ }
+
+ template<class Y>
+ explicit shared_ptr(weak_ptr<Y> const & r): pn(r.pn) // may throw
+ {
+ // it is now safe to copy r.px, as pn(r.pn) did not throw
+ px = r.px;
+ }
+
+ template<class Y>
+ shared_ptr(shared_ptr<Y> const & r): px(r.px), pn(r.pn) // never throws
+ {
+ }
+
+ template<class Y>
+ shared_ptr(shared_ptr<Y> const & r, detail::static_cast_tag): px(static_cast<element_type *>(r.px)), pn(r.pn)
+ {
+ }
+
+ template<class Y>
+ shared_ptr(shared_ptr<Y> const & r, detail::const_cast_tag): px(const_cast<element_type *>(r.px)), pn(r.pn)
+ {
+ }
+
+ template<class Y>
+ shared_ptr(shared_ptr<Y> const & r, detail::dynamic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)
+ {
+ if(px == 0) // need to allocate new counter -- the cast failed
+ {
+ pn = detail::shared_count();
+ }
+ }
+
+ template<class Y>
+ shared_ptr(shared_ptr<Y> const & r, detail::polymorphic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)
+ {
+ if(px == 0)
+ {
+ myboost::throw_exception(std::bad_cast());
+ }
+ }
+
+ template<class Y>
+ explicit shared_ptr(std::auto_ptr<Y> & r): px(r.get()), pn()
+ {
+ Y * tmp = r.get();
+ pn = detail::shared_count(r);
+ detail::sp_enable_shared_from_this(tmp, tmp, pn);
+ }
+
+ template<class Y>
+ shared_ptr & operator=(shared_ptr<Y> const & r) // never throws
+ {
+ px = r.px;
+ pn = r.pn; // shared_count::op= doesn't throw
+ return *this;
+ }
+
+ template<class Y>
+ shared_ptr & operator=(std::auto_ptr<Y> & r)
+ {
+ this_type(r).swap(*this);
+ return *this;
+ }
+
+ void reset() // never throws in 1.30+
+ {
+ this_type().swap(*this);
+ }
+
+ template<class Y> void reset(Y * p) // Y must be complete
+ {
+ BOOST_ASSERT(p == 0 || p != px); // catch self-reset errors
+ this_type(p).swap(*this);
+ }
+
+ template<class Y, class D> void reset(Y * p, D d)
+ {
+ this_type(p, d).swap(*this);
+ }
+
+ reference operator* () const // never throws
+ {
+ BOOST_ASSERT(px != 0);
+ return *px;
+ }
+
+ T * operator-> () const // never throws
+ {
+ BOOST_ASSERT(px != 0);
+ return px;
+ }
+
+ T * get() const // never throws
+ {
+ return px;
+ }
+
+ typedef T * (this_type::*unspecified_bool_type)() const;
+
+ operator unspecified_bool_type() const // never throws
+ {
+ return px == 0? 0: &this_type::get;
+ }
+
+ // operator! is redundant, but some compilers need it
+
+ bool operator! () const // never throws
+ {
+ return px == 0;
+ }
+
+ bool unique() const // never throws
+ {
+ return pn.unique();
+ }
+
+ long use_count() const // never throws
+ {
+ return pn.use_count();
+ }
+
+ void swap(shared_ptr<T> & other) // never throws
+ {
+ std::swap(px, other.px);
+ pn.swap(other.pn);
+ }
+
+ template<class Y> bool _internal_less(shared_ptr<Y> const & rhs) const
+ {
+ return pn < rhs.pn;
+ }
+
+ void * _internal_get_deleter(std::type_info const & ti) const
+ {
+ return pn.get_deleter(ti);
+ }
+
+// Tasteless as this may seem, making all members public allows member templates
+// to work in the absence of member template friends. (Matthew Langston)
+
+# if __GNUC__ >= 2 && __GNUC_MINOR__ >= 97
+private:
+
+ template<class Y> friend class shared_ptr;
+ template<class Y> friend class weak_ptr;
+#endif
+
+ T * px; // contained pointer
+ detail::shared_count pn; // reference counter
+
+}; // shared_ptr
+
+template<class T, class U> inline bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b)
+{
+ return a.get() == b.get();
+}
+
+template<class T, class U> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b)
+{
+ return a.get() != b.get();
+}
+
+#if __GNUC__ == 2 && __GNUC_MINOR__ <= 96
+
+// Resolve the ambiguity between our op!= and the one in rel_ops
+
+template<class T> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<T> const & b)
+{
+ return a.get() != b.get();
+}
+
+#endif
+
+template<class T, class U> inline bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b)
+{
+ return a._internal_less(b);
+}
+
+template<class T> inline void swap(shared_ptr<T> & a, shared_ptr<T> & b)
+{
+ a.swap(b);
+}
+
+template<class T, class U> shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r)
+{
+ return shared_ptr<T>(r, detail::static_cast_tag());
+}
+
+template<class T, class U> shared_ptr<T> const_pointer_cast(shared_ptr<U> const & r)
+{
+ return shared_ptr<T>(r, detail::const_cast_tag());
+}
+
+template<class T, class U> shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r)
+{
+ return shared_ptr<T>(r, detail::dynamic_cast_tag());
+}
+
+// shared_*_cast names are deprecated. Use *_pointer_cast instead.
+
+template<class T, class U> shared_ptr<T> shared_static_cast(shared_ptr<U> const & r)
+{
+ return shared_ptr<T>(r, detail::static_cast_tag());
+}
+
+template<class T, class U> shared_ptr<T> shared_dynamic_cast(shared_ptr<U> const & r)
+{
+ return shared_ptr<T>(r, detail::dynamic_cast_tag());
+}
+
+template<class T, class U> shared_ptr<T> shared_polymorphic_cast(shared_ptr<U> const & r)
+{
+ return shared_ptr<T>(r, detail::polymorphic_cast_tag());
+}
+
+template<class T, class U> shared_ptr<T> shared_polymorphic_downcast(shared_ptr<U> const & r)
+{
+ BOOST_ASSERT(dynamic_cast<T *>(r.get()) == r.get());
+ return shared_static_cast<T>(r);
+}
+
+// get_pointer() enables boost::mem_fn to recognize shared_ptr
+
+template<class T> inline T * get_pointer(shared_ptr<T> const & p)
+{
+ return p.get();
+}
+
+// operator<<
+
+
+template<class Y> std::ostream & operator<< (std::ostream & os, shared_ptr<Y> const & p)
+{
+ os << p.get();
+ return os;
+}
+
+
+// get_deleter (experimental)
+
+#if (defined(__GNUC__) && (__GNUC__ < 3)) || (defined(__EDG_VERSION__) && (__EDG_VERSION__ <= 238))
+
+// g++ 2.9x doesn't allow static_cast<X const *>(void *)
+// apparently EDG 2.38 also doesn't accept it
+
+template<class D, class T> D * get_deleter(shared_ptr<T> const & p)
+{
+ void const * q = p._internal_get_deleter(typeid(D));
+ return const_cast<D *>(static_cast<D const *>(q));
+}
+
+#else
+
+template<class D, class T> D * get_deleter(shared_ptr<T> const & p)
+{
+ return static_cast<D *>(p._internal_get_deleter(typeid(D)));
+}
+
+#endif
+
+} // namespace boost
+
+
+#endif // #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
diff --git a/ksvg/impl/libs/libtext2path/src/myboost/throw_exception.hpp b/ksvg/impl/libs/libtext2path/src/myboost/throw_exception.hpp
new file mode 100644
index 00000000..dd32ec43
--- /dev/null
+++ b/ksvg/impl/libs/libtext2path/src/myboost/throw_exception.hpp
@@ -0,0 +1,30 @@
+#ifndef BOOST_THROW_EXCEPTION_HPP_INCLUDED
+#define BOOST_THROW_EXCEPTION_HPP_INCLUDED
+
+
+//
+// boost/throw_exception.hpp
+//
+// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+// http://www.boost.org/libs/utility/throw_exception.html
+//
+
+# include <exception>
+
+namespace myboost
+{
+
+template<class E> void throw_exception(E const & e)
+{
+ throw e;
+}
+
+} // namespace myboost
+
+#endif // #ifndef BOOST_THROW_EXCEPTION_HPP_INCLUDED
diff --git a/ksvg/impl/libs/xrgbrender/Makefile.am b/ksvg/impl/libs/xrgbrender/Makefile.am
new file mode 100644
index 00000000..1e9ebcc1
--- /dev/null
+++ b/ksvg/impl/libs/xrgbrender/Makefile.am
@@ -0,0 +1,5 @@
+INCLUDES = $(all_includes)
+
+noinst_LTLIBRARIES = libksvgxrgbrender.la
+
+libksvgxrgbrender_la_SOURCES = gdk-pixbuf-xlib.c gdk-pixbuf-xlib-drawable.c gdk-pixbuf-xlibrgb.c
diff --git a/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib-drawable.c b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib-drawable.c
new file mode 100644
index 00000000..01f60976
--- /dev/null
+++ b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib-drawable.c
@@ -0,0 +1,1137 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* GdkPixbuf library - convert X drawable information to RGB
+ *
+ * Copyright (C) 1999 Michael Zucchi
+ *
+ * Authors: Michael Zucchi <zucchi@zedzone.mmc.com.au>
+ * Cody Russell <bratsche@dfw.net>
+ * Federico Mena-Quintero <federico@gimp.org>
+ *
+ * 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; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/* Ported to Xlib by John Harper <john@dcs.warwick.ac.uk> */
+
+
+#include <config.h>
+#include <stdio.h>
+#include <string.h>
+#include "gdk-pixbuf-xlib-private.h"
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#if (X_BYTE_ORDER == X_LITTLE_ENDIAN)
+#define LITTLE
+#endif
+#define d(x)
+
+
+
+static unsigned int mask_table[] = {
+ 0x00000000, 0x00000001, 0x00000003, 0x00000007,
+ 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
+ 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
+ 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
+ 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
+ 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
+ 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
+ 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
+ 0xffffffff
+};
+
+
+/* color handling */
+
+typedef struct xlib_colormap_struct xlib_colormap;
+struct xlib_colormap_struct {
+ int size;
+ XColor *colors;
+ Visual *visual;
+ Colormap colormap;
+};
+
+
+/* from gdkvisual.c */
+static void
+visual_decompose_mask (unsigned long mask,
+ int *shift,
+ int *prec)
+{
+ *shift = 0;
+ *prec = 0;
+
+ while (!(mask & 0x1)) {
+ (*shift)++;
+ mask >>= 1;
+ }
+
+ while (mask & 0x1) {
+ (*prec)++;
+ mask >>= 1;
+ }
+}
+
+static int x_error;
+
+static int
+handle_x_error (Display *dpy, XErrorEvent *ev)
+{
+ x_error = 1;
+ return 0;
+}
+
+static int
+drawable_is_pixmap (Drawable d)
+{
+ /* copied from Imlib */
+
+ XErrorHandler errh;
+ XWindowAttributes wa;
+ int is_pixmap;
+
+ errh = XSetErrorHandler (handle_x_error);
+ x_error = 0;
+ XGetWindowAttributes (gdk_pixbuf_dpy, d, &wa);
+ XSync (gdk_pixbuf_dpy, False);
+ is_pixmap = x_error;
+ XSetErrorHandler (errh);
+
+ return is_pixmap;
+}
+
+
+
+/*
+ convert 1 bits-pixel data
+ no alpha
+*/
+static void
+rgb1 (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+ unsigned char *s;
+ register unsigned char data;
+ unsigned char *o;
+ unsigned char *srow = image->data, *orow = pixels;
+
+ d (printf ("1 bits/pixel\n"));
+
+ /* convert upto 8 pixels/time */
+ /* its probably not worth trying to make this run very fast, who uses
+ 1 bit displays anymore? */
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (yy = 0; yy < height; yy++) {
+ s = srow;
+ o = orow;
+
+ for (xx = 0; xx < width; xx ++) {
+ data = srow[xx >> 3] >> (7 - (xx & 7)) & 1;
+ *o++ = colormap->colors[data].red;
+ *o++ = colormap->colors[data].green;
+ *o++ = colormap->colors[data].blue;
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 1 bits/pixel data
+ with alpha
+*/
+static void
+rgb1a (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+ unsigned char *s;
+ register unsigned char data;
+ unsigned char *o;
+ unsigned char *srow = image->data, *orow = pixels;
+ unsigned int remap[2];
+
+ d (printf ("1 bits/pixel\n"));
+
+ /* convert upto 8 pixels/time */
+ /* its probably not worth trying to make this run very fast, who uses
+ 1 bit displays anymore? */
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (xx = 0; xx < 2; xx++) {
+#ifdef LITTLE
+ remap[xx] = 0xff000000
+ | colormap->colors[xx].blue << 16
+ | colormap->colors[xx].green << 8
+ | colormap->colors[xx].red;
+#else
+ remap[xx] = 0xff
+ | colormap->colors[xx].red << 24
+ | colormap->colors[xx].green << 16
+ | colormap->colors[xx].blue << 8;
+#endif
+ }
+
+ for (yy = 0; yy < height; yy++) {
+ s = srow;
+ o = orow;
+
+ for (xx = 0; xx < width; xx ++) {
+ data = srow[xx >> 3] >> (7 - (xx & 7)) & 1;
+ *o++ = remap[data];
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 8 bits/pixel data
+ no alpha
+*/
+static void
+rgb8 (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+ unsigned int mask;
+ register unsigned int data;
+ unsigned char *srow = image->data, *orow = pixels;
+ register unsigned char *s;
+ register unsigned char *o;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ d (printf ("8 bit, no alpha output\n"));
+
+ mask = mask_table[image->depth];
+
+ for (yy = 0; yy < height; yy++) {
+ s = srow;
+ o = orow;
+ for (xx = 0; xx < width; xx++) {
+ data = *s++ & mask;
+ *o++ = colormap->colors[data].red;
+ *o++ = colormap->colors[data].green;
+ *o++ = colormap->colors[data].blue;
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 8 bits/pixel data
+ with alpha
+*/
+static void
+rgb8a (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+ unsigned int mask;
+ register unsigned int data;
+ unsigned int remap[256];
+ register unsigned char *s; /* read 2 pixels at once */
+ register unsigned int *o;
+ unsigned char *srow = image->data, *orow = pixels;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ d (printf ("8 bit, with alpha output\n"));
+
+ mask = mask_table[image->depth];
+
+ for (xx = 0; xx < colormap->size; xx++) {
+#ifdef LITTLE
+ remap[xx] = 0xff000000
+ | colormap->colors[xx].blue << 16
+ | colormap->colors[xx].green << 8
+ | colormap->colors[xx].red;
+#else
+ remap[xx] = 0xff
+ | colormap->colors[xx].red << 24
+ | colormap->colors[xx].green << 16
+ | colormap->colors[xx].blue << 8;
+#endif
+ }
+
+ for (yy = 0; yy < height; yy++) {
+ s = srow;
+ o = (unsigned int *) orow;
+ for (xx = 0; xx < width; xx ++) {
+ data = *s++ & mask;
+ *o++ = remap[data];
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 16 bits/pixel data
+ no alpha
+ data in lsb format
+*/
+static void
+rgb565lsb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+#ifdef LITTLE
+ register unsigned int *s; /* read 2 pixels at once */
+#else
+ register unsigned char *s; /* read 2 pixels at once */
+#endif
+ register unsigned short *o;
+ unsigned char *srow = image->data, *orow = pixels;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (yy = 0; yy < height; yy++) {
+#ifdef LITTLE
+ s = (unsigned int *) srow;
+#else
+ s = srow;
+#endif
+ o = (unsigned short *) orow;
+ for (xx = 1; xx < width; xx += 2) {
+ register unsigned int data;
+#ifdef LITTLE
+ data = *s++;
+ *o++ = (data & 0xf800) >> 8 | (data & 0xe000) >> 13
+ | (data & 0x7e0) << 5 | (data & 0x600) >> 1;
+ *o++ = (data & 0x1f) << 3 | (data & 0x1c) >> 2
+ | (data & 0xf8000000) >> 16 | (data & 0xe0000000) >> 21;
+ *o++ = (data & 0x7e00000) >> 19 | (data & 0x6000000) >> 25
+ | (data & 0x1f0000) >> 5 | (data & 0x1c0000) >> 10;
+#else
+ /* swap endianness first */
+ data = s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24;
+ s += 4;
+ *o++ = (data & 0xf800) | (data & 0xe000) >> 5
+ | (data & 0x7e0) >> 3 | (data & 0x600) >> 9;
+ *o++ = (data & 0x1f) << 11 | (data & 0x1c) << 6
+ | (data & 0xf8000000) >> 24 | (data & 0xe0000000) >> 29;
+ *o++ = (data & 0x7e00000) >> 11 | (data & 0x6000000) >> 17
+ | (data & 0x1f0000) >> 13 | (data & 0x1c0000) >> 18;
+#endif
+ }
+ /* check for last remaining pixel */
+ if (width & 1) {
+ register unsigned short data;
+#ifdef LITTLE
+ data = *((short *) s);
+#else
+ data = *((short *) s);
+ data = ((data >> 8) & 0xff) | ((data & 0xff) << 8);
+#endif
+ ((char *) o)[0] = ((data >> 8) & 0xf8) | ((data >> 13) & 0x7);
+ ((char *) o)[1] = ((data >> 3) & 0xfc) | ((data >> 9) & 0x3);
+ ((char *) o)[2] = ((data << 3) & 0xf8) | ((data >> 2) & 0x7);
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 16 bits/pixel data
+ no alpha
+ data in msb format
+*/
+static void
+rgb565msb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+#ifdef LITTLE
+ register unsigned char *s; /* need to swap data order */
+#else
+ register unsigned int *s; /* read 2 pixels at once */
+#endif
+ register unsigned short *o;
+ unsigned char *srow = image->data, *orow = pixels;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (yy = 0; yy < height; yy++) {
+#ifdef LITTLE
+ s = srow;
+#else
+ s = (unsigned int *) srow;
+#endif
+ o = (unsigned short *) orow;
+ for (xx = 1; xx < width; xx += 2) {
+ register unsigned int data;
+#ifdef LITTLE
+ /* swap endianness first */
+ data = s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24;
+ s += 4;
+ *o++ = (data & 0xf800) >> 8 | (data & 0xe000) >> 13
+ | (data & 0x7e0) << 5 | (data & 0x600) >> 1;
+ *o++ = (data & 0x1f) << 3 | (data & 0x1c) >> 2
+ | (data & 0xf8000000) >> 16 | (data & 0xe0000000) >> 21;
+ *o++ = (data & 0x7e00000) >> 19 | (data & 0x6000000) >> 25
+ | (data & 0x1f0000) >> 5 | (data & 0x1c0000) >> 10;
+#else
+ data = *s++;
+ *o++ = (data & 0xf800) | (data & 0xe000) >> 5
+ | (data & 0x7e0) >> 3 | (data & 0x600) >> 9;
+ *o++ = (data & 0x1f) << 11 | (data & 0x1c) << 6
+ | (data & 0xf8000000) >> 24 | (data & 0xe0000000) >> 29;
+ *o++ = (data & 0x7e00000) >> 11 | (data & 0x6000000) >> 17
+ | (data & 0x1f0000) >> 13 | (data & 0x1c0000) >> 18;
+#endif
+ }
+ /* check for last remaining pixel */
+ if (width & 1) {
+ register unsigned short data;
+#ifdef LITTLE
+ data = *((short *) s);
+ data = ((data >> 8) & 0xff) | ((data & 0xff) << 8);
+#else
+ data = *((short *) s);
+#endif
+ ((char *) o)[0] = ((data >> 8) & 0xf8) | ((data >> 13) & 0x7);
+ ((char *) o)[1] = ((data >> 3) & 0xfc) | ((data >> 9) & 0x3);
+ ((char *) o)[2] = ((data << 3) & 0xf8) | ((data >> 2) & 0x7);
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 16 bits/pixel data
+ with alpha
+ data in lsb format
+*/
+static void
+rgb565alsb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+#ifdef LITTLE
+ register unsigned short *s; /* read 1 pixels at once */
+#else
+ register unsigned char *s;
+#endif
+ register unsigned int *o;
+
+ unsigned char *srow = image->data, *orow = pixels;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (yy = 0; yy < height; yy++) {
+#ifdef LITTLE
+ s = (unsigned short *) srow;
+#else
+ s = (unsigned char *) srow;
+#endif
+ o = (unsigned int *) orow;
+ for (xx = 0; xx < width; xx ++) {
+ register unsigned int data;
+ /* rrrrrggg gggbbbbb -> rrrrrRRR ggggggGG bbbbbBBB aaaaaaaa */
+ /* little endian: aaaaaaaa bbbbbBBB ggggggGG rrrrrRRR */
+#ifdef LITTLE
+ data = *s++;
+ *o++ = (data & 0xf800) >> 8 | (data & 0xe000) >> 13
+ | (data & 0x7e0) << 5 | (data & 0x600) >> 1
+ | (data & 0x1f) << 19 | (data & 0x1c) << 14
+ | 0xff000000;
+#else
+ /* swap endianness first */
+ data = s[0] | s[1] << 8;
+ s += 2;
+ *o++ = (data & 0xf800) << 16 | (data & 0xe000) << 11
+ | (data & 0x7e0) << 13 | (data & 0x600) << 7
+ | (data & 0x1f) << 11 | (data & 0x1c) << 6
+ | 0xff;
+#endif
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 16 bits/pixel data
+ with alpha
+ data in msb format
+*/
+static void
+rgb565amsb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+#ifdef LITTLE
+ register unsigned char *s;
+#else
+ register unsigned short *s; /* read 1 pixels at once */
+#endif
+ register unsigned int *o;
+
+ unsigned char *srow = image->data, *orow = pixels;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (yy = 0; yy < height; yy++) {
+ s = srow;
+ o = (unsigned int *) orow;
+ for (xx = 0; xx < width; xx ++) {
+ register unsigned int data;
+ /* rrrrrggg gggbbbbb -> rrrrrRRR gggggg00 bbbbbBBB aaaaaaaa */
+ /* little endian: aaaaaaaa bbbbbBBB gggggg00 rrrrrRRR */
+#ifdef LITTLE
+ /* swap endianness first */
+ data = s[0] | s[1] << 8;
+ s += 2;
+ *o++ = (data & 0xf800) >> 8 | (data & 0xe000) >> 13
+ | (data & 0x7e0) << 5 | (data & 0x600) >> 1
+ | (data & 0x1f) << 19 | (data & 0x1c) << 14
+ | 0xff000000;
+#else
+ data = *s++;
+ *o++ = (data & 0xf800) << 16 | (data & 0xe000) << 11
+ | (data & 0x7e0) << 13 | (data & 0x600) << 7
+ | (data & 0x1f) << 11 | (data & 0x1c) << 6
+ | 0xff;
+#endif
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 15 bits/pixel data
+ no alpha
+ data in lsb format
+*/
+static void
+rgb555lsb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+#ifdef LITTLE
+ register unsigned int *s; /* read 2 pixels at once */
+#else
+ register unsigned char *s; /* read 2 pixels at once */
+#endif
+ register unsigned short *o;
+ unsigned char *srow = image->data, *orow = pixels;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (yy = 0; yy < height; yy++) {
+#ifdef LITTLE
+ s = (unsigned int *) srow;
+#else
+ s = srow;
+#endif
+ o = (unsigned short *) orow;
+ for (xx = 1; xx < width; xx += 2) {
+ register unsigned int data;
+#ifdef LITTLE
+ data = *s++;
+ *o++ = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12
+ | (data & 0x3e0) << 6 | (data & 0x380) << 1;
+ *o++ = (data & 0x1f) << 3 | (data & 0x1c) >> 2
+ | (data & 0x7c000000) >> 15 | (data & 0x70000000) >> 20;
+ *o++ = (data & 0x3e00000) >> 18 | (data & 0x3800000) >> 23
+ | (data & 0x1f0000) >> 5 | (data & 0x1c0000) >> 10;
+#else
+ /* swap endianness first */
+ data = s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24;
+ s += 4;
+ *o++ = (data & 0x7c00) << 1 | (data & 0x7000) >> 4
+ | (data & 0x3e0) >> 2 | (data & 0x380) >> 7;
+ *o++ = (data & 0x1f) << 11 | (data & 0x1c) << 6
+ | (data & 0x7c000000) >> 23 | (data & 0x70000000) >> 28;
+ *o++ = (data & 0x3e00000) >> 10 | (data & 0x3800000) >> 15
+ | (data & 0x1f0000) >> 13 | (data & 0x1c0000) >> 18;
+#endif
+ }
+ /* check for last remaining pixel */
+ if (width & 1) {
+ register unsigned short data;
+#ifdef LITTLE
+ data = *((short *) s);
+#else
+ data = *((short *) s);
+ data = ((data >> 8) & 0xff) | ((data & 0xff) << 8);
+#endif
+ ((char *) o)[0] = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12;
+ ((char *) o)[1] = (data & 0x3e0) >> 2 | (data & 0x380) >> 7;
+ ((char *) o)[2] = (data & 0x1f) << 3 | (data & 0x1c) >> 2;
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 15 bits/pixel data
+ no alpha
+ data in msb format
+*/
+static void
+rgb555msb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+#ifdef LITTLE
+ register unsigned char *s; /* read 2 pixels at once */
+#else
+ register unsigned int *s; /* read 2 pixels at once */
+#endif
+ register unsigned short *o;
+ unsigned char *srow = image->data, *orow = pixels;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (yy = 0; yy < height; yy++) {
+ s = srow;
+ o = (unsigned short *) orow;
+ for (xx = 1; xx < width; xx += 2) {
+ register unsigned int data;
+#ifdef LITTLE
+ /* swap endianness first */
+ data = s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24;
+ s += 4;
+ *o++ = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12
+ | (data & 0x3e0) << 6 | (data & 0x380) << 1;
+ *o++ = (data & 0x1f) << 3 | (data & 0x1c) >> 2
+ | (data & 0x7c000000) >> 15 | (data & 0x70000000) >> 20;
+ *o++ = (data & 0x3e00000) >> 18 | (data & 0x3800000) >> 23
+ | (data & 0x1f0000) >> 5 | (data & 0x1c0000) >> 10;
+#else
+ data = *s++;
+ *o++ = (data & 0x7c00) << 1 | (data & 0x7000) >> 4
+ | (data & 0x3e0) >> 2 | (data & 0x380) >> 7;
+ *o++ = (data & 0x1f) << 11 | (data & 0x1c) << 6
+ | (data & 0x7c000000) >> 23 | (data & 0x70000000) >> 28;
+ *o++ = (data & 0x3e00000) >> 10 | (data & 0x3800000) >> 15
+ | (data & 0x1f0000) >> 13 | (data & 0x1c0000) >> 18;
+#endif
+ }
+ /* check for last remaining pixel */
+ if (width & 1) {
+ register unsigned short data;
+#ifdef LITTLE
+ data = *((short *) s);
+ data = ((data >> 8) & 0xff) | ((data & 0xff) << 8);
+#else
+ data = *((short *) s);
+#endif
+ ((char *) o)[0] = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12;
+ ((char *) o)[1] = (data & 0x3e0) >> 2 | (data & 0x380) >> 7;
+ ((char *) o)[2] = (data & 0x1f) << 3 | (data & 0x1c) >> 2;
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 15 bits/pixel data
+ with alpha
+ data in lsb format
+*/
+static void
+rgb555alsb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+#ifdef LITTLE
+ register unsigned short *s; /* read 1 pixels at once */
+#else
+ register unsigned char *s;
+#endif
+ register unsigned int *o;
+
+ unsigned char *srow = image->data, *orow = pixels;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (yy = 0; yy < height; yy++) {
+#ifdef LITTLE
+ s = (unsigned short *) srow;
+#else
+ s = srow;
+#endif
+ o = (unsigned int *) orow;
+ for (xx = 0; xx < width; xx++) {
+ register unsigned int data;
+ /* rrrrrggg gggbbbbb -> rrrrrRRR gggggGGG bbbbbBBB aaaaaaaa */
+ /* little endian: aaaaaaaa bbbbbBBB gggggGGG rrrrrRRR */
+#ifdef LITTLE
+ data = *s++;
+ *o++ = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12
+ | (data & 0x3e0) << 6 | (data & 0x380) << 1
+ | (data & 0x1f) << 19 | (data & 0x1c) << 14
+ | 0xff000000;
+#else
+ /* swap endianness first */
+ data = s[0] | s[1] << 8;
+ s += 2;
+ *o++ = (data & 0x7c00) << 17 | (data & 0x7000) << 12
+ | (data & 0x3e0) << 14 | (data & 0x380) << 9
+ | (data & 0x1f) << 11 | (data & 0x1c) << 6
+ | 0xff;
+#endif
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ convert 15 bits/pixel data
+ with alpha
+ data in msb format
+*/
+static void
+rgb555amsb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+#ifdef LITTLE
+ register unsigned short *s; /* read 1 pixels at once */
+#else
+ register unsigned char *s;
+#endif
+ register unsigned int *o;
+
+ unsigned char *srow = image->data, *orow = pixels;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (yy = 0; yy < height; yy++) {
+#ifdef LITTLE
+ s = (unsigned short *) srow;
+#else
+ s = srow;
+#endif
+ o = (unsigned int *) orow;
+ for (xx = 0; xx < width; xx++) {
+ register unsigned int data;
+ /* rrrrrggg gggbbbbb -> rrrrrRRR gggggGGG bbbbbBBB aaaaaaaa */
+ /* little endian: aaaaaaaa bbbbbBBB gggggGGG rrrrrRRR */
+#ifdef LITTLE
+ /* swap endianness first */
+ data = s[0] | s[1] << 8;
+ s += 2;
+ *o++ = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12
+ | (data & 0x3e0) << 6 | (data & 0x380) << 1
+ | (data & 0x1f) << 19 | (data & 0x1c) << 14
+ | 0xff000000;
+#else
+ data = *s++;
+ *o++ = (data & 0x7c00) << 17 | (data & 0x7000) << 12
+ | (data & 0x3e0) << 14 | (data & 0x380) << 9
+ | (data & 0x1f) << 11 | (data & 0x1c) << 6
+ | 0xff;
+#endif
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+
+static void
+rgb888alsb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+ unsigned char *s; /* for byte order swapping */
+ unsigned char *o;
+ unsigned char *srow = image->data, *orow = pixels;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ d (printf ("32 bits/pixel with alpha\n"));
+
+ /* lsb data */
+ for (yy = 0; yy < height; yy++) {
+ s = srow;
+ o = orow;
+ for (xx = 0; xx < width; xx++) {
+ *o++ = s[2];
+ *o++ = s[1];
+ *o++ = s[0];
+ *o++ = 0xff;
+ s += 4;
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+static void
+rgb888lsb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+ unsigned char *srow = image->data, *orow = pixels;
+ unsigned char *o, *s;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ d (printf ("32 bit, lsb, no alpha\n"));
+
+ for (yy = 0; yy < height; yy++) {
+ s = srow;
+ o = orow;
+ for (xx = 0; xx < width; xx++) {
+ *o++ = s[2];
+ *o++ = s[1];
+ *o++ = s[0];
+ s += 4;
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+static void
+rgb888amsb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+ unsigned char *srow = image->data, *orow = pixels;
+#ifdef LITTLE
+ unsigned int *o;
+ unsigned int *s;
+#else
+ unsigned char *s; /* for byte order swapping */
+ unsigned char *o;
+#endif
+
+ d (printf ("32 bit, msb, with alpha\n"));
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ /* msb data */
+ for (yy = 0; yy < height; yy++) {
+#ifdef LITTLE
+ s = (unsigned int *) srow;
+ o = (unsigned int *) orow;
+#else
+ s = srow;
+ o = orow;
+#endif
+ for (xx = 0; xx < width; xx++) {
+#ifdef LITTLE
+ *o++ = s[1];
+ *o++ = s[2];
+ *o++ = s[3];
+ *o++ = 0xff;
+ s += 4;
+#else
+ *o++ = (*s << 8) | 0xff; /* untested */
+ s++;
+#endif
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+static void
+rgb888msb (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *colormap)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+
+ unsigned char *srow = image->data, *orow = pixels;
+ unsigned char *s;
+ unsigned char *o;
+
+ d (printf ("32 bit, msb, no alpha\n"));
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+
+ for (yy = 0; yy < height; yy++) {
+ s = srow;
+ o = orow;
+ for (xx = 0; xx < width; xx++) {
+ *o++ = s[1];
+ *o++ = s[2];
+ *o++ = s[3];
+ s += 4;
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+/*
+ This should work correctly with any display/any endianness, but will probably
+ run quite slow
+*/
+static void
+convert_real_slow (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *cmap, int alpha)
+{
+ int xx, yy;
+ int width, height;
+ int bpl;
+ unsigned char *srow = image->data, *orow = pixels;
+ unsigned char *s;
+ unsigned char *o;
+ unsigned int pixel;
+ Visual *v;
+ unsigned char component;
+ int i;
+ int red_shift, red_prec, green_shift, green_prec, blue_shift, blue_prec;
+
+ width = image->width;
+ height = image->height;
+ bpl = image->bytes_per_line;
+ v = cmap->visual;
+
+ visual_decompose_mask (v->red_mask, &red_shift, &red_prec);
+ visual_decompose_mask (v->green_mask, &green_shift, &green_prec);
+ visual_decompose_mask (v->blue_mask, &blue_shift, &blue_prec);
+
+ d(printf("rgb mask/shift/prec = %x:%x:%x %d:%d:%d %d:%d:%d\n",
+ v->red_mask, v->green_mask, v->blue_mask,
+ red_shift, green_shift, blue_shift,
+ red_prec, green_prec, blue_prec));
+
+ for (yy = 0; yy < height; yy++) {
+ s = srow;
+ o = orow;
+ for (xx = 0; xx < width; xx++) {
+ pixel = XGetPixel (image, xx, yy);
+ switch (v->class) {
+ /* I assume this is right for static & greyscale's too? */
+ case StaticGray:
+ case GrayScale:
+ case StaticColor:
+ case PseudoColor:
+ *o++ = cmap->colors[pixel].red;
+ *o++ = cmap->colors[pixel].green;
+ *o++ = cmap->colors[pixel].blue;
+ break;
+ case TrueColor:
+ /* This is odd because it must sometimes shift left (otherwise
+ I'd just shift >> (*_shift - 8 + *_prec + <0-7>). This logic
+ should work for all bit sizes/shifts/etc. */
+ component = 0;
+ for (i = 24; i < 32; i += red_prec)
+ component |= ((pixel & v->red_mask) << (32 - red_shift - red_prec)) >> i;
+ *o++ = component;
+ component = 0;
+ for (i = 24; i < 32; i += green_prec)
+ component |= ((pixel & v->green_mask) << (32 - green_shift - green_prec)) >> i;
+ *o++ = component;
+ component = 0;
+ for (i = 24; i < 32; i += blue_prec)
+ component |= ((pixel & v->blue_mask) << (32 - blue_shift - blue_prec)) >> i;
+ *o++ = component;
+ break;
+ case DirectColor:
+ *o++ = cmap->colors[((pixel & v->red_mask) << (32 - red_shift - red_prec)) >> 24].red;
+ *o++ = cmap->colors[((pixel & v->green_mask) << (32 - green_shift - green_prec)) >> 24].green;
+ *o++ = cmap->colors[((pixel & v->blue_mask) << (32 - blue_shift - blue_prec)) >> 24].blue;
+ break;
+ }
+ if (alpha)
+ *o++ = 0xff;
+ }
+ srow += bpl;
+ orow += rowstride;
+ }
+}
+
+typedef void (* cfunc) (XImage *image, unsigned char *pixels, int rowstride, xlib_colormap *cmap);
+
+static cfunc convert_map[] = {
+ rgb1,rgb1,rgb1a,rgb1a,
+ rgb8,rgb8,rgb8a,rgb8a,
+ rgb555lsb,rgb555msb,rgb555alsb,rgb555amsb,
+ rgb565lsb,rgb565msb,rgb565alsb,rgb565amsb,
+ rgb888lsb,rgb888msb,rgb888alsb,rgb888amsb
+};
+
+/*
+ perform actual conversion
+
+ If we can, try and use the optimised code versions, but as a default
+ fallback, and always for direct colour, use the generic/slow but complete
+ conversion function.
+*/
+static void
+rgbconvert (XImage *image, unsigned char *pixels, int rowstride, int alpha, xlib_colormap *cmap)
+{
+ int index = (image->byte_order == MSBFirst) | (alpha != 0) << 1;
+ int bank=5; /* default fallback converter */
+ Visual *v = cmap->visual;
+
+ d(printf("masks = %x:%x:%x\n", v->red_mask, v->green_mask, v->blue_mask));
+ d(printf("image depth = %d, bpp = %d\n", image->depth, image->bits_per_pixel));
+
+ switch (v->class) {
+ /* I assume this is right for static & greyscale's too? */
+ case StaticGray:
+ case GrayScale:
+ case StaticColor:
+ case PseudoColor:
+ switch (image->bits_per_pixel) {
+ case 1:
+ bank = 0;
+ break;
+ case 8:
+ bank = 1;
+ break;
+ }
+ break;
+ case TrueColor:
+ switch (image->depth) {
+ case 15:
+ if (v->red_mask == 0x7c00 && v->green_mask == 0x3e0 && v->blue_mask == 0x1f
+ && image->bits_per_pixel == 16)
+ bank = 2;
+ break;
+ case 16:
+ if (v->red_mask == 0xf800 && v->green_mask == 0x7e0 && v->blue_mask == 0x1f
+ && image->bits_per_pixel == 16)
+ bank = 3;
+ break;
+ case 24:
+ case 32:
+ if (v->red_mask == 0xff0000 && v->green_mask == 0xff00 && v->blue_mask == 0xff
+ && image->bits_per_pixel == 32)
+ bank = 4;
+ break;
+ }
+ break;
+ case DirectColor:
+ /* always use the slow version */
+ break;
+ }
+
+ d(printf("converting using conversion function in bank %d\n", bank));
+
+ if (bank==5) {
+ convert_real_slow(image, pixels, rowstride, cmap, alpha);
+ } else {
+ index |= bank << 2;
+ (* convert_map[index]) (image, pixels, rowstride, cmap);
+ }
+}
+
+static int
+xlib_window_is_viewable (Window w)
+{
+ XWindowAttributes wa;
+
+ while (w != 0) {
+ Window parent, root, *children;
+ int nchildren;
+
+ XGetWindowAttributes (gdk_pixbuf_dpy, w, &wa);
+ if (wa.map_state != IsViewable)
+ return 0;
+
+ if (!XQueryTree (gdk_pixbuf_dpy, w, &root,
+ &parent, &children, &nchildren))
+ return 0;
+
+ if (nchildren > 0)
+ XFree (children);
+
+ if (parent == root)
+ return 1;
+
+ w = parent;
+ }
+
+ return 0;
+}
+
+static int
+xlib_window_get_origin (Window w, int *x, int *y)
+{
+ Window child;
+ return XTranslateCoordinates (gdk_pixbuf_dpy, w,
+ RootWindow (gdk_pixbuf_dpy,
+ gdk_pixbuf_screen),
+ 0, 0, x, y, &child);
+}
diff --git a/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib-private.h b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib-private.h
new file mode 100644
index 00000000..f1113339
--- /dev/null
+++ b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib-private.h
@@ -0,0 +1,30 @@
+/* GdkPixbuf library - Xlib header file
+ *
+ * Authors: John Harper <john@dcs.warwick.ac.uk>
+ *
+ * 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; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef GDK_PIXBUF_XLIB_PRIVATE_H
+#define GDK_PIXBUF_XLIB_PRIVATE_H
+
+#include "gdk-pixbuf-xlib.h"
+#include <X11/Xlib.h>
+
+extern Display *gdk_pixbuf_dpy;
+extern int gdk_pixbuf_screen;
+
+#endif
diff --git a/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib.c b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib.c
new file mode 100644
index 00000000..8383246b
--- /dev/null
+++ b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib.c
@@ -0,0 +1,46 @@
+/* GdkPixbuf library - Initialization functions
+ *
+ * Author: John Harper <john@dcs.warwick.ac.uk>
+ *
+ * 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; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <X11/Xlib.h>
+/*#include <gdk-pixbuf/gdk-pixbuf-private.h>*/
+#include "gdk-pixbuf-xlib-private.h"
+
+Display *gdk_pixbuf_dpy = NULL;
+int gdk_pixbuf_screen = -1;
+
+/**
+ * gdk_pixbuf_xlib_init_with_depth:
+ * @display: X display to use.
+ * @screen_num: Screen number.
+ * @prefDepth: Preferred depth for XlibRGB.
+ *
+ * Similar to gdk_pixbuf_xlib_init(), but also lets you specify the preferred
+ * depth for XlibRGB if you do not want it to use the default depth it picks.
+ **/
+void
+gdk_pixbuf_xlib_init_with_depth (Display *display,
+ int screen_num, int prefDepth)
+{
+ xlib_rgb_init_with_depth (display, ScreenOfDisplay (display, screen_num),
+ prefDepth);
+ gdk_pixbuf_dpy = display;
+ gdk_pixbuf_screen = screen_num;
+}
diff --git a/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib.h b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib.h
new file mode 100644
index 00000000..aa94c7c6
--- /dev/null
+++ b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlib.h
@@ -0,0 +1,78 @@
+/* GdkPixbuf library - Xlib header file
+ *
+ * Authors: John Harper <john@dcs.warwick.ac.uk>
+ *
+ * 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; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef GDK_PIXBUF_XLIB_H
+#define GDK_PIXBUF_XLIB_H
+
+/* #include <gdk-pixbuf/gdk-pixbuf.h> */
+/* #include <gdk-pixbuf-xlib/gdk-pixbuf-xlibrgb.h> */
+#include <X11/Xlib.h>
+
+
+
+/* init */
+
+void gdk_pixbuf_xlib_init_with_depth (Display *display, int screen_num,
+ int prefDepth);
+
+
+
+/* render */
+/*
+void gdk_pixbuf_xlib_render_threshold_alpha (GdkPixbuf *pixbuf, Pixmap bitmap,
+ int src_x, int src_y,
+ int dest_x, int dest_y,
+ int width, int height,
+ int alpha_threshold);
+
+void gdk_pixbuf_xlib_render_to_drawable (GdkPixbuf *pixbuf,
+ Drawable drawable, GC gc,
+ int src_x, int src_y,
+ int dest_x, int dest_y,
+ int width, int height,
+ XlibRgbDither dither,
+ int x_dither, int y_dither);
+
+
+void gdk_pixbuf_xlib_render_to_drawable_alpha (GdkPixbuf *pixbuf,
+ Drawable drawable,
+ int src_x, int src_y,
+ int dest_x, int dest_y,
+ int width, int height,
+ GdkPixbufAlphaMode alpha_mode,
+ int alpha_threshold,
+ XlibRgbDither dither,
+ int x_dither, int y_dither);
+
+void gdk_pixbuf_xlib_render_pixmap_and_mask (GdkPixbuf *pixbuf,
+ Pixmap *pixmap_return,
+ Pixmap *mask_return,
+ int alpha_threshold);
+
+
+
+GdkPixbuf *gdk_pixbuf_xlib_get_from_drawable (GdkPixbuf *dest,
+ Drawable src,
+ Colormap cmap, Visual *visual,
+ int src_x, int src_y,
+ int dest_x, int dest_y,
+ int width, int height);
+*/
+#endif /* GDK_PIXBUF_XLIB_H */
diff --git a/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlibrgb.c b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlibrgb.c
new file mode 100644
index 00000000..eb7e4cdf
--- /dev/null
+++ b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlibrgb.c
@@ -0,0 +1,3425 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "MPL"); you may not use this file except in
+ * compliance with the MPL. You may obtain a copy of the MPL at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the MPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
+ * for the specific language governing rights and limitations under the
+ * MPL.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * terms of the GNU Library General Public License (the "LGPL"), in
+ * which case the provisions of the LGPL are applicable instead of
+ * those above. If you wish to allow use of your version of this file
+ * only under the terms of the LGPL and not to allow others to use
+ * your version of this file under the MPL, indicate your decision by
+ * deleting the provisions above and replace them with the notice and
+ * other provisions required by the LGPL. If you do not delete the
+ * provisions above, a recipient may use your version of this file
+ * under either the MPL or the LGPL.
+ */
+
+/*
+ * This code is derived from GdkRgb.
+ * For more information on GdkRgb, see http://www.levien.com/gdkrgb/
+ * Raph Levien <raph@acm.org>
+ */
+
+/* Ported by Christopher Blizzard to Xlib. With permission from the
+ * original authors and the copyright holders of this file, the
+ * contents of this file are also redistributable under the terms of
+ * the Mozilla Public license. For information about the Mozilla
+ * Public License, please see the license information at
+ * http://www.mozilla.org/MPL/ */
+
+/* This code is copyright the following authors:
+ * Raph Levien <raph@acm.org>
+ * Manish Singh <manish@gtk.org>
+ * Tim Janik <timj@gtk.org>
+ * Peter Mattis <petm@xcf.berkeley.edu>
+ * Spencer Kimball <spencer@xcf.berkeley.edu>
+ * Josh MacDonald <jmacd@xcf.berkeley.edu>
+ * Christopher Blizzard <blizzard@redhat.com>
+ * Owen Taylor <otaylor@redhat.com>
+ * Shawn T. Amundson <amundson@gtk.org>
+*/
+
+#include <math.h>
+
+#if HAVE_CONFIG_H
+# include <config.h>
+# if STDC_HEADERS
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# endif
+#else
+# include <stdio.h>
+# include <stdlib.h>
+#endif
+
+#define ENABLE_GRAYSCALE
+
+/* include this before so that we can get endian definitions if
+ they are there... */
+
+#include "gdk-pixbuf-xlibrgb.h"
+#include "gdk-pixbuf-xlib-private.h"
+
+#ifndef MIN
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#ifndef MAX
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+#endif
+
+typedef enum {
+ LSB_FIRST,
+ MSB_FIRST
+} ByteOrder;
+
+
+typedef struct _XlibRgbInfo XlibRgbInfo;
+
+typedef void (*XlibRgbConvFunc) (XImage *image,
+ int ax, int ay,
+ int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align,
+ XlibRgbCmap *cmap);
+
+/* Some of these fields should go, as they're not being used at all.
+ Globals should generally migrate into here - it's very likely that
+ we'll want to run more than one GdkRgbInfo context at the same time
+ (i.e. some but not all windows have privately installed
+ colormaps). */
+
+struct _XlibRgbInfo
+{
+ Display *display;
+ Screen *screen;
+ int screen_num;
+ XVisualInfo *x_visual_info;
+ Colormap cmap;
+ XColor *cmap_colors;
+ Visual *default_visualid;
+ Colormap default_colormap;
+
+ unsigned long *color_pixels;
+ unsigned long *gray_pixels;
+ unsigned long *reserved_pixels;
+
+ unsigned long red_shift;
+ unsigned long red_prec;
+ unsigned long blue_shift;
+ unsigned long blue_prec;
+ unsigned long green_shift;
+ unsigned long green_prec;
+
+ unsigned int nred_shades;
+ unsigned int ngreen_shades;
+ unsigned int nblue_shades;
+ unsigned int ngray_shades;
+ unsigned int nreserved;
+
+ unsigned int bpp;
+ unsigned int cmap_alloced;
+ double gamma_val;
+
+ /* Generally, the stage buffer is used to convert 32bit RGB, gray,
+ and indexed images into 24 bit packed RGB. */
+ unsigned char *stage_buf;
+
+ XlibRgbCmap *gray_cmap;
+
+ Bool dith_default;
+
+ Bool bitmap; /* set true if in 1 bit per pixel mode */
+ GC own_gc;
+
+ /* Convert functions */
+ XlibRgbConvFunc conv;
+ XlibRgbConvFunc conv_d;
+
+ XlibRgbConvFunc conv_32;
+ XlibRgbConvFunc conv_32_d;
+
+ XlibRgbConvFunc conv_gray;
+ XlibRgbConvFunc conv_gray_d;
+
+ XlibRgbConvFunc conv_indexed;
+ XlibRgbConvFunc conv_indexed_d;
+};
+
+static Bool xlib_rgb_install_cmap = FALSE;
+static int xlib_rgb_min_colors = 5 * 5 * 5;
+static Bool xlib_rgb_verbose = FALSE;
+
+#define IMAGE_WIDTH 256
+#define STAGE_ROWSTRIDE (IMAGE_WIDTH * 3)
+#define IMAGE_HEIGHT 64
+#define N_IMAGES 6
+
+static XlibRgbInfo *image_info = NULL;
+static XImage *static_image[N_IMAGES];
+static int static_image_idx;
+
+static unsigned char *colorcube;
+static unsigned char *colorcube_d;
+
+static unsigned long
+xlib_get_prec_from_mask(unsigned long val)
+{
+ unsigned long retval = 0;
+ unsigned int cur_bit = 0;
+ /* walk through the number, incrementing the value if
+ the bit in question is set. */
+ while (cur_bit < (sizeof(unsigned long) * 8)) {
+ if ((val >> cur_bit) & 0x1) {
+ retval++;
+ }
+ cur_bit++;
+ }
+ return retval;
+}
+
+static unsigned long
+xlib_get_shift_from_mask(unsigned long val)
+{
+ unsigned long cur_bit = 0;
+ /* walk through the number, looking for the first 1 */
+ while (cur_bit < (sizeof(unsigned long) * 8)) {
+ if ((val >> cur_bit) & 0x1) {
+ return cur_bit;
+ }
+ cur_bit++;
+ }
+ return cur_bit;
+}
+
+
+static int
+xlib_rgb_cmap_fail (const char *msg, Colormap cmap, unsigned long *pixels)
+{
+ unsigned long free_pixels[256];
+ int n_free;
+ int i;
+
+#ifdef VERBOSE
+ printf ("%s", msg);
+#endif
+ n_free = 0;
+ for (i = 0; i < 256; i++)
+ if (pixels[i] < 256)
+ free_pixels[n_free++] = pixels[i];
+
+ if (n_free)
+ XFreeColors(image_info->display,
+ cmap,
+ free_pixels,
+ n_free,
+ 0);
+ return 0;
+}
+
+static void
+xlib_rgb_make_colorcube (unsigned long *pixels, int nr, int ng, int nb)
+{
+ unsigned char rt[16], gt[16], bt[16];
+ int i;
+
+ colorcube = malloc(sizeof(unsigned char) * 4096);
+ memset(colorcube, 0, (sizeof(unsigned char) * 4096));
+ for (i = 0; i < 16; i++)
+ {
+ rt[i] = ng * nb * ((i * 17 * (nr - 1) + 128) >> 8);
+ gt[i] = nb * ((i * 17 * (ng - 1) + 128) >> 8);
+ bt[i] = ((i * 17 * (nb - 1) + 128) >> 8);
+ }
+
+ for (i = 0; i < 4096; i++)
+ {
+ colorcube[i] = pixels[rt[i >> 8] + gt[(i >> 4) & 0x0f] + bt[i & 0x0f]];
+#ifdef VERBOSE
+ printf ("%03x %02x %x %x %x\n", i, colorcube[i], rt[i >> 8], gt[(i >> 4) & 0x0f], bt[i & 0x0f]);
+#endif
+ }
+}
+
+/* this is the colorcube suitable for dithering */
+static void
+xlib_rgb_make_colorcube_d (unsigned long *pixels, int nr, int ng, int nb)
+{
+ int r, g, b;
+ int i;
+
+ colorcube_d = malloc(sizeof(unsigned char) * 512);
+ memset(colorcube_d, 0, (sizeof(unsigned char) * 512));
+ for (i = 0; i < 512; i++)
+ {
+ r = MIN (nr - 1, i >> 6);
+ g = MIN (ng - 1, (i >> 3) & 7);
+ b = MIN (nb - 1, i & 7);
+ colorcube_d[i] = pixels[(r * ng + g) * nb + b];
+ }
+}
+
+/* Try installing a color cube of the specified size.
+ Make the colorcube and return TRUE on success */
+static int
+xlib_rgb_try_colormap (int nr, int ng, int nb)
+{
+ int r, g, b;
+ int ri, gi, bi;
+ int r0, g0, b0;
+ Colormap cmap;
+ XVisualInfo *visual;
+ XColor *colors = NULL;
+ XColor color;
+ unsigned long pixels[256];
+ unsigned long junk[256];
+ int i;
+ int d2;
+ unsigned int colors_needed;
+ int idx;
+ int best[256];
+
+ if (nr * ng * nb < xlib_rgb_min_colors)
+ return FALSE;
+
+ if (image_info->cmap_alloced) {
+ cmap = image_info->cmap;
+ visual = image_info->x_visual_info;
+ }
+ else {
+ cmap = image_info->default_colormap;
+ visual = image_info->x_visual_info;
+ }
+ colors_needed = nr * ng * nb;
+ for (i = 0; i < 256; i++)
+ {
+ best[i] = 192;
+ pixels[i] = 256;
+ }
+
+#ifndef GAMMA
+ if (!xlib_rgb_install_cmap) {
+ /* go out and get the colors for this colormap. */
+ colors = malloc(sizeof(XColor) * visual->colormap_size);
+ for (i=0; i < visual->colormap_size; i++){
+ colors[i].pixel = i;
+ }
+ XQueryColors (image_info->display,
+ cmap,
+ colors, visual->colormap_size);
+ /* find color cube colors that are already present */
+ for (i = 0; i < MIN (256, visual->colormap_size); i++)
+ {
+ r = colors[i].red >> 8;
+ g = colors[i].green >> 8;
+ b = colors[i].blue >> 8;
+ ri = (r * (nr - 1) + 128) >> 8;
+ gi = (g * (ng - 1) + 128) >> 8;
+ bi = (b * (nb - 1) + 128) >> 8;
+ r0 = ri * 255 / (nr - 1);
+ g0 = gi * 255 / (ng - 1);
+ b0 = bi * 255 / (nb - 1);
+ idx = ((ri * nr) + gi) * nb + bi;
+ d2 = (r - r0) * (r - r0) + (g - g0) * (g - g0) + (b - b0) * (b - b0);
+ if (d2 < best[idx]) {
+ if (pixels[idx] < 256)
+ XFreeColors(image_info->display,
+ cmap,
+ pixels + idx,
+ 1, 0);
+ else
+ colors_needed--;
+ color.pixel = colors[i].pixel;
+ color.red = colors[i].red;
+ color.green = colors[i].green;
+ color.blue = colors[i].blue;
+ color.flags = 0;
+ if (!XAllocColor(image_info->display, cmap, &color))
+ return xlib_rgb_cmap_fail ("error allocating system color\n",
+ cmap, pixels);
+ pixels[idx] = color.pixel; /* which is almost certainly i */
+ best[idx] = d2;
+ }
+ }
+ }
+
+#endif
+
+ if (colors_needed)
+ {
+ if (!XAllocColorCells(image_info->display, cmap, 0, NULL, 0, junk, colors_needed))
+ {
+ char tmp_str[80];
+
+ sprintf (tmp_str,
+ "%d %d %d colormap failed (in XAllocColorCells)\n",
+ nr, ng, nb);
+ return xlib_rgb_cmap_fail (tmp_str, cmap, pixels);
+ }
+ XFreeColors(image_info->display, cmap, junk, (int)colors_needed, 0);
+ }
+
+ for (r = 0, i = 0; r < nr; r++)
+ for (g = 0; g < ng; g++)
+ for (b = 0; b < nb; b++, i++)
+ {
+ if (pixels[i] == 256)
+ {
+ color.red = r * 65535 / (nr - 1);
+ color.green = g * 65535 / (ng - 1);
+ color.blue = b * 65535 / (nb - 1);
+
+#ifdef GAMMA
+ color.red = 65535 * pow (color.red / 65535.0, 0.5);
+ color.green = 65535 * pow (color.green / 65535.0, 0.5);
+ color.blue = 65535 * pow (color.blue / 65535.0, 0.5);
+#endif
+
+ /* This should be a raw XAllocColor call */
+ if (!XAllocColor(image_info->display, cmap, &color))
+ {
+ char tmp_str[80];
+
+ sprintf (tmp_str, "%d %d %d colormap failed\n",
+ nr, ng, nb);
+ return xlib_rgb_cmap_fail (tmp_str,
+ cmap, pixels);
+ }
+ pixels[i] = color.pixel;
+ }
+#ifdef VERBOSE
+ printf ("%d: %lx\n", i, pixels[i]);
+#endif
+ }
+
+ image_info->nred_shades = nr;
+ image_info->ngreen_shades = ng;
+ image_info->nblue_shades = nb;
+ xlib_rgb_make_colorcube (pixels, nr, ng, nb);
+ xlib_rgb_make_colorcube_d (pixels, nr, ng, nb);
+ if (colors)
+ free(colors);
+ return TRUE;
+}
+
+/* Return TRUE on success. */
+static Bool
+xlib_rgb_do_colormaps (void)
+{
+ static const int sizes[][3] = {
+ /* { 6, 7, 6 }, */
+ { 6, 6, 6 },
+ { 6, 6, 5 },
+ { 6, 6, 4 },
+ { 5, 5, 5 },
+ { 5, 5, 4 },
+ { 4, 4, 4 },
+ { 4, 4, 3 },
+ { 3, 3, 3 },
+ { 2, 2, 2 }
+ };
+ static const int n_sizes = sizeof(sizes) / (3 * sizeof(int));
+ int i;
+
+ for (i = 0; i < n_sizes; i++)
+ if (xlib_rgb_try_colormap (sizes[i][0], sizes[i][1], sizes[i][2]))
+ return TRUE;
+ return FALSE;
+}
+
+/* Make a 2 x 2 x 2 colorcube */
+static void
+xlib_rgb_colorcube_222 (void)
+{
+ int i;
+ XColor color;
+ Colormap cmap;
+
+ if (image_info->cmap_alloced)
+ cmap = image_info->cmap;
+ else
+ cmap = image_info->default_colormap;
+
+ colorcube_d = malloc(sizeof(unsigned char) * 512);
+
+ for (i = 0; i < 8; i++)
+ {
+ color.red = ((i & 4) >> 2) * 65535;
+ color.green = ((i & 2) >> 1) * 65535;
+ color.blue = (i & 1) * 65535;
+ XAllocColor (image_info->display, cmap, &color);
+ colorcube_d[((i & 4) << 4) | ((i & 2) << 2) | (i & 1)] = color.pixel;
+ }
+}
+
+/**
+ * xlib_rgb_set_verbose:
+ * @verbose: %True to be verbose
+ *
+ * Enables/disables debug spew.
+ **/
+void
+xlib_rgb_set_verbose (Bool verbose)
+{
+ xlib_rgb_verbose = verbose;
+}
+
+/**
+ * xlib_rgb_set_install:
+ * @install: %True to install a colormap
+ *
+ * Sets whether we install an RGB colormap.
+ **/
+void
+xlib_rgb_set_install (Bool install)
+{
+ xlib_rgb_install_cmap = install;
+}
+
+/**
+ * xlib_rgb_set_min_colors:
+ * @min_colors: minimum colors to use
+ *
+ * Sets the minimum number of colors in the color cube.
+ **/
+void
+xlib_rgb_set_min_colors (int min_colors)
+{
+ xlib_rgb_min_colors = min_colors;
+}
+
+/* Return a "score" based on the following criteria (in hex):
+
+ x000 is the quality - 1 is 1bpp, 2 is 4bpp,
+ 4 is 8bpp,
+ 7 is 15bpp truecolor, 8 is 16bpp truecolor,
+ 9 is 24bpp truecolor.
+ 0x00 is the speed - 1 is the normal case,
+ 2 means faster than normal
+ 00x0 gets a point for being the system visual
+ 000x gets a point for being pseudocolor
+
+ A caveat: in the 8bpp modes, being the system visual seems to be
+ quite important. Thus, all of the 8bpp modes should be ranked at
+ the same speed.
+*/
+
+static unsigned int
+xlib_rgb_score_visual (XVisualInfo *visual)
+{
+ unsigned int quality, speed, pseudo, sys;
+ static const char* visual_names[] =
+ {
+ "static gray",
+ "grayscale",
+ "static color",
+ "pseudo color",
+ "true color",
+ "direct color",
+ };
+
+
+ quality = 0;
+ speed = 1;
+ sys = 0;
+ if (visual->class == TrueColor ||
+ visual->class == DirectColor)
+ {
+ if (visual->depth == 24)
+ {
+ quality = 9;
+ /* Should test for MSB visual here, and set speed if so. */
+ }
+ else if (visual->depth == 16)
+ quality = 8;
+ else if (visual->depth == 15)
+ quality = 7;
+ else if (visual->depth == 8)
+ quality = 4;
+ }
+ else if (visual->class == PseudoColor ||
+ visual->class == StaticColor)
+ {
+ if (visual->depth == 8)
+ quality = 4;
+ else if (visual->depth == 4)
+ quality = 2;
+ else if (visual->depth == 1)
+ quality = 1;
+ }
+ else if (visual->class == StaticGray
+#ifdef ENABLE_GRAYSCALE
+ || visual->class == GrayScale
+#endif
+ )
+ {
+ if (visual->depth == 8)
+ quality = 4;
+ else if (visual->depth == 4)
+ quality = 2;
+ else if (visual->depth == 1)
+ quality = 1;
+ }
+
+ if (quality == 0)
+ return 0;
+
+ sys = (visual->visualid == image_info->default_visualid->visualid);
+
+ pseudo = (visual->class == PseudoColor || visual->class == TrueColor);
+
+ if (xlib_rgb_verbose)
+ printf ("Visual 0x%x, type = %s, depth = %d, %ld:%ld:%ld%s; score=%x\n",
+ (int)visual->visualid,
+ visual_names[visual->class],
+ visual->depth,
+ visual->red_mask,
+ visual->green_mask,
+ visual->blue_mask,
+ sys ? " (system)" : "",
+ (quality << 12) | (speed << 8) | (sys << 4) | pseudo);
+
+ return (quality << 12) | (speed << 8) | (sys << 4) | pseudo;
+}
+
+static void
+xlib_rgb_choose_visual (void)
+{
+ XVisualInfo *visuals;
+ XVisualInfo *visual;
+ XVisualInfo *best_visual;
+ XVisualInfo *final_visual;
+ XVisualInfo template;
+ int num_visuals;
+ unsigned int score, best_score;
+ int cur_visual = 1;
+ int i;
+
+ template.screen = image_info->screen_num;
+ visuals = XGetVisualInfo(image_info->display, VisualScreenMask,
+ &template, &num_visuals);
+
+ best_visual = visuals;
+ best_score = xlib_rgb_score_visual (best_visual);
+
+ for (i = cur_visual; i < num_visuals; i++)
+ {
+ visual = &visuals[i];
+ score = xlib_rgb_score_visual (visual);
+ if (score > best_score)
+ {
+ best_score = score;
+ best_visual = visual;
+ }
+ }
+ /* make a copy of the visual so that we can free
+ the allocated visual list above. */
+ final_visual = malloc(sizeof(XVisualInfo));
+ memcpy(final_visual, best_visual, sizeof(XVisualInfo));
+ image_info->x_visual_info = final_visual;
+ XFree(visuals);
+ /* set up the shift and the precision for the red, green and blue.
+ this only applies to cool visuals like true color and direct color. */
+ if (image_info->x_visual_info->class == TrueColor ||
+ image_info->x_visual_info->class == DirectColor) {
+ image_info->red_shift = xlib_get_shift_from_mask(image_info->x_visual_info->red_mask);
+ image_info->red_prec = xlib_get_prec_from_mask(image_info->x_visual_info->red_mask);
+ image_info->green_shift = xlib_get_shift_from_mask(image_info->x_visual_info->green_mask);
+ image_info->green_prec = xlib_get_prec_from_mask(image_info->x_visual_info->green_mask);
+ image_info->blue_shift = xlib_get_shift_from_mask(image_info->x_visual_info->blue_mask);
+ image_info->blue_prec = xlib_get_prec_from_mask(image_info->x_visual_info->blue_mask);
+ }
+}
+
+static void
+xlib_rgb_choose_visual_for_xprint (int aDepth)
+{
+ XVisualInfo *visuals;
+ XVisualInfo *visual;
+ XVisualInfo *best_visual;
+ XVisualInfo *final_visual;
+ XVisualInfo template;
+ int num_visuals;
+ int cur_visual = 1;
+ int i;
+
+ XWindowAttributes win_att;
+ Status ret_stat;
+ Visual *root_visual;
+
+ ret_stat = XGetWindowAttributes(image_info->display,
+ RootWindow(image_info->display, image_info->screen_num),
+ &win_att);
+ root_visual = win_att.visual;
+ template.screen = image_info->screen_num;
+ visuals = XGetVisualInfo(image_info->display, VisualScreenMask,
+ &template, &num_visuals);
+
+ best_visual = visuals;
+ if (best_visual->visual != root_visual) {
+ for (i = cur_visual; i < num_visuals; i++) {
+ visual = &visuals[i];
+ if (visual->visual == root_visual) {
+ best_visual = visual;
+ break;
+ }
+ }
+ }
+ /* make a copy of the visual so that we can free
+ the allocated visual list above. */
+ final_visual = malloc(sizeof(XVisualInfo));
+ memcpy(final_visual, best_visual, sizeof(XVisualInfo));
+ image_info->x_visual_info = final_visual;
+ XFree(visuals);
+ /* set up the shift and the precision for the red, green and blue.
+ this only applies to cool visuals like true color and direct color. */
+ if (image_info->x_visual_info->class == TrueColor ||
+ image_info->x_visual_info->class == DirectColor) {
+ image_info->red_shift = xlib_get_shift_from_mask(image_info->x_visual_info->red_mask);
+ image_info->red_prec = xlib_get_prec_from_mask(image_info->x_visual_info->red_mask);
+ image_info->green_shift = xlib_get_shift_from_mask(image_info->x_visual_info->green_mask);
+ image_info->green_prec = xlib_get_prec_from_mask(image_info->x_visual_info->green_mask);
+ image_info->blue_shift = xlib_get_shift_from_mask(image_info->x_visual_info->blue_mask);
+ image_info->blue_prec = xlib_get_prec_from_mask(image_info->x_visual_info->blue_mask);
+ }
+}
+
+static void xlib_rgb_select_conv (XImage *image, ByteOrder byte_order);
+
+static void
+xlib_rgb_set_gray_cmap (Colormap cmap)
+{
+ int i;
+ XColor color;
+ int status;
+ unsigned long pixels[256];
+ int r, g, b, gray;
+
+ for (i = 0; i < 256; i++)
+ {
+ color.pixel = i;
+ color.red = i * 257;
+ color.green = i * 257;
+ color.blue = i * 257;
+ status = XAllocColor(image_info->display, cmap, &color);
+ pixels[i] = color.pixel;
+#ifdef VERBOSE
+ printf ("allocating pixel %d, %x %x %x, result %d\n",
+ color.pixel, color.red, color.green, color.blue, status);
+#endif
+ }
+
+ /* Now, we make fake colorcubes - we ultimately just use the pseudocolor
+ methods. */
+
+ colorcube = malloc(sizeof(unsigned char) * 4096);
+
+ for (i = 0; i < 4096; i++)
+ {
+ r = (i >> 4) & 0xf0;
+ r = r | r >> 4;
+ g = i & 0xf0;
+ g = g | g >> 4;
+ b = (i << 4 & 0xf0);
+ b = b | b >> 4;
+ gray = (g + ((r + b) >> 1)) >> 1;
+ colorcube[i] = pixels[gray];
+ }
+}
+
+/**
+ * xlib_rgb_init_with_depth:
+ * @display: X display to use.
+ * @screen: Screen to use.
+ * @prefDepth: Visual depth to use for color substitution tables. This must
+ * be one of the supported visual depths in the specified @display.
+ *
+ * Initializes the XlibRGB machinery with a particular depth you specify,
+ * instead of automatically picking the best depth in the display. This
+ * function or xlib_rgb_init() must be called before using any of the other
+ * functions in XlibRGB.
+ **/
+void
+xlib_rgb_init_with_depth (Display *display, Screen *screen, int prefDepth)
+{
+ int i;
+ static const int byte_order[1] = { 1 };
+
+ static int initialized = 0;
+
+ if (initialized)
+ {
+ return;
+ }
+
+ initialized = 1;
+
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+ if (((char *)byte_order)[0] == 1) {
+ printf ("xlib_rgb_init: compiled for big endian, but this is a little endian machine.\n\n");
+ exit(1);
+ }
+#else
+ if (((char *)byte_order)[0] != 1) {
+ printf ("xlib_rgb_init: compiled for little endian, but this is a big endian machine.\n\n");
+ exit(1);
+ }
+#endif
+
+ if (image_info == NULL)
+ {
+ image_info = malloc(sizeof(XlibRgbInfo));
+ memset(image_info, 0, sizeof(XlibRgbInfo));
+
+ image_info->display = display;
+ image_info->screen = screen;
+ image_info->screen_num = XScreenNumberOfScreen(screen);
+ image_info->x_visual_info = NULL;
+ image_info->cmap = 0;
+ image_info->default_visualid = DefaultVisual(display, image_info->screen_num);
+ image_info->default_colormap = DefaultColormap(display, image_info->screen_num);
+
+ image_info->color_pixels = NULL;
+ image_info->gray_pixels = NULL;
+ image_info->reserved_pixels = NULL;
+
+ image_info->nred_shades = 6;
+ image_info->ngreen_shades = 6;
+ image_info->nblue_shades = 4;
+ image_info->ngray_shades = 24;
+ image_info->nreserved = 0;
+
+ image_info->bpp = 0;
+ image_info->cmap_alloced = FALSE;
+ image_info->gamma_val = 1.0;
+
+ image_info->stage_buf = NULL;
+
+ image_info->own_gc = 0;
+
+ image_info->red_shift = 0;
+ image_info->red_prec = 0;
+ image_info->green_shift = 0;
+ image_info->green_prec = 0;
+ image_info->blue_shift = 0;
+ image_info->blue_prec = 0;
+
+ if (prefDepth != -1)
+ xlib_rgb_choose_visual_for_xprint (prefDepth);
+ else
+ xlib_rgb_choose_visual ();
+
+ if ((image_info->x_visual_info->class == PseudoColor ||
+ image_info->x_visual_info->class == StaticColor) &&
+ image_info->x_visual_info->depth < 8 &&
+ image_info->x_visual_info->depth >= 3)
+ {
+ image_info->cmap = image_info->default_colormap;
+ xlib_rgb_colorcube_222 ();
+ }
+ else if (image_info->x_visual_info->class == PseudoColor)
+ {
+ if (xlib_rgb_install_cmap ||
+ image_info->x_visual_info->visualid != image_info->default_visualid->visualid)
+ {
+ image_info->cmap = XCreateColormap(image_info->display,
+ RootWindow(image_info->display, image_info->screen_num),
+ image_info->x_visual_info->visual,
+ AllocNone);
+ image_info->cmap_alloced = TRUE;
+ }
+ if (!xlib_rgb_do_colormaps ())
+ {
+ image_info->cmap = XCreateColormap(image_info->display,
+ RootWindow(image_info->display, image_info->screen_num),
+ image_info->x_visual_info->visual,
+ AllocNone);
+ image_info->cmap_alloced = TRUE;
+ xlib_rgb_do_colormaps ();
+ }
+ if (xlib_rgb_verbose)
+ printf ("color cube: %d x %d x %d\n",
+ image_info->nred_shades,
+ image_info->ngreen_shades,
+ image_info->nblue_shades);
+
+ if (!image_info->cmap_alloced)
+ image_info->cmap = image_info->default_colormap;
+ }
+#ifdef ENABLE_GRAYSCALE
+ else if (image_info->x_visual_info->class == GrayScale)
+ {
+ image_info->cmap = XCreateColormap(image_info->display,
+ RootWindow(image_info->display, image_info->screen_num),
+ image_info->x_visual_info->visual,
+ AllocNone);
+ xlib_rgb_set_gray_cmap (image_info->cmap);
+ image_info->cmap_alloced = TRUE;
+ }
+#endif
+ else
+ {
+ /* Always install colormap in direct color. */
+ if (image_info->x_visual_info->class != DirectColor &&
+ image_info->x_visual_info->visualid == image_info->default_visualid->visualid)
+ image_info->cmap = image_info->default_colormap;
+ else
+ {
+ image_info->cmap = XCreateColormap(image_info->display,
+ RootWindow(image_info->display, image_info->screen_num),
+ image_info->x_visual_info->visual,
+ AllocNone);
+ image_info->cmap_alloced = TRUE;
+ }
+ }
+
+ image_info->bitmap = (image_info->x_visual_info->depth == 1);
+
+ for (i = 0; i < N_IMAGES; i++) {
+ if (image_info->bitmap) {
+ /* Use malloc() instead of g_malloc since X will free() this mem */
+ static_image[i] = XCreateImage(image_info->display,
+ image_info->x_visual_info->visual,
+ 1,
+ XYBitmap,
+ 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT,
+ 8,
+ 0);
+ static_image[i]->data = malloc(IMAGE_WIDTH * IMAGE_HEIGHT >> 3);
+ static_image[i]->bitmap_bit_order = MSBFirst;
+ static_image[i]->byte_order = MSBFirst;
+ }
+ else {
+ static_image[i] = XCreateImage(image_info->display,
+ image_info->x_visual_info->visual,
+ (unsigned int)image_info->x_visual_info->depth,
+ ZPixmap,
+ 0, 0,
+ IMAGE_WIDTH,
+ IMAGE_HEIGHT,
+ 32, 0);
+ /* remove this when we are using shared memory.. */
+ static_image[i]->data = malloc((size_t)IMAGE_WIDTH * IMAGE_HEIGHT * image_info->x_visual_info->depth);
+ static_image[i]->bitmap_bit_order = MSBFirst;
+ static_image[i]->byte_order = MSBFirst;
+ }
+ }
+ /* ok, so apparently, image_info->bpp is actually
+ BYTES per pixel. What fun! */
+ switch (static_image[0]->bits_per_pixel) {
+ case 1:
+ case 8:
+ image_info->bpp = 1;
+ break;
+ case 16:
+ image_info->bpp = 2;
+ break;
+ case 24:
+ image_info->bpp = 3;
+ break;
+ case 32:
+ image_info->bpp = 4;
+ break;
+ }
+ xlib_rgb_select_conv (static_image[0], MSB_FIRST);
+ }
+}
+
+
+
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+#define HAIRY_CONVERT_8
+#endif
+
+#ifdef HAIRY_CONVERT_8
+static void
+xlib_rgb_convert_8 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ if (((unsigned long)obuf | (unsigned long) bp2) & 3)
+ {
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ obptr[0] = colorcube[((r & 0xf0) << 4) |
+ (g & 0xf0) |
+ (b >> 4)];
+ obptr++;
+ }
+ }
+ else
+ {
+ for (x = 0; x < width - 3; x += 4)
+ {
+ unsigned int r1b0g0r0;
+ unsigned int g2r2b1g1;
+ unsigned int b3g3r3b2;
+
+ r1b0g0r0 = ((unsigned int *)bp2)[0];
+ g2r2b1g1 = ((unsigned int *)bp2)[1];
+ b3g3r3b2 = ((unsigned int *)bp2)[2];
+ ((unsigned int *)obptr)[0] =
+ colorcube[((r1b0g0r0 & 0xf0) << 4) |
+ ((r1b0g0r0 & 0xf000) >> 8) |
+ ((r1b0g0r0 & 0xf00000) >> 20)] |
+ (colorcube[((r1b0g0r0 & 0xf0000000) >> 20) |
+ (g2r2b1g1 & 0xf0) |
+ ((g2r2b1g1 & 0xf000) >> 12)] << 8) |
+ (colorcube[((g2r2b1g1 & 0xf00000) >> 12) |
+ ((g2r2b1g1 & 0xf0000000) >> 24) |
+ ((b3g3r3b2 & 0xf0) >> 4)] << 16) |
+ (colorcube[((b3g3r3b2 & 0xf000) >> 4) |
+ ((b3g3r3b2 & 0xf00000) >> 16) |
+ (b3g3r3b2 >> 28)] << 24);
+ bp2 += 12;
+ obptr += 4;
+ }
+ for (; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ obptr[0] = colorcube[((r & 0xf0) << 4) |
+ (g & 0xf0) |
+ (b >> 4)];
+ obptr++;
+ }
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+#else
+static void
+xlib_rgb_convert_8 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ obptr[0] = colorcube[((r & 0xf0) << 4) |
+ (g & 0xf0) |
+ (b >> 4)];
+ obptr++;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+#endif
+
+#if 1
+
+/* This dither table was generated by Raph Levien using patented
+ technology (US Patent 5,276,535). The dither table itself is in the
+ public domain. */
+
+#define DM_WIDTH 128
+#define DM_WIDTH_SHIFT 7
+#define DM_HEIGHT 128
+static const unsigned char DM[128][128] =
+{
+ { 0, 41, 23, 5, 17, 39, 7, 15, 62, 23, 40, 51, 31, 47, 9, 32, 52, 27, 57, 25, 6, 61, 27, 52, 37, 7, 40, 63, 18, 36, 10, 42, 25, 62, 45, 34, 20, 42, 37, 14, 35, 29, 50, 10, 61, 2, 40, 8, 37, 12, 58, 22, 5, 41, 10, 39, 0, 60, 11, 46, 2, 55, 38, 17, 36, 59, 13, 54, 37, 56, 8, 29, 16, 13, 63, 22, 41, 55, 7, 20, 49, 14, 23, 55, 37, 23, 19, 36, 15, 49, 23, 63, 30, 14, 38, 27, 53, 13, 22, 41, 19, 31, 7, 19, 50, 30, 49, 16, 3, 32, 56, 40, 29, 34, 8, 48, 19, 45, 4, 51, 12, 46, 35, 49, 16, 42, 12, 62 },
+ { 30, 57, 36, 54, 47, 34, 52, 27, 43, 4, 28, 7, 17, 36, 62, 13, 44, 7, 18, 48, 33, 21, 44, 14, 30, 47, 12, 33, 5, 55, 31, 58, 13, 30, 4, 17, 52, 10, 60, 26, 46, 0, 39, 27, 42, 22, 47, 25, 60, 32, 9, 38, 48, 17, 59, 30, 49, 18, 34, 25, 51, 19, 5, 48, 21, 8, 28, 46, 1, 32, 41, 19, 54, 47, 37, 18, 28, 11, 44, 30, 39, 56, 2, 33, 8, 42, 61, 28, 58, 8, 46, 9, 41, 4, 58, 7, 21, 48, 59, 10, 52, 14, 42, 57, 12, 25, 7, 53, 42, 24, 11, 50, 17, 59, 42, 2, 36, 60, 32, 17, 63, 29, 21, 7, 59, 32, 24, 39 },
+ { 22, 8, 16, 32, 3, 25, 13, 57, 18, 45, 58, 39, 55, 20, 5, 42, 23, 34, 63, 1, 51, 10, 58, 4, 60, 23, 53, 27, 44, 21, 3, 48, 8, 50, 43, 54, 27, 32, 5, 55, 21, 58, 12, 53, 6, 36, 14, 50, 17, 29, 53, 15, 24, 52, 7, 36, 13, 42, 4, 53, 9, 35, 61, 26, 56, 32, 49, 15, 62, 23, 6, 60, 2, 31, 4, 48, 58, 38, 15, 61, 5, 25, 47, 28, 50, 15, 7, 40, 3, 32, 33, 52, 25, 50, 35, 42, 61, 3, 28, 36, 23, 63, 4, 33, 46, 62, 36, 23, 60, 6, 54, 28, 4, 37, 23, 55, 25, 8, 42, 54, 14, 6, 56, 38, 19, 52, 4, 46 },
+ { 48, 53, 43, 12, 45, 63, 30, 37, 9, 34, 21, 1, 25, 47, 29, 58, 3, 54, 15, 39, 29, 17, 38, 35, 20, 43, 1, 49, 15, 59, 29, 39, 22, 35, 16, 23, 1, 47, 39, 18, 8, 44, 25, 31, 57, 19, 63, 4, 45, 3, 42, 61, 1, 31, 45, 20, 57, 29, 62, 21, 32, 41, 14, 44, 3, 39, 5, 34, 10, 43, 51, 35, 23, 52, 40, 10, 21, 1, 53, 18, 51, 43, 12, 62, 18, 54, 26, 51, 20, 57, 14, 1, 62, 16, 11, 18, 32, 39, 17, 44, 1, 48, 26, 37, 18, 2, 51, 14, 28, 45, 35, 18, 57, 13, 47, 11, 51, 20, 2, 39, 31, 47, 25, 1, 50, 11, 60, 7 },
+ { 18, 28, 1, 56, 21, 10, 51, 2, 46, 54, 14, 61, 11, 50, 13, 38, 19, 31, 45, 9, 55, 24, 47, 5, 54, 9, 62, 11, 35, 8, 51, 14, 57, 6, 63, 40, 58, 14, 51, 28, 62, 34, 15, 48, 1, 41, 30, 35, 55, 21, 34, 11, 49, 37, 8, 52, 4, 23, 15, 43, 1, 58, 11, 23, 53, 16, 55, 26, 58, 18, 27, 12, 45, 14, 25, 63, 42, 33, 27, 35, 9, 31, 21, 38, 1, 44, 34, 12, 48, 38, 21, 44, 29, 47, 26, 53, 1, 46, 54, 8, 59, 29, 11, 55, 22, 41, 33, 20, 39, 1, 48, 9, 44, 32, 5, 62, 29, 44, 57, 23, 10, 58, 34, 43, 15, 37, 26, 33 },
+ { 51, 38, 59, 24, 35, 42, 19, 60, 5, 32, 41, 26, 43, 33, 7, 53, 48, 11, 59, 23, 42, 2, 61, 30, 16, 40, 32, 24, 56, 41, 19, 33, 37, 26, 47, 9, 31, 22, 2, 45, 9, 54, 4, 37, 21, 52, 11, 23, 7, 57, 16, 25, 55, 18, 63, 27, 46, 39, 56, 10, 50, 37, 29, 47, 19, 63, 24, 9, 46, 2, 39, 60, 9, 57, 30, 7, 49, 11, 59, 3, 45, 57, 5, 60, 29, 22, 5, 60, 30, 9, 59, 18, 40, 6, 57, 36, 30, 12, 24, 34, 15, 40, 52, 6, 49, 9, 58, 4, 63, 12, 26, 61, 22, 53, 38, 16, 35, 14, 28, 50, 42, 17, 5, 28, 62, 20, 54, 12 },
+ { 26, 6, 31, 15, 49, 6, 38, 27, 22, 49, 16, 56, 2, 62, 30, 21, 0, 36, 28, 6, 49, 32, 13, 52, 26, 50, 19, 46, 3, 26, 62, 0, 53, 12, 29, 3, 53, 41, 60, 24, 38, 13, 58, 16, 43, 9, 59, 39, 46, 28, 44, 40, 2, 33, 13, 41, 16, 6, 47, 31, 26, 17, 57, 6, 38, 0, 42, 36, 29, 52, 20, 31, 48, 0, 34, 56, 20, 36, 23, 54, 14, 41, 24, 37, 10, 55, 46, 25, 16, 45, 36, 4, 55, 23, 15, 8, 50, 62, 5, 56, 44, 20, 13, 28, 59, 31, 24, 47, 31, 52, 37, 17, 40, 0, 26, 49, 3, 60, 7, 33, 0, 61, 53, 40, 8, 45, 2, 41 },
+ { 16, 63, 43, 4, 61, 24, 56, 13, 53, 8, 36, 12, 24, 41, 16, 46, 60, 26, 52, 39, 14, 57, 21, 37, 0, 45, 7, 59, 38, 17, 43, 10, 45, 20, 61, 43, 19, 11, 33, 17, 50, 32, 23, 61, 28, 49, 26, 0, 18, 51, 5, 60, 22, 58, 29, 0, 59, 34, 19, 62, 3, 52, 7, 44, 30, 59, 13, 50, 15, 62, 7, 17, 38, 22, 44, 15, 40, 4, 47, 28, 33, 17, 49, 16, 51, 40, 10, 56, 0, 53, 13, 49, 28, 38, 60, 21, 43, 19, 37, 27, 3, 51, 34, 39, 0, 45, 15, 43, 10, 21, 3, 55, 8, 33, 59, 10, 41, 18, 52, 24, 46, 20, 30, 13, 58, 22, 36, 57 },
+ { 50, 34, 11, 47, 29, 17, 44, 0, 33, 63, 28, 46, 52, 5, 57, 10, 42, 18, 4, 63, 20, 8, 44, 10, 56, 34, 14, 29, 5, 54, 23, 59, 32, 49, 7, 34, 49, 27, 56, 0, 42, 7, 46, 3, 40, 6, 54, 32, 62, 13, 36, 10, 47, 8, 35, 49, 24, 51, 12, 40, 22, 35, 60, 12, 22, 51, 33, 4, 40, 25, 43, 55, 5, 54, 12, 61, 26, 51, 8, 62, 0, 53, 7, 63, 2, 32, 19, 34, 42, 24, 31, 63, 2, 10, 45, 33, 0, 48, 9, 61, 22, 47, 8, 62, 18, 56, 7, 54, 27, 57, 46, 30, 50, 19, 45, 30, 56, 36, 22, 47, 11, 38, 3, 51, 32, 48, 18, 9 },
+ { 0, 21, 40, 19, 52, 9, 37, 48, 20, 40, 3, 18, 27, 38, 35, 22, 31, 56, 13, 35, 46, 28, 60, 40, 27, 18, 61, 50, 41, 30, 7, 36, 2, 25, 16, 57, 5, 15, 47, 29, 55, 19, 30, 52, 15, 34, 20, 12, 43, 30, 20, 54, 25, 44, 53, 12, 38, 5, 55, 27, 48, 15, 33, 27, 45, 8, 19, 28, 56, 11, 33, 49, 18, 36, 29, 2, 45, 16, 39, 19, 31, 43, 27, 35, 20, 52, 26, 6, 61, 11, 41, 17, 29, 51, 20, 56, 25, 32, 41, 17, 53, 31, 25, 14, 42, 23, 35, 16, 38, 6, 34, 12, 15, 62, 6, 21, 13, 1, 63, 9, 55, 27, 43, 25, 14, 4, 31, 55 },
+ { 44, 29, 61, 2, 35, 58, 26, 15, 60, 10, 51, 59, 14, 55, 8, 50, 2, 44, 25, 51, 1, 33, 16, 4, 48, 36, 2, 21, 12, 57, 48, 13, 51, 55, 40, 28, 37, 62, 8, 39, 12, 63, 36, 10, 59, 24, 56, 47, 9, 50, 41, 1, 32, 17, 6, 21, 61, 30, 9, 43, 1, 54, 41, 2, 54, 37, 48, 61, 1, 46, 21, 3, 58, 24, 50, 32, 60, 10, 57, 25, 46, 12, 59, 4, 45, 13, 57, 47, 27, 39, 5, 58, 47, 14, 35, 4, 52, 13, 60, 6, 36, 10, 45, 55, 4, 50, 29, 2, 61, 50, 25, 58, 44, 24, 36, 42, 54, 28, 40, 32, 16, 56, 6, 62, 46, 39, 60, 23 },
+ { 7, 48, 14, 54, 23, 40, 4, 45, 30, 22, 42, 32, 1, 44, 20, 29, 58, 8, 37, 19, 41, 54, 24, 58, 9, 53, 25, 46, 34, 16, 23, 38, 27, 11, 18, 1, 52, 21, 35, 22, 48, 5, 25, 45, 18, 38, 2, 27, 35, 4, 57, 15, 62, 39, 57, 28, 42, 16, 36, 60, 24, 18, 10, 63, 20, 5, 16, 23, 37, 14, 59, 27, 41, 8, 13, 42, 21, 35, 6, 50, 3, 38, 15, 48, 30, 39, 17, 3, 49, 14, 53, 33, 24, 7, 61, 44, 11, 39, 23, 49, 19, 58, 1, 32, 36, 12, 60, 41, 20, 13, 41, 4, 39, 1, 48, 8, 18, 51, 14, 44, 5, 37, 21, 34, 1, 26, 10, 37 },
+ { 53, 36, 27, 9, 50, 12, 32, 55, 2, 57, 7, 17, 48, 34, 63, 15, 40, 26, 62, 11, 49, 6, 31, 39, 22, 42, 6, 63, 1, 39, 60, 4, 42, 61, 32, 45, 24, 44, 2, 60, 16, 41, 53, 1, 33, 61, 49, 17, 63, 23, 45, 26, 33, 3, 23, 46, 2, 50, 20, 4, 45, 34, 49, 30, 39, 58, 44, 31, 53, 34, 6, 52, 30, 47, 63, 1, 53, 22, 42, 31, 58, 23, 54, 22, 61, 8, 36, 59, 22, 35, 21, 1, 55, 40, 27, 16, 30, 54, 2, 29, 43, 16, 39, 63, 21, 46, 26, 10, 48, 32, 19, 53, 30, 56, 26, 60, 33, 4, 61, 23, 49, 59, 15, 53, 19, 58, 42, 16 },
+ { 20, 5, 59, 46, 25, 62, 7, 19, 43, 25, 37, 61, 11, 24, 4, 54, 12, 52, 3, 32, 17, 61, 12, 47, 15, 55, 18, 31, 53, 28, 9, 50, 21, 6, 55, 9, 58, 14, 54, 26, 33, 7, 31, 58, 13, 21, 8, 42, 29, 6, 37, 11, 48, 52, 14, 60, 11, 39, 56, 32, 14, 58, 7, 26, 17, 4, 42, 8, 11, 47, 19, 38, 10, 17, 26, 37, 9, 55, 28, 13, 18, 40, 6, 33, 1, 43, 25, 11, 51, 7, 62, 43, 18, 37, 3, 57, 45, 9, 38, 58, 5, 52, 27, 7, 17, 53, 5, 57, 37, 2, 63, 9, 22, 15, 11, 38, 25, 45, 35, 0, 28, 10, 41, 30, 50, 8, 31, 57 },
+ { 49, 33, 16, 38, 1, 42, 51, 34, 53, 14, 28, 49, 30, 56, 36, 23, 43, 20, 38, 56, 22, 45, 28, 0, 62, 35, 26, 44, 11, 19, 52, 35, 44, 15, 30, 38, 10, 31, 40, 4, 46, 50, 20, 40, 27, 44, 51, 14, 56, 53, 19, 59, 7, 29, 41, 19, 35, 25, 8, 52, 22, 44, 13, 53, 50, 32, 61, 24, 56, 25, 63, 0, 45, 57, 33, 59, 16, 46, 4, 62, 50, 11, 60, 37, 52, 19, 55, 29, 37, 46, 13, 26, 48, 10, 50, 34, 21, 63, 26, 13, 42, 33, 22, 55, 35, 28, 43, 15, 24, 51, 27, 34, 46, 49, 58, 3, 52, 9, 57, 19, 48, 55, 3, 35, 12, 45, 24, 3 },
+ { 41, 11, 56, 28, 18, 31, 22, 10, 37, 6, 47, 13, 3, 41, 9, 46, 0, 48, 29, 6, 34, 10, 55, 37, 20, 8, 49, 3, 41, 59, 14, 25, 0, 63, 19, 47, 27, 51, 17, 57, 23, 10, 61, 6, 54, 3, 38, 31, 0, 22, 34, 43, 20, 55, 31, 0, 49, 63, 29, 38, 3, 62, 28, 40, 0, 22, 14, 35, 2, 48, 15, 43, 23, 14, 3, 29, 49, 20, 39, 34, 0, 44, 29, 9, 15, 47, 5, 42, 0, 31, 58, 5, 31, 61, 23, 15, 0, 47, 19, 50, 24, 3, 59, 11, 44, 0, 31, 59, 6, 42, 17, 60, 0, 39, 20, 31, 43, 17, 29, 40, 12, 25, 60, 22, 52, 15, 63, 29 },
+ { 20, 52, 8, 44, 62, 4, 59, 49, 17, 63, 21, 39, 60, 18, 52, 27, 33, 59, 14, 51, 59, 43, 24, 5, 51, 30, 57, 17, 32, 5, 37, 56, 48, 34, 42, 3, 60, 5, 36, 13, 43, 37, 18, 34, 25, 12, 59, 24, 47, 36, 11, 50, 3, 38, 9, 58, 16, 5, 43, 18, 47, 10, 37, 18, 59, 46, 29, 52, 40, 12, 34, 28, 56, 36, 53, 7, 43, 8, 24, 52, 26, 17, 56, 43, 24, 32, 63, 20, 57, 16, 22, 52, 36, 8, 41, 56, 29, 32, 54, 7, 35, 57, 14, 48, 20, 62, 13, 39, 53, 29, 8, 45, 13, 29, 7, 61, 14, 54, 6, 63, 38, 32, 18, 43, 2, 39, 6, 47 },
+ { 0, 58, 23, 35, 13, 46, 12, 39, 0, 31, 55, 24, 5, 35, 15, 61, 17, 5, 39, 25, 18, 2, 50, 33, 41, 13, 39, 23, 62, 46, 29, 12, 22, 8, 56, 25, 20, 49, 32, 62, 0, 56, 11, 46, 63, 42, 9, 16, 55, 5, 60, 15, 62, 26, 45, 21, 36, 51, 13, 57, 31, 24, 55, 6, 35, 9, 57, 5, 20, 60, 7, 51, 5, 19, 40, 25, 61, 32, 56, 12, 36, 48, 21, 2, 58, 12, 39, 28, 9, 50, 40, 12, 44, 18, 25, 49, 6, 38, 11, 62, 18, 46, 30, 9, 40, 25, 49, 19, 10, 36, 55, 22, 33, 52, 41, 18, 37, 27, 49, 21, 2, 46, 7, 53, 33, 61, 27, 35 },
+ { 41, 31, 5, 39, 51, 26, 33, 57, 27, 41, 9, 44, 54, 29, 48, 7, 44, 36, 57, 10, 31, 63, 16, 45, 11, 60, 1, 47, 7, 20, 43, 3, 58, 36, 13, 52, 39, 7, 15, 28, 22, 48, 30, 21, 1, 29, 49, 44, 27, 17, 40, 30, 24, 42, 12, 53, 33, 7, 47, 20, 1, 42, 11, 49, 25, 43, 17, 32, 45, 27, 41, 21, 31, 62, 11, 49, 2, 15, 42, 5, 63, 7, 41, 27, 49, 6, 54, 23, 46, 34, 2, 28, 54, 3, 59, 12, 46, 17, 42, 28, 40, 1, 37, 51, 5, 55, 2, 34, 47, 16, 3, 62, 47, 5, 23, 56, 1, 44, 12, 34, 51, 16, 57, 11, 25, 17, 54, 13 },
+ { 60, 26, 55, 18, 3, 60, 20, 6, 52, 15, 50, 19, 32, 11, 23, 53, 26, 21, 1, 47, 42, 27, 8, 58, 21, 27, 53, 36, 26, 54, 31, 50, 17, 30, 45, 1, 29, 59, 44, 53, 41, 4, 35, 58, 51, 19, 32, 4, 52, 34, 48, 8, 51, 5, 56, 2, 25, 61, 27, 38, 54, 27, 62, 21, 51, 1, 39, 62, 10, 50, 1, 58, 13, 47, 38, 18, 35, 54, 22, 51, 30, 19, 59, 34, 14, 32, 44, 4, 60, 15, 52, 62, 20, 43, 30, 35, 21, 60, 4, 52, 12, 24, 61, 18, 30, 42, 23, 61, 25, 50, 27, 38, 11, 59, 12, 35, 50, 30, 59, 24, 8, 42, 28, 37, 48, 9, 44, 21 },
+ { 10, 47, 15, 50, 30, 43, 8, 45, 29, 2, 36, 59, 1, 58, 41, 3, 63, 31, 54, 20, 13, 55, 35, 38, 4, 44, 15, 9, 61, 2, 14, 38, 61, 10, 23, 54, 18, 12, 24, 2, 14, 55, 16, 8, 38, 14, 41, 60, 10, 23, 1, 58, 32, 17, 28, 37, 41, 15, 3, 60, 15, 33, 4, 36, 16, 59, 28, 14, 23, 55, 37, 18, 44, 28, 2, 57, 30, 10, 27, 46, 14, 38, 3, 53, 21, 61, 17, 35, 10, 41, 26, 7, 33, 9, 57, 1, 53, 37, 26, 20, 56, 48, 9, 33, 58, 16, 37, 7, 45, 1, 57, 15, 32, 26, 42, 23, 7, 20, 4, 54, 31, 62, 22, 1, 59, 30, 4, 51 },
+ { 36, 2, 38, 11, 24, 36, 54, 22, 62, 47, 25, 8, 28, 45, 16, 38, 12, 43, 9, 37, 49, 3, 23, 52, 18, 30, 50, 33, 19, 42, 49, 26, 6, 40, 47, 35, 63, 38, 50, 33, 60, 26, 36, 47, 24, 57, 6, 26, 39, 63, 19, 44, 14, 46, 61, 9, 50, 30, 45, 23, 10, 50, 44, 8, 31, 54, 6, 46, 36, 4, 30, 54, 8, 52, 22, 41, 4, 60, 40, 0, 58, 24, 45, 10, 37, 1, 48, 30, 56, 17, 38, 48, 24, 47, 19, 39, 14, 8, 45, 32, 2, 34, 27, 44, 4, 52, 11, 56, 31, 21, 40, 19, 44, 51, 2, 63, 46, 58, 36, 43, 14, 5, 50, 38, 14, 56, 40, 23 },
+ { 61, 46, 32, 63, 54, 1, 14, 34, 12, 40, 18, 49, 37, 10, 61, 30, 51, 24, 60, 7, 29, 40, 62, 11, 46, 58, 6, 56, 24, 10, 34, 52, 21, 59, 16, 3, 27, 5, 20, 46, 9, 40, 7, 62, 2, 30, 53, 15, 48, 10, 28, 35, 54, 6, 21, 34, 18, 55, 7, 40, 57, 19, 26, 60, 41, 13, 24, 51, 19, 61, 9, 25, 34, 15, 63, 11, 45, 17, 20, 47, 33, 8, 31, 62, 43, 26, 53, 7, 24, 59, 0, 13, 55, 4, 62, 27, 51, 31, 63, 15, 58, 7, 54, 14, 46, 22, 28, 43, 12, 63, 8, 54, 5, 17, 39, 33, 15, 10, 27, 17, 47, 34, 19, 45, 27, 12, 33, 17 },
+ { 5, 28, 21, 7, 17, 48, 42, 58, 23, 4, 63, 14, 55, 21, 34, 5, 19, 0, 45, 17, 52, 15, 25, 32, 0, 22, 40, 13, 45, 62, 18, 0, 43, 11, 33, 55, 30, 42, 57, 19, 51, 31, 22, 43, 18, 45, 34, 0, 43, 31, 56, 3, 23, 40, 59, 0, 44, 13, 48, 35, 2, 32, 46, 0, 21, 48, 35, 3, 40, 32, 43, 59, 0, 48, 33, 26, 53, 36, 55, 12, 51, 16, 55, 5, 18, 29, 11, 39, 51, 19, 45, 31, 42, 21, 35, 6, 22, 47, 10, 38, 23, 50, 20, 36, 0, 60, 38, 4, 50, 35, 48, 34, 24, 57, 9, 53, 28, 48, 61, 0, 56, 24, 53, 3, 63, 6, 42, 57 },
+ { 13, 53, 45, 40, 58, 27, 6, 16, 38, 51, 33, 30, 43, 2, 47, 56, 40, 50, 33, 57, 27, 5, 47, 42, 60, 36, 16, 54, 28, 4, 37, 57, 28, 51, 22, 8, 45, 14, 6, 39, 0, 54, 11, 59, 28, 12, 50, 21, 61, 13, 19, 38, 49, 11, 25, 37, 58, 29, 22, 63, 14, 56, 12, 53, 30, 63, 9, 57, 26, 12, 47, 16, 23, 39, 50, 6, 31, 2, 25, 6, 28, 41, 36, 22, 50, 57, 42, 3, 34, 8, 28, 61, 11, 50, 16, 54, 41, 0, 55, 43, 5, 29, 41, 63, 25, 16, 53, 18, 26, 10, 21, 0, 61, 30, 41, 22, 3, 38, 20, 39, 29, 8, 41, 16, 36, 52, 22, 19 },
+ { 55, 34, 0, 25, 10, 32, 56, 44, 28, 0, 57, 7, 26, 53, 23, 8, 13, 35, 22, 12, 36, 60, 20, 8, 14, 29, 48, 2, 41, 49, 23, 13, 39, 7, 48, 58, 25, 53, 34, 62, 28, 16, 48, 4, 37, 56, 27, 5, 36, 52, 46, 7, 62, 33, 52, 11, 17, 53, 5, 28, 41, 24, 38, 17, 5, 39, 20, 45, 15, 56, 5, 38, 60, 8, 14, 57, 21, 48, 62, 39, 59, 13, 1, 60, 9, 32, 16, 63, 44, 25, 52, 15, 36, 2, 60, 29, 12, 33, 25, 17, 59, 45, 13, 8, 49, 32, 6, 40, 59, 29, 45, 37, 13, 47, 6, 55, 30, 45, 9, 52, 13, 59, 25, 47, 32, 1, 49, 30 },
+ { 9, 39, 14, 61, 49, 37, 3, 20, 50, 13, 41, 19, 46, 17, 38, 59, 28, 62, 4, 44, 54, 1, 34, 51, 55, 7, 63, 32, 21, 8, 56, 31, 62, 19, 36, 1, 41, 17, 24, 12, 42, 35, 25, 52, 20, 8, 44, 59, 25, 2, 22, 42, 16, 29, 4, 46, 20, 36, 43, 9, 51, 8, 49, 26, 58, 33, 54, 1, 37, 29, 52, 20, 27, 45, 19, 35, 42, 16, 10, 32, 20, 49, 46, 27, 40, 4, 47, 22, 13, 55, 4, 47, 26, 44, 23, 40, 58, 19, 48, 13, 31, 2, 57, 34, 42, 19, 61, 32, 14, 55, 5, 51, 26, 19, 58, 16, 49, 14, 62, 5, 33, 44, 21, 7, 60, 26, 11, 41 },
+ { 62, 24, 47, 29, 8, 19, 53, 11, 60, 24, 32, 61, 4, 55, 31, 2, 49, 16, 39, 9, 31, 24, 43, 17, 26, 38, 11, 25, 58, 43, 12, 35, 3, 46, 15, 32, 63, 4, 49, 56, 2, 60, 10, 32, 63, 17, 39, 12, 55, 30, 57, 9, 48, 55, 39, 24, 60, 2, 58, 31, 19, 61, 34, 3, 42, 11, 22, 46, 7, 61, 10, 42, 3, 55, 32, 1, 58, 28, 44, 54, 4, 34, 23, 15, 56, 20, 37, 58, 6, 30, 38, 18, 63, 9, 32, 5, 51, 3, 62, 37, 52, 18, 39, 23, 3, 51, 9, 47, 1, 23, 43, 15, 60, 35, 11, 40, 1, 36, 31, 26, 57, 2, 37, 54, 18, 44, 58, 16 },
+ { 5, 51, 3, 33, 43, 62, 21, 42, 35, 9, 48, 15, 36, 10, 22, 42, 20, 46, 26, 56, 50, 12, 59, 3, 48, 19, 45, 53, 1, 27, 47, 17, 52, 24, 56, 11, 51, 21, 37, 30, 20, 46, 14, 41, 1, 47, 33, 7, 41, 17, 35, 27, 20, 1, 14, 54, 26, 33, 18, 47, 1, 44, 14, 59, 16, 52, 28, 18, 49, 31, 25, 34, 63, 13, 51, 24, 9, 50, 3, 23, 38, 63, 7, 52, 29, 46, 11, 33, 50, 22, 57, 36, 1, 57, 49, 17, 39, 28, 9, 35, 6, 27, 53, 15, 55, 30, 24, 58, 36, 41, 11, 52, 32, 3, 44, 25, 62, 23, 51, 15, 42, 22, 50, 10, 39, 4, 31, 35 },
+ { 46, 22, 57, 17, 12, 39, 26, 5, 31, 59, 1, 45, 27, 62, 52, 7, 58, 33, 6, 18, 39, 22, 33, 41, 57, 5, 35, 18, 40, 16, 60, 5, 29, 42, 7, 39, 27, 44, 9, 47, 8, 26, 54, 22, 51, 29, 24, 49, 15, 61, 4, 51, 31, 63, 43, 6, 50, 8, 39, 12, 53, 37, 23, 30, 40, 6, 62, 43, 14, 53, 2, 49, 7, 36, 17, 41, 61, 37, 18, 56, 11, 18, 44, 35, 2, 19, 61, 0, 41, 14, 8, 30, 43, 12, 24, 46, 14, 54, 42, 21, 44, 61, 10, 46, 37, 11, 44, 7, 18, 63, 20, 29, 7, 49, 28, 54, 8, 43, 4, 48, 18, 63, 12, 29, 48, 24, 59, 20 },
+ { 13, 36, 28, 54, 35, 2, 56, 46, 16, 49, 22, 40, 11, 34, 14, 43, 29, 12, 63, 48, 2, 61, 7, 15, 28, 30, 50, 9, 61, 33, 38, 23, 54, 13, 61, 33, 3, 59, 16, 35, 58, 40, 5, 38, 13, 57, 3, 58, 37, 21, 45, 12, 39, 7, 35, 30, 13, 56, 22, 62, 27, 6, 55, 10, 48, 21, 33, 2, 38, 23, 40, 20, 44, 29, 59, 4, 26, 12, 33, 47, 28, 53, 31, 13, 59, 41, 27, 49, 26, 54, 45, 16, 53, 21, 35, 7, 59, 26, 11, 56, 1, 24, 33, 4, 28, 62, 21, 49, 31, 2, 56, 39, 24, 58, 13, 17, 37, 21, 56, 10, 38, 0, 34, 55, 15, 43, 1, 52 },
+ { 42, 9, 50, 6, 25, 60, 14, 38, 10, 29, 53, 18, 57, 3, 25, 51, 0, 53, 25, 17, 29, 37, 52, 46, 0, 62, 14, 37, 4, 50, 10, 44, 0, 46, 20, 25, 50, 19, 55, 0, 23, 31, 62, 34, 11, 45, 19, 32, 0, 53, 10, 59, 23, 47, 18, 60, 42, 28, 37, 3, 50, 15, 35, 44, 0, 51, 27, 60, 9, 57, 16, 58, 11, 22, 46, 15, 53, 48, 7, 42, 0, 60, 5, 49, 24, 54, 9, 17, 39, 5, 34, 62, 3, 40, 60, 31, 0, 47, 29, 16, 49, 39, 59, 17, 50, 0, 40, 13, 53, 38, 16, 46, 0, 42, 34, 60, 2, 53, 29, 31, 58, 46, 27, 6, 61, 8, 37, 28 },
+ { 0, 63, 21, 40, 45, 18, 51, 23, 63, 34, 6, 43, 28, 38, 55, 19, 40, 35, 8, 41, 54, 10, 21, 32, 39, 23, 53, 26, 55, 28, 22, 63, 30, 34, 9, 48, 6, 38, 29, 43, 49, 6, 18, 52, 27, 61, 9, 43, 28, 42, 33, 26, 56, 3, 51, 23, 0, 48, 16, 45, 32, 25, 63, 20, 57, 17, 42, 12, 35, 47, 5, 31, 39, 56, 6, 30, 34, 21, 61, 25, 14, 40, 22, 38, 15, 6, 36, 56, 20, 60, 25, 12, 51, 27, 10, 56, 42, 20, 36, 63, 32, 6, 21, 41, 12, 34, 60, 26, 5, 48, 27, 10, 62, 19, 6, 47, 39, 14, 45, 7, 24, 17, 41, 32, 23, 51, 19, 56 },
+ { 45, 31, 15, 59, 4, 33, 7, 47, 0, 41, 13, 61, 4, 47, 9, 23, 60, 14, 57, 31, 4, 45, 59, 6, 58, 10, 44, 20, 8, 42, 15, 6, 55, 17, 58, 31, 53, 12, 61, 10, 15, 57, 43, 2, 23, 35, 48, 14, 54, 6, 18, 49, 15, 38, 11, 34, 62, 9, 21, 58, 11, 41, 4, 31, 38, 8, 29, 55, 19, 36, 27, 52, 0, 25, 50, 43, 1, 39, 8, 55, 35, 51, 10, 30, 45, 62, 29, 2, 46, 10, 32, 48, 18, 38, 5, 22, 33, 8, 51, 3, 14, 44, 54, 25, 57, 30, 18, 52, 33, 22, 59, 28, 36, 52, 32, 21, 26, 50, 5, 55, 35, 60, 14, 54, 4, 40, 16, 33 },
+ { 27, 3, 49, 10, 30, 40, 55, 27, 57, 24, 52, 21, 32, 17, 60, 30, 5, 44, 27, 49, 19, 34, 13, 24, 43, 36, 3, 49, 31, 59, 37, 48, 26, 41, 2, 41, 14, 36, 21, 32, 40, 26, 13, 49, 55, 5, 16, 40, 25, 60, 36, 1, 63, 29, 17, 44, 25, 40, 52, 5, 29, 47, 54, 13, 46, 24, 60, 4, 51, 22, 63, 14, 45, 18, 12, 62, 17, 57, 19, 42, 3, 26, 58, 48, 1, 21, 40, 52, 23, 37, 44, 1, 29, 58, 43, 50, 15, 61, 19, 45, 58, 28, 7, 48, 2, 46, 8, 42, 3, 55, 8, 50, 12, 4, 55, 10, 63, 33, 20, 40, 11, 3, 46, 20, 48, 26, 61, 11 },
+ { 44, 56, 24, 36, 53, 19, 12, 37, 16, 44, 7, 36, 49, 54, 11, 37, 48, 21, 15, 1, 62, 25, 47, 56, 16, 18, 51, 12, 40, 1, 24, 11, 52, 16, 23, 59, 28, 1, 45, 53, 4, 60, 37, 21, 39, 30, 63, 20, 52, 10, 30, 45, 8, 41, 54, 4, 57, 7, 34, 55, 36, 18, 23, 59, 2, 48, 11, 32, 44, 1, 41, 8, 33, 54, 38, 23, 30, 46, 6, 29, 62, 18, 32, 16, 55, 34, 14, 11, 61, 7, 55, 16, 53, 13, 23, 2, 55, 37, 26, 10, 33, 23, 36, 16, 38, 22, 56, 15, 24, 43, 35, 17, 44, 40, 25, 46, 16, 1, 57, 25, 49, 36, 28, 62, 9, 35, 7, 53 },
+ { 17, 38, 8, 61, 1, 50, 26, 62, 3, 31, 56, 15, 1, 26, 40, 2, 34, 51, 56, 36, 42, 9, 38, 2, 29, 60, 32, 57, 19, 62, 34, 47, 4, 57, 39, 7, 44, 63, 24, 18, 46, 28, 8, 54, 1, 34, 7, 46, 3, 37, 50, 23, 57, 21, 13, 46, 31, 20, 43, 15, 1, 61, 8, 33, 37, 17, 56, 26, 15, 49, 24, 59, 28, 3, 56, 9, 52, 32, 13, 49, 10, 43, 5, 45, 8, 25, 59, 42, 28, 33, 19, 40, 8, 63, 35, 47, 25, 4, 40, 52, 1, 60, 12, 53, 63, 9, 29, 60, 37, 19, 1, 62, 31, 20, 58, 12, 41, 30, 43, 9, 18, 52, 22, 1, 39, 30, 58, 21 },
+ { 13, 47, 29, 18, 43, 34, 5, 48, 20, 42, 10, 45, 30, 58, 20, 63, 24, 11, 6, 28, 54, 14, 22, 52, 41, 7, 26, 5, 45, 15, 53, 13, 35, 27, 18, 50, 12, 33, 5, 56, 10, 17, 45, 24, 59, 15, 50, 26, 56, 13, 19, 5, 32, 52, 27, 36, 2, 61, 12, 26, 49, 40, 27, 52, 13, 50, 6, 39, 61, 34, 10, 37, 48, 20, 41, 27, 2, 36, 59, 24, 54, 33, 63, 20, 38, 50, 3, 17, 52, 4, 58, 27, 45, 21, 32, 11, 48, 17, 57, 20, 46, 38, 25, 43, 4, 34, 51, 6, 13, 45, 57, 26, 6, 48, 2, 35, 53, 23, 61, 34, 59, 6, 42, 56, 13, 51, 2, 41 },
+ { 32, 5, 55, 23, 58, 14, 22, 52, 29, 15, 61, 25, 51, 8, 43, 13, 53, 41, 46, 20, 3, 33, 63, 11, 48, 21, 54, 38, 28, 3, 30, 43, 21, 62, 9, 31, 55, 22, 51, 29, 37, 62, 32, 12, 42, 29, 41, 9, 33, 44, 62, 28, 43, 1, 59, 19, 48, 30, 51, 39, 24, 4, 58, 19, 42, 29, 22, 43, 3, 18, 53, 5, 13, 50, 16, 60, 45, 21, 7, 40, 15, 0, 26, 53, 13, 31, 43, 24, 47, 31, 15, 49, 2, 41, 6, 59, 29, 42, 9, 30, 14, 7, 49, 18, 31, 47, 20, 39, 49, 32, 11, 41, 54, 15, 61, 18, 7, 38, 4, 13, 44, 28, 15, 32, 45, 19, 27, 49 },
+ { 63, 34, 11, 39, 2, 45, 37, 8, 59, 39, 33, 4, 36, 17, 48, 5, 29, 18, 32, 61, 39, 50, 5, 27, 35, 0, 46, 12, 22, 49, 60, 6, 54, 0, 38, 49, 2, 42, 15, 40, 0, 47, 20, 51, 3, 57, 18, 61, 22, 0, 39, 16, 55, 12, 35, 8, 41, 22, 6, 59, 16, 45, 10, 36, 0, 62, 9, 54, 30, 58, 21, 43, 63, 31, 7, 35, 12, 48, 58, 28, 47, 37, 41, 9, 57, 20, 61, 0, 36, 11, 57, 35, 23, 52, 37, 18, 0, 62, 22, 55, 35, 62, 27, 54, 0, 15, 61, 28, 2, 59, 22, 9, 37, 27, 33, 51, 29, 48, 19, 50, 25, 37, 10, 57, 5, 37, 60, 8 },
+ { 20, 25, 46, 52, 31, 60, 12, 55, 0, 19, 11, 46, 62, 35, 23, 38, 57, 0, 55, 10, 16, 30, 58, 44, 17, 59, 29, 63, 42, 8, 36, 20, 33, 46, 16, 61, 25, 35, 8, 54, 26, 7, 58, 22, 34, 6, 47, 14, 53, 31, 48, 9, 37, 25, 49, 63, 16, 55, 45, 14, 34, 63, 21, 53, 25, 33, 46, 16, 35, 7, 46, 29, 0, 39, 25, 55, 22, 34, 18, 4, 56, 11, 23, 51, 28, 6, 39, 14, 62, 44, 19, 8, 60, 12, 56, 28, 50, 34, 39, 5, 51, 3, 41, 12, 57, 35, 10, 53, 25, 17, 52, 30, 47, 0, 43, 14, 5, 57, 31, 55, 0, 63, 47, 23, 54, 24, 14, 43 },
+ { 0, 57, 16, 6, 26, 19, 35, 28, 49, 42, 54, 26, 21, 1, 59, 27, 9, 47, 26, 44, 50, 22, 13, 40, 8, 37, 10, 34, 17, 56, 25, 58, 13, 27, 44, 9, 20, 58, 31, 17, 60, 36, 10, 41, 53, 25, 36, 39, 4, 24, 58, 17, 60, 4, 22, 38, 10, 32, 0, 50, 31, 7, 28, 47, 12, 57, 5, 26, 52, 23, 14, 40, 57, 17, 47, 5, 53, 1, 44, 31, 19, 60, 46, 2, 35, 48, 30, 54, 22, 5, 51, 39, 25, 31, 4, 43, 14, 9, 45, 16, 24, 44, 19, 29, 40, 23, 44, 7, 38, 42, 4, 63, 12, 54, 23, 59, 22, 42, 8, 15, 40, 21, 8, 34, 3, 41, 30, 50 },
+ { 39, 10, 48, 33, 41, 54, 5, 47, 23, 13, 32, 7, 52, 44, 14, 39, 58, 18, 35, 6, 37, 2, 60, 24, 55, 19, 53, 2, 51, 32, 1, 41, 51, 4, 40, 29, 47, 3, 52, 44, 13, 49, 28, 16, 1, 62, 11, 27, 52, 35, 5, 42, 29, 47, 14, 56, 28, 53, 26, 38, 9, 56, 40, 3, 38, 15, 41, 60, 1, 37, 50, 25, 11, 28, 61, 19, 42, 62, 10, 52, 39, 6, 32, 14, 58, 17, 7, 26, 42, 34, 27, 10, 54, 40, 20, 63, 26, 53, 21, 61, 32, 7, 59, 48, 3, 56, 18, 31, 58, 14, 49, 21, 36, 16, 45, 9, 36, 24, 62, 45, 27, 31, 53, 17, 49, 12, 62, 18 },
+ { 28, 59, 21, 58, 2, 16, 38, 9, 62, 3, 56, 41, 10, 31, 50, 4, 32, 52, 12, 63, 23, 46, 33, 31, 4, 48, 25, 43, 14, 23, 47, 11, 22, 55, 14, 60, 23, 37, 11, 39, 23, 2, 45, 56, 31, 43, 19, 55, 16, 46, 21, 51, 11, 33, 44, 2, 41, 18, 5, 52, 23, 44, 17, 60, 27, 49, 11, 32, 44, 10, 54, 2, 56, 33, 8, 38, 13, 29, 36, 16, 24, 63, 27, 51, 21, 43, 56, 12, 49, 3, 59, 48, 1, 15, 46, 7, 36, 2, 47, 11, 50, 27, 37, 13, 33, 8, 51, 46, 1, 34, 28, 40, 3, 33, 60, 29, 47, 1, 35, 11, 59, 42, 2, 60, 26, 46, 6, 35 },
+ { 4, 43, 9, 29, 36, 63, 24, 44, 20, 50, 30, 17, 60, 22, 16, 43, 25, 3, 42, 19, 51, 15, 8, 54, 42, 15, 61, 5, 39, 57, 18, 61, 31, 48, 34, 2, 50, 19, 57, 5, 63, 33, 19, 38, 13, 27, 48, 7, 32, 61, 2, 26, 58, 6, 24, 50, 13, 61, 42, 20, 62, 2, 35, 20, 51, 4, 62, 18, 23, 58, 20, 31, 43, 15, 51, 45, 26, 50, 4, 55, 45, 3, 35, 9, 38, 1, 32, 61, 20, 45, 17, 33, 24, 57, 29, 51, 22, 58, 38, 30, 15, 1, 54, 21, 63, 43, 26, 12, 24, 56, 8, 60, 50, 19, 5, 52, 13, 54, 17, 50, 4, 16, 36, 12, 32, 56, 22, 54 },
+ { 51, 25, 40, 53, 12, 49, 15, 57, 34, 7, 38, 47, 2, 36, 55, 8, 61, 30, 56, 7, 28, 59, 48, 11, 27, 35, 21, 45, 28, 36, 9, 38, 6, 16, 24, 63, 10, 32, 28, 43, 21, 53, 5, 60, 8, 57, 3, 45, 11, 37, 15, 54, 40, 20, 62, 36, 27, 34, 11, 48, 30, 15, 54, 8, 30, 42, 22, 34, 48, 13, 35, 63, 4, 37, 22, 2, 59, 9, 41, 23, 13, 41, 49, 18, 59, 24, 40, 5, 37, 30, 9, 61, 44, 6, 37, 11, 33, 17, 5, 55, 41, 60, 23, 39, 17, 5, 30, 62, 41, 16, 46, 25, 11, 56, 39, 26, 20, 38, 29, 39, 22, 52, 44, 20, 48, 1, 38, 14 },
+ { 15, 33, 2, 18, 44, 6, 27, 0, 32, 61, 25, 12, 58, 28, 40, 20, 47, 13, 34, 43, 38, 1, 23, 62, 40, 0, 51, 10, 63, 3, 52, 26, 44, 30, 45, 6, 41, 54, 0, 51, 12, 30, 46, 24, 49, 22, 40, 33, 63, 23, 43, 30, 9, 47, 0, 17, 54, 7, 57, 3, 37, 47, 24, 46, 13, 55, 7, 52, 2, 42, 6, 26, 49, 18, 60, 34, 16, 57, 33, 20, 61, 30, 8, 54, 14, 46, 12, 53, 16, 55, 38, 13, 22, 53, 18, 59, 46, 27, 43, 19, 32, 10, 45, 6, 49, 36, 52, 2, 20, 55, 6, 39, 32, 15, 44, 3, 58, 10, 63, 6, 56, 30, 7, 58, 9, 40, 19, 63 },
+ { 10, 47, 61, 23, 55, 31, 52, 42, 17, 45, 4, 51, 27, 6, 15, 53, 0, 49, 26, 10, 56, 18, 36, 6, 20, 58, 32, 30, 13, 49, 19, 56, 0, 59, 12, 53, 27, 17, 38, 25, 48, 9, 15, 36, 14, 30, 59, 17, 0, 50, 8, 58, 18, 56, 31, 45, 21, 41, 29, 19, 60, 6, 32, 59, 0, 36, 29, 39, 19, 59, 46, 12, 55, 30, 10, 47, 24, 3, 28, 48, 0, 55, 44, 27, 33, 4, 63, 29, 49, 0, 26, 50, 34, 2, 42, 14, 0, 62, 9, 56, 3, 52, 28, 34, 58, 9, 20, 48, 37, 32, 22, 53, 0, 62, 27, 49, 34, 46, 21, 33, 41, 14, 25, 37, 53, 29, 31, 45 },
+ { 56, 28, 7, 37, 11, 36, 20, 9, 54, 14, 39, 19, 34, 63, 45, 37, 24, 17, 60, 31, 21, 45, 53, 29, 47, 15, 7, 55, 40, 23, 34, 14, 42, 20, 37, 35, 15, 59, 7, 62, 34, 40, 59, 1, 51, 42, 10, 28, 54, 21, 35, 5, 38, 13, 36, 4, 59, 12, 39, 53, 15, 43, 9, 21, 39, 62, 16, 56, 25, 9, 32, 38, 0, 41, 14, 51, 40, 53, 43, 11, 37, 17, 5, 22, 57, 39, 19, 7, 42, 21, 60, 10, 31, 63, 25, 52, 30, 49, 36, 25, 48, 17, 61, 14, 22, 42, 29, 13, 60, 11, 47, 18, 35, 41, 7, 23, 4, 16, 51, 11, 0, 48, 61, 3, 17, 50, 5, 24 },
+ { 0, 42, 21, 49, 60, 3, 57, 40, 29, 48, 23, 56, 42, 11, 22, 5, 59, 39, 4, 50, 3, 41, 12, 57, 25, 50, 44, 18, 4, 46, 7, 62, 33, 50, 4, 56, 21, 32, 43, 18, 3, 23, 55, 34, 20, 4, 53, 38, 12, 46, 29, 52, 25, 61, 23, 51, 26, 46, 1, 34, 25, 57, 28, 51, 26, 11, 50, 3, 44, 28, 53, 21, 57, 27, 62, 6, 31, 19, 8, 63, 26, 59, 36, 47, 15, 29, 50, 25, 35, 47, 18, 41, 4, 48, 8, 40, 12, 23, 6, 44, 13, 40, 1, 31, 55, 0, 61, 43, 4, 50, 26, 58, 9, 53, 24, 61, 42, 55, 31, 43, 57, 20, 34, 27, 43, 8, 59, 39 },
+ { 18, 51, 30, 13, 26, 16, 46, 22, 2, 59, 8, 30, 1, 48, 33, 51, 29, 9, 46, 16, 62, 14, 33, 2, 38, 9, 27, 60, 37, 26, 53, 17, 28, 10, 24, 46, 2, 49, 8, 57, 29, 45, 6, 26, 62, 44, 18, 25, 61, 3, 42, 14, 49, 10, 43, 6, 17, 32, 63, 10, 49, 4, 40, 14, 45, 33, 22, 37, 12, 61, 5, 17, 43, 7, 23, 37, 15, 58, 49, 13, 39, 21, 10, 52, 1, 62, 9, 56, 12, 2, 58, 28, 36, 16, 56, 28, 56, 35, 20, 63, 24, 37, 51, 8, 45, 25, 16, 33, 27, 38, 2, 44, 13, 30, 17, 36, 12, 26, 5, 18, 28, 47, 13, 60, 23, 45, 13, 33 },
+ { 55, 4, 62, 34, 52, 38, 7, 63, 32, 37, 13, 53, 25, 62, 18, 12, 55, 41, 27, 35, 24, 49, 31, 52, 17, 63, 34, 1, 56, 12, 41, 2, 48, 58, 39, 16, 61, 27, 41, 52, 13, 19, 50, 39, 11, 31, 57, 6, 32, 40, 20, 55, 1, 28, 33, 57, 48, 8, 37, 22, 44, 18, 53, 1, 61, 5, 54, 16, 47, 36, 50, 24, 55, 34, 48, 45, 1, 30, 33, 46, 2, 50, 32, 42, 25, 34, 43, 21, 38, 52, 23, 45, 14, 54, 21, 4, 44, 16, 53, 29, 10, 47, 19, 57, 12, 54, 39, 10, 51, 15, 63, 21, 57, 40, 51, 1, 48, 57, 37, 62, 2, 38, 9, 52, 1, 35, 58, 22 },
+ { 36, 46, 10, 42, 1, 27, 43, 15, 50, 21, 45, 16, 41, 3, 35, 44, 20, 1, 57, 11, 55, 7, 43, 8, 22, 42, 13, 46, 21, 39, 31, 60, 22, 5, 29, 44, 11, 35, 20, 4, 36, 58, 32, 15, 47, 2, 36, 48, 16, 60, 8, 35, 44, 63, 16, 2, 40, 26, 55, 14, 58, 35, 24, 31, 19, 42, 31, 58, 1, 29, 10, 40, 2, 19, 12, 54, 22, 61, 7, 24, 56, 5, 28, 16, 54, 3, 15, 58, 6, 30, 8, 62, 1, 43, 31, 47, 7, 59, 1, 38, 58, 4, 34, 27, 38, 5, 31, 59, 7, 46, 30, 3, 34, 6, 28, 59, 20, 8, 32, 15, 53, 24, 55, 31, 19, 49, 11, 26 },
+ { 2, 24, 16, 58, 19, 55, 5, 35, 10, 61, 4, 28, 57, 24, 58, 7, 31, 47, 22, 38, 19, 28, 61, 36, 54, 5, 59, 29, 6, 52, 15, 11, 43, 36, 8, 54, 52, 1, 62, 25, 47, 9, 1, 60, 28, 53, 24, 14, 46, 27, 51, 22, 12, 24, 38, 53, 20, 11, 51, 3, 29, 7, 48, 63, 8, 49, 9, 21, 52, 14, 63, 32, 46, 60, 35, 4, 41, 16, 52, 35, 18, 42, 59, 7, 36, 61, 45, 27, 33, 51, 19, 39, 34, 11, 61, 18, 33, 41, 28, 15, 54, 22, 42, 3, 49, 21, 47, 18, 36, 23, 55, 19, 48, 24, 45, 10, 33, 44, 50, 40, 7, 35, 15, 41, 63, 6, 40, 54 },
+ { 62, 41, 32, 8, 47, 28, 60, 24, 44, 30, 38, 49, 9, 33, 14, 40, 50, 14, 60, 2, 54, 40, 0, 20, 25, 39, 16, 49, 24, 35, 57, 47, 19, 61, 33, 18, 23, 37, 13, 55, 31, 43, 22, 41, 17, 8, 42, 58, 0, 37, 5, 56, 31, 54, 7, 30, 60, 33, 42, 17, 59, 39, 12, 27, 38, 17, 35, 41, 27, 45, 20, 7, 25, 15, 29, 58, 27, 47, 11, 40, 14, 54, 23, 46, 19, 31, 11, 40, 13, 49, 5, 58, 24, 51, 26, 6, 50, 20, 49, 9, 32, 46, 17, 60, 14, 63, 24, 1, 57, 41, 9, 43, 14, 62, 16, 52, 3, 27, 14, 22, 61, 45, 4, 28, 9, 47, 29, 17 },
+ { 5, 50, 12, 53, 38, 18, 11, 51, 0, 55, 17, 6, 47, 54, 19, 63, 5, 26, 34, 45, 13, 30, 47, 58, 10, 48, 32, 3, 62, 9, 26, 0, 25, 14, 50, 3, 47, 30, 42, 16, 6, 63, 12, 49, 33, 55, 21, 10, 34, 63, 18, 41, 3, 47, 19, 43, 0, 49, 8, 28, 46, 20, 52, 0, 56, 24, 60, 3, 59, 5, 39, 57, 48, 52, 9, 38, 3, 21, 26, 60, 0, 32, 12, 38, 4, 48, 53, 0, 60, 15, 29, 44, 18, 10, 38, 57, 13, 60, 2, 26, 62, 7, 50, 29, 35, 8, 40, 53, 28, 12, 60, 33, 38, 5, 37, 29, 60, 39, 56, 0, 30, 18, 50, 34, 59, 25, 14, 44 },
+ { 20, 31, 60, 22, 3, 49, 33, 25, 40, 13, 34, 59, 22, 36, 0, 28, 37, 56, 8, 18, 51, 16, 4, 45, 27, 12, 53, 42, 18, 44, 51, 31, 55, 40, 28, 58, 7, 60, 10, 51, 27, 37, 24, 56, 5, 26, 44, 29, 50, 23, 45, 11, 34, 15, 59, 27, 13, 23, 62, 37, 4, 57, 15, 32, 42, 6, 47, 11, 30, 43, 23, 13, 0, 36, 18, 44, 63, 51, 37, 29, 49, 20, 57, 27, 62, 9, 24, 35, 23, 53, 37, 3, 42, 55, 0, 36, 23, 39, 31, 43, 17, 37, 24, 11, 52, 43, 19, 32, 5, 50, 26, 0, 56, 21, 54, 11, 19, 6, 47, 25, 59, 42, 12, 54, 21, 3, 38, 57 },
+ { 48, 0, 35, 27, 44, 14, 59, 7, 57, 46, 26, 2, 42, 12, 52, 43, 10, 27, 53, 42, 32, 62, 37, 21, 34, 61, 7, 23, 36, 4, 38, 12, 41, 5, 17, 45, 22, 27, 39, 21, 59, 0, 45, 18, 39, 62, 3, 38, 14, 7, 54, 26, 61, 39, 9, 52, 45, 36, 18, 50, 10, 34, 44, 22, 50, 14, 36, 55, 17, 34, 53, 62, 33, 26, 56, 6, 31, 12, 6, 53, 9, 44, 2, 50, 20, 40, 55, 17, 47, 7, 26, 63, 22, 32, 48, 16, 46, 8, 52, 12, 57, 41, 0, 56, 25, 3, 61, 14, 45, 35, 18, 44, 12, 46, 23, 42, 32, 51, 35, 10, 17, 36, 23, 1, 45, 52, 32, 10 },
+ { 37, 15, 43, 8, 63, 39, 21, 31, 16, 37, 19, 62, 30, 46, 17, 60, 21, 48, 1, 23, 6, 25, 11, 56, 1, 40, 30, 58, 15, 54, 21, 59, 9, 63, 35, 56, 11, 51, 2, 46, 34, 14, 53, 7, 30, 11, 51, 19, 60, 40, 30, 1, 24, 50, 20, 32, 3, 56, 5, 25, 31, 13, 61, 2, 29, 60, 25, 20, 51, 2, 27, 8, 18, 42, 10, 45, 21, 34, 43, 17, 62, 29, 41, 14, 34, 6, 30, 43, 2, 57, 33, 13, 45, 12, 27, 62, 4, 55, 21, 35, 5, 27, 45, 33, 16, 47, 30, 54, 22, 10, 51, 27, 63, 7, 49, 1, 58, 22, 15, 43, 53, 7, 57, 39, 27, 12, 61, 24 },
+ { 56, 51, 26, 56, 19, 2, 41, 54, 5, 52, 9, 48, 6, 23, 39, 4, 32, 15, 63, 35, 59, 49, 43, 15, 52, 19, 50, 9, 46, 33, 1, 29, 48, 20, 32, 1, 38, 33, 19, 54, 9, 32, 24, 48, 58, 35, 16, 48, 4, 52, 13, 57, 33, 5, 45, 59, 15, 29, 41, 55, 47, 39, 23, 53, 9, 40, 4, 57, 10, 44, 48, 40, 50, 14, 61, 24, 55, 1, 59, 22, 33, 8, 51, 25, 58, 46, 11, 59, 20, 41, 17, 51, 6, 56, 35, 25, 42, 30, 15, 58, 48, 18, 61, 9, 58, 39, 13, 2, 37, 59, 40, 2, 31, 16, 34, 41, 8, 30, 62, 3, 29, 48, 33, 5, 63, 16, 41, 7 },
+ { 22, 4, 46, 11, 33, 51, 29, 10, 62, 24, 43, 27, 15, 58, 50, 25, 54, 44, 9, 38, 18, 3, 29, 57, 32, 5, 26, 43, 17, 61, 24, 52, 8, 42, 23, 53, 15, 61, 7, 28, 57, 43, 4, 40, 20, 2, 43, 25, 32, 35, 21, 43, 17, 48, 10, 22, 38, 54, 11, 21, 1, 58, 16, 30, 48, 18, 46, 32, 38, 13, 22, 4, 59, 35, 2, 51, 30, 39, 15, 47, 4, 56, 13, 37, 1, 28, 16, 52, 32, 9, 61, 29, 38, 19, 3, 52, 10, 48, 1, 32, 11, 40, 20, 36, 6, 22, 49, 29, 55, 6, 20, 56, 36, 52, 19, 60, 26, 46, 18, 54, 40, 13, 20, 46, 35, 19, 49, 29 },
+ { 61, 17, 34, 53, 23, 6, 48, 35, 20, 40, 1, 56, 36, 29, 11, 34, 7, 41, 14, 30, 55, 20, 46, 8, 24, 38, 63, 2, 37, 10, 45, 14, 34, 49, 6, 13, 44, 25, 49, 41, 21, 12, 61, 15, 54, 29, 63, 12, 56, 8, 49, 2, 62, 36, 28, 61, 0, 25, 41, 63, 35, 8, 44, 6, 37, 62, 7, 21, 63, 28, 55, 31, 16, 24, 41, 19, 9, 57, 27, 36, 18, 42, 31, 62, 22, 55, 38, 4, 27, 47, 1, 40, 14, 54, 43, 20, 60, 23, 38, 63, 25, 51, 2, 53, 26, 63, 10, 42, 17, 34, 47, 25, 13, 5, 44, 11, 55, 2, 38, 27, 6, 60, 52, 25, 9, 55, 1, 40 },
+ { 8, 30, 58, 3, 42, 61, 17, 38, 13, 59, 32, 10, 54, 3, 51, 20, 61, 26, 57, 2, 46, 33, 12, 60, 41, 13, 48, 29, 55, 20, 39, 27, 57, 18, 62, 29, 55, 2, 31, 16, 37, 50, 26, 36, 6, 46, 9, 41, 27, 57, 23, 39, 26, 6, 51, 12, 31, 46, 7, 16, 27, 52, 19, 56, 26, 12, 33, 53, 1, 41, 8, 57, 46, 7, 54, 32, 47, 5, 49, 11, 60, 23, 5, 48, 10, 43, 19, 63, 35, 24, 49, 21, 59, 5, 31, 37, 14, 44, 7, 42, 6, 30, 46, 13, 44, 32, 19, 50, 4, 58, 8, 30, 62, 38, 28, 53, 21, 36, 13, 50, 21, 33, 15, 2, 44, 31, 14, 47 },
+ { 37, 13, 39, 16, 28, 9, 57, 0, 25, 49, 21, 45, 18, 47, 12, 42, 0, 49, 22, 39, 16, 53, 25, 36, 0, 52, 22, 16, 6, 60, 4, 51, 0, 26, 37, 47, 10, 36, 63, 5, 57, 0, 18, 59, 23, 33, 51, 19, 0, 44, 15, 11, 54, 17, 42, 35, 53, 18, 58, 33, 49, 4, 34, 42, 0, 50, 43, 25, 16, 49, 34, 20, 37, 28, 12, 63, 16, 38, 25, 44, 0, 40, 52, 17, 35, 3, 50, 14, 8, 53, 11, 36, 25, 45, 9, 62, 0, 54, 28, 17, 50, 55, 15, 24, 57, 0, 53, 34, 23, 41, 15, 45, 0, 49, 16, 4, 48, 9, 63, 45, 0, 42, 58, 37, 61, 22, 54, 26 },
+ { 0, 50, 21, 47, 54, 36, 27, 45, 52, 4, 34, 15, 63, 29, 37, 59, 17, 31, 6, 61, 28, 5, 48, 18, 59, 27, 34, 56, 44, 31, 35, 12, 41, 59, 16, 3, 40, 20, 50, 22, 30, 40, 52, 10, 45, 3, 59, 22, 37, 61, 29, 46, 31, 58, 2, 22, 9, 43, 3, 39, 14, 61, 24, 54, 15, 29, 11, 60, 39, 17, 5, 61, 0, 44, 50, 3, 31, 14, 58, 21, 54, 28, 15, 45, 60, 26, 33, 58, 44, 22, 60, 2, 57, 34, 49, 27, 18, 34, 21, 59, 29, 4, 36, 41, 8, 39, 28, 11, 62, 26, 53, 20, 35, 24, 59, 32, 29, 39, 24, 31, 57, 23, 11, 28, 5, 36, 11, 59 },
+ { 44, 32, 63, 5, 20, 12, 41, 7, 30, 61, 42, 8, 39, 5, 33, 8, 24, 53, 45, 11, 37, 58, 7, 44, 10, 50, 3, 40, 8, 22, 53, 19, 46, 9, 33, 52, 24, 58, 8, 44, 13, 47, 8, 34, 38, 30, 14, 47, 7, 34, 4, 55, 9, 19, 40, 49, 56, 26, 60, 21, 30, 45, 10, 19, 40, 58, 23, 36, 3, 52, 45, 23, 54, 13, 22, 42, 53, 45, 7, 33, 10, 36, 57, 6, 29, 12, 41, 0, 30, 15, 41, 30, 17, 7, 16, 53, 40, 56, 2, 39, 12, 61, 10, 52, 31, 60, 16, 45, 1, 37, 7, 61, 40, 10, 43, 17, 58, 7, 54, 14, 4, 51, 39, 49, 18, 56, 42, 20 },
+ { 14, 6, 24, 36, 56, 49, 22, 60, 18, 14, 23, 51, 26, 57, 21, 52, 41, 14, 35, 50, 19, 31, 40, 23, 33, 14, 63, 17, 32, 47, 7, 62, 23, 30, 56, 11, 42, 27, 14, 60, 35, 19, 28, 61, 17, 55, 25, 39, 53, 17, 42, 21, 38, 63, 25, 5, 14, 36, 12, 50, 1, 37, 59, 32, 2, 51, 6, 56, 27, 32, 11, 30, 38, 26, 60, 8, 26, 19, 62, 39, 50, 2, 21, 39, 53, 23, 56, 19, 49, 39, 5, 46, 55, 23, 42, 4, 31, 11, 47, 26, 45, 22, 48, 18, 21, 5, 48, 25, 57, 14, 47, 30, 3, 56, 12, 50, 1, 42, 19, 47, 35, 17, 8, 30, 45, 25, 4, 51 },
+ { 28, 58, 43, 1, 31, 8, 33, 2, 44, 55, 32, 1, 60, 12, 46, 27, 4, 62, 23, 1, 56, 13, 62, 2, 54, 36, 25, 51, 1, 57, 26, 42, 3, 49, 17, 38, 1, 48, 31, 4, 54, 3, 50, 24, 1, 49, 5, 63, 13, 27, 52, 1, 48, 13, 45, 33, 52, 30, 46, 20, 55, 28, 6, 48, 24, 38, 20, 47, 14, 62, 48, 9, 58, 4, 36, 30, 56, 1, 34, 12, 18, 63, 25, 48, 4, 16, 37, 7, 62, 10, 52, 28, 13, 50, 36, 63, 24, 51, 15, 58, 8, 33, 1, 38, 56, 35, 42, 9, 33, 51, 22, 18, 48, 32, 27, 37, 23, 61, 33, 11, 59, 29, 62, 1, 53, 10, 60, 33 },
+ { 12, 39, 17, 52, 26, 46, 53, 38, 25, 11, 48, 36, 16, 43, 2, 35, 55, 17, 39, 29, 43, 9, 28, 45, 20, 5, 46, 12, 42, 28, 13, 52, 36, 6, 60, 22, 54, 17, 62, 39, 25, 42, 15, 55, 44, 20, 31, 10, 35, 57, 24, 32, 29, 6, 59, 18, 7, 62, 3, 41, 10, 44, 16, 54, 13, 62, 31, 9, 41, 1, 21, 43, 18, 47, 15, 40, 11, 49, 28, 55, 46, 30, 8, 43, 32, 61, 28, 47, 25, 34, 21, 61, 32, 1, 20, 9, 46, 6, 35, 19, 41, 54, 27, 63, 14, 3, 51, 20, 62, 2, 38, 55, 8, 21, 63, 6, 46, 9, 26, 51, 3, 24, 43, 34, 16, 41, 18, 48 },
+ { 62, 23, 55, 9, 15, 62, 19, 13, 58, 40, 6, 30, 54, 19, 50, 31, 10, 44, 6, 59, 21, 47, 51, 15, 60, 39, 30, 54, 21, 61, 19, 33, 14, 29, 43, 11, 34, 45, 7, 21, 10, 56, 36, 6, 38, 11, 58, 42, 2, 47, 11, 60, 50, 16, 41, 28, 38, 23, 47, 17, 35, 63, 22, 33, 42, 5, 45, 17, 53, 35, 25, 56, 33, 6, 51, 19, 60, 23, 43, 15, 5, 40, 58, 13, 51, 1, 45, 11, 54, 3, 43, 8, 37, 48, 59, 29, 39, 21, 61, 43, 3, 31, 10, 44, 24, 29, 60, 12, 28, 40, 11, 25, 43, 52, 14, 41, 16, 57, 44, 20, 40, 55, 12, 21, 57, 27, 35, 2 },
+ { 37, 6, 31, 42, 40, 4, 29, 50, 0, 20, 63, 28, 9, 58, 14, 24, 63, 26, 48, 16, 34, 4, 32, 38, 23, 11, 58, 4, 37, 9, 45, 5, 63, 48, 26, 57, 2, 28, 32, 51, 46, 29, 13, 62, 27, 46, 28, 18, 50, 15, 40, 4, 19, 34, 54, 0, 53, 9, 26, 58, 28, 5, 49, 0, 57, 27, 19, 60, 29, 8, 59, 12, 37, 63, 24, 46, 3, 37, 6, 52, 26, 32, 20, 36, 9, 22, 59, 18, 35, 51, 14, 57, 17, 24, 12, 44, 56, 0, 30, 13, 59, 20, 49, 17, 54, 43, 6, 34, 46, 17, 58, 36, 0, 34, 29, 54, 25, 2, 36, 15, 60, 6, 37, 46, 4, 50, 9, 45 },
+ { 19, 59, 48, 3, 24, 60, 44, 22, 34, 51, 15, 45, 41, 5, 33, 47, 0, 37, 12, 55, 25, 54, 8, 57, 0, 47, 18, 34, 49, 15, 55, 24, 40, 20, 8, 35, 53, 13, 41, 18, 0, 59, 22, 33, 4, 52, 8, 60, 24, 36, 31, 56, 45, 26, 10, 43, 15, 56, 36, 4, 51, 14, 39, 30, 12, 55, 36, 2, 39, 49, 4, 44, 17, 0, 32, 13, 53, 35, 59, 17, 62, 0, 55, 24, 52, 38, 31, 6, 42, 19, 29, 40, 4, 54, 33, 5, 16, 27, 52, 37, 23, 55, 7, 37, 0, 39, 23, 49, 4, 53, 31, 15, 59, 10, 50, 4, 60, 34, 48, 7, 31, 49, 27, 14, 62, 22, 53, 29 },
+ { 46, 21, 14, 51, 36, 17, 7, 57, 10, 32, 3, 37, 22, 60, 39, 18, 56, 20, 42, 3, 36, 10, 44, 26, 41, 29, 53, 27, 2, 39, 30, 52, 0, 59, 15, 48, 23, 61, 6, 58, 37, 12, 40, 49, 16, 39, 20, 44, 0, 62, 8, 21, 3, 59, 23, 32, 49, 31, 12, 44, 22, 59, 18, 50, 24, 7, 43, 52, 15, 23, 41, 26, 51, 28, 55, 39, 21, 27, 10, 42, 12, 45, 27, 47, 3, 15, 63, 26, 55, 0, 60, 26, 45, 18, 62, 38, 58, 49, 8, 47, 4, 33, 46, 29, 57, 13, 56, 16, 59, 21, 5, 47, 23, 39, 18, 44, 13, 22, 28, 53, 19, 0, 58, 32, 41, 7, 26, 13 },
+ { 0, 56, 34, 28, 11, 55, 31, 47, 26, 41, 56, 13, 53, 28, 11, 49, 7, 52, 32, 61, 50, 22, 63, 17, 13, 56, 7, 19, 43, 62, 10, 21, 37, 32, 43, 4, 38, 19, 44, 25, 31, 54, 5, 23, 61, 30, 53, 12, 35, 22, 43, 53, 37, 48, 7, 62, 20, 2, 61, 41, 8, 34, 47, 9, 63, 34, 28, 10, 55, 33, 14, 57, 7, 47, 9, 61, 4, 49, 31, 50, 21, 38, 8, 16, 57, 44, 33, 5, 49, 36, 12, 50, 7, 34, 10, 25, 2, 22, 36, 15, 26, 61, 18, 9, 22, 46, 32, 8, 27, 37, 44, 30, 55, 3, 62, 24, 38, 56, 5, 45, 38, 24, 43, 10, 19, 54, 39, 61 },
+ { 41, 30, 8, 63, 43, 23, 38, 3, 62, 19, 8, 49, 25, 1, 58, 30, 23, 40, 9, 28, 18, 40, 6, 38, 49, 22, 35, 59, 8, 27, 50, 5, 56, 17, 11, 50, 30, 9, 55, 2, 51, 19, 34, 47, 9, 41, 6, 26, 48, 57, 14, 28, 17, 12, 39, 13, 37, 46, 25, 19, 54, 27, 1, 37, 16, 45, 20, 60, 1, 48, 20, 38, 31, 22, 42, 15, 19, 44, 1, 61, 6, 34, 56, 40, 29, 10, 20, 46, 13, 22, 41, 23, 59, 42, 30, 51, 45, 13, 63, 53, 42, 12, 51, 38, 62, 2, 26, 41, 50, 1, 61, 10, 19, 42, 31, 8, 49, 32, 12, 63, 9, 52, 16, 56, 36, 2, 31, 16 },
+ { 52, 5, 47, 20, 1, 53, 12, 50, 16, 35, 43, 21, 33, 43, 16, 44, 3, 59, 14, 46, 1, 30, 60, 33, 2, 45, 12, 42, 31, 47, 14, 33, 46, 25, 55, 27, 60, 36, 16, 42, 14, 46, 26, 1, 55, 15, 63, 32, 2, 38, 5, 47, 33, 61, 30, 52, 4, 57, 6, 38, 11, 43, 61, 24, 52, 3, 31, 22, 42, 10, 62, 3, 59, 11, 35, 57, 33, 54, 24, 14, 29, 48, 18, 2, 60, 41, 53, 24, 32, 62, 3, 53, 15, 1, 55, 17, 32, 40, 6, 31, 1, 40, 28, 5, 35, 52, 19, 63, 13, 33, 17, 41, 52, 26, 15, 57, 1, 20, 42, 17, 35, 27, 48, 5, 25, 50, 44, 11 },
+ { 35, 25, 38, 57, 33, 17, 40, 6, 59, 27, 54, 5, 61, 10, 52, 26, 36, 19, 51, 35, 57, 48, 11, 20, 54, 25, 61, 16, 1, 58, 24, 61, 3, 39, 7, 47, 1, 22, 49, 28, 63, 10, 58, 32, 17, 36, 45, 19, 51, 29, 59, 10, 50, 1, 23, 42, 18, 29, 51, 21, 56, 32, 14, 5, 40, 58, 47, 13, 54, 35, 29, 45, 18, 52, 26, 2, 38, 8, 46, 36, 58, 11, 52, 35, 17, 28, 1, 58, 9, 39, 17, 28, 37, 48, 20, 9, 57, 24, 50, 19, 58, 16, 48, 25, 43, 11, 35, 6, 45, 24, 56, 4, 36, 7, 47, 35, 52, 28, 59, 30, 2, 61, 21, 33, 63, 12, 18, 59 },
+ { 3, 49, 15, 10, 27, 61, 25, 45, 30, 0, 14, 47, 31, 38, 17, 62, 7, 55, 27, 4, 15, 24, 42, 52, 10, 34, 5, 51, 36, 18, 41, 11, 35, 21, 62, 13, 33, 57, 8, 35, 5, 40, 21, 43, 52, 3, 24, 56, 11, 16, 33, 25, 41, 20, 55, 8, 60, 35, 15, 48, 2, 57, 30, 49, 18, 25, 6, 39, 17, 57, 7, 25, 43, 5, 49, 16, 62, 22, 55, 4, 25, 43, 23, 7, 50, 11, 37, 48, 14, 51, 33, 57, 7, 27, 39, 46, 4, 29, 11, 43, 34, 56, 7, 60, 20, 54, 30, 57, 22, 49, 9, 33, 54, 14, 63, 23, 6, 43, 10, 40, 50, 13, 44, 8, 38, 33, 46, 23 },
+ { 55, 39, 22, 50, 44, 4, 36, 9, 52, 23, 37, 59, 21, 2, 46, 13, 31, 41, 11, 45, 62, 29, 6, 37, 19, 48, 30, 23, 44, 7, 53, 28, 54, 16, 41, 29, 44, 18, 52, 24, 60, 15, 48, 7, 27, 59, 9, 34, 42, 54, 7, 63, 4, 46, 31, 27, 45, 0, 40, 26, 34, 17, 37, 10, 53, 29, 36, 50, 2, 27, 51, 11, 61, 37, 23, 41, 30, 7, 18, 50, 39, 14, 63, 32, 45, 61, 19, 30, 25, 44, 2, 47, 23, 63, 11, 34, 59, 37, 60, 3, 22, 14, 44, 30, 15, 0, 47, 15, 3, 38, 61, 20, 27, 45, 11, 39, 51, 16, 55, 3, 22, 54, 29, 58, 1, 57, 6, 29 },
+ { 9, 17, 60, 2, 34, 56, 20, 62, 39, 12, 49, 6, 29, 56, 34, 48, 0, 58, 22, 38, 18, 43, 56, 0, 63, 14, 55, 3, 59, 31, 15, 45, 0, 49, 6, 58, 3, 38, 12, 45, 0, 37, 29, 57, 13, 39, 30, 49, 0, 23, 44, 36, 16, 57, 13, 54, 11, 24, 63, 9, 53, 7, 62, 42, 0, 59, 15, 23, 63, 34, 40, 16, 32, 0, 53, 12, 48, 28, 59, 33, 0, 53, 9, 27, 3, 22, 54, 5, 56, 9, 61, 13, 42, 14, 52, 19, 0, 21, 47, 27, 53, 36, 3, 50, 39, 58, 25, 40, 53, 28, 12, 50, 0, 59, 32, 2, 21, 34, 26, 46, 37, 7, 18, 47, 24, 14, 53, 42 },
+ { 61, 32, 13, 54, 29, 7, 46, 13, 28, 57, 18, 41, 53, 15, 9, 39, 24, 49, 33, 3, 53, 9, 26, 32, 40, 28, 46, 39, 25, 9, 56, 21, 63, 37, 26, 22, 51, 27, 17, 56, 31, 53, 4, 43, 22, 46, 12, 18, 60, 40, 20, 26, 50, 21, 39, 5, 49, 33, 16, 44, 22, 46, 20, 32, 24, 45, 8, 43, 12, 46, 4, 48, 56, 20, 29, 58, 3, 40, 10, 42, 31, 21, 47, 41, 56, 38, 15, 42, 36, 27, 20, 33, 55, 3, 26, 44, 31, 54, 12, 35, 9, 63, 28, 10, 21, 32, 9, 60, 17, 8, 43, 29, 40, 16, 36, 48, 60, 7, 57, 14, 62, 31, 42, 15, 36, 40, 20, 26 },
+ { 0, 37, 47, 23, 41, 18, 32, 48, 1, 35, 8, 25, 4, 26, 63, 20, 54, 8, 16, 61, 35, 23, 51, 15, 58, 7, 12, 20, 50, 34, 42, 4, 38, 10, 32, 47, 8, 60, 41, 20, 9, 25, 50, 19, 62, 1, 37, 56, 28, 8, 53, 11, 3, 58, 34, 43, 19, 60, 38, 4, 58, 31, 3, 51, 11, 55, 38, 30, 21, 58, 19, 26, 9, 44, 36, 13, 46, 20, 62, 24, 13, 60, 5, 28, 12, 34, 7, 59, 0, 53, 45, 6, 38, 30, 50, 7, 62, 16, 41, 5, 46, 18, 55, 42, 51, 5, 45, 23, 34, 48, 19, 58, 5, 25, 54, 19, 13, 41, 28, 21, 0, 49, 10, 60, 4, 51, 9, 45 },
+ { 19, 28, 6, 58, 10, 51, 4, 22, 55, 42, 60, 45, 34, 51, 42, 5, 30, 45, 27, 40, 13, 47, 4, 49, 21, 38, 60, 29, 2, 57, 17, 27, 52, 19, 61, 14, 30, 34, 2, 44, 63, 33, 11, 35, 16, 51, 25, 6, 14, 47, 31, 61, 37, 29, 18, 8, 52, 2, 28, 54, 13, 41, 15, 62, 35, 18, 2, 60, 6, 33, 41, 61, 31, 6, 56, 17, 34, 50, 6, 52, 44, 35, 16, 51, 59, 24, 48, 18, 31, 40, 16, 49, 21, 60, 17, 39, 10, 49, 32, 57, 24, 39, 1, 25, 18, 62, 37, 12, 56, 1, 37, 11, 52, 44, 9, 30, 47, 4, 51, 40, 55, 25, 34, 27, 56, 30, 32, 54 },
+ { 63, 40, 49, 15, 43, 26, 63, 38, 16, 20, 30, 12, 57, 14, 19, 60, 36, 12, 59, 2, 57, 17, 42, 31, 1, 44, 16, 35, 47, 11, 32, 48, 13, 43, 1, 39, 51, 12, 57, 23, 6, 40, 53, 3, 55, 31, 39, 60, 35, 44, 5, 15, 45, 1, 62, 41, 26, 14, 47, 22, 36, 27, 50, 9, 26, 47, 52, 28, 54, 16, 1, 13, 51, 39, 23, 63, 1, 30, 15, 26, 2, 57, 19, 37, 1, 44, 21, 50, 13, 63, 8, 24, 56, 1, 35, 25, 58, 20, 2, 28, 14, 51, 33, 59, 13, 30, 4, 49, 31, 24, 63, 26, 33, 3, 58, 38, 62, 24, 32, 8, 17, 45, 5, 48, 18, 3, 43, 11 },
+ { 21, 4, 24, 34, 59, 1, 37, 11, 53, 5, 47, 2, 22, 40, 32, 1, 24, 50, 21, 29, 38, 25, 63, 8, 55, 24, 53, 6, 62, 23, 59, 3, 54, 20, 58, 24, 5, 46, 15, 38, 48, 14, 27, 42, 23, 7, 46, 10, 17, 58, 25, 52, 23, 32, 49, 12, 55, 30, 40, 7, 59, 1, 56, 21, 39, 4, 23, 15, 37, 46, 55, 42, 21, 4, 48, 8, 45, 54, 37, 55, 32, 8, 46, 10, 30, 54, 4, 41, 25, 29, 36, 48, 11, 43, 14, 47, 5, 43, 53, 36, 61, 10, 45, 6, 41, 54, 27, 43, 16, 55, 6, 46, 18, 42, 23, 15, 1, 45, 12, 60, 37, 22, 62, 12, 39, 59, 16, 52 },
+ { 47, 35, 56, 7, 19, 46, 31, 50, 33, 24, 61, 35, 50, 7, 53, 44, 55, 6, 46, 10, 52, 5, 21, 43, 36, 10, 18, 41, 26, 37, 8, 29, 40, 36, 9, 49, 34, 26, 61, 21, 7, 59, 18, 62, 29, 54, 20, 32, 51, 0, 40, 10, 55, 6, 20, 36, 9, 61, 5, 51, 44, 19, 33, 43, 13, 57, 40, 63, 8, 24, 29, 10, 60, 34, 27, 40, 25, 18, 10, 42, 21, 49, 26, 62, 38, 12, 33, 61, 5, 57, 2, 19, 54, 28, 62, 22, 38, 31, 16, 7, 22, 47, 29, 17, 35, 8, 20, 51, 2, 40, 22, 50, 13, 61, 28, 53, 35, 20, 56, 30, 2, 53, 14, 41, 23, 34, 8, 31 },
+ { 12, 2, 42, 29, 52, 13, 21, 8, 55, 14, 41, 17, 28, 58, 23, 11, 17, 36, 31, 62, 17, 34, 50, 14, 28, 61, 33, 52, 2, 51, 17, 45, 7, 25, 62, 30, 18, 55, 0, 42, 30, 35, 45, 1, 12, 48, 3, 63, 21, 36, 30, 48, 19, 59, 43, 27, 46, 17, 34, 25, 12, 29, 53, 6, 48, 31, 11, 34, 49, 3, 36, 50, 19, 47, 14, 61, 11, 36, 58, 4, 60, 14, 39, 22, 6, 52, 15, 35, 17, 46, 31, 42, 9, 34, 3, 52, 12, 60, 26, 56, 40, 2, 53, 23, 57, 38, 62, 14, 36, 59, 10, 31, 39, 6, 49, 9, 41, 26, 5, 48, 43, 27, 33, 58, 1, 50, 25, 57 },
+ { 61, 37, 15, 61, 3, 39, 58, 43, 26, 0, 44, 10, 47, 3, 37, 63, 28, 43, 13, 39, 3, 57, 30, 59, 0, 48, 5, 43, 13, 22, 60, 33, 55, 15, 42, 4, 52, 10, 45, 13, 54, 4, 24, 49, 37, 26, 41, 14, 42, 9, 61, 13, 38, 23, 3, 53, 0, 58, 21, 42, 63, 10, 17, 61, 25, 0, 58, 28, 17, 44, 57, 12, 27, 0, 55, 5, 52, 28, 23, 47, 29, 0, 43, 17, 58, 28, 47, 23, 55, 10, 58, 23, 51, 40, 18, 33, 45, 0, 49, 8, 32, 61, 19, 48, 0, 26, 7, 47, 29, 18, 44, 0, 56, 34, 20, 59, 15, 51, 37, 18, 10, 52, 7, 20, 46, 9, 38, 17 },
+ { 6, 27, 48, 23, 45, 29, 5, 18, 38, 62, 27, 56, 20, 32, 15, 9, 48, 0, 54, 22, 45, 20, 7, 41, 23, 39, 19, 27, 58, 31, 44, 0, 12, 50, 23, 56, 20, 39, 32, 59, 16, 52, 33, 9, 57, 22, 6, 58, 28, 50, 24, 2, 56, 35, 16, 45, 32, 38, 15, 54, 2, 38, 46, 22, 35, 45, 20, 5, 52, 25, 7, 35, 59, 32, 22, 43, 38, 3, 51, 16, 34, 53, 32, 50, 3, 40, 8, 43, 0, 39, 27, 4, 14, 61, 8, 55, 15, 41, 20, 44, 27, 13, 39, 11, 46, 42, 54, 33, 4, 52, 23, 61, 14, 25, 43, 2, 33, 11, 63, 29, 61, 17, 40, 55, 22, 62, 28, 44 },
+ { 20, 54, 8, 56, 35, 10, 63, 31, 52, 12, 48, 6, 59, 41, 52, 33, 19, 58, 25, 49, 11, 37, 47, 12, 54, 15, 56, 35, 7, 47, 16, 53, 28, 34, 5, 37, 28, 8, 48, 3, 28, 38, 18, 61, 16, 43, 53, 32, 4, 17, 47, 27, 44, 8, 63, 10, 25, 49, 6, 37, 24, 52, 32, 3, 50, 12, 41, 56, 38, 14, 62, 20, 40, 16, 53, 31, 18, 63, 41, 9, 59, 7, 13, 25, 57, 20, 63, 26, 53, 18, 48, 62, 30, 46, 21, 25, 58, 29, 36, 4, 55, 34, 6, 60, 31, 16, 21, 12, 58, 38, 9, 29, 47, 7, 52, 30, 57, 44, 22, 0, 35, 45, 3, 31, 14, 36, 0, 51 },
+ { 42, 14, 33, 24, 16, 49, 40, 2, 22, 33, 16, 36, 25, 1, 21, 61, 38, 8, 33, 4, 62, 26, 29, 60, 6, 46, 30, 11, 63, 4, 36, 40, 19, 57, 46, 11, 41, 63, 22, 25, 58, 10, 46, 2, 34, 27, 11, 38, 56, 34, 12, 53, 18, 33, 41, 51, 13, 28, 60, 20, 47, 14, 29, 59, 16, 62, 8, 22, 32, 47, 9, 49, 2, 44, 7, 12, 45, 6, 20, 27, 45, 24, 62, 42, 36, 11, 33, 15, 37, 7, 32, 10, 37, 1, 35, 50, 6, 11, 63, 24, 52, 15, 50, 24, 3, 37, 56, 27, 34, 22, 49, 16, 36, 62, 17, 39, 4, 15, 54, 24, 50, 8, 58, 26, 49, 54, 11, 30 },
+ { 4, 59, 41, 1, 53, 12, 25, 45, 59, 7, 51, 39, 54, 14, 46, 4, 27, 53, 16, 44, 18, 51, 1, 32, 25, 2, 50, 40, 20, 54, 24, 9, 62, 2, 27, 60, 1, 17, 36, 50, 6, 40, 30, 55, 41, 19, 49, 1, 21, 60, 40, 5, 62, 1, 22, 30, 57, 4, 43, 31, 1, 55, 40, 7, 27, 37, 30, 54, 1, 19, 42, 30, 56, 26, 62, 49, 24, 57, 37, 56, 2, 39, 16, 5, 30, 55, 3, 49, 60, 23, 56, 44, 17, 52, 13, 42, 28, 48, 18, 45, 9, 37, 21, 41, 58, 10, 48, 1, 63, 5, 41, 57, 2, 24, 12, 48, 27, 42, 32, 46, 13, 38, 19, 34, 5, 41, 25, 60 },
+ { 39, 28, 21, 46, 32, 57, 36, 9, 19, 42, 4, 29, 11, 43, 30, 49, 13, 42, 35, 56, 9, 39, 15, 52, 36, 61, 18, 26, 45, 14, 31, 48, 21, 43, 14, 33, 49, 54, 14, 44, 21, 62, 13, 23, 8, 62, 15, 51, 44, 7, 30, 37, 20, 42, 56, 7, 39, 18, 50, 11, 61, 9, 19, 43, 57, 2, 48, 11, 39, 60, 28, 4, 37, 17, 35, 1, 33, 11, 31, 14, 48, 19, 35, 51, 46, 21, 44, 29, 12, 41, 2, 22, 58, 26, 54, 4, 59, 38, 2, 33, 57, 1, 63, 13, 28, 51, 15, 40, 18, 45, 8, 30, 43, 37, 54, 19, 8, 59, 21, 6, 60, 29, 55, 10, 63, 15, 47, 17 },
+ { 3, 50, 10, 62, 18, 5, 27, 49, 60, 23, 55, 18, 62, 24, 56, 10, 59, 28, 2, 23, 34, 59, 43, 20, 10, 42, 8, 49, 1, 37, 57, 6, 51, 29, 53, 7, 23, 31, 5, 32, 51, 0, 35, 54, 45, 31, 5, 26, 36, 24, 55, 15, 48, 29, 14, 48, 26, 60, 21, 41, 36, 26, 50, 33, 14, 44, 17, 24, 52, 15, 46, 23, 54, 6, 47, 21, 60, 50, 4, 53, 29, 61, 8, 23, 1, 60, 19, 6, 53, 16, 47, 34, 6, 39, 16, 31, 12, 20, 53, 22, 30, 43, 25, 46, 35, 6, 44, 32, 53, 26, 55, 19, 11, 59, 5, 33, 51, 1, 35, 53, 25, 3, 42, 23, 44, 32, 7, 53 },
+ { 22, 44, 37, 6, 26, 51, 38, 0, 34, 13, 31, 46, 3, 37, 6, 19, 40, 21, 47, 63, 12, 5, 29, 55, 22, 58, 34, 28, 60, 22, 11, 41, 17, 38, 9, 44, 59, 39, 56, 19, 11, 47, 25, 15, 3, 39, 57, 17, 61, 11, 46, 3, 58, 9, 54, 35, 2, 34, 8, 45, 15, 56, 5, 23, 53, 33, 63, 35, 4, 59, 10, 51, 13, 61, 29, 41, 15, 25, 43, 19, 40, 10, 54, 33, 41, 12, 38, 51, 31, 26, 61, 9, 30, 45, 24, 62, 49, 40, 10, 61, 14, 49, 5, 17, 54, 20, 60, 23, 3, 13, 35, 50, 32, 23, 46, 27, 38, 63, 16, 12, 39, 48, 18, 51, 1, 27, 56, 35 },
+ { 63, 15, 30, 55, 43, 14, 57, 17, 53, 44, 7, 48, 26, 50, 32, 60, 0, 53, 14, 31, 50, 24, 46, 0, 38, 13, 4, 52, 16, 45, 30, 59, 0, 25, 55, 35, 16, 10, 26, 42, 58, 29, 60, 38, 50, 22, 28, 47, 0, 50, 28, 19, 33, 39, 11, 44, 16, 52, 24, 59, 3, 38, 27, 51, 0, 21, 7, 42, 26, 34, 21, 40, 33, 18, 39, 3, 54, 38, 8, 59, 0, 44, 27, 15, 58, 28, 57, 9, 43, 0, 36, 50, 20, 59, 8, 34, 0, 27, 47, 7, 36, 19, 56, 32, 0, 38, 11, 29, 62, 47, 6, 61, 0, 41, 14, 56, 10, 23, 45, 31, 57, 8, 36, 13, 58, 38, 11, 19 },
+ { 0, 34, 12, 47, 21, 2, 40, 30, 11, 25, 61, 20, 40, 15, 35, 22, 45, 36, 7, 41, 17, 57, 9, 48, 32, 62, 44, 24, 35, 3, 54, 13, 33, 63, 19, 4, 48, 22, 62, 2, 37, 8, 33, 6, 20, 52, 9, 32, 43, 13, 39, 63, 25, 4, 49, 23, 62, 32, 9, 30, 48, 18, 63, 12, 46, 29, 58, 13, 48, 8, 57, 31, 0, 51, 9, 58, 12, 22, 47, 29, 35, 22, 49, 5, 46, 4, 34, 20, 63, 24, 56, 11, 41, 3, 51, 19, 56, 35, 17, 58, 28, 42, 9, 45, 59, 26, 51, 42, 17, 36, 25, 15, 53, 21, 44, 3, 30, 55, 5, 50, 21, 28, 61, 32, 6, 49, 28, 46 },
+ { 58, 42, 60, 4, 31, 59, 22, 63, 35, 38, 9, 54, 1, 57, 8, 51, 16, 58, 27, 53, 3, 38, 30, 15, 27, 6, 19, 56, 10, 50, 21, 36, 47, 5, 43, 28, 51, 32, 13, 46, 18, 54, 16, 43, 63, 12, 36, 59, 22, 34, 5, 52, 17, 59, 27, 41, 0, 19, 55, 37, 13, 43, 6, 34, 41, 10, 36, 55, 19, 44, 3, 16, 58, 27, 49, 25, 32, 62, 17, 55, 13, 63, 18, 52, 25, 37, 17, 48, 13, 32, 5, 46, 28, 37, 14, 43, 25, 5, 51, 39, 3, 52, 33, 22, 8, 40, 12, 4, 57, 9, 46, 39, 28, 58, 13, 62, 17, 42, 19, 36, 0, 47, 16, 43, 24, 21, 54, 13 },
+ { 25, 9, 23, 50, 36, 8, 45, 14, 3, 51, 16, 28, 44, 12, 42, 29, 4, 26, 10, 47, 22, 61, 18, 54, 51, 39, 46, 13, 41, 26, 58, 7, 18, 39, 12, 57, 15, 1, 52, 27, 41, 23, 48, 1, 27, 45, 18, 2, 57, 26, 55, 8, 43, 31, 6, 58, 14, 51, 40, 5, 61, 31, 24, 54, 17, 60, 22, 1, 39, 30, 53, 45, 36, 13, 43, 5, 45, 2, 37, 6, 34, 42, 2, 39, 10, 62, 7, 54, 40, 18, 60, 15, 52, 21, 63, 8, 55, 46, 15, 30, 23, 13, 62, 16, 50, 24, 58, 31, 48, 21, 34, 2, 49, 7, 31, 37, 26, 48, 9, 61, 40, 11, 52, 2, 60, 40, 4, 37 },
+ { 52, 28, 39, 16, 54, 19, 29, 55, 42, 20, 58, 33, 24, 63, 18, 55, 39, 62, 43, 34, 12, 40, 6, 35, 2, 25, 8, 62, 34, 1, 31, 42, 61, 27, 53, 24, 40, 61, 34, 8, 59, 4, 30, 56, 40, 6, 53, 42, 10, 48, 16, 37, 12, 46, 21, 36, 47, 11, 28, 45, 22, 10, 57, 2, 49, 31, 14, 44, 61, 11, 25, 6, 23, 63, 18, 36, 28, 56, 20, 51, 11, 48, 27, 56, 32, 22, 45, 30, 2, 42, 27, 39, 1, 44, 23, 31, 38, 22, 11, 61, 43, 54, 4, 47, 35, 2, 44, 16, 28, 54, 12, 62, 18, 43, 10, 52, 1, 58, 33, 15, 29, 56, 20, 34, 9, 30, 48, 17 },
+ { 46, 2, 56, 11, 41, 1, 49, 6, 27, 47, 2, 48, 5, 32, 37, 3, 13, 19, 32, 1, 55, 28, 60, 17, 43, 59, 32, 20, 49, 16, 55, 23, 14, 46, 2, 36, 6, 30, 20, 49, 12, 47, 35, 14, 21, 60, 29, 14, 35, 24, 46, 1, 56, 29, 53, 8, 33, 23, 56, 1, 35, 46, 20, 39, 26, 4, 53, 28, 17, 38, 60, 34, 48, 9, 55, 15, 46, 7, 41, 31, 60, 24, 16, 36, 1, 59, 19, 52, 35, 6, 55, 11, 59, 33, 7, 57, 4, 29, 48, 1, 19, 26, 37, 30, 18, 63, 37, 6, 59, 1, 40, 24, 56, 33, 46, 22, 35, 7, 24, 53, 39, 5, 26, 45, 55, 18, 62, 7 },
+ { 20, 60, 29, 34, 20, 62, 33, 52, 10, 36, 13, 60, 41, 21, 50, 27, 56, 49, 8, 51, 21, 45, 11, 48, 8, 23, 53, 3, 29, 44, 5, 52, 9, 32, 50, 17, 43, 56, 3, 38, 24, 10, 62, 25, 51, 9, 33, 49, 61, 7, 30, 62, 22, 19, 2, 42, 63, 5, 49, 18, 60, 15, 52, 7, 43, 56, 23, 50, 5, 50, 2, 20, 41, 30, 1, 52, 22, 61, 14, 26, 3, 43, 53, 7, 47, 28, 11, 14, 23, 58, 33, 25, 47, 13, 50, 17, 40, 54, 34, 60, 41, 6, 59, 14, 50, 7, 25, 55, 20, 42, 51, 8, 27, 4, 16, 60, 28, 50, 44, 3, 22, 49, 63, 12, 33, 1, 43, 31 },
+ { 36, 5, 46, 8, 44, 24, 13, 39, 25, 57, 31, 18, 8, 52, 10, 45, 6, 30, 36, 24, 63, 4, 33, 26, 57, 40, 15, 56, 37, 12, 40, 25, 37, 58, 11, 63, 21, 45, 16, 60, 31, 53, 18, 33, 3, 45, 23, 0, 20, 54, 40, 15, 50, 38, 60, 16, 25, 42, 29, 38, 7, 41, 25, 62, 18, 33, 8, 35, 42, 16, 32, 56, 12, 39, 59, 19, 34, 9, 49, 38, 57, 12, 21, 50, 14, 40, 61, 44, 50, 9, 49, 19, 3, 29, 35, 62, 12, 24, 7, 18, 52, 32, 10, 46, 21, 41, 32, 11, 36, 29, 14, 34, 60, 38, 54, 11, 41, 14, 19, 57, 32, 16, 7, 41, 51, 25, 14, 57 },
+ { 53, 18, 26, 50, 15, 58, 4, 63, 17, 43, 7, 40, 61, 35, 15, 41, 23, 60, 16, 38, 14, 42, 19, 50, 0, 31, 10, 46, 27, 63, 18, 60, 0, 20, 29, 39, 8, 26, 37, 5, 42, 0, 44, 39, 57, 17, 58, 41, 28, 37, 4, 32, 9, 44, 12, 31, 54, 10, 59, 14, 27, 53, 12, 36, 0, 47, 13, 63, 21, 58, 10, 24, 50, 27, 4, 26, 44, 53, 31, 0, 18, 42, 29, 33, 57, 4, 32, 26, 0, 38, 16, 61, 41, 53, 20, 0, 42, 44, 49, 27, 10, 56, 39, 0, 57, 15, 53, 49, 3, 61, 22, 47, 17, 5, 49, 26, 2, 63, 39, 10, 47, 27, 37, 23, 4, 59, 38, 10 },
+ { 23, 39, 61, 3, 37, 28, 48, 31, 0, 34, 51, 23, 2, 26, 58, 0, 53, 11, 46, 1, 57, 29, 52, 14, 37, 61, 21, 35, 2, 49, 7, 34, 47, 55, 4, 33, 54, 13, 58, 52, 19, 50, 22, 7, 13, 29, 36, 11, 51, 17, 60, 25, 55, 4, 34, 51, 0, 35, 20, 48, 32, 3, 51, 30, 59, 28, 40, 3, 46, 29, 54, 43, 7, 62, 47, 11, 39, 4, 23, 46, 55, 8, 63, 5, 25, 37, 18, 46, 21, 56, 31, 5, 36, 8, 45, 58, 26, 15, 2, 36, 47, 21, 29, 44, 25, 34, 3, 27, 43, 10, 52, 0, 45, 30, 24, 36, 43, 18, 34, 59, 0, 52, 61, 15, 44, 19, 30, 49 },
+ { 0, 27, 12, 43, 54, 9, 22, 53, 21, 46, 15, 55, 29, 47, 20, 33, 39, 28, 59, 35, 9, 44, 5, 24, 47, 7, 52, 17, 56, 22, 30, 42, 14, 26, 45, 18, 49, 1, 24, 34, 11, 27, 55, 32, 61, 47, 2, 56, 6, 44, 13, 47, 36, 27, 58, 22, 16, 47, 40, 4, 57, 38, 21, 45, 16, 9, 56, 26, 11, 38, 0, 22, 36, 17, 33, 57, 16, 30, 62, 15, 35, 40, 20, 45, 59, 10, 54, 8, 63, 13, 52, 27, 22, 57, 28, 12, 32, 51, 55, 22, 63, 4, 16, 54, 12, 62, 45, 19, 58, 13, 32, 40, 20, 56, 7, 57, 9, 54, 6, 29, 42, 21, 8, 55, 35, 47, 6, 41 },
+ { 56, 33, 58, 32, 19, 35, 42, 6, 59, 11, 38, 5, 49, 12, 62, 7, 52, 17, 5, 25, 54, 20, 61, 31, 54, 27, 41, 11, 44, 5, 59, 12, 36, 51, 10, 61, 28, 41, 48, 9, 43, 63, 5, 40, 20, 8, 49, 26, 34, 21, 58, 1, 18, 45, 7, 39, 61, 26, 8, 50, 23, 10, 63, 5, 55, 37, 19, 49, 52, 15, 59, 47, 13, 54, 1, 25, 42, 58, 10, 48, 3, 27, 50, 1, 17, 48, 34, 41, 16, 40, 2, 45, 10, 39, 17, 61, 5, 38, 19, 9, 41, 31, 60, 38, 5, 23, 36, 8, 30, 55, 24, 63, 12, 48, 14, 51, 31, 20, 45, 25, 12, 50, 32, 2, 28, 11, 62, 14 },
+ { 44, 16, 7, 48, 1, 62, 16, 50, 27, 33, 61, 25, 17, 44, 31, 14, 22, 43, 32, 48, 18, 40, 8, 36, 3, 16, 33, 62, 23, 38, 25, 53, 2, 21, 41, 6, 22, 15, 59, 29, 16, 37, 26, 15, 52, 42, 23, 15, 54, 39, 10, 30, 53, 11, 49, 24, 2, 43, 55, 17, 34, 44, 15, 31, 24, 44, 2, 32, 7, 35, 25, 5, 40, 45, 29, 51, 6, 21, 37, 52, 24, 60, 13, 31, 53, 23, 2, 28, 49, 24, 31, 60, 20, 51, 1, 34, 48, 14, 59, 33, 50, 1, 18, 33, 48, 60, 17, 51, 39, 6, 38, 2, 35, 29, 40, 23, 1, 62, 15, 53, 37, 17, 46, 57, 40, 51, 24, 22 },
+ { 5, 37, 52, 24, 45, 13, 40, 3, 45, 9, 19, 42, 56, 4, 37, 46, 56, 2, 63, 11, 51, 1, 49, 13, 59, 45, 39, 1, 48, 15, 58, 9, 46, 31, 54, 35, 57, 38, 3, 46, 56, 4, 47, 57, 1, 30, 38, 63, 3, 46, 28, 63, 41, 14, 33, 62, 19, 32, 13, 28, 61, 1, 53, 42, 11, 60, 22, 62, 27, 42, 61, 31, 19, 8, 61, 12, 32, 55, 2, 18, 33, 12, 43, 36, 9, 62, 30, 55, 6, 58, 35, 7, 43, 29, 54, 23, 43, 30, 3, 25, 11, 45, 52, 28, 7, 14, 42, 1, 22, 50, 16, 53, 19, 59, 4, 46, 33, 41, 4, 35, 58, 5, 26, 13, 20, 2, 34, 54 },
+ { 30, 63, 21, 10, 26, 55, 29, 59, 23, 39, 53, 1, 36, 24, 59, 27, 10, 34, 23, 38, 30, 60, 22, 42, 28, 19, 9, 57, 30, 19, 43, 33, 13, 63, 3, 19, 11, 50, 31, 20, 14, 34, 10, 35, 17, 59, 7, 31, 19, 25, 50, 5, 20, 57, 29, 6, 52, 41, 4, 46, 20, 37, 26, 17, 49, 6, 39, 18, 53, 14, 3, 49, 57, 23, 34, 48, 14, 41, 28, 38, 56, 6, 58, 25, 39, 19, 43, 15, 37, 11, 47, 18, 53, 4, 37, 9, 62, 21, 53, 40, 57, 24, 13, 40, 56, 26, 47, 31, 59, 25, 45, 27, 10, 43, 21, 61, 13, 27, 48, 9, 23, 43, 31, 62, 38, 59, 9, 47 },
+ { 25, 4, 40, 60, 34, 6, 18, 36, 8, 57, 12, 30, 49, 14, 6, 54, 41, 16, 50, 6, 43, 15, 34, 4, 53, 24, 50, 35, 4, 51, 7, 55, 28, 24, 39, 44, 60, 7, 25, 62, 42, 53, 24, 61, 28, 45, 52, 12, 48, 37, 9, 35, 43, 3, 37, 48, 12, 58, 30, 52, 9, 59, 6, 57, 33, 29, 48, 4, 37, 45, 20, 34, 10, 39, 0, 60, 22, 45, 8, 63, 21, 42, 14, 49, 3, 56, 11, 46, 21, 61, 0, 42, 25, 13, 63, 17, 36, 8, 46, 16, 6, 35, 63, 0, 21, 37, 4, 57, 9, 34, 5, 61, 48, 32, 8, 37, 54, 17, 56, 30, 60, 0, 50, 16, 7, 29, 42, 17 },
+ { 32, 50, 15, 48, 2, 43, 52, 25, 47, 16, 32, 63, 21, 52, 40, 19, 0, 61, 29, 58, 20, 56, 26, 46, 12, 55, 6, 22, 62, 32, 17, 40, 0, 49, 34, 8, 27, 32, 48, 0, 21, 39, 5, 44, 12, 6, 22, 40, 0, 57, 16, 60, 23, 17, 54, 22, 36, 15, 24, 39, 19, 34, 47, 23, 0, 54, 13, 51, 24, 9, 55, 16, 52, 27, 44, 20, 4, 54, 26, 49, 0, 30, 46, 16, 29, 51, 34, 4, 52, 28, 33, 15, 57, 39, 26, 49, 0, 56, 27, 31, 48, 20, 43, 29, 53, 11, 46, 19, 41, 13, 55, 18, 0, 57, 26, 51, 2, 44, 6, 38, 14, 40, 22, 45, 36, 53, 3, 57 },
+ { 44, 12, 37, 28, 22, 57, 11, 38, 0, 51, 9, 41, 4, 29, 11, 47, 33, 45, 12, 26, 3, 36, 9, 63, 31, 16, 38, 44, 14, 47, 25, 61, 20, 58, 15, 47, 17, 57, 13, 36, 9, 51, 18, 29, 50, 36, 54, 20, 61, 27, 32, 13, 53, 44, 9, 27, 0, 63, 45, 2, 56, 10, 14, 43, 41, 28, 58, 11, 35, 60, 30, 41, 6, 63, 11, 51, 37, 32, 15, 10, 35, 53, 5, 61, 22, 7, 26, 59, 23, 9, 44, 48, 21, 3, 51, 32, 24, 41, 12, 61, 2, 55, 9, 15, 35, 58, 28, 15, 62, 30, 37, 23, 42, 29, 11, 17, 35, 24, 63, 20, 52, 28, 8, 55, 11, 23, 47, 19 },
+ { 0, 56, 8, 53, 14, 31, 61, 20, 55, 28, 62, 18, 35, 60, 25, 57, 7, 23, 39, 54, 47, 17, 43, 0, 40, 59, 29, 2, 56, 10, 37, 5, 43, 11, 29, 52, 1, 23, 54, 41, 59, 30, 55, 1, 62, 15, 33, 4, 43, 10, 47, 39, 1, 31, 40, 60, 49, 33, 7, 55, 26, 50, 31, 61, 8, 18, 21, 32, 44, 1, 25, 47, 18, 36, 30, 23, 59, 7, 40, 59, 27, 19, 38, 32, 44, 54, 40, 17, 38, 60, 27, 6, 35, 55, 10, 14, 44, 5, 50, 17, 38, 26, 42, 50, 18, 3, 44, 52, 2, 49, 7, 52, 15, 46, 62, 39, 55, 10, 31, 48, 3, 58, 33, 18, 61, 34, 13, 59 },
+ { 39, 27, 63, 20, 35, 41, 4, 45, 26, 5, 38, 13, 44, 2, 50, 17, 37, 52, 2, 13, 28, 58, 24, 51, 21, 8, 34, 48, 27, 42, 18, 51, 31, 56, 5, 36, 38, 44, 4, 17, 26, 11, 38, 23, 42, 8, 56, 39, 24, 51, 5, 56, 21, 59, 14, 6, 18, 42, 22, 35, 16, 37, 3, 25, 39, 46, 63, 5, 50, 17, 58, 8, 55, 3, 50, 12, 43, 17, 47, 2, 51, 9, 62, 12, 1, 35, 13, 50, 1, 37, 12, 51, 19, 29, 46, 59, 22, 58, 33, 45, 22, 60, 10, 32, 61, 39, 8, 33, 25, 36, 20, 60, 38, 4, 21, 5, 28, 45, 12, 18, 42, 11, 49, 1, 27, 40, 6, 30 },
+ { 24, 16, 42, 1, 50, 10, 48, 17, 33, 43, 24, 48, 21, 55, 31, 42, 10, 21, 63, 35, 49, 6, 33, 13, 41, 53, 10, 20, 60, 6, 53, 26, 12, 41, 22, 60, 14, 28, 63, 33, 49, 3, 45, 16, 48, 26, 14, 46, 18, 30, 35, 26, 8, 50, 29, 51, 25, 57, 12, 47, 53, 9, 62, 20, 54, 2, 36, 15, 40, 28, 33, 13, 38, 24, 46, 1, 29, 56, 33, 20, 44, 24, 41, 26, 57, 20, 63, 8, 30, 55, 5, 41, 62, 8, 34, 2, 37, 10, 19, 6, 37, 1, 53, 23, 5, 27, 58, 22, 43, 12, 50, 26, 9, 34, 54, 32, 49, 1, 59, 37, 22, 46, 25, 36, 51, 15, 54, 46 },
+ { 52, 7, 45, 33, 26, 58, 14, 60, 7, 54, 3, 58, 8, 34, 14, 5, 59, 30, 18, 44, 8, 22, 48, 62, 3, 26, 55, 38, 23, 16, 39, 1, 62, 24, 49, 9, 53, 19, 46, 7, 19, 60, 31, 58, 2, 34, 53, 7, 59, 2, 62, 42, 46, 19, 36, 11, 44, 4, 38, 28, 1, 43, 32, 51, 12, 29, 56, 22, 52, 2, 62, 49, 22, 60, 14, 35, 63, 5, 25, 57, 14, 53, 4, 46, 18, 31, 42, 22, 47, 20, 58, 31, 16, 43, 23, 54, 30, 42, 52, 57, 29, 49, 30, 13, 45, 48, 16, 55, 6, 63, 1, 44, 14, 58, 19, 47, 15, 24, 51, 34, 6, 55, 5, 63, 20, 41, 21, 9 },
+ { 30, 62, 18, 55, 5, 23, 39, 29, 49, 30, 15, 36, 28, 46, 60, 25, 39, 46, 4, 32, 61, 40, 15, 30, 36, 45, 14, 2, 49, 33, 57, 45, 18, 32, 3, 45, 30, 2, 35, 52, 40, 27, 13, 21, 38, 63, 20, 28, 37, 23, 16, 10, 13, 55, 2, 62, 21, 32, 60, 17, 58, 23, 5, 40, 16, 48, 7, 45, 10, 26, 43, 19, 6, 31, 52, 21, 39, 16, 48, 9, 37, 28, 36, 55, 7, 48, 3, 59, 15, 45, 25, 1, 53, 13, 47, 7, 62, 15, 4, 25, 12, 41, 18, 60, 38, 11, 34, 19, 39, 31, 29, 56, 23, 42, 3, 27, 60, 41, 8, 16, 61, 29, 43, 9, 32, 2, 60, 34 },
+ { 3, 38, 13, 37, 52, 44, 2, 19, 12, 42, 63, 19, 40, 1, 20, 50, 12, 55, 15, 56, 27, 1, 54, 11, 57, 18, 32, 63, 44, 4, 29, 13, 37, 61, 35, 16, 42, 57, 12, 22, 6, 55, 43, 10, 50, 5, 44, 11, 48, 52, 34, 58, 28, 41, 38, 30, 7, 52, 11, 49, 30, 14, 45, 27, 59, 34, 21, 38, 32, 58, 11, 36, 56, 42, 9, 41, 3, 54, 31, 42, 0, 60, 16, 11, 39, 24, 52, 33, 6, 36, 10, 40, 32, 60, 26, 20, 39, 28, 47, 34, 63, 8, 54, 3, 24, 56, 0, 51, 13, 47, 16, 40, 7, 35, 52, 11, 36, 4, 57, 30, 39, 13, 18, 50, 58, 28, 12, 48 },
+ { 57, 24, 49, 21, 10, 31, 61, 36, 56, 0, 22, 53, 11, 56, 32, 7, 36, 27, 41, 9, 46, 19, 34, 42, 25, 7, 50, 9, 28, 21, 54, 8, 50, 7, 27, 59, 10, 25, 48, 62, 37, 0, 33, 58, 25, 18, 32, 61, 0, 15, 45, 5, 50, 3, 23, 55, 47, 17, 40, 6, 60, 34, 53, 8, 41, 0, 61, 13, 54, 4, 46, 28, 0, 17, 48, 27, 58, 13, 23, 61, 33, 21, 50, 30, 62, 8, 14, 29, 56, 27, 61, 49, 17, 2, 44, 11, 51, 0, 59, 17, 40, 20, 32, 47, 36, 21, 42, 28, 60, 4, 54, 10, 59, 17, 30, 62, 21, 43, 26, 48, 0, 56, 36, 25, 8, 44, 39, 17 },
+ { 10, 42, 4, 59, 27, 47, 8, 23, 51, 32, 45, 6, 37, 26, 48, 43, 62, 0, 21, 53, 38, 12, 51, 5, 60, 47, 24, 37, 59, 15, 35, 47, 22, 55, 0, 50, 21, 40, 6, 29, 15, 52, 24, 8, 41, 55, 13, 29, 40, 56, 24, 31, 19, 33, 61, 15, 0, 35, 24, 42, 21, 2, 19, 57, 24, 15, 30, 50, 20, 25, 40, 16, 57, 34, 61, 8, 29, 45, 6, 49, 11, 47, 2, 44, 19, 57, 38, 50, 12, 42, 21, 4, 35, 52, 28, 56, 23, 36, 13, 45, 4, 52, 27, 14, 6, 62, 9, 45, 21, 37, 25, 46, 33, 49, 0, 44, 7, 53, 13, 19, 53, 31, 3, 47, 15, 56, 22, 51 },
+ { 35, 28, 53, 32, 1, 16, 54, 40, 9, 17, 25, 58, 14, 59, 3, 22, 16, 51, 31, 5, 23, 58, 28, 17, 35, 20, 0, 42, 11, 52, 3, 31, 41, 17, 43, 13, 32, 54, 18, 60, 32, 45, 17, 49, 2, 36, 51, 22, 7, 36, 9, 63, 48, 12, 46, 26, 43, 28, 63, 13, 48, 37, 51, 33, 5, 47, 55, 9, 42, 63, 7, 51, 24, 12, 37, 19, 55, 34, 18, 38, 15, 28, 54, 34, 5, 43, 22, 0, 48, 14, 54, 24, 58, 9, 38, 5, 32, 55, 21, 30, 49, 9, 59, 43, 30, 51, 35, 26, 7, 53, 2, 22, 14, 27, 57, 18, 38, 24, 33, 45, 10, 41, 20, 60, 37, 5, 32, 0 },
+ { 63, 19, 15, 40, 62, 35, 14, 28, 46, 61, 4, 49, 35, 10, 29, 54, 33, 8, 45, 62, 37, 1, 43, 55, 10, 52, 61, 30, 19, 40, 25, 62, 11, 38, 27, 58, 36, 3, 46, 8, 39, 4, 62, 28, 47, 20, 4, 54, 47, 27, 43, 1, 21, 38, 8, 58, 10, 54, 4, 56, 9, 26, 12, 39, 60, 27, 18, 37, 1, 31, 35, 5, 45, 50, 2, 43, 26, 1, 59, 23, 56, 40, 7, 26, 58, 17, 32, 63, 25, 39, 7, 31, 45, 19, 63, 15, 48, 8, 37, 61, 16, 34, 1, 56, 18, 3, 15, 58, 49, 32, 63, 41, 55, 5, 40, 22, 50, 6, 59, 2, 63, 23, 52, 11, 26, 61, 44, 23 },
+ { 11, 56, 46, 6, 22, 43, 58, 3, 34, 21, 38, 30, 18, 44, 52, 13, 41, 57, 17, 28, 14, 49, 25, 7, 33, 39, 26, 6, 56, 48, 1, 20, 56, 5, 46, 9, 19, 51, 30, 25, 56, 21, 35, 14, 57, 42, 16, 33, 10, 57, 17, 59, 41, 25, 53, 37, 20, 40, 30, 18, 31, 62, 44, 22, 3, 44, 11, 48, 23, 53, 18, 60, 29, 22, 62, 15, 53, 47, 10, 41, 3, 19, 52, 36, 13, 46, 10, 35, 3, 61, 41, 16, 1, 50, 26, 42, 18, 46, 2, 25, 54, 20, 39, 23, 47, 31, 41, 12, 38, 17, 8, 19, 31, 48, 12, 61, 9, 54, 29, 35, 15, 38, 6, 43, 34, 14, 7, 47 },
+ { 39, 2, 33, 26, 53, 8, 18, 50, 41, 12, 53, 1, 63, 24, 19, 39, 2, 24, 47, 10, 60, 38, 19, 63, 48, 4, 15, 45, 32, 14, 60, 36, 29, 53, 23, 63, 34, 12, 61, 1, 43, 11, 53, 30, 1, 26, 60, 45, 23, 39, 3, 29, 12, 50, 4, 16, 51, 3, 45, 36, 50, 1, 16, 54, 35, 14, 57, 30, 58, 9, 46, 14, 41, 10, 32, 38, 4, 30, 21, 51, 32, 63, 25, 1, 60, 27, 53, 18, 51, 22, 28, 55, 34, 12, 40, 3, 60, 29, 57, 41, 6, 44, 11, 53, 8, 61, 24, 57, 1, 28, 44, 59, 36, 3, 34, 25, 41, 31, 16, 44, 22, 47, 28, 58, 1, 49, 54, 29 },
+ { 58, 25, 50, 13, 38, 30, 60, 24, 6, 57, 27, 42, 9, 45, 6, 61, 30, 50, 4, 34, 29, 3, 46, 13, 22, 42, 58, 28, 9, 39, 23, 44, 7, 15, 44, 2, 40, 15, 47, 41, 23, 37, 7, 59, 38, 11, 34, 6, 62, 14, 52, 35, 55, 19, 32, 61, 33, 24, 57, 6, 22, 59, 29, 7, 49, 25, 40, 3, 17, 39, 27, 52, 0, 55, 16, 57, 24, 61, 36, 6, 29, 12, 48, 39, 20, 44, 6, 40, 33, 5, 48, 10, 57, 36, 22, 51, 33, 9, 24, 12, 62, 29, 50, 35, 14, 43, 5, 33, 47, 52, 13, 23, 10, 51, 56, 16, 46, 1, 49, 4, 61, 9, 52, 18, 31, 21, 36, 17 },
+ { 19, 42, 9, 48, 2, 44, 11, 37, 48, 20, 33, 16, 55, 35, 49, 15, 37, 20, 59, 16, 53, 22, 56, 31, 50, 11, 34, 54, 16, 51, 4, 49, 33, 53, 21, 28, 56, 24, 31, 9, 52, 16, 48, 24, 44, 13, 51, 20, 31, 49, 18, 6, 34, 2, 44, 14, 47, 8, 15, 43, 13, 41, 33, 52, 20, 61, 7, 51, 34, 62, 4, 20, 36, 33, 43, 8, 46, 13, 53, 17, 45, 42, 9, 31, 52, 11, 30, 56, 13, 59, 17, 44, 27, 6, 62, 11, 43, 17, 49, 38, 26, 2, 16, 27, 58, 21, 54, 18, 26, 5, 35, 61, 43, 27, 7, 39, 14, 58, 37, 55, 20, 33, 13, 40, 62, 10, 55, 5 },
+ { 51, 14, 61, 29, 59, 20, 55, 31, 0, 49, 11, 60, 3, 26, 22, 56, 0, 40, 12, 43, 41, 8, 36, 0, 17, 57, 24, 2, 46, 26, 61, 18, 0, 38, 12, 59, 6, 49, 3, 57, 19, 63, 5, 33, 18, 54, 28, 56, 0, 43, 26, 46, 63, 27, 56, 22, 27, 54, 38, 28, 63, 24, 10, 45, 0, 31, 42, 21, 12, 25, 44, 49, 59, 6, 26, 50, 3, 34, 27, 59, 0, 35, 62, 16, 4, 58, 47, 0, 43, 24, 37, 2, 54, 20, 46, 31, 0, 56, 34, 5, 55, 45, 60, 37, 0, 40, 10, 38, 63, 46, 15, 20, 0, 53, 21, 62, 30, 11, 24, 27, 40, 0, 57, 26, 3, 45, 27, 35 },
+};
+
+#else
+#define DM_WIDTH 8
+#define DM_WIDTH_SHIFT 3
+#define DM_HEIGHT 8
+static const unsigned char DM[8][8] =
+{
+ { 0, 32, 8, 40, 2, 34, 10, 42 },
+ { 48, 16, 56, 24, 50, 18, 58, 26 },
+ { 12, 44, 4, 36, 14, 46, 6, 38 },
+ { 60, 28, 52, 20, 62, 30, 54, 22 },
+ { 3, 35, 11, 43, 1, 33, 9, 41 },
+ { 51, 19, 59, 27, 49, 17, 57, 25 },
+ { 15, 47, 7, 39, 13, 45, 5, 37 },
+ { 63, 31, 55, 23, 61, 29, 53, 21 }
+};
+#endif
+
+static unsigned int *DM_565 = NULL;
+
+static void
+xlib_rgb_preprocess_dm_565 (void)
+{
+ int i;
+ unsigned int dith;
+
+ if (DM_565 == NULL)
+ {
+ DM_565 = malloc(sizeof(unsigned int) * DM_WIDTH * DM_HEIGHT);
+ for (i = 0; i < DM_WIDTH * DM_HEIGHT; i++)
+ {
+ dith = DM[0][i] >> 3;
+ DM_565[i] = (dith << 20) | dith | (((7 - dith) >> 1) << 10);
+#ifdef VERBOSE
+ printf ("%i %x %x\n", i, dith, DM_565[i]);
+#endif
+ }
+ }
+}
+
+static void
+xlib_rgb_convert_8_d666 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ const unsigned char *dmp;
+ int dith;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax;
+ for (y = 0; y < height; y++)
+ {
+ dmp = DM[(y_align + y) & (DM_HEIGHT - 1)];
+ bp2 = bptr;
+ obptr = obuf;
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ dith = (dmp[(x_align + x) & (DM_WIDTH - 1)] << 2) | 7;
+ r = ((r * 5) + dith) >> 8;
+ g = ((g * 5) + (262 - dith)) >> 8;
+ b = ((b * 5) + dith) >> 8;
+ obptr[0] = colorcube_d[(r << 6) | (g << 3) | b];
+ obptr++;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_8_d (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align,
+ XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ const unsigned char *dmp;
+ int dith;
+ int rs, gs, bs;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ rs = image_info->nred_shades - 1;
+ gs = image_info->ngreen_shades - 1;
+ bs = image_info->nblue_shades - 1;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax;
+ for (y = 0; y < height; y++)
+ {
+ dmp = DM[(y_align + y) & (DM_HEIGHT - 1)];
+ bp2 = bptr;
+ obptr = obuf;
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ dith = (dmp[(x_align + x) & (DM_WIDTH - 1)] << 2) | 7;
+ r = ((r * rs) + dith) >> 8;
+ g = ((g * gs) + (262 - dith)) >> 8;
+ b = ((b * bs) + dith) >> 8;
+ obptr[0] = colorcube_d[(r << 6) | (g << 3) | b];
+ obptr++;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_8_indexed (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ unsigned char c;
+ unsigned char *lut;
+
+ lut = cmap->lut;
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ for (x = 0; x < width; x++)
+ {
+ c = *bp2++;
+ obptr[0] = lut[c];
+ obptr++;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_gray8 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ obptr[0] = (g + ((b + r) >> 1)) >> 1;
+ obptr++;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_gray8_gray (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int y;
+ int bpl;
+ unsigned char *obuf;
+ unsigned char *bptr;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax;
+ for (y = 0; y < height; y++)
+ {
+ memcpy (obuf, bptr, (unsigned int)width);
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+#define HAIRY_CONVERT_565
+#endif
+
+#ifdef HAIRY_CONVERT_565
+/* Render a 24-bit RGB image in buf into the GdkImage, without dithering.
+ This assumes native byte ordering - what should really be done is to
+ check whether static_image->byte_order is consistent with the _ENDIAN
+ config flag, and if not, use a different function.
+
+ This one is even faster than the one below - its inner loop loads 3
+ words (i.e. 4 24-bit pixels), does a lot of shifting and masking,
+ then writes 2 words. */
+static void
+xlib_rgb_convert_565 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf, *obptr;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ unsigned char r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 2;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ if (((unsigned long)obuf | (unsigned long) bp2) & 3)
+ {
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ ((unsigned short *)obptr)[0] = ((r & 0xf8) << 8) |
+ ((g & 0xfc) << 3) |
+ (b >> 3);
+ obptr += 2;
+ }
+ }
+ else
+ {
+ for (x = 0; x < width - 3; x += 4)
+ {
+ unsigned int r1b0g0r0;
+ unsigned int g2r2b1g1;
+ unsigned int b3g3r3b2;
+
+ r1b0g0r0 = ((unsigned int *)bp2)[0];
+ g2r2b1g1 = ((unsigned int *)bp2)[1];
+ b3g3r3b2 = ((unsigned int *)bp2)[2];
+ ((unsigned int *)obptr)[0] =
+ ((r1b0g0r0 & 0xf8) << 8) |
+ ((r1b0g0r0 & 0xfc00) >> 5) |
+ ((r1b0g0r0 & 0xf80000) >> 19) |
+ (r1b0g0r0 & 0xf8000000) |
+ ((g2r2b1g1 & 0xfc) << 19) |
+ ((g2r2b1g1 & 0xf800) << 5);
+ ((unsigned int *)obptr)[1] =
+ ((g2r2b1g1 & 0xf80000) >> 8) |
+ ((g2r2b1g1 & 0xfc000000) >> 21) |
+ ((b3g3r3b2 & 0xf8) >> 3) |
+ ((b3g3r3b2 & 0xf800) << 16) |
+ ((b3g3r3b2 & 0xfc0000) << 3) |
+ ((b3g3r3b2 & 0xf8000000) >> 11);
+ bp2 += 12;
+ obptr += 8;
+ }
+ for (; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ ((unsigned short *)obptr)[0] = ((r & 0xf8) << 8) |
+ ((g & 0xfc) << 3) |
+ (b >> 3);
+ obptr += 2;
+ }
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+#else
+/* Render a 24-bit RGB image in buf into the GdkImage, without dithering.
+ This assumes native byte ordering - what should really be done is to
+ check whether static_image->byte_order is consistent with the _ENDIAN
+ config flag, and if not, use a different function.
+
+ This routine is faster than the one included with Gtk 1.0 for a number
+ of reasons:
+
+ 1. Shifting instead of lookup tables (less memory traffic).
+
+ 2. Much less register pressure, especially because shifts are
+ in the code.
+
+ 3. A memcpy is avoided (i.e. the transfer function).
+
+ 4. On big-endian architectures, byte swapping is avoided.
+
+ That said, it wouldn't be hard to make it even faster - just make an
+ inner loop that reads 3 words (i.e. 4 24-bit pixels), does a lot of
+ shifting and masking, then writes 2 words.
+*/
+static void
+xlib_rgb_convert_565 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ unsigned char r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 2;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ ((unsigned short *)obuf)[x] = ((r & 0xf8) << 8) |
+ ((g & 0xfc) << 3) |
+ (b >> 3);
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+#endif
+
+#ifdef HAIRY_CONVERT_565
+static void
+xlib_rgb_convert_565_gray (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf, *obptr;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ unsigned char g;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 2;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ if (((unsigned long)obuf | (unsigned long) bp2) & 3)
+ {
+ for (x = 0; x < width; x++)
+ {
+ g = *bp2++;
+ ((unsigned short *)obptr)[0] = ((g & 0xf8) << 8) |
+ ((g & 0xfc) << 3) |
+ (g >> 3);
+ obptr += 2;
+ }
+ }
+ else
+ {
+ for (x = 0; x < width - 3; x += 4)
+ {
+ unsigned int g3g2g1g0;
+
+ g3g2g1g0 = ((unsigned int *)bp2)[0];
+ ((unsigned int *)obptr)[0] =
+ ((g3g2g1g0 & 0xf8) << 8) |
+ ((g3g2g1g0 & 0xfc) << 3) |
+ ((g3g2g1g0 & 0xf8) >> 3) |
+ (g3g2g1g0 & 0xf800) << 16 |
+ ((g3g2g1g0 & 0xfc00) << 11) |
+ ((g3g2g1g0 & 0xf800) << 5);
+ ((unsigned int *)obptr)[1] =
+ ((g3g2g1g0 & 0xf80000) >> 8) |
+ ((g3g2g1g0 & 0xfc0000) >> 13) |
+ ((g3g2g1g0 & 0xf80000) >> 19) |
+ (g3g2g1g0 & 0xf8000000) |
+ ((g3g2g1g0 & 0xfc000000) >> 5) |
+ ((g3g2g1g0 & 0xf8000000) >> 11);
+ bp2 += 4;
+ obptr += 8;
+ }
+ for (; x < width; x++)
+ {
+ g = *bp2++;
+ ((unsigned short *)obptr)[0] = ((g & 0xf8) << 8) |
+ ((g & 0xfc) << 3) |
+ (g >> 3);
+ obptr += 2;
+ }
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+#else
+static void
+xlib_rgb_convert_565_gray (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ unsigned char g;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 2;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ g = *bp2++;
+ ((unsigned short *)obuf)[x] = ((g & 0xf8) << 8) |
+ ((g & 0xfc) << 3) |
+ (g >> 3);
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+#endif
+
+static void
+xlib_rgb_convert_565_br (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ unsigned char r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 2;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ /* final word is:
+ g4 g3 g2 b7 b6 b5 b4 b3 r7 r6 r5 r4 r3 g7 g6 g5
+ */
+ ((unsigned short *)obuf)[x] = (r & 0xf8) |
+ ((g & 0xe0) >> 5) |
+ ((g & 0x1c) << 11) |
+ ((b & 0xf8) << 5);
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+/* Thanks to Ray Lehtiniemi for a patch that resulted in a ~25% speedup
+ in this mode. */
+#ifdef HAIRY_CONVERT_565
+static void
+xlib_rgb_convert_565_d (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ /* Now this is what I'd call some highly tuned code! */
+ int x, y;
+ unsigned char *obuf, *obptr;
+ int bpl;
+ unsigned char *bptr, *bp2;
+
+ width += x_align;
+ height += y_align;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 2;
+ for (y = y_align; y < height; y++)
+ {
+ unsigned int *dmp = DM_565 + ((y & (DM_HEIGHT - 1)) << DM_WIDTH_SHIFT);
+ bp2 = bptr;
+ obptr = obuf;
+ if (((unsigned long)obuf | (unsigned long) bp2) & 3)
+ {
+ for (x = x_align; x < width; x++)
+ {
+ int rgb = *bp2++ << 20;
+ rgb += *bp2++ << 10;
+ rgb += *bp2++;
+ rgb += dmp[x & (DM_WIDTH - 1)];
+ rgb += 0x10040100
+ - ((rgb & 0x1e0001e0) >> 5)
+ - ((rgb & 0x00070000) >> 6);
+
+ ((unsigned short *)obptr)[0] =
+ ((rgb & 0x0f800000) >> 12) |
+ ((rgb & 0x0003f000) >> 7) |
+ ((rgb & 0x000000f8) >> 3);
+ obptr += 2;
+ }
+ }
+ else
+ {
+ for (x = x_align; x < width - 3; x += 4)
+ {
+ unsigned int r1b0g0r0;
+ unsigned int g2r2b1g1;
+ unsigned int b3g3r3b2;
+ unsigned int rgb02, rgb13;
+
+ r1b0g0r0 = ((unsigned int *)bp2)[0];
+ g2r2b1g1 = ((unsigned int *)bp2)[1];
+ b3g3r3b2 = ((unsigned int *)bp2)[2];
+ rgb02 =
+ ((r1b0g0r0 & 0xff) << 20) +
+ ((r1b0g0r0 & 0xff00) << 2) +
+ ((r1b0g0r0 & 0xff0000) >> 16) +
+ dmp[x & (DM_WIDTH - 1)];
+ rgb02 += 0x10040100
+ - ((rgb02 & 0x1e0001e0) >> 5)
+ - ((rgb02 & 0x00070000) >> 6);
+ rgb13 =
+ ((r1b0g0r0 & 0xff000000) >> 4) +
+ ((g2r2b1g1 & 0xff) << 10) +
+ ((g2r2b1g1 & 0xff00) >> 8) +
+ dmp[(x + 1) & (DM_WIDTH - 1)];
+ rgb13 += 0x10040100
+ - ((rgb13 & 0x1e0001e0) >> 5)
+ - ((rgb13 & 0x00070000) >> 6);
+ ((unsigned int *)obptr)[0] =
+ ((rgb02 & 0x0f800000) >> 12) |
+ ((rgb02 & 0x0003f000) >> 7) |
+ ((rgb02 & 0x000000f8) >> 3) |
+ ((rgb13 & 0x0f800000) << 4) |
+ ((rgb13 & 0x0003f000) << 9) |
+ ((rgb13 & 0x000000f8) << 13);
+ rgb02 =
+ ((g2r2b1g1 & 0xff0000) << 4) +
+ ((g2r2b1g1 & 0xff000000) >> 14) +
+ (b3g3r3b2 & 0xff) +
+ dmp[(x + 2) & (DM_WIDTH - 1)];
+ rgb02 += 0x10040100
+ - ((rgb02 & 0x1e0001e0) >> 5)
+ - ((rgb02 & 0x00070000) >> 6);
+ rgb13 =
+ ((b3g3r3b2 & 0xff00) << 12) +
+ ((b3g3r3b2 & 0xff0000) >> 6) +
+ ((b3g3r3b2 & 0xff000000) >> 24) +
+ dmp[(x + 3) & (DM_WIDTH - 1)];
+ rgb13 += 0x10040100
+ - ((rgb13 & 0x1e0001e0) >> 5)
+ - ((rgb13 & 0x00070000) >> 6);
+ ((unsigned int *)obptr)[1] =
+ ((rgb02 & 0x0f800000) >> 12) |
+ ((rgb02 & 0x0003f000) >> 7) |
+ ((rgb02 & 0x000000f8) >> 3) |
+ ((rgb13 & 0x0f800000) << 4) |
+ ((rgb13 & 0x0003f000) << 9) |
+ ((rgb13 & 0x000000f8) << 13);
+ bp2 += 12;
+ obptr += 8;
+ }
+ for (; x < width; x++)
+ {
+ int rgb = *bp2++ << 20;
+ rgb += *bp2++ << 10;
+ rgb += *bp2++;
+ rgb += dmp[x & (DM_WIDTH - 1)];
+ rgb += 0x10040100
+ - ((rgb & 0x1e0001e0) >> 5)
+ - ((rgb & 0x00070000) >> 6);
+
+ ((unsigned short *)obptr)[0] =
+ ((rgb & 0x0f800000) >> 12) |
+ ((rgb & 0x0003f000) >> 7) |
+ ((rgb & 0x000000f8) >> 3);
+ obptr += 2;
+ }
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+#else
+static void
+xlib_rgb_convert_565_d (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr;
+
+ width += x_align;
+ height += y_align;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + (ax - x_align) * 2;
+
+ for (y = y_align; y < height; y++)
+ {
+ unsigned int *dmp = DM_565 + ((y & (DM_HEIGHT - 1)) << DM_WIDTH_SHIFT);
+ unsigned char *bp2 = bptr;
+
+ for (x = x_align; x < width; x++)
+ {
+ int rgb = *bp2++ << 20;
+ rgb += *bp2++ << 10;
+ rgb += *bp2++;
+ rgb += dmp[x & (DM_WIDTH - 1)];
+ rgb += 0x10040100
+ - ((rgb & 0x1e0001e0) >> 5)
+ - ((rgb & 0x00070000) >> 6);
+
+ ((unsigned short *)obuf)[x] =
+ ((rgb & 0x0f800000) >> 12) |
+ ((rgb & 0x0003f000) >> 7) |
+ ((rgb & 0x000000f8) >> 3);
+ }
+
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+#endif
+
+static void
+xlib_rgb_convert_555 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ unsigned char r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 2;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ ((unsigned short *)obuf)[x] = ((r & 0xf8) << 7) |
+ ((g & 0xf8) << 2) |
+ (b >> 3);
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_555_br (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ unsigned char r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 2;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ /* final word is:
+ g5 g4 g3 b7 b6 b5 b4 b3 0 r7 r6 r5 r4 r3 g7 g6
+ */
+ ((unsigned short *)obuf)[x] = ((r & 0xf8) >> 1) |
+ ((g & 0xc0) >> 6) |
+ ((g & 0x18) << 10) |
+ ((b & 0xf8) << 5);
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_888_msb (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 3;
+ for (y = 0; y < height; y++)
+ {
+ memcpy (obuf, bptr, (unsigned int)(width + width + width));
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+/* todo: optimize this */
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+#define HAIRY_CONVERT_888
+#endif
+
+#ifdef HAIRY_CONVERT_888
+static void
+xlib_rgb_convert_888_lsb (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf, *obptr;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 3;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ if (((unsigned long)obuf | (unsigned long) bp2) & 3)
+ {
+ for (x = 0; x < width; x++)
+ {
+ r = bp2[0];
+ g = bp2[1];
+ b = bp2[2];
+ *obptr++ = b;
+ *obptr++ = g;
+ *obptr++ = r;
+ bp2 += 3;
+ }
+ }
+ else
+ {
+ for (x = 0; x < width - 3; x += 4)
+ {
+ unsigned int r1b0g0r0;
+ unsigned int g2r2b1g1;
+ unsigned int b3g3r3b2;
+
+ r1b0g0r0 = ((unsigned int *)bp2)[0];
+ g2r2b1g1 = ((unsigned int *)bp2)[1];
+ b3g3r3b2 = ((unsigned int *)bp2)[2];
+ ((unsigned int *)obptr)[0] =
+ (r1b0g0r0 & 0xff00) |
+ ((r1b0g0r0 & 0xff0000) >> 16) |
+ (((g2r2b1g1 & 0xff00) | (r1b0g0r0 & 0xff)) << 16);
+ ((unsigned int *)obptr)[1] =
+ (g2r2b1g1 & 0xff0000ff) |
+ ((r1b0g0r0 & 0xff000000) >> 16) |
+ ((b3g3r3b2 & 0xff) << 16);
+ ((unsigned int *)obptr)[2] =
+ (((g2r2b1g1 & 0xff0000) | (b3g3r3b2 & 0xff000000)) >> 16) |
+ ((b3g3r3b2 & 0xff00) << 16) |
+ ((b3g3r3b2 & 0xff0000));
+ bp2 += 12;
+ obptr += 12;
+ }
+ for (; x < width; x++)
+ {
+ r = bp2[0];
+ g = bp2[1];
+ b = bp2[2];
+ *obptr++ = b;
+ *obptr++ = g;
+ *obptr++ = r;
+ bp2 += 3;
+ }
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+#else
+static void
+xlib_rgb_convert_888_lsb (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 3;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = bp2[0];
+ g = bp2[1];
+ b = bp2[2];
+ obuf[x * 3] = b;
+ obuf[x * 3 + 1] = g;
+ obuf[x * 3 + 2] = r;
+ bp2 += 3;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+#endif
+
+/* convert 24-bit packed to 32-bit unpacked */
+/* todo: optimize this */
+static void
+xlib_rgb_convert_0888 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 4;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = bp2[0];
+ g = bp2[1];
+ b = bp2[2];
+ ((unsigned int *)obuf)[x] = (r << 16) | (g << 8) | b;
+ bp2 += 3;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_0888_br (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 4;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = bp2[0];
+ g = bp2[1];
+ b = bp2[2];
+ ((unsigned int *)obuf)[x] = (b << 24) | (g << 16) | (r << 8);
+ bp2 += 3;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_8880_br (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * 4;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = bp2[0];
+ g = bp2[1];
+ b = bp2[2];
+ ((unsigned int *)obuf)[x] = (b << 16) | (g << 8) | r;
+ bp2 += 3;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+/* Generic truecolor/directcolor conversion function. Slow, but these
+ are oddball modes. */
+static void
+xlib_rgb_convert_truecolor_lsb (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align,
+ XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf, *obptr;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ int r_right, r_left;
+ int g_right, g_left;
+ int b_right, b_left;
+ int bpp;
+ unsigned int pixel;
+ int i;
+
+ r_right = 8 - image_info->red_prec;
+ r_left = image_info->red_shift;
+ g_right = 8 - image_info->green_prec;
+ g_left = image_info->green_shift;
+ b_right = 8 - image_info->blue_prec;
+ b_left = image_info->blue_shift;
+ bpp = image_info->bpp;
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * bpp;
+ for (y = 0; y < height; y++)
+ {
+ obptr = obuf;
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = bp2[0];
+ g = bp2[1];
+ b = bp2[2];
+ pixel = ((r >> r_right) << r_left) |
+ ((g >> g_right) << g_left) |
+ ((b >> b_right) << b_left);
+ for (i = 0; i < bpp; i++)
+ {
+ *obptr++ = pixel & 0xff;
+ pixel >>= 8;
+ }
+ bp2 += 3;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_truecolor_lsb_d (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align,
+ XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf, *obptr;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ int r_right, r_left, r_prec;
+ int g_right, g_left, g_prec;
+ int b_right, b_left, b_prec;
+ int bpp;
+ unsigned int pixel;
+ int i;
+ int dith;
+ int r1, g1, b1;
+ const unsigned char *dmp;
+
+ r_right = 8 - image_info->red_prec;
+ r_left = image_info->red_shift;
+ r_prec = image_info->red_prec;
+ g_right = 8 - image_info->green_prec;
+ g_left = image_info->green_shift;
+ g_prec = image_info->green_prec;
+ b_right = 8 - image_info->blue_prec;
+ b_left = image_info->blue_shift;
+ b_prec = image_info->blue_prec;
+ bpp = image_info->bpp;
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * bpp;
+ for (y = 0; y < height; y++)
+ {
+ dmp = DM[(y_align + y) & (DM_HEIGHT - 1)];
+ obptr = obuf;
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = bp2[0];
+ g = bp2[1];
+ b = bp2[2];
+ dith = dmp[(x_align + x) & (DM_WIDTH - 1)] << 2;
+ r1 = r + (dith >> r_prec);
+ g1 = g + ((252 - dith) >> g_prec);
+ b1 = b + (dith >> b_prec);
+ pixel = (((r1 - (r1 >> r_prec)) >> r_right) << r_left) |
+ (((g1 - (g1 >> g_prec)) >> g_right) << g_left) |
+ (((b1 - (b1 >> b_prec)) >> b_right) << b_left);
+ for (i = 0; i < bpp; i++)
+ {
+ *obptr++ = pixel & 0xff;
+ pixel >>= 8;
+ }
+ bp2 += 3;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_truecolor_msb (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align,
+ XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf, *obptr;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ int r_right, r_left;
+ int g_right, g_left;
+ int b_right, b_left;
+ int bpp;
+ unsigned int pixel;
+ int shift, shift_init;
+
+ r_right = 8 - image_info->red_prec;
+ r_left = image_info->red_shift;
+ g_right = 8 - image_info->green_prec;
+ g_left = image_info->green_shift;
+ b_right = 8 - image_info->blue_prec;
+ b_left = image_info->blue_shift;
+ bpp = image_info->bpp;
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * bpp;
+ shift_init = (bpp - 1) << 3;
+ for (y = 0; y < height; y++)
+ {
+ obptr = obuf;
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = bp2[0];
+ g = bp2[1];
+ b = bp2[2];
+ pixel = ((r >> r_right) << r_left) |
+ ((g >> g_right) << g_left) |
+ ((b >> b_right) << b_left);
+ for (shift = shift_init; shift >= 0; shift -= 8)
+ {
+ *obptr++ = (pixel >> shift) & 0xff;
+ }
+ bp2 += 3;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_truecolor_msb_d (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align,
+ XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *obuf, *obptr;
+ int bpl;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ int r_right, r_left, r_prec;
+ int g_right, g_left, g_prec;
+ int b_right, b_left, b_prec;
+ int bpp;
+ unsigned int pixel;
+ int shift, shift_init;
+ int dith;
+ int r1, g1, b1;
+ const unsigned char *dmp;
+
+ r_right = 8 - image_info->red_prec;
+ r_left = image_info->red_shift;
+ r_prec = image_info->red_prec;
+ g_right = 8 - image_info->green_prec;
+ g_left = image_info->green_shift;
+ g_prec = image_info->green_prec;
+ b_right = 8 - image_info->blue_prec;
+ b_left = image_info->blue_shift;
+ b_prec = image_info->blue_prec;
+ bpp = image_info->bpp;
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax * bpp;
+ shift_init = (bpp - 1) << 3;
+ for (y = 0; y < height; y++)
+ {
+ dmp = DM[(y_align + y) & (DM_HEIGHT - 1)];
+ obptr = obuf;
+ bp2 = bptr;
+ for (x = 0; x < width; x++)
+ {
+ r = bp2[0];
+ g = bp2[1];
+ b = bp2[2];
+ dith = dmp[(x_align + x) & (DM_WIDTH - 1)] << 2;
+ r1 = r + (dith >> r_prec);
+ g1 = g + ((252 - dith) >> g_prec);
+ b1 = b + (dith >> b_prec);
+ pixel = (((r1 - (r1 >> r_prec)) >> r_right) << r_left) |
+ (((g1 - (g1 >> g_prec)) >> g_right) << g_left) |
+ (((b1 - (b1 >> b_prec)) >> b_right) << b_left);
+ for (shift = shift_init; shift >= 0; shift -= 8)
+ {
+ *obptr++ = (pixel >> shift) & 0xff;
+ }
+ bp2 += 3;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+/* This actually works for depths from 3 to 7 */
+static void
+xlib_rgb_convert_4 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align,
+ XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ const unsigned char *dmp;
+ int dith;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax;
+ for (y = 0; y < height; y++)
+ {
+ dmp = DM[(y_align + y) & (DM_HEIGHT - 1)];
+ bp2 = bptr;
+ obptr = obuf;
+ for (x = 0; x < width; x += 1)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ dith = (dmp[(x_align + x) & (DM_WIDTH - 1)] << 2) | 3;
+ obptr[0] = colorcube_d[(((r + dith) & 0x100) >> 2) |
+ (((g + 258 - dith) & 0x100) >> 5) |
+ (((b + dith) & 0x100) >> 8)];
+ obptr++;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+/* This actually works for depths from 3 to 7 */
+static void
+xlib_rgb_convert_gray4 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ int shift;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax;
+ shift = 9 - image_info->x_visual_info->depth;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ obptr[0] = (g + ((b + r) >> 1)) >> shift;
+ obptr++;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_gray4_pack (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ int shift;
+ unsigned char pix0, pix1;
+ /* todo: this is hardcoded to big-endian. Make endian-agile. */
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + (ax >> 1);
+ shift = 9 - image_info->x_visual_info->depth;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ for (x = 0; x < width; x += 2)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ pix0 = (g + ((b + r) >> 1)) >> shift;
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ pix1 = (g + ((b + r) >> 1)) >> shift;
+ obptr[0] = (pix0 << 4) | pix1;
+ obptr++;
+ }
+ if (width & 1)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ pix0 = (g + ((b + r) >> 1)) >> shift;
+ obptr[0] = (pix0 << 4);
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+/* This actually works for depths from 3 to 7 */
+static void
+xlib_rgb_convert_gray4_d (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ const unsigned char *dmp;
+ int prec, right;
+ int gray;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + ax;
+ prec = image_info->x_visual_info->depth;
+ right = 8 - prec;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ dmp = DM[(y_align + y) & (DM_HEIGHT - 1)];
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ gray = (g + ((b + r) >> 1)) >> 1;
+ gray += (dmp[(x_align + x) & (DM_WIDTH - 1)] << 2) >> prec;
+ obptr[0] = (gray - (gray >> prec)) >> right;
+ obptr++;
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_gray4_d_pack (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ const unsigned char *dmp;
+ int prec, right;
+ int gray;
+ unsigned char pix0, pix1;
+ /* todo: this is hardcoded to big-endian. Make endian-agile. */
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + (ax >> 1);
+ prec = image_info->x_visual_info->depth;
+ right = 8 - prec;
+ for (y = 0; y < height; y++)
+ {
+ bp2 = bptr;
+ obptr = obuf;
+ dmp = DM[(y_align + y) & (DM_HEIGHT - 1)];
+ for (x = 0; x < width; x += 2)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ gray = (g + ((b + r) >> 1)) >> 1;
+ gray += (dmp[(x_align + x) & (DM_WIDTH - 1)] << 2) >> prec;
+ pix0 = (gray - (gray >> prec)) >> right;
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ gray = (g + ((b + r) >> 1)) >> 1;
+ gray += (dmp[(x_align + x + 1) & (DM_WIDTH - 1)] << 2) >> prec;
+ pix1 = (gray - (gray >> prec)) >> right;
+ obptr[0] = (pix0 << 4) | pix1;
+ obptr++;
+ }
+ if (width & 1)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ gray = (g + ((b + r) >> 1)) >> 1;
+ gray += (dmp[(x_align + x + 1) & (DM_WIDTH - 1)] << 2) >> prec;
+ pix0 = (gray - (gray >> prec)) >> right;
+ obptr[0] = (pix0 << 4);
+ }
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+static void
+xlib_rgb_convert_1 (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align,
+ XlibRgbCmap *cmap)
+{
+ int x, y;
+ int bpl;
+ unsigned char *obuf, *obptr;
+ unsigned char *bptr, *bp2;
+ int r, g, b;
+ const unsigned char *dmp;
+ int dith;
+ unsigned char byte;
+
+ bptr = buf;
+ bpl = image->bytes_per_line;
+ obuf = ((unsigned char *)image->data) + ay * bpl + (ax >> 3);
+ byte = 0; /* unnecessary, but it keeps gcc from complaining */
+ for (y = 0; y < height; y++)
+ {
+ dmp = DM[(y_align + y) & (DM_HEIGHT - 1)];
+ bp2 = bptr;
+ obptr = obuf;
+ for (x = 0; x < width; x++)
+ {
+ r = *bp2++;
+ g = *bp2++;
+ b = *bp2++;
+ dith = (dmp[(x_align + x) & (DM_WIDTH - 1)] << 4) | 4;
+ byte += byte + (r + g + g + b + dith > 1020);
+ if ((x & 7) == 7)
+ {
+ obptr[0] = byte;
+ obptr++;
+ }
+ }
+ if (x & 7)
+ obptr[0] = byte << (8 - (x & 7));
+ bptr += rowstride;
+ obuf += bpl;
+ }
+}
+
+/* Returns a pointer to the stage buffer. */
+static unsigned char *
+xlib_rgb_ensure_stage (void)
+{
+ if (image_info->stage_buf == NULL)
+ image_info->stage_buf = malloc (IMAGE_HEIGHT * STAGE_ROWSTRIDE);
+ return image_info->stage_buf;
+}
+
+/* This is slow. Speed me up, please. */
+static void
+xlib_rgb_32_to_stage (unsigned char *buf, int rowstride, int width, int height)
+{
+ int x, y;
+ unsigned char *pi_start, *po_start;
+ unsigned char *pi, *po;
+
+ pi_start = buf;
+ po_start = xlib_rgb_ensure_stage ();
+ for (y = 0; y < height; y++)
+ {
+ pi = pi_start;
+ po = po_start;
+ for (x = 0; x < width; x++)
+ {
+ *po++ = *pi++;
+ *po++ = *pi++;
+ *po++ = *pi++;
+ pi++;
+ }
+ pi_start += rowstride;
+ po_start += STAGE_ROWSTRIDE;
+ }
+}
+
+/* Generic 32bit RGB conversion function - convert to 24bit packed, then
+ go from there. */
+static void
+xlib_rgb_convert_32_generic (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ xlib_rgb_32_to_stage (buf, rowstride, width, height);
+
+ (*image_info->conv) (image, ax, ay, width, height,
+ image_info->stage_buf, STAGE_ROWSTRIDE,
+ x_align, y_align, cmap);
+}
+
+/* Generic 32bit RGB conversion function - convert to 24bit packed, then
+ go from there. */
+static void
+xlib_rgb_convert_32_generic_d (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ xlib_rgb_32_to_stage (buf, rowstride, width, height);
+
+ (*image_info->conv_d) (image, ax, ay, width, height,
+ image_info->stage_buf, STAGE_ROWSTRIDE,
+ x_align, y_align, cmap);
+}
+
+/* This is slow. Speed me up, please. */
+static void
+xlib_rgb_gray_to_stage (unsigned char *buf, int rowstride, int width, int height)
+{
+ int x, y;
+ unsigned char *pi_start, *po_start;
+ unsigned char *pi, *po;
+ unsigned char gray;
+
+ pi_start = buf;
+ po_start = xlib_rgb_ensure_stage ();
+ for (y = 0; y < height; y++)
+ {
+ pi = pi_start;
+ po = po_start;
+ for (x = 0; x < width; x++)
+ {
+ gray = *pi++;
+ *po++ = gray;
+ *po++ = gray;
+ *po++ = gray;
+ }
+ pi_start += rowstride;
+ po_start += STAGE_ROWSTRIDE;
+ }
+}
+
+/* Generic gray conversion function - convert to 24bit packed, then go
+ from there. */
+static void
+xlib_rgb_convert_gray_generic (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ xlib_rgb_gray_to_stage (buf, rowstride, width, height);
+
+ (*image_info->conv) (image, ax, ay, width, height,
+ image_info->stage_buf, STAGE_ROWSTRIDE,
+ x_align, y_align, cmap);
+}
+
+static void
+xlib_rgb_convert_gray_generic_d (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ xlib_rgb_gray_to_stage (buf, rowstride, width, height);
+
+ (*image_info->conv_d) (image, ax, ay, width, height,
+ image_info->stage_buf, STAGE_ROWSTRIDE,
+ x_align, y_align, cmap);
+}
+
+/* Render grayscale using indexed method. */
+static void
+xlib_rgb_convert_gray_cmap (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ (*image_info->conv_indexed) (image, ax, ay, width, height,
+ buf, rowstride,
+ x_align, y_align, image_info->gray_cmap);
+}
+
+#if 0
+static void
+xlib_rgb_convert_gray_cmap_d (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ (*image_info->conv_indexed_d) (image, ax, ay, width, height,
+ buf, rowstride,
+ x_align, y_align, image_info->gray_cmap);
+}
+#endif
+
+/* This is slow. Speed me up, please. */
+static void
+xlib_rgb_indexed_to_stage (unsigned char *buf, int rowstride, int width, int height,
+ XlibRgbCmap *cmap)
+{
+ int x, y;
+ unsigned char *pi_start, *po_start;
+ unsigned char *pi, *po;
+ int rgb;
+
+ pi_start = buf;
+ po_start = xlib_rgb_ensure_stage ();
+ for (y = 0; y < height; y++)
+ {
+ pi = pi_start;
+ po = po_start;
+ for (x = 0; x < width; x++)
+ {
+ rgb = cmap->colors[*pi++];
+ *po++ = rgb >> 16;
+ *po++ = (rgb >> 8) & 0xff;
+ *po++ = rgb & 0xff;
+ }
+ pi_start += rowstride;
+ po_start += STAGE_ROWSTRIDE;
+ }
+}
+
+/* Generic gray conversion function - convert to 24bit packed, then go
+ from there. */
+static void
+xlib_rgb_convert_indexed_generic (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align, XlibRgbCmap *cmap)
+{
+ xlib_rgb_indexed_to_stage (buf, rowstride, width, height, cmap);
+
+ (*image_info->conv) (image, ax, ay, width, height,
+ image_info->stage_buf, STAGE_ROWSTRIDE,
+ x_align, y_align, cmap);
+}
+
+static void
+xlib_rgb_convert_indexed_generic_d (XImage *image,
+ int ax, int ay, int width, int height,
+ unsigned char *buf, int rowstride,
+ int x_align, int y_align,
+ XlibRgbCmap *cmap)
+{
+ xlib_rgb_indexed_to_stage (buf, rowstride, width, height, cmap);
+
+ (*image_info->conv_d) (image, ax, ay, width, height,
+ image_info->stage_buf, STAGE_ROWSTRIDE,
+ x_align, y_align, cmap);
+}
+
+/* Select a conversion function based on the visual and a
+ representative image. */
+static void
+xlib_rgb_select_conv (XImage *image, ByteOrder byte_order)
+{
+ int depth, byterev;
+ int vtype; /* visual type */
+ int bpp; /* bits per pixel - from the visual */
+ unsigned int red_mask, green_mask, blue_mask;
+ XlibRgbConvFunc conv, conv_d;
+ XlibRgbConvFunc conv_32, conv_32_d;
+ XlibRgbConvFunc conv_gray, conv_gray_d;
+ XlibRgbConvFunc conv_indexed, conv_indexed_d;
+ Bool mask_rgb, mask_bgr;
+
+ depth = image_info->x_visual_info->depth;
+ bpp = image->bits_per_pixel;
+ if (xlib_rgb_verbose)
+ printf ("Chose visual 0x%x, image bpp=%d, %s first\n",
+ (int)image_info->x_visual_info->visual->visualid,
+ bpp, byte_order == LSB_FIRST ? "lsb" : "msb");
+
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+ byterev = (byte_order == LSB_FIRST);
+#else
+ byterev = (byte_order == MSB_FIRST);
+#endif
+
+ vtype = image_info->x_visual_info->class;
+ if (vtype == DirectColor)
+ vtype = TrueColor;
+
+ red_mask = image_info->x_visual_info->red_mask;
+ green_mask = image_info->x_visual_info->green_mask;
+ blue_mask = image_info->x_visual_info->blue_mask;
+
+ mask_rgb = red_mask == 0xff0000 && green_mask == 0xff00 && blue_mask == 0xff;
+ mask_bgr = red_mask == 0xff && green_mask == 0xff00 && blue_mask == 0xff0000;
+
+ conv = NULL;
+ conv_d = NULL;
+
+ conv_32 = xlib_rgb_convert_32_generic;
+ conv_32_d = xlib_rgb_convert_32_generic_d;
+
+ conv_gray = xlib_rgb_convert_gray_generic;
+ conv_gray_d = xlib_rgb_convert_gray_generic_d;
+
+ conv_indexed = xlib_rgb_convert_indexed_generic;
+ conv_indexed_d = xlib_rgb_convert_indexed_generic_d;
+
+ image_info->dith_default = FALSE;
+
+ if (image_info->bitmap)
+ conv = xlib_rgb_convert_1;
+ else if (bpp == 16 && depth == 16 && !byterev &&
+ red_mask == 0xf800 && green_mask == 0x7e0 && blue_mask == 0x1f)
+ {
+ conv = xlib_rgb_convert_565;
+ conv_d = xlib_rgb_convert_565_d;
+ conv_gray = xlib_rgb_convert_565_gray;
+ xlib_rgb_preprocess_dm_565 ();
+ }
+ else if (bpp == 16 && depth == 16 &&
+ vtype == TrueColor&& byterev &&
+ red_mask == 0xf800 && green_mask == 0x7e0 && blue_mask == 0x1f)
+ conv = xlib_rgb_convert_565_br;
+
+ else if (bpp == 16 && depth == 15 &&
+ vtype == TrueColor && !byterev &&
+ red_mask == 0x7c00 && green_mask == 0x3e0 && blue_mask == 0x1f)
+ conv = xlib_rgb_convert_555;
+
+ else if (bpp == 16 && depth == 15 &&
+ vtype == TrueColor && byterev &&
+ red_mask == 0x7c00 && green_mask == 0x3e0 && blue_mask == 0x1f)
+ conv = xlib_rgb_convert_555_br;
+
+ /* I'm not 100% sure about the 24bpp tests - but testing will show*/
+ else if (bpp == 24 && depth == 24 && vtype == TrueColor &&
+ ((mask_rgb && byte_order == LSB_FIRST) ||
+ (mask_bgr && byte_order == MSB_FIRST)))
+ conv = xlib_rgb_convert_888_lsb;
+ else if (bpp == 24 && depth == 24 && vtype == TrueColor &&
+ ((mask_rgb && byte_order == MSB_FIRST) ||
+ (mask_bgr && byte_order == LSB_FIRST)))
+ conv = xlib_rgb_convert_888_msb;
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+ else if (bpp == 32 && depth == 24 && vtype == TrueColor &&
+ (mask_rgb && byte_order == LSB_FIRST))
+ conv = xlib_rgb_convert_0888_br;
+ else if (bpp == 32 && depth == 24 && vtype == TrueColor &&
+ (mask_rgb && byte_order == MSB_FIRST))
+ conv = xlib_rgb_convert_0888;
+ else if (bpp == 32 && depth == 24 && vtype == TrueColor &&
+ (mask_bgr && byte_order == MSB_FIRST))
+ conv = xlib_rgb_convert_8880_br;
+#else
+ else if (bpp == 32 && depth == 24 && vtype == TrueColor &&
+ (mask_rgb && byte_order == MSB_FIRST))
+ conv = xlib_rgb_convert_0888_br;
+ else if (bpp == 32 && (depth == 32 || depth == 24) && vtype == TrueColor &&
+ (mask_rgb && byte_order == LSB_FIRST))
+ conv = xlib_rgb_convert_0888;
+ else if (bpp == 32 && depth == 24 && vtype == TrueColor &&
+ (mask_bgr && byte_order == LSB_FIRST))
+ conv = xlib_rgb_convert_8880_br;
+#endif
+
+ else if (vtype == TrueColor && byte_order == LSB_FIRST)
+ {
+ conv = xlib_rgb_convert_truecolor_lsb;
+ conv_d = xlib_rgb_convert_truecolor_lsb_d;
+ }
+ else if (vtype == TrueColor && byte_order == MSB_FIRST)
+ {
+ conv = xlib_rgb_convert_truecolor_msb;
+ conv_d = xlib_rgb_convert_truecolor_msb_d;
+ }
+ else if (bpp == 8 && depth == 8 && (vtype == PseudoColor
+#ifdef ENABLE_GRAYSCALE
+ || vtype == GrayScale
+#endif
+ ))
+ {
+ image_info->dith_default = TRUE;
+ conv = xlib_rgb_convert_8;
+ if (vtype != GrayScale)
+ {
+ if (image_info->nred_shades == 6 &&
+ image_info->ngreen_shades == 6 &&
+ image_info->nblue_shades == 6)
+ conv_d = xlib_rgb_convert_8_d666;
+ else
+ conv_d = xlib_rgb_convert_8_d;
+ }
+ conv_indexed = xlib_rgb_convert_8_indexed;
+ conv_gray = xlib_rgb_convert_gray_cmap;
+ }
+ else if (bpp == 8 && depth == 8 && (vtype == StaticGray
+#ifdef not_ENABLE_GRAYSCALE
+ || vtype == GrayScale
+#endif
+ ))
+ {
+ conv = xlib_rgb_convert_gray8;
+ conv_gray = xlib_rgb_convert_gray8_gray;
+ }
+ else if (bpp == 8 && depth < 8 && depth >= 2 &&
+ (vtype == StaticGray
+ || vtype == GrayScale))
+ {
+ conv = xlib_rgb_convert_gray4;
+ conv_d = xlib_rgb_convert_gray4_d;
+ }
+ else if (bpp == 8 && depth < 8 && depth >= 3)
+ {
+ conv = xlib_rgb_convert_4;
+ }
+ else if (bpp == 4 && depth <= 4 && depth >= 2 &&
+ (vtype == StaticGray
+ || vtype == GrayScale))
+ {
+ conv = xlib_rgb_convert_gray4_pack;
+ conv_d = xlib_rgb_convert_gray4_d_pack;
+ }
+
+ if (conv_d == NULL)
+ conv_d = conv;
+
+ image_info->conv = conv;
+ image_info->conv_d = conv_d;
+
+ image_info->conv_32 = conv_32;
+ image_info->conv_32_d = conv_32_d;
+
+ image_info->conv_gray = conv_gray;
+ image_info->conv_gray_d = conv_gray_d;
+
+ image_info->conv_indexed = conv_indexed;
+ image_info->conv_indexed_d = conv_indexed_d;
+}
+
+static int horiz_idx;
+static int horiz_y = IMAGE_HEIGHT;
+static int vert_idx;
+static int vert_x = IMAGE_WIDTH;
+static int tile_idx;
+static int tile_x = IMAGE_WIDTH;
+static int tile_y1 = IMAGE_HEIGHT;
+static int tile_y2 = IMAGE_HEIGHT;
+
+#ifdef VERBOSE
+static int sincelast;
+#endif
+
+/* Defining NO_FLUSH can cause inconsistent screen updates, but is useful
+ for performance evaluation. */
+
+#undef NO_FLUSH
+
+static int
+xlib_rgb_alloc_scratch_image (void)
+{
+ if (static_image_idx == N_IMAGES)
+ {
+#ifndef NO_FLUSH
+ XFlush(image_info->display);
+#endif
+#ifdef VERBOSE
+ printf ("flush, %d puts since last flush\n", sincelast);
+ sincelast = 0;
+#endif
+ static_image_idx = 0;
+ horiz_y = IMAGE_HEIGHT;
+ vert_x = IMAGE_WIDTH;
+ tile_x = IMAGE_WIDTH;
+ tile_y1 = tile_y2 = IMAGE_HEIGHT;
+ }
+ return static_image_idx++;
+}
+
+static XImage *
+xlib_rgb_alloc_scratch (int width, int height, int *ax, int *ay)
+{
+ XImage *image;
+ int idx;
+
+ if (width >= (IMAGE_WIDTH >> 1))
+ {
+ if (height >= (IMAGE_HEIGHT >> 1))
+ {
+ idx = xlib_rgb_alloc_scratch_image ();
+ *ax = 0;
+ *ay = 0;
+ }
+ else
+ {
+ if (height + horiz_y > IMAGE_HEIGHT)
+ {
+ horiz_idx = xlib_rgb_alloc_scratch_image ();
+ horiz_y = 0;
+ }
+ idx = horiz_idx;
+ *ax = 0;
+ *ay = horiz_y;
+ horiz_y += height;
+ }
+ }
+ else
+ {
+ if (height >= (IMAGE_HEIGHT >> 1))
+ {
+ if (width + vert_x > IMAGE_WIDTH)
+ {
+ vert_idx = xlib_rgb_alloc_scratch_image ();
+ vert_x = 0;
+ }
+ idx = vert_idx;
+ *ax = vert_x;
+ *ay = 0;
+ /* using 3 and -4 would be slightly more efficient on 32-bit machines
+ with > 1bpp displays */
+ vert_x += (width + 7) & -8;
+ }
+ else
+ {
+ if (width + tile_x > IMAGE_WIDTH)
+ {
+ tile_y1 = tile_y2;
+ tile_x = 0;
+ }
+ if (height + tile_y1 > IMAGE_HEIGHT)
+ {
+ tile_idx = xlib_rgb_alloc_scratch_image ();
+ tile_x = 0;
+ tile_y1 = 0;
+ tile_y2 = 0;
+ }
+ if (height + tile_y1 > tile_y2)
+ tile_y2 = height + tile_y1;
+ idx = tile_idx;
+ *ax = tile_x;
+ *ay = tile_y1;
+ tile_x += (width + 7) & -8;
+ }
+ }
+ image = static_image[idx];
+#ifdef VERBOSE
+ printf ("index %d, x %d, y %d (%d x %d)\n", idx, *ax, *ay, width, height);
+ sincelast++;
+#endif
+ return image;
+}
+
+static void
+xlib_draw_rgb_image_core (Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ int width,
+ int height,
+ unsigned char *buf,
+ int pixstride,
+ int rowstride,
+ XlibRgbConvFunc conv,
+ XlibRgbCmap *cmap,
+ int xdith,
+ int ydith)
+{
+ int ay, ax;
+ int xs0, ys0;
+ XImage *image;
+ int width1, height1;
+ unsigned char *buf_ptr;
+
+ if (image_info->bitmap)
+ {
+ if (image_info->own_gc == 0)
+ {
+ XColor color;
+
+ image_info->own_gc = XCreateGC(image_info->display,
+ drawable,
+ 0, NULL);
+ color.pixel = WhitePixel(image_info->display,
+ image_info->screen_num);
+ XSetForeground(image_info->display, image_info->own_gc, color.pixel);
+ color.pixel = BlackPixel(image_info->display,
+ image_info->screen_num);
+ XSetBackground(image_info->display, image_info->own_gc, color.pixel);
+ }
+ gc = image_info->own_gc;
+ }
+ for (ay = 0; ay < height; ay += IMAGE_HEIGHT)
+ {
+ height1 = MIN (height - ay, IMAGE_HEIGHT);
+ for (ax = 0; ax < width; ax += IMAGE_WIDTH)
+ {
+ width1 = MIN (width - ax, IMAGE_WIDTH);
+ buf_ptr = buf + ay * rowstride + ax * pixstride;
+
+ image = xlib_rgb_alloc_scratch (width1, height1, &xs0, &ys0);
+
+ conv (image, xs0, ys0, width1, height1, buf_ptr, rowstride,
+ x + ax + xdith, y + ay + ydith, cmap);
+
+#ifndef DONT_ACTUALLY_DRAW
+ XPutImage(image_info->display, drawable, gc, image,
+ xs0, ys0, x + ax, y + ay, (unsigned int)width1, (unsigned int)height1);
+#endif
+ }
+ }
+}
+
+
+/**
+ * xlib_draw_rgb_image:
+ * @drawable: Destination drawable.
+ * @gc: A graphic context.
+ * @x: Leftmost coordinate of the destination rectangle.
+ * @y: Upper coordinate of the destination rectangle.
+ * @width: Width of the destination rectangle, in pixels.
+ * @height: Height of the destination rectangle, in pixels.
+ * @dith: Dithering method to use.
+ * @rgb_buf: Pointer to the pixel in the RGB buffer that corresponds to the
+ * upper-left corner of the rectangular region to render.
+ * @rowstride: Offset between pixel rows in the RGB buffer, in bytes.
+ *
+ * Renders an RGB buffer to a drawable. Pixels are specified as RGB triplets
+ * with 8 bits per channel. An image will thus look like an RGBRGBRGBRGB
+ * sequence of 8-bit values. This function does not let you specify dither
+ * offsets; applications that need to render partial regions of a buffer to
+ * build the final image should use xlib_draw_rgb_image_dithalign() instead.
+ **/
+void
+xlib_draw_rgb_image (Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ int width,
+ int height,
+ XlibRgbDither dith,
+ unsigned char *rgb_buf,
+ int rowstride)
+{
+ if (dith == XLIB_RGB_DITHER_NONE || (dith == XLIB_RGB_DITHER_NORMAL &&
+ !image_info->dith_default))
+ xlib_draw_rgb_image_core (drawable, gc, x, y, width, height,
+ rgb_buf, 3, rowstride, image_info->conv, NULL,
+ 0, 0);
+ else
+ xlib_draw_rgb_image_core (drawable, gc, x, y, width, height,
+ rgb_buf, 3, rowstride, image_info->conv_d, NULL,
+ 0, 0);
+}
+
+
+
+/**
+ * xlib_rgb_cmap_free:
+ * @cmap: An XlibRGB colormap.
+ *
+ * Frees an XlibRGB colormap.
+ **/
+void
+xlib_rgb_cmap_free (XlibRgbCmap *cmap)
+{
+ free (cmap);
+}
+
+/**
+ * xlib_draw_indexed_image:
+ * @drawable: FIXME
+ * @gc: FIXME
+ * @x: FIXME
+ * @y: FIXME
+ * @width: FIXME
+ * @height: FIXME
+ * @dith: FIXME
+ * @buf: FIXME
+ * @rowstride: FIXME
+ * @cmap: FIXME
+ *
+ * FIXME
+ **/
+void
+xlib_draw_indexed_image (Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ int width,
+ int height,
+ XlibRgbDither dith,
+ unsigned char *buf,
+ int rowstride,
+ XlibRgbCmap *cmap)
+{
+ if (dith == XLIB_RGB_DITHER_NONE || (dith == XLIB_RGB_DITHER_NORMAL &&
+ !image_info->dith_default))
+ xlib_draw_rgb_image_core (drawable, gc, x, y, width, height,
+ buf, 1, rowstride,
+ image_info->conv_indexed, cmap, 0, 0);
+ else
+ xlib_draw_rgb_image_core (drawable, gc, x, y, width, height,
+ buf, 1, rowstride,
+ image_info->conv_indexed_d, cmap, 0, 0);
+}
+
+/**
+ * xlib_rgb_ditherable:
+ *
+ * Queries whether XlibRGB supports dithering for its chosen visual.
+ *
+ * Return value: TRUE if dithering can be performed for the visual that XlibRGB
+ * is using, FALSE otherwise.
+ **/
+Bool
+xlib_rgb_ditherable (void)
+{
+ return (image_info->conv != image_info->conv_d);
+}
+
+/**
+ * xlib_rgb_get_cmap:
+ *
+ * Queries the X colormap that XlibRGB is using.
+ *
+ * Return value: An X colormap.
+ **/
+Colormap
+xlib_rgb_get_cmap (void)
+{
+ /* xlib_rgb_init (); */
+ if (image_info)
+ return image_info->cmap;
+ else
+ return 0;
+}
+
+/**
+ * xlib_rgb_get_visual:
+ *
+ * Queries the visual that XlibRGB is using.
+ *
+ * Return value: An X visual.
+ **/
+Visual *
+xlib_rgb_get_visual (void)
+{
+ /* xlib_rgb_init (); */
+ if (image_info)
+ return image_info->x_visual_info->visual;
+ else
+ return 0;
+}
+
+/**
+ * xlib_rgb_get_visual_info:
+ *
+ * Queries the visual info structure for the visual that XlibRGB is using.
+ *
+ * Return value: An XVisualInfo structure.
+ **/
+XVisualInfo *
+xlib_rgb_get_visual_info (void)
+{
+ /* xlib_rgb_init (); */
+ if (image_info)
+ return image_info->x_visual_info;
+ else
+ return 0;
+}
+
+/**
+ * xlib_rgb_get_depth:
+ *
+ * Queries the depth of the visual that XlibRGB is using.
+ *
+ * Return value: Bit depth.
+ **/
+int
+xlib_rgb_get_depth (void)
+{
+ XVisualInfo * v = xlib_rgb_get_visual_info();
+
+ if (v)
+ {
+ return v->depth;
+ }
+
+ return 0;
+}
+
+/**
+ * xlib_rgb_get_display:
+ *
+ * Queries the X display that XlibRGB is using.
+ *
+ * Return value: An X display.
+ **/
+Display *
+xlib_rgb_get_display (void)
+{
+ if (image_info)
+ return image_info->display;
+
+ return NULL;
+}
+
+/**
+ * xlib_rgb_get_screen:
+ *
+ * Queries the screen that XlibRGB is using.
+ *
+ * Return value: An X screen.
+ **/
+Screen *
+xlib_rgb_get_screen (void)
+{
+ if (image_info)
+ return image_info->screen;
+
+ return NULL;
+}
diff --git a/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlibrgb.h b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlibrgb.h
new file mode 100644
index 00000000..afde174e
--- /dev/null
+++ b/ksvg/impl/libs/xrgbrender/gdk-pixbuf-xlibrgb.h
@@ -0,0 +1,145 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "MPL"); you may not use this file except in
+ * compliance with the MPL. You may obtain a copy of the MPL at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the MPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
+ * for the specific language governing rights and limitations under the
+ * MPL.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * terms of the GNU Library General Public License (the "LGPL"), in
+ * which case the provisions of the LGPL are applicable instead of
+ * those above. If you wish to allow use of your version of this file
+ * only under the terms of the LGPL and not to allow others to use
+ * your version of this file under the MPL, indicate your decision by
+ * deleting the provisions above and replace them with the notice and
+ * other provisions required by the LGPL. If you do not delete the
+ * provisions above, a recipient may use your version of this file
+ * under either the MPL or the LGPL.
+ */
+
+/*
+ * This code is derived from GdkRgb.
+ * For more information on GdkRgb, see http://www.levien.com/gdkrgb/
+ * Raph Levien <raph@acm.org>
+ */
+
+/* Ported by Christopher Blizzard to Xlib. With permission from the
+ * original authors of this file, the contents of this file are also
+ * redistributable under the terms of the Mozilla Public license. For
+ * information about the Mozilla Public License, please see the
+ * license information at http://www.mozilla.org/MPL/
+ */
+
+/* This code is copyright the following authors:
+ * Raph Levien <raph@acm.org>
+ * Manish Singh <manish@gtk.org>
+ * Tim Janik <timj@gtk.org>
+ * Peter Mattis <petm@xcf.berkeley.edu>
+ * Spencer Kimball <spencer@xcf.berkeley.edu>
+ * Josh MacDonald <jmacd@xcf.berkeley.edu>
+ * Christopher Blizzard <blizzard@redhat.com>
+ * Owen Taylor <otaylor@redhat.com>
+ * Shawn T. Amundson <amundson@gtk.org>
+*/
+
+
+#ifndef __XLIB_RGB_H__
+#define __XLIB_RGB_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/Intrinsic.h>
+
+
+typedef struct _XlibRgbCmap XlibRgbCmap;
+
+struct _XlibRgbCmap {
+ unsigned int colors[256];
+ unsigned char lut[256]; /* for 8-bit modes */
+};
+
+void
+xlib_rgb_init_with_depth (Display *display, Screen *screen, int prefDepth);
+
+typedef enum
+{
+ XLIB_RGB_DITHER_NONE,
+ XLIB_RGB_DITHER_NORMAL,
+ XLIB_RGB_DITHER_MAX
+} XlibRgbDither;
+
+void
+xlib_draw_rgb_image (Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ int width,
+ int height,
+ XlibRgbDither dith,
+ unsigned char *rgb_buf,
+ int rowstride);
+
+void
+xlib_rgb_cmap_free (XlibRgbCmap *cmap);
+
+void
+xlib_draw_indexed_image (Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ int width,
+ int height,
+ XlibRgbDither dith,
+ unsigned char *buf,
+ int rowstride,
+ XlibRgbCmap *cmap);
+
+/* Below are some functions which are primarily useful for debugging
+ and experimentation. */
+Bool
+xlib_rgb_ditherable (void);
+
+void
+xlib_rgb_set_verbose (Bool verbose);
+
+/* experimental colormap stuff */
+void
+xlib_rgb_set_install (Bool install);
+
+void
+xlib_rgb_set_min_colors (int min_colors);
+
+Colormap
+xlib_rgb_get_cmap (void);
+
+Visual *
+xlib_rgb_get_visual (void);
+
+XVisualInfo *
+xlib_rgb_get_visual_info (void);
+
+int
+xlib_rgb_get_depth (void);
+
+Display *
+xlib_rgb_get_display (void);
+
+Screen *
+xlib_rgb_get_screen (void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __XLIB_RGB_H__ */
diff --git a/ksvg/impl/svgpathparser.cc b/ksvg/impl/svgpathparser.cc
new file mode 100644
index 00000000..0f7521e0
--- /dev/null
+++ b/ksvg/impl/svgpathparser.cc
@@ -0,0 +1,564 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002, 2003 The Karbon Developers
+
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "svgpathparser.h"
+#include <qstring.h>
+#include <math.h>
+
+// parses the number into parameter number
+const char *
+KSVG::getNumber( const char *ptr, double &number )
+{
+ int integer, exponent;
+ double decimal, frac;
+ int sign, expsign;
+
+ exponent = 0;
+ integer = 0;
+ frac = 1.0;
+ decimal = 0;
+ sign = 1;
+ expsign = 1;
+
+ // read the sign
+ if(*ptr == '+')
+ ptr++;
+ else if(*ptr == '-')
+ {
+ ptr++;
+ sign = -1;
+ }
+
+ // read the integer part
+ while(*ptr != '\0' && *ptr >= '0' && *ptr <= '9')
+ integer = (integer * 10) + *(ptr++) - '0';
+ if(*ptr == '.') // read the decimals
+ {
+ ptr++;
+ while(*ptr != '\0' && *ptr >= '0' && *ptr <= '9')
+ decimal += (*(ptr++) - '0') * (frac *= 0.1);
+ }
+
+ if(*ptr == 'e' || *ptr == 'E') // read the exponent part
+ {
+ ptr++;
+
+ // read the sign of the exponent
+ if(*ptr == '+')
+ ptr++;
+ else if(*ptr == '-')
+ {
+ ptr++;
+ expsign = -1;
+ }
+
+ exponent = 0;
+ while(*ptr != '\0' && *ptr >= '0' && *ptr <= '9')
+ {
+ exponent *= 10;
+ exponent += *ptr - '0';
+ ptr++;
+ }
+ }
+ number = integer + decimal;
+ number *= sign * pow( (double)10, double( expsign * exponent ) );
+
+ return ptr;
+}
+
+// parses the coord into parameter number and forwards to the next coord in the path data
+const char *
+SVGPathParser::getCoord( const char *ptr, double &number )
+{
+ ptr = KSVG::getNumber( ptr, number );
+ // skip the following space
+ if(*ptr == ' ')
+ ptr++;
+
+ return ptr;
+}
+
+void
+SVGPathParser::parseSVG( const QString &s, bool process )
+{
+ if(!s.isEmpty())
+ {
+ QString d = s;
+ d = d.replace(',', ' ');
+ d = d.simplifyWhiteSpace();
+ const char *ptr = d.latin1();
+ const char *end = d.latin1() + d.length() + 1;
+
+ double contrlx, contrly, curx, cury, subpathx, subpathy, tox, toy, x1, y1, x2, y2, xc, yc;
+ double px1, py1, px2, py2, px3, py3;
+ bool relative, closed = true;
+ char command = *(ptr++), lastCommand = ' ';
+
+ subpathx = subpathy = curx = cury = contrlx = contrly = 0.0;
+ while( ptr < end )
+ {
+ if( *ptr == ' ' )
+ ptr++;
+
+ relative = false;
+
+ //std::cout << "Command : " << command << std::endl;
+ switch( command )
+ {
+ case 'm':
+ relative = true;
+ case 'M':
+ {
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+
+ if( process )
+ {
+ subpathx = curx = relative ? curx + tox : tox;
+ subpathy = cury = relative ? cury + toy : toy;
+
+ svgMoveTo( curx, cury, closed );
+ }
+ else
+ svgMoveTo( tox, toy, closed, !relative );
+ closed = false;
+ break;
+ }
+ case 'l':
+ relative = true;
+ case 'L':
+ {
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+
+ if( process )
+ {
+ curx = relative ? curx + tox : tox;
+ cury = relative ? cury + toy : toy;
+
+ svgLineTo( curx, cury );
+ }
+ else
+ svgLineTo( tox, toy, !relative );
+ break;
+ }
+ case 'h':
+ {
+ ptr = getCoord( ptr, tox );
+ if( process )
+ {
+ curx = curx + tox;
+ svgLineTo( curx, cury );
+ }
+ else
+ svgLineToHorizontal( tox, false );
+ break;
+ }
+ case 'H':
+ {
+ ptr = getCoord( ptr, tox );
+ if( process )
+ {
+ curx = tox;
+ svgLineTo( curx, cury );
+ }
+ else
+ svgLineToHorizontal( tox );
+ break;
+ }
+ case 'v':
+ {
+ ptr = getCoord( ptr, toy );
+ if( process )
+ {
+ cury = cury + toy;
+ svgLineTo( curx, cury );
+ }
+ else
+ svgLineToVertical( toy, false );
+ break;
+ }
+ case 'V':
+ {
+ ptr = getCoord( ptr, toy );
+ if( process )
+ {
+ cury = toy;
+ svgLineTo( curx, cury );
+ }
+ else
+ svgLineToVertical( toy );
+ break;
+ }
+ case 'z':
+ case 'Z':
+ {
+ // reset curx, cury for next path
+ if( process )
+ {
+ curx = subpathx;
+ cury = subpathy;
+ }
+ closed = true;
+ svgClosePath();
+ break;
+ }
+ case 'c':
+ relative = true;
+ case 'C':
+ {
+ ptr = getCoord( ptr, x1 );
+ ptr = getCoord( ptr, y1 );
+ ptr = getCoord( ptr, x2 );
+ ptr = getCoord( ptr, y2 );
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+
+ if( process )
+ {
+ px1 = relative ? curx + x1 : x1;
+ py1 = relative ? cury + y1 : y1;
+ px2 = relative ? curx + x2 : x2;
+ py2 = relative ? cury + y2 : y2;
+ px3 = relative ? curx + tox : tox;
+ py3 = relative ? cury + toy : toy;
+
+ svgCurveToCubic( px1, py1, px2, py2, px3, py3 );
+
+ contrlx = relative ? curx + x2 : x2;
+ contrly = relative ? cury + y2 : y2;
+ curx = relative ? curx + tox : tox;
+ cury = relative ? cury + toy : toy;
+ }
+ else
+ svgCurveToCubic( x1, y1, x2, y2, tox, toy, !relative );
+
+ break;
+ }
+ case 's':
+ relative = true;
+ case 'S':
+ {
+ ptr = getCoord( ptr, x2 );
+ ptr = getCoord( ptr, y2 );
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+
+ if( process )
+ {
+ px1 = 2 * curx - contrlx;
+ py1 = 2 * cury - contrly;
+ px2 = relative ? curx + x2 : x2;
+ py2 = relative ? cury + y2 : y2;
+ px3 = relative ? curx + tox : tox;
+ py3 = relative ? cury + toy : toy;
+
+ svgCurveToCubic( px1, py1, px2, py2, px3, py3 );
+
+ contrlx = relative ? curx + x2 : x2;
+ contrly = relative ? cury + y2 : y2;
+ curx = relative ? curx + tox : tox;
+ cury = relative ? cury + toy : toy;
+ }
+ else
+ svgCurveToCubicSmooth( x2, y2, tox, toy, !relative );
+ break;
+ }
+ case 'q':
+ relative = true;
+ case 'Q':
+ {
+ ptr = getCoord( ptr, x1 );
+ ptr = getCoord( ptr, y1 );
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+
+ if( process )
+ {
+ px1 = relative ? (curx + 2 * (x1 + curx)) * (1.0 / 3.0) : (curx + 2 * x1) * (1.0 / 3.0);
+ py1 = relative ? (cury + 2 * (y1 + cury)) * (1.0 / 3.0) : (cury + 2 * y1) * (1.0 / 3.0);
+ px2 = relative ? ((curx + tox) + 2 * (x1 + curx)) * (1.0 / 3.0) : (tox + 2 * x1) * (1.0 / 3.0);
+ py2 = relative ? ((cury + toy) + 2 * (y1 + cury)) * (1.0 / 3.0) : (toy + 2 * y1) * (1.0 / 3.0);
+ px3 = relative ? curx + tox : tox;
+ py3 = relative ? cury + toy : toy;
+
+ svgCurveToCubic( px1, py1, px2, py2, px3, py3 );
+
+ contrlx = relative ? curx + x1 : (tox + 2 * x1) * (1.0 / 3.0);
+ contrly = relative ? cury + y1 : (toy + 2 * y1) * (1.0 / 3.0);
+ curx = relative ? curx + tox : tox;
+ cury = relative ? cury + toy : toy;
+ }
+ else
+ svgCurveToQuadratic( x1, y1, tox, toy, !relative );
+ break;
+ }
+ case 't':
+ relative = true;
+ case 'T':
+ {
+ ptr = getCoord(ptr, tox);
+ ptr = getCoord(ptr, toy);
+
+ if( process )
+ {
+ xc = 2 * curx - contrlx;
+ yc = 2 * cury - contrly;
+
+ px1 = (curx + 2 * xc) * (1.0 / 3.0);
+ py1 = (cury + 2 * yc) * (1.0 / 3.0);
+ px2 = relative ? ((curx + tox) + 2 * xc) * (1.0 / 3.0) : (tox + 2 * xc) * (1.0 / 3.0);
+ py2 = relative ? ((cury + toy) + 2 * yc) * (1.0 / 3.0) : (toy + 2 * yc) * (1.0 / 3.0);
+ px3 = relative ? curx + tox : tox;
+ py3 = relative ? cury + toy : toy;
+
+ svgCurveToCubic( px1, py1, px2, py2, px3, py3 );
+
+ contrlx = xc;
+ contrly = yc;
+ curx = relative ? curx + tox : tox;
+ cury = relative ? cury + toy : toy;
+ }
+ else
+ svgCurveToQuadraticSmooth( tox, toy, !relative );
+ break;
+ }
+ case 'a':
+ relative = true;
+ case 'A':
+ {
+ bool largeArc, sweep;
+ double angle, rx, ry;
+ ptr = getCoord( ptr, rx );
+ ptr = getCoord( ptr, ry );
+ ptr = getCoord( ptr, angle );
+ ptr = getCoord( ptr, tox );
+ largeArc = tox == 1;
+ ptr = getCoord( ptr, tox );
+ sweep = tox == 1;
+ ptr = getCoord( ptr, tox );
+ ptr = getCoord( ptr, toy );
+
+ // Spec: radii are nonnegative numbers
+ rx = fabs(rx);
+ ry = fabs(ry);
+
+ if( process )
+ calculateArc( relative, curx, cury, angle, tox, toy, rx, ry, largeArc, sweep );
+ else
+ svgArcTo( tox, toy, rx, ry, angle, largeArc, sweep, !relative );
+ }
+ }
+
+ lastCommand = command;
+
+ if(*ptr == '+' || *ptr == '-' || (*ptr >= '0' && *ptr <= '9'))
+ {
+ // there are still coords in this command
+ if(command == 'M')
+ command = 'L';
+ else if(command == 'm')
+ command = 'l';
+ }
+ else
+ command = *(ptr++);
+
+ if( lastCommand != 'C' && lastCommand != 'c' &&
+ lastCommand != 'S' && lastCommand != 's' &&
+ lastCommand != 'Q' && lastCommand != 'q' &&
+ lastCommand != 'T' && lastCommand != 't')
+ {
+ contrlx = curx;
+ contrly = cury;
+ }
+ }
+ }
+}
+
+// This works by converting the SVG arc to "simple" beziers.
+// For each bezier found a svgToCurve call is done.
+// Adapted from Niko's code in kdelibs/kdecore/svgicons.
+// Maybe this can serve in some shared lib? (Rob)
+void
+SVGPathParser::calculateArc(bool relative, double &curx, double &cury, double angle, double x, double y, double r1, double r2, bool largeArcFlag, bool sweepFlag)
+{
+ double sin_th, cos_th;
+ double a00, a01, a10, a11;
+ double x0, y0, x1, y1, xc, yc;
+ double d, sfactor, sfactor_sq;
+ double th0, th1, th_arc;
+ int i, n_segs;
+
+ sin_th = sin(angle * (M_PI / 180.0));
+ cos_th = cos(angle * (M_PI / 180.0));
+
+ double dx;
+
+ if(!relative)
+ dx = (curx - x) / 2.0;
+ else
+ dx = -x / 2.0;
+
+ double dy;
+
+ if(!relative)
+ dy = (cury - y) / 2.0;
+ else
+ dy = -y / 2.0;
+
+ double _x1 = cos_th * dx + sin_th * dy;
+ double _y1 = -sin_th * dx + cos_th * dy;
+ double Pr1 = r1 * r1;
+ double Pr2 = r2 * r2;
+ double Px = _x1 * _x1;
+ double Py = _y1 * _y1;
+
+ // Spec : check if radii are large enough
+ double check = Px / Pr1 + Py / Pr2;
+ if(check > 1)
+ {
+ r1 = r1 * sqrt(check);
+ r2 = r2 * sqrt(check);
+ }
+
+ a00 = cos_th / r1;
+ a01 = sin_th / r1;
+ a10 = -sin_th / r2;
+ a11 = cos_th / r2;
+
+ x0 = a00 * curx + a01 * cury;
+ y0 = a10 * curx + a11 * cury;
+
+ if(!relative)
+ x1 = a00 * x + a01 * y;
+ else
+ x1 = a00 * (curx + x) + a01 * (cury + y);
+
+ if(!relative)
+ y1 = a10 * x + a11 * y;
+ else
+ y1 = a10 * (curx + x) + a11 * (cury + y);
+
+ /* (x0, y0) is current point in transformed coordinate space.
+ (x1, y1) is new point in transformed coordinate space.
+
+ The arc fits a unit-radius circle in this space.
+ */
+
+ d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0);
+
+ sfactor_sq = 1.0 / d - 0.25;
+
+ if(sfactor_sq < 0)
+ sfactor_sq = 0;
+
+ sfactor = sqrt(sfactor_sq);
+
+ if(sweepFlag == largeArcFlag)
+ sfactor = -sfactor;
+
+ xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0);
+ yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0);
+
+ /* (xc, yc) is center of the circle. */
+ th0 = atan2(y0 - yc, x0 - xc);
+ th1 = atan2(y1 - yc, x1 - xc);
+
+ th_arc = th1 - th0;
+ if(th_arc < 0 && sweepFlag)
+ th_arc += 2 * M_PI;
+ else if(th_arc > 0 && !sweepFlag)
+ th_arc -= 2 * M_PI;
+
+ n_segs = (int) (int) ceil(fabs(th_arc / (M_PI * 0.5 + 0.001)));
+
+ for(i = 0; i < n_segs; i++)
+ {
+ {
+ double sin_th, cos_th;
+ double a00, a01, a10, a11;
+ double x1, y1, x2, y2, x3, y3;
+ double t;
+ double th_half;
+
+ double _th0 = th0 + i * th_arc / n_segs;
+ double _th1 = th0 + (i + 1) * th_arc / n_segs;
+
+ sin_th = sin(angle * (M_PI / 180.0));
+ cos_th = cos(angle * (M_PI / 180.0));
+
+ /* inverse transform compared with rsvg_path_arc */
+ a00 = cos_th * r1;
+ a01 = -sin_th * r2;
+ a10 = sin_th * r1;
+ a11 = cos_th * r2;
+
+ th_half = 0.5 * (_th1 - _th0);
+ t = (8.0 / 3.0) * sin(th_half * 0.5) * sin(th_half * 0.5) / sin(th_half);
+ x1 = xc + cos(_th0) - t * sin(_th0);
+ y1 = yc + sin(_th0) + t * cos(_th0);
+ x3 = xc + cos(_th1);
+ y3 = yc + sin(_th1);
+ x2 = x3 + t * sin(_th1);
+ y2 = y3 - t * cos(_th1);
+
+ svgCurveToCubic( a00 * x1 + a01 * y1, a10 * x1 + a11 * y1, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3 );
+ }
+ }
+
+ if(!relative)
+ curx = x;
+ else
+ curx += x;
+
+ if(!relative)
+ cury = y;
+ else
+ cury += y;
+}
+
+void
+SVGPathParser::svgLineToHorizontal( double, bool )
+{
+}
+
+void
+SVGPathParser::svgLineToVertical( double, bool )
+{
+}
+
+void
+SVGPathParser::svgCurveToCubicSmooth( double, double, double, double, bool )
+{
+}
+
+void
+SVGPathParser::svgCurveToQuadratic( double, double, double, double, bool )
+{
+}
+
+void
+SVGPathParser::svgCurveToQuadraticSmooth( double, double, bool )
+{
+}
+
+void
+SVGPathParser::svgArcTo( double, double, double, double, double, bool, bool, bool )
+{
+}
diff --git a/ksvg/impl/svgpathparser.h b/ksvg/impl/svgpathparser.h
new file mode 100644
index 00000000..3a9495d0
--- /dev/null
+++ b/ksvg/impl/svgpathparser.h
@@ -0,0 +1,63 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002, 2003 The Karbon Developers
+
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __SVGPATHPARSER_H__
+#define __SVGPATHPARSER_H__
+
+class QString;
+
+namespace KSVG
+{
+ const char *getNumber( const char *, double & );
+}
+
+/**
+ * Parser for svg path data, contained in the d attribute.
+ *
+ * The parser delivers encountered commands and parameters by calling
+ * methods that correspond to those commands. Clients have to derive
+ * from this class and implement the abstract command methods.
+ *
+ * There are two operating modes. By default the parser just delivers unaltered
+ * svg path data commands and parameters. In the second mode, it will convert all
+ * relative coordinates to absolute ones, and convert all curves to cubic beziers.
+ */
+class SVGPathParser
+{
+public:
+ void parseSVG( const QString &d, bool process = false );
+
+ static const char *getCoord( const char *, double & );
+
+protected:
+ virtual void svgMoveTo( double x1, double y1, bool closed, bool abs = true ) = 0;
+ virtual void svgLineTo( double x1, double y1, bool abs = true ) = 0;
+ virtual void svgLineToHorizontal( double x, bool abs = true );
+ virtual void svgLineToVertical( double y, bool abs = true );
+ virtual void svgCurveToCubic( double x1, double y1, double x2, double y2, double x, double y, bool abs = true ) = 0;
+ virtual void svgCurveToCubicSmooth( double x, double y, double x2, double y2, bool abs = true );
+ virtual void svgCurveToQuadratic( double x, double y, double x1, double y1, bool abs = true );
+ virtual void svgCurveToQuadraticSmooth( double x, double y, bool abs = true );
+ virtual void svgArcTo( double x, double y, double r1, double r2, double angle, bool largeArcFlag, bool sweepFlag, bool abs = true );
+ virtual void svgClosePath() = 0;
+private:
+ void calculateArc( bool relative, double &curx, double &cury, double angle, double x, double y, double r1, double r2, bool largeArcFlag, bool sweepFlag );
+};
+
+#endif