p_24.inc 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. {
  2. Free Pascal port of the Hermes C library.
  3. Copyright (C) 2001-2003 Nikolay Nikolov ([email protected])
  4. Original C version by Christian Nentwich ([email protected])
  5. This library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Lesser General Public
  7. License as published by the Free Software Foundation; either
  8. version 2.1 of the License, or (at your option) any later version.
  9. This library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. Lesser General Public License for more details.
  13. You should have received a copy of the GNU Lesser General Public
  14. License along with this library; if not, write to the Free Software
  15. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  16. }
  17. {
  18. Generic C converter (from 24 bit) for the HERMES library
  19. Copyright (c) 1998 Christian Nentwich ([email protected])
  20. This source code is licensed under the GNU LGPL
  21. Please refer to the file COPYING.LIB contained in the distribution for
  22. licensing conditions
  23. }
  24. { -------------------------------------------------------------------------
  25. NORMAL CONVERTERS
  26. ------------------------------------------------------------------------- }
  27. { FROM 24 BIT ROUTINES }
  28. Procedure ConvertP_24rgb888_32rgb888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  29. Var
  30. d_block : int32;
  31. Begin
  32. Repeat
  33. d_block := ((source + R_24)^ Shl 16) Or
  34. ((source + G_24)^ Shl 8) Or
  35. (source + B_24)^;
  36. Pint32(dest)^ := d_block;
  37. Inc(dest, 4);
  38. Inc(source, 3);
  39. Dec(count);
  40. Until count = 0;
  41. End;
  42. Procedure ConvertP_24rgb888_32bgr888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  43. Var
  44. d_block : int32;
  45. Begin
  46. Repeat
  47. d_block := (source + R_24)^ Or
  48. ((source + G_24)^ Shl 8) Or
  49. ((source + B_24)^ Shl 16);
  50. Pint32(dest)^ := d_block;
  51. Inc(dest, 4);
  52. Inc(source, 3);
  53. Dec(count);
  54. Until count = 0;
  55. End;
  56. Procedure ConvertP_24rgb888_32rgba888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  57. Var
  58. d_block : int32;
  59. Begin
  60. Repeat
  61. d_block := ((source + R_24)^ Shl 24) Or
  62. ((source + G_24)^ Shl 16) Or
  63. ((source + B_24)^ Shl 8) Or $ff;
  64. Pint32(dest)^ := d_block;
  65. Inc(dest, 4);
  66. Inc(source, 3);
  67. Dec(count);
  68. Until count = 0;
  69. End;
  70. Procedure ConvertP_24rgb888_32bgra888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  71. Var
  72. d_block : int32;
  73. Begin
  74. Repeat
  75. d_block := ((source + R_24)^ Shl 8) Or
  76. ((source + G_24)^ Shl 16) Or
  77. ((source + B_24)^ Shl 24) Or $ff;
  78. Pint32(dest)^ := d_block;
  79. Inc(dest, 4);
  80. Inc(source, 3);
  81. Dec(count);
  82. Until count = 0;
  83. End;
  84. Procedure ConvertP_24rgb888_24bgr888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  85. Var
  86. d_pix1, d_pix2, d_pix3 : int32;
  87. c_pix1, c_pix2, c_pix3 : Pchar8;
  88. c : DWord;
  89. tmp : char8;
  90. Begin
  91. While ((PtrUInt(dest) And 3) <> 0) And (count > 0) Do
  92. Begin
  93. (dest + 0)^ := (source + 2)^;
  94. (dest + 1)^ := (source + 1)^;
  95. (dest + 2)^ := (source + 0)^;
  96. Dec(count);
  97. Inc(dest, 3);
  98. Inc(source, 3);
  99. End;
  100. c_pix1 := @d_pix1;
  101. c_pix2 := @d_pix2;
  102. c_pix3 := @d_pix3;
  103. c := count Shr 2;
  104. While c > 0 Do
  105. Begin
  106. d_pix1 := Pint32(source)^;
  107. d_pix2 := Pint32(source + 4)^;
  108. d_pix3 := Pint32(source + 8)^;
  109. { Swap R and B in all three pixels }
  110. tmp := (c_pix1 + 0)^; (c_pix1 + 0)^ := (c_pix1 + 2)^; (c_pix1 + 2)^ := tmp;
  111. tmp := (c_pix1 + 3)^; (c_pix1 + 3)^ := (c_pix2 + 1)^; (c_pix2 + 1)^ := tmp;
  112. tmp := (c_pix2 + 2)^; (c_pix2 + 2)^ := (c_pix3 + 0)^; (c_pix3 + 0)^ := tmp;
  113. tmp := (c_pix3 + 1)^; (c_pix3 + 1)^ := (c_pix3 + 3)^; (c_pix3 + 3)^ := tmp;
  114. Pint32(dest)^ := d_pix1;
  115. Pint32(dest + 4)^ := d_pix2;
  116. Pint32(dest + 8)^ := d_pix3;
  117. Inc(dest, 12);
  118. Inc(source, 12);
  119. Dec(c);
  120. End;
  121. count := count And $3;
  122. While count > 0 Do
  123. Begin
  124. (dest + 0)^ := (source + 2)^;
  125. (dest + 1)^ := (source + 1)^;
  126. (dest + 2)^ := (source + 0)^;
  127. Dec(count);
  128. Inc(dest, 3);
  129. Inc(source, 3);
  130. End;
  131. End;
  132. Procedure ConvertP_24rgb888_16rgb565(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  133. Var
  134. d_block : int32;
  135. i : DWord;
  136. Begin
  137. For i := 0 To (count Shr 1) - 1 Do
  138. Begin
  139. d_block := (((source + R_24)^ Shl 8) And $f800) Or
  140. (((source + G_24)^ Shl 3) And $7e0) Or
  141. (((source + B_24)^ Shr 3) And $1f);
  142. d_block := d_block Or
  143. (((((source + R_24 + 3)^ Shl 8) And $f800) Or
  144. (((source + G_24 + 3)^ Shl 3) And $7e0) Or
  145. (((source + B_24 + 3)^ Shr 3) And $1f)) Shl 16);
  146. Pint32(dest)^ := d_block;
  147. Inc(source, 6);
  148. Inc(dest, 4);
  149. End;
  150. If (count And 1) <> 0 Then
  151. Begin
  152. d_block := (((source + R_24)^ Shl 8) And $f800) Or
  153. (((source + G_24)^ Shl 3) And $7e0) Or
  154. (((source + B_24)^ Shr 3) And $1f);
  155. Pshort16(dest)^ := d_block;
  156. End;
  157. End;
  158. Procedure ConvertP_24rgb888_16bgr565(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  159. Var
  160. d_block : int32;
  161. i : DWord;
  162. Begin
  163. For i := 0 To (count Shr 1) - 1 Do
  164. Begin
  165. d_block := (((source + R_24)^ Shr 3) And $1f) Or
  166. (((source + G_24)^ Shl 3) And $7e0) Or
  167. (((source + B_24)^ Shl 8) And $f800);
  168. d_block := d_block Or
  169. (((((source + R_24 + 3)^ Shr 3) And $1f) Or
  170. (((source + G_24 + 3)^ Shl 3) And $7e0) Or
  171. (((source + B_24 + 3)^ Shl 8) And $f800)) Shl 16);
  172. Pint32(dest)^ := d_block;
  173. Inc(source, 6);
  174. Inc(dest, 4);
  175. End;
  176. If (count And 1) <> 0 Then
  177. Begin
  178. d_block := (((source + R_24)^ Shr 3) And $1f) Or
  179. (((source + G_24)^ Shl 3) And $7e0) Or
  180. (((source + B_24)^ Shl 8) And $f800);
  181. Pshort16(dest)^ := d_block;
  182. End;
  183. End;
  184. Procedure ConvertP_24rgb888_16rgb555(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  185. Var
  186. d_block : int32;
  187. i : DWord;
  188. Begin
  189. For i := 0 To (count Shr 1) - 1 Do
  190. Begin
  191. d_block := (((source + R_24)^ Shl 7) And $7c00) Or
  192. (((source + G_24)^ Shl 2) And $3e0) Or
  193. (((source + B_24)^ Shr 3) And $1f);
  194. d_block := d_block Or
  195. (((((source + R_24 + 3)^ Shl 7) And $7c00) Or
  196. (((source + G_24 + 3)^ Shl 2) And $3e0) Or
  197. (((source + B_24 + 3)^ Shr 3) And $1f)) Shl 16);
  198. Pint32(dest)^ := d_block;
  199. Inc(source, 6);
  200. Inc(dest, 4);
  201. End;
  202. If (count And 1) <> 0 Then
  203. Begin
  204. d_block := (((source + R_24)^ Shl 7) And $7c00) Or
  205. (((source + G_24)^ Shl 2) And $3e0) Or
  206. (((source + B_24)^ Shr 3) And $1f);
  207. Pshort16(dest)^ := d_block;
  208. End;
  209. End;
  210. Procedure ConvertP_24rgb888_16bgr555(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  211. Var
  212. d_block : int32;
  213. i : DWord;
  214. Begin
  215. For i := 0 To (count Shr 1) - 1 Do
  216. Begin
  217. d_block := (((source + R_24)^ Shr 3) And $1f) Or
  218. (((source + G_24)^ Shl 2) And $3e0) Or
  219. (((source + B_24)^ Shl 7) And $7c00);
  220. d_block := d_block Or
  221. (((((source + R_24 + 3)^ Shr 3) And $1f) Or
  222. (((source + G_24 + 3)^ Shl 2) And $3e0) Or
  223. (((source + B_24 + 3)^ Shl 7) And $7c00)) Shl 16);
  224. Pint32(dest)^ := d_block;
  225. Inc(source, 6);
  226. Inc(dest, 4);
  227. End;
  228. If (count And 1) <> 0 Then
  229. Begin
  230. d_block := (((source + R_24)^ Shr 3) And $1f) Or
  231. (((source + G_24)^ Shl 2) And $3e0) Or
  232. (((source + B_24)^ Shl 7) And $7c00);
  233. Pshort16(dest)^ := d_block;
  234. End;
  235. End;
  236. { optimise me !! }
  237. Procedure ConvertP_24rgb888_8rgb332(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  238. Var
  239. r, g, b : int32;
  240. i : DWord;
  241. Begin
  242. For i := 0 To count - 1 Do
  243. Begin
  244. r := (source + R_24)^ And $e0;
  245. g := ((source + G_24)^ Shr 3) And $1c;
  246. b := ((source + B_24)^ Shr 6) And $3;
  247. dest^ := r Or g Or b;
  248. Inc(source, 3);
  249. Inc(dest);
  250. End;
  251. End;
  252. { -------------------------------------------------------------------------
  253. STRETCH CONVERTERS
  254. ------------------------------------------------------------------------- }
  255. Procedure ConvertP_24rgb888_32rgb888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  256. Var
  257. x : DWord;
  258. Begin
  259. x := 0;
  260. Repeat
  261. Pint32(dest)^ := ((source + R_24)^ Shl 16) Or
  262. ((source + G_24)^ Shl 8) Or
  263. (source + B_24)^;
  264. Inc(x, inc_source);
  265. Inc(source, x Shr 16);
  266. Inc(source, x Shr 16);
  267. Inc(source, x Shr 16);
  268. x := x And $FFFF;
  269. Inc(dest, 4);
  270. Dec(count);
  271. Until count = 0;
  272. End;
  273. Procedure ConvertP_24rgb888_32bgr888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  274. Var
  275. x : DWord;
  276. Begin
  277. x := 0;
  278. Repeat
  279. Pint32(dest)^ := (source + R_24)^ Or
  280. ((source + G_24)^ Shl 8) Or
  281. ((source + B_24)^ Shl 16);
  282. Inc(x, inc_source);
  283. Inc(source, x Shr 16);
  284. Inc(source, x Shr 16);
  285. Inc(source, x Shr 16);
  286. x := x And $FFFF;
  287. Inc(dest, 4);
  288. Dec(count);
  289. Until count = 0;
  290. End;
  291. Procedure ConvertP_24rgb888_32rgba888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  292. Var
  293. x : DWord;
  294. Begin
  295. x := 0;
  296. Repeat
  297. Pint32(dest)^ := ((((source + R_24)^ Shl 16) Or
  298. ((source + G_24)^ Shl 8) Or
  299. (source + B_24)^) Shl 8) Or $FF;
  300. Inc(x, inc_source);
  301. Inc(source, x Shr 16);
  302. Inc(source, x Shr 16);
  303. Inc(source, x Shr 16);
  304. x := x And $FFFF;
  305. Inc(dest, 4);
  306. Dec(count);
  307. Until count = 0;
  308. End;
  309. Procedure ConvertP_24rgb888_32bgra888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  310. Var
  311. x : DWord;
  312. Begin
  313. x := 0;
  314. Repeat
  315. Pint32(dest)^ := (((source + R_24)^ Or
  316. ((source + G_24)^ Shl 8) Or
  317. ((source + B_24)^ Shl 16)) Shl 8) Or $FF;
  318. Inc(x, inc_source);
  319. Inc(source, x Shr 16);
  320. Inc(source, x Shr 16);
  321. Inc(source, x Shr 16);
  322. x := x And $FFFF;
  323. Inc(dest, 4);
  324. Dec(count);
  325. Until count = 0;
  326. End;
  327. Procedure ConvertP_24rgb888_24bgr888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  328. Var
  329. x : int32;
  330. Begin
  331. x := 0;
  332. Repeat
  333. (dest + 0)^ := (source + 2)^;
  334. (dest + 1)^ := (source + 1)^;
  335. (dest + 2)^ := (source + 0)^;
  336. Inc(x, inc_source);
  337. Inc(source, x Shr 16);
  338. Inc(source, x Shr 16);
  339. Inc(source, x Shr 16);
  340. x := x And $FFFF;
  341. Inc(dest, 3);
  342. Dec(count);
  343. Until count = 0;
  344. End;
  345. Procedure ConvertP_24rgb888_16rgb565_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  346. Var
  347. d_block : int32;
  348. x : DWord;
  349. c : DWord;
  350. Begin
  351. x := 0;
  352. If (PtrUInt(dest) And 3) <> 0 Then
  353. Begin
  354. d_block := (((source + R_24)^ Shl 8) And $f800) Or
  355. (((source + G_24)^ Shl 3) And $7e0) Or
  356. (((source + B_24)^ Shr 3) And $1f);
  357. Inc(x, inc_source);
  358. Inc(source, x Shr 16);
  359. Inc(source, x Shr 16);
  360. Inc(source, x Shr 16);
  361. x := x And $FFFF;
  362. Pshort16(dest)^ := d_block;
  363. Inc(dest, 2);
  364. End;
  365. c := count Shr 1;
  366. While c > 0 Do
  367. Begin
  368. d_block := (((source + R_24)^ Shl 8) And $f800) Or
  369. (((source + G_24)^ Shl 3) And $7e0) Or
  370. (((source + B_24)^ Shr 3) And $1f);
  371. Inc(x, inc_source);
  372. Inc(source, x Shr 16);
  373. Inc(source, x Shr 16);
  374. Inc(source, x Shr 16);
  375. x := x And $FFFF;
  376. d_block := d_block Or
  377. (((((source + R_24)^ Shl 8) And $f800) Or
  378. (((source + G_24)^ Shl 3) And $7e0) Or
  379. (((source + B_24)^ Shr 3) And $1f)) Shl 16);
  380. Inc(x, inc_source);
  381. Inc(source, x Shr 16);
  382. Inc(source, x Shr 16);
  383. Inc(source, x Shr 16);
  384. x := x And $FFFF;
  385. Pint32(dest)^ := d_block;
  386. Inc(dest, 4);
  387. Dec(c);
  388. End;
  389. If (count And 1) <> 0 Then
  390. Begin
  391. d_block := (((source + R_24)^ Shl 8) And $f800) Or
  392. (((source + G_24)^ Shl 3) And $7e0) Or
  393. (((source + B_24)^ Shr 3) And $1f);
  394. Pshort16(dest)^ := d_block;
  395. End;
  396. End;
  397. Procedure ConvertP_24rgb888_16bgr565_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  398. Var
  399. d_block : int32;
  400. x : DWord;
  401. c : DWord;
  402. Begin
  403. x := 0;
  404. If (PtrUInt(dest) And 3) <> 0 Then
  405. Begin
  406. d_block := (((source + R_24)^ Shr 3) And $1f) Or
  407. (((source + G_24)^ Shl 3) And $7e0) Or
  408. (((source + B_24)^ Shl 8) And $f800);
  409. Inc(x, inc_source);
  410. Inc(source, x Shr 16);
  411. Inc(source, x Shr 16);
  412. Inc(source, x Shr 16);
  413. x := x And $FFFF;
  414. Pshort16(dest)^ := d_block;
  415. Inc(dest, 2);
  416. End;
  417. c := count Shr 1;
  418. While c > 0 Do
  419. Begin
  420. d_block := (((source + R_24)^ Shr 3) And $1f) Or
  421. (((source + G_24)^ Shl 3) And $7e0) Or
  422. (((source + B_24)^ Shl 8) And $f800);
  423. Inc(x, inc_source);
  424. Inc(source, x Shr 16);
  425. Inc(source, x Shr 16);
  426. Inc(source, x Shr 16);
  427. x := x And $FFFF;
  428. d_block := d_block Or
  429. (((((source + R_24)^ Shr 3) And $1f) Or
  430. (((source + G_24)^ Shl 3) And $7e0) Or
  431. (((source + B_24)^ Shl 8) And $f800)) Shl 16);
  432. Inc(x, inc_source);
  433. Inc(source, x Shr 16);
  434. Inc(source, x Shr 16);
  435. Inc(source, x Shr 16);
  436. x := x And $FFFF;
  437. Pint32(dest)^ := d_block;
  438. Inc(dest, 4);
  439. Dec(c);
  440. End;
  441. If (count And 1) <> 0 Then
  442. Begin
  443. d_block := (((source + R_24)^ Shr 3) And $1f) Or
  444. (((source + G_24)^ Shl 3) And $7e0) Or
  445. (((source + B_24)^ Shl 8) And $f800);
  446. Pshort16(dest)^ := d_block;
  447. End;
  448. End;
  449. Procedure ConvertP_24rgb888_16rgb555_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  450. Var
  451. d_block : int32;
  452. x : DWord;
  453. c : DWord;
  454. Begin
  455. x := 0;
  456. If (PtrUInt(dest) And 3) <> 0 Then
  457. Begin
  458. d_block := (((source + R_24)^ Shl 7) And $7c00) Or
  459. (((source + G_24)^ Shl 2) And $3e0) Or
  460. (((source + B_24)^ Shr 3) And $1f);
  461. Inc(x, inc_source);
  462. Inc(source, x Shr 16);
  463. Inc(source, x Shr 16);
  464. Inc(source, x Shr 16);
  465. x := x And $FFFF;
  466. Pshort16(dest)^ := d_block;
  467. Inc(dest, 2);
  468. End;
  469. c := count Shr 1;
  470. While c > 0 Do
  471. Begin
  472. d_block := (((source + R_24)^ Shl 7) And $7c00) Or
  473. (((source + G_24)^ Shl 2) And $3e0) Or
  474. (((source + B_24)^ Shr 3) And $1f);
  475. Inc(x, inc_source);
  476. Inc(source, x Shr 16);
  477. Inc(source, x Shr 16);
  478. Inc(source, x Shr 16);
  479. x := x And $FFFF;
  480. d_block := d_block Or
  481. (((((source + R_24)^ Shl 7) And $7c00) Or
  482. (((source + G_24)^ Shl 2) And $3e0) Or
  483. (((source + B_24)^ Shr 3) And $1f)) Shl 16);
  484. Inc(x, inc_source);
  485. Inc(source, x Shr 16);
  486. Inc(source, x Shr 16);
  487. Inc(source, x Shr 16);
  488. x := x And $FFFF;
  489. Pint32(dest)^ := d_block;
  490. Inc(dest, 4);
  491. Dec(c);
  492. End;
  493. If (count And 1) <> 0 Then
  494. Begin
  495. d_block := (((source + R_24)^ Shl 7) And $7c00) Or
  496. (((source + G_24)^ Shl 2) And $3e0) Or
  497. (((source + B_24)^ Shr 3) And $1f);
  498. Pshort16(dest)^ := d_block;
  499. End;
  500. End;
  501. Procedure ConvertP_24rgb888_16bgr555_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  502. Var
  503. d_block : int32;
  504. x : DWord;
  505. c : DWord;
  506. Begin
  507. x := 0;
  508. If (PtrUInt(dest) And 3) <> 0 Then
  509. Begin
  510. d_block := (((source + R_24)^ Shr 3) And $1f) Or
  511. (((source + G_24)^ Shl 2) And $3e0) Or
  512. (((source + B_24)^ Shl 7) And $7c00);
  513. Inc(x, inc_source);
  514. Inc(source, x Shr 16);
  515. Inc(source, x Shr 16);
  516. Inc(source, x Shr 16);
  517. x := x And $FFFF;
  518. Pshort16(dest)^ := d_block;
  519. Inc(dest, 2);
  520. End;
  521. c := count Shr 1;
  522. While c > 0 Do
  523. Begin
  524. d_block := (((source + R_24)^ Shr 3) And $1f) Or
  525. (((source + G_24)^ Shl 2) And $3e0) Or
  526. (((source + B_24)^ Shl 7) And $7c00);
  527. Inc(x, inc_source);
  528. Inc(source, x Shr 16);
  529. Inc(source, x Shr 16);
  530. Inc(source, x Shr 16);
  531. x := x And $FFFF;
  532. d_block := d_block Or
  533. (((((source + R_24)^ Shr 3) And $1f) Or
  534. (((source + G_24)^ Shl 2) And $3e0) Or
  535. (((source + B_24)^ Shl 7) And $7c00)) Shl 16);
  536. Inc(x, inc_source);
  537. Inc(source, x Shr 16);
  538. Inc(source, x Shr 16);
  539. Inc(source, x Shr 16);
  540. x := x And $FFFF;
  541. Pint32(dest)^ := d_block;
  542. Inc(dest, 4);
  543. Dec(c);
  544. End;
  545. If (count And 1) <> 0 Then
  546. Begin
  547. d_block := (((source + R_24)^ Shr 3) And $1f) Or
  548. (((source + G_24)^ Shl 2) And $3e0) Or
  549. (((source + B_24)^ Shl 7) And $7c00);
  550. Pshort16(dest)^ := d_block;
  551. End;
  552. End;
  553. Procedure ConvertP_24rgb888_8rgb332_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  554. Var
  555. r, g, b : int32;
  556. i : DWord;
  557. x : DWord;
  558. Begin
  559. x := 0;
  560. For i := 0 To count - 1 Do
  561. Begin
  562. r := (source + R_24)^ And $e0;
  563. g := ((source + G_24)^ Shr 3) And $1c;
  564. b := ((source + B_24)^ Shr 6) And $3;
  565. dest^ := r Or g Or b;
  566. Inc(x, inc_source);
  567. Inc(source, x Shr 16);
  568. Inc(source, x Shr 16);
  569. Inc(source, x Shr 16);
  570. x := x And $FFFF;
  571. Inc(dest);
  572. End;
  573. End;