GDI

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. május 28-án felülvizsgált verziótól ; az ellenőrzések 6 szerkesztést igényelnek .

A GDI ( Graphics Device Interface , Graphical Device Interface ) a Microsoft Windows felhasználói felületét (GDI ablakkezelő) alkotó három fő összetevő vagy "alrendszer" egyike, a kernellel és a Windows API -val együtt .

A GDI egy Windows interfész grafikus objektumok megjelenítésére és megjelenítésére szolgáló eszközökhöz, például monitorokhoz és nyomtatókhoz.

A GDI felelős a vonalak és görbék rajzolásáért, a betűtípusok megjelenítéséért és a paletták kezeléséért. Nem felelős az ablakok, menük stb. rajzolásáért, ez a feladat a user32.dll -ben található és GDI-n alapuló felhasználói alrendszerhez van hozzárendelve. A GDI ugyanazokat a funkciókat hajtja végre, mint a QuickDraw Mac OS rendszeren .

A hardverhez való közvetlen hozzáférés helyett a GDI használatának egyik előnye a különböző eszközökkel végzett munka egyesítése. A GDI használatával ugyanazokat a funkciókat rajzolhatja meg különböző eszközökre, például képernyőre vagy nyomtatóra, szinte ugyanazokat a képeket kapva rajtuk. Ez a képesség sok WYSIWYG Windows-alkalmazás középpontjában áll .

Az egyszerű játékok, amelyek nem igényelnek gyors grafikát, használhatják a GDI-t. A GDI azonban nem biztosít jó minőségű animációt, mivel nem képes szinkronizálni a framebufferrel . A GDI-ben sincs raszterezés a 3D grafika megjelenítéséhez. A modern játékok DirectX -et vagy OpenGL -t használnak , amelyek több hardverfunkcióhoz biztosítanak hozzáférést a programozóknak.

Rövid leírás

A képernyőn vagy nyomtatón megjelenített szövegek és képek attribútumainak meghatározásához egy eszközkontextusnak nevezett szoftverobjektumot (Device Context, DC) használnak. A DC, mint a legtöbb GDI objektum, magában foglalja a megvalósítás részleteit és adatait, és nem érhető el közvetlenül.

Minden rajzhoz HDC (Handle DC) objektum szükséges. Nyomtatóra történő kiadáskor a HDC-t a CreateDC meghívásával kapjuk meg, és speciális funkciókat hívunk meg, hogy a nyomtatott dokumentum új oldalára ugorjanak. Képernyőn való megjelenítéskor használhatjuk a CreateDC-t is, de ez azt eredményezi, hogy az összes ablak tetejére rajzol a határain kívül, ezért általában a GetDC és a BeginPaint hívások segítségével rajzolnak a képernyőre, amelyek már nem tartoznak a GDI-hez, hanem a FELHASZNÁLÓ részre, és visszaadja az ablak vágási régiójára utaló kontextust.

Funkcionalitás:

Megvalósítás

A Windows 9x és korábbi verziókban 16 bites GDI.DLL-ben van megvalósítva, amely viszont betölti a DLL-ként implementált videokártya-illesztőprogramot. A videokártya illesztőprogramja eredetileg köteles volt végrehajtani az összes rajzolást általában, beleértve a bittérképeken keresztüli rajzolást a memóriában képernyő formátumban. Később megjelent a DIBENG.DLL, amelyben a tipikus formátumú bittérképekre való rajzolást valósították meg, a meghajtónak minden hívást át kellett adnia, kivéve azokat, amelyekhez a videokártya hardveres gyorsítóját használta.

A nyomtató-illesztőprogram ugyanilyen módon volt betöltve, és ugyanazzal a felülettel rendelkezett „felülről”, de „alulról”, ahelyett, hogy a memóriába / hardverre rajzolt volna, a nyomtatóparancsok sorozatát generálta és elküldte a Job objektumnak. Ezek a parancsok általában binárisak és nem ember által olvashatóak, vagy PostScript parancsok voltak.

Windows NT - ben teljesen átírták a GDI-t a semmiből, a C ++- ban pedig (a pletykák szerint a Microsoftnak akkor még nem volt fordítója erre a nyelvre és cfrontot használtak). Az alkalmazások API-ja nem változott (kivéve a Bezier-görbék hozzáadását), az illesztőprogramok esetében - a C nyelven a C ++-ban megvalósított belső elemek körüli burkolók (például BRUSHOBJ_pvGetRbrush).

Maga a GDI a WINSRV.DLL-ben az első helyre került a CSRSS.EXE folyamatban, kezdve a win32k.sys NT4-gyel. Ott rakták be a sofőröket. A DIBENG.DLL átírásra került, és ugyanoda került át, mint az EngXxx - EngTextOut és mások híváskészlete. A driver-GDI-DIBENG interakció logikája megközelítőleg változatlan maradt.

Felhasználói módban a GDI32.DLL speciális rendszerhívások halmazaként valósul meg, amelyek a win32k.sys fájlhoz vezetnek (az NT4 előtt a CsrClientCallServer hívás körül, amely üzenetet küldött a CSRSS.EXE-nek).

A Windows Vista bemutatta a WDDM illesztőprogram-modellt , amely megszüntette a 2D grafikus hardver használatának lehetőségét. WDDM használatakor minden GDI-alkalmazás (vagyis az összes szokásos Windows UI rendszerrész - ablakcímek és keretek, asztal, tálca stb.) a cdd.dll (Canonical Display Driver) [1] GDI-illesztőprogramot használja , amely a néhány bittérkép a memóriában, minden ablakhoz saját (az ablak tartalma elkezdett emlékezni a memóriában, előtte a Windows soha nem csinálta ezt, és mindig újrarajzolta az ablakokat, kivéve néhány speciális ablakot a CS_SAVEBITS jelzővel). A cdd.dll fájlból származó képeket a dwm.exe (Desktop Window Manager) folyamat kéri le, amely egy Direct3D alkalmazás, amely a Direct3D segítségével "ablakképeket" rajzol a fizikai képernyőre.

Maga a WDDM-illesztőprogram csak a DirectDraw-t és a Direct3D-t támogatja, és semmi köze sem a GDI-hez, sem a win32k.sys-hez, a kernel dxgkrnl.sys moduljához kapcsolódik.

Kritika

A Windows nyomtatási alrendszert erősen kritizálják, különösen a CUPS -hez képest .

Okok: a nyomtatási feladatfolyam bináris formátuma (a CUPS-ben ez PostScript) és ennek a folyamnak a feldolgozása több DLL formájában ugyanazon a SPOOLSV.EXE folyamaton belül (a CUPS ehelyett egy szokásos többfolyamatos folyamatot használ, mint a pstoraster | rastertoepson | párhuzamos, amelyet ha akar, normál UNIX shellből is futtathat). Így a CUPS támogatja a nyomtatási feladatszűrők fejlesztését (például díjköteles szállodai nyomtatókhoz) még olyan szkriptnyelveken is, mint a Perl .

Itt azonban inkább a GDI alatti komponensekről beszélünk.

A CUPS-nek azonban komoly problémái vannak a WinPrinterek támogatásával, mint az összes olcsó Hewlett-Packard lézernyomtatóval. Mivel nem támogatják az elterjedt PCL formátumot, hatalmas, bonyolult konfigurálást és csomagokat igényelnek, mint például a HP OfficeJet (a FreeBSD "hpoj" portja). Ugyanakkor a CUPS tökéletesen támogatja a tintasugaras nyomtatókat, a drága Hewlett-Packard lézernyomtatókat és a PostScript nyomtatókat.

Hozzávetőleges analógok

A UNIX-szerű operációs rendszerekben, például a Linuxban használt X11 technológia alacsonyabb szintjei .

Ugyanakkor az X11 szolgáltatásaiban gyengébb, mint a GDI (például problémák vannak az eszközfüggetlen színek megvalósításával), és a GDI teljes analógjának eléréséhez számos könyvtárat kell hozzáadni, például SDL -t. .

GDI+

Windows komponens
Microsoft Windows GDI+
Alkatrész típusa Microsoft Windows szoftver és összetevő [d]
Tartalmazza Windows XP
Windows Server 2003
Windows Vista Starter
Lecserélve Microsoft Windows GDI
Ki lett cserélve Asztali ablakkezelő

A Windows XP megjelenésével megjelent az alrendszer leszármazottja, a C++ [2] alapú GDI+ . A GDI+ alrendszer 600 függvényből álló "lapos" halmazként érhető el a gdiplus.dll fájlban . Ezek a függvények 40 C++ osztályba vannak "csomagolva". A Microsoft nem tervezi olyan kódok támogatását, amelyek közvetlenül érik el a lapos készletet, nem pedig C++ osztályokon és metódusokon keresztül. A .NET-keretrendszer alternatív C++ burkolóosztályokat kínál a System.Drawing..

A GDI+ egy továbbfejlesztett 2D grafikus környezet, amely olyan funkciókat ad hozzá, mint az élsimítás , lebegőpontos koordináták , színátmenetek kitöltése , belső munkaképesség olyan grafikus formátumokkal, mint a JPEG és PNG , a vágási régiók sokkal jobb megvalósítása a lebegőpontos koordináták használatának lehetőségével bennük (a 16 bites egész számok helyett), és alkalmazza rájuk a World Transform-ot, átalakítsa kétdimenziós mátrixokat stb. A GDI + ARGB színeket használ. Ezeket a szolgáltatásokat a Windows XP felhasználói felülete használja, és az alapul szolgáló grafikus rétegben való jelenlétük megkönnyíti a vektorgrafikus rendszerek, például a Flash vagy az SVG használatát .

A GDI+ dinamikus könyvtárak a Windows korábbi verzióiban használható alkalmazásokkal terjeszthetők.

A GDI+ hasonló az Apple Quartz 2D alrendszeréhez és a nyílt forráskódú libart és Cairo könyvtárhoz .

A GDI+ nem más, mint a hagyományos GDI feletti burkolókészlet. A Windows 7 rendelkezik egy új Direct2D API -val , amely nagyjából ugyanaz, de „felülről lefelé” egészen a videokártya illesztőprogramjáig implementálva (pontosabban, ebben az illesztőprogramban használ néhány Direct3D képességet), és hardveres gyorsítást is tud használni. egy 3D-s videoprocesszor néhány 2D-s objektum rajzolásához (élsimítás stb.)

Sebezhetőségek

2004. szeptember 14- én a GDI+ és más grafikus API-k biztonsági rését fedezték fel a JPEG könyvtárkód hibája miatt. Ez a hiba tetszőleges kódfuttatást tett lehetővé bármely Windows rendszeren. 2004. október 12-én megjelent egy javítás a sérülékenység javítására [3] .

Jegyzetek

  1. A Direct2D és a GDI összehasonlítása - DirectX fejlesztői blog - webhely főoldala - MSDN blogok (hivatkozás nem érhető el) . Letöltve: 2014. március 24. Az eredetiből archiválva : 2014. április 8.. 
  2. GDI+ Flat API  (angol)  (a hivatkozás nem elérhető) . MSDN könyvtár . Microsoft. Letöltve: 2009. október 31. Az eredetiből archiválva : 2012. március 3..
  3. MS04-028: A puffertúlcsordulás a JPEG-feldolgozásban (GDI+) kódfuttatást tesz lehetővé  ( halott  hivatkozás) . Microsoft támogatás . Microsoft. Letöltve: 2005. február 6. Az eredetiből archiválva : 2005. február 6..

Linkek