aboutsummaryrefslogtreecommitdiffstats
path: root/3rdparty/tinygl-0.4-ugfx/src/image_util.c
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/tinygl-0.4-ugfx/src/image_util.c')
-rw-r--r--3rdparty/tinygl-0.4-ugfx/src/image_util.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/3rdparty/tinygl-0.4-ugfx/src/image_util.c b/3rdparty/tinygl-0.4-ugfx/src/image_util.c
new file mode 100644
index 00000000..2789a55c
--- /dev/null
+++ b/3rdparty/tinygl-0.4-ugfx/src/image_util.c
@@ -0,0 +1,136 @@
+#include "zgl.h"
+
+/*
+ * image conversion
+ */
+
+void gl_convertRGB_to_5R6G5B(unsigned short *pixmap,unsigned char *rgb,
+ int xsize,int ysize)
+{
+ int i,n;
+ unsigned char *p;
+
+ p=rgb;
+ n=xsize*ysize;
+ for(i=0;i<n;i++) {
+ pixmap[i]=((p[0]&0xF8)<<8) | ((p[1]&0xFC)<<3) | ((p[2]&0xF8)>>3);
+ p+=3;
+ }
+}
+
+void gl_convertRGB_to_8A8R8G8B(unsigned int *pixmap, unsigned char *rgb,
+ int xsize, int ysize)
+{
+ int i,n;
+ unsigned char *p;
+
+ p=rgb;
+ n=xsize*ysize;
+ for(i=0;i<n;i++) {
+ pixmap[i]=(((unsigned int)p[0])<<16) |
+ (((unsigned int)p[1])<<8) |
+ (((unsigned int)p[2]));
+ p+=3;
+ }
+}
+
+/*
+ * linear interpolation with xf,yf normalized to 2^16
+ */
+
+#define INTERP_NORM_BITS 16
+#define INTERP_NORM (1 << INTERP_NORM_BITS)
+
+static inline int interpolate(int v00,int v01,int v10,int xf,int yf)
+{
+ return v00+(((v01-v00)*xf + (v10-v00)*yf) >> INTERP_NORM_BITS);
+}
+
+
+/*
+ * TODO: more accurate resampling
+ */
+
+void gl_resizeImage(unsigned char *dest,int xsize_dest,int ysize_dest,
+ unsigned char *src,int xsize_src,int ysize_src)
+{
+ unsigned char *pix,*pix_src;
+ float x1,y1,x1inc,y1inc;
+ int xi,yi,j,xf,yf,x,y;
+
+ pix=dest;
+ pix_src=src;
+
+ x1inc=(float) (xsize_src - 1) / (float) (xsize_dest - 1);
+ y1inc=(float) (ysize_src - 1) / (float) (ysize_dest - 1);
+
+ y1=0;
+ for(y=0;y<ysize_dest;y++) {
+ x1=0;
+ for(x=0;x<xsize_dest;x++) {
+ xi=(int) x1;
+ yi=(int) y1;
+ xf=(int) ((x1 - floor(x1)) * INTERP_NORM);
+ yf=(int) ((y1 - floor(y1)) * INTERP_NORM);
+
+ if ((xf+yf) <= INTERP_NORM) {
+ for(j=0;j<3;j++) {
+ pix[j]=interpolate(pix_src[(yi*xsize_src+xi)*3+j],
+ pix_src[(yi*xsize_src+xi+1)*3+j],
+ pix_src[((yi+1)*xsize_src+xi)*3+j],
+ xf,yf);
+ }
+ } else {
+ xf=INTERP_NORM - xf;
+ yf=INTERP_NORM - yf;
+ for(j=0;j<3;j++) {
+ pix[j]=interpolate(pix_src[((yi+1)*xsize_src+xi+1)*3+j],
+ pix_src[((yi+1)*xsize_src+xi)*3+j],
+ pix_src[(yi*xsize_src+xi+1)*3+j],
+ xf,yf);
+ }
+ }
+
+ pix+=3;
+ x1+=x1inc;
+ }
+ y1+=y1inc;
+ }
+}
+
+#define FRAC_BITS 16
+
+/* resizing with no interlating nor nearest pixel */
+
+void gl_resizeImageNoInterpolate(unsigned char *dest,int xsize_dest,int ysize_dest,
+ unsigned char *src,int xsize_src,int ysize_src)
+{
+ unsigned char *pix,*pix_src,*pix1;
+ int x1,y1,x1inc,y1inc;
+ int xi,yi,x,y;
+
+ pix=dest;
+ pix_src=src;
+
+ x1inc=(int)((float) ((xsize_src)<<FRAC_BITS) / (float) (xsize_dest));
+ y1inc=(int)((float) ((ysize_src)<<FRAC_BITS) / (float) (ysize_dest));
+
+ y1=0;
+ for(y=0;y<ysize_dest;y++) {
+ x1=0;
+ for(x=0;x<xsize_dest;x++) {
+ xi=x1 >> FRAC_BITS;
+ yi=y1 >> FRAC_BITS;
+ pix1=pix_src+(yi*xsize_src+xi)*3;
+
+ pix[0]=pix1[0];
+ pix[1]=pix1[1];
+ pix[2]=pix1[2];
+
+ pix+=3;
+ x1+=x1inc;
+ }
+ y1+=y1inc;
+ }
+}
+