00001 #include "zgl.h"
00002
00003
00004
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
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
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
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