KJpegColor.c
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:16k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KJpegColor.cpp
  5. // Date: 2000.08.08
  6. // Code: Daniel Wang
  7. // Desc: Jpeg 解码 Color 的转换
  8. // From: Cloud Wu's JPEG Decoder
  9. //---------------------------------------------------------------------------
  10. #include <windows.h>
  11. #include "KJpegLib.h"
  12. //---------------------------------------------------------------------------
  13. static WORD jpeg_Y[64];
  14. static char Cr1_402[256];
  15. static char Cb0_34414[256];
  16. static char Cr0_71414[256];
  17. static char Cb1_772[256];
  18. //---------------------------------------------------------------------------
  19. static __int64 x8080808080808080 = 0x8080808080808080;
  20. static __int64 x7f7f7f7f7f7f7f7f = 0x7f7f7f7f7f7f7f7f;
  21. static __int64 x03e003e003e003e0 = 0x03e003e003e003e0;
  22. static __int64 mmx_mask_red;
  23. static __int64 mmx_mask_green;
  24. //---------------------------------------------------------------------------
  25. static void Y2RGB(WORD *bmppixel, int pitch);
  26. static void YCbCr111(WORD *bmppixel,int pitch);
  27. static void YCbCr411_565(WORD *bmppixel, int pitch);
  28. static void YCbCr411_555(WORD *bmppixel, int pitch);
  29. static void YCbCr411_nommx(WORD *bmppixel, int pitch);
  30. //---------------------------------------------------------------------------
  31. static WORD (* RGB16)(signed char Y,signed char r,signed char g,signed char b);
  32. static WORD RGB16_555(signed char Y,signed char r,signed char g,signed char b);
  33. static WORD RGB16_565(signed char Y,signed char r,signed char g,signed char b);
  34. //---------------------------------------------------------------------------
  35. // 函数: jpeg_decode_init
  36. // 功能: Init Jpeg Decoder
  37. // 参数: void
  38. // 返回: BOOL
  39. //---------------------------------------------------------------------------
  40. BOOL jpeg_decode_init(BOOL bRGB555, BOOL bMMXCPU)
  41. {
  42. int i;
  43. jpeg_Y2RGB = Y2RGB;
  44. jpeg_YCbCr111 = YCbCr111;
  45. if (bRGB555)
  46. {
  47. RGB16 = RGB16_555;
  48. mmx_mask_red = 0xfc00fc00fc00fc00;
  49. mmx_mask_green = 0x03e003e003e003e0;
  50. for (i = 0; i < 32; i++)
  51. jpeg_Y[i * 2] = jpeg_Y[i * 2 + 1] = i<<10 | i<<5 | i;
  52. }
  53. else
  54. {
  55. RGB16 = RGB16_565;
  56. mmx_mask_red = 0xf800f800f800f800;
  57. mmx_mask_green = 0x07e007e007e007e0;
  58. for (i = 0; i < 64; i++)
  59. jpeg_Y[i] = (i>>1)<<11 | i<<5 | (i>>1);
  60. }
  61. if (bMMXCPU)
  62. {
  63. jpeg_IDCT = jpeg_idct_mmx;
  64. if (bRGB555)
  65. jpeg_YCbCr411 = YCbCr411_555;
  66. else
  67. jpeg_YCbCr411 = YCbCr411_565;
  68. }
  69. else
  70. {
  71. jpeg_IDCT = jpeg_idct_2d;
  72. jpeg_YCbCr411 = YCbCr411_nommx;
  73. }
  74. for (i = 0; i < 256; i++)
  75. {
  76. Cr1_402[i]   = (int)(1.402    * (char)i + 1) >> 1;
  77. Cb0_34414[i] = (int)(-0.34414 * (char)i + 1) >> 1;
  78. Cr0_71414[i] = (int)(-0.71414 * (char)i + 1) >> 1;
  79. Cb1_772[i]   = (int)(1.772    * (char)i + 1) >> 1;
  80. }
  81. return TRUE;
  82. }
  83. //---------------------------------------------------------------------------
  84. // 函数: Y2RGB
  85. // 功能: 亮度值转化为16位RGB值
  86. // 参数: bmppixel
  87. // pitch
  88. // 返回: void
  89. //---------------------------------------------------------------------------
  90. void Y2RGB(WORD *bmppixel, int pitch)
  91. {
  92. __asm
  93. {
  94. xor eax,eax;
  95. mov ebx,pitch;
  96. lea esi,jpeg_ybuf;
  97. sub ebx,16;
  98. mov edx,8;
  99. mov edi,bmppixel;
  100. mov ecx,edx;
  101. ALIGN 4
  102. _loop:
  103. lodsb;
  104. add al,0x80;
  105. movzx eax,al;
  106. shr eax,2;
  107. mov ax,[jpeg_Y+eax*2];
  108. stosw;
  109. dec ecx;
  110. jnz _loop;
  111. mov ecx,8;
  112. add edi,ebx;
  113. dec edx;
  114. jnz _loop;
  115. }
  116. }
  117. //---------------------------------------------------------------------------
  118. // 函数: YCbCr411_565
  119. // 功能: YCbCr411格式转化位RGB(565)格式
  120. // 参数: bmppixel
  121. // pitch
  122. // 返回: void
  123. //---------------------------------------------------------------------------
  124. /*********************************************
  125. R = Y + 1.402  *(Cr-128)
  126. G = Y - 0.34414*(Cb-128) - 0.71414*(Cr-128)
  127. B = Y + 1.772  *(Cb-128)
  128. **********************************************/
  129. void YCbCr411_565(WORD *bmppixel,int pitch)
  130. {
  131. signed char *CrBuf,*CbBuf,*YBuf;
  132. int n = 4;
  133. __asm
  134. {
  135. mov edi,bmppixel;
  136. mov edx,pitch;
  137. cld;
  138. lea eax,jpeg_crbuf;
  139. lea ebx,jpeg_cbbuf;
  140. lea ecx,jpeg_ybuf;
  141. mov CrBuf,eax;
  142. mov CbBuf,ebx;
  143. mov YBuf,ecx;
  144. _loop1:
  145. call _YCbCr8x2;
  146. add edi,16;
  147. mov eax,CrBuf;
  148. mov ebx,CbBuf;
  149. mov ecx,YBuf;
  150. add eax,4;
  151. add ebx,4;
  152. add ecx,128;
  153. mov CrBuf,eax;
  154. mov CbBuf,ebx;
  155. mov YBuf,ecx;
  156. call _YCbCr8x2;
  157. lea edi,[edi+2*edx-16];
  158. mov eax,CrBuf;
  159. mov ebx,CbBuf;
  160. mov ecx,YBuf;
  161. add eax,4;
  162. add ebx,4;
  163. add ecx,16-128;
  164. mov CrBuf,eax;
  165. mov CbBuf,ebx;
  166. mov YBuf,ecx;
  167. dec n;
  168. jnz _loop1;
  169. mov eax,YBuf;
  170. mov ebx,4;
  171. add eax,128+64;
  172. mov n,ebx;
  173. mov YBuf,eax;
  174. _loop2:
  175. call _YCbCr8x2;
  176. add edi,16;
  177. mov eax,CrBuf;
  178. mov ebx,CbBuf;
  179. mov ecx,YBuf;
  180. add eax,4;
  181. add ebx,4;
  182. add ecx,128;
  183. mov CrBuf,eax;
  184. mov CbBuf,ebx;
  185. mov YBuf,ecx;
  186. call _YCbCr8x2;
  187. lea edi,[edi+2*edx-16];
  188. mov eax,CrBuf;
  189. mov ebx,CbBuf;
  190. mov ecx,YBuf;
  191. add eax,4;
  192. add ebx,4;
  193. add ecx,16-128;
  194. mov CrBuf,eax;
  195. mov CbBuf,ebx;
  196. mov YBuf,ecx;
  197. dec n;
  198. jnz _loop2;
  199. jmp _end;
  200. _YCbCr8x2:
  201. mov esi,CrBuf;
  202. lea ebx,Cr1_402;
  203. mov eax,[esi];
  204. mov ecx,4;
  205. ALIGN 4
  206. _loop_cr_0:
  207. xlat;
  208. ror eax,8;
  209. dec ecx;
  210. jnz _loop_cr_0;
  211. movd mm5,eax;
  212. // eax 里是 4 个 Cr*1.402
  213. lea ebx,Cr0_71414;
  214. punpcklbw mm5,mm5;
  215. mov eax,[esi];
  216. mov ecx,4;
  217. ALIGN 4
  218. _loop_cr_1:
  219. xlat;
  220. ror eax,8;
  221. dec ecx;
  222. jnz _loop_cr_1;
  223. movd mm7,eax;
  224. // eax 里是 4 个 Cr* (- 0.71414)
  225. mov esi,CbBuf;
  226. punpcklbw mm7,mm7;
  227. lea ebx,Cb0_34414;
  228. mov eax,[esi];
  229. mov ecx,4;
  230. ALIGN 4
  231. _loop_cb_0:
  232. xlat;
  233. ror eax,8;
  234. dec ecx;
  235. jnz _loop_cb_0;
  236. movd mm6,eax;
  237. // eax 里是 4 个 Cb* (- 0.34414)
  238. lea ebx,Cb1_772;
  239. punpcklbw mm6,mm6;
  240. mov eax,[esi];
  241. paddsb mm6,mm7;
  242. // mm6 里是 8 个 - 0.34414* Cb - 0.71414*Cr
  243. mov ecx,4;
  244. ALIGN 4
  245. _loop_cb_1:
  246. xlat;
  247. ror eax,8;
  248. dec ecx;
  249. jnz _loop_cb_1;
  250. movd mm7,eax;
  251. // eax 里是 4 个 Cb* 1.772
  252. mov esi,YBuf;
  253. punpcklbw mm7,mm7;
  254. movq mm0,[esi];
  255. pxor mm3,mm3;
  256. paddb mm0,x8080808080808080; // Y + 128
  257. movq mm1,mm6;
  258. psrlq mm0,1;
  259. movq mm2,mm7;
  260. pand mm0,x7f7f7f7f7f7f7f7f;  // mmx 不支持 byte 移位
  261. pxor mm4,mm4;
  262. paddsb mm1,mm0; // G
  263. paddsb mm2,mm0; // B
  264. paddsb mm0,mm5; // R
  265. // 将所有的负数都设置为 0
  266. pcmpgtb mm4,mm1;
  267. pcmpgtb mm3,mm2;
  268. psubusb mm1,mm4;
  269. pxor mm4,mm4;
  270. psubusb mm2,mm3;
  271. pcmpgtb mm4,mm0;
  272. pxor mm3,mm3;
  273. psubusb mm0,mm4;
  274. // 下面 555
  275. punpckhbw mm3,mm2;
  276. punpckhbw mm4,mm1;
  277. psrlw mm3,10; // B 入 mm3
  278. psrlw mm4,4; // G 入 mm4
  279. punpcklbw mm2,mm2; // B 的前 4 个
  280. pand mm4,mmx_mask_green;
  281. punpcklbw mm1,mm1; // G 的前 4 个
  282. por mm3,mm4;
  283. punpckhbw mm4,mm0;
  284. psllw mm4,1;
  285. pand mm4,mmx_mask_red;
  286. punpcklbw mm0,mm0; // R 的前 4 个
  287. por mm3,mm4; // 合成 hRGB
  288. psllw mm0,1;
  289. pand mm0,mmx_mask_red;
  290. psrlw mm1,4;
  291. psrlw mm2,10;
  292. pand mm1,mmx_mask_green;
  293. por mm0,mm2;
  294. por mm0,mm1; // 合成 lRGB
  295. movq [edi+8],mm3;
  296. movq [edi],mm0;
  297. // ------------- 下 8 个 ------------
  298. movq mm0,[esi+8];
  299. pxor mm3,mm3;
  300. paddb mm0,x8080808080808080; // Y + 128
  301. movq mm1,mm6;
  302. psrlq mm0,1;
  303. movq mm2,mm7;
  304. pand mm0,x7f7f7f7f7f7f7f7f;  // mmx 不支持 byte 移位
  305. pxor mm4,mm4;
  306. paddsb mm1,mm0; // G
  307. paddsb mm2,mm0; // B
  308. paddsb mm0,mm5; // R
  309. // 将所有的负数都设置为 0
  310. pcmpgtb mm4,mm1;
  311. pcmpgtb mm3,mm2;
  312. psubusb mm1,mm4;
  313. pxor mm4,mm4;
  314. psubusb mm2,mm3;
  315. pcmpgtb mm4,mm0;
  316. pxor mm3,mm3;
  317. psubusb mm0,mm4;
  318. // 下面 555
  319. punpckhbw mm3,mm2;
  320. punpckhbw mm4,mm1;
  321. psrlw mm3,10; // B 入 mm3
  322. psrlw mm4,4; // G 入 mm4
  323. punpcklbw mm2,mm2; // B 的前 4 个
  324. pand mm4,mmx_mask_green;
  325. punpcklbw mm1,mm1; // G 的前 4 个
  326. por mm3,mm4;
  327. punpckhbw mm4,mm0;
  328. psllw mm4,1;
  329. pand mm4,mmx_mask_red;
  330. punpcklbw mm0,mm0; // R 的前 4 个
  331. por mm3,mm4; // 合成 hRGB
  332. psllw mm0,1;
  333. pand mm0,mmx_mask_red;
  334. psrlw mm1,4;
  335. psrlw mm2,10;
  336. pand mm1,mmx_mask_green;
  337. por mm0,mm2;
  338. por mm0,mm1; // 合成 lRGB
  339. movq [edi+edx+8],mm3;
  340. movq [edi+edx],mm0;
  341. ret;
  342. _end:
  343. emms;
  344. }
  345. }
  346. //---------------------------------------------------------------------------
  347. // 函数: YCbCr411_555
  348. // 功能: YCbCr411格式转化位RGB(555)格式
  349. // 参数: bmppixel
  350. // pitch
  351. // 返回: void
  352. //---------------------------------------------------------------------------
  353. void YCbCr411_555(WORD *bmppixel,int pitch)
  354. {
  355. signed char *CrBuf,*CbBuf,*YBuf;
  356. int n=4;
  357. __asm
  358. {
  359. mov edi,bmppixel;
  360. mov edx,pitch;
  361. cld;
  362. lea eax,jpeg_crbuf;
  363. lea ebx,jpeg_cbbuf;
  364. lea ecx,jpeg_ybuf;
  365. mov CrBuf,eax;
  366. mov CbBuf,ebx;
  367. mov YBuf,ecx;
  368. _loop1:
  369. call _YCbCr8x2;
  370. add edi,16;
  371. mov eax,CrBuf;
  372. mov ebx,CbBuf;
  373. mov ecx,YBuf;
  374. add eax,4;
  375. add ebx,4;
  376. add ecx,128;
  377. mov CrBuf,eax;
  378. mov CbBuf,ebx;
  379. mov YBuf,ecx;
  380. call _YCbCr8x2;
  381. lea edi,[edi+2*edx-16];
  382. mov eax,CrBuf;
  383. mov ebx,CbBuf;
  384. mov ecx,YBuf;
  385. add eax,4;
  386. add ebx,4;
  387. add ecx,16-128;
  388. mov CrBuf,eax;
  389. mov CbBuf,ebx;
  390. mov YBuf,ecx;
  391. dec n;
  392. jnz _loop1;
  393. mov eax,YBuf;
  394. mov ebx,4;
  395. add eax,128+64;
  396. mov n,ebx;
  397. mov YBuf,eax;
  398. _loop2:
  399. call _YCbCr8x2;
  400. add edi,16;
  401. mov eax,CrBuf;
  402. mov ebx,CbBuf;
  403. mov ecx,YBuf;
  404. add eax,4;
  405. add ebx,4;
  406. add ecx,128;
  407. mov CrBuf,eax;
  408. mov CbBuf,ebx;
  409. mov YBuf,ecx;
  410. call _YCbCr8x2;
  411. lea edi,[edi+2*edx-16];
  412. mov eax,CrBuf;
  413. mov ebx,CbBuf;
  414. mov ecx,YBuf;
  415. add eax,4;
  416. add ebx,4;
  417. add ecx,16-128;
  418. mov CrBuf,eax;
  419. mov CbBuf,ebx;
  420. mov YBuf,ecx;
  421. dec n;
  422. jnz _loop2;
  423. jmp _end;
  424. _YCbCr8x2:
  425. mov esi,CrBuf;
  426. lea ebx,Cr1_402;
  427. mov eax,[esi];
  428. mov ecx,4;
  429. ALIGN 4
  430. _loop_cr_0:
  431. xlat;
  432. ror eax,8;
  433. dec ecx;
  434. jnz _loop_cr_0;
  435. movd mm5,eax;
  436. // eax 里是 4 个 Cr*1.402
  437. lea ebx,Cr0_71414;
  438. punpcklbw mm5,mm5;
  439. mov eax,[esi];
  440. mov ecx,4;
  441. ALIGN 4
  442. _loop_cr_1:
  443. xlat;
  444. ror eax,8;
  445. dec ecx;
  446. jnz _loop_cr_1;
  447. movd mm7,eax;
  448. // eax 里是 4 个 Cr* (- 0.71414)
  449. mov esi,CbBuf;
  450. punpcklbw mm7,mm7;
  451. lea ebx,Cb0_34414;
  452. mov eax,[esi];
  453. mov ecx,4;
  454. ALIGN 4
  455. _loop_cb_0:
  456. xlat;
  457. ror eax,8;
  458. dec ecx;
  459. jnz _loop_cb_0;
  460. movd mm6,eax;
  461. // eax 里是 4 个 Cb* (- 0.34414)
  462. lea ebx,Cb1_772;
  463. punpcklbw mm6,mm6;
  464. mov eax,[esi];
  465. paddsb mm6,mm7;
  466. // mm6 里是 8 个 - 0.34414* Cb - 0.71414*Cr
  467. mov ecx,4;
  468. ALIGN 4
  469. _loop_cb_1:
  470. xlat;
  471. ror eax,8;
  472. dec ecx;
  473. jnz _loop_cb_1;
  474. movd mm7,eax;
  475. // eax 里是 4 个 Cb* 1.772
  476. mov esi,YBuf;
  477. punpcklbw mm7,mm7;
  478. movq mm0,[esi];
  479. pxor mm3,mm3;
  480. paddb mm0,x8080808080808080; // Y + 128
  481. movq mm1,mm6;
  482. psrlq mm0,1;
  483. movq mm2,mm7;
  484. pand mm0,x7f7f7f7f7f7f7f7f;  // mmx 不支持 byte 移位
  485. pxor mm4,mm4;
  486. paddsb mm1,mm0; // G
  487. paddsb mm2,mm0; // B
  488. paddsb mm0,mm5; // R
  489. // 将所有的负数都设置为 0
  490. pcmpgtb mm4,mm1;
  491. pcmpgtb mm3,mm2;
  492. psubusb mm1,mm4;
  493. pxor mm4,mm4;
  494. psubusb mm2,mm3;
  495. pcmpgtb mm4,mm0;
  496. pxor mm3,mm3;
  497. psubusb mm0,mm4;
  498. // 下面 555
  499. punpckhbw mm3,mm2;
  500. punpckhbw mm4,mm1;
  501. psrlw mm3,10; // B 入 mm3
  502. psrlw mm4,5; // G 入 mm4
  503. punpcklbw mm2,mm2; // B 的前 4 个
  504. pand mm4,mmx_mask_green;
  505. punpcklbw mm1,mm1; // G 的前 4 个
  506. por mm3,mm4;
  507. punpckhbw mm4,mm0;
  508. pand mm4,mmx_mask_red;
  509. punpcklbw mm0,mm0; // R 的前 4 个
  510. por mm3,mm4; // 合成 hRGB
  511. pand mm0,mmx_mask_red;
  512. psrlw mm1,5;
  513. psrlw mm2,10;
  514. pand mm1,mmx_mask_green;
  515. por mm0,mm2;
  516. por mm0,mm1; // 合成 lRGB
  517. movq [edi+8],mm3;
  518. movq [edi],mm0;
  519. // ------------- 下 8 个 ------------
  520. movq mm0,[esi+8];
  521. pxor mm3,mm3;
  522. paddb mm0,x8080808080808080; // Y + 128
  523. movq mm1,mm6;
  524. psrlq mm0,1;
  525. movq mm2,mm7;
  526. pand mm0,x7f7f7f7f7f7f7f7f;  // mmx 不支持 byte 移位
  527. pxor mm4,mm4;
  528. paddsb mm1,mm0; // G
  529. paddsb mm2,mm0; // B
  530. paddsb mm0,mm5; // R
  531. // 将所有的负数都设置为 0
  532. pcmpgtb mm4,mm1;
  533. pcmpgtb mm3,mm2;
  534. psubusb mm1,mm4;
  535. pxor mm4,mm4;
  536. psubusb mm2,mm3;
  537. pcmpgtb mm4,mm0;
  538. pxor mm3,mm3;
  539. psubusb mm0,mm4;
  540. // 下面 555
  541. punpckhbw mm3,mm2;
  542. punpckhbw mm4,mm1;
  543. psrlw mm3,10; // B 入 mm3
  544. psrlw mm4,5; // G 入 mm4
  545. punpcklbw mm2,mm2; // B 的前 4 个
  546. pand mm4,mmx_mask_green;
  547. punpcklbw mm1,mm1; // G 的前 4 个
  548. por mm3,mm4;
  549. punpckhbw mm4,mm0;
  550. pand mm4,mmx_mask_red;
  551. punpcklbw mm0,mm0; // R 的前 4 个
  552. por mm3,mm4; // 合成 hRGB
  553. pand mm0,mmx_mask_red;
  554. psrlw mm1,5;
  555. psrlw mm2,10;
  556. pand mm1,mmx_mask_green;
  557. por mm0,mm2;
  558. por mm0,mm1; // 合成 lRGB
  559. movq [edi+edx+8],mm3;
  560. movq [edi+edx],mm0;
  561. ret;
  562. _end:
  563. emms;
  564. }
  565. }
  566. //---------------------------------------------------------------------------
  567. // 函数: RGB16_555
  568. // 功能: RGB16格式转化位RGB(555)格式
  569. // 参数: Y,r,g,b
  570. // 返回: void
  571. //---------------------------------------------------------------------------
  572. WORD RGB16_555(signed char Y,signed char r,signed char g,signed char b)
  573. {
  574. unsigned short result;
  575. __asm
  576. {
  577. movsx dx,byte ptr Y;
  578. movsx ax,byte ptr r;
  579. add dx,128;
  580. movsx bx,byte ptr g;
  581. sar dx,1;
  582. movsx cx,byte ptr b;
  583. add ax,dx;
  584. jns _ax_n0;
  585. xor ax,ax;
  586. _ax_n0:
  587. test ax,0xff80;
  588. jz _ax_7f;
  589. mov ax,0x7f;
  590. _ax_7f:
  591. add bx,dx;
  592. jns _bx_n0;
  593. xor bx,bx;
  594. _bx_n0:
  595. test bx,0xff80;
  596. jz _bx_7f;
  597. mov bx,0x7f;
  598. _bx_7f:
  599. add cx,dx;
  600. jns _cx_n0;
  601. xor cx,cx;
  602. _cx_n0:
  603. test cx,0xff80;
  604. jz _cx_7f;
  605. mov cx,0x7f;
  606. _cx_7f:
  607. shl ax,8;
  608. shl bx,3;
  609. and ax,0x7c00;
  610. and bx,0x3e0;
  611. shr cx,2;
  612. or ax,bx;
  613. or ax,cx;
  614. mov result,ax;
  615. }
  616. return result;
  617. }
  618. //---------------------------------------------------------------------------
  619. // 函数: RGB16_565
  620. // 功能: RGB16格式转化位RGB(565)格式
  621. // 参数: Y,r,g,b
  622. // 返回: void
  623. //---------------------------------------------------------------------------
  624. WORD RGB16_565(signed char Y,signed char r,signed char g,signed char b)
  625. {
  626. unsigned short result;
  627. __asm {
  628. movsx dx,byte ptr Y;
  629. movsx ax,byte ptr r;
  630. add dx,128;
  631. movsx bx,byte ptr g;
  632. sar dx,1;
  633. movsx cx,byte ptr b;
  634. add ax,dx;
  635. jns _ax_n0;
  636. xor ax,ax;
  637. _ax_n0:
  638. test ax,0xff80;
  639. jz _ax_7f;
  640. mov ax,0x7f;
  641. _ax_7f:
  642. add bx,dx;
  643. jns _bx_n0;
  644. xor bx,bx;
  645. _bx_n0:
  646. test bx,0xff80;
  647. jz _bx_7f;
  648. mov bx,0x7f;
  649. _bx_7f:
  650. add cx,dx;
  651. jns _cx_n0;
  652. xor cx,cx;
  653. _cx_n0:
  654. test cx,0xff80;
  655. jz _cx_7f;
  656. mov cx,0x7f;
  657. _cx_7f:
  658. shl ax,9;
  659. shl bx,4;
  660. and ax,0xf800;
  661. and bx,0x7e0;
  662. shr cx,2;
  663. or ax,bx;
  664. or ax,cx;
  665. mov result,ax;
  666. }
  667. return result;
  668. }
  669. //---------------------------------------------------------------------------
  670. // 函数: YCbCr411_nommx
  671. // 功能: YCbCr411
  672. // 参数: bmppixel
  673. // pitch
  674. // 返回: void
  675. //---------------------------------------------------------------------------
  676. void YCbCr411_nommx(WORD *bmppixel, int pitch)
  677. {
  678. int i,j,Cb,Cr,m;
  679. signed char r,g,b;
  680. signed char *CrBuf = (signed char *)jpeg_crbuf;
  681. signed char *CbBuf = (signed char *)jpeg_cbbuf;
  682. signed char *YBuf = (signed char *)jpeg_ybuf;
  683. for (m = 0; m < 4; ++m, bmppixel -= (m&1)*pitch*4-8+16*(m==2))
  684. for (i = 0; i < 8; i += 2)
  685. {
  686. for (j = 0; j < 8; j += 2)
  687. {
  688. Cb = CbBuf[(i/2+4*(m/2))*8+j/2+4*(m&1)];
  689. Cr = CrBuf[(i/2+4*(m/2))*8+j/2+4*(m&1)];
  690. r = Cr1_402[(BYTE)Cr];
  691. g = Cb0_34414[(BYTE)Cb]+Cr0_71414[(BYTE)Cr];
  692. b = Cb1_772[(BYTE)Cb];
  693. *bmppixel = RGB16(YBuf[i*8+j+128*m],r,g,b),++bmppixel;
  694. *bmppixel = RGB16(YBuf[i*8+j+1+128*m],r,g,b),++bmppixel;
  695. *(bmppixel+pitch/2-2) = RGB16(YBuf[i*8+j+8+128*m],r,g,b);
  696. *(bmppixel+pitch/2-1) = RGB16(YBuf[i*8+j+9+128*m],r,g,b);
  697. }
  698. bmppixel=(unsigned short*)((unsigned)bmppixel+pitch*2-16);
  699. }
  700. }
  701. //---------------------------------------------------------------------------
  702. // 函数: YCbCr111
  703. // 功能: YCbCr111
  704. // 参数: bmppixel
  705. // pitch
  706. // 返回: void
  707. //---------------------------------------------------------------------------
  708. void YCbCr111(WORD *bmppixel,int pitch)
  709. {
  710. int i,j,Cb,Cr;
  711. signed char *CrBuf = (signed char *)jpeg_crbuf;
  712. signed char *CbBuf = (signed char *)jpeg_cbbuf;
  713. signed char *YBuf = (signed char *)jpeg_ybuf;
  714. for (i = 0; i < 8; i++)
  715. {
  716. for (j = 0; j < 8; j++)
  717. {
  718. Cb=CbBuf[i*8+j];
  719. Cr=CrBuf[i*8+j];
  720. *bmppixel = RGB16(
  721. YBuf[i*8+j],
  722. Cr1_402[(BYTE)Cr],
  723. (BYTE)(Cb0_34414[(BYTE)Cb]+Cr0_71414[(BYTE)Cr]),
  724. Cb1_772[(BYTE)Cb]);
  725. bmppixel++;
  726. }
  727. bmppixel = (unsigned short*)((unsigned)bmppixel + pitch - 16);
  728. }
  729. }
  730. //---------------------------------------------------------------------------