From 6be6fa1b2197ffe6e511c5eff9abe14d883f8478 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Wed, 3 Jan 2018 23:58:18 +0000 Subject: CSS utils: Handle new units in length conversion routines. This causes a ripple effect of all the callsites needing information they didn't have. --- desktop/print.c | 37 ++++++++++++++++------------- desktop/selection.c | 67 ++++++++++++++++++++++++++++++++++------------------- desktop/selection.h | 7 +++++- desktop/textarea.c | 46 ++++++++++++++++++++++++++++++------ desktop/textarea.h | 8 +++++-- 5 files changed, 115 insertions(+), 50 deletions(-) (limited to 'desktop') diff --git a/desktop/print.c b/desktop/print.c index 54cc5451a..5c0333a96 100644 --- a/desktop/print.c +++ b/desktop/print.c @@ -257,6 +257,11 @@ struct print_settings *print_make_settings(print_configuration configuration, struct print_settings *settings; css_fixed length = 0; css_unit unit = CSS_UNIT_MM; + nscss_len_ctx len_ctx = { + .vw = DEFAULT_PAGE_WIDTH, + .vh = DEFAULT_PAGE_HEIGHT, + .root_style = NULL, + }; switch (configuration){ case PRINT_DEFAULT: @@ -272,17 +277,17 @@ struct print_settings *print_make_settings(print_configuration configuration, settings->scale = DEFAULT_EXPORT_SCALE; length = INTTOFIX(DEFAULT_MARGIN_LEFT_MM); - settings->margins[MARGINLEFT] = - nscss_len2px(length, unit, NULL); + settings->margins[MARGINLEFT] = nscss_len2px( + &len_ctx, length, unit, NULL); length = INTTOFIX(DEFAULT_MARGIN_RIGHT_MM); - settings->margins[MARGINRIGHT] = - nscss_len2px(length, unit, NULL); + settings->margins[MARGINRIGHT] = nscss_len2px( + &len_ctx, length, unit, NULL); length = INTTOFIX(DEFAULT_MARGIN_TOP_MM); - settings->margins[MARGINTOP] = - nscss_len2px(length, unit, NULL); + settings->margins[MARGINTOP] = nscss_len2px( + &len_ctx, length, unit, NULL); length = INTTOFIX(DEFAULT_MARGIN_BOTTOM_MM); - settings->margins[MARGINBOTTOM] = - nscss_len2px(length, unit, NULL); + settings->margins[MARGINBOTTOM] = nscss_len2px( + &len_ctx, length, unit, NULL); break; /* use settings from the Export options tab */ case PRINT_OPTIONS: @@ -298,17 +303,17 @@ struct print_settings *print_make_settings(print_configuration configuration, settings->scale = (float)nsoption_int(export_scale) / 100; length = INTTOFIX(nsoption_int(margin_left)); - settings->margins[MARGINLEFT] = - nscss_len2px(length, unit, NULL); + settings->margins[MARGINLEFT] = nscss_len2px( + &len_ctx, length, unit, NULL); length = INTTOFIX(nsoption_int(margin_right)); - settings->margins[MARGINRIGHT] = - nscss_len2px(length, unit, NULL); + settings->margins[MARGINRIGHT] = nscss_len2px( + &len_ctx, length, unit, NULL); length = INTTOFIX(nsoption_int(margin_top)); - settings->margins[MARGINTOP] = - nscss_len2px(length, unit, NULL); + settings->margins[MARGINTOP] = nscss_len2px( + &len_ctx, length, unit, NULL); length = INTTOFIX(nsoption_int(margin_bottom)); - settings->margins[MARGINBOTTOM] = - nscss_len2px(length, unit, NULL); + settings->margins[MARGINBOTTOM] = nscss_len2px( + &len_ctx, length, unit, NULL); break; default: return NULL; diff --git a/desktop/selection.c b/desktop/selection.c index 7506af0ef..5cb43b8c3 100644 --- a/desktop/selection.c +++ b/desktop/selection.c @@ -70,18 +70,20 @@ struct selection_string { typedef bool (*seln_traverse_handler)(const char *text, size_t length, - struct box *box, void *handle, const char *whitespace_text, - size_t whitespace_length); + struct box *box, const nscss_len_ctx *len_ctx, void *handle, + const char *whitespace_text, size_t whitespace_length); -static bool redraw_handler(const char *text, size_t length, struct box *box, +static bool redraw_handler(const char *text, size_t length, + struct box *box, const nscss_len_ctx *len_ctx, void *handle, const char *whitespace_text, size_t whitespace_length); static void selection_redraw(struct selection *s, unsigned start_idx, unsigned end_idx); static bool selected_part(struct box *box, unsigned start_idx, unsigned end_idx, unsigned *start_offset, unsigned *end_offset); -static bool traverse_tree(struct box *box, unsigned start_idx, unsigned end_idx, +static bool traverse_tree(struct box *box, const nscss_len_ctx *len_ctx, + unsigned start_idx, unsigned end_idx, seln_traverse_handler handler, void *handle, save_text_whitespace *before, bool *first, bool do_marker); @@ -198,7 +200,10 @@ void selection_reinit(struct selection *s, struct box *root) * \param root the root box for html document or NULL for text/plain */ -void selection_init(struct selection *s, struct box *root) +void selection_init( + struct selection *s, + struct box *root, + const nscss_len_ctx *len_ctx) { if (s->defined) selection_clear(s, true); @@ -207,6 +212,13 @@ void selection_init(struct selection *s, struct box *root) s->start_idx = 0; s->end_idx = 0; s->drag_state = DRAG_NONE; + if (len_ctx != NULL) { + s->len_ctx = *len_ctx; + } else { + s->len_ctx.vw = 0; + s->len_ctx.vh = 0; + s->len_ctx.root_style = NULL; + } selection_reinit(s, root); } @@ -442,6 +454,7 @@ bool selected_part(struct box *box, unsigned start_idx, unsigned end_idx, * for all boxes that lie (partially) within the given range * * \param box box subtree + * \param len_ctx Length conversion context. * \param start_idx start of range within textual representation (bytes) * \param end_idx end of range * \param handler handler function to call @@ -452,7 +465,9 @@ bool selected_part(struct box *box, unsigned start_idx, unsigned end_idx, * \return false iff traversal abandoned part-way through */ -bool traverse_tree(struct box *box, unsigned start_idx, unsigned end_idx, +bool traverse_tree( + struct box *box, const nscss_len_ctx *len_ctx, + unsigned start_idx, unsigned end_idx, seln_traverse_handler handler, void *handle, save_text_whitespace *before, bool *first, bool do_marker) @@ -473,9 +488,9 @@ bool traverse_tree(struct box *box, unsigned start_idx, unsigned end_idx, if (box->list_marker) { /* do the marker box before continuing with the rest of the * list element */ - if (!traverse_tree(box->list_marker, start_idx, end_idx, - handler, handle, before, first, - true)) + if (!traverse_tree(box->list_marker, len_ctx, + start_idx, end_idx, handler, handle, + before, first, true)) return false; } @@ -506,7 +521,7 @@ bool traverse_tree(struct box *box, unsigned start_idx, unsigned end_idx, &end_offset)) { if (!handler(box->text + start_offset, min(box->length, end_offset) - start_offset, - box, handle, whitespace_text, + box, len_ctx, handle, whitespace_text, whitespace_length)) return false; if (before) { @@ -533,7 +548,7 @@ bool traverse_tree(struct box *box, unsigned start_idx, unsigned end_idx, * the tree */ struct box *next = child->next; - if (!traverse_tree(child, start_idx, end_idx, + if (!traverse_tree(child, len_ctx, start_idx, end_idx, handler, handle, before, first, false)) return false; @@ -568,14 +583,16 @@ static bool selection_traverse(struct selection *s, if (s->root) { /* HTML */ - return traverse_tree(s->root, s->start_idx, s->end_idx, - handler, handle, &before, &first, false); + return traverse_tree(s->root, &s->len_ctx, + s->start_idx, s->end_idx, + handler, handle, + &before, &first, false); } /* Text */ text = textplain_get_raw_data(s->c, s->start_idx, s->end_idx, &length); - if (text && !handler(text, length, NULL, handle, NULL, 0)) + if (text && !handler(text, length, NULL, NULL, handle, NULL, 0)) return false; return true; @@ -597,8 +614,8 @@ static bool selection_traverse(struct selection *s, */ bool redraw_handler(const char *text, size_t length, struct box *box, - void *handle, const char *whitespace_text, - size_t whitespace_length) + const nscss_len_ctx *len_ctx, void *handle, + const char *whitespace_text, size_t whitespace_length) { if (box) { struct rdw_info *r = (struct rdw_info*)handle; @@ -606,7 +623,7 @@ bool redraw_handler(const char *text, size_t length, struct box *box, int x, y; plot_font_style_t fstyle; - font_plot_style_from_css(box->style, &fstyle); + font_plot_style_from_css(len_ctx, box->style, &fstyle); /* \todo - it should be possible to reduce the redrawn area by * considering the 'text', 'length' and 'space' parameters */ @@ -652,7 +669,7 @@ void selection_redraw(struct selection *s, unsigned start_idx, unsigned end_idx) rdw.inited = false; if (s->root) { - if (!traverse_tree(s->root, start_idx, end_idx, + if (!traverse_tree(s->root, &s->len_ctx, start_idx, end_idx, redraw_handler, &rdw, NULL, NULL, false)) return; @@ -739,10 +756,11 @@ static bool selection_string_append(const char *text, size_t length, bool space, /** * Selection traversal routine for appending text to a string * - * \param text pointer to text being added, or NULL for newline - * \param length length of text to be appended (bytes) - * \param box pointer to text box, or NULL if from textplain - * \param handle selection string to append to + * \param text pointer to text being added, or NULL for newline + * \param length length of text to be appended (bytes) + * \param box pointer to text box, or NULL if from textplain + * \param len_ctx Length conversion context + * \param handle selection string to append to * \param whitespace_text whitespace to place before text for formatting * may be NULL * \param whitespace_length length of whitespace_text @@ -750,7 +768,8 @@ static bool selection_string_append(const char *text, size_t length, bool space, */ static bool selection_copy_handler(const char *text, size_t length, - struct box *box, void *handle, const char *whitespace_text, + struct box *box, const nscss_len_ctx *len_ctx, + void *handle, const char *whitespace_text, size_t whitespace_length) { bool add_space = false; @@ -771,7 +790,7 @@ static bool selection_copy_handler(const char *text, size_t length, if (box->style != NULL) { /* Override default font style */ - font_plot_style_from_css(box->style, &style); + font_plot_style_from_css(len_ctx, box->style, &style); pstyle = &style; } else { /* If there's no style, there must be no text */ diff --git a/desktop/selection.h b/desktop/selection.h index e2bc3b31d..2f3f6dcfe 100644 --- a/desktop/selection.h +++ b/desktop/selection.h @@ -25,6 +25,7 @@ #include #include "netsurf/mouse.h" +#include "content/handlers/css/utils.h" struct box; @@ -43,6 +44,7 @@ struct selection { struct content *c; struct box *root; + nscss_len_ctx len_ctx; unsigned max_idx; /* total bytes in text representation */ @@ -60,7 +62,10 @@ struct selection *selection_create(struct content *c, bool is_html); void selection_prepare(struct selection *s, struct content *c, bool is_html); void selection_destroy(struct selection *s); -void selection_init(struct selection *s, struct box *root); +void selection_init( + struct selection *s, + struct box *root, + const nscss_len_ctx *len_ctx); void selection_reinit(struct selection *s, struct box *root); /* struct box *selection_root(struct selection *s); */ diff --git a/desktop/textarea.c b/desktop/textarea.c index 149ca26b1..3fd4c9804 100644 --- a/desktop/textarea.c +++ b/desktop/textarea.c @@ -1803,6 +1803,10 @@ static void textarea_setup_text_offsets(struct textarea *ta) { int text_y_offset, text_y_offset_baseline; + ta->line_height = FIXTOINT(FMUL(FLTTOFIX(1.3), FDIV(FMUL( + nscss_screen_dpi, FDIV(INTTOFIX(ta->fstyle.size), + INTTOFIX(FONT_SIZE_SCALE))), F_72))); + text_y_offset = text_y_offset_baseline = ta->border_width; if (ta->flags & TEXTAREA_MULTILINE) { /* Multiline textarea */ @@ -1822,6 +1826,27 @@ static void textarea_setup_text_offsets(struct textarea *ta) } +/** + * Set font styles up for a textarea. + * + * \param[in] ta Textarea to update. + * \param[in] fstyle Font style to set in textarea. + * \param[in] selected_text Textarea selected text colour. + * \param[in] selected_bg Textarea selection background colour. + */ +static void textarea_set_text_style( + struct textarea *ta, + const plot_font_style_t *fstyle, + colour selected_text, + colour selected_bg) +{ + ta->fstyle = *fstyle; + + ta->sel_fstyle = *fstyle; + ta->sel_fstyle.foreground = selected_text; + ta->sel_fstyle.background = selected_bg; +} + /* exported interface, documented in textarea.h */ struct textarea *textarea_create(const textarea_flags flags, @@ -1861,11 +1886,10 @@ struct textarea *textarea_create(const textarea_flags flags, ret->border_width = setup->border_width; ret->border_col = setup->border_col; - ret->fstyle = setup->text; - - ret->sel_fstyle = setup->text; - ret->sel_fstyle.foreground = setup->selected_text; - ret->sel_fstyle.background = setup->selected_bg; + textarea_set_text_style(ret, + &setup->text, + setup->selected_text, + setup->selected_bg); ret->scroll_x = 0; ret->scroll_y = 0; @@ -3220,8 +3244,12 @@ void textarea_set_dimensions(struct textarea *ta, int width, int height) /* exported interface, documented in textarea.h */ -void textarea_set_layout(struct textarea *ta, int width, int height, - int top, int right, int bottom, int left) +void textarea_set_layout( + struct textarea *ta, + const plot_font_style_t *fstyle, + int width, int height, + int top, int right, + int bottom, int left) { struct rect r = {0, 0, 0, 0}; @@ -3232,6 +3260,10 @@ void textarea_set_layout(struct textarea *ta, int width, int height, ta->pad_bottom = bottom + ((ta->bar_x == NULL) ? 0 : SCROLLBAR_WIDTH); ta->pad_left = left; + textarea_set_text_style(ta, fstyle, + ta->sel_fstyle.foreground, + ta->sel_fstyle.background); + textarea_setup_text_offsets(ta); if (ta->flags & TEXTAREA_MULTILINE) { diff --git a/desktop/textarea.h b/desktop/textarea.h index b386e50e8..82e0de95b 100644 --- a/desktop/textarea.h +++ b/desktop/textarea.h @@ -329,8 +329,12 @@ void textarea_set_dimensions(struct textarea *ta, int width, int height); * \param bottom the new bottom padding of the textarea * \param left the new left padding of the textarea */ -void textarea_set_layout(struct textarea *ta, int width, int height, - int top, int right, int bottom, int left); +void textarea_set_layout( + struct textarea *ta, + const plot_font_style_t *fstyle, + int width, int height, + int top, int right, + int bottom, int left); /** -- cgit v1.2.3