## SPRM Definitions

A sprm is an instruction to modify one or more properties within one of the property defining data structures (CHP, PAP, TAP, SEP, or PIC). A sprm is a two-byte opcode at offset 0 which identifies the operation to be performed. If necessary information for the operation can always be expressed with a fixed length parameter, the fixed length parameter is recorded immediately after the opcode beginning at offset 2. The length of a fixed length sprm is always 2 plus the size of the sprm's parameter. If the parameter for the sprm is variable length, the count of bytes of the following parameter is stored in the byte at offset 2, followed by the parameter at offset 3.

Three sprms -- sprmPChgTabs , sprmTDefTable, and sprmTDefTable10 -- can be longer than 256 bytes. The method for calculating the length of sprmPChgTabs is recorded below with the description of the sprm. For sprmTDefTable and sprmTDefTable10, the length of the parameter plus 1 is recorded in the two bytes beginning at offset 2.

For all other variable length sprms, the total length of the sprm is the count recorded at offset 2 plus three (2 for the sprm + 1 for the count byte). The parameter immediately follows the count.

The sprm value encodes information on the size of the operand, the type of sprm (PAP, CHP, etc), and whether the sprm requires special handling (in cases where a property value isn't simply replaced).

Sprm bits (0 = low) | Value | Details
0-8 | ispmd | unique identifier within sgc group
9 | fSpec | sprm requires special handling
10-12 | sgc | sprm group; type of sprm (PAP, CHP, etc)
13-15 | spra | size of sprm argument (see following table for values)

sgc value | type of sprm
1 | PAP
2 | CHP
3 | PIC
4 | SEP
5 | TAP

spra value | operand size
0 | 1 byte (operand affects 1 bit)
1 | 1 byte
2 | 2 bytes
3 | 4 bytes
4 | 2 bytes
5 | 2 bytes
6 | variable length -- following byte is size of operand
7 | 3 bytes

When parsing a grpprl, you can use the sprm's spra value to determine how many bytes are used by that sprm; it also enables you to skip over sprms you don't handle.

Unless otherwise noted, when a sprm is applied to a property the sprm's parameter changes the old value of the property in question to the value stored in the sprm parameter.

Name | sprm | Property Modified | Parameter | Parameter size
--- | --- | --- | --- | ---
sprmPIstd | 0x4600 | pap.istd | istd (style code) | short
sprmPIstdPermute | 0xC601 | pap.istd | permutation vector (see below) | variable length
sprmPIncLvl | 0x2602 | pap.istd, pap.lvl | difference between istd of base PAP and istd of PAP to be produced (see below) | byte
sprmPJc | 0x2403 | pap.jc | jc (justification) | byte
sprmPFSideBySide | 0x2404 | pap.fSideBySide | 0 or 1 | byte
sprmPFKeep | 0x2405 | pap.fKeep | 0 or 1 | byte
sprmPFKeepFollow | 0x2406 | pap.fKeepFollow | 0 or 1 | byte
sprmPFPageBreakBefore | 0x2407 | pap.fPageBreakBefore | 0 or 1 | byte
sprmPBrcl | 0x2408 | pap.brcl | brcl | byte
sprmPBrcp | 0x2409 | pap.brcp | brcp | byte
sprmPIlvl | 0x260A | pap.ilvl | ilvl | byte
sprmPIlfo | 0x460B | pap.ilfo | ilfo (list index) | short
sprmPFNoLineNumb | 0x240C | pap.fNoLnn | 0 or 1 | byte
sprmPChgTabsPapx | 0xC60D | pap.itbdMac, pap.rgdxaTab, pap.rgtbd | complex - see below | variable length
sprmPDxaRight | 0x840E | pap.dxaRight | dxa | word
sprmPDxaLeft | 0x840F | pap.dxaLeft | dxa | word
sprmPNest | 0x4610 | pap.dxaLeft | dxa-see below | word
sprmPDxaLeft1 | 0x8411 | pap.dxaLeft1 | dxa | word
sprmPDyaLine | 0x6412 | pap.lspd | an LSPD, a long word structure consisting of a short of dyaLine followed by a short of fMultLinespace - see below | long
sprmPDyaBefore | 0xA413 | pap.dyaBefore | dya | word
sprmPDyaAfter | 0xA414 | pap.dyaAfter | dya | word
sprmPChgTabs | 0xC615 | pap.itbdMac, pap.rgdxaTab, pap.rgtbd | complex - see below | variable length
sprmPFInTable | 0x2416 | pap.fInTable | 0 or 1 | byte
sprmPFTtp | 0x2417 | pap.fTtp | 0 or 1 | byte
sprmPDxaAbs | 0x8418 | pap.dxaAbs | dxa | word
sprmPDyaAbs | 0x8419 | pap.dyaAbs | dya | word
sprmPDxaWidth | 0x841A | pap.dxaWidth | dxa | word
sprmPPc | 0x261B | pap.pcHorz, pap.pcVert | complex - see below | byte
sprmPBrcTop10 | 0x461C | pap.brcTop | BRC10 | word
sprmPBrcLeft10 | 0x461D | pap.brcLeft | BRC10 | word
sprmPBrcBottom10 | 0x461E | pap.brcBottom | BRC10 | word
sprmPBrcRight10 | 0x461F | pap.brcRight | BRC10 | word
sprmPBrcBetween10 | 0x4620 | pap.brcBetween | BRC10 | word
sprmPBrcBar10 | 0x4621 | pap.brcBar | BRC10 | word
sprmPDxaFromText10 | 0x4622 | pap.dxaFromText | dxa | word
sprmPWr | 0x2423 | pap.wr | wr (see description of PAP for definition | byte
sprmPBrcTop | 0x6424 | pap.brcTop | BRC | long
sprmPBrcLeft | 0x6425 | pap.brcLeft | BRC | long
sprmPBrcBottom | 0x6426 | pap.brcBottom | BRC | long
sprmPBrcRight | 0x6427 | pap.brcRight | BRC | long
sprmPBrcBetween | 0x6428 | pap.brcBetween | BRC | long
sprmPBrcBar | 0x6629 | pap.brcBar | BRC | long
sprmPFNoAutoHyph | 0x242A | pap.fNoAutoHyph | 0 or 1 | byte
sprmPWHeightAbs | 0x442B | pap.wHeightAbs | w | word
sprmPDcs | 0x442C | pap.dcs | DCS | short
sprmPShd | 0x442D | pap.shd | SHD | word
sprmPDyaFromText | 0x842E | pap.dyaFromText | dya | word
sprmPDxaFromText | 0x842F | pap.dxaFromText | dxa | word
sprmPFLocked | 0x2430 | pap.fLocked | 0 or 1 | byte
sprmPFWidowControl | 0x2431 | pap.fWidowControl | 0 or 1 | byte
sprmPRuler | 0xC632 |  |  | variable length
sprmPFKinsoku | 0x2433 | pap.fKinsoku | 0 or 1 | byte
sprmPFWordWrap | 0x2434 | pap.fWordWrap | 0 or 1 | byte
sprmPFOverflowPunct | 0x2435 | pap.fOverflowPunct | 0 or 1 | byte
sprmPFTopLinePunct | 0x2436 | pap.fTopLinePunct | 0 or 1 | byte
sprmPFAutoSpaceDE | 0x2437 | pap.fAutoSpaceDE | 0 or 1 | byte
sprmPFAutoSpaceDN | 0x2438 | pap.fAutoSpaceDN | 0 or 1 | byte
sprmPWAlignFont | 0x4439 | pap.wAlignFont | iFa (see description of PAP for definition) | word
sprmPFrameTextFlow | 0x443A | pap.fVertical pap.fBackward pap.fRotateFont | complex (see description of PAP for definition) | word
sprmPISnapBaseLine | 0x243B | obsolete: not applicable in Word97 and later versions |  | byte
sprmPAnld | 0xC63E | pap.anld |  | variable length
sprmPPropRMark | 0xC63F | pap.fPropRMark | complex (see below) | variable length
sprmPOutLvl | 0x2640 | pap.lvl | has no effect if pap.istd is < 1 or is > 9 | byte
sprmPFBiDi | 0x2441 |  |  | byte
sprmPFNumRMIns | 0x2443 | pap.fNumRMIns | 1 or 0 | bit
sprmPCrLf | 0x2444 |  |  | byte
sprmPNumRM | 0xC645 | pap.numrm |  | variable length
sprmPHugePapx | 0x6645 | see below | fc in the data stream to locate the huge grpprl (see below) | long
sprmPFUsePgsuSettings | 0x2447 | pap.fUsePgsuSettings | 1 or 0 | byte
sprmPFAdjustRight | 0x2448 | pap.fAdjustRight | 1 or 0 | byte
sprmCFRMarkDel | 0x0800 | chp.fRMarkDel | 1 or 0 | bit
sprmCFRMark | 0x0801 | chp.fRMark | 1 or 0 | bit
sprmCFFldVanish | 0x0802 | chp.fFldVanish | 1 or 0 | bit
sprmCPicLocation | 0x6A03 | chp.fcPic and chp.fSpec | see below | variable length, length recorded is always 4
sprmCIbstRMark | 0x4804 | chp.ibstRMark | index into sttbRMark | short
sprmCDttmRMark | 0x6805 | chp.dttmRMark | DTTM | long
sprmCFData | 0x0806 | chp.fData | 1 or 0 | bit
sprmCIdslRMark | 0x4807 | chp.idslRMReason | an index to a table of strings defined in Word 6.0 executables | short
sprmCChs | 0xEA08 | chp.fChsDiff and chp.chse | see below | 3 bytes
sprmCSymbol | 0x6A09 | chp.fSpec, chp.xchSym and chp.ftcSym | see below | variable length, length recorded is always 4
sprmCFOle2 | 0x080A | chp.fOle2 | 1 or 0 | bit
sprmCIdCharType | 0x480B | obsolete: not applicable in Word97 and later versions |  |
sprmCHighlight | 0x2A0C | chp.fHighlight, chp.icoHighlight | ico (fHighlight is set to 1 iff ico is not 0) | byte
sprmCObjLocation | 0x680E | chp.fcObj | FC | long
sprmCFFtcAsciSymb | 0x2A10 |  |  |
sprmCIstd | 0x4A30 | chp.istd | istd, see stylesheet definition | short
sprmCIstdPermute | 0xCA31 | chp.istd | permutation vector (see below) | variable length
sprmCDefault | 0x2A32 | whole CHP (see below) | none | variable length
sprmCPlain | 0x2A33 | whole CHP (see below) | none | 0
sprmCKcd | 0x2A34 |  |  |
sprmCFBold | 0x0835 | chp.fBold | 0,1, 128, or 129 (see below) | byte
sprmCFItalic | 0x0836 | chp.fItalic | 0,1, 128, or 129 (see below) | byte
sprmCFStrike | 0x0837 | chp.fStrike | 0,1, 128, or 129 (see below) | byte
sprmCFOutline | 0x0838 | chp.fOutline | 0,1, 128, or 129 (see below) | byte
sprmCFShadow | 0x0839 | chp.fShadow | 0,1, 128, or 129 (see below) | byte
sprmCFSmallCaps | 0x083A | chp.fSmallCaps | 0,1, 128, or 129 (see below) | byte
sprmCFCaps | 0x083B | chp.fCaps | 0,1, 128, or 129 (see below) | byte
sprmCFVanish | 0x083C | chp.fVanish | 0,1, 128, or 129 (see below) | byte
sprmCFtcDefault | 0x4A3D |  | ftc, only used internally, never stored in file | word
sprmCKul | 0x2A3E | chp.kul | kul | byte
sprmCSizePos | 0xEA3F | chp.hps, chp.hpsPos | (see below) | 3 bytes
sprmCDxaSpace | 0x8840 | chp.dxaSpace | dxa | word
sprmCLid | 0x4A41 |  | only used internally never stored | word
sprmCIco | 0x2A42 | chp.ico | ico | byte
sprmCHps | 0x4A43 | chp.hps | hps | byte
sprmCHpsInc | 0x2A44 | chp.hps | (see below) | byte
sprmCHpsPos | 0x4845 | chp.hpsPos | hps | byte
sprmCHpsPosAdj | 0x2A46 | chp.hpsPos | hps (see below) | byte
sprmCMajority | 0xCA47 | chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, chp.fStrike, chp.fCaps, chp.rgftc, chp.hps, chp.hpsPos, chp.kul, chp.dxaSpace, chp.ico, chp.rglid | complex (see below) | variable length, length byte plus size of following grpprl
sprmCIss | 0x2A48 | chp.iss | iss | byte
sprmCHpsNew50 | 0xCA49 | chp.hps | hps | variable width, length always recorded as 2
sprmCHpsInc1 | 0xCA4A | chp.hps | complex (see below) | variable width, length always recorded as 2
sprmCHpsKern | 0x484B | chp.hpsKern | hps | short
sprmCMajority50 | 0xCA4C | chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, chp.fStrike, chp.fCaps, chp.ftc, chp.hps, chp.hpsPos, chp.kul, chp.dxaSpace, chp.ico, | complex (see below) | variable length
sprmCHpsMul | 0x4A4D | chp.hps | percentage to grow hps | short
sprmCYsri | 0x484E | chp.ysri | ysri | short
sprmCRgFtc0 | 0x4A4F | chp.rgftc[0] | ftc for ASCII text (see below) | short
sprmCRgFtc1 | 0x4A50 | chp.rgftc[1] | ftc for Far East text (see below) | short
sprmCRgFtc2 | 0x4A51 | chp.rgftc[2] | ftc for non-Far East text (see below) | short
sprmCCharScale | 0x4852 |  |  |
sprmCFDStrike | 0x2A53 | chp.fDStrike |  | byte
sprmCFImprint | 0x0854 | chp.fImprint | 1 or 0 | bit
sprmCFSpec | 0x0855 | chp.fSpec | 1 or 0 | bit
sprmCFObj | 0x0856 | chp.fObj | 1 or 0 | bit
sprmCPropRMark | 0xCA57 | chp.fPropRMark, chp.ibstPropRMark, chp.dttmPropRMark | Complex (see below) | variable length always recorded as 7 bytes
sprmCFEmboss | 0x0858 | chp.fEmboss | 1 or 0 | bit
sprmCSfxText | 0x2859 | chp.sfxtText | text animation | byte
sprmCFBiDi | 0x085A |  |  |
sprmCFDiacColor | 0x085B |  |  |
sprmCFBoldBi | 0x085C |  |  |
sprmCFItalicBi | 0x085D |  |  |
sprmCFtcBi | 0x4A5E |  |  |
sprmCLidBi | 0x485F |  |  |
sprmCIcoBi | 0x4A60 |  |  |
sprmCHpsBi | 0x4A61 |  |  |
sprmCDispFldRMark | 0xCA62 | chp.fDispFldRMark, chp.ibstDispFldRMark, chp.dttmDispFldRMark | Complex (see below) | variable length always recorded as 39 bytes
sprmCIbstRMarkDel | 0x4863 | chp.ibstRMarkDel | index into sttbRMark | short
sprmCDttmRMarkDel | 0x6864 | chp.dttmRMarkDel | DTTM | long
sprmCBrc | 0x6865 | chp.brc | BRC | long
sprmCShd | 0x4866 | chp.shd | SHD | short
sprmCIdslRMarkDel | 0x4867 | chp.idslRMReasonDel | an index to a table of strings defined in Word 6.0 executables | short
sprmCFUsePgsuSettings | 0x0868 | chp.fUsePgsuSettings | 1 or 0 | bit
sprmCCpg | 0x486B |  |  | word
sprmCRgLid0 | 0x486D | chp.rglid[0] | LID: for non-Far East text | word
sprmCRgLid1 | 0x486E | chp.rglid[1] | LID: for Far East text | word
sprmCIdctHint | 0x286F | chp.idctHint | IDCT: (see below) | byte
sprmPicBrcl | 0x2E00 | pic.brcl | brcl (see PIC structure definition) | byte
sprmPicScale | 0xCE01 | pic.mx, pic.my, pic.dxaCropleft, pic.dyaCropTop pic.dxaCropRight, pic.dyaCropBottom | Complex (see below) | length byte plus 12 bytes
sprmPicBrcTop | 0x6C02 | pic.brcTop | BRC | long
sprmPicBrcLeft | 0x6C03 | pic.brcLeft | BRC | long
sprmPicBrcBottom | 0x6C04 | pic.brcBottom | BRC | long
sprmPicBrcRight | 0x6C05 | pic.brcRight | BRC | long
sprmScnsPgn | 0x3000 | sep.cnsPgn | cns | byte
sprmSiHeadingPgn | 0x3001 | sep.iHeadingPgn | heading number level | byte
sprmSOlstAnm | 0xD202 | sep.olstAnm | OLST | variable length
sprmSDxaColWidth | 0xF203 | sep.rgdxaColWidthSpacing | complex (see below) | 3 bytes
sprmSDxaColSpacing | 0xF204 | sep.rgdxaColWidthSpacing | complex (see below) | 3 bytes
sprmSFEvenlySpaced | 0x3005 | sep.fEvenlySpaced | 1 or 0 | byte
sprmSFProtected | 0x3006 | sep.fUnlocked | 1 or 0 | byte
sprmSDmBinFirst | 0x5007 | sep.dmBinFirst |  | word
sprmSDmBinOther | 0x5008 | sep.dmBinOther |  | word
sprmSBkc | 0x3009 | sep.bkc | bkc | byte
sprmSFTitlePage | 0x300A | sep.fTitlePage | 0 or 1 | byte
sprmSCcolumns | 0x500B | sep.ccolM1 | # of cols - 1 | word
sprmSDxaColumns | 0x900C | sep.dxaColumns | dxa | word
sprmSFAutoPgn | 0x300D | sep.fAutoPgn | obsolete | byte
sprmSNfcPgn | 0x300E | sep.nfcPgn | nfc | byte
sprmSDyaPgn | 0xB00F | sep.dyaPgn | dya | short
sprmSDxaPgn | 0xB010 | sep.dxaPgn | dya | short
sprmSFPgnRestart | 0x3011 | sep.fPgnRestart | 0 or 1 | byte
sprmSFEndnote | 0x3012 | sep.fEndnote | 0 or 1 | byte
sprmSLnc | 0x3013 | sep.lnc | lnc | byte
sprmSGprfIhdt | 0x3014 | sep.grpfIhdt | grpfihdt (see Headers and Footers topic) | byte
sprmSNLnnMod | 0x5015 | sep.nLnnMod | non-neg int. | word
sprmSDxaLnn | 0x9016 | sep.dxaLnn | dxa | word
sprmSDyaHdrTop | 0xB017 | sep.dyaHdrTop | dya | word
sprmSDyaHdrBottom | 0xB018 | sep.dyaHdrBottom | dya | word
sprmSLBetween | 0x3019 | sep.fLBetween | 0 or 1 | byte
sprmSVjc | 0x301A | sep.vjc | vjc | byte
sprmSLnnMin | 0x501B | sep.lnnMin | lnn | word
sprmSPgnStart | 0x501C | sep.pgnStart | pgn | word
sprmSBOrientation | 0x301D | sep.dmOrientPage | dm | byte
sprmSBCustomize | 0x301E |  |  |
sprmSXaPage | 0xB01F | sep.xaPage | xa | word
sprmSYaPage | 0xB020 | sep.yaPage | ya | word
sprmSDxaLeft | 0xB021 | sep.dxaLeft | dxa | word
sprmSDxaRight | 0xB022 | sep.dxaRight | dxa | word
sprmSDyaTop | 0x9023 | sep.dyaTop | dya | word
sprmSDyaBottom | 0x9024 | sep.dyaBottom | dya | word
sprmSDzaGutter | 0xB025 | sep.dzaGutter | dza | word
sprmSDmPaperReq | 0x5026 | sep.dmPaperReq | dm | word
sprmSPropRMark | 0xD227 | sep.fPropRMark, sep.ibstPropRMark, sep.dttmPropRMark | complex (see below) | variable length always recorded as 7 bytes
sprmSFBiDi | 0x3228 |  |  |
sprmSFFacingCol | 0x3229 |  |  |
sprmSFRTLGutter | 0x322A |  |  |
sprmSBrcTop | 0x702B | sep.brcTop | BRC | long
sprmSBrcLeft | 0x702C | sep.brcLeft | BRC | long
sprmSBrcBottom | 0x702D | sep.brcBottom | BRC | long
sprmSBrcRight | 0x702E | sep.brcRight | BRC | long
sprmSPgbProp | 0x522F | sep.pgbProp |  | word
sprmSDxtCharSpace | 0x7030 | sep.dxtCharSpace | dxt | long
sprmSDyaLinePitch | 0x9031 | sep.dyaLinePitch | dya | long
sprmSClm | 0x5032 |  |  |
sprmSTextFlow | 0x5033 | sep.wTextFlow | complex (see below) | short
sprmTJc | 0x5400 | tap.jc | jc | word (low order byte is significant)
sprmTDxaLeft | 0x9601 | tap.rgdxaCenter (see below) | dxa | word
sprmTDxaGapHalf | 0x9602 | tap.dxaGapHalf, tap.rgdxaCenter (see below) | dxa | word
sprmTFCantSplit | 0x3403 | tap.fCantSplit | 1 or 0 | byte
sprmTTableHeader | 0x3404 | tap.fTableHeader | 1 or 0 | byte
sprmTTableBorders | 0xD605 | tap.rgbrcTable | complex(see below) | 24 bytes
sprmTDefTable10 | 0xD606 | tap.rgdxaCenter, tap.rgtc | complex (see below) | variable length
sprmTDyaRowHeight | 0x9407 | tap.dyaRowHeight | dya | word
sprmTDefTable | 0xD608 | tap.rgtc | complex (see below) |
sprmTDefTableShd | 0xD609 | tap.rgshd | complex (see below) |
sprmTTlp | 0x740A | tap.tlp | TLP | 4 bytes
sprmTFBiDi | 0x560B |  |  |
sprmTHTMLProps | 0x740C |  |  |
sprmTSetBrc | 0xD620 | tap.rgtc[].rgbrc | complex (see below) | 5 bytes
sprmTInsert | 0x7621 | tap.rgdxaCenter, tap.rgtc | complex (see below) | 4 bytes
sprmTDelete | 0x5622 | tap.rgdxaCenter, tap.rgtc | complex (see below) | word
sprmTDxaCol | 0x7623 | tap.rgdxaCenter | complex (see below) | 4 bytes
sprmTMerge | 0x5624 | tap.fFirstMerged, tap.fMerged | complex (see below) | word
sprmTSplit | 0x5625 | tap.fFirstMerged, tap.fMerged | complex (see below) | word
sprmTSetBrc10 | 0xD626 | tap.rgtc[].rgbrc | complex (see below) | 5 bytes
sprmTSetShd | 0x7627 | tap.rgshd | complex (see below) | 4 bytes
sprmTSetShdOdd | 0x7628 | tap.rgshd | complex (see below) | 4 bytes
sprmTTextFlow | 0x7629 | tap.rgtc[].fVertical tap.rgtc[].fBackward tap.rgtc[].fRotateFont | 0 or 1 0 or 1 0 or 1 | word
sprmTDiagLine | 0xD62A |  |  |
sprmTVertMerge | 0xD62B | tap.rgtc[].vertMerge | complex (see below) | variable length always recorded as 2 bytes
sprmTVertAlign | 0xD62C | tap.rgtc[].vertAlign | complex (see below) | variable length always recorded as 3 byte

sprmPIstdPermute (opcode 0xC601) is a complex sprm which is applied to a piece when the style codes of paragraphs within a piece must be mapped to other style codes. It has the following format:

Field | Size | Comment
sprm | short | opcode( ==0xC601)
cch | byte | count of bytes (not including sprm and cch)
fLongg | byte | always 0
fSpare | byte | always 0
istdFirst | unsigned short | index of first style in range to which permutation stored in rgistd applies
istdLast | unsigned short | index of last style in range to which permutation stored in rgistd applies
rgistd[] | unsigned short | array of istd entries that records the mapping of istds for text copied from a source document to istds that exists in the destination document after the text has been pasted

To interpret sprmPIstdPermute, first check if pap.istd is greater than the istdFirst recorded in the sprm and less than or equal to the istdLast recorded in the sprm If not, the sprm has no effect. If it is, pap.istd is set to rgistd[pap.istd - istdFirst]. sprmPIstdPermute is only stored in grpprls linked to a piece table. It should never be recorded in a PAPX.

sprmPIncLvl (opcode 0x2602) is applied to pieces in the piece table that contain paragraphs with style codes (istds) greater than or equal to 1 and less than or equal to 9. These style codes identify heading levels in a Word outline structure. The sprm causes a set of paragraphs to be changed to a new heading level. The sprm is three bytes long and consists of the sprm code and a one byte two's complement value.

If pap.stc is < 1 or > 9, sprmPIncLvl has no effect. Otherwise, if the value stored in the byte has its highest order bit off, the value is a positive difference which should be added to pap.istd and pap.lvl and then pap.stc should be set to min(pap.istd, 9). If the byte value has its highest order bit on, the value is a negative difference which should be sign extended to a word and then subtracted from pap.istd and pap.lvl. Then pap.stc should be set to max(1, pap.istd). sprmPIncLvl is only stored in grpprls linked to a piece table.

sprmPIlfo (opcode 0x460B) sets the pap.ilfo. Its argument, an ilfo, is an index into the document's hpllfo, which contains the list data for that paragraph, describing the appearance of the automatic number at the beginning of the paragraph. A value of zero means that the paragraph is not numbered, and a value of 2047 indicates that this paragraph came from a pre-Word 97 file so the formatting information is still stored in the pap.anld and the paragraph should be converted to Word 97 format.

sprmPIlvl (opcode (0x260A) sets the pap.ilvl. It takes an index (0 through 8) which indicates which level of a multilevel list this paragraph belongs to. For simple (one-level lists) or unnumbered paragraphs, this value should always be zero.

sprmPAnld (opcode ...) is currently only used for compatibility with pre-Word 97 docs. It sets the pap.anld, which before Word 97 described the automatic number at the beginning of any numbered paragraph. Now we use it only long enough to put the data into the document's list table (rglst) and set the pap.ilfo to point to the proper entry in the list table. The pap.anld is only relavent if pap.ilfo is equal to 2047 (see sprmPIlfo above).

The sprmPChgTabsPapx (opcode 0xC60D) is a complex sprm that describes changes in tab settings from the underlying style. It is only stored as part of PAPXs stored in FKPs and in the STSH. It has the following format:

Field | Size | Comment
sprm | short | opcode
cch | byte | count of bytes (not including sprm and cch)
itbdDelMax | byte | number of tabs to delete
rgdxaDel | int[itbdDelMax] | array of tab positions for which tabs should be deleted
itbdAddMax | byte | number of tabs to add
rgdxaAdd | int[itbdAddMax] | array of tab positions for which tabs should be added
rgtbdAdd | byte[itbdAddMax] | array of tab descriptors corresponding to rgdxaAdd

When sprmPChgTabsPapx is interpreted, the rgdxaDel of the sprm is applied first to the pap that is being transformed. This is done by deleting from the pap the rgdxaTab entry and rgtbd entry of any tab whose rgdxaTab value is equal to one of the rgdxaDel values in the sprm. It is guaranteed that the entries in pap.rgdxaTab and the sprm's rgdxaDel and rgdxaAdd are recorded in ascending dxa order.

Then the rgdxaAdd and rgtbdAdd entries are merged into the pap's rgdxaTab and rgtbd arrays so that the resulting pap rgdxaTab is sorted in ascending order with no duplicates.

sprmPNest (opcode 0x4610) causes its operand, a two-byte dxa value to be added to pap.dxaLeft. If the result of the addition is less than 0, 0 is stored into pap.dxaLeft. It is used to shift the left indent of a paragraph to the right or left. sprmPNest is only stored in grpprls linked to a piece table.

sprmPDyaLine (opcode 0x6412) moves a 4 byte LSPD structure into pap.lspd. Two short fields are stored in this data structure. The first short in the structure is named lspd.dyaLine and the second is named lspd.fMultLinespace. When lspd.fMultLinespace is 0, the magnitude of lspd.dyaLine specifies the amount of space that will be provided for lines in the paragraph in twips. When lspd.dyaLine is positive, Word will ensure that AT LEAST the magnitude of lspd.dyaLine will be reserved on the page for each line displayed in the paragraph. If the height of a line becomes greater than lspd.dyaLine, the size calculated for that line will be reserved on the page. When lspd.dyaLine is negative, Word will ensure that EXACTLY the magnitude of lspd.dyaLine (-lspd.dyaLine) will be reserved on the page for each line displayed in the paragraph. When lspd.fMultLinespace is 1, Word will reserve for each line the (maximal height of the line*lspd.dyaLine)/240.

The sprmPChgTabs (opcode 0xC615) is a complex sprm which describes changes tab settings for any paragraph within a piece. It is only stored as part of a grpprl linked to a piece table. It has the following format:

Field | Size | Comment
sprm | short | opcode
cch | byte | count of bytes (not including sprm and cch)
itbdDelMax | byte | number of tabs to delete
rgdxaDel | int[itbdDelMax] | array of tab positions for which tabs should be deleted
rgdxaClose | int[itbdDelMax] | array of tolerances corresponding to rgdxaDel where each tolerance defines an interval around corresponding rgdxaDel entry within which all tabs should be removed
itbdAddMax | byte | number of tabs to add
rgdxaAdd | int[itbdAddMax] | array of tab positions for which tabs should be added
rgtbdAdd | byte[itbdAddMax] | array of tab descriptors corresponding to rgdxaAdd

itbdDelMax and itbdAddMax are defined to be equal to 50. This means that the largest possible instance of sprmPChgTabs is 354. When the length of the sprm is greater than or equal to 255, the cch field will be set equal to 255. When cch == 255, the actual length of the sprm can be calculated as follows: length = 2 + itbdDelMax * 4 + itbdAddMax * 3.

When sprmPChgTabs is interpreted, the rgdxaDel of the sprm is applied first to the pap that is being transformed. This is done by deleting from the pap the rgdxaTab entry and rgtbd entry of any tab whose rgdxaTab value is within the interval [rgdxaDel[i] - rgdxaClose[i], rgdxaDel[i] + rgdxaClose[i]] It is guaranteed that the entries in pap.rgdxaTab and the sprm's rgdxaDel and rgdxaAdd are recorded in ascending dxa order.

Then the rgdxaAdd and rgtbdAdd entries are merged into the pap's rgdxaTab and rgtbd arrays so that the resulting pap rgdxaTab is sorted in ascending order with no duplicates.

The sprmPPc (opcode 0x261B) is a complex sprm which describes changes in the pap.pcHorz and pap.pcVert. It is able to change both fields' contents in parallel. It has the following format:

b10 | b16 | field | type | size | bitfield | comments
0 | 0 | sprm | short |  |  | opcode
2 | 2 |  | short | :4 | F0 | reserved
|  | pcVert | short | :2 | 0C | if pcVert ==3, pap.pcVert should not be changed. Otherwise, contains new value of pap.pcVert.
|  | pcHorz | short | :2 | 03 | if pcHorz==3, pap.pcHorz should not be changed. Otherwise, contains new value of pap.pcHorz.

Length of sprmPPc is three bytes.

sprmPPc is interpreted by moving pcVert to pap.pcVert if pcVert != 3 and by moving pcHorz to pap.pcHorz if pcHorz != 3. sprmPPc is stored in PAPX FKPs and also in grpprls linked to piece table entries.

sprmPPropRMark (opcode 0xC63F) is interpreted by moving the first parameter byte to pap.fPropRMark, the next two bytes to pap.ibstPropRMark, and the remaining four bytes to pap.dttmPropRMark.

sprmPHugePapx is stored in PAPX FKPs in place of the grpprl of a PAPX which would otherwise be too big to fit in an FKP (as of this writing, 488 bytes is the size of the largest PAPX which can fit in an FKP). The parameter fc gives the location of the grpprl in the data stream. The first word at that fc counts the number of bytes in the grpprl (not including the byte count itself). A sprmPHugePapx should therefore only be found in a PAPX FKP and should be the only sprm in that PAPX's grpprl.

sprmCPicLocation (opcode 0x6A03) is used ONLY IN CHPX FKPs. This sprm moves the 4-byte operand of the sprm into the chp.fcPic field. It simultaneously sets chp.fSpec to 1. This sprm is also when the chp.lTagObj field that is unioned with chp.fcPic is to be set for OLE objects.

sprmCChs (opcode 0xEA08) is used to record a character set id for text that was pasted into the Word document that used a character set different than Word's default character set. When chp.fChsDiff is 0, the character set used for a run of text is the default character set for the version of Word that last saved the document. When chp.fChsDiff is 1, chp.chse specifies the character set used for this run of text. This sprm's operand is 3 bytes. When this sprm is interpreted, the first byte of the operand is moved to chp.fChsDiff and the remaining word is moved to chp.chse.

sprmCSymbol (opcode 0x6A09) is used to specify the font and the character that will be used within that font to display a symbol character in Word. This sprm's operand is 4 bytes. The first 2 hold the font code; the last 2 hold a character specifier. When this sprm is interpreted, the font code is moved to chp.ftcSym and the character specifier is moved to chp.xchSym and chp.fSpec is set to 1.

sprmCIstdPermute (opcode 0xCA31) (which has the same format as sprmPIstdPermute (opcode 0xC601)) is a complex sprm which is applied to a piece when the style codes for character styles tagging character runs within a piece must be mapped to other style codes. It has the following format:

Field | Size | Comment
sprm | short | opcode( ==0xCA31)
cch | byte | count of bytes (not including sprm and cch)
fLongg | byte | always 0
fSpare | byte | always 0
istdFirst | unsigned short | index of first style in range to which permutation stored in rgistd applies
istdLast | unsigned short | index of last style in range to which permutation stored in rgistd applies
rgistd[] | unsigned short | array of istd entries that records the mapping of istds for text copied from a source document to istds that exists in the destination document after the text has been pasted

To interpret sprmCIstdPermute, first check if chp.istd is greater than the istdFirst recorded in the sprm and less than or equal to the istdLast recorded in the sprm If not, the sprm has no effect. If it is, chp.istd is set to rgstd[chp.istd - istdFirst] and any chpx stored in that rgstd entry is applied to the chp. sprmCIstdPermute is only stored in grpprls linked to a piece table. It should never be recorded in a CHPX.

Note that it is possible that an istd may be recorded in the rgistd that refers to a paragraph style. This will no harmful consequences since the istd for a paragraph style should never be recorded in chp.istd.

sprmCDefault (opcode 0x2A32) clears the fBold, fItalic, fOutline, fStrike, fShadow, fSmallCaps, fCaps, fVanish, kul and ico fields of the chp to 0. It was first defined for Word 3.01 and had to be backward compatible with Word 3.00 so it is a variable length sprm whose count of bytes is 0. It consists of the sprmCDefault opcode followed by a byte of 0. sprmCDefault is stored only in grpprls linked to piece table entries.

sprmCPlain (opcode 0x2A33) is used to make the character properties of runs of text equal to the style character properties of the paragraph that contains the text. When Word interprets this sprm, the style sheet CHP is copied over the original CHP preserving the fSpec setting from the original CHP. sprmCPlain is stored only in grpprls linked to piece table entries.

sprms 0x0835 through 0x083C (sprmCFBold through sprmCFVanish) set single bit properties in the CHP. When the parameter of the sprm is set to 0 or 1, then the CHP property is set to the parameter value.

When the parameter of the sprm is 128, then the CHP property is set to the value that is stored for the property in the style sheet. CHP When the parameter of the sprm is 129, the CHP property is set to the negation of the value that is stored for the property in the style sheet CHP. sprmCFBold through sprmCFVanish are stored only in grpprls linked to piece table entries.

sprmCSizePos (opcode 0xEA3F) is a five-byte sprm consisting of the sprm opcode and a three byte parameter. The sprm has the following format:

b10 | b16 | field | type | size | bitfield | comments
0 | 0 | sprm | short |  |  | opcode
2 | 2 | hpsSize | short | :8 | FF | when != 0, contains new size of chp.hps
3 | 3 | cInc | short | :7 | FE | contains the number of font levels to increase or decrease size of chp.hps as a twos complement value.
|  | fAdjust | short | :1 | 01 | when == 1, means that chp.hps should be adjusted up/down by one font level for super/subscripting change
4 | 4 | hpsPos | short | :8 | FF | when != 128, contains super/subscript position as a twos complement number

When Word interprets this sprm, if hpsSize != 0 then chp.hps is set to hpsSize. If cInc is != 0, the cInc is interpreted as a 7 bit twos complement number and the procedure described below for interpreting sprmCHpsInc is followed to increase or decrease the chp.hps by the specified number of levels. If hpsPos is != 128, then chp.hpsPos is set equal to hpsPos. If fAdjust is on , hpsPos != 128 and hpsPos != 0 and the previous value of chp.hpsPos == 0, then chp.hps is reduced by one level following the method described for sprmCHpsInc. If fAdjust is on, hpsPos == 0 and the previous value of chp.hpsPos != 0, then the chp.hps value is increased by one level using the method described below for sprmCHpsInc.

sprmCHpsInc(opcode 0x2A44) is a three-byte sprm consisting of the sprm opcode and a one-byte parameter. Word keeps an ordered array of the font sizes that are defined for the fonts recorded in the system file with each font size transformed into an hps. The parameter is a one-byte twos complement number. Word uses this number to calculate an index in the font size array to determine the new hps for a run. When Word interprets this sprm and the parameter is positive, it searches the array of font sizes to find the index of the smallest entry in the font size table that is greater than the current chp.hps.It then adds the parameter minus 1 to the index and maxes this with the index of the last array entry. It uses the result as an index into the font size array and assigns that entry of the array to chp.hps.

When the parameter is negative, Word searches the array of font sizes to find the index of the entry that is less than or equal to the current chp.hps. It then adds the negative parameter to the index and does a min of the result with 0. The result of the min function is used as an index into the font size array and that entry of the array is assigned to chp.hps. sprmCHpsInc is stored only in grpprls linked to piece table entries.

sprmCHpsPosAdj (opcode 0x2A46) causes the hps of a run to be reduced the first time text is superscripted or subscripted and causes the hps of a run to be increased when superscripting/subscripting is removed from a run. The one byte parameter of this sprm is the new hpsPos value that is to be stored in chp.hpsPos. If the new hpsPos is not equal 0 (meaning that the text is to be super/subscripted), Word first examines the current value of chp.hpsPos to see if it is equal to 0. If so, Word uses the algorithm described for sprmCHpsInc to decrease chp.hps by one level. If the new hpsPos == 0 (meaning the text is not super/subscripted), Word examines the current chp.hpsPos to see if it is not equal to 0. If it is not (which means text is being restored to normal position), Word uses the sprmCHpsInc algorithm to increase chp.hps by one level. After chp.hps is adjusted, the parameter value is stored in chp.hpsPos. sprmCHpsPosAdj is stored only in grpprls linked to piece table entries.

The parameter of sprmCMajority (opcode 0xCA47) is itself a list of character sprms which encodes a criterion under which certain fields of the chp are to be set equal to the values stored in a style's CHP. Bytes 0 and 1 of sprmCMajority contains the opcode, byte 2 contains the length of the following list of character sprms. . Word begins interpretation of this sprm by applying the stored character sprm list to a standard chp. That chp has chp.istd = istdNormalChar. chp.hps=20, chp.lid=0x0400 and chp.ftc = 4. Word then compares fBold, fItalic, fStrike, fOutline, fShadow, fSmallCaps, fCaps, ftc, hps, hpsPos, kul, qpsSpace and ico in the original CHP with the values recorded for these fields in the generated CHP.. If a field in the original CHP has the same value as the field stored in the generated CHP, then that field is reset to the value stored in the style's CHP. If the two copies differ, then the original CHP value is left unchanged. sprmCMajority is stored only in grpprls linked to piece table entries.

sprmCHpsInc1 (opcode 0xCA4A) is used to increase or decrease chp.hps by increments of 1. This sprm is interpreted by adding the two byte increment stored as the opcode of the sprm to chp.hps. If this result is less than 8, the chp.hps is set to 8. If the result is greater than 32766, the chp.hps is set to 32766.

sprmCMajority50 (opcode 0xCA4C) has the same format as sprmCMajority and is interpreted in the same way.

sprmCPropRMark (opcode 0xCA57) is interpreted by moving the first parameter byte to chp.fPropRMark, the next two bytes to chp.ibstPropRMark, and the remaining four bytes to chp.dttmPropRMark.

sprmCDispFldRMark (opcode 0xCA62) is interpreted by moving the first parameter byte to chp.fDispFldRMark, the next two bytes to chp.ibstDispFldRMark, the next four bytes to chp.dttmDispFldRMark, and the remaining 32 bytes to chp.xstDispFldRMark.

sprmCRgftc0 (opcode 0x4A4F), sprmcCRgftc1(opcode 0x4A50), and sprmCRgftc2 (opcode 0x4A4F) are used to specify the fonts that are available for use with text. Rgftc0 specifies the font used for characters from U+0000->U+007F. Rgftc1 specifies the font to be used for Far East characters, and Rgftc2 specifies the font to be used for all other text. See appendix C for details on how the font is calculated.

sprmCRglid0 (opcode 0x486D) and sprmCRglid1 (opcode 0x486E) are used to specify the languages that are available for use with the text in this run. sprmCRglid1 specifies the language for Far East text, sprmCRglid0 specifies the language for all other text. See Appendix C for details on the language is calculated.

sprmCIdctHint (opcode 0x286F) specifies a script bias for the text in the run. For Unicode characters that are shared between Far East and non-Far East scripts, this property determines what font and language the character will use. When this value is 0, text properties bias towards non-Far East properties. When this value is 1, text properties bias towards Far East properties. See Appendix C for details on the calculation of font and language properties.

sprmPicScale (opcode 0xCE01) is used to scale the x and y dimensions of a Word picture and to set the cropping for each side of the picture. The sprm begins with the two-byte opcode, followed by the length of the parameter (always 12) stored in a byte. The 12-byte long operand consists of an array of 6 two-byte integer fields. The 0th integer contains the new setting for pic.mx. The 1st integer contains the new setting for pic.my. The 2nd integer contains the new setting for pic.dxaCropLeft. The 3rd integer contains the new setting for pic.dyaCropTop. The 4th integer contains the new setting for pic.dxaCropRight. The 5th integer contains the new setting of pic.dxaCropBottom. sprmPicScale is stored only in grpprls linked to piece table entries.

sprmSPropRMark (opcode 0xD227) is interpreted by moving the first parameter byte to sep.fPropRMark, the next two bytes to sep.ibstPropRMark, and the remaining four bytes to sep.dttmPropRMark.

sprmSTextFlow (opcode 0x5033) represents the textflow to be applied to this section. Possible values are:

0 | horizontal, non-@font
1 | top to bottom, @font
2 | bottom to top, non-@font
3 | top to botton, non-@font
4 | horizontal, @-font

sprmTDxaLeft (opcode 0x9601) is called to adjust the x position within a column which marks the left boundary of text within the first cell of a table row. This sprm causes a whole table row to be shifted left or right within its column leaving the horizontal width and vertical height of cells in the row unchanged. Bytes 0-1 of the sprm contains the opcode, and the new dxa position, call it dxaNew, is stored as an integer in bytes 2 and 3. Word interprets this sprm by addingdxaNew - (rgdxaCenter[0] + tap.dxaGapHalf) to every entry of tap.rgdxaCenter whose index is less than tap.itcMac. sprmTDxaLeft is stored only in grpprls linked to piece table entries.

sprmTDxaGapHalf (opcode 0x9602) adjusts the white space that is maintained between columns by changing tap.dxaGapHalf. Because we want the left boundary of text within the leftmost cell to be at the same location after the sprm is applied, Word also adjusts tap.rgdxCenter[0] by the amount that tap.dxaGapHalf changes. Bytes 0-1 of the sprm contains the opcode, and the new dxaGapHalf, call it dxaGapHalfNew, is stored in bytes 2 and 3. When the sprm is interpreted, the change between the old and new dxaGapHalf values, tap.dxaGapHalf - dxaGapHalfNew, is added to tap.rgdxaCenter[0] and then dxaGapHalfNew is moved to tap.dxaGapHalf. sprmTDxaGapHalf is stored in PAPXs and also in grpprls linked to piece table entries.

sprmTTableBorders (opcode 0xD605) sets the tap.rgbrcTable. The sprm is interpreted by moving the 24 bytes of the sprm's operand to tap.rgbrcTable.

sprmTDefTable10 (opcode0xD606) is an obsolete version of sprmTDefTable (opcode 0xD608) that was used in WinWord 1.x. Its contents are identical to those in sprmTDefTable, except that the TC structures contain the obsolete structures BRC10s.

sprmTDefTable (opcode 0xD608) defines the boundaries of table cells (tap.rgdxaCenter) and the properties of each cell in a table (tap.rgtc). Bytes 0 and 1 of the sprm contain its opcode. Bytes 2 and 3 store a two-byte length of the following parameter. Byte 4 contains the number of cells that are to be defined by the sprm, call it itcMac. When the sprm is interpreted, itcMac is moved to tap.itcMac. itcMac cannot be larger than 32. In bytes 5 through 5+2*(itcMac + 1) -1 , is stored an array of integer dxa values sorted in ascending order which will be moved to tap.rgdxaCenter. In bytes 5+ 2*(itcMac + 1) through byte 5+2*(itcMac + 1) + 10*itcMac - 1 is stored an array of TC entries corresponding to the stored tap.rgdxaCenter. This array is moved to tap.rgtc. sprmTDefTable is only stored in PAPXs.

sprmTDefTableShd (opcode 0xD609) is similar to sprmTDefTable, and compliments it by defining the shading of each cell in a table (tap.rgshd). Bytes 0 and 1 of the sprm contain its opcode. Bytes 2 and 3 store a two-byte length of the following parameter. Byte 4 contains the number of cells that are to be defined by the sprm, call it itcMac. itcMac cannot be larger than 32. In bytes 5 through 5+2*(itcMac + 1) -1 , is stored an array of SHDs. This array is moved to tap.rgshd. sprmTDefTable is only stored in PAPXs.

sprmTSetBrc (opcode 0xD620) allows the border definitions(BRCs) within TCs to be set to new values. It has the following format:

b10 | b16 | field | type | size | bitfield | comments
0 | 0 | sprm | short |  |  | opcode 0xD620
2 | 2 | count | byte |  |  | number of bytes for operand
3 | 3 | itcFirst | byte |  |  | the index of the first cell that is to have its borders changed.
4 | 4 | itcLim | byte |  |  | index of the cell that follows the last cell to have its borders changed
5 | 5 |  | short | :4 | F0 | reserved
|  | fChangeRight | short | :1 | 08 | =1 when tap.rgtc[].brcRight is to be changed
|  | fChangeBottom | short | :1 | 04 | =1 when tap.rgtc[].brcBottom is to be changed
|  | fChangeLeft | short | :1 | 02 | =1 when tap.rgtc[].brcLeft is to be changed
|  | fChangeTop | short | :1 | 01 | =1 when tap.rgtc[].brcTop is to be changed
6 | 6 | brc | BRC |  |  | new BRC value to be stored in TCs.

This sprm changes the brc fields selected by the fChange* flags in the sprm to the brc value stored in the sprm, for every tap.rgtc entry whose index is greater than or equal to itcFirst and less than itcLim.sprmTSetBrc is stored only in grpprls linked to piece table entries.

sprmTInsert (opcode 0x7621) inserts new cell definitions in an existing table's cell structure. Bytes 0 and 1 of the sprm contain the opcode. Byte 2 is the index within tap.rgdxaCenter and tap.rgtc at which the new dxaCenter and tc values will be inserted. Call this index itcInsert. Byte 3 contains a count of the cell definitions to be added to the tap, call it ctc. Bytes 4 and 5 contain the width of the cells that will be added, call it dxaCol. If there are already cells defined at the index where cells are to be inserted, tap.rgdxaCenter entries at or above this index must be moved to the entry ctc higher and must be adjusted by adding ctc*dxaCol to the value stored. The contents of tap.rgtc at or above the index must be moved 10*ctc bytes higher in tap.rgtc. If itcInsert is greater than the original tap.itcMac, itcInsert - tap.ctc columns beginning with index tap.itcMac must be added of width dxaCol (loop from itcMac to itcMac+itcInsert-tap.ctc adding dxaCol to the rgdxaCenter value of the previous entry and storing sum as dxaCenter of new entry), whose TC entries are cleared to zeros. Beginning with index itcInsert, ctc columns of width dxaCol must be added by constructing new tap.rgdxaCenter and tap.rgtc entries with the newly defined rgtc entries cleared to zeros. Finally, the number of cells that were added to the tap is added to tap.itcMac. sprmTInsert is stored only in grpprls linked to piece table entries.

sprmTDelete (opcode 0x5622) deletes cell definitions from an existing table's cell structure. Bytes 0 and 1of the sprm contain the opcode. Byte 2 contains the index of the first cell to delete, call it itcFirst. Byte 3 contains the index of the cell that follows the last cell to be deleted, call it itcLim. sprmTDelete causes any rgdxaCenter and rgtc entries whose index is greater than or equal to itcLim to be moved to the entry that is itcLim - itcFirst lower, and causes tap.itcMac to be decreased by the number of cells deleted. sprmTDelete is stored only in grpprls linked to piece table entries.

sprmTDxaCol (opcode 0x7623) changes the width of cells whose index is within a certain range to be a certain value. Bytes 0 and 1of the sprm contain the opcode. Byte 2 contains the index of the first cell whose width is to be changed, call it itcFirst. Byte 3 contains the index of the cell that follows the last cell whose width is to be changed, call it itcLim. Bytes 4 and 5 contain the new width of the cell, call it dxaCol. This sprm causes the itcLim - itcFirst entries of tap.rgdxaCenter to be adjusted so that tap.rgdxaCenter[i+1] = tap.rgdxaCenter[i] + dxaCol. Any tap.rgdxaCenter entries that exist beyond itcLim are adjusted to take into account the amount added to or removed from the previous columns.sprmTDxaCol is stored only in grpprls linked to piece table entries.

sprmTMerge (opcode 0x5624) merges the display areas of cells within a specified range. Bytes 0 and 1 of the sprm contain the opcode. Byte 2 contains the index of the first cell that is to be merged, call it itcFirst. Byte 3 contains the index of the cell that follows the last cell to be merged, call it itcLim. This sprm causes tap.rgtc[itcFirst].fFirstMerged to be set to 1. Cells in the range whose index is greater than itcFirst and less than itcLim have tap.rgtc[].fMerged set to 1. sprmTMerge is stored only in grpprls linked to piece table entries.

sprmTSplit (opcode 0x5625) splits the display areas of merged cells into their originally assigned display areas. Bytes 0 and 1 of the sprm contain the opcode. Byte 2 contains the index of the first cell that is to be split, call it itcFirst. Byte 3 contains the index of the cell that follows the last cell to be split, call it itcLim. This sprm clears tap.rgtc[].fFirstMerged and tap.rgtc[].fMerged for all rgtc entries >= itcFirst and < itcLim. sprmTSplit is stored only in grpprls linked to piece table entries.

SprmTSetBrc10 (opcode 0xD626) has the same format as SprmTSetBrc but uses the old BRC10 structure.

sprmTSetShd (opcode 0x7627) allows the shading definitions(SHDs) within a tap to be set to new values. Bytes 0 and 1 of the sprm contain the opcode. Byte 2 contains the index of the first cell whose shading is to be changed, call it itcFirst. Byte 3 contains the index of the cell that follows the last cell whose shading is to be changed, call it itcLim. Bytes 4 and 5 contain the SHD structure, call it shd. This sprm causes the itcLim - itcFirst entries of tap.rgshd to be set to shd. sprmTSetShd is stored only in grpprls linked to piece table entries.

sprmTSetShdOdd (opcode 0x7628) is identical to sprmTSetShd, but it only changes the rgshd for odd indices between itcFirst and. sprmTSetShdOdd is stored only in grpprls linked to piece table entries.

sprmTVertMerge (opcode 0xD62B) changes the vertical cell merge properties for a cell in the tap.rgtc[]. Bytes 0 and 1 of the sprm contain the opcode. Byte 2 contains the index of the cell whose vertical cell merge properties are to be changed. Byte 3 codes the new vertical cell merge properties for the cell, a 0 clears both fVertMerge and fVertRestart, a 1 sets fVertMerge and clears fVertRestart, and a 3 sets both flags. sprmTVertMerge is stored only in grpprls linked to piece table entries.

sprmTVertAlign (opcode 0xD62C) changes the vertical alignment property in the tap.rgtc[]. Bytes 0 and 1 of the sprm contain the opcode. Byte 2 contains the index of the first cell whose shading is to be changed, call it itcFirst. Byte 3 contains the index of the cell that follows the last cell whose shading is to be changed, call it itcLim. This sprm causes the vertAlign properties of the itcLim - itcFirst entries of tap.rgtc[] to be set to the new vertical alignment property contained in Byte 4. sprmTVertAlign is stored only in grpprls linked to piece table entries.

© 1998 Microsoft Corporation. All rights reserved. Terms of use