Mengelola Penempatan Caret dan Pengujian Hit

Bahasa skrip kompleks dipecah menjadi kluster berdasarkan ScriptShape. Penyusunan ulang karakter selalu terjadi dalam batas kluster. Kluster itu sendiri dijamin maju ke arah urutan bacaan.

Informasi kluster dalam array kluster logis digunakan untuk berbagi lebar kluster glyph secara merata di antara karakter logis yang diwakilinya. Misalnya, lam alef glyph dibagi menjadi empat area:

  • Separuh terdepan dari lam.
  • Setengah bagian belakang lam.
  • Bagian terdepan dari alef.
  • Separuh jalan di belakang alef.

Konvensi untuk penempatan caret dalam kluster bergantung pada skrip. Untuk skrip Arab, jika posisi tanda sisipan diatur antara karakter dasar dan tanda penggampingannya, tanda sisipan ditampilkan setengah jalan melalui karakter dasar. Untuk skrip Thailand, tanda sisipan tidak dapat diposisikan dalam kluster. Dengan demikian, ketika pengguna memajukan tanda sisipan, aplikasi harus melewati semua glyph yang membentuk kluster.

Fungsi ScriptXtoCP dan ScriptCPtoX menerjemahkan antara posisi caret (dalam offset titik kode) dan posisi x (dalam piksel). Fungsi ScriptXtoCP memiliki pengetahuan tentang konvensi posisi caret dari setiap skrip:

  • Untuk India dan Thailand, posisi caret di-snap ke batas kluster.
  • Untuk bahasa Arab, posisi caret diinterpolasi dengan kluster.
  • Untuk bahasa Ibrani, dalam versi sebelum Usp10.dll, versi 1.420, posisi caret diinterpolasi dengan kluster. Dimulai dengan Usp10.dll, versi 1.420, posisi caret diposisikan ke batas kluster.

Baik ScriptXtoCP maupun ScriptCPtoX hanya beroperasi dalam eksekusi. Fungsi ini mengharuskan parameter tertentu berasal dari panggilan Uniscribe sebelumnya, seperti yang ditunjukkan dalam tabel berikut.

Parameter Sumber
Psa Seperti yang dikembalikan oleh ScriptItemize.
cGlyphspwLogClust
psva
Seperti yang dikembalikan oleh ScriptShape.
piAdvance Seperti yang dikembalikan oleh ScriptPlace.

 

Aplikasi harus menetapkan eksekusi di mana offset caret atau posisi x tertentu sebelum meneruskan informasi ke ScriptCPtoX atau ScriptXtoCP. Jika aplikasi tidak menyimpan informasi lebar, aplikasi dapat menekan pengujian dan penempatan caret setelah menampilkan setiap eksekusi. Sebagai alternatif, aplikasi dapat menyimpan informasi yang cukup untuk melakukan pengujian dan penempatan caret pada baris saat ini tanpa memerlukan pemrosesan ulang paragraf.

ScriptXtoCP mengembalikan nilai tepi berikutnya sehingga aplikasi mengetahui sisi karakter atau kluster tempat pengguna telah mengklik. Nilainya adalah 0 atau lebar karakter atau kluster dalam titik kode. Posisi karakter yang dikembalikan adalah posisi karakter tempat pengguna mengklik. Untuk informasi selengkapnya, lihat Menampilkan Tanda Sisipan dalam String Dua Arah.

Untuk bahasa seperti Thai, di mana pengguna secara konvensional tidak ingin menempatkan tanda sisipan ke dalam kluster, ScriptXtoCP mengatur bendera samping berikutnya ke 0 atau ke lebar kluster. Untuk bahasa seperti Arab, yang diharapkan pengguna dapat mengedit dalam kluster, ScriptXtoCP mengatur bendera samping berikutnya ke 0 atau ke 1.

Untuk membantu aplikasi menetapkan lokasi yang valid untuk tanda sisipan saat menangani tombol panah, Uniscribe memberikan informasi tentang posisi tanda sisipan yang valid di anggota fCharStop dalam atribut logis yang dikembalikan oleh ScriptBreak. TRUE dikembalikan untuk sebagian besar karakter dan FALSE untuk karakter interkluster dalam skrip seperti Thai. Aplikasi harus memeriksa nilai fNeedsCaretInfo dalam struktur SCRIPT_PROPERTIES untuk item guna melihat apakah perlu memanggil ScriptBreak untuk memeriksa posisi caret yang valid. Jika nilai fNeedsCaretInfoadalah FALSE, semua titik kode adalah posisi tanda sisipan yang valid.

Menggunakan Uniscribe