A koordinátarendszer fogalmát azt hiszem mindenki ismeri: ez teszi lehetővé pontok (és így közvetve pontokból álló alakzatok) helyzetének meghatározását egy adott síkon v. térben. Mint arról már korábban szó volt, a Windows GDI több, egymástól független koordinátarendszerrel is dolgozik, amelyek a következők
 

  • világkoordináta-rendszer (world coordinate space) - ez képezi a grafikus műveletek kiinduló koordinátarendszerét. Eltolási, skálázási (nyújtási), elforgatási, döntési és tükrözési transzformációk kapcsolhatók hozzá, amely minden rajzolási művelet kimenetelét befolyásolják. Kiterjedése mindkét tengelye mentén 2^32 egységre korlátozódik.

  •  
  • oldal koordináta-rendszer (page coordinate space) - a kimenet-generálásban a második koordinátarendszer, melynek jellemzőit az ún. leképezési mód (mapping mode) beállításával, néhány előre meghatározott séma közül lehet kiválasztani. E sémák alapvetően az egyes tengelyek orientációjában (hogy ti. azok mentén mely irányokban nőnek ill. csökkennek a koordináták), valamint a leképezés során alkalmazott logikai-fizikai egység konverzióban (a tengelyek mentén alkalmazott nyújtás mértékében) térnek el egymástól. Kiterjedése mindkét tengelye mentén 2^32 egységre korlátozódik.

  •  
  • eszköz koordináta-rendszer (device coordinate space) - a megjelenítésben az oldal koordináta-rendszert követi. Csakis eltolás definiálható rajta, ami az eszköz-koordináták megfelelő fizikai-koordintákká alakítását teszi lehetővé. Kiterjedése mindkét tengelye mentén 2^27 egységre korlátozódik.

  •  
  • fizikai koordináta-rendszer (physical coordinate space) - a kimenet során alkalmazott transzformációk sorozatának végállomása, azaz a végső cél-koordinátarendszer, ami általában valamilyen megjelenítő eszköz teljes felületét (pl. a monitor képcsövét, vagy a nyomtatóba helyezett lapot) vagy annak egy dedikált részét (pl. egy ablak kliens területét a monitoron) takarja. Kiterjedéseit a mindenkori kimeneti eszköz fizikai jellemzői befolyásolják.

  •  
A megjelenítés folyamata során az egyes rajzolóműveletek paramétereiben meghatározott világkoordinátákból kiindulva a GDI folyamatosan az előzőből a következő koordináta-rendszerbe másolja (vagy torzítja) az adott rajzolóművelet eredményét a mindenkor aktuális leképezési szabályoknak megfelelően egészen addig, amíg elér az eszköz-koordinátarendszerhez. Az így kapott koordinátákat aztán az eszközmeghajtónak átadva, az gondoskodik a kívánt kimenet megjelenítéséről a kimeneti eszközön. A leképezés folyamatát az alábbi ábra szemlélteti:


 
 

Világtér - oldaltér transzformációk
Mint azt az előbb említettem egy eszközkörnyezet világtéréhez gyakorlatilag bármilyen transzformáció hozzárendelhető: eltolás, skálázás, forgatás, döntés és tükrözés - sőt ezek bármilyen tetszőleges kombinációja kialakítható, amivel gyakorlatilag az összes elképzelhető leképezési módszer kialakítására lehetőséget nyújt. A leképezés során alkalmazandó transzformációkat az ún. transzformációs mátrix írja le. A világtérből az oldaltérbe leképezés során az alábbi függvénypáros alapján kerülnek a cél (x',y') koordináták kiszámításra a kiindulási (x,y) koordinátapárosból:

x' = x * eM11 + y * eM21 + eDx,
y' = x * eM12 + y * eM22 + eDy,

ahol a transzformáció mátrix a következőképpen néz ki:

A transzformációs mátrix elemeit az XFORM struktúra tartalmazza, melynek mezői és jelentéseik a következők:
 

Mező neve Jelentés
eM11 skálázás
vízszintes skálázási komponens
forgatás
a forgatási szög koszinusza
tükrözés
vízszintes tükrözési együttható
eM12 döntés
vízszintes arányossági konstans
forgatás
a forgatási szög szinusza
eM21 döntés
függőleges arányossági konstans
forgatás
a forgatási szög szinuszának negatívja
eM22 skálázás
függőleges skálázási komponens
forgatás
a forgatási szög koszinusza
tükrözés
függőleges tükrözési együttható 
eDx az eltolás vízszintes komponense (logikai egységekben)
eDy az eltolás függőleges komponense (logikai egységekben)

Az alábbi kereszttáblázat azt mutatja meg, hogy az egyes műveletek során milyen információkat tárolnak a mezők:
 

Művelet eM11 eM12 eM21 eM22
forgatás a szög koszinusza a szög szinusza negatív szinusz koszinusz
skálázás vízszintes komponens nem használt nem használt függőleges komponens
döntés nem használt vízszintes arányossági konstans függőleges arányossági konstans nem használt
tükrözés vízszintes együttható nem használt nem használt függőleges együttható

A világtér- oldaltér transzformáció definiálására sajnos csak az NT alapú (Windows NT/Windows 2000) win32 platformok nyújtanak lehetőséget - Windows 9X rendszereken a leképezés kiindulási alapját az oldaltér képezi (vagy ha úgy tetszik a világtér- oldaltér transzformáció fixálva van egy egyszerű másolásra). A transzformációk csakis az ún. advanced GDI módban élnek, amit a SetGraphicsMode() API függvény GM_ADVANCED paraméterrel történő meghívásával lehet aktiválni. Ezek után az felépített XFORM transzformációs mátrixot a SetWorldTransform() függvény segítségével lehet az adott eszközkörnyezethez rendelni.
Összetett, több elemi torzítási műveletet egymás után fűző leképezési mátrix a CombineTransform() függvény segítségével állítható elő, amely a bemeneti paraméterként kapott két leképezési mátrix egymás utáni alkalmazásával ekvivalens mátrixot a kimeneti pufferbe rakja.

Oldaltér - eszköztér transzformációk
E leképezés elsődleges feladata a rajzolási műveletekben alkalmazott egységek közti méretarány, azaz a skálázási transzformáció definiálása, ami tetszőleges eltolással is kombinálható. Néhány esetben a leképezési mód a tengelyek orientációját is megváltoztatja. A Windows GDI a következő alapvető leképezési módok használatát támogatja az oldaltér-eszköztér transzformáció során:
 
Leképezési mód Jelentés
MM_ANISOTROPIC Minden egyes oldal-egység az alkalmazás által meghatározott számú egységre kerül leképezésre az eszköz-koordinátarendszerben. A skálázás mértéke tengelyenként függetlenül határozható meg, illetve a tengelyek orientációját is maga az alkalmazás határozza meg.
MM_HIENGLISH Minden egyes oldal-egység 0.001 inch-re kerül leképezésre az eszköz-koordinátarendszerben. Az X tengely mentén balról jobbra, míg az Y tengely mentén alulról felfelé nőnek a koordináták.
MM_HIMETRIC Minden egyes oldal-egység 0.01 milliméterre kerül leképezésre az eszköz-koordinátarendszerben. Az X tengely mentén balról jobbra, míg az Y tengely mentén alulról felfelé nőnek a koordináták.
MM_ISOTROPIC Megegyezik az MM_ANISOTROPIC leképezéssel azzal a különbséggel, hogy a két tengely mentén a nyújtás azonos mértékű.
MM_LOENGLISH Megegyezik az MM_ HIENGLISH leképezéssel azzal a különbséggel, hogy a 0.01 inch a leképezési alapegység.
MM_LOMETRIC Megegyezik az MM_ HIMETRIC leképezéssel azzal a különbséggel, hogy a 0.1 mm a leképezési alapegység.
MM_TEXT Minden egyes oldal-egység pontosan egy pixelre kerül leképezésre az eszköz-koordinátarendszerben, tehát semmilyen skálázás nem történik. Amennyiben eltolás sem kerül definiálásra, úgy ebben a módban gyakorlatilag az oldaltér ekvivalens az eszköztérrel. Az X tengely mentén balról jobbra, míg az Y tengely mentén felülről lefelé nőnek a koordináták.
MM_TWIPS Minden egyes oldal-egység 1/20 nyomdai pontra (azaz 1/1440 inch-re) kerül leképezésre az eszköz-koordinátarendszerben. Az X tengely mentén balról jobbra, míg az Y tengely mentén alulról felfelé nőnek a koordináták.

Egy adott eszközkörnyezetben éppen aktuális leképezési módot az alkalmazás a GetMapMode() függvény segítségével kérdezheti le, míg megváltoztatására a SetMapMode() függvényt kell meghívnia.

A oldaltér-eszköztér leképezés során alkalmazandó skálázást és eltolást a GDI az alkalmazás által definiált ún. ablak (window) és látótér (viewport) alapján határozza meg. Az ablak ebben a környezetben az oldaltér egy, az alkalmazás által meghatározott kezdőpontú és kiterjedésű téglalap alakú darabja, míg a látótér egy hasonló jellegű, szintén az alkalmazás által, de az eszköztérből kijelölt darab. Az ablak kezdőpontja és kiterjedése értelemszerűen logikai koordinátákkal és egységekben, míg a látótér ugyanezen jellemzői eszköz-koordinátákkal és -egységekben kerülnek meghatározásra. A leképezés során a GDI az ablak és a látótér koordinátarendszerét azonos kezdőpontba tolja, majd az ablakot úgy skálázza, hogy az pontosan fedje a látóteret. Az e művelet elvégzéséhez szükséges transzformáció fogja a oldaltér-eszköztér leképezés alapját szolgáltatni.
Amíg az ablak ill. a látótér kezdőpontjait az alkalmazás bármely leképezési mód esetén szabadon állíthatja a SetWindowOrgEx() ill. SetViewportOrgEx() függvények segítségével, addig a kiterjedést meghatározására a SetWindowExtEx() ill. SetViewportExtEx() függvények használatnak lehetősége a mindenkori leképezési módtól függ. A 6 fix skálázást alkalmazó leképezési mód (MM_HIENGLISH, MM_HIMETRIC, MM_LOENGLISH, MM_LOMETRIC, MM_TEXT ill. MM_TWIPS) esetén ugyanis a leképezési mód már önmagában meghatározza az alkalmazandó skálázási faktort, így annak állítására az alkalmazásnak nincs lehetősége. Ezzel szemben a másik két leképezési mód (MM_ANISOTROPIC és MM_ISOTROPIC) esetén az aránypárokat az alkalmazás maga határozhatja meg a már említett függvénypáros segítségével.

Az ablak ill. a látótér kezdőpontjait meghatározó koordináták mindig abszolút (az oldal- ill. az eszköztér kezdőpontjához képest relatív) értendők, kiterjedésük pedig az alkalmazott leképezési módtól függetlenül mindig közvetlenül logikai- ill. eszköz-egységekben adandó meg.

A fentiek alapján a leképezés során a következő módon kerülnek a célkoordináták a forráskoordintáták alapján megállapításra:

Dx = ((Lx - WOx) * VEx / WEx) + Vox
Dy = ((Ly - WOy) * VEy / WEy) + Voy

ahol az egyes változók a következőket jelentik:
 

Dx, Dy - a cél-koordináták eszköz-egységekben
Lx, Ly - a forrás-koordintáták logikai (oldal-) egységekben
WOx, Woy - az ablak kezdőpontja
VOx, Voy - a látótér kezdőpontja
WEx, WEy - az ablak kiterjedése (logikai egységekben)
VEx, Vey - a látótér kiterjedése (eszköz-egységekben)

Az alkalmazás az LPtoDP() ill. DPtoLP() függvényeket használhatja egyes koordináták az eszköztérből az oldaltérbe ill. az oldaltérből az eszköztérbe konvertálásához. A konvertálás során a GDI a mindenkor aktuális leképezési mód, ablak és látótér figyelembevételével számítja ki a célkoordinátákat.

Eszköztér -fizikai eszköz transzformáció
E transzformáció teljes mértékben a Windows GDI felügyelete alatt áll, amelyet az alkalmazás semmilyen mértékében nem befolyásolhat, vagy kérdezheti le annak paramétereit. Az alkalmazott transzformáció alapját az adott eszközhöz tartozó eszközmeghajtó program ill. a fizikai megjelenítő eszköz jellemzői határozzák meg.

(folytatjuk)