Menampilkan Teks dengan Uniscribe

Aplikasi Anda dapat menggunakan fungsi Uniscribe API untuk mendukung tipografi dan tampilan dan pengeditan teks internasional. Uniscribe menggunakan paragraf sebagai unit untuk tampilan teks, dan fungsionalitas Uniscribe harus digunakan untuk seluruh paragraf.

Saat menggunakan Uniscribe untuk tampilan teks, aplikasi harus melalui proses pemformatan ("tata letak"), biasanya menggunakan Uniscribe. Aplikasi membagi paragraf teks menjadi string karakter dengan gaya yang sama, yang disebut "runs". Gaya ditentukan oleh implementasi tertentu, tetapi biasanya mencakup atribut seperti font, ukuran, dan warna. Dalam menentukan eksekusi, aplikasi juga dapat menerapkan informasi lain, seperti bahasa dan data lokal yang dikelola untuk digunakan dengan alat leksikal. Misalnya, aplikasi mungkin memperlakukan sebagai bagian eksekusi terpisah dalam teks bahasa Inggris utamanya yang dirender dalam bahasa Prancis.

Setelah menentukan eksekusi untuk semua paragraf, aplikasi membagi setiap paragraf menjadi string yang memiliki skrip dan arah yang sama ("item"). Aplikasi menerapkan informasi item untuk menghasilkan eksekusi yang unik dalam skrip dan arah dan sepenuhnya berada dalam satu item ("rentang").

Perincian item ke dalam rentang agak sewenang-wenang, meskipun rentang harus terdiri dari satu atau beberapa pengelompokan karakter yang ditentukan skrip berturut-turut, yang disebut "kluster." Untuk bahasa Eropa, kluster biasanya sesuai dengan karakter halaman kode tunggal atau titik kode Unicode, dan terdiri dari satu glyph. Namun, dalam bahasa seperti Thailand, kluster adalah pengelompokan glyph dan sesuai dengan beberapa karakter berturut-turut atau titik kode. Misalnya, kluster Thailand mungkin berisi konsonan, vokal, dan tanda nada. Agar tidak merusak kluster, aplikasi biasanya harus menggunakan rentang terpanjang yang dapat atau menggunakan informasi leksikalnya sendiri untuk memecah antara rentang di tempat-tempat yang tidak berada di tengah kluster.

Ketika telah mengidentifikasi kluster di setiap rentang, aplikasi harus menentukan ukuran setiap kluster. Ini menggunakan Uniscribe untuk menjumlahkan kluster untuk menentukan ukuran setiap rentang. Kemudian aplikasi menjumlahkan ukuran rentang hingga meluapkan garis, yaitu, mencapai margin. Rentang yang meluap garis dibagi antara baris saat ini dan baris berikutnya. Untuk setiap baris, aplikasi membangun peta dari posisi visual ke posisi logis untuk setiap rentang. Kemudian aplikasi membentuk titik kode untuk setiap rentang menjadi glyph, yang kemudian dapat memposisikan dan merender.

Aplikasi melakukan tata letak teks hanya satu kali. Setelah itu, ia menyimpan glyph dan posisi untuk tujuan tampilan atau menghasilkannya setiap kali menampilkan teks, dengan tradeoff menjadi kecepatan versus memori. Aplikasi umum mengimplementasikan proses tata letak sekali, lalu menghasilkan glyph dan posisi setiap kali menampilkan teks.

Aplikasi yang menggunakan skrip kompleks memiliki masalah berikut dengan pendekatan sederhana untuk tata letak dan tampilan.

  • Lebar karakter skrip yang kompleks tergantung pada konteksnya. Tidak dimungkinkan untuk menyimpan lebar dalam tabel sederhana.
  • Melanggar antara kata-kata dalam skrip seperti Thailand memerlukan dukungan kamus. Misalnya, tidak ada karakter pemisah yang digunakan di antara kata-kata Thailand.
  • Bahasa Arab, Ibrani, Persia, Urdu, dan bahasa teks dua arah lainnya memerlukan penyusunan ulang sebelum ditampilkan.
  • Beberapa bentuk asosiasi font sering diperlukan untuk dengan mudah menggunakan skrip kompleks.

Fakta bahwa Uniscribe menggunakan paragraf sebagai unit tampilan membantu aplikasi menangani masalah skrip yang kompleks ini secara memadai.

Catatan

Uniscribe harus digunakan untuk seluruh paragraf, meskipun bagian paragraf bukan skrip yang kompleks.

 

Seperti yang ditunjukkan dalam tabel berikut, Uniscribe versi 1.6 atau yang lebih tinggi mendukung beberapa fungsi yang memanfaatkan tag OpenType. Mereka dapat digantikan untuk fungsi Uniscribe reguler yang sesuai. Umumnya aplikasi Anda harus bekerja sepenuhnya dengan fungsi dari satu set atau yang lain dan tidak boleh mencoba untuk "mencampur dan mencocokkan" fungsi.

Fungsi Reguler Uniscribe Fungsi OpenType yang setara
ScriptItemize ScriptItemizeOpenType
ScriptShape ScriptShapeOpenType
Tempat Skrip ScriptPlaceOpenType

 

Lay Out Text Menggunakan Uniscribe

Aplikasi Anda dapat menggunakan langkah-langkah berikut untuk menata paragraf teks dengan Uniscribe. Prosedur ini mengasumsikan bahwa aplikasi telah membagi paragraf menjadi berjalan.

  1. Panggil ScriptRecordDigitSubstitution hanya saat memulai atau saat menerima pesan WM_SETTINGCHANGE.

  2. (Opsional) Panggil ScriptIsComplex untuk menentukan apakah paragraf memerlukan pemrosesan yang kompleks.

  3. (Opsional) Jika menggunakan Uniscribe untuk menangani penggantian teks dan/atau digit dua arah, panggil ScriptApplyDigitSubstitution untuk menyiapkan struktur SCRIPT_CONTROL dan SCRIPT_STATE sebagai input ke ScriptItemize. Jika melewati langkah ini, tetapi masih memerlukan penggantian digit, ganti digit nasional untuk Unicode U+0030 hingga U+0039 (digit Eropa). Untuk informasi tentang penggantian digit, lihat Bentuk Digit.

  4. Panggil ScriptItemize untuk membagi paragraf menjadi item. Jika tidak menggunakan Uniscribe untuk substitusi digit dan urutan dua arah diketahui, misalnya, karena tata letak keyboard yang digunakan untuk memasukkan karakter, panggil ScriptItemize. Dalam panggilan, berikan pointer null untuk struktur SCRIPT_CONTROL dan SCRIPT_STATE. Teknik ini menghasilkan item dengan menggunakan mesin pembentukan saja, dan item dapat diurutkan ulang menggunakan informasi mesin.

    Catatan

    Biasanya, aplikasi yang hanya berfungsi dengan skrip kiri ke kanan dan tanpa penggantian digit apa pun harus melewati pointer null untuk struktur SCRIPT_CONTROL dan SCRIPT_STATE.

     

  5. Gabungkan informasi item dengan informasi eksekusi untuk menghasilkan rentang.

  6. Panggil ScriptShape untuk mengidentifikasi kluster dan menghasilkan glyph.

  7. Jika ScriptShape mengembalikan kode USP_E_SCRIPT_NOT_IN_FONT atau S_OK dengan output yang berisi glyph yang hilang, pilih karakter dari font yang berbeda. Ganti font lain atau nonaktifkan pembentukan dengan mengatur anggota eScript struktur SCRIPT_ANALYSIS diteruskan ke ScriptShape ke SCRIPT_UNDEFINED. Untuk informasi selengkapnya, lihat Menggunakan Font Fallback.

  8. Panggil ScriptPlace untuk menghasilkan lebar muka dan posisi x dan y untuk glyph di setiap rentang berturut-turut. Ini adalah langkah pertama yang ukuran teksnya menjadi pertimbangan.

  9. Jumlah ukuran rentang hingga garis meluap.

  10. Putuskan rentang pada batas kata dengan menggunakan anggota fSoftBreak dan fWhiteSpace di atribut logis. Untuk memutuskan kluster karakter tunggal dari eksekusi, gunakan informasi yang dikembalikan dengan memanggil ScriptBreak.

    Catatan

    Tentukan apakah titik kode pertama rentang harus menjadi titik henti kata karena karakter terakhir dari rentang sebelumnya memerlukannya. Misalnya, jika satu rentang berakhir dengan koma, pertimbangkan karakter pertama dari rentang berikutnya untuk menjadi titik henti kata.

     

  11. Ulangi langkah 6 hingga 10 untuk setiap baris dalam paragraf. Namun, jika memutuskan eksekusi terakhir pada baris, panggil ScriptShape untuk membentuk kembali bagian yang tersisa dari eksekusi sebagai eksekusi pertama pada baris berikutnya.

Tampilkan Teks Menggunakan Uniscribe

Aplikasi Anda dapat menggunakan langkah-langkah berikut untuk menampilkan paragraf teks. Prosedur ini mengasumsikan bahwa aplikasi telah meletakkan teks dan belum menyimpan glyph dan posisi dari proses tata letak. Jika kecepatan menjadi perhatian, aplikasi dapat menyimpan glyph dan posisi dari prosedur tata letak dan mulai pada langkah 2 dalam prosedur tampilan.

Catatan

Aplikasi dapat menghilangkan langkah 2 jika teks tidak berisi karakter dari skrip kanan-ke-kiri, tidak berisi karakter kontrol dua arah, dan menggunakan tingkat penyematan dasar kiri-ke-kanan.

 

  1. Untuk setiap eksekusi, lakukan hal berikut:

    1. Jika gaya telah berubah sejak eksekusi terakhir, perbarui handel ke konteks perangkat dengan merilis dan mendapatkannya lagi.
    2. Panggil ScriptShape untuk menghasilkan glyph untuk eksekusi.
    3. Panggil ScriptPlace untuk menghasilkan lebar muka dan offset x,y untuk setiap glyph.
  2. Lakukan hal berikut untuk membuat urutan visual yang benar untuk eksekusi di baris:

    1. Ekstrak array tingkat penyematan dua arah, satu per rentang. Tingkat penyematan diberikan oleh (SCRIPT_ITEM) si. (SCRIPT_ANALYSIS) a. (SCRIPT_STATE) s.uBidiLevel.
    2. Teruskan array ini ke ScriptLayout untuk menghasilkan peta posisi visual ke posisi logis.
  3. (Opsional) Untuk membenarkan teks, panggil ScriptJustify atau gunakan pengetahuan khusus tentang teks.

  4. Gunakan peta visual-ke-logis untuk menampilkan eksekusi dalam urutan visual. Mulai dari ujung kiri baris, panggil ScriptTextOut untuk menampilkan eksekusi yang diberikan oleh entri pertama di peta. Untuk setiap entri berikutnya di peta, panggil ScriptTextOut untuk menampilkan eksekusi yang ditunjukkan di sebelah kanan eksekusi yang ditampilkan sebelumnya.

    Jika menghilangkan langkah 2, mulai di ujung kiri baris dan panggil ScriptTextOut untuk menampilkan eksekusi logis pertama, lalu untuk menampilkan setiap eksekusi logis di sebelah kanan eksekusi sebelumnya.

  5. Ulangi langkah-langkah di atas untuk semua baris dalam paragraf.

Menggunakan Uniscribe