Vmesnik grafične naprave je vmesnik API sistema Microsoft Windows, ki se uporablja za predstavitev grafičnih objektov in njihov prenos v izhodne naprave, kot so tiskalniki in monitorji. GDI omogoča aplikacijam, da risajo linije, krivulje, oblike in besedilo ter da upravljajo bitne slike (bitmape) in palete – pri čemer je osnovna ideja ustvariti abstrakcijo nad konkretno strojno opremo, tako da se ista risalna koda obnaša smiselno na različnih napravah.
Glavne komponente GDI
- Device Context (HDC) – kontekst naprave (HDC) predstavlja "platno" za risanje in nosi informacije o ciljni napravi (zaslon, tiskalnik, pomnilniška naprava). Vse risalne operacije potekajo znotraj HDC.
- GDI objekti – standardni objekti so pisala (pens), čopiči/krtače (brushes), pisave (fonts), bitne slike (bitmaps) in palete. Objekte je treba izbrati v HDC pred uporabo in jih pravilno sprostiti, da se preprečijo puščanja virov.
- Metafile in spooling – GDI podpira zapise v obliki meta-datotek (WMF/EMF), ki se pogosto uporabljajo pri tiskanju in pri predpomnjenju risalnih ukazov za poznejšo reprodukcijo.
Osnovne funkcije in operacije
GDI ponuja nabor funkcij za osnovne risalne operacije. Med pogostejšimi so:
- risanje geometrije: LineTo, MoveToEx, Polygon, Rectangle, Ellipse;
- upravljanje bitnih slik: BitBlt, StretchBlt (kopiranje in skaliranje bitmap), CreateCompatibleBitmap;
- izpis besedila: TextOut, ExtTextOut in funkcije za merjenje besedila;
- upravljanje s pisali in čopiči: CreatePen, CreateBrush, SelectObject, DeleteObject;
- barvne in transparentne operacije: TransparentBlt, AlphaBlend (v razširitvah ali GDI+).
Skaliranje in abstrakcija naprav
Morda najpomembnejša zmogljivost GDI v primerjavi s neposrednim dostopom do strojne opreme je njegova napravo-neodvisna abstrakcija in vgrajeno skaliranje. Z uporabo GDI je enostavno risati na več naprav hkrati (npr. zaslon in tiskalnik) ter pričakovati, da se bodo grafični elementi ustrezno prilagodili ločljivosti, gostoti pik in velikosti papirja. Ta lastnost je temelj številnih aplikacij What You See Is What You Get za Microsoft Windows.
Tiskanje in pipeline
Pri tiskanju GDI omogoča aplikacijam, da rišejo neposredno v kontekst tiskalnika ali v metafile, ki jih nato pošlje tiskalnemu sistemu. Tiskalni gonilniki prevzamejo GDI ukaze in jih pretvorijo v ukaze ustrezne tiskalne naprave. GDI upravlja tudi nastavitve, kot so velikost strani, orientacija in natančno skaliranje za tiskanje v višji ločljivosti kot zaslon.
Omejitve in sodobni nadomestki
GDI je primeren za mnoge tipične aplikacije in preproste igre, vendar ima več omejitev:
- ni optimiziran za hitro animacijo ali igre, ker nima neposredne sinhronizacije s framebufferjem in je večinoma CPU-odvisen;
- omejena podpora za strojno pospeševanje na sodobnih verzijah Windows (po uvedbi Desktop Window Manager in WDDM je bila vloga strojnega pospeševanja spremenjena);
- brez neposredne 3D rasterizacije — za 3D in intenzivne grafične operacije se uporabljata DirectX ali OpenGL (ter novejše tehnologije kot Direct2D/DirectWrite za 2D in besedilo);
- upravljanje virov: GDI-handle so omejeni, puščanje oziroma napačno sproščanje GDI objektov lahko povzroči zmanjšanje zmogljivosti ali zrušitve.
Razširitve in razvoj
Microsoft je nadgradil osnovni GDI z GDI+, ki prinaša boljše delovanje z alfa blendanjem, naprednejše risalne funkcije in boljšo podporo za moderni tisk in grafiko. Kljub temu mnoge sodobne aplikacije raje uporabljajo Direct2D/DirectWrite (za 2D pospešeno risanje in besedilo) ali Direct3D/OpenGL za zahtevnejše grafične naloge.
Priporočila za razvijalce
- vedno sprostite GDI-objekte (DeleteObject) in kontekste (ReleaseDC), da se izognete puščanju virov;
- če potrebujete animacije ali kompleksno 3D upodabljanje, uporabite DirectX/OpenGL ali Direct2D;
- za tiskanje uporabljajte metafile (EMF) ali neposredno risanje v HDC tiskalnika, da zagotovite natančno reprodukcijo na različnih tiskalnikih;
- preverite omejitve števila GDI handle-ov na ciljnih sistemih in spremljajte porabo v razvojnem procesu.
GDI ostaja pomemben del Windows platforme zaradi svojega enostavnega modela za 2D risanje in široke interoperabilnosti z napravami, vendar je pri zahtevnejših grafičnih scenarijih smiselno izbrati novejše, strojno pospešene rešitve.