summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2013-03-25 12:37:18 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2013-03-25 12:37:18 +0000
commit53962009da5eb95a7c3146cdcce59c588d9bf3ce (patch)
tree25305aa972f6fb3c0999eedf26ae1f19215380f0
parentcc4411c0c7452968349725bf1edbcd1731422180 (diff)
downloadnetsurf-53962009da5eb95a7c3146cdcce59c588d9bf3ce.tar.gz
netsurf-53962009da5eb95a7c3146cdcce59c588d9bf3ce.tar.bz2
Trivial redraw optimisation for multiline textareas. Only redraw the line that was changed and below.
-rw-r--r--desktop/textarea.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/desktop/textarea.c b/desktop/textarea.c
index 81af9f888..e614cc435 100644
--- a/desktop/textarea.c
+++ b/desktop/textarea.c
@@ -861,7 +861,8 @@ static bool textarea_reflow_singleline(struct textarea *ta, size_t b_off,
* \param b_start 0-based byte offset in ta->text to start of modification
* \return true on success false otherwise
*/
-static bool textarea_reflow_multiline(struct textarea *ta, size_t b_start)
+static bool textarea_reflow_multiline(struct textarea *ta, const size_t b_start,
+ struct rect *r)
{
char *text;
unsigned int len;
@@ -907,9 +908,9 @@ static bool textarea_reflow_multiline(struct textarea *ta, size_t b_start)
do {
/* Set line count to start point */
if (restart)
- line = 0;
- else
- line = start;
+ start = 0;
+
+ line = start;
/* Find available width */
avail_width = ta->vis_width - 2 * ta->border_width -
@@ -1098,6 +1099,14 @@ static bool textarea_reflow_multiline(struct textarea *ta, size_t b_start)
ta->v_extent = v_extent;
ta->line_count = line;
+ /* Don't need to redraw above changes, so update redraw request rect*/
+ if (ta->lines[start].b_start + ta->lines[start].b_length < b_start &&
+ restart == false)
+ /* Start line is unchanged */
+ start++;
+ r->y0 = max(r->y0, (signed)(ta->line_height * start +
+ ta->text_y_offset - ta->scroll_y));
+
return true;
}
@@ -1249,7 +1258,7 @@ static bool textarea_insert_text(struct textarea *ta, const char *text,
/* See to reflow */
if (ta->flags & TEXTAREA_MULTILINE) {
- if (!textarea_reflow_multiline(ta, show_b_off))
+ if (!textarea_reflow_multiline(ta, show_b_off, r))
return false;
} else {
if (!textarea_reflow_singleline(ta, show_b_off, r))
@@ -1401,7 +1410,7 @@ static bool textarea_replace_text(struct textarea *ta, size_t b_start,
/* See to reflow */
if (ta->flags & TEXTAREA_MULTILINE) {
- if (!textarea_reflow_multiline(ta, b_start))
+ if (!textarea_reflow_multiline(ta, b_start, r))
return false;
} else {
if (!textarea_reflow_singleline(ta, show_b_off, r))
@@ -1606,7 +1615,7 @@ struct textarea *textarea_create(const textarea_flags flags,
textarea_setup_text_offsets(ret);
if (flags & TEXTAREA_MULTILINE)
- textarea_reflow_multiline(ret, 0);
+ textarea_reflow_multiline(ret, 0, &r);
else
textarea_reflow_singleline(ret, 0, &r);
@@ -1654,7 +1663,7 @@ bool textarea_set_text(struct textarea *ta, const char *text)
textarea_normalise_text(ta, 0, len);
if (ta->flags & TEXTAREA_MULTILINE) {
- if (!textarea_reflow_multiline(ta, 0))
+ if (!textarea_reflow_multiline(ta, 0, &r))
return false;
} else {
if (!textarea_reflow_singleline(ta, 0, &r))
@@ -2810,7 +2819,7 @@ void textarea_set_dimensions(struct textarea *ta, int width, int height)
textarea_setup_text_offsets(ta);
if (ta->flags & TEXTAREA_MULTILINE) {
- textarea_reflow_multiline(ta, 0);
+ textarea_reflow_multiline(ta, 0, &r);
} else {
textarea_reflow_singleline(ta, 0, &r);
}
@@ -2833,7 +2842,7 @@ void textarea_set_layout(struct textarea *ta, int width, int height,
textarea_setup_text_offsets(ta);
if (ta->flags & TEXTAREA_MULTILINE) {
- textarea_reflow_multiline(ta, 0);
+ textarea_reflow_multiline(ta, 0, &r);
} else {
textarea_reflow_singleline(ta, 0, &r);
}