1 /* This file is part of the wvWare 2 project
2    Copyright (C) 2001 S.R.Haque <srhaque@iee.org>
3    Copyright (C) 2003 Werner Trobin <trobin@kde.org>
4 
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the Library GNU General Public
7    version 2 of the License, or (at your option) version 3 or,
8    at the discretion of KDE e.V (which shall act as a proxy as in
9    section 14 of the GPLv3), any later version..
10 
11    This library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Library General Public License for more details.
15 
16    You should have received a copy of the GNU Library General Public License
17    along with this library; see the file COPYING.LIB.  If not, write to
18    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19    Boston, MA 02110-1301, USA.
20 */
21 
22 #include "word95_helper.h"
23 #include "word95_generated.h"
24 #include "olestream.h"
25 #include "styles.h"
26 
27 #include "wvlog.h"
28 
29 namespace wvWare
30 {
31 
32 namespace Word95
33 {
34 
35 namespace SPRM
36 {
37 
38 typedef enum {
39     sprmNoop = 0,
40     sprmPIstd = 2,
41     sprmPIstdPermute = 3,
42     sprmPIncLvl = 4,
43     sprmPJc = 5,
44     sprmPFSideBySide = 6,
45     sprmPFKeep = 7,
46     sprmPFKeepFollow = 8,
47     sprmPFPageBreakBefore = 9,
48     sprmPBrcl = 10,
49     sprmPBrcp = 11,
50     sprmPAnld = 12,
51     sprmPNLvlAnm = 13,
52     sprmPFNoLineNumb = 14,
53     sprmPChgTabsPapx = 15,
54     sprmPDxaRight = 16,
55     sprmPDxaLeft = 17,
56     sprmPNest = 18,
57     sprmPDxaLeft1 = 19,
58     sprmPDyaLine = 20,
59     sprmPDyaBefore = 21,
60     sprmPDyaAfter = 22,
61     sprmPChgTabs = 23,
62     sprmPFInTable = 24,
63     sprmPFTtp = 25,
64     sprmPDxaAbs = 26,
65     sprmPDyaAbs = 27,
66     sprmPDxaWidth = 28,
67     sprmPPc = 29,
68     sprmPBrcTop10 = 30,
69     sprmPBrcLeft10 = 31,
70     sprmPBrcBottom10 = 32,
71     sprmPBrcRight10 = 33,
72     sprmPBrcBetween10 = 34,
73     sprmPBrcBar10 = 35,
74     sprmPFromText10 = 36,
75     sprmPWr = 37,
76     sprmPBrcTop = 38,
77     sprmPBrcLeft = 39,
78     sprmPBrcBottom = 40,
79     sprmPBrcRight = 41,
80     sprmPBrcBetween = 42,
81     sprmPBrcBar = 43,
82     sprmPFNoAutoHyph = 44,
83     sprmPWHeightAbs = 45,
84     sprmPDcs = 46,
85     sprmPShd = 47,
86     sprmPDyaFromText = 48,
87     sprmPDxaFromText = 49,
88     sprmPFLocked = 50,
89     sprmPFWidowControl = 51,
90     sprmPRuler = 52,
91     sprmCFStrikeRM = 65,
92     sprmCFRMark = 66,
93     sprmCFFldVanish = 67,
94     sprmCPicLocation = 68,
95     sprmCIbstRMark = 69,
96     sprmCDttmRMark = 70,
97     sprmCFData = 71,
98     sprmCRMReason = 72,
99     sprmCChse = 73,
100     sprmCSymbol = 74,
101     sprmCFOle2 = 75,
102     sprmCIstd = 80,
103     sprmCIstdPermute = 81,
104     sprmCDefault = 82,
105     sprmCPlain = 83,
106     sprmCFBold = 85,
107     sprmCFItalic = 86,
108     sprmCFStrike = 87,
109     sprmCFOutline = 88,
110     sprmCFShadow = 89,
111     sprmCFSmallCaps = 90,
112     sprmCFCaps = 91,
113     sprmCFVanish = 92,
114     sprmCFtc = 93,
115     sprmCKul = 94,
116     sprmCSizePos = 95,
117     sprmCDxaSpace = 96,
118     sprmCLid = 97,
119     sprmCIco = 98,
120     sprmCHps = 99,
121     sprmCHpsInc = 100,
122     sprmCHpsPos = 101,
123     sprmCHpsPosAdj = 102,
124     sprmCMajority = 103,
125     sprmCIss = 104,
126     sprmCHpsNew50 = 105,
127     sprmCHpsInc1 = 106,
128     sprmCHpsKern = 107,
129     sprmCMajority50 = 108,
130     sprmCHpsMul = 109,
131     sprmCCondHyhen = 110,
132     sprmCFSpec = 117,
133     sprmCFObj = 118,
134     sprmPicBrcl = 119,
135     sprmPicScale = 120,
136     sprmPicBrcTop = 121,
137     sprmPicBrcLeft = 122,
138     sprmPicBrcBottom = 123,
139     sprmPicBrcRight = 124,
140     sprmSScnsPgn = 131,
141     sprmSiHeadingPgn = 132,
142     sprmSOlstAnm = 133,
143     sprmSDxaColWidth = 136,
144     sprmSDxaColSpacing = 137,
145     sprmSFEvenlySpaced = 138,
146     sprmSFProtected = 139,
147     sprmSDmBinFirst = 140,
148     sprmSDmBinOther = 141,
149     sprmSBkc = 142,
150     sprmSFTitlePage = 143,
151     sprmSCcolumns = 144,
152     sprmSDxaColumns = 145,
153     sprmSFAutoPgn = 146,
154     sprmSNfcPgn = 147,
155     sprmSDyaPgn = 148,
156     sprmSDxaPgn = 149,
157     sprmSFPgnRestart = 150,
158     sprmSFEndnote = 151,
159     sprmSLnc = 152,
160     sprmSGprfIhdt = 153,
161     sprmSNLnnMod = 154,
162     sprmSDxaLnn = 155,
163     sprmSDyaHdrTop = 156,
164     sprmSDyaHdrBottom = 157,
165     sprmSLBetween = 158,
166     sprmSVjc = 159,
167     sprmSLnnMin = 160,
168     sprmSPgnStart = 161,
169     sprmSBOrientation = 162,
170     sprmSBCustomize = 163,
171     sprmSXaPage = 164,
172     sprmSYaPage = 165,
173     sprmSDxaLeft = 166,
174     sprmSDxaRight = 167,
175     sprmSDyaTop = 168,
176     sprmSDyaBottom = 169,
177     sprmSDzaGutter = 170,
178     sprmSDMPaperReq = 171,
179     sprmTJc = 182,
180     sprmTDxaLeft = 183,
181     sprmTDxaGapHalf = 184,
182     sprmTFCantSplit = 185,
183     sprmTTableHeader = 186,
184     sprmTTableBorders = 187,
185     sprmTDefTable10 = 188,
186     sprmTDyaRowHeight = 189,
187     sprmTDefTable = 190,
188     sprmTDefTableShd = 191,
189     sprmTTlp = 192,
190     sprmTSetBrc = 193,
191     sprmTInsert = 194,
192     sprmTDelete = 195,
193     sprmTDxaCol = 196,
194     sprmTMerge = 197,
195     sprmTSplit = 198,
196     sprmTSetBrc10 = 199,
197     sprmTSetShd = 200
198 } opcodes;
199 
200 // The length of the SPRM parameter
determineParameterLength(U8 sprm,const U8 * in)201 U16 determineParameterLength( U8 sprm, const U8* in )
202 {
203     switch ( sprm ) {
204         case SPRM::sprmNoop:
205             return 0;
206         case SPRM::sprmPIstd:
207             return 2;
208         case SPRM::sprmPIstdPermute:
209             break; // Variable.
210         case SPRM::sprmPIncLvl:
211         case SPRM::sprmPJc:
212         case SPRM::sprmPFSideBySide:
213         case SPRM::sprmPFKeep:
214         case SPRM::sprmPFKeepFollow:
215         case SPRM::sprmPFPageBreakBefore:
216         case SPRM::sprmPBrcl:
217         case SPRM::sprmPBrcp:
218             return 1;
219         case SPRM::sprmPAnld:
220             break; // Variable.
221         case SPRM::sprmPNLvlAnm:
222         case SPRM::sprmPFNoLineNumb:
223             return 1;
224         case SPRM::sprmPChgTabsPapx:
225             break; // Variable.
226         case SPRM::sprmPDxaRight:
227             return 2;
228         case SPRM::sprmPDxaLeft:
229         case SPRM::sprmPNest:
230         case SPRM::sprmPDxaLeft1:
231             return 2;
232         case SPRM::sprmPDyaLine:
233             return 4;
234         case SPRM::sprmPDyaBefore:
235         case SPRM::sprmPDyaAfter:
236             return 2;
237         case SPRM::sprmPChgTabs:
238             if ( *in == 255 ) {
239                 U8 itbdDelMax = in[1];
240                 U8 itbdAddMax = in[1 + itbdDelMax * 4];
241                 return 1 + itbdDelMax * 4 + itbdAddMax * 3;
242             }
243             else
244                 return *in + 1;
245         case SPRM::sprmPFInTable:
246         case SPRM::sprmPFTtp:
247             return 1;
248         case SPRM::sprmPDxaAbs:
249         case SPRM::sprmPDyaAbs:
250         case SPRM::sprmPDxaWidth:
251             return 2;
252         case SPRM::sprmPPc:
253             return 1;
254         case SPRM::sprmPBrcTop10:
255         case SPRM::sprmPBrcLeft10:
256         case SPRM::sprmPBrcBottom10:
257         case SPRM::sprmPBrcRight10:
258         case SPRM::sprmPBrcBetween10:
259         case SPRM::sprmPBrcBar10:
260         case SPRM::sprmPFromText10:
261             return 2;
262         case SPRM::sprmPWr:
263             return 1;
264         case SPRM::sprmPBrcTop:
265         case SPRM::sprmPBrcLeft:
266         case SPRM::sprmPBrcBottom:
267         case SPRM::sprmPBrcRight:
268         case SPRM::sprmPBrcBetween:
269         case SPRM::sprmPBrcBar:
270             return 2;
271         case SPRM::sprmPFNoAutoHyph:
272             return 1;
273         case SPRM::sprmPWHeightAbs:
274         case SPRM::sprmPDcs:
275         case SPRM::sprmPShd:
276         case SPRM::sprmPDyaFromText:
277         case SPRM::sprmPDxaFromText:
278             return 2;
279         case SPRM::sprmPFLocked:
280         case SPRM::sprmPFWidowControl:
281             return 1;
282         case SPRM::sprmPRuler:
283             break; // Variable.
284         case SPRM::sprmCFStrikeRM:
285         case SPRM::sprmCFRMark:
286         case SPRM::sprmCFFldVanish:
287             return 1;
288         case SPRM::sprmCPicLocation:
289             break; // Variable.
290         case SPRM::sprmCIbstRMark:
291             return 2;
292         case SPRM::sprmCDttmRMark:
293             return 4;
294         case SPRM::sprmCFData:
295             return 1;
296         case SPRM::sprmCRMReason:
297             return 2;
298         case SPRM::sprmCChse:
299             return 3;
300         case SPRM::sprmCSymbol:
301             break; // Variable.
302         case SPRM::sprmCFOle2:
303             return 1;
304         case SPRM::sprmCIstd:
305             return 2;
306         case SPRM::sprmCIstdPermute:
307         case SPRM::sprmCDefault:
308             break; // Variable.
309         case SPRM::sprmCPlain:
310             return 0;
311         case SPRM::sprmCFBold:
312         case SPRM::sprmCFItalic:
313         case SPRM::sprmCFStrike:
314         case SPRM::sprmCFOutline:
315         case SPRM::sprmCFShadow:
316         case SPRM::sprmCFSmallCaps:
317         case SPRM::sprmCFCaps:
318         case SPRM::sprmCFVanish:
319             return 1;
320         case SPRM::sprmCFtc:
321             return 2;
322         case SPRM::sprmCKul:
323             return 1;
324         case SPRM::sprmCSizePos:
325             return 3;
326         case SPRM::sprmCDxaSpace:
327         case SPRM::sprmCLid:
328             return 2;
329         case SPRM::sprmCIco:
330         case SPRM::sprmCHps:
331         case SPRM::sprmCHpsInc:
332         case SPRM::sprmCHpsPos:
333         case SPRM::sprmCHpsPosAdj:
334             return 1;
335         case SPRM::sprmCMajority:
336             break; // Variable.
337         case SPRM::sprmCIss:
338             return 1;
339         case SPRM::sprmCHpsNew50:
340         case SPRM::sprmCHpsInc1:
341             break; // Variable.
342         case SPRM::sprmCHpsKern:
343             return 2;
344         case SPRM::sprmCMajority50:
345             break; // Variable.
346         case SPRM::sprmCHpsMul:
347         case SPRM::sprmCCondHyhen:
348             return 2;
349         case SPRM::sprmCFSpec:
350         case SPRM::sprmCFObj:
351         case SPRM::sprmPicBrcl:
352             return 1;
353         case SPRM::sprmPicScale:
354             break; // Variable.
355         case SPRM::sprmPicBrcTop:
356         case SPRM::sprmPicBrcLeft:
357         case SPRM::sprmPicBrcBottom:
358         case SPRM::sprmPicBrcRight:
359             return 2;
360         case SPRM::sprmSScnsPgn:
361         case SPRM::sprmSiHeadingPgn:
362             return 1;
363         case SPRM::sprmSOlstAnm:
364             break; // Variable.
365         case SPRM::sprmSDxaColWidth:
366         case SPRM::sprmSDxaColSpacing:
367             return 3;
368         case SPRM::sprmSFEvenlySpaced:
369         case SPRM::sprmSFProtected:
370             return 1;
371         case SPRM::sprmSDmBinFirst:
372         case SPRM::sprmSDmBinOther:
373             return 2;
374         case SPRM::sprmSBkc:
375         case SPRM::sprmSFTitlePage:
376             return 1;
377         case SPRM::sprmSCcolumns:
378         case SPRM::sprmSDxaColumns:
379             return 2;
380         case SPRM::sprmSFAutoPgn:
381         case SPRM::sprmSNfcPgn:
382             return 1;
383         case SPRM::sprmSDyaPgn:
384         case SPRM::sprmSDxaPgn:
385             return 2;
386         case SPRM::sprmSFPgnRestart:
387         case SPRM::sprmSFEndnote:
388         case SPRM::sprmSLnc:
389         case SPRM::sprmSGprfIhdt:
390             return 1;
391         case SPRM::sprmSNLnnMod:
392         case SPRM::sprmSDxaLnn:
393         case SPRM::sprmSDyaHdrTop:
394         case SPRM::sprmSDyaHdrBottom:
395             return 2;
396         case SPRM::sprmSLBetween:
397         case SPRM::sprmSVjc:
398             return 1;
399         case SPRM::sprmSLnnMin:
400         case SPRM::sprmSPgnStart:
401             return 2;
402         case SPRM::sprmSBOrientation:
403         case SPRM::sprmSBCustomize:
404             return 1;
405         case SPRM::sprmSXaPage:
406         case SPRM::sprmSYaPage:
407         case SPRM::sprmSDxaLeft:
408         case SPRM::sprmSDxaRight:
409         case SPRM::sprmSDyaTop:
410         case SPRM::sprmSDyaBottom:
411         case SPRM::sprmSDzaGutter:
412         case SPRM::sprmSDMPaperReq:
413         case SPRM::sprmTJc:
414         case SPRM::sprmTDxaLeft:
415         case SPRM::sprmTDxaGapHalf:
416             return 2;
417         case SPRM::sprmTFCantSplit:
418         case SPRM::sprmTTableHeader:
419             return 1;
420         case SPRM::sprmTTableBorders:
421             return 12;
422         case SPRM::sprmTDefTable10:
423             return readU16(in) + 1;
424         case SPRM::sprmTDyaRowHeight:
425             return 2;
426         case SPRM::sprmTDefTable:
427             return readU16(in) + 1;
428         case SPRM::sprmTDefTableShd:
429             break; // Variable.
430         case SPRM::sprmTTlp:
431             return 4;
432         case SPRM::sprmTSetBrc:
433             return 5;
434         case SPRM::sprmTInsert:
435             return 4;
436         case SPRM::sprmTDelete:
437             return 2;
438         case SPRM::sprmTDxaCol:
439             return 4;
440         case SPRM::sprmTMerge:
441         case SPRM::sprmTSplit:
442             return 2;
443         case SPRM::sprmTSetBrc10:
444             return 5;
445         case SPRM::sprmTSetShd:
446             return 4;
447     }
448 
449     // Get length of variable size operand.
450     return *in + 1;
451 }
452 
453 } // namespace SPRM
454 } // namespace Word95
455 } // namespace wvWare
456