array to ExtTextOut:
- move it inside the new big loop (this should fix a potential bug
whereby the DBCS handling altered some elements of it but the loop
did not actually step along it)
- initialise it more sensibly
- rename it to lpDx rather than IpDx, since as far as I can tell the
latter name was derived from a misreading of the former in the
Windows API docs.
git-svn-id: http://svn.tartarus.org/sgt/putty@9066
cda61777-01e9-0310-a592-
d414129be87e
int text_adjust = 0;
int xoffset = 0;
int maxlen, remaining, opaque;
int text_adjust = 0;
int xoffset = 0;
int maxlen, remaining, opaque;
- static int *IpDx = 0, IpDxLEN = 0;
- int *IpDxReal;
+ static int *lpDx = NULL;
+ static int lpDx_len = 0;
+ int *lpDx_maybe;
if (attr & ATTR_WIDE)
char_width *= 2;
if (attr & ATTR_WIDE)
char_width *= 2;
- if (len > IpDxLEN || IpDx[0] != char_width) {
- int i;
- if (len > IpDxLEN) {
- sfree(IpDx);
- IpDx = snewn(len + 16, int);
- IpDxLEN = (len + 16);
- }
- for (i = 0; i < IpDxLEN; i++)
- IpDx[i] = char_width;
- }
-
/* Only want the left half of double width lines */
if (lattr != LATTR_NORM && x*2 >= term->cols)
return;
/* Only want the left half of double width lines */
if (lattr != LATTR_NORM && x*2 >= term->cols)
return;
* If we're using a variable-pitch font, we unconditionally
* draw the glyphs one at a time and centre them in their
* character cells (which means in particular that we must
* If we're using a variable-pitch font, we unconditionally
* draw the glyphs one at a time and centre them in their
* character cells (which means in particular that we must
- * disable the IpDx mechanism). This gives slightly odd but
+ * disable the lpDx mechanism). This gives slightly odd but
* generally reasonable results.
*/
xoffset = char_width / 2;
SetTextAlign(hdc, TA_TOP | TA_CENTER | TA_NOUPDATECP);
* generally reasonable results.
*/
xoffset = char_width / 2;
SetTextAlign(hdc, TA_TOP | TA_CENTER | TA_NOUPDATECP);
*/
xoffset = 0;
SetTextAlign(hdc, TA_TOP | TA_LEFT | TA_NOUPDATECP);
*/
xoffset = 0;
SetTextAlign(hdc, TA_TOP | TA_LEFT | TA_NOUPDATECP);
text += len, remaining -= len, x += char_width * len) {
len = (maxlen < remaining ? maxlen : remaining);
text += len, remaining -= len, x += char_width * len) {
len = (maxlen < remaining ? maxlen : remaining);
+ if (len > lpDx_len) {
+ if (len > lpDx_len) {
+ lpDx_len = len * 9 / 8 + 16;
+ lpDx = sresize(lpDx, lpDx_len, int);
+ }
+ }
+ {
+ int i;
+ for (i = 0; i < len; i++)
+ lpDx[i] = char_width;
+ }
+
/* We're using a private area for direct to font. (512 chars.) */
if (ucsdata.dbcs_screenfont && (text[0] & CSET_MASK) == CSET_ACP) {
/* Ho Hum, dbcs fonts are a PITA! */
/* We're using a private area for direct to font. (512 chars.) */
if (ucsdata.dbcs_screenfont && (text[0] & CSET_MASK) == CSET_ACP) {
/* Ho Hum, dbcs fonts are a PITA! */
char dbcstext[2];
dbcstext[0] = text[mptr] & 0xFF;
dbcstext[1] = text[mptr+1] & 0xFF;
char dbcstext[2];
dbcstext[0] = text[mptr] & 0xFF;
dbcstext[1] = text[mptr+1] & 0xFF;
- IpDx[nlen] += char_width;
+ lpDx[nlen] += char_width;
MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS,
dbcstext, 2, uni_buf+nlen, 1);
mptr++;
MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS,
dbcstext, 2, uni_buf+nlen, 1);
mptr++;
y - font_height * (lattr == LATTR_BOT) + text_adjust,
ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0),
&line_box, uni_buf, nlen,
y - font_height * (lattr == LATTR_BOT) + text_adjust,
ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0),
&line_box, uni_buf, nlen,
if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) {
SetBkMode(hdc, TRANSPARENT);
ExtTextOutW(hdc, x + xoffset - 1,
y - font_height * (lattr ==
LATTR_BOT) + text_adjust,
if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) {
SetBkMode(hdc, TRANSPARENT);
ExtTextOutW(hdc, x + xoffset - 1,
y - font_height * (lattr ==
LATTR_BOT) + text_adjust,
- ETO_CLIPPED, &line_box, uni_buf, nlen, IpDxReal);
+ ETO_CLIPPED, &line_box, uni_buf, nlen, lpDx_maybe);
} else if (DIRECT_FONT(text[0])) {
static char *directbuf = NULL;
static int directlen = 0;
} else if (DIRECT_FONT(text[0])) {
static char *directbuf = NULL;
static int directlen = 0;
ExtTextOut(hdc, x + xoffset,
y - font_height * (lattr == LATTR_BOT) + text_adjust,
ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0),
ExtTextOut(hdc, x + xoffset,
y - font_height * (lattr == LATTR_BOT) + text_adjust,
ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0),
- &line_box, directbuf, len, IpDxReal);
+ &line_box, directbuf, len, lpDx_maybe);
if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) {
SetBkMode(hdc, TRANSPARENT);
if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) {
SetBkMode(hdc, TRANSPARENT);
ExtTextOut(hdc, x + xoffset - 1,
y - font_height * (lattr ==
LATTR_BOT) + text_adjust,
ExtTextOut(hdc, x + xoffset - 1,
y - font_height * (lattr ==
LATTR_BOT) + text_adjust,
- ETO_CLIPPED, &line_box, directbuf, len, IpDxReal);
+ ETO_CLIPPED, &line_box, directbuf, len, lpDx_maybe);
}
} else {
/* And 'normal' unicode characters */
}
} else {
/* And 'normal' unicode characters */
/* print Glyphs as they are, without Windows' Shaping*/
general_textout(hdc, x + xoffset,
y - font_height * (lattr==LATTR_BOT) + text_adjust,
/* print Glyphs as they are, without Windows' Shaping*/
general_textout(hdc, x + xoffset,
y - font_height * (lattr==LATTR_BOT) + text_adjust,
- &line_box, wbuf, len, IpDx,
+ &line_box, wbuf, len, lpDx,
opaque && !(attr & TATTR_COMBINING));
/* And the shadow bold hack. */
opaque && !(attr & TATTR_COMBINING));
/* And the shadow bold hack. */
ExtTextOutW(hdc, x + xoffset - 1,
y - font_height * (lattr ==
LATTR_BOT) + text_adjust,
ExtTextOutW(hdc, x + xoffset - 1,
y - font_height * (lattr ==
LATTR_BOT) + text_adjust,
- ETO_CLIPPED, &line_box, wbuf, len, IpDxReal);
+ ETO_CLIPPED, &line_box, wbuf, len, lpDx_maybe);