Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » [Fx-CG 10/20] Fonctions utiles
Binary_man Hors ligne Ancien rédacteur Points: 1344 Défis: 19 Message

[Fx-CG 10/20] Fonctions utiles

Posté le 26/11/2011 18:16

Je crée ce topic pour l'avancée de tout le monde pour le développement d'add-ins en C/C++ sur FX-CG10/20.

Le but est de trouver, proposer, corriger des fonctions ou astuces que les membres proposeront(j'espère ).
L'idée m'est venue grâce à des topics similaires sur Omnimaga et sur Cemetech. Malheureusement ce genre de topic n'existait pas sur Planète Casio jusqu'à maintenant. J'espère que ça aidera les gens.

(Ce serait quand même mieux qu'on puisse mettre du code en couleur )

Tous à vos fonctions ! J'en proposerai d'ici peu, le temps de les peaufiner.


Purobaz Hors ligne Membre d'honneur Points: 2690 Défis: 110 Message

Citer : Posté le 05/05/2012 22:08 | #


Salut,

J'ai quelques questions concernant l'utilisation de la VRAM sur Prizm.

En effet sur les calculatrices monochromes c'est simple à comprendre, mais comment mettre de la couleur dans la VRAM de la Prizm.

Aussi est-ce nos fonctions graphiques persos sont plus rapides que les syscalls.
Et si on écrit des fonctions en assembleur, est-ce qu'elle seront plus rapides ? Pourquoi car les syscalls sont aussi en assembleur ?
I'll be back !
pour plus de fun
mes programmes fun
de technique
mes projets
et de Swag
les projets que je soutiens
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

Citer : Posté le 05/05/2012 22:31 | #


Grosso merdo, un short (16 bits) revient à un pixel de la structure suivante:
RRRRRVVVVVVBBBBB
5R-6V-5B

Ce, qui simplifie de loin les fonctions de sprites: il s'agit juste de copier des shorts aux bons endroits sans se soucier d'y décalage.
Demain je publierai les fonctions graphiques que j'ai faites
Purobaz Hors ligne Membre d'honneur Points: 2690 Défis: 110 Message

Citer : Posté le 05/05/2012 22:40 | #


Eiyeron a écrit :
Demain je publierai les fonctions graphiques que j'ai faites

Cool, celles que j'ai intégré à PRGM2 sont encore trop lentes, et ne prennent pas en compte toutes les couleurs.
I'll be back !
pour plus de fun
mes programmes fun
de technique
mes projets
et de Swag
les projets que je soutiens
Pierrotll Hors ligne Ancien administrateur Points: 5488 Défis: 41 Message

Citer : Posté le 05/05/2012 22:43 | #


La Prizm a un écran 16 bits (16 bits par pixels, RGB 5:6:5). La VRAM créée par l'OS fait 384*216 pixels (le premier est en haut à gauche).
Mais l'écran physique fait 396*224 pixels.
Quelques fonctions pour accéder au LCD
Un exemple de VRAM2DD
Quelques exemples de fonctions utilisant tout ça

Pour ce qui est de la vitesse de tes fonctions, la meilleure solution pour comparer est de faire des benchmark (calculer avec RTC_GetTicks le temps que prend ta fonction appelée quelques millions de fois).

Quelque soit le langage compilé dans lequel tu écris ton programme, il sera toujours traduit en langage machine. Ce n'est pas le langage qui fait la vitesse, mais l'optimisation du code. Les compilateurs C d'aujourd'hui sont très forts pour ça, mais en écrivant ton code en asm tu peux t'assurer toi même de son optimisation finale. Mais rappelons-le, le plus important pour la vitesse d'exécution est l'algorithme en lui même, l'optimisation n'apporte que peu.
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

Citer : Posté le 05/05/2012 22:49 | #


Y'a mes sources dans bust-a-move!
Purobaz Hors ligne Membre d'honneur Points: 2690 Défis: 110 Message

Citer : Posté le 06/05/2012 00:04 | #


Tu utilise l'écran physique de 396*224 ?
I'll be back !
pour plus de fun
mes programmes fun
de technique
mes projets
et de Swag
les projets que je soutiens
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

Citer : Posté le 06/05/2012 09:39 | #


Pas encore, pour cela, j'uploaderai, si j peux, les routines. En attendant, je te suggère d'alle vers cemetech, section prizm, useful routines.

Attention: ça demande un buffer de la taille que tu veux, et d'ex trois trucs bonus!

Dans prizm.ld, on peut changer la taille Max de la ram et la rom au moment de la compilation:
Ram: 500k est un chiffre secure
ROM: 1250k

Voilà, vous ne devriez plus avoir de problèmes de mémoire, sauf pour l'allocation dynamique qui dépend de la heap et pas de la ram

Ajouté le 06/05/2012 à 09:52 :
Cliquez pour découvrir
Cliquez pour recouvrir

#include \"graphics.h\"
#include \"txt_spr_loader.h\"
#include \"macros.h\"

void CopySprite(const char* data, int x, int y, int width, int height) {
   char* VRAM = (char*)0xA8000000;
   int j;
   VRAM += 2*(LCD_WIDTH_PX*y + x);
   for(j=y; j<y+height; j++) {
      memcpy(VRAM,data,2*width);
      VRAM += 2*LCD_WIDTH_PX;
      data += 2*width;
   }
}


void CopySprite_Palette(const unsigned char* data, const unsigned short* palette, int x, int y, int width, int height)
{
   unsigned short* VRAM = (unsigned short*)VRAM_ADRESS;
   int i,j;
   unsigned short* ptr = VRAM + y*LCD_WIDTH_PX + x;
   for(j=0; j<height; j++) {
        for(i = 0; i < width; i++)
        {
            *ptr = palette[*(data++)];
            ptr++;
        }
        ptr += LCD_WIDTH_PX-width;
   }
}

void CopySprite_Palette_Alpha_Nibbles(const unsigned char* data, const unsigned short* palette, int x, int y, int width, int height)
{
   unsigned short* VRAM = (unsigned short*)VRAM_ADRESS;
   unsigned short* ptr = VRAM + y*LCD_WIDTH_PX + x;
   int i,j;
   unsigned char nibble;
   for(j=0; j<height; j++) {
                for(i = 0; i < width; i+=2)
                {
                nibble = (*data)>>4;
                        if(nibble) //First Index is taken as alpha
                                *ptr = palette[nibble];
                nibble = (*data) %16;
                        if(nibble)
                                *(ptr+1) = palette[nibble];
                        ptr+=2;
                        data++;
                }
                ptr += LCD_WIDTH_PX-width;
   }
}

void Print_custom(unsigned char* spr, int x, int y)
{
    int i;
    unsigned char spr_buf[54];
    unsigned short spr_pal[3];
    for(i=0;spr[i ];i++)
    {
        if(spr[i ] == \' \') continue;
        load_txt_spr(spr[i ], spr_buf, spr_pal);
        CopySprite_Palette_Alpha_Nibbles(spr_buf, spr_pal, x+6*i, y, LETTER_WIDTH, LETTER_HEIGHT);
    }

}



void set_Pixel(int x, int y, unsigned short color)
{
   unsigned short* VRAM = (unsigned short*)VRAM_ADRESS;
    if(x<LCD_WIDTH_PX && x > 0 && y < LCD_WIDTH_PX && y > 0)
        VRAM[LCD_WIDTH_PX * y + x] = color;
}

unsigned short get_Pixel(int x, int y)
{
   unsigned short* VRAM = (unsigned short*)VRAM_ADRESS;
    if(x<LCD_WIDTH_PX && x > 0 && y < LCD_WIDTH_PX && y > 0)
        return VRAM[LCD_WIDTH_PX * y + x];
}


void Circle(int xi, int yi, int r, unsigned short color)
{
    int x = 0;
    int y = r;
    int d = r - 1;
    while(y>=x)
    {
        set_Pixel( x+xi, y+yi, color);
        set_Pixel( y+xi, x+yi, color);
        set_Pixel( -x+xi, y+yi, color);
        set_Pixel( -y+xi, x+yi, color);
        set_Pixel( x+xi, -y+yi, color);
        set_Pixel( y+xi, -x+yi, color);
        set_Pixel( -x+xi, -y+yi, color);
        set_Pixel( -y+xi, -x+yi, color);
        if(d >= 2*x)
        {
            d -= 2*x+1;
            x++;
        }
        else if (d <= 2*(r-y))
        {
            d += 2*y-1;
            y--;    
        }
        else
        {
            d += 2*(y-x-1);
            y--;
            x++;
        }
    }

}

void Filled_Circle(int xi, int yi, int r, unsigned short color)
{
    int x = 0;
    int y = r;
    int d = r - 1;
    while(y>=x)
    {
/*         set_Pixel( x+xi, y+yi, color);
        set_Pixel( -x+xi, y+yi, color);
*/
        Horizontal_Line(x+xi,-x+xi,y+yi,color);
        
/*         set_Pixel( y+xi, x+yi, color);
        set_Pixel( -y+xi, x+yi, color);
*/
        Horizontal_Line(y+xi,-y+xi,x+yi,color);
        
/*         set_Pixel( x+xi, -y+yi, color);
        set_Pixel( -x+xi, -y+yi, color);
*/
        Horizontal_Line(x+xi,-x+xi,-y+yi, color);
        
/*         set_Pixel( -y+xi, -x+yi, color);
        set_Pixel( y+xi, -x+yi, color);
*/
        Horizontal_Line(y+xi,-y+xi, -x+yi, color);
        
    if(d >= 2*x)
        {
            d -= 2*x+1;
            x++;
        }
        else if (d <= 2*(r-y))
        {
            d += 2*y-1;
            y--;    
        }
        else
        {
            d += 2*(y-x-1);
            y--;
            x++;
        }
    }

}

void Vertical_Line(int x, int y1, int y2, unsigned short color)
{
    unsigned short* VRAM = (unsigned short*)VRAM_ADRESS;
    int i;
    int yi = max(min(y1,y2),0);
    int yf = min(max(y1,y2),LCD_HEIGHT_PX);
    if(x < 0 || x > LCD_WIDTH_PX) return;
    for(i=yi; i <= yf; i++)
        VRAM[LCD_WIDTH_PX*i + x] = color;
}

void Horizontal_Line(int x1, int x2, int y, unsigned short color)
{
    unsigned short* VRAM = (unsigned short*)VRAM_ADRESS;
    int i;
    int xi = max(min(x1,x2),0);
    int xf = min(max(x1,x2),LCD_WIDTH_PX);
    if(y < 0 || y > LCD_HEIGHT_PX) return;
    for(i=xi; i <= xf; i++)
        VRAM[LCD_WIDTH_PX*y + i] = color;
}


void Line(int xi, int yi, int xf, int yf, unsigned short color)
{
    int dx,dy,i,xinc,yinc,cumul,x,y;
    x = xi;
    y = yi;
    dx = xf - xi;
    if(!dx)
    {
        Vertical_Line(xi, yi,yf,color);
        return;
    }
    dy = yf - yi;
    if(!dy)
    {
        Horizontal_Line(xi,xf,yi,color);
        return;
    }
    xinc = ( dx > 0 ) ? 1 : -1;
    yinc = ( dy > 0 ) ? 1 : -1;
    dx = abs(dx);
    dy = abs(dy);
    set_Pixel( x, y, color);
    if ( dx > dy )
    {
        cumul = dx >>1; // dy/2
        for ( i = 1; i <= dx; i++ )
        {
            x += xinc;
            cumul += dy;
            if (cumul >= dx)
            {
                cumul -= dx;
                y += yinc;
            }
            set_Pixel( x, y, color);
        }
    }
    else
    {
        cumul = dy >>2;// dy/2
        for ( i = 1; i <= dy; i++ )
        {
            y += yinc;
            cumul += dx;
            if ( cumul >= dy )
            {
                cumul -= dy;
                x += xinc;
            }
            set_Pixel( x, y, color);
        }
    }
}

void Filled_Rectangle( int xi,  int yi,  int xi2,  int yi2, unsigned short color)
{
   unsigned short* VRAM = (unsigned short*)VRAM_ADRESS;
    int i,j;
    int x = max(0,min(xi,xi2));
    int x2 = min( LCD_WIDTH_PX,max(xi,xi2));
    int y = max(0,min(yi,yi2));
    int y2 = min( LCD_WIDTH_PX,max(yi,yi2));
    VRAM += LCD_WIDTH_PX*y + x;
    for(j = min(y,y2); j < max(y,y2); j++) {
        for(i=min(x,x2); i<max(x,x2);  i++) {
            *(VRAM++) = color;
        }
        VRAM += LCD_WIDTH_PX-(x2-x);
    }
}

void Rectangle(int xi, int yi, int xf, int yf, int stroke, unsigned short color)
{
    int i;
    for(i=0;i<stroke; i++)
    {
        Vertical_Line(xi+i,yi,yf,color);
        Vertical_Line(xf-i,yi,yf,color);
        Horizontal_Line(xi,yf+i,yi+i,color);
        Horizontal_Line(xi,yf-i,yf-i,color);
    }
}


void draw_box(int xi, int yi, int xi2, int yi2, unsigned char mode)
{
    
    unsigned short* VRAM = (unsigned short*)VRAM_ADRESS;
    int i,j;
    int x = max(0,min(xi,xi2));
    int x2 = min( LCD_WIDTH_PX,max(xi,xi2));
    int y = max(0,min(yi,yi2));
    int y2 = min( LCD_WIDTH_PX,max(yi,yi2));
    if(x2-x <16 || y2-y < 16) return;
    
}
voilà, après pour le full screen y\'a 2 modifs à faire
Purobaz Hors ligne Membre d'honneur Points: 2690 Défis: 110 Message

Citer : Posté le 06/05/2012 13:10 | #


T'aurais pas une petite fonction pour lire (puis afficher) un bitmap 24 bits. Merci !
I'll be back !
pour plus de fun
mes programmes fun
de technique
mes projets
et de Swag
les projets que je soutiens
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

Citer : Posté le 06/05/2012 13:30 | #


NOpe, sorry, faut voir dans les sources de l’utilitaire de pierrot
Pierrotll Hors ligne Ancien administrateur Points: 5488 Défis: 41 Message

Citer : Posté le 06/05/2012 15:20 | #


Il est préférable de stocker des bitmaps 16 bits dans l'exécutable, et de faire la conversion avant, pour ne pas ralentir (ni alourdir) inutilement le programme.
Cartix Hors ligne Membre Points: 2748 Défis: 98 Message

Citer : Posté le 06/05/2012 19:50 | #


@ Eyeron : Et c'est toi qui disait à Veb d'utilisé un spoiler pour un aussi ''long'' code ?
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

Citer : Posté le 06/05/2012 19:53 | #


J'étais sur ipod, arriver à mettre ce code a été un exploit, kay?
Cartix Hors ligne Membre Points: 2748 Défis: 98 Message

Citer : Posté le 06/05/2012 20:00 | #


Eiyeron a écrit :

J'étais sur ipod, arriver à mettre ce code a été un exploit, kay?

Vu comme ça, évidemment, ça parrait plus normal

Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

Citer : Posté le 06/05/2012 20:05 | #


Je te dis pas comment il ramait quand j'ai ajouté la ligne après le code...

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 32 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd