]> gitweb.michael.orlitzky.com - libsvgtiny.git/commitdiff
Begin conversion to libdom
authorDaniel Silverstone <dsilvers@digital-scurf.org>
Sat, 3 Nov 2012 12:05:13 +0000 (12:05 +0000)
committerDaniel Silverstone <dsilvers@digital-scurf.org>
Sat, 3 Nov 2012 12:05:13 +0000 (12:05 +0000)
Makefile
include/svgtiny.h
src/svgtiny.c
src/svgtiny_internal.h

index fe4cfe7b71f31aa46f934d6cc9fa6dda38e6a384..cb393a7b7a8f6eb39c751e69bd204e1f17230a39 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -31,18 +31,15 @@ else
   CFLAGS := $(CFLAGS) -Dinline="__inline__"
 endif
 
-# LibXML2
+# libdom
 ifneq ($(PKGCONFIG),)
   CFLAGS := $(CFLAGS) \
-               $(shell $(PKGCONFIG) $(PKGCONFIGFLAGS) --cflags libxml-2.0)
+               $(shell $(PKGCONFIG) $(PKGCONFIGFLAGS) --cflags libdom)
   LDFLAGS := $(LDFLAGS) \
-               $(shell $(PKGCONFIG) $(PKGCONFIGFLAGS) --libs libxml-2.0)
+               $(shell $(PKGCONFIG) $(PKGCONFIGFLAGS) --libs libdom)
 else
-  ifeq ($(TARGET),beos)
-    CFLAGS := $(CFLAGS) -I/boot/home/config/include/libxml2
-  endif
-  CFLAGS := $(CFLAGS) -I$(PREFIX)/include/libxml2
-  LDFLAGS := $(CFLAGS) -lxml2
+  CFLAGS := $(CFLAGS) -I$(PREFIX)/include
+  LDFLAGS := $(CFLAGS) -ldom
 endif
 
 include $(NSBUILD)/Makefile.top
index 9d685e9b8cbc2fb67ea232e4b5f32a7d8a7712a6..85f146f5e6aa9869e4c6094f9688c396a15c4502 100644 (file)
@@ -8,8 +8,6 @@
 #ifndef SVGTINY_H
 #define SVGTINY_H
 
-#include <libxml/parser.h>
-
 typedef int svgtiny_colour;
 #define svgtiny_TRANSPARENT 0x1000000
 #ifdef __riscos__
@@ -47,7 +45,7 @@ struct svgtiny_diagram {
 typedef enum {
        svgtiny_OK,
        svgtiny_OUT_OF_MEMORY,
-       svgtiny_LIBXML_ERROR,
+       svgtiny_LIBDOM_ERROR,
        svgtiny_NOT_SVG,
        svgtiny_SVG_ERROR
 } svgtiny_code;
index 8fa09a5bdd6e66ed2cdbdcb01d690af3f277e0f3..ac13d7a5e2ee552fcd63adb580b4ddd26d7a00b1 100644 (file)
@@ -3,6 +3,7 @@
  * Licensed under the MIT License,
  *                http://opensource.org/licenses/mit-license.php
  * Copyright 2008-2009 James Bursa <james@semichrome.net>
+ * Copyright 2012 Daniel Silverstone <dsilvers@netsurf-browser.org>
  */
 
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <libxml/parser.h>
-#include <libxml/debugXML.h>
+
+#include <dom/dom.h>
+#include <dom/bindings/xml/xmlparser.h>
+
 #include "svgtiny.h"
 #include "svgtiny_internal.h"
 
 
 #define KAPPA          0.5522847498
 
-static svgtiny_code svgtiny_parse_svg(xmlNode *svg,
+static svgtiny_code svgtiny_parse_svg(dom_node *svg,
                struct svgtiny_parse_state state);
-static svgtiny_code svgtiny_parse_path(xmlNode *path,
+static svgtiny_code svgtiny_parse_path(dom_node *path,
                struct svgtiny_parse_state state);
-static svgtiny_code svgtiny_parse_rect(xmlNode *rect,
+static svgtiny_code svgtiny_parse_rect(dom_node *rect,
                struct svgtiny_parse_state state);
-static svgtiny_code svgtiny_parse_circle(xmlNode *circle,
+static svgtiny_code svgtiny_parse_circle(dom_node *circle,
                struct svgtiny_parse_state state);
-static svgtiny_code svgtiny_parse_ellipse(xmlNode *ellipse,
+static svgtiny_code svgtiny_parse_ellipse(dom_node *ellipse,
                struct svgtiny_parse_state state);
-static svgtiny_code svgtiny_parse_line(xmlNode *line,
+static svgtiny_code svgtiny_parse_line(dom_node *line,
                struct svgtiny_parse_state state);
-static svgtiny_code svgtiny_parse_poly(xmlNode *poly,
+static svgtiny_code svgtiny_parse_poly(dom_node *poly,
                struct svgtiny_parse_state state, bool polygon);
-static svgtiny_code svgtiny_parse_text(xmlNode *text,
+static svgtiny_code svgtiny_parse_text(dom_node *text,
                struct svgtiny_parse_state state);
-static void svgtiny_parse_position_attributes(const xmlNode *node,
+static void svgtiny_parse_position_attributes(const dom_node *node,
                const struct svgtiny_parse_state state,
                float *x, float *y, float *width, float *height);
-static void svgtiny_parse_paint_attributes(const xmlNode *node,
+static void svgtiny_parse_paint_attributes(const dom_node *node,
                struct svgtiny_parse_state *state);
-static void svgtiny_parse_font_attributes(const xmlNode *node,
+static void svgtiny_parse_font_attributes(const dom_node *node,
                struct svgtiny_parse_state *state);
-static void svgtiny_parse_transform_attributes(xmlNode *node,
+static void svgtiny_parse_transform_attributes(dom_node *node,
                struct svgtiny_parse_state *state);
 static svgtiny_code svgtiny_add_path(float *p, unsigned int n,
                struct svgtiny_parse_state *state);
@@ -72,6 +75,12 @@ struct svgtiny_diagram *svgtiny_create(void)
        return diagram;
 }
 
+static void ignore_msg(uint32_t severity, void *ctx, const char *msg, ...)
+{
+       UNUSED(severity);
+       UNUSED(ctx);
+       UNUSED(msg);
+}
 
 /**
  * Parse a block of memory into a svgtiny_diagram.
@@ -81,8 +90,13 @@ svgtiny_code svgtiny_parse(struct svgtiny_diagram *diagram,
                const char *buffer, size_t size, const char *url,
                int viewport_width, int viewport_height)
 {
-       xmlDoc *document;
-       xmlNode *svg;
+       dom_document *document;
+       dom_exception exc;
+       dom_xml_parser *parser;
+       dom_xml_error err;
+       dom_node *svg;
+       dom_string *svg_name;
+       lwc_string *svg_name_lwc;
        struct svgtiny_parse_state state;
        float x, y, width, height;
        svgtiny_code code;
@@ -91,20 +105,62 @@ svgtiny_code svgtiny_parse(struct svgtiny_diagram *diagram,
        assert(buffer);
        assert(url);
 
-       /* parse XML to tree */
-       document = xmlReadMemory(buffer, size, url, 0,
-                       XML_PARSE_NONET | XML_PARSE_COMPACT);
-       if (!document)
-               return svgtiny_LIBXML_ERROR;
+       UNUSED(url);
+
+       parser = dom_xml_parser_create(NULL, NULL,
+                                      ignore_msg, NULL, &document);
+
+       if (parser == NULL)
+               return svgtiny_LIBDOM_ERROR;
+
+       err = dom_xml_parser_parse_chunk(parser, (uint8_t *)buffer, size);
+       if (err != DOM_XML_OK) {
+               dom_node_unref(document);
+               dom_xml_parser_destroy(parser);
+               return svgtiny_LIBDOM_ERROR;
+       }
+
+       err = dom_xml_parser_completed(parser);
+       if (err != DOM_XML_OK) {
+               dom_node_unref(document);
+               dom_xml_parser_destroy(parser);
+               return svgtiny_LIBDOM_ERROR;
+       }
 
-       /*xmlDebugDumpDocument(stderr, document);*/
+       /* We're done parsing, drop the parser.
+        * We now own the document entirely.
+        */
+       dom_xml_parser_destroy(parser);
 
        /* find root <svg> element */
-       svg = xmlDocGetRootElement(document);
-       if (!svg)
-               return svgtiny_NOT_SVG;
-       if (strcmp((const char *) svg->name, "svg") != 0)
+       exc = dom_document_get_document_element(document, &svg);
+       if (exc != DOM_NO_ERR) {
+               dom_node_unref(document);
+               return svgtiny_LIBDOM_ERROR;
+       }
+       exc = dom_node_get_node_name(svg, &svg_name);
+       if (exc != DOM_NO_ERR) {
+               dom_node_unref(svg);
+               dom_node_unref(document);
+               return svgtiny_LIBDOM_ERROR;
+       }
+       if (lwc_intern_string("svg", 3 /* SLEN("svg") */,
+                             &svg_name_lwc) != lwc_error_ok) {
+               dom_string_unref(svg_name);
+               dom_node_unref(svg);
+               dom_node_unref(document);
+               return svgtiny_LIBDOM_ERROR;
+       }
+       if (!dom_string_caseless_lwc_isequal(svg_name, svg_name_lwc)) {
+               lwc_string_unref(svg_name_lwc);
+               dom_string_unref(svg_name);
+               dom_node_unref(svg);
+               dom_node_unref(document);
                return svgtiny_NOT_SVG;
+       }
+
+       lwc_string_unref(svg_name_lwc);
+       dom_string_unref(svg_name);
 
        /* get graphic dimensions */
        state.diagram = diagram;
@@ -134,8 +190,8 @@ svgtiny_code svgtiny_parse(struct svgtiny_diagram *diagram,
        /* parse tree */
        code = svgtiny_parse_svg(svg, state);
 
-       /* free XML tree */
-       xmlFreeDoc(document);
+       dom_node_unref(svg);
+       dom_node_unref(document);
 
        return code;
 }
@@ -145,12 +201,12 @@ svgtiny_code svgtiny_parse(struct svgtiny_diagram *diagram,
  * Parse a <svg> or <g> element node.
  */
 
-svgtiny_code svgtiny_parse_svg(xmlNode *svg,
+svgtiny_code svgtiny_parse_svg(dom_node *svg,
                struct svgtiny_parse_state state)
 {
        float x, y, width, height;
        xmlAttr *view_box;
-       xmlNode *child;
+       dom_node *child;
 
        svgtiny_parse_position_attributes(svg, state, &x, &y, &width, &height);
        svgtiny_parse_paint_attributes(svg, &state);
@@ -218,7 +274,7 @@ svgtiny_code svgtiny_parse_svg(xmlNode *svg,
  * http://www.w3.org/TR/SVG11/paths#PathElement
  */
 
-svgtiny_code svgtiny_parse_path(xmlNode *path,
+svgtiny_code svgtiny_parse_path(dom_node *path,
                struct svgtiny_parse_state state)
 {
        char *s, *path_d;
@@ -450,7 +506,7 @@ svgtiny_code svgtiny_parse_path(xmlNode *path,
  * http://www.w3.org/TR/SVG11/shapes#RectElement
  */
 
-svgtiny_code svgtiny_parse_rect(xmlNode *rect,
+svgtiny_code svgtiny_parse_rect(dom_node *rect,
                struct svgtiny_parse_state state)
 {
        float x, y, width, height;
@@ -487,7 +543,7 @@ svgtiny_code svgtiny_parse_rect(xmlNode *rect,
  * Parse a <circle> element node.
  */
 
-svgtiny_code svgtiny_parse_circle(xmlNode *circle,
+svgtiny_code svgtiny_parse_circle(dom_node *circle,
                struct svgtiny_parse_state state)
 {
        float x = 0, y = 0, r = -1;
@@ -563,7 +619,7 @@ svgtiny_code svgtiny_parse_circle(xmlNode *circle,
  * Parse an <ellipse> element node.
  */
 
-svgtiny_code svgtiny_parse_ellipse(xmlNode *ellipse,
+svgtiny_code svgtiny_parse_ellipse(dom_node *ellipse,
                struct svgtiny_parse_state state)
 {
        float x = 0, y = 0, rx = -1, ry = -1;
@@ -643,7 +699,7 @@ svgtiny_code svgtiny_parse_ellipse(xmlNode *ellipse,
  * Parse a <line> element node.
  */
 
-svgtiny_code svgtiny_parse_line(xmlNode *line,
+svgtiny_code svgtiny_parse_line(dom_node *line,
                struct svgtiny_parse_state state)
 {
        float x1 = 0, y1 = 0, x2 = 0, y2 = 0;
@@ -692,7 +748,7 @@ svgtiny_code svgtiny_parse_line(xmlNode *line,
  * http://www.w3.org/TR/SVG11/shapes#PolygonElement
  */
 
-svgtiny_code svgtiny_parse_poly(xmlNode *poly,
+svgtiny_code svgtiny_parse_poly(dom_node *poly,
                struct svgtiny_parse_state state, bool polygon)
 {
        char *s, *points;
@@ -752,12 +808,12 @@ svgtiny_code svgtiny_parse_poly(xmlNode *poly,
  * Parse a <text> or <tspan> element node.
  */
 
-svgtiny_code svgtiny_parse_text(xmlNode *text,
+svgtiny_code svgtiny_parse_text(dom_node *text,
                struct svgtiny_parse_state state)
 {
        float x, y, width, height;
        float px, py;
-       xmlNode *child;
+       dom_node *child;
 
        svgtiny_parse_position_attributes(text, state,
                        &x, &y, &width, &height);
@@ -802,7 +858,7 @@ svgtiny_code svgtiny_parse_text(xmlNode *text,
  * Parse x, y, width, and height attributes, if present.
  */
 
-void svgtiny_parse_position_attributes(const xmlNode *node,
+void svgtiny_parse_position_attributes(const dom_node *node,
                const struct svgtiny_parse_state state,
                float *x, float *y, float *width, float *height)
 {
@@ -876,7 +932,7 @@ float svgtiny_parse_length(const char *s, int viewport_size,
  * Parse paint attributes, if present.
  */
 
-void svgtiny_parse_paint_attributes(const xmlNode *node,
+void svgtiny_parse_paint_attributes(const dom_node *node,
                struct svgtiny_parse_state *state)
 {
        const xmlAttr *attr;
@@ -994,7 +1050,7 @@ void svgtiny_parse_color(const char *s, svgtiny_colour *c,
  * Parse font attributes, if present.
  */
 
-void svgtiny_parse_font_attributes(const xmlNode *node,
+void svgtiny_parse_font_attributes(const dom_node *node,
                struct svgtiny_parse_state *state)
 {
        const xmlAttr *attr;
@@ -1021,7 +1077,7 @@ void svgtiny_parse_font_attributes(const xmlNode *node,
  * http://www.w3.org/TR/SVG11/coords#TransformAttribute
  */
 
-void svgtiny_parse_transform_attributes(xmlNode *node,
+void svgtiny_parse_transform_attributes(dom_node *node,
                struct svgtiny_parse_state *state)
 {
        char *transform;
index eb90c5b7dae00e0a4d77576c07018f99e927e87c..789651ac9c43426c11a4f800d495877e8d7d2177 100644 (file)
@@ -10,6 +10,8 @@
 
 #include <stdbool.h>
 
+#include <dom/dom.h>
+
 #ifndef UNUSED
 #define UNUSED(x) ((void) (x))
 #endif
@@ -24,7 +26,7 @@ struct svgtiny_gradient_stop {
 
 struct svgtiny_parse_state {
        struct svgtiny_diagram *diagram;
-       xmlDoc *document;
+       dom_document *document;
 
        float viewport_width;
        float viewport_height;
@@ -75,7 +77,7 @@ char *svgtiny_strndup(const char *s, size_t n);
 void svgtiny_find_gradient(const char *id, struct svgtiny_parse_state *state);
 svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
                struct svgtiny_parse_state *state);
-xmlNode *svgtiny_find_element_by_id(xmlNode *node, const char *id);
+dom_node *svgtiny_find_element_by_id(dom_node *node, const char *id);
 
 /* svgtiny_list.c */
 struct svgtiny_list *svgtiny_list_create(size_t item_size);