TheGraphics Device Interface (GDI) is a legacy component ofMicrosoft Windows responsible for representing graphical objects and transmitting them tooutput devices such asmonitors andprinters. It was superseded byDirectDraw API and laterDirect2D API.[citation needed] Windows apps useWindows API to interact with GDI, for such tasks as drawing lines and curves, renderingfonts, and handlingpalettes. TheWindows USER subsystem uses GDI to render such UI elements as window frames and menus. Other systems have components that are similar to GDI; for example:Mac OS hadQuickDraw, andLinux andUnix haveX Window System core protocol.
GDI's most significant advantages over more direct methods of accessing the hardware are perhaps its scaling capabilities and its abstract representation of target devices. Using GDI, it is possible to draw on multiple devices, such as a screen and a printer, and expect proper reproduction in each case. This capability is at the center of most "What You See Is What You Get" applications for Microsoft Windows.
Simple games that do not require fast graphics rendering may use GDI. However, GDI is relatively hard to use for advanced animation, lacks a notion for synchronizing with individualvideo frames in thevideo card, and lacks hardwarerasterization for 3D. Modern games usually useDirectX,Vulkan, orOpenGL instead.
In GDI, adevice context (DC) defines the attributes of text and images for the output device, e.g., screen or printer. GDI maintains the actual context. Generating the output requires ahandle to the device context (HDC). After generating the output, the handle could be released.
GDI usesBresenham's line drawing algorithm to draw aliased lines.[1]
GDI was present in the initial release of Windows. MS-DOS programs had manipulated the graphics hardware usingsoftware interrupts (sometimes via theVideo BIOS) and by manipulatingvideo memory directly. Code written in this way expects that it is the only user of the video memory, which was not tenable on amulti-tasked environment, such as Windows. TheBYTE magazine, in December 1983, discussed Microsoft's plans for a system to output graphics to both printers and monitors with the same code in the forthcoming first release of Windows.[2]
OnWindows 3.1x andWindows 9x, GDI can useBit blit features for 2D acceleration, if suitablegraphics card driver is installed.[3]
With the introduction ofWindows XP,GDI+ complemented GDI. GDI+ has been written in C++. It adds anti-aliased 2D graphics, floating point coordinates, gradient shading, more complex path management, intrinsic support for modern graphics-file formats likeJPEG andPNG, and support for composition ofaffine transformations in the 2D view pipeline. GDI+ usesRGBA values to represent color. Use of these features is apparent in Windows XP components, such asMicrosoft Paint,Windows Picture and Fax Viewer, Photo Printing Wizard, and the My Pictures Slideshow screensaver. Their presence in the basic graphics layer greatly simplifies implementations of vector-graphics systems such asAdobe Flash orSVG. Besides,.NET Framework provides a managed interface for GDI+ via theSystem.Drawing
namespace.
While GDI+ is included with Windows XP and later, the GDI+ dynamic library can also be shipped with an application and used on older versions of Windows.[4]
Because of the additional text processing and resolution independence capabilities in GDI+, the CPU undertakes text rendering.[5] The result is an order of magnitude slower than thehardware-accelerated GDI.[6] Chris Jackson published some tests indicating that a piece of text rendering code he had written could render 99,000 glyphs per second in GDI, but the same code using GDI+ rendered 16,600 glyphs per second.
GDI+ is similar (in purpose and structure) toApple'sQuickDraw GX subsystem, and the open-sourcelibart andCairo libraries.
In Windows Vista, all Windows applications including GDI and GDI+ applications run in the new compositing engine,Desktop Window Manager (DWM), which is hardware-accelerated. As such, the GDI itself is no longer hardware-accelerated.[7][8][9] Because of the nature of the composition operations, window moves can be faster or more responsive because underlying content does not need to be re-rendered by the application.[8]
Windows 7 includes GDI hardware acceleration forblitting operations in theWindows Display Driver Model v1.1. This improves GDI performance and allows DWM to use local video memory for compositing, thereby reducing systemmemory footprint and increasing the performance of graphics operations. Mostprimitive GDI operations are still not hardware-accelerated, unlikeDirect2D. GDI+ continues to rely on software rendering in Windows 7.[10]
A GDI printer orWinprinter (analogous to aWinmodem) is a printer designed to accept output from a host computer running Windows. The host computer does all print processing: GDI renders a page as a bitmap, which theprinter driver receives, processes, and sends to the associated printer.[11][12] The combination of GDI and the driver is bidirectional; they receive information from the printer such as whether it is ready to print or is out of paper.
Printers that do not rely on GDI require hardware, firmware, and memory for page rendering while a GDI printer uses the host computer for this. However, a printer with its own control language can accept input from any device with a suitable driver, while a GDI printer requires a PC running Windows. GDI printers can be made available to computers on a network if they are connected as shared printers on a computer which is on and running Windows. Some "generic" GDI drivers such aspnm2ppa
have been written; they aim to make GDI printers compatible with non-Windows operating systems such asFreeBSD, but they cannot support all printers.[11]
In order to allow simpler creation of drivers for Winprinters, theMicrosoft Universal Printer Driver was created. This allows printer vendors to write Generic Printer Description (GPD) "minidrivers", which describe the printer's capabilities and command set in plaintext, rather than having to do kernel mode driver development.
Microsoft has moved away from this printing model withOpen XML Paper Specification.
Each window consumes GDI objects. As the complexity of the window increases, with additional features such as buttons and images, its GDI object usage also increases. When too many objects are in use, Windows is unable to draw any more GDI objects, leading to misbehaving software and frozen and unresponsive program operation.[13] Many applications are also incorrectly coded and fail to release GDI objects after use, which further adds to the problem.[14] The total available GDI objects varies from one version of Windows to the next:Windows 9x had a limit of 1,200 total objects; Windows 2000 has a limit of 16,384 objects; and Windows XP and later have a configurable limit (via the registry) that defaults to 10,000 objects per process (but a theoretical maximum of 65,536 for the entire session).[15][16] Windows 8 and later increase the GDI object limit to 65,536 per user login session.
Earlier versions of Windows such as Windows 3.1 and Windows 98 included a Resource Meter program to allow the user to monitor how much of the total system GDI resources were in use. This resource meter consumed GDI objects itself. Later versions such as Windows 2000 and Windows XP can report GDI object usage for each program in the Task Manager, but they cannot tell the user the total GDI capacity available.
Overflowing GDI capacity can affect Windows itself, preventing new windows from opening, menus from displaying, and alert boxes from appearing. The situation can be difficult to clear and can potentially require a forced reset of the system, since it prevents core system programs from functioning. In Windows 8 and 8.1, a forced log-off occurs as a result of GDI capacity overflow, instead of a reboot.
Direct2D is the successor of GDI and GDI+. Its sibling,DirectWrite, replacesUniscribe. They were shipped with Windows 7 and Windows Server 2008 R2, and were available for Windows Vista and Windows Server 2008 (with Platform Update installed). Later, Microsoft developedWin2D, afree and open-source GDI-like class library. Win2D's target audience are developers that use C++, C#, and Visual Basic.NET to developUniversal Windows Platform apps.[17]