[1] | 1 | #include "zgl.h" |
---|
| 2 | |
---|
| 3 | /* |
---|
| 4 | * image conversion |
---|
| 5 | */ |
---|
| 6 | |
---|
| 7 | void gl_convertRGB_to_5R6G5B(unsigned short *pixmap,unsigned char *rgb, |
---|
| 8 | int xsize,int ysize) |
---|
| 9 | { |
---|
| 10 | int i,n; |
---|
| 11 | unsigned char *p; |
---|
| 12 | |
---|
| 13 | p=rgb; |
---|
| 14 | n=xsize*ysize; |
---|
| 15 | for(i=0;i<n;i++) { |
---|
| 16 | pixmap[i]=((p[0]&0xF8)<<8) | ((p[1]&0xFC)<<3) | ((p[2]&0xF8)>>3); |
---|
| 17 | p+=3; |
---|
| 18 | } |
---|
| 19 | } |
---|
| 20 | |
---|
| 21 | void gl_convertRGB_to_8A8R8G8B(unsigned int *pixmap, unsigned char *rgb, |
---|
| 22 | int xsize, int ysize) |
---|
| 23 | { |
---|
| 24 | int i,n; |
---|
| 25 | unsigned char *p; |
---|
| 26 | |
---|
| 27 | p=rgb; |
---|
| 28 | n=xsize*ysize; |
---|
| 29 | for(i=0;i<n;i++) { |
---|
| 30 | pixmap[i]=(((unsigned int)p[0])<<16) | |
---|
| 31 | (((unsigned int)p[1])<<8) | |
---|
| 32 | (((unsigned int)p[2])); |
---|
| 33 | p+=3; |
---|
| 34 | } |
---|
| 35 | } |
---|
| 36 | |
---|
| 37 | /* |
---|
| 38 | * linear interpolation with xf,yf normalized to 2^16 |
---|
| 39 | */ |
---|
| 40 | |
---|
| 41 | #define INTERP_NORM_BITS 16 |
---|
| 42 | #define INTERP_NORM (1 << INTERP_NORM_BITS) |
---|
| 43 | |
---|
| 44 | static inline int interpolate(int v00,int v01,int v10,int xf,int yf) |
---|
| 45 | { |
---|
| 46 | return v00+(((v01-v00)*xf + (v10-v00)*yf) >> INTERP_NORM_BITS); |
---|
| 47 | } |
---|
| 48 | |
---|
| 49 | |
---|
| 50 | /* |
---|
| 51 | * TODO: more accurate resampling |
---|
| 52 | */ |
---|
| 53 | |
---|
| 54 | void gl_resizeImage(unsigned char *dest,int xsize_dest,int ysize_dest, |
---|
| 55 | unsigned char *src,int xsize_src,int ysize_src) |
---|
| 56 | { |
---|
| 57 | unsigned char *pix,*pix_src; |
---|
| 58 | float x1,y1,x1inc,y1inc; |
---|
| 59 | int xi,yi,j,xf,yf,x,y; |
---|
| 60 | |
---|
| 61 | pix=dest; |
---|
| 62 | pix_src=src; |
---|
| 63 | |
---|
| 64 | x1inc=(float) (xsize_src - 1) / (float) (xsize_dest - 1); |
---|
| 65 | y1inc=(float) (ysize_src - 1) / (float) (ysize_dest - 1); |
---|
| 66 | |
---|
| 67 | y1=0; |
---|
| 68 | for(y=0;y<ysize_dest;y++) { |
---|
| 69 | x1=0; |
---|
| 70 | for(x=0;x<xsize_dest;x++) { |
---|
| 71 | xi=(int) x1; |
---|
| 72 | yi=(int) y1; |
---|
| 73 | xf=(int) ((x1 - floor(x1)) * INTERP_NORM); |
---|
| 74 | yf=(int) ((y1 - floor(y1)) * INTERP_NORM); |
---|
| 75 | |
---|
| 76 | if ((xf+yf) <= INTERP_NORM) { |
---|
| 77 | for(j=0;j<3;j++) { |
---|
| 78 | pix[j]=interpolate(pix_src[(yi*xsize_src+xi)*3+j], |
---|
| 79 | pix_src[(yi*xsize_src+xi+1)*3+j], |
---|
| 80 | pix_src[((yi+1)*xsize_src+xi)*3+j], |
---|
| 81 | xf,yf); |
---|
| 82 | } |
---|
| 83 | } else { |
---|
| 84 | xf=INTERP_NORM - xf; |
---|
| 85 | yf=INTERP_NORM - yf; |
---|
| 86 | for(j=0;j<3;j++) { |
---|
| 87 | pix[j]=interpolate(pix_src[((yi+1)*xsize_src+xi+1)*3+j], |
---|
| 88 | pix_src[((yi+1)*xsize_src+xi)*3+j], |
---|
| 89 | pix_src[(yi*xsize_src+xi+1)*3+j], |
---|
| 90 | xf,yf); |
---|
| 91 | } |
---|
| 92 | } |
---|
| 93 | |
---|
| 94 | pix+=3; |
---|
| 95 | x1+=x1inc; |
---|
| 96 | } |
---|
| 97 | y1+=y1inc; |
---|
| 98 | } |
---|
| 99 | } |
---|
| 100 | |
---|
| 101 | #define FRAC_BITS 16 |
---|
| 102 | |
---|
| 103 | /* resizing with no interlating nor nearest pixel */ |
---|
| 104 | |
---|
| 105 | void gl_resizeImageNoInterpolate(unsigned char *dest,int xsize_dest,int ysize_dest, |
---|
| 106 | unsigned char *src,int xsize_src,int ysize_src) |
---|
| 107 | { |
---|
| 108 | unsigned char *pix,*pix_src,*pix1; |
---|
| 109 | int x1,y1,x1inc,y1inc; |
---|
| 110 | int xi,yi,x,y; |
---|
| 111 | |
---|
| 112 | pix=dest; |
---|
| 113 | pix_src=src; |
---|
| 114 | |
---|
| 115 | x1inc=(int)((float) ((xsize_src)<<FRAC_BITS) / (float) (xsize_dest)); |
---|
| 116 | y1inc=(int)((float) ((ysize_src)<<FRAC_BITS) / (float) (ysize_dest)); |
---|
| 117 | |
---|
| 118 | y1=0; |
---|
| 119 | for(y=0;y<ysize_dest;y++) { |
---|
| 120 | x1=0; |
---|
| 121 | for(x=0;x<xsize_dest;x++) { |
---|
| 122 | xi=x1 >> FRAC_BITS; |
---|
| 123 | yi=y1 >> FRAC_BITS; |
---|
| 124 | pix1=pix_src+(yi*xsize_src+xi)*3; |
---|
| 125 | |
---|
| 126 | pix[0]=pix1[0]; |
---|
| 127 | pix[1]=pix1[1]; |
---|
| 128 | pix[2]=pix1[2]; |
---|
| 129 | |
---|
| 130 | pix+=3; |
---|
| 131 | x1+=x1inc; |
---|
| 132 | } |
---|
| 133 | y1+=y1inc; |
---|
| 134 | } |
---|
| 135 | } |
---|
| 136 | |
---|