blit_arm_gray.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:5k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  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.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: blit_arm_gray.c 271 2005-08-09 08:31:35Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common.h"
  24. #include "../dyncode/dyncode.h"
  25. #include "blit_soft.h"
  26. #if defined(ARM)
  27. typedef struct stack
  28. {
  29. int EndOfRect;
  30. int DstPitch; 
  31. int DstNext;
  32. int SrcNext;
  33. int StackFrame[STACKFRAME];
  34. //void* this   R0
  35. //char* Dst    R1
  36. //char* Src    R2
  37. //int DstPitch R3 can be signed
  38. int SrcPitch; //can be signed
  39. int Width; 
  40. int Height;
  41. int Src2SrcLast;
  42. } stack;
  43. void Fix_Gray_UV(blit_soft* p)
  44. {
  45. int SrcBlock2;
  46. bool_t Invert = (p->Dst.Flags & PF_INVERTED) != 0;
  47. int DitherMask = (1 << (8 - p->DstBPP))-1;
  48. int ValueMask = 255 - DitherMask;
  49. dyninst* LoopX;
  50. dyninst* LoopY;
  51. p->DstAlignPos = 4;
  52. p->DstAlignSize = 4;
  53. p->Caps = VC_BRIGHTNESS|VC_DITHER;
  54. CodeBegin();
  55. I2C(SUB,SP,SP,OFS(stack,StackFrame));
  56. I2(LDR,R9,R1);  //Dst[0]
  57. I2(LDR,R12,R2); //Src[0]
  58. I3(MOV,R10,NONE,R3); //DstPitch
  59. I2C(LDR,R0,SP,OFS(stack,Height));
  60. I2C(LDR,R8,SP,OFS(stack,Width));
  61. I2C(LDR,R14,SP,OFS(stack,SrcPitch));
  62. if (p->SwapXY)
  63. {
  64. SrcBlock2 = -p->DstBPP2-p->DstDoubleX;
  65. I2C(MOV,R1,NONE,p->DstBPP * p->DirX);
  66. I3(MUL,R0,R1,R0);
  67. I3S(ADD,R11,R14,R14,LSL,1); //SrcPitch*3
  68. I3S(ADD,R0,R9,R0,ASR,3);
  69. I2C(STR,R0,SP,OFS(stack,EndOfRect));
  70. //DstNext = DirX - Width * DstPitch;
  71. MB(); I3(MUL,R2,R10,R8);
  72. I2C(MOV,R0,NONE,p->DirX);
  73. I3(SUB,R0,R0,R2);   
  74. I2C(STR,R0,SP,OFS(stack,DstNext));
  75. }
  76. else
  77. {
  78. SrcBlock2 = 0;
  79. I3(MUL,R0,R10,R0);
  80. I3(ADD,R0,R9,R0);
  81. I2C(STR,R0,SP,OFS(stack,EndOfRect));
  82. //DstNext = (DstPitch << DstDoubleY) - DirX * (Width >> -DstBPP2);
  83. I3S(MOV,R2,NONE,R10,LSL,p->DstDoubleY);
  84. I3S(p->DirX>0 ? SUB:ADD,R2,R2,R8,LSR,-p->DstBPP2); 
  85. I2C(STR,R2,SP,OFS(stack,DstNext));
  86. }
  87. //SrcNext = (SrcPitch << SrcBlock2) - (Width >> SrcDoubleX);
  88. I3S(MOV,R1,NONE,R14,LSL,SrcBlock2);
  89. I3S(SUB,R1,R1,R8,LSR,p->SrcDoubleX); 
  90. I2C(STR,R1,SP,OFS(stack,SrcNext));
  91. if (p->FX.Flags & BLITFX_DITHER)
  92. I2C(MOV,R4,NONE,DitherMask >> 1); //Y0
  93. LoopY = Label(1);
  94. //R8 width
  95. //R4 dither
  96. if (p->SwapXY)
  97. {
  98. I3(MUL,R8,R10,R8);
  99. I3(ADD,R7,R9,R8);
  100. }
  101. else
  102. {
  103. if (p->DirX > 0)
  104. I3S(ADD,R7,R9,R8,LSL,p->DstBPP2);
  105. else
  106. I3S(SUB,R7,R9,R8,LSL,p->DstBPP2);
  107. }
  108. LoopX = Label(1);
  109. {
  110. //R0..R3 y
  111. //R8 temp
  112. //R4 dither
  113. //R5 out
  114. //R6 out2 (doubley)
  115. //R7 EndOfLine
  116. //R9 Dst
  117. //R10 DstPitch
  118. //R12 Src
  119. //R14 SrcPitch
  120. //R11 SrcPitch*3
  121. int n,Count = 8 / p->DstBPP;
  122. for (n=0;n<Count;++n)
  123. {
  124. bool_t Reverse;
  125. int Pos;
  126. reg Tmp;
  127. reg Y = (reg)(R0+(n%4));
  128. MB(); Byte(); 
  129. if (p->SwapXY)
  130. {
  131. switch ((Count-1-n) >> p->DstDoubleX)
  132. {
  133. case 0: if (n==Count-1) I2C(LDR_POST,Y,R12,1); else I2(LDR,Y,R12); break;
  134. case 1: I3(LDR,Y,R12,R14); break;
  135. case 2: I3S(LDR,Y,R12,R14,LSL,1); break;
  136. case 3: I3(LDR,Y,R12,R11); break;
  137. }
  138. else
  139. {
  140. if (p->DstDoubleX && !(n&1))
  141. I2(LDR,Y,R12);
  142. else
  143. I2C(LDR_POST,Y,R12,1);
  144. }
  145. if (p->FX.Flags & BLITFX_DITHER)
  146. {
  147. I3(ADD,R4,R4,Y);
  148. Y = R4;
  149. }
  150. S(); I2C(ADD,Y,Y,p->FX.Brightness-16);
  151. C(MI); I2C(MOV,Y,NONE,0);
  152. C(PL); I2C(CMP,NONE,Y,255);
  153. C(GT); I2C(MOV,Y,NONE,255);
  154. Reverse = (p->DirX>0) ^ ((p->SwapXY)!=0);
  155. Pos = Reverse ? n*p->DstBPP : (8-(n+1)*p->DstBPP);
  156. Tmp = (reg)((!Invert && n==0 && Pos==0) ? R5 : R8);
  157. I2C(AND,Tmp,Y,ValueMask);
  158. if (n==0)
  159. {
  160. if (Tmp != R5)
  161. I3S(Invert ? MVN:MOV,R5,NONE,Tmp,LSR,Pos);
  162. }
  163. else
  164. I3S(EOR,R5,R5,Tmp,LSR,Pos);
  165. if (p->DstDoubleY)
  166. {
  167. int Pos2 = Reverse ? (n^p->DstDoubleX)*p->DstBPP : (8-((n^p->DstDoubleX)+1)*p->DstBPP);
  168. if (n==0)
  169. I3S(Invert ? MVN:MOV,R6,NONE,Tmp,LSR,Pos2);
  170. else
  171. I3S(EOR,R6,R6,Tmp,LSR,Pos2);
  172. }
  173. if (p->FX.Flags & BLITFX_DITHER)
  174. I2C(AND,R4,R4,DitherMask);
  175. }
  176. if (p->DstDoubleY)
  177. {
  178. MB(); Byte();
  179. if (p->SwapXY)
  180. I3(STR_POST,R6,R9,R10);
  181. else
  182. I3(STR,R6,R9,R10);
  183. }
  184. MB(); Byte();
  185. if (p->SwapXY)
  186. I3(STR_POST,R5,R9,R10);
  187. else
  188. I2C(STR_POST,R5,R9,p->DirX>0 ? 1:-1);
  189. I3(CMP,NONE,R9,R7);
  190. I0P(B,NE,LoopX);
  191. }
  192. I2C(LDR,R0,SP,OFS(stack,SrcNext));
  193. I2C(LDR,R8,SP,OFS(stack,DstNext));
  194. I2C(LDR,R5,SP,OFS(stack,EndOfRect));
  195. //increment pointers
  196. I3(ADD,R12,R12,R0);
  197. I3(ADD,R9,R9,R8);
  198. //prepare for next row
  199. I2C(LDR,R8,SP,OFS(stack,Width));
  200. I3(CMP,NONE,R9,R5);
  201. I0P(B,NE,LoopY);
  202. I2C(ADD,SP,SP,OFS(stack,StackFrame));
  203. CodeEnd();
  204. }
  205. #endif