Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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<n;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<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.  
  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<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.  
  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)<<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.  
  137.