¿Cómo funciona Adobe Flash Player?

He escrito un editor para modificar archivos SWF, así que, aunque no puedo decir con precisión cómo funciona el reproductor, tengo una idea decente del formato de archivo.

La mejor manera de conocerlo es consultar la especificación oficial del archivo:

http://www.adobe.com/content/dam…

El formato es antiguo y apenas se mantiene vivo, pero no piense por un momento que hace que sea sencillo trabajar con él. Los desarrolladores estaban muy, muy centrados en la compresión. Todo el archivo está comprimido con zlib (raramente LZMA). La mayoría de las estructuras de datos se ven así:

5 bits: número de bits en los siguientes valores (n)
n bits: x1
n bits: x2
n bits: y1
n bits: y2

No hay un “índice maestro” de recursos. Todo se define justo antes de que sea necesario. Por ejemplo, el cuadro 5 del SWF muestra una imagen. Justo antes del cuadro 5 hay una etiqueta que contiene los píxeles para esa imagen, seguida de una etiqueta que contiene un rectángulo vectorial que usa esos píxeles como textura, luego una etiqueta que indica a Flash que dibuje el rectángulo en un lugar determinado. Las etiquetas de recursos se cargan en una biblioteca a medida que se encuentran, que luego se pueden usar en cuadros posteriores; por ejemplo, el cuadro 6 solo necesitaría la etiqueta de dibujo para mostrar la misma imagen.

Además, hay una gran cantidad de tipos de recursos. Hay formas vectoriales, gráficos de trama, sprites que son esencialmente líneas de tiempo autónomas, múltiples tipos de scripts, fuentes, cuadros de video incrustados, botones, sonidos, transmisión de audio, además de una gran cantidad de hacks inteligentes de terceros como incrustar motores de juegos completos que Permitir que los juegos que no son Flash se ejecuten en una máquina virtual. La mayoría de los tipos están estandarizados; las imágenes ráster usan JPEG, a veces píxeles zlib’d para imágenes sin pérdida, o raramente un archivo PNG o GIF89a incrustado completo. El sonido es casi siempre MP3, rara vez ADPCM, PCM, Nellymoser o Speex. El video usa H.263. Las fuentes pueden ser el formato de vector nativo, TrueType incrustado o cargado desde el sistema host.

Es muy difícil trabajar con el formato vectorial. Para ahorrar espacio, las coordenadas de cada vértice se definen en relación con las coordenadas del vértice anterior. Dependiendo de los indicadores de bits no alineados en el flujo de datos, los vértices pueden especificar líneas rectas (¡con solo una coordenada de eje para líneas horizontales y verticales!) O curvas bézier cuadráticas. También hay instrucciones para mover el lápiz mezclado con los vértices, y mi favorito personal, para definir una “paleta” completamente nueva de líneas y estilos de relleno justo en el medio de dibujar una forma. Los estilos de línea definen el ancho, el color e incluso cómo se dibuja el punto final de una línea. Los rellenos pueden ser colores sólidos, degradados lineales, degradados radiales, degradados focales o varias formas diferentes de representar mapas de bits (texturas).

Los rellenos … son una pesadilla absoluta. La especificación dedica los dos párrafos cortos sobre cómo funcionan, pero la realidad es mucho más complicada. La mayoría de los formatos vectoriales como SVG definen un relleno como el color en el interior de un polígono cerrado. En Flash, dos rellenos están activos en un momento dado. Un relleno es el color en el lado izquierdo de la línea / curva que se dibuja (“izquierdo” es relativo a la línea, no a la pantalla), y el otro es el color en el lado derecho. La dirección en que se dibuja una línea es un detalle importante. Si eso no fuera lo suficientemente malo, los rellenos en Flash no son necesariamente colores sólidos. Me llevó años descubrir cómo funciona realmente.

En cierto modo, Adobe Flash Player es como un sistema operativo autónomo con muchas partes complejas interconectadas. Hay partes que se crearon cuando Internet era una cosa nueva que vendía AOL, y hay partes hechas en los últimos años. Las partes interpretan las etiquetas de un archivo SWF para hacer cosas como dibujar imágenes, reproducir sonidos y reaccionar a la entrada del usuario, al igual que Windows o Linux interpreta las llamadas a la API del software para hacer lo mismo. Describir cómo funciona es como explicar cómo Team Fortress puede funcionar gracias a d3dx10.dll y ws2_32.dll. Hay mucho que entender, que solo se puede entender aprendiendo cómo funciona cada parte.