Gerenciando o posicionamento do cursor e o teste de clique

Linguagens de script complexas são divididas em clusters por ScriptShape. A reordenação de caracteres sempre ocorre dentro dos limites do cluster. Os próprios clusters têm a garantia de avançar na direção da ordem de leitura.

As informações de cluster na matriz de cluster lógico são usadas para compartilhar a largura de um cluster de glifos igualmente entre os caracteres lógicos que eles representam. Por exemplo, o glifo lam alef é dividido em quatro áreas:

  • A metade à esquerda da fuga.
  • A metade à direita da fuga.
  • A metade à esquerda do alef.
  • A metade à direita do alef.

As convenções para o posicionamento de cursor em clusters dependem do script. Para o script árabe, se a posição do cursor estiver definida entre um caractere base e sua marca de combinação, o cursor será exibido na metade do caractere base. Para o script tailandês, o cursor não pode ser posicionado dentro de um cluster. Assim, quando o usuário avança o cursor, o aplicativo deve passar por todos os glifos que compõem o cluster.

As funções ScriptXtoCP e ScriptCPtoX são convertidas entre posições de cursor (em deslocamentos de ponto de código) e posições x (em pixels). A função ScriptXtoCP tem conhecimento das convenções de posição de cursor de cada script:

  • Para indianos e tailandeses, as posições de cursor são ajustadas aos limites do cluster.
  • Para árabe, as posições de cursor são interpoladas com clusters.
  • Para hebraico, em versões anteriores a Usp10.dll, versão 1.420, as posições de cursor são interpoladas com clusters. A partir do Usp10.dll, versão 1.420, as posições de cursor são ajustadas aos limites do cluster.

ScriptXtoCP e ScriptCPtoX operam somente em execuções. As funções exigem que determinados parâmetros sejam provenientes de chamadas Uniscribe anteriores, conforme mostrado na tabela a seguir.

Parâmetro Fonte
Psa Conforme retornado por ScriptItemize.
cGlyphspwLogClust
psva
Conforme retornado por ScriptShape.
piAdvance Conforme retornado por ScriptPlace.

 

O aplicativo deve estabelecer a execução na qual um determinado deslocamento de cursor ou posição x é antes de passar as informações para ScriptCPtoX ou ScriptXtoCP. Se o aplicativo não salvar as informações de largura, ele poderá fazer testes de clique e posicionamento de cursor depois de exibir cada execução. Como alternativa, o aplicativo pode armazenar em cache informações suficientes para fazer testes de clique e posicionamento de cursor na linha atual sem a necessidade de reprocessamento do parágrafo.

ScriptXtoCP retorna um valor de borda à direita para que o aplicativo conheça o lado do caractere ou cluster no qual o usuário clicou. O valor é 0 ou a largura do caractere ou cluster em pontos de código. A posição do caractere retornado é a posição do caractere no qual o usuário clicou. Para obter mais informações, consulte Exibindo o cursor em cadeias de caracteres bidirecionais.

Para idiomas como tailandês, para os quais o usuário convencionalmente não deseja colocar o cursor em um cluster, ScriptXtoCP define o sinalizador lateral à direita como 0 ou para a largura do cluster. Para idiomas como árabe, para os quais o usuário espera poder editar em um cluster, ScriptXtoCP define o sinalizador lateral à direita como 0 ou 1.

Para ajudar o aplicativo a estabelecer locais válidos para o cursor ao manipular as teclas de direção, o Uniscribe fornece informações sobre posições de cursor válidas no membro fCharStop nos atributos lógicos retornados pelo ScriptBreak. TRUE é retornado para a maioria dos caracteres e FALSE para caracteres de intercluster em scripts como tailandês. O aplicativo deve marcar o valor fNeedsCaretInfo na estrutura SCRIPT_PROPERTIES de um item para ver se é necessário chamar ScriptBreak para marcar para posições de cursor válidas. Se o valor fNeedsCaretInfo for FALSE, todos os pontos de código serão posições de cursor válidas.

Usando Uniscribe