source: trunk/sys/TinyGL/src/image_util.c @ 134

Last change on this file since 134 was 1, checked in by alain, 8 years ago

First import

File size: 2.9 KB
Line 
1#include "zgl.h"
2
3/*
4 * image conversion
5 */
6
7void 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
21void 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
44static 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
54void 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
105void 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
Note: See TracBrowser for help on using the repository browser.