Condividi tramite


Gestione del posizionamento e del hit testing di Caret

I linguaggi di script complessi vengono suddivisi in cluster by ScriptShape. Il riordinamento dei caratteri si verifica sempre all'interno dei limiti del cluster. I cluster stessi sono garantiti di avanzare nella direzione dell'ordine di lettura.

Le informazioni sul cluster nella matrice del cluster logico vengono usate per condividere la larghezza di un cluster di glifi altrettanto tra i caratteri logici che rappresentano. Ad esempio, il glifo lam alef è diviso in quattro aree:

  • Metà iniziale del lam.
  • Metà finale del lam.
  • Metà iniziale dell'alef.
  • Metà finale dell'alef.

Le convenzioni per il posizionamento del caret all'interno dei cluster dipendono dallo script. Per lo script arabo, se la posizione del cursore è impostata tra un carattere di base e il relativo segno di combinazione, la caret viene visualizzata a metà del carattere di base. Per lo script thai, il caret non può essere posizionato all'interno di un cluster. Pertanto, quando l'utente avanza il caret, l'applicazione deve passare oltre tutti gli glifi che costituiscono il cluster.

Le funzioni ScriptXtoCP e ScriptCPtoX traducono tra posizioni di caret (in offset del punto di codice) e posizioni x (in pixel). La funzione ScriptXtoCP ha conoscenza delle convenzioni di posizione del caret di ogni script:

  • Per l'indiano e il thai, le posizioni di caret vengono ignorate ai limiti del cluster.
  • Per l'arabo, le posizioni di caret vengono interpolate con cluster.
  • Per l'ebraico, nelle versioni precedenti alla Usp10.dll, la versione 1.420, le posizioni di caret vengono interpolate con cluster. A partire da Usp10.dll, la versione 1.420, le posizioni di caret vengono ignorate ai limiti del cluster.

ScriptXtoCP e ScriptCPtoX operano solo all'interno di esecuzioni. Le funzioni richiedono che determinati parametri provengono da chiamate uniscrizioni precedenti, come illustrato nella tabella seguente.

Parametro Source (Sorgente)
Psa Come restituito da ScriptItemize.
cGlyphspwLogClust
psva
Come restituito da ScriptShape.
piAdvance Come restituito da ScriptPlace.

 

L'applicazione deve stabilire l'esecuzione in cui un determinato offset di caret o x è prima di passare le informazioni a ScriptCPtoX o ScriptXtoCP. Se l'applicazione non salva le informazioni sulla larghezza, può eseguire test di hit test e posizionamento del cursore dopo aver visualizzato ogni esecuzione. In alternativa, l'applicazione può memorizzare nella cache informazioni sufficienti per eseguire hit test e posizionamento del cursore sulla riga corrente senza richiedere l'elaborazione del paragrafo.

ScriptXtoCP restituisce un valore perimetrale finale in modo che l'applicazione conosca il lato del carattere o del cluster su cui l'utente ha fatto clic. Il valore è 0 o la larghezza del carattere o del cluster nei punti di codice. La posizione del carattere restituito è la posizione del carattere in cui l'utente ha fatto clic. Per altre informazioni, vedere Visualizzazione del caret in Stringhe bidirezionali.

Per le lingue come thai, per cui l'utente non vuole posizionare il cursore in un cluster, ScriptXtoCP imposta il flag laterale finale su 0 o sulla larghezza del cluster. Per le lingue come l'arabo, per cui l'utente prevede di essere in grado di modificare all'interno di un cluster, ScriptXtoCP imposta il flag laterale finale su 0 o su 1.

Per aiutare l'applicazione a stabilire posizioni valide per il caret durante la gestione dei tasti di direzione, Uniscribe fornisce informazioni sulle posizioni di caret valide nel membro fCharStop negli attributi logici restituiti da ScriptBreak. TRUE viene restituito per la maggior parte dei caratteri e FALSE per i caratteri intercluster negli script, ad esempio Thai. L'applicazione deve controllare il valore fNeedsCaretInfo nella struttura SCRIPT_PROPERTIES per verificare se è necessario chiamare ScriptBreak per verificare la presenza di posizioni di caret valide. Se il valore fNeedsCaretInfo è FALSE, tutti i punti di codice sono posizioni di caret valide.

Uso di Uniscribe