Index: source/filter/ww8/ww8par6.cxx =================================================================== RCS file: /cvs/sw/sw/source/filter/ww8/ww8par6.cxx,v retrieving revision 1.175 diff -u -r1.175 ww8par6.cxx --- source/filter/ww8/ww8par6.cxx 18 Jul 2007 14:47:14 -0000 1.175 +++ source/filter/ww8/ww8par6.cxx 3 Jan 2008 16:12:57 -0000 @@ -4088,8 +4088,10 @@ pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_UL_SPACE ); return; } + short nSpace = SVBT16ToShort( pData ); - short nMulti = SVBT16ToShort( pData + 2 ); + ww::WordVersion eVersion = pWwFib->GetFIBVersion(); + short nMulti = (eVersion <= ww::eWW2) ? 1 : SVBT16ToShort( pData + 2 ); SvxLineSpace eLnSpc; if( 0 > nSpace ) Index: source/filter/ww8/ww8scan.cxx =================================================================== RCS file: /cvs/sw/sw/source/filter/ww8/ww8scan.cxx,v retrieving revision 1.132 diff -u -r1.132 ww8scan.cxx --- source/filter/ww8/ww8scan.cxx 25 May 2007 13:03:35 -0000 1.132 +++ source/filter/ww8/ww8scan.cxx 3 Jan 2008 16:13:02 -0000 @@ -3406,7 +3406,8 @@ pStrm(pSt), nArrMax(256), nSprmSiz(0) { pPLCF = rFib.lcbPlcfsed - ? new WW8PLCF(pTblSt, rFib.fcPlcfsed, rFib.lcbPlcfsed, 12, nStartCp) + ? new WW8PLCF(pTblSt, rFib.fcPlcfsed, rFib.lcbPlcfsed, + GetFIBVersion() <= ww::eWW2 ? 6 : 12, nStartCp) : 0; pSprms = new BYTE[nArrMax]; // maximum length @@ -3453,8 +3454,8 @@ } else { - long nPo = SVBT32ToUInt32( (BYTE*)pData+2 ); - if (nPo == -1L) + sal_uInt32 nPo = SVBT32ToUInt32( (BYTE*)pData+2 ); + if (nPo == 0xFFFFFFFF) { p->nStartPos = p->nEndPos = WW8_CP_MAX; // Sepx empty p->pMemPos = 0; @@ -3463,7 +3464,16 @@ else { pStrm->Seek( nPo ); - *pStrm >> nSprmSiz; // read len + + // read len + if (GetFIBVersion() <= ww::eWW2) // eWW6 ?, docs say yes, but... + { + BYTE nSiz(0); + *pStrm >> nSiz; + nSprmSiz = nSiz; + } + else + *pStrm >> nSprmSiz; if( nSprmSiz > nArrMax ) { // passt nicht @@ -6086,15 +6096,15 @@ return; } - bool bVer67 = (8 > rFib.nVersion); - rSt.Seek( rFib.fcSttbfffn ); // allocate Font Array BYTE* pA = new BYTE[ rFib.lcbSttbfffn - 2 ]; WW8_FFN* p = (WW8_FFN*)pA; - if( !bVer67 ) + ww::WordVersion eVersion = rFib.GetFIBVersion(); + + if( eVersion >= ww::eWW8 ) { // bVer8: read the count of strings in nMax rSt >> nMax; @@ -6108,7 +6118,7 @@ // read all font information rSt.Read( pA, rFib.lcbSttbfffn - 2 ); - if( bVer67 ) + if( eVersion < ww::eWW8 ) { // try to figure out how many fonts are defined here nMax = 0; @@ -6135,7 +6145,34 @@ pFontA = new WW8_FFN[ nMax ]; p = pFontA; - if( bVer67 ) + if( eVersion <= ww::eWW2 ) + { + WW8_FFN_BASE* pVer2 = (WW8_FFN_BASE*)pA; + BYTE c2; + for(USHORT i=0; icbFfnM1 = pVer2->cbFfnM1; + + p->prg = 0; + p->fTrueType = 0; + p->ff = 0; + + p->wWeight = ( *(((BYTE*)pVer2) + 1) ); + p->chs = ( *(((BYTE*)pVer2) + 2) ); + /* + #i8726# 7- seems to encode the name in the same encoding as + the font, e.g load the doc in 97 and save to see the unicode + ver of the asian fontnames in that example to confirm. + */ + rtl_TextEncoding eEnc = WW8Fib::GetFIBCharset(p->chs); + if ((eEnc == RTL_TEXTENCODING_SYMBOL) || (eEnc == RTL_TEXTENCODING_DONTKNOW)) + eEnc = RTL_TEXTENCODING_MS_1252; + + p->sFontname = String ( (((const sal_Char*)pVer2) + 1 + 2), eEnc); + pVer2 = (WW8_FFN_BASE*)( ((BYTE*)pVer2) + pVer2->cbFfnM1 + 1 ); + } + } + else if( eVersion < ww::eWW8 ) { WW8_FFN_Ver6* pVer6 = (WW8_FFN_Ver6*)pA; BYTE c2;