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