A Windows alrendszerei I.
A Win32 API magasszintű eszközkezelő funkciókészletet nem egyetlen hatalmas program, hanem több, egymástól részben vagy teljesen független ún. alrendszer implementálja. A legfontosabb alrendszerek a következők: a grafikus csatoló, azaz a GDI, a felhasználói interfészért felelős ablakozási rendszer, a USER modul, az eszközök közvetlen kezelésért felelős I/O alrendszer, a hálózati alrendszer, valamint a mozgóképekért, a hangkeltésért és -feldolgozásért, valamint ezek szinkronizációjáért felelős multimédia alrendszer.
 

A GDI 1.

A Windows platform grafikus alrendszerének magját a GDI (Graphics Device Interface), azaz a grafikus eszközcsatoló adja. A GDI valójában nem más, mint egy absztrakt, az alkalmazások és a megjelenítő eszközök (képernyő, nyomtató, stb.) meghajtóprogramjai közötti kapcsolatot biztosító illesztőfelület. Feladata az alkalmazások által az eszközfüggetlen rutinkészlet felhasználásával kezdeményezett rajzolási műveletek eszközfüggő hívásokká történő átalakítása, azaz, a grafikus kimenet generálása a mindenkori megjelenítő / leképező eszközön. Bár ez első hallásra nagyon egyszerű feladatnak tűnik, de valójában nem az. A GDI az egyik - ha nem "a" - legkomplexebb win32 alrendszer.

Az interfész funkciók széles skáláját bocsátja az alkalmazások rendelkezésére, amelyek segítségével azok különböző grafikus elemeket: egyeneseket, görbéket, sokszögeket, zárt alakzatokat, szöveget és bittérképeket jeleníthetnek meg. A megjelenítés során az alkalmazások különféle torzításokat: eltolást, skálázást, forgatást, komplex leképezéseket használhatnak, illetve kitöltést és mintázást alkalmazhatnak a képezett alakzatokon. A rajzolást tetszőleges területre korlátozhatják (vágás) és meghatározhatják azt is, hogy a rajzolófunkciók milyen módon módosítsák a már meglévő képet.

Lássuk, hogyan is épül fel a GDI és miként használhatjuk funkcióit!

Az eszközkörnyezetek
Az alkalmazások a megjelenítő eszközökre nem közvetlenül, hanem ún. eszközkörnyezeteken (device context, DC) keresztül rajzolnak. Mielőtt egy alkalmazás rajzolni szeretne egy adott eszközre, egy eszközkörnyezetet kell létrehoznia, amin majd a későbbiekben a rajzolási műveleteket elvégzi. Az eszközkörnyezet valójában egy, a GDI által kezelt belső struktúra, ami különböző információkat tárol az eszköz és a rajzolás mindenkor aktuális állapotáról. Az eszközkörnyezet ezek mellett felhasználható az eszköz fizikai és logikai jellemzőinek (pl. felbontás, színmélység, stb.) megállapításához és az eszközzel történő direkt kommunikációhoz is.

Eszközkörnyezetek valós, fizikai (pl. képernyő, nyomtató) és logikai megjelenítő eszközökhöz egyaránt létrehozhatók. A logikai megjelenítő eszközök valójában memóriában tárolt bittérképek vagy metafájlok (lásd később), amelyeket az alkalmazások általában csak átmeneti tárolóként hoznak létre, és ahonnan a feldolgozás végeztével elkészült eredményt (képernyő) egy valódi fizikai eszközre vagy esetleg fájlba másolják.

Az eszközkörnyezet információt tárol többek között a rajzolási műveletek kivitelezése (realization) során alkalmazandó leképezésről: az eszköz- és a rajzolási koordinátarendszerek jellemzőiről, a leképezési mátrixról, a vágási sokszögről, a éppen aktuális keverési módról (mixing mode), szöveg- és háttérszínről, és az éppen kiválasztott rajz-objektumokról.

Színkezelés, színábrázolás
A színek kezelésének (color managment) kérdése minden modern grafikus megjelenítési interfész középpontjában áll. Különböző színek alkalmazásával az alkalmazások plusz információt közölhetnek a felhasználóval adott megjelenítési felületen: kapcsolatokat, különbségeket és eltéréseket ábrázolhatnak, és egyáltalán javíthatják a megjelenített kép minőségét. A Windows GDI lehetővé teszi az alkalmazások számára a megjelenítő eszközök színezési képességeinek felderítését, de ugyanakkor azok egyszerű és a mindenkori céleszköz karakterisztikáitól független, egységes módon történő felhasználását is.

A megjelenítő eszközök színezési képességei az egyszínűtől (monokróm) a sokmillió színűig terjedhetnek. Mivel adott esetben az alkalmazásoknak ezek mindegyikén képesnek kell lenniük megfelelő kimenet generálására, így az operációs rendszernek eszközfüggetlen színmenedzsmentet kell biztosítania számukra, és gondoskodnia kell arról, hogy az eszközfüggetlen kép a céleszközre annak színezési képességeinek figyelembe vételével kerüljön leképezésre.

A színeket egyértelmű azonosíthatóság végett ún. színtérben (color space) szokás ábrázolni. A színtér tengelyeinek (dimenzióinak) számát egy adott színt meghatározó egymástól független komponensek száma határozza meg. A színtereket általában ezek a színösszetevő komponensek alapján szokás elnevezni. A Windows színmenedzsment alapját az ún. RGB (Red-Green-Blue - vörös-zöld-kék) színmodell képezi, bár igen fejlett színkonverziós modulja, az ICM (Image Color Managment) révén lehetőséget biztosít az alkalmazások számára ettől eltérő színterek alkalmazására is. Az RGB modellben mindegy egyes színt a három alapszín (vörös, zöld és kék) különböző arányú és intenzitású keveréke teszi ki, így a színeket ezzel a három komponensnek megfelelő számokkal szokás jelölni. Minden egyes komponens 8 biten kerül ábrázolásra, így a teljes intenzitással jelen lévő alapszínt a 255, míg az adott alapszín teljes hiányát a 0 érték jelöli - a két szám közé eső egyébértékek az adott alapszín, a számmal egyenes arányú részleges jelenlétét jelentik. Ennek megfelelően a fehér színt a (255,255,255) RGB triplet, míg a feketét a (0,0,0) jelöli. Az alapszíneket azonos arányban tartalmazó tripletek a szürke különböző árnyalatait, míg az eltérő araányú keverések a megfelelő színárnyalatokat jelentik. A 3 darab 8 bites tripleten összen 2^24 (~16,8 millió) különböző érték, és ennek megfelelő számú különböző színárnyalat ábrázolható.

Színillesztés
Bár az alkalmazások az adott eszköz tényleges színezési képességeinek figyelmen kívül hagyásával, tetszőleges színkombinációkkal végezhet rajzolási műveletek az eszközkörnyezetben, de az így keletkező végső kimenet nem feltétlenül lesz annyira használható és kellemes, mint ha az alkalmazás már eleve a tényleges képességek figyelembe vételével válogatta volna meg használt színeit. Ez azért van így, mert a gyakorlatban a legtöbb eszköz nem képes az alkalmazás által használható összes tripletnek megfelelő szín megjelenítésére. Amennyiben az alkalmazás egy olyan színnel rajzol az eszközkontextusba, amit az nem képes valójában megjeleníteni, úgy a rendszer az adott színhez hatásában (színében, intenzitásában, tónusosságában) legközelebb álló eszközszínnel fogja a tényleges kimenet generálását elvégezni. Ez a szín paletta-alapú eszközök esetén a rendszer-palettából kerül automatikusan kiválasztásra, míg közvetlen RGB "címzésű" egységek esetén az esetleges konverzió elvégzése az eszközmeghajtó program feladata.

Az alkalmazások a rajzolási műveletekben alkalmazandó színeket közvetlen RGB tripletekkel is megadhatják, de akár indexükön keresztül paletta-elemeket is megjelölhetnek. A paletták alkalmazásának elsődleges jelentősége itt a színillesztés folyamatának gyorsításában mutatkozik meg. Amikor egy alkalmazás egy adott logikai palettát kiválaszt az eszközkontextusba, akkor a GDI felállítja a környezet logikai és az eszköz fizikai- v. rendszer-palettája (lásd később) közötti fordítási táblázatokat. A rajzolási folyamatok során így a nem közvetlenül RGB tripletekkel, hanem indexükön keresztül megadott paletta-színekhez tartózó eszköz-színeket minden tényleges keresés nélkül, közvetlenül a fordítótáblázat felhasználásával meg tudja állapítani, ami rendkívüli mértékű gyorsulást eredményez a leképezés folyamatában.

Ha például egy adott alkalmazás vörös (255,0,0) színnel rajzol egy monokróm eszközhöz (pl. fekete-fehér nyomtató) kapcsolódó eszközkontextusba, úgy a tényleges kimenet generálása során az adott ábra általában fekete színnel fog (a papíron) megjelenni, mert a rendszer a két rendelkezésre álló eszközszín közül a feketével tudja legjobban közelíteni a kért logikai színt. Még nagyobb problémát jelent, hogy adott esetben a kék (0,0,255) színt is valójában a fekete eszközszínre képezi le, ami így használhatatlan kimenetet eredményezhet, amennyiben az alkalmazás nincs felkészítve az ilyen esetek kezelésére is. Az ilyen helyzetek sikeres kezeléséhez a rendszer biztosítja az alkalmazások számára egy adott logikai színhez tartozó - az eszközre történő leképezés folyamata során előálló - eszközszín lekérdezését, amik így az esetlegesen felmerülő színkonflitkusok esetén alternatív színek vagy ábrázolások alkalmazásához folyamodhatnak a kívánt minőségű kimenet sikeres legenerálása érdekében.

Amennyiben az alkalmazás a rajzolást nem képpontonként vagy egy egyszerű tollal, hanem például egy ecset felhasználásával (ezek lásd később) végzi, úgy a rendszer teljes egyezés hiányában ún. árnyalással (dithering) próbál meg a kérttel azonos hatású ábrázatot generálni. Az árnyalás során a GDI kettő vagy több eltérő szín adott mintában történő "keverésével" próbál meg a kérthez megjelenítésében minél közelebb eső hatású kimenetet generálni az adott eszközön. Az eszközön rendelkezésre álló és rajzolás során alkalmazott színektől függően az árnyalás meglepően jó hatású eredményt is produkálhat. Az árnyalás rendkívül fontos szerephez jut a monokróm eszköz esetében, ahol a különböző tónusok alkalmazásával az eredetileg mindösszesen két színre (fekete és fekér) korlátozott megjelenítési lehetőségeket fantasztikus mértékben kibővíti. A leképezés során alkalmazott árnyalás az eszközmeghajtó program feladata, amelyet az alkalmazás közvetlenül nem befolyásolhat, de amelynek alkalmazásáról tudomást szerezhet. Ugyanakkor, kizárólag az eszközszínek alkalmazásával előállított kitöltőmintával történő festéssel az alkalmazás saját maga is kialakíthat egyedi árnyalásokat, amelyek így módosítás nélkül kerülnek az eszközön leképezésre és megjelenítésre.

A tollaktól és ecsetektől teljesen eltérő módon a bittérképek mindig eszközfüggő formában tárolják a színinformációkat, így azok megjelenítése során nincs szükség semmilyen konverzióra. Ugyanakkor pontosan ez okból kifolyólag az eltérő színkarakterisztikájú eszközök között közvetlenül nem másolhatók bittérképek. Amennyiben ezt egy alkalmazás mégis meg szeretné tenni, úgy az adott képet először egy ún. eszközfüggetlen bittérképbe (Device Indpendent Bitmap - DIB) kell másolnia, ami a színinformációkat már eszközfüggetlen módon - vagy közvetlen RGB tripletekkel, vagy egy a képhez csatolt palettában - tárolja, és ahonnan az adott kép már bármilyen másik, tetszőleges jellemzőjű eszközkontextusba átmásolható. Az eszközfüggetlen kép leképezése során a tollakhoz hasonló módon közelítést (de árnyalást nem) alkalmaz a rendszer a céleszközön megjelenő pontok színeinek meghatározásához.

A GDI objektumok
A GDI alapvetően 6 fajta különböző objektummal dolgozik, melyek mindegyikéből egyszerre egyet lehet kiválasztva tartani egy adott eszközkörnyezetben, és amelyek meghatározzák, hogy a különböző rajzolási műveletek milyen alapvető paraméterekkel kerülnek majd végrehajtásra.

A paletták egy adott eszközkontextusban pillanatnyilag ábrázolható színeket tartalmazó tömbök, amiket ennek megfelelően olyan eszközök alkalmaznak, amelyek az elméletileg elérhető színskálának mindössze egy részét képesek ténylegesen megjeleníteni. Minden paletta-alapú eszköz rendelkezik egy logikai és egy fizikai palettával. A fizikai paletta az eszköz által ténylegesen megjeleníthető színeket tartalmazza, míg az eszközköz kapcsolódó logikai paletta akár ettől eltérő színekből is állhat. Az eszközkontextus megnyitásakor a rendszer automatikusan létrehoz egy ún. alapértelmezett palettát (default palette), ami általában mindig ugyanazt a 20, a WinAPI által definiált standard színt tartalmazza, és ami biztosítja, hogy az alkalmazás minden további nélkül azonnal rajzolhasson az eszközkörnyezetbe. Amennyiben az alkalmazás az alapértelmezettől eltérő színekkel is dolgozni szeretne, úgy létre kell hoznia és fel kell töltenie egy saját logikai palettát, amit aztán az adott eszközkörnyezetbe kiválasztva tud aktívvá tenni. Ezt követően a rajzolási funkciókban már az új paletta színeivel dolgozhat.

Az ún. toll (pen) objektumok segítségével azt határozza meg az alkalmazás, hogy az GDI a vonalak rajzolása során miként járjon el: milyen színnel, milyen vastagon és milyen stílusú vonalat húzzon. A tollaknak alapvetően két fajtája létezik: a kozmetikai (cosmetic) és a geometriai (geometric). A kozmetikai tollakat az alkalmazások olyan esetben alkalmazzák, amikor fix szélességű, gyors vonalrajzolásra van szükségük.

A kozmetikai tollakkal történő rajzolás átlagosan 5-10 gyorsabb megjelenítést eredményez. A kozmetikai tollak alapvetően három jellemzővel bírnak: vastagsággal, stílussal és színnel. A toll vastagsága azt határozza meg, hogy a rajzolás során a GDI hány eszközegység széles vonalakat húzzon. (A Windows pillanatnyilag csakis 1-et enged meg a kozmetikai tollak vastagságának megadásánál, de ezt a korlátozást későbbi verziók megszüntethetik.) A toll stílusának megadásával az alkalmazás azt határozza meg, hogy, a GDI milyen mintát alkalmazzon a vonal kirajzolásakor, azaz, hogy a vonal egymást követő pontjai milyen állapotban legyenek. Például a tömör (solid) vonal minden pontja kirajzolásra kerül, míg a pontozottnak (dot) csak minden második pontja kerül megjelenítésre. Másik stílusok alapját bonyolultabb szekvenciák képezik. Az üres (null) toll a vonalak rajzolásának kiiktatására használható. A kereten belüli (inside-frame) stílus kozmetikai tollak esetén a tömör stílussal azonos hatást eredményez. A 7 rendszer által definiált stílus mellett létezik még a nyolcadik, felhasználói stílus is, amelyet maga az alkalmazás határozhat meg pontok és szünetek tetszőleges kombinációjaként. A toll színe RGB triplettel és paletta-index-szel egyaránt megadásra kerülhet.

A geometriai tollak vastagsága az előbbivel szemben nem eszköz, hanem logikai egységekben kerül megadásra, így a megjelenítés során elnyert tényleges, eszközegységekben mérhető vastagságát a mindenkori leképezési módok befolyásolják. A geometria tollak is rendelkeznek stílussal és színnel is, amely jellemzők az előbb megismertekhez hasonlóan befolyásolják a megjelenítést. Az egyetlen különbség, hogy a kereten belüli (inside-frame) stílus alkalmazása esetén az eszközön a vonal olyan módon kerül megrajzolásra, hogy az mindig a kirajzolt alakzat belsejébe essen, így garantálva annak kiterjedésének korlátozását a megadott keretekbe, az alkalmazott torzításoktól és skálázásoktól függetlenül. A geometria tollak a már megismerteken túl még további négy jellemzővel rendelkeznek: mintával (pattern), rovatkázással (hatch), záróalakkal (end cap) illetve az illesztéssel (join). A különböző jellemzők választható módjait az alábbi ábrák tartalmazzák:
 

Az ún. ecset (brush) objektumokat a GDI a zárt alakzatok belső területeinek kitöltéséhez használja. Az ecseteknek alapvetően két fajtája létezik: logikai és fizikai. A logikai ecset valójában egy, az alkalmazás által kijelölt elméleti minta. Az eszközkörnyezetbe történő kiválasztása után az eszközmeghajtó a megadott mintának megfelelően készíti elő a kitöltés során használt bittérképet, azaz a fizikai ecsetet. Alapvetően négy logikai ecsettípus létezik: tömör (solid), raktári (stock), rovatkázott (hatch) és mintás (pattern). A tömör ecset az egyszínű, minta nélküli kitöltés, míg a mintás stílus valójában a fizikai ecset, azaz a kitöltéshez használt bittérkép közvetlen megadását takarja. A raktári és a rovátkázott stílusok esetén alkalmazható ecseteket az alábbi ábrák mintázzák: (fontos megjegyezni, hogy ezek az ábrák kizárólag idealizált mintákat tartalmaznak, tehát egy adott eszközön ténylegesen megjelenítésre kerülő minta bittérképe ezektől eltérhet)

 

(folytatjuk)