xref: /aoo4110/main/sw/source/filter/ww8/ww8par4.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
27*b1cdbd2cSJim Jagielski #include <doc.hxx>
28*b1cdbd2cSJim Jagielski #include "writerhelper.hxx"
29*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XClassifiedObject.hpp>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <algorithm>
32*b1cdbd2cSJim Jagielski #include <functional>
33*b1cdbd2cSJim Jagielski #include <osl/endian.h>
34*b1cdbd2cSJim Jagielski #include <sot/storage.hxx>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XShape.hpp>
36*b1cdbd2cSJim Jagielski #include <hintids.hxx>
37*b1cdbd2cSJim Jagielski #include <svx/svdoole2.hxx>
38*b1cdbd2cSJim Jagielski #include <filter/msfilter/msdffimp.hxx>
39*b1cdbd2cSJim Jagielski #include <svx/unoapi.hxx>
40*b1cdbd2cSJim Jagielski #include <filter/msfilter/msocximex.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <sot/exchange.hxx>
43*b1cdbd2cSJim Jagielski #include <swtypes.hxx>
44*b1cdbd2cSJim Jagielski #include <fmtanchr.hxx>
45*b1cdbd2cSJim Jagielski #include <fmtcntnt.hxx>
46*b1cdbd2cSJim Jagielski #include <dcontact.hxx>
47*b1cdbd2cSJim Jagielski #include <frmfmt.hxx>
48*b1cdbd2cSJim Jagielski #include <pam.hxx>
49*b1cdbd2cSJim Jagielski #include <ndgrf.hxx>
50*b1cdbd2cSJim Jagielski #include <docsh.hxx>            // fuer Ole-Node
51*b1cdbd2cSJim Jagielski #include <mdiexp.hxx>           // Progress
52*b1cdbd2cSJim Jagielski #include <redline.hxx>
53*b1cdbd2cSJim Jagielski #include <fltshell.hxx>
54*b1cdbd2cSJim Jagielski #include <unodraw.hxx>
55*b1cdbd2cSJim Jagielski #include <shellio.hxx>
56*b1cdbd2cSJim Jagielski #include <ndole.hxx>
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #include <svtools/filter.hxx>
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski #include "ww8scan.hxx"
61*b1cdbd2cSJim Jagielski #include "ww8par.hxx"
62*b1cdbd2cSJim Jagielski #include "ww8par2.hxx"          // WWFlyPara::BoxUpWidth()
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski struct OLE_MFP
65*b1cdbd2cSJim Jagielski {
66*b1cdbd2cSJim Jagielski     sal_Int16 mm;       // 0x6  int
67*b1cdbd2cSJim Jagielski     sal_Int16 xExt;     // 0x8  int in 1/100 mm
68*b1cdbd2cSJim Jagielski     sal_Int16 yExt;     // 0xa  int in 1/100 mm
69*b1cdbd2cSJim Jagielski     sal_Int16 hMF;      // 0xc  int
70*b1cdbd2cSJim Jagielski };
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski // SV_IMPL_OP_PTRARR_SORT(WW8AuthorInfos, WW8AuthorInfo_Ptr)
SV_IMPL_OP_PTRARR_SORT(WW8OleMaps,WW8OleMap_Ptr)75*b1cdbd2cSJim Jagielski SV_IMPL_OP_PTRARR_SORT(WW8OleMaps, WW8OleMap_Ptr)
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski static bool SwWw8ReadScaling(long& rX, long& rY, SvStorageRef& rSrc1)
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski     // Skalierungsfaktoren holen:
80*b1cdbd2cSJim Jagielski     //      Informationen in PIC-Stream ( durch ausprobieren )
81*b1cdbd2cSJim Jagielski     //      0x0  (l)cb
82*b1cdbd2cSJim Jagielski     //      0x08 .. 0x0a Flags ??
83*b1cdbd2cSJim Jagielski     //      0x08 Inh: 1 / 0
84*b1cdbd2cSJim Jagielski     //      0x09 Inh: 0,8,0x18
85*b1cdbd2cSJim Jagielski     //      0x0a Inh: immer 8, MAP_ANISOTROPIC ???
86*b1cdbd2cSJim Jagielski     //      0x0b Inh: immer 0
87*b1cdbd2cSJim Jagielski     //      0x0c, 0x10 Originalgroesse x,y in 1/100 mm
88*b1cdbd2cSJim Jagielski     //      0x14, 0x16 Originalgroesse x,y in tw
89*b1cdbd2cSJim Jagielski     //      0x2c, 0x30 Skalierung x,y in Promille
90*b1cdbd2cSJim Jagielski     //      0x34, 0x38, 0x3c, 0x40 Crop Left, Top, Right, Bot in tw
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski     SvStorageStreamRef xSrc3 = rSrc1->OpenSotStream( CREATE_CONST_ASC( "\3PIC" ),
93*b1cdbd2cSJim Jagielski         STREAM_STD_READ | STREAM_NOCREATE);
94*b1cdbd2cSJim Jagielski     SvStorageStream* pS = xSrc3;
95*b1cdbd2cSJim Jagielski     pS->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
96*b1cdbd2cSJim Jagielski     pS->Seek( STREAM_SEEK_TO_END );
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski     ASSERT( pS->Tell() >=  76, "+OLE-PIC-Stream is shorter than 76 Byte" );
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski     sal_Int32 nOrgWidth,
101*b1cdbd2cSJim Jagielski           nOrgHeight,
102*b1cdbd2cSJim Jagielski           nScaleX,
103*b1cdbd2cSJim Jagielski           nScaleY,
104*b1cdbd2cSJim Jagielski           nCropLeft,
105*b1cdbd2cSJim Jagielski           nCropTop,
106*b1cdbd2cSJim Jagielski           nCropRight,
107*b1cdbd2cSJim Jagielski           nCropBottom;
108*b1cdbd2cSJim Jagielski     pS->Seek( 0x14 );
109*b1cdbd2cSJim Jagielski     *pS >> nOrgWidth    // Original Size in 1/100 mm
110*b1cdbd2cSJim Jagielski         >> nOrgHeight;
111*b1cdbd2cSJim Jagielski     pS->Seek( 0x2c );
112*b1cdbd2cSJim Jagielski     *pS >> nScaleX      // Scaling in Promille
113*b1cdbd2cSJim Jagielski         >> nScaleY
114*b1cdbd2cSJim Jagielski         >> nCropLeft    // Cropping in 1/100 mm
115*b1cdbd2cSJim Jagielski         >> nCropTop
116*b1cdbd2cSJim Jagielski         >> nCropRight
117*b1cdbd2cSJim Jagielski         >> nCropBottom;
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski     rX = nOrgWidth  - nCropLeft - nCropRight;
120*b1cdbd2cSJim Jagielski     rY = nOrgHeight - nCropTop  - nCropBottom;
121*b1cdbd2cSJim Jagielski     if (10 > nScaleX || 65536 < nScaleX || 10 > nScaleY || 65536 < nScaleY)
122*b1cdbd2cSJim Jagielski     {
123*b1cdbd2cSJim Jagielski         ASSERT( !pS, "+OLE-Scalinginformation in PIC-Stream wrong" );
124*b1cdbd2cSJim Jagielski         return false;
125*b1cdbd2cSJim Jagielski     }
126*b1cdbd2cSJim Jagielski     else
127*b1cdbd2cSJim Jagielski     {
128*b1cdbd2cSJim Jagielski         rX = (rX * nScaleX) / 1000;
129*b1cdbd2cSJim Jagielski         rY = (rY * nScaleY) / 1000;
130*b1cdbd2cSJim Jagielski     }
131*b1cdbd2cSJim Jagielski     return true;
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski 
SwWw6ReadMetaStream(GDIMetaFile & rWMF,OLE_MFP * pMfp,SvStorageRef & rSrc1)134*b1cdbd2cSJim Jagielski static bool SwWw6ReadMetaStream(GDIMetaFile& rWMF, OLE_MFP* pMfp,
135*b1cdbd2cSJim Jagielski     SvStorageRef& rSrc1)
136*b1cdbd2cSJim Jagielski {
137*b1cdbd2cSJim Jagielski     SvStorageStreamRef xSrc2 = rSrc1->OpenSotStream( CREATE_CONST_ASC("\3META"),
138*b1cdbd2cSJim Jagielski         STREAM_STD_READ | STREAM_NOCREATE);
139*b1cdbd2cSJim Jagielski     SvStorageStream* pSt = xSrc2;
140*b1cdbd2cSJim Jagielski     pSt->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
141*b1cdbd2cSJim Jagielski     sal_uLong nRead = pSt->Read( pMfp, sizeof(*pMfp ) );
142*b1cdbd2cSJim Jagielski                                 // Mini-Placable-Header lesen
143*b1cdbd2cSJim Jagielski     if (nRead != sizeof(*pMfp))
144*b1cdbd2cSJim Jagielski         return false;
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski #if defined  OSL_BIGENDIAN
147*b1cdbd2cSJim Jagielski     pMfp->mm = SWAPSHORT( pMfp->mm );
148*b1cdbd2cSJim Jagielski     pMfp->xExt = SWAPSHORT( pMfp->xExt );
149*b1cdbd2cSJim Jagielski     pMfp->yExt = SWAPSHORT( pMfp->yExt );
150*b1cdbd2cSJim Jagielski #endif // OSL_BIGENDIAN
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski     if( pMfp->mm == 94 || pMfp->mm == 99 )
153*b1cdbd2cSJim Jagielski     {
154*b1cdbd2cSJim Jagielski         ASSERT( !pSt, "+OLE: Falscher Metafile-Typ" );
155*b1cdbd2cSJim Jagielski         return false;
156*b1cdbd2cSJim Jagielski     }
157*b1cdbd2cSJim Jagielski     if( pMfp->mm != 8 )
158*b1cdbd2cSJim Jagielski     {
159*b1cdbd2cSJim Jagielski         ASSERT( !pSt, "+OLE: Falscher Metafile-Typ ( nicht Anisotropic )" );
160*b1cdbd2cSJim Jagielski     }
161*b1cdbd2cSJim Jagielski     if( !pMfp->xExt || !pMfp->yExt )
162*b1cdbd2cSJim Jagielski     {
163*b1cdbd2cSJim Jagielski         ASSERT( !pSt, "+OLE: Groesse von 0 ???" );
164*b1cdbd2cSJim Jagielski         return false;
165*b1cdbd2cSJim Jagielski     }
166*b1cdbd2cSJim Jagielski     bool bOk = ReadWindowMetafile( *pSt, rWMF, NULL ) ? true : false;   // WMF lesen
167*b1cdbd2cSJim Jagielski                     // *pSt >> aWMF  geht nicht ohne placable Header
168*b1cdbd2cSJim Jagielski     if (!bOk || pSt->GetError() || rWMF.GetActionCount() == 0)
169*b1cdbd2cSJim Jagielski     {
170*b1cdbd2cSJim Jagielski         ASSERT( !pSt, "+OLE: Konnte Metafile nicht lesen" );
171*b1cdbd2cSJim Jagielski         return false;
172*b1cdbd2cSJim Jagielski     }
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski     rWMF.SetPrefMapMode( MapMode( MAP_100TH_MM ) );
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski     // MetaFile auf neue Groesse skalieren und
178*b1cdbd2cSJim Jagielski     // neue Groesse am MetaFile setzen
179*b1cdbd2cSJim Jagielski     Size        aOldSiz( rWMF.GetPrefSize() );
180*b1cdbd2cSJim Jagielski     Size        aNewSiz( pMfp->xExt, pMfp->yExt );
181*b1cdbd2cSJim Jagielski     Fraction    aFracX( aNewSiz.Width(), aOldSiz.Width() );
182*b1cdbd2cSJim Jagielski     Fraction    aFracY( aNewSiz.Height(), aOldSiz.Height() );
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski     rWMF.Scale( aFracX, aFracY );
185*b1cdbd2cSJim Jagielski     rWMF.SetPrefSize( aNewSiz );
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski     return true;
188*b1cdbd2cSJim Jagielski }
189*b1cdbd2cSJim Jagielski 
SwWw6ReadMacPICTStream(Graphic & rGraph,SvStorageRef & rSrc1)190*b1cdbd2cSJim Jagielski static bool SwWw6ReadMacPICTStream(Graphic& rGraph, SvStorageRef& rSrc1)
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski     // 03-META-Stream nicht da. Vielleicht ein 03-PICT ?
193*b1cdbd2cSJim Jagielski     SvStorageStreamRef xSrc4 = rSrc1->OpenSotStream( CREATE_CONST_ASC( "\3PICT" ));
194*b1cdbd2cSJim Jagielski     SvStorageStream* pStp = xSrc4;
195*b1cdbd2cSJim Jagielski     pStp->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
196*b1cdbd2cSJim Jagielski     sal_uInt8 aTestA[10];        // Ist der 01Ole-Stream ueberhaupt vorhanden
197*b1cdbd2cSJim Jagielski     sal_uLong nReadTst = pStp->Read( aTestA, sizeof( aTestA ) );
198*b1cdbd2cSJim Jagielski     if (nReadTst != sizeof(aTestA))
199*b1cdbd2cSJim Jagielski         return false;
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski     pStp->Seek( STREAM_SEEK_TO_BEGIN );
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski #ifdef DEBUGDUMP
204*b1cdbd2cSJim Jagielski     SvStream *pDbg = sw::hack::CreateDebuggingStream(CREATE_CONST_ASC(".pct"));
205*b1cdbd2cSJim Jagielski     pDbg->Seek(0x200); //Prepend extra 0x200 of zeros to make this a valid PICT
206*b1cdbd2cSJim Jagielski     sw::hack::DumpStream(*pStp, *pDbg);
207*b1cdbd2cSJim Jagielski     delete pDbg;
208*b1cdbd2cSJim Jagielski #endif
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski     // Mac-Pict steht im 03PICT-StorageStream allerdings ohne die ersten 512
211*b1cdbd2cSJim Jagielski     // Bytes, die bei einem MAC-PICT egal sind ( werden nicht ausgewertet )
212*b1cdbd2cSJim Jagielski     return SwWW8ImplReader::GetPictGrafFromStream(rGraph, *pStp);
213*b1cdbd2cSJim Jagielski }
214*b1cdbd2cSJim Jagielski 
InsertOle(SdrOle2Obj & rObject,const SfxItemSet & rFlySet,const SfxItemSet & rGrfSet)215*b1cdbd2cSJim Jagielski SwFlyFrmFmt* SwWW8ImplReader::InsertOle(SdrOle2Obj &rObject,
216*b1cdbd2cSJim Jagielski     const SfxItemSet &rFlySet, const SfxItemSet &rGrfSet)
217*b1cdbd2cSJim Jagielski {
218*b1cdbd2cSJim Jagielski     SfxObjectShell *pPersist = rDoc.GetPersist();
219*b1cdbd2cSJim Jagielski     ASSERT(pPersist, "No persist, cannot insert objects correctly");
220*b1cdbd2cSJim Jagielski     if (!pPersist)
221*b1cdbd2cSJim Jagielski         return 0;
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski     SwFlyFrmFmt *pRet = 0;
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski     SfxItemSet *pMathFlySet = 0;
226*b1cdbd2cSJim Jagielski     uno::Reference < embed::XClassifiedObject > xClass( rObject.GetObjRef(), uno::UNO_QUERY );
227*b1cdbd2cSJim Jagielski     if( xClass.is() )
228*b1cdbd2cSJim Jagielski     {
229*b1cdbd2cSJim Jagielski         SvGlobalName aClassName( xClass->getClassID() );
230*b1cdbd2cSJim Jagielski         if (SotExchange::IsMath(aClassName))
231*b1cdbd2cSJim Jagielski         {
232*b1cdbd2cSJim Jagielski             /*
233*b1cdbd2cSJim Jagielski             StarMath sets it own fixed size, so its counter productive to use the
234*b1cdbd2cSJim Jagielski             size word says it is. i.e. Don't attempt to override its size.
235*b1cdbd2cSJim Jagielski             */
236*b1cdbd2cSJim Jagielski             pMathFlySet = new SfxItemSet(rFlySet);
237*b1cdbd2cSJim Jagielski             pMathFlySet->ClearItem(RES_FRM_SIZE);
238*b1cdbd2cSJim Jagielski         }
239*b1cdbd2cSJim Jagielski     }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski     /*
242*b1cdbd2cSJim Jagielski     Take complete responsibility of the object away from SdrOle2Obj and to
243*b1cdbd2cSJim Jagielski     me here locally. This utility class now owns the object.
244*b1cdbd2cSJim Jagielski     */
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski     // TODO/MBA: is the object inserted multiple times here? Testing!
247*b1cdbd2cSJim Jagielski     // And is it a problem that we now use the same naming scheme as in the other apps?
248*b1cdbd2cSJim Jagielski     sw::hack::DrawingOLEAdaptor aOLEObj(rObject, *pPersist);
249*b1cdbd2cSJim Jagielski     ::rtl::OUString sNewName;
250*b1cdbd2cSJim Jagielski     bool bSuccess = aOLEObj.TransferToDoc(sNewName);
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski     ASSERT(bSuccess, "Insert OLE failed");
253*b1cdbd2cSJim Jagielski     if (bSuccess)
254*b1cdbd2cSJim Jagielski     {
255*b1cdbd2cSJim Jagielski         const SfxItemSet *pFlySet = pMathFlySet ? pMathFlySet : &rFlySet;
256*b1cdbd2cSJim Jagielski         pRet = rDoc.InsertOLE(*pPaM, sNewName, rObject.GetAspect(), pFlySet, &rGrfSet, 0);
257*b1cdbd2cSJim Jagielski     }
258*b1cdbd2cSJim Jagielski     delete pMathFlySet;
259*b1cdbd2cSJim Jagielski     return pRet;
260*b1cdbd2cSJim Jagielski }
261*b1cdbd2cSJim Jagielski 
ImportOle(const Graphic * pGrf,const SfxItemSet * pFlySet,const SfxItemSet * pGrfSet,const Rectangle & aVisArea)262*b1cdbd2cSJim Jagielski SwFrmFmt* SwWW8ImplReader::ImportOle(const Graphic* pGrf,
263*b1cdbd2cSJim Jagielski     const SfxItemSet* pFlySet, const SfxItemSet *pGrfSet, const Rectangle& aVisArea )
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski     ::SetProgressState(nProgress, mpDocShell);     // Update
266*b1cdbd2cSJim Jagielski     SwFrmFmt* pFmt = 0;
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski     GrafikCtor();
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski     Graphic aGraph;
271*b1cdbd2cSJim Jagielski     SdrObject* pRet = ImportOleBase(aGraph, pGrf, pFlySet, aVisArea );
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski     // create flyset
274*b1cdbd2cSJim Jagielski     SfxItemSet* pTempSet = 0;
275*b1cdbd2cSJim Jagielski     if( !pFlySet )
276*b1cdbd2cSJim Jagielski     {
277*b1cdbd2cSJim Jagielski         pTempSet = new SfxItemSet( rDoc.GetAttrPool(), RES_FRMATR_BEGIN,
278*b1cdbd2cSJim Jagielski             RES_FRMATR_END-1);
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski         pFlySet = pTempSet;
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski         // Abstand/Umrandung raus
283*b1cdbd2cSJim Jagielski         if (!mbNewDoc)
284*b1cdbd2cSJim Jagielski             Reader::ResetFrmFmtAttrs( *pTempSet );
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski         SwFmtAnchor aAnchor( FLY_AS_CHAR );
287*b1cdbd2cSJim Jagielski         aAnchor.SetAnchor( pPaM->GetPoint() );
288*b1cdbd2cSJim Jagielski         pTempSet->Put( aAnchor );
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski         const Size aSizeTwip = OutputDevice::LogicToLogic(
291*b1cdbd2cSJim Jagielski             aGraph.GetPrefSize(), aGraph.GetPrefMapMode(), MAP_TWIP );
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski         pTempSet->Put( SwFmtFrmSize( ATT_FIX_SIZE, aSizeTwip.Width(),
294*b1cdbd2cSJim Jagielski             aSizeTwip.Height() ) );
295*b1cdbd2cSJim Jagielski         pTempSet->Put( SwFmtVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::FRAME ));
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski         if( pSFlyPara )
298*b1cdbd2cSJim Jagielski         {
299*b1cdbd2cSJim Jagielski             // OLE im Rahmen ?  ok, Rahmen auf Bildgroesse vergroessern (
300*b1cdbd2cSJim Jagielski             // nur wenn Auto-Breite )
301*b1cdbd2cSJim Jagielski             pSFlyPara->BoxUpWidth( aSizeTwip.Width() );
302*b1cdbd2cSJim Jagielski         }
303*b1cdbd2cSJim Jagielski     }
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski     if (pRet)       // Ole-Object wurde eingefuegt
306*b1cdbd2cSJim Jagielski     {
307*b1cdbd2cSJim Jagielski         if (pRet->ISA(SdrOle2Obj))
308*b1cdbd2cSJim Jagielski         {
309*b1cdbd2cSJim Jagielski             pFmt = InsertOle(*((SdrOle2Obj*)pRet), *pFlySet, *pGrfSet);
310*b1cdbd2cSJim Jagielski             SdrObject::Free( pRet );        // das brauchen wir nicht mehr
311*b1cdbd2cSJim Jagielski         }
312*b1cdbd2cSJim Jagielski         else
313*b1cdbd2cSJim Jagielski             pFmt = rDoc.InsertDrawObj(*pPaM, *pRet, *pFlySet );
314*b1cdbd2cSJim Jagielski     }
315*b1cdbd2cSJim Jagielski     else if (
316*b1cdbd2cSJim Jagielski                 GRAPHIC_GDIMETAFILE == aGraph.GetType() ||
317*b1cdbd2cSJim Jagielski                 GRAPHIC_BITMAP == aGraph.GetType()
318*b1cdbd2cSJim Jagielski             )
319*b1cdbd2cSJim Jagielski     {
320*b1cdbd2cSJim Jagielski         pFmt = rDoc.Insert(*pPaM, aEmptyStr, aEmptyStr, &aGraph, pFlySet,
321*b1cdbd2cSJim Jagielski             pGrfSet, NULL);
322*b1cdbd2cSJim Jagielski     }
323*b1cdbd2cSJim Jagielski     delete pTempSet;
324*b1cdbd2cSJim Jagielski     return pFmt;
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski 
ImportOleWMF(SvStorageRef xSrc1,GDIMetaFile & rWMF,long & rX,long & rY)327*b1cdbd2cSJim Jagielski bool SwWW8ImplReader::ImportOleWMF(SvStorageRef xSrc1,GDIMetaFile &rWMF,
328*b1cdbd2cSJim Jagielski     long &rX,long &rY)
329*b1cdbd2cSJim Jagielski {
330*b1cdbd2cSJim Jagielski     bool bOk = false;
331*b1cdbd2cSJim Jagielski     OLE_MFP aMfp;
332*b1cdbd2cSJim Jagielski     if( SwWw6ReadMetaStream( rWMF, &aMfp, xSrc1 ) )
333*b1cdbd2cSJim Jagielski     {
334*b1cdbd2cSJim Jagielski         /*
335*b1cdbd2cSJim Jagielski         take scaling factor as found in PIC and apply it to graphic.
336*b1cdbd2cSJim Jagielski         */
337*b1cdbd2cSJim Jagielski         SwWw8ReadScaling( rX, rY, xSrc1 );
338*b1cdbd2cSJim Jagielski         Size aFinalSize, aOrigSize;
339*b1cdbd2cSJim Jagielski         aFinalSize.Width() = rX;
340*b1cdbd2cSJim Jagielski         aFinalSize.Height() = rY;
341*b1cdbd2cSJim Jagielski         aFinalSize = OutputDevice::LogicToLogic(
342*b1cdbd2cSJim Jagielski             aFinalSize, MAP_TWIP, rWMF.GetPrefMapMode() );
343*b1cdbd2cSJim Jagielski         aOrigSize = rWMF.GetPrefSize();
344*b1cdbd2cSJim Jagielski         Fraction aScaleX(aFinalSize.Width(),aOrigSize.Width());
345*b1cdbd2cSJim Jagielski         Fraction aScaleY(aFinalSize.Height(),aOrigSize.Height());
346*b1cdbd2cSJim Jagielski         rWMF.Scale( aScaleX, aScaleY );
347*b1cdbd2cSJim Jagielski         bOk = true;
348*b1cdbd2cSJim Jagielski     }
349*b1cdbd2cSJim Jagielski     return bOk;
350*b1cdbd2cSJim Jagielski }
351*b1cdbd2cSJim Jagielski 
ImportOleBase(Graphic & rGraph,const Graphic * pGrf,const SfxItemSet * pFlySet,const Rectangle & aVisArea)352*b1cdbd2cSJim Jagielski SdrObject* SwWW8ImplReader::ImportOleBase( Graphic& rGraph,
353*b1cdbd2cSJim Jagielski     const Graphic* pGrf, const SfxItemSet* pFlySet, const Rectangle& aVisArea )
354*b1cdbd2cSJim Jagielski {
355*b1cdbd2cSJim Jagielski     SdrObject* pRet = 0;
356*b1cdbd2cSJim Jagielski     ASSERT( pStg, "ohne storage geht hier fast gar nichts!" );
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski     ::SetProgressState( nProgress, rDoc.GetDocShell() );     // Update
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski     long nX=0, nY=0;                // nX, nY is graphic size
361*b1cdbd2cSJim Jagielski     bool bOleOk = true;
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski     String aSrcStgName = '_';
364*b1cdbd2cSJim Jagielski     // ergibt Name "_4711"
365*b1cdbd2cSJim Jagielski     aSrcStgName += String::CreateFromInt32( nObjLocFc );
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski     SvStorageRef xSrc0 = pStg->OpenSotStorage(CREATE_CONST_ASC(SL::aObjectPool));
368*b1cdbd2cSJim Jagielski     SvStorageRef xSrc1 = xSrc0->OpenSotStorage( aSrcStgName,
369*b1cdbd2cSJim Jagielski             STREAM_READWRITE| STREAM_SHARE_DENYALL );
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski     if (pGrf)
373*b1cdbd2cSJim Jagielski     {
374*b1cdbd2cSJim Jagielski         rGraph = *pGrf;
375*b1cdbd2cSJim Jagielski         const Size aSizeTwip = OutputDevice::LogicToLogic(
376*b1cdbd2cSJim Jagielski             rGraph.GetPrefSize(), rGraph.GetPrefMapMode(), MAP_TWIP );
377*b1cdbd2cSJim Jagielski         nX = aSizeTwip.Width();
378*b1cdbd2cSJim Jagielski         nY = aSizeTwip.Height();
379*b1cdbd2cSJim Jagielski     }
380*b1cdbd2cSJim Jagielski     else
381*b1cdbd2cSJim Jagielski     {
382*b1cdbd2cSJim Jagielski         GDIMetaFile aWMF;
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski         if (ImportOleWMF(xSrc1,aWMF,nX,nY))
385*b1cdbd2cSJim Jagielski             rGraph = Graphic( aWMF );
386*b1cdbd2cSJim Jagielski         else if( SwWw6ReadMacPICTStream( rGraph, xSrc1 ) )
387*b1cdbd2cSJim Jagielski         {
388*b1cdbd2cSJim Jagielski             // 03-META-Stream nicht da. Vielleicht ein 03-PICT ?
389*b1cdbd2cSJim Jagielski             const Size aSizeTwip = OutputDevice::LogicToLogic(
390*b1cdbd2cSJim Jagielski                 rGraph.GetPrefSize(), rGraph.GetPrefMapMode(), MAP_TWIP );
391*b1cdbd2cSJim Jagielski             nX = aSizeTwip.Width();
392*b1cdbd2cSJim Jagielski             nY = aSizeTwip.Height();
393*b1cdbd2cSJim Jagielski             // PICT: kein WMF da -> Grafik statt OLE
394*b1cdbd2cSJim Jagielski             bOleOk = false;
395*b1cdbd2cSJim Jagielski         }
396*b1cdbd2cSJim Jagielski     }       // StorageStreams wieder zu
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski     Rectangle aRect(0, 0, nX, nY);
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski     if (pFlySet)
402*b1cdbd2cSJim Jagielski     {
403*b1cdbd2cSJim Jagielski         if (const SwFmtFrmSize* pSize =
404*b1cdbd2cSJim Jagielski             (const SwFmtFrmSize*)pFlySet->GetItem(RES_FRM_SIZE, false))
405*b1cdbd2cSJim Jagielski         {
406*b1cdbd2cSJim Jagielski             aRect.SetSize(pSize->GetSize());
407*b1cdbd2cSJim Jagielski         }
408*b1cdbd2cSJim Jagielski     }
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski     if (!(bIsHeader || bIsFooter))
411*b1cdbd2cSJim Jagielski     {
412*b1cdbd2cSJim Jagielski         //Can't put them in headers/footers :-(
413*b1cdbd2cSJim Jagielski         uno::Reference< drawing::XShape > xRef;
414*b1cdbd2cSJim Jagielski         ASSERT(pFormImpl, "Impossible");
415*b1cdbd2cSJim Jagielski         if (pFormImpl && pFormImpl->ReadOCXStream(xSrc1, &xRef, false))
416*b1cdbd2cSJim Jagielski         {
417*b1cdbd2cSJim Jagielski             pRet = GetSdrObjectFromXShape(xRef);
418*b1cdbd2cSJim Jagielski             ASSERT(pRet, "Impossible");
419*b1cdbd2cSJim Jagielski             if (pRet)
420*b1cdbd2cSJim Jagielski                 pRet->SetLogicRect(aRect);
421*b1cdbd2cSJim Jagielski             return pRet;
422*b1cdbd2cSJim Jagielski         }
423*b1cdbd2cSJim Jagielski     }
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski     if (GRAPHIC_GDIMETAFILE == rGraph.GetType() ||
426*b1cdbd2cSJim Jagielski         GRAPHIC_BITMAP == rGraph.GetType())
427*b1cdbd2cSJim Jagielski     {
428*b1cdbd2cSJim Jagielski         ::SetProgressState(nProgress, mpDocShell);     // Update
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski         if (bOleOk)
431*b1cdbd2cSJim Jagielski         {
432*b1cdbd2cSJim Jagielski             sal_uLong nOldPos = pDataStream->Tell();
433*b1cdbd2cSJim Jagielski             pDataStream->Seek(STREAM_SEEK_TO_END);
434*b1cdbd2cSJim Jagielski             SvStream *pTmpData = 0;
435*b1cdbd2cSJim Jagielski             if (nObjLocFc < pDataStream->Tell())
436*b1cdbd2cSJim Jagielski             {
437*b1cdbd2cSJim Jagielski                 pTmpData = pDataStream;
438*b1cdbd2cSJim Jagielski                 pTmpData->Seek( nObjLocFc );
439*b1cdbd2cSJim Jagielski             }
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski             sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski             {
444*b1cdbd2cSJim Jagielski                 SvStorageStreamRef xObjInfoSrc = xSrc1->OpenSotStream( CREATE_CONST_ASC( "\3ObjInfo" ),
445*b1cdbd2cSJim Jagielski                     STREAM_STD_READ | STREAM_NOCREATE );
446*b1cdbd2cSJim Jagielski                 if ( xObjInfoSrc.Is() && !xObjInfoSrc->GetError() )
447*b1cdbd2cSJim Jagielski                 {
448*b1cdbd2cSJim Jagielski                     sal_uInt8 nByte = 0;
449*b1cdbd2cSJim Jagielski                     *xObjInfoSrc >> nByte;
450*b1cdbd2cSJim Jagielski                     if ( ( nByte >> 4 ) & embed::Aspects::MSOLE_ICON )
451*b1cdbd2cSJim Jagielski                         nAspect = embed::Aspects::MSOLE_ICON;
452*b1cdbd2cSJim Jagielski                 }
453*b1cdbd2cSJim Jagielski             }
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski             ErrCode nError = ERRCODE_NONE;
456*b1cdbd2cSJim Jagielski             pRet = SvxMSDffManager::CreateSdrOLEFromStorage(
457*b1cdbd2cSJim Jagielski                 aSrcStgName, xSrc0, mpDocShell->GetStorage(), rGraph, aRect, aVisArea, pTmpData, nError,
458*b1cdbd2cSJim Jagielski                 SwMSDffManager::GetFilterFlags(), nAspect );
459*b1cdbd2cSJim Jagielski             pDataStream->Seek( nOldPos );
460*b1cdbd2cSJim Jagielski         }
461*b1cdbd2cSJim Jagielski     }
462*b1cdbd2cSJim Jagielski     return pRet;
463*b1cdbd2cSJim Jagielski }
464*b1cdbd2cSJim Jagielski 
ReadRevMarkAuthorStrTabl(SvStream & rStrm,sal_Int32 nTblPos,sal_Int32 nTblSiz,SwDoc & rDocOut)465*b1cdbd2cSJim Jagielski void SwWW8ImplReader::ReadRevMarkAuthorStrTabl( SvStream& rStrm,
466*b1cdbd2cSJim Jagielski     sal_Int32 nTblPos, sal_Int32 nTblSiz, SwDoc& rDocOut )
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski     ::std::vector<String> aAuthorNames;
469*b1cdbd2cSJim Jagielski     WW8ReadSTTBF( !bVer67, rStrm, nTblPos, nTblSiz, bVer67 ? 2 : 0,
470*b1cdbd2cSJim Jagielski         eStructCharSet, aAuthorNames );
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski     sal_uInt16 nCount = static_cast< sal_uInt16 >(aAuthorNames.size());
473*b1cdbd2cSJim Jagielski     for( sal_uInt16 nAuthor = 0; nAuthor < nCount; ++nAuthor )
474*b1cdbd2cSJim Jagielski     {
475*b1cdbd2cSJim Jagielski         // Store author in doc
476*b1cdbd2cSJim Jagielski         sal_uInt16 nSWId = rDocOut.InsertRedlineAuthor(aAuthorNames[nAuthor]);
477*b1cdbd2cSJim Jagielski         // Store matchpair
478*b1cdbd2cSJim Jagielski         if( !pAuthorInfos )
479*b1cdbd2cSJim Jagielski             pAuthorInfos = new sw::util::AuthorInfos;
480*b1cdbd2cSJim Jagielski         sw::util::AuthorInfo* pAutorInfo = new sw::util::AuthorInfo( nAuthor, nSWId );
481*b1cdbd2cSJim Jagielski         if( 0 == pAuthorInfos->Insert( pAutorInfo ) )
482*b1cdbd2cSJim Jagielski             delete pAutorInfo;
483*b1cdbd2cSJim Jagielski     }
484*b1cdbd2cSJim Jagielski }
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski /*
487*b1cdbd2cSJim Jagielski    Revision Marks ( == Redlining )
488*b1cdbd2cSJim Jagielski */
489*b1cdbd2cSJim Jagielski // insert or delete content (change char attributes resp.)
Read_CRevisionMark(RedlineType_t eType,const sal_uInt8 * pData,short nLen)490*b1cdbd2cSJim Jagielski void SwWW8ImplReader::Read_CRevisionMark(RedlineType_t eType,
491*b1cdbd2cSJim Jagielski     const sal_uInt8* pData, short nLen )
492*b1cdbd2cSJim Jagielski {
493*b1cdbd2cSJim Jagielski     // there *must* be a SprmCIbstRMark[Del] and a SprmCDttmRMark[Del]
494*b1cdbd2cSJim Jagielski     // pointing to the very same char position as our SprmCFRMark[Del]
495*b1cdbd2cSJim Jagielski     if (!pPlcxMan)
496*b1cdbd2cSJim Jagielski         return;
497*b1cdbd2cSJim Jagielski     const sal_uInt8* pSprmCIbstRMark;
498*b1cdbd2cSJim Jagielski     const sal_uInt8* pSprmCDttmRMark;
499*b1cdbd2cSJim Jagielski     if( nsRedlineType_t::REDLINE_FORMAT == eType )
500*b1cdbd2cSJim Jagielski     {
501*b1cdbd2cSJim Jagielski         pSprmCIbstRMark = pData+1;
502*b1cdbd2cSJim Jagielski         pSprmCDttmRMark = pData+3;
503*b1cdbd2cSJim Jagielski     }
504*b1cdbd2cSJim Jagielski     else
505*b1cdbd2cSJim Jagielski     {
506*b1cdbd2cSJim Jagielski         /*
507*b1cdbd2cSJim Jagielski          #101578#
508*b1cdbd2cSJim Jagielski          It is possible to have a number of date stamps for the created time
509*b1cdbd2cSJim Jagielski          of the change, (possibly a word bug) so we must use the "get a full
510*b1cdbd2cSJim Jagielski          list" varient of HasCharSprm and take the last one as the true one.
511*b1cdbd2cSJim Jagielski         */
512*b1cdbd2cSJim Jagielski         std::vector<const sal_uInt8 *> aResult;
513*b1cdbd2cSJim Jagielski         bool bIns = (nsRedlineType_t::REDLINE_INSERT == eType);
514*b1cdbd2cSJim Jagielski         if( bVer67 )
515*b1cdbd2cSJim Jagielski         {
516*b1cdbd2cSJim Jagielski             pPlcxMan->HasCharSprm(69, aResult);
517*b1cdbd2cSJim Jagielski             pSprmCIbstRMark = aResult.empty() ? 0 : aResult.back();
518*b1cdbd2cSJim Jagielski             aResult.clear();
519*b1cdbd2cSJim Jagielski             pPlcxMan->HasCharSprm(70, aResult);
520*b1cdbd2cSJim Jagielski             pSprmCDttmRMark = aResult.empty() ? 0 : aResult.back();
521*b1cdbd2cSJim Jagielski         }
522*b1cdbd2cSJim Jagielski         else
523*b1cdbd2cSJim Jagielski         {
524*b1cdbd2cSJim Jagielski             pPlcxMan->HasCharSprm( bIns ? 0x4804 : 0x4863, aResult);
525*b1cdbd2cSJim Jagielski             pSprmCIbstRMark = aResult.empty() ? 0 : aResult.back();
526*b1cdbd2cSJim Jagielski             aResult.clear();
527*b1cdbd2cSJim Jagielski             pPlcxMan->HasCharSprm( bIns ? 0x6805 : 0x6864, aResult);
528*b1cdbd2cSJim Jagielski             pSprmCDttmRMark = aResult.empty() ? 0 : aResult.back();
529*b1cdbd2cSJim Jagielski         }
530*b1cdbd2cSJim Jagielski     }
531*b1cdbd2cSJim Jagielski 
532*b1cdbd2cSJim Jagielski     if (nLen < 0)
533*b1cdbd2cSJim Jagielski         mpRedlineStack->close(*pPaM->GetPoint(), eType, pTableDesc );
534*b1cdbd2cSJim Jagielski     else
535*b1cdbd2cSJim Jagielski     {
536*b1cdbd2cSJim Jagielski         // start of new revision mark, if not there default to first entry
537*b1cdbd2cSJim Jagielski         sal_uInt16 nWWAutNo = pSprmCIbstRMark ? SVBT16ToShort( pSprmCIbstRMark ) : 0;
538*b1cdbd2cSJim Jagielski         sw::util::AuthorInfo aEntry(nWWAutNo);
539*b1cdbd2cSJim Jagielski         sal_uInt16 nPos;
540*b1cdbd2cSJim Jagielski         if (pAuthorInfos && pAuthorInfos->Seek_Entry(&aEntry, &nPos))
541*b1cdbd2cSJim Jagielski         {
542*b1cdbd2cSJim Jagielski             if (const sw::util::AuthorInfo* pAuthor = pAuthorInfos->GetObject(nPos))
543*b1cdbd2cSJim Jagielski             {
544*b1cdbd2cSJim Jagielski                 sal_uInt32 nWWDate = pSprmCDttmRMark ? SVBT32ToUInt32(pSprmCDttmRMark): 0;
545*b1cdbd2cSJim Jagielski                 DateTime aStamp(sw::ms::DTTM2DateTime(nWWDate));
546*b1cdbd2cSJim Jagielski                 sal_uInt16 nAutorNo = pAuthor->nOurId;
547*b1cdbd2cSJim Jagielski                 SwFltRedline  aNewAttr(eType, nAutorNo, aStamp);
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski                 NewAttr(aNewAttr);
550*b1cdbd2cSJim Jagielski             }
551*b1cdbd2cSJim Jagielski         }
552*b1cdbd2cSJim Jagielski     }
553*b1cdbd2cSJim Jagielski }
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski // insert new content
Read_CFRMark(sal_uInt16,const sal_uInt8 * pData,short nLen)556*b1cdbd2cSJim Jagielski void SwWW8ImplReader::Read_CFRMark(sal_uInt16 , const sal_uInt8* pData, short nLen)
557*b1cdbd2cSJim Jagielski {
558*b1cdbd2cSJim Jagielski     Read_CRevisionMark( nsRedlineType_t::REDLINE_INSERT, pData, nLen );
559*b1cdbd2cSJim Jagielski }
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski // delete old content
Read_CFRMarkDel(sal_uInt16,const sal_uInt8 * pData,short nLen)562*b1cdbd2cSJim Jagielski void SwWW8ImplReader::Read_CFRMarkDel(sal_uInt16 , const sal_uInt8* pData, short nLen)
563*b1cdbd2cSJim Jagielski {
564*b1cdbd2cSJim Jagielski     Read_CRevisionMark( nsRedlineType_t::REDLINE_DELETE, pData, nLen );
565*b1cdbd2cSJim Jagielski }
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski // change properties of content ( == char formating)
Read_CPropRMark(sal_uInt16,const sal_uInt8 * pData,short nLen)568*b1cdbd2cSJim Jagielski void SwWW8ImplReader::Read_CPropRMark(sal_uInt16 , const sal_uInt8* pData, short nLen)
569*b1cdbd2cSJim Jagielski {
570*b1cdbd2cSJim Jagielski     // complex (len is always 7)
571*b1cdbd2cSJim Jagielski     // 1 byte  - chp.fPropRMark
572*b1cdbd2cSJim Jagielski     // 2 bytes - chp.ibstPropRMark
573*b1cdbd2cSJim Jagielski     // 4 bytes - chp.dttmPropRMark;
574*b1cdbd2cSJim Jagielski     Read_CRevisionMark( nsRedlineType_t::REDLINE_FORMAT, pData, nLen );
575*b1cdbd2cSJim Jagielski }
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski /* vi:set tabstop=4 shiftwidth=4 expandtab: */
578