Acerca del formato FNT y los 8 bits

Started by DCelso, July 24, 2009, 01:04:29 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

#15
Gracias Splinter, ya ho nace falta que revises lo de 1 bit, era esa tontada, sabía que tenía que ser algo estúpido pero no creí que tanto :D, valla fallacaco que tuve. En mis ejercicios de papel siempre usaba como límite el último valor en cambio en lo programado usaba el primer valor, así que salía todo como cortado :D. lo corregí cambiando el if que inserta en el archivo por este otro

         if  (insertedBits = 8) or (h = fnt_info.chardata[i].Width -1 )  then begin


Lo de los 16 bits ya está fuera de mi alcanze si no va el mapeo directo ni el cambio a GBR me parece queesta vez tendrá que ser de bennu, además pasa unas cosas curiosísimas:
Si cambio a 16 bits el prg de bennu, al cargar la fuente de 16 bits el programa se cuelga, tengo que eliminarlo con el administrador de tareas.
Si elimino la carga de la fuente de 16 bits, el programa funciona, muestra la de 1 bit, la de 8 bits y no muestra la de 32 bits, pero no se cuelga.
Si elimino la carga de la de 32 bits y la de 16 bits va bien.
Edit: he visto que el cambio de color también se produce en delphi al cambiar de 8 a 16 bits, parece que no hace los shifts y trunca, voy a ver si lo corrijo.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

estas loco, yo he bajado tus ejemplos... y aca veo bien la cantidad de descargas.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

vamos que el ejemplo que puse es superbasico, nada ofuscado, es simple, lo unico que hago es rotar el valor que vas a utilizar en el OR, con lo que te ahorras un monton de loops. como no se delphi, puede que el codigo necesite algun ajuste, pero deberia funcionar a la perfeccion.

proba generar fonts en bennu y cargarlos tambien en bennu... luego pruebas en tu aplicacion en base a esto...

para ver 32 bits necesitas un modo de video 32... nunca se pueden visualizar graficos de mayor profundidad que el modo de video.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

#18
Lo siento si te molestó, no lo dije por tí, a las pruebas me remito.
En lo referente a las descargas he probado firefox, explorer y opera desde dos equipos distintos y me sigue saliendo 0 descargas en dos de los adjuntos. Mira la imagen que adjunto.

En lo referente a los 1 bits, no quise insinuar que lo hicieras a propósito, el código que propusiste lo probé tal cual y no iba  lo intenté entender para solventarlo y no pude, date cuenta que cambiaste bastante la lógica de mi algoritmo,  por ejemplo eso de OR (1 shl (h and 7) cuesta entenderlo un poquito. Y el porqué del desplazar al principio, si haces eso entonces nunca tendrás un 1 en el bit menos significativo al guardar el byte ya que se le hizo al principio el desplazamiento.

De todas formas gracias a tu código ví el fallo en el mío, te dí las gracias eh,

En cuanto a los 16 bits, a través de pruebas en delphi, he visto que windows trata los 16 bits (un word por pixel) como B5G6R5, al igual que fenix. Lo que pasa es que los demás formatos de píxeles los trata RGB, así que al transformar de cualquier formato de pixel a formato de 16 bits se le va la pinza al delphi y cambia los colores. He solventado el problema pasando a 24 bits primero y desde éste generar los word B5G6R5 necesarios para 16 bits.

Ahora creo que sí que he detectado algún problema en bennu con los 16 bits. El mismo código que adjunto en fenix va bien incluso carga el fnt de 16bits y en bennu no va, se cuelga, hace como bucle infinito y hay que eliminar con el administrador de tareas.
En cambio cuando pruebo el mismo en bennu pero con deph 32, entonces se ve mal la fuente de 16 bits.

También he intentado cargar un fnt 8btis en bennu desde modo 16 bits y guardarlo en fnt16 bits y no funciona, sigue guardandolo en 8 bits.

Espero no te enojes mucho conmigo por la guerra que te doy :(, he estado a saco estos días a atrás para poder entregaros una versión revisada con 32bits del fntedit a la comunidad, a veces me desespero porque no sale como yo quiero y además siempre viene muy bien tu ayuda, la ayuda del que conoce a fondo el sistema.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

splinter_work

Yo baje tus ejemplos, sino como fue que te puse el codigo para que pruebes y te dije en base a los fonts que me pasaste de ejemplo?
con respecto a los 2 ultimos attachs, no los vi, disculpa, estoy con 3 proyectos a la vez, y al ver el codigo, no me preocupe en ver si habia attach. Disculpa, pero los anteriores si los baje.

el desplazamiento es solo del valor 1, ves que hay parentesis?

esto es

1 << 0 = 1
1 << 1 = 2
1 << 2 = 4
1 << 3 = 8
1 << 4 = 16
1 << 5 = 32
1 << 6 = 64
1 << 7 = 128

ahi tenes todos los OR para cada uno de los pixels... es muy simple...

el AND 7 ( 0111b ) hara que solo se considere el modulo 8 de la posicion de cada columna.

Los cuelgues no se, tendre que probarlo.

Claro, un font siempre mantiene su profundidad de colores, seria un error que asi no sea. Si queres convertir un font de 8 a 16, tenes que crear un nuevo font e ir copiando mapa a mapa, haciendo la conversion... mira el ejemplo de pacman que inclui en la distro de wiz... ahi tenes un ejemplo de como crear un font a partir de otro.

Je, se que le estas dando duro, no te preocupes... es que yo tambien estoy con varias cosas a la vez, el tiempo no me alcanza y me desespera tener solo 2 dias los fines de semana... y que gran parte del dia le tenga que dedicar a salir de compras o salir a donde sea... en estos momentos odio salir...


splinter_work

A todo esto me pregunto, el editor de fonts de prg, no generaba fonts en todos los modos bien? o lo soñe?

splinter_work

probe tu ejemplo con los 4 fonts, que setea el modo de video a 32 bits... y yo veo los 4 fonts...

splinter_work

proba este codigo


import "mod_map";
import "mod_draw";
import "mod_say";

#define CONVERT 0

function font_convert( int source, int depth )
private
    font, i, w, w1, h, d, gr, gr2, p1, p2;
begin

    font = fnt_new(depth);

    /* Resize fonts */
    for (i = 0; i < 128; i++)
        gr = glyph_get( source, i );
        if ( gr )
            w = map_info(0,gr,g_width);
            h = map_info(0,gr,g_height);
            d = map_info(0,gr,g_depth);
            gr2 = map_new(w, h, depth);
            point_set(0,gr2,0,0,0);
            map_xput(0, gr2, gr, 0, 0, 0, 100, B_NOCOLORKEY);
            point_get(0,gr,0,&p1,&p2);
            point_set(0,gr2,0,p1,p2);
            point_get(0,gr,1,&p1,&p2);
            point_set(0,gr2,1,p1,p2);
            point_get(0,gr,2,&p1,&p2);
            point_set(0,gr2,2,p1,p2);
            if ( depth == 32 )
                w1 = w;
                while ( h-- )
                    w = w1;
                    while ( w-- )
                        map_put_pixel(0,gr2,w,h,map_get_pixel(0,gr2,w,h)&07fffffffh);
                    end
                end
            end
            glyph_set( font, i, 0, gr2 );
            map_del(0,gr2);
            map_del(0,gr);
        end
    end

    return font;
end

Global
depth = 32;
teoricFPS=30;
id_fnt1 =0;
id_fnt8 =0;
id_fnt16 =0;
id_fnt32 =0;
Begin
    set_title("fuente 32 bits FNX");

#if CONVERT
set_mode(640,480,16);
#else
set_mode(640,480,depth);
#endif
set_fps(teoricFPS,0);

    put_screen(0,load_png("fondo.png"));

    id_fnt1=load_fnt("fuente1bpp.fnt");

#if CONVERT
    id_fnt8=load_fnt("fuente8bppFNX.fnt");
    id_fnt16=font_convert(id_fnt8,16);
    id_fnt32=font_convert(id_fnt16,32);
#else
    id_fnt8=load_fnt("font8-bennu.fnt");
    id_fnt16=load_fnt("font16-bennu.fnt");
    id_fnt32=load_fnt("font32-bennu.fnt");
#endif

    write(id_fnt32,100,200,0,"hola32");
    write(id_fnt16,100,150,0,"hola16");
    write(id_fnt8,100,100,0,"hola8");
    write(id_fnt1,100,50,0,"hola1");

    while (!key(_esc))
if (key(_f))
            if (full_screen==true)
                full_screen=false;
            else
                full_screen=true;
            end
            set_mode(800,600,depth);
            while (key(_f))
      frame;
            end;
        end
        frame;
end

#if CONVERT
save_fnt(id_fnt8, "font8-bennu.fnt");
save_fnt(id_fnt16, "font16-bennu.fnt");
save_fnt(id_fnt32, "font32-bennu.fnt");
#endif

end


No uses la funcion de save para mapas de 16 bits... no funciona en esta version... tengo que sacar la tabla de conversion... y convertir mas de 128 mapas tambien da problemas, tengo que analiar que pasa...
la grabacion de 16 bits ya funciona bien en una version que tengo eliminando esas siniestras funciones de conversion que mencione...
como sea, aca te paso un set de fonts correctos... segun tu font de 8 bits...
el font de 1 bit que incluiste en el ejemplo, sigue estando mal, ya que tiene una banda negra del lado izquierdo, supongo que producto de las rotaciones... o quizas este font es viejo.
tambien podras ver que el alpha en 32bits funciona perfecto.

Saludos.

DCelso

mira, con tu mismo ejemplo he visto el error, te recuerdo que yo uso windows, primeramente la fuente de 16 bits muestra los colores erróneos, en teoría es igual a la de 8 bits. Si pruebas a cambiar la resolución a 16 y eliminas las loadfont de 1 y 32 bits el programa entre bucle infinito, Esto mismo probado en fenix va bien y además se ven los colores de la fuente de 16 bits correctamente.

#define CONVERT 0


Global
depth = 16;
teoricFPS=30;
id_fnt1 =0;
id_fnt8 =0;
id_fnt16 =0;
id_fnt32 =0;
Begin
    set_title("fuente 32 bits FNX");

#if CONVERT
set_mode(640,480,16);
#else
set_mode(640,480,depth);
#endif
set_fps(teoricFPS,0);

    put_screen(0,load_png("fondo.png"));

    //id_fnt1=load_fnt("fuente1bpp.fnt");

#if CONVERT
    id_fnt8=load_fnt("fuente8bppFNX.fnt");
    id_fnt16=font_convert(id_fnt8,16);
    id_fnt32=font_convert(id_fnt16,32);
#else
    id_fnt8=load_fnt("font8-bennu.fnt");
    id_fnt16=load_fnt("font16-bennu.fnt");
    //id_fnt32=load_fnt("font32-bennu.fnt");
#endif

    write(id_fnt32,100,200,0,"hola32");
    write(id_fnt16,100,150,0,"hola16");
    write(id_fnt8,100,100,0,"hola8");
    write(id_fnt1,100,50,0,"hola1");

    while (!key(_esc))
if (key(_f))
            if (full_screen==true)
                full_screen=false;
            else
                full_screen=true;
            end
            set_mode(800,600,depth);
            while (key(_f))
      frame;
            end;
        end
        frame;
end

#if CONVERT
save_fnt(id_fnt8, "font8-bennu.fnt");
save_fnt(id_fnt16, "font16-bennu.fnt");
save_fnt(id_fnt32, "font32-bennu.fnt");
#endif

end


pruebalo en fenix 92 preview 3 y en bennu rc95 desde windows.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

splinter_work

puf... ya te lo he dicho y explciado cuando postee el mensaje...

usa para tu editor los fonts que subi, esos fonts van bien. la version que tienes de bennu, no muestra bien los colores, pero los fonts que te subi son los correctos.



DCelso

Ah vale ahora entiendo, sorry, gracias por tu paciencia, ok, pues espero entonces, ya que actualmente el fntedit que tengo creo que genera bien los 4 formatos fnx, puesto que cuando los abro con el visor que hize tambien se ven bien.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

efectivamente, probé todas tus fonts en el visor que hice y se ven correctamente. También he visto que los generados por el fntedit que tengo son análogos a los tuyos. Gracias, karma up.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

Con la r99, el ejemplo funciona correctamente.
Buen trabajo Splinter.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/