Hola,
Estoy trabajando en soporte para las fuentes en mi librería BennuLib y me ha surgido una duda:
En el formato de archivo de Fuentes de DIV (ese en el que los tres primeros bytes son FNT), hay una zona de 4 bytes entre la paletta y la sección información de los caracteres.
En los archivos FNT de Bennu (con magic FNX), esos 4 bytes indican la tabla de caracteres (ISO8559-1 o CP850).
Leyendo el código de file_fnt.c (en los sources de PixTudio, supongo igual en Bennu) me da la sensación de que también en DIV se utilizan para lo mismo (creo que en el antiguo manual de DIV1 se explicaba este campo como FontInfo).
Soportaba Div también los dos tipos de tabla de caracteres? O todas las fuentes Div usan CP850?
De file_fnt.c:
/* Read the character data (detect old format) */
if (header[2] == 'x') {
if (!file_readSint32(fp, &types)) {
pal_destroy(pal);
return -1;
}
// ...
} else {
if (!file_readSint32(fp, &types)) {
pal_destroy(pal);
return -1;
}
// ...
}
me suena que DIV solo soportaba CP850... (maldicion, me levante de la silla para ir a buscar los manuales de DIV y no los encuentro! si llego a dar con ellos y esta consulta no esta resuelta, te respondo...)
Yo tengo los manuales de DIV pero en España (y me queda un poco lejos). Pero lo que dices confirma lo que recuerdo. Pero no entiendo para que están esos 4 bytes ahí en los FNT de DIV (creo que a lo mejor pensaron "en el futuro").
yo tampoco me acuerdo...
Según la vieja wiki de fenixworld sobre el fichero FNT de 8bits:
Un fichero FNT comienza con la siguiente cabecera:
Nombre | Tamaño | Descripción |
MAGIC | 3 bytes | Cadena de caracteres de identificación del fichero. Debe contener exactamente "fnt", en minusculas. |
TERMINACION MS-DOS | 4 bytes | A continuación, los cuatro bytes 1Ah, 0Dh, 0Ah y 00h. Esta terminación indica, en un fichero MS-DOS, final de fichero. Gracias a ella un comando TYPE en MS-DOS no mostraría los datos binarios del fichero. |
VERSION | 1 byte | Código de versión. Debido a que no se han introducido cambios en el formato, este valor es siempre 00h. |
[editar (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_FNT&action=edit§ion=3)]Paleta de colores A continuación aparecen 768 bytes con la paleta de colores. Cada color ocupa tres bytes en orden RGB (rojo, verde y azul) y con un rango para cada componente de color de 0 a 63. Seguido aparecerán 576 bytes con información de las gamas, que podran ser ignorados en Fenix (http://fenixworld.se32.com/fenixwiki/index.php?title=Fenix). Para mas información sobre este punto y sobre el formato PAL (http://fenixworld.se32.com/fenixwiki/index.php?title=PAL) en general, visita estos otros dos articulos:
- Formato PAL (http://fenixworld.se32.com/fenixwiki/index.php?title=PAL)
- Especificación del formato PAL (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_PAL)
[editar (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_FNT&action=edit§ion=4)]Informacion de la fuente A continuación, inmediatamente después de la paleta, se guardan 4 bytes que incluyen informacion acerca de los caracteres incluidos en la fuente.
Nombre | Tamaño | Descripción |
GRUPOS DE CARACTERES | DWORD | - +1 - Números
- +2 - Mayúsculas
- +4 - Minúsculas
- +8 - Símbolos
- +16 - Extendidos
|
[editar (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_FNT&action=edit§ion=5)]Descriptores de los caracteres Ahora siguen los descriptores de cada carácter (ASCII 256 letras), con informacion util para interpretar los datos. Por lo tanto nos encontraremos un array de estructuras con 256 elementos, cada uno de los cuales se corresponde con el siguiente formato:
Nombre | Tamaño | Descripción |
ANCHO | DWORD | Ancho en píxels del gráfico del carácter. |
ALTO | DWORD | Alto en píxels del píxels del gráfico. |
DESPLAZAMIENTO VERTICAL | DWORD | Este dato indica cuantos pixeles se desplazará verticalmente el gráfico del caracter sobre la linea base de la cadena de texto. |
DESPLAZAMIENTO DE LOS DATOS | DWORD | Este dato indica la posición de los datos del gráfico del carácter actual en el archivo. De esta forma podremos almacenar los gráficos sin un orden dado, ya que podremos desplazarnos en el archivo al punto exacto donde se encuentra cada uno. |
[editar (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_FNT&action=edit§ion=6)]Datos de los gráficos Por último, aparecen los datos de los gráficos propiamente dichos, de arriba a abajo: Tamaño en bytes de los datos = ancho * alto
El valor 0 (índice 0 de la paleta) está reservado para los píxels transparentes.
El orden de cada caracter en este punto puede variar. Lo usual es guardar los datos en orden ascendente, del caracter 0 al 255, aunque esto es solo una sugerencia. Para saber el punto exacto en el archivo donde se encuentran los datos del gráfico de cada caracter deberemos fijarnos en el dato
DESPLAZAMIENTO DE LOS DATOS incluido en el descriptor de cada carácter.
No sé hasta qué punto es correcta la información, pues ya intenté en su día crear un editor de fuentes en Fenix sin resultados (bueno, alguno hubo, pero sólo conseguí un único formato de fuente, pero no recuerdo cual, y no encuentro el código.
Por si acaso, esta es la info de la misma web de los FNT de 16bits (FNX)
Especificación del formato FNX (http://fenixworld.se32.com/fenixwiki/index.php?title=FNT) Esta sección describe el contenido de un fichero FNT (http://fenixworld.se32.com/fenixwiki/index.php?title=FNT). No es necesario conocer estos detalles simplemente para programar juegos, pero serán de utilidad a quien quiera realizar utilidades en lenguajes externos que lean o escriban ficheros FNT (http://fenixworld.se32.com/fenixwiki/index.php?title=FNT).
Un fichero FNX (http://fenixworld.se32.com/fenixwiki/index.php?title=FNT) puede incluir compresión. Fenix (http://fenixworld.se32.com/fenixwiki/index.php?title=Fenix) soporta de forma transparente el uso de compresión GZIP en los ficheros, sin necesidad de marcarlos especialmente con extensión .gz. Normalmente un fichero FNT (http://fenixworld.se32.com/fenixwiki/index.php?title=FNT) se guarda en disco comprimido de esta manera, pero en el resto del fichero asumiremos que el fichero FNT (http://fenixworld.se32.com/fenixwiki/index.php?title=FNT) no está comprimido.
[editar (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_FNT&action=edit§ion=2)]Cabecera Un fichero FNX comienza con la siguiente cabecera:
Nombre | Tamaño | Descripción |
MAGIC | 3 bytes | Cadena de caracteres de identificación del fichero. Debe contener exactamente "fnx", en minusculas. |
TERMINACION MS-DOS | 4 bytes | A continuación, los cuatro bytes 1Ah, 0Dh, 0Ah y 00h. Esta terminación indica, en un fichero MS-DOS, final de fichero. Gracias a ella un comando TYPE en MS-DOS no mostraría los datos binarios del fichero. |
BITS POR PIXEL | 1 byte | Profundidad de color de la fuente. Puede tomar los valores 1 (monocromo), 8 (256 colores), 16 (16 bits de color, RGB-565) o 32 (32 bits, ARGB, sólo BennuGD). |
[editar (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_FNT&action=edit§ion=3)]Paleta de colores A continuación, si la profundidad de color es de 8 bits, aparecen 768 bytes con la paleta de colores. Cada color ocupa tres bytes en orden RGB (rojo, verde y azul) y con un rango para cada componente de color de 0 a 63. Seguido aparecerán 576 bytes con información de las gamas, que podran ser ignorados en Fenix (http://fenixworld.se32.com/fenixwiki/index.php?title=Fenix). Para mas información sobre este punto y sobre el formato PAL (http://fenixworld.se32.com/fenixwiki/index.php?title=PAL) en general, visita estos otros dos articulos:
- Formato PAL (http://fenixworld.se32.com/fenixwiki/index.php?title=PAL)
- Especificación del formato PAL (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_PAL)
[editar (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_FNT&action=edit§ion=4)]Informacion de la fuente A continuación, inmediatamente después de la paleta, se guardan 4 bytes que incluyen informacion acerca de los caracteres incluidos en la fuente.
Nombre | Tamaño | Descripción |
CHARSET | DWORD | Conjunto de caracteres usados. Se pueden seguir dos normas distintas. |
[editar (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_FNT&action=edit§ion=5)]Descriptores de los caracteres Ahora siguen los descriptores de cada carácter (ASCII 256 letras), con informacion util para interpretar los datos. Por lo tanto nos encontraremos un array de estructuras con 256 elementos, cada uno de los cuales se corresponde con el siguiente formato:
Nombre | Tamaño | Descripción |
ANCHO | DWORD | Ancho en píxels del gráfico del carácter. |
ALTO | DWORD | Alto en píxels del píxels del gráfico. |
ANCHO DESPLAZAMIENTO | DWORD | Ancho en píxels que se desplazará la siguiente letra. Al leer el formato FNT, se le suele asignar el ancho del gráfico en este campo. |
ALTO DESPLAZAMINETO | DWORD | Alto en píxels que se desplazará la siguiente línea. Al leer el formato FNT, se le suele asignar el ancho del gráfico más el desplazamiento vertical en este campo. |
DESPLAZAMIENTO HORIZONTAL | DWORD | Este dato indica cuantos pixeles se desplazará horizontalmente el gráfico del caracter. |
DESPLAZAMIENTO VERTICAL | DWORD | Este dato indica cuantos pixeles se desplazará verticalmente el gráfico del caracter sobre la linea base de la cadena de texto. |
DESPLAZAMIENTO DE LOS DATOS | DWORD | Este dato indica la posición de los datos del gráfico del carácter actual en el archivo. De esta forma podremos almacenar los gráficos sin un orden dado, ya que podremos desplazarnos en el archivo al punto exacto donde se encuentra cada uno. |
[editar (http://fenixworld.se32.com/fenixwiki/index.php?title=Especificaci%C3%B3n_FNT&action=edit§ion=6)]Datos de los gráficos Por último, aparecen los datos de los gráficos propiamente dichos, de derecha a izquierda, y de arriba a abajo: El tamaño depende de la profundidad de color. Tamaño en bytes de los datos = ancho * alto * (bpp/8)
El valor 0 está reservado para los píxels transparentes.
El orden de cada caracter en este punto puede variar. Lo usual es guardar los datos en orden ascendente, del caracter 0 al 255, aunque esto es solo una sugerencia. Para saber el punto exacto en el archivo donde se encuentran los datos del gráfico de cada caracter deberemos fijarnos en el dato
DESPLAZAMIENTO DE LOS DATOS incluido en el descriptor de cada carácter.
gracias drumpi!
Gracias Drumpi, la información de "GRUPOS DE CARACTERES" era lo que me faltaba. Lo de los FNX lo tenía controlado porque lo he podido inferir del código de PixTudio.
De todas formas, si veis alguna inconsistencia, avisadme ;)
Drumpi, no tendrás por casualidad información de los 576bytes que vienen después de la paleta, no? Me gustaría, ya que estoy, que los archivos de 8bpp sean compatibles con DIV y no recuerdo que hacían esos bytes...
¿Los gamas? Lo cierto es que nunca supe en qué consistían. Creo que ni Fenix ni Bennu hacen uso de eso.
Si no me falla la memoria, las gamas son un conjunto de colores de la paleta que se utilizan para el editor de mapas de DIV y DIV2. Estas son las que se colocaban a la derecha de los colores, y se podían editar, para crear degradados personalizados (en lugar de coger colores con valores contiguos) y usar la herramienta de rellenado con mezcla de colores, o para el generador de explosiones.
Pero ya digo que no tengo detalles de los valores de esos 576 bytes. Siempre los he dejado a cero y nunca he tenido problemas. Quizás MikeDX tenga más detalles, ya que él está trabajando con el código fuente del DIV original (no recuerdo si ha llegado a publicar el SRC de lo que tiene hecho hasta ahora).
iba a responder lo mismo, son las gamas, creo que son grupos de 16... pero no se usan.
Sí gracias, eso ya lo sabía, tendré que averiguar por mi cuenta los detalles. Justamente quise usar la beta de Div para probarlo pero la apertura de paletas no funcionaba :/
En cualquier caso no es prioritario, lo dejaré para otro momento.
A las malas, te puedo hacer una captura de pantalla de DIV2. Lo tengo en una máquina virtual funcionando (aun sigue siendo el mejor programa que conzco para trabajar con gráficos de 256 colores :D :D :D )
Nah no te preocupes. Edtoy seguro q con una beta de divdx se aclararan las cosas.