Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5098 clevermous 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
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
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
69
    x1=0;
70
    for(x=0;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)<
116
  y1inc=(int)((float) ((ysize_src)<
117
 
118
  y1=0;
119
  for(y=0;y
120
    x1=0;
121
    for(x=0;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