mod_svg

Started by DCelso, February 22, 2010, 04:39:00 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

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.
Monstruos Diabólicos

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

FreeYourMind

DCelso, soy tu fan, toma Karma :)

Drumpi

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
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)

osk

Ou Ou Ou YEAAAAHHHHGGGG!!!!!
Karma Police!!!

DCelso

#4
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.
Monstruos Diabólicos

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

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

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/
Monstruos Diabólicos

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

SplinterGU

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...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

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.
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)

Windgate

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
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

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;
}
}

Monstruos Diabólicos

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

FreeYourMind

Spoofed Executable Detected! An attempt was made to download a disguised executable file.
Transaction ID is 4B84108DA23E340C95BE


Ole toro! que has puesto ahí hombre ;)

DCelso

killo, quien te dice eso que me lo cargooo, pues adjunto no van ningun ejecutable, solo va el dll
Monstruos Diabólicos

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

FreeYourMind

Los de mi empresa, ahora que estoy en casa ya me va  ;D

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2