Gitweb links:

...log 
http://git.netsurf-browser.org/netsurf.git/shortlog/334b498d5ced611bd7e45a1c6aa951559faac616
...commit 
http://git.netsurf-browser.org/netsurf.git/commit/334b498d5ced611bd7e45a1c6aa951559faac616
...tree 
http://git.netsurf-browser.org/netsurf.git/tree/334b498d5ced611bd7e45a1c6aa951559faac616

The branch, master has been updated
       via  334b498d5ced611bd7e45a1c6aa951559faac616 (commit)
       via  937894d6547dd8cb3a7c4c81cba5149e38bcf8bd (commit)
       via  b39f418bca9d0421eca127a11a0fb65bd2c37459 (commit)
       via  a5572cde76b7a95d670fad3b308e0c1d5c7f1f18 (commit)
       via  4d927ff40937bbd867bf09bcdff3bdb3107c777f (commit)
      from  a35f35fec0fb7f441755107e3712fe9781134b41 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=334b498d5ced611bd7e45a1c6aa951559faac616
commit 334b498d5ced611bd7e45a1c6aa951559faac616
Author: Daniel Silverstone <[email protected]>
Commit: Daniel Silverstone <[email protected]>

    html: Handle canvas in redraw
    
    Signed-off-by: Daniel Silverstone <[email protected]>

diff --git a/content/handlers/html/redraw.c b/content/handlers/html/redraw.c
index aa99782..7c96c90 100644
--- a/content/handlers/html/redraw.c
+++ b/content/handlers/html/redraw.c
@@ -40,6 +40,7 @@
 #include "utils/messages.h"
 #include "utils/utils.h"
 #include "utils/nsoption.h"
+#include "utils/corestrings.h"
 #include "netsurf/content.h"
 #include "netsurf/browser_window.h"
 #include "netsurf/plotters.h"
@@ -1242,6 +1243,9 @@ bool html_redraw_box(const html_content *html, struct box 
*box,
        css_computed_clip_rect css_rect;
        enum css_overflow_e overflow_x = CSS_OVERFLOW_VISIBLE;
        enum css_overflow_e overflow_y = CSS_OVERFLOW_VISIBLE;
+       dom_exception exc;
+       dom_html_element_type tag_type;
+
 
        if (html_redraw_printing && (box->flags & PRINTED))
                return true;
@@ -1743,6 +1747,15 @@ bool html_redraw_box(const html_content *html, struct 
box *box,
                        return false;
        }
 
+       if (box->node != NULL) {
+               exc = dom_html_element_get_tag_type(box->node, &tag_type);
+               if (exc != DOM_NO_ERR) {
+                       tag_type = DOM_HTML_ELEMENT_TYPE__UNKNOWN;
+               }
+       } else {
+               tag_type = DOM_HTML_ELEMENT_TYPE__UNKNOWN;
+       }
+
        if (box->object && width != 0 && height != 0) {
                struct content_redraw_data obj_data;
 
@@ -1796,7 +1809,22 @@ bool html_redraw_box(const html_content *html, struct 
box *box,
                                            obj, sizeof(obj) - 1) != NSERROR_OK)
                                return false;
                }
-
+       } else if (tag_type == DOM_HTML_ELEMENT_TYPE_CANVAS &&
+                  box->node != NULL &&
+                  box->flags & REPLACE_DIM) {
+               /* Canvas to draw */
+               struct bitmap *bitmap = NULL;
+               exc = dom_node_get_user_data(box->node,
+                                            
corestring_dom___ns_key_canvas_node_data,
+                                            &bitmap);
+               if (exc != DOM_NO_ERR) {
+                       bitmap = NULL;
+               }
+               if (bitmap != NULL &&
+                   ctx->plot->bitmap(ctx, bitmap, x + padding_left, y + 
padding_top,
+                                     width, height, current_background_color,
+                                     BITMAPF_NONE) != NSERROR_OK)
+                       return false;
        } else if (box->iframe) {
                /* Offset is passed to browser window redraw unscaled */
                browser_window_redraw(box->iframe,


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=937894d6547dd8cb3a7c4c81cba5149e38bcf8bd
commit 937894d6547dd8cb3a7c4c81cba5149e38bcf8bd
Author: Daniel Silverstone <[email protected]>
Commit: Daniel Silverstone <[email protected]>

    html: set up canvas box properly
    
    Signed-off-by: Daniel Silverstone <[email protected]>

diff --git a/content/handlers/html/box_special.c 
b/content/handlers/html/box_special.c
index 23cfeec..2332316 100644
--- a/content/handlers/html/box_special.c
+++ b/content/handlers/html/box_special.c
@@ -824,6 +824,13 @@ box_canvas(dom_node *n,
        }
        *convert_children = false;
 
+       if (box->style &&
+           ns_computed_display(box->style, box_is_root(n)) == CSS_DISPLAY_NONE)
+               return true;
+
+       /* This is replaced content */
+       box->flags |= IS_REPLACED | REPLACE_DIM;
+
        return true;
 }
 


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=b39f418bca9d0421eca127a11a0fb65bd2c37459
commit b39f418bca9d0421eca127a11a0fb65bd2c37459
Author: Daniel Silverstone <[email protected]>
Commit: Daniel Silverstone <[email protected]>

    html: Add canvas node handling in dom_event
    
    Signed-off-by: Daniel Silverstone <[email protected]>

diff --git a/content/handlers/html/dom_event.c 
b/content/handlers/html/dom_event.c
index b702cb3..5470f29 100644
--- a/content/handlers/html/dom_event.c
+++ b/content/handlers/html/dom_event.c
@@ -32,6 +32,10 @@
 #include "content/content.h"
 #include "javascript/js.h"
 
+#include "desktop/gui_internal.h"
+#include "desktop/gui_table.h"
+#include "netsurf/bitmap.h"
+
 #include "html/private.h"
 #include "html/object.h"
 #include "html/css.h"
@@ -102,6 +106,69 @@ static bool html_process_inserted_base(html_content 
*htmlc, dom_node *node)
        return true;
 }
 
+/**
+ * deal with events from the DOM for canvas node user data
+ *
+ * \param operation The DOM operation happening
+ * \param key The user data key
+ * \param data The user data (our bitmap)
+ * \param src The DOM node emitting the event (our <canvas>)
+ * \param dst The target DOM node if applicable
+ */
+static void
+html__canvas_user_data_handler(dom_node_operation operation,
+                              dom_string *key,
+                              void *data,
+                              struct dom_node *src,
+                              struct dom_node *dst)
+{
+       struct bitmap *newbitmap, *bitmap = (struct bitmap*)data, *oldbitmap = 
NULL;
+       int width, height;
+       size_t stride;
+
+       if (dom_string_isequal(key,corestring_dom___ns_key_canvas_node_data) == 
false || data == NULL) {
+               /* Not for us */
+               return;
+       }
+
+       switch (operation) {
+       case DOM_NODE_CLONED:
+               width = guit->bitmap->get_width(bitmap);
+               height = guit->bitmap->get_height(bitmap);
+               stride = guit->bitmap->get_rowstride(bitmap);
+               newbitmap = guit->bitmap->create(width, height,
+                                                BITMAP_NEW);
+               if (newbitmap != NULL) {
+                       if (guit->bitmap->get_rowstride(newbitmap) == stride) {
+                               // Compatible bitmap, bung the data over
+                               memcpy(guit->bitmap->get_buffer(newbitmap),
+                                      guit->bitmap->get_buffer(bitmap),
+                                      stride * height);
+                               guit->bitmap->modified(newbitmap);
+                       }
+               }
+               if (dom_node_set_user_data(dst,
+                                          
corestring_dom___ns_key_canvas_node_data,
+                                          newbitmap, 
html__canvas_user_data_handler,
+                                          &oldbitmap) == DOM_NO_ERR) {
+                       if (oldbitmap != NULL)
+                               guit->bitmap->destroy(oldbitmap);
+               }
+               break;
+
+       case DOM_NODE_RENAMED:
+       case DOM_NODE_IMPORTED:
+       case DOM_NODE_ADOPTED:
+               break;
+
+       case DOM_NODE_DELETED:
+               guit->bitmap->destroy(bitmap);
+               break;
+       default:
+               NSLOG(netsurf, INFO, "User data operation not handled.");
+               assert(0);
+       }
+}
 
 /**
  * process a canvas element being inserted into the DOM
@@ -112,6 +179,72 @@ static bool html_process_inserted_base(html_content 
*htmlc, dom_node *node)
  */
 static nserror html_process_inserted_canvas(html_content *htmlc, dom_node 
*node)
 {
+       dom_exception exc;
+       dom_string *width_s = NULL, *height_s = NULL;
+       unsigned long width = 300, height = 150;
+       struct bitmap *bitmap, *oldbitmap = NULL;
+
+       exc = dom_element_get_attribute(node,
+                                       corestring_dom_width,
+                                       &width_s);
+       if (exc == DOM_NO_ERR && width_s != NULL) {
+               const char *ptr = (const char *)dom_string_data(width_s);
+               const char *endptr = ptr + dom_string_length(width_s);
+               char * ended;
+               unsigned long width_n = strtoul(ptr, &ended, 10);
+
+               if (ended == endptr) {
+                       /* parsed it all */
+                       width = width_n;
+               }
+
+               dom_string_unref(width_s);
+       }
+
+       exc = dom_element_get_attribute(node,
+                                       corestring_dom_height,
+                                       &height_s);
+       if (exc == DOM_NO_ERR && height_s != NULL) {
+               const char *ptr = (const char *)dom_string_data(height_s);
+               const char *endptr = ptr + dom_string_length(height_s);
+               char * ended;
+               unsigned long height_n = strtoul(ptr, &ended, 10);
+
+               if (ended == endptr) {
+                       /* parsed it all */
+                       height = height_n;
+               }
+
+               dom_string_unref(height_s);
+       }
+
+       bitmap = guit->bitmap->create(
+               (int)width, (int)height,
+               BITMAP_NEW);
+
+       if (bitmap == NULL) {
+               return NSERROR_NOMEM;
+       }
+
+       memset(guit->bitmap->get_buffer(bitmap),
+              0, /* Transparent black */
+              height * guit->bitmap->get_rowstride(bitmap));
+       guit->bitmap->modified(bitmap);
+
+       exc = dom_node_set_user_data(node,
+                                    corestring_dom___ns_key_canvas_node_data,
+                                    bitmap,
+                                    html__canvas_user_data_handler,
+                                    &oldbitmap);
+
+       if (exc != DOM_NO_ERR) {
+               guit->bitmap->destroy(bitmap);
+               return NSERROR_DOM;
+       }
+
+       if (oldbitmap != NULL)
+               guit->bitmap->destroy(oldbitmap);
+
        return NSERROR_OK;
 }
 


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=a5572cde76b7a95d670fad3b308e0c1d5c7f1f18
commit a5572cde76b7a95d670fad3b308e0c1d5c7f1f18
Author: Daniel Silverstone <[email protected]>
Commit: Daniel Silverstone <[email protected]>

    css: Support canvas width/height presentational hints
    
    Signed-off-by: Daniel Silverstone <[email protected]>

diff --git a/content/handlers/css/hints.c b/content/handlers/css/hints.c
index adfdd01..9748030 100644
--- a/content/handlers/css/hints.c
+++ b/content/handlers/css/hints.c
@@ -1233,6 +1233,68 @@ static void css_hint_height_width_textarea(
        }
 }
 
+static void css_hint_height_width_canvas(
+               nscss_select_ctx *ctx,
+               dom_node *node)
+{
+       struct css_hint *hint = &hint_ctx.hints[hint_ctx.len];
+       dom_string *attr = NULL;
+       dom_exception err;
+       bool set_dim = false;
+
+       err = dom_element_get_attribute(node,
+                       corestring_dom_height, &attr);
+
+       if (err == DOM_NO_ERR && attr != NULL) {
+               if (parse_dimension(
+                               (const char *)dom_string_data(attr), true,
+                               &hint->data.length.value,
+                               &hint->data.length.unit)) {
+                       hint->prop = CSS_PROP_HEIGHT;
+                       hint->data.length.unit = CSS_UNIT_PX;
+                       hint->status = CSS_HEIGHT_SET;
+                       css_hint_advance(&hint);
+                       set_dim = true;
+               }
+               dom_string_unref(attr);
+       }
+       if (set_dim == false) {
+               /* canvas defaults to 150px tall */
+               hint->prop = CSS_PROP_HEIGHT;
+               hint->data.length.unit = CSS_UNIT_PX;
+               hint->data.length.value = INTTOFIX(150);
+               hint->status = CSS_HEIGHT_SET;
+               css_hint_advance(&hint);
+       } else {
+               set_dim = false;
+       }
+
+       err = dom_element_get_attribute(node,
+                       corestring_dom_width, &attr);
+
+       if (err == DOM_NO_ERR && attr != NULL) {
+               if (parse_dimension(
+                               (const char *)dom_string_data(attr), true,
+                               &hint->data.length.value,
+                               &hint->data.length.unit)) {
+                       hint->prop = CSS_PROP_WIDTH;
+                       hint->data.length.unit = CSS_UNIT_PX;
+                       hint->status = CSS_WIDTH_SET;
+                       css_hint_advance(&hint);
+                       set_dim = true;
+               }
+               dom_string_unref(attr);
+       }
+       if (set_dim == false) {
+               /* canvas defaults to 300px wide */
+               hint->prop = CSS_PROP_WIDTH;
+               hint->data.length.unit = CSS_UNIT_PX;
+               hint->data.length.value = INTTOFIX(300);
+               hint->status = CSS_WIDTH_SET;
+               css_hint_advance(&hint);
+       }
+}
+
 static void css_hint_width_input(
                nscss_select_ctx *ctx,
                dom_node *node)
@@ -1606,6 +1668,9 @@ css_error node_presentational_hint(void *pw, void *node,
        case DOM_HTML_ELEMENT_TYPE_BODY:
                css_hint_body_color(pw, node);
                break;
+       case DOM_HTML_ELEMENT_TYPE_CANVAS:
+               css_hint_height_width_canvas(pw, node);
+               break;
        default:
                break;
        }


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=4d927ff40937bbd867bf09bcdff3bdb3107c777f
commit 4d927ff40937bbd867bf09bcdff3bdb3107c777f
Author: Daniel Silverstone <[email protected]>
Commit: Daniel Silverstone <[email protected]>

    corestrings: Add a key for canvas node data
    
    Signed-off-by: Daniel Silverstone <[email protected]>

diff --git a/utils/corestringlist.h b/utils/corestringlist.h
index 02689fc..d6be3c4 100644
--- a/utils/corestringlist.h
+++ b/utils/corestringlist.h
@@ -366,6 +366,7 @@ CORESTRING_DOM_STRING(__ns_key_libcss_node_data);
 CORESTRING_DOM_STRING(__ns_key_file_name_node_data);
 CORESTRING_DOM_STRING(__ns_key_image_coords_node_data);
 CORESTRING_DOM_STRING(__ns_key_html_content_data);
+CORESTRING_DOM_STRING(__ns_key_canvas_node_data);
 
 /* unusual DOM strings */
 CORESTRING_DOM_VALUE(text_javascript, "text/javascript");


-----------------------------------------------------------------------

Summary of changes:
 content/handlers/css/hints.c        |   65 +++++++++++++++++
 content/handlers/html/box_special.c |    7 ++
 content/handlers/html/dom_event.c   |  133 +++++++++++++++++++++++++++++++++++
 content/handlers/html/redraw.c      |   30 +++++++-
 utils/corestringlist.h              |    1 +
 5 files changed, 235 insertions(+), 1 deletion(-)

diff --git a/content/handlers/css/hints.c b/content/handlers/css/hints.c
index adfdd01..9748030 100644
--- a/content/handlers/css/hints.c
+++ b/content/handlers/css/hints.c
@@ -1233,6 +1233,68 @@ static void css_hint_height_width_textarea(
        }
 }
 
+static void css_hint_height_width_canvas(
+               nscss_select_ctx *ctx,
+               dom_node *node)
+{
+       struct css_hint *hint = &hint_ctx.hints[hint_ctx.len];
+       dom_string *attr = NULL;
+       dom_exception err;
+       bool set_dim = false;
+
+       err = dom_element_get_attribute(node,
+                       corestring_dom_height, &attr);
+
+       if (err == DOM_NO_ERR && attr != NULL) {
+               if (parse_dimension(
+                               (const char *)dom_string_data(attr), true,
+                               &hint->data.length.value,
+                               &hint->data.length.unit)) {
+                       hint->prop = CSS_PROP_HEIGHT;
+                       hint->data.length.unit = CSS_UNIT_PX;
+                       hint->status = CSS_HEIGHT_SET;
+                       css_hint_advance(&hint);
+                       set_dim = true;
+               }
+               dom_string_unref(attr);
+       }
+       if (set_dim == false) {
+               /* canvas defaults to 150px tall */
+               hint->prop = CSS_PROP_HEIGHT;
+               hint->data.length.unit = CSS_UNIT_PX;
+               hint->data.length.value = INTTOFIX(150);
+               hint->status = CSS_HEIGHT_SET;
+               css_hint_advance(&hint);
+       } else {
+               set_dim = false;
+       }
+
+       err = dom_element_get_attribute(node,
+                       corestring_dom_width, &attr);
+
+       if (err == DOM_NO_ERR && attr != NULL) {
+               if (parse_dimension(
+                               (const char *)dom_string_data(attr), true,
+                               &hint->data.length.value,
+                               &hint->data.length.unit)) {
+                       hint->prop = CSS_PROP_WIDTH;
+                       hint->data.length.unit = CSS_UNIT_PX;
+                       hint->status = CSS_WIDTH_SET;
+                       css_hint_advance(&hint);
+                       set_dim = true;
+               }
+               dom_string_unref(attr);
+       }
+       if (set_dim == false) {
+               /* canvas defaults to 300px wide */
+               hint->prop = CSS_PROP_WIDTH;
+               hint->data.length.unit = CSS_UNIT_PX;
+               hint->data.length.value = INTTOFIX(300);
+               hint->status = CSS_WIDTH_SET;
+               css_hint_advance(&hint);
+       }
+}
+
 static void css_hint_width_input(
                nscss_select_ctx *ctx,
                dom_node *node)
@@ -1606,6 +1668,9 @@ css_error node_presentational_hint(void *pw, void *node,
        case DOM_HTML_ELEMENT_TYPE_BODY:
                css_hint_body_color(pw, node);
                break;
+       case DOM_HTML_ELEMENT_TYPE_CANVAS:
+               css_hint_height_width_canvas(pw, node);
+               break;
        default:
                break;
        }
diff --git a/content/handlers/html/box_special.c 
b/content/handlers/html/box_special.c
index 23cfeec..2332316 100644
--- a/content/handlers/html/box_special.c
+++ b/content/handlers/html/box_special.c
@@ -824,6 +824,13 @@ box_canvas(dom_node *n,
        }
        *convert_children = false;
 
+       if (box->style &&
+           ns_computed_display(box->style, box_is_root(n)) == CSS_DISPLAY_NONE)
+               return true;
+
+       /* This is replaced content */
+       box->flags |= IS_REPLACED | REPLACE_DIM;
+
        return true;
 }
 
diff --git a/content/handlers/html/dom_event.c 
b/content/handlers/html/dom_event.c
index b702cb3..5470f29 100644
--- a/content/handlers/html/dom_event.c
+++ b/content/handlers/html/dom_event.c
@@ -32,6 +32,10 @@
 #include "content/content.h"
 #include "javascript/js.h"
 
+#include "desktop/gui_internal.h"
+#include "desktop/gui_table.h"
+#include "netsurf/bitmap.h"
+
 #include "html/private.h"
 #include "html/object.h"
 #include "html/css.h"
@@ -102,6 +106,69 @@ static bool html_process_inserted_base(html_content 
*htmlc, dom_node *node)
        return true;
 }
 
+/**
+ * deal with events from the DOM for canvas node user data
+ *
+ * \param operation The DOM operation happening
+ * \param key The user data key
+ * \param data The user data (our bitmap)
+ * \param src The DOM node emitting the event (our <canvas>)
+ * \param dst The target DOM node if applicable
+ */
+static void
+html__canvas_user_data_handler(dom_node_operation operation,
+                              dom_string *key,
+                              void *data,
+                              struct dom_node *src,
+                              struct dom_node *dst)
+{
+       struct bitmap *newbitmap, *bitmap = (struct bitmap*)data, *oldbitmap = 
NULL;
+       int width, height;
+       size_t stride;
+
+       if (dom_string_isequal(key,corestring_dom___ns_key_canvas_node_data) == 
false || data == NULL) {
+               /* Not for us */
+               return;
+       }
+
+       switch (operation) {
+       case DOM_NODE_CLONED:
+               width = guit->bitmap->get_width(bitmap);
+               height = guit->bitmap->get_height(bitmap);
+               stride = guit->bitmap->get_rowstride(bitmap);
+               newbitmap = guit->bitmap->create(width, height,
+                                                BITMAP_NEW);
+               if (newbitmap != NULL) {
+                       if (guit->bitmap->get_rowstride(newbitmap) == stride) {
+                               // Compatible bitmap, bung the data over
+                               memcpy(guit->bitmap->get_buffer(newbitmap),
+                                      guit->bitmap->get_buffer(bitmap),
+                                      stride * height);
+                               guit->bitmap->modified(newbitmap);
+                       }
+               }
+               if (dom_node_set_user_data(dst,
+                                          
corestring_dom___ns_key_canvas_node_data,
+                                          newbitmap, 
html__canvas_user_data_handler,
+                                          &oldbitmap) == DOM_NO_ERR) {
+                       if (oldbitmap != NULL)
+                               guit->bitmap->destroy(oldbitmap);
+               }
+               break;
+
+       case DOM_NODE_RENAMED:
+       case DOM_NODE_IMPORTED:
+       case DOM_NODE_ADOPTED:
+               break;
+
+       case DOM_NODE_DELETED:
+               guit->bitmap->destroy(bitmap);
+               break;
+       default:
+               NSLOG(netsurf, INFO, "User data operation not handled.");
+               assert(0);
+       }
+}
 
 /**
  * process a canvas element being inserted into the DOM
@@ -112,6 +179,72 @@ static bool html_process_inserted_base(html_content 
*htmlc, dom_node *node)
  */
 static nserror html_process_inserted_canvas(html_content *htmlc, dom_node 
*node)
 {
+       dom_exception exc;
+       dom_string *width_s = NULL, *height_s = NULL;
+       unsigned long width = 300, height = 150;
+       struct bitmap *bitmap, *oldbitmap = NULL;
+
+       exc = dom_element_get_attribute(node,
+                                       corestring_dom_width,
+                                       &width_s);
+       if (exc == DOM_NO_ERR && width_s != NULL) {
+               const char *ptr = (const char *)dom_string_data(width_s);
+               const char *endptr = ptr + dom_string_length(width_s);
+               char * ended;
+               unsigned long width_n = strtoul(ptr, &ended, 10);
+
+               if (ended == endptr) {
+                       /* parsed it all */
+                       width = width_n;
+               }
+
+               dom_string_unref(width_s);
+       }
+
+       exc = dom_element_get_attribute(node,
+                                       corestring_dom_height,
+                                       &height_s);
+       if (exc == DOM_NO_ERR && height_s != NULL) {
+               const char *ptr = (const char *)dom_string_data(height_s);
+               const char *endptr = ptr + dom_string_length(height_s);
+               char * ended;
+               unsigned long height_n = strtoul(ptr, &ended, 10);
+
+               if (ended == endptr) {
+                       /* parsed it all */
+                       height = height_n;
+               }
+
+               dom_string_unref(height_s);
+       }
+
+       bitmap = guit->bitmap->create(
+               (int)width, (int)height,
+               BITMAP_NEW);
+
+       if (bitmap == NULL) {
+               return NSERROR_NOMEM;
+       }
+
+       memset(guit->bitmap->get_buffer(bitmap),
+              0, /* Transparent black */
+              height * guit->bitmap->get_rowstride(bitmap));
+       guit->bitmap->modified(bitmap);
+
+       exc = dom_node_set_user_data(node,
+                                    corestring_dom___ns_key_canvas_node_data,
+                                    bitmap,
+                                    html__canvas_user_data_handler,
+                                    &oldbitmap);
+
+       if (exc != DOM_NO_ERR) {
+               guit->bitmap->destroy(bitmap);
+               return NSERROR_DOM;
+       }
+
+       if (oldbitmap != NULL)
+               guit->bitmap->destroy(oldbitmap);
+
        return NSERROR_OK;
 }
 
diff --git a/content/handlers/html/redraw.c b/content/handlers/html/redraw.c
index aa99782..7c96c90 100644
--- a/content/handlers/html/redraw.c
+++ b/content/handlers/html/redraw.c
@@ -40,6 +40,7 @@
 #include "utils/messages.h"
 #include "utils/utils.h"
 #include "utils/nsoption.h"
+#include "utils/corestrings.h"
 #include "netsurf/content.h"
 #include "netsurf/browser_window.h"
 #include "netsurf/plotters.h"
@@ -1242,6 +1243,9 @@ bool html_redraw_box(const html_content *html, struct box 
*box,
        css_computed_clip_rect css_rect;
        enum css_overflow_e overflow_x = CSS_OVERFLOW_VISIBLE;
        enum css_overflow_e overflow_y = CSS_OVERFLOW_VISIBLE;
+       dom_exception exc;
+       dom_html_element_type tag_type;
+
 
        if (html_redraw_printing && (box->flags & PRINTED))
                return true;
@@ -1743,6 +1747,15 @@ bool html_redraw_box(const html_content *html, struct 
box *box,
                        return false;
        }
 
+       if (box->node != NULL) {
+               exc = dom_html_element_get_tag_type(box->node, &tag_type);
+               if (exc != DOM_NO_ERR) {
+                       tag_type = DOM_HTML_ELEMENT_TYPE__UNKNOWN;
+               }
+       } else {
+               tag_type = DOM_HTML_ELEMENT_TYPE__UNKNOWN;
+       }
+
        if (box->object && width != 0 && height != 0) {
                struct content_redraw_data obj_data;
 
@@ -1796,7 +1809,22 @@ bool html_redraw_box(const html_content *html, struct 
box *box,
                                            obj, sizeof(obj) - 1) != NSERROR_OK)
                                return false;
                }
-
+       } else if (tag_type == DOM_HTML_ELEMENT_TYPE_CANVAS &&
+                  box->node != NULL &&
+                  box->flags & REPLACE_DIM) {
+               /* Canvas to draw */
+               struct bitmap *bitmap = NULL;
+               exc = dom_node_get_user_data(box->node,
+                                            
corestring_dom___ns_key_canvas_node_data,
+                                            &bitmap);
+               if (exc != DOM_NO_ERR) {
+                       bitmap = NULL;
+               }
+               if (bitmap != NULL &&
+                   ctx->plot->bitmap(ctx, bitmap, x + padding_left, y + 
padding_top,
+                                     width, height, current_background_color,
+                                     BITMAPF_NONE) != NSERROR_OK)
+                       return false;
        } else if (box->iframe) {
                /* Offset is passed to browser window redraw unscaled */
                browser_window_redraw(box->iframe,
diff --git a/utils/corestringlist.h b/utils/corestringlist.h
index 02689fc..d6be3c4 100644
--- a/utils/corestringlist.h
+++ b/utils/corestringlist.h
@@ -366,6 +366,7 @@ CORESTRING_DOM_STRING(__ns_key_libcss_node_data);
 CORESTRING_DOM_STRING(__ns_key_file_name_node_data);
 CORESTRING_DOM_STRING(__ns_key_image_coords_node_data);
 CORESTRING_DOM_STRING(__ns_key_html_content_data);
+CORESTRING_DOM_STRING(__ns_key_canvas_node_data);
 
 /* unusual DOM strings */
 CORESTRING_DOM_VALUE(text_javascript, "text/javascript");


-- 
NetSurf Browser
_______________________________________________
netsurf-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to