Datatypes sur OS3.x: PNG ? TGA ? JPG? alpha? DoMethod?
7 sujets de 1 à 7 (sur un total de 7)
-
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’OSBref suis je assuré que ça va toujours marcher sur OS3 ?
Admin>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
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.
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);
}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?