Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Fede on December 14, 2010, 05:41:36 AM

Title: Conviertiendo cualquier fnt a 1 bit.
Post by: Fede on December 14, 2010, 05:41:36 AM
Saludos a todos.

Aunque últimamente os tengo algo abandonados tengo la escusa de que estoy usando el poco tiempo libre que tengo para programar.  ;D

Estoy haciendo un convertidor de fnt a 1 bit y se me 'cuelga' aleatoriamente. Otras veces me da un Runtime error.

He conseguido descubrir unos de los errores en esta función pero no veo porque no vá.

Agradecería le echarais una miradita.

Muchas gracias.


EDITO:

Subo el código que no se me pega bien.
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on December 14, 2010, 01:27:00 PM
se parece muchisimo a uno que hice yo hace tiempo...


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

private
    input;
    output;
    gr, gr2;
    i;
    h, w;
    ih, iw;
    int p1, p2;
begin

    input = load_fnt( "MS Sans Serif.fnt" );
    output = FNT_NEW(1);

    for (i = 0; i < 128; i++)
        gr = GLYPH_GET( input, i );
        if ( gr )
            w = map_info(0,gr,g_width);
            h = map_info(0,gr,g_height);
            gr2 = map_new(w, h, 1);
            for ( ih = 0; ih < h; ih++)
                for ( iw = 0; iw < w; iw++)
                    if ( map_get_pixel(0,gr,iw,ih) )
                        map_put_pixel(0,gr2,iw,ih,1);
                    end
                end
            end
            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);
            GLYPH_SET( output, i, 0, gr2 );
            map_del(0,gr2);
            map_del(0,gr);
        end
    end

    FNT_SAVE(output, "MS Sans Serif-1.fnt" );
end


este funciona.
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: Fede on December 14, 2010, 03:58:41 PM
Joder, pues si que se parece.

Voy a mirarlo a ver si comparando pillo algo.


Gracias.

EDITO:

Ya lo he mirado.

Se me cuelga cuando compruebo más de 160 carácteres o así.

¿No se supone que pueden tener hasta 255?

¿Si pido un caráter que no existe con GET_GLYPH se puede corromper el sistema?

Gracias.

EDITO 2:

Na.

No tiene nada que ver con los carácteres.

Tengo que estudiar más tu ejemplo, Splinter.

Chao.
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: Fede on December 14, 2010, 05:40:10 PM
Splinter, si añades al final de tu código las líneas:

   unload_fnt(input);
   unload_fnt(output);

también peta a partir de 160 caráteres, más o menos.

Dime argo, quillo.  ;D

Saludos.
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on December 14, 2010, 08:15:45 PM
luego le hecho un ojo...
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: Fede on December 14, 2010, 08:20:12 PM
Gracias amoooo.  :-*
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on December 15, 2010, 02:00:52 PM
solucionado, habia un bug cuando se agregaban nuevos caracteres, gracias!
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: Fede on December 15, 2010, 04:39:05 PM
¡TE QUIEROOOOOOOOOO!  :-* :-* :-*

(Últimamente estoy muy cariñoso).  ;D

En cuanto llegue a casa lo pruebo.

Gracias.

Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on December 15, 2010, 04:44:33 PM
deberia generarte el ejecutable, o lo generas vos?
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: Fede on December 15, 2010, 10:45:50 PM
Ahora que caigo...

¿Cuando se sube el bennu con el bug corregido?


Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on December 15, 2010, 11:13:35 PM
estan los fuentes... tengo que generar los ejecutables... pero la verdad, ya ocupe hoy demasiado tiempo...
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: Drumpi on December 16, 2010, 02:01:56 AM
Bueno, por lo visto, nos hemos puesto de acuerdo y han salido diversas alternativas funcionales para tener fuentes de 1 bit :D :D :D

¡¡concurso de utilidades para Bennu!!
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: Fede on December 16, 2010, 06:55:37 AM
Quote from: SplinterGU on December 15, 2010, 11:13:35 PM
estan los fuentes... tengo que generar los ejecutables... pero la verdad, ya ocupe hoy demasiado tiempo...

Tranquilo Splinter. Sólo preguntaba.  ::)

Más besitos.  :-* :-* :-* :-*

Quote from: Drumpi
¡¡concurso de utilidades para Bennu!!

¡Me apunto!
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: Fede on January 05, 2011, 02:38:01 PM
Hola de nuevo.

Esto sigue sin ir bien. Ahora se salta carácteres de la fuente a convertir.

Parece como si algunos no les gustase.  :D

Os pongo un código ejemplo con el carácter 173.

Si alguien puede que le eche una miradita. Por si ve algo.

Gracias.
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on January 05, 2011, 08:49:44 PM
ya estaba probado esto.

puede que sean diferentes encoding... o que el caracter no exista en el font source.

luego lo miro, primero tengo que ver el otro bug reportado.
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on January 05, 2011, 09:35:45 PM
hay algo que parece no le gusta al get_glypt.
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on January 05, 2011, 10:14:58 PM
hay un problema que si el font no esta completo no se dibujan los caracteres... tambien puede existir otro probleme provocado por el hecho de que el font que estas cargando es un font div, y tiene un charset diferente al que se genera (like fenix).


import "mod_video";
import "mod_screen";
import "mod_map";
import "mod_key";
import "mod_dir";
import "mod_text";
import "mod_mem";
import "mod_proc";
import "mod_draw";
import "mod_timers";
import "mod_sort";
import "mod_string";
import "mod_file";
import "mod_say";
import "mod_joy";
import "mod_draw";
import "mod_rand";
import "mod_regex";
import "mod_wm";



function main()
// Convierte la fuente a 1 bit de profundidad
private
byte bBits=0;
int iGrafico=0;
int iGraficoNuevo=0;
int iFont=0;
int iNuevaFont=0;
int iLetra=0;
int iAlto=0;
int iAncho=0;
int iContador=0;
int iContadorAncho=0;
int iCOntadorAlto=0;
int iPixel=0;
string sNombre;
int pX=0;
int pY=0;
char text[256];
i;
end

begin

    set_mode(1280,600,32);

salida();

sNombre="f2b.fnt";

iFont=Load_Fnt(sNombre);
iNuevaFont=New_Fnt(1);

iGrafico=0;
iContador=0;

text[0]=173;
text[1]=0;

while (iContador<255)
iGrafico=GET_GLYPH(iFont,iContador);
if (iGrafico)
iAncho=map_info(0,iGrafico,g_width);
iAlto=map_info(0,iGrafico,g_height);
say(iancho+","+ialto);

iGraficoNuevo=map_new(iAncho,iAlto,1);
iAncho=map_info(0,iGraficoNuevo,g_width);
iAlto=map_info(0,iGraficoNuevo,g_height);

iContadorAncho=0;

while (iContadorAncho<iAncho)
iContadorAlto=0;
while (iContadorAlto<iAlto)
iPixel=map_get_pixel(0,iGrafico,iContadorAncho,iContadorAlto);
if (iPixel)
map_put_pixel(0,iGraficoNuevo,iContadorAncho,iContadorAlto,1);
    else
map_put_pixel(0,iGraficoNuevo,iContadorAncho,iContadorAlto,0);

end
iContadorAlto++;
end
iContadorAncho++;
end
get_point(0,iGrafico,0,&pX,&pY);
set_point(0,iGraficoNuevo,0,pX,pY);
get_point(0,iGrafico,1,&pX,&pY);
set_point(0,iGraficoNuevo,1,pX,pY);
get_point(0,iGrafico,2,&pX,&pY);
set_point(0,iGraficoNuevo,2,pX,pY);

set_glyph(iNuevaFont,iContador,0,iGraficoNuevo);

map_unload(0,iGraficoNuevo);
iGraficoNuevo=0;
map_unload(0,iGrafico);
iGrafico=0;
end
iContador++;
end
sNombre="f2b-b.fnt";
save_fnt(iNuevaFont,sNombre);
write(         0,10,20,0,text);
write(     iFont,10,40,0,text);
write(iNuevaFont,10,60,0,text);
// unload_fnt(iFont);
// unload_fnt(iNuevaFont);
end
//--------------------------------------------------------------------------------------
process Salida();
begin
signal_action(s_freeze,S_IGN);
frame;
while (!key(_ESC))
frame;
end
exit();
end
//--------------------------------------------------------------------------------------
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on January 05, 2011, 10:29:21 PM
sigo revisando.
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on January 05, 2011, 10:48:49 PM
ya veo, es un tema del charset... 173 es el char 161... (dos to win)... por ende si solo creamos el 173, no se vera, ya que no se crea el 161...

esto es una porqueria...

proba el siguiente codigo


import "mod_video";
import "mod_screen";
import "mod_map";
import "mod_key";
import "mod_dir";
import "mod_text";
import "mod_mem";
import "mod_proc";
import "mod_draw";
import "mod_timers";
import "mod_sort";
import "mod_string";
import "mod_file";
import "mod_say";
import "mod_joy";
import "mod_draw";
import "mod_rand";
import "mod_regex";
import "mod_wm";



function main()
// Convierte la fuente a 1 bit de profundidad
private
byte bBits=0;
int iGrafico=0;
int iGraficoNuevo=0;
int iFont=0;
int iNuevaFont=0;
int iLetra=0;
int iAlto=0;
int iAncho=0;
int iContador=0;
int iContadorAncho=0;
int iCOntadorAlto=0;
int iPixel=0;
string sNombre;
int pX=0;
int pY=0;
char text[256];
int iFin;
i;
end

begin

    set_mode(1280,600,32);

salida();

sNombre="f2b.fnt";

iFont=Load_Fnt(sNombre);

iNuevaFont=New_Fnt(1);

iGrafico=0;
iContador=161;
iFin=255;

        text[0]=173;
        text[1]=0;

while (iContador<iFin)
iGrafico=GET_GLYPH(iFont,iContador);
if (iGrafico)
iAncho=map_info(0,iGrafico,g_width);
iAlto=map_info(0,iGrafico,g_height);

iGraficoNuevo=map_new(iAncho,iAlto,1);
iAncho=map_info(0,iGraficoNuevo,g_width);
iAlto=map_info(0,iGraficoNuevo,g_height);

iContadorAncho=0;

while (iContadorAncho<iAncho)
iContadorAlto=0;
while (iContadorAlto<iAlto)
iPixel=map_get_pixel(0,iGrafico,iContadorAncho,iContadorAlto);
if (iPixel)
map_put_pixel(0,iGraficoNuevo,iContadorAncho,iContadorAlto,1);
    else
map_put_pixel(0,iGraficoNuevo,iContadorAncho,iContadorAlto,0);

end
iContadorAlto++;
end
iContadorAncho++;
end
get_point(0,iGrafico,0,&pX,&pY);
set_point(0,iGraficoNuevo,0,pX,pY);
get_point(0,iGrafico,1,&pX,&pY);
set_point(0,iGraficoNuevo,1,pX,pY);
get_point(0,iGrafico,2,&pX,&pY);
set_point(0,iGraficoNuevo,2,pX,pY);

set_glyph(iNuevaFont,iContador,0,iGraficoNuevo);

map_unload(0,iGraficoNuevo);
iGraficoNuevo=0;
map_unload(0,iGrafico);
iGrafico=0;
end
iContador++;
end
sNombre="f2b-b.fnt";
save_fnt(iNuevaFont,sNombre);
write(         0,10,20,0,text);
write(     iFont,10,40,0,text);
write(iNuevaFont,10,60,0,text);
// unload_fnt(iFont);
// unload_fnt(iNuevaFont);
end
//--------------------------------------------------------------------------------------
process Salida();
begin
signal_action(s_freeze,S_IGN);
frame;
while (!key(_ESC))
frame;
end
exit();
end
//--------------------------------------------------------------------------------------


cambia iCounter por 162 en vez de 161 y vas a ver en cada prueba como aparece y no aparece...

tengo que pensar esto tranquilamente, a ver si es correcto que se comporte asi o no, y de no serlo como deberia comportarse y como deberia corregirlo.

pero ahora no tengo tiempo...
Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: Fede on January 05, 2011, 11:42:01 PM
Gracias Splinter.

Veo que estás en el tema y que tienes mil cosas por hacer, así que tú tranquilo. Verdaderamente cuando puedas.

Y cuando digo cuando puedas, no es mañana ni pasado, es cuando puedas.  (Que ya nos vamos conociendo) ;D

Y también cuando puedas me explicas lo de 'esto es un porquería'. Supongo que te referirás a herencia del Div o algo así.  ;D

Un abrazo.  :-*

Title: Re: Conviertiendo cualquier fnt a 1 bit.
Post by: SplinterGU on January 06, 2011, 12:12:26 AM
porqueria me refiero a que al mapearte los gylph, hay caracteres que no se setean, creo que los glyph deberian tener un modo directo, para obtener el caracter sin charset.