Conversor de FNT

Started by Drumpi, February 24, 2009, 11:23:22 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos:
Voy a intentar focalizar mi energía un poco hacia bennu. Mientras llega el dia en que pueda sacar unas cosillas, y como tengo que programar algo un poco tedioso y repetitivo, para "relajarme", voy a tratar de hacer un conversor de fuentes, que me está haciendo falta.
Ya he reunido la documentación necesaria. La idea es que:
-Cargue FNT de cualquier profundidad de color.
-Guarde en FNT de 1, 16 y 32 bits (los de 8 bits van a ser más complicados, por el tema de optimizar paletas, que aun no se cómo hacerlo, quizás más adelante).
-Importar desde un FPG (el número de cada mapa indicaría el número como caracter)
-Exportar a FPG.
-Ver la posibilidad de generar alguna fuente, usando la ttf.dll o similares.

Bueno, la idea principal era hacerla por linea de comandos, por si alguien quería hacerse un script para usarlo, pero Splinter prefería hacerlo mediante IDE.
Esto me puede plantear un pequeño problema, pues mi experiencia con anteriores IDEs por código no fue tan satisfactoria (y porque mi capacidad de diseño es baja). Pero se intentará.

Así que el hilo estará abierto para cualquier sugerencia.
Tambien para plantearos mis dudas, empezando por si preferís una interfaz clásica, algo un poco distinto o algo totalmente surrealista (warning: posible Drumpi-locura inside ;D)
Y otra cosa ¿tendríais inconveniente en que esté sólo en inglés o solo en español? más que nada porque me interesa sacar algo funcional lo más pronto posible, nunca sé a ciencia cierta si voy a terminar algo o no  ;D

Un saludo.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

izubiaurre

Drumpi, igual te alegra saber que eso que dices está medio hecho :P

Si te interesa envíame un mensaje.

osk

Qué grande!!
Si puede ser con Ide, pues bien, pero se puede hacer una versión previa completamente funcional en línea de comandos, y ya vendrá lo otro después, no? Pienso que la línea de comandos es importante tenerla presente siempre...
Venga, gracias a todos!!

SplinterGU

mientras sea funcional y simple, da igual que sea por linea de comandos o ide... la preferencia es ide...
podes usar las funciones de ide que hice yo para bennu, y lo haces directamente en bennu...
como gustes...
1 karma por la iniciativa! :D
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

si usas bennu puedes usar la pango para crear las fuentes de fuentes del sistema. no se si ya salió a la vista, pero hay un instalador que ha hecho josebita para que funcione en windows de forma automática, con lo que ya no habrá problemas

y usar la gui para crear los botones. tenía pensado hacer algo para el fpg editor sin embargo no he logrado comprender cómo funcionan las funciones para crear fuentes :) , de cualquier forma me alegro que hayas tomado tu la iniciativa, en verdad se necesita un editor de fuentes...

bueno, nos vemos, saludos y un karma para tí :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Drumpi

Bien, de momento voy a empezar con las funciones de guardado y carga, y para ir testeando usaré consola de comandos.
Después me centraré en un IDE, aun tengo los códigos que hizo Splinter, así que si no ha habido cambios en los últimos 4 meses podré ir mirando de hacer algo, aunque andaba visualizando una interfaz con botones sueltos volando por el espacio... ;D
La pango la dejaremos para más adelante, primero quiero aprender a manejar el formato FPG, y la ttf es tan sencilla de usar que me podré olvidar del fread un rato.

Por cierto, por curiosidad: en Fenix me di cuenta que, si quería trabajar con los mapas, sólo por cargarlos en memoria ya había que inicializar el sistema gráfico, al menos para ponerlo en 16bits. No es un problema, en absoluto, pero me llamó la atencion cuando intenté hacer un programa puramente por linea de comandos: tuve que abrir si o si una ventana (la aproveché para mostrar mensajes y demás).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Hola de nuevo:

Tengo que pediros disculpas, porque en realidad no me he puesto a trabajar en serio en esto hasta ayer (es lo que tiene mi pila: los cinco primeros proyectos se ejecutan en orden "segun me apetezca programarlos" :D)
Pero bueno, lo he cogido con ganas y de momento ya tengo la carga de fuentes a medias, aun quedan algunas complicaciones por superar y crear los mapas con las imágenes, pero puedo ver los primeros datos de TODOS los formatos de FNT, incluso de aquellos que no puede el FNTEdit: los ficheros comprimidos.
Se me están planteando serios problemas intentando entender el formato nuevo de FNT, porque no existe documentacion alguna al respecto y lo estoy haciendo descifrando el código de Fenix 092a (por suerte, mi C no está tan oxidado como pensaba) y los valores de fuentes ya existentes.

Un par de cuestiones:
¿Existe alguna forma de averiguar si algun fichero está comprimido con la zlib sin tener que recurrir al "prueba y error"?
Aunque lo voy a sacar este fin de semana sin internet (pero por si acaso), hay una serie de campos nuevos en las cabeceras de cada fuente del formato fnx que no entiendo ¿para qué son?

En cuanto tenga disponible algo que sea ejecutable, aunque sea por linea de comandos, lo pondré aqui.
Mientras tanto, si alguien quiere ocuparse de diseñar la interfaz (aunque sea en papel, pero si puede hacer los botones y demás, mejor) pues le estaré muy agradecido, porque yo podría acabar haciendo cualquier chapuza ^^U
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

si usas las funciones de archivos con el flag de zlib no te interesa si estan comprimidos o no... la libreria internamente hace el chequeo...

tambien tenes los fuentes en C de bennu... pero yo creo que no es necesario ver los fuentes...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Ah, vale. Gracias por la info.
Pero si abro un fichero en modo O_ZREAD se supone que no puedo usar el comando FSEEK para ir a una parte anterior del fichero, por lo que si sería interesante poder distinguirlos. pero vamos, que el "try & error" funciona de lujo.
Tambien se lo de los fuentes de Bennu, pero es que los de Fenix son los que tenía más a mano ^^U
Y sin ver los fuentes, ya me contarás cómo averiguo el formato de los fnt nuevos. En el wiki se habla del formato FNT de DIV que empieza con el campo magic "fnt\x1a\x0d\x0a\x00" (juer, me lo se de memoria) y tiene un octavo byte que indica la version, que siempre es cero.
Sin embargo, las fuentes de Fenix empiezan con "fnx\x1a\x0d\x0a\x00" y el octavo byte no es la version, sino la profundidad de color, y eso no se dice en el wiki.
Amen de que luego cada letra se supone que tiene 4 ints que especifican ancho, alto, desplazamiento vertical (respecto a la linea de escritura) y desplazamiento de los datos (el número del byte donde empieza el mapa de la letra), y en cambio, el "fnx" dispone de ocho campos, entre ellos el desplazamiento horizontal de la letra y ¿desplazamiento vertical de los datos?

FUENTE (no encontrado en el bennu wiki)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

los modos son o_zwrite y o_zread... o_zread detecta si esta comprimido o no, y usa la funcion adecuada para recuperar los mismos...

y con respecto a los fonts, tenes que tener en claro que no es serializado, sino que en ningun caso, en la misma unidad de profundidad (byte/word/dword, segun el modo) vas a tener pixels/bits de distinta fila.

para 1 a 8 pixels de profundidad = 1 byte
para 16 = 2 bytes
para 32 = 4 bytes

los bits sobrantes, para el caso de 1bit no se usan... no se tienen en cuenta...

podes chequear cualquier formato grafico, sonido, etc... que no sea serializado, para entender un poco esto...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

#10
Quote from: Drumpi on March 06, 2009, 01:38:27 PM
Ah, vale. Gracias por la info.
Pero si abro un fichero en modo O_ZREAD se supone que no puedo usar el comando FSEEK para ir a una parte anterior del fichero, por lo que si sería interesante poder distinguirlos. pero vamos, que el "try & error" funciona de lujo.
Tambien se lo de los fuentes de Bennu, pero es que los de Fenix son los que tenía más a mano ^^U
Y sin ver los fuentes, ya me contarás cómo averiguo el formato de los fnt nuevos. En el wiki se habla del formato FNT de DIV que empieza con el campo magic "fnt\x1a\x0d\x0a\x00" (juer, me lo se de memoria) y tiene un octavo byte que indica la version, que siempre es cero.
Sin embargo, las fuentes de Fenix empiezan con "fnx\x1a\x0d\x0a\x00" y el octavo byte no es la version, sino la profundidad de color, y eso no se dice en el wiki.
Amen de que luego cada letra se supone que tiene 4 ints que especifican ancho, alto, desplazamiento vertical (respecto a la linea de escritura) y desplazamiento de los datos (el número del byte donde empieza el mapa de la letra), y en cambio, el "fnx" dispone de ocho campos, entre ellos el desplazamiento horizontal de la letra y ¿desplazamiento vertical de los datos?

FUENTE (no encontrado en el bennu wiki)

bueno, el fseek si funciona, lo que no podes hacer es escribir en esa posicion... eso no lo soporta la zlib... te dara error...
exacto, el metodo de chequeo y error funciona...
bueno, los headers y los magics si los necesitas, pero los fuentes no son realmente necesarios... pense que ya tenias las estructuras...

los fonts en bennu/fenix, sea la resolucion que sea, empiezan con 'fnx'...

EDIT: Es cierto, div y fenix son diferentes, no solo la cabecera...

despues de leer la paleta (solo en el caso 8bits), viene esta data... luego lo demas creo que ya es simple...

    div:

    struct
    {
        int width ;
        int height ;
        int yoffset ;
        int fileoffset ;
    }
    oldchardata[256];

    fenix/bennu:

    struct
    {
        int width;
        int height;
        int xadvance;
        int yadvance;
        int xoffset;
        int yoffset;
        int fileoffset ;
    }
    chardata[256] ;
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Si, eso ya lo había visto este fin de semana. Despues de un duro combate a brazo partido (y un fallo tontísimo por mi parte :D) conseguí descifrar el contenido, aunque parece que hay algo de información redundante, pues (si no lo confundo con xoffset e yoffset) xadvance e yadvance indican el ancho y alto respectivos, sumándole los desplazamientos de posición.
Una feature que desconocía y que podría dar mucho de si en juegos estilo cartoon.

La buena noticia es que ya he conseguido que mi programa lea un fichero de fuentes: comprimidas, sin comprimir, con letras desordenadas (por probar, porque no hay ninguna fuente así) y profundidades de 8, 16 y 32 bits (las de 1 bit las he dejado un poco aparcadas porque no me aclaraba en el método para crear mapas de 1bit). Obviamente sólo he podido probar 8 y 16 bits (formato viejo y otra generada por save_fnt), pero todo se andará.
Hay muchas cosas que voy a tener que pensarlas de nuevo, pues me han surgido más detalles que desconocía (como la existencia de dos codificaciones de caracteres) que me obligan a añadirle más opciones de conversion, pero eso no es problema: actualmente guardo cada caracter como un mapa en un array de 256 posiciones, y alterar su posición, color, forma y demás es sencillo, de hecho, se me ha encendido una bombillita respecto a otro uso muy curioso que se le podrían dar a las fuentes.

A ver si en los próximos días puedo decir ya que se pueden guardar las fuentes y cambiarles algun detalle. Al final, con la tontería, acabaré creando una librería de fuentes y todo XDDD

PD: dos cuestiones.
1- ¿El LSB de un byte es el pixel (0,0) de un mapa de 1bit, o lo es el MSB?
2- ¿Map_buffer accede al primer byte con información de color del mapa o al primer campo de datos del mapa en memoria?
3- (Esto es por otro código) Me he fijado que de la version 083b a la 092a desapareció el campo flags de la estructura "_bitmap" (o del tipo GRAPH) ¿Se suprimió o se cambió? Quiero portar una librería pero como usa dicho campo no me deja, y los fuentes de la 083b los tengo perdidos.

Muchas gracias por tu paciencia y tu sabiduría, apreciado maestro ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

#12
offset, indican desplazamiento donde ponerlo a partir de las coodenadas X e Y
advance, indican el avance que sumar a "x" e "y" para posicionar el proximo caracter.
no tienen relacion real con el ancho y el alto.

1) bit 7 es primer pixel, bit 6 es 2do... pero podes usar las funciones put_pixel...
2) map_buffer = datos
3) no recuerdo, pero que dice exactamente el codigo que usa flags...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

bit 7... eso es un poco ambiguo ¿no? :D supongo que te refieres al "Most Significant Bit".
Bien, eso está implementado, sólo falta hacer lo propio en el salvado de la fuente. Añado las opciones de conversion por parámetros, un par de funciones de conversion para los mapas y ya podré sacar una version primitiva para buscar fallos.
Y si todo va bien, tendré que decidir si empezar con la interfaz o con la importacion de FPGs

Respecto al código, pues no lo he analizado lo que debiera: trate de compilarlo y me dio el error de que el campo flags no existe en una variable de tipo GRAPH, pero se usa en diversos sitios de la VSE08
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

si, el "bit mas significativo", pero por las dudas, queria evitar luego tener que responder o aclarar a que me referia con "bit mas significativo"... por el contrario, decir "bit7" (128, 0x80, 080h, 10000000b) despeja toda duda/ambiguedad...

vos no estas usando la funcion save_fnt? creaste una propia?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2