Graphics Device Interface
Graphics Device Interface (GDI) — это программный интерфейс (API) операционной системы Microsoft Windows, предназначенный для вывода двумерной графики на экран, принтер и другие устройства отображения. GDI является частью подсистемы Windows, отвечающей за графический вывод, и предоставляет разработчикам набор функций для рисования линий, фигур, текста, работы с цветами и управления графическими контекстами. В отличие от более современных API, таких как Direct2D или GDI+, GDI работает на основе растровой графики, используя аппаратное ускорение только через драйверы устройств.
История
GDI был впервые представлен в 1985 году с выходом операционной системы Windows 1.0. На момент создания он был революционным решением, так как позволял абстрагировать разработчиков приложений от конкретных моделей видеокарт и принтеров, предоставляя единый интерфейс для работы с графикой. До появления Windows графика на IBM PC-совместимых компьютерах чаще всего реализовывалась через прямой доступ к видеопамяти (например, через прерывание INT 10h в MS-DOS), что делало приложения зависимыми от конкретного оборудования.
В Windows 95 и Windows NT 4.0 GDI был значительно расширен: появилась поддержка 32-битных цветов, улучшена работа с TrueType-шрифтами и добавлена поддержка прозрачности (через альфа-канал). В Windows 2000 GDI стал частью подсистемы Win32, а в Windows XP была представлена расширенная версия — GDI+ (GDI Plus), которая добавила поддержку сглаживания (anti-aliasing), градиентов, кривых Безье и работы с изображениями в форматах JPEG, PNG и TIFF.
С выходом Windows Vista и Windows 7 корпорация Microsoft начала продвигать Direct2D и DirectWrite как более современные и производительные API для графики, использующие аппаратное ускорение через графический процессор (GPU). Однако GDI остаётся частью системы для обратной совместимости с устаревшими приложениями. В Windows 10 и Windows 11 GDI по-прежнему поддерживается, хотя для новых проектов рекомендуется использовать Direct2D.
Архитектура и принципы работы
Графический контекст (Device Context, DC)
Центральным понятием GDI является графический контекст (DC) — структура данных, которая определяет атрибуты рисования (цвет, шрифт, кисть, перо, режим смешивания) и связывает их с конкретным устройством вывода (монитором, принтером, метафайлом). Каждое окно или принтер имеет свой DC. Для получения DC используется функция GetDC() или BeginPaint(). После завершения рисования контекст освобождается через ReleaseDC() или EndPaint().
Основные объекты GDI
GDI оперирует следующими графическими объектами:
- Перо (Pen) — определяет стиль линии (сплошная, пунктирная, штрихпунктирная), её толщину и цвет.
- Кисть (Brush) — задаёт способ заливки замкнутых фигур (сплошной цвет, штриховка, узор).
- Шрифт (Font) — определяет гарнитуру, размер, начертание (жирный, курсив) и кодировку текста.
- Битовая карта (Bitmap) — растровое изображение, которое может быть использовано для рисования или как источник для кисти.
- Палитра (Palette) — набор цветов, используемый для устройств с ограниченной цветовой гаммой (например, старые мониторы с 256 цветами).
- Область (Region) — замкнутая область произвольной формы (прямоугольник, эллипс, многоугольник), используемая для обрезки или проверки попадания.
Функции рисования
GDI предоставляет функции для рисования базовых примитивов:
MoveToEx()иLineTo()— рисование отрезков.Rectangle(),Ellipse(),RoundRect()— рисование фигур.Polygon(),Polyline()— рисование многоугольников и ломаных линий.TextOut(),DrawText()— вывод текста.BitBlt(),StretchBlt()— копирование и масштабирование битовых карт.
Режимы отображения (Mapping Modes)
GDI поддерживает несколько режимов отображения, которые определяют, как логические координаты (единицы, используемые в программе) преобразуются в физические пиксели устройства. Основные режимы:
MM_TEXT— 1 логическая единица = 1 пиксель (по умолчанию).MM_LOENGLISH— 1 единица = 0,01 дюйма.MM_HIMETRIC— 1 единица = 0,01 мм.MM_ISOTROPICиMM_ANISOTROPIC— произвольное масштабирование с сохранением или без сохранения пропорций.
Классификация
GDI и GDI+
GDI+ (введён в Windows XP) является расширением классического GDI, но не его прямой заменой. Основные отличия:
- GDI использует ручное управление ресурсами (через дескрипторы
HDC,HPEN,HBRUSH) и требует явного освобождения объектов. GDI+ использует управляемые классы (например,Graphics,Pen,Brushв C++/CLI). - GDI работает в основном с растровой графикой, GDI+ поддерживает векторную графику (кривые Безье, пути).
- GDI+ поддерживает сглаживание (anti-aliasing) и альфа-канал (прозрачность), что в GDI доступно только через сложные обходные пути.
- GDI быстрее для простых операций (например, копирование битовых карт), но GDI+ удобнее для сложных эффектов.
GDI и Direct2D
Direct2D (часть DirectX) является современным API для двумерной графики, использующим аппаратное ускорение GPU. В отличие от GDI, Direct2D:
- Работает через Direct3D, что даёт высокую производительность при рендеринге сложных сцен.
- Поддерживает аппаратное сглаживание, градиенты, эффекты (тени, размытие) и работу с текстом через DirectWrite.
- Не поддерживает прямой вывод на принтер (для печати используется GDI или XPS).
- Требует Windows Vista или новее.
Применение
Пользовательский интерфейс
До появления Windows Presentation Foundation (WPF) и Direct2D GDI был основным API для рисования элементов интерфейса в Windows. Все стандартные элементы управления (кнопки, поля ввода, списки) в Windows Forms и MFC (Microsoft Foundation Classes) используют GDI для отрисовки. Даже в современных приложениях, написанных на Win32 API, GDI применяется для кастомной отрисовки (например, в графических редакторах или CAD-системах).
Печать
GDI традиционно используется для вывода на принтер. Приложение рисует страницу в графическом контексте принтера, а драйвер принтера преобразует команды GDI в формат, понятный устройству (например, PCL или PostScript). В Windows Vista и новее для печати также используется XPS (XML Paper Specification), но GDI остаётся основным API для обратной совместимости.
Игры и мультимедиа
В ранних версиях Windows (до DirectX) GDI использовался для игр, но из-за отсутствия аппаратного ускорения и низкой производительности для анимации он был вытеснен DirectDraw (часть DirectX). В современных играх GDI не применяется.
Критика
GDI подвергается критике за несколько недостатков:
- Отсутствие аппаратного ускорения. Все операции GDI выполняются центральным процессором (CPU), что снижает производительность при большом количестве графических элементов.
- Ограниченная поддержка прозрачности. До GDI+ прозрачность реализовывалась через сложные трюки с масками и битовыми операциями.
- Проблемы с масштабированием. GDI не поддерживает сглаживание при масштабировании, что приводит к «лесенкам» на краях фигур при увеличении.
- Устаревшая архитектура. GDI использует 16-битные структуры данных (например,
POINTиRECT), что ограничивает координаты значениями до 32 767 пикселей (для некоторых функций). В Windows 2000 и новее это было исправлено, но обратная совместимость сохранилась.
Интересные факты
- GDI является частью подсистемы Win32, поэтому он доступен только в Windows. Для Linux и macOS существуют аналоги (например, Cairo или Quartz 2D), но они несовместимы с GDI.
- В Windows 95 GDI и USER (подсистема управления окнами) были разделены на две отдельные DLL (GDI32.DLL и USER32.DLL), что улучшило стабильность системы.
- GDI используется в Windows для отрисовки курсора мыши и иконок рабочего стола.
- Некоторые функции GDI (например,
CreateCompatibleDC) до сих пор используются в современных приложениях для создания метафайлов или работы с битовыми картами.
Источники
- Microsoft Docs: «Windows GDI» (раздел документации Win32 API).
- Charles Petzold, «Programming Windows», 5th Edition (1998), главы 5–9.
- Microsoft Developer Network (MSDN): «GDI+» и «Direct2D» (архивные статьи).
- «Windows Internals» by Mark Russinovich, David Solomon, Alex Ionescu (7th Edition, 2017), глава 3 (системные службы).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →