Datatypes sur OS3.x: PNG ? TGA ? JPG? alpha? DoMethod?

7 sujets de 1 à 7 (sur un total de 7)

  • thellier

      #177714

      Hello

      Actuellement dans Microbe3D j’utilise les Datatypes sur OS4 et un loader simpliste .BMP pour Os3
      Mais je demandais dans quel mesure je peut utiliser les Datatypes sur OS3 notamment pour récupérer les images (textures) avec transparence alpha ?

      cad:
      IDoMethod(dto,
      PDTM_READPIXELARRAY,
      T->pixels,
      PBPAFMT_RGBA,
      large*bits/8,
      0,
      0,
      large,
      high
      );

      Donc la question les datatypes OS3 supportent ils la couche alpha ?
      notamment les TGA & PNG
      Par ailleurs (or du problème Alpha) suis je assuré que le datatatype JPG marche sur OS3 ?
      Enfin quid du problem de DoMethod() qui marche pas pareil selon les versions de l’OS

      Bref suis je assuré que ça va toujours marcher sur OS3 ?

      Admin

      bigdan

        #177741

         

        Pas facile IMHO.Tu as regardé du coté des WarpDT ?

        Tu as même encore des OS3.x avec un vieux picture.datatype (<v43) et des datatypes .PNG / .TGA antédiluviens.

        Les réponses à ce fil m’intéressent aussi 😉

         

         

        henes

          #177764

          Quel problème de DoMethod() ?

          C’est une fonction qui n’est pas présente dans l’OS mais dans une bibliothèque statique (libamiga.a/amiga.lib, non ?) venant avec les compilateur et SDK/NDK.

           

          thellier

            #177766

            >DoMethod une fonction qui n’est pas présente dans l’OS mais dans une bibliothèque statique (libamiga.a)

            Justement je vais compiler (a terme) Microbe3D comme une .library
            Pourrais je alors la lier avec libamiga.a ? normalement je devrais plutot ouvrir manuellement la library qui contient ? ou alors faire mon propre DoMethod ?
            Les datatypes c’est bien gentil mais une simple fonction qui aurait pris un nom de fichier et renvoyé une nouvelle bitmap contenant l’image aurait été bien plus utile…

            >Tu as regardé du coté des WarpDT ?
            Non je vais y jeter un oeil …

            Alain

            henes

              #177775

              Oui tu peux bien sûr utiliser les fonctions de la libamiga dans une bibliothèque partagée. C’est le but.

              Tu n’as pas besoin d’une quelconque libbase pour utiliser domethod.

              Tu peux voir une implémentation parmis d’autres dans le source de clib2 : http://clib2.cvs.sourceforge.net/viewvc/clib2/library/amiga_domethod.c?&view=markup

              C’est tellement simple et basic que ce que font sas/c, vbcc etc est identique.

               

              thellier

                #177781

                Merci

                c’est effectivement très simple à implémenter
                Puis je utiliser utility.library/CallHookPkt() et ainsi ne plus avoir besoin de libamiga de cette manière:

                ULONG DoMethodA(Object * obj,Msg msg)
                {
                ULONG result = 0;

                ENTER();

                SHOWPOINTER(obj);
                SHOWPOINTER(msg);

                assert(obj != NULL);

                if(obj != NULL)
                {
                Class * cl;

                cl = OCLASS(obj);

                assert( cl != NULL );

                if(cl != NULL)
                result =CallHookPkt(&cl->cl_Dispatcher,obj,msg);
                }

                RETURN(result);
                return(result);
                }

                thellier

                  #178931

                  Hello je m’autoréponds car la solution peut intéresser des coders
                  Donc ça marche (au moins)en OS 3.9 68k et en OS4 ppc , avec le même code source , avec les warp datatypes JPG et BMP sans avoir besoin de amiga.lib
                  J’ai pas testé avec des images avec alpha mais c’est sensé marché…

                  J’ai rajouté un test (somme des pixels dans grey==0) pour voir si l’image a bien été chargé

                  /*==================================================================================*/
                  void FlipBitmap(UBYTE *RGB,WORD large,WORD high,WORD bits)
                  {
                  register UBYTE *RGB2;
                  register UWORD LineSize;
                  register UBYTE temp;
                  register ULONG x,y,size;

                  REM(FlipBitmap)
                  LineSize=large*bits/8;
                  size=LineSize*high;
                  RGB2=&RGB;
                  YLOOP(high/2)
                  {
                  XLOOP(LineSize)
                  {SWAP(RGB[x],RGB2[x]);}
                  RGB =RGB +LineSize;
                  RGB2=RGB2-LineSize;
                  }
                  }
                  /*==================================================================================*/
                  #include (intuition/classes.h)
                  #include (proto/utility.h)
                  /*==================================================================================*/
                  ULONG MyDoMethodA(Object * obj,Msg msg)
                  {
                  ULONG result=0;
                  Class * cl;

                  REM(MyDoMethodA)
                  if(obj==NULL)
                  return(result);
                  cl = OCLASS(obj);

                  if(cl==NULL)
                  return(result);

                  result =CallHookPkt(&cl->cl_Dispatcher,obj,msg);
                  VAR(result)
                  return(result);
                  }
                  /*==================================================================================*/
                  Texture3D *OSLoadDT(UBYTE *filename)
                  {
                  Texture3D *T;
                  struct BitMapHeader *bitMapHeader = NULL;
                  struct pdtBlitPixelArray bpa;
                  Object* dto=NULL;
                  UWORD large,high,bits;
                  ULONG result;
                  ULONG x,y,grey;
                  UBYTE *RGB;

                  REM(OSLoadDT)
                  dto= NewDTObject(filename, DTA_SourceType,DTST_FILE, DTA_GroupID, GID_PICTURE,PDTA_DestMode, PMODE_V43,PDTA_Remap, FALSE,TAG_DONE);
                  if(!dto)
                  {errorprintf(« Error: Could not open texture file\n »); goto Error;}

                  if(GetDTAttrs(dto,PDTA_BitMapHeader,(ULONG)&bitMapHeader,TAG_DONE) != 1)
                  {errorprintf(« Error: Could not obtain the picture objects bitmap header\n »); goto Error;}

                  large =bitMapHeader->bmh_Width;
                  high =bitMapHeader->bmh_Height;
                  bits =bitMapHeader->bmh_Depth;
                  if(bits!=32)
                  bits=24;

                  T=AllocT(large,high,bits);
                  if (T==NULL)
                  {errorprintf(« Error: Cant AllocT: No memory Texture3D %s (%ld x %ld)\n »,filename, T->width, T->height);goto Error;}

                  /* Extract the bitmap data from the picture object. NOTE: Need PDTM_READPIXELARRAY to recover the alpha channel. */
                  bpa.MethodID = PDTM_READPIXELARRAY;
                  bpa.pbpa_PixelData = (APTR)T->pixels;
                  if(bits==24)
                  bpa.pbpa_PixelFormat = PBPAFMT_RGB;
                  else
                  bpa.pbpa_PixelFormat = PBPAFMT_RGBA;
                  bpa.pbpa_PixelArrayMod = large*bits/8;
                  bpa.pbpa_Left = 0;
                  bpa.pbpa_Top = 0;
                  bpa.pbpa_Width = large;
                  bpa.pbpa_Height = high;
                  result=MyDoMethodA(dto,(Msg)&bpa);

                  RGB=T->pixels;
                  grey=0;
                  YLOOP(high)
                  XLOOP(large)
                  {
                  grey+=(RGB[0]+RGB[1]+RGB[2]);
                  RGB+=bits/8;
                  }
                  VAR(grey)
                  if(grey==0)
                  errorprintf(« Error: picture empty\n »);

                  FlipBitmap(T->pixels,large,high,bits);
                  Error:
                  if (dto) DisposeDTObject(dto);
                  return(T);
                  }
                  /*=================================================================*/

                7 sujets de 1 à 7 (sur un total de 7)

                • Vous devez être connecté pour répondre à ce sujet.

                Forums AmigaOS, MorphOS et AROS Développement Datatypes sur OS3.x: PNG ? TGA ? JPG? alpha? DoMethod?

                Amiga Impact