stringtranslate.com

Dibujo rápido

QuickDraw era la biblioteca de gráficos 2D y la interfaz de programación de aplicaciones (API) asociada que es una parte central del sistema operativo clásico Mac . Fue escrito inicialmente por Bill Atkinson y Andy Hertzfeld . [1] QuickDraw todavía existía como parte de las bibliotecas de macOS , pero había sido reemplazado en gran medida por el sistema de gráficos Quartz más moderno. En Mac OS X Tiger , QuickDraw ha quedado oficialmente obsoleto . En Mac OS X Leopard, las aplicaciones que usan QuickDraw no pueden hacer uso del soporte de 64 bits agregado. En OS X Mountain Lion , se eliminó el soporte de encabezado de QuickDraw del sistema operativo. Las aplicaciones que usan QuickDraw todavía se ejecutan en OS X Mountain Lion hasta macOS High Sierra; sin embargo, las versiones actuales de Xcode y el SDK de macOS no contienen los archivos de encabezado para compilar dichos programas.

Principios de QuickDraw

QuickDraw se basó en LisaGraf de Apple de principios de los años 80 y fue diseñado para adaptarse bien a las interfaces basadas en Pascal y los entornos de desarrollo de los primeros sistemas de Apple . Además, QuickDraw era un sistema de gráficos rasterizados , que define el píxel como su unidad básica de información gráfica. Esto contrasta con los sistemas de gráficos vectoriales , donde los primitivos gráficos se definen en términos matemáticos y se rasterizan según sea necesario para la resolución de la pantalla. Sin embargo, un sistema rasterizado requiere mucho menos poder de procesamiento y era el paradigma predominante en el momento en que se desarrolló QuickDraw.

QuickDraw definió una estructura de datos clave, el puerto de gráficos o GrafPort. Se trataba de un área de dibujo lógica donde se podían dibujar gráficos. El "objeto" en pantalla más obvio correspondiente a un GrafPort era una ventana , pero la vista completa del escritorio podía ser un GrafPort y también podían existir puertos fuera de la pantalla.

GrafPort definía un sistema de coordenadas . En QuickDraw, este tenía una resolución de 16 bits , lo que daba 65.536 posiciones verticales y horizontales únicas. Estas posiciones están numeradas desde -32.767 en el extremo izquierdo (o superior) hasta +32.767 en el extremo derecho (o inferior). Una ventana se configuraba normalmente de forma que la esquina superior izquierda de su área de contenido se encontraba en 0,0 en el GrafPort asociado. El área de contenido de una ventana no incluía el marco de la ventana, la sombra paralela o la barra de título (si la había).

Las coordenadas de QuickDraw se referían a las líneas infinitamente delgadas entre las ubicaciones de los píxeles . Se dibujaba un píxel real en el espacio inmediatamente a la derecha y debajo de la coordenada. Esto facilitaba que los programadores evitaran fallas gráficas causadas por errores de un dígito .

En Macintosh, los píxeles eran cuadrados y un GrafPort tenía una resolución predeterminada de 72 píxeles por pulgada, elegida para coincidir con las convenciones establecidas por la industria de la impresión de tener 72 puntos por pulgada.

QuickDraw también contiene una serie de funciones de escala y mapeo.

QuickDraw mantenía una serie de variables globales por proceso, siendo la principal de ellas el puerto actual. Esto simplificó originalmente la API, ya que todas las operaciones pertenecían al "puerto actual", pero a medida que el sistema operativo se desarrolló, este uso del estado global también hizo que QuickDraw fuera mucho más difícil de integrar con los enfoques de diseño modernos, como el multihilo y la multitarea preventiva . Para abordar estos problemas, la API Carbon (un puente entre Mac OS 9 y Mac OS X) agregó parámetros adicionales a algunas de las rutinas, lo que permitió el almacenamiento (opaco) de información de los subprocesos y una nueva estructura de eventos (no sondeada).

Primitivas gráficas

Todo lo que se ve en una pantalla clásica de Mac OS está dibujado por QuickDraw, pero la biblioteca en sí es de un nivel bastante bajo. Los objetos primitivos que puede dibujar son:

Cada uno de estos objetos (excepto el texto) se puede dibujar con un "lápiz", que puede tener cualquier dimensión rectangular, patrón o color. Tenga en cuenta que, debido a que el lápiz es rectangular y está alineado con el eje, las líneas diagonales terminarán siendo más gruesas que las horizontales o verticales. Las formas se pueden dibujar rellenas o enmarcadas, utilizando cualquier patrón o color. Un arco relleno forma una cuña. El texto se puede dibujar en cualquier fuente instalada, en una variedad de variaciones estilísticas y en cualquier tamaño y color. Dependiendo de cómo se almacene la fuente seleccionada, el texto se puede escalar de varias maneras: las fuentes TrueType se escalarán suavemente a cualquier tamaño, mientras que las fuentes de mapa de bits no suelen escalar bien.

Una característica importante de QuickDraw era el soporte para modos de transferencia , que determinaban cómo se relacionaba un valor de píxel de destino con su valor anterior y el color del objeto que se estaba dibujando.

El conjunto de atributos del lápiz y del dibujo de texto están asociados a GrafPort.

Las regiones son una estructura de datos clave en QuickDraw. Definen un conjunto arbitrario de píxeles, como un mapa de bits, pero en una forma comprimida que se puede manipular muy rápidamente de formas complejas. Las regiones se pueden combinar (unión), restar (diferencia) y aplicarles una operación XOR para formar otras regiones. Se pueden usar dentro de un GrafPort para recortar , o dibujarlas rellenas o enmarcadas como cualquier otra forma. Se puede combinar una serie de formas enmarcadas y líneas conectadas en una región. Una región no necesita constar de un conjunto contiguo de píxeles: las regiones desconectadas son posibles y comunes. Aunque las regiones podrían permitir manipulaciones gráficas potentes, están limitadas por la implementación actual que restringe el tamaño máximo de almacenamiento de datos de la región a un valor de dieciséis bits y, por lo tanto, no son prácticas como herramienta de composición de dibujos de propósito general y el uso práctico a alta resolución también está restringido. Las regiones sustentan el resto de QuickDraw, permitiendo el recorte de formas arbitrarias, esencial para la implementación de múltiples ventanas superpuestas. Inventadas por Bill Atkinson, las regiones fueron patentadas como una invención separada por Apple.[1]

Una región se especifica (después de la creación inicial) mediante la apertura de la región, el dibujo de varias formas de QuickDraw y el cierre de la región. Las rutinas ocultas construyen la región a medida que se ejecutan los comandos de QuickDraw. Los mapas de bits también se pueden convertir en regiones y se pueden crear mapas de bits a partir de regiones "pintando" o "rellenando" la región en un puerto de gráficos.

La estructura interna de una región, aparte de la longitud de almacenamiento y su rectángulo delimitador, es opaca (no hay documentos publicados por Apple disponibles, aunque el mecanismo se describe en la patente). Las regiones se implementan utilizando compresión vertical y horizontal . Una región se almacena como una serie de líneas de exploración horizontales (" rásteres "), cada una de las cuales contiene una coordenada vertical seguida de una lista de coordenadas de inversión horizontales. Cada punto de inversión puede considerarse como una alternancia de inclusión en la región para todos los puntos posteriores: el primer punto activa la región, el segundo la desactiva, y así sucesivamente. Se logra una mayor compresión almacenando cada línea de forma diferencial: cada línea contiene solo las diferencias con la línea anterior en lugar de un conjunto completo de puntos de inversión. Finalmente, las líneas de exploración adyacentes idénticas se codifican de manera eficiente simplemente omitiéndolas. De esta manera, una región de uso común, el rectángulo de esquinas redondeadas, se codifica de manera eficiente y se pueden realizar operaciones complejas como la composición de la región y el recorte de imágenes sin requerir ciclos de procesador extensos o grandes cantidades de memoria. (Los sistemas originales que ejecutaban el código QuickDraw utilizaban procesadores que operaban a velocidades de reloj de 8 megahercios y los sistemas tenían solo 128 kilobytes de memoria escribible).

Debido a que las regiones están ligadas a una orientación específica, una rotación de noventa grados de una región requeriría tanto una ingeniería inversa detallada de la estructura como una codificación extensa. Una rotación general es poco práctica en comparación con rotar la descripción del límite de la fuente original y simplemente crear una nueva región. Sin embargo, la API incluye rutinas de conversión hacia y desde mapas de bits. (Los mapas de bits también se pueden rotar utilizando métodos bien conocidos, pero con diversos grados de degradación de la imagen según el ángulo elegido, los ciclos de almacenamiento y procesador disponibles para la operación y la complejidad del algoritmo).

Apple ha definido recientemente (en la API Carbon ) las regiones como una estructura opaca bajo algunas opciones de compilación de programas.

Operaciones de nivel superior

Cualquier serie de llamadas de gráficos a QuickDraw se puede grabar en una estructura llamada Imagen . Esta se puede guardar en la memoria y "reproducir" en cualquier momento, reproduciendo la secuencia de gráficos. En el momento de la reproducción, la imagen se puede colocar en nuevas coordenadas o escalar sin la pérdida de resolución que se encuentra comúnmente en el escalado de mapas de bits. Una imagen se puede guardar en el disco en la forma en que define el formato PICT de Apple .

Se puede copiar un mapa de bits (o PixMap, si se hace referencia a imágenes en color) completo de un GrafPort a otro, con escala y recorte. Esta operación, conocida como blitting o CopyBits (por el nombre de la función), es la base de la mayoría de las animaciones y efectos similares a sprites en Mac.

QuickDraw proporciona una función de desplazamiento similar que está diseñada para implementar el desplazamiento dentro de un GrafPort: la imagen en el puerto se puede desplazar a una nueva ubicación sin escalar (pero con recorte si se desea).

Cada operación primitiva de gráficos se vectoriza a través de StdProcs, una serie de punteros de función almacenados en GrafPort. Este polimorfismo limitado permite que las operaciones individuales se anulen o reemplacen por funciones personalizadas, lo que permite que los controladores de impresora intercepten los comandos de gráficos y los traduzcan a operaciones de impresora adecuadas. De esta manera, QuickDraw se puede renderizar utilizando PostScript , un hecho que permitió a Macintosh inventar prácticamente la autoedición .

De manera similar a una subclase , la estructura de datos de la ventana comenzaba con el GrafPort asociado, lo que básicamente hacía que las ventanas fueran intercambiables con cualquier GrafPort. Si bien esto era conveniente, facilitaba la escritura de código erróneo que pasaba un puerto de gráficos fuera de la pantalla a una API que esperaba una ventana completa.

Historia

QuickDraw comenzó como Lisa Graf como parte del desarrollo de Apple Lisa . Para Macintosh, inicialmente se simplificó, pero luego se amplió. Originalmente, QuickDraw GrafPorts solo admitía una profundidad de bits de 1, es decir, un bit por píxel, o blanco y negro. Esto se adaptaba a la pantalla incorporada de los primeros Macintosh, con su tamaño fijo de 512 × 342 píxeles. Se admitía un color limitado mediante un modelo plano rudimentario , lo que permitía a QuickDraw controlar algunos tipos de impresoras matriciales que utilizaban cintas multicolores, pero muy pocas aplicaciones admitían esta función.

En 1987, se lanzó el Macintosh II , que fue diseñado como un diseño de tres cajas más convencional: computadora , monitor y teclado, todos separados. Debido a que el monitor estaba separado y era más grande que el Mac original, la arquitectura de video tuvo que cambiar necesariamente. Además, el Mac II llevó al Macintosh del blanco y negro al color completo. Apple también decidió en este momento admitir un escritorio sin costuras que abarcara varios monitores, una novedad en la industria. Por lo tanto, se creó Color QuickDraw, una extensión significativa del QuickDraw original. En ese momento, Bill Atkinson estaba ocupado con HyperCard , por lo que el trabajo de Color QuickDraw lo realizó Ernie Beernink (que entonces todavía tenía 23 años): [2] Dave Allen de Apple también le dio crédito a Dave Fung. [3] La arquitectura original carecía de muchas disposiciones para la capacidad de expansión, pero utilizando una serie de trucos , los desarrolladores de Apple lograron hacer que la adición de color y la nueva arquitectura de video fueran prácticamente perfectas tanto para los desarrolladores como para los usuarios finales.

Color QuickDraw introdujo nuevas estructuras de datos, incluyendo GDevices para representar cada tarjeta de video/monitor conectado, y una nueva estructura de color GrafPort (CGrafPort) para manejar el color, así como PixMaps en lugar de BitMaps para imágenes de múltiples bits por píxel. Uno de los trucos para la compatibilidad utilizados aquí fue que la nueva estructura era exactamente del mismo tamaño que la anterior, con la mayoría de los miembros de datos en el mismo lugar, pero con controladores y punteros adicionales a estructuras de color en lugar de los campos BitMap. Los dos bits superiores del campo rowBytes se usaron como indicadores para distinguir un GrafPort de un CGrafPort (siempre eran cero en los GrafPorts de estilo antiguo porque un BitMap nunca podría ser tan ancho como para establecer estos bits). El uso de estos dos bits altos volvería a atormentar a QuickDraw más tarde, ya que forzaba un ancho de fila máximo de solo 4095 en PixMaps de 32 bits, lo que se volvió problemático para el trabajo de gráficos de alta resolución. Los desarrollos posteriores (Mac OS 8.5/Carbon) eliminaron esta limitación, pero no eran totalmente compatibles con versiones anteriores. También se agregó un administrador de paletas en Color QuickDraw que administraba el arbitraje de colores en dispositivos de video indexados. La mayoría de las operaciones de primitivas gráficas permanecieron sin cambios (pero funcionarían en color) o se agregaron nuevas versiones en color de las API de blanco y negro.

Inicialmente, Color QuickDraw sólo era capaz de funcionar con tarjetas de vídeo de 1, 2, 4 y 8 bits, que eran las únicas disponibles en ese momento. Sin embargo, poco después aparecieron las tarjetas de vídeo de 24 bits (el llamado color verdadero), y QuickDraw se actualizó de nuevo para admitir hasta 32 bits por píxel (en realidad, 24 bits, con 8 sin usar) de datos de color ("32-Bit QuickDraw"). Sin embargo, la arquitectura siempre lo permitió, por lo que no fueron necesarias nuevas API. Las propias estructuras de datos de color permitían una profundidad de color de 1, 2, 4, 8, 15 y 24 bits, lo que daba como resultado 2, 4, 16, 256, 32.768 y 16.777.216 colores respectivamente, o 4, 16 y 256 escalas de grises. QuickDraw se encargó de gestionar el remuestreo de colores a las profundidades de color disponibles del hardware de vídeo real, o la transferencia entre búferes de imágenes fuera de pantalla, incluyendo la opción de dithering de imágenes a una profundidad menor para mejorar la calidad de la imagen. También se añadió un conjunto de utilidades de muestreo de color para que los programadores pudieran generar paletas de colores óptimas para su uso con dispositivos de vídeo indexados.

La arquitectura de QuickDraw siempre había permitido la creación de GrafPorts y sus BitMaps o PixMaps asociados "fuera de pantalla", donde los gráficos podían ser compuestos en memoria sin que fueran visibles inmediatamente en la pantalla. Los píxeles podían ser transferidos entre estos puertos fuera de pantalla y la pantalla usando la función de blitting de QuickDraw CopyBits. Esta composición fuera de pantalla es la herramienta básica para juegos y aplicaciones con uso intensivo de gráficos. Sin embargo, hasta la llegada de QuickDraw de 32 bits, estos mundos fuera de pantalla tenían que ser creados y configurados a mano por los programadores dentro de sus aplicaciones. Esto podía ser propenso a errores, ya que involucraba tres o más estructuras de datos separadas y bastante complejas (CGrafPort, PixMap y GDevice, y para dispositivos indexados, la tabla de búsqueda de colores y su inversa). Con QuickDraw de 32 bits, se agregó soporte del sistema operativo para manejar esto, con el "Mundo de gráficos fuera de pantalla" o GWorld. El búfer de video (PixMap) de un GWorld podría almacenarse en la memoria principal o, cuando esté disponible, en partes no utilizadas de la RAM de video donde la copia a la pantalla podría optimizarse para lograr mayor velocidad al evitar la necesidad de transferir una gran cantidad de datos de píxeles a través del bus de memoria principal.

Con la llegada de QuickTime , QuickDraw obtuvo la capacidad de trabajar con datos raster comprimidos, como JPEG . El QuickTime Image Compression Manager se integró estrechamente con QuickDraw: en particular, las llamadas de descompresión de imágenes eran llamadas de dibujo QuickDraw completas y, si se estaba grabando una imagen, los datos comprimidos se guardarían como parte de la imagen para mostrarlos cuando se dibujara la imagen más tarde. El Image Compression Manager también agregó integración con la combinación de colores ColorSync .

Después de esto, aparte de los cambios de back-end para optimizar las nuevas arquitecturas de procesador ( PowerPC ), QuickDraw permaneció prácticamente sin cambios durante el resto de la vida del sistema operativo Mac clásico. QuickDraw GX y QuickDraw 3D compartían el nombre QuickDraw y podían interoperar con QuickDraw PixMap y las estructuras de datos de imágenes, pero por lo demás eran completamente independientes en cuanto a funcionalidad.

Con Mac OS X, QuickDraw pasó a formar parte de Carbon API . En 2005, con el lanzamiento de Mac OS X 10.4, QuickDraw quedó oficialmente obsoleto.

En 2010, con la publicación del código fuente de MacPaint 1.3 a través del Computer History Museum , [4] también estuvo disponible una versión histórica del código fuente de QuickDraw. [5]

Véase también

Referencias

  1. ^ "Folklore: -2000 líneas de código". folklore.org .
  2. ^ Levy, Steven (mayo de 1987). "The Making of the Macintosh II". Macworld . San Francisco: PCW Communications. pp. 55–63. ISSN  0741-8647 . Consultado el 31 de julio de 2024 . p. 60: Un joven de 23 años llamado Ernie Beernik [sic] rediseñó brillantemente las rutinas gráficas de QuickDraw para acomodar el color.
  3. ^ Allen, Dan (verano de 1988). "Introducción a la programación de HyperCard". Dr. Dobb's Macintosh Special . págs. 56–74. ISSN  1044-789X . Consultado el 2 de agosto de 2024 . pág. 64: Sin embargo, Bill no participó en Color QuickDraw, que se encuentra en Mac II, porque estaba involucrado en HyperCard en ese momento. Ernie Beernink y Dave Fung hicieron Color QuickDraw.
  4. ^ "Código fuente de MacPaint y QuickDraw". Museo de Historia de la Computación . 20 de julio de 2010.
  5. ^ Hesseldahl, Erik (20 de julio de 2010). "Apple dona el código fuente de MacPaint al Museo de Historia de la Computación". businessweek.com. Archivado desde el original el 9 de febrero de 2012. Consultado el 23 de agosto de 2014 .

Enlaces externos