Что такое графический контекст? - PullRequest
8 голосов
/ 25 июля 2011

Что точно инкапсулируется графическим контекстом (или контекстом устройства в Windows)?

Различные определения в сети согласны с тем, что контекст инкапсулирует параметры для различных графических операций. См .: X11 , Mac OS , Windows

Что не ясно, так это то, что контекст также инкапсулирует буфер памяти , над которым выполняются графические операции.

В записи X11 есть упоминание об отдельных Drawable объектах, Window и Pixmap, которые представляют поверхности рисования. Если пойти немного дальше, то в документации OpenGL GLX есть четкое разделение между Контекстами рендеринга и Рисование поверхностей . Интересно также, что «приложения могут визуализировать в одну и ту же поверхность, используя разные контексты» , и что «также возможно использовать один контекст для визуализации в несколько поверхностей» .

Ответы [ 3 ]

4 голосов
/ 25 июля 2011

Если обратиться конкретно к контексту устройства Windows, ответ на основной вопрос, который вы задаете, кажется «да и нет».

Контекст устройства в основном создает режим, в котором будет выполняться рисование -- т.е. в любой момент времени у него будут текущие настройки для таких вещей, как:

  1. Цвет фона
  2. Цвет переднего плана
  3. Ширина линии
  4. шаблон линии
  5. шрифт

(и так далее для еще нескольких вещей).

Теперь, насколько есть поверхность для рисования: да,Я считаю, что к каждому контексту устройства всегда прикреплена поверхность для рисования.В общем случае контекста устройства для окна эта поверхность рисования будет частью экранного буфера, в котором отображается окно.В случае «совместимого» контекста устройства (например, результат CreateCompatibleDC) это будет довольно бесполезная поверхность для рисования - в частности, это один монохромный пиксель.Он будет установлен либо на черный, либо на белый, в зависимости от того, превышает ли общий уровень яркости того, что вы рисуете на DC, определенный порог или нет (и нет, точный порог я не помню точно).

Это имеет (своего рода) полезное назначение, хотя: в частности, это означает, что DC всегда «пригоден для использования» - никогда не бывает ситуации, в которой отрисовка в DC будет неудачной только потому, что естьнет рисунка поверхности прилагается.В помощь этому нет функции DeselectObject - вы можете использовать SelectObject, чтобы выбрать другое растровое изображение в контексте устройства (которое также будет удалять исходный), но нет способаотмените выбор одного растрового изображения из контекста устройства, не выбирая другое в нем - так что к всегда прикреплена поверхность рисования.

В то же время поверхность рисования по умолчанию для совместимого контекста устройства имеет виднастолько близко к бесполезному, что это почти считается отсутствием прикрепленной к поверхности рисования.

Редактировать: Я должен также добавить, что поверхность рисования по умолчанию, выбранная в контексте совместимого устройства, является источником многих проблем,В частности, когда вы создаете совместимый DC для рисования с двойной буферизацией, вы должны сделать что-то вроде этого:

DC memDC = CreateCompatibleDC(windowDC);
BITMAP bmp = CreateCompatibleBitmap(WindowDC, sizeX, sizeY);
SelectObject(memDC, bmp);

Если, однако, вы слегка облажаетесь и делаете это вместо этого:

DC memDC = CreateCompatibleDC(windowDC);
BITMAP bmp = CreateCompatibleBitmap(memDC, sizeX, sizeY);
SelectObject(memDC, bmp);

... все будет успешно, и в какой-то степени все будет работать - за исключением того, что все, что вы рисуете через совместимый DC, будет монохромным.Это восходит к этому однопиксельному монохромному растровому изображению.Поскольку для совместимого DC по умолчанию выбран монохромный рисунок, при запросе совместимого изображения вы получите монохромный рисунок указанного размера.В первой версии вы запрашиваете растровое изображение, совместимое с растровым изображением, выбранным в исходном DC, который обычно будет экраном, поэтому то, что вы создаете, будет иметь полный цвет, для которого установлен экран.

3 голосов
/ 25 июля 2011

ГХ X11 не содержит буфера памяти, и Drawable, и GC передаются во все операции рисования, и GC можно использовать со всеми «похожими» Drawables (drawables на одном экране с одинаковой битовой глубиной ).

Однако в наши дни рисование в X11 обычно выполняется на стороне клиента с использованием такой библиотеки, как Cairo, поэтому «реальный» ответ зависит от этой библиотеки. В случае Каира контекст Каира включает текущую поверхность цели, хотя вы можете изменить поверхность цели.

OpenGL также имеет концепцию «текущей цели», хотя вы также можете изменить текущую цель.

Если вы хотите обобщить, я бы сказал, что концептуально контекст отделен от буфера, хотя для сохранения при наборе текста у людей может быть текущий буфер, который вы можете установить в контексте.

1 голос
/ 25 июля 2011

Не уверен насчет других платформ, но в Windows Контекст устройства (или DC) - это просто непрозрачный указатель. Внутренняя структура поддерживается GDI и содержит информацию о материалах, выводимых на экран.

Чтобы управлять нарисованными объектами, вы передаете этот непрозрачный указатель (или Handle ) функциям GDI. Это то же самое, что и HWND , которые управляют атрибутами окна, за исключением HDC , управляющего графикой.

...