# Bit blit

En computación gráfica, BIT BLIT (bitblt, blitting, etc) es una primitiva gráfica consistente en que dos mapas de bit son combinados en uno. Se trata de una de las primitivas gráficas más básicas y por tanto más utilizadas en gráficos 2D. La mayoría de las tarjetas de vídeo la implementan en hardware (es una de la muchas operaciones de las que se encarga la GPU).

## Orígenes

El nombre deriva de la instrucción BitBLT (bit block transfer, transferencia de bloque de bits) del ordenador Xerox Alto. Esta operación fue creada por Diana Merry en Xerox PARC para el sistema Smalltalk-72. Para el sistema Smalltalk-74, Dan Ingalls implementó una versión rediseñada en microcódigo.
El desarrollo de métodos rápidos para varias operaciones bit blit fue la clave en la evolución de visualizaciones en ordenadores desde el uso de gráficos de caracteres, hasta el uso de gráficos de mapas de bit para todo. Las máquinas que necesitaban especial rendimiento de gráficos 2D (como las consolas de videojuegos) venían con un chip especializado llamado Blitter.

## Bit Blit, técnicas y usos

Un uso clásico para blitting es renderizar sprites con transparencias sobre un fondo. Por razones de velocidad es normalmente inviable moverse a través de cada pixel y encontrar si esto necesita ser visualizado. Por ejemplo, si tenemos la siguiente imagen de fondo:
y deseamos mostrar varios sprites sobre esta imagen de fondo representando, por ejemplo, objetos de un juego para producir esto:
Lo primero que necesitamos son los mapas de bit para los sprites y las correspondientes máscaras. Los colores tienen mucha importancia ya que el fondo del sprite y el primer plano de la máscara son negros, almacenados como ceros binarios. Los fondos de las máscaras son blancos, almacenados como unos binarios.
El primer blit usa el RasterOp de AND con el fondo y la máscara de los sprites. Debido a que cualquier valor AND con 0 igual a 0, y cualquier valor AND con 1 sin cambios, podemos crear áreas negras donde los sprites actuales aparecerán, y dejarán el resto del fondo sólo.
El segundo blit usa el RasterOp de OR con el fondo modificado y el sprite actual. Debido a algún valor OR con 0 sin cambios, el fondo no será afectado y las áreas negras son ocupadas con la actual imagen del sprite.

## Blitting vs. sprites

La técnica de bliting es similar al dibujo de sprites mediante hardware, en ambos sistemas se reproduce un patrón, típicamente un área cuadrada, en diferentes localizaciones de la pantalla. Los sprites tienen la ventaja de ser alojados en una memoria separada, y por tanto no molesta a la memoria de la visualización principal. Esto les permite ser movidos sobre la visualización, cubriendo el "fondo", sin afectarlo.
La técnica de blitting mueve los mismos tipos de patrones sobre la pantalla, pero escribiendo tanto en la misma memoria como en el resto de la visualización. Esto significa que el patrón se sitúa todo el tiempo "bajo" la pantalla de la visualización (mientras éste es sobreescrito). Éste es alzado hacia el software para encauzarlo mediante blitting de dos maneras, una vez para eliminar "la suciedad", y luego otra vez para emplazar el bit en su nueva localización. Sin embargo, hay varios caminos para optimizar esto. Si grandes áreas de la pantalla son tomadas por los patrones, puede ser más eficiente "blitear" el fondo de la pantalla en lugar de estar borrando cada patrón individualmente. La variación supone dividir la pantalla en segmentos y borrar únicamente los segmentos donde los patrones han sido dibujados. Esta técnica es conocida como ensuciado de rectángulos.
Como uno podría imaginar, todo esto hace que la técnica de blitting sea significativamente más lenta que la manipulación de sprites. Sin embargo el blitting tiene una gran ventaja, no está limitado físicamente al número de patrones que se puedan "blitear", o al tamaño de los patrones. Se puede usar blitting para mostrar cualquier cosa en la pantalla, incluyendo simulación de sprites (a través de un patrón de doble escritura), o un evento de texto.