GraphLibComposer (Multiplataforma) y openSource..

Started by Erkosone, January 11, 2016, 05:06:15 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Erkosone

- Estoy liado con el algoritmo de escritura de los fpg, en cuanto lo complete y funcione sin bugs cuelgo una primera versión para los 3 sistemas operativos.
Un saludo.

Drumpi

Erkosone, si necesitas ayuda, te puedo subir código Bennu que es capaz de leer o escribir FPGs de 8 y 16 bits, y no me refiero a load_fpg ;)
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)

Erkosone

Gracias Drumpi, pues no estaría mal el de 16 bits, aunque ahora mismo estoy flipando para escribir un array dinámico de bytes con toda la información de un fpg jejeje...
Esto es mas peliagudo de lo que parece..


Ya casi lo tengo.. estoy ya en la parte de la reserva de memoria dinámica para el contenido rgba y listo, dumpeo pixels al array y a probar a cargar los fpg creados con este programa en bennuGD  :)


El código la verdad es que se las trae.. menos mal que en processing/java hay muchas herramientas para simplificar estas cosas.. si esto fuera C habría desistido jaja..



byte[] mapToBytes(bennuGDFpg fpg, int numMap) {
  /*
   8  codigo de grafico..
   33 descripcion de grafico..
   12 nombre de archivo..
   8  ancho y alto..
   4  numero de puntos de control..
   n = numero de cp * 4 -> almacenar coordenadas de cpoints..
   m = rgba info..
   */
  int seek = 0;
  byte[] arr = new byte[64];
  // codigo del grafico..
  byte[] buffer = getBytesFromInt(numMap);
  arr[0] = buffer[0];
  arr[1] = buffer[1];
  arr[2] = 0;
  arr[3] = 0;
  // descripcion del grafico..
  seek = 7;
  // inyectar los bytes de la descripcion..
  byte[] descGr = new byte[32];
  int lenDesc = myFpg.maps[numMap].description.length();
  for (int j=0; j<lenDesc-1; j++) {
    char c = myFpg.maps[numMap].description.charAt(j);
    descGr[j] = byte(c);
    arr[seek] = descGr[j];
    seek++;
    //println(seek);
  }
  // inyectar los bytes del nombre..
  seek = 40;
  byte[] nameGr = new byte[12];
  int lenName = myFpg.maps[numMap].name.length();
  for (int j=0; j<lenName; j++) {
    char c = myFpg.maps[numMap].name.charAt(j);
    nameGr[j] = byte(c);
    arr[seek] = nameGr[j];
    seek++;
  }
  // inyectar el ancho..
  seek = 52;
  byte[] ancho = getBytesFromInt(myFpg.maps[numMap].ancho);
  arr[seek] = ancho[0];
  arr[seek+1] = ancho[1];
  arr[seek+2] = 0;
  arr[seek+3] = 0;
  // inyectar el alto..
  seek = 56;
  byte[] alto = getBytesFromInt(myFpg.maps[numMap].alto);
  arr[seek] = alto[0];
  arr[seek+1] = alto[1];
  arr[seek+2] = 0;
  arr[seek+3] = 0;
  // inyectar el numero de puntos de control..
  seek = 60;
  int numCp = 0;
  for(int c=0; c<999; c++){
    if(myFpg.maps[numMap].cpoint[c] != null){
      numCp ++;
    }
  }
  byte[] cps = getBytesFromInt(numCp);
  arr[seek] = cps[0];
  arr[seek+1] = cps[1];
  arr[seek+2] = 0;
  arr[seek+3] = 0;
  // Primera expansión dinamica del array de bytes..
  // si numCp > 0 reservar bytes para almacenar los cpoints..
  if(numCp > 0){
    int newBytesSize = numCp * 4;
    arr = expand(arr, arr.length + newBytesSize);
    // una vez reservado el espacio en el array procedo a rellenar la información de los puntos..
    seek = 64;
    for(int c=0; c<999; c++){
      if(myFpg.maps[numMap].cpoint[c] != null){
        byte[] cpx = getBytesFromInt(myFpg.maps[numMap].cpoint[c].x);
        byte[] cpy = getBytesFromInt(myFpg.maps[numMap].cpoint[c].y);
        arr[seek+0] = cpx[0];
        arr[seek+1] = cpx[1];
        arr[seek+2] = cpy[0];
        arr[seek+3] = cpy[1];
        seek += 4;
      }
    } 
  }
  // Segunda expansión dinamica del array de bytes..
  // Reservo espacio para la información rgba de la imagen..
  int newBytesSize = myFpg.maps[numMap].ancho * myFpg.maps[numMap].alto * 4;
  arr = expand(arr, arr.length + newBytesSize);
  return arr;
}





Así lo unico que he visto 'raro' es una inconsistencia que tiene el formato .fpg y es que usa WORDS de 4 byte´s para guardar el ancho y alto de una imagen y luego usa extrañamente words de 2 bytes para guardar cada dato de la tabla de cpoint´s, es un poco raro.. se me descuadraba todo hasta que me he dado cuenta de que la x/y de los cp van a tiradas de 2 byte.
Creo que casi tengo esto listo jeje..

Drumpi

No, los tamaños de los mapas son de tipo INT = 4Bytes. Luego los datos ocupan 1Byte por pixel en mapas de 8 bits, 2Bytes (1 WORD) por pixel en mapas de 16bits, y 4Bytes (1 INT) en mapas de 32 bits.

Te paso el include que usaba para un programa que me cambiaba los pixels de un color por los de otros. Siento no poder limpiártelo.
El proceso está en la última función: ahí te guarda los datos como BMP, como FGC (el formato que iba a sustituir a los FPG), como MAP o como FPG. Es importante que mires cuándo se guardan las "cabeceras", las paletas y los datos (eso se dice en las funciones más atrás). Los FPG comparten muchos datos con los MAPs, por lo que es posible que veas que se mezclan unas cosas con otras.
Al final, lo que tienes que ver es qué tipo de dato se usa en cada FWRITE (ya sabes: BYTE = 8bits, WORD = 16bits, INT = 32bits).

Si tienes alguna duda, hasta el miércoles no creo que te pueda hacer una versión límpia.

De todas formas, en Java, los arrays dinámicos ya vienen hechos, sólo necesitas una int List(), por ejemplo, y empezar a usar add(int), no tienes ni que reservar memoria.
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)

Erkosone

Huueeeheee!!!! ya soy capaz de escribir archivos fpg correctamente a 32 bits!


Gracias por la info Drumpi, en cuanto tenga un rato la miro, al final me he encabezonado y lo he hecho haciendome una función como la fwrite() de div XD..


Creo que esta tarde cuando vuelva del curro podré compilar una primera versión para mac y windows, y la de linux en cuanto me instale un ubuntu o algo así.
El tema de los 16 bits lo miraré lo antes posible para dar soporte también. pero ya a 32 bits pudiendo leer y escribir estoy contento jeje.




Erkosone

Vale pues ya he solucionado el problema que tenia, se ve que en java todo son punteros y hacer una asignación royo  buffer = myImage lo que hace es que buffer apunta a la imagen y cuando la modificas pues la grabas modificada XD..


Bueno.. pajareos a parte.. procedo a compilar las versiones 1.0 para MacOSX y para windows y las cuelgo en un momento.
Haber que tal os funcionan ;)

Erkosone

Disponible para windows, linux y mac.


Versiones nativas a 32 y 64 bits.


Necesita java instalado en la maquina "esto cambiará en breve" será portable..


DESCARGA: https://dl.dropboxusercontent.com/u/65979707/bennuGD/GraphLibComposer.zip


Soporta drag & drop para fpgs e imagenes.
Solo para fpg formato 32 bits por ahora.
Hacer click en el diskete de guardar como y guarda en fpg 32 bit.


Haber que tal os funciona.
Solo está testeado en MacOSX mavericks 10.9 y windows 10 64 bit.

Drumpi

#22
Pues no sé si hago algo mal o qué pasa, pero me he instalado Java 6 y Java 7 en mi Kubuntu 12.04 x64 y no me ha funcionado con ninguno.
Con Java 6 me da el siguiente fallo:
sh GraphLibComposer
Exception in thread "main" java.lang.UnsupportedClassVersionError: GraphLibComposer : Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
Could not find the main class: GraphLibComposer. Program will exit.


Luego he usado
sudo update-alternatives --config java
Para establecer Java 7 como el Java por defecto, y me ha dado:

sh GraphLibComposer
Exception in thread "main" java.lang.UnsupportedClassVersionError: drop/DropEvent : Unsupported major.minor version 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2625)
        at java.lang.Class.getMethod0(Class.java:2866)
        at java.lang.Class.getMethod(Class.java:1676)
        at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)


También debo decir que uso el OpenJDK en lugar del oficial, y que he probado un programa que había compilado en Eclipse hace tiempo, y me funciona bien  :-\ [/code]

PD: Intentaré echarle un vistazo al código cuando abra Eclipse, a ver por qué te fallan los FPGs de 8 y 16 bits... aunque en un primer vistazo, podrías haber separado las clases en diversos ficheros, para una mejor lectura ;)
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

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Erkosone

Hola Drumpi, el source no es el archivo java, son los varios archivos .pde que están en processing, el archivo .java es el archivo de salida al compilador que crea el IDE de processing cuando verifica la sintaxis y demas.


Vale, veo que lo que te pasa es una incompatibilidad entre versiones, voy a instalarme ubuntu y processing para ubuntu y me preparo el entorno con las librerías necesarias y hago un paquete portable, como he añadido ya que funcionen los botones que me faltaban creo que a falta de poder setear puntos de control ya hace lo mas basico.


Dejame que prepare el entorno y lo cuelgo para linux completamente portable sin ninguna dependencia de nada.


Buenas Splinter, gracias!

Drumpi

Mmm, vale, es que no conozco processing... y buscar un paquete que lo incluya es complicado :D
Sólo estaba probando en Kubuntu, a ver si funcionaba, más que nada, porque es lo que suelo usar para navegar. Para desarrollo y lo demás siempre uso Windows.
...Bueno, y eso, para comprobar si es multiplataforma :D :D :D

Que si necesitas algo de Linux, hay unos cuantos por aquí que lo usamos.
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)

Erkosone

Anoche me instalé Ubuntu ultima versión del repo oficial y al instalar processing me dice que "java no está instalado", me instalo java 1.7 desde el centro de software de ubuntu y parece ser que o en linux es todo pura alegria por que al iniciar processing me salta un error de que no tengo una fuente instalada XD..


Bueno, me acabo de levantar, cafe en mano me dispongo a ganar esta batalla, y una vez logre hacer andar a processing es tan simple como compilar y listo pero el maldito se me resiste por el momento, sigo con ello.. haber si consigo algo hoy.


Processing es un lenguaje de programación para "gente creativa" pensado en plasmar de forma multimedia cualquier idea "con el minimo esfuerzo", el java basicamente pero simplificado, todo lo que hace que puedas odiar java está contenido en clases que te ahorran un trabajo grande.


La verdad es que está interesante, aunque no tira lo suficiente como para hacer juegos grandes.. para hacer aplicaciones rapidamente está muy bien.

Erkosone

Bueno he conseguido después de mil infiernos montarme el entorno de desarrollo en ubuntu y arranca. Pero me da un error en una librería de interfaz de usuario que me dice que la versión de java es antigua.. Pero parece que solo da ese error. Voy a intentar instalar java 8 haber.. Y si no hago los botones de otro modo y listos. Creo que falta poco para una versión funcional en linux y potable.

Drumpi

Yo seguiría con el 7, que es el que creo que tiene la gente. Hace tres años en la oficina usábamos Java6 pese a que el 7 llevaba como un año en la calle.
Es que incluso en Windows me dice que la versión de Java es antigua. Voy a actualizarla a la última de 7, a ver si así me tira.
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)

Erkosone

Bueno, pues después ha instalado java 1.6 y me sale un error ahún peor, el compilador no encuentra el main de la aplicacion.. creo que la 1.6 ya no es comptible con processing, algo así pone en su web.


El unico motivo de bajar de versión ha sido por la librería sDrop para processing en linux, ya que en windows y mac funciona perfecta esta y todas las demás, pero en linux parece que esta librería está compilada para java 1.6 y no es compatible, el caso es que nunca he compilado una librería para java en linux..


Drumpi, si te cuelgo el source puedes recompilarla con java 1.7? yo por mi parte voy a encabezonarme y a intentarlo también pero veo que esto no es tan simple como parecia jeje.. maldito linux XD..


Bueno, si alguien es capaz de compilar esta libreria en java para linux con java 1.7 se lo agradecería un montón.