Administración de la selección de selección y colocación de símbolos de intercalación

Los lenguajes de script complejos se dividen en clústeres mediante ScriptShape. La reordenación de caracteres siempre se produce dentro de los límites del clúster. Se garantiza que los clústeres avanzan en la dirección del orden de lectura.

La información del clúster en la matriz de clústeres lógicos se usa para compartir el ancho de un clúster de glifos igualmente entre los caracteres lógicos que representan. Por ejemplo, el glifo lam alef se divide en cuatro áreas:

  • La mitad inicial del lam.
  • La mitad final del lam.
  • La mitad inicial del alef.
  • La mitad final del alef.

Las convenciones para la colocación de símbolos de intercalación en clústeres dependen del script. Para el script árabe, si la posición del símbolo de intercalación se establece entre un carácter base y su marca de combinación, el símbolo de intercalación se muestra a mitad del carácter base. Para el script tailandés, el símbolo de intercalación no se puede colocar dentro de un clúster. Por lo tanto, cuando el usuario avanza el símbolo de intercalación, la aplicación debe avanzar más allá de todos los glifos que componen el clúster.

Las funciones ScriptXtoCP y ScriptCPtoX se traducen entre posiciones de intercalación (en desplazamientos de punto de código) y x (en píxeles). La función ScriptXtoCP tiene conocimiento de las convenciones de posición de intercalación de cada script:

  • En el caso de las posiciones indias y tailandesas, las posiciones de intercalación se ajustan a los límites del clúster.
  • En árabe, las posiciones de intercalación se interpolan con clústeres.
  • En hebreo, en versiones anteriores a Usp10.dll, versión 1.420, las posiciones de intercalación se interpolan con clústeres. A partir de Usp10.dll, versión 1.420, las posiciones de intercalación se ajustan a los límites del clúster.

Tanto ScriptXtoCP como ScriptCPtoX solo funcionan dentro de las ejecuciones. Las funciones requieren que ciertos parámetros provengan de llamadas Uniscribe anteriores, como se muestra en la tabla siguiente.

Parámetro Source
Psa Tal y como devuelve ScriptItemize.
cGlyphspwLogClust
psva
Tal y como devuelve ScriptShape.
piAdvance Tal y como devuelve ScriptPlace.

 

La aplicación debe establecer la ejecución en la que una posición de desplazamiento de intercalación o x determinada es antes de pasar la información a ScriptCPtoX o ScriptXtoCP. Si la aplicación no guarda la información de ancho, puede realizar pruebas de posicionamiento y colocación de intercalación después de mostrar cada ejecución. Como alternativa, la aplicación puede almacenar en caché suficiente información para realizar pruebas de posicionamiento y colocación de intercalación en la línea actual sin necesidad de volver a procesar el párrafo.

ScriptXtoCP devuelve un valor perimetral final para que la aplicación conozca el lado del carácter o clúster en el que el usuario ha hecho clic. El valor es 0 o el ancho del carácter o clúster en puntos de código. La posición del carácter devuelto es la posición del carácter en el que el usuario ha clicado. Para obtener más información, vea Mostrar el símbolo de intercalación en cadenas bidireccionales.

Para idiomas como tailandés, para los que el usuario no desea colocar el símbolo de intercalación en un clúster, ScriptXtoCP establece la marca lateral final en 0 o en el ancho del clúster. Para idiomas como el árabe, para el que el usuario espera poder editar dentro de un clúster, ScriptXtoCP establece la marca lateral final en 0 o en 1.

Para ayudar a la aplicación a establecer ubicaciones válidas para el símbolo de intercalación al controlar las teclas de dirección, Uniscribe proporciona información sobre las posiciones de intercalación válidas en el miembro fCharStop en los atributos lógicos devueltos por ScriptBreak. TRUE se devuelve para la mayoría de los caracteres y FALSE para los caracteres intercluster en scripts como tailandés. La aplicación debe comprobar el valor fNeedsCaretInfo en la estructura SCRIPT_PROPERTIES de un elemento para ver si es necesario llamar a ScriptBreak para comprobar si hay posiciones de intercalación válidas. Si el valor fNeedsCaretInfo es FALSE, todos los puntos de código son posiciones de intercalación válidas.

Uso de Uniscribe