Discussion: [PSP][Résolu] draw images on images
Afficher un message
Vieux 18/07/2008, 19h30  
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

Finalement c'était encore faux, j'en ai eu besoin quelque part et tout etait un peu translucide, ce que j'ai corrigé comme cela:

Code PHP:
void utils::drawImageOnImage(OSL_IMAGE *srcint srcXint srcYint widthint heightOSL_IMAGE *destint destXint destY)
{
    
oslLockImage(src);
    
oslLockImage(dest);
    for(
int x=0x<widthx++)
    {
        for(
int y=0y<heighty++)
        {
            
int putX=destX+x;
            
int putY=destY+y;
            if(
putX<dest->sizeX && putY<dest->sizeY)
            {
                
int getX=srcX+x;
                
int getY=srcY+y;
                
                
int pixeldest=oslGetImagePixel(destputXputY);
                
int pixel8888dest=oslConvertColorEx(dest->paletteOSL_PF_8888dest->pixelFormatpixeldest);
                
                
int drdgdbda//d: dest
                
oslRgbaGet8888(pixel8888destdrdgdbda);
                
float fdr=float(dr);
                
float fdg=float(dg);
                
float fdb=float(db);
                
float fda=float(da);
                
                
int pixelsrc=oslGetImagePixel(srcgetXgetY);
                
int pixel8888src=oslConvertColorEx(src->paletteOSL_PF_8888src->pixelFormatpixelsrc);
                
int srsgsbsa//s: src
                
oslRgbaGet8888(pixel8888srcsrsgsbsa);
                
float fsr=float(sr);
                
float fsg=float(sg);
                
float fsb=float(sb);
                
float fsa=float(sa);
                
                
float a_sum=fsa+fda//somme des alphas
                                        
                
int pixel8888result;
                if(
a_sum>0)
                {
                    
float da_left=255.0f-fsa//alpha left
                    
                    
int rrrgrbra//r: result
                    
                    
rr=int((fdr*da_left fsr*fsa)/255.0f);
                    
rg=int((fdg*da_left fsg*fsa)/255.0f);
                    
rb=int((fdb*da_left fsb*fsa)/255.0f);
                    
ra=int(fsa + (da_left*fda)/255.0f);
                    
pixel8888result=RGBA(rr,rg,rb,ra);
                }
                else
                {
                    
pixel8888result=RGBA(0,0,0,0);
                }
                
                
int pixelresult oslConvertColorEx(dest->palettedest->pixelFormatOSL_PF_8888pixel8888result);
                
                
oslSetImagePixel(destputXputYpixelresult);
            }
        }
    }
    
oslUnlockImage(dest);
    
oslUnlockImage(src);

j'en profite pour partager une fonction de copie du buffer parce que c'est super chiant (soit ca dessine pas, soit l'alpha n'est pas pris en compte, super pénible!!):
Code PHP:
OSL_IMAGE *utils::getBufferCopy()
{
    
OSL_IMAGE *pixelcopy=oslCreateImage(480272OSL_IN_RAMOSL_PF_8888);
    
oslLockImage(OSL_DEFAULT_BUFFER);
    for(
int i=0;i<480;i++)
    {
        for(
int j=0;j<272;j++)
        {
            
int pixelsrc=oslGetImagePixel(OSL_DEFAULT_BUFFERij);
            
int pixel8888src=oslConvertColorEx(OSL_DEFAULT_BUFFER->paletteOSL_PF_8888OSL_DEFAULT_BUFFER->pixelFormatpixelsrc);
            
int rgba;
            
oslRgbaGet8888(pixel8888srcrgba);
            
int pixel8888result=RGBA(r,g,b,255);
            
            
oslSetImagePixel(pixelcopyijpixel8888result);
        }
    }
    
oslUnlockImage(OSL_DEFAULT_BUFFER);
    
    return 
pixelcopy;

l'image sera forcément en mode 8888 à la sortie mais la base est là. comme l'autre fonction celle ci est un peu lente mais si c'est pour l'exécuter 1x c'est suffisant.
__________________
Essayez mon dernier jeu sur iPhone:

daaa57150 est déconnecté   Réponse avec citation