diff options
| author | Bob Jamison <ishmalius@gmail.com> | 2008-06-03 18:24:50 +0000 |
|---|---|---|
| committer | ishmal <ishmal@users.sourceforge.net> | 2008-06-03 18:24:50 +0000 |
| commit | 8b3586f72f8ed7df07b26a04852c4bbe66447b1a (patch) | |
| tree | ab73ebefad68811324388a8c0eac86889f9c657a /src/dom/svgreader.cpp | |
| parent | check if item is LPEItem before casting!!! fixes bug 236788 (diff) | |
| download | inkscape-8b3586f72f8ed7df07b26a04852c4bbe66447b1a.tar.gz inkscape-8b3586f72f8ed7df07b26a04852c4bbe66447b1a.zip | |
Move element creation to SVGDocumentImpl. Remove from svgreader.
(bzr r5794)
Diffstat (limited to 'src/dom/svgreader.cpp')
| -rw-r--r-- | src/dom/svgreader.cpp | 571 |
1 files changed, 11 insertions, 560 deletions
diff --git a/src/dom/svgreader.cpp b/src/dom/svgreader.cpp index 9db6affa2..ea4392f50 100644 --- a/src/dom/svgreader.cpp +++ b/src/dom/svgreader.cpp @@ -40,7 +40,6 @@ #include <stdarg.h> -#define SVG_NAMESPACE "http://www.w3.org/2000/svg" namespace org { @@ -92,477 +91,6 @@ void SVGReader::trace(char const *fmt, ...) -/*######################################################################### -## Types -#########################################################################*/ - -typedef enum -{ -/** - * Defines a hyperlink - */ -SVG_A_ELEMENT = 0, -/** - * Allows control over glyphs used to render particular character - * data (e.g. for music symbols or Asian text) - */ -SVG_ALTGLYPH_ELEMENT, -/** - * Defines a set of glyph substitutions (e.g. for music symbols or Asian text) - */ -SVG_ALTGLYPHDEF_ELEMENT, -/** - * Defines a candidate set of glyph substitutions (e.g. for music symbols - * or Asian text) - */ -SVG_ALTGLYPHITEM_ELEMENT, -/** - * Animates an attribute or property over time - */ -SVG_ANIMATE_ELEMENT, -/** - * Specifies a color transformation over time - */ -SVG_ANIMATECOLOR_ELEMENT, -/** - * Causes an element to move along a motion path - */ -SVG_ANIMATEMOTION_ELEMENT, -/** - * Animates a transformation attribute on an element - */ -SVG_ANIMATETRANSFORM_ELEMENT, -/** - * Defines a circle - */ -SVG_CIRCLE_ELEMENT, -/** - * - */ -SVG_CLIPPATH_ELEMENT, -/** - * Specifies a color profile description - */ -SVG_COLOR_PROFILE_ELEMENT, -/** - * Defines a platform-independent cursor - */ -SVG_CURSOR_ELEMENT, -/** - * Defines a separate font definition resource - */ -SVG_DEFINITION_SRC_ELEMENT, -/** - * A container for referenced elements - */ -SVG_DEFS_ELEMENT, -/** - * A text-only description for elements in SVG - not displayed as part - * of the graphics. User agents may display the text as a tooltip - */ -SVG_DESC_ELEMENT, -/** - * Defines an ellipse - */ -SVG_ELLIPSE_ELEMENT, -/** - * SVG filter. Composites two objects together using different blending modes - */ -SVG_FEBLEND_ELEMENT, -/** - * SVG filter. Applies a matrix transformation - */ -SVG_FECOLORMATRIX_ELEMENT, -/** - * SVG filter. Performs component-wise remapping of data - */ -SVG_FECOMPONENTTRANSFER_ELEMENT, -/** - * SVG filter. - */ -SVG_FECOMPOSITE_ELEMENT, -/** - * SVG filter. - */ -SVG_FECONVOLVEMATRIX_ELEMENT, -/** - * SVG filter. - */ -SVG_FEDIFFUSELIGHTING_ELEMENT, -/** - * SVG filter. - */ -SVG_FEDISPLACEMENTMAP_ELEMENT, -/** - * SVG filter. Defines a light source - */ -SVG_FEDISTANTLIGHT_ELEMENT, -/** - * SVG filter. - */ -SVG_FEFLOOD_ELEMENT, -/** - * SVG filter. Sub-element to feComponentTransfer - */ -SVG_FEFUNCA_ELEMENT, -/** - * SVG filter. Sub-element to feComponentTransfer - */ -SVG_FEFUNCB_ELEMENT, -/** - * SVG filter. Sub-element to feComponentTransfer - */ -SVG_FEFUNCG_ELEMENT, -/** - * SVG filter. Sub-element to feComponentTransfer - */ -SVG_FEFUNCR_ELEMENT, -/** - * SVG filter. Performs a Gaussian blur on the image - */ -SVG_FEGAUSSIANBLUR_ELEMENT, -/** - * SVG filter. - */ -SVG_FEIMAGE_ELEMENT, -/** - * SVG filter. Creates image layers on top of each other - */ -SVG_FEMERGE_ELEMENT, -/** - * SVG filter. Sub-element to feMerge - */ -SVG_FEMERGENODE_ELEMENT, -/** - * SVG filter. Performs a "fattening" or "thinning" on a source graphic - */ -SVG_FEMORPHOLOGY_ELEMENT, -/** - * SVG filter. Moves an image relative to its current position - */ -SVG_FEOFFSET_ELEMENT, -/** - * SVG filter. - */ -SVG_FEPOINTLIGHT_ELEMENT, -/** - * SVG filter. - */ -SVG_FESPECULARLIGHTING_ELEMENT, -/** - * SVG filter. - */ -SVG_FESPOTLIGHT_ELEMENT, -/** - * SVG filter. - */ -SVG_FETILE_ELEMENT, -/** - * SVG filter. - */ -SVG_FETURBULENCE_ELEMENT, -/** - * Container for filter effects - */ -SVG_FILTER_ELEMENT, -/** - * Defines a font - */ -SVG_FONT_ELEMENT, -/** - * Describes the characteristics of a font - */ -SVG_FONT_FACE_ELEMENT, -/** - * - */ -SVG_FONT_FACE_FORMAT_ELEMENT, -/** - * - */ -SVG_FONT_FACE_NAME_ELEMENT, -/** - * - */ -SVG_FONT_FACE_SRC_ELEMENT, -/** - * - */ -SVG_FONT_FACE_URI_ELEMENT, -/** - * - */ -SVG_FOREIGNOBJECT_ELEMENT, -/** - * A container element for grouping together related elements - */ -SVG_G_ELEMENT, -/** - * Defines the graphics for a given glyph - */ -SVG_GLYPH_ELEMENT, -/** - * Defines a possible glyph to use - */ -SVG_GLYPHREF_ELEMENT, -/** - * - */ -SVG_HKERN_ELEMENT, -/** - * - */ -SVG_IMAGE_ELEMENT, -/** - * Defines a line - */ -SVG_LINE_ELEMENT, -/** - * Defines a linear gradient - */ -SVG_LINEARGRADIENT_ELEMENT, -/** - * - */ -SVG_MARKER_ELEMENT, -/** - * - */ -SVG_MASK_ELEMENT, -/** - * Specifies metadata - */ -SVG_METADATA_ELEMENT, -/** - * - */ -SVG_MISSING_GLYPH_ELEMENT, -/** - * - */ -SVG_MPATH_ELEMENT, -/** - * Defines a path - */ -SVG_PATH_ELEMENT, -/** - * - */ -SVG_PATTERN_ELEMENT, -/** - * Defines a closed shape that consists of a set of connected straight lines - */ -SVG_POLYGON_ELEMENT, -/** - * Defines a set of connected straight lines - */ -SVG_POLYLINE_ELEMENT, -/** - * Defines a radial gradient - */ -SVG_RADIALGRADIENT_ELEMENT, -/** - * Defines a rectangle - */ -SVG_RECT_ELEMENT, -/** - * Container for scripts (e.g., ECMAScript) - */ -SVG_SCRIPT_ELEMENT, -/** - * Sets the value of an attribute for a specified duration - */ -SVG_SET_ELEMENT, -/** - * - */ -SVG_STOP_ELEMENT, -/** - * Allows style sheets to be embedded directly within SVG content - */ -SVG_STYLE_ELEMENT, -/** - * Defines an SVG document fragment - */ -SVG_SVG_ELEMENT, -/** - * - */ -SVG_SWITCH_ELEMENT, -/** - * - */ -SVG_SYMBOL_ELEMENT, -/** - * - */ -SVG_TEXT_ELEMENT, -/** - * - */ -SVG_TEXTPATH_ELEMENT, -/** - * A text-only description for elements in SVG - not displayed as part of - * the graphics. User agents may display the text as a tooltip - */ -SVG_TITLE_ELEMENT, -/** - * - */ -SVG_TREF_ELEMENT, -/** - * - */ -SVG_TSPAN_ELEMENT, -/** - * - */ -SVG_USE_ELEMENT, -/** - * - */ -SVG_VIEW_ELEMENT, -/** - * - */ -SVG_VKERN_ELEMENT, -/** - * - */ -SVG_MAX_ELEMENT - -} SVGElementType; - - - -/** - * Used for mapping name->enum and enum->name. For SVG element types. - */ -typedef struct -{ - const char *name; - int type; -} SVGElementTableEntry; - - - -SVGElementTableEntry svgElementTable[] = -{ - { "a", SVG_A_ELEMENT }, - { "altGlyph", SVG_ALTGLYPH_ELEMENT }, - { "altGlyphDef", SVG_ALTGLYPHDEF_ELEMENT }, - { "altGlyphItem", SVG_ALTGLYPHITEM_ELEMENT }, - { "animate", SVG_ANIMATE_ELEMENT }, - { "animateColor", SVG_ANIMATECOLOR_ELEMENT }, - { "animateMotion", SVG_ANIMATEMOTION_ELEMENT }, - { "animateTransform", SVG_ANIMATETRANSFORM_ELEMENT }, - { "circle", SVG_CIRCLE_ELEMENT }, - { "clipPath", SVG_CLIPPATH_ELEMENT }, - { "color-profile", SVG_COLOR_PROFILE_ELEMENT }, - { "cursor", SVG_CURSOR_ELEMENT }, - { "definition-src", SVG_DEFINITION_SRC_ELEMENT }, - { "defs", SVG_DEFS_ELEMENT }, - { "desc", SVG_DESC_ELEMENT }, - { "ellipse", SVG_ELLIPSE_ELEMENT }, - { "feBlend", SVG_FEBLEND_ELEMENT }, - { "feColorMatrix", SVG_FECOLORMATRIX_ELEMENT }, - { "feComponentTransfer", SVG_FECOMPONENTTRANSFER_ELEMENT }, - { "feComposite", SVG_FECOMPOSITE_ELEMENT }, - { "feConvolveMatrix", SVG_FECONVOLVEMATRIX_ELEMENT }, - { "feDiffuseLighting", SVG_FEDIFFUSELIGHTING_ELEMENT }, - { "feDisplacementMap", SVG_FEDISPLACEMENTMAP_ELEMENT }, - { "feDistantLight", SVG_FEDISTANTLIGHT_ELEMENT }, - { "feFlood", SVG_FEFLOOD_ELEMENT }, - { "feFuncA", SVG_FEFUNCA_ELEMENT }, - { "feFuncB", SVG_FEFUNCB_ELEMENT }, - { "feFuncG", SVG_FEFUNCG_ELEMENT }, - { "feFuncR", SVG_FEFUNCR_ELEMENT }, - { "feGaussianBlur", SVG_FEGAUSSIANBLUR_ELEMENT }, - { "feImage", SVG_FEIMAGE_ELEMENT }, - { "feMerge", SVG_FEMERGE_ELEMENT }, - { "feMergeNode", SVG_FEMERGENODE_ELEMENT }, - { "feMorphology", SVG_FEMORPHOLOGY_ELEMENT }, - { "feOffset", SVG_FEOFFSET_ELEMENT }, - { "fePointLight", SVG_FEPOINTLIGHT_ELEMENT }, - { "feSpecularLighting", SVG_FESPECULARLIGHTING_ELEMENT }, - { "feSpotLight", SVG_FESPOTLIGHT_ELEMENT }, - { "feTile", SVG_FETILE_ELEMENT }, - { "feTurbulence", SVG_FETURBULENCE_ELEMENT }, - { "filter", SVG_FILTER_ELEMENT }, - { "font", SVG_FONT_ELEMENT }, - { "font-face", SVG_FONT_FACE_ELEMENT }, - { "font-face-format", SVG_FONT_FACE_FORMAT_ELEMENT }, - { "font-face-name", SVG_FONT_FACE_NAME_ELEMENT }, - { "font-face-src", SVG_FONT_FACE_SRC_ELEMENT }, - { "font-face-uri", SVG_FONT_FACE_URI_ELEMENT }, - { "foreignObject", SVG_FOREIGNOBJECT_ELEMENT }, - { "g", SVG_G_ELEMENT }, - { "glyph", SVG_GLYPH_ELEMENT }, - { "glyphRef", SVG_GLYPHREF_ELEMENT }, - { "hkern", SVG_HKERN_ELEMENT }, - { "image", SVG_IMAGE_ELEMENT }, - { "line", SVG_LINE_ELEMENT }, - { "linearGradient", SVG_LINEARGRADIENT_ELEMENT }, - { "marker", SVG_MARKER_ELEMENT }, - { "mask", SVG_MASK_ELEMENT }, - { "metadata", SVG_METADATA_ELEMENT }, - { "missing-glyph", SVG_MISSING_GLYPH_ELEMENT }, - { "mpath", SVG_MPATH_ELEMENT }, - { "path", SVG_PATH_ELEMENT }, - { "pattern", SVG_PATTERN_ELEMENT }, - { "polygon", SVG_POLYGON_ELEMENT }, - { "polyline", SVG_POLYLINE_ELEMENT }, - { "radialGradient", SVG_RADIALGRADIENT_ELEMENT }, - { "rect", SVG_RECT_ELEMENT }, - { "script", SVG_SCRIPT_ELEMENT }, - { "set", SVG_SET_ELEMENT }, - { "stop", SVG_STOP_ELEMENT }, - { "style", SVG_STYLE_ELEMENT }, - { "svg", SVG_SVG_ELEMENT }, - { "switch", SVG_SWITCH_ELEMENT }, - { "symbol", SVG_SYMBOL_ELEMENT }, - { "text", SVG_TEXT_ELEMENT }, - { "textPath", SVG_TEXTPATH_ELEMENT }, - { "title", SVG_TITLE_ELEMENT }, - { "tref", SVG_TREF_ELEMENT }, - { "tspan", SVG_TSPAN_ELEMENT }, - { "use", SVG_USE_ELEMENT }, - { "view", SVG_VIEW_ELEMENT }, - { "vkern", SVG_VKERN_ELEMENT }, - { NULL, -1 } - }; - - -/** - * Look up the SVG Element type enum for a given string - * Return -1 if not found - */ -int svgElementStrToEnum(const char *str) -{ - if (!str) - return -1; - for (SVGElementTableEntry *entry = svgElementTable ; - entry->name; entry++) - { - if (strcmp(str, entry->name) == 0) - return entry->type; - } - return -1; -} - - -/** - * Return the string corresponding to a given SVG element type enum - * Return "unknown" if not found - */ -const char *svgElementStrToEnum(int type) -{ - if (type < 0 || type >= SVG_MAX_ELEMENT) - return "unknown"; - return svgElementTable[type].name; -} - - /** * Get the character at the position and record the fact */ @@ -1104,96 +632,19 @@ bool SVGReader::parseElement(SVGElementImplPtr parent, //printf("namespaceURI:%s\n", namespaceURI.c_str()); DOMString tagName = sourceElem->getTagName(); printf("tag name:%s\n", tagName.c_str()); - - ElementImplPtr newElement = NULL; - if (namespaceURI != SVG_NAMESPACE) + ElementPtr newElement = doc->createElementNS(namespaceURI, tagName); + if (!newElement) { - newElement = new SVGSVGElementImpl(); - newElement->assign(*sourceElem); - parent->appendChild(newElement); - } - else //## SVG!! - { - - //#################################################### - //## ATTRIBUTES - //#################################################### - DOMString style = sourceElem->getAttribute("style"); - if (style.size() > 0) - { - css::CssReader parser; - style.insert(0, "{"); - style.append("}"); - //printf("CSS:%s\n", style.c_str()); - if (!parser.parse(style)) - { - error("parsing style attribute"); - } - else - { - //printf("##parsed!\n"); - } - } - - DOMString transform = sourceElem->getAttribute("transform"); - if (transform.size() > 0) - { - if (!parseTransform(transform)) - { - error("parsing transform attribute"); - } - else - { - //printf("##parsed!\n"); - } - } + return false; + } + NamedNodeMap &attrs = sourceElem->getAttributes(); + for (unsigned int i=0 ; i<attrs.getLength() ; i++) + { + NodePtr n = attrs.item(i); + newElement->setAttribute(n->getNodeName(), n->getNodeValue());//should be exception here + } + parent->appendChild(newElement); - //#################################################### - //## ELEMENT - SPECIFIC - //#################################################### - if (tagName == "svg") - { - newElement = new SVGSVGElementImpl(); - newElement->assign(*sourceElem); - parent->appendChild(newElement); - } - else if (tagName == "title") - { - newElement = new SVGTitleElementImpl(); - newElement->assign(*sourceElem); - parent->appendChild(newElement); - } - else if (tagName == "desc") - { - newElement = new SVGDescElementImpl(); - newElement->assign(*sourceElem); - parent->appendChild(newElement); - } - else if (tagName == "defs") - { - newElement = new SVGDefsElementImpl(); - newElement->assign(*sourceElem); - parent->appendChild(newElement); - } - else if (tagName == "style") - { - newElement = new SVGStyleElementImpl(); - newElement->assign(*sourceElem); - parent->appendChild(newElement); - } - else if (tagName == "g") - { - newElement = new SVGGElementImpl(); - newElement->assign(*sourceElem); - parent->appendChild(newElement); - } - else if (tagName == "path") - { - newElement = new SVGPathElementImpl(); - newElement->assign(*sourceElem); - parent->appendChild(newElement); - } - } NodeList children = sourceElem->getChildNodes(); int nodeCount = children.getLength(); |
