Accueil

CPC


 Dev C sur CPC :

  • le C sur CPC
  • SDCC débuter
  • fichier BAT pour compiler
  • Dessiner Sur CPC
  • Optimiser le dessin
  • Ecrire du texte
  • Lire un fichier
  • Ecrire un fichier
  • Swap d'écran
  • CLS ultra rapide
  • H line
  • Attaquer le CRTC
  • Full Overscan
  • Put pixel très rapide
  • Afficher une image
  • Slide show 1
  • Bézier
  • faire un fichier pour Bézier

  • Quelque fonctions utile

  • Animation
  • 3D
  • Raster
  • Manche a balais

    Le plan du Site

  •  
      Ici les nouvelle du site  
     
    Recherche ?
    Saissisez un mot clé

     
      Quelques chiffres
    Visiteurs:11207
    Visiteurs aujourd'hui:1
     
     
    Me contacter
    Donnez votre avis
     
    Le site de Steph : Le CPC

    H Line


    C'est quoi HLine ?
    C'est tout bêtement une fonction pour dessiner un peut plus vite une ligne horizontal, cette fonction vas aller plus vite que la fonction de dessin lineBresenham qui utilise PutPixelMode1, celle ci vas directement écrire si elle le peut le maximum d'octets directement en mémoire, sans avoir à faire les tests et opérations sur les octets pour l'affichage.

    Dans le source, il y a la comparaison entre les deux méthode pour dessiner une ligne horizontale, et y'a pas photo !
    Je ne vous présente ici que la fonction HLine que pour le mode 1, pour les autres modes il faut modifier le calcule de l'adresse du 1er point et le 1er while, en fonction du nombre de point dans l’octet, pour le reste allez voire dans le ZIP, il y a tout...
    Explication :
    - Création d'un octet de référence en fonction de la couleur passé, c'est en fait cette octet que l'on écriras si on le peut, c'est la que l'on gagne bien en rapidité.
    - Met X1 et X2 dans le bon ordre, on dessine toujours de droite à gauche.
    - Calcule de la dresse mémoire du 1er point.
    - Temps que le point à dessiné n'est pas le 1er point d'un octet (aller voire comment les pixels sont organisés en mémoire) on utilise la fonction PutPixelMode1 (aucun gain de temps la).
    - Temps que l'on a encore 4 pixels à tracer on met en mémoire notre octet de référence (c'est la que l'on gagne du temps).
    - Temps que l'on est pas arrivé à x2, on trace les points avec la fonction PutPixelMode1 (aucun gain de temps la).

    Bon, on peut encore aller plus vite, mais se seras pour une prochaine fois ;-)

    // Tracé d'une ligne horizontal avec écriture mémoire directe quand c'est possible
    // x1 : point de début en x de la ligne
    // x2 : point de fin en x de la ligne
    // y : position en y de la ligne
    // nColor : couleur de la ligne
    void HLine(int x1,int x2,unsigned char y, unsigned char nColor)
    {
    // creation de l'octet de référence couleur
    // comme cela on pourras aller plus vite, en remplacent en mode 1 4 pixels d'un coup ci c'est possible !!!
    unsigned char refColor = 0;
    unsigned char *pAdrD; // adresse mémoire de départ de la ligne, elle est calculé quand on auras mis X1 et X2 dans le bonne ordre
    int curX;
    int addAdr;
    
    	// creation de l'octet de référence couleur
    	if(nColor & 1)
    	{
    		refColor |= 240;  // = 128 + 64 + 32 + 16 -> 11110000
    	}
    	if(nColor & 2)
    	{
    		refColor |= 15;  // = 8 + 4 + 2 + 1 -> 00001111
    	}
    	
    	// on remet la ligne dans le bon sans...
    	if(x1>x2)
        {
    		curX=x1;
    		x1=x2;
    		x2=curX;
        }
    	
    	// calcule de l'adresse de dépar de la ligne
    	pAdrD = (unsigned char *)((unsigned int)(0xC000 + ((y / 8) * 80) + ((y % 8) * 2048) + (x1 / 4)));
    	
    	curX = x1;
    	addAdr = 0;
    	// dessine les pixel avant l'octet complet suivant à droite
    	while ( ((curX % 4) != 0) && (curX<=x2) )
    	{
    		PutPixelMode1( curX++, y, nColor );
    		addAdr = 1;
    	}
    
    	//  Temps que octet complet on trace directement 4 point en mémoire
    	while ( (curX + 4) < x2 )
    	{
    		pAdrD[addAdr++] = refColor;
    		curX += 4;
    	}	
    
    	// Dessine les pixels après octet complet
    	while ( curX <= x2  )
    	{
    		PutPixelMode1( curX++, y, nColor );
    	}
    }
    
    
    

    Voila, comme d'hab, le tout se trouve dans se ZIP, bonne écriture ;-)