Added handling of deff RTF control word.

This commit is contained in:
Phil Krylov 2005-08-22 10:06:08 +00:00 committed by Alexandre Julliard
parent 2cc40bac7d
commit 4c9f013f8b
3 changed files with 37 additions and 6 deletions

View File

@ -393,6 +393,7 @@ static void ME_RTFCharAttrHook(RTF_Info *info)
style2 = ME_ApplyStyle(info->style, &fmt);
ME_ReleaseStyle(info->style);
info->style = style2;
info->styleChanged = TRUE;
}
}
@ -476,18 +477,22 @@ static void ME_RTFReadHook(RTF_Info *info) {
info->stack[info->stackTop].unicodeLength = info->unicodeLength;
}
info->stackTop++;
info->styleChanged = FALSE;
break;
case rtfEndGroup:
{
ME_Style *s;
RTFFlushOutputBuffer(info);
info->stackTop--;
/* FIXME too slow ? how come ? */
s = ME_ApplyStyle(info->style, &info->stack[info->stackTop].fmt);
ME_ReleaseStyle(info->style);
info->style = s;
info->codePage = info->stack[info->stackTop].codePage;
info->unicodeLength = info->stack[info->stackTop].unicodeLength;
if (info->styleChanged)
{
/* FIXME too slow ? how come ? */
s = ME_ApplyStyle(info->style, &info->stack[info->stackTop].fmt);
ME_ReleaseStyle(info->style);
info->style = s;
info->codePage = info->stack[info->stackTop].codePage;
info->unicodeLength = info->stack[info->stackTop].unicodeLength;
}
break;
}
}

View File

@ -257,6 +257,7 @@ void RTFInit(RTF_Info *info)
info->ansiCodePage = 1252; /* Latin-1; actually unused */
info->unicodeLength = 1; /* \uc1 is the default */
info->codePage = info->ansiCodePage;
info->defFont = 0;
info->rtfClass = -1;
info->pushedClass = -1;
@ -1005,6 +1006,14 @@ static void ReadFontTbl(RTF_Info *info)
if (!RTFCheckCM (info, rtfGroup, rtfEndGroup))
RTFPanic (info, "%s: missing \"}\"", fn);
}
/* Apply the real properties of the default font */
if (fp->rtfFNum == info->defFont)
{
if (info->ansiCodePage != CP_UTF8)
info->codePage = fp->rtfFCodePage;
TRACE("default font codepage %d\n", info->codePage);
}
}
if (fp->rtfFNum == -1)
RTFPanic (info,"%s: missing font number", fn);
@ -2467,6 +2476,7 @@ void RTFPanic(RTF_Info *info, const char *fmt, ...)
static void TextClass (RTF_Info *info);
static void ControlClass (RTF_Info *info);
static void DefFont(RTF_Info *info);
static void Destination (RTF_Info *info);
static void SpecialChar (RTF_Info *info);
static void RTFPutUnicodeChar (RTF_Info *info, int c);
@ -2516,6 +2526,9 @@ ControlClass (RTF_Info *info)
case rtfCharSet:
CharSet(info);
break;
case rtfDefFont:
DefFont(info);
break;
case rtfDestination:
Destination (info);
break;
@ -2542,6 +2555,7 @@ CharAttr(RTF_Info *info)
{
if (info->ansiCodePage != CP_UTF8)
info->codePage = font->rtfFCodePage;
TRACE("font %d codepage %d\n", info->rtfParam, info->codePage);
}
else
RTFMsg(info, "unknown font %d\n", info->rtfParam);
@ -2591,9 +2605,19 @@ Destination (RTF_Info *info)
}
static void
DefFont(RTF_Info *info)
{
TRACE("%d\n", info->rtfParam);
info->defFont = info->rtfParam;
}
static void
DocAttr(RTF_Info *info)
{
TRACE("minor %d, param %d\n", info->rtfMinor, info->rtfParam);
switch (info->rtfMinor)
{
case rtfAnsiCodePage:

View File

@ -1070,6 +1070,7 @@ struct _RTF_Info {
RTFColor *colorList; /* initialized to NULL */
RTFStyle *styleList;
int ansiCodePage; /* ANSI codepage used in conversion to Unicode */
int defFont;
/* Character attributes */
int unicodeLength; /* The length of ANSI representation of Unicode characters */
@ -1103,6 +1104,7 @@ struct _RTF_Info {
RTFState stack[maxStack];
int stackTop;
BOOL styleChanged;
};