From 65af1490bbabe62b0dbe22a84c1ef3d67a626d59 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 23 Apr 2020 22:11:48 +0100 Subject: Add HTMLCanvasElement --- include/dom/html/html_canvas_element.h | 31 ++++++ src/html/Makefile | 76 +++++++++---- src/html/html_canvas_element.c | 190 +++++++++++++++++++++++++++++++++ src/html/html_canvas_element.h | 62 +++++++++++ src/html/html_document.c | 6 +- 5 files changed, 345 insertions(+), 20 deletions(-) create mode 100644 include/dom/html/html_canvas_element.h create mode 100644 src/html/html_canvas_element.c create mode 100644 src/html/html_canvas_element.h diff --git a/include/dom/html/html_canvas_element.h b/include/dom/html/html_canvas_element.h new file mode 100644 index 0000000..3da9127 --- /dev/null +++ b/include/dom/html/html_canvas_element.h @@ -0,0 +1,31 @@ +/* + * This file is part of libdom. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2020 Vincent Sanders + */ + +#ifndef dom_html_canvas_element_h_ +#define dom_html_canvas_element_h_ + +#include +#include + +#include + +typedef struct dom_html_canvas_element dom_html_canvas_element; + +dom_exception dom_html_canvas_element_get_width( + dom_html_canvas_element *object, int32_t *width); + +dom_exception dom_html_canvas_element_set_width( + dom_html_canvas_element *object, uint32_t width); + +dom_exception dom_html_canvas_element_get_height( + dom_html_canvas_element *object, int32_t *height); + +dom_exception dom_html_canvas_element_set_height( + dom_html_canvas_element *object, uint32_t height); + + +#endif diff --git a/src/html/Makefile b/src/html/Makefile index c98ce9a..db765ad 100644 --- a/src/html/Makefile +++ b/src/html/Makefile @@ -1,24 +1,62 @@ # Sources DIR_SOURCES := \ - html_document.c html_collection.c html_options_collection.c \ - html_element.c html_html_element.c html_head_element.c \ - html_link_element.c html_title_element.c html_meta_element.c \ - html_base_element.c html_style_element.c \ - html_body_element.c html_form_element.c html_select_element.c \ - html_button_element.c html_input_element.c html_text_area_element.c \ - html_opt_group_element.c html_option_element.c html_hr_element.c \ - html_dlist_element.c html_directory_element.c html_menu_element.c \ - html_fieldset_element.c html_legend_element.c html_div_element.c \ - html_paragraph_element.c html_heading_element.c html_quote_element.c \ - html_pre_element.c html_br_element.c html_label_element.c \ - html_ulist_element.c html_olist_element.c html_li_element.c \ - html_font_element.c html_mod_element.c html_anchor_element.c \ - html_basefont_element.c html_image_element.c html_object_element.c \ - html_param_element.c html_applet_element.c html_area_element.c \ - html_map_element.c html_script_element.c html_tablecaption_element.c \ - html_tablecell_element.c html_tablecol_element.c html_tablesection_element.c \ - html_table_element.c html_tablerow_element.c html_frameset_element.c \ - html_frame_element.c html_iframe_element.c html_isindex_element.c \ + html_applet_element.c \ + html_area_element.c \ + html_anchor_element.c \ + html_basefont_element.c \ + html_base_element.c \ + html_body_element.c \ + html_button_element.c \ + html_canvas_element.c \ + html_collection.c \ + html_document.c \ + html_element.c \ + html_dlist_element.c \ + html_directory_element.c \ + html_options_collection.c \ + html_html_element.c \ + html_head_element.c \ + html_link_element.c \ + html_title_element.c \ + html_meta_element.c \ + html_style_element.c \ + html_form_element.c \ + html_select_element.c \ + html_input_element.c \ + html_text_area_element.c \ + html_opt_group_element.c \ + html_option_element.c \ + html_hr_element.c \ + html_menu_element.c \ + html_fieldset_element.c \ + html_legend_element.c \ + html_div_element.c \ + html_paragraph_element.c \ + html_heading_element.c \ + html_quote_element.c \ + html_pre_element.c \ + html_br_element.c \ + html_label_element.c \ + html_ulist_element.c \ + html_olist_element.c \ + html_li_element.c \ + html_font_element.c \ + html_mod_element.c \ + html_image_element.c \ + html_object_element.c \ + html_param_element.c \ + html_map_element.c \ + html_script_element.c \ + html_tablecaption_element.c \ + html_tablecell_element.c \ + html_tablecol_element.c \ + html_tablesection_element.c \ + html_table_element.c \ + html_tablerow_element.c \ + html_frameset_element.c \ + html_frame_element.c \ + html_iframe_element.c \ + html_isindex_element.c \ UNINMPLEMENTED_SOURCES := \ diff --git a/src/html/html_canvas_element.c b/src/html/html_canvas_element.c new file mode 100644 index 0000000..ea9d9c9 --- /dev/null +++ b/src/html/html_canvas_element.c @@ -0,0 +1,190 @@ +/* + * This file is part of libdom. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2020 Vincent Sanders + */ + +#include +#include + +#include + +#include "html/html_document.h" +#include "html/html_canvas_element.h" + +#include "core/node.h" +#include "core/attr.h" +#include "utils/utils.h" + +static struct dom_element_protected_vtable _protect_vtable = { + { + DOM_NODE_PROTECT_VTABLE_HTML_CANVAS_ELEMENT + }, + DOM_HTML_CANVAS_ELEMENT_PROTECT_VTABLE +}; + +/** + * Create a dom_html_canvas_element object + * + * \param params The html element creation parameters + * \param ele The returned element object + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +dom_exception _dom_html_canvas_element_create( + struct dom_html_element_create_params *params, + struct dom_html_canvas_element **ele) +{ + struct dom_node_internal *node; + + *ele = malloc(sizeof(dom_html_canvas_element)); + if (*ele == NULL) + return DOM_NO_MEM_ERR; + + /* Set up vtables */ + node = (struct dom_node_internal *) *ele; + node->base.vtable = &_dom_html_element_vtable; + node->vtable = &_protect_vtable; + + return _dom_html_canvas_element_initialise(params, *ele); +} + +/** + * Initialise a dom_html_canvas_element object + * + * \param params The html element creation parameters + * \param ele The dom_html_canvas_element object + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +dom_exception _dom_html_canvas_element_initialise( + struct dom_html_element_create_params *params, + struct dom_html_canvas_element *ele) +{ + return _dom_html_element_initialise(params, &ele->base); +} + +/** + * Finalise a dom_html_canvas_element object + * + * \param ele The dom_html_canvas_element object + */ +void _dom_html_canvas_element_finalise(struct dom_html_canvas_element *ele) +{ + _dom_html_element_finalise(&ele->base); +} + +/** + * Destroy a dom_html_canvas_element object + * + * \param ele The dom_html_canvas_element object + */ +void _dom_html_canvas_element_destroy(struct dom_html_canvas_element *ele) +{ + _dom_html_canvas_element_finalise(ele); + free(ele); +} + +/*------------------------------------------------------------------------*/ +/* The protected virtual functions */ + +/* The virtual function used to parse attribute value, see src/core/element.c + * for detail */ +dom_exception _dom_html_canvas_element_parse_attribute(dom_element *ele, + dom_string *name, dom_string *value, + dom_string **parsed) +{ + UNUSED(ele); + UNUSED(name); + + dom_string_ref(value); + *parsed = value; + + return DOM_NO_ERR; +} + +/* The virtual destroy function, see src/core/node.c for detail */ +void _dom_virtual_html_canvas_element_destroy(dom_node_internal *node) +{ + _dom_html_canvas_element_destroy((struct dom_html_canvas_element *) node); +} + +/* The virtual copy function, see src/core/node.c for detail */ +dom_exception _dom_html_canvas_element_copy( + dom_node_internal *old, dom_node_internal **copy) +{ + dom_html_canvas_element *new_node; + dom_exception err; + + new_node = malloc(sizeof(dom_html_canvas_element)); + if (new_node == NULL) + return DOM_NO_MEM_ERR; + + err = dom_html_canvas_element_copy_internal(old, new_node); + if (err != DOM_NO_ERR) { + free(new_node); + return err; + } + + *copy = (dom_node_internal *) new_node; + + return DOM_NO_ERR; +} + +dom_exception _dom_html_canvas_element_copy_internal( + dom_html_canvas_element *old, + dom_html_canvas_element *new) +{ + dom_exception err; + + err = dom_html_element_copy_internal(old, new); + if (err != DOM_NO_ERR) { + return err; + } + + return DOM_NO_ERR; +} + +/*-----------------------------------------------------------------------*/ +/* API functions */ + + +dom_exception +dom_html_canvas_element_get_width(dom_html_canvas_element *canvas, + int32_t *width) +{ + return dom_html_element_get_int32_t_property(&canvas->base, + "width", + SLEN("width"), + width); +} + +dom_exception +dom_html_canvas_element_set_width(dom_html_canvas_element *canvas, + uint32_t width) +{ + return dom_html_element_set_int32_t_property(&canvas->base, + "width", + SLEN("width"), + width); +} + +dom_exception +dom_html_canvas_element_get_height(dom_html_canvas_element *canvas, + int32_t *height) +{ + return dom_html_element_get_int32_t_property(&canvas->base, + "height", + SLEN("height"), + height); +} + +dom_exception +dom_html_canvas_element_set_height(dom_html_canvas_element *canvas, + uint32_t height) +{ + return dom_html_element_set_int32_t_property(&canvas->base, + "height", + SLEN("height"), + height); +} + diff --git a/src/html/html_canvas_element.h b/src/html/html_canvas_element.h new file mode 100644 index 0000000..4cf3042 --- /dev/null +++ b/src/html/html_canvas_element.h @@ -0,0 +1,62 @@ +/* + * This file is part of libdom. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2020 Vincent Sanders + */ + +#ifndef dom_internal_html_canvas_element_h_ +#define dom_internal_html_canvas_element_h_ + +#include + +#include "html/html_element.h" + +struct dom_html_canvas_element { + struct dom_html_element base; + /**< The base class */ +}; + +/* Create a dom_html_canvas_element object */ +dom_exception _dom_html_canvas_element_create( + struct dom_html_element_create_params *params, + struct dom_html_canvas_element **ele); + +/* Initialise a dom_html_canvas_element object */ +dom_exception _dom_html_canvas_element_initialise( + struct dom_html_element_create_params *params, + struct dom_html_canvas_element *ele); + +/* Finalise a dom_html_canvas_element object */ +void _dom_html_canvas_element_finalise(struct dom_html_canvas_element *ele); + +/* Destroy a dom_html_canvas_element object */ +void _dom_html_canvas_element_destroy(struct dom_html_canvas_element *ele); + +/* The protected virtual functions */ +dom_exception _dom_html_canvas_element_parse_attribute(dom_element *ele, + dom_string *name, dom_string *value, + dom_string **parsed); + +void _dom_virtual_html_canvas_element_destroy(dom_node_internal *node); +dom_exception _dom_html_canvas_element_copy(dom_node_internal *old, + dom_node_internal **copy); + +#define DOM_HTML_CANVAS_ELEMENT_PROTECT_VTABLE \ + _dom_html_canvas_element_parse_attribute + +#define DOM_NODE_PROTECT_VTABLE_HTML_CANVAS_ELEMENT \ + _dom_virtual_html_canvas_element_destroy, \ + _dom_html_canvas_element_copy + +/* Helper functions*/ +dom_exception _dom_html_canvas_element_copy_internal( + dom_html_canvas_element *old, + dom_html_canvas_element *new); +#define dom_html_canvas_element_copy_internal(o, n) \ + _dom_html_canvas_element_copy_internal( \ + (dom_html_canvas_element *) (o), \ + (dom_html_canvas_element *) (n)) + + +#endif diff --git a/src/html/html_document.c b/src/html/html_document.c index 50a15a7..d978327 100644 --- a/src/html/html_document.c +++ b/src/html/html_document.c @@ -17,6 +17,7 @@ #include "html/html_head_element.h" #include "html/html_body_element.h" #include "html/html_base_element.h" +#include "html/html_canvas_element.h" #include "html/html_div_element.h" #include "html/html_link_element.h" #include "html/html_title_element.h" @@ -771,6 +772,10 @@ _dom_html_document_create_element_internal( exc = _dom_html_isindex_element_create(¶ms, (dom_html_isindex_element **) result); break; + case DOM_HTML_ELEMENT_TYPE_CANVAS: + exc = _dom_html_canvas_element_create(¶ms, + (dom_html_canvas_element **) result); + break; case DOM_HTML_ELEMENT_TYPE_DATA: case DOM_HTML_ELEMENT_TYPE_SPAN: case DOM_HTML_ELEMENT_TYPE_TIME: @@ -779,7 +784,6 @@ _dom_html_document_create_element_internal( case DOM_HTML_ELEMENT_TYPE_METER: case DOM_HTML_ELEMENT_TYPE_TRACK: case DOM_HTML_ELEMENT_TYPE_VIDEO: - case DOM_HTML_ELEMENT_TYPE_CANVAS: case DOM_HTML_ELEMENT_TYPE_DIALOG: case DOM_HTML_ELEMENT_TYPE_KEYGEN: case DOM_HTML_ELEMENT_TYPE_OUTPUT: -- cgit v1.2.3