mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +00:00
Store line widths in the bidi cache, so we don't fail to re-bidi a
line when the window size changes. [originally from svn r4631]
This commit is contained in:
parent
0d05595db9
commit
6b136f5c2f
36
terminal.c
36
terminal.c
@ -1294,8 +1294,8 @@ void term_free(Terminal *term)
|
|||||||
sfree(term->wcTo);
|
sfree(term->wcTo);
|
||||||
|
|
||||||
for (i = 0; i < term->bidi_cache_size; i++) {
|
for (i = 0; i < term->bidi_cache_size; i++) {
|
||||||
sfree(term->pre_bidi_cache[i]);
|
sfree(term->pre_bidi_cache[i].chars);
|
||||||
sfree(term->post_bidi_cache[i]);
|
sfree(term->post_bidi_cache[i].chars);
|
||||||
}
|
}
|
||||||
sfree(term->pre_bidi_cache);
|
sfree(term->pre_bidi_cache);
|
||||||
sfree(term->post_bidi_cache);
|
sfree(term->post_bidi_cache);
|
||||||
@ -4161,11 +4161,14 @@ static int term_bidi_cache_hit(Terminal *term, int line,
|
|||||||
if (line >= term->bidi_cache_size)
|
if (line >= term->bidi_cache_size)
|
||||||
return FALSE; /* cache doesn't have this many lines */
|
return FALSE; /* cache doesn't have this many lines */
|
||||||
|
|
||||||
if (!term->pre_bidi_cache[line])
|
if (!term->pre_bidi_cache[line].chars)
|
||||||
return FALSE; /* cache doesn't contain _this_ line */
|
return FALSE; /* cache doesn't contain _this_ line */
|
||||||
|
|
||||||
|
if (term->pre_bidi_cache[line].width != width)
|
||||||
|
return FALSE; /* line is wrong width */
|
||||||
|
|
||||||
for (i = 0; i < width; i++)
|
for (i = 0; i < width; i++)
|
||||||
if (!termchars_equal(term->pre_bidi_cache[line] + i, lbefore + i))
|
if (!termchars_equal(term->pre_bidi_cache[line].chars+i, lbefore+i))
|
||||||
return FALSE; /* line doesn't match cache */
|
return FALSE; /* line doesn't match cache */
|
||||||
|
|
||||||
return TRUE; /* it didn't match. */
|
return TRUE; /* it didn't match. */
|
||||||
@ -4179,24 +4182,29 @@ static void term_bidi_cache_store(Terminal *term, int line, termchar *lbefore,
|
|||||||
term->bidi_cache_size = line+1;
|
term->bidi_cache_size = line+1;
|
||||||
term->pre_bidi_cache = sresize(term->pre_bidi_cache,
|
term->pre_bidi_cache = sresize(term->pre_bidi_cache,
|
||||||
term->bidi_cache_size,
|
term->bidi_cache_size,
|
||||||
termchar *);
|
struct bidi_cache_entry);
|
||||||
term->post_bidi_cache = sresize(term->post_bidi_cache,
|
term->post_bidi_cache = sresize(term->post_bidi_cache,
|
||||||
term->bidi_cache_size,
|
term->bidi_cache_size,
|
||||||
termchar *);
|
struct bidi_cache_entry);
|
||||||
while (j < term->bidi_cache_size) {
|
while (j < term->bidi_cache_size) {
|
||||||
term->pre_bidi_cache[j] = term->post_bidi_cache[j] = NULL;
|
term->pre_bidi_cache[j].chars =
|
||||||
|
term->post_bidi_cache[j].chars = NULL;
|
||||||
|
term->pre_bidi_cache[j].width =
|
||||||
|
term->post_bidi_cache[j].width = -1;
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sfree(term->pre_bidi_cache[line]);
|
sfree(term->pre_bidi_cache[line].chars);
|
||||||
sfree(term->post_bidi_cache[line]);
|
sfree(term->post_bidi_cache[line].chars);
|
||||||
|
|
||||||
term->pre_bidi_cache[line] = snewn(width, termchar);
|
term->pre_bidi_cache[line].width = width;
|
||||||
term->post_bidi_cache[line] = snewn(width, termchar);
|
term->pre_bidi_cache[line].chars = snewn(width, termchar);
|
||||||
|
term->post_bidi_cache[line].width = width;
|
||||||
|
term->post_bidi_cache[line].chars = snewn(width, termchar);
|
||||||
|
|
||||||
memcpy(term->pre_bidi_cache[line], lbefore, width * TSIZE);
|
memcpy(term->pre_bidi_cache[line].chars, lbefore, width * TSIZE);
|
||||||
memcpy(term->post_bidi_cache[line], lafter, width * TSIZE);
|
memcpy(term->post_bidi_cache[line].chars, lafter, width * TSIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -4399,7 +4407,7 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
|
|||||||
|
|
||||||
lchars = term->ltemp;
|
lchars = term->ltemp;
|
||||||
} else {
|
} else {
|
||||||
lchars = term->post_bidi_cache[i];
|
lchars = term->post_bidi_cache[i].chars;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
lchars = ldata->chars;
|
lchars = ldata->chars;
|
||||||
|
@ -65,6 +65,11 @@ struct termline {
|
|||||||
struct termchar *chars;
|
struct termchar *chars;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct bidi_cache_entry {
|
||||||
|
int width;
|
||||||
|
struct termchar *chars;
|
||||||
|
};
|
||||||
|
|
||||||
struct terminal_tag {
|
struct terminal_tag {
|
||||||
|
|
||||||
int compatibility_level;
|
int compatibility_level;
|
||||||
@ -247,7 +252,7 @@ struct terminal_tag {
|
|||||||
int ltemp_size;
|
int ltemp_size;
|
||||||
bidi_char *wcFrom, *wcTo;
|
bidi_char *wcFrom, *wcTo;
|
||||||
int wcFromTo_size;
|
int wcFromTo_size;
|
||||||
termchar **pre_bidi_cache, **post_bidi_cache;
|
struct bidi_cache_entry *pre_bidi_cache, *post_bidi_cache;
|
||||||
int bidi_cache_size;
|
int bidi_cache_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user