TinyGL 0.4.1 for MinGW
image_util.c
Go to the documentation of this file.
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
#define INTERP_NORM_BITS
Definition: image_util.c:41
#define FRAC_BITS
Definition: image_util.c:101
void gl_convertRGB_to_8A8R8G8B(unsigned int *pixmap, unsigned char *rgb, int xsize, int ysize)
Definition: image_util.c:21
void gl_resizeImage(unsigned char *dest, int xsize_dest, int ysize_dest, unsigned char *src, int xsize_src, int ysize_src)
Definition: image_util.c:54
void gl_convertRGB_to_5R6G5B(unsigned short *pixmap, unsigned char *rgb, int xsize, int ysize)
Definition: image_util.c:7
#define INTERP_NORM
Definition: image_util.c:42
void gl_resizeImageNoInterpolate(unsigned char *dest, int xsize_dest, int ysize_dest, unsigned char *src, int xsize_src, int ysize_src)
Definition: image_util.c:105
int x1
Definition: ztriangle.h:15