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

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_mips_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(MIPS)
  27. // EndOfLine
  28. // EndOfRect
  29. // DstPitch 
  30. // DstNext
  31. // SrcNext
  32. // UVNext
  33. typedef struct stack
  34. {
  35. int StackFrame[4];
  36. void* This;   //R4
  37. char* Dst;    //R5
  38. char* Src;    //R6
  39. int DstPitch; //R7
  40. int SrcPitch;
  41. int Width; 
  42. int Height;
  43. int Src2SrcLast;
  44. } stack;
  45. void Fix_Gray_UV(blit_soft* p)
  46. {
  47. dyninst* LoopX;
  48. dyninst* LoopY;
  49. int SrcBlock2;
  50. reg b,a;
  51. bool_t Invert = (p->Dst.Flags & PF_INVERTED) != 0;
  52. int DitherMask = (1 << (8 - p->DstBPP))-1;
  53. int ValueMask = 255 - DitherMask;
  54. int Count = 8 / p->DstBPP;
  55. int DstRows = (p->DstDoubleY && !(p->SwapXY)) ? 2:1;
  56. int SrcRows = (p->SwapXY) ? (Count >> p->DstDoubleX) : 1; 
  57. int n;
  58. p->DstAlignPos = 4;
  59. p->DstAlignSize = 4;
  60. p->Caps = VC_BRIGHTNESS|VC_DITHER;
  61. CodeBegin(4,0,0);
  62. I2C(LW,R2,R5,0);  //Dst[0]
  63. I2C(LW,R4,R6,0);  //Src[0]
  64. I3(ADDU,R16,ZERO,R7); //DstPitch
  65. I2C(LW,R17,SP,OFS(stack,SrcPitch));
  66. I2C(LW,R8,SP,OFS(stack,Height));
  67. I2C(LW,R1,SP,OFS(stack,Width));
  68. if (p->SwapXY)
  69. {
  70. SrcBlock2 = -p->DstBPP2 - p->DstDoubleX;
  71. //EndOfRect = Dst + (Height * DstBPP * DirX) >> 3;
  72. I2C(ADDIU,R9,ZERO,p->DstBPP * p->DirX);
  73. I2(MULT,R8,R9);
  74. I1(MFLO,R8);
  75. I2C(SRA,R8,R8,3);
  76. I3(ADDU,R25,R2,R8);
  77. //DstNext = DirX - Width * DstPitch;
  78. I2(MULT,R1,R16);
  79. I2C(ADDIU,R19,ZERO,p->DirX);
  80. I1(MFLO,R8);
  81. I3(SUBU,R19,R19,R8);   
  82. }
  83. else
  84. {
  85. SrcBlock2 = 0;
  86. //EndOfRect = Dst + DstPitch * Height
  87. I2(MULT,R16,R8);
  88. I1(MFLO,R8);
  89. I3(ADDU,R25,R2,R8);
  90. //DstNext = (DstPitch << DstDoubleY) - DirX * (Width >> -DstBPP2);
  91. I2C(SLL,R19,R16,p->DstDoubleY);
  92. I2C(SRA,R8,R1,-p->DstBPP2);
  93. I3(p->DirX>0 ? SUBU:ADDU,R19,R19,R8);
  94. }
  95. //SrcNext = (SrcPitch << SrcBlock2) - (Width >> SrcDoubleX);
  96. b = (reg)(p->SrcDoubleX ? R18:R1);
  97. a = (reg)(SrcBlock2 ? R8:R17);
  98. if (p->SrcDoubleX) I2C(SRA,R18,R1,p->SrcDoubleX);
  99. if (SrcBlock2) I2C(SLL,R8,R17,SrcBlock2);
  100. I3(SUBU,R18,a,b); 
  101. if (p->FX.Flags & BLITFX_DITHER)
  102. I2C(ADDIU,R13,ZERO,DitherMask >> 1); //Y0
  103. for (n=1;n<SrcRows;++n)
  104. I3(ADDU,(reg)(R4+n),(reg)(R4+n-1),R17);
  105. for (n=1;n<DstRows;++n)
  106. I3(ADDU,(reg)(R2+n),(reg)(R2+n-1),R16);
  107. //R1 Width;
  108. if (p->SwapXY)
  109. {
  110. I2(MULT,R1,R16);
  111. I1(MFLO,R1);
  112. }
  113. else
  114. {
  115. if (p->DirX < 0)
  116. I3(SUBU,R1,ZERO,R1);
  117. I2C(SRA,R1,R1,-p->DstBPP2);
  118. }
  119. LoopY = Label(1);
  120. I3(ADDU,R24,R2,R1); //end of line
  121. //R1 adjusted width
  122. //R8..R11 y
  123. //R12 temp
  124. //R13 dither
  125. //R14 out
  126. //R15 out2
  127. //R24 EndOfLine
  128. //R25 EndOfRect
  129. //R16 DstPitch
  130. //R17 SrcPitch
  131. //R18 SrcNext
  132. //R19 DstNext
  133. //R2 Dst
  134. //R3 Dst2 (Double && !Swap)
  135. //R4 Src
  136. //R5 Src2 (Swap)
  137. //R6 Src3 (Swap)
  138. //R7 Src4 (Swap)
  139. LoopX = Label(1);
  140. {
  141. for (n=0;n<Count;++n)
  142. {
  143. int Pos;
  144. reg Tmp;
  145. bool_t Reverse;
  146. reg Y = (reg)(R8+(n%4));
  147. MB(); 
  148. if (p->SwapXY)
  149. {
  150. switch ((Count-1-n) >> p->DstDoubleX)
  151. {
  152. case 0: I2(LBU,Y,R4); break;
  153. case 1: I2(LBU,Y,R5); break;
  154. case 2: I2(LBU,Y,R6); break;
  155. case 3: I2(LBU,Y,R7); break;
  156. }
  157. else
  158. I2C(LBU,Y,R4,n >> p->DstDoubleX);
  159. if (p->FX.Flags & BLITFX_DITHER)
  160. {
  161. I3(ADDU,R13,R13,Y);
  162. Y = R13;
  163. }
  164. I2C(ADDIU,Y,Y,p->FX.Brightness-16);
  165. I2C(SRL,R12,Y,16);
  166. I3(SRLV,Y,Y,R12);
  167. I2C(SLL,R12,Y,23);
  168. I2C(SRA,R12,R12,31);
  169. I3(OR,Y,Y,R12);
  170. Reverse = (p->DirX>0) ^ ((p->SwapXY)!=0);
  171. Pos = Reverse ? n*p->DstBPP : (8-(n+1)*p->DstBPP);
  172. Tmp = (reg)((!Invert && n==0 && Pos==0) ? R14 : R12);
  173. I2C(ANDI,Tmp,Y,ValueMask);
  174. if (Pos)
  175. I2C(SRL,Tmp,Tmp,Pos);
  176. if (n==0)
  177. {
  178. if (Invert || Pos)
  179. I3(Invert ? NOR:OR,R14,Tmp,Tmp);
  180. }
  181. else
  182. I3(XOR,R14,R14,Tmp);
  183. if (p->DstDoubleY)
  184. {
  185. int Pos2 = Reverse ? (n^p->DstDoubleX)*p->DstBPP : (8-((n^p->DstDoubleX)+1)*p->DstBPP);
  186. if (Pos > Pos2)
  187. I2C(SLL,R12,Tmp,Pos-Pos2);
  188. else
  189. I2C(SRL,R12,Tmp,Pos2-Pos);
  190. if (n==0)
  191. I3(Invert ? NOR:OR,R15,R12,R12);
  192. else
  193. I3(XOR,R15,R15,R12);
  194. }
  195. if (p->FX.Flags & BLITFX_DITHER)
  196. I2C(ANDI,R13,R13,DitherMask);
  197. }
  198. if (p->DstDoubleY)
  199. {
  200. MB(); 
  201. if (p->SwapXY)
  202. {
  203. I2(SB,R15,R2);
  204. I3(ADDU,R2,R2,R16);
  205. }
  206. else
  207. {
  208. I2(SB,R15,R3);
  209. I2C(ADDIU,R3,R3,p->DirX>0 ? 1:-1);
  210. }
  211. }
  212. MB(); I2(SB,R14,R2);
  213. if (p->SwapXY)
  214. {
  215. I3(ADDU,R2,R2,R16);
  216. for (n=0;n<SrcRows;++n)
  217. I2C(ADDIU,(reg)(R4+n),(reg)(R4+n),1);
  218. }
  219. else
  220. {
  221. I2C(ADDIU,R2,R2,p->DirX>0 ? 1:-1);
  222. I2C(ADDIU,R4,R4,Count >> p->DstDoubleX);
  223. }
  224. DS(); I2P(BNE,R2,R24,LoopX);
  225. }
  226. //increment pointers
  227. for (n=0;n<DstRows;++n)
  228. I3(ADDU,(reg)(R2+n),(reg)(R2+n),R19);
  229. for (n=0;n<SrcRows;++n)
  230. I3(ADDU,(reg)(R4+n),(reg)(R4+n),R18);
  231. DS(); I2P(BNE,R2,R25,LoopY);
  232. CodeEnd(4,0,0);
  233. }
  234. #endif