mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 09:58:01 +00:00
At last! After much delay, much faffing back and forth, and much
enhancement and fiddling, I have now massaged Arabeyes' first patch into a form I'm happy to check in. Phew. [originally from svn r4236]
This commit is contained in:
parent
fdcdecace9
commit
fb7dd5a255
11
Recipe
11
Recipe
@ -166,13 +166,16 @@ install-strip:
|
|||||||
# names. A line beginning `+' is assumed to continue the previous
|
# names. A line beginning `+' is assumed to continue the previous
|
||||||
# line.
|
# line.
|
||||||
|
|
||||||
|
# Terminal emulator and its (platform-independent) dependencies.
|
||||||
|
TERMINAL = terminal wcwidth ldiscucs logging tree234 minibidi
|
||||||
|
+ config dialog
|
||||||
|
|
||||||
# GUI front end and terminal emulator (putty, puttytel).
|
# GUI front end and terminal emulator (putty, puttytel).
|
||||||
GUITERM = window windlg winctrls terminal sizetip wcwidth unicode ldiscucs
|
GUITERM = TERMINAL window windlg winctrls sizetip unicode printing
|
||||||
+ logging printing winutils dialog config wincfg tree234
|
+ winutils wincfg
|
||||||
|
|
||||||
# Same thing on Unix.
|
# Same thing on Unix.
|
||||||
UXTERM = pterm config uxcfg dialog gtkdlg gtkcols gtkpanel tree234
|
UXTERM = TERMINAL pterm uxcfg gtkdlg gtkcols gtkpanel uxucs uxprint xkeysym
|
||||||
+ terminal wcwidth uxucs ldiscucs logging uxprint xkeysym
|
|
||||||
|
|
||||||
# Non-SSH back ends (putty, puttytel, plink).
|
# Non-SSH back ends (putty, puttytel, plink).
|
||||||
NONSSH = telnet raw rlogin ldisc
|
NONSSH = telnet raw rlogin ldisc
|
||||||
|
6
config.c
6
config.c
@ -1037,6 +1037,12 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
|
|||||||
ctrl_checkbox(s, "Disable remote-controlled character set configuration",
|
ctrl_checkbox(s, "Disable remote-controlled character set configuration",
|
||||||
'r', HELPCTX(features_charset), dlg_stdcheckbox_handler,
|
'r', HELPCTX(features_charset), dlg_stdcheckbox_handler,
|
||||||
I(offsetof(Config,no_remote_charset)));
|
I(offsetof(Config,no_remote_charset)));
|
||||||
|
ctrl_checkbox(s, "Disable Arabic text shaping",
|
||||||
|
'l', HELPCTX(no_help), dlg_stdcheckbox_handler,
|
||||||
|
I(offsetof(Config, arabicshaping)));
|
||||||
|
ctrl_checkbox(s, "Disable bidirectional text display",
|
||||||
|
'j', HELPCTX(no_help), dlg_stdcheckbox_handler,
|
||||||
|
I(offsetof(Config, bidi)));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The Window panel.
|
* The Window panel.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
\versionid $Id: config.but,v 1.77 2004/04/24 20:05:03 jacob Exp $
|
\versionid $Id: config.but,v 1.78 2004/05/22 10:36:50 simon Exp $
|
||||||
|
|
||||||
\C{config} Configuring PuTTY
|
\C{config} Configuring PuTTY
|
||||||
|
|
||||||
@ -822,6 +822,47 @@ If you find that accented characters are not showing up the way you
|
|||||||
expect them to, particularly if you're running BitchX, you could try
|
expect them to, particularly if you're running BitchX, you could try
|
||||||
disabling the remote character set configuration commands.
|
disabling the remote character set configuration commands.
|
||||||
|
|
||||||
|
\S{config-features-shaping} Disabling Arabic text shaping
|
||||||
|
|
||||||
|
\cfg{winhelp-topic}{features.arabicshaping}
|
||||||
|
|
||||||
|
PuTTY supports shaping of Arabic text, which means that if your
|
||||||
|
server sends text written in the basic Unicode Arabic alphabet then
|
||||||
|
it will convert it to the correct display forms before printing it
|
||||||
|
on the screen.
|
||||||
|
|
||||||
|
If you are using full-screen software which was not expecting this
|
||||||
|
to happen (especially if you are not an Arabic speaker and you
|
||||||
|
unexpectedly find yourself dealing with Arabic text files in
|
||||||
|
applications which are not Arabic-aware), you might find that the
|
||||||
|
display becomes corrupted. By ticking this box, you can disable
|
||||||
|
Arabic text shaping so that PuTTY displays precisely the characters
|
||||||
|
it is told to display.
|
||||||
|
|
||||||
|
You may also find you need to disable bidirectional text display;
|
||||||
|
see \S{config-features-bidi}.
|
||||||
|
|
||||||
|
\S{config-features-bidi} Disabling bidirectional text display
|
||||||
|
|
||||||
|
\cfg{winhelp-topic}{features.bidi}
|
||||||
|
|
||||||
|
PuTTY supports bidirectional text display, which means that if your
|
||||||
|
server sends text written in a language which is usually displayed
|
||||||
|
from right to left (such as Arabic or Hebrew) then PuTTY will
|
||||||
|
automatically flip it round so that it is displayed in the right
|
||||||
|
direction on the screen.
|
||||||
|
|
||||||
|
If you are using full-screen software which was not expecting this
|
||||||
|
to happen (especially if you are not an Arabic speaker and you
|
||||||
|
unexpectedly find yourself dealing with Arabic text files in
|
||||||
|
applications which are not Arabic-aware), you might find that the
|
||||||
|
display becomes corrupted. By ticking this box, you can disable
|
||||||
|
bidirectional text display, so that PuTTY displays text from left to
|
||||||
|
right in all situations.
|
||||||
|
|
||||||
|
You may also find you need to disable Arabic text shaping;
|
||||||
|
see \S{config-features-arabicshaping}.
|
||||||
|
|
||||||
\H{config-window} The Window panel
|
\H{config-window} The Window panel
|
||||||
|
|
||||||
The Window configuration panel allows you to control aspects of the
|
The Window configuration panel allows you to control aspects of the
|
||||||
|
25
ldisc.c
25
ldisc.c
@ -32,13 +32,20 @@ static int plen(Ldisc ldisc, unsigned char c)
|
|||||||
return 1;
|
return 1;
|
||||||
else if (c < 128)
|
else if (c < 128)
|
||||||
return 2; /* ^x for some x */
|
return 2; /* ^x for some x */
|
||||||
|
else if (in_utf(ldisc->term) && c >= 0xC0)
|
||||||
|
return 1; /* UTF-8 introducer character
|
||||||
|
* (FIXME: combining / wide chars) */
|
||||||
|
else if (in_utf(ldisc->term) && c >= 0x80 && c < 0xC0)
|
||||||
|
return 0; /* UTF-8 followup character */
|
||||||
else
|
else
|
||||||
return 4; /* <XY> for hex XY */
|
return 4; /* <XY> hex representation */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pwrite(Ldisc ldisc, unsigned char c)
|
static void pwrite(Ldisc ldisc, unsigned char c)
|
||||||
{
|
{
|
||||||
if ((c >= 32 && c <= 126) || (c >= 160 && !in_utf(ldisc->term))) {
|
if ((c >= 32 && c <= 126) ||
|
||||||
|
(!in_utf(ldisc->term) && c >= 0xA0) ||
|
||||||
|
(in_utf(ldisc->term) && c >= 0x80)) {
|
||||||
c_write(ldisc, (char *)&c, 1);
|
c_write(ldisc, (char *)&c, 1);
|
||||||
} else if (c < 128) {
|
} else if (c < 128) {
|
||||||
char cc[2];
|
char cc[2];
|
||||||
@ -52,6 +59,14 @@ static void pwrite(Ldisc ldisc, unsigned char c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int char_start(Ldisc ldisc, unsigned char c)
|
||||||
|
{
|
||||||
|
if (in_utf(ldisc->term))
|
||||||
|
return (c < 0x80 || c >= 0xC0);
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static void bsb(Ldisc ldisc, int n)
|
static void bsb(Ldisc ldisc, int n)
|
||||||
{
|
{
|
||||||
while (n--)
|
while (n--)
|
||||||
@ -137,7 +152,9 @@ void ldisc_send(void *handle, char *buf, int len, int interactive)
|
|||||||
c += KCTRL('@');
|
c += KCTRL('@');
|
||||||
switch (ldisc->quotenext ? ' ' : c) {
|
switch (ldisc->quotenext ? ' ' : c) {
|
||||||
/*
|
/*
|
||||||
* ^h/^?: delete one char and output one BSB
|
* ^h/^?: delete, and output BSBs, to return to
|
||||||
|
* last character boundary (in UTF-8 mode this may
|
||||||
|
* be more than one byte)
|
||||||
* ^w: delete, and output BSBs, to return to last
|
* ^w: delete, and output BSBs, to return to last
|
||||||
* space/nonspace boundary
|
* space/nonspace boundary
|
||||||
* ^u: delete, and output BSBs, to return to BOL
|
* ^u: delete, and output BSBs, to return to BOL
|
||||||
@ -153,9 +170,11 @@ void ldisc_send(void *handle, char *buf, int len, int interactive)
|
|||||||
case KCTRL('H'):
|
case KCTRL('H'):
|
||||||
case KCTRL('?'): /* backspace/delete */
|
case KCTRL('?'): /* backspace/delete */
|
||||||
if (ldisc->buflen > 0) {
|
if (ldisc->buflen > 0) {
|
||||||
|
do {
|
||||||
if (ECHOING)
|
if (ECHOING)
|
||||||
bsb(ldisc, plen(ldisc, ldisc->buf[ldisc->buflen - 1]));
|
bsb(ldisc, plen(ldisc, ldisc->buf[ldisc->buflen - 1]));
|
||||||
ldisc->buflen--;
|
ldisc->buflen--;
|
||||||
|
} while (!char_start(ldisc, ldisc->buf[ldisc->buflen]));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CTRL('W'): /* delete word */
|
case CTRL('W'): /* delete word */
|
||||||
|
1788
minibidi.c
Normal file
1788
minibidi.c
Normal file
File diff suppressed because it is too large
Load Diff
456
minibidi.h
Normal file
456
minibidi.h
Normal file
@ -0,0 +1,456 @@
|
|||||||
|
/************************************************************************
|
||||||
|
* $Id: minibidi.h,v 1.1 2004/05/22 10:36:50 simon Exp $
|
||||||
|
*
|
||||||
|
* ------------
|
||||||
|
* Description:
|
||||||
|
* ------------
|
||||||
|
* This is an implemention of Unicode's Bidirectional Algorithm
|
||||||
|
* (known as UAX #9).
|
||||||
|
*
|
||||||
|
* http://www.unicode.org/reports/tr9/
|
||||||
|
*
|
||||||
|
* Author: Ahmad Khalifa
|
||||||
|
*
|
||||||
|
* -----------------
|
||||||
|
* Revision Details: (Updated by Revision Control System)
|
||||||
|
* -----------------
|
||||||
|
* $Date: 2004/05/22 10:36:50 $
|
||||||
|
* $Author: simon $
|
||||||
|
* $Revision: 1.1 $
|
||||||
|
* $Source: /u1/simon/svn-migration/cvs/putty/minibidi.h,v $
|
||||||
|
*
|
||||||
|
* (www.arabeyes.org - under MIT license)
|
||||||
|
*
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO:
|
||||||
|
* =====
|
||||||
|
* - work almost finished
|
||||||
|
* - Shaping Table to be expanded to include the whole range.
|
||||||
|
* - Ligature handling
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h> /* definition of wchar_t*/
|
||||||
|
|
||||||
|
#define LMASK 0x3F /* Embedding Level mask */
|
||||||
|
#define OMASK 0xC0 /* Override mask */
|
||||||
|
#define OISL 0x80 /* Override is L */
|
||||||
|
#define OISR 0x40 /* Override is R */
|
||||||
|
|
||||||
|
/* Shaping Helpers */
|
||||||
|
#define STYPE(xh) (((xh >= SHAPE_FIRST) && (xh <= SHAPE_LAST)) ? \
|
||||||
|
shapetypes[xh-SHAPE_FIRST].type : SU) /*))*/
|
||||||
|
#define SISOLATED(xh) (shapetypes[xh-SHAPE_FIRST].form_b)
|
||||||
|
#define SFINAL(xh) xh+1
|
||||||
|
#define SINITIAL(xh) xh+2
|
||||||
|
#define SMEDIAL(ch) ch+3
|
||||||
|
|
||||||
|
typedef struct bidi_char {
|
||||||
|
wchar_t origwc, wc;
|
||||||
|
unsigned short index;
|
||||||
|
} bidi_char;
|
||||||
|
|
||||||
|
/* function declarations */
|
||||||
|
void flipThisRun(bidi_char *from, unsigned char* level, int max, int count);
|
||||||
|
int findIndexOfRun(unsigned char* level , int start, int count, int tlevel);
|
||||||
|
unsigned char getType(wchar_t ch);
|
||||||
|
unsigned char setOverrideBits(unsigned char level, unsigned char override);
|
||||||
|
unsigned char getPreviousLevel(unsigned char* level, int from);
|
||||||
|
unsigned char leastGreaterOdd(unsigned char x);
|
||||||
|
unsigned char leastGreaterEven(unsigned char x);
|
||||||
|
unsigned char getRLE(wchar_t ch);
|
||||||
|
int do_shape(bidi_char *line, bidi_char *to, int count);
|
||||||
|
int do_bidi(bidi_char *line, int count);
|
||||||
|
void doMirror(wchar_t* ch);
|
||||||
|
|
||||||
|
/* character types */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
L,
|
||||||
|
LRE,
|
||||||
|
LRO,
|
||||||
|
R,
|
||||||
|
AL,
|
||||||
|
RLE,
|
||||||
|
RLO,
|
||||||
|
PDF,
|
||||||
|
EN,
|
||||||
|
ES,
|
||||||
|
ET,
|
||||||
|
AN,
|
||||||
|
CS,
|
||||||
|
NSM,
|
||||||
|
BN,
|
||||||
|
B,
|
||||||
|
S,
|
||||||
|
WS,
|
||||||
|
ON,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Shaping Types */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
SL, /* Left-Joining, doesnt exist in U+0600 - U+06FF */
|
||||||
|
SR, /* Right-Joining, ie has Isolated, Final */
|
||||||
|
SD, /* Dual-Joining, ie has Isolated, Final, Initial, Medial */
|
||||||
|
SU, /* Non-Joining */
|
||||||
|
SC /* Join-Causing, like U+0640 (TATWEEL) */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
char type;
|
||||||
|
wchar_t form_b;
|
||||||
|
} shape_node;
|
||||||
|
|
||||||
|
/* Kept near the actual table, for verification. */
|
||||||
|
#define SHAPE_FIRST 0x621
|
||||||
|
#define SHAPE_LAST 0x64A
|
||||||
|
|
||||||
|
const shape_node shapetypes[] = {
|
||||||
|
/* index, Typ, Iso, Ligature Index*/
|
||||||
|
/* 621 */ {SU, 0xFE80},
|
||||||
|
/* 622 */ {SR, 0xFE81},
|
||||||
|
/* 623 */ {SR, 0xFE83},
|
||||||
|
/* 624 */ {SR, 0xFE85},
|
||||||
|
/* 625 */ {SR, 0xFE87},
|
||||||
|
/* 626 */ {SD, 0xFE89},
|
||||||
|
/* 627 */ {SR, 0xFE8D},
|
||||||
|
/* 628 */ {SD, 0xFE8F},
|
||||||
|
/* 629 */ {SR, 0xFE93},
|
||||||
|
/* 62A */ {SD, 0xFE95},
|
||||||
|
/* 62B */ {SD, 0xFE99},
|
||||||
|
/* 62C */ {SD, 0xFE9D},
|
||||||
|
/* 62D */ {SD, 0xFEA1},
|
||||||
|
/* 62E */ {SD, 0xFEA5},
|
||||||
|
/* 62F */ {SR, 0xFEA9},
|
||||||
|
/* 630 */ {SR, 0xFEAB},
|
||||||
|
/* 631 */ {SR, 0xFEAD},
|
||||||
|
/* 632 */ {SR, 0xFEAF},
|
||||||
|
/* 633 */ {SD, 0xFEB1},
|
||||||
|
/* 634 */ {SD, 0xFEB5},
|
||||||
|
/* 635 */ {SD, 0xFEB9},
|
||||||
|
/* 636 */ {SD, 0xFEBD},
|
||||||
|
/* 637 */ {SD, 0xFEC1},
|
||||||
|
/* 638 */ {SD, 0xFEC5},
|
||||||
|
/* 639 */ {SD, 0xFEC9},
|
||||||
|
/* 63A */ {SD, 0xFECD},
|
||||||
|
/* 63B */ {SU, 0x0},
|
||||||
|
/* 63C */ {SU, 0x0},
|
||||||
|
/* 63D */ {SU, 0x0},
|
||||||
|
/* 63E */ {SU, 0x0},
|
||||||
|
/* 63F */ {SU, 0x0},
|
||||||
|
/* 640 */ {SC, 0x0},
|
||||||
|
/* 641 */ {SD, 0xFED1},
|
||||||
|
/* 642 */ {SD, 0xFED5},
|
||||||
|
/* 643 */ {SD, 0xFED9},
|
||||||
|
/* 644 */ {SD, 0xFEDD},
|
||||||
|
/* 645 */ {SD, 0xFEE1},
|
||||||
|
/* 646 */ {SD, 0xFEE5},
|
||||||
|
/* 647 */ {SD, 0xFEE9},
|
||||||
|
/* 648 */ {SR, 0xFEED},
|
||||||
|
/* 649 */ {SR, 0xFEEF}, /* SD */
|
||||||
|
/* 64A */ {SD, 0xFEF1},
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This describes the data byte and its frequency
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char f;
|
||||||
|
unsigned char d;
|
||||||
|
}RLENode;
|
||||||
|
|
||||||
|
|
||||||
|
/* This is an array of RLENodes, which is the
|
||||||
|
* Compressed unicode types table
|
||||||
|
*/
|
||||||
|
const unsigned char RLE_table[] =
|
||||||
|
{
|
||||||
|
0x09, 0x10, 0x01, 0x0F, 0x01, 0x10, 0x01, 0x11,
|
||||||
|
0x01, 0x0F, 0x01, 0x0E, 0x0E, 0x0F, 0x03, 0x10,
|
||||||
|
0x01, 0x11, 0x01, 0x12, 0x02, 0x0A, 0x03, 0x12,
|
||||||
|
0x05, 0x0A, 0x01, 0x0C, 0x01, 0x0A, 0x01, 0x0C,
|
||||||
|
0x01, 0x09, 0x01, 0x08, 0x0A, 0x0C, 0x01, 0x12,
|
||||||
|
0x06, 0x00, 0x1A, 0x12, 0x06, 0x00, 0x1A, 0x12,
|
||||||
|
0x04, 0x0E, 0x06, 0x0F, 0x01, 0x0E, 0x1A, 0x0C,
|
||||||
|
0x01, 0x12, 0x01, 0x0A, 0x04, 0x12, 0x04, 0x00,
|
||||||
|
0x01, 0x12, 0x05, 0x0A, 0x02, 0x08, 0x02, 0x12,
|
||||||
|
0x01, 0x00, 0x01, 0x12, 0x03, 0x08, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x05, 0x00, 0x17, 0x12, 0x01, 0x00,
|
||||||
|
0x1F, 0x12, 0x01, 0x00, 0xFF, 0x00, 0x2A, 0x12,
|
||||||
|
0x01, 0x00, 0x12, 0x12, 0x1C, 0x00, 0x5E, 0x12,
|
||||||
|
0x02, 0x00, 0x09, 0x12, 0x02, 0x00, 0x07, 0x12,
|
||||||
|
0x0E, 0x00, 0x02, 0x12, 0x0E, 0x00, 0x05, 0x12,
|
||||||
|
0x09, 0x00, 0x01, 0x12, 0x11, 0x0D, 0x50, 0x12,
|
||||||
|
0x10, 0x0D, 0x10, 0x12, 0x0A, 0x00, 0x01, 0x12,
|
||||||
|
0x0B, 0x00, 0x01, 0x12, 0x01, 0x00, 0x03, 0x12,
|
||||||
|
0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x14, 0x12,
|
||||||
|
0x01, 0x00, 0x2C, 0x12, 0x01, 0x00, 0x26, 0x12,
|
||||||
|
0x0A, 0x00, 0x83, 0x0D, 0x04, 0x12, 0x01, 0x0D,
|
||||||
|
0x02, 0x00, 0x45, 0x12, 0x01, 0x00, 0x26, 0x12,
|
||||||
|
0x02, 0x00, 0x02, 0x12, 0x06, 0x00, 0x10, 0x12,
|
||||||
|
0x21, 0x00, 0x26, 0x12, 0x02, 0x00, 0x07, 0x12,
|
||||||
|
0x01, 0x00, 0x27, 0x12, 0x01, 0x00, 0x01, 0x12,
|
||||||
|
0x07, 0x0D, 0x11, 0x12, 0x01, 0x0D, 0x17, 0x12,
|
||||||
|
0x01, 0x0D, 0x03, 0x03, 0x01, 0x0D, 0x01, 0x03,
|
||||||
|
0x01, 0x0D, 0x02, 0x03, 0x01, 0x0D, 0x01, 0x12,
|
||||||
|
0x0B, 0x03, 0x1B, 0x12, 0x05, 0x03, 0x05, 0x12,
|
||||||
|
0x17, 0x0C, 0x01, 0x12, 0x0E, 0x04, 0x01, 0x12,
|
||||||
|
0x03, 0x04, 0x01, 0x12, 0x01, 0x04, 0x1A, 0x12,
|
||||||
|
0x05, 0x04, 0x0B, 0x0D, 0x0B, 0x12, 0x0A, 0x0B,
|
||||||
|
0x0A, 0x0A, 0x01, 0x0B, 0x02, 0x04, 0x03, 0x0D,
|
||||||
|
0x01, 0x04, 0x65, 0x0D, 0x07, 0x04, 0x01, 0x0D,
|
||||||
|
0x07, 0x04, 0x02, 0x0D, 0x02, 0x12, 0x01, 0x0D,
|
||||||
|
0x04, 0x12, 0x02, 0x08, 0x0A, 0x04, 0x05, 0x12,
|
||||||
|
0x01, 0x04, 0x0E, 0x12, 0x01, 0x0E, 0x01, 0x04,
|
||||||
|
0x01, 0x0D, 0x01, 0x04, 0x1B, 0x12, 0x03, 0x0D,
|
||||||
|
0x1B, 0x12, 0x35, 0x04, 0x26, 0x0D, 0x0B, 0x04,
|
||||||
|
0x01, 0x12, 0xFF, 0x12, 0x50, 0x0D, 0x02, 0x00,
|
||||||
|
0x01, 0x12, 0x01, 0x00, 0x35, 0x12, 0x02, 0x0D,
|
||||||
|
0x01, 0x00, 0x04, 0x0D, 0x08, 0x00, 0x04, 0x0D,
|
||||||
|
0x01, 0x12, 0x02, 0x00, 0x01, 0x0D, 0x04, 0x12,
|
||||||
|
0x03, 0x00, 0x0A, 0x0D, 0x02, 0x00, 0x0D, 0x12,
|
||||||
|
0x10, 0x0D, 0x01, 0x00, 0x02, 0x12, 0x01, 0x00,
|
||||||
|
0x08, 0x12, 0x02, 0x00, 0x02, 0x12, 0x02, 0x00,
|
||||||
|
0x16, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x03, 0x00, 0x04, 0x12, 0x02, 0x0D,
|
||||||
|
0x01, 0x12, 0x01, 0x00, 0x03, 0x0D, 0x04, 0x12,
|
||||||
|
0x02, 0x00, 0x02, 0x12, 0x02, 0x00, 0x02, 0x0D,
|
||||||
|
0x01, 0x12, 0x09, 0x00, 0x01, 0x12, 0x04, 0x00,
|
||||||
|
0x02, 0x12, 0x01, 0x00, 0x03, 0x0D, 0x02, 0x12,
|
||||||
|
0x02, 0x00, 0x0C, 0x0A, 0x02, 0x00, 0x07, 0x12,
|
||||||
|
0x07, 0x0D, 0x01, 0x12, 0x02, 0x00, 0x06, 0x12,
|
||||||
|
0x04, 0x00, 0x02, 0x12, 0x02, 0x00, 0x16, 0x12,
|
||||||
|
0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x02, 0x12,
|
||||||
|
0x01, 0x00, 0x02, 0x12, 0x01, 0x00, 0x02, 0x12,
|
||||||
|
0x02, 0x0D, 0x01, 0x12, 0x01, 0x00, 0x03, 0x0D,
|
||||||
|
0x02, 0x12, 0x04, 0x0D, 0x02, 0x12, 0x02, 0x0D,
|
||||||
|
0x03, 0x12, 0x0B, 0x00, 0x04, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x07, 0x00, 0x0A, 0x0D, 0x02, 0x00,
|
||||||
|
0x03, 0x12, 0x0C, 0x0D, 0x02, 0x00, 0x01, 0x12,
|
||||||
|
0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x01, 0x12,
|
||||||
|
0x01, 0x00, 0x03, 0x12, 0x01, 0x00, 0x16, 0x12,
|
||||||
|
0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x02, 0x12,
|
||||||
|
0x01, 0x00, 0x05, 0x12, 0x02, 0x0D, 0x01, 0x00,
|
||||||
|
0x04, 0x0D, 0x05, 0x12, 0x01, 0x0D, 0x02, 0x00,
|
||||||
|
0x01, 0x12, 0x01, 0x00, 0x02, 0x0D, 0x01, 0x12,
|
||||||
|
0x02, 0x00, 0x01, 0x12, 0x0F, 0x00, 0x01, 0x12,
|
||||||
|
0x05, 0x00, 0x0A, 0x12, 0x11, 0x0D, 0x01, 0x00,
|
||||||
|
0x02, 0x12, 0x01, 0x00, 0x08, 0x12, 0x02, 0x00,
|
||||||
|
0x02, 0x12, 0x02, 0x00, 0x16, 0x12, 0x01, 0x00,
|
||||||
|
0x07, 0x12, 0x01, 0x00, 0x02, 0x12, 0x02, 0x00,
|
||||||
|
0x04, 0x12, 0x02, 0x0D, 0x01, 0x00, 0x02, 0x0D,
|
||||||
|
0x01, 0x00, 0x01, 0x0D, 0x03, 0x12, 0x03, 0x00,
|
||||||
|
0x02, 0x12, 0x02, 0x00, 0x02, 0x0D, 0x01, 0x12,
|
||||||
|
0x08, 0x0D, 0x01, 0x00, 0x01, 0x12, 0x04, 0x00,
|
||||||
|
0x02, 0x12, 0x01, 0x00, 0x03, 0x12, 0x04, 0x00,
|
||||||
|
0x0B, 0x12, 0x11, 0x0D, 0x01, 0x00, 0x01, 0x12,
|
||||||
|
0x01, 0x00, 0x06, 0x12, 0x03, 0x00, 0x03, 0x12,
|
||||||
|
0x01, 0x00, 0x04, 0x12, 0x03, 0x00, 0x02, 0x12,
|
||||||
|
0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x02, 0x12,
|
||||||
|
0x03, 0x00, 0x02, 0x12, 0x03, 0x00, 0x03, 0x12,
|
||||||
|
0x03, 0x00, 0x08, 0x12, 0x01, 0x00, 0x03, 0x12,
|
||||||
|
0x04, 0x00, 0x02, 0x0D, 0x01, 0x00, 0x02, 0x12,
|
||||||
|
0x03, 0x00, 0x03, 0x12, 0x01, 0x00, 0x03, 0x0D,
|
||||||
|
0x01, 0x12, 0x09, 0x00, 0x01, 0x12, 0x0F, 0x00,
|
||||||
|
0x0C, 0x12, 0x0E, 0x00, 0x03, 0x12, 0x01, 0x00,
|
||||||
|
0x08, 0x12, 0x01, 0x00, 0x03, 0x12, 0x01, 0x00,
|
||||||
|
0x17, 0x12, 0x01, 0x00, 0x0A, 0x12, 0x01, 0x00,
|
||||||
|
0x05, 0x12, 0x04, 0x0D, 0x03, 0x00, 0x04, 0x12,
|
||||||
|
0x01, 0x0D, 0x03, 0x12, 0x01, 0x0D, 0x04, 0x12,
|
||||||
|
0x07, 0x0D, 0x02, 0x12, 0x09, 0x00, 0x02, 0x12,
|
||||||
|
0x04, 0x00, 0x0A, 0x12, 0x12, 0x00, 0x02, 0x12,
|
||||||
|
0x01, 0x00, 0x08, 0x12, 0x01, 0x00, 0x03, 0x12,
|
||||||
|
0x01, 0x00, 0x17, 0x12, 0x01, 0x00, 0x0A, 0x12,
|
||||||
|
0x01, 0x00, 0x05, 0x12, 0x04, 0x00, 0x01, 0x0D,
|
||||||
|
0x01, 0x00, 0x05, 0x12, 0x01, 0x0D, 0x01, 0x00,
|
||||||
|
0x02, 0x12, 0x01, 0x00, 0x02, 0x0D, 0x02, 0x12,
|
||||||
|
0x07, 0x00, 0x02, 0x12, 0x07, 0x00, 0x01, 0x12,
|
||||||
|
0x01, 0x00, 0x02, 0x12, 0x04, 0x00, 0x0A, 0x12,
|
||||||
|
0x12, 0x00, 0x02, 0x12, 0x01, 0x00, 0x08, 0x12,
|
||||||
|
0x01, 0x00, 0x03, 0x12, 0x01, 0x00, 0x17, 0x12,
|
||||||
|
0x01, 0x00, 0x10, 0x12, 0x04, 0x00, 0x03, 0x0D,
|
||||||
|
0x03, 0x12, 0x02, 0x00, 0x03, 0x12, 0x01, 0x00,
|
||||||
|
0x03, 0x0D, 0x01, 0x12, 0x09, 0x00, 0x01, 0x12,
|
||||||
|
0x08, 0x00, 0x02, 0x12, 0x04, 0x00, 0x0A, 0x12,
|
||||||
|
0x12, 0x00, 0x02, 0x12, 0x01, 0x00, 0x12, 0x12,
|
||||||
|
0x03, 0x00, 0x18, 0x12, 0x01, 0x00, 0x09, 0x12,
|
||||||
|
0x01, 0x00, 0x01, 0x12, 0x02, 0x00, 0x07, 0x12,
|
||||||
|
0x03, 0x0D, 0x01, 0x12, 0x04, 0x00, 0x03, 0x0D,
|
||||||
|
0x03, 0x12, 0x01, 0x0D, 0x01, 0x12, 0x01, 0x00,
|
||||||
|
0x08, 0x12, 0x12, 0x00, 0x03, 0x12, 0x0C, 0x00,
|
||||||
|
0x30, 0x0D, 0x01, 0x00, 0x02, 0x0D, 0x07, 0x12,
|
||||||
|
0x04, 0x0A, 0x01, 0x00, 0x07, 0x0D, 0x08, 0x00,
|
||||||
|
0x0D, 0x12, 0x25, 0x00, 0x02, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x02, 0x00, 0x02, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x02, 0x00, 0x01, 0x12, 0x06, 0x00,
|
||||||
|
0x04, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00,
|
||||||
|
0x03, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x02, 0x00, 0x02, 0x12, 0x01, 0x00,
|
||||||
|
0x04, 0x0D, 0x01, 0x00, 0x02, 0x0D, 0x06, 0x12,
|
||||||
|
0x01, 0x0D, 0x02, 0x00, 0x01, 0x12, 0x02, 0x00,
|
||||||
|
0x05, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x0D,
|
||||||
|
0x06, 0x12, 0x02, 0x00, 0x0A, 0x12, 0x02, 0x00,
|
||||||
|
0x02, 0x12, 0x22, 0x00, 0x18, 0x0D, 0x02, 0x00,
|
||||||
|
0x1B, 0x0D, 0x01, 0x00, 0x01, 0x0D, 0x01, 0x00,
|
||||||
|
0x01, 0x0D, 0x01, 0x12, 0x04, 0x00, 0x0A, 0x12,
|
||||||
|
0x01, 0x00, 0x22, 0x12, 0x06, 0x0D, 0x0E, 0x00,
|
||||||
|
0x01, 0x0D, 0x05, 0x00, 0x01, 0x0D, 0x02, 0x00,
|
||||||
|
0x04, 0x12, 0x04, 0x0D, 0x08, 0x12, 0x01, 0x0D,
|
||||||
|
0x24, 0x12, 0x01, 0x00, 0x08, 0x0D, 0x01, 0x00,
|
||||||
|
0x06, 0x12, 0x02, 0x00, 0x01, 0x12, 0x30, 0x00,
|
||||||
|
0x22, 0x12, 0x01, 0x00, 0x05, 0x12, 0x01, 0x00,
|
||||||
|
0x02, 0x12, 0x01, 0x00, 0x01, 0x0D, 0x04, 0x00,
|
||||||
|
0x01, 0x0D, 0x01, 0x12, 0x03, 0x0D, 0x02, 0x00,
|
||||||
|
0x01, 0x0D, 0x01, 0x12, 0x06, 0x00, 0x18, 0x0D,
|
||||||
|
0x02, 0x12, 0x46, 0x00, 0x26, 0x12, 0x0A, 0x00,
|
||||||
|
0x29, 0x12, 0x02, 0x00, 0x01, 0x12, 0x04, 0x00,
|
||||||
|
0x5A, 0x12, 0x05, 0x00, 0x44, 0x12, 0x05, 0x00,
|
||||||
|
0x52, 0x12, 0x06, 0x00, 0x07, 0x12, 0x01, 0x00,
|
||||||
|
0x3F, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00,
|
||||||
|
0x04, 0x12, 0x02, 0x00, 0x07, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x01, 0x00, 0x04, 0x12, 0x02, 0x00,
|
||||||
|
0x27, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00,
|
||||||
|
0x04, 0x12, 0x02, 0x00, 0x1F, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x01, 0x00, 0x04, 0x12, 0x02, 0x00,
|
||||||
|
0x07, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00,
|
||||||
|
0x04, 0x12, 0x02, 0x00, 0x07, 0x12, 0x01, 0x00,
|
||||||
|
0x07, 0x12, 0x01, 0x00, 0x17, 0x12, 0x01, 0x00,
|
||||||
|
0x1F, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00,
|
||||||
|
0x04, 0x12, 0x02, 0x00, 0x07, 0x12, 0x01, 0x00,
|
||||||
|
0x27, 0x12, 0x01, 0x00, 0x13, 0x12, 0x06, 0x00,
|
||||||
|
0x1C, 0x12, 0x23, 0x00, 0x55, 0x12, 0x0C, 0x00,
|
||||||
|
0xFF, 0x00, 0xFF, 0x00, 0x78, 0x12, 0x09, 0x11,
|
||||||
|
0x01, 0x00, 0x1A, 0x12, 0x05, 0x00, 0x51, 0x12,
|
||||||
|
0x0F, 0x00, 0x0D, 0x12, 0x01, 0x00, 0x04, 0x0D,
|
||||||
|
0x03, 0x12, 0x0B, 0x00, 0x12, 0x0D, 0x03, 0x00,
|
||||||
|
0x02, 0x12, 0x09, 0x00, 0x12, 0x0D, 0x02, 0x12,
|
||||||
|
0x0C, 0x00, 0x0D, 0x12, 0x01, 0x00, 0x03, 0x12,
|
||||||
|
0x01, 0x0D, 0x02, 0x12, 0x0C, 0x00, 0x37, 0x0D,
|
||||||
|
0x07, 0x00, 0x08, 0x0D, 0x01, 0x00, 0x02, 0x0D,
|
||||||
|
0x0B, 0x00, 0x07, 0x0A, 0x01, 0x00, 0x01, 0x12,
|
||||||
|
0x03, 0x00, 0x0A, 0x12, 0x21, 0x0D, 0x03, 0x0E,
|
||||||
|
0x01, 0x12, 0x01, 0x00, 0x0A, 0x12, 0x06, 0x00,
|
||||||
|
0x58, 0x12, 0x08, 0x00, 0x29, 0x0D, 0x01, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0x5B, 0x00, 0x9C, 0x12, 0x04, 0x00,
|
||||||
|
0x5A, 0x12, 0x06, 0x00, 0x16, 0x12, 0x02, 0x00,
|
||||||
|
0x06, 0x12, 0x02, 0x00, 0x26, 0x12, 0x02, 0x00,
|
||||||
|
0x06, 0x12, 0x02, 0x00, 0x08, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x01, 0x00, 0x1F, 0x12, 0x02, 0x00,
|
||||||
|
0x35, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x03, 0x00, 0x03, 0x12, 0x01, 0x00,
|
||||||
|
0x07, 0x12, 0x03, 0x00, 0x04, 0x12, 0x02, 0x00,
|
||||||
|
0x06, 0x12, 0x04, 0x00, 0x0D, 0x12, 0x05, 0x00,
|
||||||
|
0x03, 0x12, 0x01, 0x00, 0x07, 0x12, 0x03, 0x11,
|
||||||
|
0x0B, 0x0E, 0x03, 0x00, 0x01, 0x03, 0x01, 0x12,
|
||||||
|
0x18, 0x11, 0x01, 0x0F, 0x01, 0x01, 0x01, 0x05,
|
||||||
|
0x01, 0x07, 0x01, 0x02, 0x01, 0x06, 0x01, 0x11,
|
||||||
|
0x01, 0x0A, 0x05, 0x12, 0x2A, 0x11, 0x01, 0x0E,
|
||||||
|
0x04, 0x12, 0x06, 0x0E, 0x06, 0x08, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0x02, 0x08, 0x06, 0x0A, 0x02, 0x12,
|
||||||
|
0x03, 0x00, 0x01, 0x08, 0x0A, 0x0A, 0x02, 0x12,
|
||||||
|
0x14, 0x0A, 0x12, 0x12, 0x1E, 0x0D, 0x1B, 0x12,
|
||||||
|
0x17, 0x00, 0x01, 0x12, 0x04, 0x00, 0x01, 0x12,
|
||||||
|
0x02, 0x00, 0x0A, 0x12, 0x01, 0x00, 0x01, 0x12,
|
||||||
|
0x03, 0x00, 0x05, 0x12, 0x06, 0x00, 0x01, 0x12,
|
||||||
|
0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x01, 0x12,
|
||||||
|
0x01, 0x00, 0x04, 0x0A, 0x01, 0x00, 0x03, 0x12,
|
||||||
|
0x01, 0x00, 0x07, 0x12, 0x03, 0x00, 0x03, 0x12,
|
||||||
|
0x05, 0x00, 0x05, 0x12, 0x16, 0x00, 0x24, 0x12,
|
||||||
|
0x8E, 0x0A, 0x02, 0x12, 0xFF, 0x12, 0x23, 0x00,
|
||||||
|
0x45, 0x12, 0x1A, 0x00, 0x01, 0x12, 0xCA, 0x08,
|
||||||
|
0x3C, 0x00, 0x4E, 0x08, 0x01, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0x20, 0x11, 0x01, 0x12,
|
||||||
|
0x04, 0x00, 0x03, 0x12, 0x19, 0x00, 0x09, 0x0D,
|
||||||
|
0x06, 0x12, 0x01, 0x00, 0x05, 0x12, 0x02, 0x00,
|
||||||
|
0x05, 0x12, 0x04, 0x00, 0x56, 0x12, 0x02, 0x0D,
|
||||||
|
0x02, 0x12, 0x02, 0x00, 0x03, 0x12, 0x01, 0x00,
|
||||||
|
0x5A, 0x12, 0x01, 0x00, 0x04, 0x12, 0x05, 0x00,
|
||||||
|
0x28, 0x12, 0x04, 0x00, 0x5E, 0x12, 0x01, 0x00,
|
||||||
|
0x28, 0x12, 0x38, 0x00, 0x2D, 0x12, 0x03, 0x00,
|
||||||
|
0x24, 0x12, 0x1C, 0x00, 0x1C, 0x12, 0x03, 0x00,
|
||||||
|
0x32, 0x12, 0x0F, 0x00, 0x0C, 0x12, 0x04, 0x00,
|
||||||
|
0x2F, 0x12, 0x01, 0x00, 0x77, 0x12, 0x04, 0x00,
|
||||||
|
0x63, 0x12, 0x02, 0x00, 0x1F, 0x12, 0x01, 0x00,
|
||||||
|
0x01, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xCD, 0x00, 0x01, 0x12,
|
||||||
|
0x4A, 0x00, 0x01, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xF5, 0x00,
|
||||||
|
0x01, 0x12, 0x5A, 0x00, 0xFF, 0x00, 0xFF, 0x00,
|
||||||
|
0xFF, 0x00, 0xFF, 0x00, 0x91, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0x7A, 0x00, 0x01, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xCD, 0x00,
|
||||||
|
0x01, 0x12, 0x5C, 0x00, 0x01, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0x81, 0x00, 0x02, 0x12,
|
||||||
|
0x7E, 0x00, 0x02, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0x02, 0x00, 0x02, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12,
|
||||||
|
0xFF, 0x12, 0x17, 0x00, 0xFF, 0x00, 0x30, 0x12,
|
||||||
|
0x02, 0x00, 0x3B, 0x12, 0x95, 0x00, 0x07, 0x12,
|
||||||
|
0x0C, 0x00, 0x05, 0x12, 0x05, 0x03, 0x01, 0x0D,
|
||||||
|
0x01, 0x03, 0x0A, 0x0A, 0x01, 0x03, 0x0D, 0x12,
|
||||||
|
0x01, 0x03, 0x05, 0x12, 0x01, 0x03, 0x01, 0x12,
|
||||||
|
0x01, 0x03, 0x02, 0x12, 0x01, 0x03, 0x02, 0x12,
|
||||||
|
0x01, 0x03, 0x0A, 0x04, 0x62, 0x12, 0x21, 0x04,
|
||||||
|
0xFF, 0x04, 0x6C, 0x12, 0x12, 0x04, 0x40, 0x12,
|
||||||
|
0x02, 0x04, 0x36, 0x12, 0x28, 0x04, 0x0D, 0x12,
|
||||||
|
0x03, 0x0D, 0x10, 0x12, 0x10, 0x0D, 0x04, 0x12,
|
||||||
|
0x2C, 0x0C, 0x01, 0x12, 0x01, 0x0C, 0x01, 0x12,
|
||||||
|
0x02, 0x0C, 0x01, 0x12, 0x09, 0x0A, 0x01, 0x12,
|
||||||
|
0x02, 0x0A, 0x02, 0x12, 0x05, 0x0A, 0x02, 0x12,
|
||||||
|
0x05, 0x04, 0x05, 0x12, 0x01, 0x04, 0x87, 0x12,
|
||||||
|
0x02, 0x0E, 0x01, 0x12, 0x03, 0x0A, 0x03, 0x12,
|
||||||
|
0x05, 0x0A, 0x01, 0x0C, 0x01, 0x0A, 0x01, 0x0C,
|
||||||
|
0x01, 0x09, 0x01, 0x08, 0x0A, 0x0C, 0x01, 0x12,
|
||||||
|
0x06, 0x00, 0x1A, 0x12, 0x06, 0x00, 0x1A, 0x12,
|
||||||
|
0x0B, 0x00, 0x59, 0x12, 0x03, 0x00, 0x06, 0x12,
|
||||||
|
0x02, 0x00, 0x06, 0x12, 0x02, 0x00, 0x06, 0x12,
|
||||||
|
0x02, 0x00, 0x03, 0x12, 0x03, 0x0A, 0x02, 0x12,
|
||||||
|
0x03, 0x0A, 0x02, 0x12, 0x09, 0x00, 0x0E, 0x00,
|
||||||
|
};
|
12
putty.h
12
putty.h
@ -428,6 +428,8 @@ struct config_tag {
|
|||||||
int window_border;
|
int window_border;
|
||||||
char answerback[256];
|
char answerback[256];
|
||||||
char printer[128];
|
char printer[128];
|
||||||
|
int arabicshaping;
|
||||||
|
int bidi;
|
||||||
/* Colour options */
|
/* Colour options */
|
||||||
int system_colour;
|
int system_colour;
|
||||||
int try_palette;
|
int try_palette;
|
||||||
@ -830,6 +832,16 @@ struct controlbox;
|
|||||||
void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
|
void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
|
||||||
int midsession, int protocol);
|
int midsession, int protocol);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Exports from minibidi.c.
|
||||||
|
*/
|
||||||
|
typedef struct bidi_char {
|
||||||
|
wchar_t origwc, wc;
|
||||||
|
unsigned short index;
|
||||||
|
} bidi_char;
|
||||||
|
int do_bidi(bidi_char *line, int count);
|
||||||
|
int do_shape(bidi_char *line, bidi_char *to, int count);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* X11 auth mechanisms we know about.
|
* X11 auth mechanisms we know about.
|
||||||
*/
|
*/
|
||||||
|
@ -274,6 +274,8 @@ void save_open_settings(void *sesskey, int do_host, Config *cfg)
|
|||||||
write_setting_i(sesskey, "DECOriginMode", cfg->dec_om);
|
write_setting_i(sesskey, "DECOriginMode", cfg->dec_om);
|
||||||
write_setting_i(sesskey, "AutoWrapMode", cfg->wrap_mode);
|
write_setting_i(sesskey, "AutoWrapMode", cfg->wrap_mode);
|
||||||
write_setting_i(sesskey, "LFImpliesCR", cfg->lfhascr);
|
write_setting_i(sesskey, "LFImpliesCR", cfg->lfhascr);
|
||||||
|
write_setting_i(sesskey, "DisableArabicShaping", cfg->arabicshaping);
|
||||||
|
write_setting_i(sesskey, "DisableBidi", cfg->bidi);
|
||||||
write_setting_i(sesskey, "WinNameAlways", cfg->win_name_always);
|
write_setting_i(sesskey, "WinNameAlways", cfg->win_name_always);
|
||||||
write_setting_s(sesskey, "WinTitle", cfg->wintitle);
|
write_setting_s(sesskey, "WinTitle", cfg->wintitle);
|
||||||
write_setting_i(sesskey, "TermWidth", cfg->width);
|
write_setting_i(sesskey, "TermWidth", cfg->width);
|
||||||
@ -283,6 +285,7 @@ void save_open_settings(void *sesskey, int do_host, Config *cfg)
|
|||||||
write_setting_i(sesskey, "UseSystemColours", cfg->system_colour);
|
write_setting_i(sesskey, "UseSystemColours", cfg->system_colour);
|
||||||
write_setting_i(sesskey, "TryPalette", cfg->try_palette);
|
write_setting_i(sesskey, "TryPalette", cfg->try_palette);
|
||||||
write_setting_i(sesskey, "BoldAsColour", cfg->bold_colour);
|
write_setting_i(sesskey, "BoldAsColour", cfg->bold_colour);
|
||||||
|
|
||||||
for (i = 0; i < 22; i++) {
|
for (i = 0; i < 22; i++) {
|
||||||
char buf[20], buf2[30];
|
char buf[20], buf2[30];
|
||||||
sprintf(buf, "Colour%d", i);
|
sprintf(buf, "Colour%d", i);
|
||||||
@ -531,6 +534,8 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
|
|||||||
gppi(sesskey, "DECOriginMode", 0, &cfg->dec_om);
|
gppi(sesskey, "DECOriginMode", 0, &cfg->dec_om);
|
||||||
gppi(sesskey, "AutoWrapMode", 1, &cfg->wrap_mode);
|
gppi(sesskey, "AutoWrapMode", 1, &cfg->wrap_mode);
|
||||||
gppi(sesskey, "LFImpliesCR", 0, &cfg->lfhascr);
|
gppi(sesskey, "LFImpliesCR", 0, &cfg->lfhascr);
|
||||||
|
gppi(sesskey, "DisableArabicShaping", 0, &cfg->arabicshaping);
|
||||||
|
gppi(sesskey, "DisableBidi", 0, &cfg->bidi);
|
||||||
gppi(sesskey, "WinNameAlways", 1, &cfg->win_name_always);
|
gppi(sesskey, "WinNameAlways", 1, &cfg->win_name_always);
|
||||||
gpps(sesskey, "WinTitle", "", cfg->wintitle, sizeof(cfg->wintitle));
|
gpps(sesskey, "WinTitle", "", cfg->wintitle, sizeof(cfg->wintitle));
|
||||||
gppi(sesskey, "TermWidth", 80, &cfg->width);
|
gppi(sesskey, "TermWidth", 80, &cfg->width);
|
||||||
@ -540,6 +545,7 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
|
|||||||
gppi(sesskey, "UseSystemColours", 0, &cfg->system_colour);
|
gppi(sesskey, "UseSystemColours", 0, &cfg->system_colour);
|
||||||
gppi(sesskey, "TryPalette", 0, &cfg->try_palette);
|
gppi(sesskey, "TryPalette", 0, &cfg->try_palette);
|
||||||
gppi(sesskey, "BoldAsColour", 1, &cfg->bold_colour);
|
gppi(sesskey, "BoldAsColour", 1, &cfg->bold_colour);
|
||||||
|
|
||||||
for (i = 0; i < 22; i++) {
|
for (i = 0; i < 22; i++) {
|
||||||
static const char *const defaults[] = {
|
static const char *const defaults[] = {
|
||||||
"187,187,187", "255,255,255", "0,0,0", "85,85,85", "0,0,0",
|
"187,187,187", "255,255,255", "0,0,0", "85,85,85", "0,0,0",
|
||||||
|
143
terminal.c
143
terminal.c
@ -237,6 +237,15 @@ void term_update(Terminal *term)
|
|||||||
term->seen_disp_event = 0;
|
term->seen_disp_event = 0;
|
||||||
need_sbar_update = TRUE;
|
need_sbar_update = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Allocate temporary buffers for Arabic shaping and bidi. */
|
||||||
|
if (!term->cfg.arabicshaping || !term->cfg.bidi)
|
||||||
|
{
|
||||||
|
term->wcFrom = sresize(term->wcFrom, term->cols, bidi_char);
|
||||||
|
term->ltemp = sresize(term->ltemp, term->cols+1, unsigned long);
|
||||||
|
term->wcTo = sresize(term->wcTo, term->cols, bidi_char);
|
||||||
|
}
|
||||||
|
|
||||||
if (need_sbar_update)
|
if (need_sbar_update)
|
||||||
update_sbar(term);
|
update_sbar(term);
|
||||||
do_paint(term, ctx, TRUE);
|
do_paint(term, ctx, TRUE);
|
||||||
@ -428,6 +437,12 @@ Terminal *term_init(Config *mycfg, struct unicode_data *ucsdata,
|
|||||||
term->resize_fn = NULL;
|
term->resize_fn = NULL;
|
||||||
term->resize_ctx = NULL;
|
term->resize_ctx = NULL;
|
||||||
term->in_term_out = FALSE;
|
term->in_term_out = FALSE;
|
||||||
|
term->ltemp = NULL;
|
||||||
|
term->wcFrom = NULL;
|
||||||
|
term->wcTo = NULL;
|
||||||
|
|
||||||
|
term->bidi_cache_size = 0;
|
||||||
|
term->pre_bidi_cache = term->post_bidi_cache = NULL;
|
||||||
|
|
||||||
return term;
|
return term;
|
||||||
}
|
}
|
||||||
@ -436,6 +451,7 @@ void term_free(Terminal *term)
|
|||||||
{
|
{
|
||||||
unsigned long *line;
|
unsigned long *line;
|
||||||
struct beeptime *beep;
|
struct beeptime *beep;
|
||||||
|
int i;
|
||||||
|
|
||||||
while ((line = delpos234(term->scrollback, 0)) != NULL)
|
while ((line = delpos234(term->scrollback, 0)) != NULL)
|
||||||
sfree(line);
|
sfree(line);
|
||||||
@ -457,6 +473,17 @@ void term_free(Terminal *term)
|
|||||||
printer_finish_job(term->print_job);
|
printer_finish_job(term->print_job);
|
||||||
bufchain_clear(&term->printer_buf);
|
bufchain_clear(&term->printer_buf);
|
||||||
sfree(term->paste_buffer);
|
sfree(term->paste_buffer);
|
||||||
|
sfree(term->ltemp);
|
||||||
|
sfree(term->wcFrom);
|
||||||
|
sfree(term->wcTo);
|
||||||
|
|
||||||
|
for (i = 0; i < term->bidi_cache_size; i++) {
|
||||||
|
sfree(term->pre_bidi_cache[i]);
|
||||||
|
sfree(term->post_bidi_cache[i]);
|
||||||
|
}
|
||||||
|
sfree(term->pre_bidi_cache);
|
||||||
|
sfree(term->post_bidi_cache);
|
||||||
|
|
||||||
sfree(term);
|
sfree(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3302,13 +3329,66 @@ static int linecmp(Terminal *term, unsigned long *a, unsigned long *b)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To prevent having to run the reasonably tricky bidi algorithm
|
||||||
|
* too many times, we maintain a cache of the last lineful of data
|
||||||
|
* fed to the algorithm on each line of the display.
|
||||||
|
*/
|
||||||
|
static int term_bidi_cache_hit(Terminal *term, int line,
|
||||||
|
unsigned long *lbefore, int width)
|
||||||
|
{
|
||||||
|
if (!term->pre_bidi_cache)
|
||||||
|
return FALSE; /* cache doesn't even exist yet! */
|
||||||
|
|
||||||
|
if (line >= term->bidi_cache_size)
|
||||||
|
return FALSE; /* cache doesn't have this many lines */
|
||||||
|
|
||||||
|
if (!term->pre_bidi_cache[line])
|
||||||
|
return FALSE; /* cache doesn't contain _this_ line */
|
||||||
|
|
||||||
|
if (!memcmp(term->pre_bidi_cache[line], lbefore,
|
||||||
|
width * sizeof(unsigned long)))
|
||||||
|
return TRUE; /* aha! the line matches the cache */
|
||||||
|
|
||||||
|
return FALSE; /* it didn't match. */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void term_bidi_cache_store(Terminal *term, int line,
|
||||||
|
unsigned long *lbefore,
|
||||||
|
unsigned long *lafter, int width)
|
||||||
|
{
|
||||||
|
if (!term->pre_bidi_cache || term->bidi_cache_size <= line) {
|
||||||
|
int j = term->bidi_cache_size;
|
||||||
|
term->bidi_cache_size = line+1;
|
||||||
|
term->pre_bidi_cache = sresize(term->pre_bidi_cache,
|
||||||
|
term->bidi_cache_size,
|
||||||
|
unsigned long *);
|
||||||
|
term->post_bidi_cache = sresize(term->post_bidi_cache,
|
||||||
|
term->bidi_cache_size,
|
||||||
|
unsigned long *);
|
||||||
|
while (j < term->bidi_cache_size) {
|
||||||
|
term->pre_bidi_cache[j] = term->post_bidi_cache[j] = NULL;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sfree(term->pre_bidi_cache[line]);
|
||||||
|
sfree(term->post_bidi_cache[line]);
|
||||||
|
|
||||||
|
term->pre_bidi_cache[line] = snewn(width, unsigned long);
|
||||||
|
term->post_bidi_cache[line] = snewn(width, unsigned long);
|
||||||
|
|
||||||
|
memcpy(term->pre_bidi_cache[line], lbefore, width * sizeof(unsigned long));
|
||||||
|
memcpy(term->post_bidi_cache[line], lafter, width * sizeof(unsigned long));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Given a context, update the window. Out of paranoia, we don't
|
* Given a context, update the window. Out of paranoia, we don't
|
||||||
* allow WM_PAINT responses to do scrolling optimisations.
|
* allow WM_PAINT responses to do scrolling optimisations.
|
||||||
*/
|
*/
|
||||||
static void do_paint(Terminal *term, Context ctx, int may_optimise)
|
static void do_paint(Terminal *term, Context ctx, int may_optimise)
|
||||||
{
|
{
|
||||||
int i, j, our_curs_y, our_curs_x;
|
int i, it, j, our_curs_y, our_curs_x;
|
||||||
unsigned long rv, cursor;
|
unsigned long rv, cursor;
|
||||||
pos scrpos;
|
pos scrpos;
|
||||||
char ch[1024];
|
char ch[1024];
|
||||||
@ -3411,6 +3491,67 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
|
|||||||
term->disptext[idx + term->cols]);
|
term->disptext[idx + term->cols]);
|
||||||
term->disptext[idx + term->cols] = ldata[term->cols];
|
term->disptext[idx + term->cols] = ldata[term->cols];
|
||||||
|
|
||||||
|
/* Do Arabic shaping and bidi. */
|
||||||
|
if(!term->cfg.bidi || !term->cfg.arabicshaping) {
|
||||||
|
|
||||||
|
if (!term_bidi_cache_hit(term, i, ldata, term->cols)) {
|
||||||
|
|
||||||
|
for(it=0; it<term->cols ; it++)
|
||||||
|
{
|
||||||
|
int uc = (ldata[it] & 0xFFFF);
|
||||||
|
|
||||||
|
switch (uc & CSET_MASK) {
|
||||||
|
case ATTR_LINEDRW:
|
||||||
|
if (!term->cfg.rawcnp) {
|
||||||
|
uc = term->ucsdata->unitab_xterm[uc & 0xFF];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ATTR_ASCII:
|
||||||
|
uc = term->ucsdata->unitab_line[uc & 0xFF];
|
||||||
|
break;
|
||||||
|
case ATTR_SCOACS:
|
||||||
|
uc = term->ucsdata->unitab_scoacs[uc&0xFF];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (uc & CSET_MASK) {
|
||||||
|
case ATTR_ACP:
|
||||||
|
uc = term->ucsdata->unitab_font[uc & 0xFF];
|
||||||
|
break;
|
||||||
|
case ATTR_OEMCP:
|
||||||
|
uc = term->ucsdata->unitab_oemcp[uc & 0xFF];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
term->wcFrom[it].origwc = term->wcFrom[it].wc = uc;
|
||||||
|
term->wcFrom[it].index = it;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!term->cfg.bidi)
|
||||||
|
do_bidi(term->wcFrom, term->cols);
|
||||||
|
|
||||||
|
/* this is saved iff done from inside the shaping */
|
||||||
|
if(!term->cfg.bidi && term->cfg.arabicshaping)
|
||||||
|
for(it=0; it<term->cols; it++)
|
||||||
|
term->wcTo[it] = term->wcFrom[it];
|
||||||
|
|
||||||
|
if(!term->cfg.arabicshaping)
|
||||||
|
do_shape(term->wcFrom, term->wcTo, term->cols);
|
||||||
|
|
||||||
|
for(it=0; it<term->cols ; it++)
|
||||||
|
{
|
||||||
|
term->ltemp[it] = ldata[term->wcTo[it].index];
|
||||||
|
|
||||||
|
if (term->wcTo[it].origwc != term->wcTo[it].wc)
|
||||||
|
term->ltemp[it] = ((term->ltemp[it] & 0xFFFF0000) |
|
||||||
|
term->wcTo[it].wc);
|
||||||
|
}
|
||||||
|
term_bidi_cache_store(term, i, ldata, term->ltemp, term->cols);
|
||||||
|
ldata = term->ltemp;
|
||||||
|
} else {
|
||||||
|
ldata = term->post_bidi_cache[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (j = 0; j < term->cols; j++, idx++) {
|
for (j = 0; j < term->cols; j++, idx++) {
|
||||||
unsigned long tattr, tchar;
|
unsigned long tattr, tchar;
|
||||||
unsigned long *d = ldata + j;
|
unsigned long *d = ldata + j;
|
||||||
|
@ -208,6 +208,14 @@ struct terminal_tag {
|
|||||||
* through.
|
* through.
|
||||||
*/
|
*/
|
||||||
int in_term_out;
|
int in_term_out;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are buffers used by the bidi and Arabic shaping code.
|
||||||
|
*/
|
||||||
|
unsigned long *ltemp;
|
||||||
|
bidi_char *wcFrom, *wcTo;
|
||||||
|
unsigned long **pre_bidi_cache, **post_bidi_cache;
|
||||||
|
int bidi_cache_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define in_utf(term) ((term)->utf || (term)->ucsdata->line_codepage==CP_UTF8)
|
#define in_utf(term) ((term)->utf || (term)->ucsdata->line_codepage==CP_UTF8)
|
||||||
|
36
window.c
36
window.c
@ -1080,6 +1080,36 @@ static void init_palette(void)
|
|||||||
defpal[i].rgbtGreen, defpal[i].rgbtBlue);
|
defpal[i].rgbtGreen, defpal[i].rgbtBlue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a wrapper to ExtTextOut() to force Windows to display
|
||||||
|
* the precise glyphs we give it. Otherwise it would do its own
|
||||||
|
* bidi and Arabic shaping, and we would end up uncertain which
|
||||||
|
* characters it had put where.
|
||||||
|
*/
|
||||||
|
static void exact_textout(HDC hdc, int x, int y, CONST RECT *lprc,
|
||||||
|
unsigned short *lpString, UINT cbCount,
|
||||||
|
CONST INT *lpDx)
|
||||||
|
{
|
||||||
|
|
||||||
|
GCP_RESULTSW gcpr;
|
||||||
|
char *buffer = snewn(cbCount*2+2, char);
|
||||||
|
char *classbuffer = snewn(cbCount, char);
|
||||||
|
memset(&gcpr, 0, sizeof(gcpr));
|
||||||
|
memset(buffer, 0, cbCount*2+2);
|
||||||
|
memset(classbuffer, GCPCLASS_NEUTRAL, cbCount);
|
||||||
|
|
||||||
|
gcpr.lStructSize = sizeof(gcpr);
|
||||||
|
gcpr.lpGlyphs = (void *)buffer;
|
||||||
|
gcpr.lpClass = classbuffer;
|
||||||
|
gcpr.nGlyphs = cbCount;
|
||||||
|
|
||||||
|
GetCharacterPlacementW(hdc, lpString, cbCount, 0, &gcpr,
|
||||||
|
FLI_MASK | GCP_CLASSIN);
|
||||||
|
|
||||||
|
ExtTextOut(hdc, x, y, ETO_GLYPH_INDEX | ETO_CLIPPED | ETO_OPAQUE, lprc,
|
||||||
|
buffer, cbCount, lpDx);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialise all the fonts we will need initially. There may be as many as
|
* Initialise all the fonts we will need initially. There may be as many as
|
||||||
* three or as few as one. The other (poentially) twentyone fonts are done
|
* three or as few as one. The other (poentially) twentyone fonts are done
|
||||||
@ -2989,9 +3019,13 @@ void do_text(Context ctx, int x, int y, char *text, int len,
|
|||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
wbuf[i] = (WCHAR) ((attr & CSET_MASK) + (text[i] & CHAR_MASK));
|
wbuf[i] = (WCHAR) ((attr & CSET_MASK) + (text[i] & CHAR_MASK));
|
||||||
|
|
||||||
ExtTextOutW(hdc, x,
|
/* print Glyphs as they are, without Windows' Shaping*/
|
||||||
|
exact_textout(hdc, x, y - font_height * (lattr == LATTR_BOT) + text_adjust,
|
||||||
|
&line_box, wbuf, len, IpDx);
|
||||||
|
/* ExtTextOutW(hdc, x,
|
||||||
y - font_height * (lattr == LATTR_BOT) + text_adjust,
|
y - font_height * (lattr == LATTR_BOT) + text_adjust,
|
||||||
ETO_CLIPPED | ETO_OPAQUE, &line_box, wbuf, len, IpDx);
|
ETO_CLIPPED | ETO_OPAQUE, &line_box, wbuf, len, IpDx);
|
||||||
|
*/
|
||||||
|
|
||||||
/* And the shadow bold hack. */
|
/* And the shadow bold hack. */
|
||||||
if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) {
|
if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) {
|
||||||
|
@ -29,6 +29,8 @@
|
|||||||
#define WINHELP_CTX_features_qtitle "features.qtitle"
|
#define WINHELP_CTX_features_qtitle "features.qtitle"
|
||||||
#define WINHELP_CTX_features_dbackspace "features.dbackspace"
|
#define WINHELP_CTX_features_dbackspace "features.dbackspace"
|
||||||
#define WINHELP_CTX_features_charset "features.charset"
|
#define WINHELP_CTX_features_charset "features.charset"
|
||||||
|
#define WINHELP_CTX_features_arabicshaping "features.arabicshaping"
|
||||||
|
#define WINHELP_CTX_features_bidi "features.bidi"
|
||||||
#define WINHELP_CTX_terminal_autowrap "terminal.autowrap"
|
#define WINHELP_CTX_terminal_autowrap "terminal.autowrap"
|
||||||
#define WINHELP_CTX_terminal_decom "terminal.decom"
|
#define WINHELP_CTX_terminal_decom "terminal.decom"
|
||||||
#define WINHELP_CTX_terminal_lfhascr "terminal.lfhascr"
|
#define WINHELP_CTX_terminal_lfhascr "terminal.lfhascr"
|
||||||
|
Loading…
Reference in New Issue
Block a user