Revenir à Développement

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

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

7 sujets de 1 à 7 (sur un total de 7)
  • Auteur
    Messages
  • #177714
    thellier
    Participant
    • Messages : 614

    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 ?

    #177741
    bigdan
    Admin bbPress
    • Messages : 4707

     

    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 😉

     

     

    #177764
    henes
    Participant
    • Messages : 2565

    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.

     

    #177766
    thellier
    Participant
    • Messages : 614

    >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

    #177775
    henes
    Participant
    • Messages : 2565

    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.

     

    #177781
    thellier
    Participant
    • Messages : 614

    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);
    }

    #178931
    thellier
    Participant
    • Messages : 614

    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?

Do NOT follow this link or you will be banned from the site!