transforms.c
上传用户:hengzhunsh
上传日期:2013-09-07
资源大小:19k
文件大小:4k
源码类别:

浏览器

开发平台:

Unix_Linux

  1. /*
  2.     fbv  --  simple image viewer for the linux framebuffer
  3.     Copyright (C) 2000, 2001, 2003  Mateusz Golicz
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <assert.h>
  19. unsigned char * simple_resize(unsigned char * orgin,int ox,int oy,int dx,int dy)
  20. {
  21.     unsigned char *cr,*p,*l;
  22.     int i,j,k,ip;
  23.     assert(cr = (unsigned char*) malloc(dx*dy*3));
  24.     l=cr;
  25.     
  26.     for(j=0;j<dy;j++,l+=dx*3)
  27.     {
  28. p=orgin+(j*oy/dy*ox*3);
  29. for(i=0,k=0;i<dx;i++,k+=3)
  30. {
  31.     ip=i*ox/dx*3;
  32.     l[k]=p[ip];
  33.     l[k+1]=p[ip+1];
  34.     l[k+2]=p[ip+2];
  35. }
  36.     }
  37.     return(cr);
  38. }
  39. unsigned char * alpha_resize(unsigned char * alpha,int ox,int oy,int dx,int dy)
  40. {
  41.     unsigned char *cr,*p,*l;
  42.     int i,j,k;
  43.     cr=(unsigned char*) malloc(dx*dy); l=cr;
  44.     
  45.     for(j=0;j<dy;j++,l+=dx)
  46.     {
  47. p = alpha+(j*oy/dy*ox);
  48. for(i=0,k=0;i<dx;i++)
  49.     l[k++]=p[i*ox/dx];
  50. }
  51.     return(cr);
  52. }
  53. unsigned char * color_average_resize(unsigned char * orgin,int ox,int oy,int dx,int dy)
  54. {
  55.     unsigned char *cr,*p,*q;
  56.     int i,j,k,l,xa,xb,ya,yb;
  57.     int sq,r,g,b;
  58.     assert(cr=(unsigned char*) malloc(dx*dy*3)); p=cr;
  59.     
  60.     for(j=0;j<dy;j++)
  61.     {
  62. for(i=0;i<dx;i++,p+=3)
  63. {
  64.     xa=i*ox/dx;
  65.     ya=j*oy/dy;
  66.     xb=(i+1)*ox/dx; if(xb>=ox) xb=ox-1;
  67.     yb=(j+1)*oy/dy; if(yb>=oy) yb=oy-1;
  68.     for(l=ya,r=0,g=0,b=0,sq=0;l<=yb;l++)
  69.     {
  70. q=orgin+((l*ox+xa)*3);
  71. for(k=xa;k<=xb;k++,q+=3,sq++)
  72. {
  73.     r+=q[0]; g+=q[1]; b+=q[2];
  74. }
  75.     }
  76.     p[0]=r/sq; p[1]=g/sq; p[2]=b/sq;
  77. }
  78.     }
  79.     return(cr);
  80. }
  81. unsigned char * rotate(unsigned char *i, int ox, int oy, int rot)
  82. {
  83. unsigned char * n, * p;
  84. int x, y;
  85. assert(n = (unsigned char*) malloc(ox * oy * 3));
  86. switch(rot)
  87. {
  88. case 1: /* 90 deg right */
  89. p = n + (oy - 1) * 3;
  90. for(y = 0; y<oy; y++, p -= 3)
  91. {
  92. unsigned char * r = p;
  93. for(x = 0; x<ox; x++, r += oy * 3)
  94. {
  95. r[0] = *(i++);
  96. r[1] = *(i++);
  97. r[2] = *(i++);
  98. }
  99. }
  100. break;
  101. case 2: /* 180 deg */
  102. i += ox * oy * 3; p = n;
  103. for(y = ox * oy; y > 0; y--)
  104. {
  105. i -= 3;
  106. p[0] = i[0];
  107. p[1] = i[1];
  108. p[2] = i[2];
  109. p += 3;
  110. }
  111. break;
  112. case 3: /* 90 deg left */
  113. p = n;
  114. for(y = 0; y<oy; y++, p += 3)
  115. {
  116. unsigned char * r = p + ((ox * 3) * oy);
  117. for(x = 0; x<ox; x++)
  118. {
  119. r -= oy * 3;
  120. r[0] = *(i++);
  121. r[1] = *(i++);
  122. r[2] = *(i++);
  123. }
  124. }
  125. break;
  126. }
  127. return(n);
  128. }
  129. unsigned char * alpha_rotate(unsigned char *i, int ox, int oy, int rot)
  130. {
  131. unsigned char * n, * p;
  132. int x, y;
  133. assert(n = (unsigned char*) malloc(ox * oy));
  134. switch(rot)
  135. {
  136. case 1: /* 90 deg right */
  137. p = n + (oy - 1);
  138. for(y = 0; y<oy; y++, p --)
  139. {
  140. unsigned char * r = p;
  141. for(x = 0; x<ox; x++, r += oy)
  142. *r = *(i++);
  143. }
  144. break;
  145. case 2: /* 180 deg */
  146. i += ox * oy; p = n;
  147. for(y = ox * oy; y > 0; y--)
  148. *(p++) = *(i--);
  149. break;
  150. case 3: /* 90 deg left */
  151. p = n;
  152. for(y = 0; y<oy; y++, p++)
  153. {
  154. unsigned char * r = p + (ox * oy);
  155. for(x = 0; x<ox; x++)
  156. {
  157. r -= oy;
  158. *r = *(i++);
  159. }
  160. }
  161. break;
  162. }
  163. return(n);
  164. }