1

si ca interesse quelqu'un, g porté mon systeme de blit pour la library tinyPtc,
c un framebuffer prenant une place minuscule, pouvant etre utilisé sur de nombreux systeme, http://gaffer.org

mon systeme scanne des images 32 bits, vire la transparence et crée un objet Gfm contenant les infos utile pour jumper et blitter ds le framebuffer
le framebuffer peut etre de nimporte quelle taille, mais les images blitté ac un clipping à la fois à gauche et à droite ne sont pas suportés

la fonction pour transformer une image en objet Gfm :

int* scanImg(int *img, int sx, int sy, int *trClr)
{   int *start, *lend;
    int tfull=0, ttr=0 ; int line=0 ;
    int *dta  = (int*)malloc((sx*sy+sy*42*6)*4) ;        int size ;
    int * jmp = dta+sx*sy ; int * sze = jmp + sy*42*2 ; int * cln = sze + sy*42*2 ;
    int * jmpPtr = jmp ;    int * szePtr = sze ;    int * dtaPtr = dta ; int * clnPtr = cln ;
    int h=sy ;
    img = img + sx*sy ; img -= sx ;
    lend = img + sx ;
    while(h--)
    {  *clnPtr = 0 ;
     while(img < lend)
     { (*clnPtr)++ ;
       start=img ;
       while(img < lend && *img == *trClr) ++img ;

       size = img-start ;
       ttr+=size ; start=img ; *jmpPtr++ = size ;

       while(img < lend && *img != *trClr) ++img ;

       size = img-start ; *szePtr++ = size ;
       if(size) { memcpy(dtaPtr,start,size*4) ; line++ ; dtaPtr+=size ; }
       else {  (*clnPtr)-- ; szePtr-- ; jmpPtr-- ; }
     }; clnPtr++ ;
         lend -= sx ; img = lend-sx ;
    };

    tfull = dtaPtr-dta ;
    int objectSize = 16 + (sy + line*2 + tfull)*4 ;
    int *out = (int *)malloc(objectSize) ; // alloc size for the Gfm data

    #ifdef VERBOSE
           printf("\nalloc %i bytes for the object.",objectSize) ;
    #endif

    int *o = out ;

    *o++ = 0x6d6647 ;            // put signature "Gfm\0"
    *o++ = objectSize ;            // put Gfm object size
    *o++ = sx<<16 | (sy & 65535) ; // put frame size x and y

    #ifdef VERBOSE
        printf("\n\nscan result\n") ;
    #endif

    int c=0 ; jmpPtr=jmp ; szePtr=sze ; dtaPtr=dta ; int cn ;
    while(c < sy)
    {   *o++ = cln[c] ;
        #ifdef VERBOSE
            printf("\nline %i\t %i full lines\t{ ",sy-c,cln[c]) ;
        #endif
        for(cn=0;cn < cln[c];cn++)
        {
          #ifdef VERBOSE
            if(*jmpPtr) printf("+%i ",*jmpPtr) ;
            printf("w%i ",*szePtr) ;
          #endif
          *o++ = *jmpPtr ; *o++ = *szePtr ;
          memcpy(o,dtaPtr,(*szePtr)*4) ; dtaPtr += *szePtr ; o += *szePtr ;
          jmpPtr++ ; szePtr++ ;
        };
        c++ ;
        #ifdef VERBOSE
           printf("}") ;
        #endif
    };      *o++ = 0x2a2a2a2a ; // end check with "****"
        #ifdef VERBOSE
               printf("\n\nobject size : %i bytes", (o-out)*4) ;
               printf("\n\n* total : \ntr   %i\nfull %i\nsum  %i\n%i lines\nsx * sy = %i * %i = %i\n",ttr,tfull,ttr+tfull,line,sx,sy,sx*sy) ;
        #endif
    free(dta) ; return out ;
}


celles pour sauver ou charger un fichier Gfm :

void saveGfm(int *Gfm, const char *path)
{ if(*Gfm != 0x6d6647) return ;
  FILE *f = fopen(path,"w") ;
  fwrite(Gfm,Gfm[1],1,f) ;
  fclose(f) ;
}

int *loadGfm(const char *path)
{ FILE * f = fopen(path,"r") ;
  int  sz[2] ;  fread(sz,8,1,f) ;  rewind(f) ;
  if(sz[0] != 0x6d6647) { fclose(f) ; return NULL ; }
  int *out = (int*)malloc(sz[1]) ;
  fread(out,sz[1],1,f) ;
  fclose(f) ; return out ;
}


celle pour blitter un objet sans clipping en x :

void udrawGfm(int *Gfm, int * scr)  // draw a Gfm unclipped on x
{
    #ifdef ALL_CHECK
        if(*Gfm++ != 0x6d6647) return ; Gfm++ ; // is a Gfm ?
    #else
        Gfm+=2 ;
    #endif
    int sx = *Gfm>>16 , sy = (*Gfm++)&65535 ;
    static int * scrEnd = pixel + WIDTH*HEIGHT - 1 ;
    int lnb, sze ;

    if(scr > scrEnd) return ; // out of screen at up

    int upClip = (scr + sy*WIDTH > scrEnd) ; // is clipped at up ?

    if(scr < pixel) // is clipped at down ?
    {  if(scr + sy*WIDTH < pixel) return ; // out of screen at down
       do{    lnb = *Gfm++ ;
              while(lnb--) { Gfm++ ; Gfm += *Gfm++ ; };
              scr += WIDTH ; sy-- ;
       } while(scr < pixel) ;
    }

    int *screen = scr ; int c = 0 ;
    while(c < sy)
    {  lnb = *Gfm++ ;
       while(lnb--) { scr += *Gfm++ ; sze = *Gfm++ ;
                      memcpy(scr,Gfm,sze*4) ;
                      Gfm += sze ;    scr+=sze ;
       };  scr = screen + WIDTH*(++c) ;
       if(upClip) if(scr > scrEnd) return ;
    };

    #ifdef ALL_CHECK
           if(*Gfm != 0x2a2a2a2a) { printf("\n* draw error, is your Gfm corupt ? chk : 0x%x\n",*Gfm) ; system("pause") ; }
    #endif
}


et celle de blit ac un clipping total (à part à gauche et à droite au mm moment) :

void drawGfm(int *Gfm, int x, int y)
{
    #ifdef ALL_CHECK
      if(*Gfm != 0x6d6647) return ; // is a Gfm ?
    #endif
     int sx = Gfm[2]>>16 ; int sy = Gfm[2]&65535 ;
     static int * scrEnd = pixel + WIDTH*HEIGHT - 1 ;
     if(x >= 0 && x + sx < WIDTH){ udrawGfm(Gfm,pixel + y*WIDTH + x) ; return ; }

     if(x < -sx || x > WIDTH) return ;// out of screen on x
     if(x >= 0) // clip right only
     {   int max = WIDTH-x ;  int lnb, sze ;
         int * scr = pixel + y*WIDTH + x ;
         if(scr > scrEnd) return ; // out of screen at up
         int upClip = (scr + sy*WIDTH > scrEnd) ; // is clipped at up ?
         Gfm += 3 ;
         if(scr < pixel) // is clipped at down ?
         {  if(scr + sy*WIDTH < pixel) return ; // out of screen at down
            do{ lnb = *Gfm++ ;
                while(lnb--) { Gfm++ ; Gfm += *Gfm++ ; };
                scr += WIDTH ; sy-- ;
            } while(scr < pixel) ;
         }

         int *screen = scr ; int c = 0 ; int * lend ;
         while(c < sy)
         {  lnb = *Gfm++ ; lend = scr + max ;
            while(lnb--) { scr += *Gfm++ ; sze = *Gfm++ ;
                           if(scr + sze < lend) memcpy(scr,Gfm,sze*4) ;
                           else if(scr < lend)  memcpy(scr,Gfm,(lend-scr)*4) ;
                           Gfm += sze ;    scr+=sze ;
            };  scr = screen + WIDTH*(++c) ;
            if(upClip) if(scr > scrEnd) return ;
         };
     } else if(x+sx < WIDTH) { // clip left only
         int lnb, sze ; int *s = pixel + y*WIDTH ; int *scr = s+x ;
         if(s > scrEnd) return ; // out of screen at up
         int upClip = (s + sy*WIDTH > scrEnd) ; // is clipped at up ?
         Gfm += 3 ;
         if(s < pixel) // is clipped at down ?
         {  if(s + sy*WIDTH < pixel) return ; // out of screen at down
            do{ lnb = *Gfm++ ;
                while(lnb--) { Gfm++ ; Gfm += *Gfm++ ; };
                s += WIDTH ; sy-- ;
            } while(s < pixel) ;
         }
         scr = s+x ; int *screen = scr ; int c=0 ; int size ;
         while(c < sy)
         {  lnb = *Gfm++ ;
            while(lnb--) { scr += *Gfm++ ; sze = *Gfm++ ;
                           if(scr >= s)   memcpy(scr,Gfm,sze*4) ;
                           else if(scr + sze > s) { size = (scr + sze)-s ;
                                                    memcpy(s,Gfm+(sze-size),size*4) ;
                                                  }
                           Gfm += sze ;    scr+=sze ;
            };  scr = screen + WIDTH*(++c) ; s = scr-x ;
            if(upClip) if(s > scrEnd) return ;
         };
     } else { // clip left and right
         #ifdef VERBOSE
                printf("\nyet, not implemented\n") ;
                system("pause") ;
         #endif
         return ;
     }
    #ifdef ALL_CHECK
           if(*Gfm != 0x2a2a2a2a) { printf("\n* draw error, is your Gfm corupt ? chk : 0x%x\n",*Gfm) ; system("pause") ; }
    #endif
}


le code est en c++ mais peut facilement etre adapté en c (l'objet Gfm n'est pas un objet, juste une zone de memoire)
vous devez utiliser le meme environement que pour le template de tinyPtc,
cad la hauteur de la fenettre doit etre mise ds le define HEIGHT, la longueur ds WIDTH, et le framebuffer doit s'apeller pixel :

#define WIDTH 320
#define HEIGHT 240
#define SIZE WIDTH*HEIGHT
static int pixel[SIZE];

2 define pour *configurer* les fct de blit :

#define VERBOSE indique si l'on doit afficher les info de debug
#define ALL_CHECK indique si les fct de blit doivent tester la validité de l'objet

[edit] corection de qq petites erreurs
et la le mec il le pécho par le bras et il lui dit '

2

Ah je comprends pourquoi tu disais que sdl ça sux. Effectivement si tu utilises sdl que pour obtenir un plan de bits, tu sors l'artillerie pour abattre une mouche.

Hmmm sinon, question réutilisabilité du code, tu devrais prendre les dimensions de l'image en argument. Ca t'évitera d'avoir à retoucher le code si un jour tu as besoin de travaillers avec des images de tailles différentes.

3

non, je disais que sdl suxx car la version pc de falldown que g ecrite ac sdl tourne différement sur chaque pc que g testé
et je l'ai ecrit ac les fct de blit de sdl, pas en tappant directement ds le buffer, mais le prblm viens des timers visiblement ...
enfin bon, ca fait chier de devoir inclure la dll de sdl qui fait 200k alors que je cré des exe de 16ko ac tinyPtc, sans devoir utiliser de dll

les fonctions que g ecrite pour tinyPtc peuvent blitter nimporte quelle taille d'image, sur nimporte quelle taille de fenettre,
la seule limitation est le clipping gauche et droit en mm temps que je me suis pas motivé a coder..
les tailles sont incluses ds *l'objet* Gfm, ds le 3eme int : int sx = Gfm[2]>>16 ; int sy = Gfm[2]&65535 ;

voila en gros le format Gfm :

4 octet "Gfm\0"
4 octet pour la taille de l'objet, en octet
2 octet pour la taille x, 2 pour la taille y

apres, pour chaque ligne de l'image (en partt du bas, les coordonnées de blit en Y sont depuis le bas de l'ecran dailleur) :

4 octet pour le nombre de ligne pleines de la lignes (ie les groupes pas transparent)
et pour chaque groupes non transparent :
4 octet indiquant le jump a effectuer ds le framebuffer, 4 octet pour la taille a blitter, puis n*4 octet contenant les data a blitter (c un format 32 bit uniquement)
et ainsi de suite ... jusqu'a ce qu'on ai tt les groupes de la lignes, puis on recommence jusqu'a ce qu'on arrive a la ligne du haut de l'image

ca a l'air compliqué comme ca mais c supper simple et beaucoup moins contraignant que la version gp32 de ce systeme de blit ^^
en + les objet Gfm se compresse super bien :]

[edit] si sa interesse qq, les sources de falldowns sous devcpp et sdl sont ici.
et la le mec il le pécho par le bras et il lui dit '

4

En meme temps sdl utilise l'acceleration graphique non?

5

surement, mais je prefere utiliser mon code smile
et puis vive le bas niveau, surtout que c comme la gp, un framebuffer et .. c tout smile

en + pour les 2 petit jeux que g commencé ac tinyPtc, l'utilisation proc est à 0 (en zoom 1/1) pour ~60img/sec
l'exe est tout petit, et encore plus compressé ac upx, on peut faire du zoom juste en redimensionnant la fenettre, la fermer en cliquant sur la croix,
et compiller en utilisant vfw gdi ou directx, on peut aussi utiliser le mmx (ca j arrive pas mais bon c possible :]
et puis ca marche pareil sur chaque pc, pas comme ac sdl (ok je doit pas savoir bien l'utiliser mais c pas une raison)

le seul probleme c que ce n'est QUE un framebuffer, les touches et timer doivent utiliser les fonctions systeme, enfin bon c pas trop grave :]
et la le mec il le pécho par le bras et il lui dit '

6

"non, je disais que sdl suxx car la version pc de falldown que g ecrite ac sdl tourne différement sur chaque pc que g testé
et je l'ai ecrit ac les fct de blit de sdl, pas en tappant directement ds le buffer, mais le prblm viens des timers visiblement ...
enfin bon, ca fait chier de devoir inclure la dll de sdl qui fait 200k alors que je cré des exe de 16ko ac tinyPtc, sans devoir utiliser de dll "

mon pauvre rov grin

tu ne t'ai pas appercu qu'il y avait avec SDL une lib pour le framerate, C'est a dire limiter le fps pour que celui ci soit pareil pour toute les machine grin

au final, avec SDL tu t'en sort qu'avec une seul DLL, et ca ne rame pas , pas comme avec Tinyptc wink

avatar
pourquoi la mort ? parce qu'elle nous est si douce, au contraire de la vie :)

7

essai donc la derniere version de gtris sur wdows qui utilise tinyPtc ac une sortie en directx :-)

http://procvor.free.fr/download/bin/Gtris.btday.rar

ce que je faisais avant utilisais vfw pour afficher et ca ramais seulement si ct zoomé
maintenant tu peut mettre le zoom que tu veut et c bon smile
(de plus ac sdl tu peut pas zoomer :P )

apres j'utilise un simple sleep pour avoir 66 fps constant a nimporte quel zoom et 0 en temps proc

pour les timers ceux de wdows marchent tres bien
et la le mec il le pécho par le bras et il lui dit '

8

Bien sur que si on peut zoomer en SDL...

Autrement, ton code est fort interessant ca cela permettra a d'autre personnes de pouvoir utiliser tinyptc comme alternative.

Sinon bonjour Fagemul

9

je ne savais pas que l'on pouvais zoomer ac sdl, en tt cas ac les test que j'avais effectué (du moins c pas natif visiblement).

pour moi, c plutot sdl l'alternative, je ne vois aucun avantage a l'utiliser..

de plus actuellement je modifie pas mal tinyPtc, style on peut maintenant passer du mode fenétré en mode plein ecran en apuyant simplement sur une touche..

sdl ca suxx, ac tinyPtc, ds 31ko (sous upx) je met un framebuffer, un player xm et un xm (de 20ko), montrez moi la mm chose ac sdl smile

(dsl anata mais j'avais pas vu que ton msg datais de 4 mois ... faudrais que je reprenne le net neutral)

> Autrement, ton code est fort interessant ca cela permettra a d'autre personnes de pouvoir utiliser tinyptc comme alternative.

merci smile
la c une vieille version, le code a pas mal evolué depuis, et des outils on vu le jour
mais bon, faudrais que je me motive a refaire gdl pour pc ....
ou sont donc passée mes nuit blanches ??!

> au final, avec SDL tu t'en sort qu'avec une seul DLL
pas si tu veut utiliser la lib sonore.. ca fait tt de suite une dll de plus, vive les exe autonomes wink
'old school coding is the true way to the light' comme disais Tz :-)
et la le mec il le pécho par le bras et il lui dit '

10

t'as benché les perf entre ta lib et SDL par exemple ?

11

En meme temps c est quand meme facile comme comparaison sachant que sdl est multi plateforme et permet meme de developpe sur psp. Qu elle permet de gerer bcp de media etc...

12

> au final, avec SDL tu t'en sort qu'avec une seul DLL
pas si tu veut utiliser la lib sonore.. ca fait tt de suite une dll de plus, vive les exe autonomes wink 'old school coding is the true way to the light' comme disais Tz :-)
Euh tu sais pas te servir de ton linker....

13

> t'as benché les perf entre ta lib et SDL par exemple ?

non, mais je pense pas que sdl soit plus rapide que directx ..
apres pour mes fct de blit appelant 15000 memcpy je ne dis pas :]

> En meme temps c est quand meme facile comme comparaison sachant que sdl est multi plateforme et permet meme de developpe sur psp. Qu elle permet de gerer bcp de media etc...

tinyPtc a aussi bc de plateforme .. pour le reste, ce n'est qu'un framebuffer
et justement, sdl gere trop de chose à mon gout neutral
(dailleur petite parenthese, pkoi tt les logiciel parte en couille a gerer des millions de truc ?)

> Euh tu sais pas te servir de ton linker....
je sais smile mais j'avais pourtt essayé de transformer les dll en .lib pour devcpp, sans succes :/


petite question qui n'a rien a voir, pourquoi ac vc++ je ne peut pas initialiser des variables globales ac une fonction ?
ca ne met aucune erreur mais ca marche pas neutral
et la le mec il le pécho par le bras et il lui dit '

14

les logiciels ne partent pas "en couille", ils grandissent et donc, gèrent plus de choses pour permettre aux gens de faire des choses plus complexes si elles le veulent.

je ne vois pas pkoi vc++ ne pourrait pas le faire... si il connait les variables, ca doit marcher...

15

> les logiciels ne partent pas "en couille", ils grandissent et donc, gèrent plus de choses pour permettre aux gens de faire des choses plus complexes si elles le veulent.

pour moi, je dl un firewall, je veut qu'il ne fasse que ca, pas qu'il gere les popup, les spam ect surtt s'il a une interface neuneuisante comme il est de coutume maintenant..
pour la peine j'utilise une vielle version de kerio :/

> je ne vois pas pkoi vc++ ne pourrait pas le faire... si il connait les variables, ca doit marcher...

bah il connais les variables, les fonctions, mais ca marche pas, faut que je le fasse à la main

style int *moon[3] = { data2Gfm(moon0),data2Gfm(moon1),data2Gfm(moon2) };
ben ca marche pas, je peut pas compresser mes gfx neutral

mais ca doit venir des options du projets, g du mettre celle de minifmod sinon ca ne fonctionnais pas ..
et la le mec il le pécho par le bras et il lui dit '

16

Certe la libsdl sous windows est grosse, mais rien n'empeche de la recompiler en static et bien sur de virer ce qui est ininteressant pour ce que tu souhaites faire... Genre l'opengl, si tu en as pas besoin.... etc etc.

SDL ou Tptc c'est juste des wrappers sur DirectX faut pas se tromper voir le GDI ou OPENGL.
Tptc a mon avis ne peut pas etre compare a SDL car il y a moult choses plus abouties en SDL. (mais c'est qu'un avis parmi tant d'autres smile ).

>style int *moon = { data2Gfm(moon0),data2Gfm(moon1),data2Gfm(moon2) };
>ben ca marche pas, je peut pas compresser mes gfx

Visual marche bien mais la, ce que lui demande n'est pas tres coherent. Si tu veux pouvoir appeler des fonctions via un tableau d'adresses de fonctions ; il faut utiliser un pointeur de fonction et non un pointeur simple sur un int.

Ex : /* utilisation d'un tableau de pointeurs sur fonctions */ #include <stdio.h> int fonction1(int valeur) {      printf("-> fonction 1 : %d\n",valeur);      return 0; } int fonction2(int valeur) {      printf("-> fonction 2 : %d\n",valeur);      return 0; } int fonction3(int valeur) {      printf("-> fonction 3 : %d\n",valeur);      return 0; } int main(int argc, char *argv[]) {      int (*ptrfonction[])(int) = {fonction1,fonction2,fonction3};      int i;      for (i=0 ; i < 3 ; i++)      {           ptrfonction[i] (i); /* Attention le crochet n'a pas ete pris c'est bien ptrfonction "crochet ouvrant" i "crochet fermant" "ouvrir parenthese" i "fermer parenthese" "point virgule" */      }      return 0; }

Bon certe en assembleur tu peux faire un tableau de pointeurs sur n'importe quel type de fonctions en te souciant pas du typage mais en c ce n'est pas le cas.

17

> Visual marche bien mais la, ce que lui demande n'est pas tres coherent. Si tu veux pouvoir appeler des fonctions via un tableau d'adresses de fonctions ; il faut utiliser un pointeur de fonction et non un pointeur simple sur un int.

en fait le parseur de txt à compris que je voulais mettre de la couleur...

it int *moon[3] = {le vrai code eta ...... avec data2Gfm une fonction renvoyant un pointeur sur entier

> Tptc a mon avis ne peut pas etre compare a SDL car il y a moult choses plus abouties en SDL. (mais c'est qu'un avis parmi tant d'autres smile ).

tout depend de ce que tu veut faire,
moi je prefere tout faire moi meme, ac sdl on n'a juste a se pencher sur l'app ou le jeux en lui meme, tout ce qui est autour a déjà été codé ! c bc moins marrant
et la le mec il le pécho par le bras et il lui dit '

18

sans doute beaucoup moin marrant, mais surtout moin prise de tete grin

vois pas se que peut changer le fait d'avoir une voir 3 ou 4 dll avec son programme, on est plus a l'air des dino, tout le monde a l'adsl, c'est pas 4 a 5Mo pour un jeu qui vont te faire chier (désolé si tes encore en 56k grin )

bref, je prefere utiliser SDL que TinyTCP, je ne cherche pas a avoir un exe petit, mais un jeu fonctionnel chez tout le monde grin

surtout que maintenant avec la gp2x, ben ton tinytcp, tu peux te le foutre ou je pense grin

qui a dit qu'il n'y avait que le pc hein ? smile
avatar
pourquoi la mort ? parce qu'elle nous est si douce, au contraire de la vie :)

19

si tu prefere coder sur une portable comme sur pc, c ton choix, moi je prefere faire le contraire smile

> on est plus a l'air des dino, tout le monde a l'adsl, c'est pas 4 a 5Mo pour un jeu qui vont te faire chier (désolé si tes encore en 56k )

j'avais un 33k, pas un 56 mais now j'ai plus rien...
enfin bon, c pas parseque mes exe font 64ko que le jeux entier fait pas 5mo, style le dernier, picore, ou j'ai inclu 64 zique, ds un rar de 5 mo wink

> qui a dit qu'il n'y avait que le pc hein ?

tu est bien placé pour savoir tt ce que j'ai realisé sur portable non ?
et la le mec il le pécho par le bras et il lui dit '

20

mais on sait tout se que tu as fait sur portable rov grin

Mais maintenant, pour SDL, je n'utilise que la DLL sdl.dll, rien d'autre wink

Bon apres si quelqu'un veut se faire chier a tout refaire , c'est son droit, mais vois le temp perdu a ca, qui peut etre mis a faire d'autre chose bien plus abouti smile

désolé de repondre que maintenant, j'etais tres mais alors tres tres occupé grin
avatar
pourquoi la mort ? parce qu'elle nous est si douce, au contraire de la vie :)