Bennu Game Development

Foros en Español => Extensiones => Topic started by: DCelso on February 22, 2010, 04:39:00 PM

Title: mod_svg
Post by: DCelso on February 22, 2010, 04:39:00 PM
Al fín, después de miles de intentos fallidos y de uso de diferentes librerías SVG, he conseguido portar algo estable a bennu para la lectura de SVGs.
Eso sí, depende de la tira de dlls por usar rsvg (que depende de glib,gobject,gpixbuff,cairo,libpng,libz,y alguna que fijo que me olvido :D), así que su portabilidad es muy limitada.

Viene como siempre os tengo acostumbrado, makefile para compilar, .cproject para usar eclipse, .prg para ver forma de uso, código fuente y binario .dll para windows. No he adjuntado los dlls de los que depende ya que son varios megas, bajaros gimp o apañarolas vosotros como más os plasca.

Yo, el truco que he seguido para tener todas las dlls que necesita es bajarme el último gimp y afanarle las que me iba pidiendo, que no son pocas :D.
Title: Re: mod_svg
Post by: FreeYourMind on February 22, 2010, 05:11:08 PM
DCelso, soy tu fan, toma Karma :)
Title: Re: mod_svg
Post by: Drumpi on February 22, 2010, 05:49:14 PM
Yo me sumo al karma, por el trabajo hecho.
Ahora hay que mirar el código fuente para ver como hacerlo más independiente ;D
Title: Re: mod_svg
Post by: osk on February 22, 2010, 06:32:51 PM
Ou Ou Ou YEAAAAHHHHGGGG!!!!!
Karma Police!!!
Title: Re: mod_svg
Post by: DCelso on February 22, 2010, 06:40:06 PM
Gracias,
podría eliminar la dependencia de gdk_pixbuff usando directamente un canvas de cairo para usar rsvg, pero las demás son casi impuestas.
Porque el formato svg puede llevar imágenes pngs/jpgs enlazadas así que necesitas libpng que a su vez necesita libz y libjpeg. Además tambíen soporta formatos zsvg, que son svgs comprimidos así que depende directamente de libz.
Por otro lado, usa cairo para dibujo vectorial, así que otra que es obligatoria, y esta depende también de unas cuantas más.
También rsvg ha pasado a formar parte de GTK así que ha adoptado también su filosofía, por lo tanto depende de glib para tipos de datos abtractos como listas y pilas y para poder mostrarse en proyectos visuales GTK++ usan gtk_pixbuff como contenedor de imágenes RAW.
También, como el formato svg es un derivado del formato xml con sus propias etiquetas pues nececista de libxml para poder leeerse.
En resumidas cuentas, que el formato svg es tan complejo que programarlo sin dependencias sería todo un proyecto de vida largo :D.
He visto una librería sdl_svg que está basado en una versión muy antigua de librsvg que se llamaba libsvg y aún no formaba parte de GTK, lo malo es que he intentado compilar un módulo bennu por activa y por pasiva con éste código y obtenía como resultado un dll corrupto.
la parte de libsvg que viene dentro del sdl_svg solo sirve para crear librerías estáticas, en cuanto le digo que es dinámica me sale un dll corrupto, no entiendo el motivo, lo que sí he visto es que es tan antigua que solo soporta svgs standaras, no van ni los formatos comprimidos y los formatos inkscape, en principio pues pense que daba igual ya que con soportar un formato podríamos exportar a ese desde una herramienta externa pero como no conseguí compilar la librería dinámica pues pensé "le van a dar mucho por cu..."
Lo que sí he visto es que en la lista de librerías dinámicas de wiz que nos puso SplinteGU venía libSDL_svg.so, osea que ellos sí pudieron dar con la forma de hacerla dinámica o simplemente no la han probado y le pasa lo mismo que a mí y está corrupta :D. Podría crear un wrapper para probarlo en la wiz a ver si va, pero lo veo un poco innecesario ya teniendo esta que es muy potente.

PD: los que veais el código lo vais a flipar porque la imagen pasa por 4 contenedores distintos hasta llegar a un GRAPH de bennu, he intentado mil formas de eliminar algunos de esos pasos pero siempre me fallaba algo, por ejemplo me he visto obligado a usar un contenedor sdl para el paso intermedio entre el contendedor gtk_pixbuff en el que cargo el svg y el GRAPH de bennu ya que si lo paso directamente a bennu se ve mal debido a que pixbuff guarda los datos en RGBA y bennu lo hace en ABGR y bennu no permite cambiar las máscaras amask,rmask,gmaks,bmask de las que vienen por defecto al usar createpixelformat.
Quizas SplinterGU pueda ayudarme en este punto.
Title: Re: mod_svg
Post by: SplinterGU on February 22, 2010, 08:04:08 PM
primero, muy bueno, gracias...

ahora, respondiendo y preguntando... o al revez...

1) esto tiene pinta de ser pesado... viste cuando consume en memoria?
2) por que no conviertes el mapa RGBA a ABGR?, aunque podria asegurarte que bennu es RGBA... a ver... bits de 0-7 R, 8-15 G, 16-23 B, 24-31 A, esto no es RGBA? o sea, RGBA = 0xAABBGGRR.

la lib SDL_svg no funciona, esa me suena que sera mas liviana y mas portable, obviamente.

como sea, muchas gracias, estan haciendo un buen trabajo alimentando bennu con nuevos modulos.
Title: Re: mod_svg
Post by: DCelso on February 22, 2010, 09:11:35 PM
1.- pues debe consumir lo mismo que una imagen bmp de 32bits con mismo ancho y algo, porque al final del proceso de carga solo queda en memoria el GRAPH resultado, todos los demás contenedores los elimino de memoria a medida que no los necesito, así que lo máximo de memoria gastada será dos veces el tamaño RAW ya que solo habrá a la vez dos contenedores instanciados.

2.- Este otro punto lo he intentado por activa y pasiva también, he hecho un GRAPH con los colores cambiados RGBA (y se ven mal los colores)y luego lo he clonado y a este último le he hecho un bucle por map->data intercambiando R por A  y G por B pero el map resultado tiene otros colores totalmente distintos al color inicial del svg y al grap cambiado.

En cuanto a libsdl_svg si consigues crearme un sdl_svg.dll válido con el código fuente en windows, yo te hago el mod correspondiente, yo lo intenté como mil veces sin éxito. ya que el dll resultado no exporta ninguna función y al llamarlo desde cualquier otro programa me dice que es un dll inváilido.
http://sourceforge.net/projects/sdlsvg/
Title: Re: mod_svg
Post by: SplinterGU on February 22, 2010, 10:10:51 PM
1) :P :P :P... no, no, no... obviamente no me refiero a los graficos, sino a las librerias en si... suena a mucho codigo...

2) deberia funcionar si tienen el formato correcto, sino algo esta mal, obviamente hablamos de 32bits, cierto?

3) que va, si hoy tenia ganas de corregir unos temas de bennu... pero parece que las ganas no fueron suficientes...
Title: Re: mod_svg
Post by: Drumpi on February 23, 2010, 02:01:40 AM
Hombre, DCelso, Bennu lleva integrado la libpng, por si no la has visto, y la libjpeg. Y no lleva la libz, pero si la zlib, por lo que ahi tienes ya unas cuantas que quitar de fuera.
Del XML ya no te se decir, pero como poder programarse se puede, y te lo dice uno que se ha currado un sistema de lectura de comandos en menos de un mes (y los míos son de los "complicaditos", lease Venturer :D).
Del resto ya me callo. Se que es curro, pero mira, poco a poco se podría ir eliminando dependencias. Creo recordar que se hizo una librería que leia XML, si no en Bennu, en Fenix, lo mismo se puede reaprovechar el código fuente.

En fin, mucha suerte, a ver si podemos leer en un futuro los formatos vectoriales. Si encima se pudieran usar directamente en lugar de prerenderizados en mapas... ;D

OFFTOPIC: Creo que podemos decir casi oficialmente que Bennu ha superado a Fenix en número de librerías aportadas por los usuarios :)
Ojalá alguien se animase con VSE, le estaría dando karmas durante una semana entera.
Title: Re: mod_svg
Post by: Windgate on February 23, 2010, 07:24:40 AM
Llevaba mucho tiempo esperando el retorno de DCelso con alguna de sus DLLs extremadamente FREAKS, y ni os cuento el tiempo que llevaba esperando oir la noticia de que Bennu soporta vectoriales... Un paso más para hacer frente a Flash.

Voy a probarlo, gracias, karmas, y todo eso :D
Title: Re: mod_svg
Post by: DCelso on February 23, 2010, 04:55:29 PM
SpliterGU, aqui te pongo la versión anterio del módulo mod_svg en el que no uso SDL simplemente uso datos de BennuGD.
Podrás ver el resultado tan malo que consigo debido a lo que te comenté de RGBA y AGBR.
He hecho que el módulo genere un png en cada paso que voy dando para ver donde se cambia la información de color, y se produce justo al pasar de un contenedo gtk_pixbuff al contendedor GRAPH de Bennu.
En el directorio llamado "prg" puedes ver las imágenes resultado.
El código de inversión de colores es el siguiente:

map = bitmap_clone(tmp);  // copio el bitmap Bennu para romper la dependencia del buffer de pixbuff
bitmap_destroy(tmp); // libero memoria del bitmap Bennu que compartia buffer con pixbuff
g_object_unref(pixbuf); // libero mempira del pixbuff

gr_save_png(map,"02_loadSVG_salida.png");

// bucle para tranformar RGBA a ABGR
{
char * data = ( char*) map->data;
int i;
int len =map->width*map->height;
char aux =0;
printf("len: %d\n",len);
for (i=0; i<len*4;i+=4){
//printf("i: %d\n",i);
aux = data[i];
data[i]=data[i+3];
data[i+3]=aux;
aux = data[i+1];
data[i+1]=data[i+2];
data[i+2]=aux;
}
}

Title: Re: mod_svg
Post by: FreeYourMind on February 23, 2010, 05:30:27 PM
Spoofed Executable Detected! An attempt was made to download a disguised executable file.
Transaction ID is 4B84108DA23E340C95BE


Ole toro! que has puesto ahí hombre ;)
Title: Re: mod_svg
Post by: DCelso on February 23, 2010, 06:02:34 PM
killo, quien te dice eso que me lo cargooo, pues adjunto no van ningun ejecutable, solo va el dll
Title: Re: mod_svg
Post by: FreeYourMind on February 23, 2010, 06:42:41 PM
Los de mi empresa, ahora que estoy en casa ya me va  ;D
Title: Re: mod_svg
Post by: SplinterGU on February 23, 2010, 07:07:20 PM
por que no imprimes el contenido de pixel en formato hexadecimal en su fuente y con el valor correcto?

creo que con eso te daras cuenta cual es el problema.
Title: Re: mod_svg
Post by: DCelso on February 23, 2010, 07:48:06 PM
tengo serios problemas con el lenguaje, no me entero de nada cuando nos contestas :(. Me temo que voy a tener que ir a un curso de informática de niños y otro de lingüistica :(.
Se nota que eres mas docto en estos temas :D
¿Imprimir que cosa?
yo tengo un buffer de chars en el que cada cuatro chars hacen un color de un pixel.
Title: Re: mod_svg
Post by: SplinterGU on February 23, 2010, 08:29:04 PM
imprimir: mostrar, usar printf, usar say, o cualquier otra forma para mostrar por pantalla algun valor...

quizas soy yo que no me explico bien...
Title: Re: mod_svg
Post by: DCelso on February 23, 2010, 11:45:23 PM
sí, eso lo entendí, pero no sé qué quieres que muestre en hexadecimal para ver en qué falla la conversión, he probado a cambiar (a nivel de pixel de 32 bits de color, osea cada cuatro bytes): imagina que están así los datos WWXXYYZZ
el byte 1 por el 4 a la vez que el 2 por el 3. (ZZYYXXWW)
el byte 1 por el 4 sin tocar los otros dos. (ZZXXYYWW)
el hacer un SHL a nivel de dos bytes.  (XXYYZZWW)
el hacer un SHR a nivel de dos bytes  (WWZZYYXX)
Y nada ninguno pone los colores reales del svg, no sé qué combinación me faltará. Para mí que lo suyo sería hacer que los GRAPHs se pudieran crear con distintas MASKs para rgb, ya que esta técnica en SDL_surface funciona, tal y como he mostrado en el mod_svg que funciona correctamente.
Title: Re: mod_svg
Post by: SplinterGU on February 24, 2010, 01:40:42 PM
si mostras en hexa los valores originales antes de la conversion y los que deberian ir (no por conversion)... y si solo debe ser un swap de bytes, entonces te podes dar cuenta de donde le estas errando... incluso si no es swap de bytes y son rotaciones te podes dar cuenta... por lo menos yo me podria dar cuenta si me mostras esos datos...
Title: Re: mod_svg
Post by: DCelso on March 02, 2010, 07:56:27 AM
Splinter, no doy con la tecla, he probado lo que comentas de poner los valores en pantalla y aparentemente todo va bien.

Estaría muy bien si existiera una funcion análoga a SDL_ConvertSurface (http://www.libsdl.org/cgi/docwiki.cgi/SDL_ConvertSurface) pero con bitmaps bennu.

O bien que los bitmaps bennu soportasen rgba masks y shift (http://www.libsdl.org/cgi/docwiki.cgi/SDL_PixelFormat) diferentes para el cálculo de cada componente tal y como lo hace SDL, ya que así será directo el mapeo de datos :D.

Title: Re: mod_svg
Post by: SplinterGU on March 02, 2010, 03:42:05 PM
las mascaras no se pueden cambiar, estan asi intencionalmente para ganar performance...
Title: Re: mod_svg
Post by: SplinterGU on March 20, 2010, 12:40:22 AM
habia posteado en otro hilo esto...

DCelso... tenes que cambiar el byte 0 y el byte 2. El 1 y el 3 quedan como estan.

si te pasa lo mismo que a mi con opengl, entonces esto es lo que tenes que hacer...
Title: Re: mod_svg
Post by: osk on April 05, 2011, 06:30:22 PM
A raiz de la discusión en otro topic sobre los mng, apng, gifs animados y demás fauna variada, he recordado que estaba este módulo para el uso de svg en Bennu. Hace mucho tiempo que no se sabe nada de él. ¿Alguien lo ha usado?¿Funciona bien?¿Hay perspectivas de futuro?¿Podría utilizarse para tener svg animados?¿El Barça ganará la Champions?
Title: Re: mod_svg
Post by: KeoH on December 30, 2011, 01:48:12 AM
Resucito este post.


Resulta que quiero darle uso a este mod ... me es muy util  ... pero no me salen bien los colores de la imagen svg q cargo .. a alguien mas le pasa?
Title: Re: mod_svg
Post by: josebita on December 30, 2011, 01:53:16 AM
¿SO?
Title: Re: mod_svg
Post by: KeoH on December 30, 2011, 02:31:56 AM
no, para windows .... hasta con el ejemplo que viene con la mod_svg en el bennupack me salen mal los colores
Title: Re:mod_svg
Post by: KeoH on August 06, 2012, 12:38:56 AM
Re-resucito este post xDDD Ya que esta DCelso por aquí a ver si le echa un vistazo a esta libreria tambien xDDD pedir es gratis :P
Title: Re:mod_svg
Post by: DCelso on August 06, 2012, 09:58:05 AM
¿falla la librería?

Quizas sea el tipo de svg, bennugd en psp fallaba al leer algunos formatos de imagen y tuve que parchear, puede que sea algo parecido.

¿tienes un ejemplo d svg que falle?
Title: Re:mod_svg
Post by: SplinterGU on August 07, 2012, 03:28:06 PM
podrias comentar que parches?
Title: Re:mod_svg
Post by: DCelso on August 07, 2012, 08:57:56 PM
claro, splinter.
Cuando terminé el año pasado de la psp, te pasé un documento word con los cambios que hice a todo tu código fuente.
En realidad son cuatro chorradas, el documento ocupaba a penas dos páginas, y en él venían esos parches.
Es lo que te comenté en el otro post de psp, algunos formatos de imagen al leerlos y guardarlos en el map de bennu, había que swapear componente R y B.
Voy a intentar extraer la parte de los colores para volvértelos a poner.
Title: Re:mod_svg
Post by: SplinterGU on August 08, 2012, 01:02:27 AM
si no me equivoco era para png, pero eso ya lo habia puesto en la oficial, si no me equivoco...

creo que tambien habia otros parches de swap, creo que son esos que dices.