Panda3D
 All Classes Functions Variables Enumerations
image_util.cxx
00001 #include "zgl.h"
00002 
00003 /*
00004  * image conversion
00005  */
00006 
00007 void gl_convertRGB_to_5R6G5B(unsigned short *pixmap,unsigned char *rgb,
00008                              int xsize,int ysize)
00009 {
00010   int i,n;
00011   unsigned char *p;
00012 
00013   p=rgb;
00014   n=xsize*ysize;
00015   for(i=0;i<n;i++) {
00016     pixmap[i]=((p[0]&0xF8)<<8) | ((p[1]&0xFC)<<3) | ((p[2]&0xF8)>>3); 
00017     p+=3;
00018   }
00019 }
00020 
00021 void gl_convertRGB_to_8A8R8G8B(unsigned int *pixmap, unsigned char *rgb,
00022                                int xsize, int ysize)
00023 {
00024     int i,n;
00025     unsigned char *p;
00026     
00027     p=rgb;
00028     n=xsize*ysize;
00029     for(i=0;i<n;i++) {
00030         pixmap[i]=(((unsigned int)p[0])<<16) | 
00031           (((unsigned int)p[1])<<8) | 
00032           ((unsigned int)p[2]) | 
00033           0xff000000; 
00034         p+=3;
00035     }
00036 }
00037 
00038 void gl_convertRGBA_to_8A8R8G8B(unsigned int *pixmap, unsigned char *rgb,
00039                                int xsize, int ysize)
00040 {
00041     int i,n;
00042     unsigned char *p;
00043     
00044     p=rgb;
00045     n=xsize*ysize;
00046     for(i=0;i<n;i++) {
00047         pixmap[i]=(((unsigned int)p[0])<<16) | 
00048           (((unsigned int)p[1])<<8) | 
00049           ((unsigned int)p[2]) |
00050           (((unsigned int)p[3])<<24);
00051         p+=4;
00052     }
00053 }
00054 
00055 /*
00056  * linear interpolation with xf,yf normalized to 2^16
00057  */
00058 
00059 #define INTERP_NORM_BITS  16
00060 #define INTERP_NORM       (1 << INTERP_NORM_BITS)
00061 
00062 static inline int interpolate(int v00,int v01,int v10,int xf,int yf)
00063 {
00064   return v00+(((v01-v00)*xf + (v10-v00)*yf) >> INTERP_NORM_BITS);
00065 }
00066 
00067 
00068 /* 
00069  * TODO: more accurate resampling 
00070  */
00071 
00072 void gl_resizeImage(unsigned char *dest,int xsize_dest,int ysize_dest,
00073                     unsigned char *src,int xsize_src,int ysize_src)
00074 {
00075   unsigned char *pix,*pix_src;
00076   PN_stdfloat x1,y1,x1inc,y1inc;
00077   int xi,yi,j,xf,yf,x,y;
00078 
00079   pix=dest;
00080   pix_src=src;
00081   
00082   x1inc=(PN_stdfloat) (xsize_src - 1) / (PN_stdfloat) (xsize_dest - 1);
00083   y1inc=(PN_stdfloat) (ysize_src - 1) / (PN_stdfloat) (ysize_dest - 1);
00084 
00085   y1=0;
00086   for(y=0;y<ysize_dest;y++) {
00087     x1=0;
00088     for(x=0;x<xsize_dest;x++) {
00089       xi=(int) x1;
00090       yi=(int) y1;
00091       xf=(int) ((x1 - floor(x1)) * INTERP_NORM);
00092       yf=(int) ((y1 - floor(y1)) * INTERP_NORM);
00093       
00094       if ((xf+yf) <= INTERP_NORM) {
00095         for(j=0;j<4;j++) {
00096           pix[j]=interpolate(pix_src[(yi*xsize_src+xi)*4+j],
00097                              pix_src[(yi*xsize_src+xi+1)*4+j],
00098                              pix_src[((yi+1)*xsize_src+xi)*4+j],
00099                              xf,yf);
00100         }
00101       } else {
00102         xf=INTERP_NORM - xf;
00103         yf=INTERP_NORM - yf;
00104         for(j=0;j<4;j++) {
00105           pix[j]=interpolate(pix_src[((yi+1)*xsize_src+xi+1)*4+j],
00106                              pix_src[((yi+1)*xsize_src+xi)*4+j],
00107                              pix_src[(yi*xsize_src+xi+1)*4+j],
00108                              xf,yf);
00109         }
00110       }
00111       
00112       pix+=4;
00113       x1+=x1inc;
00114     }
00115     y1+=y1inc;
00116   }
00117 }
00118 
00119 #define FRAC_BITS 16
00120 
00121 /* resizing with no interlating nor nearest pixel */
00122 
00123 void gl_resizeImageNoInterpolate(unsigned char *dest,int xsize_dest,int ysize_dest,
00124                                  unsigned char *src,int xsize_src,int ysize_src)
00125 {
00126   unsigned char *pix,*pix_src,*pix1;
00127   int x1,y1,x1inc,y1inc;
00128   int xi,yi,x,y;
00129 
00130   pix=dest;
00131   pix_src=src;
00132   
00133   x1inc=(int)((PN_stdfloat) ((xsize_src)<<FRAC_BITS) / (PN_stdfloat) (xsize_dest));
00134   y1inc=(int)((PN_stdfloat) ((ysize_src)<<FRAC_BITS) / (PN_stdfloat) (ysize_dest));
00135 
00136   y1=0;
00137   for(y=0;y<ysize_dest;y++) {
00138     x1=0;
00139     for(x=0;x<xsize_dest;x++) {
00140       xi=x1 >> FRAC_BITS;
00141       yi=y1 >> FRAC_BITS;
00142       pix1=pix_src+(yi*xsize_src+xi)*4;
00143 
00144       pix[0]=pix1[0];
00145       pix[1]=pix1[1];
00146       pix[2]=pix1[2];
00147       pix[3]=pix1[3];
00148 
00149       pix+=4;
00150       x1+=x1inc;
00151     }
00152     y1+=y1inc;
00153   }
00154 }
00155 
 All Classes Functions Variables Enumerations