Merge branch 'master' of ssh://repo.or.cz/srv/git/tgl
[tgl.git] / src / image_util.c
blob11e25ec873b958f2f793df56011934a2373b2168
1 #include "zgl.h"
3 /*
4 * image conversion
5 */
7 void gl_convertRGB_to_5R6G5B(unsigned short *pixmap,unsigned char *rgb,
8 int xsize,int ysize)
10 int i,n;
11 unsigned char *p;
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;
21 void gl_convertRGB_to_8A8R8G8B(unsigned int *pixmap, unsigned char *rgb,
22 int xsize, int ysize)
24 int i,n;
25 unsigned char *p;
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;
38 * linear interpolation with xf,yf normalized to 2^16
41 #define INTERP_NORM_BITS 16
42 #define INTERP_NORM (1 << INTERP_NORM_BITS)
44 static inline int interpolate(int v00,int v01,int v10,int xf,int yf)
46 return v00+(((v01-v00)*xf + (v10-v00)*yf) >> INTERP_NORM_BITS);
50 /*
51 * TODO: more accurate resampling
54 void gl_resizeImage(unsigned char *dest,int xsize_dest,int ysize_dest,
55 unsigned char *src,int xsize_src,int ysize_src)
57 unsigned char *pix,*pix_src;
58 float x1,y1,x1inc,y1inc;
59 int xi,yi,j,xf,yf,x,y;
61 pix=dest;
62 pix_src=src;
64 x1inc=(float) (xsize_src - 1) / (float) (xsize_dest - 1);
65 y1inc=(float) (ysize_src - 1) / (float) (ysize_dest - 1);
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);
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);
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);
94 pix+=3;
95 x1+=x1inc;
97 y1+=y1inc;
101 #define FRAC_BITS 16
103 /* resizing with no interlating nor nearest pixel */
105 void gl_resizeImageNoInterpolate(unsigned char *dest,int xsize_dest,int ysize_dest,
106 unsigned char *src,int xsize_src,int ysize_src)
108 unsigned char *pix,*pix_src,*pix1;
109 int x1,y1,x1inc,y1inc;
110 int xi,yi,x,y;
112 pix=dest;
113 pix_src=src;
115 x1inc=(int)((float) ((xsize_src)<<FRAC_BITS) / (float) (xsize_dest));
116 y1inc=(int)((float) ((ysize_src)<<FRAC_BITS) / (float) (ysize_dest));
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;
126 pix[0]=pix1[0];
127 pix[1]=pix1[1];
128 pix[2]=pix1[2];
130 pix+=3;
131 x1+=x1inc;
133 y1+=y1inc;