3.4 Example of a PlcBteChpx
The following is an example of a PlcBteChpx structure. It demonstrates how to apply character formatting properties to text in a document. See section 2.4.6.2, Direct Character Formatting.
Offset |
Size |
Structure |
Value |
---|---|---|---|
0000009A |
02E8 |
FibRgFcLcb97 - rgFcLcb97 |
|
0000009A |
0060 |
... (omitted for brevity) - |
|
000000FA |
0004 |
- fcPlcfBteChpx |
0x000000D6 |
000000FE |
0004 |
- lcbPlcfBteChpx |
0x0000000C |
00000102 |
0280 |
... (omitted for brevity) - |
|
Figure 22: Portions of the FibRgFcLcb97 structure, highlighting fc/lcbPlcfBteChpx
The FibRgFcLcb97 structure is very large. Most fields have been omitted here for brevity.
fcPlcfBteChpx: A value of 0x000000D6 specifies the offset, in bytes, of a location in the Table Stream. A PlcBteChpx structure begins at this offset.
lcbPlcfBteChpx: A value of 0x0000000C specifies the size, in bytes, of the PlcBteChpx at offset 0x000000D6 in the Table Stream. Because each PnFkpChpx structure is four bytes, this PlcBteChpx structure contains exactly two CPs and one PnFkpChpx structures.
The following table shows the top level of the PlcBteChpx at offset 0x000000D6 in the Table Stream.
Offset |
Size |
Structure |
Value |
---|---|---|---|
000000D6 |
000C |
PlcBteChpx - PlcBteChpx |
|
000000D6 |
0004 |
LONG - fc[0] |
0x00000400 |
000000DA |
0004 |
LONG - fc[1] |
0x00000411 |
000000DE |
0004 |
PnFkpChpx - pn[0] |
|
000000DE |
22 bits |
LONG - pn |
0x000003 |
000000DE |
10 bits |
LONG - unused |
0x000 |
Figure 38: A PlcBteChpx
fc[0]: 0x00000400 specifies the offset in the WordDocument Stream where a text range begins. This is the first and only text range that is specified; this is evident because there are only two FCs.
fc[1]: 0x00000411 specifies the offset in the WordDocument Stream immediately after the end of the text range. Because the text is 8-bit ANSI (see Section 2.4.1, Retrieving Text) the end of the text range is 0x410. If this document had more than one text range, 0x00000411 would also specify the start of the next text range.
pn[0].pn: 0x00000003 specifies the offset in the WordDocument Stream of the ChpxFkp structure that is applied to the text range. This ChpxFkp structure is referred to as chpxfkp[0]. The chpxfkp[0] element begins at offset 3 * 512 = 1536 = 0x00000600. See the following table for the expansion of chpxfkp[0].
pn[0].unused: Undefined and ignored.
The following table shows the expansion of chpxfkp[0], which specifies the character formatting properties for the first and only text range in the document.
Offset |
Size |
Structure |
Value |
---|---|---|---|
00000600 |
0200 |
ChpxFkp - chpxfkp[0] |
|
00000600 |
0010 |
Array of ULONG - rgfc |
|
00000600 |
0004 |
ULONG - rgfc[0] |
0x00000400 |
00000604 |
0004 |
ULONG - rgfc[1] |
0x00000407 |
00000608 |
0004 |
ULONG - rgfc[2] |
0x00000410 |
0000060C |
0004 |
ULONG - rgfc[3] |
0x00000411 |
00000610 |
0003 |
Array of BYTE - rgb |
|
00000610 |
0001 |
BYTE - rgb[0] |
0xFA |
00000611 |
0001 |
BYTE - rgb[1] |
0xF8 |
00000612 |
0001 |
BYTE - rgb[2] |
0x00 |
000007FF |
0001 |
BYTE - crun |
0x03 |
Figure 24: Expansion of chpxfkp[0]
rgfc.rgfc[0]: A value of 0x00000400 specifies the offset in the WordDocument Stream at which the first text run in the text range begins. This text run ends at 0x00000406, immediately before the start of the next run, and includes the text "Orange".
rgfc.rgfc[1]: A value of 0x00000407 specifies the offset in the WordDocument Stream at which the second text run in the text range begins. This text run ends at 0x0000040F, immediately before the start of the next run, and includes the text "Underline".
rgfc.rgfc[2]: A value of 0x00000410 specifies the offset in the WordDocument Stream at which the third text run in the text range begins. This text run ends at 0x00000410, and is therefore a single character, which is a paragraph marker.
rgfc.rgfc[3]: A value of 0x00000411 specifies the offset in the WordDocument Stream immediately after the end of the third text run in the text range.
rgb.rgb[0]: A value of 0xFA specifies the offset of the Chpx for the first text run, referred to as chpx[0] (see its expansion later). The chpx[0] element is 2 * 0xFA = 0x1F4 bytes from the start of chpxfkp[0], or 0x600 + 0x1F4 = 0x7F4 bytes from the start of the Table Stream.
rgb.rgb[1]: A value of 0xF8 specifies the offset of the Chpx for the second text run, referred to as chpx[1] (see its expansion later). The chpx[1] element is 2 * 0xF8 = 0x1F0 bytes from the start of chpxfkp[0], or 0x600 + 0x1F0 = 0x7F0 bytes from the start of the Table Stream.
rgb.rgb[2]: A value of 0x00 specifies that there are no character properties associated with the third text run.
crun: A value of 0x03 specifies the number of runs in this text range. This is equal to the number of elements in rgb, and is 1 less than the number of elements in rgfc.
The following table shows the expansion of the chpx[0] element, which specifies the character property information for the first text run of the text range.
Offset |
Size |
Structure |
Value |
---|---|---|---|
000007F4 |
000A |
Chpx - chpx[0] |
|
000007F4 |
0001 |
BYTE - cb |
0x09 |
000007F5 |
0009 |
Array of Prl - GrpPrl |
|
000007F5 |
0003 |
Prl - GrpPrl[0] |
|
000007F8 |
0006 |
Prl - GrpPrl[1] |
|
Figure 25: Expansion of chpx[0]
cb: A value of 0x09 specifies that GrpPrl is 9 bytes long.
GrpPrl: The array of properties being applied.
GrpPrl.GrpPrl[0]: The first property that is being applied. See the chpx[0].GrpPrl.GrpPrl[0] element that is described later in this document.
GrpPrl.GrpPrl[1]: The second property that is being applied. See the chpx[0].GrpPrl.GrpPrl[1] element that is described later in this document. The fact that there are no more bytes left in the GrpPrl element after this property is read indicates that there are no more properties.
The chpx[0] element contains some of the properties that apply to the first run of the text range. The properties that are not contained in chpx[0] take on their respective default values.
The following table shows the expansion of the chpx[0].GrpPrl.GrpPrl[0] element, which is the first property that is applied to the first text run ("Orange "). It applies a color to the text.
Offset |
Size |
Structure |
Value |
---|---|---|---|
000007F5 |
0003 |
Prl - chpx[0].GrpPrl.GrpPrl[0] |
|
000007F5 |
0002 |
Sprm - sprm |
|
000007F5 |
9 bits |
USHORT - ispmd |
0x042 |
000007F5 |
1 bit |
USHORT - fSpec |
0x1 |
000007F5 |
3 bits |
USHORT - sgc |
0x2 |
000007F5 |
3 bits |
USHORT - spra |
0x1 |
000007F7 |
0001 |
Ico - operand |
|
000007F7 |
0001 |
BYTE - value |
0x07 |
Figure 26: Expansion of chpx[0].GrpPrl.GrpPrl[0]
sprm: The property being modified.
sprm.ispmd: If ispmd is equal to 0x0042 and fSpec is equal to 0x0001, this property has a value of sprmCIco.
sprm.sgc: A value of 0x2 specifies that this is a character property.
sprm.spra: A value of 0x1 specifies that operand is 1 byte long.
operand: The property value, which is an RGB color value that is expressed by an Ico structure.
operand.value: A value of 0x07 specifies that the text color will be represented using RGB (0xFF, 0xFF, 0x00) values.
The following table shows the expansion of the chpx[0].GrpPrl.GrpPrl[1] element, which is the second property that is applied to the first text run ("Orange"). It also applies a color to the text. Because this property occurs after the occurrence of sprmCIco, the color it specifies takes precedence.
Offset |
Size |
Structure |
Value |
---|---|---|---|
000007F8 |
0006 |
Prl - chpx[0].GrpPrl.GrpPrl[1] |
|
000007F8 |
0002 |
Sprm - sprm |
|
000007F8 |
9 bits |
USHORT - ispmd |
0x070 |
000007F8 |
1 bit |
USHORT - fSpec |
0x0 |
000007F8 |
3 bits |
USHORT - sgc |
0x2 |
000007F8 |
3 bits |
USHORT - spra |
0x3 |
000007FA |
0004 |
COLORREF - operand |
|
000007FA |
0001 |
BYTE - red |
0xFF |
000007FB |
0001 |
BYTE - green |
0x99 |
000007FC |
0001 |
BYTE - blue |
0x00 |
000007FD |
0001 |
BYTE - fAuto |
0x00 |
Figure 27: Expansion of chpx[0].GrpPrl.GrpPrl[1]
sprm: The property that is being modified.
sprm.ispmd: If ispmd is equal to 0x0070 and fSpec is equal to 0x0000, the value of this property is sprmCCv.
sprm.sgc: A value of 0x2 specifies that this is a character property.
sprm.spra: A value of 0x3 specifies that operand is four bytes long.
operand: The property value, which is an RGB color value that is expressed by a COLORREF.
operand.red: A value of 0xFF specifies the red component of the RGB value.
operand.green: A value of 0x99 specifies the green component of the RGB value.
operand.blue: A value of 0x00 specifies the blue component of the RGB value.
operand.fAuto: A value of 0x00 specifies that the RGB value will be used as specified.
The following table shows the expansion of the chpx[1] element, which specifies the character property information for the second text run of the text range ("Underline").
Offset |
Size |
Structure |
Value |
---|---|---|---|
000007F0 |
0004 |
Chpx - chpx[1] |
|
000007F0 |
0001 |
BYTE - cb |
0x03 |
000007F1 |
0003 |
GrpPrlChpx - GrpPrl |
|
000007F1 |
0003 |
Prl - GrpPrl[0] |
|
Figure 28: Expansion of chpx[1]
cb: A value of 0x03 specifies that GrpPrl is 3 bytes long.
GrpPrl: The array of properties that is being applied.
GrpPrl.GrpPrl[0]: The first and only property that is being applied. See the chpx[1].GrpPrl.GrpPrl[0] element in the following table.
The chpx[1] element contains only some of the properties that apply to the second run of the text range. The properties that are not contained in the chpx[1] element take on their respective default values.
The following table shows the expansion of the chpx[1].GrpPrl.GrpPrl[0] value, which is the first and only property that is applied to the second text run.
Offset |
Size |
Structure |
Value |
---|---|---|---|
000007F1 |
0003 |
Prl - chpx[1].GrpPrl.GrpPrl[0] |
|
000007F1 |
0002 |
Sprm - sprm |
|
000007F1 |
9 bits |
USHORT - ispmd |
0x03E |
000007F1 |
1 bit |
USHORT - fSpec |
0x1 |
000007F1 |
3 bits |
USHORT - sgc |
0x2 |
000007F1 |
3 bits |
USHORT - spra |
0x1 |
000007F3 |
0001 |
Kul - operand |
0x01 |
Figure 29: Expansion of chpx[1].GrpPrl.GrpPrl[0]
sprm: The property that is being modified.
sprm.ispmd: If ispmd is equal to 0x003E and fSpec is equal to 0x0001, the value of this property is sprmCKul.
sprm.sgc: A value of 0x2 specifies that this is a character property.
sprm.spra: A value of 0x1 specifies that operand is 1 byte long.
operand: A value of 0x01 specifies that the text has a single underline.