        |
Carteles M&P: Formato ficheros ._pg y .gmp
Formato ficheros comprimidos ._pg de los carteles M&P
NOTA: estas especificaciones son para los carteles de 160x42, rojo-verde-amarillo
El cartel está configurado como stripes (tiras) de 64 píxeles en horizontal y 7 píxeles en vertical. Dentro de la información de la imagen, se consideran que los stripes están todos seguidos, quedando 160x6=960 columnas a codificar.
Para una columna, se especifica el color de cada píxel usando una tupla (rojo,verde), es decir, un byte para el plano rojo y otro para el plano verde.
Dentro de un byte de la tupla de información de color, se usan sólo los bits 0..6 (quedando el bit7 siempre a cero), y el bit alto (bit6) es el que queda arriba de la columna. Es decir, en un plano:
+----+----+----
|bit6| |
|bit5| |
|bit4| |
|bit3|....|....
|bit2| |
|bit1| |
|bit0| |
+----+----+----
^ ^
\ \__byte1
\__byte0
El formato general del fichero es:
Cabecera+fotograma0+fotograma1+...
Cabecera
Los números son shorts en little-endian (2bytes, primero el byte de menor peso, es decir, formato x86).
En el siguiente texto, "header" se refiere al offset de la cabecera en el fichero, es decir, 0x0000.
32 bytes, todos a cero excepto los siguientes:
header+ 0: filetype (0x200 es ._pg)
header+ 6: width (p.ej. 160)
header+ 8: height (p.ej. 48 para los carteles de 42 píxeles en vertical)
header+10: frames (número de fotogramas, p.ej. 1)
header+14: planes (para imágenes en color es 2, primero el plano rojo y luego el plano verde)
header+16: timing (p.ej. 0x204, el byte alto es siempre 0x02, el bajo es el número de fotogramas por segundo (fps))
Ejemplo de cabecera:
00000000 00 02 00 00 00 00 a0 00 30 00 01 00 00 00 02 00 |........0.......|
00000010 04 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
Datos de los fotogramas
Un fotograma tiene dos partes: DICCIONARIO y DATA.
Diccionario
El diccionario se compone de un carácter que indica el número de entradas del diccionario (0 a 4), seguido de las tuplas (rojo,verde) para cada uno de los elementos del diccionario, p.ej:
00000020 02 7f 7f 7e 7e |...~~ |
En este caso sería que hay dos entradas de diccionario, siendo dict[0]=(7f,7f) y dict[1]=(7e,7e)
Data
La imagen va codificada usando opcodes. Dentro de los datos, primero va el byte del opcode y luego los 'n' bytes de parámetros.
El opcode son los bits 6 y 7 del byte de opcode.
OPCODE-11: 'n' columnas iguales
Formato:
| 1 1 n n | n n n n | 0 r r r r r r r | 0 v v v v v v v |
+-------------------+-----------------+-----------------+
Opcode Contador rojo verde
<code>
Comportamiento:
- Se inicializan contador+1 columnas a la tupla (rojo,verde) especificada
Ejemplo:
<code>
ff 7f 7f
opcode: 11
count: 63
tupla (7f,7f)
Poner 64 (63+1) columnas con todos los píxeles a amarillo (todos los bits de rojo y de verde encendidos)
OPCODE-10: 'n' columnas transparentes
Formato:
| 1 0 n n | n n n n |
+-------------------+
Opcode Contador
<code>
Comportamiento:
- Se "saltan" contador+1 columnas (se dejan con el color que tenían en el anterior fotograma, o negro si es el primer fotograma de la secuencia)
Ejemplo:
<code>
bf
opcode: 10
count: 63
Poner 64 (63+1) columnas a transparente (no se modifica el color que tenían anteriormente, negro si es el primer fotograma)
OPCODE-00: 'n' columnas de datos "raw"
Formato:
| 0 0 n n | n n n n | 0 r r r r r r r | 0 v v v v v v v | 0 r r r r r r r | 0 v v v v v v v |...
+-------------------+-----------------+-----------------+-----------------+-----------------+
Opcode Contador rojo0 verde0 rojo1 verde1 ...
<code>
Comportamiento:
- Se inicializan contador+1 columnas a las tuplas especificadas (rojo,verde)
Ejemplo:
<code>
00 7f 7f
opcode: 00
count: 1 (0+1)
tupla (7f,7f)
Poner 1 columna con todos los píxeles a amarillo (todos los bits de rojo y de verde encendidos)
Ejemplo:
02 7f 7f 2f 00 76 10
opcode: 00
count: 3 (2+1)
tuplas (7f,7f) (2f,00) (76,10)
Poner 3 columnas con las tuplas especificadas
OPCODE-01: 'n' columnas con una tupla del diccionario
Formato:
| 0 1 d d | n n n n |
+-------------------+
\ \ \______ contador
\ \
\ \____________ entrada del diccionario
\
\______________ opcode
<code>
Comportamiento:
- Se escriben contador+1 columnas con la tupla del diccionario especificada por dict[dd].
Ejemplo:
<code>
4a
opcode: 01
dictelem: 0
count: 11 (10+1)
Poner 11 (10+1) columnas a la tupla de color especificada en dict[0].
Formato ficheros comprimidos .gmp de los carteles M&P
Es igual que en los ._pg, salvo que en la cabecera los dos primeros bytes son 00 00 (al contrario que en _pg que son 00 02). Además, el diccionario en principio está vacío (el número de entradas es 00).
|