The actions determine the orientation of characters by using the Layout Services transformation OutToInp and Property buffers for the nesting level. The widget's behavior is therefore dependent on the locale-specific transformation. If the information in the OutToInp or, especially, Property buffers is inaccurate, the widget might behave unexpectedly. Moreover, as the locale-specific modules fall outside of the scope of this specification, bidirectional editing behavior can differ from platform to platform for the same text, application, resource values, and LayoutObject configuration.
The visual mode actions result in a display of cell-based behavior. The logical mode actions result in logical character-based behavior. For example, the delete-right-character() operation deletes the input buffer characters that correspond to the display cell. That is, one input buffer character whole LayoutObject transformation “property” byte “new cell indicator” is 1, and all succeeding characters whose “new cell indicator” is 0.
For more information on the Property buffer, see the specification for m_transform_layout() in CAE Specification.
Similarly, for backward-character(), the insertion point is moved backward one character in the input buffer, and the cursor is redrawn at the visual location corresponding to the associated output buffer character. Therefore, several keystrokes are required to move across a composite display cell. The cursor does not actually change display location as the insertion point moves across input buffer characters such as diacritics or ligature fragments whose “new cell indicator” is 0.
This behavior means that deletion operates either from the logical/input buffer side, or from the display cell level of the physical/output side. No mode exists for a strict, physical character-by-character deletion because no one-to-one correspondence exists between the input and output buffers. A given physical character can represent only a fragment of a logical character, for example.