GDI
GDI (Graphics Device Interface, графический интерфейс устройств) — это программный интерфейс (API) операционной системы Microsoft Windows, предназначенный для представления графических объектов (линий, фигур, текста, изображений) на различных устройствах вывода, таких как мониторы, принтеры и плоттеры. GDI является частью подсистемы Win32 и обеспечивает взаимодействие между приложениями и драйверами устройств, абстрагируя разработчика от конкретных аппаратных особенностей.
История
Разработка и внедрение
GDI был разработан корпорацией Microsoft в конце 1980-х годов как ключевой компонент операционной системы Windows 1.0 (1985 год). Изначально он предназначался для упрощения программирования графики в среде с ограниченными аппаратными ресурсами. В Windows 3.0 (1990 год) GDI получил поддержку 256 цветов и TrueType-шрифтов, что значительно улучшило качество отображения текста и графики.
Эволюция в Windows 9x и NT
С выходом Windows 95 и Windows NT 4.0 (1996 год) GDI стал более стабильным и производительным. В Windows 2000 была добавлена поддержка альфа-канала и прозрачности через расширение GDI+ (2001 год). GDI+ представлял собой объектно-ориентированную надстройку над классическим GDI, упрощавшую работу с градиентами, матрицами преобразований и изображениями форматов JPEG, PNG, GIF.
Переход к Direct2D и DirectWrite
В Windows Vista (2006 год) Microsoft представила Direct2D и DirectWrite — API на основе DirectX, ориентированные на аппаратное ускорение графики. Однако GDI остался в системе для обратной совместимости. В Windows 7 (2009 год) GDI получил поддержку прозрачных окон (Aero Glass) через бэкенд Desktop Window Manager (DWM). Начиная с Windows 8 (2012 год), Microsoft рекомендует использовать Direct2D для новых проектов, но GDI продолжает поддерживаться во всех версиях Windows, включая Windows 11.
Архитектура и принципы работы
Модель устройства контекста
Центральным понятием GDI является контекст устройства (Device Context, DC) — структура данных, описывающая атрибуты вывода (цвет, шрифт, перо, кисть) для конкретного устройства. Приложение получает DC через вызовы GetDC() или BeginPaint() и использует его для всех операций рисования. После завершения работы DC освобождается вызовом ReleaseDC() или EndPaint().
Графические объекты
GDI оперирует набором логических объектов:
- Перо (Pen) — определяет стиль линии (цвет, толщина, пунктир).
- Кисть (Brush) — задаёт заливку замкнутых фигур (сплошной цвет, штриховка, узор).
- Шрифт (Font) — описывает гарнитуру, размер, начертание.
- Растровое изображение (Bitmap) — хранит пиксельные данные.
- Палитра (Palette) — управляет цветами для устройств с ограниченной цветовой глубиной.
- Область (Region) — задаёт произвольную область экрана для обрезки.
Все объекты создаются функциями CreatePen(), CreateSolidBrush(), CreateFont() и т.д. и удаляются вызовом DeleteObject().
Координатные пространства и преобразования
GDI использует несколько координатных пространств:
- Мировые координаты (World Space) — задаются приложением.
- Координаты страницы (Page Space) — преобразуются через масштабирование и поворот.
- Координаты устройства (Device Space) — соответствуют физическим пикселям экрана или точкам принтера.
Преобразования выполняются с помощью матриц, задаваемых функциями SetWorldTransform() и SetMapMode(). Это позволяет масштабировать, вращать и сдвигать графику независимо от разрешения устройства.
Растеризация и вывод
GDI выполняет растеризацию примитивов (линий, кривых Безье, многоугольников) на стороне центрального процессора (CPU), без использования аппаратного ускорения. Готовые пиксельные данные передаются драйверу устройства через вызовы BitBlt() или StretchBlt(). Для текста используется подсистема Uniscribe (начиная с Windows 2000), поддерживающая сложные письменности (арабскую, индийские).
Основные возможности
Вывод примитивов
GDI поддерживает рисование линий (LineTo()), прямоугольников (Rectangle()), эллипсов (Ellipse()), дуг (Arc()), многоугольников (Polygon()) и кривых Безье (PolyBezier()). Каждый примитив может быть контурным (перо) или залитым (кисть).
Текст и шрифты
Функции TextOut(), DrawText() и ExtTextOut() позволяют выводить текст с заданным шрифтом, цветом и выравниванием. GDI поддерживает растровые, векторные (TrueType, OpenType) и системные шрифты. Начиная с Windows 2000, работает с Unicode через функции TextOutW().
Работа с изображениями
GDI загружает растровые изображения из файлов (BMP, DIB) через LoadImage() или CreateDIBSection(). Для отображения используется BitBlt() (блочное копирование) или StretchBlt() (с масштабированием). Прозрачность реализуется через маски и функцию TransparentBlt() (Windows 2000+).
Печать
GDI обеспечивает вывод на принтер через тот же механизм DC. Приложение получает DC принтера вызовом CreateDC(), рисует страницы и отправляет их через StartDoc() / EndDoc(). GDI автоматически преобразует координаты в точки на дюйм (DPI) принтера.
Ограничения и критика
Производительность
Основной недостаток GDI — отсутствие аппаратного ускорения. Все операции растеризации выполняются CPU, что приводит к высокой нагрузке при работе с большими изображениями или сложной векторной графикой. Для игр и высокопроизводительных приложений Microsoft рекомендует Direct2D или Direct3D.
Ограниченная цветовая поддержка
Классический GDI (до GDI+) поддерживает только 8-битный альфа-канал (прозрачность) через расширения, но не имеет встроенной поддержки градиентов, теней или сглаживания (anti-aliasing) для линий. Сглаживание текста появилось только в Windows 2000 (ClearType).
Отсутствие многопоточности
GDI не является потокобезопасным. Все вызовы функций должны выполняться из одного потока, иначе возможны гонки данных и крахи. Это ограничение особенно критично для современных многопоточных приложений.
Устаревание
С появлением Direct2D (2009) и Win2D (2014) Microsoft фактически прекратила развитие GDI. Новые возможности (аппаратное ускорение, поддержка SVG, сложные эффекты) доступны только через современные API. GDI сохраняется исключительно для обратной совместимости с унаследованным кодом.
Применение
Встроенные приложения Windows
GDI используется в классических приложениях Windows: «Блокнот», «Калькулятор», «Проводник» (частично), «Paint» (до Windows 10). Все диалоговые окна и элементы управления (кнопки, поля ввода) рисуются через GDI.
Унаследованные системы
Многие корпоративные приложения, написанные на C++/MFC или Visual Basic 6.0, используют GDI. Например, системы управления базами данных (1С:Предприятие 7.7), бухгалтерские программы и CAD-системы (AutoCAD до версии 2013).
Печать и полиграфия
GDI остаётся основным API для печати в Windows. Драйверы принтеров преобразуют GDI-команды в язык управления принтером (PCL, PostScript, ESC/P). Это обеспечивает совместимость с тысячами моделей принтеров.
Образование и прототипирование
GDI часто используется в учебных курсах по программированию Windows API. Простота функций (например, MoveToEx(), LineTo()) позволяет быстро создавать простые графические приложения без изучения сложных фреймворков.
Альтернативы
Direct2D
Разработанный Microsoft API для аппаратно-ускоренной 2D-графики. Поддерживает сглаживание, градиенты, прозрачность, эффекты (размытие, тень) и работу с DirectWrite для текста. Требует Windows Vista или новее.
GDI+
Объектно-ориентированная надстройка над GDI, появившаяся в Windows XP. Упрощает работу с изображениями, градиентами и матрицами, но также не использует аппаратное ускорение и работает медленнее Direct2D.
OpenGL и Vulkan
Кроссплатформенные API для 2D и 3D-графики. Поддерживаются в Windows через драйверы, но не интегрированы с оконной системой Windows так же глубоко, как GDI.
Skia и Cairo
Кроссплатформенные библиотеки рендеринга 2D-графики, используемые в браузерах (Chrome, Firefox) и графических редакторах. Работают на CPU, но имеют оптимизации для современных процессоров.
Интересные факты
- GDI является одним из старейших компонентов Windows, сохранившихся с 1985 года.
- В Windows 95 GDI использовался для рендеринга интерфейса, включая кнопку «Пуск» и панель задач.
- Функция
BitBlt()(Bit Block Transfer) была изобретена ещё в 1970-х годах для компьютеров Xerox Alto. - В Windows 10 и 11 GDI продолжает работать в фоновом режиме, даже если приложение использует Direct2D — через слой совместимости DWM.
- Название «GDI» иногда путают с «GDI+», хотя это разные API, причём GDI+ является надстройкой, а не заменой.
Источники
- Microsoft Developer Network (MSDN): «Graphics Device Interface (GDI)» (документация Windows API).
- Charles Petzold, «Programming Windows» (5-е издание, 1998).
- Feng Yuan, «Windows Graphics Programming: Win32 GDI and DirectDraw» (2000).
- Microsoft Docs: «GDI vs. Direct2D» (статья о сравнении API).
- История Windows: официальная документация Microsoft по эволюции графической подсистемы.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →