# Bit blit

Bit blit (também BITBLT, BIT BLT, BitBLT, Bit BLT, Bit Blt, blitting, etc., de "bit block transfer", "Transferência de blocos em bit") é uma técnica de operação de dados normalmente usada em Computação gráfica onde vários bitmaps são combinados em um através da função booleana.

## Descrição

A operação envolve ao menos dois bitmaps, uma fonte e destino, possivelmente um terceiro chamado de "máscara" e, às vezes, o quarto usado para criar um Estêncil. Os pixels de cada um são combinados bit a bit de acordo com a ROP (do inglês "raster operation, "operação de raster") especificada e o resultado é escrito ao destino. A ROP é essencialmente uma fórmula booleana. A operação ROP mais óbvia substitui o destino com a fonte. Outras ROPs podem incluir operações AND, OR, XOR, and NOT. O chipset de gráficos do sistema Commodore Amiga (and others) poderia combinar três bitmaps de fonte qualquer uma das 256 possíveis Função booleanas com três entradas.

## Origens

O nome deriva da instrução "BitBLT" para o computador Xerox Alto. O nome deriva do inglês "bit-boundary block transfer". Os programadores Dan Ingalls, Larry Tesler, Bob Sproull, e Diana Merry programaram esta operação em novembro de 1975 para sistema Smalltalk-72 enquanto estiveram na empresa Xerox PARC. Dan Ingalls posteriormente implementou uma versão redesenhada em microcóddigo.
O desenvolvimento de métodos rápidos para várias operações BitBLT deu ímpeto à evolução de monitores de computadores, desde o uso do modo texto até o uso de gráficos de bitmap para tudo. Máquinas que dependem muito do desempenho de gráficos 2D (como consoles de videogame) geralmente possuem circuitos para fins especiais chamados de blitter.

## Exemplo de uso da técnica

Um uso clássico para a técnica é renderizar sprites transparentes sobre um fundo. Neste exemplo, uma imagem de fundo, um sprite, e uma máscara de recorte de 1-bit são usados. Assim que a máscara possui 1-bit de cor, não há possibilidade de transparência parcial através de alpha blending.
Um ciclo que examina cada bit na máscara (e que copia o pixel do sprite somente se a máscara estiver configurada) será muito mais lenta que o hardware que pode aplicar exatamente a mesma operação a cada pixel. Em vez disso, um blit de máscara pode ser implementado com duas operações regulares do BitBlit usando as operações em raster de AND e OR.
| Imagem de fundo | Sprite (à esquerda) e a máscara (à direita) |
O sprite é projetado em várias posições sobre a imagem de fundo, dando resultado à imagem a seguir:
* Resultado esperado

### Técnica

Ao preparar o sprite, as cores são muito importantes. Os valores de píxeis de máscara são 0 (preto) onde o pixel correspondente do sprite deve ser exibido, e são 1 (branco) onde o fundo precisa ser preservado. O sprite deve ser 0 (preto) em qualquer lugar em que deva ser transparente, mas observe que o preto pode ser usado em regiões não transparentes.
Na primeira parte, a máscara é moldada no fundo usando o operador raster AND. Devido a qualquer valor AND combinado com 0 igual a 0, e qualquer valor AND combinado com 1 é inalterado, são criadas áreas pretas onde os sprites reais aparecerão, enquanto o resto do plano de fundo é preservado.
* Moldagem da máscara
Na segunda parte, o sprite é transferido no fundo recém-alterado pela máscara usando o operador raster OR. Devido a qualquer valor OR combinado com 0 permanentemente é inalterado, o fundo não é afetado e as áreas pretas são preenchidas com a imagem de sprite real.
* Resultado final
Também é possível obter o mesmo efeito usando um sprite com fundo branco e uma máscara branca sobre preto. Nesse caso, a máscara seria operada em OR antes e posteriormente o sprite operado em AND.

## Comparação aos sprites de hardware

A técnica de blitting é semelhante à geração de sprite de hardware, pois ambos os sistemas reproduzem um molde, geralmente uma área quadrada, em diferentes locais da tela. Sprites de hardware têm a vantagem de serem armazenados em memória separada e, portanto, não alteram a memória principal da tela. Isso significa que eles se movem sobre o "plano de fundo" (cenário) sem alterar sua imagem.
A técnica de blitting move os mesmos tipos de moldes na tela, porém move ao escrever na mesma memória e no restante da tela. Isso significa que a tela de "abaixo" é substituída ou "danificada" toda vez que o molde é colocado sobre ela. Cabe ao software consertar esse dano através de blitting em dobro, uma vez para remover o dano e, em seguida, novamente para colocar o bit em seu novo local. No entanto, existem várias maneiras de otimizar isso. Se grandes áreas da tela forem ocupadas pelos moldes, pode ser mais eficiente mesclar o plano de fundo com a tela em vez de apagar cada molde individualmente. Uma variação envolve dividir a tela em segmentos e apagar apenas os segmentos onde os moldes foram desenhados. Essa técnica é conhecida como retângulos sujos.
Como se pode imaginar, isso torna a técnica significativamente mais lenta que a manipulação de sprites. No entanto, possui uma grande vantagem: não há limite físico de número e tamanho de seus moldes. Assim, o blitting pode ser usado para exibir qualquer coisa na tela, incluindo a simulação de sprites (através de moldes de programação dupla mencionado acima) ou até mesmo um texto.