¿Qué es exactamente un contexto gráfico?
opengl gdi (3)
¿Qué es exactamente encapsulado por un Contexto Gráfico (o Contexto del Dispositivo en Windows)?
Las diversas definiciones en la red coinciden en que un contexto encapsula los parámetros para las diversas operaciones de gráficos. Ver: X11 , Mac OS , Windows
Lo que no está claro es si un contexto también encapsula el búfer de memoria sobre el cual se realizan las operaciones gráficas.
En la entrada X11 hay una mención sobre objetos Drawable separados, Window y Pixmap, que representan las superficies de dibujo. Yendo un poco más allá, en la documentación de OpenGL GLX , hay una clara separación entre los contextos de renderizado y las superficies de dibujo . Curiosamente, también se dice que "las aplicaciones pueden renderizarse en la misma superficie, utilizando diferentes contextos" y que "también es posible utilizar un único contexto para representar en múltiples superficies" .
No estoy seguro acerca de otras plataformas, pero en Windows, un contexto de dispositivo (o DC) es simplemente un puntero opaco. GDI mantiene la estructura interna y contiene información sobre las cosas que se dibujan en la pantalla.
Para manipular los objetos que se dibujan, pasa este puntero opaco (o Mango ) a las funciones GDI. Esto es lo mismo en concepto que los controladores HWND que administran los atributos de una ventana, excepto que HDC maneja los gráficos.
Si miramos específicamente el contexto de dispositivo de Windows, la respuesta a la pregunta principal que nos hace parece ser "sí y no".
Un contexto de dispositivo básicamente crea un modo en el que se realizará el dibujo, es decir, en un momento dado, tendrá la configuración actual para cosas como:
- Color de fondo
- color de primer plano
- ancho de línea
- patrón de línea
- fuente
(y así sucesivamente por bastantes cosas más).
Ahora, en cuanto a que haya una superficie de dibujo: sí, creo que cada contexto de dispositivo siempre tiene una superficie de dibujo adjunta. En el caso común de un contexto de dispositivo para una ventana, esa superficie de dibujo será la parte del búfer de la pantalla donde se muestra la ventana. En el caso de un contexto de dispositivo "compatible" (p. Ej., Resultado de CreateCompatibleDC), será una superficie de dibujo bastante inútil; específicamente, es un único píxel monocromático. Se configurará en negro o blanco, dependiendo de si el nivel de brillo general de lo que dibuje en el CD excede un determinado umbral o no (y no, de manera improvisada, no recuerdo el umbral exacto).
Sin embargo, esto tiene un (algo) propósito útil: en particular, significa que un DC siempre es "utilizable": nunca hay una situación en la que falle el dibujo de un DC simplemente porque no hay una superficie de dibujo conectada. Como ayuda para mantener esto, no hay función DeselectObject
: puede usar SelectObject
para seleccionar un mapa de bits diferente en el contexto del dispositivo (que también seleccionará el original) pero no hay manera de anular la selección de un mapa de bits del contexto del dispositivo sin seleccionar otro en él - por lo que siempre tiene una superficie de dibujo adjunta.
Al mismo tiempo, la superficie de dibujo predeterminada para un contexto de dispositivo compatible es tan inútil que prácticamente no cuenta con una superficie de dibujo.
Editar: También debo agregar que la superficie de dibujo predeterminada que se selecciona en un contexto de dispositivo compatible es una fuente de bastantes problemas. En particular, cuando está creando un DC compatible para hacer un doble buffer de dibujo, debe hacer algo como esto:
DC memDC = CreateCompatibleDC(windowDC);
BITMAP bmp = CreateCompatibleBitmap(WindowDC, sizeX, sizeY);
SelectObject(memDC, bmp);
Sin embargo, si te equivocas ligeramente y haces esto:
DC memDC = CreateCompatibleDC(windowDC);
BITMAP bmp = CreateCompatibleBitmap(memDC, sizeX, sizeY);
SelectObject(memDC, bmp);
... todo tendrá éxito, y hasta cierto punto, todo funcionará, excepto que todo lo que dibuje a través del CD compatible terminará en monocromo. Esto se remonta a ese mapa de bits monocromo de un píxel. Como el DC compatible tiene un mapa de bits monocromático seleccionado de forma predeterminada, cuando solicite un mapa de bits compatible, obtendrá un mapa de bits monocromático del tamaño especificado. En la primera versión, está solicitando un mapa de bits compatible con el mapa de bits seleccionado en el CD original, que normalmente será la pantalla, por lo que lo que cree tendrá el color completo para el que está configurada su pantalla.
Un X11 GC no contiene el búfer de memoria, tanto el Drawable como el GC se pasan a todas las operaciones de dibujo, y el GC se puede usar con todos los Drawables "similares" (arrastrables en la misma pantalla con la misma profundidad de bits).
Sin embargo, dibujar en X11 en estos días normalmente se hace en el lado del cliente utilizando una biblioteca como El Cairo, por lo que la respuesta "real" depende de esa biblioteca. En el caso de El Cairo, el contexto de El Cairo incluye una superficie objetivo actual, aunque puede cambiar la superficie objetivo.
OpenGL también tiene un tipo de concepto de "objetivo actual", aunque nuevamente puede cambiar el objetivo actual.
Si desea generalizar, diría que conceptualmente un contexto está separado del búfer, aunque para guardar el tipeo las personas pueden tener un búfer actual que puede establecer en el contexto.