Panda3D
|
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