2
0

p_muhmu.inc 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899
  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. muhmuh converters 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. { TO 32 RGB }
  25. Procedure ConvertP_muhmu32_32rgb888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  26. Var
  27. s_pixel : int32;
  28. Begin
  29. Repeat
  30. s_pixel := Pint32(source)^;
  31. Pint32(dest)^ := (s_pixel And $ff) Or
  32. ((s_pixel And ($ff Shl 10)) Shr 2) Or
  33. ((s_pixel And ($ff Shl 20)) Shr 4);
  34. Inc(dest, 4);
  35. Inc(source, 4);
  36. Dec(count);
  37. Until count = 0;
  38. End;
  39. { TO 32 BGR }
  40. Procedure ConvertP_muhmu32_32bgr888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  41. Var
  42. s_pixel : int32;
  43. Begin
  44. Repeat
  45. s_pixel := Pint32(source)^;
  46. Pint32(dest)^ := ((s_pixel And $ff) Shl 16) Or
  47. ((s_pixel And ($ff Shl 10)) Shr 2) Or
  48. ((s_pixel Shr 20) And $FF);
  49. Inc(dest, 4);
  50. Inc(source, 4);
  51. Dec(count);
  52. Until count = 0;
  53. End;
  54. { TO 32 RGBA }
  55. Procedure ConvertP_muhmu32_32rgba888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  56. Var
  57. s_pixel : int32;
  58. Begin
  59. Repeat
  60. s_pixel := Pint32(source)^;
  61. Pint32(dest)^ := (((s_pixel And $ff) Or
  62. ((s_pixel And ($ff Shl 10)) Shr 2) Or
  63. ((s_pixel And ($ff Shl 20)) Shr 4)) Shl 8) Or $FF;
  64. Inc(dest, 4);
  65. Inc(source, 4);
  66. Dec(count);
  67. Until count = 0;
  68. End;
  69. { TO 32 BGRA }
  70. Procedure ConvertP_muhmu32_32bgra888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  71. Var
  72. s_pixel : int32;
  73. Begin
  74. Repeat
  75. s_pixel := Pint32(source)^;
  76. Pint32(dest)^ := (((s_pixel And $ff) Shl 24) Or
  77. ((s_pixel And ($ff Shl 10)) Shl 6) Or
  78. ((s_pixel Shr 12) And $FF00)) Or $FF;
  79. Inc(dest, 4);
  80. Inc(source, 4);
  81. Dec(count);
  82. Until count = 0;
  83. End;
  84. { TO 24 RGB }
  85. Procedure ConvertP_muhmu32_24rgb888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  86. Var
  87. s_pixel : int32;
  88. s_point : Pchar8;
  89. Begin
  90. s_point := @s_pixel;
  91. Repeat
  92. s_pixel := Pint32(source)^;
  93. s_pixel := (s_pixel And $ff) Or
  94. ((s_pixel And ($ff Shl 10)) Shr 2) Or
  95. ((s_pixel And ($ff Shl 20)) Shr 4);
  96. (dest+R_24)^ := (s_point+R_32)^;
  97. (dest+G_24)^ := (s_point+G_32)^;
  98. (dest+B_24)^ := (s_point+B_32)^;
  99. Inc(source, 4);
  100. Inc(dest, 3);
  101. Dec(count);
  102. Until count = 0;
  103. End;
  104. { TO 24 BGR }
  105. Procedure ConvertP_muhmu32_24bgr888(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  106. Var
  107. s_pixel : int32;
  108. s_point : Pchar8;
  109. Begin
  110. s_point := @s_pixel;
  111. Repeat
  112. s_pixel := Pint32(source)^;
  113. s_pixel := (s_pixel And $ff) Or
  114. ((s_pixel And ($ff Shl 10)) Shr 2) Or
  115. ((s_pixel And ($ff Shl 20)) Shr 4);
  116. { Note that R and B are swapped }
  117. (dest+B_24)^ := (s_point+R_32)^;
  118. (dest+G_24)^ := (s_point+G_32)^;
  119. (dest+R_24)^ := (s_point+B_32)^;
  120. Inc(source, 4);
  121. Inc(dest, 3);
  122. Dec(count);
  123. Until count = 0;
  124. End;
  125. { TO 16 RGB 565 }
  126. Procedure ConvertP_muhmu32_16rgb565(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  127. Var
  128. i : DWord;
  129. r, g, b : int32;
  130. s_pixel, d_pixelblock : int32;
  131. d_pixel : short16;
  132. Begin
  133. { If the current pixel isn't dword aligned, try write one pixel first }
  134. If (PtrUInt(dest) And $3) <> 0 Then
  135. Begin
  136. s_pixel := Pint32(source)^;
  137. r := (s_pixel Shr 12) And $f800;
  138. g := (s_pixel Shr 7) And $7e0;
  139. b := (s_pixel Shr 3) And $1f;
  140. d_pixel := r Or g Or b;
  141. Pshort16(dest)^ := d_pixel;
  142. Inc(source, 4);
  143. Inc(dest, 2);
  144. Dec(count);
  145. End;
  146. { Write blocks of two pixels }
  147. For i := 1 To count Shr 1 Do
  148. Begin
  149. s_pixel := Pint32(source)^;
  150. d_pixelblock := ((s_pixel Shr 12) And $f800) Or
  151. ((s_pixel Shr 7) And $7e0) Or
  152. ((s_pixel Shr 3) And $1f);
  153. s_pixel := (Pint32(source) + 1)^;
  154. d_pixelblock := d_pixelblock Or
  155. ((((s_pixel Shr 12) And $f800) Or
  156. ((s_pixel Shr 7) And $7e0) Or
  157. ((s_pixel Shr 3) And $1f)) Shl 16);
  158. Pint32(dest)^ := d_pixelblock;
  159. Inc(source, 8); Inc(dest, 4);
  160. End;
  161. { Eventually, write a single odd pixel that might be left }
  162. If (count And 1) <> 0 Then
  163. Begin
  164. s_pixel := Pint32(source)^;
  165. r := (s_pixel Shr 12) And $f800;
  166. g := (s_pixel Shr 7) And $7e0;
  167. b := (s_pixel Shr 3) And $1f;
  168. d_pixel := r Or g Or b;
  169. Pshort16(dest)^ := d_pixel;
  170. End;
  171. End;
  172. { TO 16 BGR 565 }
  173. Procedure ConvertP_muhmu32_16bgr565(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  174. Var
  175. i : DWord;
  176. r, g, b : int32;
  177. s_pixel, d_pixelblock : int32;
  178. d_pixel : short16;
  179. Begin
  180. { If the current pixel isn't dword aligned, try write one pixel first }
  181. If (PtrUInt(dest) And $3) <> 0 Then
  182. Begin
  183. s_pixel := Pint32(source)^;
  184. r := (s_pixel Shr 23) And $1f;
  185. g := (s_pixel Shr 7) And $7e0;
  186. b := (s_pixel Shl 8) And $f800;
  187. d_pixel := r Or g Or b;
  188. Pshort16(dest)^ := d_pixel;
  189. Inc(source, 4);
  190. Inc(dest, 2);
  191. Dec(count);
  192. End;
  193. { Write blocks of two pixels }
  194. For i := 1 To count Shr 1 Do
  195. Begin
  196. s_pixel := Pint32(source)^;
  197. d_pixelblock := ((s_pixel Shr 23) And $1f) Or
  198. ((s_pixel Shr 7) And $7e0) Or
  199. ((s_pixel Shl 8) And $f800);
  200. s_pixel := (Pint32(source) + 1)^;
  201. d_pixelblock := d_pixelblock Or
  202. ((((s_pixel Shr 23) And $1f) Or
  203. ((s_pixel Shr 7) And $7e0) Or
  204. ((s_pixel Shl 8) And $f800)) Shl 16);
  205. Pint32(dest)^ := d_pixelblock;
  206. Inc(source, 8); Inc(dest, 4);
  207. End;
  208. { Eventually, write a single odd pixel that might be left }
  209. If (count And 1) <> 0 Then
  210. Begin
  211. s_pixel := Pint32(source)^;
  212. r := (s_pixel Shr 23) And $1f;
  213. g := (s_pixel Shr 7) And $7e0;
  214. b := (s_pixel Shl 8) And $f800;
  215. d_pixel := r Or g Or b;
  216. Pshort16(dest)^ := d_pixel;
  217. End;
  218. End;
  219. { TO 16 RGB 555 }
  220. Procedure ConvertP_muhmu32_16rgb555(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  221. Var
  222. i : DWord;
  223. r, g, b : int32;
  224. s_pixel, d_pixelblock : int32;
  225. d_pixel : short16;
  226. Begin
  227. If (PtrUInt(dest) And $3) <> 0 Then
  228. Begin
  229. s_pixel := Pint32(source)^;
  230. r := (s_pixel Shr 13) And $7c00;
  231. g := (s_pixel Shr 8) And $3e0;
  232. b := (s_pixel Shr 3) And $1f;
  233. d_pixel := r Or g Or b;
  234. Pshort16(dest)^ := d_pixel;
  235. Inc(source, 4);
  236. Inc(dest, 2);
  237. Dec(count);
  238. End;
  239. For i := 1 To count Shr 1 Do
  240. Begin
  241. s_pixel := Pint32(source)^;
  242. d_pixelblock := ((s_pixel Shr 13) And $7c00) Or
  243. ((s_pixel Shr 8) And $3e0) Or
  244. ((s_pixel Shr 3) And $1f);
  245. s_pixel := (Pint32(source) + 1)^;
  246. d_pixelblock := d_pixelblock Or
  247. ((((s_pixel Shr 13) And $7c00) Or
  248. ((s_pixel Shr 8) And $3e0) Or
  249. ((s_pixel Shr 3) And $1f)) Shl 16);
  250. Pint32(dest)^ := d_pixelblock;
  251. Inc(source, 8); Inc(dest, 4);
  252. End;
  253. If (count And 1) <> 0 Then
  254. Begin
  255. s_pixel := Pint32(source)^;
  256. r := (s_pixel Shr 13) And $7c00;
  257. g := (s_pixel Shr 8) And $3e0;
  258. b := (s_pixel Shr 3) And $1f;
  259. d_pixel := r Or g Or b;
  260. Pshort16(dest)^ := d_pixel;
  261. End;
  262. End;
  263. { TO 16 BGR 555 }
  264. Procedure ConvertP_muhmu32_16bgr555(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  265. Var
  266. i : DWord;
  267. r, g, b : int32;
  268. s_pixel, d_pixelblock : int32;
  269. d_pixel : short16;
  270. Begin
  271. If (PtrUInt(dest) And $3) <> 0 Then
  272. Begin
  273. s_pixel := Pint32(source)^;
  274. r := (s_pixel Shr 23) And $1f;
  275. g := (s_pixel Shr 8) And $3e0;
  276. b := (s_pixel Shl 7) And $7c00;
  277. d_pixel := r Or g Or b;
  278. Pshort16(dest)^ := d_pixel;
  279. Inc(source, 4);
  280. Inc(dest, 2);
  281. Dec(count);
  282. End;
  283. For i := 1 To count Shr 1 Do
  284. Begin
  285. s_pixel := Pint32(source)^;
  286. d_pixelblock := ((s_pixel Shr 23) And $1f) Or
  287. ((s_pixel Shr 8) And $3e0) Or
  288. ((s_pixel Shl 7) And $7c00);
  289. s_pixel := (Pint32(source) + 1)^;
  290. d_pixelblock := d_pixelblock Or
  291. ((((s_pixel Shr 23) And $1f) Or
  292. ((s_pixel Shr 8) And $3e0) Or
  293. ((s_pixel Shl 7) And $7c00)) Shl 16);
  294. Pint32(dest)^ := d_pixelblock;
  295. Inc(source, 8); Inc(dest, 4);
  296. End;
  297. If (count And 1) <> 0 Then
  298. Begin
  299. s_pixel := Pint32(source)^;
  300. r := (s_pixel Shr 23) And $1f;
  301. g := (s_pixel Shr 8) And $3e0;
  302. b := (s_pixel Shl 7) And $7c00;
  303. d_pixel := r Or g Or b;
  304. Pshort16(dest)^ := d_pixel;
  305. End;
  306. End;
  307. { TO 8 RGB 332 }
  308. Procedure ConvertP_muhmu32_8rgb332(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  309. Var
  310. i : DWord;
  311. s_pixel, d_block : int32;
  312. d_pixel : char8;
  313. Begin
  314. { Process single pixels until we are dword aligned }
  315. While (PtrUInt(dest) And $3) <> 0 Do
  316. Begin
  317. s_pixel := Pint32(source)^;
  318. d_pixel := ((s_pixel Shr 20) And $e0) Or
  319. ((s_pixel Shr 13) And $1c) Or
  320. ((s_pixel Shr 6) And $3);
  321. dest^ := d_pixel;
  322. Dec(count);
  323. If count = 0 Then
  324. Exit;
  325. Inc(dest);
  326. Inc(source, 4);
  327. End;
  328. { Now process blocks of four pixels }
  329. For i := 1 To count Shr 2 Do
  330. Begin
  331. s_pixel := Pint32(source)^;
  332. d_block := ((s_pixel Shr 20) And $e0) Or
  333. ((s_pixel Shr 13) And $1c) Or
  334. ((s_pixel Shr 6) And $3);
  335. s_pixel := (Pint32(source) + 1)^;
  336. d_block := d_block Or
  337. ((((s_pixel Shr 20) And $e0) Or
  338. ((s_pixel Shr 13) And $1c) Or
  339. ((s_pixel Shr 6) And $3)) Shl 8);
  340. s_pixel := (Pint32(source) + 2)^;
  341. d_block := d_block Or
  342. ((((s_pixel Shr 20) And $e0) Or
  343. ((s_pixel Shr 13) And $1c) Or
  344. ((s_pixel Shr 6) And $3)) Shl 16);
  345. s_pixel := (Pint32(source) + 3)^;
  346. d_block := d_block Or
  347. ((((s_pixel Shr 20) And $e0) Or
  348. ((s_pixel Shr 13) And $1c) Or
  349. ((s_pixel Shr 6) And $3)) Shl 24);
  350. Pint32(dest)^ := d_block;
  351. Inc(source, 16);
  352. Inc(dest, 4);
  353. End;
  354. { Write all possibly remaining pixel }
  355. count := count And 3;
  356. While count <> 0 Do
  357. Begin
  358. Dec(count);
  359. dest^ := ((s_pixel Shr 20) And $e0) Or
  360. ((s_pixel Shr 13) And $1c) Or
  361. ((s_pixel Shr 6) And $3);
  362. Inc(dest);
  363. Inc(source, 4);
  364. End;
  365. End;
  366. { -------------------------------------------------------------------------
  367. STRETCH CONVERTERS
  368. ------------------------------------------------------------------------- }
  369. Procedure ConvertP_muhmu32_32rgb888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  370. Var
  371. x : DWord;
  372. s_pixel : DWord;
  373. Begin
  374. x := 0;
  375. While count > 0 Do
  376. Begin
  377. s_pixel := Pint32(source)^;
  378. Pint32(dest)^ := (s_pixel And $ff) Or
  379. ((s_pixel And ($ff Shl 10)) Shr 2) Or
  380. ((s_pixel And ($ff Shl 20)) Shr 4);
  381. Inc(x, inc_source);
  382. Inc(source, (x Shr 16)*4);
  383. x := x And $FFFF;
  384. Inc(dest, 4);
  385. Dec(count);
  386. End;
  387. End;
  388. Procedure ConvertP_muhmu32_32bgr888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  389. Var
  390. x : DWord;
  391. s_pixel : DWord;
  392. Begin
  393. x := 0;
  394. While count > 0 Do
  395. Begin
  396. s_pixel := Pint32(source)^;
  397. Pint32(dest)^ := ((s_pixel And $ff) Shl 16) Or
  398. ((s_pixel And ($ff Shl 10)) Shr 2) Or
  399. ((s_pixel Shr 20) And $FF);
  400. Inc(x, inc_source);
  401. Inc(source, (x Shr 16)*4);
  402. x := x And $FFFF;
  403. Inc(dest, 4);
  404. Dec(count);
  405. End;
  406. End;
  407. Procedure ConvertP_muhmu32_32rgba888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  408. Var
  409. x : DWord;
  410. s_pixel : DWord;
  411. Begin
  412. x := 0;
  413. While count > 0 Do
  414. Begin
  415. s_pixel := Pint32(source)^;
  416. Pint32(dest)^ := (((s_pixel And $ff) Or
  417. ((s_pixel And ($ff Shl 10)) Shr 2) Or
  418. ((s_pixel And ($ff Shl 20)) Shr 4)) Shl 8) Or $FF;
  419. Inc(x, inc_source);
  420. Inc(source, (x Shr 16)*4);
  421. x := x And $FFFF;
  422. Inc(dest, 4);
  423. Dec(count);
  424. End;
  425. End;
  426. Procedure ConvertP_muhmu32_32bgra888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  427. Var
  428. x : DWord;
  429. s_pixel : DWord;
  430. Begin
  431. x := 0;
  432. While count > 0 Do
  433. Begin
  434. s_pixel := Pint32(source)^;
  435. Pint32(dest)^ := (((s_pixel And $ff) Shl 24) Or
  436. ((s_pixel And ($ff Shl 10)) Shl 6) Or
  437. ((s_pixel Shr 12) And $FF00)) Or $FF;
  438. Inc(x, inc_source);
  439. Inc(source, (x Shr 16)*4);
  440. x := x And $FFFF;
  441. Inc(dest, 4);
  442. Dec(count);
  443. End;
  444. End;
  445. Procedure ConvertP_muhmu32_24rgb888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  446. Var
  447. x : DWord;
  448. p1, p2, p3, p4 : DWord;
  449. c : DWord;
  450. Begin
  451. x := 0;
  452. While (PtrUInt(dest) And 3) <> 0 Do
  453. Begin
  454. p1 := (Pint32(source) + (x Shr 16))^;
  455. p1 := (p1 And $ff) Or
  456. ((p1 And ($ff Shl 10)) Shr 2) Or
  457. ((p1 And ($ff Shl 20)) Shr 4);
  458. Pshort16(dest)^ := p1 And $FFFF;
  459. Pchar8(dest + 2)^ := p1 Shr 16;
  460. Inc(x, inc_source);
  461. Inc(dest, 3);
  462. Dec(count);
  463. If count = 0 Then
  464. Exit;
  465. End;
  466. c := count Shr 2;
  467. While c > 0 Do
  468. Begin
  469. p1 := (Pint32(source) + (x Shr 16))^;
  470. p2 := (Pint32(source) + ((x + inc_source) Shr 16))^;
  471. p3 := (Pint32(source) + ((x + 2*inc_source) Shr 16))^;
  472. p4 := (Pint32(source) + ((x + 3*inc_source) Shr 16))^;
  473. Pint32(dest + 0)^ := ((p2 And $FF) Shl 24) Or ((p1 And $FF00000) Shr 4) Or ((p1 And $3FC00) Shr 2) Or (p1 And $FF);
  474. Pint32(dest + 4)^ := ((p3 And $3FC00) Shl 14) Or ((p3 And $FF) Shl 16) Or ((p2 And $FF00000) Shr 12) Or ((p2 And $3FC00) Shr 10);
  475. Pint32(dest + 8)^ := ((p4 And $FF00000) Shl 4) Or ((p4 And $3FC00) Shl 6) Or ((p4 And $FF) Shl 8) Or ((p3 And $FF00000) Shr 20);
  476. Dec(c);
  477. Inc(x, inc_source*4);
  478. Inc(dest, 12);
  479. End;
  480. count := count And 3;
  481. While count > 0 Do
  482. Begin
  483. p1 := (Pint32(source) + (x Shr 16))^;
  484. p1 := (p1 And $ff) Or
  485. ((p1 And ($ff Shl 10)) Shr 2) Or
  486. ((p1 And ($ff Shl 20)) Shr 4);
  487. Pshort16(dest)^ := p1 And $FFFF;
  488. Pchar8(dest + 2)^ := p1 Shr 16;
  489. Inc(x, inc_source);
  490. Inc(dest, 3);
  491. Dec(count);
  492. End;
  493. End;
  494. Procedure ConvertP_muhmu32_24bgr888_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  495. Var
  496. x : DWord;
  497. p1, p2, p3, p4 : DWord;
  498. c : DWord;
  499. Begin
  500. x := 0;
  501. While (PtrUInt(dest) And 3) <> 0 Do
  502. Begin
  503. p1 := (Pint32(source) + (x Shr 16))^;
  504. p1 := ((p1 And $ff) Shl 16) Or
  505. ((p1 And ($ff Shl 10)) Shr 2) Or
  506. ((p1 And ($ff Shl 20)) Shr 20);
  507. Pshort16(dest)^ := p1 And $FFFF;
  508. Pchar8(dest + 2)^ := p1 Shr 16;
  509. Inc(x, inc_source);
  510. Inc(dest, 3);
  511. Dec(count);
  512. If count = 0 Then
  513. Exit;
  514. End;
  515. c := count Shr 2;
  516. While c > 0 Do
  517. Begin
  518. p1 := (Pint32(source) + (x Shr 16))^;
  519. p2 := (Pint32(source) + ((x + inc_source) Shr 16))^;
  520. p3 := (Pint32(source) + ((x + 2*inc_source) Shr 16))^;
  521. p4 := (Pint32(source) + ((x + 3*inc_source) Shr 16))^;
  522. Pint32(dest + 0)^ := ((p2 And $FF00000) Shl 4) Or ((p1 And $FF) Shl 16) Or ((p1 And $3FC00) Shr 2) Or ((p1 And $FF00000) Shr 20);
  523. Pint32(dest + 4)^ := ((p3 And $3FC00) Shl 14) Or ((p3 And $FF00000) Shr 4) Or ((p2 And $FF) Shl 8) Or ((p2 And $3FC00) Shr 10);
  524. Pint32(dest + 8)^ := ((p4 And $FF) Shl 24) Or ((p4 And $3FC00) Shl 6) Or ((p4 And $FF00000) Shr 12) Or (p3 And $FF);
  525. Dec(c);
  526. Inc(x, inc_source*4);
  527. Inc(dest, 12);
  528. End;
  529. count := count And 3;
  530. While count > 0 Do
  531. Begin
  532. p1 := (Pint32(source) + (x Shr 16))^;
  533. p1 := ((p1 And $ff) Shl 16) Or
  534. ((p1 And ($ff Shl 10)) Shr 2) Or
  535. ((p1 And ($ff Shl 20)) Shr 20);
  536. Pshort16(dest)^ := p1 And $FFFF;
  537. Pchar8(dest + 2)^ := p1 Shr 16;
  538. Inc(x, inc_source);
  539. Inc(dest, 3);
  540. Dec(count);
  541. End;
  542. End;
  543. Procedure ConvertP_muhmu32_16rgb565_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  544. Var
  545. x, c : DWord;
  546. p : int32;
  547. Begin
  548. x := 0;
  549. { Try to write 2 pixel blocks }
  550. c := count Shr 1;
  551. While c <> 0 Do
  552. Begin
  553. Dec(c);
  554. p := (((Pint32(source) + (x Shr 16))^ Shr 12) And $f800) Or
  555. (((Pint32(source) + (x Shr 16))^ Shr 7) And $7e0) Or
  556. (((Pint32(source) + (x Shr 16))^ Shr 3) And $1f);
  557. Inc(x, inc_source);
  558. p := p Or
  559. (((((Pint32(source) + (x Shr 16))^ Shr 12) And $f800) Or
  560. (((Pint32(source) + (x Shr 16))^ Shr 7) And $7e0) Or
  561. (((Pint32(source) + (x Shr 16))^ Shr 3) And $1f)) Shl 16);
  562. Inc(x, inc_source);
  563. Pint32(dest)^ := p;
  564. Inc(dest, 4);
  565. End;
  566. { Write trailing pixel }
  567. If (count And 1) <> 0 Then
  568. Pshort16(dest)^ := (((Pint32(source) + (x Shr 16))^ Shr 12) And $f800) Or
  569. (((Pint32(source) + (x Shr 16))^ Shr 7) And $7e0) Or
  570. (((Pint32(source) + (x Shr 16))^ Shr 3) And $1f);
  571. End;
  572. Procedure ConvertP_muhmu32_16bgr565_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  573. Var
  574. x, c : DWord;
  575. p : int32;
  576. Begin
  577. x := 0;
  578. { Try to write 2 pixel blocks }
  579. c := count Shr 1;
  580. While c <> 0 Do
  581. Begin
  582. Dec(c);
  583. p := (((Pint32(source) + (x Shr 16))^ Shr 23) And $1f) Or
  584. (((Pint32(source) + (x Shr 16))^ Shr 7) And $7e0) Or
  585. (((Pint32(source) + (x Shr 16))^ Shl 8) And $f800);
  586. Inc(x, inc_source);
  587. p := p Or
  588. (((((Pint32(source) + (x Shr 16))^ Shr 23) And $1f) Or
  589. (((Pint32(source) + (x Shr 16))^ Shr 7) And $7e0) Or
  590. (((Pint32(source) + (x Shr 16))^ Shl 8) And $f800)) Shl 16);
  591. Inc(x, inc_source);
  592. Pint32(dest)^ := p;
  593. Inc(dest, 4);
  594. End;
  595. { Write trailing pixel }
  596. If (count And 1) <> 0 Then
  597. Pshort16(dest)^ := (((Pint32(source) + (x Shr 16))^ Shr 23) And $1f) Or
  598. (((Pint32(source) + (x Shr 16))^ Shr 7) And $7e0) Or
  599. (((Pint32(source) + (x Shr 16))^ Shl 8) And $f800);
  600. End;
  601. Procedure ConvertP_muhmu32_16rgb555_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  602. Var
  603. x, c : DWord;
  604. p : int32;
  605. Begin
  606. x := 0;
  607. { Try to write 2 pixel blocks }
  608. c := count Shr 1;
  609. While c <> 0 Do
  610. Begin
  611. Dec(c);
  612. p := (((Pint32(source) + (x Shr 16))^ Shr 13) And $7c00) Or
  613. (((Pint32(source) + (x Shr 16))^ Shr 8) And $3e0) Or
  614. (((Pint32(source) + (x Shr 16))^ Shr 3) And $1f);
  615. Inc(x, inc_source);
  616. p := p Or
  617. (((((Pint32(source) + (x Shr 16))^ Shr 13) And $7c00) Or
  618. (((Pint32(source) + (x Shr 16))^ Shr 8) And $3e0) Or
  619. (((Pint32(source) + (x Shr 16))^ Shr 3) And $1f)) Shl 16);
  620. Inc(x, inc_source);
  621. Pint32(dest)^ := p;
  622. Inc(dest, 4);
  623. End;
  624. { Write trailing pixel }
  625. If (count And 1) <> 0 Then
  626. Pshort16(dest)^ := (((Pint32(source) + (x Shr 16))^ Shr 13) And $7c00) Or
  627. (((Pint32(source) + (x Shr 16))^ Shr 8) And $3e0) Or
  628. (((Pint32(source) + (x Shr 16))^ Shr 3) And $1f);
  629. End;
  630. Procedure ConvertP_muhmu32_16bgr555_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  631. Var
  632. x, c : DWord;
  633. p : int32;
  634. Begin
  635. x := 0;
  636. { Try to write 2 pixel blocks }
  637. c := count Shr 1;
  638. While c <> 0 Do
  639. Begin
  640. Dec(c);
  641. p := (((Pint32(source) + (x Shr 16))^ Shr 23) And $1f) Or
  642. (((Pint32(source) + (x Shr 16))^ Shr 8) And $3e0) Or
  643. (((Pint32(source) + (x Shr 16))^ Shl 7) And $7c00);
  644. Inc(x, inc_source);
  645. p := p Or
  646. (((((Pint32(source) + (x Shr 16))^ Shr 23) And $1f) Or
  647. (((Pint32(source) + (x Shr 16))^ Shr 8) And $3e0) Or
  648. (((Pint32(source) + (x Shr 16))^ Shl 7) And $7c00)) Shl 16);
  649. Inc(x, inc_source);
  650. Pint32(dest)^ := p;
  651. Inc(dest, 4);
  652. End;
  653. { Write trailing pixel }
  654. If (count And 1) <> 0 Then
  655. Pshort16(dest)^ := (((Pint32(source) + (x Shr 16))^ Shr 23) And $1f) Or
  656. (((Pint32(source) + (x Shr 16))^ Shr 8) And $3e0) Or
  657. (((Pint32(source) + (x Shr 16))^ Shl 7) And $7c00);
  658. End;
  659. Procedure ConvertP_muhmu32_8rgb332_S(source, dest : Pchar8; count, inc_source : DWord); CDecl;
  660. Var
  661. x, c : DWord;
  662. p : int32;
  663. Begin
  664. x := 0;
  665. { Write single pixels until the destination address is aligned mod 4 }
  666. While (PtrUInt(dest) And $3) <> 0 Do
  667. Begin
  668. dest^ := (((Pint32(source) + (x Shr 16))^ Shr 20) And $e0) Or
  669. (((Pint32(source) + (x Shr 16))^ Shr 13) And $1c) Or
  670. (((Pint32(source) + (x Shr 16))^ Shr 6) And $3);
  671. Inc(x, inc_source);
  672. Inc(dest);
  673. Dec(count);
  674. If count = 0 Then
  675. Exit;
  676. End;
  677. { Write blocks of four pixels now }
  678. c := count Shr 2;
  679. While c <> 0 Do
  680. Begin
  681. Dec(c);
  682. p := (((Pint32(source) + (x Shr 16))^ Shr 20) And $e0) Or
  683. (((Pint32(source) + (x Shr 16))^ Shr 13) And $1c) Or
  684. (((Pint32(source) + (x Shr 16))^ Shr 6) And $3);
  685. Inc(x, inc_source);
  686. p := p Or
  687. (((((Pint32(source) + (x Shr 16))^ Shr 20) And $e0) Or
  688. (((Pint32(source) + (x Shr 16))^ Shr 13) And $1c) Or
  689. (((Pint32(source) + (x Shr 16))^ Shr 6) And $3)) Shl 8);
  690. Inc(x, inc_source);
  691. p := p Or
  692. (((((Pint32(source) + (x Shr 16))^ Shr 20) And $e0) Or
  693. (((Pint32(source) + (x Shr 16))^ Shr 13) And $1c) Or
  694. (((Pint32(source) + (x Shr 16))^ Shr 6) And $3)) Shl 16);
  695. Inc(x, inc_source);
  696. p := p Or
  697. (((((Pint32(source) + (x Shr 16))^ Shr 20) And $e0) Or
  698. (((Pint32(source) + (x Shr 16))^ Shr 13) And $1c) Or
  699. (((Pint32(source) + (x Shr 16))^ Shr 6) And $3)) Shl 24);
  700. Inc(x, inc_source);
  701. Pint32(dest)^ := p;
  702. Inc(dest, 4);
  703. End;
  704. { Write up to three trailing pixels }
  705. c := count And $3;
  706. While c <> 0 Do
  707. Begin
  708. Dec(c);
  709. dest^ := (((Pint32(source) + (x Shr 16))^ Shr 20) And $e0) Or
  710. (((Pint32(source) + (x Shr 16))^ Shr 13) And $1c) Or
  711. (((Pint32(source) + (x Shr 16))^ Shr 6) And $3);
  712. Inc(x, inc_source);
  713. Inc(dest);
  714. End;
  715. End;