Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1057 lines
81 KiB

  1. ;*************************************************************************
  2. ;** INTEL Corporation Proprietary Information
  3. ;**
  4. ;** This listing is supplied under the terms of a license
  5. ;** agreement with INTEL Corporation and may not be copied
  6. ;** nor disclosed except in accordance with the terms of
  7. ;** that agreement.
  8. ;**
  9. ;** Copyright (c) 1995 Intel Corporation.
  10. ;** All Rights Reserved.
  11. ;**
  12. ;*************************************************************************
  13. ;//
  14. ;// $Header: S:\h26x\src\dec\cx51282.asv
  15. ;//
  16. ;// $Log: S:\h26x\src\dec\cx51282.asv $
  17. ;//
  18. ;// Rev 1.6 18 Mar 1996 09:58:42 bnickers
  19. ;// Make color convertors non-destructive.
  20. ;//
  21. ;// Rev 1.5 05 Feb 1996 13:35:38 BNICKERS
  22. ;// Fix RGB16 color flash problem, by allowing different RGB16 formats at oce.
  23. ;//
  24. ;// Rev 1.4 16 Jan 1996 11:23:08 BNICKERS
  25. ;// Fix starting point in output stream, so we don't start at line two and
  26. ;// write off the end of the output frame.
  27. ;//
  28. ;// Rev 1.3 22 Dec 1995 15:53:50 KMILLS
  29. ;// added new copyright notice
  30. ;//
  31. ;// Rev 1.2 03 Nov 1995 14:39:42 BNICKERS
  32. ;// Support YUV12 to CLUT8 zoom by 2.
  33. ;//
  34. ;// Rev 1.1 26 Oct 1995 09:46:10 BNICKERS
  35. ;// Reduce the number of blanks in the "proc" statement because the assembler
  36. ;// sometimes has problems with statements longer than 512 characters long.
  37. ;//
  38. ;// Rev 1.0 25 Oct 1995 17:59:22 BNICKERS
  39. ;// Initial revision.
  40. ;//
  41. ;////////////////////////////////////////////////////////////////////////////
  42. ; +---------- Color convertor.
  43. ; |+--------- For both H261 and H263.
  44. ; ||+-------- Version for the Pentium Microprocessor.
  45. ; |||++------ Convert from YUV12.
  46. ; |||||+----- Convert to CLUT8.
  47. ; ||||||+---- Zoom by two.
  48. ; |||||||
  49. ; cx51282 -- This function performs YUV12 to CLUT8 zoom-by-2 color conversion
  50. ; for H26x. It is tuned for best performance on the Pentium(r)
  51. ; Microprocessor. It dithers among 9 chroma points and 26 luma
  52. ; points, mapping the 8 bit luma pels into the 26 luma points by
  53. ; clamping the ends and stepping the luma by 8.
  54. ;
  55. ; The color convertor is non-destructive; the input Y, U, and V
  56. ; planes will not be clobbered.
  57. OPTION PROLOGUE:None
  58. OPTION EPILOGUE:ReturnAndRelieveEpilogueMacro
  59. include locals.inc
  60. include ccinst.inc
  61. include decconst.inc
  62. .xlist
  63. include memmodel.inc
  64. .list
  65. .DATA
  66. ; any data would go here
  67. .CODE
  68. ASSUME cs : FLAT
  69. ASSUME ds : FLAT
  70. ASSUME es : FLAT
  71. ASSUME fs : FLAT
  72. ASSUME gs : FLAT
  73. ASSUME ss : FLAT
  74. ; void FAR ASM_CALLTYPE YUV12ToCLUT8ZoomBy2 (U8 * YPlane,
  75. ; U8 * VPlane,
  76. ; U8 * UPlane,
  77. ; UN FrameWidth,
  78. ; UN FrameHeight,
  79. ; UN YPitch,
  80. ; UN VPitch,
  81. ; UN AspectAdjustmentCount,
  82. ; U8 * ColorConvertedFrame,
  83. ; U32 DCIOffset,
  84. ; U32 CCOffsetToLine0,
  85. ; IN CCOPitch,
  86. ; IN CCType)
  87. ;
  88. ; CCOffsetToLine0 is relative to ColorConvertedFrame.
  89. ;
  90. PUBLIC YUV12ToCLUT8ZoomBy2
  91. IFDEF USE_BILINEAR_MSH26X
  92. ; due to the need for the ebp reg, these parameter declarations aren't used,
  93. ; they are here so the assembler knows how many bytes to relieve from the stack
  94. YUV12ToCLUT8ZoomBy2 proc DIST LANG AYPlane: DWORD,
  95. AVPlane: DWORD,
  96. AUPlane: DWORD,
  97. AFrameWidth: DWORD,
  98. AFrameHeight: DWORD,
  99. AYPitch: DWORD,
  100. AVPitch: DWORD,
  101. AAspectAdjustmentCnt: DWORD,
  102. AColorConvertedFrame: DWORD,
  103. ADCIOffset: DWORD,
  104. ACCOffsetToLine0: DWORD,
  105. ACCOPitch: DWORD,
  106. ACCType: DWORD
  107. LocalFrameSize = 64+768*2+4
  108. RegisterStorageSize = 16
  109. ; Arguments:
  110. YPlane_arg = RegisterStorageSize + 4
  111. VPlane_arg = RegisterStorageSize + 8
  112. UPlane_arg = RegisterStorageSize + 12
  113. FrameWidth_arg = RegisterStorageSize + 16
  114. FrameHeight = RegisterStorageSize + 20
  115. YPitch_arg = RegisterStorageSize + 24
  116. ChromaPitch_arg = RegisterStorageSize + 28
  117. AspectAdjustmentCount_arg = RegisterStorageSize + 32
  118. ColorConvertedFrame = RegisterStorageSize + 36
  119. DCIOffset = RegisterStorageSize + 40
  120. CCOffsetToLine0 = RegisterStorageSize + 44
  121. CCOPitch_arg = RegisterStorageSize + 48
  122. CCType_arg = RegisterStorageSize + 52
  123. EndOfArgList = RegisterStorageSize + 56
  124. ; Locals (on local stack frame)
  125. CCOCursor EQU [esp+ 0]
  126. ChromaLineLen EQU [esp+ 4]
  127. YLimit EQU [esp+ 8]
  128. YCursor EQU [esp+12]
  129. VCursor EQU [esp+16]
  130. DistanceFromVToU EQU [esp+20]
  131. EndOfChromaLine EQU [esp+24]
  132. AspectCount EQU [esp+28]
  133. FrameWidth EQU [esp+32]
  134. ChromaPitch EQU [esp+36]
  135. AspectAdjustmentCount EQU [esp+40]
  136. LumaPitch EQU [esp+44]
  137. CCOPitch EQU [esp+48]
  138. StashESP EQU [esp+52]
  139. ChromaContribution EQU [esp+64]
  140. push esi
  141. push edi
  142. push ebp
  143. push ebx
  144. mov edi,esp
  145. sub esp,LocalFrameSize
  146. and esp,0FFFFF800H
  147. mov eax,[edi+FrameWidth_arg]
  148. mov ebx,[edi+ChromaPitch_arg]
  149. mov ecx,[edi+AspectAdjustmentCount_arg]
  150. mov edx,[edi+YPitch_arg]
  151. mov esi,[edi+CCOPitch_arg]
  152. mov FrameWidth,eax
  153. mov ChromaPitch,ebx
  154. mov AspectAdjustmentCount,ecx
  155. mov AspectCount,ecx
  156. mov LumaPitch,edx
  157. mov CCOPitch,esi
  158. mov ebx,[edi+VPlane_arg]
  159. mov ecx,[edi+UPlane_arg]
  160. mov eax,[edi+YPlane_arg]
  161. sub ecx,ebx
  162. mov DistanceFromVToU,ecx
  163. mov VCursor,ebx
  164. mov YCursor,eax
  165. mov eax,[edi+ColorConvertedFrame]
  166. add eax,[edi+DCIOffset]
  167. add eax,[edi+CCOffsetToLine0]
  168. mov CCOCursor,eax
  169. mov StashESP,edi
  170. mov edx,[edi+FrameHeight]
  171. mov ecx,LumaPitch
  172. imul edx,ecx
  173. mov ebx,FrameWidth
  174. mov esi,YCursor ; Fetch cursor over luma plane.
  175. sar ebx,1
  176. add edx,esi
  177. mov ChromaLineLen,ebx
  178. mov YLimit,edx
  179. NextTwoLines:
  180. ; Convert line of U and V pels to the corresponding UVDitherPattern Indices.
  181. ;
  182. ; Register Usage
  183. ;
  184. ; edi -- Cursor over V line
  185. ; esi -- Cursor over storage to hold preprocessed UV.
  186. ; ebp -- Distance from V line to U line.
  187. ; edx -- UVDitherPattern index: ((V:{0:8}*9) + U:{0:8}) * 2 + 1
  188. ; bl -- U pel value
  189. ; cl -- V pel value
  190. ; eax -- Scratch
  191. mov edi,VCursor ; Fetch address of pel 0 of next line of V.
  192. mov ebp,DistanceFromVToU ; Fetch span from V plane to U plane.
  193. lea esi,ChromaContribution
  194. mov eax,ChromaLineLen
  195. mov edx,ChromaPitch
  196. add eax,edi
  197. mov EndOfChromaLine,eax
  198. add edx,edi
  199. mov bl,[edi] ; Fetch first V pel.
  200. ;
  201. and ebx,0FCH ; Reduce to 6 bits.
  202. mov cl,[edi+ebp*1] ; Fetch first U pel.
  203. and ecx,0FCH ; Reduce to 6 bits.
  204. mov VCursor,edx ; Stash for next time around.
  205. @@:
  206. mov edx,PD UVDitherLine01[ebx] ; Fetch dither pattern for V point.
  207. mov bl,[edi+1] ; Fetch next V pel.
  208. mov eax,PD UVDitherLine23[ecx] ; Fetch dither pattern for U point.
  209. mov cl,[edi+ebp*1+1] ; Fetch next U pel.
  210. lea edx,[edx+edx*2+00A0A0A0AH] ; Weight V dither pattern.
  211. and bl,0FCH ; Reduce to 6 bits.
  212. add eax,edx ; Combine dither patterns for U and V.
  213. and cl,0FCH ; Reduce to 6 bits.
  214. mov edx,PD UVDitherLine01[ebx] ; Fetch dither pattern for V point.
  215. mov [esi],eax ; Stash UV corresponding to Y00,Y01,Y10,Y11.
  216. mov eax,PD UVDitherLine23[ecx] ; Fetch dither pattern for U point.
  217. mov bl,[edi+2] ; Fetch next V pel.
  218. lea edx,[edx+edx*2+00A0A0A0AH] ; Weight V dither pattern.
  219. mov cl,[edi+ebp*1+2] ; Fetch next U pel.
  220. add eax,edx ; Combine dither patterns for U and V.
  221. mov edx,EndOfChromaLine ; Fetch EOL address.
  222. mov [esi+4],eax ; Stash UV corresponding to Y02,Y03,Y12,Y13.
  223. add edi,2 ; Advance U plane cursor.
  224. and bl,0FCH ; Reduce to 6 bits.
  225. and cl,0FCH ; Reduce to 6 bits.
  226. add esi,8
  227. sub edx,edi
  228. jne @b
  229. ; Now color convert a line of luma.
  230. ;
  231. ; Register Usage
  232. ; edi -- Cursor over line of color converted output frame, minus esi.
  233. ; esi -- Cursor over Y line.
  234. ; ebp -- Not used.
  235. ; edx,eax -- Build output pels.
  236. ; ecx,ebx -- Y pels.
  237. ; EAX EBX ECX EDX EBP
  238. mov [esi],edx ; Stash EOL indication.
  239. mov esi,YCursor ; Reload cursor over y line.
  240. mov edi,CCOCursor ; Fetch output cursor.
  241. mov eax,CCOPitch ; Compute start of next line. XX XX XX XX -- -- -- -- -- -- -- -- -- -- -- --
  242. mov bl,[esi+1] ; Fetch y1. XX XX XX XX m>-- -- -- y1 -- -- -- -- -- -- -- --
  243. add eax,edi ; >XX XX XX XX -- -- -- y1 -- -- -- -- -- -- -- --
  244. mov cl,[esi] ; Fetch y0. XX XX XX XX -- -- -- y1 m>-- -- -- y0 -- -- -- --
  245. mov CCOCursor,eax ; Stash start of next line. s<XX XX XX XX -- -- -- y1 -- -- -- y0 -- -- -- --
  246. mov al,PB YDither[ecx+0] ; Fetch Y0. m>XX XX XX Y0 -- -- -- y1 <-- -- -- y0 -- -- -- --
  247. add ecx,ebx ; Add y1 to y0. XX XX XX Y0 <-- -- -- y1 >-- -- -- y0+y1 -- -- -- --
  248. shr ecx,1 ; ya = (y0 + y1) / 2. XX XX XX Y0 -- -- -- y1 >-- -- -- ya -- -- -- --
  249. mov ah,PB YDither[ecx+6] ; Fetch YA. XX XX YA Y0 -- -- -- y1 <-- -- -- ya -- -- -- --
  250. mov dl,PB YDither[ebx+2] ; Fetch Y1. XX XX YA Y0 -- -- -- y1 <-- -- -- ya m>-- -- -- Y1
  251. mov cl,[esi+2] ; Fetch y2. XX XX YA Y0 -- -- -- y1 m>-- -- -- y2 -- -- -- Y1
  252. add ebx,ecx ; Add y2 to y1. XX XX YA Y0 >-- -- -- y1+y2 <-- -- -- y2 -- -- -- Y1
  253. shr ebx,1 ; yb = (y1 + y2) / 2. XX XX YA Y0 >-- -- -- yb -- -- -- y2 -- -- -- Y1
  254. mov dh,PB YDither[ebx+4] ; Fetch YB. XX XX YA Y0 >-- -- -- yb -- -- -- y2 m>-- -- YB Y1
  255. sub edi,esi ; Get span from y cursor to CCO cursor. XX XX YA Y0 -- -- -- yb -- -- -- y2 -- -- YB Y1
  256. shl edx,16 ; Position YB Y1. XX XX YA Y0 -- -- -- yb -- -- -- y2 >YB Y1 -- --
  257. sub edi,esi ; XX XX YA Y0 -- -- -- yb -- -- -- y2 YB Y1 -- --
  258. and eax,00000FFFFH ; Extract YA Y0. >-- -- YA Y0 -- -- -- yb -- -- -- y2 YB Y1 -- --
  259. mov bl,[esi+3] ; Fetch y3. -- -- YA Y0 m>-- -- -- y3 -- -- -- y2 YB Y1 -- --
  260. or eax,edx ; < YB Y1 YA Y0>. >YB Y1 YA Y0 -- -- -- y3 -- -- -- y2 <YB Y1 -- --
  261. mov edx,ChromaContribution ; Fetch <UV01 UV01 UV00 UV00>. YB Y1 YA Y0 -- -- -- y3 -- -- -- y2 m>C1 C1 C0 C0
  262. sub esp,1536
  263. Line0Loop:
  264. add eax,edx ; < PB P1 PA P0>. >PB P1 PA P0 -- -- -- y3 -- -- -- y2 <C1 C1 C0 C0
  265. mov Ze [edi+esi*2],eax ; Store four pels to color conv output. m<PB P1 PA P0 -- -- -- y3 -- -- -- y2 C1 C1 C0 C0
  266. mov al,PB YDither[ecx+0] ; Fetch Y2. m>PB P1 PA Y2 -- -- -- y3 <-- -- -- y2 C1 C1 C0 C0
  267. add ecx,ebx ; Add y3 to y2. PB P1 PA Y2 -- -- -- y3 >-- -- -- y2+y3 C1 C1 C0 C0
  268. shr ecx,1 ; yc = (y2 + y3) / 2. PB P1 PA Y2 -- -- -- y3 >-- -- -- yc C1 C1 C0 C0
  269. mov ah,PB YDither[ecx+6] ; Fetch YC. PB P1 YC Y2 -- -- -- y3 <-- -- -- yc C1 C1 C0 C0
  270. and eax,00000FFFFH ; Extract YC Y2. >-- -- YC Y2 -- -- -- y3 -- -- -- y2 C1 C1 C0 C0
  271. mov dl,PB YDither[ebx+2] ; Fetch Y3. -- -- YC Y2 -- -- -- y3 -- -- -- y2 C1 C1 C0 Y3
  272. mov cl,[esi+4] ; Fetch y4. -- -- YC Y2 -- -- -- y3 m>-- -- -- y4 C1 C1 C0 Y3
  273. add ebx,ecx ; Add y4 to y3. -- -- YC Y2 >-- -- -- y3+y4 -- -- -- y4 C1 C1 C0 Y3
  274. shr ebx,1 ; yd = (y3 + y4) / 2. -- -- YC Y2 >-- -- -- yd -- -- -- y4 C1 C1 C0 Y3
  275. mov dh,PB YDither[ebx+4] ; Fetch YD. -- -- YC Y2 <-- -- -- yd -- -- -- y4 m>C1 C1 YD Y3
  276. add esi,4 ; Advance cursor. -- -- YC Y2 -- -- -- yd -- -- -- y4 C1 C1 YD Y3
  277. shl edx,16 ; Extract YD Y3. -- -- YC Y2 -- -- -- yd -- -- -- y4 >YD Y3 -- --
  278. mov bl,[esi+1] ; Fetch y5. -- -- YC Y2 m>-- -- -- y5 -- -- -- y4 YD Y3 -- --
  279. or eax,edx ; < YD Y3 Yc Y2>. >YD Y3 YC Y2 -- -- -- y5 -- -- -- y4 <YD Y3 -- --
  280. mov edx,ChromaContribution+1536+4 ; Fetch <UV03 UV03 UV02 UV02>. YD Y3 YC Y2 -- -- -- y5 -- -- -- y4 s>C3 C3 C2 C2
  281. add eax,edx ; < P03 P03 P02 P02>. >PD P3 PC P2 -- -- -- y5 -- -- -- y4 <C3 C3 C2 C2
  282. mov Ze [edi+esi*2+4-8],eax ; Store four pels to color conv output. m<PD P3 PC P2 -- -- -- y5 -- -- -- y4 C3 C3 C2 C2
  283. mov al,PB YDither[ecx+0] ; Fetch Y4. PD P3 PC Y4 -- -- -- y5 <-- -- -- y4 C3 C3 C2 C2
  284. add ecx,ebx ; Add y5 to y4. PD P3 PC Y4 >-- -- -- y5 >-- -- -- y4+y5 C3 C3 C2 C2
  285. shr ecx,1 ; ye = (y4 + y5) / 2. PD P3 PC Y4 -- -- -- y5 >-- -- -- ye C3 C3 C2 C2
  286. mov ah,PB YDither[ecx+6] ; Fetch YE. m>PD P3 YE Y4 -- -- -- y5 <-- -- -- ye C3 C3 C2 C2
  287. and eax,00000FFFFH ; Extract YE Y4. >-- -- YE Y4 -- -- -- y5 -- -- -- ye C3 C3 C2 C2
  288. mov dl,PB YDither[ebx+2] ; Fetch Y5. -- -- YE Y4 -- -- -- y5 -- -- -- ye m>C3 C3 C2 Y5
  289. mov cl,[esi+2] ; Fetch y6. -- -- YE Y4 -- -- -- y5 m>-- -- -- y6 C3 C3 C2 Y5
  290. add ebx,ecx ; Add y6 to y5. -- -- YE Y4 >-- -- -- y5+y6 <-- -- -- y6 C3 C3 C2 Y5
  291. shr ebx,1 ; yf = (y5 + y6) / 2. -- -- YE Y4 >-- -- -- yf -- -- -- y6 C3 C3 C2 Y5
  292. mov dh,PB YDither[ebx+4] ; Fetch YF. -- -- YE Y4 <-- -- -- yf -- -- -- y6 C3 C3 YF Y5
  293. shl edx,16 ; Extract YF Y5. -- -- YE Y4 -- -- -- yf -- -- -- y6 YF Y5 -- --
  294. mov bl,[esi+3] ; Fetch y7. -- -- YE Y4 m>-- -- -- y7 -- -- -- y6 YF Y5 -- --
  295. or eax,edx ; < YF Y5 YE Y4>. >YF Y5 YE Y4 -- -- -- y7 -- -- -- y6 <YF Y5 -- --
  296. mov edx,ChromaContribution+1536+8 ; Fetch <UV01 UV01 UV00 UV00>. YF Y5 YE Y4 -- -- -- y7 -- -- -- y6 s>C5 C5 C4 C4
  297. add esp,8 ; YF Y5 YE Y4 -- -- -- y7 -- -- -- y6 C5 C5 C4 C4
  298. test edx,edx
  299. jne Line0Loop
  300. and esp,0FFFFF800H
  301. add esp,0800H
  302. ; Color convert same input line, dithering differently.
  303. mov edx,AspectCount
  304. mov edi,CCOCursor ; Fetch output cursor.
  305. sub edx,2
  306. mov eax,CCOPitch ; Compute start of next line.
  307. mov AspectCount,edx
  308. mov esi,YCursor ; Reload cursor over Y line.
  309. mov ebp,AspectAdjustmentCount
  310. jg KeepLine1
  311. add edx,ebp
  312. mov AspectCount,edx
  313. jmp SkipLine1
  314. KeepLine1:
  315. mov ebp,LumaPitch
  316. mov bl,[esi+ebp+2] ; Fetch y130. XX XX XX XX m>-- -- -- y130 -- -- -- -- XX XX XX XX
  317. add eax,edi ; >XX XX XX XX -- -- -- y130 -- -- -- -- XX XX XX XX
  318. mov cl,[esi+1] ; Fetch y1. XX XX XX XX -- -- -- y130 m>-- -- -- y1 XX XX XX XX
  319. mov CCOCursor,eax ; Stash start of next line. s<XX XX XX XX -- -- -- y130 -- -- -- y1 XX XX XX XX
  320. add ebx,ecx ; Add y1 to y130. XX XX XX XX >-- -- -- y130+y1 <-- -- -- y1 XX XX XX XX
  321. shr ebx,1 ; yd = (y1 + y130) / 2. XX XX XX XX >-- -- -- yd -- -- -- y1 XX XX XX XX
  322. mov dh,PB YDither[ebx+6] ; Fetch YD. XX XX XX XX <-- -- -- yd -- -- -- y1 m>XX XX YD XX
  323. mov bl,[esi+ebp+1] ; Fetch y129. XX XX XX XX m>-- -- -- y129 -- -- -- y1 XX XX YD XX
  324. add ecx,ebx ; Add y129 to y1. XX XX XX XX <-- -- -- y129 >-- -- -- y1+y129 XX XX YD XX
  325. shr ecx,1 ; yc = (y1 + y129) / 2. XX XX XX XX -- -- -- y129 >-- -- -- yc XX XX YD XX
  326. mov dl,PB YDither[ecx+0] ; Fetch YC. XX XX XX XX -- -- -- y129 <-- -- -- yc m>XX XX YD YC
  327. sub edi,esi ; Get span from Y cursor to CCO cursor. XX XX XX XX -- -- -- y129 -- -- -- yc XX XX YD YC
  328. shl edx,16 ; Extract YD YC. XX XX XX XX -- -- -- y129 -- -- -- yc >YD YC -- --
  329. sub edi,esi ; XX XX XX XX -- -- -- y129 -- -- -- yc YD YC -- --
  330. mov cl,[esi] ; Fetch y0. XX XX XX XX -- -- -- y129 m>-- -- -- y0 YD YC -- --
  331. add ebx,ecx ; Add y0 to y129. XX XX XX XX >-- -- -- y129+y0 <-- -- -- y0 YD YC -- --
  332. shr ebx,1 ; yb = (y0 + y129) / 2. XX XX XX XX >-- -- -- yb -- -- -- y0 YD YC -- --
  333. mov ah,PB YDither[ebx+4] ; Fetch YB. m>XX XX YB XX <-- -- -- yb -- -- -- y0 YD YC -- --
  334. mov bl,[esi+ebp] ; Fetch y128. XX XX YB XX m>-- -- -- y128 -- -- -- y0 YD YC -- --
  335. add ecx,ebx ; Add y0 to y128. XX XX YB XX <-- -- -- y128 >-- -- -- y0+y128 YD YC -- --
  336. shr ecx,1 ; ya = (y0 + y128) / 2. XX XX YB XX -- -- -- y128 >-- -- -- ya YD YC -- --
  337. mov al,PB YDither[ecx+2] ; Fetch YA. XX XX YB YA -- -- -- y128 <-- -- -- ya YD YC -- --
  338. mov bl,[esi+ebp+4] ; Fetch y132. XX XX YB YA m>-- -- -- y132 -- -- -- ya YD YC -- --
  339. and eax,00000FFFFH ; Extract YB YA. >-- -- YB YA -- -- -- y132 -- -- -- ya YD YC -- --
  340. mov cl,[esi+3] ; Fetch y3. -- -- YB YA -- -- -- y132 m>-- -- -- y3 YD YC -- --
  341. or eax,edx ; < YD YC YB YA>. >YD YC YB YA -- -- -- y132 -- -- -- y3 <YD YC -- --
  342. mov edx,ChromaContribution ; Fetch <UV01 UV01 UV00 UV00>. YD YC YB YA -- -- -- y132 -- -- -- y3 m>C1 C1 C0 C0
  343. rol edx,16 ; Swap dither pattern. YD YC YB YA -- -- -- y132 -- -- -- y3 >C0 C0 C1 C1
  344. sub esp,1536
  345. Line1Loop:
  346. add eax,edx ; < PA PB PC PD>. >PD PC PB PA -- -- -- y132 -- -- -- y3 <C0 C0 C1 C1
  347. add ebx,ecx ; Add y3 to y132. PD PC PB PA >-- -- -- y132+y3 <-- -- -- y3 C0 C0 C1 C1
  348. shr ebx,1 ; yh = (y3 + y132) / 2. PD PC PB PA >-- -- -- yh -- -- -- y3 C0 C0 C1 C1
  349. mov dh,PB YDither[ebx+6] ; Fetch YH. PD PC PB PA <-- -- -- yh -- -- -- y3 m>C0 C0 YH C1
  350. mov bl,[esi+ebp+3] ; Fetch y131. PD PC PB PA m>-- -- -- y131 -- -- -- y3 C0 C0 YH C1
  351. add ecx,ebx ; Add y131 to y3. PD PC PB PA <-- -- -- y131 >-- -- -- y3+y131 C0 C0 YH C1
  352. shr ecx,1 ; yg = (y3 + y131) / 2. PD PC PB PA -- -- -- y131 >-- -- -- yg C0 C0 YH C1
  353. mov dl,PB YDither[ecx+0] ; Fetch YG. PD PC PB PA -- -- -- y131 <-- -- -- yg m>C0 C0 YH YG
  354. mov Ze [edi+esi*2],eax ; Store four pels to color conv output. m<PD PC PB PA -- -- -- y131 -- -- -- yg C0 C0 YH YG
  355. shl edx,16 ; Extract YH YG. PD PC PB PA -- -- -- y131 -- -- -- yg >YH YG -- --
  356. mov cl,[esi+2] ; Fetch y2. PD PC PB PA -- -- -- y131 m>-- -- -- y2 YH YG -- --
  357. add ebx,ecx ; Add y2 to y131. PD PC PB PA >-- -- -- y131+y0 <-- -- -- y2 YH YG -- --
  358. shr ebx,1 ; yf = (y2 + y131) / 2. PD PC PB PA >-- -- -- yf -- -- -- y2 YH YG -- --
  359. mov ah,PB YDither[ebx+4] ; Fetch YF. m>PD PC YF PA <-- -- -- yf -- -- -- y2 YH YG -- --
  360. mov bl,[esi+ebp+2] ; Fetch y130. PD PC YF PA m>-- -- -- y130 -- -- -- y2 YH YG -- --
  361. add ecx,ebx ; Add y2 to y130. PD PC YF PA <-- -- -- y130 >-- -- -- y2+y130 YH YG -- --
  362. shr ecx,1 ; ye = (y2 + y130) / 2. PD PC YF PA -- -- -- y130 >-- -- -- ye YH YG -- --
  363. mov al,PB YDither[ecx+2] ; Fetch YE. PD PC YF YE -- -- -- y130 <-- -- -- ye YH YG -- --
  364. add esi,4 ; Advance cursor. PD PC YF YE -- -- -- y130 -- -- -- ye YH YG -- --
  365. and eax,00000FFFFH ; Extract YF YE. >-- -- YF YE -- -- -- y130 -- -- -- ye YH YG -- --
  366. mov bl,[esi+ebp+2] ; Fetch y134. -- -- YF YE m>-- -- -- y134 -- -- -- ye YH YG -- --
  367. or eax,edx ; < YH YG YF YE>. >YH YG YF YE -- -- -- y134 -- -- -- ye <YH YG -- --
  368. mov edx,ChromaContribution+1536+4 ; Fetch <UV03 UV03 UV02 UV02>. YH YG YF YE -- -- -- y134 -- -- -- ye s>C3 C3 C2 C2
  369. rol edx,16 ; Swap dither pattern. YH YG YF YE -- -- -- y134 -- -- -- ye >C2 C2 C3 C3
  370. add esp,8 ; YH YG YF YE -- -- -- y134 -- -- -- ye C2 C2 C3 C3
  371. add eax,edx ; < PH PG PF PE>. >PH PG PF PE -- -- -- y134 -- -- -- ye <C2 C2 C3 C3
  372. mov cl,[esi+1] ; Fetch y5. PH PG PF PE -- -- -- y134 m>-- -- -- y5 C2 C2 C3 C3
  373. mov Ze [edi+esi*2+4-8],eax ; Store four pels to color conv output. m<PH PG PF PE -- -- -- y134 -- -- -- y5 C2 C2 C3 C3
  374. add ebx,ecx ; Add y5 to y134. PH PG PF PE >-- -- -- y134+y5 <-- -- -- y5 C2 C2 C3 C3
  375. shr ebx,1 ; yl = (y5 + y134) / 2. PH PG PF PE >-- -- -- yl -- -- -- y5 C2 C2 C3 C3
  376. mov dh,PB YDither[ebx+6] ; Fetch YL. PH PG PF PE <-- -- -- yl -- -- -- y5 m>C2 C2 YL C3
  377. mov bl,[esi+ebp+1] ; Fetch y133. PH PG PF PE m>-- -- -- y133 -- -- -- y5 C2 C2 YL C3
  378. add ecx,ebx ; Add y133 to y5. PH PG PF PE <-- -- -- y133 >-- -- -- y5+y133 C2 C2 YL C3
  379. shr ecx,1 ; yk = (y5 + y133) / 2. PH PG PF PE -- -- -- y133 >-- -- -- yk C2 C2 YL C3
  380. mov dl,PB YDither[ecx+0] ; Fetch YK. PH PG PF PE -- -- -- y133 <-- -- -- yk m>C2 C2 YL YK
  381. shl edx,16 ; Extract YL YK. PH PG PF PE -- -- -- y133 -- -- -- yk >YL YK -- --
  382. mov cl,[esi] ; Fetch y4. PH PG PF PE -- -- -- y133 m>-- -- -- y4 YL YK -- --
  383. add ebx,ecx ; Add y4 to y133. PH PG PF PE >-- -- -- y133+y4 <-- -- -- y4 YL YK -- --
  384. shr ebx,1 ; yj = (y4 + y133) / 2. PH PG PF PE >-- -- -- yj -- -- -- y4 YL YK -- --
  385. mov ah,PB YDither[ebx+4] ; Fetch YJ. m>PH PG YJ PE <-- -- -- yj -- -- -- y4 YL YK -- --
  386. mov bl,[esi+ebp] ; Fetch y132. PH PG YJ PE m>-- -- -- y132 -- -- -- y4 YL YK -- --
  387. add ecx,ebx ; Add y4 to y132. PH PG YJ PE <-- -- -- y132 >-- -- -- y4+y132 YL YK -- --
  388. shr ecx,1 ; yi = (y4 + y132) / 2. PH PG YJ PE -- -- -- y132 >-- -- -- yi YL YK -- --
  389. mov al,PB YDither[ecx+2] ; Fetch YI. PH PG YJ YI -- -- -- y132 <-- -- -- yi YL YK -- --
  390. and eax,00000FFFFH ; Extract YJ YI. >-- -- YJ YI -- -- -- y132 -- -- -- yi YL YK -- --
  391. mov bl,[esi+ebp+4] ; Fetch y136. -- -- YJ YI m>-- -- -- y136 -- -- -- yi YL Yk -- --
  392. or eax,edx ; < YL YK YJ YI>. >YL YK YJ YI -- -- -- y136 -- -- -- yi YL YK -- --
  393. mov edx,ChromaContribution+1536 ; Fetch <UV01 UV01 UV00 UV00>. YL YK YJ YI -- -- -- y136 -- -- -- yi s>C5 C5 C4 C4
  394. rol edx,16 ; Swap dither pattern. YL YK YJ YI -- -- -- y136 -- -- -- yi >C4 C4 C5 C5
  395. mov cl,[esi+3] ; Fetch y7. YL YK YJ YI -- -- -- y136 m>-- -- -- y7 C4 C4 C5 C5
  396. test edx,edx
  397. jne Line1Loop
  398. and esp,0FFFFF800H
  399. add esp,0800H
  400. SkipLine1:
  401. ; Now color convert the second input line of luma.
  402. mov esi,YCursor ; Reload cursor over Y line.
  403. mov ebp,LumaPitch
  404. mov edi,CCOCursor ; Fetch output cursor.
  405. mov eax,CCOPitch ; Compute start of next line. XX XX XX XX -- -- -- -- -- -- -- -- -- -- -- --
  406. mov bl,[esi+ebp*1] ; Fetch y0. XX XX XX XX m>-- -- -- y0 -- -- -- -- -- -- -- --
  407. add eax,edi ; >XX XX XX XX -- -- -- y0 -- -- -- -- -- -- -- --
  408. mov cl,[esi+ebp*1+1] ; Fetch y1. XX XX XX XX -- -- -- y0 m>-- -- -- y1 -- -- -- --
  409. mov CCOCursor,eax ; Stash start of next line. s<XX XX XX XX -- -- -- y0 -- -- -- y1 -- -- -- --
  410. mov dh,PB YDither[ebx+6] ; Fecth Y0. XX XX XX XX -- -- -- y0 -- -- -- y1 -- -- Y0 --
  411. add ebx,ecx ; Add y1 to y0. XX XX XX XX >-- -- -- y0+y1 <-- -- -- y1 -- -- Y0 --
  412. shr ebx,1 ; ya = (y0 + y1) / 2. XX XX XX XX >-- -- -- ya -- -- -- y1 -- -- Y0 --
  413. mov dl,PB YDither[ebx+0] ; Fetch YA. XX XX XX XX <-- -- -- ya -- -- -- y1 m>-- -- Y0 YA
  414. sub edi,esi ; Get span from Y cursor to CCO cursor. XX XX XX XX -- -- -- ya -- -- -- y1 -- -- Y0 YA
  415. shl edx,16 ; Extract Y0 YA XX XX XX XX -- -- -- ya -- -- -- y1 >Y0 YA -- --
  416. sub edi,esi ; XX XX XX XX -- -- -- ya -- -- -- y1 Y0 YA -- --
  417. mov bl,[esi+ebp*1+2] ; Fetch y2. XX XX XX XX m>-- -- -- y2 -- -- -- y1 Y0 YA -- --
  418. mov ah,PB YDither[ecx+4] ; Fetch Y1. m>XX XX Y1 XX -- -- -- y2 <-- -- -- y1 Y0 YA -- --
  419. add ecx,ebx ; Add y2 to y1. XX XX Y1 XX -- -- -- y2 >-- -- -- y1+y2 Y0 YA -- --
  420. shr ecx,1 ; yb = (y1 + y2) / 2. XX XX Y1 XX -- -- -- y2 >-- -- -- yb Y0 YA -- --
  421. mov al,PB YDither[ecx+2] ; Fetch YB. m>XX XX Y1 YB -- -- -- y2 <-- -- -- yb Y0 YA -- --
  422. and eax,00000FFFFH ; Extract Y1 YB. >-- -- Y1 YB -- -- -- y2 -- -- -- yb Y0 YA -- --
  423. mov cl,[esi+ebp*1+3] ; Fetch y3. -- -- Y1 YB -- -- -- y2 m>-- -- -- y3 Y0 YA -- --
  424. or eax,edx ; < Y0 YA Y1 YB>. >Y0 YA Y1 YB -- -- -- y2 -- -- -- y3 <Y0 YA -- --
  425. mov edx,ChromaContribution ; Fetch <UV01 UV01 UV00 UV00>. Y0 YA Y1 YB -- -- -- y2 -- -- -- y3 m>C1 C1 C0 C0
  426. rol edx,16 ; Swap dither pattern. Y0 YA Y1 YB -- -- -- y2 -- -- -- y3 >C0 C0 C1 C1
  427. sub esp,1536
  428. Line2Loop:
  429. add eax,edx ; < P0 PA P1 PB>. >P0 PA P1 PB -- -- -- y2 -- -- -- y3 C0 C0 C1 C1
  430. mov dh,PB YDither[ebx+6] ; Fecth Y2. P0 PA P1 PB <-- -- -- y2 -- -- -- y3 m>C0 C0 Y2 C1
  431. add ebx,ecx ; Add y3 to y2. P0 PA P1 PB >-- -- -- y2+y3 <-- -- -- y3 C0 C0 Y2 C1
  432. shr ebx,1 ; yc = (y2 + y3) / 2. P0 PA P1 PB >-- -- -- yc -- -- -- y3 C0 C0 Y2 C1
  433. mov dl,PB YDither[ebx+0] ; Fetch YC. P0 PA P1 PB <-- -- -- yc -- -- -- y3 m>C0 C0 Y2 YC
  434. bswap eax ; < PB P1 PA P0>. >PB P1 PA P0 -- -- -- yc -- -- -- y3 C0 C0 Y2 YC
  435. mov Ze [edi+esi*2],eax ; Store four pels to color conv output. m<PB P1 PA P0 -- -- -- yc -- -- -- y3 C0 C0 Y2 YC
  436. add esi,4 ; PB P1 PA P0 -- -- -- yc -- -- -- y3 C0 C0 Y2 YC
  437. shl edx,16 ; Extract Y2 YC. PB P1 PA P0 -- -- -- yc -- -- -- y3 >Y2 YC -- --
  438. mov bl,[esi+ebp*1] ; Fetch y4. PB P1 PA P0 m>-- -- -- y4 -- -- -- y3 Y2 YC -- --
  439. mov ah,PB YDither[ecx+4] ; Fetch Y3. m>PB P1 Y3 P0 -- -- -- y4 <-- -- -- y3 Y2 YC -- --
  440. add ecx,ebx ; Add y4 to y3. PB P1 Y3 P0 -- -- -- y4 >-- -- -- y4+y4 Y2 YC -- --
  441. shr ecx,1 ; yd = (y3 + y4) / 2. PB P1 Y3 P0 -- -- -- y4 >-- -- -- yd Y2 YC -- --
  442. mov al,PB YDither[ecx+2] ; Fetch YD. m>PB P1 Y3 YD -- -- -- y4 <-- -- -- yd Y2 YC -- --
  443. and eax,00000FFFFH ; Extract Y3 YD. >-- -- Y3 YD -- -- -- y4 -- -- -- yd Y2 YC -- --
  444. or eax,edx ; < Y2 YC Y3 YD>. >Y2 YC Y3 YD -- -- -- y4 -- -- -- yd <Y2 YC -- --
  445. mov edx,ChromaContribution+1536+4 ; Fetch <UV03 UV03 UV02 UV02>. Y2 YC Y3 YD -- -- -- y4 -- -- -- yd s>C3 C3 C2 C2
  446. rol edx,16 ; Swap dither pattern. Y2 YC Y3 YD -- -- -- y4 -- -- -- yd s>C2 C2 C3 C3
  447. add esp,8 ; Y2 YC Y3 YD -- -- -- y4 -- -- -- yd C2 C2 C3 C3
  448. add eax,edx ; < P2 PC P3 PD>. >P2 PC P3 PD -- -- -- y4 -- -- -- yd <C2 C2 C3 C3
  449. mov cl,[esi+ebp*1+1] ; Fetch next y5. P2 PC P3 PD -- -- -- y4 m>-- -- -- y5 C2 C2 C3 C3
  450. bswap eax ; < PD P3 PC P2>. >PD P3 PC P2 -- -- -- y4 -- -- -- y5 C2 C2 C3 C3
  451. mov Ze [edi+esi*2+4-8],eax ; Store four pels to color conv output. m<PD P3 PC P2 -- -- -- y4 -- -- -- y5 C2 C2 C3 C3
  452. mov dh,PB YDither[ebx+6] ; Fecth Y4. PD P3 PC P2 <-- -- -- y4 -- -- -- y5 m>C2 C2 Y4 C3
  453. add ebx,ecx ; Add y5 to y4. PD P3 PC P2 >-- -- -- y4+y5 <-- -- -- y5 C2 C2 Y4 C3
  454. shr ebx,1 ; ye = (y4 + y5) / 2. PD P3 PC P2 >-- -- -- ye -- -- -- y5 C2 C2 Y4 C3
  455. mov dl,PB YDither[ebx+0] ; Fetch YE. PD P3 PC P2 <-- -- -- ye -- -- -- y5 m>C2 C2 Y4 YE
  456. shl edx,16 ; Extract Y4 YE. PD P3 PC P2 -- -- -- ye -- -- -- y5 >Y4 YE -- --
  457. mov bl,[esi+ebp*1+2] ; Fetch y6. PD P3 PC P2 m>-- -- -- y6 -- -- -- y5 Y4 YE -- --
  458. mov ah,PB YDither[ecx+4] ; Fetch Y5. m>PD P3 Y5 P2 -- -- -- y6 <-- -- -- y5 Y4 YE -- --
  459. add ecx,ebx ; Add y6 to y5. PD P3 Y5 P2 -- -- -- y6 >-- -- -- y5+y6 Y4 YE -- --
  460. shr ecx,1 ; yf = (y5 + y6) / 2. PD P3 Y5 P2 -- -- -- y6 >-- -- -- yf Y4 YE -- --
  461. mov al,PB YDither[ecx+2] ; Fetch YF. m>PD P3 Y5 YF -- -- -- y6 <-- -- -- yf Y4 YE -- --
  462. and eax,00000FFFFH ; Extract Y5 YF. >-- -- Y5 YF -- -- -- y6 -- -- -- yf Y4 YE -- --
  463. or eax,edx ; < Y4 YE Y5 YF>. >Y4 YE Y5 YF -- -- -- y6 -- -- -- yf Y4 YE -- --
  464. mov edx,ChromaContribution+1536 ; Fetch <UV01 UV01 UV00 UV00>. Y4 YE Y5 YF -- -- -- y6 -- -- -- yf s>C5 C5 C4 C4
  465. rol edx,16 ; Swap dither pattern. Y4 YE Y5 YF -- -- -- y6 -- -- -- yf >C4 C4 C5 C5
  466. mov cl,[esi+ebp*1+3] ; Fetch y7. Y4 YE Y5 YF -- -- -- y6 m>-- -- -- y7 C4 C4 C5 C5
  467. test edx,edx
  468. jne Line2Loop
  469. and esp,0FFFFF800H
  470. add esp,0800H
  471. ; Color convert same input line, dithering differently.
  472. mov esi,YCursor
  473. mov edx,AspectCount
  474. mov edi,CCOCursor ; Fetch output cursor.
  475. sub edx,2
  476. lea eax,[esi+ebp*2] ; Compute start of next line.
  477. mov AspectCount,edx
  478. mov YCursor,eax
  479. jg KeepLine3
  480. add edx,AspectAdjustmentCount
  481. mov AspectCount,edx
  482. jmp SkipLine3
  483. KeepLine3:
  484. mov bl,[esi+ebp*2+2] ; Fetch y130. XX XX XX XX m>-- -- -- y130 -- -- -- -- XX XX XX XX
  485. mov eax,CCOPitch ; Compute start of next line. XX XX XX XX -- -- -- y130 -- -- -- -- XX XX XX XX
  486. add eax,edi ; >XX XX XX XX -- -- -- y130 -- -- -- -- XX XX XX XX
  487. mov cl,[esi+ebp+1] ; Fetch y1. XX XX XX XX -- -- -- y130 m>-- -- -- y1 XX XX XX XX
  488. mov CCOCursor,eax ; Stash start of next line. s<XX XX XX XX -- -- -- y130 -- -- -- y1 XX XX XX XX
  489. add ebx,ecx ; Add y1 to y130. XX XX XX XX >-- -- -- y130+y1 <-- -- -- y1 XX XX XX XX
  490. shr ebx,1 ; yd = (y1 + y130) / 2. XX XX XX XX >-- -- -- yd -- -- -- y1 XX XX XX XX
  491. mov al,PB YDither[ebx+0] ; Fetch YD. m>XX XX XX YD <-- -- -- yd -- -- -- y1 XX XX XX XX
  492. mov bl,[esi+ebp+1] ; Fetch y129. XX XX XX YD m>-- -- -- y129 -- -- -- y1 XX XX XX XX
  493. add ecx,ebx ; Add y129 to y1. XX XX XX YD <-- -- -- y129 >-- -- -- y1+y129 XX XX XX XX
  494. shr ecx,1 ; yc = (y1 + y129) / 2. XX XX XX YD -- -- -- y129 >-- -- -- yc XX XX XX XX
  495. mov ah,PB YDither[ecx+6] ; Fetch YC. m>XX XX YC YD -- -- -- y129 <-- -- -- yc XX XX XX XX
  496. sub edi,esi ; Get span from Y cursor to CCO cursor. XX XX YC YD -- -- -- y129 -- -- -- yc XX XX XX XX
  497. and eax,00000FFFFH ; Extract YD YC. >-- -- YC YD -- -- -- y129 -- -- -- yc XX XX XX XX
  498. sub edi,esi ; -- -- YC YD -- -- -- y129 -- -- -- yc XX XX XX XX
  499. mov cl,[esi+ebp] ; Fetch y0. -- -- YC YD -- -- -- y129 m>-- -- -- y0 XX XX XX XX
  500. add ebx,ecx ; Add y0 to y129. -- -- YC YD >-- -- -- y129+y0 <-- -- -- y0 XX XX XX XX
  501. shr ebx,1 ; yb = (y0 + y129) / 2. -- -- YC YD >-- -- -- yb -- -- -- y0 XX XX XX XX
  502. mov dl,PB YDither[ebx+2] ; Fetch YB. -- -- YC YD <-- -- -- yb -- -- -- y0 m>XX XX XX YB
  503. mov bl,[esi+ebp*2] ; Fetch y128. -- -- YC YD m>-- -- -- y128 -- -- -- y0 XX XX XX YB
  504. add ecx,ebx ; Add y0 to y128. -- -- YC YD <-- -- -- y128 >-- -- -- y0+y128 XX XX XX YB
  505. shr ecx,1 ; ya = (y0 + y128) / 2. -- -- YC YD -- -- -- y128 >-- -- -- ya XX XX XX YB
  506. mov dh,PB YDither[ecx+4] ; Fetch YA. -- -- YC YD -- -- -- y128 <-- -- -- ya m>XX XX YA YB
  507. mov bl,[esi+ebp*2+4] ; Fetch y132. -- -- YC YD m>-- -- -- y132 -- -- -- ya XX XX YA YB
  508. shl edx,16 ; Extract YB YA. -- -- YC YD -- -- -- y132 -- -- -- ya >YA YB -- --
  509. mov cl,[esi+ebp+3] ; Fetch y3. -- -- YC YD -- -- -- y132 m>-- -- -- y3 YA YB -- --
  510. or eax,edx ; < YD YC YB YA>. >YA YB YC YD -- -- -- y132 -- -- -- y3 <YA YB -- --
  511. mov edx,ChromaContribution ; Fetch <UV01 UV01 UV00 UV00>. YA YB YC YD -- -- -- y132 -- -- -- y3 m>C1 C1 C0 C0
  512. sub esp,1536
  513. Line3Loop:
  514. add eax,edx ; < PA PB PC PD>. >PA PB PC PD -- -- -- y132 -- -- -- y3 <C1 C1 C0 C0
  515. add ebx,ecx ; Add y3 to y132. PA PB PC PD >-- -- -- y132+y3 <-- -- -- y3 C1 C1 C0 C0
  516. shr ebx,1 ; yh = (y3 + y132) / 2. PA PB PC PD >-- -- -- yh -- -- -- y3 C1 C1 C0 C0
  517. mov dl,PB YDither[ebx+0] ; Fetch YH. PA PB PC PD <-- -- -- yh -- -- -- y3 m>C1 C1 C0 YH
  518. bswap eax ; >PD PC PB PA -- -- -- yh -- -- -- y3 C1 C1 C0 YH
  519. mov bl,[esi+ebp*2+3] ; Fetch y131. PD PC PB PA m>-- -- -- y131 -- -- -- y3 C1 C1 C0 YH
  520. add ecx,ebx ; Add y131 to y3. PD PC PB PA <-- -- -- y131 >-- -- -- y3+y131 C1 C1 C0 YH
  521. shr ecx,1 ; yg = (y3 + y131) / 2. PD PC PB PA -- -- -- y131 >-- -- -- yg C1 C1 C0 YH
  522. mov dh,PB YDither[ecx+6] ; Fetch YG. PD PC PB PA -- -- -- y131 <-- -- -- yg m>C1 C1 YG YH
  523. mov Ze [edi+esi*2],eax ; Store four pels to color conv output. m<PD PC PB PA -- -- -- y131 -- -- -- yg C1 C1 YG YH
  524. and edx,00000FFFFH ; Extract YG YH. PD PC PB PA -- -- -- y131 -- -- -- yg >-- -- YG YH
  525. mov cl,[esi+ebp+2] ; Fetch y2. PD PC PB PA -- -- -- y131 m>-- -- -- y2 -- -- YG YH
  526. add ebx,ecx ; Add y2 to y131. PD PC PB PA >-- -- -- y131+y0 <-- -- -- y2 -- -- YG YH
  527. shr ebx,1 ; yf = (y2 + y131) / 2. PD PC PB PA >-- -- -- yf -- -- -- y2 -- -- YG YH
  528. mov al,PB YDither[ebx+2] ; Fetch YF. m>PD PC PB YF <-- -- -- yf -- -- -- y2 -- -- YG YH
  529. mov bl,[esi+ebp*2+2] ; Fetch y130. PD PC PB YF m>-- -- -- y130 -- -- -- y2 -- -- YG YH
  530. add ecx,ebx ; Add y2 to y130. PD PC PB YF <-- -- -- y130 >-- -- -- y2+y130 -- -- YG YH
  531. shr ecx,1 ; ye = (y2 + y130) / 2. PD PC PB YF -- -- -- y130 >-- -- -- ye -- -- YG YH
  532. mov ah,PB YDither[ecx+4] ; Fetch YE. PD PC YE YF -- -- -- y130 <-- -- -- ye -- -- YG YH
  533. add esi,4 ; Advance cursor. PD PC YE YF -- -- -- y130 -- -- -- ye -- -- YG YH
  534. shl eax,16 ; Extract YE YF. >YE YF -- -- -- -- -- y130 -- -- -- ye -- -- YG YH
  535. mov bl,[esi+ebp*2+2] ; Fetch y134. YE YF -- -- m>-- -- -- y134 -- -- -- ye -- -- YG YH
  536. or eax,edx ; < YH YG YF YE>. >YE YF YG YH -- -- -- y134 -- -- -- ye <-- -- YG YH
  537. mov edx,ChromaContribution+1536+4 ; Fetch <UV03 UV03 UV02 UV02>. YE YF YG YH -- -- -- y134 -- -- -- ye s>C3 C3 C2 C2
  538. add esp,8 ; YE YF YG YH -- -- -- y134 -- -- -- ye C3 C3 C2 C2
  539. add eax,edx ; < PH PG PF PE>. >PE PF PG PH -- -- -- y134 -- -- -- ye <C3 C3 C2 C2
  540. mov cl,[esi+ebp+1] ; Fetch y5. PE PF PG PH -- -- -- y134 m>-- -- -- y5 C3 C3 C2 C2
  541. bswap eax ; >PH PG PF PE -- -- -- y134 -- -- -- y5 C3 C3 C2 C2
  542. mov Ze [edi+esi*2+4-8],eax ; Store four pels to color conv output. m<PH PG PF PE -- -- -- y134 -- -- -- y5 C3 C3 C2 C2
  543. add ebx,ecx ; Add y5 to y134. PH PG PF PE >-- -- -- y134+y5 <-- -- -- y5 C3 C3 C2 C2
  544. shr ebx,1 ; yl = (y5 + y134) / 2. PH PG PF PE >-- -- -- yl -- -- -- y5 C3 C3 C2 C2
  545. mov dl,PB YDither[ebx+0] ; Fetch YL. PH PG PF PE <-- -- -- yl -- -- -- y5 m>C3 C3 C2 YL
  546. mov bl,[esi+ebp*2+1] ; Fetch y133. PH PG PF PE m>-- -- -- y133 -- -- -- y5 C3 C3 C2 YL
  547. add ecx,ebx ; Add y133 to y5. PH PG PF PE <-- -- -- y133 >-- -- -- y5+y133 C3 C3 C2 YL
  548. shr ecx,1 ; yk = (y5 + y133) / 2. PH PG PF PE -- -- -- y133 >-- -- -- yk C3 C3 C2 YL
  549. mov dh,PB YDither[ecx+6] ; Fetch YK. PH PG PF PE -- -- -- y133 <-- -- -- yk m>C3 C3 YK YL
  550. and edx,00000FFFFH ; Extract YK YL. PH PG PF PE -- -- -- y133 -- -- -- yk >-- -- YK YL
  551. mov cl,[esi+ebp] ; Fetch y4. PH PG PF PE -- -- -- y133 m>-- -- -- y4 -- -- YK YL
  552. add ebx,ecx ; Add y4 to y133. PH PG PF PE >-- -- -- y133+y4 <-- -- -- y4 -- -- YK YL
  553. shr ebx,1 ; yj = (y4 + y133) / 2. PH PG PF PE >-- -- -- yj -- -- -- y4 -- -- YK YL
  554. mov al,PB YDither[ebx+2] ; Fetch YJ. m>PH PG PF YJ <-- -- -- yj -- -- -- y4 -- -- YK YL
  555. mov bl,[esi+ebp*2] ; Fetch y132. PH PG PF YJ m>-- -- -- y132 -- -- -- y4 -- -- YK YL
  556. add ecx,ebx ; Add y4 to y132. PH PG PF YJ <-- -- -- y132 >-- -- -- y4+y132 -- -- YK YL
  557. shr ecx,1 ; yi = (y4 + y132) / 2. PH PG PF YJ -- -- -- y132 >-- -- -- yi -- -- YK YL
  558. mov ah,PB YDither[ecx+4] ; Fetch YI. PH PG YI YJ -- -- -- y132 <-- -- -- yi -- -- YK YL
  559. shl eax,16 ; Extract YI YJ. >YI YJ -- -- -- -- -- y132 -- -- -- yi -- -- YK YL
  560. mov bl,[esi+ebp*2+4] ; Fetch y136. YI YJ -- -- m>-- -- -- y136 -- -- -- yi -- -- YK YL
  561. or eax,edx ; < YL YK YJ YI>. >YI YJ YK YL -- -- -- y136 -- -- -- yi -- -- YK YL
  562. mov edx,ChromaContribution+1536 ; Fetch <UV01 UV01 UV00 UV00>. YI YJ YK YL -- -- -- y136 -- -- -- yi s>C5 C5 C4 C4
  563. mov cl,[esi+ebp+3] ; Fetch y7. YI YJ YK YL -- -- -- y136 m>-- -- -- y7 C5 C5 C4 C4
  564. test edx,edx
  565. jne Line3Loop
  566. and esp,0FFFFF800H
  567. add esp,0800H
  568. SkipLine3:
  569. mov esi,YCursor
  570. mov eax,YLimit
  571. cmp eax,esi
  572. jne NextTwoLines
  573. mov esp,StashESP
  574. pop ebx
  575. pop ebp
  576. pop edi
  577. pop esi
  578. rturn
  579. YUV12ToCLUT8ZoomBy2 endp
  580. ELSE
  581. ; due to the need for the ebp reg, these parameter declarations aren't used,
  582. ; they are here so the assembler knows how many bytes to relieve from the stack
  583. YUV12ToCLUT8ZoomBy2 proc DIST LANG AYPlane: DWORD,
  584. AVPlane: DWORD,
  585. AUPlane: DWORD,
  586. AFrameWidth: DWORD,
  587. AFrameHeight: DWORD,
  588. AYPitch: DWORD,
  589. AVPitch: DWORD,
  590. AAspectAdjustmentCnt: DWORD,
  591. AColorConvertedFrame: DWORD,
  592. ADCIOffset: DWORD,
  593. ACCOffsetToLine0: DWORD,
  594. ACCOPitch: DWORD,
  595. ACCType: DWORD
  596. LocalFrameSize = 64+768*2+4
  597. RegisterStorageSize = 16
  598. ; Arguments:
  599. YPlane_arg = RegisterStorageSize + 4
  600. VPlane_arg = RegisterStorageSize + 8
  601. UPlane_arg = RegisterStorageSize + 12
  602. FrameWidth_arg = RegisterStorageSize + 16
  603. FrameHeight = RegisterStorageSize + 20
  604. YPitch_arg = RegisterStorageSize + 24
  605. ChromaPitch_arg = RegisterStorageSize + 28
  606. AspectAdjustmentCount_arg = RegisterStorageSize + 32
  607. ColorConvertedFrame = RegisterStorageSize + 36
  608. DCIOffset = RegisterStorageSize + 40
  609. CCOffsetToLine0 = RegisterStorageSize + 44
  610. CCOPitch_arg = RegisterStorageSize + 48
  611. CCType_arg = RegisterStorageSize + 52
  612. EndOfArgList = RegisterStorageSize + 56
  613. ; Locals (on local stack frame)
  614. CCOCursor EQU [esp+ 0]
  615. ChromaLineLen EQU [esp+ 4]
  616. YLimit EQU [esp+ 8]
  617. YCursor EQU [esp+12]
  618. VCursor EQU [esp+16]
  619. DistanceFromVToU EQU [esp+20]
  620. EndOfChromaLine EQU [esp+24]
  621. AspectCount EQU [esp+28]
  622. FrameWidth EQU [esp+32]
  623. ChromaPitch EQU [esp+36]
  624. AspectAdjustmentCount EQU [esp+40]
  625. LumaPitch EQU [esp+44]
  626. CCOPitch EQU [esp+48]
  627. StashESP EQU [esp+52]
  628. ChromaContribution EQU [esp+64]
  629. push esi
  630. push edi
  631. push ebp
  632. push ebx
  633. mov edi,esp
  634. sub esp,LocalFrameSize
  635. and esp,0FFFFF800H
  636. mov eax,[edi+FrameWidth_arg]
  637. mov ebx,[edi+ChromaPitch_arg]
  638. mov ecx,[edi+AspectAdjustmentCount_arg]
  639. mov edx,[edi+YPitch_arg]
  640. mov esi,[edi+CCOPitch_arg]
  641. mov FrameWidth,eax
  642. mov ChromaPitch,ebx
  643. mov AspectAdjustmentCount,ecx
  644. mov AspectCount,ecx
  645. mov LumaPitch,edx
  646. mov CCOPitch,esi
  647. mov ebx,[edi+VPlane_arg]
  648. mov ecx,[edi+UPlane_arg]
  649. mov eax,[edi+YPlane_arg]
  650. sub ecx,ebx
  651. mov DistanceFromVToU,ecx
  652. mov VCursor,ebx
  653. mov YCursor,eax
  654. mov eax,[edi+ColorConvertedFrame]
  655. add eax,[edi+DCIOffset]
  656. add eax,[edi+CCOffsetToLine0]
  657. mov CCOCursor,eax
  658. mov StashESP,edi
  659. mov edx,[edi+FrameHeight]
  660. mov ecx,LumaPitch
  661. imul edx,ecx
  662. mov ebx,FrameWidth
  663. mov esi,YCursor ; Fetch cursor over luma plane.
  664. sar ebx,1
  665. add edx,esi
  666. mov ChromaLineLen,ebx
  667. mov YLimit,edx
  668. NextTwoLines:
  669. ; Convert line of U and V pels to the corresponding UVDitherPattern Indices.
  670. ;
  671. ; Register Usage
  672. ;
  673. ; edi -- Cursor over V line
  674. ; esi -- Cursor over storage to hold preprocessed UV.
  675. ; ebp -- Distance from V line to U line.
  676. ; edx -- UVDitherPattern index: ((V:{0:8}*9) + U:{0:8}) * 2 + 1
  677. ; bl -- U pel value
  678. ; cl -- V pel value
  679. ; eax -- Scratch
  680. mov edi,VCursor ; Fetch address of pel 0 of next line of V.
  681. mov ebp,DistanceFromVToU ; Fetch span from V plane to U plane.
  682. lea esi,ChromaContribution
  683. mov eax,ChromaLineLen
  684. mov edx,ChromaPitch
  685. add eax,edi
  686. mov EndOfChromaLine,eax
  687. add edx,edi
  688. mov bl,[edi] ; Fetch first V pel.
  689. ;
  690. and ebx,0FCH ; Reduce to 6 bits.
  691. mov cl,[edi+ebp*1] ; Fetch first U pel.
  692. and ecx,0FCH ; Reduce to 6 bits.
  693. mov VCursor,edx ; Stash for next time around.
  694. @@:
  695. mov edx,PD UVDitherLine01[ebx] ; Fetch dither pattern for V point.
  696. mov bl,[edi+1] ; Fetch next V pel.
  697. mov eax,PD UVDitherLine23[ecx] ; Fetch dither pattern for U point.
  698. mov cl,[edi+ebp*1+1] ; Fetch next U pel.
  699. lea edx,[edx+edx*2+00A0A0A0AH] ; Weight V dither pattern.
  700. and bl,0FCH ; Reduce to 6 bits.
  701. add eax,edx ; Combine dither patterns for U and V.
  702. and cl,0FCH ; Reduce to 6 bits.
  703. mov edx,PD UVDitherLine01[ebx] ; Fetch dither pattern for V point.
  704. mov [esi],eax ; Stash UV corresponding to Y00,Y01,Y10,Y11.
  705. mov eax,PD UVDitherLine23[ecx] ; Fetch dither pattern for U point.
  706. mov bl,[edi+2] ; Fetch next V pel.
  707. lea edx,[edx+edx*2+00A0A0A0AH] ; Weight V dither pattern.
  708. mov cl,[edi+ebp*1+2] ; Fetch next U pel.
  709. add eax,edx ; Combine dither patterns for U and V.
  710. mov edx,EndOfChromaLine ; Fetch EOL address.
  711. mov [esi+4],eax ; Stash UV corresponding to Y02,Y03,Y12,Y13.
  712. add edi,2 ; Advance U plane cursor.
  713. and bl,0FCH ; Reduce to 6 bits.
  714. and cl,0FCH ; Reduce to 6 bits.
  715. add esi,8
  716. sub edx,edi
  717. jne @b
  718. ; Now color convert a line of luma.
  719. ;
  720. ; Register Usage
  721. ; edi -- Cursor over line of color converted output frame, minus esi.
  722. ; esi -- Cursor over Y line.
  723. ; ebp -- Not used.
  724. ; edx,eax -- Build output pels.
  725. ; ecx,ebx -- Y pels.
  726. ; EAX EBX ECX EDX EBP
  727. mov [esi],edx ; Stash EOL indication.
  728. mov esi,YCursor ; Reload cursor over Y line.
  729. mov edi,CCOCursor ; Fetch output cursor.
  730. mov eax,CCOPitch ; Compute start of next line. XX XX XX XX -- -- -- -- -- -- -- -- -- -- -- --
  731. mov bl,[esi+1] ; Fetch Y01. XX XX XX XX m>-- -- -- y1 -- -- -- -- -- -- -- --
  732. add eax,edi ; >XX XX XX XX -- -- -- y1 -- -- -- -- -- -- -- --
  733. mov cl,[esi] ; Fetch Y00. XX XX XX XX -- -- -- y1 m>-- -- -- y0 -- -- -- --
  734. mov CCOCursor,eax ; Stash start of next line. s<XX XX XX XX -- -- -- y1 -- -- -- y0 -- -- -- --
  735. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y01 Y01 Y01 Y01>. XX XX XX XX <-- -- -- y1 -- -- -- y0 m>Y1 Y1 Y1 Y1
  736. sub edi,esi ; Get span from Y cursor to CCO cursor. XX XX XX XX -- -- -- y1 -- -- -- y0 Y1 Y1 Y1 Y1
  737. and edx,0FFFF0000H ; Extract < Y01 Y01 ___ ___>. XX XX XX XX -- -- -- y1 -- -- -- y0 >Y1 Y1 -- --
  738. sub edi,esi ; XX XX XX XX -- -- -- y1 -- -- -- y0 Y1 Y1 -- --
  739. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y00 Y00 Y00 Y00>. m>Y0 Y0 Y0 Y0 -- -- -- y1 <-- -- -- y0 Y1 Y1 -- --
  740. mov bl,[esi+3] ; Fetch Y03. Y0 Y0 Y0 Y0 m>-- -- -- y3 -- -- -- y0 Y1 Y1 -- --
  741. and eax,00000FFFFH ; Extract < ___ ___ Y00 Y00>. >-- -- Y0 Y0 -- -- -- y3 -- -- -- y0 Y1 Y1 -- --
  742. mov cl,[esi+2] ; Fetch Y02. -- -- Y0 Y0 -- -- -- y3 m>-- -- -- y2 Y1 Y1 -- --
  743. or eax,edx ; < Y01 Y01 Y00 Y00>. >Y1 Y1 Y0 Y0 -- -- -- y3 -- -- -- y2 <Y1 Y1 -- --
  744. mov edx,ChromaContribution ; Fetch <UV01 UV01 UV00 UV00>. Y1 Y1 Y0 Y0 -- -- -- y3 -- -- -- y2 m>C1 C1 C0 C0
  745. sub esp,1536
  746. Line0Loop:
  747. add eax,edx ; < P01 P01 P00 P00>. >P1 P1 P0 P0 -- -- -- y3 -- -- -- y2 <C1 C1 C0 C0
  748. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y03 Y03 Y03 Y03>. P1 P1 P0 P0 <-- -- -- y3 -- -- -- y2 m>Y3 Y3 Y3 Y3
  749. mov Ze [edi+esi*2],eax ; Store four pels to color conv output. m<P1 P1 P0 P0 -- -- -- y3 -- -- -- y2 Y3 Y3 Y3 Y3
  750. add esi,4 ; Advance cursor. P1 P1 P0 P0 -- -- -- y3 -- -- -- y2 Y3 Y3 Y3 Y3
  751. and edx,0FFFF0000H ; Extract < Y03 Y03 ___ ___>. P1 P1 P0 P0 -- -- -- y3 -- -- -- y2 >Y3 Y3 -- --
  752. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y02 Y02 Y02 Y02>. m>Y2 Y2 Y2 Y2 -- -- -- y3 <-- -- -- y2 Y3 Y3 -- --
  753. and eax,00000FFFFH ; Extract < ___ ___ Y02 Y02>. >-- -- Y2 Y2 -- -- -- y3 -- -- -- y2 Y3 Y3 -- --
  754. mov bl,[esi+1] ; Fetch next Y01. -- -- Y2 Y2 m>-- -- -- y5 -- -- -- y2 Y3 Y3 -- --
  755. or eax,edx ; < Y03 Y03 Y02 Y02>. >Y3 Y3 Y2 Y2 -- -- -- y5 -- -- -- y2 <Y3 Y3 -- --
  756. mov edx,ChromaContribution+1536+4 ; Fetch <UV03 UV03 UV02 UV02>. Y3 Y3 Y2 Y2 -- -- -- y5 -- -- -- y2 s>C3 C3 C2 C2
  757. add eax,edx ; < P03 P03 P02 P02>. >P3 P3 P2 P2 -- -- -- y5 -- -- -- y2 <C3 C3 C2 C2
  758. mov cl,[esi] ; Fetch next Y00. P3 P3 P2 P2 -- -- -- y5 m>-- -- -- y4 C3 C3 C2 C2
  759. mov Ze [edi+esi*2+4-8],eax ; Store four pels to color conv output. m<P3 P3 P2 P2 -- -- -- y5 -- -- -- y4 C3 C3 C2 C2
  760. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y01 Y01 Y01 Y01>. P3 P3 P2 P2 <-- -- -- y5 -- -- -- y4 m>Y5 Y5 Y5 Y5
  761. and edx,0FFFF0000H ; Extract < Y01 Y01 ___ ___>. P3 P3 P2 P2 -- -- -- y5 -- -- -- y4 >Y5 Y5 -- --
  762. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y00 Y00 Y00 Y00>. m>Y4 Y4 Y4 Y4 -- -- -- y5 <-- -- -- y4 Y5 Y5 -- --
  763. and eax,00000FFFFH ; Extract < ___ ___ Y00 Y00>. >-- -- Y4 Y4 -- -- -- y5 -- -- -- y4 Y5 Y5 -- --
  764. mov bl,[esi+3] ; Fetch Y03. -- -- Y4 Y4 m>-- -- -- y7 -- -- -- y4 Y5 Y5 -- --
  765. or eax,edx ; < Y01 Y01 Y00 Y00>. >Y5 Y5 Y4 Y4 -- -- -- y7 -- -- -- y4 Y5 Y5 -- --
  766. mov edx,ChromaContribution+1536+8 ; Fetch <UV01 UV01 UV00 UV00>. Y5 Y5 Y4 Y4 -- -- -- y7 -- -- -- y4 s>C5 C5 C4 C4
  767. add esp,8 ; Y5 Y5 Y4 Y4 -- -- -- y7 -- -- -- y4 C5 C5 C4 C4
  768. mov cl,[esi+2] ; Fetch Y02. Y5 Y5 Y4 Y4 -- -- -- y7 m>-- -- -- y6 C5 C5 C4 C4
  769. test edx,edx
  770. jne Line0Loop
  771. and esp,0FFFFF800H
  772. add esp,0800H
  773. ; Color convert same input line, dithering differently.
  774. mov edx,AspectCount
  775. mov edi,CCOCursor ; Fetch output cursor.
  776. sub edx,2
  777. mov eax,CCOPitch ; Compute start of next line.
  778. mov AspectCount,edx
  779. mov esi,YCursor ; Reload cursor over Y line.
  780. mov ebp,AspectAdjustmentCount
  781. jg KeepLine1
  782. add edx,ebp
  783. mov AspectCount,edx
  784. jmp SkipLine1
  785. KeepLine1:
  786. mov bl,[esi+1] ; Fetch Y01. XX XX XX XX m>-- -- -- y1 -- -- -- -- XX XX XX XX
  787. add eax,edi ; >XX XX XX XX -- -- -- y1 -- -- -- -- XX XX XX XX
  788. mov cl,[esi] ; Fetch Y00. XX XX XX XX -- -- -- y1 m>-- -- -- y0 XX XX XX XX
  789. mov CCOCursor,eax ; Stash start of next line. s<XX XX XX XX -- -- -- y1 -- -- -- y0 XX XX XX XX
  790. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y01 Y01 Y01 Y01>. XX XX XX XX <-- -- -- y1 -- -- -- y0 m>Y1 Y1 Y1 Y1
  791. sub edi,esi ; Get span from Y cursor to CCO cursor. XX XX XX XX -- -- -- y1 -- -- -- y0 Y1 Y1 Y1 Y1
  792. shl edx,16 ; Extract < Y01 Y01 ___ ___>. XX XX XX XX -- -- -- y1 -- -- -- y0 >Y1 Y1 -- --
  793. sub edi,esi ; XX XX XX XX -- -- -- y1 -- -- -- y0 Y1 Y1 -- --
  794. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y00 Y00 Y00 Y00>. m>Y0 Y0 Y0 Y0 -- -- -- y1 <-- -- -- y0 Y1 Y1 -- --
  795. mov bl,[esi+3] ; Fetch Y03. Y0 Y0 Y0 Y0 m>-- -- -- y3 -- -- -- y0 Y1 Y1 -- --
  796. shr eax,16 ; Extract < ___ ___ Y00 Y00>. >-- -- Y0 Y0 -- -- -- y3 -- -- -- y0 Y1 Y1 -- --
  797. mov cl,[esi+2] ; Fetch Y02. -- -- Y0 Y0 -- -- -- y3 m>-- -- -- y2 Y1 Y1 -- --
  798. or eax,edx ; < Y01 Y01 Y00 Y00>. >Y1 Y1 Y0 Y0 -- -- -- y3 -- -- -- y2 <Y1 Y1 -- --
  799. mov edx,ChromaContribution ; Fetch <UV01 UV01 UV00 UV00>. Y1 Y1 Y0 Y0 -- -- -- y3 -- -- -- y2 m>C1 C1 C0 C0
  800. rol edx,16 ; Swap dither pattern. Y1 Y1 Y0 Y0 -- -- -- y3 -- -- -- y2 >C0 C0 C1 C1
  801. sub esp,1536
  802. Line1Loop:
  803. add eax,edx ; < P01 P01 P00 P00>. >P1 P1 P0 P0 -- -- -- y3 -- -- -- y2 <C0 C0 C1 C1
  804. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y03 Y03 Y03 Y03>. P1 P1 P0 P0 <-- -- -- y3 -- -- -- y2 m>Y3 Y3 Y3 Y3
  805. mov Ze [edi+esi*2],eax ; Store four pels to color conv output. m<P1 P1 P0 P0 -- -- -- y3 -- -- -- y2 Y3 Y3 Y3 Y3
  806. add esi,4 ; Advance cursor. P1 P1 P0 P0 -- -- -- y3 -- -- -- y2 Y3 Y3 Y3 Y3
  807. shl edx,16 ; Extract < Y03 Y03 ___ ___>. P1 P1 P0 P0 -- -- -- y3 -- -- -- y2 >-- -- Y3 Y3
  808. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y02 Y02 Y02 Y02>. m>Y2 Y2 Y2 Y2 -- -- -- y3 <-- -- -- y2 -- -- Y3 Y3
  809. shr eax,16 ; Extract < ___ ___ Y02 Y02>. >Y2 Y2 -- -- -- -- -- y3 -- -- -- y2 -- -- Y3 Y3
  810. mov bl,[esi+1] ; Fetch next Y01. Y2 Y2 -- -- m>-- -- -- y5 -- -- -- y2 -- -- Y3 Y3
  811. or eax,edx ; < Y03 Y03 Y02 Y02>. >Y2 Y2 Y3 Y3 -- -- -- y5 -- -- -- y2 <-- -- Y3 Y3
  812. mov edx,ChromaContribution+1536+4 ; Fetch <UV03 UV03 UV02 UV02>. Y2 Y2 Y3 Y3 -- -- -- y5 -- -- -- y2 s>C3 C3 C2 C2
  813. rol edx,16 ; Swap dither pattern. Y2 Y2 Y3 Y3 -- -- -- y5 -- -- -- y2 s>C2 C2 C3 C3
  814. add esp,8 ; Y2 Y2 Y3 Y3 -- -- -- y5 -- -- -- y2 C2 C2 C3 C3
  815. add eax,edx ; < P03 P03 P02 P02>. >P2 P2 P3 P3 -- -- -- y5 -- -- -- y2 <C2 C2 C3 C3
  816. mov cl,[esi] ; Fetch next Y00. P2 P2 P3 P3 -- -- -- y5 m>-- -- -- y4 C2 C2 C3 C3
  817. mov Ze [edi+esi*2+4-8],eax ; Store four pels to color conv output. m<P2 P2 P3 P3 -- -- -- y5 -- -- -- y4 C2 C2 C3 C3
  818. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y01 Y01 Y01 Y01>. P2 P2 P3 P3 <-- -- -- y5 -- -- -- y4 m>Y5 Y5 Y5 Y5
  819. shl edx,16 ; Extract < Y01 Y01 ___ ___>. P2 P2 P3 P3 -- -- -- y5 -- -- -- y4 >-- -- Y5 Y5
  820. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y00 Y00 Y00 Y00>. m>Y4 Y4 Y4 Y4 -- -- -- y5 <-- -- -- y4 -- -- Y5 Y5
  821. shr eax,16 ; Extract < ___ ___ Y00 Y00>. >Y4 Y4 -- -- -- -- -- y5 -- -- -- y4 -- -- Y5 Y5
  822. mov bl,[esi+3] ; Fetch Y03. Y4 Y4 -- -- m>-- -- -- y7 -- -- -- y4 -- -- Y5 Y5
  823. or eax,edx ; < Y01 Y01 Y00 Y00>. >Y4 Y4 Y5 Y5 -- -- -- y7 -- -- -- y4 -- -- Y5 Y5
  824. mov edx,ChromaContribution+1536 ; Fetch <UV01 UV01 UV00 UV00>. Y4 Y4 Y5 Y5 -- -- -- y7 -- -- -- y4 s>C5 C5 C4 C4
  825. rol edx,16 ; Swap dither pattern. Y4 Y4 Y5 Y5 -- -- -- y7 -- -- -- y4 >C4 C4 C5 C5
  826. mov cl,[esi+2] ; Fetch Y02. Y4 Y4 Y5 Y5 -- -- -- y7 m>-- -- -- y6 C4 C4 C5 C5
  827. test edx,edx
  828. jne Line1Loop
  829. and esp,0FFFFF800H
  830. add esp,0800H
  831. SkipLine1:
  832. ; Now color convert the second input line of luma.
  833. mov esi,YCursor ; Reload cursor over Y line.
  834. mov ebp,LumaPitch
  835. mov edi,CCOCursor ; Fetch output cursor.
  836. mov eax,CCOPitch ; Compute start of next line. XX XX XX XX -- -- -- -- -- -- -- -- -- -- -- --
  837. mov bl,[esi+ebp*1] ; Fetch Y01. XX XX XX XX m>-- -- -- y1 -- -- -- -- -- -- -- --
  838. add eax,edi ; >XX XX XX XX -- -- -- y1 -- -- -- -- -- -- -- --
  839. mov cl,[esi+ebp*1+1] ; Fetch Y00. XX XX XX XX -- -- -- y1 m>-- -- -- y0 -- -- -- --
  840. mov CCOCursor,eax ; Stash start of next line. s<XX XX XX XX -- -- -- y1 -- -- -- y0 -- -- -- --
  841. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y01 Y01 Y01 Y01>. XX XX XX XX <-- -- -- y1 -- -- -- y0 m>Y1 Y1 Y1 Y1
  842. sub edi,esi ; Get span from Y cursor to CCO cursor. XX XX XX XX -- -- -- y1 -- -- -- y0 Y1 Y1 Y1 Y1
  843. shl edx,16 ; Extract < Y01 Y01 ___ ___>. XX XX XX XX -- -- -- y1 -- -- -- y0 >Y1 Y1 -- --
  844. sub edi,esi ; XX XX XX XX -- -- -- y1 -- -- -- y0 Y1 Y1 -- --
  845. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y00 Y00 Y00 Y00>. m>Y0 Y0 Y0 Y0 -- -- -- y1 <-- -- -- y0 Y1 Y1 -- --
  846. mov bl,[esi+ebp*1+2] ; Fetch Y03. Y0 Y0 Y0 Y0 m>-- -- -- y3 -- -- -- y0 Y1 Y1 -- --
  847. shr eax,16 ; Extract < ___ ___ Y00 Y00>. >-- -- Y0 Y0 -- -- -- y3 -- -- -- y0 Y1 Y1 -- --
  848. mov cl,[esi+ebp*1+3] ; Fetch Y02. -- -- Y0 Y0 -- -- -- y3 m>-- -- -- y2 Y1 Y1 -- --
  849. or eax,edx ; < Y01 Y01 Y00 Y00>. >Y1 Y1 Y0 Y0 -- -- -- y3 -- -- -- y2 <Y1 Y1 -- --
  850. mov edx,ChromaContribution ; Fetch <UV01 UV01 UV00 UV00>. Y1 Y1 Y0 Y0 -- -- -- y3 -- -- -- y2 m>C1 C1 C0 C0
  851. rol edx,16 ; Swap dither pattern. Y1 Y1 Y0 Y0 -- -- -- y3 -- -- -- y2 >C0 C0 C1 C1
  852. sub esp,1536
  853. Line2Loop:
  854. add eax,edx ; < P01 P01 P00 P00>. >P1 P1 P0 P0 -- -- -- y3 -- -- -- y2 <C0 C0 C1 C1
  855. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y03 Y03 Y03 Y03>. P1 P1 P0 P0 <-- -- -- y3 -- -- -- y2 m>Y3 Y3 Y3 Y3
  856. bswap eax ; >P0 P0 P1 P1 -- -- -- y3 -- -- -- y2 Y3 Y3 Y3 Y3
  857. mov Ze [edi+esi*2],eax ; Store four pels to color conv output. m<P0 P0 P1 P1 -- -- -- y3 -- -- -- y2 Y3 Y3 Y3 Y3
  858. add esi,4 ; P0 P0 P1 P1 -- -- -- y3 -- -- -- y2 Y3 Y3 Y3 Y3
  859. shl edx,16 ; Extract < Y03 Y03 ___ ___>. P0 P0 P1 P1 -- -- -- y3 -- -- -- y2 >Y3 Y3 -- --
  860. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y02 Y02 Y02 Y02>. m>Y2 Y2 Y2 Y2 -- -- -- y3 <-- -- -- y2 Y3 Y3 -- --
  861. shr eax,16 ; Extract < ___ ___ Y02 Y02>. >-- -- Y2 Y2 -- -- -- y3 -- -- -- y2 Y3 Y3 -- --
  862. mov bl,[esi+ebp*1] ; Fetch next Y01. -- -- Y2 Y2 m>-- -- -- y5 -- -- -- y2 Y3 Y3 -- --
  863. or eax,edx ; < Y03 Y03 Y02 Y02>. >Y3 Y3 Y2 Y2 -- -- -- y5 -- -- -- y2 <Y3 Y3 -- --
  864. mov edx,ChromaContribution+1536+4 ; Fetch <UV03 UV03 UV02 UV02>. Y3 Y3 Y2 Y2 -- -- -- y5 -- -- -- y2 s>C3 C3 C2 C2
  865. rol edx,16 ; Swap dither pattern. Y3 Y3 Y2 Y2 -- -- -- y5 -- -- -- y2 s>C2 C2 C3 C3
  866. add esp,8 ; Swap dither pattern. Y3 Y3 Y2 Y2 -- -- -- y5 -- -- -- y2 C2 C2 C3 C3
  867. add eax,edx ; < P03 P03 P02 P02>. >P3 P3 P2 P2 -- -- -- y5 -- -- -- y2 <C2 C2 C3 C3
  868. mov cl,[esi+ebp*1+1] ; Fetch next Y00. P3 P3 P2 P2 -- -- -- y5 m>-- -- -- y4 C2 C2 C3 C3
  869. bswap eax ; >P2 P2 P3 P3 -- -- -- y5 -- -- -- y4 C2 C2 C3 C3
  870. mov Ze [edi+esi*2+4-8],eax ; Store four pels to color conv output. m<P2 P2 P3 P3 -- -- -- y5 -- -- -- y4 C2 C2 C3 C3
  871. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y01 Y01 Y01 Y01>. P2 P2 P3 P3 <-- -- -- y5 -- -- -- y4 m>Y5 Y5 Y5 Y5
  872. shl edx,16 ; Extract < Y01 Y01 ___ ___>. P2 P2 P3 P3 -- -- -- y5 -- -- -- y4 >Y5 Y5 -- --
  873. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y00 Y00 Y00 Y00>. m>Y4 Y4 Y4 Y4 -- -- -- y5 <-- -- -- y4 Y5 Y5 -- --
  874. shr eax,16 ; Extract < ___ ___ Y00 Y00>. >-- -- Y4 Y4 -- -- -- y5 -- -- -- y4 Y5 Y5 -- --
  875. mov bl,[esi+ebp*1+2] ; Fetch Y03. -- -- Y4 Y4 m>-- -- -- y7 -- -- -- y4 Y5 Y5 -- --
  876. or eax,edx ; < Y01 Y01 Y00 Y00>. >Y5 Y5 Y4 Y4 -- -- -- y7 -- -- -- y4 Y5 Y5 -- --
  877. mov edx,ChromaContribution+1536 ; Fetch <UV01 UV01 UV00 UV00>. Y5 Y5 Y4 Y4 -- -- -- y7 -- -- -- y4 s>C5 C5 C4 C4
  878. rol edx,16 ; Swap dither pattern. Y5 Y5 Y4 Y4 -- -- -- y7 -- -- -- y4 >C4 C4 C5 C5
  879. mov cl,[esi+ebp*1+3] ; Fetch Y02. Y5 Y5 Y4 Y4 -- -- -- y7 m>-- -- -- y6 C4 C4 C5 C5
  880. test edx,edx
  881. jne Line2Loop
  882. and esp,0FFFFF800H
  883. add esp,0800H
  884. ; Color convert same input line, dithering differently.
  885. mov esi,YCursor
  886. mov edx,AspectCount
  887. mov edi,CCOCursor ; Fetch output cursor.
  888. sub edx,2
  889. lea eax,[esi+ebp*2] ; Compute start of next line.
  890. mov AspectCount,edx
  891. mov YCursor,eax
  892. jg KeepLine3
  893. add edx,AspectAdjustmentCount
  894. mov AspectCount,edx
  895. jmp SkipLine3
  896. KeepLine3:
  897. mov bl,[esi+ebp*1] ; Fetch Y00. XX XX XX XX m>-- -- -- y0 -- -- -- -- -- -- -- --
  898. mov eax,CCOPitch ; Compute start of next line. XX XX XX XX -- -- -- y0 -- -- -- -- -- -- -- --
  899. add eax,edi ; >XX XX XX XX -- -- -- y0 -- -- -- -- -- -- -- --
  900. mov cl,[esi+ebp*1+1] ; Fetch Y01. XX XX XX XX -- -- -- y0 m>-- -- -- y1 -- -- -- --
  901. mov CCOCursor,eax ; Stash start of next line. s<XX XX XX XX -- -- -- y0 -- -- -- y1 -- -- -- --
  902. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y00 Y00 Y00 Y00>. XX XX XX XX <-- -- -- y0 -- -- -- y1 m>Y0 Y0 Y0 Y0
  903. sub edi,esi ; Get span from Y cursor to CCO cursor. XX XX XX XX -- -- -- y0 -- -- -- y1 Y0 Y0 Y0 Y0
  904. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y01 Y01 Y01 Y01>. m>Y1 Y1 Y1 Y1 -- -- -- y0 <-- -- -- y1 Y0 Y0 Y0 Y0
  905. and edx,0FFFF0000H ; Extract < ___ ___ Y00 Y00>. Y1 Y1 Y1 Y1 -- -- -- y0 -- -- -- y1 >Y0 Y0 -- --
  906. sub edi,esi ; Y1 Y1 Y1 Y1 -- -- -- y0 -- -- -- y1 Y0 Y0 -- --
  907. mov bl,[esi+ebp*1+2] ; Fetch Y02. Y1 Y1 Y1 Y1 m>-- -- -- y2 -- -- -- y1 Y0 Y0 -- --
  908. and eax,00000FFFFH ; Extract < ___ ___ Y01 Y01>. >-- -- Y1 Y1 -- -- -- y2 -- -- -- y1 Y0 Y0 -- --
  909. mov cl,[esi+ebp*1+3] ; Fetch Y03. -- -- Y1 Y1 -- -- -- y2 m>-- -- -- y3 Y0 Y0 -- --
  910. or eax,edx ; < Y01 Y01 Y00 Y00>. >Y0 Y0 Y1 Y1 -- -- -- y2 -- -- -- y3 <Y0 Y0 -- --
  911. mov edx,ChromaContribution ; Fetch <UV01 UV01 UV00 UV00>. Y0 Y0 Y1 Y1 -- -- -- y2 -- -- -- y3 m>C1 C1 C0 C0
  912. sub esp,1536
  913. Line3Loop:
  914. add eax,edx ; < P01 P01 P00 P00>. >P0 P0 P1 P1 -- -- -- y2 -- -- -- y3 <C1 C1 C0 C0
  915. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y03 Y03 Y03 Y03>. P0 P0 P1 P1 <-- -- -- y2 -- -- -- y3 m>Y2 Y2 Y2 Y2
  916. bswap eax ; >P1 P1 P0 P0 -- -- -- y2 -- -- -- y3 Y2 Y2 Y2 Y2
  917. mov Ze [edi+esi*2],eax ; Store four pels to color conv output. m<P1 P1 P0 P0 -- -- -- y2 -- -- -- y3 Y2 Y2 Y2 Y2
  918. add esi,4 ; P1 P1 P0 P0 -- -- -- y2 -- -- -- y3 Y2 Y2 Y2 Y2
  919. and edx,0FFFF0000H ; Extract < Y03 Y03 ___ ___>. P1 P1 P0 P0 -- -- -- y2 -- -- -- y3 >Y2 Y2 -- --
  920. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y02 Y02 Y02 Y02>. m>Y3 Y3 Y3 Y3 -- -- -- y2 <-- -- -- y3 Y2 Y2 -- --
  921. and eax,00000FFFFH ; Extract < ___ ___ Y02 Y02>. >-- -- Y3 Y3 -- -- -- y2 -- -- -- y3 Y2 Y2 -- --
  922. mov bl,[esi+ebp*1] ; Fetch next Y01. -- -- Y3 Y3 m>-- -- -- y4 -- -- -- y3 Y2 Y2 -- --
  923. or eax,edx ; < Y03 Y03 Y02 Y02>. >Y2 Y2 Y3 Y3 -- -- -- y4 -- -- -- y3 <Y2 Y2 -- --
  924. mov edx,ChromaContribution+1536+4 ; Fetch <UV03 UV03 UV02 UV02>. Y2 Y2 Y3 Y3 -- -- -- y4 -- -- -- y3 s>C3 C3 C2 C2
  925. add eax,edx ; < P03 P03 P02 P02>. >P2 P2 P3 P3 -- -- -- y4 -- -- -- y3 <C2 C2 C3 C3
  926. mov cl,[esi+ebp*1+1] ; Fetch next Y00. P2 P2 P3 P3 -- -- -- y4 m>-- -- -- y5 C2 C2 C3 C3
  927. bswap eax ; >P3 P3 P2 P2 -- -- -- y4 -- -- -- y5 C2 C2 C3 C3
  928. mov Ze [edi+esi*2+4-8],eax ; Store four pels to color conv output. m<P3 P3 P2 P2 -- -- -- y4 -- -- -- y5 C2 C2 C3 C3
  929. mov edx,PD YDitherZ2[ebx*4] ; Fetch < Y01 Y01 Y01 Y01>. P3 P3 P2 P2 <-- -- -- y4 -- -- -- y5 m>Y4 Y4 Y4 Y4
  930. and edx,0FFFF0000H ; Extract < Y01 Y01 ___ ___>. P3 P3 P2 P2 -- -- -- y4 -- -- -- y5 >Y4 Y4 -- --
  931. mov eax,PD YDitherZ2[ecx*4] ; Fetch < Y00 Y00 Y00 Y00>. m>Y5 Y5 Y5 Y5 -- -- -- y4 <-- -- -- y5 Y4 Y4 -- --
  932. and eax,00000FFFFH ; Extract < ___ ___ Y00 Y00>. >-- -- Y5 Y5 -- -- -- y4 -- -- -- y5 Y4 Y4 -- --
  933. mov bl,[esi+ebp*1+2] ; Fetch Y03. -- -- Y5 Y5 m>-- -- -- y6 -- -- -- y5 Y4 Y4 -- --
  934. or eax,edx ; < Y01 Y01 Y00 Y00>. >Y4 Y4 Y5 Y5 -- -- -- y6 -- -- -- y5 Y4 Y4 -- --
  935. mov edx,ChromaContribution+1536+8 ; Fetch <UV01 UV01 UV00 UV00>. Y4 Y4 Y5 Y5 -- -- -- y6 -- -- -- y5 s>C5 C5 C4 C4
  936. add esp,8 ; Fetch <UV01 UV01 UV00 UV00>. Y4 Y4 Y5 Y5 -- -- -- y6 -- -- -- y5 C5 C5 C4 C4
  937. mov cl,[esi+ebp*1+3] ; Fetch Y02. Y4 Y4 Y5 Y5 -- -- -- y6 m>-- -- -- y7 C5 C5 C4 C4
  938. test edx,edx
  939. jne Line3Loop
  940. and esp,0FFFFF800H
  941. add esp,0800H
  942. SkipLine3:
  943. mov esi,YCursor
  944. mov eax,YLimit
  945. cmp eax,esi
  946. jne NextTwoLines
  947. mov esp,StashESP
  948. pop ebx
  949. pop ebp
  950. pop edi
  951. pop esi
  952. rturn
  953. YUV12ToCLUT8ZoomBy2 endp
  954. ENDIF
  955. END