A metafájlok

A metafájlok képek eszköz független módon történő tárolását teszik lehetővé. A bittérképekkel szemben a metafájlok a kép rajzolatát eszközfüggetlen módon tárolják. Ugyanakkor ebből adódóan kirajzolásuk lényegesen több időt vesz igénybe, így sebességkritikus megoldásokhoz nem nyújtanak effektív alternatívát a bittérképekkel szemben.

A metafájlok belső szerkezetüket tekintve struktúrák sokaságából, az ún. metafájl rekordokból állnak. A metafájl első rekordja mindig a kép általános jellemzőit: kiterjedését, felbontását és hasonló információkat tartalmaz. A fennmaradó rekordok a kép kirajzolásához szükséges GDI függvények azonosítóit és paramétereit tartalmazzák. A metafájlok létrehozása egy ún. metafájl eszközkontextus kialakításával kezdődik. Ez abban különbözik más eszközkörnyezetektől, hogy igazi rajzolófelület helyett egy metafájl objektumhoz kapcsolódik. A metafájl eszközkontextusba történő rajzolás során valójában a GDI az adott művelet kódját és paramétereit tartalmazó metafájl rekordot illeszt a fájl végéhez. Az ilyen módon elemi rajzolóműveletek sorozataként eltárolt kép elkészülte után a vágólapra másolható, lemezre menthető vagy visszajátszható. A visszajátszás (playback) során a GDI a metafájl rekordokat egymás után feldolgozva, a megfelelő GDI funkciókat a tárolt paraméterekkel végrehajtva alakítja ki a képet a céleszköz-környezetben annak mindenkori jellemzőinek megfelelő leképezést alkalmazva. Ez az eljárás garantálja, hogy az ilyen módon elkészült kép a mindenkori céleszköz lehetőségeihez képest mindig a legjobb minőségű lesz, szemben pl. a bittérképekkel, amelyek alkalmazása a különböző torzítások során információvesztést, vagy az eredetinél jóval finomabb céleszköz esetén a lehetőségekhez képest rosszabb képminőséget eredményezhet.

A Win32-ben bevezetett fejlesztett metafájlok (enhanced metafile) a kép rajzolatán kívül a színeket is eszközfüggetlen módon tárolják, valamint az alkalmazott leképezési műveletek "megjegyzése" révén gondoskodnak a kép kiterjedésének és arányainak megőrzéséről is bármely céleszközkörnyezet estén.
 

Rajzolóműveletek

A GDI elemi műveletek széles skáláját bocsátja az alkalmazások rendelkezésére, hogy az igényeiknek leginkább megfelelő kimenetet a lehető legegyszerűbb módon generálhassák le. Ezekkel a műveletekkel vonalakat, görbéket, különböző zárt és nyitott alakzatokat valamint feliratokat és egyéb szöveges jellegű információkat rajzolhatnak azok a kimeneti eszközkörnyezetekbe.

Vonalak és görbék

A vonalak és görbék a leggyakrabban alkalmazott grafikus elemek. Területek körülhatárolására, kijelölések jelzésére, egyszerű objektumok és struktúrák ábrázolására egyaránt használják őket.

A vonal- és görberajzoló függvények egy része a kirajzolást az aktuális tollpozícióból kezdi és a kirajzolás a végpontra módosítja azt, ezáltal egyszerűvé téve a kapcsolódó vonalak rajzolását. A toll pozíciójának módosítására, egy adott pontba mozgatása a MoveTo() GDI függvénye segítségével lehetséges.

Egy adott szakaszt két végpontjának koordinátái határozzák meg. A GDI esetében a kezdőpontnál elhelyezkedő pixel mindig részét képezi a szakasznak, míg a végpontnál található sosem kerül kirajzolásra. A szakasz rajzolása során a GDI egy módosított Bresenham algoritmust használ a megjelenítéshez felhasználandó pixelek meghatározására, amely az eredeti algoritmus kerekítési pontatlanságaiból adódó hibákat kiküszöböli, és igen jó minőségű kimenetet garantál. Egyedülálló szakasz rajzolására a GDI LineTo() függvénye használható, ami a céleszközkontextus mindenkor aktuális tollpozíciója és a paraméterként megadott célkoordináták között húz egy szakaszt.

Amennyiben egy alkalmazás olyan jellegű vonalat kíván rajzolni, ami a standard vonalstílusok alkalmazásával nem érhető el, úgy saját rajzoló függvényt is alkalmazhat, amely a GDI-től megkapva a vonalat alkotó pontok koordinátáit maga dönthet az egyes pontok megjelenítéséről vagy esetlegesen a koordináták egyéb módon történő feldolgozásáról. Ez esetben a LineDDA() függvény paramétereként a kezdő- és végpont koordinátái mellett annak az alkalmazás által definiált eljárásnak a címét kell megadnia amelyet a GDI a szakaszt alkotó minden egyes pixelre, annak koordinátáit paraméterként átadva meg fog hívni.

A különálló vonalak mellett a GDI egymással összeköttetésben lévő szakaszok egyszerű módon történő rajzolását is lehetővé teszi a PolyLine() függvény segítségével, amely a paraméterként átadott tömbből veszi ki a kezdő- majd egymás után a következő szakaszok végpontjait tartalmazó koordinátákat és rajzolja meg azokat. A PolyLineTo() függvény ehhez nagyon hasonlóan működik, de az aktuális tollpozíciót az utolsó szakasz végpontjába mozgatja. Amennyiben a kirajzolni kívánt alakzat egy-egy pontjában kettőnél több szakasz is összefut, úgy effektívebb megoldást nyújthat a PolyPolyLine() függvény, amely paraméterként a koordináták halmazát, és azok összekötési sorrendjét leíró tömböt várja.

Az egyenes szakaszok mellett a GDI görbék rajzolásához is számos funkciót bocsát az alkalmazások rendelkezésére. A görbéknek alapvetően két altípusát érdemes megkülönböztetni: a hagyományos görbék olyan vonalak, amelyek egy kúpszelet körvonalára illeszkednek - azt részben vagy teljesen elfedik. Ezzel szemben a rendhagyó görbék azok, amelyekre ez nem igaz, azaz amelyek nem illeszkednek kúpszeletre. A görbék leképezése során azok körvonalát a GDI sok-sok rendívül kicsi szakaszra bontja, és azok sorozataként rajzolja ki azokat. Nyitott görbe esetén a szakaszhoz hasonlóan a végpont utolsó pixele nem kerül már kirajzolásra.

Az Arc() függvény segítségével az alkalmazások egy teljes vagy rész-ellipszist rajzolhatnak ki, annak befoglaló téglalapjának valamint egy, a görbevonalat két ponton metsző és ezekkel a kirajzolni kívánt görbeszakasz kezdő- és végpontját meghatározó szakasz koordinátáinak megadásával. Az ArcTo() függvény az Arc()-kal teljesen megegyező paraméterek alapján szintén rész-ellipszist rajzol, de ezen felül annak kezdőpontját és az aktuális tollpozíciót egy szakasszal köti össze, majd a tollpozíciót az ívdarab végpontjára állítja.

Körívdarab és annak kezdőpontját az aktuális tollpozícióval összekötő szakaszt rajzol az AngleArc() függvény, amely a kör középpontját, sugarát illetve a megrajzolandó körív kezdőpontjába mutató sugár a vízszintessel illetve a végpontba mutató sugár ez utóbbival bezárt szögét várja paraméterként. Az alábbi ábrákon az imént felsorolt függvények felhasználásával készült egy-egy tipikus alakzat látható.
 

A GDI a rendhagyó görbék közül az ún. Bézier görbék rajzolását támogatja. Minden Bézier görbét négy ún. vezérpont határozza meg, amelyek közül az első és az utolsó a görbevonal végpontjait, míg a másik kettő egy olyan sokszöget határoz meg, amelynek oldalaihoz a görbe vonala simulni fog. A PolyBezier() és a PolyBezierTo() függvények mindegyike az egymáshoz kapcsolódó görbéket meghatározó vezérpontokat tartalmazó tömböt várják paraméterként és csakis abban különböznek, hogy utóbbi a toll aktuális pozícióját az utolsó görbe végpontjára állítja.

Egymáshoz kapcsolódó szakaszok és görbék sorozatából álló alakzat kirajzolásához a PolyDraw() függvény használható, amely paraméterként két, a szakaszok végpontjait illetve a Bézier-görbék vezérpontjait illetve az egymáshoz kapcsolódó vonalak típusát meghatározó tömböket vár.

(folytatjuk)