Szöveg megjelenítése az Uniscribe használatával
Az alkalmazások az Uniscribe API-függvényekkel támogathatják a tipográfiát, valamint a nemzetközi szövegek megjelenítését és szerkesztését. Az Uniscribe a bekezdést használja szövegmegjelenítési egységként, az Uniscribe funkciót pedig a teljes bekezdéshez kell használni.
Ha az Uniscribe-et használja a szöveg megjelenítéséhez, az alkalmazásnak formázási ("elrendezési") folyamaton kell keresztülmennie, általában az Uniscribe használatával. Az alkalmazás egy szövegbejegyzést azonos stílusú karaktersorozatokra, úgynevezett "szakaszokra" oszt. A stílust az adott megvalósítás határozza meg, de általában olyan attribútumokat tartalmaz, mint a betűtípus, a méret és a szín. A futtatások definiálásakor az alkalmazás más információkat is alkalmazhat, például a lexikális eszközökkel való használatra fenntartott nyelv- és területi adatokat. Egy alkalmazás például külön futtatásként kezelhet egy szakaszt egy elsősorban angol nyelvű szövegben, amely franciául jelenik meg.
Miután meghatározta az összes bekezdés futtatásait, az alkalmazás minden bekezdést olyan sztringekre osztja, amelyek szkriptje és iránya ("elemek") azonos. Az alkalmazás az eleminformációkat olyan futtatások előállítására alkalmazza, amelyek szkriptben és irányban egyediek, és teljes egészében egyetlen elemen ("tartományokon") belül esnek.
Az elemek tartományba való lebontása kissé tetszőleges, bár egy tartománynak egy vagy több egymást követő szkript által definiált, oszthatatlan karaktercsoportból kell állnia, úgynevezett "fürtökből". Az európai nyelvek esetében a fürtök általában egyetlen kódlapjelnek vagy Unicode-kódpontnak felelnek meg, és egyetlen karakterbőlállnak. A thai nyelvhez hasonló nyelvekben azonban a fürtök a karakterjelek csoportosítását jelentik, és több egymást követő karakternek vagy kódpontnak felelnek meg. Például egy thai hangkapcsolat tartalmazhat mássalhangzót, magánhangzót és hangjelet. Annak érdekében, hogy ne törje meg a csomópontokat, az alkalmazásnak általában a leghosszabb tartományokat kell használnia, vagy saját lexikális információit kell használnia arra, hogy olyan helyeken törje meg a tartományokat, amelyek nem esnek egy csomópont középpontjába.
Amikor azonosította a fürtöket az egyes tartományokban, az alkalmazásnak meg kell határoznia az egyes fürtök méretét. Az Uniscribe használatával számítja ki a fürtök összegét, hogy meghatározza az egyes tartományok méretét. Ezután az alkalmazás összegzi a tartományok méretét, amíg túlcsordul egy sor, azaz eléri a margót. A vonalat túlcsorduló tartomány el van osztva az aktuális vonal és a következő sor között. Az alkalmazás térképet készít minden sorhoz, amely a vizuális pozícióról a logikai pozícióra vonatkozik az egyes tartományok esetében. Ezután az alkalmazás az egyes tartományok kódpontjait karakterjelekké alakítja, amelyeket később elhelyezhet és megjeleníthet.
Az alkalmazások csak egyszer végeznek szövegelrendezést. Ezt követően vagy menti a karakterjeleket és a pozíciókat megjelenítési célokra, vagy minden alkalommal létrehozza őket, amikor megjeleníti a szöveget, a kompromisszum pedig a sebesség és a memória. Egy tipikus alkalmazás egyszer implementálja az elrendezési folyamatot, majd a szöveg minden egyes megjelenítésekor létrehozza a karakterjeleket és a pozíciókat.
Az összetett szkripteket használó alkalmazások az alábbi problémákat tapasztalják az elrendezés és megjelenítés egyszerű megközelítésével kapcsolatban.
- Egy összetett szkript karakter szélessége a környezetétől függ. A szélességeket nem lehet egyszerű táblákba menteni.
- Az olyan szkriptekben lévő szavak közötti törés, mint a Thai, szótártámogatást igényel. A thai szavak között például nem használ elválasztó karaktert.
- Az arab, héber, perzsa, urdu és más kétirányú szöveg nyelvekhez a megjelenítés előtt újra kell átrendezni.
- Az összetett szkriptek egyszerű használatához gyakran szükség van valamilyen betűtípus-társításra.
Az a tény, hogy az Uniscribe a bekezdést használja megjelenítési egységként, segít az alkalmazásnak megfelelően kezelni ezeket az összetett szkriptproblémákat.
Jegyzet
A Uniscribe-ot egy teljes bekezdésre kell használni, még akkor is, ha a bekezdés szakaszai nem összetett írásrendszerek.
Az alábbi táblázatban látható módon az Uniscribe 1.6-os vagy újabb verziója számos olyan függvényt támogat, amelyek kihasználják az OpenType-címkék előnyeit. Ezek helyettesíthetők a megfelelő normál Uniscribe függvényekkel. Az alkalmazásoknak általában teljes mértékben az egyik vagy a másik halmazból származó függvényekkel kell működnie, és nem szabad megpróbálni "keverni és egyeztetni" a függvényeket.
Normál Uniscribe függvény | Egyenértékű OpenType függvény |
---|---|
ScriptItemize | ScriptItemizeOpenType |
ScriptShape | ScriptShapeOpenType |
ScriptPlace | ScriptPlaceOpenType |
Szöveg elrendezése az Uniscribe használatával
Az alkalmazás a következő lépésekkel hozhat létre szöveges bekezdést az Uniscribe használatával. Ez az eljárás feltételezi, hogy az alkalmazás már futtatásokra osztotta a bekezdést.
ScriptRecordDigitSubstitution hívását csak akkor végezze el, amikor indításkor vagy amikor WM_SETTINGCHANGE üzenetet kap.
(Nem kötelező) Hívja meg ScriptIsComplex, és állapítsa meg, hogy a bekezdés összetett feldolgozást igényel-e.
(Nem kötelező) Ha az Uniscribe használatával kezeli a kétirányú szöveg- és/vagy számjegy-helyettesítést, hívja meg ScriptApplyDigitSubstitution, hogy előkészítse a SCRIPT_CONTROL és SCRIPT_STATE struktúrákat bemenetként a ScriptItemize. Ha kihagyja ezt a lépést, de továbbra is számjegy-helyettesítést igényel, cserélje le a nemzeti számjegyeket a Unicode U+0030 és U+0039 (európai számjegyek) helyére. További információ a számjegyek helyettesítéséről: Számjegyalakzatok.
A bekezdés elemekre való felosztásához hívja meg ScriptItemize. Ha nem használja az Uniscribe-t a számjegyek helyettesítésére, és a kétirányú írányirányrendszer sorrendje ismert, például a karakter beírásához használt billentyűzetkiosztás miatt, hívja meg ScriptItemize. A hívásban adjon meg nullmutatókat a SCRIPT_CONTROL és SCRIPT_STATE struktúrákhoz. Ez a technika csak a formázó motor használatával hoz létre elemeket, és az elemek átrendezhetők a motor információi alapján.
Jegyzet
Általában azok az alkalmazások, amelyek csak balról jobbra író szkriptekkel működnek, és nem végeznek számjegy-helyettesítést, null mutatót kell adniuk a SCRIPT_CONTROL és SCRIPT_STATE struktúráknak.
Egyesítse az eleminformációkat a futtatási információkkal a tartományok létrehozásához.
Hívja meg ScriptShape a fürtök azonosítására és a karakterek létrehozására.
Ha a ScriptShape kódot USP_E_SCRIPT_NOT_IN_FONT vagy S_OK ad vissza, és a kimenet hiányzó karakterjeleket tartalmaz, válasszon karaktereket egy másik betűtípusból. Helyettesítsen másik betűtípust, vagy tiltsa le a formázást úgy, hogy a eScript tagot SCRIPT_UNDEFINED értékre állítja a SCRIPT_ANALYSIS struktúrában, amit a ScriptShape számára ad meg. További információ: Font Fallbackhasználata.
Hívja meg ScriptPlace, hogy előretolt szélességeket és x, y pozíciókat hozzon létre az egyes egymást követő tartományokban lévő karakterjelekhez. Ez az első lépés, amelynél a szövegméretet figyelembe kell venni.
Add össze a tartományméreteket, amíg a sor túlcsordul.
Törje meg a tartományt egy szóhatáron az fSoftBreak és a fWhiteSpace logikai attribútumok segítségével. Ha egyetlen karakterfürtöt szeretne megszakítani a futtatás során, használja a ScriptBreakmeghívásával visszaadott információkat.
Jegyzet
Döntse el, hogy a tartomány első kódpontja szótörési pont legyen-e, mert az előző tartomány utolsó karakteréhez szükség van rá. Ha például az egyik tartomány vesszővel végződik, a következő tartomány első karakterét tekintsük szótörési pontnak.
Ismételje meg a 6–10. lépést a bekezdés minden sorához. Ha azonban az utolsó szakasz megszakad a sorban, hívja meg a ScriptShape-t, hogy a megmaradt részt az első szakaszként formázza át a következő sorban.
Szöveg megjelenítése az Uniscribe használatával
Az alkalmazás a következő lépésekkel jeleníthet meg egy szöveges bekezdést. Ez az eljárás feltételezi, hogy az alkalmazás már lefektette a szöveget, és nem mentette a karakterjeleket és a pozíciókat az elrendezési folyamatból. Ha a sebesség aggodalomra ad okot, az alkalmazás mentheti a karakterjeleket és a pozíciókat az elrendezési eljárásból, és a megjelenítési eljárás 2. lépésétől indulhat.
Jegyzet
Az alkalmazás kihagyhatja a 2. lépést, ha a szöveg nem tartalmaz karaktereket a jobbról balra író szkriptekből, nem tartalmaz kétirányú vezérlőelem-karaktereket, és balról jobbra alapszintű beágyazási szintet használ.
Minden futtatás esetén kövesse az alábbiakat:
- Ha a stílus az utolsó futtatás óta megváltozott, frissítse a leírót az eszközkörnyezetre a kiadással és az újbóli lekéréssel.
- A ScriptShape hívása a futtatáshoz szükséges karakterjelek generálásához.
- Hívja meg ScriptPlace, hogy az egyes karakterjelekhez előrészélességet és x,y tengelyek menti eltolást hozzon létre.
A sorban lévő műveletek helyes vizuális sorrendjének beállításához tegye a következőket:
- Kétirányú beágyazási szintek tömbjének kinyerése, tartományonként egy. A beágyazási szintet a (SCRIPT_ITEM) si adja meg. (SCRIPT_ANALYSIS) a. (SCRIPT_STATE) s.uBidiLevel.
- Adja át ezt a tömböt a ScriptLayout-nak, hogy létrehozzon egy térképet a vizuális pozícióktól a logikai pozíciókig.
(Nem kötelező) A szöveg indoklásához hívja meg ScriptJustify, vagy használja a szöveg speciális ismeretét.
A vizuális–logikai térképet használva sorozatokat jeleníthet meg vizuális sorrendben. A sor bal oldalától kezdve hívja meg a ScriptTextOut függvényt a térkép első bejegyzése által meghatározott lefutás megjelenítéséhez. A térkép minden további bejegyzéséhez hívja meg ScriptTextOut a jelzett futtatás megjelenítéséhez a korábban megjelenített futtatástól jobbra.
Ha kihagyja a 2. lépést, kezdje a sor bal végén, és hívja meg ScriptTextOut az első logikai futtatás megjelenítéséhez, majd az egyes logikai futtatásokat az előző futtatástól jobbra.
Ismételje meg a fenti lépéseket a bekezdés összes sorához.
Kapcsolódó témakörök
-
Uniscribe használata