root/src/swft/SVGAttributeParser.cpp

/* [<][>][^][v][top][bottom][index][help] */
#include "SVGAttributeParser.h"

#define DPI 90.0

using namespace std;

namespace SWF {

void AttributeParser::parseNode(xmlNodePtr node) {
        for(xmlAttrPtr attr = node->properties; attr != NULL; attr = attr->next) {
                xmlChar *tmp = xmlGetProp(node, attr->name);
                if(tmp) {
                        attributes[(char *)attr->name] = (char *)tmp;
                        xmlFree(tmp);
                }
        }       

        xmlChar *tmp = xmlGetProp(node, (const xmlChar *)"style");
        if(tmp) {
                doParse((char *)tmp);
                xmlFree(tmp);
        }
}


double AttributeParser::getDouble(const char* attribute, double defaultValue, double value100) {
        const char *tmp = getString(attribute);
        if(tmp) {
                string tmpStr = tmp;

                char *tailPtr;
                double value = strtod(tmpStr.c_str(), &tailPtr);
                                
                string unit = tailPtr;
                trimString(unit);

                if(unit == "in") {
                        value *= DPI;
                } else if(unit == "cm") {
                        value *= DPI / 2.54;
                } else if(unit == "mm") {
                        value *= DPI / 25.4;
                } else if(unit == "pt") {
                        value *= DPI / 72.0;
                } else if(unit == "pc") {
                        value *= DPI / 72.0 * 12.0;
                } else if(unit == "%") {
                        value *= value100 / 100;
                }
        
                return value;
        } else {
                return defaultValue;
        }
}

const char *AttributeParser::getString(const char* attribute) {
        map<string, string>::iterator iter = attributes.find(attribute);
        if(iter != attributes.end()) {
                return (*iter).second.c_str();
        } else {
                return NULL;
        }
}

const char *AttributeParser::operator[](const char* attribute) {
        return getString(attribute);
}

map<string, string> &AttributeParser::getAttributes() {
        return attributes;
}

void AttributeParser::handleData(const string& attrib, const vector<string>& value) {
        attributes[attrib] = value[0];
}

}

/* [<][>][^][v][top][bottom][index][help] */