Affichage avec P96 en C

Forum Amiga Coding Affichage avec P96 en C

  • Ce sujet contient 6 réponses, 2 participants et a été mis à jour pour la dernière fois par stephbb75, le il y a 3 mois et 4 semaines.
  • Créateur
    Sujet
  • #188808
    stephbb75
      • Level 11
      • Messages : 1441

      Salut,

      Je patauge depuis plus 2 semaines pour afficher une image dans une fenêtres avec P96 :cry:

      Donc, j’ai une zone mémoire ou je dessine (la en 24 bit RGB mais cela peut être changer c’est pas un problème) .

      J’ai ouvert mon écran et ma fenêtre pas de problème

      Une partie de mon code :

      Le modeId, depthScreen est récupéré avec ASL_ScreenModeRequest et c’est Ok

      myScr = p96OpenScreenTags (NULL,
      P96SA_Title, (ULONG) »MyScreen »,
      P96SA_Depth, modeID,
      P96SA_Depth, depthScreen,
      P96SA_Pens, (ULONG)pens,
      P96SA_ErrorCode, (ULONG)error,
      TAG_DONE);

      if (!myScr)
      {
      // ecran non ouvert je fait ce qu’il faut pour sortir proprement

      }

      if ( myWin = OpenWindowTags (NULL,
      WA_Title, 0,
      WA_CustomScreen, myScr,
      WA_Flags, WFLG_ACTIVATE | WFLG_NOCAREREFRESH | WFLG_BACKDROP | WFLG_BORDERLESS | WFLG_RMBTRAP,
      WA_IDCMP, IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW | IDCMP_INACTIVEWINDOW | IDCMP_REFRESHWINDOW,
      WA_Left, 0,
      WA_Top, 0,
      WA_Width, widthScreen,
      WA_Height, heightScreen,
      TAG_END))
      {
      // allocation pour l’image
      struct BitMap* MemBitmap = (int *)AllocMem( widthScreen * heightScreen * 3, MEMF_FAST | MEMF_CLEAR);


      Code qui n’a rien a voire

      // la je met les valeurs dans MemBitmap pour ce que je veux afficher.

      Puis la je tente d’afficher se Put… zone mémoire dans la fenêtre !

      Et ensuite quoi que je fasse y’a pas d’affichage au mieux ou un gros plantage au pire
      Comment faire pour que cela s’affiche ?

      Pour le moment mon image est sous forme 8R8G8B mais cela peut être autrement.

      Si qq’un pouvais m’aider.

      Je ne trouve pas grand choses sur le net et les doc en parle très peut.

      https://youtube.com/@stephbb75

    Affichage de 6 réponses de 1 à 6 (sur un total de 6)

    Partager sur vos réseaux sociaux préférés :
    Facebooktwitterredditpinterestlinkedintumblrmail

    • Auteur
      Réponses
    • #188813
      slingshot
        • Level 2
        • Messages : 35

        As tu essayé avec ChatGPT ?

        Quand je mets ton code, il propose de légères différences. Peut etre a tester. :)



        #188818
        stephbb75
          • Level 11
          • Messages : 1441

          Salut,

          Oui, mais chatGPT n’est pas du tout fait pour faire du code ;-)
          Il donne des explications parfois bonne mais bien souvent fausse !!!

          Il faut simplement savoir que cela fait des phrases juste en calculent la probabilité du mot suivant, aucune raisonnement, rechercher ou autre.
          C’est bien pour écrire un texte mais pour du code c’est pas fait pour, surtout pour du code sur des machines et langages ancien.
          Il semble s’en sortir avec les langages actuel mais c’est simplement du au fait qu’il y a beaucoup de sources accessible.

          enfin c’est pas le sujet :lol:

          https://youtube.com/@stephbb75

          #188825
          slingshot
            • Level 2
            • Messages : 35

            je m’en sers régulièrement pour optimiser mon code en Java et c’est impressionnant. En C, je ne sais pas.

            #188826
            slingshot
              • Level 2
              • Messages : 35

              Voila ce qu’il pond comme code quand on lui demande ! :D

               

              #include <exec/types.h>
              #include <exec/memory.h>
              #include <graphics/gfx.h>
              #include <graphics/rastport.h>
              #include <intuition/intuition.h>
              #include <intuition/screens.h>
              #include <intuition/intuitionbase.h>
              #include <libraries/Picasso96API.h>
              #include <proto/exec.h>
              #include <proto/intuition.h>
              #include <proto/graphics.h>
              #include <proto/picasso96api.h>
              #include <stdio.h>
              #include <stdlib.h>
              #include <string.h>

              #define WINDOW_WIDTH 640
              #define WINDOW_HEIGHT 480

              // Chemin de l’image à afficher
              #define IMAGE_PATH « RAM:monimage.rgb »

              // Fonction pour charger une image RGB brute (exemple simple)
              UBYTE* ChargerImage(const char* path, ULONG* largeur, ULONG* hauteur) {
              FILE *f = fopen(path, « rb »);
              if (!f) {
              printf(« Erreur : Impossible de charger l’image.\n »);
              return NULL;
              }

              // On suppose une image 640×480 en RGB pour cet exemple
              *largeur = WINDOW_WIDTH;
              *hauteur = WINDOW_HEIGHT;
              ULONG size = (*largeur) * (*hauteur) * 3;
              UBYTE *buffer = (UBYTE*)AllocMem(size, MEMF_ANY);

              if (buffer) {
              fread(buffer, 1, size, f);
              }
              fclose(f);
              return buffer;
              }

              int main() {
              struct Screen *ecran = NULL;
              struct Window *fenetre = NULL;
              struct RastPort *rastport = NULL;
              ULONG largeur, hauteur;
              UBYTE *imageBuffer;

              // Charger l’image RGB brute
              imageBuffer = ChargerImage(IMAGE_PATH, &largeur, &hauteur);
              if (!imageBuffer) {
              return 1;
              }

              // Ouvrir un écran Workbench
              ecran = OpenScreenTags(NULL,
              SA_DisplayID, P96ModeID(WINDOW_WIDTH, WINDOW_HEIGHT, 24),
              SA_Width, WINDOW_WIDTH,
              SA_Height, WINDOW_HEIGHT,
              SA_Depth, 24,
              TAG_END);

              if (!ecran) {
              printf(« Erreur : Impossible d’ouvrir l’écran.\n »);
              FreeMem(imageBuffer, largeur * hauteur * 3);
              return 1;
              }

              // Ouvrir une fenêtre
              fenetre = OpenWindowTags(NULL,
              WA_CustomScreen, (ULONG)ecran,
              WA_Left, 0,
              WA_Top, 0,
              WA_Width, WINDOW_WIDTH,
              WA_Height, WINDOW_HEIGHT,
              WA_Title, (ULONG) »Affichage d’une image avec Picasso96″,
              WA_Flags, WFLG_CLOSEGADGET | WFLG_DEPTHGADGET | WFLG_DRAGBAR,
              TAG_END);

              if (!fenetre) {
              printf(« Erreur : Impossible d’ouvrir la fenêtre.\n »);
              CloseScreen(ecran);
              FreeMem(imageBuffer, largeur * hauteur * 3);
              return 1;
              }

              rastport = fenetre->RPort;

              // Utiliser Picasso96 pour copier le contenu de l’image dans la fenêtre
              p96WritePixelArray(imageBuffer, 0, 0, largeur * 3,
              rastport, 0, 0, largeur, hauteur, RECTFMT_RGB);

              // Attendre que l’utilisateur ferme la fenêtre
              struct IntuiMessage *msg;
              BOOL quitter = FALSE;
              while (!quitter) {
              WaitPort(fenetre->UserPort);
              while ((msg = (struct IntuiMessage *)GetMsg(fenetre->UserPort))) {
              if (msg->Class == IDCMP_CLOSEWINDOW) {
              quitter = TRUE;
              }
              ReplyMsg((struct Message *)msg);
              }
              }

              // Libérer les ressources
              FreeMem(imageBuffer, largeur * hauteur * 3);
              CloseWindow(fenetre);
              CloseScreen(ecran);

              return 0;
              }

              #188828
              stephbb75
                • Level 11
                • Messages : 1441

                Pour commencer les include ne pas bon, c’est picasso96.h et non pas picasso96api.h.
                Enfin c’est pas trop grave.

                Mais la fonction p96WritePixelArray n’a que 8 arguments, pas 10 !

                p96WritePixelArray(imageBuffer, 0, 0, largeur * 3, rastport, 0, 0, largeur, hauteur, RECTFMT_RGB);

                Prototype de la fonction :
                p96WritePixelArray(ri, SrcX, SrcY, rp, DestX, DestY, SizeX, SizeY)

                la fonction P96ModeID c’est inconnu au bataillon :wacko:
                En tout K pas dans la doc de P96 !

                En fait la il veut récupérer le ModeID pour la résolution, mais il faut utiliser p96BestModeIDTagList …

                Ha oui, il n’ouvre jamais la library de Picasso aussi :negative:

                J’arrête la :-p

                 

                https://youtube.com/@stephbb75

                #189283
                stephbb75
                  • Level 11
                  • Messages : 1441

                  Salut,

                  Pour ceux que cela intéresse voici 2 sources pour afficher des données graphique avec P96.
                  Comme je me suis fait CHI… un bout de temps à trouver et comprendre je met le code à dispos des fois que cela puisse servir à qq’un ;-)

                  Fait avec StromC 4
                  (bon, le code n’est pas forcement très propre !)

                  http://sitedesteph.free.fr/amiga/le-c/CodeC/AffImg8bP96_v3.c
                  Cela affiche une image en 8bit (256 couleurs)
                  Choix de la résolution (prendre une résolution 8 bits sinon plantage !!)
                  Création d’une zone mémoire pour créer l’image
                  Palette 256 niveaux de gris
                  Création de 3 images
                  Affichage de l’image
                  F1, F2 et F3 pour 3 type d’image différent
                  F10 pour quitter

                  http://sitedesteph.free.fr/amiga/le-c/CodeC/AffImg24bP96_v2.c
                  Même choses mais la zone mémoire comprend une image 24bit (RGB) afficher sur un écran de type supérieur à 8bit (testé sur écran 24bit, 16bit PC, 16bit, 15bit PC, 15bit), ne fonctionne pas sur un écran 4 ou 8 bits (cela fait planter l’Amiga car il n’y à pas de teste du type d’écran choisi !)
                  il n’y a qu’une image la ;-)
                  F10 pour quitter
                  (Ha oui en bonus cela affiche des infos sur le type de codage de la résolution choisie)

                  voila !

                   

                  C’est fait par un intelligence humaine, les artificielles sont vraiment pas bon pour le code sur Amiga :lol:

                   

                  https://youtube.com/@stephbb75

                Partager sur vos réseaux sociaux préférés :
                Facebooktwitterredditpinterestlinkedintumblrmail
                Affichage de 6 réponses de 1 à 6 (sur un total de 6)
                • Vous devez être connecté pour répondre à ce sujet.