xref: /trunk/main/sw/source/filter/ww8/ww8struc.hxx (revision 86e1cf34)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
25 
26 #ifndef _WW8STRUC_HXX
27 #define _WW8STRUC_HXX
28 
29 #include <osl/endian.h>
30 #include <tools/string.hxx>
31 #include <sal/config.h>
32 
33 #if defined  OSL_BIGENDIAN || SAL_TYPES_ALIGNMENT4 > 2 || defined UNX
34 #   define __WW8_NEEDS_COPY
35 #endif
36 
37 #ifdef SAL_W32
38 #   pragma pack(push, 2)
39 #elif defined(SAL_OS2)
40 #   pragma pack(2)
41 #endif
42 
Set_UInt8(sal_uInt8 * & p,sal_uInt8 n)43 inline void Set_UInt8( sal_uInt8 *& p, sal_uInt8 n )
44 {
45     ByteToSVBT8( n, *(SVBT8*)p );
46     p+= 1;
47 }
48 
Set_UInt16(sal_uInt8 * & p,sal_uInt16 n)49 inline void Set_UInt16( sal_uInt8 *& p, sal_uInt16 n )
50 {
51     ShortToSVBT16( n, *(SVBT16*)p );
52     p+= 2;
53 }
54 
Set_UInt32(sal_uInt8 * & p,sal_uInt32 n)55 inline void Set_UInt32( sal_uInt8 *& p, sal_uInt32 n )
56 {
57     UInt32ToSVBT32( n, *(SVBT32*)p );
58     p+= 4;
59 }
60 
61 struct Word2CHPX
62 {
63     sal_uInt16 fBold:1;
64     sal_uInt16 fItalic:1;
65     sal_uInt16 fRMarkDel:1;
66     sal_uInt16 fOutline:1;
67     sal_uInt16 fFldVanish:1;
68     sal_uInt16 fSmallCaps:1;
69     sal_uInt16 fCaps:1;
70     sal_uInt16 fVanish:1;
71     sal_uInt16 fRMark:1;
72     sal_uInt16 fSpec:1;
73     sal_uInt16 fStrike:1;
74     sal_uInt16 fObj:1;
75     sal_uInt16 fBoldBi:1;
76     sal_uInt16 fItalicBi:1;
77     sal_uInt16 fBiDi:1;
78     sal_uInt16 fDiacUSico:1;
79     sal_uInt16 fsIco:1;
80     sal_uInt16 fsFtc:1;
81     sal_uInt16 fsHps:1;
82     sal_uInt16 fsKul:1;
83     sal_uInt16 fsPos:1;
84     sal_uInt16 fsSpace:1;
85     sal_uInt16 fsLid:1;
86     sal_uInt16 fsIcoBi:1;
87     sal_uInt16 fsFtcBi:1;
88     sal_uInt16 fsHpsBi:1;
89     sal_uInt16 fsLidBi:1;
90 
91     sal_uInt16 ftc;
92     sal_uInt16 hps;
93     sal_uInt8 qpsSpace:6;
94     sal_uInt8 fSysVanish:1;
95     sal_uInt8 fNumRun:1;
96     sal_uInt8 ico:5;
97     sal_uInt8 kul:3;
98     sal_uInt8 hpsPos;
99     sal_uInt8 icoBi;
100     sal_uInt16 lid;
101     sal_uInt16 ftcBi;
102     sal_uInt16 hpsBi;
103     sal_uInt16 lidBi;
104     sal_uInt32 fcPic;
105 
Word2CHPXWord2CHPX106     Word2CHPX()
107     {
108         fBold = 0;
109         fItalic = 0;
110         fRMarkDel = 0;
111         fOutline = 0;
112         fFldVanish = 0;
113         fSmallCaps = 0;
114         fCaps = 0;
115         fVanish = 0;
116         fRMark = 0;
117         fSpec = 0;
118         fStrike = 0;
119         fObj = 0;
120         fBoldBi = 0;
121         fItalicBi = 0;
122         fBiDi = 0;
123         fDiacUSico = 0;
124         fsIco = 0;
125         fsFtc = 0;
126         fsHps = 0;
127         fsKul = 0;
128         fsPos = 0;
129         fsSpace = 0;
130         fsLid = 0;
131         fsIcoBi = 0;
132         fsFtcBi = 0;
133         fsHpsBi = 0;
134         fsLidBi = 0;
135 
136         ftc = 0;
137         hps = 0;
138         qpsSpace = 0;
139         fSysVanish = 0;
140         fNumRun = 0;
141         ico = 0;
142         kul = 0;
143         hpsPos = 0;
144         icoBi = 0;
145         lid = 0;
146         ftcBi = 0;
147         hpsBi = 0;
148         lidBi = 0;
149         fcPic = 0;
150     }
151 };
152 
153 
154 typedef sal_Int16 WW8_PN;
155 typedef sal_Int32 WW8_FC;
156 typedef sal_Int32 WW8_CP;
157 
158 const WW8_FC WW8_FC_MAX = SAL_MAX_INT32;
159 const WW8_CP WW8_CP_MAX = SAL_MAX_INT32;
160 
161 /** STD - STyle Definition
162 
163     The STD contains the entire definition of a style.
164     It has two parts, a fixed-length base (cbSTDBase bytes long)
165     and a variable length remainder holding the name, and the upx and upe
166     arrays (a upx and upe for each type stored in the style, std.cupx)
167     Note that new fields can be added to the BASE of the STD without
168     invalidating the file format, because the STSHI contains the length
169     that is stored in the file.  When reading STDs from an older version,
170     new fields will be zero.
171 */
172 struct WW8_STD
173 {
174     // Base part of STD:
175     sal_uInt16  sti : 12;          // invariant style identifier
176     sal_uInt16  fScratch : 1;      // spare field for any temporary use,
177                                                          // always reset back to zero!
178     sal_uInt16  fInvalHeight : 1;  // PHEs of all text with this style are wrong
179     sal_uInt16  fHasUpe : 1;       // UPEs have been generated
180     sal_uInt16  fMassCopy : 1;     // std has been mass-copied; if unused at
181                                                          // save time, style should be deleted
182     sal_uInt16  sgc : 4;           // style type code
183     sal_uInt16  istdBase : 12;     // base style
184     sal_uInt16  cupx : 4;          // # of UPXs (and UPEs)
185     sal_uInt16  istdNext : 12;     // next style
186     sal_uInt16  bchUpe;            // offset to end of upx's, start of upe's
187     //-------- jetzt neu:
188     // ab Ver8 gibts zwei Felder mehr:
189   sal_uInt16    fAutoRedef : 1;    /* auto redefine style when appropriate */
190   sal_uInt16    fHidden : 1;       /* hidden from UI? */
191   sal_uInt16    : 14;              /* unused bits */
192 
193     // Variable length part of STD:
194     //  sal_uInt8   stzName[2];        /* sub-names are separated by chDelimStyle
195     // char grupx[];
196             // the UPEs are not stored on the file; they are a cache of the based-on
197         // chain
198     // char grupe[];
199 };
200 
201 /** Basis zum Einlesen UND zum Arbeiten (wird jeweils unter schiedlich beerbt)
202 */
203 struct WW8_FFN_BASE     // Font Descriptor
204 {
205     // ab Ver6
206     sal_uInt8    cbFfnM1;        //  0x0     total length of FFN - 1.
207 
208     sal_uInt8    prg: 2;         //  0x1:03  pitch request
209     sal_uInt8    fTrueType : 1;  //  0x1:04  when 1, font is a TrueType font
210                             //  0x1:08  reserved
211     sal_uInt8    ff : 3;         //  0x1:70  font family id
212                             //  0x1:80  reserved
213 
214     short wWeight;          //  0x2     base weight of font
215     sal_uInt8    chs;            //  0x4     character set identifier
216     sal_uInt8    ibszAlt;        //  0x5     index into ffn.szFfn to the name of the alternate font
217 };
218 
219 /** Hiermit arbeiten wir im Parser (und Dumper)
220 */
221 struct WW8_FFN : public WW8_FFN_BASE
222 {
223     // ab Ver8 als Unicode
224     String sFontname;// 0x6 bzw. 0x40 ab Ver8 zero terminated string that
225                                         // records name of font.
226                                         // Maximal size of szFfn is 65 characters.
227                                         // Vorsicht: Dieses Array kann auch kleiner sein!!!
228                                         // Possibly followed by a second sz which records the
229                                         // name of an alternate font to use if the first named
230                                         // font does not exist on this system.
231 };
232 
233 
234 
235 struct WW8_BRCVer6  // alter Border Code
236 {
237     SVBT16 aBits1;
238 //  sal_uInt16 dxpLineWidth : 3;// 0007 When dxpLineWidth is 0, 1, 2, 3, 4, or 5, this field is the width of
239                             //      a single line of border in units of 0.75 points
240                             //      Must be nonzero when brcType is nonzero.
241                             //      6 == dotted, 7 == dashed.
242 //  sal_uInt16 brcType : 2;     // 0018 border type code: 0 == none, 1 == single, 2 == thick, 3 == double
243 //  sal_uInt16 fShadow : 1;     // 0020 when 1, border is drawn with shadow. Must be 0 when BRC is a substructure of the TC
244 //  sal_uInt16 ico : 5;         // 07C0 color code (see chp.ico)
245 //  sal_uInt16 dxpSpace : 5;    // F800 width of space to maintain between border and text within border.
246                             //      Must be 0 when BRC is a substructure of the TC.  Stored in points for Windows.
247 };
248 
249 class WW8_BRC      // Border Code
250 {
251 public:
252     SVBT16 aBits1;
253     SVBT16 aBits2;
254 //  sal_uInt16 dxpLineWidth : 3;// 0007 When dxpLineWidth is 0, 1, 2, 3, 4, or 5, this field is the width of
255                             //      a single line of border in units of 0.75 points
256                             //      Must be nonzero when brcType is nonzero.
257                             //      6 == dotted, 7 == dashed.
258 //  sal_uInt16 brcType : 2;     // 0018 border type code: 0 == none, 1 == single, 2 == thick, 3 == double
259 //  sal_uInt16 fShadow : 1;     // 0020 when 1, border is drawn with shadow. Must be 0 when BRC is a substructure of the TC
260 //  sal_uInt16 ico : 5;         // 07C0 color code (see chp.ico)
261 //  sal_uInt16 dxpSpace : 5;    // F800 width of space to maintain between border and text within border.
262                             //      Must be 0 when BRC is a substructure of the TC.  Stored in points for Windows.
WW8_BRC()263     WW8_BRC()
264     {
265         memset(aBits1, 0, sizeof(aBits1));
266         memset(aBits2, 0, sizeof(aBits2));
267     }
268     short DetermineBorderProperties (bool bVer67, short *pSpace=0,
269         sal_uInt8 *pCol=0, short *pIdx=0) const;
270     bool IsEmpty(bool bVer67) const;
271     bool IsZeroed(bool bVer67) const;
272     bool IsBlank() const;
273 };
274 
275 typedef WW8_BRC WW8_BRC5[5];        // 5 * Border Code
276 
277 enum BRC_Sides
278 {
279     WW8_TOP = 0, WW8_LEFT = 1, WW8_BOT = 2, WW8_RIGHT = 3, WW8_BETW = 4
280 };
281 
282 class WW8_BordersSO         // for StarOffice-Border Code
283 {
284 public:
285     sal_uInt16 mnOut;
286     sal_uInt16 mnIn;
287     sal_uInt16 mnDist;
288 public:
289     enum eBorderCode
290     {
291         single0, single1, single2, single3, single4, single5,
292         double0, double1, double2, double3, double4, double5, double6,
293         double7, double8, double9, double10,
294         none
295     };
296     static const WW8_BordersSO &Get0x01LineMatch(eBorderCode nIdx);
297 };
298 
299 /*
300 Document Typography Info (DOPTYPOGRAPHY) These options are Far East only,
301 and are accessible through the Typography tab of the Tools/Options dialog.
302 */
303 class WW8DopTypography
304 {
305 public:
306     void ReadFromMem(sal_uInt8 *&pData);
307     void WriteToMem(sal_uInt8 *&pData) const;
308 
309     //Maps what I think is the language this is to affect to the OOo language
310     sal_uInt16 GetConvertedLang() const;
311 
312     sal_uInt16 fKerningPunct  : 1;  // true if we're kerning punctuation
313     sal_uInt16 iJustification : 2;  // Kinsoku method of justification:
314                                 //  0 = always expand
315                                 //  1 = compress punctuation
316                                 //  2 = compress punctuation and kana.
317     sal_uInt16 iLevelOfKinsoku : 2; // Level of Kinsoku:
318                                 //  0 = Level 1
319                                 //  1 = Level 2
320                                 //  2 = Custom
321     sal_uInt16 f2on1          : 1;  // 2-page-on-1 feature is turned on.
322     sal_uInt16 reserved1      : 4;  // in 97 its marked as reserved BUT
323     sal_uInt16 reserved2      : 6;  // reserved ?
324     //we find that the following applies,
325     //2 == Japanese
326     //4 == Chinese (VR...
327     //6 == Korean
328     //8 == Chinese (Ta...
329     //perhaps a bit field where the DOP can possibly relate to more than
330     //one language at a time, nevertheless MS seems to have painted
331     //themselves into a small corner with one DopTypography for the
332     //full document, might not matter all that much though ?
333 
334     enum RuleLengths {nMaxFollowing = 101, nMaxLeading = 51};
335     static const sal_Unicode * GetJapanNotBeginLevel1();
336     static const sal_Unicode * GetJapanNotEndLevel1();
337 
338     sal_Int16 cchFollowingPunct;    // length of rgxchFPunct
339     sal_Int16 cchLeadingPunct;      // length of rgxchLPunct
340 
341     // array of characters that should never appear at the start of a line
342     sal_Unicode rgxchFPunct[nMaxFollowing];
343     // array of characters that should never appear at the end of a line
344     sal_Unicode rgxchLPunct[nMaxLeading];
345 };
346 
347 struct WW8_DOGRID
348 {
349     short xaGrid;       // x-coord of the upper left-hand corner of the grid
350     short yaGrid;       // y-coord of the upper left-hand corner of the grid
351     short dxaGrid;  // width of each grid square
352     short dyaGrid;  // height of each grid square
353 
354 
355 
356     /* a c h t u n g :     es duerfen keine solchen Bitfelder ueber einen eingelesenes Byte-Array
357                             gelegt werden!!
358                             stattdessen ist ein aBits1 darueber zu legen, das mit & auszulesen ist
359     GRUND: Compiler auf Intel und Sparc sortieren die Bits unterschiedlich
360     */
361 
362 
363 
364     short dyGridDisplay:7;  // the number of grid squares (in the y direction)
365                                                     // between each gridline drawn on the screen. 0 means
366                                                     // don't display any gridlines in the y direction.
367     short fTurnItOff   :1;  // suppress display of gridlines
368     short dxGridDisplay:7;  // the number of grid squares (in the x direction)
369                                                     // between each gridline drawn on the screen. 0 means
370                                                     // don't display any gridlines in the y direction.
371     short fFollowMargins:1; // if true, the grid will start at the left and top
372                                                     // margins and ignore xaGrid and yaGrid.
373 };
374 
375 struct WW8_PIC
376 {
377     sal_Int32 lcb;          // 0x0 number of bytes in the PIC structure plus size of following picture data which may be a Window's metafile, a bitmap, or the filename of a TIFF file.
378     sal_uInt16 cbHeader;    // 0x4 number of bytes in the PIC (to allow for future expansion).
379     struct {
380         sal_Int16 mm;       // 0x6  int
381         sal_Int16 xExt;     // 0x8  int
382         sal_Int16 yExt;     // 0xa  int
383         sal_Int16 hMF;      // 0xc  int
384     }MFP;
385 //  sal_uInt8 bm[14];        // 0xe  BITMAP(14 bytes)    Window's bitmap structure when PIC describes a BITMAP.
386     sal_uInt8 rcWinMF[14];   // 0xe  rc (rectangle - 8 bytes) rect for window origin
387                         //      and extents when  metafile is stored -- ignored if 0
388     sal_Int16 dxaGoal;      // 0x1c horizontal  measurement in twips of the  rectangle the picture should be imaged within.
389     sal_Int16 dyaGoal;      // 0x1e vertical  measurement in twips of the  rectangle the picture should be imaged within.
390     sal_uInt16 mx;          // 0x20 horizontal scaling factor supplied by user in .1% units.
391     sal_uInt16 my;          // 0x22 vertical scaling factor supplied by user in .1% units.
392     sal_Int16 dxaCropLeft;  // 0x24 the amount the picture has been cropped on the left in twips.
393     sal_Int16 dyaCropTop;   // 0x26 the amount the picture has been cropped on the top in twips.
394     sal_Int16 dxaCropRight; // 0x28 the amount the picture has been cropped on the right in twips.
395     sal_Int16 dyaCropBottom;// 0x2a the amount the picture has been cropped on the bottom in twips.
396     sal_Int16 brcl : 4;     // 000F Obsolete, superseded by brcTop, etc.  In
397     sal_Int16 fFrameEmpty : 1;  // 0010 picture consists of a single frame
398     sal_Int16 fBitmap : 1;      // 0020 ==1, when picture is just a bitmap
399     sal_Int16 fDrawHatch : 1;   // 0040 ==1, when picture is an active OLE object
400     sal_Int16 fError : 1;       // 0080 ==1, when picture is just an error message
401     sal_Int16 bpp : 8;      // FF00 bits per pixel, 0 = unknown
402     WW8_BRC rgbrc[4];
403 //  BRC brcTop;         // 0x2e specification for border above picture
404 //  BRC brcLeft;        // 0x30 specification for border to the left
405 //  BRC brcBottom;      // 0x32 specification for border below picture
406 //  BRC brcRight;       // 0x34 specification for border to the right
407     sal_Int16 dxaOrigin;    // 0x36 horizontal offset of hand annotation origin
408     sal_Int16 dyaOrigin;    // 0x38 vertical offset of hand annotation origin
409 //  sal_uInt8 rgb[];         // 0x3a variable array of bytes containing Window's metafile, bitmap or TIFF file filename.
410 };
411 
412 struct WW8_PIC_SHADOW
413 {
414     SVBT32 lcb;         // 0x0 number of bytes in the PIC structure plus size of following picture data which may be a Window's metafile, a bitmap, or the filename of a TIFF file.
415     SVBT16 cbHeader;    // 0x4 number of bytes in the PIC (to allow for future expansion).
416     struct {
417         SVBT16 mm;      // 0x6  int
418         SVBT16 xExt;        // 0x8  int
419         SVBT16 yExt;        // 0xa  int
420         SVBT16 hMF;     // 0xc  int
421     }MFP;
422 //  SVBT8 bm[14];       // 0xe  BITMAP(14 bytes)    Window's bitmap structure when PIC describes a BITMAP.
423     SVBT8 rcWinMF[14];  // 0xe  rc (rectangle - 8 bytes) rect for window origin
424                         //      and extents when  metafile is stored -- ignored if 0
425     SVBT16 dxaGoal;     // 0x1c horizontal  measurement in twips of the  rectangle the picture should be imaged within.
426     SVBT16 dyaGoal;     // 0x1e vertical  measurement in twips of the  rectangle the picture should be imaged within.
427     SVBT16 mx;          // 0x20 horizontal scaling factor supplied by user in .1% units.
428     SVBT16 my;          // 0x22 vertical scaling factor supplied by user in .1% units.
429     SVBT16 dxaCropLeft; // 0x24 the amount the picture has been cropped on the left in twips.
430     SVBT16 dyaCropTop;  // 0x26 the amount the picture has been cropped on the top in twips.
431     SVBT16 dxaCropRight;    // 0x28 the amount the picture has been cropped on the right in twips.
432     SVBT16 dyaCropBottom;// 0x2a    the amount the picture has been cropped on the bottom in twips.
433     SVBT8 aBits1; //0x2c
434     SVBT8 aBits2;
435 //  WW8_BRC rgbrc[4];
436 //  BRC brcTop;         // 0x2e specification for border above picture
437 //  BRC brcLeft;        // 0x30 specification for border to the left
438 //  BRC brcBottom;      // 0x32 specification for border below picture
439 //  BRC brcRight;       // 0x34 specification for border to the right
440 //  SVBT16 dxaOrigin;   // 0x36 horizontal offset of hand annotation origin
441 //  SVBT16 dyaOrigin;   // 0x38 vertical offset of hand annotation origin
442 //  SVBT8 rgb[];            // 0x3a variable array of bytes containing Window's metafile, bitmap or TIFF file filename.
443 };
444 
445 
446 struct WW8_TBD
447 {
448     SVBT8 aBits1;
449 //  sal_uInt8 jc : 3;        // 0x07 justification code: 0=left tab, 1=centered tab, 2=right tab, 3=decimal tab, 4=bar
450 //  sal_uInt8 tlc : 3;       // 0x38 tab leader code: 0=no leader, 1=dotted leader,
451                         // 2=hyphenated leader, 3=single line leader, 4=heavy line leader
452 //  *   int :2  C0  reserved
453 };
454 
455 struct WW8_TCell    // hiermit wird weitergearbeitet (entspricht weitestgehend dem Ver8-Format)
456 {
457     sal_uInt8 bFirstMerged   : 1;// 0001 set to 1 when cell is first cell of a range of cells that have been merged.
458     sal_uInt8 bMerged        : 1;// 0002 set to 1 when cell has been merged with preceding cell.
459     sal_uInt8 bVertical      : 1;// set to 1 when cell has vertical text flow
460     sal_uInt8 bBackward      : 1;// for a vertical table cell, text flow is bottom to top when 1 and is bottom to top when 0.
461     sal_uInt8 bRotateFont    : 1;// set to 1 when cell has rotated characters (i.e. uses @font)
462     sal_uInt8 bVertMerge     : 1;// set to 1 when cell is vertically merged with the cell(s) above and/or below. When cells are vertically merged, the display area of the merged cells are consolidated. The consolidated area is used to display the contents of the first vertically merged cell (the cell with fVertRestart set to 1), and all other vertically merged cells (those with fVertRestart set to 0) must be empty. Cells can only be merged vertically if their left and right boundaries are (nearly) identical (i.e. if corresponding entries in rgdxaCenter of the table rows differ by at most 3).
463     sal_uInt8 bVertRestart   : 1;// set to 1 when the cell is the first of a set of vertically merged cells. The contents of a cell with fVertStart set to 1 are displayed in the consolidated area belonging to the entire set of vertically merged cells. Vertically merged cells with fVertRestart set to 0 must be empty.
464     sal_uInt8 nVertAlign     : 2;// specifies the alignment of the cell contents relative to text flow (e.g. in a cell with bottom to top text flow and bottom vertical alignment, the text is shifted horizontally to match the cell's right boundary):
465                                                     //          0 top
466                                                     //          1 center
467                                                     //          2 bottom
468     sal_uInt16 fUnused      : 7;// reserved - nicht loeschen: macht das sal_uInt16 voll !!
469 
470     WW8_BRC rgbrc[4];               // border codes
471 //notational convenience for referring to brcTop, brcLeft, etc fields.
472 //  BRC brcTop;             // specification of the top border of a table cell
473 //  BRC brcLeft;            // specification of left border of table row
474 //  BRC brcBottom;          // specification of bottom border of table row
475 //  BRC brcRight;           // specification of right border of table row.
476 };
477 // cbTC (count of bytes of a TC) is 18(decimal), 12(hex).
478 
479 
480 struct WW8_TCellVer6    // wird aus der Datei gelesen
481 {
482     SVBT8  aBits1Ver6;
483     SVBT8  aBits2Ver6;
484 //  sal_uInt16 fFirstMerged : 1;// 0001 set to 1 when cell is first cell of a range of cells that have been merged.
485 //  sal_uInt16 fMerged : 1;     // 0002 set to 1 when cell has been merged with preceding cell.
486 //  sal_uInt16 fUnused : 14;    // FFFC reserved
487     WW8_BRCVer6 rgbrcVer6[4];
488 // notational convenience for referring to brcTop, brcLeft, etc fields:
489 //          BRC brcTop;             // specification of the top border of a table cell
490 //          BRC brcLeft;            // specification of left border of table row
491 //          BRC brcBottom;          // specification of bottom border of table row
492 //          BRC brcRight;           // specification of right border of table row.
493 };
494 // cbTC (count of bytes of a TC) is 10(decimal), A(hex).
495 
496 struct WW8_TCellVer8    // wird aus der Datei gelesen
497 {
498     SVBT16 aBits1Ver8;      // Dokumentation siehe oben unter WW8_TCell
499     SVBT16 aUnused;         // reserve
500     WW8_BRC rgbrcVer8[4];   // Dokumentation siehe oben unter WW8_TCell
501 };
502 // cbTC (count of bytes of a TC) is 20(decimal), 14(hex).
503 
504 
505 struct WW8_SHD              // struct SHD fehlt in der Beschreibung
506 {
507 private:
508     sal_uInt16 maBits;
509 //  sal_uInt16 nFore : 5;       // 0x001f ForegroundColor
510 //  sal_uInt16 nBack : 5;       // 0x03e0 BackgroundColor
511 //  sal_uInt16 nStyle : 5;      // 0x7c00 Percentage and Style
512 //  sal_uInt16 nDontKnow : 1;   // 0x8000 ???   ab Ver8: ebenfalls fuer Style
513 
514 public:
WW8_SHDWW8_SHD515     WW8_SHD() : maBits(0) {}
516 
GetForeWW8_SHD517     sal_uInt8 GetFore() const { return (sal_uInt8)( maBits & 0x1f); }
GetBackWW8_SHD518     sal_uInt8 GetBack() const { return (sal_uInt8)((maBits >> 5 ) & 0x1f); }
GetStyleWW8_SHD519     sal_uInt8 GetStyle(bool bVer67)  const
520         { return (sal_uInt8)((maBits >> 10) & ( bVer67 ? 0x1f : 0x3f ) ); }
521 
GetValueWW8_SHD522     sal_uInt16 GetValue() const { return maBits; }
523 
SetValueWW8_SHD524     void SetValue(sal_uInt16 nVal) { maBits = nVal; }
SetWWValueWW8_SHD525     void SetWWValue(SVBT16 nVal) { maBits = SVBT16ToShort(nVal); }
526 
SetForeWW8_SHD527     void SetFore(sal_uInt8 nVal)
528     {
529         maBits &= 0xffe0;
530         maBits |= (nVal & 0x1f);
531     }
SetBackWW8_SHD532     void SetBack(sal_uInt8 nVal)
533     {
534         maBits &= 0xfc1f;
535         maBits |= (nVal & 0x1f) << 5;
536     }
SetStyleWW8_SHD537     void SetStyle(bool bVer67, sal_uInt8 nVal)
538     {
539         if (bVer67)
540         {
541             maBits &= 0x83ff;
542             maBits |= (nVal & 0x1f) << 10;
543         }
544         else
545         {
546             maBits &= 0x03ff;
547             maBits |= (nVal & 0x2f) << 10;
548         }
549     }
550 };
551 
552 struct WW8_ANLV
553 {
554     SVBT8 nfc;          // 0        number format code, 0=Arabic, 1=Upper case Roman, 2=Lower case Roman
555                         //          3=Upper case Letter, 4=Lower case letter, 5=Ordinal
556     SVBT8 cbTextBefore; // 1        offset into anld.rgch limit of prefix text
557     SVBT8 cbTextAfter;  // 2
558     SVBT8 aBits1;
559 //  sal_uInt8 jc : 2;        // 3 : 0x03 justification code, 0=left, 1=center, 2=right, 3=left and right justify
560 //  sal_uInt8 fPrev : 1;     //     0x04 when ==1, include previous levels
561 //  sal_uInt8 fHang : 1;     //     0x08 when ==1, number will be displayed using a hanging indent
562 //  sal_uInt8 fSetBold : 1;  //     0x10 when ==1, boldness of number will be determined by anld.fBold.
563 //  sal_uInt8 fSetItalic : 1;//     0x20 when ==1, italicness of number will be determined by anld.fItalic
564 //  sal_uInt8 fSetSmallCaps : 1;//  0x40 when ==1, anld.fSmallCaps will determine whether number will be displayed in small caps or not.
565 //  sal_uInt8 fSetCaps : 1;  //     0x80 when ==1, anld.fCaps will determine whether number will be displayed capitalized or not
566     SVBT8 aBits2;
567 //  sal_uInt8 fSetStrike : 1;// 4 : 0x01 when ==1, anld.fStrike will determine whether the number will be displayed using strikethrough or not.
568 //  sal_uInt8 fSetKul : 1;   //     0x02 when ==1, anld.kul will determine the underlining state of the autonumber.
569 //  sal_uInt8 fPrevSpace : 1;//     0x04 when ==1, autonumber will be displayed with a single prefixing space character
570 //  sal_uInt8 fBold : 1;     //     0x08 determines boldness of autonumber when anld.fSetBold == 1.
571 //  sal_uInt8 fItalic : 1;   //     0x10 determines italicness of autonumber when anld.fSetItalic == 1.
572 //  sal_uInt8 fSmallCaps : 1;//     0x20 determines whether autonumber will be displayed using small caps when anld.fSetSmallCaps == 1.
573 //  sal_uInt8 fCaps : 1;     //     0x40 determines whether autonumber will be displayed using caps when anld.fSetCaps == 1.
574 //  sal_uInt8 fStrike : 1;   //     0x80 determines whether autonumber will be displayed using caps when anld.fSetStrike == 1.
575     SVBT8 aBits3;
576 //  sal_uInt8 kul : 3;       // 5 : 0x07 determines whether  autonumber will be displayed with underlining when anld.fSetKul == 1.
577 //  sal_uInt8 ico : 5;       //     0xF1 color of autonumber
578     SVBT16 ftc;         // 6        font code of  autonumber
579     SVBT16 hps;         // 8        font half point size (or 0=auto)
580     SVBT16 iStartAt;    // 0x0a     starting value (0 to 65535)
581     SVBT16 dxaIndent;   // 0x0c     *short?* *sal_uInt16?* width of prefix text (same as indent)
582     SVBT16 dxaSpace;    // 0x0e     minimum space between number and paragraph
583 };
584 // *cbANLV (count of bytes of ANLV) is 16 (decimal), 10(hex).
585 
586 struct WW8_ANLD
587 {
588     WW8_ANLV eAnlv;     // 0
589     SVBT8 fNumber1;     // 0x10     number only 1 item per table cell
590     SVBT8 fNumberAcross;    // 0x11     number across cells in table rows(instead of down)
591     SVBT8 fRestartHdn;  // 0x12     restart heading number on section boundary
592     SVBT8 fSpareX;      // 0x13     unused( should be 0)
593     sal_uInt8  rgchAnld[32]; // 0x14 characters displayed before/after autonumber
594 };
595 
596 struct WW8_OLST
597 {
598     WW8_ANLV rganlv[9]; // 0    an array of 9 ANLV structures (heading levels)
599     SVBT8 fRestartHdr;  // 0x90 when ==1, restart heading on section break
600     SVBT8 fSpareOlst2;  // 0x91 reserved
601     SVBT8 fSpareOlst3;  // 0x92 reserved
602     SVBT8 fSpareOlst4;  // 0x93 reserved
603     sal_uInt8 rgch[64];      // 0x94 array of 64 chars       text before/after number
604 };
605 // cbOLST is 212(decimal), D4(hex).
606 
607 #if 0
608 struct ANLV
609 {
610     ALNV();
611     void ReadFromMem(const sal_uInt8 *&pData);
612     sal_uInt8 nfc;
613     sal_uInt8 cbTextBefore;
614     sal_uInt8 cbTextAfter;
615     sal_uInt8 jc : 2;
616     sal_uInt8 fPrev : 1;
617     sal_uInt8 fHang : 1;
618     sal_uInt8 fSetBold : 1;
619     sal_uInt8 fSetItalic : 1;
620     sal_uInt8 fSetSmallCaps : 1;
621     sal_uInt8 fSetCaps : 1;
622     sal_uInt8 fSetStrike : 1;
623     sal_uInt8 fSetKul : 1;
624     sal_uInt8 fPrevSpace : 1;
625     sal_uInt8 fBold : 1;
626     sal_uInt8 fItalic : 1;
627     sal_uInt8 fSmallCaps : 1;
628     sal_uInt8 fCaps : 1;
629     sal_uInt8 fStrike : 1;
630     sal_uInt8 kul : 3;
631     sal_uInt8 ico : 5;
632     sal_uInt16 ftc;
633     sal_uInt16 hps;
634     sal_uInt16 iStartAt;
635     sal_uInt16 dxaIndent;
636     sal_uInt16 dxaSpace;
637 };
638 
639 struct OLST
640 {
641     OLST();
642     void ReadFromMem(const sal_uInt8 *&pData, bool bVer67)
643     ANLV rganlv[9];         // 0 an array of 9 ANLV structures (heading levels)
644     sal_uInt8 fRestartHdr;  // when ==1, restart heading on section break
645     sal_uInt8 fSpareOlst2;  // reserved
646     sal_uInt8 fSpareOlst3;  // reserved
647     sal_uInt8 fSpareOlst4;  // reserved
648     sal_uInt16 rgxch[64];   // array of 64 chars text before/after number
649 #if 0
650     sal_uInt16 rgxch[32];   // array of 32 chars text before/after number
651     sal_uInt8 rgch[64];     // array of 64 chars text before/after number
652 #endif
653 };
654 #endif
655 
656 struct WW8_FDOA
657 {
658     SVBT32 fc;          // 0  FC pointing to drawing object data
659     SVBT16 ctxbx;       // 4  count of textboxes in the drawing object
660 };
661 
662 struct WW8_DO
663 {
664     SVBT16 dok;             // 0    Drawn Object Kind, currently this is always 0
665     SVBT16 cb;              // 2    size (count of bytes) of the entire DO
666     SVBT8  bx;              // 4    x position relative to anchor CP
667     SVBT8  by;              // 5    y position relative to anchor CP
668     SVBT16 dhgt;                // 6    height of DO
669     SVBT16 aBits1;
670 //  sal_uInt16 fAnchorLock : 1; // 8    1 if the DO anchor is locked
671 //  sal_uInt8[] rgdp;            // 0xa  variable length array of drawing primitives
672 };
673 
674 struct WW8_DPHEAD
675 {
676     SVBT16 dpk;         //  0   Drawn Primitive Kind  REVIEW davebu
677   //        0=start of grouping, 1=line, 2=textbox, 3=rectangle,
678   //        4=arc, 5=elipse, 6=polyline, 7=callout textbox,
679   //        8=end of grouping, 9=sample primitve holding default values
680     SVBT16 cb;          // 2    size (count of bytes) of this DP
681     SVBT16 xa;          // 4    These 2 points describe the rectangle
682     SVBT16 ya;          // 6    enclosing this DP relative to the origin of
683     SVBT16 dxa;         // 8    the DO
684     SVBT16 dya;         // 0xa
685 };
686 
687 
688 struct WW8_DP_LINETYPE
689 {
690     SVBT32 lnpc;            // LiNe Property Color -- RGB color value
691     SVBT16 lnpw;            // line property weight in twips
692     SVBT16 lnps;            // line property style : 0=Solid, 1=Dashed
693                             // 2=Dotted, 3=Dash Dot, 4=Dash Dot Dot, 5=Hollow
694 };
695 
696 struct WW8_DP_SHADOW    // Schattierung!
697 {
698     SVBT16 shdwpi;          // Shadow Property Intensity
699     SVBT16 xaOffset;        // x offset of shadow
700     SVBT16 yaOffset;        // y offset of shadow
701 };
702 
703 struct WW8_DP_FILL
704 {
705     SVBT32 dlpcFg;          // FiLl Property Color ForeGround -- RGB color value
706     SVBT32 dlpcBg;          // Property Color BackGround -- RGB color value
707     SVBT16 flpp;            // FiLl Property Pattern REVIEW davebu
708 };
709 
710 struct WW8_DP_LINEEND
711 {
712     SVBT16 aStartBits;
713 //  sal_uInt16 eppsStart : 2;   // Start EndPoint Property Style
714                             // 0=None, 1=Hollow, 2=Filled
715 //  sal_uInt16 eppwStart : 2;   // Start EndPoint Property Weight
716 //  sal_uInt16 epplStart : 2;   // Start EndPoint Property length
717 //  sal_uInt16 dummyStart : 10; // Alignment
718     SVBT16 aEndBits;
719 //  sal_uInt16 eppsEnd : 2;     // End EndPoint Property Style
720 //  sal_uInt16 eppwEnd : 2;     // End EndPoint Property Weight
721 //  sal_uInt16 epplEnd : 2;     // End EndPoint Property length
722 //  sal_uInt16 dummyEnd : 10;   // Alignment
723 };
724 
725 struct WW8_DP_LINE
726 {
727 //  WW8_DPHEAD dphead;      // 0    Common header for a drawing primitive
728     SVBT16 xaStart;         // starting point for line
729     SVBT16 yaStart;         //
730     SVBT16 xaEnd;           // ending point for line
731     SVBT16 yaEnd;
732     WW8_DP_LINETYPE aLnt;
733     WW8_DP_LINEEND aEpp;
734     WW8_DP_SHADOW aShd;
735 };
736 
737 struct WW8_DP_TXTBOX
738 {
739     WW8_DP_LINETYPE aLnt;
740     WW8_DP_FILL aFill;
741     WW8_DP_SHADOW aShd;
742     SVBT16 aBits1;
743 //  sal_uInt16 fRoundCorners : 1; //0x24    0001    1 if the textbox has rounded corners
744 //  sal_uInt16 zaShape : 15;    // 0x24     000e    REVIEW davebu
745     SVBT16 dzaInternalMargin; // 0x26   REVIEW davebu
746 };
747 
748 struct WW8_DP_RECT
749 {
750     WW8_DP_LINETYPE aLnt;
751     WW8_DP_FILL aFill;
752     WW8_DP_SHADOW aShd;
753     SVBT16 aBits1;
754 //  sal_uInt16 fRoundCorners : 1; // 0x24   0001    1 if the textbox has rounded corners
755 //  sal_uInt16 zaShape : 15; // 0x24 000e   REVIEW davebu
756 };
757 
758 struct WW8_DP_ARC
759 {
760     WW8_DP_LINETYPE aLnt;
761     WW8_DP_FILL aFill;
762     WW8_DP_SHADOW aShd;
763     SVBT8 fLeft;        // 0x24 00ff    REVIEW davebu
764     SVBT8 fUp;          // 0x24 ff00    REVIEW davebu
765 //  sal_uInt16 fLeft : 8;   // 0x24 00ff    REVIEW davebu
766 //  sal_uInt16 fUp : 8;     // 0x24 ff00    REVIEW davebu
767 };
768 
769 struct WW8_DP_ELIPSE
770 {
771     WW8_DP_LINETYPE aLnt;
772     WW8_DP_FILL aFill;
773     WW8_DP_SHADOW aShd;
774 };
775 
776 struct WW8_DP_POLYLINE
777 {
778     WW8_DP_LINETYPE aLnt;
779     WW8_DP_FILL aFill;
780     WW8_DP_LINEEND aEpp;
781     WW8_DP_SHADOW aShd;
782     SVBT16 aBits1;
783 //  sal_uInt16 fPolygon : 1; // 0x28  0001  1 if this is a polygon
784 //  sal_uInt16 cpt : 15;    // 0x28   00fe  count of points
785 //  short xaFirst;      // 0x2a These are the endpoints of the first line.
786 //  short yaFirst;      // 0x2c
787 //  short xaEnd;        // 0x2e
788 //  short yaEnd;        // 0x30
789 //  short rgpta[];      // 0x32 An array of xa,ya pairs for the remaining points
790 };
791 
792 struct WW8_DP_CALLOUT_TXTBOX
793 {
794     SVBT16 flags;               // 0x0c REVIEW davebu flags
795     SVBT16 dzaOffset;           // 0x0e REVIEW davebu
796     SVBT16 dzaDescent;          // 0x10 REVIEW davebu
797     SVBT16 dzaLength;           // 0x12 REVIEW davebu
798     WW8_DPHEAD dpheadTxbx;      // 0x14 DPHEAD for a textbox
799     WW8_DP_TXTBOX dptxbx;       // 0x20 DP for a textbox
800     WW8_DPHEAD dpheadPolyLine;  // 0x4c DPHEAD for a Polyline
801     WW8_DP_POLYLINE dpPolyLine; // 0x48 DP for a polyline
802 };
803 
804 struct WW8_PCD
805 {
806     SVBT8 aBits1;
807 //  sal_uInt8 fNoParaLast : 1;   // when 1, means that piece contains no end of paragraph marks.
808 //  sal_uInt8 fPaphNil : 1;      // used internally by Word
809 //  sal_uInt8 fCopied : 1;       // used internally by Word
810 //          *   int :5
811     SVBT8 aBits2;           // fn int:8, used internally by Word
812     SVBT32 fc;              // file offset of beginning of piece. The size of the
813                             // ithpiece can be determined by subtracting rgcp[i] of
814                             // the containing plcfpcd from its rgcp[i+1].
815     SVBT16 prm;             // PRM contains either a single sprm or else an index number
816                             // of the grpprl which contains the sprms that modify the
817                             // properties of the piece.
818 };
819 
820 // AnnoTation References Descriptor (ATRD)
821 struct WW8_ATRD                 // fuer die 8-Version
822 {
823     SVBT16 xstUsrInitl[ 10 ];       // pascal-style String holding initials
824                                     // of annotation author
825     SVBT16 ibst;                    // index into GrpXstAtnOwners
826     SVBT16 ak;                      // not used
827     SVBT16 grfbmc;                  // not used
828     SVBT32 ITagBkmk;                // when not -1, this tag identifies the
829                                     // annotation bookmark that locates the
830                                     // range of CPs in the main document which
831                                     // this annotation references.
832 };
833 
834 struct WW8_ATRDEXTRA
835 {
836     // ---  Extended bit since Word 2002 --- //
837 
838     SVBT32 dttm;
839     SVBT16 bf;
840     SVBT32 cDepth;
841     SVBT32 diatrdParent;
842     SVBT32 Discussitem;
843 };
844 
845 struct WW67_ATRD                // fuer die 6/7-Version
846 {
847     sal_Char xstUsrInitl[ 10 ];     // pascal-style String holding initials
848                                     // of annotation author
849     SVBT16 ibst;                    // index into GrpXstAtnOwners
850     SVBT16 ak;                      // not used
851     SVBT16 grfbmc;                  // not used
852     SVBT32 ITagBkmk;                // when not -1, this tag identifies the
853                                     // annotation bookmark that locates the
854                                     // range of CPs in the main document which
855                                     // this annotation references.
856 };
857 
858 struct WW8_TablePos
859 {
860     sal_Int16 nSp26;
861     sal_Int16 nSp27;
862     sal_Int16 nLeMgn;
863     sal_Int16 nRiMgn;
864     sal_Int16 nUpMgn;
865     sal_Int16 nLoMgn;
866     sal_uInt8 nSp29;
867     sal_uInt8 nSp37;
868 };
869 
870 struct WW8_FSPA
871 {
872 public:
873     sal_Int32 nSpId;     //Shape Identifier. Used in conjunction with the office art data (found via fcDggInfo in the FIB) to find the actual data for this shape.
874     sal_Int32 nXaLeft;   //left of rectangle enclosing shape relative to the origin of the shape
875     sal_Int32 nYaTop;        //top of rectangle enclosing shape relative to the origin of the shape
876     sal_Int32 nXaRight;  //right of rectangle enclosing shape relative to the origin of the shape
877     sal_Int32 nYaBottom;//bottom of the rectangle enclosing shape relative to the origin of the shape
878     sal_uInt16 bHdr:1;
879     //0001 1 in the undo doc when shape is from the header doc, 0 otherwise (undefined when not in the undo doc)
880     sal_uInt16 nbx:2;
881     //0006 x position of shape relative to anchor CP
882     //0 relative to page margin
883     //1 relative to top of page
884     //2 relative to text (column for horizontal text; paragraph for vertical text)
885     //3 reserved for future use
886     sal_uInt16 nby:2;
887     //0018 y position of shape relative to anchor CP
888     //0 relative to page margin
889     //1 relative to top of page
890     //2 relative to text (paragraph for horizontal text; column for vertical text)
891     sal_uInt16 nwr:4;
892     //01E0 text wrapping mode
893     //0 like 2, but doesn't require absolute object
894     //1 no text next to shape
895     //2 wrap around absolute object
896     //3 wrap as if no object present
897     //4 wrap tightly around object
898     //5 wrap tightly, but allow holes
899     //6-15 reserved for future use
900     sal_uInt16 nwrk:4;
901     //1E00 text wrapping mode type (valid only for wrapping modes 2 and 4
902     //0 wrap both sides
903     //1 wrap only on left
904     //2 wrap only on right
905     //3 wrap only on largest side
906     sal_uInt16 bRcaSimple:1;
907     //2000 when set, temporarily overrides bx, by, forcing the xaLeft, xaRight, yaTop, and yaBottom fields to all be page relative.
908     sal_uInt16 bBelowText:1;
909     //4000
910     //1 shape is below text
911     //0 shape is above text
912     sal_uInt16 bAnchorLock:1;
913     //8000  1 anchor is locked
914     //      0 anchor is not locked
915     sal_Int32 nTxbx; //count of textboxes in shape (undo doc only)
916 public:
917     enum FSPAOrient {RelPgMargin, RelPageBorder, RelText};
918 };
919 
920 
921 struct WW8_FSPA_SHADOW  // alle Member an gleicher Position und Groesse,
922 {                                               // wegen:  pF = (WW8_FSPA*)pFS;
923     SVBT32 nSpId;
924     SVBT32 nXaLeft;
925     SVBT32 nYaTop;
926     SVBT32 nXaRight;
927     SVBT32 nYaBottom;
928     SVBT16 aBits1;
929     SVBT32 nTxbx;
930 };
931 
932 struct WW8_TXBXS
933 {
934     SVBT32 cTxbx_iNextReuse;
935     SVBT32 cReusable;
936     SVBT16 fReusable;
937     SVBT32 reserved;
938     SVBT32 ShapeId;
939     SVBT32 txidUndo;
940 };
941 
942 struct WW8_STRINGID
943 {
944     // M.M. This is the extra data stored in the SttbfFnm
945     // For now I only need the String Id
946     SVBT16 nStringId;
947     SVBT16 reserved1;
948     SVBT16 reserved2;
949     SVBT16 reserved3;
950 };
951 
952 struct WW8_WKB
953 {
954     // M.M. This is the WkbPLCF struct
955     // For now I only need the Link Id
956     SVBT16 reserved1;
957     SVBT16 reserved2;
958     SVBT16 reserved3;
959     SVBT16 nLinkId;
960     SVBT16 reserved4;
961     SVBT16 reserved5;
962 };
963 
964 #ifdef SAL_W32
965 #   pragma pack(pop)
966 #elif defined(SAL_OS2)
967 #   pragma pack()
968 #endif
969 
970 // Maximum number of columns according the WW8 specification
971 static const sal_uInt8 MAX_NO_OF_SEP_COLUMNS = 44;
972 
973 struct SEPr
974 {
975     SEPr();
976     sal_uInt8 bkc;
977     sal_uInt8 fTitlePage;
978     sal_Int8 fAutoPgn;
979     sal_uInt8 nfcPgn;
980     sal_uInt8 fUnlocked;
981     sal_uInt8 cnsPgn;
982     sal_uInt8 fPgnRestart;
983     sal_uInt8 fEndNote;
984     sal_Int8 lnc;
985     sal_Int8 grpfIhdt;
986     sal_uInt16 nLnnMod;
987     sal_Int32 dxaLnn;
988     sal_Int16 dxaPgn;
989     sal_Int16 dyaPgn;
990     sal_Int8 fLBetween;
991     sal_Int8 vjc;
992     sal_uInt16 dmBinFirst;
993     sal_uInt16 dmBinOther;
994     sal_uInt16 dmPaperReq;
995 #if 0
996     28  1C  brcTop                    BRC                   top page border
997 
998     32  20  brcLeft                   BRC                   left page border
999 
1000     36  24  brcBottom                 BRC                   bottom page border
1001 
1002     40  28  brcRight                  BRC                   right page border
1003 #endif
1004     sal_Int16 fPropRMark;
1005     sal_Int16 ibstPropRMark;
1006     sal_Int32 dttmPropRMark;        //DTTM
1007     sal_Int32 dxtCharSpace;
1008     sal_Int32 dyaLinePitch;
1009     sal_uInt16 clm;
1010     sal_Int16 reserved1;
1011     sal_uInt8 dmOrientPage;
1012     sal_uInt8 iHeadingPgn;
1013     sal_uInt16 pgnStart;
1014     sal_Int16 lnnMin;
1015     sal_uInt16 wTextFlow;
1016     sal_Int16 reserved2;
1017     sal_uInt16 pgbApplyTo:3;
1018     sal_uInt16 pgbPageDepth:2;
1019     sal_Int16 pgbOffsetFrom:3;
1020     sal_Int16 :8;
1021     sal_uInt32 xaPage;
1022     sal_uInt32 yaPage;
1023     sal_uInt32 xaPageNUp;
1024     sal_uInt32 yaPageNUp;
1025     sal_uInt32 dxaLeft;
1026     sal_uInt32 dxaRight;
1027     sal_Int32 dyaTop;
1028     sal_Int32 dyaBottom;
1029     sal_uInt32 dzaGutter;
1030     sal_uInt32 dyaHdrTop;
1031     sal_uInt32 dyaHdrBottom;
1032     sal_Int16 ccolM1;   // have to be less than MAX_NO_OF_SEP_COLUMNS according the WW8 specification
1033     sal_Int8 fEvenlySpaced;
1034     sal_Int8 reserved3;
1035     sal_uInt8 fBiDi;
1036     sal_uInt8 fFacingCol;
1037     sal_uInt8 fRTLGutter;
1038     sal_uInt8 fRTLAlignment;
1039     sal_Int32 dxaColumns;
1040 
1041     // Fixed array - two entries for each SEP column to store width of column and spacing to next column.
1042     // At odd index values [1,3,5,...] the column widths are stored.
1043     // At even index values [2,4,6,...] the spacings to the next columns are stored.
1044     // Value at index 0 is initialized with 0 and used for easier interation on the array
1045     sal_Int32 rgdxaColumnWidthSpacing[MAX_NO_OF_SEP_COLUMNS*2 + 1];
1046 
1047     sal_Int32 dxaColumnWidth;
1048     sal_uInt8 dmOrientFirst;
1049     sal_uInt8 fLayout;
1050     sal_Int16 reserved4;
1051 #if 0
1052     OLST olstAnm;       //currently unused
1053 #endif
1054 };
1055 
1056 namespace wwUtility
1057 {
1058     sal_uInt32 BGRToRGB(sal_uInt32 nColour);
RGBToBGR(sal_uInt32 nColour)1059     inline sal_uInt32 RGBToBGR(sal_uInt32 nColour) { return BGRToRGB(nColour); }
1060 }
1061 
1062 #endif
1063 
1064 /* vi:set tabstop=4 shiftwidth=4 expandtab: */
1065